diff --git a/arch/arm/configs/austin_defconfig b/arch/arm/configs/austin_defconfig new file mode 100644 index 00000000000..dce5fc87120 --- /dev/null +++ b/arch/arm/configs/austin_defconfig @@ -0,0 +1,3316 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm 3.10.54 Kernel Configuration +# +CONFIG_ARM=y +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_HAVE_PROC_CPU=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_ARCH_HAS_CPUFREQ=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_FIQ=y +CONFIG_VECTORS_BASE=0xffff0000 +# CONFIG_ARM_PATCH_PHYS_VIRT is not set +CONFIG_NEED_MACH_MEMORY_H=y +CONFIG_GENERIC_BUG=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_EXTABLE_SORT=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_CROSS_COMPILE="" +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +# CONFIG_KERNEL_GZIP is not set +# CONFIG_KERNEL_LZMA is not set +CONFIG_KERNEL_XZ=y +# CONFIG_KERNEL_LZO is not set +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_FHANDLE is not set +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +CONFIG_AUDIT_WATCH=y +CONFIG_AUDIT_TREE=y +# CONFIG_AUDIT_LOGINUID_IMMUTABLE is not set +CONFIG_HAVE_GENERIC_HARDIRQS=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_DEBUG=y +CONFIG_KTIME_SCALAR=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set + +# +# RCU Subsystem +# +CONFIG_TREE_PREEMPT_RCU=y +CONFIG_PREEMPT_RCU=y +CONFIG_RCU_STALL_COMMON=y +# CONFIG_RCU_USER_QS is not set +CONFIG_RCU_FANOUT=32 +CONFIG_RCU_FANOUT_LEAF=16 +# CONFIG_RCU_FANOUT_EXACT is not set +# CONFIG_RCU_FAST_NO_HZ is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_RCU_BOOST is not set +# CONFIG_RCU_NOCB_CPU is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_CGROUPS=y +# CONFIG_CGROUP_DEBUG is not set +# CONFIG_CGROUP_FREEZER is not set +# CONFIG_CGROUP_DEVICE is not set +# CONFIG_CPUSETS is not set +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +# CONFIG_MEMCG is not set +# CONFIG_CGROUP_PERF is not set +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +# CONFIG_CFS_BANDWIDTH is not set +CONFIG_RT_GROUP_SCHED=y +# CONFIG_BLK_CGROUP is not set +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_NAMESPACES is not set +CONFIG_UIDGID_CONVERTED=y +# CONFIG_UIDGID_STRICT_TYPE_CHECKS is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y +CONFIG_HAVE_UID16=y +CONFIG_HOTPLUG=y +CONFIG_PANIC_TIMEOUT=1 +CONFIG_EXPERT=y +CONFIG_UID16=y +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_EMBEDDED=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_PERF_USE_VMALLOC=y + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_COMPAT_BRK=y +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# CONFIG_OPROFILE is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_JUMP_LABEL is not set +# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_ATTRS=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_USE_GENERIC_SMP_HELPERS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_DMA_API_DEBUG=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP_FILTER=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_OLD_SIGACTION=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_STOP_MACHINE=y +CONFIG_BLOCK=y +CONFIG_LBDAF=y +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_FREEZER=y + +# +# System Type +# +CONFIG_MMU=y +# CONFIG_ARCH_MULTIPLATFORM is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_GEMINI is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_DOVE is not set +# CONFIG_ARCH_KIRKWOOD is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_W90X900 is not set +# CONFIG_ARCH_LPC32XX is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_MSM is not set +# CONFIG_ARCH_MT6572 is not set +# CONFIG_ARCH_MT6595 is not set +# CONFIG_ARCH_MT6582 is not set +# CONFIG_ARCH_MT6592 is not set +# CONFIG_ARCH_MT6752 is not set +# CONFIG_ARCH_MT6795 is not set +CONFIG_ARCH_MT8127=y +# CONFIG_ARCH_SHMOBILE is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C24XX is not set +# CONFIG_ARCH_S3C64XX is not set +# CONFIG_ARCH_S5P64X0 is not set +# CONFIG_ARCH_S5PC100 is not set +# CONFIG_ARCH_S5PV210 is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_U300 is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP1 is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_KEYBOARD_GPIO_POLLED is not set +CONFIG_MAX_DRAM_SIZE_SUPPORT=0x80000000 + +# +# MT8127 Board Support Package +# +# CONFIG_MT8127_FPGA is not set +CONFIG_MT8127_EVB_BOARD=y + +# +# MTK Board Support Package +# +# CONFIG_PLAT_SPEAR is not set + +# +# Processor Type +# +CONFIG_CPU_V7=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_LPAE is not set +# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set +CONFIG_ARM_THUMB=y +CONFIG_ARM_THUMBEE=y +CONFIG_ARM_VIRT_EXT=y +CONFIG_SWP_EMULATE=y +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_BPREDICT_DISABLE is not set +CONFIG_KUSER_HELPERS=y +# CONFIG_CACHE_L2X0 is not set +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_DMA_MEM_BUFFERABLE=y +CONFIG_ARM_NR_BANKS=8 +# CONFIG_MTK_KERNEL_IN_SECURE_MODE is not set +# CONFIG_L1C_OPT is not set +# CONFIG_ARM_ERRATA_430973 is not set +# CONFIG_ARM_ERRATA_458693 is not set +# CONFIG_ARM_ERRATA_460075 is not set +# CONFIG_ARM_ERRATA_742230 is not set +# CONFIG_ARM_ERRATA_742231 is not set +# CONFIG_ARM_ERRATA_643719 is not set +# CONFIG_ARM_ERRATA_720789 is not set +# CONFIG_ARM_ERRATA_743622 is not set +# CONFIG_ARM_ERRATA_751472 is not set +# CONFIG_ARM_ERRATA_754322 is not set +# CONFIG_ARM_ERRATA_754327 is not set +# CONFIG_ARM_ERRATA_764369 is not set +# CONFIG_ARM_ERRATA_775420 is not set +# CONFIG_ARM_ERRATA_798181 is not set +# CONFIG_ARM_ERRATA_828419 is not set +# CONFIG_ARM_ERRATA_828420 is not set +# CONFIG_ARM_ERRATA_831171 is not set +# CONFIG_ARM_ERRATA_824069 is not set +# CONFIG_ARM_ERRATA_826319 is not set +CONFIG_FIQ_GLUE=y + +# +# Bus support +# +CONFIG_ARM_AMBA=y +# CONFIG_PCI_SYSCALL is not set +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +CONFIG_HAVE_SMP=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_ARM_CPU_TOPOLOGY=y +# CONFIG_SCHED_MC is not set +# CONFIG_SCHED_SMT is not set +# CONFIG_DISABLE_CPU_SCHED_DOMAIN_BALANCE is not set +# CONFIG_HEVTASK_INTERFACE is not set +# CONFIG_ARCH_SCALE_INVARIANT_CPU_CAPACITY is not set +# CONFIG_HAVE_ARM_ARCH_TIMER is not set +# CONFIG_MCPM is not set +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_NR_CPUS=4 +CONFIG_TOUCH_BOOST=y +CONFIG_HOTPLUG_CPU=y +# CONFIG_ARM_PSCI is not set +CONFIG_LOCAL_TIMERS=y +CONFIG_ARCH_NR_GPIO=0 +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_HZ=100 +CONFIG_SCHED_HRTICK=y +# CONFIG_THUMB2_KERNEL is not set +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_HAVE_ARCH_PFN_VALID=y +CONFIG_HIGHMEM=y +# CONFIG_HIGHPTE is not set +CONFIG_HW_PERF_EVENTS=y +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_HAVE_MEMBLOCK=y +# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_COMPACTION=y +CONFIG_MIGRATION=y +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_BOUNCE=y +CONFIG_KSM=y +CONFIG_KSM_CHECK_PAGE=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_CLEANCACHE is not set +# CONFIG_FRONTSWAP is not set +CONFIG_FORCE_MAX_ZONEORDER=11 +CONFIG_ALIGNMENT_TRAP=y +# CONFIG_UACCESS_WITH_MEMCPY is not set +CONFIG_SECCOMP=y +CONFIG_CC_STACKPROTECTOR=y +# CONFIG_ARM_FLUSH_CONSOLE_ON_RESTART is not set + +# +# Boot options +# +# CONFIG_USE_OF is not set +CONFIG_ATAGS=y +# CONFIG_DEPRECATED_PARAM_STRUCT is not set +CONFIG_ZBOOT_ROM_TEXT=0 +CONFIG_ZBOOT_ROM_BSS=0 +# CONFIG_COMPAT_CPUINFO is not set +CONFIG_CMDLINE="console=tty0 console=ttyMT3,921600n1 root=/dev/ram vmalloc=496M slub_max_order=0 slub_debug=O coherent_pool=3240K" +CONFIG_CMDLINE_FROM_BOOTLOADER=y +# CONFIG_CMDLINE_EXTEND is not set +# CONFIG_CMDLINE_FORCE is not set +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_RESTART_DISABLE_CACHE=y +# CONFIG_AUTO_ZRELADDR is not set + +# +# CPU Power Management +# + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_STAT_DETAILS=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVEPLUS is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_BALANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_HOTPLUG=y +# CONFIG_CPU_FREQ_GOV_BALANCE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_INTERACTIVEPLUS is not set +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_HOTPLUG=y + +# +# ARM CPU frequency scaling drivers +# +# CONFIG_ARM_EXYNOS4210_CPUFREQ is not set +# CONFIG_ARM_EXYNOS4X12_CPUFREQ is not set +# CONFIG_ARM_EXYNOS5250_CPUFREQ is not set +# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set +# CONFIG_CPU_IDLE is not set +# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_NEON=y + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_BINFMT_SCRIPT=y +# CONFIG_HAVE_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_COREDUMP is not set + +# +# Power management options +# +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_HAS_WAKELOCK=y +CONFIG_HAS_EARLYSUSPEND=y +CONFIG_HAS_SBSUSPEND=y +CONFIG_WAKELOCK=y +CONFIG_EARLYSUSPEND=y +CONFIG_FB_EARLYSUSPEND=y +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HIBERNATION=y +CONFIG_PM_STD_PARTITION="" +CONFIG_TOI_CORE=y + +# +# Image Storage (you need at least one allocator) +# +CONFIG_TOI_FILE=y +CONFIG_TOI_SWAP=y + +# +# General Options +# +CONFIG_TOI_CRYPTO=y +CONFIG_TOI_DEFAULT_IMAGE_SIZE_LIMIT=-2 +# CONFIG_TOI_KEEP_IMAGE is not set +CONFIG_TOI_REPLACE_SWSUSP=y +# CONFIG_TOI_IGNORE_LATE_INITCALL is not set +CONFIG_TOI_DEFAULT_WAIT=2 +CONFIG_TOI_DEFAULT_EXTRA_PAGES_ALLOWANCE=2000 +# CONFIG_TOI_CHECKSUM is not set +CONFIG_TOI=y +CONFIG_TOI_ZRAM_SUPPORT=y +CONFIG_TOI_FIXUP=y +CONFIG_TOI_ENHANCE=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=100 +CONFIG_PM_WAKELOCKS_GC=y +# CONFIG_PM_RUNTIME is not set +CONFIG_PM=y +CONFIG_PM_DEBUG=y +CONFIG_PM_ADVANCED_DEBUG=y +CONFIG_PM_TEST_SUSPEND=y +CONFIG_PM_SLEEP_DEBUG=y +# CONFIG_APM_EMULATION is not set +CONFIG_CPU_PM=y +# CONFIG_SUSPEND_TIME is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +# CONFIG_UNIX_DIAG is not set +CONFIG_XFRM=y +CONFIG_XFRM_ALGO=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +CONFIG_XFRM_MIGRATE=y +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=y +CONFIG_NET_KEY=y +# CONFIG_NET_KEY_MIGRATE is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +# CONFIG_IP_FIB_TRIE_STATS is not set +CONFIG_IP_MULTIPLE_TABLES=y +# CONFIG_IP_ROUTE_MULTIPATH is not set +# CONFIG_IP_ROUTE_VERBOSE is not set +CONFIG_IP_ROUTE_CLASSID=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +CONFIG_NET_IPIP=y +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_NET_IP_TUNNEL=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +CONFIG_INET_XFRM_TUNNEL=y +CONFIG_INET_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_INET_UDP_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +CONFIG_IPV6_PRIVACY=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_INET6_XFRM_TUNNEL=y +CONFIG_INET6_TUNNEL=y +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=y +CONFIG_IPV6_SIT=y +CONFIG_IPV6_SIT_6RD=y +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=y +# CONFIG_IPV6_GRE is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_IPV6_MROUTE=y +# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set +CONFIG_IPV6_PIMSM_V2=y +CONFIG_MTK_DHCPV6C_WIFI=y +# CONFIG_NETLABEL is not set +CONFIG_ANDROID_PARANOID_NETWORK=y +CONFIG_NET_ACTIVITY_STATS=y +CONFIG_NETWORK_SECMARK=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=y +# CONFIG_NETFILTER_NETLINK_ACCT is not set +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_MARK=y +# CONFIG_NF_CONNTRACK_SECMARK is not set +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +# CONFIG_NF_CONNTRACK_TIMEOUT is not set +# CONFIG_NF_CONNTRACK_TIMESTAMP is not set +# CONFIG_NF_CT_PROTO_DCCP is not set +CONFIG_NF_CT_PROTO_GRE=y +# CONFIG_NF_CT_PROTO_SCTP is not set +CONFIG_NF_CT_PROTO_UDPLITE=y +# CONFIG_NF_CONNTRACK_AMANDA is not set +CONFIG_NF_CONNTRACK_FTP=y +# CONFIG_NF_CONNTRACK_H323 is not set +# CONFIG_NF_CONNTRACK_IRC is not set +# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set +# CONFIG_NF_CONNTRACK_SNMP is not set +CONFIG_NF_CONNTRACK_PPTP=y +# CONFIG_NF_CONNTRACK_SANE is not set +CONFIG_NF_CONNTRACK_SIP=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +# CONFIG_NF_CT_NETLINK_TIMEOUT is not set +# CONFIG_NETFILTER_NETLINK_QUEUE_CT is not set +CONFIG_NF_NAT=y +CONFIG_NF_NAT_NEEDED=y +CONFIG_NF_NAT_PROTO_UDPLITE=y +# CONFIG_NF_NAT_AMANDA is not set +CONFIG_NF_NAT_FTP=y +# CONFIG_NF_NAT_IRC is not set +CONFIG_NF_NAT_SIP=y +CONFIG_NF_NAT_TFTP=y +CONFIG_NETFILTER_TPROXY=y +CONFIG_NETFILTER_XTABLES=y + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=y +CONFIG_NETFILTER_XT_CONNMARK=y + +# +# Xtables targets +# +# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set +# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_CT is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +CONFIG_NETFILTER_XT_TARGET_HL=y +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +# CONFIG_NETFILTER_XT_TARGET_LED is not set +# CONFIG_NETFILTER_XT_TARGET_LOG is not set +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NETMAP=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +CONFIG_NETFILTER_XT_TARGET_REDIRECT=y +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set + +# +# Xtables matches +# +# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_BPF is not set +# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y +# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set +# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HELPER is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +CONFIG_NETFILTER_XT_MATCH_REALM=y +CONFIG_NETFILTER_XT_MATCH_RECENT=y +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +# CONFIG_IP_SET is not set +# CONFIG_IP_VS is not set + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_NF_CONNTRACK_PROC_COMPAT=y +CONFIG_IP_NF_IPTABLES=y +# CONFIG_IP_NF_MATCH_AH is not set +# CONFIG_IP_NF_MATCH_ECN is not set +# CONFIG_IP_NF_MATCH_RPFILTER is not set +# CONFIG_IP_NF_MATCH_TTL is not set +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +# CONFIG_IP_NF_TARGET_REJECT_SKERR is not set +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_NF_NAT_IPV4=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_NF_NAT_PROTO_GRE=y +CONFIG_NF_NAT_PPTP=y +# CONFIG_NF_NAT_H323 is not set +CONFIG_IP_NF_MANGLE=y +# CONFIG_IP_NF_TARGET_CLUSTERIP is not set +# CONFIG_IP_NF_TARGET_ECN is not set +# CONFIG_IP_NF_TARGET_TTL is not set +CONFIG_IP_NF_RAW=y +# CONFIG_IP_NF_SECURITY is not set +CONFIG_IP_NF_ARPTABLES=y +# CONFIG_IP_NF_ARPFILTER is not set +# CONFIG_IP_NF_ARP_MANGLE is not set + +# +# IPv6: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV6=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +# CONFIG_IP6_NF_MATCH_AH is not set +# CONFIG_IP6_NF_MATCH_EUI64 is not set +CONFIG_IP6_NF_MATCH_FRAG=y +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_HL is not set +CONFIG_IP6_NF_MATCH_IPV6HEADER=y +# CONFIG_IP6_NF_MATCH_MH is not set +# CONFIG_IP6_NF_MATCH_RPFILTER is not set +# CONFIG_IP6_NF_MATCH_RT is not set +CONFIG_IP6_NF_TARGET_HL=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_TARGET_REJECT_SKERR=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +# CONFIG_IP6_NF_SECURITY is not set +# CONFIG_NF_NAT_IPV6 is not set +# CONFIG_BRIDGE_NF_EBTABLES is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +CONFIG_STP=y +CONFIG_BRIDGE=y +CONFIG_BRIDGE_IGMP_SNOOPING=y +# CONFIG_BRIDGE_VLAN_FILTERING is not set +CONFIG_HAVE_NET_DSA=y +CONFIG_VLAN_8021Q=y +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_VLAN_8021Q_MVRP is not set +# CONFIG_DECNET is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +# CONFIG_NET_SCH_CBQ is not set +CONFIG_NET_SCH_HTB=y +# CONFIG_NET_SCH_HFSC is not set +# CONFIG_NET_SCH_PRIO is not set +# CONFIG_NET_SCH_MULTIQ is not set +# CONFIG_NET_SCH_RED is not set +# CONFIG_NET_SCH_SFB is not set +# CONFIG_NET_SCH_SFQ is not set +# CONFIG_NET_SCH_TEQL is not set +# CONFIG_NET_SCH_TBF is not set +# CONFIG_NET_SCH_GRED is not set +# CONFIG_NET_SCH_DSMARK is not set +# CONFIG_NET_SCH_NETEM is not set +# CONFIG_NET_SCH_DRR is not set +# CONFIG_NET_SCH_MQPRIO is not set +# CONFIG_NET_SCH_CHOKE is not set +# CONFIG_NET_SCH_QFQ is not set +# CONFIG_NET_SCH_CODEL is not set +# CONFIG_NET_SCH_FQ_CODEL is not set +CONFIG_NET_SCH_INGRESS=y +# CONFIG_NET_SCH_PLUG is not set + +# +# Classification +# +CONFIG_NET_CLS=y +# CONFIG_NET_CLS_BASIC is not set +# CONFIG_NET_CLS_TCINDEX is not set +# CONFIG_NET_CLS_ROUTE4 is not set +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +# CONFIG_NET_CLS_RSVP is not set +# CONFIG_NET_CLS_RSVP6 is not set +CONFIG_NET_CLS_FLOW=y +# CONFIG_NET_CLS_CGROUP is not set +# CONFIG_NET_EMATCH is not set +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=y +# CONFIG_NET_ACT_GACT is not set +CONFIG_NET_ACT_MIRRED=y +CONFIG_NET_ACT_IPT=y +# CONFIG_NET_ACT_NAT is not set +# CONFIG_NET_ACT_PEDIT is not set +# CONFIG_NET_ACT_SIMP is not set +# CONFIG_NET_ACT_SKBEDIT is not set +# CONFIG_NET_ACT_CSUM is not set +CONFIG_NET_CLS_IND=y +CONFIG_NET_SCH_FIFO=y +# CONFIG_DCB is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_MMAP is not set +# CONFIG_NETLINK_DIAG is not set +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +# CONFIG_NETPRIO_CGROUP is not set +CONFIG_BQL=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_EXT=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_WEXT_PRIV=y +CONFIG_CFG80211=y +CONFIG_NL80211_TESTMODE=y +CONFIG_CFG80211_DEVELOPER_WARNINGS=y +# CONFIG_CFG80211_REG_DEBUG is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_DEBUGFS is not set +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_CFG80211_WEXT=y +# CONFIG_LIB80211 is not set +# CONFIG_CFG80211_ALLOW_RECONNECT is not set +# CONFIG_MAC80211 is not set +# CONFIG_WIMAX is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +CONFIG_HAVE_BPF_JIT=y +# CONFIG_MTK_NET_LOGGING is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_DEVTMPFS is not set +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +CONFIG_FW_LOADER_USER_HELPER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_GENERIC_CPU_DEVICES is not set +# CONFIG_HAVE_CPU_AUTOPROBE is not set +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_CMA is not set + +# +# Bus devices +# +# CONFIG_ARM_CCI is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_CMDLINE_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# 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_SM_FTL is not set +# CONFIG_MTD_OOPS is not set +# CONFIG_MTD_SWAP 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 is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS 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_DOCG3 is not set +CONFIG_MTD_NAND_IDS=y +CONFIG_MTD_NAND_ECC=y +# CONFIG_MTD_NAND_ECC_SMC is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_ECC_BCH is not set +# CONFIG_MTD_SM_COMMON is not set +# CONFIG_MTD_NAND_DENALI is not set +# CONFIG_MTD_NAND_GPIO is not set +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_DOCG4 is not set +# CONFIG_MTD_NAND_NANDSIM is not set +CONFIG_MTD_NAND_PLATFORM=y +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# LPDDR flash memory drivers +# +# CONFIG_MTD_LPDDR is not set +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_MG_DISK is not set +# CONFIG_BLK_DEV_RBD is not set + +# +# Misc devices +# +CONFIG_ANDROID_PMEM=y +# CONFIG_SENSORS_LIS3LV02D is not set +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ATMEL_SSC is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1780 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_TI_DAC7512 is not set +CONFIG_UID_STAT=y +# CONFIG_BMP085_I2C is not set +# CONFIG_BMP085_SPI is not set +# CONFIG_USB_SWITCH_FSA9480 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_93XX46 is not set + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set + +# +# Altera FPGA firmware download module +# +# CONFIG_ALTERA_STAPL is not set +CONFIG_MEDIATEK_SOLUTION=y +CONFIG_MTK_PLATFORM="mt8127" +CONFIG_ARCH_MTK_PROJECT="ford" +CONFIG_AUSTIN_PROJECT=y +CONFIG_MTK_INTERNAL=y +CONFIG_MTK_CIRQ=y +# CONFIG_MTK_SYSTRACKER is not set +# CONFIG_MTK_L2C_SHARE is not set +CONFIG_HAVE_AEE_FEATURE=n +CONFIG_HAVE_XLOG_FEATURE=y +# CONFIG_FPGA_EARLY_PORTING is not set +CONFIG_MTK_EMMC_SUPPORT=y +CONFIG_MTK_NEW_COMBO_EMMC_SUPPORT=y +# CONFIG_MTK_GPT_SCHEME_SUPPORT is not set +CONFIG_MTK_SHARED_SDCARD=y +CONFIG_MTK_MULTI_STORAGE_SUPPORT=y +CONFIG_MTK_MULTI_PARTITION_MOUNT_ONLY_SUPPORT=y +CONFIG_MTK_SECURITY_SW_SUPPORT=y +CONFIG_HAVE_MTK_IN_HOUSE_TEE_SUPPORT=y +CONFIG_MTK_IN_HOUSE_TEE_SUPPORT=y +CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT=y +CONFIG_MTK_DRM_KEY_MNG_SUPPORT=y +# CONFIG_HAVE_TRUSTONIC_TEE_SUPPORT is not set +# CONFIG_MTK_THERMAL_STATUS_COLLECTION is not set +# CONFIG_MD32_SUPPORT is not set +# CONFIG_MTK_MEMCFG is not set +# CONFIG_MTK_DT_SUPPORT is not set +# CONFIG_EVDO_DT_SUPPORT is not set +# CONFIG_EVDO_DT_VIA_SUPPORT is not set +# CONFIG_MTK_SMARTBOOK_SUPPORT is not set +CONFIG_MTK_SENSOR_SUPPORT=y +CONFIG_MTK_AUTO_DETECT_ACCELEROMETER=y +# CONFIG_MTK_AUTO_DETECT_MAGNETOMETER is not set +# CONFIG_MTK_AUTO_DETECT_ALSPS is not set +CONFIG_CUSTOM_KERNEL_ACCELEROMETER=y +# CONFIG_CUSTOM_KERNEL_GYROSCOPE is not set +# CONFIG_CUSTOM_KERNEL_ALSPS is not set +# CONFIG_CUSTOM_SEC_AUTH_SUPPORT is not set +# CONFIG_CUSTOM_KERNEL_MAGNETOMETER is not set +# CONFIG_CUSTOM_KERNEL_BAROMETER is not set +# CONFIG_MTK_SENSOR_HUB_SUPPORT is not set +CONFIG_CUSTOM_KERNEL_SENSORHUB="" +CONFIG_CUSTOM_KERNEL_STEP_COUNTER="" +CONFIG_CUSTOM_KERNEL_SIGNIFICANT_MOTION_SENSOR="" +CONFIG_CUSTOM_KERNEL_ACTIVITY_SENSOR="" +CONFIG_CUSTOM_KERNEL_PICK_UP_SENSOR="" +CONFIG_CUSTOM_KERNEL_SHAKE_SENSOR="" +CONFIG_CUSTOM_KERNEL_FACE_DOWN_SENSOR="" +CONFIG_CUSTOM_KERNEL_IN_POCKET_SENSOR="" +CONFIG_CUSTOM_KERNEL_PEDOMETER="" +CONFIG_CUSTOM_KERNEL_HEART_RATE_SENSOR="" +CONFIG_CUSTOM_KERNEL_TILT_DETECTOR_SENSOR="" +CONFIG_CUSTOM_KERNEL_WAKE_GESTURE_SENSOR="" +CONFIG_CUSTOM_KERNEL_GLANCE_GESTURE_SENSOR="" +CONFIG_CUSTOM_KERNEL_IMGSENSOR="sp2509_mipi_raw gc2355_mipi_raw_huaquan sp0a19_raw gc0312_mipi_raw" +CONFIG_CUSTOM_KERNEL_LCM="nt51021_inx_dsi_vdo_kd ota7290b_auo_dsi_vdo_kd nt51021_inx_dsi_vdo_inx ota7290b_auo_dsi_vdo_tpv ota7290b_hsd_dsi_vdo_kd nt51021_inx_dsi_vdo_txd" +CONFIG_CUSTOM_KERNEL_FLASHLIGHT="constant_flashlight" +CONFIG_CUSTOM_KERNEL_EXTMD="" +CONFIG_CUSTOM_KERNEL_SSW="ssw_single" +# CONFIG_MTK_FORCE_CLUSTER1 is not set +# CONFIG_MTK_MMPROFILE_SUPPORT is not set +CONFIG_MTK_HIBERNATION=y +# CONFIG_CUSTOM_KERNEL_CHARGEPUMP is not set +# CONFIG_MTK_TC1_FEATURE is not set + +# +# Kernel Configurations +# + +# +# MTK Cluster MultiProcessor Scheduler +# + +# +# Tracer Related +# +# CONFIG_MTK_SCHED_TRACERS is not set +# CONFIG_MTK_KERNEL_MARKER is not set +CONFIG_FUNCTION_DURATION_TRACER=y +# CONFIG_MT65XX_TRACER is not set +CONFIG_GENERIC_TRACER=y + +# +# MTPROF tools +# +CONFIG_MTK_MUTATION=y +CONFIG_MTPROF_CPUTIME=y +# CONFIG_MTPROF_IRQ_DURATION is not set +CONFIG_MTK_AEE_FEATURE=y +CONFIG_MTK_AEE_AED=n +CONFIG_MTK_AEE_IPANIC=n +# CONFIG_MTK_AEE_POWERKEY_HANG_DETECT is not set +# CONFIG_MTK_AEE_MRDUMP is not set +# CONFIG_ANDROID_VMEM is not set +# CONFIG_CPUTIME_SUPPORT is not set +# CONFIG_CPUTIME_STATS is not set +CONFIG_MTK_RAM_CONSOLE=y +# CONFIG_MTK_RAM_CONSOLE_USING_SRAM is not set +CONFIG_MTK_RAM_CONSOLE_USING_DRAM=y +CONFIG_MTK_RAM_CONSOLE_SIZE=0x1C00 +CONFIG_MTK_RAM_CONSOLE_ADDR=0xF900DC00 +CONFIG_MTK_RAM_CONSOLE_DRAM_SIZE=0x100000 +CONFIG_MTK_RAM_CONSOLE_DRAM_ADDR=0x83F00000 +# CONFIG_PREEMPT_MONITOR is not set +# CONFIG_ISR_MONITOR is not set +# CONFIG_MT_SCHED_MONITOR is not set +# CONFIG_MT_CHRDEV_REG is not set +# CONFIG_MT_LOCK_DEBUG is not set +CONFIG_PRINTK_PROCESS_INFO=y +CONFIG_MT_PRINTK_UART_CONSOLE=y +# CONFIG_MT_ENG_BUILD is not set +CONFIG_RAMDISK_OFFSET=0xF00000 +CONFIG_EARLY_LINUX_PORTING=y +# CONFIG_MTK_MCI is not set +# CONFIG_MTK_ETM is not set + +# +# MT load balance and schedule enhancement +# +CONFIG_MT_SCHED=y +# CONFIG_MT_LOAD_BALANCE_ENHANCEMENT is not set +# CONFIG_MT_LOAD_BALANCE_PROFILER is not set +# CONFIG_MT_SCHED_NOTICE is not set +# CONFIG_MT_SCHED_DEBUG_ONLY is not set +# CONFIG_MT_PRIO_TRACER is not set +# CONFIG_MTK_WQ_DEBUG is not set +# CONFIG_MTK_SCHED_RQAVG_US is not set +# CONFIG_MTK_SCHED_RQAVG_KS is not set +# CONFIG_MTK_STORAGE_PID_LOGGER is not set + +# +# MTK Large Memory mode support +# +# CONFIG_MTK_LM_MODE is not set +CONFIG_MTK_TABLET_HARDWARE=y +CONFIG_GATOR_DRIVER=y +# CONFIG_MTK_IPV6_TETHER_NDP_MODE is not set +# CONFIG_MTK_EMMC_SUPPORT_OTP is not set +CONFIG_MTK_TETHERINGIPV6_SUPPORT=y + +# +# Drivers Configurations +# +CONFIG_MTK_ACCDET=y +# CONFIG_MTK_CCCI_DEVICES is not set +# CONFIG_MTK_MD_LOW_BAT_SUPPORT is not set +CONFIG_MTK_MD_SBP_CUSTOM_VALUE="" +CONFIG_MTK_MD2_SBP_CUSTOM_VALUE="" +# CONFIG_MTK_UMTS_TDD128_MODE is not set +# CONFIG_MTK_EMCI_DEVICES is not set +CONFIG_MTK_EXTERNAL_MODEM_SLOT="" +# CONFIG_MTK_SWITCH_TX_POWER is not set +# CONFIG_MTK_LTE_SUPPORT is not set +CONFIG_MTK_FB=y +CONFIG_MTK_FB_SUPPORT_ASSERTION_LAYER=y +CONFIG_MTK_DITHERING_SUPPORT=y +CONFIG_MTK_LCM_PHYSICAL_ROTATION="0" +CONFIG_LCM_HEIGHT="1024" +CONFIG_LCM_WIDTH="600" +CONFIG_MTK_OVERLAY_ENGINE_SUPPORT=y +# CONFIG_MTK_TVOUT_SUPPORT is not set +# CONFIG_MIXMODE_FOR_INCELL is not set +# CONFIG_LCM_SEND_CMD_IN_VIDEO is not set +CONFIG_GPS=y +CONFIG_MTK_GPS=y +# CONFIG_MTK_NFC is not set +CONFIG_MTK_BTIF=y +CONFIG_MTK_COMBO=y +# CONFIG_MTK_COMBO_CHIP_MT6620 is not set +# CONFIG_MTK_COMBO_CHIP_MT6628 is not set +# CONFIG_MTK_COMBO_CHIP_MT6630 is not set +# CONFIG_MTK_COMBO_CHIP_CONSYS_6572 is not set +# CONFIG_MTK_COMBO_CHIP_CONSYS_6582 is not set +CONFIG_MTK_COMBO_CHIP_CONSYS_8127=y +# CONFIG_MTK_COMBO_CHIP_CONSYS_6752 is not set +# CONFIG_MTK_COMBO_CHIP_CONSYS_6592 is not set +CONFIG_MTK_COMBO_CHIP="CONSYS_8127" +CONFIG_MTK_WLAN_CHIP="CONSYS_8127" +CONFIG_MTK_WLAN_SUPPORT=y +CONFIG_MTK_WAPI_SUPPORT=y +# CONFIG_MTK_PASSPOINT_R2_SUPPORT is not set +CONFIG_MTK_WIFI_MCC_SUPPORT=y +CONFIG_MTK_COMBO_PLAT_PATH="" +# CONFIG_MTK_COMBO_COMM is not set +CONFIG_MTK_COMBO_BT=y +# CONFIG_MTK_COMBO_ANT is not set +CONFIG_MTK_COMBO_GPS=y +CONFIG_MTK_GPS_SUPPORT=y +CONFIG_MTK_COMBO_WIFI=y +CONFIG_MTK_BT_SUPPORT=y +CONFIG_MTK_WFD_SUPPORT=y +CONFIG_MTK_FM=y +CONFIG_MTK_FM_SUPPORT=y +CONFIG_MTK_FM_CHIP="MT6627_FM" +# CONFIG_MTK_FM_50KHZ_SUPPORT is not set +# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set +# CONFIG_SDIOAUTOK_SUPPORT is not set +CONFIG_MTK_MT6306_SUPPORT=y +CONFIG_MTK_IDLE_TIME_FIX=y +CONFIG_MTK_G2D=y +CONFIG_MTK_MPEG4_DEC_DRIVER=y +CONFIG_MTK_MPEG4_ENC_DRIVER=y +CONFIG_MTK_H264_DEC_DRIVER=y +CONFIG_MTK_MFLEXVIDEO_DRIVER=y +CONFIG_MTK_VIDEOCODEC_DRIVER=y +# CONFIG_MTK_MJC_DRIVER is not set +CONFIG_MTK_I2C=y +# CONFIG_MTK_SPI is not set +CONFIG_MTK_JPEG=y +CONFIG_MTK_KEYPAD=y +CONFIG_KEYBOARD_HID=y +CONFIG_MTK_LEDS=y +CONFIG_MTK_MMC=y +# CONFIG_MTK_SDIOAUTOK_SUPPORT is not set + +# +# MediaTek OFN / Jogball Related Drivers +# +# CONFIG_MOUSE_PANASONIC_EVQWJN is not set +# CONFIG_MOUSE_AVAGOTECH_A320 is not set +# CONFIG_MTK_MTD_NAND is not set +CONFIG_MTK_SMART_BATTERY=y +CONFIG_MTK_PMIC=y +CONFIG_MTK_PMIC_WRAP=y +# CONFIG_MTK_PMIC_MT6397 is not set +# CONFIG_POWER_EXT is not set +# CONFIG_MTK_POWER_EXT_DETECT is not set +# CONFIG_MTK_PUMP_EXPRESS_SUPPORT is not set +# CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT is not set +# CONFIG_MTK_VOW_SUPPORT is not set +# CONFIG_MTK_EXTERNAL_LDO is not set +# CONFIG_X2_BQ27531_SUPPORT is not set +# CONFIG_MTK_BQ24250_SUPPORT is not set +# CONFIG_MTK_BQ24261_SUPPORT is not set +# CONFIG_MTK_BQ24196_SUPPORT is not set +# CONFIG_MTK_FAN5405_SUPPORT is not set +# CONFIG_MTK_FAN5402_SUPPORT is not set +# CONFIG_MTK_BQ24158_SUPPORT is not set +CONFIG_MTK_BQ24296_SUPPORT=y +CONFIG_MTK_SN2871_SUPPORT=y +# CONFIG_MTK_BQ27541_SUPPORT is not set +# CONFIG_MTK_NCP1851_SUPPORT is not set +# CONFIG_MTK_NCP1854_SUPPORT is not set +# CONFIG_MTK_RT9536_SUPPORT is not set +# CONFIG_MTK_MAX8971_SUPPORT is not set +# CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT is not set +# CONFIG_MTK_WIRELESS_CHARGER_SUPPORT is not set +CONFIG_MTK_JEITA_STANDARD_SUPPORT=y +CONFIG_MTK_AUTO_POWER_ON_WITH_CHARGER=y +CONFIG_MTK_RTC=y +CONFIG_MTK_SERIAL=y +CONFIG_MTK_SERIAL_CONSOLE=y +# CONFIG_MTK_SERIAL_MODEM_TEST is not set +CONFIG_MTK_UART_USB_SWITCH=y +CONFIG_MTK_SIM2=y +CONFIG_MTK_SOUND=y +# CONFIG_MTK_AUDIO_EXTCODEC_SUPPORT is not set +# CONFIG_MTK_CM36283 is not set +# CONFIG_MTK_GP2AP002S00F is not set +# CONFIG_MTK_APM_16D is not set +# CONFIG_MTK_EPL2182 is not set +# CONFIG_MTK_EPL2182_NEW is not set +# CONFIG_MTK_STK3X1X is not set +# CONFIG_MTK_CM36652_NEW is not set +# CONFIG_MTK_APDS9930 is not set +# CONFIG_MTK_CM3232_NEW is not set +# CONFIG_MTK_APDS9930_NEW is not set +# CONFIG_MTK_RPR410 is not set +CONFIG_MTK_KXTJ2_1009=y +CONFIG_MTK_MC3410=y +# CONFIG_MTK_KXTIK1004 is not set +# CONFIG_MTK_K2DH is not set +# CONFIG_MTK_BMA222E is not set +# CONFIG_MTK_BMA222E_NEW is not set +# CONFIG_MTK_MPU6050G is not set +# CONFIG_MTK_MPU6050G_NEW is not set +# CONFIG_MTK_BMA250 is not set +CONFIG_MTK_BMA253=y +# CONFIG_MTK_MPU6515A is not set +# CONFIG_MTK_KXTJ2_1009_NEW is not set +# CONFIG_MTK_BMA250E is not set +# CONFIG_MTK_BMA056 is not set +# CONFIG_MTK_MPU3050C is not set +# CONFIG_MTK_MPU3000 is not set +# CONFIG_MTK_MPU3000_NEW is not set +# CONFIG_MTK_MPU6050GY is not set +# CONFIG_MTK_MPU6050GY_NEW is not set +# CONFIG_MTK_MPU6515G is not set +# CONFIG_MTK_MPU3050C_NEW is not set +# CONFIG_MTK_AKM8963 is not set +# CONFIG_MTK_AKM09911 is not set +# CONFIG_MTK_AKM8963_NEW is not set +# CONFIG_MTK_HSCDTD006 is not set +# CONFIG_MTK_BMM050 is not set +# CONFIG_MTK_BMM050_NEW is not set +# CONFIG_MTK_MMC3416X is not set +# CONFIG_MTK_BMA050 is not set +# CONFIG_MTK_BMA050_NEW is not set +# CONFIG_MTK_BMM056_NEW is not set +# CONFIG_MTK_S2200 is not set +# CONFIG_MTK_YAS532 is not set +# CONFIG_MTK_BMP180_NEW is not set +CONFIG_MTK_TOUCHPANEL=y +# CONFIG_MTK_S7020 is not set +CONFIG_MTK_USB_GADGET=y +# CONFIG_USB_MU3D_PIO_ONLY is not set +# CONFIG_USB_MU3D_DRV is not set +# CONFIG_USB_MU3D_DVT is not set +# CONFIG_MU3_PHY is not set +# CONFIG_MTK_XHCI is not set +# CONFIG_MTK_OTG_PMIC_BOOST_5V is not set +# CONFIG_MTK_TEST_XHCI is not set +# CONFIG_USBIF_COMPLIANCE is not set +# CONFIG_MTK_S3320 is not set +# CONFIG_MTK_S3320_47 is not set +# CONFIG_LEDS_LM3632 is not set +# CONFIG_LEDS_LM3639 is not set +# CONFIG_LEDS_RT8542 is not set +# CONFIG_MTK_VIBRATOR is not set +# CONFIG_MTK_WD_KICKER is not set +# CONFIG_MT592X_SDIO_CLNT is not set +CONFIG_USB_MTK_ACM_TEMP=y +CONFIG_USB_MTK_HDRC=y +CONFIG_USB_MTK_HDRC_GADGET=y +CONFIG_USB_MTK_OTG=y +# CONFIG_USB_MTK_DUALMODE is not set +# CONFIG_USB_MTK_DEBUG_FS is not set +# CONFIG_USB_MTK_DEBUG is not set +CONFIG_USB_MTK_HDRC_HCD=y +# CONFIG_MTK_USB_UNIQUE_SERIAL is not set +# CONFIG_MTK_USBFSH is not set +# CONFIG_MUSBFSH_PIO_ONLY is not set +CONFIG_AMPC_CDEV_NUM=151 +CONFIG_ION_MTK=y +# CONFIG_MMPROFILE is not set +CONFIG_MTK_STAGING=y +# CONFIG_MTKPASR is not set +# CONFIG_PWR_LOSS_MTK_TEST is not set +# CONFIG_MTK_EMMC_CACHE is not set +CONFIG_MTK_GPU_SUPPORT=y +# CONFIG_MTK_ICUSB_SUPPORT is not set +# CONFIG_MTK_DT_USB_SUPPORT is not set +# CONFIG_MTK_SWCHR_SUPPORT is not set +# CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION is not set +CONFIG_MTK_KERNEL_POWER_OFF_CHARGING=y +CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT=y +# CONFIG_MTK_BQ24160_SUPPORT is not set +# CONFIG_MTK_MT8193_SUPPORT is not set +# CONFIG_MTK_MT8193_HDCP_SUPPORT is not set +CONFIG_CUSTOM_KERNEL_HDMI="" +# CONFIG_MTK_HDMI_SUPPORT is not set +# CONFIG_SINGLE_PANEL_OUTPUT is not set +# CONFIG_MTK_INTERNAL_MHL_SUPPORT is not set +# CONFIG_MTK_THERMAL_PA_VIA_ATCMD is not set +CONFIG_MTK_SIM1_SOCKET_TYPE="1" +CONFIG_MTK_SIM2_SOCKET_TYPE="1" +# CONFIG_MTK_SEC_MODEM_NVRAM_ANTI_CLONE is not set +# CONFIG_MTK_MT6333_SUPPORT is not set +# CONFIG_MTK_CTP_RESET_CONFIG is not set +CONFIG_MTK_BICR_SUPPORT=y +# CONFIG_MTK_VIDEO_HEVC_SUPPORT is not set +CONFIG_MTK_AAL_SUPPORT=y +# CONFIG_MTK_MULTIBRIDGE_SUPPORT is not set +# CONFIG_NAND_OTP_SUPPORT is not set +# CONFIG_MTK_OD_SUPPORT is not set +CONFIG_MTK_LENS_DUMMYLENS_SUPPORT=y +# CONFIG_MTK_LENS_AD5820AF_SUPPORT is not set +# CONFIG_MTK_LENS_AD5823_SUPPORT is not set +# CONFIG_MTK_LENS_AD5823AF_SUPPORT is not set +# CONFIG_MTK_LENS_AK7345AF_SUPPORT is not set +# CONFIG_MTK_LENS_BU6424AF_SUPPORT is not set +# CONFIG_MTK_LENS_BU6429AF_SUPPORT is not set +# CONFIG_MTK_LENS_BU64745GWZAF_SUPPORT is not set +# CONFIG_MTK_LENS_DW9718AF_SUPPORT is not set +# CONFIG_MTK_LENS_DW9714AF_SUPPORT is not set +# CONFIG_MTK_LENS_DW9714A_SUPPORT is not set +# CONFIG_MTK_LENS_LC898122AF_SUPPORT is not set +# CONFIG_MTK_LENS_LC898212AF_SUPPORT is not set +# CONFIG_MTK_LENS_FM50AF_SUPPORT is not set +# CONFIG_MTK_LENS_MT9P017AF_SUPPORT is not set +# CONFIG_MTK_LENS_OV8825AF_SUPPORT is not set +# CONFIG_MTK_LENS_SENSORDRIVE_SUPPORT is not set +# CONFIG_MTK_LENS_GAF001AF_SUPPORT is not set +# CONFIG_MTK_LENS_GAF002AF_SUPPORT is not set +# CONFIG_MTK_LENS_GAF008AF_SUPPORT is not set +# CONFIG_MTK_CAM_CAL_GT24C32A_SUPPORT is not set +# CONFIG_MTK_CAM_CAL_BRCC064GWZ_3_SUPPORT is not set +# CONFIG_MTK_CPU_STRESS is not set +# CONFIG_MTK_LASTPC is not set +CONFIG_MTK_FMRADIO=y +CONFIG_MTK_HWMON=y +# CONFIG_MTK_CMDQ is not set +# CONFIG_MTK_VIDEOX is not set +CONFIG_MTK_MT_LOGGER=y +CONFIG_MTK_CONN_MD=y +CONFIG_MTK_LENS=y +CONFIG_MTK_IMGSENSOR=y +CONFIG_MTK_FLASHLIGHT=y +CONFIG_MTK_SYSENV=y +CONFIG_MTK_SMI=y +CONFIG_MTK_BTCVSD=y +CONFIG_MTK_SOUND_DRV=y +CONFIG_MTK_POWER_GS=y +CONFIG_MTK_VIDEO=y +CONFIG_MTK_MRDUMP=y +# CONFIG_MTK_WMT_CCCI is not set +# CONFIG_MTK_VCOREFS is not set +CONFIG_MTK_EMI_MPU=y +CONFIG_MTK_EMI_BWL=y +# CONFIG_MTK_DBG_DUMP is not set + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +CONFIG_SCSI_TGT=y +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_DH is not set +# CONFIG_SCSI_OSD_INITIATOR is not set +# CONFIG_ATA is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +# CONFIG_BCACHE is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +CONFIG_DM_CRYPT=y +# CONFIG_DM_SNAPSHOT is not set +# CONFIG_DM_THIN_PROVISIONING is not set +# CONFIG_DM_CACHE is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_RAID is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +CONFIG_DM_UEVENT=y +# CONFIG_DM_FLAKEY is not set +# CONFIG_DM_VERITY is not set +# CONFIG_TARGET_CORE is not set +CONFIG_NETDEVICES=y +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +# CONFIG_EQUALIZER is not set +CONFIG_MII=y +CONFIG_IFB=y +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +CONFIG_TUN=y +# CONFIG_VETH is not set + +# +# CAIF transport drivers +# + +# +# Distributed Switch Architecture drivers +# +# CONFIG_NET_DSA_MV88E6XXX is not set +# CONFIG_NET_DSA_MV88E6060 is not set +# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set +# CONFIG_NET_DSA_MV88E6131 is not set +# CONFIG_NET_DSA_MV88E6123_61_65 is not set +# CONFIG_ETHERNET is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_AT803X_PHY is not set +# CONFIG_AMD_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MICREL_KS8995MA is not set +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +# CONFIG_SLIP is not set +CONFIG_SLHC=y + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +CONFIG_USB_USBNET=y +CONFIG_USB_NET_AX8817X=y +CONFIG_USB_NET_AX88179_178A=y +CONFIG_USB_NET_CDCETHER=y +# CONFIG_USB_NET_CDC_EEM is not set +CONFIG_USB_NET_CDC_NCM=y +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +CONFIG_USB_NET_NET1080=y +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=y +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +CONFIG_USB_NET_ZAURUS=y +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +CONFIG_WLAN=y +# CONFIG_USB_ZD1201 is not set +# CONFIG_USB_NET_RNDIS_WLAN is not set +# CONFIG_WIFI_CONTROL_FUNC is not set +# CONFIG_ATH_CARDS is not set +# CONFIG_BRCMFMAC is not set +# CONFIG_HOSTAP is not set +# CONFIG_LIBERTAS is not set +# CONFIG_WL_TI is not set +# CONFIG_MWIFIEX is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# +# CONFIG_WAN is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set +# CONFIG_INPUT_KEYRESET is not set +# CONFIG_INPUT_KEYCOMBO is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MCS is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +# CONFIG_MOUSE_SYNAPTICS_USB is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_WARRIOR=y +CONFIG_JOYSTICK_XPAD=y + +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MCS5000 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_MTK is not set +# CONFIG_TOUCHSCREEN_MTK_GT818B_FPGA is not set +# CONFIG_MTK_GT9XX is not set +# CONFIG_MTK_GT911 is not set +# CONFIG_MTK_MMS244 is not set +# CONFIG_GT9XX_HOTKNOT_FLASHLESS is not set +# CONFIG_MTK_FT5406 is not set +# CONFIG_MTK_FT5406_82 is not set +# CONFIG_MTK_FT5206 is not set +# CONFIG_MTK_MMS134 is not set +# CONFIG_MTK_MMS128 is not set +# CONFIG_MTK_MIT200 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_MTK_FTS2A052 is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_SYNAPTICS_S3528 is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_MPU3050 is not set +# CONFIG_INPUT_GP2A is not set +# CONFIG_INPUT_GPIO_TILT_POLLED is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYCHORD is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +CONFIG_INPUT_UINPUT=y +# CONFIG_INPUT_GPIO is not set +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_CMA3000 is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_TTY=y +# CONFIG_VT is not set +CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_TRACE_SINK is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_KGDB_NMI is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_TIMBERDALE is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_IFX6X60 is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_TTY_PRINTK is not set +# CONFIG_HVC_DCC is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_DCC_TTY is not set +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_CHARDEV=y +# CONFIG_I2C_MUX is not set +CONFIG_I2C_HELPER_AUTO=y + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_PXA_PCI is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PL022 is not set +# CONFIG_SPI_PXA2XX_PCI is not set +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_DESIGNWARE is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set + +# +# Qualcomm MSM SSBI bus support +# +# CONFIG_SSBI is not set +# CONFIG_HSI is not set + +# +# PPS support +# +# CONFIG_PPS is not set + +# +# PPS generators support +# + +# +# PTP clock support +# +# CONFIG_PTP_1588_CLOCK is not set + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +# CONFIG_PTP_1588_CLOCK_PCH is not set +CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_GPIO_DEVRES=y +CONFIG_GPIOLIB=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_GPIO_SYSFS is not set + +# +# Memory mapped GPIO drivers: +# +# CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_EM is not set +# CONFIG_GPIO_PL061 is not set +# CONFIG_GPIO_RCAR is not set +# CONFIG_GPIO_TS5500 is not set + +# +# I2C GPIO expanders: +# +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_SX150X is not set +# CONFIG_GPIO_ADP5588 is not set + +# +# PCI GPIO expanders: +# + +# +# SPI GPIO expanders: +# +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MCP23S08 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_74X164 is not set + +# +# AC97 GPIO expanders: +# + +# +# MODULbus GPIO expanders: +# + +# +# USB GPIO expanders: +# +# CONFIG_W1 is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_BATTERY_BQ27x00 is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_POWER_RESET is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_AVS is not set +# CONFIG_HWMON is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_DEFAULT_GOV_BACKWARD_COMPATIBLE is not set +# CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +CONFIG_THERMAL_DEFAULT_GOV_TRIP_STEP_WISE=y +# CONFIG_BACKWARD_COMPATIBLE is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_GOV_STEP_WISE is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_CPU_THERMAL=y +# CONFIG_THERMAL_EMULATION is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +CONFIG_INPUT_TEMPERATURE_TMP103=y +CONFIG_VS_THERMAL=y +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y + +# +# Broadcom specific AMBA +# +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_CROS_EC is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_HTC_EGPIO is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_HTC_I2CPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SMSC is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_MFD_STMPE is not set +# CONFIG_MFD_SYSCON is not set +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_REGULATOR is not set +CONFIG_MEDIA_SUPPORT=y + +# +# Multimedia core support +# +# CONFIG_MEDIA_CAMERA_SUPPORT is not set +# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set +# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set +# CONFIG_MEDIA_RADIO_SUPPORT is not set +CONFIG_MEDIA_RC_SUPPORT=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +# CONFIG_TTPCI_EEPROM is not set + +# +# Media drivers +# +CONFIG_RC_CORE=y +CONFIG_RC_MAP=y +CONFIG_RC_DECODERS=y +CONFIG_LIRC=y +CONFIG_IR_LIRC_CODEC=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_RC5_SZ_DECODER=y +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +# CONFIG_RC_DEVICES is not set +# CONFIG_MEDIA_USB_SUPPORT is not set + +# +# Supported MMC/SDIO adapters +# +# CONFIG_CYPRESS_FIRMWARE is not set + +# +# Media ancillary drivers (tuners, sensors, i2c, frontends) +# + +# +# Customise DVB Frontends +# +# CONFIG_DVB_TUNER_DIB0070 is not set +# CONFIG_DVB_TUNER_DIB0090 is not set + +# +# Tools to develop new frontends +# +# CONFIG_DVB_DUMMY_FE is not set + +# +# Graphics support +# +# CONFIG_DRM is not set +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_SYS_FOPS is not set +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_ARMCLCD is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_GOLDFISH is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_BROADSHEET is not set +# CONFIG_FB_AUO_K190X is not set +# CONFIG_EXYNOS_VIDEO is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_ADF is not set + +# +# Console display driver support +# +CONFIG_FONT_8x16=y +# CONFIG_LOGO is not set +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_HWDEP=y +CONFIG_SND_RAWMIDI=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +# CONFIG_SND_MIXER_OSS is not set +CONFIG_SND_PCM_OSS=y +# CONFIG_SND_PCM_OSS_PLUGINS is not set +CONFIG_SND_HRTIMER=y +# CONFIG_SND_DYNAMIC_MINORS is not set +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_RAWMIDI_SEQ is not set +# CONFIG_SND_OPL3_LIB_SEQ is not set +# CONFIG_SND_OPL4_LIB_SEQ is not set +# CONFIG_SND_SBAWE_SEQ is not set +# CONFIG_SND_EMU10K1_SEQ is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_ALOOP is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +# CONFIG_SND_ARM is not set +# CONFIG_SND_SPI is not set +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=y +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_SOC is not set +# CONFIG_SOUND_PRIME is not set + +# +# HID support +# +CONFIG_HID=y +# CONFIG_HID_BATTERY_STRENGTH is not set +# CONFIG_HIDRAW is not set +CONFIG_UHID=y +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=y +CONFIG_HID_ACRUX=y +CONFIG_HID_APPLE=y +# CONFIG_HID_APPLEIR is not set +# CONFIG_HID_AUREAL is not set +CONFIG_HID_BELKIN=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +# CONFIG_HID_PRODIKEYS is not set +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +# CONFIG_DRAGONRISE_FF is not set +# CONFIG_HID_EMS_FF is not set +# CONFIG_HID_ELECOM is not set +CONFIG_HID_EZKEY=y +# CONFIG_HID_HOLTEK is not set +# CONFIG_HID_KEYTOUCH is not set +CONFIG_HID_KYE=y +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_WALTOP is not set +CONFIG_HID_GYRATION=y +# CONFIG_HID_ICADE is not set +CONFIG_HID_TWINHAN=y +CONFIG_HID_KENSINGTON=y +# CONFIG_HID_LCPOWER is not set +# CONFIG_HID_LENOVO_TPKBD is not set +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +# CONFIG_LOGIG940_FF is not set +# CONFIG_LOGIWHEELS_FF is not set +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +# CONFIG_HID_MULTITOUCH is not set +CONFIG_HID_NTRIG=y +# CONFIG_HID_ORTEK is not set +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_PRIMAX is not set +# CONFIG_HID_PS3REMOTE is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_SAITEK is not set +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +# CONFIG_HID_SPEEDLINK is not set +# CONFIG_HID_STEELSERIES is not set +CONFIG_HID_SUNPLUS=y +CONFIG_HID_GREENASIA=y +# CONFIG_GREENASIA_FF is not set +CONFIG_HID_SMARTJOYPLUS=y +# CONFIG_SMARTJOYPLUS_FF is not set +# CONFIG_HID_TIVO is not set +CONFIG_HID_TOPSEED=y +# CONFIG_HID_THINGM is not set +CONFIG_HID_THRUSTMASTER=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_HID_WACOM is not set +# CONFIG_HID_WIIMOTE is not set +CONFIG_HID_ZEROPLUS=y +# CONFIG_ZEROPLUS_FF is not set +# CONFIG_HID_ZYDACRON is not set +# CONFIG_HID_SENSOR_HUB is not set + +# +# USB HID support +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# I2C HID support +# +# CONFIG_I2C_HID is not set +# CONFIG_USB_ARCH_HAS_OHCI is not set +# CONFIG_USB_ARCH_HAS_EHCI is not set +# CONFIG_USB_ARCH_HAS_XHCI is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_MON is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1760_HCD is not set +# CONFIG_USB_ISP1362_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_RENESAS_USBHS is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=y +CONFIG_USB_PRINTER=y +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +# CONFIG_USB_STORAGE_ENE_UB6250 is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_CHIPIDEA is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set +CONFIG_USB_SERIAL=y +# CONFIG_USB_SERIAL_CONSOLE is not set +# CONFIG_USB_EZUSB is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_CH341 is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_CP210X is not set +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_FUNSOFT is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_F81232 is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_METRO is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MOTOROLA is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_OTI6858 is not set +# CONFIG_USB_SERIAL_QCAUX is not set +# 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 +# CONFIG_USB_SERIAL_SIEMENS_MPI is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_SYMBOL is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +CONFIG_USB_SERIAL_WWAN=y +CONFIG_USB_SERIAL_OPTION=y +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_OPTICON is not set +# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set +# CONFIG_USB_SERIAL_XSENS_MT is not set +# CONFIG_USB_SERIAL_ZIO is not set +# CONFIG_USB_SERIAL_WISHBONE is not set +# CONFIG_USB_SERIAL_ZTE is not set +# CONFIG_USB_SERIAL_SSU100 is not set +# CONFIG_USB_SERIAL_QT2 is not set +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +CONFIG_USB_TRANCEVIBRATOR=y +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_HSIC_USB3503 is not set +CONFIG_USB_PHY=y +# CONFIG_USB_OTG_WAKELOCK is not set +CONFIG_NOP_USB_XCEIV=y +# CONFIG_OMAP_CONTROL_USB is not set +# CONFIG_OMAP_USB3 is not set +# CONFIG_SAMSUNG_USBPHY is not set +# CONFIG_SAMSUNG_USB2PHY is not set +# CONFIG_SAMSUNG_USB3PHY is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_RCAR_PHY is not set +# CONFIG_USB_ULPI 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 is not set +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 + +# +# USB Peripheral Controller +# +# CONFIG_USB_FUSB300 is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_DUMMY_HCD is not set +CONFIG_USB_LIBCOMPOSITE=y +CONFIG_USB_F_ACM=y +CONFIG_USB_U_SERIAL=y +CONFIG_USB_F_SERIAL=y +# CONFIG_USB_ZERO is not set +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_G_NCM is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_FUNCTIONFS is not set +# CONFIG_USB_MASS_STORAGE is not set +# CONFIG_USB_G_SERIAL is not set +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_USB_G_ANDROID=y +# CONFIG_USB_ANDROID_RNDIS_DWORD_ALIGNED is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_G_ACM_MS is not set +# CONFIG_USB_G_MULTI is not set +# CONFIG_USB_G_HID is not set +# CONFIG_USB_G_DBGP is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_UNSAFE_RESUME=y +# CONFIG_MMC_CLKGATE is not set +# CONFIG_MMC_EMBEDDED_SDIO is not set +# CONFIG_MMC_PARANOID_SD_INIT is not set + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_BOUNCE=y +CONFIG_MMC_SAMSUNG_SMART=y +CONFIG_MMC_ERR_REMOVE=y +# CONFIG_MMC_BLOCK_DEFERRED_RESUME is not set +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_ARMMMCI is not set +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_DW is not set +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_PCA9532 is not set +# CONFIG_LEDS_GPIO is not set +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP5521 is not set +# CONFIG_LEDS_LP5523 is not set +# CONFIG_LEDS_LP5562 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA9633 is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_OT200 is not set +# CONFIG_LEDS_BLINKM is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +# CONFIG_LEDS_TRIGGER_ONESHOT is not set +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_CPU is not set +# CONFIG_LEDS_TRIGGER_GPIO is not set +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set + +# +# iptables trigger is under Netfilter config (LED target) +# +# CONFIG_LEDS_TRIGGER_TRANSIENT is not set +# CONFIG_LEDS_TRIGGER_CAMERA is not set +CONFIG_SWITCH=y +# CONFIG_SWITCH_GPIO is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_EDAC is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_DS3234 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_RX4581 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set +# CONFIG_RTC_DRV_DS2404 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set +# CONFIG_DMADEVICES is not set +# CONFIG_AUXDISPLAY is not set +# CONFIG_UIO is not set +# CONFIG_VIRT_DRIVERS is not set + +# +# Virtio drivers +# +# CONFIG_VIRTIO_MMIO is not set + +# +# Microsoft Hyper-V guest support +# +CONFIG_STAGING=y +# CONFIG_USBIP_CORE is not set +# CONFIG_PRISM2_USB is not set +# CONFIG_ECHO is not set +# CONFIG_ASUS_OLED is not set +# CONFIG_R8712U is not set +# CONFIG_RTS5139 is not set +# CONFIG_TRANZPORT is not set +# CONFIG_LINE6_USB is not set +# CONFIG_USB_SERIAL_QUATECH2 is not set +CONFIG_ZSMALLOC=y +CONFIG_ZRAM=y +CONFIG_ZRAM_DEBUG=y +# CONFIG_BCM_WIMAX is not set +# CONFIG_FT1000 is not set + +# +# Speakup console speech +# +# CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set +# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set +# CONFIG_STAGING_MEDIA is not set + +# +# Android +# +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ANDROID_BINDER_IPC_32BIT=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_LOGGER=y +CONFIG_ANDROID_TIMED_OUTPUT=y +# CONFIG_ANDROID_TIMED_GPIO is not set +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_ANDROID_LOW_MEMORY_KILLER_AUTODETECT_OOM_ADJ_VALUES=y +CONFIG_ANDROID_INTF_ALARM_DEV=y +CONFIG_SYNC=y +CONFIG_SW_SYNC=y +CONFIG_SW_SYNC_USER=y +# CONFIG_MTK_LCA_RAM_OPTIMIZE is not set +CONFIG_ION=y +# CONFIG_ION_TEST is not set +# CONFIG_FIQ_DEBUGGER is not set +# CONFIG_FIQ_WATCHDOG is not set +# CONFIG_USB_WPAN_HCD is not set +# CONFIG_WIMAX_GDM72XX is not set +# CONFIG_CSR_WIFI is not set +# CONFIG_CED1401 is not set +# CONFIG_DGRP is not set + +# +# Hardware Spinlock drivers +# +# CONFIG_MAILBOX is not set +# CONFIG_IOMMU_SUPPORT is not set + +# +# Remoteproc drivers +# +# CONFIG_STE_MODEM_RPROC is not set + +# +# Rpmsg drivers +# +# CONFIG_PM_DEVFREQ is not set +# CONFIG_EXTCON is not set +# CONFIG_MEMORY is not set +# CONFIG_IIO is not set +# CONFIG_PWM is not set +# CONFIG_IPACK_BUS is not set +# CONFIG_RESET_CONTROLLER is not set + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_EXT2_FS is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_EXT4_FS=y +# CONFIG_EXT4_USE_FOR_EXT23 is not set +# CONFIG_EXT4_FS_POSIX_ACL is not set +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_FANOTIFY is not set +# CONFIG_QUOTA is not set +# CONFIG_QUOTACTL is not set +# CONFIG_AUTOFS4_FS is not set +CONFIG_FUSE_FS=y +# CONFIG_CUSE is not set +CONFIG_GENERIC_ACL=y + +# +# Caches +# +# CONFIG_FSCACHE is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_CONFIGFS_FS=y +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS2_FS is not set +# CONFIG_LOGFS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_XATTR=y +# CONFIG_SQUASHFS_ZLIB is not set +CONFIG_SQUASHFS_LZO=y +# CONFIG_SQUASHFS_XZ is not set +CONFIG_SQUASHFS_4K_DEVBLK_SIZE=y +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_PSTORE is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +# CONFIG_F2FS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +CONFIG_NLS_CODEPAGE_950=y +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set + +# +# Kernel hacking +# +CONFIG_PRINTK_TIME=y +CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1400 +CONFIG_MAGIC_SYSRQ=y +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_LOCKUP_DETECTOR=y +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_ON_OOPS_VALUE=1 +# CONFIG_DETECT_HUNG_TASK is not set +CONFIG_SCHED_DEBUG=y +CONFIG_SCHEDSTATS=y +# CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=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 is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +CONFIG_STACKTRACE=y +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_INFO_REDUCED is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_TEST_LIST_SORT is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_CREDENTIALS is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set + +# +# RCU Debugging +# +# CONFIG_PROVE_RCU is not set +# CONFIG_PROVE_RCU_DELAY is not set +# CONFIG_SPARSE_RCU_POINTER is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_RCU_CPU_STALL_VERBOSE=y +# CONFIG_RCU_CPU_STALL_INFO is not set +# CONFIG_RCU_TRACE is not set +# 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_DEBUG_PER_CPU_MAPS is not set +# CONFIG_LKDTM is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_FUNCTION_GRAPH_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_FTRACE_SYSCALLS is not set +# CONFIG_TRACER_SNAPSHOT is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_PROBE_EVENTS is not set +# CONFIG_DYNAMIC_FTRACE is not set +CONFIG_FUNCTION_PROFILER=y +# CONFIG_FTRACE_MCOUNT_RECORD is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_ATOMIC64_SELFTEST is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +# CONFIG_TEST_STRING_HELPERS is not set +# CONFIG_TEST_KSTRTOX is not set +# CONFIG_STRICT_DEVMEM is not set +# CONFIG_ARM_UNWIND is not set +# CONFIG_OLD_MCOUNT is not set +# CONFIG_DEBUG_USER is not set +CONFIG_DEBUG_RODATA=y +# CONFIG_DEBUG_RODATA_TEST is not set +# CONFIG_DEBUG_LL is not set +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +CONFIG_UNCOMPRESS_INCLUDE="mach/uncompress.h" +# CONFIG_OC_ETM is not set +# CONFIG_PID_IN_CONTEXTIDR is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_SECURITY=y +# CONFIG_SECURITYFS is not set +CONFIG_SECURITY_NETWORK=y +# CONFIG_SECURITY_NETWORK_XFRM is not set +# CONFIG_SECURITY_PATH is not set +CONFIG_LSM_MMAP_MIN_ADDR=32768 +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SELINUX_BOOTPARAM=y +CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 +# CONFIG_SECURITY_SELINUX_DISABLE is not set +CONFIG_SECURITY_SELINUX_DEVELOP=y +CONFIG_SECURITY_SELINUX_AVC_STATS=y +CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 +# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_YAMA is not set +# CONFIG_IMA is not set +CONFIG_DEFAULT_SECURITY_SELINUX=y +# CONFIG_DEFAULT_SECURITY_DAC is not set +CONFIG_DEFAULT_SECURITY="selinux" +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_PCOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_USER is not set +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +# CONFIG_CRYPTO_GF128MUL is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_PCRYPT is not set +CONFIG_CRYPTO_WORKQUEUE=y +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=y + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +# CONFIG_CRYPTO_CMAC is not set +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_VMAC is not set + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_GHASH is not set +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +# CONFIG_CRYPTO_SHA1_ARM is not set +CONFIG_CRYPTO_SHA256=y +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_ARM is not set +# CONFIG_CRYPTO_AES_ARM32_CE is not set +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_ARC4=y +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_TWOFISH_COMMON=y + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +# CONFIG_CRYPTO_ZLIB is not set +CONFIG_CRYPTO_LZO=y + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_USER_API_HASH is not set +# CONFIG_CRYPTO_USER_API_SKCIPHER is not set +# CONFIG_CRYPTO_HW is not set +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IO=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=y +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set +CONFIG_AUDIT_GENERIC=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +# CONFIG_LZ4K is not set +# CONFIG_XZ_DEC is not set +# CONFIG_XZ_DEC_BCJ is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=y +CONFIG_TEXTSEARCH_BM=y +CONFIG_TEXTSEARCH_FSM=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_NLATTR=y +CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y +# CONFIG_AVERAGE is not set +# CONFIG_CORDIC is not set +# CONFIG_DDR is not set +# CONFIG_VIRTUALIZATION is not set +CONFIG_MTK_WD_KICKER=y +CONFIG_MTK_HALL_SENSOR=y diff --git a/arch/arm/configs/ford_defconfig b/arch/arm/configs/ford_defconfig new file mode 100644 index 00000000000..a5f404a4a71 --- /dev/null +++ b/arch/arm/configs/ford_defconfig @@ -0,0 +1,3306 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm 3.10.54 Kernel Configuration +# +CONFIG_ARM=y +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_HAVE_PROC_CPU=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_ARCH_HAS_CPUFREQ=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_FIQ=y +CONFIG_VECTORS_BASE=0xffff0000 +# CONFIG_ARM_PATCH_PHYS_VIRT is not set +CONFIG_NEED_MACH_MEMORY_H=y +CONFIG_GENERIC_BUG=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_EXTABLE_SORT=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_CROSS_COMPILE="" +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +# CONFIG_KERNEL_GZIP is not set +# CONFIG_KERNEL_LZMA is not set +CONFIG_KERNEL_XZ=y +# CONFIG_KERNEL_LZO is not set +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_FHANDLE is not set +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +CONFIG_AUDIT_WATCH=y +CONFIG_AUDIT_TREE=y +# CONFIG_AUDIT_LOGINUID_IMMUTABLE is not set +CONFIG_HAVE_GENERIC_HARDIRQS=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_DEBUG=y +CONFIG_KTIME_SCALAR=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set + +# +# RCU Subsystem +# +CONFIG_TREE_PREEMPT_RCU=y +CONFIG_PREEMPT_RCU=y +CONFIG_RCU_STALL_COMMON=y +# CONFIG_RCU_USER_QS is not set +CONFIG_RCU_FANOUT=32 +CONFIG_RCU_FANOUT_LEAF=16 +# CONFIG_RCU_FANOUT_EXACT is not set +# CONFIG_RCU_FAST_NO_HZ is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_RCU_BOOST is not set +# CONFIG_RCU_NOCB_CPU is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_CGROUPS=y +# CONFIG_CGROUP_DEBUG is not set +# CONFIG_CGROUP_FREEZER is not set +# CONFIG_CGROUP_DEVICE is not set +# CONFIG_CPUSETS is not set +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +# CONFIG_MEMCG is not set +# CONFIG_CGROUP_PERF is not set +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +# CONFIG_CFS_BANDWIDTH is not set +CONFIG_RT_GROUP_SCHED=y +# CONFIG_BLK_CGROUP is not set +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_NAMESPACES is not set +CONFIG_UIDGID_CONVERTED=y +# CONFIG_UIDGID_STRICT_TYPE_CHECKS is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y +CONFIG_HAVE_UID16=y +CONFIG_HOTPLUG=y +CONFIG_PANIC_TIMEOUT=1 +CONFIG_EXPERT=y +CONFIG_UID16=y +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_EMBEDDED=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_PERF_USE_VMALLOC=y + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_COMPAT_BRK=y +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# CONFIG_OPROFILE is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_JUMP_LABEL is not set +# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_ATTRS=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_USE_GENERIC_SMP_HELPERS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_DMA_API_DEBUG=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP_FILTER=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_OLD_SIGACTION=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_STOP_MACHINE=y +CONFIG_BLOCK=y +CONFIG_LBDAF=y +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_FREEZER=y + +# +# System Type +# +CONFIG_MMU=y +# CONFIG_ARCH_MULTIPLATFORM is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_GEMINI is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_DOVE is not set +# CONFIG_ARCH_KIRKWOOD is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_W90X900 is not set +# CONFIG_ARCH_LPC32XX is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_MSM is not set +# CONFIG_ARCH_MT6572 is not set +# CONFIG_ARCH_MT6595 is not set +# CONFIG_ARCH_MT6582 is not set +# CONFIG_ARCH_MT6592 is not set +# CONFIG_ARCH_MT6752 is not set +# CONFIG_ARCH_MT6795 is not set +CONFIG_ARCH_MT8127=y +# CONFIG_ARCH_SHMOBILE is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C24XX is not set +# CONFIG_ARCH_S3C64XX is not set +# CONFIG_ARCH_S5P64X0 is not set +# CONFIG_ARCH_S5PC100 is not set +# CONFIG_ARCH_S5PV210 is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_U300 is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP1 is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_KEYBOARD_GPIO_POLLED is not set +CONFIG_MAX_DRAM_SIZE_SUPPORT=0x80000000 + +# +# MT8127 Board Support Package +# +# CONFIG_MT8127_FPGA is not set +CONFIG_MT8127_EVB_BOARD=y + +# +# MTK Board Support Package +# +# CONFIG_PLAT_SPEAR is not set + +# +# Processor Type +# +CONFIG_CPU_V7=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_LPAE is not set +# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set +CONFIG_ARM_THUMB=y +CONFIG_ARM_THUMBEE=y +CONFIG_ARM_VIRT_EXT=y +CONFIG_SWP_EMULATE=y +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_BPREDICT_DISABLE is not set +CONFIG_KUSER_HELPERS=y +# CONFIG_CACHE_L2X0 is not set +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_DMA_MEM_BUFFERABLE=y +CONFIG_ARM_NR_BANKS=8 +# CONFIG_MTK_KERNEL_IN_SECURE_MODE is not set +# CONFIG_L1C_OPT is not set +# CONFIG_ARM_ERRATA_430973 is not set +# CONFIG_ARM_ERRATA_458693 is not set +# CONFIG_ARM_ERRATA_460075 is not set +# CONFIG_ARM_ERRATA_742230 is not set +# CONFIG_ARM_ERRATA_742231 is not set +# CONFIG_ARM_ERRATA_643719 is not set +# CONFIG_ARM_ERRATA_720789 is not set +# CONFIG_ARM_ERRATA_743622 is not set +# CONFIG_ARM_ERRATA_751472 is not set +# CONFIG_ARM_ERRATA_754322 is not set +# CONFIG_ARM_ERRATA_754327 is not set +# CONFIG_ARM_ERRATA_764369 is not set +# CONFIG_ARM_ERRATA_775420 is not set +# CONFIG_ARM_ERRATA_798181 is not set +# CONFIG_ARM_ERRATA_828419 is not set +# CONFIG_ARM_ERRATA_828420 is not set +# CONFIG_ARM_ERRATA_831171 is not set +# CONFIG_ARM_ERRATA_824069 is not set +# CONFIG_ARM_ERRATA_826319 is not set +CONFIG_FIQ_GLUE=y + +# +# Bus support +# +CONFIG_ARM_AMBA=y +# CONFIG_PCI_SYSCALL is not set +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +CONFIG_HAVE_SMP=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_ARM_CPU_TOPOLOGY=y +# CONFIG_SCHED_MC is not set +# CONFIG_SCHED_SMT is not set +# CONFIG_DISABLE_CPU_SCHED_DOMAIN_BALANCE is not set +# CONFIG_HEVTASK_INTERFACE is not set +# CONFIG_ARCH_SCALE_INVARIANT_CPU_CAPACITY is not set +# CONFIG_HAVE_ARM_ARCH_TIMER is not set +# CONFIG_MCPM is not set +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_NR_CPUS=4 +CONFIG_TOUCH_BOOST=y +CONFIG_HOTPLUG_CPU=y +# CONFIG_ARM_PSCI is not set +CONFIG_LOCAL_TIMERS=y +CONFIG_ARCH_NR_GPIO=0 +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_HZ=100 +CONFIG_SCHED_HRTICK=y +# CONFIG_THUMB2_KERNEL is not set +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_HAVE_ARCH_PFN_VALID=y +CONFIG_HIGHMEM=y +# CONFIG_HIGHPTE is not set +CONFIG_HW_PERF_EVENTS=y +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_HAVE_MEMBLOCK=y +# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_COMPACTION=y +CONFIG_MIGRATION=y +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_BOUNCE=y +CONFIG_KSM=y +CONFIG_KSM_CHECK_PAGE=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_CLEANCACHE is not set +# CONFIG_FRONTSWAP is not set +CONFIG_FORCE_MAX_ZONEORDER=11 +CONFIG_ALIGNMENT_TRAP=y +# CONFIG_UACCESS_WITH_MEMCPY is not set +CONFIG_SECCOMP=y +CONFIG_CC_STACKPROTECTOR=y +# CONFIG_ARM_FLUSH_CONSOLE_ON_RESTART is not set + +# +# Boot options +# +# CONFIG_USE_OF is not set +CONFIG_ATAGS=y +# CONFIG_DEPRECATED_PARAM_STRUCT is not set +CONFIG_ZBOOT_ROM_TEXT=0 +CONFIG_ZBOOT_ROM_BSS=0 +# CONFIG_COMPAT_CPUINFO is not set +CONFIG_CMDLINE="console=tty0 console=ttyMT3,921600n1 root=/dev/ram vmalloc=496M slub_max_order=0 slub_debug=O coherent_pool=3240K" +CONFIG_CMDLINE_FROM_BOOTLOADER=y +# CONFIG_CMDLINE_EXTEND is not set +# CONFIG_CMDLINE_FORCE is not set +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_RESTART_DISABLE_CACHE=y +# CONFIG_AUTO_ZRELADDR is not set + +# +# CPU Power Management +# + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_STAT_DETAILS=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVEPLUS is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_BALANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_HOTPLUG=y +# CONFIG_CPU_FREQ_GOV_BALANCE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_INTERACTIVEPLUS is not set +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_HOTPLUG=y + +# +# ARM CPU frequency scaling drivers +# +# CONFIG_ARM_EXYNOS4210_CPUFREQ is not set +# CONFIG_ARM_EXYNOS4X12_CPUFREQ is not set +# CONFIG_ARM_EXYNOS5250_CPUFREQ is not set +# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set +# CONFIG_CPU_IDLE is not set +# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_NEON=y + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_BINFMT_SCRIPT=y +# CONFIG_HAVE_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_COREDUMP is not set + +# +# Power management options +# +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_HAS_WAKELOCK=y +CONFIG_HAS_EARLYSUSPEND=y +CONFIG_HAS_SBSUSPEND=y +CONFIG_WAKELOCK=y +CONFIG_EARLYSUSPEND=y +CONFIG_FB_EARLYSUSPEND=y +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HIBERNATION=y +CONFIG_PM_STD_PARTITION="" +CONFIG_TOI_CORE=y + +# +# Image Storage (you need at least one allocator) +# +CONFIG_TOI_FILE=y +CONFIG_TOI_SWAP=y + +# +# General Options +# +CONFIG_TOI_CRYPTO=y +CONFIG_TOI_DEFAULT_IMAGE_SIZE_LIMIT=-2 +# CONFIG_TOI_KEEP_IMAGE is not set +CONFIG_TOI_REPLACE_SWSUSP=y +# CONFIG_TOI_IGNORE_LATE_INITCALL is not set +CONFIG_TOI_DEFAULT_WAIT=2 +CONFIG_TOI_DEFAULT_EXTRA_PAGES_ALLOWANCE=2000 +# CONFIG_TOI_CHECKSUM is not set +CONFIG_TOI=y +CONFIG_TOI_ZRAM_SUPPORT=y +CONFIG_TOI_FIXUP=y +CONFIG_TOI_ENHANCE=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=100 +CONFIG_PM_WAKELOCKS_GC=y +# CONFIG_PM_RUNTIME is not set +CONFIG_PM=y +CONFIG_PM_DEBUG=y +CONFIG_PM_ADVANCED_DEBUG=y +CONFIG_PM_TEST_SUSPEND=y +CONFIG_PM_SLEEP_DEBUG=y +# CONFIG_APM_EMULATION is not set +CONFIG_CPU_PM=y +# CONFIG_SUSPEND_TIME is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +# CONFIG_UNIX_DIAG is not set +CONFIG_XFRM=y +CONFIG_XFRM_ALGO=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +CONFIG_XFRM_MIGRATE=y +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=y +CONFIG_NET_KEY=y +# CONFIG_NET_KEY_MIGRATE is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +# CONFIG_IP_FIB_TRIE_STATS is not set +CONFIG_IP_MULTIPLE_TABLES=y +# CONFIG_IP_ROUTE_MULTIPATH is not set +# CONFIG_IP_ROUTE_VERBOSE is not set +CONFIG_IP_ROUTE_CLASSID=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +CONFIG_NET_IPIP=y +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_NET_IP_TUNNEL=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +CONFIG_INET_XFRM_TUNNEL=y +CONFIG_INET_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_INET_UDP_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=y +CONFIG_IPV6_PRIVACY=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_INET6_XFRM_TUNNEL=y +CONFIG_INET6_TUNNEL=y +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=y +CONFIG_IPV6_SIT=y +CONFIG_IPV6_SIT_6RD=y +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=y +# CONFIG_IPV6_GRE is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_IPV6_MROUTE=y +# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set +CONFIG_IPV6_PIMSM_V2=y +CONFIG_MTK_DHCPV6C_WIFI=y +# CONFIG_NETLABEL is not set +CONFIG_ANDROID_PARANOID_NETWORK=y +CONFIG_NET_ACTIVITY_STATS=y +CONFIG_NETWORK_SECMARK=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=y +# CONFIG_NETFILTER_NETLINK_ACCT is not set +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_MARK=y +# CONFIG_NF_CONNTRACK_SECMARK is not set +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +# CONFIG_NF_CONNTRACK_TIMEOUT is not set +# CONFIG_NF_CONNTRACK_TIMESTAMP is not set +# CONFIG_NF_CT_PROTO_DCCP is not set +CONFIG_NF_CT_PROTO_GRE=y +# CONFIG_NF_CT_PROTO_SCTP is not set +CONFIG_NF_CT_PROTO_UDPLITE=y +# CONFIG_NF_CONNTRACK_AMANDA is not set +CONFIG_NF_CONNTRACK_FTP=y +# CONFIG_NF_CONNTRACK_H323 is not set +# CONFIG_NF_CONNTRACK_IRC is not set +# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set +# CONFIG_NF_CONNTRACK_SNMP is not set +CONFIG_NF_CONNTRACK_PPTP=y +# CONFIG_NF_CONNTRACK_SANE is not set +CONFIG_NF_CONNTRACK_SIP=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +# CONFIG_NF_CT_NETLINK_TIMEOUT is not set +# CONFIG_NETFILTER_NETLINK_QUEUE_CT is not set +CONFIG_NF_NAT=y +CONFIG_NF_NAT_NEEDED=y +CONFIG_NF_NAT_PROTO_UDPLITE=y +# CONFIG_NF_NAT_AMANDA is not set +CONFIG_NF_NAT_FTP=y +# CONFIG_NF_NAT_IRC is not set +CONFIG_NF_NAT_SIP=y +CONFIG_NF_NAT_TFTP=y +CONFIG_NETFILTER_TPROXY=y +CONFIG_NETFILTER_XTABLES=y + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=y +CONFIG_NETFILTER_XT_CONNMARK=y + +# +# Xtables targets +# +# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set +# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_CT is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +CONFIG_NETFILTER_XT_TARGET_HL=y +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +# CONFIG_NETFILTER_XT_TARGET_LED is not set +# CONFIG_NETFILTER_XT_TARGET_LOG is not set +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NETMAP=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +CONFIG_NETFILTER_XT_TARGET_REDIRECT=y +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set + +# +# Xtables matches +# +# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_BPF is not set +# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y +# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set +# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HELPER is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +CONFIG_NETFILTER_XT_MATCH_REALM=y +CONFIG_NETFILTER_XT_MATCH_RECENT=y +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +# CONFIG_IP_SET is not set +# CONFIG_IP_VS is not set + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_NF_CONNTRACK_PROC_COMPAT=y +CONFIG_IP_NF_IPTABLES=y +# CONFIG_IP_NF_MATCH_AH is not set +# CONFIG_IP_NF_MATCH_ECN is not set +# CONFIG_IP_NF_MATCH_RPFILTER is not set +# CONFIG_IP_NF_MATCH_TTL is not set +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +# CONFIG_IP_NF_TARGET_REJECT_SKERR is not set +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_NF_NAT_IPV4=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_NF_NAT_PROTO_GRE=y +CONFIG_NF_NAT_PPTP=y +# CONFIG_NF_NAT_H323 is not set +CONFIG_IP_NF_MANGLE=y +# CONFIG_IP_NF_TARGET_CLUSTERIP is not set +# CONFIG_IP_NF_TARGET_ECN is not set +# CONFIG_IP_NF_TARGET_TTL is not set +CONFIG_IP_NF_RAW=y +# CONFIG_IP_NF_SECURITY is not set +CONFIG_IP_NF_ARPTABLES=y +# CONFIG_IP_NF_ARPFILTER is not set +# CONFIG_IP_NF_ARP_MANGLE is not set + +# +# IPv6: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV6=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +# CONFIG_IP6_NF_MATCH_AH is not set +# CONFIG_IP6_NF_MATCH_EUI64 is not set +CONFIG_IP6_NF_MATCH_FRAG=y +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_HL is not set +CONFIG_IP6_NF_MATCH_IPV6HEADER=y +# CONFIG_IP6_NF_MATCH_MH is not set +# CONFIG_IP6_NF_MATCH_RPFILTER is not set +# CONFIG_IP6_NF_MATCH_RT is not set +CONFIG_IP6_NF_TARGET_HL=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_TARGET_REJECT_SKERR=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +# CONFIG_IP6_NF_SECURITY is not set +# CONFIG_NF_NAT_IPV6 is not set +# CONFIG_BRIDGE_NF_EBTABLES is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +CONFIG_STP=y +CONFIG_BRIDGE=y +CONFIG_BRIDGE_IGMP_SNOOPING=y +# CONFIG_BRIDGE_VLAN_FILTERING is not set +CONFIG_HAVE_NET_DSA=y +CONFIG_VLAN_8021Q=y +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_VLAN_8021Q_MVRP is not set +# CONFIG_DECNET is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +# CONFIG_NET_SCH_CBQ is not set +CONFIG_NET_SCH_HTB=y +# CONFIG_NET_SCH_HFSC is not set +# CONFIG_NET_SCH_PRIO is not set +# CONFIG_NET_SCH_MULTIQ is not set +# CONFIG_NET_SCH_RED is not set +# CONFIG_NET_SCH_SFB is not set +# CONFIG_NET_SCH_SFQ is not set +# CONFIG_NET_SCH_TEQL is not set +# CONFIG_NET_SCH_TBF is not set +# CONFIG_NET_SCH_GRED is not set +# CONFIG_NET_SCH_DSMARK is not set +# CONFIG_NET_SCH_NETEM is not set +# CONFIG_NET_SCH_DRR is not set +# CONFIG_NET_SCH_MQPRIO is not set +# CONFIG_NET_SCH_CHOKE is not set +# CONFIG_NET_SCH_QFQ is not set +# CONFIG_NET_SCH_CODEL is not set +# CONFIG_NET_SCH_FQ_CODEL is not set +CONFIG_NET_SCH_INGRESS=y +# CONFIG_NET_SCH_PLUG is not set + +# +# Classification +# +CONFIG_NET_CLS=y +# CONFIG_NET_CLS_BASIC is not set +# CONFIG_NET_CLS_TCINDEX is not set +# CONFIG_NET_CLS_ROUTE4 is not set +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +# CONFIG_NET_CLS_RSVP is not set +# CONFIG_NET_CLS_RSVP6 is not set +CONFIG_NET_CLS_FLOW=y +# CONFIG_NET_CLS_CGROUP is not set +# CONFIG_NET_EMATCH is not set +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=y +# CONFIG_NET_ACT_GACT is not set +CONFIG_NET_ACT_MIRRED=y +CONFIG_NET_ACT_IPT=y +# CONFIG_NET_ACT_NAT is not set +# CONFIG_NET_ACT_PEDIT is not set +# CONFIG_NET_ACT_SIMP is not set +# CONFIG_NET_ACT_SKBEDIT is not set +# CONFIG_NET_ACT_CSUM is not set +CONFIG_NET_CLS_IND=y +CONFIG_NET_SCH_FIFO=y +# CONFIG_DCB is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_MMAP is not set +# CONFIG_NETLINK_DIAG is not set +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +# CONFIG_NETPRIO_CGROUP is not set +CONFIG_BQL=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_EXT=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_WEXT_PRIV=y +CONFIG_CFG80211=y +CONFIG_NL80211_TESTMODE=y +CONFIG_CFG80211_DEVELOPER_WARNINGS=y +# CONFIG_CFG80211_REG_DEBUG is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_DEBUGFS is not set +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_CFG80211_WEXT=y +# CONFIG_LIB80211 is not set +# CONFIG_CFG80211_ALLOW_RECONNECT is not set +# CONFIG_MAC80211 is not set +# CONFIG_WIMAX is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +CONFIG_HAVE_BPF_JIT=y +# CONFIG_MTK_NET_LOGGING is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_DEVTMPFS is not set +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +CONFIG_FW_LOADER_USER_HELPER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_GENERIC_CPU_DEVICES is not set +# CONFIG_HAVE_CPU_AUTOPROBE is not set +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_CMA is not set + +# +# Bus devices +# +# CONFIG_ARM_CCI is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_CMDLINE_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# 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_SM_FTL is not set +# CONFIG_MTD_OOPS is not set +# CONFIG_MTD_SWAP 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 is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS 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_DOCG3 is not set +CONFIG_MTD_NAND_IDS=y +CONFIG_MTD_NAND_ECC=y +# CONFIG_MTD_NAND_ECC_SMC is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_ECC_BCH is not set +# CONFIG_MTD_SM_COMMON is not set +# CONFIG_MTD_NAND_DENALI is not set +# CONFIG_MTD_NAND_GPIO is not set +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_DOCG4 is not set +# CONFIG_MTD_NAND_NANDSIM is not set +CONFIG_MTD_NAND_PLATFORM=y +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# LPDDR flash memory drivers +# +# CONFIG_MTD_LPDDR is not set +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_MG_DISK is not set +# CONFIG_BLK_DEV_RBD is not set + +# +# Misc devices +# +CONFIG_ANDROID_PMEM=y +# CONFIG_SENSORS_LIS3LV02D is not set +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ATMEL_SSC is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1780 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_TI_DAC7512 is not set +CONFIG_UID_STAT=y +# CONFIG_BMP085_I2C is not set +# CONFIG_BMP085_SPI is not set +# CONFIG_USB_SWITCH_FSA9480 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_93XX46 is not set + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set + +# +# Altera FPGA firmware download module +# +# CONFIG_ALTERA_STAPL is not set +CONFIG_MEDIATEK_SOLUTION=y +CONFIG_MTK_PLATFORM="mt8127" +CONFIG_ARCH_MTK_PROJECT="ford" +CONFIG_MTK_INTERNAL=y +CONFIG_MTK_CIRQ=y +# CONFIG_MTK_SYSTRACKER is not set +# CONFIG_MTK_L2C_SHARE is not set +CONFIG_HAVE_AEE_FEATURE=n +CONFIG_HAVE_XLOG_FEATURE=y +# CONFIG_FPGA_EARLY_PORTING is not set +CONFIG_MTK_EMMC_SUPPORT=y +CONFIG_MTK_NEW_COMBO_EMMC_SUPPORT=y +# CONFIG_MTK_GPT_SCHEME_SUPPORT is not set +CONFIG_MTK_SHARED_SDCARD=y +CONFIG_MTK_MULTI_STORAGE_SUPPORT=y +CONFIG_MTK_MULTI_PARTITION_MOUNT_ONLY_SUPPORT=y +CONFIG_MTK_SECURITY_SW_SUPPORT=y +CONFIG_HAVE_MTK_IN_HOUSE_TEE_SUPPORT=y +CONFIG_MTK_IN_HOUSE_TEE_SUPPORT=y +CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT=y +CONFIG_MTK_DRM_KEY_MNG_SUPPORT=y +# CONFIG_HAVE_TRUSTONIC_TEE_SUPPORT is not set +# CONFIG_MTK_THERMAL_STATUS_COLLECTION is not set +# CONFIG_MD32_SUPPORT is not set +# CONFIG_MTK_MEMCFG is not set +# CONFIG_MTK_DT_SUPPORT is not set +# CONFIG_EVDO_DT_SUPPORT is not set +# CONFIG_EVDO_DT_VIA_SUPPORT is not set +# CONFIG_MTK_SMARTBOOK_SUPPORT is not set +CONFIG_MTK_SENSOR_SUPPORT=y +CONFIG_MTK_AUTO_DETECT_ACCELEROMETER=y +# CONFIG_MTK_AUTO_DETECT_MAGNETOMETER is not set +# CONFIG_MTK_AUTO_DETECT_ALSPS is not set +CONFIG_CUSTOM_KERNEL_ACCELEROMETER=y +# CONFIG_CUSTOM_KERNEL_GYROSCOPE is not set +# CONFIG_CUSTOM_KERNEL_ALSPS is not set +# CONFIG_CUSTOM_SEC_AUTH_SUPPORT is not set +# CONFIG_CUSTOM_KERNEL_MAGNETOMETER is not set +# CONFIG_CUSTOM_KERNEL_BAROMETER is not set +# CONFIG_MTK_SENSOR_HUB_SUPPORT is not set +CONFIG_CUSTOM_KERNEL_SENSORHUB="" +CONFIG_CUSTOM_KERNEL_STEP_COUNTER="" +CONFIG_CUSTOM_KERNEL_SIGNIFICANT_MOTION_SENSOR="" +CONFIG_CUSTOM_KERNEL_ACTIVITY_SENSOR="" +CONFIG_CUSTOM_KERNEL_PICK_UP_SENSOR="" +CONFIG_CUSTOM_KERNEL_SHAKE_SENSOR="" +CONFIG_CUSTOM_KERNEL_FACE_DOWN_SENSOR="" +CONFIG_CUSTOM_KERNEL_IN_POCKET_SENSOR="" +CONFIG_CUSTOM_KERNEL_PEDOMETER="" +CONFIG_CUSTOM_KERNEL_HEART_RATE_SENSOR="" +CONFIG_CUSTOM_KERNEL_TILT_DETECTOR_SENSOR="" +CONFIG_CUSTOM_KERNEL_WAKE_GESTURE_SENSOR="" +CONFIG_CUSTOM_KERNEL_GLANCE_GESTURE_SENSOR="" +CONFIG_CUSTOM_KERNEL_IMGSENSOR="gc2355_mipi_raw gc2355_mipi_raw_qunhui gc0312_yuv hi704_yuv" +CONFIG_CUSTOM_KERNEL_LCM="hx8282_a01_lvds_dpi_vdo hx8282_a01_lvds_dpi_vdo_txd hx8282_a01_lvds_dpi_vdo_tpv3 hx8282_a01_lvds_dpi_vdo_kd" +CONFIG_CUSTOM_KERNEL_FLASHLIGHT="constant_flashlight" +CONFIG_CUSTOM_KERNEL_EXTMD="" +CONFIG_CUSTOM_KERNEL_SSW="ssw_single" +# CONFIG_MTK_FORCE_CLUSTER1 is not set +# CONFIG_MTK_MMPROFILE_SUPPORT is not set +CONFIG_MTK_HIBERNATION=y +# CONFIG_CUSTOM_KERNEL_CHARGEPUMP is not set +# CONFIG_MTK_TC1_FEATURE is not set + +# +# Kernel Configurations +# + +# +# MTK Cluster MultiProcessor Scheduler +# + +# +# Tracer Related +# +# CONFIG_MTK_SCHED_TRACERS is not set +# CONFIG_MTK_KERNEL_MARKER is not set +CONFIG_FUNCTION_DURATION_TRACER=y +# CONFIG_MT65XX_TRACER is not set +CONFIG_GENERIC_TRACER=y + +# +# MTPROF tools +# +CONFIG_MTK_MUTATION=y +CONFIG_MTPROF_CPUTIME=y +# CONFIG_MTPROF_IRQ_DURATION is not set +CONFIG_MTK_AEE_FEATURE=y +CONFIG_MTK_AEE_AED=n +CONFIG_MTK_AEE_IPANIC=n +# CONFIG_MTK_AEE_POWERKEY_HANG_DETECT is not set +# CONFIG_MTK_AEE_MRDUMP is not set +# CONFIG_ANDROID_VMEM is not set +# CONFIG_CPUTIME_SUPPORT is not set +# CONFIG_CPUTIME_STATS is not set +CONFIG_MTK_RAM_CONSOLE=y +# CONFIG_MTK_RAM_CONSOLE_USING_SRAM is not set +CONFIG_MTK_RAM_CONSOLE_USING_DRAM=y +CONFIG_MTK_RAM_CONSOLE_SIZE=0x1C00 +CONFIG_MTK_RAM_CONSOLE_ADDR=0xF900DC00 +CONFIG_MTK_RAM_CONSOLE_DRAM_SIZE=0x100000 +CONFIG_MTK_RAM_CONSOLE_DRAM_ADDR=0x83F00000 +# CONFIG_PREEMPT_MONITOR is not set +# CONFIG_ISR_MONITOR is not set +# CONFIG_MT_SCHED_MONITOR is not set +# CONFIG_MT_CHRDEV_REG is not set +# CONFIG_MT_LOCK_DEBUG is not set +CONFIG_PRINTK_PROCESS_INFO=y +CONFIG_MT_PRINTK_UART_CONSOLE=y +# CONFIG_MT_ENG_BUILD is not set +CONFIG_RAMDISK_OFFSET=0xF00000 +CONFIG_EARLY_LINUX_PORTING=y +# CONFIG_MTK_MCI is not set +# CONFIG_MTK_ETM is not set + +# +# MT load balance and schedule enhancement +# +CONFIG_MT_SCHED=y +# CONFIG_MT_LOAD_BALANCE_ENHANCEMENT is not set +# CONFIG_MT_LOAD_BALANCE_PROFILER is not set +# CONFIG_MT_SCHED_NOTICE is not set +# CONFIG_MT_SCHED_DEBUG_ONLY is not set +# CONFIG_MT_PRIO_TRACER is not set +# CONFIG_MTK_WQ_DEBUG is not set +# CONFIG_MTK_SCHED_RQAVG_US is not set +# CONFIG_MTK_SCHED_RQAVG_KS is not set +# CONFIG_MTK_STORAGE_PID_LOGGER is not set + +# +# MTK Large Memory mode support +# +# CONFIG_MTK_LM_MODE is not set +CONFIG_MTK_TABLET_HARDWARE=y +CONFIG_GATOR_DRIVER=y +# CONFIG_MTK_IPV6_TETHER_NDP_MODE is not set +# CONFIG_MTK_EMMC_SUPPORT_OTP is not set +CONFIG_MTK_TETHERINGIPV6_SUPPORT=y + +# +# Drivers Configurations +# +CONFIG_MTK_ACCDET=y +# CONFIG_MTK_CCCI_DEVICES is not set +# CONFIG_MTK_MD_LOW_BAT_SUPPORT is not set +CONFIG_MTK_MD_SBP_CUSTOM_VALUE="" +CONFIG_MTK_MD2_SBP_CUSTOM_VALUE="" +# CONFIG_MTK_UMTS_TDD128_MODE is not set +# CONFIG_MTK_EMCI_DEVICES is not set +CONFIG_MTK_EXTERNAL_MODEM_SLOT="" +# CONFIG_MTK_SWITCH_TX_POWER is not set +# CONFIG_MTK_LTE_SUPPORT is not set +CONFIG_MTK_FB=y +CONFIG_MTK_FB_SUPPORT_ASSERTION_LAYER=y +CONFIG_MTK_DITHERING_SUPPORT=y +CONFIG_MTK_LCM_PHYSICAL_ROTATION="270" +CONFIG_LCM_HEIGHT="600" +CONFIG_LCM_WIDTH="1024" +CONFIG_MTK_OVERLAY_ENGINE_SUPPORT=y +# CONFIG_MTK_TVOUT_SUPPORT is not set +# CONFIG_MIXMODE_FOR_INCELL is not set +# CONFIG_LCM_SEND_CMD_IN_VIDEO is not set +CONFIG_GPS=y +CONFIG_MTK_GPS=y +# CONFIG_MTK_NFC is not set +CONFIG_MTK_BTIF=y +CONFIG_MTK_COMBO=y +# CONFIG_MTK_COMBO_CHIP_MT6620 is not set +# CONFIG_MTK_COMBO_CHIP_MT6628 is not set +# CONFIG_MTK_COMBO_CHIP_MT6630 is not set +# CONFIG_MTK_COMBO_CHIP_CONSYS_6572 is not set +# CONFIG_MTK_COMBO_CHIP_CONSYS_6582 is not set +CONFIG_MTK_COMBO_CHIP_CONSYS_8127=y +# CONFIG_MTK_COMBO_CHIP_CONSYS_6752 is not set +# CONFIG_MTK_COMBO_CHIP_CONSYS_6592 is not set +CONFIG_MTK_COMBO_CHIP="CONSYS_8127" +CONFIG_MTK_WLAN_CHIP="CONSYS_8127" +CONFIG_MTK_WLAN_SUPPORT=y +CONFIG_MTK_WAPI_SUPPORT=y +# CONFIG_MTK_PASSPOINT_R2_SUPPORT is not set +CONFIG_MTK_WIFI_MCC_SUPPORT=y +CONFIG_MTK_COMBO_PLAT_PATH="" +# CONFIG_MTK_COMBO_COMM is not set +CONFIG_MTK_COMBO_BT=y +# CONFIG_MTK_COMBO_ANT is not set +CONFIG_MTK_COMBO_GPS=y +CONFIG_MTK_GPS_SUPPORT=y +CONFIG_MTK_COMBO_WIFI=y +CONFIG_MTK_BT_SUPPORT=y +CONFIG_MTK_WFD_SUPPORT=y +CONFIG_MTK_FM=y +CONFIG_MTK_FM_SUPPORT=y +CONFIG_MTK_FM_CHIP="MT6627_FM" +# CONFIG_MTK_FM_50KHZ_SUPPORT is not set +# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set +# CONFIG_SDIOAUTOK_SUPPORT is not set +CONFIG_MTK_MT6306_SUPPORT=y +CONFIG_MTK_IDLE_TIME_FIX=y +CONFIG_MTK_G2D=y +CONFIG_MTK_MPEG4_DEC_DRIVER=y +CONFIG_MTK_MPEG4_ENC_DRIVER=y +CONFIG_MTK_H264_DEC_DRIVER=y +CONFIG_MTK_MFLEXVIDEO_DRIVER=y +CONFIG_MTK_VIDEOCODEC_DRIVER=y +# CONFIG_MTK_MJC_DRIVER is not set +CONFIG_MTK_I2C=y +# CONFIG_MTK_SPI is not set +CONFIG_MTK_JPEG=y +CONFIG_MTK_KEYPAD=y +CONFIG_KEYBOARD_HID=y +CONFIG_MTK_LEDS=y +CONFIG_MTK_MMC=y +# CONFIG_MTK_SDIOAUTOK_SUPPORT is not set + +# +# MediaTek OFN / Jogball Related Drivers +# +# CONFIG_MOUSE_PANASONIC_EVQWJN is not set +# CONFIG_MOUSE_AVAGOTECH_A320 is not set +# CONFIG_MTK_MTD_NAND is not set +CONFIG_MTK_SMART_BATTERY=y +CONFIG_MTK_PMIC=y +CONFIG_MTK_PMIC_WRAP=y +# CONFIG_MTK_PMIC_MT6397 is not set +# CONFIG_POWER_EXT is not set +# CONFIG_MTK_POWER_EXT_DETECT is not set +# CONFIG_MTK_PUMP_EXPRESS_SUPPORT is not set +# CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT is not set +# CONFIG_MTK_VOW_SUPPORT is not set +# CONFIG_MTK_EXTERNAL_LDO is not set +# CONFIG_X2_BQ27531_SUPPORT is not set +# CONFIG_MTK_BQ24250_SUPPORT is not set +# CONFIG_MTK_BQ24261_SUPPORT is not set +# CONFIG_MTK_BQ24196_SUPPORT is not set +# CONFIG_MTK_FAN5405_SUPPORT is not set +# CONFIG_MTK_FAN5402_SUPPORT is not set +# CONFIG_MTK_BQ24158_SUPPORT is not set +CONFIG_MTK_BQ24296_SUPPORT=y +# CONFIG_MTK_BQ27541_SUPPORT is not set +# CONFIG_MTK_NCP1851_SUPPORT is not set +# CONFIG_MTK_NCP1854_SUPPORT is not set +# CONFIG_MTK_RT9536_SUPPORT is not set +# CONFIG_MTK_MAX8971_SUPPORT is not set +# CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT is not set +# CONFIG_MTK_WIRELESS_CHARGER_SUPPORT is not set +CONFIG_MTK_JEITA_STANDARD_SUPPORT=y +CONFIG_MTK_AUTO_POWER_ON_WITH_CHARGER=y +CONFIG_MTK_RTC=y +CONFIG_MTK_SERIAL=y +CONFIG_MTK_SERIAL_CONSOLE=y +# CONFIG_MTK_SERIAL_MODEM_TEST is not set +CONFIG_MTK_UART_USB_SWITCH=y +CONFIG_MTK_SIM2=y +CONFIG_MTK_SOUND=y +# CONFIG_MTK_AUDIO_EXTCODEC_SUPPORT is not set +# CONFIG_MTK_CM36283 is not set +# CONFIG_MTK_GP2AP002S00F is not set +# CONFIG_MTK_APM_16D is not set +# CONFIG_MTK_EPL2182 is not set +# CONFIG_MTK_EPL2182_NEW is not set +# CONFIG_MTK_STK3X1X is not set +# CONFIG_MTK_CM36652_NEW is not set +# CONFIG_MTK_APDS9930 is not set +# CONFIG_MTK_CM3232_NEW is not set +# CONFIG_MTK_APDS9930_NEW is not set +# CONFIG_MTK_RPR410 is not set +CONFIG_MTK_KXTJ2_1009=y +CONFIG_MTK_MC3410=y +# CONFIG_MTK_KXTIK1004 is not set +# CONFIG_MTK_K2DH is not set +# CONFIG_MTK_BMA222E is not set +# CONFIG_MTK_BMA222E_NEW is not set +# CONFIG_MTK_MPU6050G is not set +# CONFIG_MTK_MPU6050G_NEW is not set +# CONFIG_MTK_BMA250 is not set +CONFIG_MTK_BMA253=y +# CONFIG_MTK_MPU6515A is not set +# CONFIG_MTK_KXTJ2_1009_NEW is not set +# CONFIG_MTK_BMA250E is not set +# CONFIG_MTK_BMA056 is not set +# CONFIG_MTK_MPU3050C is not set +# CONFIG_MTK_MPU3000 is not set +# CONFIG_MTK_MPU3000_NEW is not set +# CONFIG_MTK_MPU6050GY is not set +# CONFIG_MTK_MPU6050GY_NEW is not set +# CONFIG_MTK_MPU6515G is not set +# CONFIG_MTK_MPU3050C_NEW is not set +# CONFIG_MTK_AKM8963 is not set +# CONFIG_MTK_AKM09911 is not set +# CONFIG_MTK_AKM8963_NEW is not set +# CONFIG_MTK_HSCDTD006 is not set +# CONFIG_MTK_BMM050 is not set +# CONFIG_MTK_BMM050_NEW is not set +# CONFIG_MTK_MMC3416X is not set +# CONFIG_MTK_BMA050 is not set +# CONFIG_MTK_BMA050_NEW is not set +# CONFIG_MTK_BMM056_NEW is not set +# CONFIG_MTK_S2200 is not set +# CONFIG_MTK_YAS532 is not set +# CONFIG_MTK_BMP180_NEW is not set +CONFIG_MTK_TOUCHPANEL=y +# CONFIG_MTK_S7020 is not set +CONFIG_MTK_USB_GADGET=y +# CONFIG_USB_MU3D_PIO_ONLY is not set +# CONFIG_USB_MU3D_DRV is not set +# CONFIG_USB_MU3D_DVT is not set +# CONFIG_MU3_PHY is not set +# CONFIG_MTK_XHCI is not set +# CONFIG_MTK_OTG_PMIC_BOOST_5V is not set +# CONFIG_MTK_TEST_XHCI is not set +# CONFIG_USBIF_COMPLIANCE is not set +# CONFIG_MTK_S3320 is not set +# CONFIG_MTK_S3320_47 is not set +# CONFIG_LEDS_LM3632 is not set +# CONFIG_LEDS_LM3639 is not set +# CONFIG_LEDS_RT8542 is not set +# CONFIG_MTK_VIBRATOR is not set +# CONFIG_MTK_WD_KICKER is not set +# CONFIG_MT592X_SDIO_CLNT is not set +CONFIG_USB_MTK_ACM_TEMP=y +CONFIG_USB_MTK_HDRC=y +CONFIG_USB_MTK_HDRC_GADGET=y +CONFIG_USB_MTK_OTG=y +# CONFIG_USB_MTK_DUALMODE is not set +# CONFIG_USB_MTK_DEBUG_FS is not set +# CONFIG_USB_MTK_DEBUG is not set +CONFIG_USB_MTK_HDRC_HCD=y +# CONFIG_MTK_USB_UNIQUE_SERIAL is not set +# CONFIG_MTK_USBFSH is not set +# CONFIG_MUSBFSH_PIO_ONLY is not set +CONFIG_AMPC_CDEV_NUM=151 +CONFIG_ION_MTK=y +# CONFIG_MMPROFILE is not set +CONFIG_MTK_STAGING=y +# CONFIG_MTKPASR is not set +# CONFIG_PWR_LOSS_MTK_TEST is not set +# CONFIG_MTK_EMMC_CACHE is not set +CONFIG_MTK_GPU_SUPPORT=y +# CONFIG_MTK_ICUSB_SUPPORT is not set +# CONFIG_MTK_DT_USB_SUPPORT is not set +# CONFIG_MTK_SWCHR_SUPPORT is not set +# CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION is not set +CONFIG_MTK_KERNEL_POWER_OFF_CHARGING=y +# CONFIG_MTK_BQ24160_SUPPORT is not set +# CONFIG_MTK_MT8193_SUPPORT is not set +# CONFIG_MTK_MT8193_HDCP_SUPPORT is not set +CONFIG_CUSTOM_KERNEL_HDMI="" +# CONFIG_MTK_HDMI_SUPPORT is not set +# CONFIG_SINGLE_PANEL_OUTPUT is not set +# CONFIG_MTK_INTERNAL_MHL_SUPPORT is not set +# CONFIG_MTK_THERMAL_PA_VIA_ATCMD is not set +CONFIG_MTK_SIM1_SOCKET_TYPE="1" +CONFIG_MTK_SIM2_SOCKET_TYPE="1" +# CONFIG_MTK_SEC_MODEM_NVRAM_ANTI_CLONE is not set +# CONFIG_MTK_MT6333_SUPPORT is not set +# CONFIG_MTK_CTP_RESET_CONFIG is not set +CONFIG_MTK_BICR_SUPPORT=y +# CONFIG_MTK_VIDEO_HEVC_SUPPORT is not set +CONFIG_MTK_AAL_SUPPORT=y +# CONFIG_MTK_MULTIBRIDGE_SUPPORT is not set +# CONFIG_NAND_OTP_SUPPORT is not set +# CONFIG_MTK_OD_SUPPORT is not set +CONFIG_MTK_LENS_DUMMYLENS_SUPPORT=y +# CONFIG_MTK_LENS_AD5820AF_SUPPORT is not set +# CONFIG_MTK_LENS_AD5823_SUPPORT is not set +# CONFIG_MTK_LENS_AD5823AF_SUPPORT is not set +# CONFIG_MTK_LENS_AK7345AF_SUPPORT is not set +# CONFIG_MTK_LENS_BU6424AF_SUPPORT is not set +# CONFIG_MTK_LENS_BU6429AF_SUPPORT is not set +# CONFIG_MTK_LENS_BU64745GWZAF_SUPPORT is not set +# CONFIG_MTK_LENS_DW9718AF_SUPPORT is not set +# CONFIG_MTK_LENS_DW9714AF_SUPPORT is not set +# CONFIG_MTK_LENS_DW9714A_SUPPORT is not set +# CONFIG_MTK_LENS_LC898122AF_SUPPORT is not set +# CONFIG_MTK_LENS_LC898212AF_SUPPORT is not set +# CONFIG_MTK_LENS_FM50AF_SUPPORT is not set +# CONFIG_MTK_LENS_MT9P017AF_SUPPORT is not set +# CONFIG_MTK_LENS_OV8825AF_SUPPORT is not set +# CONFIG_MTK_LENS_SENSORDRIVE_SUPPORT is not set +# CONFIG_MTK_LENS_GAF001AF_SUPPORT is not set +# CONFIG_MTK_LENS_GAF002AF_SUPPORT is not set +# CONFIG_MTK_LENS_GAF008AF_SUPPORT is not set +# CONFIG_MTK_CAM_CAL_GT24C32A_SUPPORT is not set +# CONFIG_MTK_CAM_CAL_BRCC064GWZ_3_SUPPORT is not set +# CONFIG_MTK_CPU_STRESS is not set +# CONFIG_MTK_LASTPC is not set +CONFIG_MTK_FMRADIO=y +CONFIG_MTK_HWMON=y +# CONFIG_MTK_CMDQ is not set +# CONFIG_MTK_VIDEOX is not set +CONFIG_MTK_MT_LOGGER=y +CONFIG_MTK_CONN_MD=y +CONFIG_MTK_LENS=y +CONFIG_MTK_IMGSENSOR=y +CONFIG_MTK_FLASHLIGHT=y +CONFIG_MTK_SYSENV=y +CONFIG_MTK_SMI=y +CONFIG_MTK_BTCVSD=y +CONFIG_MTK_SOUND_DRV=y +CONFIG_MTK_POWER_GS=y +CONFIG_MTK_VIDEO=y +CONFIG_MTK_MRDUMP=y +# CONFIG_MTK_WMT_CCCI is not set +# CONFIG_MTK_VCOREFS is not set +CONFIG_MTK_EMI_MPU=y +CONFIG_MTK_EMI_BWL=y +# CONFIG_MTK_DBG_DUMP is not set + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +CONFIG_SCSI_TGT=y +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_DH is not set +# CONFIG_SCSI_OSD_INITIATOR is not set +# CONFIG_ATA is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +# CONFIG_BCACHE is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +CONFIG_DM_CRYPT=y +# CONFIG_DM_SNAPSHOT is not set +# CONFIG_DM_THIN_PROVISIONING is not set +# CONFIG_DM_CACHE is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_RAID is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +CONFIG_DM_UEVENT=y +# CONFIG_DM_FLAKEY is not set +# CONFIG_DM_VERITY is not set +# CONFIG_TARGET_CORE is not set +CONFIG_NETDEVICES=y +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +# CONFIG_EQUALIZER is not set +CONFIG_MII=y +CONFIG_IFB=y +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +CONFIG_TUN=y +# CONFIG_VETH is not set + +# +# CAIF transport drivers +# + +# +# Distributed Switch Architecture drivers +# +# CONFIG_NET_DSA_MV88E6XXX is not set +# CONFIG_NET_DSA_MV88E6060 is not set +# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set +# CONFIG_NET_DSA_MV88E6131 is not set +# CONFIG_NET_DSA_MV88E6123_61_65 is not set +# CONFIG_ETHERNET is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_AT803X_PHY is not set +# CONFIG_AMD_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MICREL_KS8995MA is not set +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +# CONFIG_SLIP is not set +CONFIG_SLHC=y + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +CONFIG_USB_USBNET=y +CONFIG_USB_NET_AX8817X=y +CONFIG_USB_NET_AX88179_178A=y +CONFIG_USB_NET_CDCETHER=y +# CONFIG_USB_NET_CDC_EEM is not set +CONFIG_USB_NET_CDC_NCM=y +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +CONFIG_USB_NET_NET1080=y +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=y +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +CONFIG_USB_NET_ZAURUS=y +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +CONFIG_WLAN=y +# CONFIG_USB_ZD1201 is not set +# CONFIG_USB_NET_RNDIS_WLAN is not set +# CONFIG_WIFI_CONTROL_FUNC is not set +# CONFIG_ATH_CARDS is not set +# CONFIG_BRCMFMAC is not set +# CONFIG_HOSTAP is not set +# CONFIG_LIBERTAS is not set +# CONFIG_WL_TI is not set +# CONFIG_MWIFIEX is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# +# CONFIG_WAN is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set +# CONFIG_INPUT_KEYRESET is not set +# CONFIG_INPUT_KEYCOMBO is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MCS is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +# CONFIG_MOUSE_SYNAPTICS_USB is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_WARRIOR=y +CONFIG_JOYSTICK_XPAD=y + +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MCS5000 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_MTK is not set +# CONFIG_TOUCHSCREEN_MTK_GT818B_FPGA is not set +# CONFIG_MTK_GT9XX is not set +# CONFIG_MTK_GT911 is not set +# CONFIG_MTK_MMS244 is not set +# CONFIG_GT9XX_HOTKNOT_FLASHLESS is not set +# CONFIG_MTK_FT5406 is not set +# CONFIG_MTK_FT5406_82 is not set +# CONFIG_MTK_FT5206 is not set +# CONFIG_MTK_MMS134 is not set +# CONFIG_MTK_MMS128 is not set +# CONFIG_MTK_MIT200 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_MTK_FTS2A052 is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_SYNAPTICS_S3528 is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_MPU3050 is not set +# CONFIG_INPUT_GP2A is not set +# CONFIG_INPUT_GPIO_TILT_POLLED is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYCHORD is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +CONFIG_INPUT_UINPUT=y +# CONFIG_INPUT_GPIO is not set +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_CMA3000 is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_TTY=y +# CONFIG_VT is not set +CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_TRACE_SINK is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_KGDB_NMI is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_TIMBERDALE is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_IFX6X60 is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_TTY_PRINTK is not set +# CONFIG_HVC_DCC is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_DCC_TTY is not set +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +# CONFIG_I2C_CHARDEV is not set +# CONFIG_I2C_MUX is not set +CONFIG_I2C_HELPER_AUTO=y + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_PXA_PCI is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PL022 is not set +# CONFIG_SPI_PXA2XX_PCI is not set +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_DESIGNWARE is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set + +# +# Qualcomm MSM SSBI bus support +# +# CONFIG_SSBI is not set +# CONFIG_HSI is not set + +# +# PPS support +# +# CONFIG_PPS is not set + +# +# PPS generators support +# + +# +# PTP clock support +# +# CONFIG_PTP_1588_CLOCK is not set + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +# CONFIG_PTP_1588_CLOCK_PCH is not set +CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_GPIO_DEVRES=y +CONFIG_GPIOLIB=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_GPIO_SYSFS is not set + +# +# Memory mapped GPIO drivers: +# +# CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_EM is not set +# CONFIG_GPIO_PL061 is not set +# CONFIG_GPIO_RCAR is not set +# CONFIG_GPIO_TS5500 is not set + +# +# I2C GPIO expanders: +# +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_SX150X is not set +# CONFIG_GPIO_ADP5588 is not set + +# +# PCI GPIO expanders: +# + +# +# SPI GPIO expanders: +# +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MCP23S08 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_74X164 is not set + +# +# AC97 GPIO expanders: +# + +# +# MODULbus GPIO expanders: +# + +# +# USB GPIO expanders: +# +# CONFIG_W1 is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_BATTERY_BQ27x00 is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_POWER_RESET is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_AVS is not set +# CONFIG_HWMON is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_DEFAULT_GOV_BACKWARD_COMPATIBLE is not set +# CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +CONFIG_THERMAL_DEFAULT_GOV_TRIP_STEP_WISE=y +# CONFIG_BACKWARD_COMPATIBLE is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_GOV_STEP_WISE is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_CPU_THERMAL=y +# CONFIG_THERMAL_EMULATION is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +CONFIG_INPUT_TEMPERATURE_TMP103=y +CONFIG_VS_THERMAL=y +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y + +# +# Broadcom specific AMBA +# +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_CROS_EC is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_HTC_EGPIO is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_HTC_I2CPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SMSC is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_MFD_STMPE is not set +# CONFIG_MFD_SYSCON is not set +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_REGULATOR is not set +CONFIG_MEDIA_SUPPORT=y + +# +# Multimedia core support +# +# CONFIG_MEDIA_CAMERA_SUPPORT is not set +# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set +# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set +# CONFIG_MEDIA_RADIO_SUPPORT is not set +CONFIG_MEDIA_RC_SUPPORT=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +# CONFIG_TTPCI_EEPROM is not set + +# +# Media drivers +# +CONFIG_RC_CORE=y +CONFIG_RC_MAP=y +CONFIG_RC_DECODERS=y +CONFIG_LIRC=y +CONFIG_IR_LIRC_CODEC=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_RC5_SZ_DECODER=y +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +# CONFIG_RC_DEVICES is not set +# CONFIG_MEDIA_USB_SUPPORT is not set + +# +# Supported MMC/SDIO adapters +# +# CONFIG_CYPRESS_FIRMWARE is not set + +# +# Media ancillary drivers (tuners, sensors, i2c, frontends) +# + +# +# Customise DVB Frontends +# +# CONFIG_DVB_TUNER_DIB0070 is not set +# CONFIG_DVB_TUNER_DIB0090 is not set + +# +# Tools to develop new frontends +# +# CONFIG_DVB_DUMMY_FE is not set + +# +# Graphics support +# +# CONFIG_DRM is not set +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_SYS_FOPS is not set +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_ARMCLCD is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_GOLDFISH is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_BROADSHEET is not set +# CONFIG_FB_AUO_K190X is not set +# CONFIG_EXYNOS_VIDEO is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_ADF is not set + +# +# Console display driver support +# +CONFIG_FONT_8x16=y +# CONFIG_LOGO is not set +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_HWDEP=y +CONFIG_SND_RAWMIDI=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +# CONFIG_SND_MIXER_OSS is not set +CONFIG_SND_PCM_OSS=y +# CONFIG_SND_PCM_OSS_PLUGINS is not set +CONFIG_SND_HRTIMER=y +# CONFIG_SND_DYNAMIC_MINORS is not set +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_RAWMIDI_SEQ is not set +# CONFIG_SND_OPL3_LIB_SEQ is not set +# CONFIG_SND_OPL4_LIB_SEQ is not set +# CONFIG_SND_SBAWE_SEQ is not set +# CONFIG_SND_EMU10K1_SEQ is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_ALOOP is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +# CONFIG_SND_ARM is not set +# CONFIG_SND_SPI is not set +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=y +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_SOC is not set +# CONFIG_SOUND_PRIME is not set + +# +# HID support +# +CONFIG_HID=y +# CONFIG_HID_BATTERY_STRENGTH is not set +# CONFIG_HIDRAW is not set +CONFIG_UHID=y +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=y +CONFIG_HID_ACRUX=y +CONFIG_HID_APPLE=y +# CONFIG_HID_APPLEIR is not set +# CONFIG_HID_AUREAL is not set +CONFIG_HID_BELKIN=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +# CONFIG_HID_PRODIKEYS is not set +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +# CONFIG_DRAGONRISE_FF is not set +# CONFIG_HID_EMS_FF is not set +# CONFIG_HID_ELECOM is not set +CONFIG_HID_EZKEY=y +# CONFIG_HID_HOLTEK is not set +# CONFIG_HID_KEYTOUCH is not set +CONFIG_HID_KYE=y +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_WALTOP is not set +CONFIG_HID_GYRATION=y +# CONFIG_HID_ICADE is not set +CONFIG_HID_TWINHAN=y +CONFIG_HID_KENSINGTON=y +# CONFIG_HID_LCPOWER is not set +# CONFIG_HID_LENOVO_TPKBD is not set +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +# CONFIG_LOGIG940_FF is not set +# CONFIG_LOGIWHEELS_FF is not set +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +# CONFIG_HID_MULTITOUCH is not set +CONFIG_HID_NTRIG=y +# CONFIG_HID_ORTEK is not set +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_PRIMAX is not set +# CONFIG_HID_PS3REMOTE is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_SAITEK is not set +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +# CONFIG_HID_SPEEDLINK is not set +# CONFIG_HID_STEELSERIES is not set +CONFIG_HID_SUNPLUS=y +CONFIG_HID_GREENASIA=y +# CONFIG_GREENASIA_FF is not set +CONFIG_HID_SMARTJOYPLUS=y +# CONFIG_SMARTJOYPLUS_FF is not set +# CONFIG_HID_TIVO is not set +CONFIG_HID_TOPSEED=y +# CONFIG_HID_THINGM is not set +CONFIG_HID_THRUSTMASTER=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_HID_WACOM is not set +# CONFIG_HID_WIIMOTE is not set +CONFIG_HID_ZEROPLUS=y +# CONFIG_ZEROPLUS_FF is not set +# CONFIG_HID_ZYDACRON is not set +# CONFIG_HID_SENSOR_HUB is not set + +# +# USB HID support +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# I2C HID support +# +# CONFIG_I2C_HID is not set +# CONFIG_USB_ARCH_HAS_OHCI is not set +# CONFIG_USB_ARCH_HAS_EHCI is not set +# CONFIG_USB_ARCH_HAS_XHCI is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_MON is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1760_HCD is not set +# CONFIG_USB_ISP1362_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_RENESAS_USBHS is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=y +CONFIG_USB_PRINTER=y +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +# CONFIG_USB_STORAGE_ENE_UB6250 is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_CHIPIDEA is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set +CONFIG_USB_SERIAL=y +# CONFIG_USB_SERIAL_CONSOLE is not set +# CONFIG_USB_EZUSB is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_CH341 is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_CP210X is not set +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_FUNSOFT is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_F81232 is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_METRO is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MOTOROLA is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_OTI6858 is not set +# CONFIG_USB_SERIAL_QCAUX is not set +# 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 +# CONFIG_USB_SERIAL_SIEMENS_MPI is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_SYMBOL is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +CONFIG_USB_SERIAL_WWAN=y +CONFIG_USB_SERIAL_OPTION=y +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_OPTICON is not set +# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set +# CONFIG_USB_SERIAL_XSENS_MT is not set +# CONFIG_USB_SERIAL_ZIO is not set +# CONFIG_USB_SERIAL_WISHBONE is not set +# CONFIG_USB_SERIAL_ZTE is not set +# CONFIG_USB_SERIAL_SSU100 is not set +# CONFIG_USB_SERIAL_QT2 is not set +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +CONFIG_USB_TRANCEVIBRATOR=y +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_HSIC_USB3503 is not set +CONFIG_USB_PHY=y +# CONFIG_USB_OTG_WAKELOCK is not set +CONFIG_NOP_USB_XCEIV=y +# CONFIG_OMAP_CONTROL_USB is not set +# CONFIG_OMAP_USB3 is not set +# CONFIG_SAMSUNG_USBPHY is not set +# CONFIG_SAMSUNG_USB2PHY is not set +# CONFIG_SAMSUNG_USB3PHY is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_RCAR_PHY is not set +# CONFIG_USB_ULPI 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 is not set +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 + +# +# USB Peripheral Controller +# +# CONFIG_USB_FUSB300 is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_DUMMY_HCD is not set +CONFIG_USB_LIBCOMPOSITE=y +CONFIG_USB_F_ACM=y +CONFIG_USB_U_SERIAL=y +CONFIG_USB_F_SERIAL=y +# CONFIG_USB_ZERO is not set +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_G_NCM is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_FUNCTIONFS is not set +# CONFIG_USB_MASS_STORAGE is not set +# CONFIG_USB_G_SERIAL is not set +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_USB_G_ANDROID=y +# CONFIG_USB_ANDROID_RNDIS_DWORD_ALIGNED is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_G_ACM_MS is not set +# CONFIG_USB_G_MULTI is not set +# CONFIG_USB_G_HID is not set +# CONFIG_USB_G_DBGP is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_UNSAFE_RESUME=y +# CONFIG_MMC_CLKGATE is not set +# CONFIG_MMC_EMBEDDED_SDIO is not set +# CONFIG_MMC_PARANOID_SD_INIT is not set + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_BOUNCE=y +CONFIG_MMC_SAMSUNG_SMART=y +CONFIG_MMC_ERR_REMOVE=y +# CONFIG_MMC_BLOCK_DEFERRED_RESUME is not set +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_ARMMMCI is not set +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_DW is not set +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_PCA9532 is not set +# CONFIG_LEDS_GPIO is not set +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP5521 is not set +# CONFIG_LEDS_LP5523 is not set +# CONFIG_LEDS_LP5562 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA9633 is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_OT200 is not set +# CONFIG_LEDS_BLINKM is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +# CONFIG_LEDS_TRIGGER_ONESHOT is not set +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_CPU is not set +# CONFIG_LEDS_TRIGGER_GPIO is not set +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set + +# +# iptables trigger is under Netfilter config (LED target) +# +# CONFIG_LEDS_TRIGGER_TRANSIENT is not set +# CONFIG_LEDS_TRIGGER_CAMERA is not set +CONFIG_SWITCH=y +# CONFIG_SWITCH_GPIO is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_EDAC is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_DS3234 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_RX4581 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set +# CONFIG_RTC_DRV_DS2404 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set +# CONFIG_DMADEVICES is not set +# CONFIG_AUXDISPLAY is not set +# CONFIG_UIO is not set +# CONFIG_VIRT_DRIVERS is not set + +# +# Virtio drivers +# +# CONFIG_VIRTIO_MMIO is not set + +# +# Microsoft Hyper-V guest support +# +CONFIG_STAGING=y +# CONFIG_USBIP_CORE is not set +# CONFIG_PRISM2_USB is not set +# CONFIG_ECHO is not set +# CONFIG_ASUS_OLED is not set +# CONFIG_R8712U is not set +# CONFIG_RTS5139 is not set +# CONFIG_TRANZPORT is not set +# CONFIG_LINE6_USB is not set +# CONFIG_USB_SERIAL_QUATECH2 is not set +CONFIG_ZSMALLOC=y +CONFIG_ZRAM=y +CONFIG_ZRAM_DEBUG=y +# CONFIG_BCM_WIMAX is not set +# CONFIG_FT1000 is not set + +# +# Speakup console speech +# +# CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set +# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set +# CONFIG_STAGING_MEDIA is not set + +# +# Android +# +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ANDROID_BINDER_IPC_32BIT=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_LOGGER=y +CONFIG_ANDROID_TIMED_OUTPUT=y +# CONFIG_ANDROID_TIMED_GPIO is not set +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_ANDROID_LOW_MEMORY_KILLER_AUTODETECT_OOM_ADJ_VALUES=y +CONFIG_ANDROID_INTF_ALARM_DEV=y +CONFIG_SYNC=y +CONFIG_SW_SYNC=y +CONFIG_SW_SYNC_USER=y +# CONFIG_MTK_LCA_RAM_OPTIMIZE is not set +CONFIG_ION=y +# CONFIG_ION_TEST is not set +# CONFIG_FIQ_DEBUGGER is not set +# CONFIG_FIQ_WATCHDOG is not set +# CONFIG_USB_WPAN_HCD is not set +# CONFIG_WIMAX_GDM72XX is not set +# CONFIG_CSR_WIFI is not set +# CONFIG_CED1401 is not set +# CONFIG_DGRP is not set + +# +# Hardware Spinlock drivers +# +# CONFIG_MAILBOX is not set +# CONFIG_IOMMU_SUPPORT is not set + +# +# Remoteproc drivers +# +# CONFIG_STE_MODEM_RPROC is not set + +# +# Rpmsg drivers +# +# CONFIG_PM_DEVFREQ is not set +# CONFIG_EXTCON is not set +# CONFIG_MEMORY is not set +# CONFIG_IIO is not set +# CONFIG_PWM is not set +# CONFIG_IPACK_BUS is not set +# CONFIG_RESET_CONTROLLER is not set + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_EXT2_FS is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_EXT4_FS=y +# CONFIG_EXT4_USE_FOR_EXT23 is not set +# CONFIG_EXT4_FS_POSIX_ACL is not set +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_FANOTIFY is not set +# CONFIG_QUOTA is not set +# CONFIG_QUOTACTL is not set +# CONFIG_AUTOFS4_FS is not set +CONFIG_FUSE_FS=y +# CONFIG_CUSE is not set +CONFIG_GENERIC_ACL=y + +# +# Caches +# +# CONFIG_FSCACHE is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_CONFIGFS_FS=y +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS2_FS is not set +# CONFIG_LOGFS is not set +# CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_PSTORE is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +# CONFIG_F2FS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +CONFIG_NLS_CODEPAGE_950=y +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set + +# +# Kernel hacking +# +CONFIG_PRINTK_TIME=y +CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1400 +CONFIG_MAGIC_SYSRQ=y +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_LOCKUP_DETECTOR=y +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_ON_OOPS_VALUE=1 +# CONFIG_DETECT_HUNG_TASK is not set +CONFIG_SCHED_DEBUG=y +CONFIG_SCHEDSTATS=y +# CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=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 is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +CONFIG_STACKTRACE=y +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_INFO_REDUCED is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_TEST_LIST_SORT is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_CREDENTIALS is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set + +# +# RCU Debugging +# +# CONFIG_PROVE_RCU is not set +# CONFIG_PROVE_RCU_DELAY is not set +# CONFIG_SPARSE_RCU_POINTER is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_RCU_CPU_STALL_VERBOSE=y +# CONFIG_RCU_CPU_STALL_INFO is not set +# CONFIG_RCU_TRACE is not set +# 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_DEBUG_PER_CPU_MAPS is not set +# CONFIG_LKDTM is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_FUNCTION_GRAPH_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_FTRACE_SYSCALLS is not set +# CONFIG_TRACER_SNAPSHOT is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_PROBE_EVENTS is not set +# CONFIG_DYNAMIC_FTRACE is not set +CONFIG_FUNCTION_PROFILER=y +# CONFIG_FTRACE_MCOUNT_RECORD is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_ATOMIC64_SELFTEST is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +# CONFIG_TEST_STRING_HELPERS is not set +# CONFIG_TEST_KSTRTOX is not set +# CONFIG_STRICT_DEVMEM is not set +# CONFIG_ARM_UNWIND is not set +# CONFIG_OLD_MCOUNT is not set +# CONFIG_DEBUG_USER is not set +CONFIG_DEBUG_RODATA=y +# CONFIG_DEBUG_RODATA_TEST is not set +# CONFIG_DEBUG_LL is not set +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +CONFIG_UNCOMPRESS_INCLUDE="mach/uncompress.h" +# CONFIG_OC_ETM is not set +# CONFIG_PID_IN_CONTEXTIDR is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_SECURITY=y +CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y +# CONFIG_SECURITYFS is not set +CONFIG_SECURITY_NETWORK=y +# CONFIG_SECURITY_NETWORK_XFRM is not set +# CONFIG_SECURITY_PATH is not set +CONFIG_LSM_MMAP_MIN_ADDR=32768 +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SELINUX_BOOTPARAM=y +CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 +# CONFIG_SECURITY_SELINUX_DISABLE is not set +CONFIG_SECURITY_SELINUX_DEVELOP=y +CONFIG_SECURITY_SELINUX_AVC_STATS=y +CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 +# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_YAMA is not set +# CONFIG_IMA is not set +CONFIG_DEFAULT_SECURITY_SELINUX=y +# CONFIG_DEFAULT_SECURITY_DAC is not set +CONFIG_DEFAULT_SECURITY="selinux" +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_PCOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_USER is not set +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +# CONFIG_CRYPTO_GF128MUL is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_PCRYPT is not set +CONFIG_CRYPTO_WORKQUEUE=y +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=y + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +# CONFIG_CRYPTO_CMAC is not set +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_VMAC is not set + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_GHASH is not set +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +# CONFIG_CRYPTO_SHA1_ARM is not set +CONFIG_CRYPTO_SHA256=y +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_ARM is not set +# CONFIG_CRYPTO_AES_ARM32_CE is not set +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_ARC4=y +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_TWOFISH_COMMON=y + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +# CONFIG_CRYPTO_ZLIB is not set +CONFIG_CRYPTO_LZO=y + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_USER_API_HASH is not set +# CONFIG_CRYPTO_USER_API_SKCIPHER is not set +# CONFIG_CRYPTO_HW is not set +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IO=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=y +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set +CONFIG_AUDIT_GENERIC=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +# CONFIG_LZ4K is not set +# CONFIG_XZ_DEC is not set +# CONFIG_XZ_DEC_BCJ is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=y +CONFIG_TEXTSEARCH_BM=y +CONFIG_TEXTSEARCH_FSM=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_NLATTR=y +CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y +# CONFIG_AVERAGE is not set +# CONFIG_CORDIC is not set +# CONFIG_DDR is not set +# CONFIG_VIRTUALIZATION is not set +CONFIG_MTK_WD_KICKER=y diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 63f370c5057..61a80e2329f 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -61,10 +61,6 @@ static const char *isa_modes[] = { "ARM" , "Thumb" , "Jazelle", "ThumbEE" }; -//[BUGFIX]-Add-BEGIN by SCDTABLET.(fangyou.wang),10/10/2015,1097303, -//auto reboot after power off -extern void force_enable_uart_log(void); -//[BUGFIX]-Add-END by SCDTABLET.(fangyou.wang) #ifdef CONFIG_SMP void arch_trigger_all_cpu_backtrace(void) { @@ -334,11 +330,7 @@ void machine_power_off(void) /* Disable interrupts first */ local_irq_disable(); local_fiq_disable(); -//[BUGFIX]-Add-BEGIN by SCDTABLET.(fangyou.wang),10/10/2015,1097303, -//auto reboot after power off - force_enable_uart_log(); -//[BUGFIX]-Add-END by SCDTABLET.(fangyou.wang) - + smp_send_stop(); if(reboot_pid > 1) { diff --git a/arch/arm/mach-mt8127/Makefile b/arch/arm/mach-mt8127/Makefile index 6a04fe99873..8bcc5fd40a4 100755 --- a/arch/arm/mach-mt8127/Makefile +++ b/arch/arm/mach-mt8127/Makefile @@ -56,9 +56,7 @@ ccflags-y += -I$(MTK_PATH_PLATFORM)/drivers/power \ obj-y += mt_spm.o mt_spm_sleep.o mt_spm_mtcmos.o ccflags-$(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) += -I$(srctree)/include/trustzone/ obj-y += mt_sleep.o -#obj-y += mt_cpufreq.o mt_gpufreq.o mt_cpu_ss.o obj-y += mt_cpufreq.o mt_cpu_ss.o -obj-y += mt_emifreq.o obj-y += mt_dormant.o cpu_dormant.o obj-y += mt_dcm.o mt_idle.o obj-y += mt_clkmgr_common.o diff --git a/arch/arm/mach-mt8127/camera_isp.c b/arch/arm/mach-mt8127/camera_isp.c index 8ef40dd9094..27e946ec730 100644 --- a/arch/arm/mach-mt8127/camera_isp.c +++ b/arch/arm/mach-mt8127/camera_isp.c @@ -2047,7 +2047,7 @@ static MBOOL ISP_BufWrite_Add(MUINT32 Size,MUINT8 *pData) { if(g_IspInfo.BufInfo.Write[i].Status == ISP_BUF_STATUS_HOLD) { - if((g_IspInfo.BufInfo.Write[i].Size + Size) > ISP_BUF_SIZE_WRITE) + if ((Size > ISP_BUF_SIZE_WRITE) || ((g_IspInfo.BufInfo.Write[i].Size + Size) > ISP_BUF_SIZE_WRITE)) { LOG_ERR("i(%d), BufWriteSize(%d) + Size(%d) > %d",i,g_IspInfo.BufInfo.Write[i].Size,Size,ISP_BUF_SIZE_WRITE); return MFALSE; @@ -5102,99 +5102,38 @@ static struct platform_driver IspDriver = * ********************************************************************************/ static MINT32 ISP_DumpRegToProc( - char *pPage, - char **ppStart, - off_t off, - MINT32 Count, - MINT32 *pEof, - MVOID *pData) + struct file *pFile, + char *pStart, + size_t Off, + loff_t *Count) { - char *p = pPage; MINT32 Length = 0; - MUINT32 i = 0; - MINT32 ret = 0; - LOG_DBG("pPage(0x%08x),off(%d),Count(%d)", (MUINT32)pPage, (MUINT32)off, Count); - - p += sprintf(p, " MT ISP Register\n"); - p += sprintf(p, "====== top ====\n"); - - for(i = 0x0; i <= 0x1AC; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - p += sprintf(p,"====== dma ====\n"); - for(i = 0x200; i <= 0x3D8; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n\r", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - p += sprintf(p,"====== tg ====\n"); - for(i = 0x400; i <= 0x4EC; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - p += sprintf(p,"====== cdp (including EIS) ====\n"); - for(i = 0xB00; i <= 0xDE0; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - p += sprintf(p,"====== seninf ====\n"); - for(i = 0x4000; i <= 0x40C0; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - for(i = 0x4100; i <= 0x41BC; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - for(i = 0x4300; i <= 0x4310; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - for(i = 0x43A0; i <= 0x43B0; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - for(i = 0x4400; i <= 0x4424; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - for(i = 0x4500; i <= 0x4520; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - p += sprintf(p,"====== 3DNR ====\n"); - for(i = 0x4F00; i <= 0x4F38; i += 4) - { - p += sprintf(p,"+0x%08x 0x%08x\n", ISP_ADDR + i, ISP_RD32((void *)(ISP_ADDR + i))); - } - - *ppStart = pPage + off; - - Length = p - pPage; - if(Length > off) - { - Length -= off; - } - else - { - Length = 0; - } + char *buffer_log = kmalloc(1000*sizeof(unsigned int), GFP_KERNEL); - ret = Length < Count ? Length : Count; + if (buffer_log == NULL) { + LOG_ERR("kmalloc fail"); + kfree(buffer_log); + return -EFAULT; + } - LOG_DBG("ret(%d)", ret); - return ret; + if (*Count > 0) { + kfree(buffer_log); + return 0; + } + + Length += sprintf(buffer_log, "MT ISP Register\n"); + Length += sprintf(buffer_log + Length,"+0x%08x 0x%08x\n", ISP_ADDR + 0x4,ISP_RD32((void *)(ISP_ADDR + 0x4))); + + if (copy_to_user(pStart, buffer_log, Length)) { + LOG_ERR("copy_to_user fail"); + kfree(buffer_log); + return -EFAULT; + } + + *Count = *Count + Length; + kfree(buffer_log); + return Length; } /******************************************************************************* @@ -5235,38 +5174,36 @@ static MINT32 ISP_RegDebug( static MUINT32 proc_regOfst = 0; static MINT32 CAMIO_DumpRegToProc( - char *pPage, - char **ppStart, - off_t off, - MINT32 Count, - MINT32 *pEof, - MVOID *pData) + struct file *pFile, + char *pStart, + size_t Off, + loff_t *Count) { - char *p = pPage; MINT32 Length = 0; - MINT32 ret = 0; - LOG_DBG("pPage(0x%08x),off(%d),Count(%d)", (MUINT32)pPage, (MINT32)off, Count); - - p += sprintf(p,"reg_0x%08X = 0x%X \n", ISP_ADDR_CAMINF + proc_regOfst , ioread32((void *)(ISP_ADDR_CAMINF + proc_regOfst))); + char *buffer_log = kmalloc(1000*sizeof(unsigned int), GFP_KERNEL); - *ppStart = pPage + off; - - Length = p - pPage; - if(Length > off) - { - Length -= off; + if (buffer_log == NULL) { + LOG_ERR("kmalloc fail"); + kfree(buffer_log); + return -EFAULT; } - else - { - Length = 0; + + if (*Count > 0) { + kfree(buffer_log); + return 0; } - // - ret = Length < Count ? Length : Count; + Length += sprintf(buffer_log,"reg_0x%08X = 0x%X \n", ISP_ADDR_CAMINF + proc_regOfst , ioread32((void *)(ISP_ADDR_CAMINF + proc_regOfst))); + if (copy_to_user(pStart, buffer_log, Length)) { + LOG_ERR("copy_to_user fail"); + kfree(buffer_log); + return -EFAULT; + } - LOG_DBG("ret(%d)", ret); - return ret; + *Count = *Count + Length; + kfree(buffer_log); + return Length; } /******************************************************************************* diff --git a/arch/arm/mach-mt8127/camera_sysram.c b/arch/arm/mach-mt8127/camera_sysram.c index 7c43f1d43a0..e3b827a6d76 100644 --- a/arch/arm/mach-mt8127/camera_sysram.c +++ b/arch/arm/mach-mt8127/camera_sysram.c @@ -917,14 +917,16 @@ static int SYSRAM_mmap( struct vm_area_struct* pVma) { //LOG_MSG(""); - long length = 0; + unsigned long length = 0; MUINT32 pfn=0x0; + pVma->vm_page_prot = pgprot_noncached(pVma->vm_page_prot); - length=(long)(pVma->vm_end - pVma->vm_start); + length = pVma->vm_end - pVma->vm_start; pfn=pVma->vm_pgoff<vm_pgoff(0x%x),phy(0x%x),pVmapVma->vm_start(0x%x),pVma->vm_end(0x%x),length(0x%x)",\ pVma->vm_pgoff,pVma->vm_pgoff<vm_start,pVma->vm_end,length); - if((length>ISP_VALID_REG_RANGE) || (pfn(IMGSYS_BASE_ADDR+ISP_VALID_REG_RANGE))) + + if((length>ISP_VALID_REG_RANGE) || (pfn(IMGSYS_BASE_ADDR+ISP_VALID_REG_RANGE) || pVma->vm_end <= pVma->vm_start)) { LOG_ERR("mmap range error : vm_start(0x%x),vm_end(0x%x),length(0x%x),pfn(0x%x)!",pVma->vm_start,pVma->vm_end,length,pfn); return -EAGAIN; @@ -1257,35 +1259,46 @@ static struct platform_driver SysramPlatformDriver = }; //------------------------------------------------------------------------------ static int SYSRAM_DumpLayoutToProc( - char* pPage, - char** ppStart, - off_t Off, - int Count, - int* pEof, - void* pData) + struct file *pFile, + char *pStart, + size_t Off, + loff_t *Count) { - char *p = pPage; - MUINT32 len = 0; + MINT32 Length = 0; MUINT32 Index = 0; SYSRAM_MEM_NODE_STRUCT* pCurrNode = NULL; - // - p += sprintf(p, "\n[SYSRAM_DumpLayoutToProc]\n"); - p += sprintf(p, "AllocatedTbl = 0x%08lX\n",Sysram.AllocatedTbl); - p += sprintf(p, "=========================================\n" ); + + char *buffer_log = kmalloc(1000*sizeof(unsigned int), GFP_KERNEL); + + if (buffer_log == NULL) { + LOG_ERR("kmalloc fail"); + kfree(buffer_log); + return -EFAULT; + } + + if (*Count > 0) { + kfree(buffer_log); + return 0; + } + + Length += sprintf(buffer_log, "\n[SYSRAM_DumpLayoutToProc]\n"); + Length += sprintf(buffer_log + Length, "AllocatedTbl = 0x%08lX\n",Sysram.AllocatedTbl); + Length += sprintf(buffer_log + Length, "=========================================\n" ); + for (Index = 0; Index < SYSRAM_MEM_BANK_AMOUNT; Index++) { - p += sprintf(p, "\n [Mem Pool %ld] (IndexTbl, UserCount)=(%lX, %ld)\n", + Length += sprintf(buffer_log + Length, "\n [Mem Pool %ld] (IndexTbl, UserCount)=(%lX, %ld)\n", Index, SysramMemPoolInfo[Index].IndexTbl, SysramMemPoolInfo[Index].UserCount); - p += sprintf(p, "[Locked Time] [Owner Offset Size Index pCurrent pPrevious pNext] [pid tgid] [Proc Name / Owner Name]\n"); + Length += sprintf(buffer_log + Length, "[Locked Time] [Owner Offset Size Index pCurrent pPrevious pNext] [pid tgid] [Proc Name / Owner Name]\n"); pCurrNode = &SysramMemPoolInfo[Index].pMemNode[0]; while ( NULL != pCurrNode ) { SYSRAM_USER_ENUM const User = pCurrNode->User; if ( SYSRAM_IsBadOwner(User) ) { - p += sprintf(p, + Length += sprintf(buffer_log + Length, "------------ --------" " %2d\t0x%05lX 0x%05lX %ld %p %p\t%p\n", pCurrNode->User, @@ -1300,7 +1313,7 @@ static int SYSRAM_DumpLayoutToProc( else { SYSRAM_USER_STRUCT*const pUserInfo = &Sysram.UserInfo[User]; - p += sprintf(p, + Length += sprintf(buffer_log + Length, "%5lu.%06lu" " %2d\t0x%05lX 0x%05lX %ld %p %p\t%p" " %-4d %-4d \"%s\" / \"%s\"\n", @@ -1321,49 +1334,52 @@ static int SYSRAM_DumpLayoutToProc( pCurrNode = pCurrNode->pNext; }; } - // - *ppStart = pPage + Off; - len = p - pPage; - if(len > Off) - { - len -= Off; + + if (copy_to_user(pStart, buffer_log, Length)) { + LOG_ERR("copy_to_user fail"); + kfree(buffer_log); + return -EFAULT; } - else - { - len = 0; - } - // - return len < Count ? len : Count; + + *Count = *Count + Length; + kfree(buffer_log); + return Length; } //------------------------------------------------------------------------------ static int SYSRAM_ReadFlag( - char* pPage, - char** ppStart, - off_t Off, - int Count, - int* pEof, - void* pData) + struct file *pFile, + char *pStart, + size_t Off, + loff_t *Count) { - char *p = pPage; - MUINT32 len = 0; - // - p += sprintf(p, "\r\n[SYSRAM_ReadFlag]\r\n"); - p += sprintf(p, "=========================================\r\n" ); - p += sprintf(p, "Sysram.DebugFlag = 0x%08lX\r\n",Sysram.DebugFlag); - *ppStart = pPage + Off; + MINT32 Length = 0; - len = p - pPage; - if(len > Off) - { - len -= Off; + char *buffer_log = kmalloc(1000*sizeof(unsigned int), GFP_KERNEL); + + if (buffer_log == NULL) { + LOG_ERR("kmalloc fail"); + kfree(buffer_log); + return -EFAULT; } - else - { - len = 0; + + if (*Count > 0) { + kfree(buffer_log); + return 0; } - // - return len < Count ? len : Count; + + Length += sprintf(buffer_log, "\r\n[SYSRAM_ReadFlag]\r\n"); + Length += sprintf(buffer_log + Length, "Sysram.DebugFlag = 0x%08lX\r\n",Sysram.DebugFlag); + + if (copy_to_user(pStart, buffer_log, Length)) { + LOG_ERR("copy_to_user fail"); + kfree(buffer_log); + return -EFAULT; + } + + *Count = *Count + Length; + kfree(buffer_log); + return Length; } //------------------------------------------------------------------------------ static int SYSRAM_WriteFlag( diff --git a/arch/arm/mach-mt8127/core.c b/arch/arm/mach-mt8127/core.c index c3f5d2da41c..563aeddc248 100644 --- a/arch/arm/mach-mt8127/core.c +++ b/arch/arm/mach-mt8127/core.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include extern void arm_machine_restart(char mode, const char *cmd); extern struct sys_timer mt6582_timer; @@ -25,6 +27,32 @@ extern struct smp_operations mt65xx_smp_ops; extern void mt_fixup(struct tag *tags, char **cmdline, struct meminfo *mi); extern void mt_reserve(void); +/* Added by haitaoy@amazon.com for AUSTINPLAT-1413. */ +struct mt_wake_event_map mt8127_event_map[] = { + { + .domain = "SPM", + .code = 10, /* for WAKE_SRC_CONN */ + .we = WEV_WIFI, + .irq = 10, + }, +/* Examples for tracing other types of wake source or event. */ +#if 0 + { + .domain = "SPM", + .code = 21, /* for WAKE_SRC_THERM */ + .we = WEV_THERM, + .irq = 21, + }, + { + .domain = "IRQ", + .code = MT_CONN2AP_BTIF_WAKEUP_IRQ_ID, /* BTIF_WAKEUP_IRQ_ID */ + .we = WEV_BT, + .irq = MT_CONN2AP_BTIF_WAKEUP_IRQ_ID, /* BTIF_WAKEUP_IRQ_ID */ + }, +#endif + { /*empty*/ } +}; + void __init mt_init(void) { /* enable bus out of order command queue to enhance boot time */ @@ -35,6 +63,9 @@ void __init mt_init(void) writel(opt, IOMEM(MCU_BIU_BASE)); dsb(); #endif + + /* Added by haitaoy@amazon.com for AUSTINPLAT-1413. */ + spm_set_wakeup_event_map(mt8127_event_map); } #if defined(CONFIG_TRUSTONIC_TEE_SUPPORT) || defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) @@ -90,7 +121,7 @@ static struct map_desc mt_io_desc[] __initdata = .virtual = SYSRAM_BASE, .pfn = __phys_to_pfn(0x00200000), .length = SZ_128K, - .type = MT_MEMORY_NONCACHED + .type = MT_DEVICE }, { .virtual = G3D_CONFIG_BASE, @@ -134,7 +165,7 @@ static struct map_desc mt_io_desc[] __initdata = .virtual = INTER_SRAM, .pfn = __phys_to_pfn(0x00100000), .length = SZ_64K, - .type = MT_MEMORY_NONCACHED + .type = MT_DEVICE }, #else { @@ -162,7 +193,7 @@ static struct map_desc mt_io_desc[] __initdata = .virtual = SYSRAM_BASE, .pfn = __phys_to_pfn(0x00200000), .length = SZ_128K, - .type = MT_MEMORY_NONCACHED + .type = MT_DEVICE }, { .virtual = DISPSYS_BASE, @@ -199,7 +230,7 @@ static struct map_desc mt_io_desc[] __initdata = .virtual = INTER_SRAM, .pfn = __phys_to_pfn(0x00100000), .length = SZ_64K, - .type = MT_MEMORY_NONCACHED + .type = MT_DEVICE }, #endif }; diff --git a/arch/arm/mach-mt8127/ford/Makefile b/arch/arm/mach-mt8127/ford/Makefile new file mode 100755 index 00000000000..da8993fc71e --- /dev/null +++ b/arch/arm/mach-mt8127/ford/Makefile @@ -0,0 +1,60 @@ + +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +ifneq ($(CONFIG_ARCH_MTK_PROJECT),) +ARCH_MTK_PROJECT := $(shell echo $(CONFIG_ARCH_MTK_PROJECT)) +obj-y += core/ +ifeq ($(CONFIG_AUSTIN_PROJECT),y) + obj-y += dct/dct_austin/ +else + obj-y += dct/dct/ +endif +endif + + +ifeq ($(CONFIG_CUSTOM_KERNEL_ACCELEROMETER),y) +obj-y += accelerometer/ +endif + +ifeq ($(CONFIG_MTK_KXTJ2_1009),y) +obj-y += accelerometer/KXTJ2_1009/ +endif + +ifeq ($(CONFIG_MTK_BMA253),y) +obj-y += accelerometer/BMA253/ +endif + +ifeq ($(CONFIG_MTK_MC3410),y) +obj-y += accelerometer/MC3410-NEW/ +endif + +ifeq ($(CONFIG_CUSTOM_KERNEL_GYROSCOPE),y) +obj-y += gyroscope/ +endif + +ifeq ($(CONFIG_CUSTOM_KERNEL_MAGNETOMETER),y) +obj-y += magnetometer/ +endif + +ifeq ($(CONFIG_CUSTOM_KERNEL_ALSPS),y) +obj-y += alsps/ +endif + +obj-y += cam_cal/ +obj-y += camera/camera/ +obj-y += eeprom/ +###obj-y += flashlight/ +obj-y += flashlight/constant_flashlight/ +obj-y += headset/ +###zbj-y += imgsensor/ +obj-y += keypad/ +obj-y += leds/ +obj-y += lens/ +obj-y += sound/ +###obj-y += ssw/ +obj-y += touchpanel/ +obj-y += vibrator/ +#obj-y += wmt/ +ifeq ($(CONFIG_MTK_HDMI_SUPPORT),y) +obj-y +=hdmi/ +endif diff --git a/arch/arm/mach-mt8127/ford/accdet/accdet_custom.h b/arch/arm/mach-mt8127/ford/accdet/accdet_custom.h new file mode 100644 index 00000000000..9cbde46a1a3 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accdet/accdet_custom.h @@ -0,0 +1,14 @@ +struct headset_mode_settings{ + int pwm_width; //pwm frequence + int pwm_thresh; //pwm duty + int fall_delay; //falling stable time + int rise_delay; //rising stable time + int debounce0; //hook switch or double check debounce + int debounce1; //mic bias debounce + int debounce3; //plug out debounce +}; + +//key press customization: long press time +struct headset_key_custom{ + int headset_long_press_time; +}; diff --git a/arch/arm/mach-mt8127/ford/accdet/accdet_custom_def.h b/arch/arm/mach-mt8127/ford/accdet/accdet_custom_def.h new file mode 100644 index 00000000000..bac773afd4d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accdet/accdet_custom_def.h @@ -0,0 +1,15 @@ +// use accdet + EINT solution +#define ACCDET_EINT +// support multi_key feature +#define ACCDET_MULTI_KEY_FEATURE +// after 5s disable accdet +#define ACCDET_LOW_POWER + +//#define ACCDET_PIN_RECOGNIZATION +#define ACCDET_28V_MODE + +#define ACCDET_SHORT_PLUGOUT_DEBOUNCE +#define ACCDET_SHORT_PLUGOUT_DEBOUNCE_CN 20 + +//extern struct headset_mode_settings* get_cust_headset_settings(void); +//extern int get_long_press_time_cust(void); \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/accelerometer/BMA253/Makefile b/arch/arm/mach-mt8127/ford/accelerometer/BMA253/Makefile new file mode 100644 index 00000000000..7a7daac3c74 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/BMA253/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := bma253_cust_acc.o + diff --git a/arch/arm/mach-mt8127/ford/accelerometer/BMA253/bma253_cust_acc.c b/arch/arm/mach-mt8127/ford/accelerometer/BMA253/bma253_cust_acc.c new file mode 100644 index 00000000000..a4f98679ee0 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/BMA253/bma253_cust_acc.c @@ -0,0 +1,30 @@ +#include +#include +#include + +/*---------------------------------------------------------------------------*/ +static int cust_acc_power(struct acc_hw *hw, unsigned int on, char *devname) +{ + if (hw->power_id == MT65XX_POWER_NONE) + return 0; + if (on) + return hwPowerOn(hw->power_id, hw->power_vol, devname); + else + return hwPowerDown(hw->power_id, devname); +} + +/*---------------------------------------------------------------------------*/ +static struct acc_hw cust_acc_hw = { + .i2c_num = 2, + .direction = 5, + .power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ + .power_vol = VOL_DEFAULT, /*!< LDO is not used */ + .firlen = 0, /*!< don't enable low pass fileter */ + .power = cust_acc_power, +}; + +/*---------------------------------------------------------------------------*/ +struct acc_hw *get_bma253_cust_acc_hw(void) +{ + return &cust_acc_hw; +} diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/Makefile b/arch/arm/mach-mt8127/ford/accelerometer/KXTJ2_1009/Makefile old mode 100644 new mode 100755 similarity index 64% rename from drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/Makefile rename to arch/arm/mach-mt8127/ford/accelerometer/KXTJ2_1009/Makefile index 62abd01adfc..c2ff2dcc0a9 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/Makefile +++ b/arch/arm/mach-mt8127/ford/accelerometer/KXTJ2_1009/Makefile @@ -1,4 +1,4 @@ include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += gc2355mipi_Sensor.o +obj-y := kxtj2_1009_cust_acc.o diff --git a/arch/arm/mach-mt8127/ford/accelerometer/KXTJ2_1009/kxtj2_1009_cust_acc.c b/arch/arm/mach-mt8127/ford/accelerometer/KXTJ2_1009/kxtj2_1009_cust_acc.c new file mode 100644 index 00000000000..c3fff970346 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/KXTJ2_1009/kxtj2_1009_cust_acc.c @@ -0,0 +1,28 @@ +#include +#include +#include + +/*---------------------------------------------------------------------------*/ +static int cust_acc_power(struct acc_hw *hw, unsigned int on, char* devname) +{ + if (hw->power_id == MT65XX_POWER_NONE) + return 0; + if (on) + return hwPowerOn(hw->power_id, hw->power_vol, devname); + else + return hwPowerDown(hw->power_id, devname); +} +/*---------------------------------------------------------------------------*/ +static struct acc_hw cust_acc_hw = { + .i2c_num = 2, + .direction = 5, + .power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ + .power_vol= VOL_DEFAULT, /*!< LDO is not used */ + .firlen = 3, /*!< don't enable low pass fileter */ + .power = cust_acc_power, +}; +/*---------------------------------------------------------------------------*/ +struct acc_hw* get_kxtj2_1009_cust_acc_hw(void) +{ + return &cust_acc_hw; +} diff --git a/arch/arm/mach-mt8127/ford/accelerometer/MC3410-NEW/Makefile b/arch/arm/mach-mt8127/ford/accelerometer/MC3410-NEW/Makefile new file mode 100755 index 00000000000..c2d58d3b45e --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/MC3410-NEW/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := mc3410_cust_acc.o + diff --git a/arch/arm/mach-mt8127/ford/accelerometer/MC3410-NEW/mc3410_cust_acc.c b/arch/arm/mach-mt8127/ford/accelerometer/MC3410-NEW/mc3410_cust_acc.c new file mode 100644 index 00000000000..7d657c8dfdb --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/MC3410-NEW/mc3410_cust_acc.c @@ -0,0 +1,19 @@ +#include +#include +#include + + +/*---------------------------------------------------------------------------*/ +static struct acc_hw cust_acc_hw = { + .i2c_num = 2, + .direction = 7, + .power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ + .power_vol= VOL_DEFAULT, /*!< LDO is not used */ + .firlen = 0, //old value 16 /*!< don't enable low pass fileter */ + .is_batch_supported = false, +}; +/*---------------------------------------------------------------------------*/ +struct acc_hw* get_mc3410_cust_acc_hw(void) +{ + return &cust_acc_hw; +} diff --git a/drivers/misc/mediatek/dum-char/mt8127/Makefile b/arch/arm/mach-mt8127/ford/accelerometer/Makefile similarity index 74% rename from drivers/misc/mediatek/dum-char/mt8127/Makefile rename to arch/arm/mach-mt8127/ford/accelerometer/Makefile index 4fa7221785d..37a76885eb1 100755 --- a/drivers/misc/mediatek/dum-char/mt8127/Makefile +++ b/arch/arm/mach-mt8127/ford/accelerometer/Makefile @@ -1,3 +1,3 @@ include $(srctree)/drivers/misc/mediatek/Makefile.custom +obj-y := cust_acc.o -obj-y := dumchar.o diff --git a/arch/arm/mach-mt8127/ford/accelerometer/accel.c b/arch/arm/mach-mt8127/ford/accelerometer/accel.c new file mode 100644 index 00000000000..18cb7f85314 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/accel.c @@ -0,0 +1,795 @@ + +#include "accel.h" + +static struct acc_context *acc_context_obj = NULL; + + +static struct acc_init_info* gsensor_init_list[MAX_CHOOSE_G_NUM]= {0}; //modified +static void acc_early_suspend(struct early_suspend *h); +static void acc_late_resume(struct early_suspend *h); + +static void acc_work_func(struct work_struct *work) +{ + + struct acc_context *cxt = NULL; + int out_size; + //hwm_sensor_data sensor_data; + int x,y,z,status,div; + int64_t nt; + struct timespec time; + int err, idx; + + cxt = acc_context_obj; + + if(NULL == cxt->acc_data.get_data) + { + ACC_LOG("acc driver not register data path\n"); + } + + + time.tv_sec = time.tv_nsec = 0; + time = get_monotonic_coarse(); + nt = time.tv_sec*1000000000LL+time.tv_nsec; + + err = cxt->acc_data.get_data(&x,&y,&z,&status); + + if(err) + { + ACC_ERR("get acc data fails!!\n" ); + goto acc_loop; + } + else + { + { + if( 0 == x && 0==y + && 0 == z) + { + goto acc_loop; + } + + cxt->drv_data.acc_data.values[0] = x; + cxt->drv_data.acc_data.values[1] = y; + cxt->drv_data.acc_data.values[2] = z; + cxt->drv_data.acc_data.status = status; + cxt->drv_data.acc_data.time = nt; + + } + } + + if(true == cxt->is_first_data_after_enable) + { + cxt->is_first_data_after_enable = false; + //filter -1 value + if(ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[0] || + ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[1] || + ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[2]) + { + ACC_LOG(" read invalid data \n"); + goto acc_loop; + + } + } + //report data to input device + //printk("new acc work run....\n"); + //ACC_LOG("acc data[%d,%d,%d] \n" ,cxt->drv_data.acc_data.values[0], + //cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2]); + + acc_data_report(cxt->drv_data.acc_data.values[0], + cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2], + cxt->drv_data.acc_data.status); + + acc_loop: + if(true == cxt->is_polling_run) + { + mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); + } +} + +static void acc_poll(unsigned long data) +{ + struct acc_context *obj = (struct acc_context *)data; + if(obj != NULL) + { + schedule_work(&obj->report); + } +} + +static struct acc_context *acc_context_alloc_object(void) +{ + + struct acc_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL); + ACC_LOG("acc_context_alloc_object++++\n"); + if(!obj) + { + ACC_ERR("Alloc accel object error!\n"); + return NULL; + } + atomic_set(&obj->delay, 200); /*5Hz*/// set work queue delay time 200ms + atomic_set(&obj->wake, 0); + INIT_WORK(&obj->report, acc_work_func); + init_timer(&obj->timer); + obj->timer.expires = jiffies + atomic_read(&obj->delay)/(1000/HZ); + obj->timer.function = acc_poll; + obj->timer.data = (unsigned long)obj; + obj->is_first_data_after_enable = false; + obj->is_polling_run = false; + mutex_init(&obj->acc_op_mutex); + obj->is_batch_enable = false;//for batch mode init + ACC_LOG("acc_context_alloc_object----\n"); + return obj; +} + +static int acc_real_enable(int enable) +{ + int err =0; + struct acc_context *cxt = NULL; + cxt = acc_context_obj; + if(1==enable) + { + + if(true==cxt->is_active_data || true ==cxt->is_active_nodata) + { + err = cxt->acc_ctl.enable_nodata(1); + if(err) + { + err = cxt->acc_ctl.enable_nodata(1); + if(err) + { + err = cxt->acc_ctl.enable_nodata(1); + if(err) + ACC_ERR("acc enable(%d) err 3 timers = %d\n", enable, err); + } + } + ACC_LOG("acc real enable \n" ); + } + + } + if(0==enable) + { + if(false==cxt->is_active_data && false ==cxt->is_active_nodata) + { + err = cxt->acc_ctl.enable_nodata(0); + if(err) + { + ACC_ERR("acc enable(%d) err = %d\n", enable, err); + } + ACC_LOG("acc real disable \n" ); + } + + } + + return err; +} +static int acc_enable_data(int enable) +{ + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + if(NULL == cxt->acc_ctl.open_report_data) + { + ACC_ERR("no acc control path\n"); + return -1; + } + + if(1 == enable) + { + ACC_LOG("ACC enable data\n"); + cxt->is_active_data =true; + cxt->is_first_data_after_enable = true; + cxt->acc_ctl.open_report_data(1); + if(false == cxt->is_polling_run && cxt->is_batch_enable == false) + { + if(false == cxt->acc_ctl.is_report_input_direct) + { + mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); + cxt->is_polling_run = true; + } + } + } + if(0 == enable) + { + ACC_LOG("ACC disable \n"); + + cxt->is_active_data =false; + cxt->acc_ctl.open_report_data(0); + if(true == cxt->is_polling_run) + { + if(false == cxt->acc_ctl.is_report_input_direct) + { + cxt->is_polling_run = false; + del_timer_sync(&cxt->timer); + cancel_work_sync(&cxt->report); + cxt->drv_data.acc_data.values[0] = ACC_INVALID_VALUE; + cxt->drv_data.acc_data.values[1] = ACC_INVALID_VALUE; + cxt->drv_data.acc_data.values[2] = ACC_INVALID_VALUE; + } + } + + } + acc_real_enable(enable); + return 0; +} + + + +int acc_enable_nodata(int enable) +{ + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + if(NULL == cxt->acc_ctl.enable_nodata) + { + ACC_ERR("acc_enable_nodata:acc ctl path is NULL\n"); + return -1; + } + + if(1 == enable) + { + cxt->is_active_nodata = true; + } + + if(0 == enable) + { + cxt->is_active_nodata = false; + } + acc_real_enable(enable); + return 0; +} + + +static ssize_t acc_show_enable_nodata(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + ACC_LOG(" not support now\n"); + return len; +} + +static ssize_t acc_store_enable_nodata(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ACC_LOG("acc_store_enable nodata buf=%s\n",buf); + mutex_lock(&acc_context_obj->acc_op_mutex); + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + if(NULL == cxt->acc_ctl.enable_nodata) + { + ACC_LOG("acc_ctl enable nodata NULL\n"); + mutex_unlock(&acc_context_obj->acc_op_mutex); + return count; + } + if (!strncmp(buf, "1", 1)) + { + //cxt->acc_ctl.enable_nodata(1); + acc_enable_nodata(1); + } + else if (!strncmp(buf, "0", 1)) + { + //cxt->acc_ctl.enable_nodata(0); + acc_enable_nodata(0); + } + else + { + ACC_ERR(" acc_store enable nodata cmd error !!\n"); + } + mutex_unlock(&acc_context_obj->acc_op_mutex); +} + +static ssize_t acc_store_active(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ACC_LOG("acc_store_active buf=%s\n",buf); + mutex_lock(&acc_context_obj->acc_op_mutex); + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + if(NULL == cxt->acc_ctl.open_report_data) + { + ACC_LOG("acc_ctl enable NULL\n"); + mutex_unlock(&acc_context_obj->acc_op_mutex); + return count; + } + if (!strncmp(buf, "1", 1)) + { + // cxt->acc_ctl.enable(1); + acc_enable_data(1); + + } + else if (!strncmp(buf, "0", 1)) + { + + //cxt->acc_ctl.enable(0); + acc_enable_data(0); + } + else + { + ACC_ERR(" acc_store_active error !!\n"); + } + mutex_unlock(&acc_context_obj->acc_op_mutex); + ACC_LOG(" acc_store_active done\n"); + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t acc_show_active(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct acc_context *cxt = NULL; + cxt = acc_context_obj; + int div=cxt->acc_data.vender_div; + ACC_LOG("acc vender_div value: %d\n", div); + return snprintf(buf, PAGE_SIZE, "%d\n", div); +} + +static ssize_t acc_store_delay(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&acc_context_obj->acc_op_mutex); + struct acc_context *devobj = (struct acc_context*)dev_get_drvdata(dev); + int delay; + int mdelay=0; + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + if(NULL == cxt->acc_ctl.set_delay) + { + ACC_LOG("acc_ctl set_delay NULL\n"); + mutex_unlock(&acc_context_obj->acc_op_mutex); + return count; + } + + if (1 != sscanf(buf, "%d", &delay)) { + ACC_ERR("invalid format!!\n"); + mutex_unlock(&acc_context_obj->acc_op_mutex); + return count; + } + + if(false == cxt->acc_ctl.is_report_input_direct) + { + mdelay = (int)delay/1000/1000; + atomic_set(&acc_context_obj->delay, mdelay); + } + cxt->acc_ctl.set_delay(delay); + ACC_LOG(" acc_delay %d ns\n",delay); + mutex_unlock(&acc_context_obj->acc_op_mutex); + return count; +} + +static ssize_t acc_show_delay(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + ACC_LOG(" not support now\n"); + return len; +} + +static ssize_t acc_show_sensordevnum(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct acc_context *cxt = NULL; + char *devname = NULL; + cxt = acc_context_obj; + devname = dev_name(&cxt->idev->dev); + return snprintf(buf, PAGE_SIZE, "%s\n", devname+5); +} + + +static ssize_t acc_store_batch(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ACC_LOG("acc_store_batch buf=%s\n",buf); + mutex_lock(&acc_context_obj->acc_op_mutex); + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + if(cxt->acc_ctl.is_support_batch){ + if (!strncmp(buf, "1", 1)) + { + cxt->is_batch_enable = true; + } + else if (!strncmp(buf, "0", 1)) + { + cxt->is_batch_enable = false; + } + else + { + ACC_ERR(" acc_store_batch error !!\n"); + } + }else{ + ACC_LOG(" acc_store_batch mot supported\n"); + } + mutex_unlock(&acc_context_obj->acc_op_mutex); + ACC_LOG(" acc_store_batch done: %d\n", cxt->is_batch_enable); + return count; + +} + +static ssize_t acc_show_batch(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static ssize_t acc_store_flush(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&acc_context_obj->acc_op_mutex); + struct acc_context *devobj = (struct acc_context*)dev_get_drvdata(dev); + //do read FIFO data function and report data immediately + mutex_unlock(&acc_context_obj->acc_op_mutex); + return count; +} + +static ssize_t acc_show_flush(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static int gsensor_remove(struct platform_device *pdev) +{ + ACC_LOG("gsensor_remove\n"); + return 0; +} + +static int gsensor_probe(struct platform_device *pdev) +{ + ACC_LOG("gsensor_probe\n"); + return 0; +} + +static struct platform_driver gsensor_driver = { + .probe = gsensor_probe, + .remove = gsensor_remove, + .driver = + { + .name = "gsensor", + } +}; + +static int acc_real_driver_init(void) +{ + int i =0; + int err=0; + ACC_LOG(" acc_real_driver_init +\n"); + for(i = 0; i < MAX_CHOOSE_G_NUM; i++) + { + ACC_LOG(" i=%d\n",i); + if(0 != gsensor_init_list[i]) + { + ACC_LOG(" acc try to init driver %s\n", gsensor_init_list[i]->name); + err = gsensor_init_list[i]->init(); + if(0 == err) + { + ACC_LOG(" acc real driver %s probe ok\n", gsensor_init_list[i]->name); + break; + } + } + } + + if(i == MAX_CHOOSE_G_NUM) + { + ACC_LOG(" acc_real_driver_init fail\n"); + err=-1; + } + return err; +} + + int acc_driver_add(struct acc_init_info* obj) +{ + int err=0; + int i =0; + + ACC_FUN(); + + for(i =0; i < MAX_CHOOSE_G_NUM; i++ ) + { + if(i == 0){ + ACC_LOG("register gensor driver for the first time\n"); + if(platform_driver_register(&gsensor_driver)) + { + ACC_ERR("failed to register gensor driver already exist\n"); + } + } + + if(NULL == gsensor_init_list[i]) + { + obj->platform_diver_addr = &gsensor_driver; + gsensor_init_list[i] = obj; + break; + } + } + if(NULL==gsensor_init_list[i]) + { + ACC_ERR("ACC driver add err \n"); + err=-1; + } + + return err; +} +EXPORT_SYMBOL_GPL(acc_driver_add); + +static int acc_misc_init(struct acc_context *cxt) +{ + + int err=0; + cxt->mdev.minor = MISC_DYNAMIC_MINOR; + cxt->mdev.name = ACC_MISC_DEV_NAME; + if((err = misc_register(&cxt->mdev))) + { + ACC_ERR("unable to register acc misc device!!\n"); + } + //dev_set_drvdata(cxt->mdev.this_device, cxt); + return err; +} + +static void acc_input_destroy(struct acc_context *cxt) +{ + struct input_dev *dev = cxt->idev; + + input_unregister_device(dev); + input_free_device(dev); +} + +static int acc_input_init(struct acc_context *cxt) +{ + struct input_dev *dev; + int err = 0; + + dev = input_allocate_device(); + if (NULL == dev) + return -ENOMEM; + + dev->name = ACC_INPUTDEV_NAME; + + input_set_capability(dev, EV_ABS, EVENT_TYPE_ACCEL_X); + input_set_capability(dev, EV_ABS, EVENT_TYPE_ACCEL_Y); + input_set_capability(dev, EV_ABS, EVENT_TYPE_ACCEL_Z); + input_set_capability(dev, EV_ABS, EVENT_TYPE_ACCEL_STATUS); + + input_set_abs_params(dev, EVENT_TYPE_ACCEL_X, ACC_VALUE_MIN, ACC_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_ACCEL_Y, ACC_VALUE_MIN, ACC_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_ACCEL_Z, ACC_VALUE_MIN, ACC_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_ACCEL_STATUS, ACC_STATUS_MIN, ACC_STATUS_MAX, 0, 0); + input_set_drvdata(dev, cxt); + + err = input_register_device(dev); + if (err < 0) { + input_free_device(dev); + return err; + } + cxt->idev= dev; + + return 0; +} + +DEVICE_ATTR(accenablenodata, S_IWUSR | S_IRUGO, acc_show_enable_nodata, acc_store_enable_nodata); +DEVICE_ATTR(accactive, S_IWUSR | S_IRUGO, acc_show_active, acc_store_active); +DEVICE_ATTR(accdelay, S_IWUSR | S_IRUGO, acc_show_delay, acc_store_delay); +DEVICE_ATTR(accbatch, S_IWUSR | S_IRUGO, acc_show_batch, acc_store_batch); +DEVICE_ATTR(accflush, S_IWUSR | S_IRUGO, acc_show_flush, acc_store_flush); +DEVICE_ATTR(accdevnum, S_IWUSR | S_IRUGO, acc_show_sensordevnum, NULL); + +static struct attribute *acc_attributes[] = { + &dev_attr_accenablenodata.attr, + &dev_attr_accactive.attr, + &dev_attr_accdelay.attr, + &dev_attr_accbatch.attr, + &dev_attr_accflush.attr, + &dev_attr_accdevnum.attr, + NULL +}; + +static struct attribute_group acc_attribute_group = { + .attrs = acc_attributes +}; + +int acc_register_data_path(struct acc_data_path *data) +{ + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + cxt->acc_data.get_data = data->get_data; + cxt->acc_data.vender_div = data->vender_div; + ACC_LOG("acc register data path vender_div: %d\n", cxt->acc_data.vender_div); + if(NULL == cxt->acc_data.get_data) + { + ACC_LOG("acc register data path fail \n"); + return -1; + } + return 0; +} + +int acc_register_control_path(struct acc_control_path *ctl) +{ + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + cxt->acc_ctl.set_delay = ctl->set_delay; + cxt->acc_ctl.open_report_data= ctl->open_report_data; + cxt->acc_ctl.enable_nodata = ctl->enable_nodata; + cxt->acc_ctl.is_support_batch = ctl->is_support_batch; + cxt->acc_ctl.is_report_input_direct= ctl->is_report_input_direct; + + if(NULL==cxt->acc_ctl.set_delay || NULL==cxt->acc_ctl.open_report_data + || NULL==cxt->acc_ctl.enable_nodata) + { + ACC_LOG("acc register control path fail \n"); + return -1; + } + + //add misc dev for sensor hal control cmd + err = acc_misc_init(acc_context_obj); + if(err) + { + ACC_ERR("unable to register acc misc device!!\n"); + return -2; + } + err = sysfs_create_group(&acc_context_obj->mdev.this_device->kobj, + &acc_attribute_group); + if (err < 0) + { + ACC_ERR("unable to create acc attribute file\n"); + return -3; + } + + kobject_uevent(&acc_context_obj->mdev.this_device->kobj, KOBJ_ADD); + + return 0; +} + +int acc_data_report(int x, int y, int z,int status) +{ + //ACC_LOG("+acc_data_report! %d, %d, %d, %d\n",x,y,z,status); + struct acc_context *cxt = NULL; + int err =0; + cxt = acc_context_obj; + input_report_abs(cxt->idev, EVENT_TYPE_ACCEL_X, x); + input_report_abs(cxt->idev, EVENT_TYPE_ACCEL_Y, y); + input_report_abs(cxt->idev, EVENT_TYPE_ACCEL_Z, z); + input_report_abs(cxt->idev, EVENT_TYPE_ACCEL_STATUS, status); + input_sync(cxt->idev); +} + +static int acc_probe(struct platform_device *pdev) +{ + + int err; + ACC_LOG("+++++++++++++accel_probe!!\n"); + + acc_context_obj = acc_context_alloc_object(); + if (!acc_context_obj) + { + err = -ENOMEM; + ACC_ERR("unable to allocate devobj!\n"); + goto exit_alloc_data_failed; + } + + //init real acceleration driver + err = acc_real_driver_init(); + if(err) + { + ACC_ERR("acc real driver init fail\n"); + goto real_driver_init_fail; + } + + //init input dev + err = acc_input_init(acc_context_obj); + if(err) + { + ACC_ERR("unable to register acc input device!\n"); + goto exit_alloc_input_dev_failed; + } + + atomic_set(&(acc_context_obj->early_suspend), 0); + acc_context_obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1, + acc_context_obj->early_drv.suspend = acc_early_suspend, + acc_context_obj->early_drv.resume = acc_late_resume, + register_early_suspend(&acc_context_obj->early_drv); + + + ACC_LOG("----accel_probe OK !!\n"); + return 0; + + exit_hwmsen_create_attr_failed: + exit_misc_register_failed: + + exit_err_sysfs: + + if (err) + { + ACC_ERR("sysfs node creation error \n"); + acc_input_destroy(acc_context_obj); + } + + real_driver_init_fail: + exit_alloc_input_dev_failed: + kfree(acc_context_obj); + + exit_alloc_data_failed: + + + ACC_LOG("----accel_probe fail !!!\n"); + return err; +} + + + +static int acc_remove(struct platform_device *pdev) +{ + ACC_FUN(f); + int err=0; + input_unregister_device(acc_context_obj->idev); + sysfs_remove_group(&acc_context_obj->idev->dev.kobj, + &acc_attribute_group); + + if((err = misc_deregister(&acc_context_obj->mdev))) + { + ACC_ERR("misc_deregister fail: %d\n", err); + } + kfree(acc_context_obj); + + return 0; +} + +static void acc_early_suspend(struct early_suspend *h) +{ + atomic_set(&(acc_context_obj->early_suspend), 1); + ACC_LOG(" acc_early_suspend ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(acc_context_obj->early_suspend))); + return ; +} +/*----------------------------------------------------------------------------*/ +static void acc_late_resume(struct early_suspend *h) +{ + atomic_set(&(acc_context_obj->early_suspend), 0); + ACC_LOG(" acc_late_resume ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(acc_context_obj->early_suspend))); + return ; +} + +static int acc_suspend(struct platform_device *dev, pm_message_t state) +{ + return 0; +} +/*----------------------------------------------------------------------------*/ +static int acc_resume(struct platform_device *dev) +{ + return 0; +} + +static struct platform_driver acc_driver = +{ + .probe = acc_probe, + .remove = acc_remove, + .suspend = acc_suspend, + .resume = acc_resume, + .driver = + { + .name = ACC_PL_DEV_NAME, + } +}; + +static int __init acc_init(void) +{ + ACC_FUN(); + + if(platform_driver_register(&acc_driver)) + { + ACC_ERR("failed to register acc driver\n"); + return -ENODEV; + } + + return 0; +} + +static void __exit acc_exit(void) +{ + platform_driver_unregister(&acc_driver); + platform_driver_unregister(&gsensor_driver); +} + +module_init(acc_init); +module_exit(acc_exit); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("ACCELEROMETER device driver"); +MODULE_AUTHOR("Mediatek"); + diff --git a/arch/arm/mach-mt8127/ford/accelerometer/accel.h b/arch/arm/mach-mt8127/ford/accelerometer/accel.h new file mode 100644 index 00000000000..034516d99ca --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/accel.h @@ -0,0 +1,123 @@ + +#ifndef __ACC_H__ +#define __ACC_H__ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define ACC_TAG " " +#define ACC_FUN(f) printk(KERN_ERR ACC_TAG"%s\n", __func__) +#define ACC_ERR(fmt, args...) printk(KERN_ERR ACC_TAG"%s %d : "fmt, __func__, __LINE__, ##args) +#define ACC_LOG(fmt, args...) printk(KERN_ERR ACC_TAG fmt, ##args) +#define ACC_VER(fmt, args...) printk(KERN_ERR ACC_TAG"%s: "fmt, __func__, ##args) //((void)0) + +#define OP_ACC_DELAY 0X01 +#define OP_ACC_ENABLE 0X02 +#define OP_ACC_GET_DATA 0X04 + +#define ACC_INVALID_VALUE -1 + +#define EVENT_TYPE_ACCEL_X ABS_X +#define EVENT_TYPE_ACCEL_Y ABS_Y +#define EVENT_TYPE_ACCEL_Z ABS_Z +#define EVENT_TYPE_ACCEL_STATUS ABS_WHEEL +#define EVENT_TYPE_ACCEL_DIV ABS_GAS + + +#define ACC_VALUE_MAX (32767) +#define ACC_VALUE_MIN (-32768) +#define ACC_STATUS_MIN (0) +#define ACC_STATUS_MAX (64) +#define ACC_DIV_MAX (32767) +#define ACC_DIV_MIN (1) + + +#define MAX_CHOOSE_G_NUM 5 + +struct acc_control_path +{ + int (*open_report_data)(int open);//open data rerport to HAL + int (*enable_nodata)(int en);//only enable not report event to HAL + int (*set_delay)(u64 delay); + int (*access_data_fifo)();//version2.used for flush operate + bool is_report_input_direct; + bool is_support_batch;//version2.used for batch mode support flag +}; + +struct acc_data_path +{ + int (*get_data)(int *x,int *y, int *z,int *status); + int vender_div; +}; + +struct acc_init_info +{ + char *name; + int (*init)(void); + int (*uninit)(void); + struct platform_driver* platform_diver_addr; +}; + +struct acc_data{ + hwm_sensor_data acc_data ; + int data_updata; + //struct mutex lock; +}; + +struct acc_drv_obj { + void *self; + int polling; + int (*acc_operate)(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout); +}; + +struct acc_context { + struct input_dev *idev; + struct miscdevice mdev; + struct work_struct report; + struct mutex acc_op_mutex; + atomic_t delay; /*polling period for reporting input event*/ + atomic_t wake; /*user-space request to wake-up, used with stop*/ + struct timer_list timer; /* polling timer */ + atomic_t trace; + + struct early_suspend early_drv; + atomic_t early_suspend; + //struct acc_drv_obj drv_obj; + struct acc_data drv_data; + struct acc_control_path acc_ctl; + struct acc_data_path acc_data; + bool is_active_nodata; // Active, but HAL don't need data sensor. such as orientation need + bool is_active_data; // Active and HAL need data . + bool is_first_data_after_enable; + bool is_polling_run; + bool is_batch_enable; //version2.this is used for judging whether sensor is in batch mode +}; + +//driver API for internal +//extern int acc_enable_nodata(int enable); +//extern int acc_attach(struct acc_drv_obj *obj); +//driver API for third party vendor + +//for auto detect +extern int acc_driver_add(struct acc_init_info* obj) ; +extern int acc_data_report(int x, int y, int z,int status); +extern int acc_register_control_path(struct acc_control_path *ctl); +extern int acc_register_data_path(struct acc_data_path *data); + + + + + +#endif diff --git a/arch/arm/mach-mt8127/ford/accelerometer/cust_acc.c b/arch/arm/mach-mt8127/ford/accelerometer/cust_acc.c new file mode 100644 index 00000000000..88d72fb66f6 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/cust_acc.c @@ -0,0 +1,18 @@ +#include +#include +#include + + +/*---------------------------------------------------------------------------*/ +static struct acc_hw cust_acc_hw = { + .i2c_num = 2, + .direction = 7, + .power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ + .power_vol= VOL_DEFAULT, /*!< LDO is not used */ + .firlen = 0, //old value 16 /*!< don't enable low pass fileter */ +}; +/*---------------------------------------------------------------------------*/ +struct acc_hw* get_cust_acc_hw(void) +{ + return &cust_acc_hw; +} diff --git a/arch/arm/mach-mt8127/ford/accelerometer/inc/cust_acc.h b/arch/arm/mach-mt8127/ford/accelerometer/inc/cust_acc.h new file mode 100644 index 00000000000..3bcb8dbb185 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/inc/cust_acc.h @@ -0,0 +1,22 @@ +#ifndef __CUST_ACC_H__ +#define __CUST_ACC_H__ + +#include + +#define G_CUST_I2C_ADDR_NUM 2 + +struct acc_hw { + int i2c_num; /*!< the i2c bus used by the chip */ + int direction; /*!< the direction of the chip */ + int power_id; /*!< the VDD LDO ID of the chip, MT6516_POWER_NONE means the power is always on*/ + int power_vol; /*!< the VDD Power Voltage used by the chip */ + int firlen; /*!< the length of low pass filter */ + int (*power)(struct acc_hw *hw, unsigned int on, char *devname); + unsigned char i2c_addr[G_CUST_I2C_ADDR_NUM]; /*!< i2c address list,for chips which has different addresses with different HW layout */ + int power_vio_id; /*!< the VIO LDO ID of the chip, MT6516_POWER_NONE means the power is always on*/ + int power_vio_vol; /*!< the VIO Power Voltage used by the chip */ + bool is_batch_supported; +}; + +extern struct acc_hw* get_cust_acc_hw(void); +#endif diff --git a/arch/arm/mach-mt8127/ford/accelerometer/mpu6050.c b/arch/arm/mach-mt8127/ford/accelerometer/mpu6050.c new file mode 100644 index 00000000000..45f8e2c9cab --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/mpu6050.c @@ -0,0 +1,2249 @@ +/* MPU6050 motion sensor driver + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "mpu6050.h" +#include + +#include +#include +#include + +#define POWER_NONE_MACRO MT65XX_POWER_NONE + +/*----------------------------------------------------------------------------*/ +#define DEBUG 1 +/*----------------------------------------------------------------------------*/ +#define CONFIG_MPU6050_LOWPASS /*apply low pass filter on output*/ +#define SW_CALIBRATION +/*----------------------------------------------------------------------------*/ +#define MPU6050_AXIS_X 0 +#define MPU6050_AXIS_Y 1 +#define MPU6050_AXIS_Z 2 +#define MPU6050_AXES_NUM 3 +#define MPU6050_DATA_LEN 6 +#define MPU6050_DEV_NAME "MPU6050G" /* name must different with gyro mpu6050 */ +/*----------------------------------------------------------------------------*/ +static const struct i2c_device_id mpu6050_i2c_id[] = {{MPU6050_DEV_NAME,0},{}}; +static struct i2c_board_info __initdata i2c_mpu6050={ I2C_BOARD_INFO(MPU6050_DEV_NAME, (MPU6050_I2C_SLAVE_ADDR>>1))}; + +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int mpu6050_i2c_remove(struct i2c_client *client); +static int mpu6050_i2c_detect(struct i2c_client *client, struct i2c_board_info *info); +#ifndef CONFIG_HAS_EARLYSUSPEND +static int mpu6050_suspend(struct i2c_client *client, pm_message_t msg) ; +static int mpu6050_resume(struct i2c_client *client); +#endif +/*----------------------------------------------------------------------------*/ +typedef enum +{ + MPU6050_TRC_FILTER = 0x01, + MPU6050_TRC_RAWDATA = 0x02, + MPU6050_TRC_IOCTL = 0x04, + MPU6050_TRC_CALI = 0X08, + MPU6050_TRC_INFO = 0X10, +} MPU6050_TRC; +/*----------------------------------------------------------------------------*/ +struct scale_factor +{ + u8 whole; + u8 fraction; +}; +/*----------------------------------------------------------------------------*/ +struct data_resolution +{ + struct scale_factor scalefactor; + int sensitivity; +}; +/*----------------------------------------------------------------------------*/ +#define C_MAX_FIR_LENGTH (32) +/*----------------------------------------------------------------------------*/ +struct data_filter +{ + s16 raw[C_MAX_FIR_LENGTH][MPU6050_AXES_NUM]; + int sum[MPU6050_AXES_NUM]; + int num; + int idx; +}; +/*----------------------------------------------------------------------------*/ +struct mpu6050_i2c_data +{ + struct i2c_client *client; + struct acc_hw *hw; + struct hwmsen_convert cvt; + + /*misc*/ + struct data_resolution *reso; + atomic_t trace; + atomic_t suspend; + atomic_t selftest; + atomic_t filter; + s16 cali_sw[MPU6050_AXES_NUM+1]; + + /*data*/ + s8 offset[MPU6050_AXES_NUM+1]; /*+1: for 4-byte alignment*/ + s16 data[MPU6050_AXES_NUM+1]; + +#if defined(CONFIG_MPU6050_LOWPASS) + atomic_t firlen; + atomic_t fir_en; + struct data_filter fir; +#endif + /*early suspend*/ +#if defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_drv; +#endif + u8 bandwidth; +}; +/*----------------------------------------------------------------------------*/ +static struct i2c_driver mpu6050_i2c_driver = { + .driver = { + .name = MPU6050_DEV_NAME, + }, + .probe = mpu6050_i2c_probe, + .remove = mpu6050_i2c_remove, + .detect = mpu6050_i2c_detect, +#if !defined(CONFIG_HAS_EARLYSUSPEND) + .suspend = mpu6050_suspend, + .resume = mpu6050_resume, +#endif + .id_table = mpu6050_i2c_id, +}; + +/*----------------------------------------------------------------------------*/ +static struct i2c_client *mpu6050_i2c_client = NULL; +static struct platform_driver mpu6050_gsensor_driver; +static struct mpu6050_i2c_data *obj_i2c_data = NULL; +static bool sensor_power = false; +static GSENSOR_VECTOR3D gsensor_gain; +static char selftestRes[8]= {0}; + + +/*----------------------------------------------------------------------------*/ +#define GSE_TAG "[Gsensor] " +#define GSE_FUN(f) printk(GSE_TAG"%s\n", __FUNCTION__) +#define GSE_ERR(fmt, args...) printk(GSE_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) +#define GSE_LOG(fmt, args...) printk(GSE_TAG fmt, ##args) +/*----------------------------------------------------------------------------*/ +static struct data_resolution mpu6050_data_resolution[] = { + /*8 combination by {FULL_RES,RANGE}*/ + {{ 0, 6}, 16384}, /*+/-2g in 16-bit resolution: 0.06 mg/LSB*/ + {{ 0, 12}, 8192}, /*+/-4g in 16-bit resolution: 0.12 mg/LSB*/ + {{ 0, 24}, 4096}, /*+/-8g in 16-bit resolution: 0.24 mg/LSB*/ + {{ 0, 5}, 2048}, /*+/-16g in 16-bit resolution: 0.49 mg/LSB*/ +}; +/*----------------------------------------------------------------------------*/ +static struct data_resolution mpu6050_offset_resolution = {{ 0, 5}, 2048}; + +static unsigned int power_on = 0; + +extern int MPU6050_gyro_power(void); +extern int MPU6050_gyro_mode(void); + + +int MPU6050_gse_power( void) +{ + return(power_on); +} +EXPORT_SYMBOL(MPU6050_gse_power); + +int MPU6050_gse_mode(void) +{ + return sensor_power; +} +EXPORT_SYMBOL(MPU6050_gse_mode); + + +int MPU6050_i2c_master_send(u8 *buf, u8 len) +{ + int res = 0; + if (NULL == mpu6050_i2c_client) + { + GSE_ERR("MPU6050_i2c_master_send null ptr!!\n"); + } + else + { + res = i2c_master_send(mpu6050_i2c_client, buf, len); + } + + return res; +} +EXPORT_SYMBOL(MPU6050_i2c_master_send); + +int MPU6050_i2c_master_recv(u8 *buf, u8 len) +{ + int res = 0; + if (NULL == mpu6050_i2c_client) + { + GSE_ERR("MPU6050_i2c_master_recv null ptr!!\n"); + } + else + { + res = i2c_master_recv(mpu6050_i2c_client, buf, len); + } + + return res; +} +EXPORT_SYMBOL(MPU6050_i2c_master_recv); +/*----------------------------------------------------------------------------*/ +static int mpu_i2c_read_block(struct i2c_client *client, u8 addr, u8 *data, u8 len){ + u8 beg = addr; + struct i2c_msg msgs[2] = { + { + .addr = client->addr, .flags = 0, + .len = 1, .buf = &beg + }, + { + .addr = client->addr, .flags = I2C_M_RD, + .len = len, .buf = data, + } + }; + int err; + + if (!client) + return -EINVAL; + else if (len > C_I2C_FIFO_SIZE) { + GSE_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE); + return -EINVAL; + } + + err = i2c_transfer(client->adapter, msgs, sizeof(msgs)/sizeof(msgs[0])); + if (err != 2) { + GSE_ERR("i2c_transfer error: (%d %p %d) %d\n", + addr, data, len, err); + err = -EIO; + } else { + err = 0; + } + return err; + +} +int MPU6050_hwmsen_read_block(u8 addr, u8 *buf, u8 len) +{ + if (NULL == mpu6050_i2c_client) + { + GSE_ERR("MPU6050_hwmsen_read_block null ptr!!\n"); + return MPU6050_ERR_I2C; + } + return mpu_i2c_read_block(mpu6050_i2c_client, addr, buf, len); +} +EXPORT_SYMBOL(MPU6050_hwmsen_read_block); + + +int MPU6050_hwmsen_read_byte(u8 addr, u8 *buf) +{ + if (NULL == mpu6050_i2c_client) + { + GSE_ERR("MPU6050_hwmsen_read_byte null ptr!!\n"); + return MPU6050_ERR_I2C; + } + return mpu_i2c_read_block(mpu6050_i2c_client, addr, buf, 1); +} +EXPORT_SYMBOL(MPU6050_hwmsen_read_byte); +/*--------------------mpu6050 power control function----------------------------------*/ +static void MPU6050_power(struct acc_hw *hw, unsigned int on) +{ + + + if (hw->power_id != POWER_NONE_MACRO) // have externel LDO + { + GSE_LOG("power %s\n", on ? "on" : "off"); + if (power_on == on) // power status not change + { + GSE_LOG("ignore power control: %d\n", on); + } + else if (on) // power on + { + if (!hwPowerOn(hw->power_id, hw->power_vol, "MPU6050G")) + { + GSE_ERR("power on fails!!\n"); + } + } + else // power off + { + if (MPU6050_gyro_power() == false) + { + if (!hwPowerDown(hw->power_id, "MPU6050G")) + { + GSE_ERR("power off fail!!\n"); + } + } + } + } + power_on = on; +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_SetPowerMode(struct i2c_client *client, bool enable) +{ + u8 databuf[2]; + int res = 0; + //u8 addr = MPU6050_REG_POWER_CTL; + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + + + if (enable == sensor_power) + { + GSE_LOG("Sensor power status is newest!\n"); + return MPU6050_SUCCESS; + } + + databuf[0] = MPU6050_REG_POWER_CTL; + res = i2c_master_send(client, databuf, 0x1); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + udelay(500); + + databuf[0] = 0x0; + /* + res = i2c_master_recv(client, databuf, 1); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + */ + + databuf[0] &= ~MPU6050_SLEEP; + + if (enable == FALSE) + { + if (MPU6050_gyro_mode() == false) + { + databuf[0] |= MPU6050_SLEEP; + } + } + else + { + // do nothing + } + databuf[1] = databuf[0]; + databuf[0] = MPU6050_REG_POWER_CTL; + + res = i2c_master_send(client, databuf, 0x2); + + if (res <= 0) + { + GSE_LOG("set power mode failed!\n"); + return MPU6050_ERR_I2C; + } + else if (atomic_read(&obj->trace) & MPU6050_TRC_INFO) + { + GSE_LOG("set power mode ok %d!\n", databuf[1]); + } + + msleep(200); + + sensor_power = enable; + return MPU6050_SUCCESS; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_SetDataResolution(struct mpu6050_i2c_data *obj) +{ + int err; + u8 dat, reso; + + if ((err = mpu_i2c_read_block(obj->client, MPU6050_REG_DATA_FORMAT, &dat, 1))) + { + GSE_ERR("write data format fail!!\n"); + return err; + } + + /*the data_reso is combined by 3 bits: {FULL_RES, DATA_RANGE}*/ + reso = 0x00; + reso = (dat & MPU6050_RANGE_16G) >> 3; + + if (reso < sizeof(mpu6050_data_resolution)/sizeof(mpu6050_data_resolution[0])) + { + obj->reso = &mpu6050_data_resolution[reso]; + return 0; + } + else + { + return -EINVAL; + } +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadData(struct i2c_client *client, s16 data[MPU6050_AXES_NUM]) +{ + struct mpu6050_i2c_data *priv = i2c_get_clientdata(client); + u8 buf[MPU6050_DATA_LEN] = {0}; + int err = 0; + + + if (NULL == client) + { + return -EINVAL; + } + + { + /* write then burst read */ + mpu_i2c_read_block(client, MPU6050_REG_DATAX0, buf, MPU6050_DATA_LEN); + + data[MPU6050_AXIS_X] = (s16)((buf[MPU6050_AXIS_X*2] << 8) | + (buf[MPU6050_AXIS_X*2+1] )); + data[MPU6050_AXIS_Y] = (s16)((buf[MPU6050_AXIS_Y*2] << 8) | + (buf[MPU6050_AXIS_Y*2+1] )); + data[MPU6050_AXIS_Z] = (s16)((buf[MPU6050_AXIS_Z*2] << 8) | + (buf[MPU6050_AXIS_Z*2+1] )); + + if (atomic_read(&priv->trace) & MPU6050_TRC_RAWDATA) + { + GSE_LOG("[%08X %08X %08X] => [%5d %5d %5d]\n", data[MPU6050_AXIS_X], data[MPU6050_AXIS_Y], data[MPU6050_AXIS_Z], + data[MPU6050_AXIS_X], data[MPU6050_AXIS_Y], data[MPU6050_AXIS_Z]); + } +#ifdef CONFIG_MPU6050_LOWPASS + if (atomic_read(&priv->filter)) + { + if (atomic_read(&priv->fir_en) && !atomic_read(&priv->suspend)) + { + int idx, firlen = atomic_read(&priv->firlen); + if (priv->fir.num < firlen) + { + priv->fir.raw[priv->fir.num][MPU6050_AXIS_X] = data[MPU6050_AXIS_X]; + priv->fir.raw[priv->fir.num][MPU6050_AXIS_Y] = data[MPU6050_AXIS_Y]; + priv->fir.raw[priv->fir.num][MPU6050_AXIS_Z] = data[MPU6050_AXIS_Z]; + priv->fir.sum[MPU6050_AXIS_X] += data[MPU6050_AXIS_X]; + priv->fir.sum[MPU6050_AXIS_Y] += data[MPU6050_AXIS_Y]; + priv->fir.sum[MPU6050_AXIS_Z] += data[MPU6050_AXIS_Z]; + if (atomic_read(&priv->trace) & MPU6050_TRC_FILTER) + { + GSE_LOG("add [%2d] [%5d %5d %5d] => [%5d %5d %5d]\n", priv->fir.num, + priv->fir.raw[priv->fir.num][MPU6050_AXIS_X], priv->fir.raw[priv->fir.num][MPU6050_AXIS_Y], priv->fir.raw[priv->fir.num][MPU6050_AXIS_Z], + priv->fir.sum[MPU6050_AXIS_X], priv->fir.sum[MPU6050_AXIS_Y], priv->fir.sum[MPU6050_AXIS_Z]); + } + priv->fir.num++; + priv->fir.idx++; + } + else + { + idx = priv->fir.idx % firlen; + priv->fir.sum[MPU6050_AXIS_X] -= priv->fir.raw[idx][MPU6050_AXIS_X]; + priv->fir.sum[MPU6050_AXIS_Y] -= priv->fir.raw[idx][MPU6050_AXIS_Y]; + priv->fir.sum[MPU6050_AXIS_Z] -= priv->fir.raw[idx][MPU6050_AXIS_Z]; + priv->fir.raw[idx][MPU6050_AXIS_X] = data[MPU6050_AXIS_X]; + priv->fir.raw[idx][MPU6050_AXIS_Y] = data[MPU6050_AXIS_Y]; + priv->fir.raw[idx][MPU6050_AXIS_Z] = data[MPU6050_AXIS_Z]; + priv->fir.sum[MPU6050_AXIS_X] += data[MPU6050_AXIS_X]; + priv->fir.sum[MPU6050_AXIS_Y] += data[MPU6050_AXIS_Y]; + priv->fir.sum[MPU6050_AXIS_Z] += data[MPU6050_AXIS_Z]; + priv->fir.idx++; + data[MPU6050_AXIS_X] = priv->fir.sum[MPU6050_AXIS_X]/firlen; + data[MPU6050_AXIS_Y] = priv->fir.sum[MPU6050_AXIS_Y]/firlen; + data[MPU6050_AXIS_Z] = priv->fir.sum[MPU6050_AXIS_Z]/firlen; + if (atomic_read(&priv->trace) & MPU6050_TRC_FILTER) + { + GSE_LOG("add [%2d] [%5d %5d %5d] => [%5d %5d %5d] : [%5d %5d %5d]\n", idx, + priv->fir.raw[idx][MPU6050_AXIS_X], priv->fir.raw[idx][MPU6050_AXIS_Y], priv->fir.raw[idx][MPU6050_AXIS_Z], + priv->fir.sum[MPU6050_AXIS_X], priv->fir.sum[MPU6050_AXIS_Y], priv->fir.sum[MPU6050_AXIS_Z], + data[MPU6050_AXIS_X], data[MPU6050_AXIS_Y], data[MPU6050_AXIS_Z]); + } + } + } + } +#endif + } + return err; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadOffset(struct i2c_client *client, s8 ofs[MPU6050_AXES_NUM]) +{ + int err = 0; +#ifdef SW_CALIBRATION + ofs[0]=ofs[1]=ofs[2]=0x0; +#else + if ((err = mpu_i2c_read_block(client, MPU6050_REG_OFSX, ofs, MPU6050_AXES_NUM))) + { + GSE_ERR("error: %d\n", err); + } +#endif + //GSE_LOG("offesx=%x, y=%x, z=%x",ofs[0],ofs[1],ofs[2]); + + return err; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ResetCalibration(struct i2c_client *client) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); +#ifndef SW_CALIBRATION + s8 ofs[MPU6050_AXES_NUM] = {0x00, 0x00, 0x00}; +#endif + int err = 0; +#ifdef SW_CALIBRATION + /* do not thing */ +#else + + if ((err = hwmsen_write_block(client, MPU6050_REG_OFSX, ofs, MPU6050_AXES_NUM))) + { + GSE_ERR("error: %d\n", err); + } +#endif + + memset(obj->cali_sw, 0x00, sizeof(obj->cali_sw)); + memset(obj->offset, 0x00, sizeof(obj->offset)); + + return err; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadCalibration(struct i2c_client *client, int dat[MPU6050_AXES_NUM]) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); +#ifdef SW_CALIBRATION + int mul; +#else + int err; +#endif +#ifdef SW_CALIBRATION + mul = 0;//only SW Calibration, disable HW Calibration +#else + + if ((err = MPU6050_ReadOffset(client, obj->offset))) + { + GSE_ERR("read offset fail, %d\n", err); + return err; + } + mul = obj->reso->sensitivity/mpu6050_offset_resolution.sensitivity; +#endif + + dat[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*(obj->offset[MPU6050_AXIS_X]*mul + obj->cali_sw[MPU6050_AXIS_X]); + dat[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*(obj->offset[MPU6050_AXIS_Y]*mul + obj->cali_sw[MPU6050_AXIS_Y]); + dat[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*(obj->offset[MPU6050_AXIS_Z]*mul + obj->cali_sw[MPU6050_AXIS_Z]); + + return 0; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadCalibrationEx(struct i2c_client *client, int act[MPU6050_AXES_NUM], int raw[MPU6050_AXES_NUM]) +{ + /*raw: the raw calibration data; act: the actual calibration data*/ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); +#ifdef SW_CALIBRATION + int mul; +#else + int err; +#endif +#ifdef SW_CALIBRATION + mul = 0;//only SW Calibration, disable HW Calibration +#else + + if ((err = MPU6050_ReadOffset(client, obj->offset))) + { + GSE_ERR("read offset fail, %d\n", err); + return err; + } + mul = obj->reso->sensitivity/mpu6050_offset_resolution.sensitivity; +#endif + + raw[MPU6050_AXIS_X] = obj->offset[MPU6050_AXIS_X]*mul + obj->cali_sw[MPU6050_AXIS_X]; + raw[MPU6050_AXIS_Y] = obj->offset[MPU6050_AXIS_Y]*mul + obj->cali_sw[MPU6050_AXIS_Y]; + raw[MPU6050_AXIS_Z] = obj->offset[MPU6050_AXIS_Z]*mul + obj->cali_sw[MPU6050_AXIS_Z]; + + act[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*raw[MPU6050_AXIS_X]; + act[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*raw[MPU6050_AXIS_Y]; + act[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*raw[MPU6050_AXIS_Z]; + + return 0; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_WriteCalibration(struct i2c_client *client, int dat[MPU6050_AXES_NUM]) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int err; + int cali[MPU6050_AXES_NUM], raw[MPU6050_AXES_NUM]; +#ifndef SW_CALIBRATION + int lsb = mpu6050_offset_resolution.sensitivity; + int divisor = obj->reso->sensitivity/lsb; +#endif + if ((err = MPU6050_ReadCalibrationEx(client, cali, raw))) /*offset will be updated in obj->offset*/ + { + GSE_ERR("read offset fail, %d\n", err); + return err; + } + + GSE_LOG("OLDOFF: (%+3d %+3d %+3d): (%+3d %+3d %+3d) / (%+3d %+3d %+3d)\n", + raw[MPU6050_AXIS_X], raw[MPU6050_AXIS_Y], raw[MPU6050_AXIS_Z], + obj->offset[MPU6050_AXIS_X], obj->offset[MPU6050_AXIS_Y], obj->offset[MPU6050_AXIS_Z], + obj->cali_sw[MPU6050_AXIS_X], obj->cali_sw[MPU6050_AXIS_Y], obj->cali_sw[MPU6050_AXIS_Z]); + + /*calculate the real offset expected by caller*/ + cali[MPU6050_AXIS_X] += dat[MPU6050_AXIS_X]; + cali[MPU6050_AXIS_Y] += dat[MPU6050_AXIS_Y]; + cali[MPU6050_AXIS_Z] += dat[MPU6050_AXIS_Z]; + + GSE_LOG("UPDATE: (%+3d %+3d %+3d)\n", + dat[MPU6050_AXIS_X], dat[MPU6050_AXIS_Y], dat[MPU6050_AXIS_Z]); +#ifdef SW_CALIBRATION + obj->cali_sw[MPU6050_AXIS_X] = obj->cvt.sign[MPU6050_AXIS_X]*(cali[obj->cvt.map[MPU6050_AXIS_X]]); + obj->cali_sw[MPU6050_AXIS_Y] = obj->cvt.sign[MPU6050_AXIS_Y]*(cali[obj->cvt.map[MPU6050_AXIS_Y]]); + obj->cali_sw[MPU6050_AXIS_Z] = obj->cvt.sign[MPU6050_AXIS_Z]*(cali[obj->cvt.map[MPU6050_AXIS_Z]]); +#else + + obj->offset[MPU6050_AXIS_X] = (s8)(obj->cvt.sign[MPU6050_AXIS_X]*(cali[obj->cvt.map[MPU6050_AXIS_X]])/(divisor)); + obj->offset[MPU6050_AXIS_Y] = (s8)(obj->cvt.sign[MPU6050_AXIS_Y]*(cali[obj->cvt.map[MPU6050_AXIS_Y]])/(divisor)); + obj->offset[MPU6050_AXIS_Z] = (s8)(obj->cvt.sign[MPU6050_AXIS_Z]*(cali[obj->cvt.map[MPU6050_AXIS_Z]])/(divisor)); + + /*convert software calibration using standard calibration*/ + obj->cali_sw[MPU6050_AXIS_X] = obj->cvt.sign[MPU6050_AXIS_X]*(cali[obj->cvt.map[MPU6050_AXIS_X]])%(divisor); + obj->cali_sw[MPU6050_AXIS_Y] = obj->cvt.sign[MPU6050_AXIS_Y]*(cali[obj->cvt.map[MPU6050_AXIS_Y]])%(divisor); + obj->cali_sw[MPU6050_AXIS_Z] = obj->cvt.sign[MPU6050_AXIS_Z]*(cali[obj->cvt.map[MPU6050_AXIS_Z]])%(divisor); + + GSE_LOG("NEWOFF: (%+3d %+3d %+3d): (%+3d %+3d %+3d) / (%+3d %+3d %+3d)\n", + obj->offset[MPU6050_AXIS_X]*divisor + obj->cali_sw[MPU6050_AXIS_X], + obj->offset[MPU6050_AXIS_Y]*divisor + obj->cali_sw[MPU6050_AXIS_Y], + obj->offset[MPU6050_AXIS_Z]*divisor + obj->cali_sw[MPU6050_AXIS_Z], + obj->offset[MPU6050_AXIS_X], obj->offset[MPU6050_AXIS_Y], obj->offset[MPU6050_AXIS_Z], + obj->cali_sw[MPU6050_AXIS_X], obj->cali_sw[MPU6050_AXIS_Y], obj->cali_sw[MPU6050_AXIS_Z]); + + if ((err = hwmsen_write_block(obj->client, MPU6050_REG_OFSX, obj->offset, MPU6050_AXES_NUM))) + { + GSE_ERR("write offset fail: %d\n", err); + return err; + } +#endif + + return err; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_CheckDeviceID(struct i2c_client *client) +{ + u8 databuf[10]; + int res = 0; + + memset(databuf, 0, sizeof(u8)*10); + databuf[0] = MPU6050_REG_DEVID; + + res = i2c_master_send(client, databuf, 0x1); + if (res <= 0) + { + goto exit_MPU6050_CheckDeviceID; + } + + udelay(500); + + databuf[0] = 0x0; + res = i2c_master_recv(client, databuf, 0x01); + if (res <= 0) + { + goto exit_MPU6050_CheckDeviceID; + } + + GSE_LOG("MPU6050_CheckDeviceID 0x%x\n", databuf[0]); + + exit_MPU6050_CheckDeviceID: + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + return MPU6050_SUCCESS; +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_SetDataFormat(struct i2c_client *client, u8 dataformat) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + u8 databuf[2]; + int res = 0; + + memset(databuf, 0, sizeof(u8)*2); + databuf[0] = MPU6050_REG_DATA_FORMAT; + res = i2c_master_send(client, databuf, 0x1); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + udelay(500); + + databuf[0] = 0x0; + res = i2c_master_recv(client, databuf, 0x01); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + /* write */ + databuf[1] = databuf[0] | dataformat; + databuf[0] = MPU6050_REG_DATA_FORMAT; + res = i2c_master_send(client, databuf, 0x2); + + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + return MPU6050_SetDataResolution(obj); +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_SetBWRate(struct i2c_client *client, u8 bwrate) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + u8 databuf[10]; + int res = 0; + + if( (obj->bandwidth != bwrate) || (atomic_read(&obj->suspend)) ) + { + memset(databuf, 0, sizeof(u8)*10); + + /* read */ + databuf[0] = MPU6050_REG_BW_RATE; + res = i2c_master_send(client, databuf, 0x1); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + udelay(500); + + databuf[0] = 0x0; + res = i2c_master_recv(client, databuf, 0x01); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + + /* write */ + databuf[1] = databuf[0] | bwrate; + databuf[0] = MPU6050_REG_BW_RATE; + + res = i2c_master_send(client, databuf, 0x2); + + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + obj->bandwidth = bwrate; + } + + return MPU6050_SUCCESS; +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_Dev_Reset(struct i2c_client *client) +{ + u8 databuf[10]; + int res = 0; + + memset(databuf, 0, sizeof(u8)*10); + + /* read */ + databuf[0] = MPU6050_REG_POWER_CTL; + res = i2c_master_send(client, databuf, 0x1); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + udelay(500); + + databuf[0] = 0x0; + res = i2c_master_recv(client, databuf, 0x01); + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + + /* write */ + databuf[1] = databuf[0] | MPU6050_DEV_RESET; + databuf[0] = MPU6050_REG_POWER_CTL; + + res = i2c_master_send(client, databuf, 0x2); + + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + do + { + databuf[0] = MPU6050_REG_POWER_CTL; + res = i2c_master_send(client, databuf, 0x1); + + udelay(500); + + databuf[0] = 0x0; + res = i2c_master_recv(client, databuf, 0x01); + + printk("[Gsensor] check reset bit"); + + }while((databuf[0]&MPU6050_DEV_RESET) != 0); + + msleep(50); + return MPU6050_SUCCESS; +} + + +/*----------------------------------------------------------------------------*/ +static int MPU6050_Reset(struct i2c_client *client) +{ + u8 databuf[10]; + int res = 0; + + /* write */ + databuf[1] = 0x7; /* reset gyro, g-sensor, temperature */ + databuf[0] = MPU6050_REG_RESET; + + res = i2c_master_send(client, databuf, 0x2); + + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + msleep(20); + return MPU6050_SUCCESS; +} + + +/*----------------------------------------------------------------------------*/ +static int MPU6050_SetIntEnable(struct i2c_client *client, u8 intenable) +{ + u8 databuf[2]; + int res = 0; + + memset(databuf, 0, sizeof(u8)*2); + databuf[0] = MPU6050_REG_INT_ENABLE; + databuf[1] = intenable; + + res = i2c_master_send(client, databuf, 0x2); + + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + return MPU6050_SUCCESS; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_gpio_config(void) +{ +//because we donot use EINT to support low power +// config to GPIO input mode + PD + +//set to GPIO_GSE_1_EINT_PIN + /* + mt_set_gpio_mode(GPIO_GSE_1_EINT_PIN, GPIO_GSE_1_EINT_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_GSE_1_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_GSE_1_EINT_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(GPIO_GSE_1_EINT_PIN, GPIO_PULL_DOWN); + */ +//set to GPIO_GSE_2_EINT_PIN + /* + mt_set_gpio_mode(GPIO_GSE_2_EINT_PIN, GPIO_GSE_2_EINT_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_GSE_2_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_GSE_2_EINT_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(GPIO_GSE_2_EINT_PIN, GPIO_PULL_DOWN); + */ + return 0; +} + +static int mpu6050_init_client(struct i2c_client *client, int reset_cali) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int res = 0; + bool sensor_power_org; + + mpu6050_gpio_config(); + + sensor_power_org = sensor_power; + res = MPU6050_SetPowerMode(client, true); + if (res != MPU6050_SUCCESS) + { + GSE_ERR("set power error\n"); + return res; + } + res = MPU6050_CheckDeviceID(client); + if (res != MPU6050_SUCCESS) + { + GSE_ERR("Check ID error\n"); + return res; + } + + res = MPU6050_SetBWRate(client, MPU6050_BW_184HZ); + if (res != MPU6050_SUCCESS ) //0x2C->BW=100Hz + { + GSE_ERR("set power error\n"); + return res; + } + + res = MPU6050_SetDataFormat(client, MPU6050_RANGE_16G); + if (res != MPU6050_SUCCESS) //0x2C->BW=100Hz + { + GSE_ERR("set data format error\n"); + return res; + } + + gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = obj->reso->sensitivity; + + res = MPU6050_SetIntEnable(client, 0x00);//disable INT + if (res != MPU6050_SUCCESS) + { + GSE_ERR("mpu6050_SetIntEnable error\n"); + return res; + } + + if (0 != reset_cali) + { + /*reset calibration only in power on*/ + res = MPU6050_ResetCalibration(client); + if (res != MPU6050_SUCCESS) + { + return res; + } + } + + res = MPU6050_SetPowerMode(client, sensor_power_org); + if (res != MPU6050_SUCCESS) + { + GSE_ERR("set power error\n"); + return res; + } + +#ifdef CONFIG_MPU6050_LOWPASS + memset(&obj->fir, 0x00, sizeof(obj->fir)); +#endif + msleep(20); + return MPU6050_SUCCESS; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadAllReg(struct i2c_client *client, char *buf, int bufsize) +{ + u8 total_len= 0x5C; //(0x75-0x19); + + u8 addr = 0x19; + u8 buff[total_len+1]; + int err = 0; + int i; + + + if (sensor_power == FALSE) + { + err = MPU6050_SetPowerMode(client, true); + if (err) + { + GSE_ERR("Power on mpu6050 error %d!\n", err); + } + } + + mpu_i2c_read_block(client, addr, buff, total_len); + + for ( i=0; i<=total_len; i++) + { + GSE_LOG("MPU6050 reg=0x%x, data=0x%x \n",(addr+i), buff[i]); + } + + return 0; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadChipInfo(struct i2c_client *client, char *buf, int bufsize) +{ + u8 databuf[10]; + + memset(databuf, 0, sizeof(u8)*10); + + if ((NULL == buf)||(bufsize<=30)) + { + return -1; + } + + if (NULL == client) + { + *buf = 0; + return -2; + } + + sprintf(buf, "MPU6050 Chip"); + return 0; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadSensorData(struct i2c_client *client, char *buf, int bufsize) +{ + struct mpu6050_i2c_data *obj = obj_i2c_data; //(struct mpu6050_i2c_data*)i2c_get_clientdata(client); + int acc[MPU6050_AXES_NUM]; + int res = 0; + client = obj->client; + + if (atomic_read(&obj->suspend)) + { + return -3; + } + + if (NULL == buf) + { + return -1; + } + if (NULL == client) + { + *buf = 0; + return -2; + } + + if (sensor_power == FALSE) + { + res = MPU6050_SetPowerMode(client, true); + if (res) + { + GSE_ERR("Power on mpu6050 error %d!\n", res); + } + } + + if ((res = MPU6050_ReadData(client, obj->data))) + { + GSE_ERR("I2C error: ret value=%d", res); + return -3; + } + else + { + obj->data[MPU6050_AXIS_X] += obj->cali_sw[MPU6050_AXIS_X]; + obj->data[MPU6050_AXIS_Y] += obj->cali_sw[MPU6050_AXIS_Y]; + obj->data[MPU6050_AXIS_Z] += obj->cali_sw[MPU6050_AXIS_Z]; + + /*remap coordinate*/ + acc[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->data[MPU6050_AXIS_X]; + acc[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->data[MPU6050_AXIS_Y]; + acc[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->data[MPU6050_AXIS_Z]; + + //Out put the mg + acc[MPU6050_AXIS_X] = acc[MPU6050_AXIS_X] * GRAVITY_EARTH_1000 / obj->reso->sensitivity; + acc[MPU6050_AXIS_Y] = acc[MPU6050_AXIS_Y] * GRAVITY_EARTH_1000 / obj->reso->sensitivity; + acc[MPU6050_AXIS_Z] = acc[MPU6050_AXIS_Z] * GRAVITY_EARTH_1000 / obj->reso->sensitivity; + + sprintf(buf, "%04x %04x %04x", acc[MPU6050_AXIS_X], acc[MPU6050_AXIS_Y], acc[MPU6050_AXIS_Z]); + if (atomic_read(&obj->trace) & MPU6050_TRC_IOCTL) + { + GSE_LOG("gsensor data: %s!\n", buf); + } + } + + return 0; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadRawData(struct i2c_client *client, char *buf) +{ + struct mpu6050_i2c_data *obj = (struct mpu6050_i2c_data*)i2c_get_clientdata(client); + int res = 0; + + if (!buf || !client) + { + return EINVAL; + } + + + if (atomic_read(&obj->suspend)) + { + return EIO; + } + + if ((res = MPU6050_ReadData(client, obj->data))) + { + GSE_ERR("I2C error: ret value=%d", res); + return EIO; + } + else + { + sprintf(buf, "%04x %04x %04x", obj->data[MPU6050_AXIS_X], + obj->data[MPU6050_AXIS_Y], obj->data[MPU6050_AXIS_Z]); + + } + + return 0; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_InitSelfTest(struct i2c_client *client) +{ + int res = 0; + u8 data; + + res = MPU6050_SetPowerMode(client, true); + if (res != MPU6050_SUCCESS) + { + GSE_ERR("set power error\n"); + return res; + } + + res = MPU6050_SetBWRate(client, MPU6050_BW_184HZ); + if (res != MPU6050_SUCCESS ) //0x2C->BW=100Hz + { + return res; + } + + res = mpu_i2c_read_block(client, MPU6050_REG_DATA_FORMAT, &data, 1); + + if (res != MPU6050_SUCCESS) + { + return res; + } + + return MPU6050_SUCCESS; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_JudgeTestResult(struct i2c_client *client, s32 prv[MPU6050_AXES_NUM], s32 nxt[MPU6050_AXES_NUM]) +{ + struct criteria + { + int min; + int max; + }; + + struct criteria self[4][3] = { + {{ 0, 540}, { 0, 540}, { 0, 875}}, + {{ 0, 270}, { 0, 270}, { 0, 438}}, + {{ 0, 135}, { 0, 135}, { 0, 219}}, + {{ 0, 67}, { 0, 67}, { 0, 110}}, + }; + struct criteria (*ptr)[3] = NULL; + u8 format; + int res; + if ((res = mpu_i2c_read_block(client, MPU6050_REG_DATA_FORMAT, &format, 1))) + return res; + + format = format & MPU6050_RANGE_16G; + + switch (format) + { + case MPU6050_RANGE_2G: + GSE_LOG("format use self[0]\n"); + ptr = &self[0]; + break; + + case MPU6050_RANGE_4G: + GSE_LOG("format use self[1]\n"); + ptr = &self[1]; + break; + + case MPU6050_RANGE_8G: + GSE_LOG("format use self[2]\n"); + ptr = &self[2]; + break; + + case MPU6050_RANGE_16G: + GSE_LOG("format use self[3]\n"); + ptr = &self[3]; + break; + + default: + GSE_LOG("format unknow use \n"); + break; + } + + if (!ptr) + { + GSE_ERR("null pointer\n"); + return -EINVAL; + } + GSE_LOG("format=0x%x\n",format); + + GSE_LOG("X diff is %ld\n",abs(nxt[MPU6050_AXIS_X] - prv[MPU6050_AXIS_X])); + GSE_LOG("Y diff is %ld\n",abs(nxt[MPU6050_AXIS_Y] - prv[MPU6050_AXIS_Y])); + GSE_LOG("Z diff is %ld\n",abs(nxt[MPU6050_AXIS_Z] - prv[MPU6050_AXIS_Z])); + + + if ((abs(nxt[MPU6050_AXIS_X] - prv[MPU6050_AXIS_X]) > (*ptr)[MPU6050_AXIS_X].max) || + (abs(nxt[MPU6050_AXIS_X] - prv[MPU6050_AXIS_X]) < (*ptr)[MPU6050_AXIS_X].min)) + { + GSE_ERR("X is over range\n"); + res = -EINVAL; + } + if ((abs(nxt[MPU6050_AXIS_Y] - prv[MPU6050_AXIS_Y]) > (*ptr)[MPU6050_AXIS_Y].max) || + (abs(nxt[MPU6050_AXIS_Y] - prv[MPU6050_AXIS_Y]) < (*ptr)[MPU6050_AXIS_Y].min)) + { + GSE_ERR("Y is over range\n"); + res = -EINVAL; + } + if ((abs(nxt[MPU6050_AXIS_Z] - prv[MPU6050_AXIS_Z]) > (*ptr)[MPU6050_AXIS_Z].max) || + (abs(nxt[MPU6050_AXIS_Z] - prv[MPU6050_AXIS_Z]) < (*ptr)[MPU6050_AXIS_Z].min)) + { + GSE_ERR("Z is over range\n"); + res = -EINVAL; + } + return res; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mpu6050_i2c_client; + char strbuf[MPU6050_BUFSIZE]; + if (NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + if (sensor_power == false) + { + MPU6050_SetPowerMode(client, true); + } + + MPU6050_ReadAllReg(client, strbuf, MPU6050_BUFSIZE); + + MPU6050_ReadChipInfo(client, strbuf, MPU6050_BUFSIZE); + return snprintf(buf, PAGE_SIZE, "%s\n", strbuf); +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mpu6050_i2c_client; + char strbuf[MPU6050_BUFSIZE]; + + if (NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + MPU6050_ReadSensorData(client, strbuf, MPU6050_BUFSIZE); + return snprintf(buf, PAGE_SIZE, "%s\n", strbuf); +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_cali_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mpu6050_i2c_client; + struct mpu6050_i2c_data *obj; + int err, len = 0, mul; + int tmp[MPU6050_AXES_NUM]; + + if (NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + obj = i2c_get_clientdata(client); + + + if ((err = MPU6050_ReadOffset(client, obj->offset))) + { + return -EINVAL; + } + else if ((err = MPU6050_ReadCalibration(client, tmp))) + { + return -EINVAL; + } + else + { + mul = obj->reso->sensitivity/mpu6050_offset_resolution.sensitivity; + len += snprintf(buf+len, PAGE_SIZE-len, "[HW ][%d] (%+3d, %+3d, %+3d) : (0x%02X, 0x%02X, 0x%02X)\n", mul, + obj->offset[MPU6050_AXIS_X], obj->offset[MPU6050_AXIS_Y], obj->offset[MPU6050_AXIS_Z], + obj->offset[MPU6050_AXIS_X], obj->offset[MPU6050_AXIS_Y], obj->offset[MPU6050_AXIS_Z]); + len += snprintf(buf+len, PAGE_SIZE-len, "[SW ][%d] (%+3d, %+3d, %+3d)\n", 1, + obj->cali_sw[MPU6050_AXIS_X], obj->cali_sw[MPU6050_AXIS_Y], obj->cali_sw[MPU6050_AXIS_Z]); + + len += snprintf(buf+len, PAGE_SIZE-len, "[ALL] (%+3d, %+3d, %+3d) : (%+3d, %+3d, %+3d)\n", + obj->offset[MPU6050_AXIS_X]*mul + obj->cali_sw[MPU6050_AXIS_X], + obj->offset[MPU6050_AXIS_Y]*mul + obj->cali_sw[MPU6050_AXIS_Y], + obj->offset[MPU6050_AXIS_Z]*mul + obj->cali_sw[MPU6050_AXIS_Z], + tmp[MPU6050_AXIS_X], tmp[MPU6050_AXIS_Y], tmp[MPU6050_AXIS_Z]); + + return len; + } +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_cali_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct i2c_client *client = mpu6050_i2c_client; + int err, x, y, z; + int dat[MPU6050_AXES_NUM]; + + if (!strncmp(buf, "rst", 3)) + { + if ((err = MPU6050_ResetCalibration(client))) + { + GSE_ERR("reset offset err = %d\n", err); + } + } + else if (3 == sscanf(buf, "0x%02X 0x%02X 0x%02X", &x, &y, &z)) + { + dat[MPU6050_AXIS_X] = x; + dat[MPU6050_AXIS_Y] = y; + dat[MPU6050_AXIS_Z] = z; + if ((err = MPU6050_WriteCalibration(client, dat))) + { + GSE_ERR("write calibration err = %d\n", err); + } + } + else + { + GSE_ERR("invalid format\n"); + } + + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_self_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mpu6050_i2c_client; + + if (NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + return snprintf(buf, 8, "%s\n", selftestRes); +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_self_value(struct device_driver *ddri, const char *buf, size_t count) +{ /*write anything to this register will trigger the process*/ + struct item + { + s16 raw[MPU6050_AXES_NUM]; + }; + + struct i2c_client *client = mpu6050_i2c_client; + int idx, res, num; + struct item *prv = NULL, *nxt = NULL; + s32 avg_prv[MPU6050_AXES_NUM] = {0, 0, 0}; + s32 avg_nxt[MPU6050_AXES_NUM] = {0, 0, 0}; + + + if (1 != sscanf(buf, "%d", &num)) + { + GSE_ERR("parse number fail\n"); + return count; + } + else if (num == 0) + { + GSE_ERR("invalid data count\n"); + return count; + } + + prv = kzalloc(sizeof(*prv) * num, GFP_KERNEL); + nxt = kzalloc(sizeof(*nxt) * num, GFP_KERNEL); + if (!prv || !nxt) + { + goto exit; + } + + + GSE_LOG("NORMAL:\n"); + MPU6050_SetPowerMode(client,true); + + for (idx = 0; idx < num; idx++) + { + if ((res = MPU6050_ReadData(client, prv[idx].raw))) + { + GSE_ERR("read data fail: %d\n", res); + goto exit; + } + + avg_prv[MPU6050_AXIS_X] += prv[idx].raw[MPU6050_AXIS_X]; + avg_prv[MPU6050_AXIS_Y] += prv[idx].raw[MPU6050_AXIS_Y]; + avg_prv[MPU6050_AXIS_Z] += prv[idx].raw[MPU6050_AXIS_Z]; + GSE_LOG("[%5d %5d %5d]\n", prv[idx].raw[MPU6050_AXIS_X], prv[idx].raw[MPU6050_AXIS_Y], prv[idx].raw[MPU6050_AXIS_Z]); + } + + avg_prv[MPU6050_AXIS_X] /= num; + avg_prv[MPU6050_AXIS_Y] /= num; + avg_prv[MPU6050_AXIS_Z] /= num; + + /*initial setting for self test*/ + GSE_LOG("SELFTEST:\n"); + for (idx = 0; idx < num; idx++) + { + if ((res = MPU6050_ReadData(client, nxt[idx].raw))) + { + GSE_ERR("read data fail: %d\n", res); + goto exit; + } + avg_nxt[MPU6050_AXIS_X] += nxt[idx].raw[MPU6050_AXIS_X]; + avg_nxt[MPU6050_AXIS_Y] += nxt[idx].raw[MPU6050_AXIS_Y]; + avg_nxt[MPU6050_AXIS_Z] += nxt[idx].raw[MPU6050_AXIS_Z]; + GSE_LOG("[%5d %5d %5d]\n", nxt[idx].raw[MPU6050_AXIS_X], nxt[idx].raw[MPU6050_AXIS_Y], nxt[idx].raw[MPU6050_AXIS_Z]); + } + + avg_nxt[MPU6050_AXIS_X] /= num; + avg_nxt[MPU6050_AXIS_Y] /= num; + avg_nxt[MPU6050_AXIS_Z] /= num; + + GSE_LOG("X: %5d - %5d = %5d \n", avg_nxt[MPU6050_AXIS_X], avg_prv[MPU6050_AXIS_X], avg_nxt[MPU6050_AXIS_X] - avg_prv[MPU6050_AXIS_X]); + GSE_LOG("Y: %5d - %5d = %5d \n", avg_nxt[MPU6050_AXIS_Y], avg_prv[MPU6050_AXIS_Y], avg_nxt[MPU6050_AXIS_Y] - avg_prv[MPU6050_AXIS_Y]); + GSE_LOG("Z: %5d - %5d = %5d \n", avg_nxt[MPU6050_AXIS_Z], avg_prv[MPU6050_AXIS_Z], avg_nxt[MPU6050_AXIS_Z] - avg_prv[MPU6050_AXIS_Z]); + + if (!MPU6050_JudgeTestResult(client, avg_prv, avg_nxt)) + { + GSE_LOG("SELFTEST : PASS\n"); + strcpy(selftestRes,"y"); + } + else + { + GSE_LOG("SELFTEST : FAIL\n"); + strcpy(selftestRes,"n"); + } + + exit: + /*restore the setting*/ + mpu6050_init_client(client, 0); + kfree(prv); + kfree(nxt); + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_selftest_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mpu6050_i2c_client; + struct mpu6050_i2c_data *obj; + + if (NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + obj = i2c_get_clientdata(client); + return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&obj->selftest)); +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_selftest_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct mpu6050_i2c_data *obj = obj_i2c_data; + int tmp; + + if (NULL == obj) + { + GSE_ERR("i2c data obj is null!!\n"); + return 0; + } + + + if (1 == sscanf(buf, "%d", &tmp)) + { + if (atomic_read(&obj->selftest) && !tmp) + { + /*enable -> disable*/ + mpu6050_init_client(obj->client, 0); + } + else if (!atomic_read(&obj->selftest) && tmp) + { + /*disable -> enable*/ + MPU6050_InitSelfTest(obj->client); + } + + GSE_LOG("selftest: %d => %d\n", atomic_read(&obj->selftest), tmp); + atomic_set(&obj->selftest, tmp); + } + else + { + GSE_ERR("invalid content: '%s', length = %d\n", buf, count); + } + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_firlen_value(struct device_driver *ddri, char *buf) +{ +#ifdef CONFIG_MPU6050_LOWPASS + struct i2c_client *client = mpu6050_i2c_client; + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + if (atomic_read(&obj->firlen)) + { + int idx, len = atomic_read(&obj->firlen); + GSE_LOG("len = %2d, idx = %2d\n", obj->fir.num, obj->fir.idx); + + for (idx = 0; idx < len; idx++) + { + GSE_LOG("[%5d %5d %5d]\n", obj->fir.raw[idx][MPU6050_AXIS_X], obj->fir.raw[idx][MPU6050_AXIS_Y], obj->fir.raw[idx][MPU6050_AXIS_Z]); + } + + GSE_LOG("sum = [%5d %5d %5d]\n", obj->fir.sum[MPU6050_AXIS_X], obj->fir.sum[MPU6050_AXIS_Y], obj->fir.sum[MPU6050_AXIS_Z]); + GSE_LOG("avg = [%5d %5d %5d]\n", obj->fir.sum[MPU6050_AXIS_X]/len, obj->fir.sum[MPU6050_AXIS_Y]/len, obj->fir.sum[MPU6050_AXIS_Z]/len); + } + return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&obj->firlen)); +#else + return snprintf(buf, PAGE_SIZE, "not support\n"); +#endif +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_firlen_value(struct device_driver *ddri, const char *buf, size_t count) +{ +#ifdef CONFIG_MPU6050_LOWPASS + struct i2c_client *client = mpu6050_i2c_client; + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int firlen; + + if (1 != sscanf(buf, "%d", &firlen)) + { + GSE_ERR("invallid format\n"); + } + else if (firlen > C_MAX_FIR_LENGTH) + { + GSE_ERR("exceeds maximum filter length\n"); + } + else + { + atomic_set(&obj->firlen, firlen); + if (0 == firlen) + { + atomic_set(&obj->fir_en, 0); + } + else + { + memset(&obj->fir, 0x00, sizeof(obj->fir)); + atomic_set(&obj->fir_en, 1); + } + } +#endif + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_trace_value(struct device_driver *ddri, char *buf) +{ + ssize_t res; + struct mpu6050_i2c_data *obj = obj_i2c_data; + if (obj == NULL) + { + GSE_ERR("i2c_data obj is null!!\n"); + return 0; + } + + res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace)); + return res; +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct mpu6050_i2c_data *obj = obj_i2c_data; + int trace; + if (obj == NULL) + { + GSE_ERR("i2c_data obj is null!!\n"); + return 0; + } + + if (1 == sscanf(buf, "0x%x", &trace)) + { + atomic_set(&obj->trace, trace); + } + else + { + GSE_ERR("invalid content: '%s', length = %d\n", buf, count); + } + + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_status_value(struct device_driver *ddri, char *buf) +{ + ssize_t len = 0; + struct mpu6050_i2c_data *obj = obj_i2c_data; + if (obj == NULL) + { + GSE_ERR("i2c_data obj is null!!\n"); + return 0; + } + + if (obj->hw) + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n", + obj->hw->i2c_num, obj->hw->direction, obj->hw->power_id, obj->hw->power_vol); + } + else + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n"); + } + return len; +} +/*----------------------------------------------------------------------------*/ +static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL); +static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL); +static DRIVER_ATTR(cali, S_IWUSR | S_IRUGO, show_cali_value, store_cali_value); +static DRIVER_ATTR(self, S_IWUSR | S_IRUGO, show_selftest_value, store_selftest_value); +static DRIVER_ATTR(selftest, S_IWUSR | S_IRUGO, show_self_value , store_self_value ); +static DRIVER_ATTR(firlen, S_IWUSR | S_IRUGO, show_firlen_value, store_firlen_value); +static DRIVER_ATTR(trace, S_IWUSR | S_IRUGO, show_trace_value, store_trace_value); +static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL); +/*----------------------------------------------------------------------------*/ +static struct driver_attribute *mpu6050_attr_list[] = { + &driver_attr_chipinfo, /*chip information*/ + &driver_attr_sensordata, /*dump sensor data*/ + &driver_attr_cali, /*show calibration data*/ + &driver_attr_self, /*self test demo*/ + &driver_attr_selftest, /*self control: 0: disable, 1: enable*/ + &driver_attr_firlen, /*filter length: 0: disable, others: enable*/ + &driver_attr_trace, /*trace log*/ + &driver_attr_status, +}; +/*----------------------------------------------------------------------------*/ +static int mpu6050_create_attr(struct device_driver *driver) +{ + int idx, err = 0; + int num = (int)(sizeof(mpu6050_attr_list)/sizeof(mpu6050_attr_list[0])); + if (driver == NULL) + { + return -EINVAL; + } + + for (idx = 0; idx < num; idx++) + { + if (0 != (err = driver_create_file(driver, mpu6050_attr_list[idx]))) + { + GSE_ERR("driver_create_file (%s) = %d\n", mpu6050_attr_list[idx]->attr.name, err); + break; + } + } + return err; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_delete_attr(struct device_driver *driver) +{ + int idx ,err = 0; + int num = (int)(sizeof(mpu6050_attr_list)/sizeof(mpu6050_attr_list[0])); + + if (driver == NULL) + { + return -EINVAL; + } + + for (idx = 0; idx < num; idx++) + { + driver_remove_file(driver, mpu6050_attr_list[idx]); + } + + return err; +} + +/*----------------------------------------------------------------------------*/ +int gsensor_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value, sample_delay; + struct mpu6050_i2c_data *priv = (struct mpu6050_i2c_data*)self; + hwm_sensor_data* gsensor_data; + char buff[MPU6050_BUFSIZE]; + + + switch (command) + { + case SENSOR_DELAY: + if ((buff_in == NULL) || (size_in < sizeof(int))) + { + GSE_ERR("Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + + if(value <= 5) + { + sample_delay = MPU6050_BW_184HZ; + } + else if(value <= 10) + { + sample_delay = MPU6050_BW_94HZ; + } + else + { + sample_delay = MPU6050_BW_44HZ; + } + GSE_LOG("Set delay parameter value:%d \n", value); + + + err = MPU6050_SetBWRate(priv->client, sample_delay); + if (err != MPU6050_SUCCESS ) //0x2C->BW=100Hz + { + GSE_ERR("Set delay parameter error!\n"); + } + + if (value >= 50) + { + atomic_set(&priv->filter, 0); + } + else + { +#if defined(CONFIG_MPU6050_LOWPASS) + priv->fir.num = 0; + priv->fir.idx = 0; + priv->fir.sum[MPU6050_AXIS_X] = 0; + priv->fir.sum[MPU6050_AXIS_Y] = 0; + priv->fir.sum[MPU6050_AXIS_Z] = 0; +#endif + atomic_set(&priv->filter, 1); + } + } + break; + + case SENSOR_ENABLE: + if ((buff_in == NULL) || (size_in < sizeof(int))) + { + GSE_ERR("Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if (((value == 0) && (sensor_power == false)) ||((value == 1) && (sensor_power == true))) + { + GSE_LOG("Gsensor device have updated!\n"); + } + else + { + err = MPU6050_SetPowerMode( priv->client, !sensor_power); + } + } + break; + + case SENSOR_GET_DATA: + if ((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + GSE_ERR("get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + gsensor_data = (hwm_sensor_data *)buff_out; + err = MPU6050_ReadSensorData(priv->client, buff, MPU6050_BUFSIZE); + if (!err) + { + sscanf(buff, "%x %x %x", &gsensor_data->values[0], + &gsensor_data->values[1], &gsensor_data->values[2]); + gsensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; + gsensor_data->value_divide = 1000; + } + } + break; + default: + GSE_ERR("gsensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + +/****************************************************************************** + * Function Configuration +******************************************************************************/ +static int mpu6050_open(struct inode *inode, struct file *file) +{ + file->private_data = mpu6050_i2c_client; + + if (file->private_data == NULL) + { + GSE_ERR("null pointer!!\n"); + return -EINVAL; + } + return nonseekable_open(inode, file); +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} +/*----------------------------------------------------------------------------*/ +static long mpu6050_unlocked_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct i2c_client *client = (struct i2c_client*)file->private_data; + struct mpu6050_i2c_data *obj = (struct mpu6050_i2c_data*)i2c_get_clientdata(client); + char strbuf[MPU6050_BUFSIZE]; + void __user *data; + SENSOR_DATA sensor_data; + long err = 0; + int cali[3]; + + if (_IOC_DIR(cmd) & _IOC_READ) + { + err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + } + else if (_IOC_DIR(cmd) & _IOC_WRITE) + { + err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + } + + if (err) + { + GSE_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd)); + return -EFAULT; + } + + switch (cmd) + { + case GSENSOR_IOCTL_INIT: + mpu6050_init_client(client, 0); + break; + + case GSENSOR_IOCTL_READ_CHIPINFO: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + MPU6050_ReadChipInfo(client, strbuf, MPU6050_BUFSIZE); + if (copy_to_user(data, strbuf, strlen(strbuf)+1)) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_READ_SENSORDATA: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + MPU6050_ReadSensorData(client, strbuf, MPU6050_BUFSIZE); + if (copy_to_user(data, strbuf, strlen(strbuf)+1)) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_READ_GAIN: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + if (copy_to_user(data, &gsensor_gain, sizeof(GSENSOR_VECTOR3D))) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_READ_RAW_DATA: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + if (atomic_read(&obj->suspend)) + { + err = -EINVAL; + } + else + { + MPU6050_ReadRawData(client, strbuf); + if (copy_to_user(data, strbuf, strlen(strbuf)+1)) + { + err = -EFAULT; + break; + } + } + break; + + case GSENSOR_IOCTL_SET_CALI: + data = (void __user*)arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + if (copy_from_user(&sensor_data, data, sizeof(sensor_data))) + { + err = -EFAULT; + break; + } + if (atomic_read(&obj->suspend)) + { + GSE_ERR("Perform calibration in suspend state!!\n"); + err = -EINVAL; + } + else + { + cali[MPU6050_AXIS_X] = sensor_data.x * obj->reso->sensitivity / GRAVITY_EARTH_1000; + cali[MPU6050_AXIS_Y] = sensor_data.y * obj->reso->sensitivity / GRAVITY_EARTH_1000; + cali[MPU6050_AXIS_Z] = sensor_data.z * obj->reso->sensitivity / GRAVITY_EARTH_1000; + err = MPU6050_WriteCalibration(client, cali); + } + break; + + case GSENSOR_IOCTL_CLR_CALI: + err = MPU6050_ResetCalibration(client); + break; + + case GSENSOR_IOCTL_GET_CALI: + data = (void __user*)arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + if ((err = MPU6050_ReadCalibration(client, cali))) + { + break; + } + + sensor_data.x = cali[MPU6050_AXIS_X] * GRAVITY_EARTH_1000 / obj->reso->sensitivity; + sensor_data.y = cali[MPU6050_AXIS_Y] * GRAVITY_EARTH_1000 / obj->reso->sensitivity; + sensor_data.z = cali[MPU6050_AXIS_Z] * GRAVITY_EARTH_1000 / obj->reso->sensitivity; + if (copy_to_user(data, &sensor_data, sizeof(sensor_data))) + { + err = -EFAULT; + break; + } + break; + + + default: + GSE_ERR("unknown IOCTL: 0x%08x\n", cmd); + err = -ENOIOCTLCMD; + break; + + } + + return err; +} + + +/*----------------------------------------------------------------------------*/ +static struct file_operations mpu6050_fops = { + .open = mpu6050_open, + .release = mpu6050_release, + .unlocked_ioctl = mpu6050_unlocked_ioctl, +}; +/*----------------------------------------------------------------------------*/ +static struct miscdevice mpu6050_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "gsensor", + .fops = &mpu6050_fops, +}; +/*----------------------------------------------------------------------------*/ +#ifndef CONFIG_HAS_EARLYSUSPEND +/*----------------------------------------------------------------------------*/ +static int mpu6050_suspend(struct i2c_client *client, pm_message_t msg) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int err = 0; + GSE_FUN(); + + if (msg.event == PM_EVENT_SUSPEND) + { + if (obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return -EINVAL; + } + atomic_set(&obj->suspend, 1); + + if ((err = MPU6050_SetPowerMode(obj->client, false))) + { + GSE_ERR("write power control fail!!\n"); + return err; + } + MPU6050_power(obj->hw, 0); + GSE_LOG("mpu6050_suspend ok\n"); + } + return err; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_resume(struct i2c_client *client) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int err; + GSE_FUN(); + + if (obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return -EINVAL; + } + + MPU6050_power(obj->hw, 1); + + if ((err = mpu6050_init_client(client, 0))) + { + GSE_ERR("initialize client fail!!\n"); + return err; + } + atomic_set(&obj->suspend, 0); + GSE_LOG("mpu6050_resume ok\n"); + + return 0; +} +/*----------------------------------------------------------------------------*/ +#else /*CONFIG_HAS_EARLY_SUSPEND is defined*/ +/*----------------------------------------------------------------------------*/ +static void mpu6050_early_suspend(struct early_suspend *h) +{ + struct mpu6050_i2c_data *obj = container_of(h, struct mpu6050_i2c_data, early_drv); + int err; + GSE_FUN(); + + if (obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return; + } + atomic_set(&obj->suspend, 1); + + if ((err = MPU6050_SetPowerMode(obj->client, false))) + { + GSE_ERR("write power control fail!!\n"); + return; + } + + /* + if (MPU6050_gyro_mode() == false) + { + MPU6050_Dev_Reset(obj->client); + MPU6050_Reset(obj->client); + } + */ + + obj->bandwidth = 0; + + sensor_power = false; + + MPU6050_power(obj->hw, 0); +} +/*----------------------------------------------------------------------------*/ +static void mpu6050_late_resume(struct early_suspend *h) +{ + struct mpu6050_i2c_data *obj = container_of(h, struct mpu6050_i2c_data, early_drv); + int err; + GSE_FUN(); + + if (obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return; + } + + MPU6050_power(obj->hw, 1); + + if ((err = mpu6050_init_client(obj->client, 0))) + { + GSE_ERR("initialize client fail!!\n"); + return; + } + atomic_set(&obj->suspend, 0); +} +/*----------------------------------------------------------------------------*/ +#endif /*CONFIG_HAS_EARLYSUSPEND*/ +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + strcpy(info->type, MPU6050_DEV_NAME); + return 0; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_client *new_client; + struct mpu6050_i2c_data *obj; + struct hwmsen_object sobj; + int err = 0; + GSE_FUN(); + + if (!(obj = kzalloc(sizeof(*obj), GFP_KERNEL))) + { + err = -ENOMEM; + goto exit; + } + + memset(obj, 0, sizeof(struct mpu6050_i2c_data)); + + obj->hw = get_cust_acc_hw(); + + if ((err = hwmsen_get_convert(obj->hw->direction, &obj->cvt))) + { + GSE_ERR("invalid direction: %d\n", obj->hw->direction); + goto exit; + } + + obj_i2c_data = obj; + obj->client = client; + obj->client->timing = 400; + + new_client = obj->client; + i2c_set_clientdata(new_client,obj); + + atomic_set(&obj->trace, 0); + atomic_set(&obj->suspend, 0); + +#ifdef CONFIG_MPU6050_LOWPASS + if (obj->hw->firlen > C_MAX_FIR_LENGTH) + { + atomic_set(&obj->firlen, C_MAX_FIR_LENGTH); + } + else + { + atomic_set(&obj->firlen, obj->hw->firlen); + } + + if (atomic_read(&obj->firlen) > 0) + { + atomic_set(&obj->fir_en, 1); + } + +#endif + + mpu6050_i2c_client = new_client; + MPU6050_Dev_Reset(new_client); + MPU6050_Reset(new_client); + + if ((err = mpu6050_init_client(new_client, 1))) + { + goto exit_init_failed; + } + + + if ((err = misc_register(&mpu6050_device))) + { + GSE_ERR("mpu6050_device register failed\n"); + goto exit_misc_device_register_failed; + } + + + if ((err = mpu6050_create_attr(&mpu6050_gsensor_driver.driver))) + { + GSE_ERR("create attribute err = %d\n", err); + goto exit_create_attr_failed; + } + + sobj.self = obj; + sobj.polling = 1; + sobj.sensor_operate = gsensor_operate; + if ((err = hwmsen_attach(ID_ACCELEROMETER, &sobj))) + { + GSE_ERR("attach fail = %d\n", err); + goto exit_kfree; + } + +#ifdef CONFIG_HAS_EARLYSUSPEND + obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 2, + obj->early_drv.suspend = mpu6050_early_suspend, + obj->early_drv.resume = mpu6050_late_resume, + register_early_suspend(&obj->early_drv); +#endif + + GSE_LOG("%s: OK\n", __func__); + return 0; + + exit_create_attr_failed: + misc_deregister(&mpu6050_device); + exit_misc_device_register_failed: + exit_init_failed: + //i2c_detach_client(new_client); + exit_kfree: + kfree(obj); + exit: + GSE_ERR("%s: err = %d\n", __func__, err); + return err; +} + +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_remove(struct i2c_client *client) +{ + int err = 0; + + if ((err = mpu6050_delete_attr(&mpu6050_gsensor_driver.driver))) + { + GSE_ERR("mpu6050_delete_attr fail: %d\n", err); + } + + if ((err = misc_deregister(&mpu6050_device))) + { + GSE_ERR("misc_deregister fail: %d\n", err); + } + + if ((err = hwmsen_detach(ID_ACCELEROMETER))) + { + GSE_ERR("hwmsen_detach fail: %d\n", err); + } + + mpu6050_i2c_client = NULL; + i2c_unregister_device(client); + kfree(i2c_get_clientdata(client)); + return 0; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_probe(struct platform_device *pdev) +{ + struct acc_hw *hw = get_cust_acc_hw(); + GSE_FUN(); + + MPU6050_power(hw, 1); + if (i2c_add_driver(&mpu6050_i2c_driver)) + { + GSE_ERR("add driver error\n"); + return -1; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_remove(struct platform_device *pdev) +{ + struct acc_hw *hw = get_cust_acc_hw(); + + GSE_FUN(); + MPU6050_power(hw, 0); + i2c_del_driver(&mpu6050_i2c_driver); + return 0; +} +/*----------------------------------------------------------------------------*/ +static struct platform_driver mpu6050_gsensor_driver = { + .probe = mpu6050_probe, + .remove = mpu6050_remove, + .driver = { + .name = "gsensor", + } +}; + +/*----------------------------------------------------------------------------*/ +static int __init mpu6050gse_init(void) +{ + struct acc_hw *hw = get_cust_acc_hw(); + GSE_LOG("%s: i2c_number=%d\n", __func__,hw->i2c_num); + i2c_register_board_info(hw->i2c_num, &i2c_mpu6050, 1); + if (platform_driver_register(&mpu6050_gsensor_driver)) + { + GSE_ERR("failed to register driver"); + return -ENODEV; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static void __exit mpu6050gse_exit(void) +{ + GSE_FUN(); + platform_driver_unregister(&mpu6050_gsensor_driver); +} +/*----------------------------------------------------------------------------*/ +module_init(mpu6050gse_init); +module_exit(mpu6050gse_exit); +/*----------------------------------------------------------------------------*/ +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("MPU6050 gse driver"); +MODULE_AUTHOR("Yucong.Xiong@mediatek.com"); diff --git a/arch/arm/mach-mt8127/ford/accelerometer/mpu6050.h b/arch/arm/mach-mt8127/ford/accelerometer/mpu6050.h new file mode 100644 index 00000000000..0d0993f2256 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/accelerometer/mpu6050.h @@ -0,0 +1,60 @@ +#ifndef MPU6050_H +#define MPU6050_H + +#include + +#define MPU6050_I2C_SLAVE_ADDR 0xD0 + + +/* MPU6050 Register Map (Please refer to MPU6050 Specifications) */ +#define MPU6050_REG_DEVID 0x75 +#define MPU6050_REG_BW_RATE 0x1A +#define MPU6050_REG_POWER_CTL 0x6B +#define MPU6050_REG_POWER_CTL2 0x6C +#define MPU6050_REG_INT_ENABLE 0x38 +#define MPU6050_REG_DATA_FORMAT 0x1C +#define MPU6050_REG_DATAX0 0x3B +#define MPU6050_REG_DATAY0 0x3D +#define MPU6050_REG_DATAZ0 0x3F +#define MPU6050_REG_RESET 0x68 + +/* register Value */ +#define MPU6050_FIXED_DEVID 0x68 // or 0x69 + + // delay(ms) +#define MPU6050_BW_260HZ 0x00 //0 +#define MPU6050_BW_184HZ 0x01 //2.0 +#define MPU6050_BW_94HZ 0x02 //3.0 +#define MPU6050_BW_44HZ 0x03 //4.9 +#define MPU6050_BW_21HZ 0x04 //8.5 +#define MPU6050_BW_10HZ 0x05 //13.8 +#define MPU6050_BW_5HZ 0x06 //19.0 + +#define MPU6050_DEV_RESET 0x80 + +//#define MPU6050_FULL_RES 0x08 +#define MPU6050_RANGE_2G (0x00 << 3) +#define MPU6050_RANGE_4G (0x01 << 3) +#define MPU6050_RANGE_8G (0x02 << 3) +#define MPU6050_RANGE_16G (0x03 << 3) +//#define MPU6050_SELF_TEST 0x80 + + +#define MPU6050_SLEEP 0x40 //enable low power sleep mode + + + +// below do not modify +#define MPU6050_SUCCESS 0 +#define MPU6050_ERR_I2C -1 +#define MPU6050_ERR_STATUS -3 +#define MPU6050_ERR_SETUP_FAILURE -4 +#define MPU6050_ERR_GETGSENSORDATA -5 +#define MPU6050_ERR_IDENTIFICATION -6 + + + +#define MPU6050_BUFSIZE 256 + +#endif + diff --git a/arch/arm/mach-mt8127/ford/alsps/APDS9930.c b/arch/arm/mach-mt8127/ford/alsps/APDS9930.c new file mode 100644 index 00000000000..f5025af368d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/alsps/APDS9930.c @@ -0,0 +1,1990 @@ +/* drivers/hwmon/mt6516/amit/APDS9930.c - APDS9930 ALS/PS driver + * + * Author: MingHsien Hsieh + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define POWER_NONE_MACRO MT65XX_POWER_NONE + +#include +#include +#include +#include +#include +#include +#include "APDS9930.h" +#include +/****************************************************************************** + * configuration +*******************************************************************************/ +/*----------------------------------------------------------------------------*/ + +#define APDS9930_DEV_NAME "APDS9930" +/*----------------------------------------------------------------------------*/ +#define APS_TAG "[ALS/PS] " +#define APS_FUN(f) printk(KERN_INFO APS_TAG"%s\n", __FUNCTION__) +#define APS_ERR(fmt, args...) printk(KERN_ERR APS_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) +#define APS_LOG(fmt, args...) printk(KERN_ERR APS_TAG fmt, ##args) +#define APS_DBG(fmt, args...) printk(KERN_INFO APS_TAG fmt, ##args) + +#define I2C_FLAG_WRITE 0 +#define I2C_FLAG_READ 1 + + +/****************************************************************************** + * extern functions +*******************************************************************************/ +extern void mt_eint_mask(unsigned int eint_num); +extern void mt_eint_unmask(unsigned int eint_num); +extern void mt_eint_set_hw_debounce(unsigned int eint_num, unsigned int ms); +extern void mt_eint_set_polarity(unsigned int eint_num, unsigned int pol); +extern unsigned int mt_eint_set_sens(unsigned int eint_num, unsigned int sens); +extern void mt_eint_registration(unsigned int eint_num, unsigned int flow, void (EINT_FUNC_PTR)(void), unsigned int is_auto_umask); +extern void mt_eint_print_status(void); + +/*----------------------------------------------------------------------------*/ +static struct i2c_client *APDS9930_i2c_client = NULL; +/*----------------------------------------------------------------------------*/ +static const struct i2c_device_id APDS9930_i2c_id[] = {{APDS9930_DEV_NAME,0},{}}; +static struct i2c_board_info __initdata i2c_APDS9930={ I2C_BOARD_INFO("APDS9930", 0x39)}; +/*----------------------------------------------------------------------------*/ +static int APDS9930_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int APDS9930_i2c_remove(struct i2c_client *client); +static int APDS9930_i2c_detect(struct i2c_client *client, struct i2c_board_info *info); +/*----------------------------------------------------------------------------*/ +static int APDS9930_i2c_suspend(struct i2c_client *client, pm_message_t msg); +static int APDS9930_i2c_resume(struct i2c_client *client); + +static DEFINE_MUTEX(APDS9930_mutex); + + +static struct APDS9930_priv *g_APDS9930_ptr = NULL; + + struct PS_CALI_DATA_STRUCT +{ + int close; + int far_away; + int valid; +} ; + +static struct PS_CALI_DATA_STRUCT ps_cali={0,0,0}; +static int intr_flag_value = 0; +static unsigned long long int_top_time = 0; +/*----------------------------------------------------------------------------*/ +typedef enum { + CMC_BIT_ALS = 1, + CMC_BIT_PS = 2, +} CMC_BIT; +/*----------------------------------------------------------------------------*/ +struct APDS9930_i2c_addr { /*define a series of i2c slave address*/ + u8 write_addr; + u8 ps_thd; /*PS INT threshold*/ +}; +/*----------------------------------------------------------------------------*/ +struct APDS9930_priv { + struct alsps_hw *hw; + struct i2c_client *client; + struct work_struct eint_work; + + /*i2c address group*/ + struct APDS9930_i2c_addr addr; + + /*misc*/ + u16 als_modulus; + atomic_t i2c_retry; + atomic_t als_suspend; + atomic_t als_debounce; /*debounce time after enabling als*/ + atomic_t als_deb_on; /*indicates if the debounce is on*/ + atomic_t als_deb_end; /*the jiffies representing the end of debounce*/ + atomic_t ps_mask; /*mask ps: always return far away*/ + atomic_t ps_debounce; /*debounce time after enabling ps*/ + atomic_t ps_deb_on; /*indicates if the debounce is on*/ + atomic_t ps_deb_end; /*the jiffies representing the end of debounce*/ + atomic_t ps_suspend; + + + /*data*/ + u16 als; + u16 ps; + u8 _align; + u16 als_level_num; + u16 als_value_num; + u32 als_level[C_CUST_ALS_LEVEL-1]; + u32 als_value[C_CUST_ALS_LEVEL]; + int ps_cali; + + atomic_t als_cmd_val; /*the cmd value can't be read, stored in ram*/ + atomic_t ps_cmd_val; /*the cmd value can't be read, stored in ram*/ + atomic_t ps_thd_val_high; /*the cmd value can't be read, stored in ram*/ + atomic_t ps_thd_val_low; /*the cmd value can't be read, stored in ram*/ + ulong enable; /*enable mask*/ + ulong pending_intr; /*pending interrupt*/ + + /*early suspend*/ +#if defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_drv; +#endif +}; +/*----------------------------------------------------------------------------*/ +static struct i2c_driver APDS9930_i2c_driver = { + .probe = APDS9930_i2c_probe, + .remove = APDS9930_i2c_remove, + .detect = APDS9930_i2c_detect, + .suspend = APDS9930_i2c_suspend, + .resume = APDS9930_i2c_resume, + .id_table = APDS9930_i2c_id, + .driver = { + .name = APDS9930_DEV_NAME, + }, +}; + +static struct APDS9930_priv *APDS9930_obj = NULL; +static struct platform_driver APDS9930_alsps_driver; +/*------------------------i2c function for 89-------------------------------------*/ +int APDS9930_i2c_master_operate(struct i2c_client *client, const char *buf, int count, int i2c_flag) +{ + int res = 0; + mutex_lock(&APDS9930_mutex); + switch(i2c_flag){ + case I2C_FLAG_WRITE: + client->addr &=I2C_MASK_FLAG; + res = i2c_master_send(client, buf, count); + client->addr &=I2C_MASK_FLAG; + break; + + case I2C_FLAG_READ: + client->addr &=I2C_MASK_FLAG; + client->addr |=I2C_WR_FLAG; + client->addr |=I2C_RS_FLAG; + res = i2c_master_send(client, buf, count); + client->addr &=I2C_MASK_FLAG; + break; + default: + APS_LOG("APDS9930_i2c_master_operate i2c_flag command not support!\n"); + break; + } + if(res <= 0) + { + goto EXIT_ERR; + } + mutex_unlock(&APDS9930_mutex); + return res; + EXIT_ERR: + mutex_unlock(&APDS9930_mutex); + APS_ERR("APDS9930_i2c_transfer fail\n"); + return res; +} + +/*----------------------------------------------------------------------------*/ +int APDS9930_get_addr(struct alsps_hw *hw, struct APDS9930_i2c_addr *addr) +{ + if(!hw || !addr) + { + return -EFAULT; + } + addr->write_addr= hw->i2c_addr[0]; + return 0; +} +/*----------------------------------------------------------------------------*/ +static void APDS9930_power(struct alsps_hw *hw, unsigned int on) +{ + static unsigned int power_on = 0; + + //APS_LOG("power %s\n", on ? "on" : "off"); + + if(hw->power_id != POWER_NONE_MACRO) + { + if(power_on == on) + { + APS_LOG("ignore power control: %d\n", on); + } + else if(on) + { + if(!hwPowerOn(hw->power_id, hw->power_vol, "APDS9930")) + { + APS_ERR("power on fails!!\n"); + } + } + else + { + if(!hwPowerDown(hw->power_id, "APDS9930")) + { + APS_ERR("power off fail!!\n"); + } + } + } + power_on = on; +} +/*----------------------------------------------------------------------------*/ +static long APDS9930_enable_als(struct i2c_client *client, int enable) +{ + struct APDS9930_priv *obj = i2c_get_clientdata(client); + u8 databuf[2]; + long res = 0; + + databuf[0]= APDS9930_CMM_ENABLE; + res = APDS9930_i2c_master_operate(client, databuf, 0x101, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + //APS_LOG("APDS9930_CMM_ENABLE als value = %x\n",databuf[0]); + + if(enable) + { + databuf[1] = databuf[0]|0x03; + databuf[0] = APDS9930_CMM_ENABLE; + //APS_LOG("APDS9930_CMM_ENABLE enable als value = %x\n",databuf[1]); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + atomic_set(&obj->als_deb_on, 1); + atomic_set(&obj->als_deb_end, jiffies+atomic_read(&obj->als_debounce)/(1000/HZ)); + } + else { + if(test_bit(CMC_BIT_PS, &obj->enable)) + databuf[1] = databuf[0]&0xFD; + else + databuf[1] = databuf[0]&0xF8; + + databuf[0] = APDS9930_CMM_ENABLE; + //APS_LOG("APDS9930_CMM_ENABLE disable als value = %x\n",databuf[1]); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + } + return 0; + +EXIT_ERR: + APS_ERR("APDS9930_enable_als fail\n"); + return res; +} + +/*----------------------------------------------------------------------------*/ +static long APDS9930_enable_ps(struct i2c_client *client, int enable) +{ + struct APDS9930_priv *obj = i2c_get_clientdata(client); + u8 databuf[2]; + long res = 0; + + databuf[0]= APDS9930_CMM_ENABLE; + res = APDS9930_i2c_master_operate(client, databuf, 0x101, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + + //APS_LOG("APDS9930_CMM_ENABLE ps value = %x\n",databuf[0]); + + if(enable) + { + databuf[1] = databuf[0]|0x05; + databuf[0] = APDS9930_CMM_ENABLE; + //APS_LOG("APDS9930_CMM_ENABLE enable ps value = %x\n",databuf[1]); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + atomic_set(&obj->ps_deb_on, 1); + atomic_set(&obj->ps_deb_end, jiffies+atomic_read(&obj->ps_debounce)/(1000/HZ)); + } + else{ + if(test_bit(CMC_BIT_ALS, &obj->enable)) + databuf[1] = databuf[0]&0xFB; + else + databuf[1] = databuf[0]&0xF8; + + databuf[0] = APDS9930_CMM_ENABLE; + //APS_LOG("APDS9930_CMM_ENABLE disable ps value = %x\n",databuf[1]); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + /*fix bug*/ + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_low)) & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_LOW_THD_HIGH; + databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_low)) & 0xFF00) >> 8); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_high)) & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_HIGH; + databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_high)) & 0xFF00) >> 8);; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + /*fix bug*/ + } + return 0; + +EXIT_ERR: + APS_ERR("APDS9930_enable_ps fail\n"); + return res; +} +/*----------------------------------------------------------------------------*/ +/*for interrup work mode support -- by liaoxl.lenovo 12.08.2011*/ +static int APDS9930_check_and_clear_intr(struct i2c_client *client) +{ + int res,intp,intl; + u8 buffer[2]; + + if (mt_get_gpio_in(GPIO_ALS_EINT_PIN) == 1) /*skip if no interrupt*/ + return 0; + + buffer[0] = APDS9930_CMM_STATUS; + res = APDS9930_i2c_master_operate(client, buffer, 0x101, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + + res = 0; + intp = 0; + intl = 0; + if(0 != (buffer[0] & 0x20)) + { + res = 1; + intp = 1; + } + if(0 != (buffer[0] & 0x10)) + { + res = 1; + intl = 1; + } + + if(1 == res) + { + if((1 == intp) && (0 == intl)) + { + buffer[0] = (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x05); + } + else if((0 == intp) && (1 == intl)) + { + buffer[0] = (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x06); + } + else + { + buffer[0] = (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x07); + } + + res = APDS9930_i2c_master_operate(client, buffer, 0x1, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + else + { + res = 0; + } + } + + return res; + +EXIT_ERR: + APS_ERR("APDS9930_check_and_clear_intr fail\n"); + return 1; +} +/*----------------------------------------------------------------------------*/ + +/*yucong add for interrupt mode support MTK inc 2012.3.7*/ +static int APDS9930_check_intr(struct i2c_client *client) +{ + int res,intp,intl; + u8 buffer[2]; + + if (mt_get_gpio_in(GPIO_ALS_EINT_PIN) == 1) /*skip if no interrupt*/ + return 0; + + buffer[0] = APDS9930_CMM_STATUS; + res = APDS9930_i2c_master_operate(client, buffer, 0x101, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + res = 0; + intp = 0; + intl = 0; + if(0 != (buffer[0] & 0x20)) + { + res = 0; + intp = 1; + } + if(0 != (buffer[0] & 0x10)) + { + res = 0; + intl = 1; + } + + return res; + +EXIT_ERR: + APS_ERR("APDS9930_check_intr fail\n"); + return 1; +} + +static int APDS9930_clear_intr(struct i2c_client *client) +{ + int res; + u8 buffer[2]; + + buffer[0] = (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x07); + res = APDS9930_i2c_master_operate(client, buffer, 0x1, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + else + { + res = 0; + } + return res; + +EXIT_ERR: + APS_ERR("APDS9930_check_and_clear_intr fail\n"); + return 1; +} + + +/*-----------------------------------------------------------------------------*/ +void APDS9930_eint_func(void) +{ + struct APDS9930_priv *obj = g_APDS9930_ptr; + if(!obj) + { + return; + } + int_top_time = sched_clock(); + schedule_work(&obj->eint_work); +} + +/*----------------------------------------------------------------------------*/ +/*for interrup work mode support -- by liaoxl.lenovo 12.08.2011*/ +int APDS9930_setup_eint(struct i2c_client *client) +{ + struct APDS9930_priv *obj = i2c_get_clientdata(client); + + g_APDS9930_ptr = obj; + + mt_set_gpio_dir(GPIO_ALS_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_mode(GPIO_ALS_EINT_PIN, GPIO_ALS_EINT_PIN_M_EINT); + mt_set_gpio_pull_enable(GPIO_ALS_EINT_PIN, TRUE); + mt_set_gpio_pull_select(GPIO_ALS_EINT_PIN, GPIO_PULL_UP); + + mt_eint_set_hw_debounce(CUST_EINT_ALS_NUM, CUST_EINT_ALS_DEBOUNCE_CN); + mt_eint_registration(CUST_EINT_ALS_NUM, CUST_EINT_ALS_TYPE, APDS9930_eint_func, 0); + + mt_eint_unmask(CUST_EINT_ALS_NUM); + return 0; +} + +/*----------------------------------------------------------------------------*/ + +static int APDS9930_init_client(struct i2c_client *client) +{ + struct APDS9930_priv *obj = i2c_get_clientdata(client); + u8 databuf[2]; + int res = 0; + + databuf[0] = (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x00); + res = APDS9930_i2c_master_operate(client, databuf, 0x1, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_ENABLE; + if(obj->hw->polling_mode_ps == 1) + databuf[1] = 0x08; + if(obj->hw->polling_mode_ps == 0) + databuf[1] = 0x28; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_ATIME; + databuf[1] = 0xF6; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_PTIME; + databuf[1] = 0xFF; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_WTIME; + databuf[1] = 0xFC; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + /*for interrup work mode support -- by liaoxl.lenovo 12.08.2011*/ + if(0 == obj->hw->polling_mode_ps) + { + if(1 == ps_cali.valid) + { + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + databuf[1] = (u8)(ps_cali.far_away & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_LOW_THD_HIGH; + databuf[1] = (u8)((ps_cali.far_away & 0xFF00) >> 8); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + databuf[1] = (u8)(ps_cali.close & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_HIGH; + databuf[1] = (u8)((ps_cali.close & 0xFF00) >> 8);; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + } + else + { + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_low)) & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_LOW_THD_HIGH; + databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_low)) & 0xFF00) >> 8); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_high)) & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_HIGH; + databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_high)) & 0xFF00) >> 8);; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + } + + databuf[0] = APDS9930_CMM_Persistence; + databuf[1] = 0x20; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + } + + databuf[0] = APDS9930_CMM_CONFIG; + databuf[1] = 0x00; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + /*Lenovo-sw chenlj2 add 2011-06-03,modified pulse 2 to 4 */ + databuf[0] = APDS9930_CMM_PPCOUNT; + databuf[1] = APDS9930_CMM_PPCOUNT_VALUE; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + /*Lenovo-sw chenlj2 add 2011-06-03,modified gain 16 to 1 */ + databuf[0] = APDS9930_CMM_CONTROL; + databuf[1] = APDS9930_CMM_CONTROL_VALUE; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + /*for interrup work mode support -- by liaoxl.lenovo 12.08.2011*/ + if((res = APDS9930_setup_eint(client))!=0) + { + APS_ERR("setup eint: %d\n", res); + return res; + } + if((res = APDS9930_check_and_clear_intr(client))) + { + APS_ERR("check/clear intr: %d\n", res); + return res; + } + + return APDS9930_SUCCESS; + +EXIT_ERR: + APS_ERR("init dev: %d\n", res); + return res; +} + +/****************************************************************************** + * Function Configuration +******************************************************************************/ +int APDS9930_read_als(struct i2c_client *client, u16 *data) +{ + struct APDS9930_priv *obj = i2c_get_clientdata(client); + u16 c0_value, c1_value; + u32 c0_nf, c1_nf; + u8 buffer[2]; + u16 atio; + int res = 0; + + if(client == NULL) + { + APS_DBG("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + + buffer[0]=APDS9930_CMM_C0DATA_L; + res = APDS9930_i2c_master_operate(client, buffer, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + + c0_value = buffer[0] | (buffer[1]<<8); + c0_nf = obj->als_modulus*c0_value; + //APS_LOG("c0_value=%d, c0_nf=%d, als_modulus=%d\n", c0_value, c0_nf, obj->als_modulus); + + buffer[0]=APDS9930_CMM_C1DATA_L; + res = APDS9930_i2c_master_operate(client, buffer, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + + c1_value = buffer[0] | (buffer[1]<<8); + c1_nf = obj->als_modulus*c1_value; + //APS_LOG("c1_value=%d, c1_nf=%d, als_modulus=%d\n", c1_value, c1_nf, obj->als_modulus); + + if((c0_value > c1_value) &&(c0_value < 50000)) + { /*Lenovo-sw chenlj2 add 2011-06-03,add {*/ + atio = (c1_nf*100)/c0_nf; + + //APS_LOG("atio = %d\n", atio); + if(atio<30) + { + *data = (13*c0_nf - 24*c1_nf)/10000; + } + else if(atio>= 30 && atio<38) /*Lenovo-sw chenlj2 add 2011-06-03,modify > to >=*/ + { + *data = (16*c0_nf - 35*c1_nf)/10000; + } + else if(atio>= 38 && atio<45) /*Lenovo-sw chenlj2 add 2011-06-03,modify > to >=*/ + { + *data = (9*c0_nf - 17*c1_nf)/10000; + } + else if(atio>= 45 && atio<54) /*Lenovo-sw chenlj2 add 2011-06-03,modify > to >=*/ + { + *data = (6*c0_nf - 10*c1_nf)/10000; + } + else + *data = 0; + /*Lenovo-sw chenlj2 add 2011-06-03,add }*/ + } + else if (c0_value > 50000) + { + *data = 65535; + } + else if(c0_value == 0) + { + *data = 0; + } + else + { + APS_DBG("APDS9930_read_als als_value is invalid!!\n"); + return -1; + } + + //APS_LOG("APDS9930_read_als als_value_lux = %d\n", *data); + return 0; + + + +EXIT_ERR: + APS_ERR("APDS9930_read_ps fail\n"); + return res; +} +int APDS9930_read_als_ch0(struct i2c_client *client, u16 *data) +{ + //struct APDS9930_priv *obj = i2c_get_clientdata(client); + u16 c0_value; + u8 buffer[2]; + int res = 0; + + if(client == NULL) + { + APS_DBG("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + +//get adc channel 0 value + buffer[0]=APDS9930_CMM_C0DATA_L; + res = APDS9930_i2c_master_operate(client, buffer, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + c0_value = buffer[0] | (buffer[1]<<8); + *data = c0_value; + //APS_LOG("c0_value=%d\n", c0_value); + return 0; + + + +EXIT_ERR: + APS_ERR("APDS9930_read_ps fail\n"); + return res; +} +/*----------------------------------------------------------------------------*/ + +static int APDS9930_get_als_value(struct APDS9930_priv *obj, u16 als) +{ + int idx; + int invalid = 0; + for(idx = 0; idx < obj->als_level_num; idx++) + { + if(als < obj->hw->als_level[idx]) + { + break; + } + } + + if(idx >= obj->als_value_num) + { + APS_ERR("APDS9930_get_als_value exceed range\n"); + idx = obj->als_value_num - 1; + } + + if(1 == atomic_read(&obj->als_deb_on)) + { + unsigned long endt = atomic_read(&obj->als_deb_end); + if(time_after(jiffies, endt)) + { + atomic_set(&obj->als_deb_on, 0); + } + + if(1 == atomic_read(&obj->als_deb_on)) + { + invalid = 1; + } + } + + if(!invalid) + { +#if defined(MTK_AAL_SUPPORT) + int level_high = obj->hw->als_level[idx]; + int level_low = (idx > 0) ? obj->hw->als_level[idx-1] : 0; + int level_diff = level_high - level_low; + int value_high = obj->hw->als_value[idx]; + int value_low = (idx > 0) ? obj->hw->als_value[idx-1] : 0; + int value_diff = value_high - value_low; + int value = 0; + + if ((level_low >= level_high) || (value_low >= value_high)) + value = value_low; + else + value = (level_diff * value_low + (als - level_low) * value_diff + ((level_diff + 1) >> 1)) / level_diff; + + APS_DBG("ALS: %d [%d, %d] => %d [%d, %d] \n", als, level_low, level_high, value, value_low, value_high); + return value; +#endif + //APS_ERR("ALS: %05d => %05d\n", als, obj->hw->als_value[idx]); + return obj->hw->als_value[idx]; + } + else + { + //APS_ERR("ALS: %05d => %05d (-1)\n", als, obj->hw->als_value[idx]); + return -1; + } +} +/*----------------------------------------------------------------------------*/ +long APDS9930_read_ps(struct i2c_client *client, u16 *data) +{ + struct APDS9930_priv *obj = i2c_get_clientdata(client); + u8 buffer[2]; + u16 temp_data; + long res = 0; + + if(client == NULL) + { + APS_DBG("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + + buffer[0]=APDS9930_CMM_PDATA_L; + res = APDS9930_i2c_master_operate(client, buffer, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + + temp_data = buffer[0] | (buffer[1]<<8); + //APS_LOG("yucong APDS9930_read_ps ps_data=%d, low:%d high:%d", *data, buffer[0], buffer[1]); + if(temp_data < obj->ps_cali) + *data = 0; + else + *data = temp_data - obj->ps_cali; + return 0; + return 0; + +EXIT_ERR: + APS_ERR("APDS9930_read_ps fail\n"); + return res; +} +/*----------------------------------------------------------------------------*/ +static int APDS9930_get_ps_value(struct APDS9930_priv *obj, u16 ps) +{ + int val;// mask = atomic_read(&obj->ps_mask); + int invalid = 0; + static int val_temp=1; + + if(ps_cali.valid == 1) + { + if((ps >ps_cali.close)) + { + val = 0; /*close*/ + val_temp = 0; + intr_flag_value = 1; + } + + else if((ps < ps_cali.far_away)) + { + val = 1; /*far away*/ + val_temp = 1; + intr_flag_value = 0; + } + else + val = val_temp; + + APS_LOG("APDS9930_get_ps_value val = %d",val); + } + else + { + if((ps > atomic_read(&obj->ps_thd_val_high))) + { + val = 0; /*close*/ + val_temp = 0; + intr_flag_value = 1; + } + else if((ps < atomic_read(&obj->ps_thd_val_low))) + { + val = 1; /*far away*/ + val_temp = 1; + intr_flag_value = 0; + } + else + val = val_temp; + + } + + if(atomic_read(&obj->ps_suspend)) + { + invalid = 1; + } + else if(1 == atomic_read(&obj->ps_deb_on)) + { + unsigned long endt = atomic_read(&obj->ps_deb_end); + if(time_after(jiffies, endt)) + { + atomic_set(&obj->ps_deb_on, 0); + } + + if (1 == atomic_read(&obj->ps_deb_on)) + { + invalid = 1; + } + } + else if (obj->als > 45000) + { + //invalid = 1; + APS_DBG("ligh too high will result to failt proximiy\n"); + return 1; /*far away*/ + } + + if(!invalid) + { + //APS_DBG("PS: %05d => %05d\n", ps, val); + return val; + } + else + { + return -1; + } +} + + +/*----------------------------------------------------------------------------*/ +/*for interrup work mode support -- by liaoxl.lenovo 12.08.2011*/ +//#define DEBUG_APDS9930 +static void APDS9930_eint_work(struct work_struct *work) +{ + struct APDS9930_priv *obj = (struct APDS9930_priv *)container_of(work, struct APDS9930_priv, eint_work); + int err; + hwm_sensor_data sensor_data; + u8 databuf[3]; + int res = 0; + + if((err = APDS9930_check_intr(obj->client))) + { + APS_ERR("APDS9930_eint_work check intrs: %d\n", err); + } + else + { + //get raw data + APDS9930_read_ps(obj->client, &obj->ps); + APDS9930_read_als_ch0(obj->client, &obj->als); + APS_LOG("APDS9930_eint_work rawdata ps=%d als_ch0=%d!\n",obj->ps,obj->als); + APS_LOG("APDS9930 int top half time = %lld\n", int_top_time); + + if(obj->als > 40000) + { + APS_LOG("APDS9930_eint_work ALS too large may under lighting als_ch0=%d!\n",obj->als); + return; + } + sensor_data.values[0] = APDS9930_get_ps_value(obj, obj->ps); + sensor_data.value_divide = 1; + sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM; + +#ifdef DEBUG_APDS9930 + databuf[0]= APDS9930_CMM_ENABLE; + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x101, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + APS_LOG("APDS9930_eint_work APDS9930_CMM_ENABLE ps value = %x\n",databuf[0]); + + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + APS_LOG("APDS9930_eint_work APDS9930_CMM_INT_LOW_THD_LOW before databuf[0]=%d databuf[1]=%d!\n",databuf[0],databuf[1]); + + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + APS_LOG("APDS9930_eint_work APDS9930_CMM_INT_HIGH_THD_LOW before databuf[0]=%d databuf[1]=%d!\n",databuf[0],databuf[1]); +#endif +/*singal interrupt function add*/ + if(intr_flag_value){ + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_low)) & 0x00FF); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_INT_LOW_THD_HIGH; + databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_low)) & 0xFF00) >> 8); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + databuf[1] = (u8)(0x00FF); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_INT_HIGH_THD_HIGH; + databuf[1] = (u8)((0xFF00) >> 8); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + } + else{ + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + databuf[1] = (u8)(0 & 0x00FF); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_INT_LOW_THD_HIGH; + databuf[1] = (u8)((0 & 0xFF00) >> 8); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_high)) & 0x00FF); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + goto EXIT_ERR; + } + + databuf[0] = APDS9930_CMM_INT_HIGH_THD_HIGH; + databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_high)) & 0xFF00) >> 8); + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x2, I2C_FLAG_WRITE); + res = i2c_master_send(obj->client, databuf, 0x2); + if(res <= 0) + { + goto EXIT_ERR; + } + } + + //let up layer to know + #ifdef DEBUG_APDS9930 + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + APS_LOG("APDS9930_eint_work APDS9930_CMM_INT_LOW_THD_LOW after databuf[0]=%d databuf[1]=%d!\n",databuf[0],databuf[1]); + + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + res = APDS9930_i2c_master_operate(obj->client, databuf, 0x201, I2C_FLAG_READ); + if(res <= 0) + { + goto EXIT_ERR; + } + APS_LOG("APDS9930_eint_work APDS9930_CMM_INT_HIGH_THD_LOW after databuf[0]=%d databuf[1]=%d!\n",databuf[0],databuf[1]); + #endif + if((err = hwmsen_get_interrupt_data(ID_PROXIMITY, &sensor_data))) + { + APS_ERR("call hwmsen_get_interrupt_data fail = %d\n", err); + } + } + + APDS9930_clear_intr(obj->client); + mt_eint_unmask(CUST_EINT_ALS_NUM); + return; + EXIT_ERR: + APDS9930_clear_intr(obj->client); + mt_eint_unmask(CUST_EINT_ALS_NUM); + APS_ERR("i2c_transfer error = %d\n", res); + return; +} + + +/****************************************************************************** + * Function Configuration +******************************************************************************/ +static int APDS9930_open(struct inode *inode, struct file *file) +{ + file->private_data = APDS9930_i2c_client; + + if (!file->private_data) + { + APS_ERR("null pointer!!\n"); + return -EINVAL; + } + + return nonseekable_open(inode, file); +} +/*----------------------------------------------------------------------------*/ +static int APDS9930_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} +/*----------------------------------------------------------------------------*/ +static int set_psensor_threshold(struct i2c_client *client) +{ + struct APDS9930_priv *obj = i2c_get_clientdata(client); + u8 databuf[3]; + int res = 0; + APS_ERR("set_psensor_threshold function high: 0x%x, low:0x%x\n",atomic_read(&obj->ps_thd_val_high),atomic_read(&obj->ps_thd_val_low)); + + databuf[0] = APDS9930_CMM_INT_LOW_THD_LOW; + databuf[1] = (u8)(atomic_read(&obj->ps_thd_val_low) & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + return -1; + } + databuf[0] = APDS9930_CMM_INT_LOW_THD_HIGH; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_low) & 0xFF00) >> 8); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + return -1; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_LOW; + databuf[1] = (u8)(atomic_read(&obj->ps_thd_val_high) & 0x00FF); + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + return -1; + } + databuf[0] = APDS9930_CMM_INT_HIGH_THD_HIGH; + databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_high) & 0xFF00) >> 8);; + res = APDS9930_i2c_master_operate(client, databuf, 0x2, I2C_FLAG_WRITE); + if(res <= 0) + { + return -1; + } + + return 0; +} + +/*----------------------------------------------------------------------------*/ +static long APDS9930_unlocked_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct i2c_client *client = (struct i2c_client*)file->private_data; + struct APDS9930_priv *obj = i2c_get_clientdata(client); + long err = 0; + void __user *ptr = (void __user*) arg; + int dat; + uint32_t enable; + int ps_result; + int ps_cali; + int threshold[2]; + + switch (cmd) + { + case ALSPS_SET_PS_MODE: + if(copy_from_user(&enable, ptr, sizeof(enable))) + { + err = -EFAULT; + goto err_out; + } + if(enable) + { + if((err = APDS9930_enable_ps(obj->client, 1))) + { + APS_ERR("enable ps fail: %ld\n", err); + goto err_out; + } + + set_bit(CMC_BIT_PS, &obj->enable); + } + else + { + if((err = APDS9930_enable_ps(obj->client, 0))) + { + APS_ERR("disable ps fail: %ld\n", err); + goto err_out; + } + + clear_bit(CMC_BIT_PS, &obj->enable); + } + break; + + case ALSPS_GET_PS_MODE: + enable = test_bit(CMC_BIT_PS, &obj->enable) ? (1) : (0); + if(copy_to_user(ptr, &enable, sizeof(enable))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_GET_PS_DATA: + if((err = APDS9930_read_ps(obj->client, &obj->ps))) + { + goto err_out; + } + + dat = APDS9930_get_ps_value(obj, obj->ps); + if(copy_to_user(ptr, &dat, sizeof(dat))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_GET_PS_RAW_DATA: + if((err = APDS9930_read_ps(obj->client, &obj->ps))) + { + goto err_out; + } + + dat = obj->ps; + if(copy_to_user(ptr, &dat, sizeof(dat))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_SET_ALS_MODE: + if(copy_from_user(&enable, ptr, sizeof(enable))) + { + err = -EFAULT; + goto err_out; + } + if(enable) + { + if((err = APDS9930_enable_als(obj->client, 1))) + { + APS_ERR("enable als fail: %ld\n", err); + goto err_out; + } + set_bit(CMC_BIT_ALS, &obj->enable); + } + else + { + if((err = APDS9930_enable_als(obj->client, 0))) + { + APS_ERR("disable als fail: %ld\n", err); + goto err_out; + } + clear_bit(CMC_BIT_ALS, &obj->enable); + } + break; + + case ALSPS_GET_ALS_MODE: + enable = test_bit(CMC_BIT_ALS, &obj->enable) ? (1) : (0); + if(copy_to_user(ptr, &enable, sizeof(enable))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_GET_ALS_DATA: + if((err = APDS9930_read_als(obj->client, &obj->als))) + { + goto err_out; + } + + dat = APDS9930_get_als_value(obj, obj->als); + if(copy_to_user(ptr, &dat, sizeof(dat))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_GET_ALS_RAW_DATA: + if((err = APDS9930_read_als(obj->client, &obj->als))) + { + goto err_out; + } + + dat = obj->als; + if(copy_to_user(ptr, &dat, sizeof(dat))) + { + err = -EFAULT; + goto err_out; + } + break; + /*----------------------------------for factory mode test---------------------------------------*/ + case ALSPS_GET_PS_TEST_RESULT: + if((err = APDS9930_read_ps(obj->client, &obj->ps))) + { + goto err_out; + } + if(obj->ps > atomic_read(&obj->ps_thd_val_high)) + { + ps_result = 0; + } + else ps_result = 1; + + if(copy_to_user(ptr, &ps_result, sizeof(ps_result))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_IOCTL_CLR_CALI: + if(copy_from_user(&dat, ptr, sizeof(dat))) + { + err = -EFAULT; + goto err_out; + } + if(dat == 0) + obj->ps_cali = 0; + break; + + case ALSPS_IOCTL_GET_CALI: + ps_cali = obj->ps_cali ; + if(copy_to_user(ptr, &ps_cali, sizeof(ps_cali))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_IOCTL_SET_CALI: + if(copy_from_user(&ps_cali, ptr, sizeof(ps_cali))) + { + err = -EFAULT; + goto err_out; + } + + obj->ps_cali = ps_cali; + break; + + case ALSPS_SET_PS_THRESHOLD: + if(copy_from_user(threshold, ptr, sizeof(threshold))) + { + err = -EFAULT; + goto err_out; + } + APS_ERR("%s set threshold high: 0x%x, low: 0x%x\n", __func__, threshold[0],threshold[1]); + atomic_set(&obj->ps_thd_val_high, (threshold[0]+obj->ps_cali)); + atomic_set(&obj->ps_thd_val_low, (threshold[1]+obj->ps_cali));//need to confirm + + set_psensor_threshold(obj->client); + + break; + + case ALSPS_GET_PS_THRESHOLD_HIGH: + threshold[0] = atomic_read(&obj->ps_thd_val_high) - obj->ps_cali; + APS_ERR("%s get threshold high: 0x%x\n", __func__, threshold[0]); + if(copy_to_user(ptr, &threshold[0], sizeof(threshold[0]))) + { + err = -EFAULT; + goto err_out; + } + break; + + case ALSPS_GET_PS_THRESHOLD_LOW: + threshold[0] = atomic_read(&obj->ps_thd_val_low) - obj->ps_cali; + APS_ERR("%s get threshold low: 0x%x\n", __func__, threshold[0]); + if(copy_to_user(ptr, &threshold[0], sizeof(threshold[0]))) + { + err = -EFAULT; + goto err_out; + } + break; + /*------------------------------------------------------------------------------------------*/ + default: + APS_ERR("%s not supported = 0x%04x", __FUNCTION__, cmd); + err = -ENOIOCTLCMD; + break; + } + + err_out: + return err; +} +/*----------------------------------------------------------------------------*/ +static struct file_operations APDS9930_fops = { + .owner = THIS_MODULE, + .open = APDS9930_open, + .release = APDS9930_release, + .unlocked_ioctl = APDS9930_unlocked_ioctl, +}; +/*----------------------------------------------------------------------------*/ +static struct miscdevice APDS9930_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "als_ps", + .fops = &APDS9930_fops, +}; +/*----------------------------------------------------------------------------*/ +static int APDS9930_i2c_suspend(struct i2c_client *client, pm_message_t msg) +{ +// struct APDS9930_priv *obj = i2c_get_clientdata(client); +// int err; + APS_FUN(); +#if 0 + if(msg.event == PM_EVENT_SUSPEND) + { + if(!obj) + { + APS_ERR("null pointer!!\n"); + return -EINVAL; + } + + atomic_set(&obj->als_suspend, 1); + if(err = APDS9930_enable_als(client, 0)) + { + APS_ERR("disable als: %d\n", err); + return err; + } + + atomic_set(&obj->ps_suspend, 1); + if(err = APDS9930_enable_ps(client, 0)) + { + APS_ERR("disable ps: %d\n", err); + return err; + } + + APDS9930_power(obj->hw, 0); + } +#endif + return 0; +} +/*----------------------------------------------------------------------------*/ +static int APDS9930_i2c_resume(struct i2c_client *client) +{ +// struct APDS9930_priv *obj = i2c_get_clientdata(client); +// int err; + APS_FUN(); +#if 0 + if(!obj) + { + APS_ERR("null pointer!!\n"); + return -EINVAL; + } + + APDS9930_power(obj->hw, 1); + if(err = APDS9930_init_client(client)) + { + APS_ERR("initialize client fail!!\n"); + return err; + } + atomic_set(&obj->als_suspend, 0); + if(test_bit(CMC_BIT_ALS, &obj->enable)) + { + if(err = APDS9930_enable_als(client, 1)) + { + APS_ERR("enable als fail: %d\n", err); + } + } + atomic_set(&obj->ps_suspend, 0); + if(test_bit(CMC_BIT_PS, &obj->enable)) + { + if(err = APDS9930_enable_ps(client, 1)) + { + APS_ERR("enable ps fail: %d\n", err); + } + } +#endif + return 0; +} +/*----------------------------------------------------------------------------*/ +static void APDS9930_early_suspend(struct early_suspend *h) +{ /*early_suspend is only applied for ALS*/ + struct APDS9930_priv *obj = container_of(h, struct APDS9930_priv, early_drv); + int err; + APS_FUN(); + + if(!obj) + { + APS_ERR("null pointer!!\n"); + return; + } + + #if 1 + atomic_set(&obj->als_suspend, 1); + if(test_bit(CMC_BIT_ALS, &obj->enable)) + { + if((err = APDS9930_enable_als(obj->client, 0))) + { + APS_ERR("disable als fail: %d\n", err); + } + } + #endif +} +/*----------------------------------------------------------------------------*/ +static void APDS9930_late_resume(struct early_suspend *h) +{ /*early_suspend is only applied for ALS*/ + struct APDS9930_priv *obj = container_of(h, struct APDS9930_priv, early_drv); + int err; + APS_FUN(); + + if(!obj) + { + APS_ERR("null pointer!!\n"); + return; + } + + #if 1 + atomic_set(&obj->als_suspend, 0); + if(test_bit(CMC_BIT_ALS, &obj->enable)) + { + if((err = APDS9930_enable_als(obj->client, 1))) + { + APS_ERR("enable als fail: %d\n", err); + + } + } + #endif +} +/*----------------------------------------------------------------------------*/ +static int temp_als = 0; +static int ALS_FLAG = 0; + +int APDS9930_ps_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int value; + int err = 0; + + hwm_sensor_data* sensor_data; + struct APDS9930_priv *obj = (struct APDS9930_priv *)self; + + //APS_FUN(f); + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + APS_ERR("Set delay parameter error!\n"); + err = -EINVAL; + } + // Do nothing + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + APS_ERR("Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if(value) + { + if((err = APDS9930_enable_ps(obj->client, 1))) + { + APS_ERR("enable ps fail: %d\n", err); + return -1; + } + set_bit(CMC_BIT_PS, &obj->enable); + #if 1 + if(!test_bit(CMC_BIT_ALS, &obj->enable)) + { + ALS_FLAG = 1; + if((err = APDS9930_enable_als(obj->client, 1))) + { + APS_ERR("enable als fail: %d\n", err); + return -1; + } + } + #endif + } + else + { + if((err = APDS9930_enable_ps(obj->client, 0))) + { + APS_ERR("disable ps fail: %d\n", err); + return -1; + } + clear_bit(CMC_BIT_PS, &obj->enable); + #if 1 + if(ALS_FLAG == 1) + { + if((err = APDS9930_enable_als(obj->client, 0))) + { + APS_ERR("disable als fail: %d\n", err); + return -1; + } + ALS_FLAG = 0; + } + #endif + } + } + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + APS_ERR("get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + sensor_data = (hwm_sensor_data *)buff_out; + APDS9930_read_ps(obj->client, &obj->ps); + APDS9930_read_als_ch0(obj->client, &obj->als); + APS_ERR("APDS9930_ps_operate als data=%d!\n",obj->als); + sensor_data->values[0] = APDS9930_get_ps_value(obj, obj->ps); + sensor_data->value_divide = 1; + sensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; + } + break; + default: + APS_ERR("proxmy sensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + + +int APDS9930_als_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + hwm_sensor_data* sensor_data; + struct APDS9930_priv *obj = (struct APDS9930_priv *)self; + + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + APS_ERR("Set delay parameter error!\n"); + err = -EINVAL; + } + // Do nothing + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + APS_ERR("Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if(value) + { + if((err = APDS9930_enable_als(obj->client, 1))) + { + APS_ERR("enable als fail: %d\n", err); + return -1; + } + set_bit(CMC_BIT_ALS, &obj->enable); + } + else + { + if((err = APDS9930_enable_als(obj->client, 0))) + { + APS_ERR("disable als fail: %d\n", err); + return -1; + } + clear_bit(CMC_BIT_ALS, &obj->enable); + } + + } + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + APS_ERR("get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + sensor_data = (hwm_sensor_data *)buff_out; + /*yucong MTK add for fixing known issue*/ + APDS9930_read_als(obj->client, &obj->als); + if(obj->als == 0) + { + sensor_data->values[0] = temp_als; + }else{ + u16 b[2]; + int i; + for(i = 0;i < 2;i++){ + APDS9930_read_als(obj->client, &obj->als); + b[i] = obj->als; + } + (b[1] > b[0])?(obj->als = b[0]):(obj->als = b[1]); + sensor_data->values[0] = APDS9930_get_als_value(obj, obj->als); + temp_als = sensor_data->values[0]; + } + sensor_data->value_divide = 1; + sensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; + } + break; + default: + APS_ERR("light sensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + + +/*----------------------------------------------------------------------------*/ +static int APDS9930_i2c_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + strcpy(info->type, APDS9930_DEV_NAME); + return 0; +} + +/*----------------------------------------------------------------------------*/ +static int APDS9930_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct APDS9930_priv *obj; + struct hwmsen_object obj_ps, obj_als; + int err = 0; + + if(!(obj = kzalloc(sizeof(*obj), GFP_KERNEL))) + { + err = -ENOMEM; + goto exit; + } + memset(obj, 0, sizeof(*obj)); + APDS9930_obj = obj; + obj->hw = get_cust_alsps_hw(); + APDS9930_get_addr(obj->hw, &obj->addr); + + /*for interrup work mode support -- by liaoxl.lenovo 12.08.2011*/ + INIT_WORK(&obj->eint_work, APDS9930_eint_work); + obj->client = client; + i2c_set_clientdata(client, obj); + atomic_set(&obj->als_debounce, 50); + atomic_set(&obj->als_deb_on, 0); + atomic_set(&obj->als_deb_end, 0); + atomic_set(&obj->ps_debounce, 10); + atomic_set(&obj->ps_deb_on, 0); + atomic_set(&obj->ps_deb_end, 0); + atomic_set(&obj->ps_mask, 0); + atomic_set(&obj->als_suspend, 0); + atomic_set(&obj->als_cmd_val, 0xDF); + atomic_set(&obj->ps_cmd_val, 0xC1); + atomic_set(&obj->ps_thd_val_high, obj->hw->ps_threshold_high); + atomic_set(&obj->ps_thd_val_low, obj->hw->ps_threshold_low); + obj->enable = 0; + obj->pending_intr = 0; + obj->als_level_num = sizeof(obj->hw->als_level)/sizeof(obj->hw->als_level[0]); + obj->als_value_num = sizeof(obj->hw->als_value)/sizeof(obj->hw->als_value[0]); + /*Lenovo-sw chenlj2 add 2011-06-03,modified gain 16 to 1/5 accoring to actual thing */ + obj->als_modulus = (400*100*ZOOM_TIME)/(1*150);//(1/Gain)*(400/Tine), this value is fix after init ATIME and CONTROL register value + //(400)/16*2.72 here is amplify *100 //16 + BUG_ON(sizeof(obj->als_level) != sizeof(obj->hw->als_level)); + memcpy(obj->als_level, obj->hw->als_level, sizeof(obj->als_level)); + BUG_ON(sizeof(obj->als_value) != sizeof(obj->hw->als_value)); + memcpy(obj->als_value, obj->hw->als_value, sizeof(obj->als_value)); + atomic_set(&obj->i2c_retry, 3); + set_bit(CMC_BIT_ALS, &obj->enable); + set_bit(CMC_BIT_PS, &obj->enable); + + obj->ps_cali = 0; + + APDS9930_i2c_client = client; + + if(1 == obj->hw->polling_mode_ps) + //if (1) + { + obj_ps.polling = 1; + } + else + { + obj_ps.polling = 0; + } + + if((err = APDS9930_init_client(client))) + { + goto exit_init_failed; + } + APS_LOG("APDS9930_init_client() OK!\n"); + + if((err = misc_register(&APDS9930_device))) + { + APS_ERR("APDS9930_device register failed\n"); + goto exit_misc_device_register_failed; + } +/* + if(err = APDS9930_create_attr(&APDS9930_alsps_driver.driver)) + { + APS_ERR("create attribute err = %d\n", err); + goto exit_create_attr_failed; + } +*/ + obj_ps.self = APDS9930_obj; + + obj_ps.sensor_operate = APDS9930_ps_operate; + if((err = hwmsen_attach(ID_PROXIMITY, &obj_ps))) + { + APS_ERR("attach fail = %d\n", err); + goto exit_create_attr_failed; + } + + obj_als.self = APDS9930_obj; + obj_als.polling = 1; + obj_als.sensor_operate = APDS9930_als_operate; + if((err = hwmsen_attach(ID_LIGHT, &obj_als))) + { + APS_ERR("attach fail = %d\n", err); + goto exit_create_attr_failed; + } + + +#if defined(CONFIG_HAS_EARLYSUSPEND) + obj->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1, + obj->early_drv.suspend = APDS9930_early_suspend, + obj->early_drv.resume = APDS9930_late_resume, + register_early_suspend(&obj->early_drv); +#endif + + APS_LOG("%s: OK\n", __func__); + return 0; + + exit_create_attr_failed: + misc_deregister(&APDS9930_device); + exit_misc_device_register_failed: + exit_init_failed: + //i2c_detach_client(client); + //exit_kfree: + kfree(obj); + exit: + APDS9930_i2c_client = NULL; +// MT6516_EINTIRQMask(CUST_EINT_ALS_NUM); /*mask interrupt if fail*/ + APS_ERR("%s: err = %d\n", __func__, err); + return err; +} +/*----------------------------------------------------------------------------*/ +static int APDS9930_i2c_remove(struct i2c_client *client) +{ + int err; +/* + if(err = APDS9930_delete_attr(&APDS9930_i2c_driver.driver)) + { + APS_ERR("APDS9930_delete_attr fail: %d\n", err); + } +*/ + if((err = misc_deregister(&APDS9930_device))) + { + APS_ERR("misc_deregister fail: %d\n", err); + } + + APDS9930_i2c_client = NULL; + i2c_unregister_device(client); + kfree(i2c_get_clientdata(client)); + + return 0; +} +/*----------------------------------------------------------------------------*/ +static int APDS9930_probe(struct platform_device *pdev) +{ + struct alsps_hw *hw = get_cust_alsps_hw(); + + APDS9930_power(hw, 1); + //APDS9930_force[0] = hw->i2c_num; + //APDS9930_force[1] = hw->i2c_addr[0]; + //APS_DBG("I2C = %d, addr =0x%x\n",APDS9930_force[0],APDS9930_force[1]); + if(i2c_add_driver(&APDS9930_i2c_driver)) + { + APS_ERR("add driver error\n"); + return -1; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static int APDS9930_remove(struct platform_device *pdev) +{ + struct alsps_hw *hw = get_cust_alsps_hw(); + APS_FUN(); + APDS9930_power(hw, 0); + i2c_del_driver(&APDS9930_i2c_driver); + return 0; +} +/*----------------------------------------------------------------------------*/ +static struct platform_driver APDS9930_alsps_driver = { + .probe = APDS9930_probe, + .remove = APDS9930_remove, + .driver = { + .name = "als_ps", +// .owner = THIS_MODULE, + } +}; +/*----------------------------------------------------------------------------*/ +static int __init APDS9930_init(void) +{ + //APS_FUN(); + struct alsps_hw *hw = get_cust_alsps_hw(); + APS_LOG("%s: i2c_number=%d\n", __func__,hw->i2c_num); + i2c_register_board_info(hw->i2c_num, &i2c_APDS9930, 1); + if(platform_driver_register(&APDS9930_alsps_driver)) + { + APS_ERR("failed to register driver"); + return -ENODEV; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static void __exit APDS9930_exit(void) +{ + APS_FUN(); + platform_driver_unregister(&APDS9930_alsps_driver); +} +/*----------------------------------------------------------------------------*/ +module_init(APDS9930_init); +module_exit(APDS9930_exit); +/*----------------------------------------------------------------------------*/ +MODULE_AUTHOR("Dexiang Liu"); +MODULE_DESCRIPTION("APDS9930 driver"); +MODULE_LICENSE("GPL"); + diff --git a/arch/arm/mach-mt8127/ford/alsps/APDS9930.h b/arch/arm/mach-mt8127/ford/alsps/APDS9930.h new file mode 100644 index 00000000000..e96d807e246 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/alsps/APDS9930.h @@ -0,0 +1,60 @@ +/* + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/* + * Definitions for APDS9930 als/ps sensor chip. + */ +#ifndef __APDS9930_H__ +#define __APDS9930_H__ + +#include + +extern int APDS9930_CMM_PPCOUNT_VALUE; +extern int APDS9930_CMM_CONTROL_VALUE; +extern int ZOOM_TIME; + +#define APDS9930_CMM_ENABLE 0X80 +#define APDS9930_CMM_ATIME 0X81 +#define APDS9930_CMM_PTIME 0X82 +#define APDS9930_CMM_WTIME 0X83 +/*for interrup work mode support -- by liaoxl.lenovo 12.08.2011*/ +#define APDS9930_CMM_INT_LOW_THD_LOW 0X88 +#define APDS9930_CMM_INT_LOW_THD_HIGH 0X89 +#define APDS9930_CMM_INT_HIGH_THD_LOW 0X8A +#define APDS9930_CMM_INT_HIGH_THD_HIGH 0X8B +#define APDS9930_CMM_Persistence 0X8C +#define APDS9930_CMM_STATUS 0X93 +#define TAOS_TRITON_CMD_REG 0X80 +#define TAOS_TRITON_CMD_SPL_FN 0x60 + +#define APDS9930_CMM_CONFIG 0X8D +#define APDS9930_CMM_PPCOUNT 0X8E +#define APDS9930_CMM_CONTROL 0X8F + +#define APDS9930_CMM_PDATA_L 0X98 +#define APDS9930_CMM_PDATA_H 0X99 +#define APDS9930_CMM_C0DATA_L 0X94 +#define APDS9930_CMM_C0DATA_H 0X95 +#define APDS9930_CMM_C1DATA_L 0X96 +#define APDS9930_CMM_C1DATA_H 0X97 + + +#define APDS9930_SUCCESS 0 +#define APDS9930_ERR_I2C -1 +#define APDS9930_ERR_STATUS -3 +#define APDS9930_ERR_SETUP_FAILURE -4 +#define APDS9930_ERR_GETGSENSORDATA -5 +#define APDS9930_ERR_IDENTIFICATION -6 + + +#endif + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/Makefile b/arch/arm/mach-mt8127/ford/alsps/Makefile old mode 100644 new mode 100755 similarity index 70% rename from drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/Makefile rename to arch/arm/mach-mt8127/ford/alsps/Makefile index c030c7a0188..b384f32b86e --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/Makefile +++ b/arch/arm/mach-mt8127/ford/alsps/Makefile @@ -1,4 +1,4 @@ include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += gc2355_Sensor.o +obj-y += cust_alsps.o diff --git a/arch/arm/mach-mt8127/ford/alsps/alsps.c b/arch/arm/mach-mt8127/ford/alsps/alsps.c new file mode 100644 index 00000000000..2b19f2b77d4 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/alsps/alsps.c @@ -0,0 +1,1094 @@ + +#include "alsps.h" + +static struct alsps_context *alsps_context_obj = NULL; + + +static struct alsps_init_info* alsps_init_list[MAX_CHOOSE_ALSPS_NUM]= {0}; //modified +static void alsps_early_suspend(struct early_suspend *h); +static void alsps_late_resume(struct early_suspend *h); + + +int als_data_report(struct input_dev *dev, int value, int status) +{ + //ALSPS_LOG("+als_data_report! %d, %d\n",value,status); + input_report_abs(dev, EVENT_TYPE_ALS_VALUE, value); + input_report_abs(dev, EVENT_TYPE_ALS_STATUS, status); + input_sync(dev); + return 0; +} + +int ps_data_report(struct input_dev *dev, int value,int status) +{ + //ALSPS_LOG("+ps_data_report! %d, %d\n",value,status); + input_report_abs(dev, EVENT_TYPE_PS_VALUE, value); + input_report_abs(dev, EVENT_TYPE_PS_STATUS, status); + input_sync(dev); + return 0; +} + +static void als_work_func(struct work_struct *work) +{ + + struct alsps_context *cxt = NULL; + int out_size; + //hwm_sensor_data sensor_data; + int value,status,div; + int64_t nt; + struct timespec time; + int err, idx; + + cxt = alsps_context_obj; + + if(NULL == cxt->als_data.get_data) + { + ALSPS_LOG("alsps driver not register data path\n"); + } + + + time.tv_sec = time.tv_nsec = 0; + time = get_monotonic_coarse(); + nt = time.tv_sec*1000000000LL+time.tv_nsec; + + //add wake lock to make sure data can be read before system suspend + err = cxt->als_data.get_data(&value,&status); + + if(err) + { + ALSPS_ERR("get alsps data fails!!\n" ); + goto als_loop; + } + else + { + { + cxt->drv_data.als_data.values[0] = value; + cxt->drv_data.als_data.status = status; + cxt->drv_data.als_data.time = nt; + + } + } + + if(true == cxt->is_als_first_data_after_enable) + { + cxt->is_als_first_data_after_enable = false; + //filter -1 value + if(ALSPS_INVALID_VALUE == cxt->drv_data.als_data.values[0] ) + { + ALSPS_LOG(" read invalid data \n"); + goto als_loop; + + } + } + //report data to input device + //printk("new alsps work run....\n"); + //ALSPS_LOG("als data[%d] \n" ,cxt->drv_data.als_data.values[0]); + + als_data_report(cxt->idev, + cxt->drv_data.als_data.values[0], + cxt->drv_data.als_data.status); + + als_loop: + if(true == cxt->is_als_polling_run) + { + { + mod_timer(&cxt->timer_als, jiffies + atomic_read(&cxt->delay_als)/(1000/HZ)); + } + + } +} + +static void ps_work_func(struct work_struct *work) +{ + + struct alsps_context *cxt = NULL; + int out_size; + //hwm_sensor_data sensor_data; + int value,status,div; + int64_t nt; + struct timespec time; + int err, idx; + + cxt = alsps_context_obj; + + if(NULL == cxt->ps_data.get_data) + { + ALSPS_LOG("alsps driver not register data path\n"); + } + + + time.tv_sec = time.tv_nsec = 0; + time = get_monotonic_coarse(); + nt = time.tv_sec*1000000000LL+time.tv_nsec; + + //add wake lock to make sure data can be read before system suspend + err = cxt->ps_data.get_data(&value,&status); + + if(err) + { + ALSPS_ERR("get alsps data fails!!\n" ); + goto ps_loop; + } + else + { + { + cxt->drv_data.ps_data.values[0] = value; + cxt->drv_data.ps_data.status = status; + cxt->drv_data.ps_data.time = nt; + + } + } + + if(true == cxt->is_ps_first_data_after_enable) + { + cxt->is_ps_first_data_after_enable = false; + //filter -1 value + if(ALSPS_INVALID_VALUE == cxt->drv_data.ps_data.values[0]) + { + ALSPS_LOG(" read invalid data \n"); + goto ps_loop; + + } + } + //report data to input device + //printk("new alsps work run....\n"); + //ALSPS_LOG("alsps data[%d,%d,%d] \n" ,cxt->drv_data.alsps_data.values[0], + //cxt->drv_data.alsps_data.values[1],cxt->drv_data.alsps_data.values[2]); + + ps_data_report(cxt->idev, + cxt->drv_data.ps_data.values[0], + cxt->drv_data.ps_data.status); + + ps_loop: + if(true == cxt->is_ps_polling_run) + { + { + mod_timer(&cxt->timer_ps, jiffies + atomic_read(&cxt->delay_ps)/(1000/HZ)); + } + + } +} + +static void als_poll(unsigned long data) +{ + struct alsps_context *obj = (struct alsps_context *)data; + if(obj != NULL) + { + schedule_work(&obj->report_als); + } +} + +static void ps_poll(unsigned long data) +{ + struct alsps_context *obj = (struct alsps_context *)data; + if(obj != NULL) + { + if(obj->ps_ctl.is_polling_mode) + schedule_work(&obj->report_ps); + } +} + +static struct alsps_context *alsps_context_alloc_object(void) +{ + + struct alsps_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL); + ALSPS_LOG("alsps_context_alloc_object++++\n"); + if(!obj) + { + ALSPS_ERR("Alloc alsps object error!\n"); + return NULL; + } + atomic_set(&obj->delay_als, 200); /*5Hz*/// set work queue delay time 200ms + atomic_set(&obj->delay_ps, 200); /*5Hz*/// set work queue delay time 200ms + atomic_set(&obj->wake, 0); + INIT_WORK(&obj->report_als, als_work_func); + INIT_WORK(&obj->report_ps, ps_work_func); + init_timer(&obj->timer_als); + init_timer(&obj->timer_ps); + obj->timer_als.expires = jiffies + atomic_read(&obj->delay_als)/(1000/HZ); + obj->timer_als.function = als_poll; + obj->timer_als.data = (unsigned long)obj; + + obj->timer_ps.expires = jiffies + atomic_read(&obj->delay_ps)/(1000/HZ); + obj->timer_ps.function = ps_poll; + obj->timer_ps.data = (unsigned long)obj; + + obj->is_als_first_data_after_enable = false; + obj->is_als_polling_run = false; + obj->is_ps_first_data_after_enable = false; + obj->is_ps_polling_run = false; + mutex_init(&obj->alsps_op_mutex); + obj->is_als_batch_enable = false;//for batch mode init + obj->is_ps_batch_enable = false;//for batch mode init + + ALSPS_LOG("alsps_context_alloc_object----\n"); + return obj; +} + +static int als_real_enable(int enable) +{ + int err =0; + struct alsps_context *cxt = NULL; + cxt = alsps_context_obj; + if(1==enable) + { + + if(true==cxt->is_als_active_data || true ==cxt->is_als_active_nodata) + { + err = cxt->als_ctl.enable_nodata(1); + if(err) + { + err = cxt->als_ctl.enable_nodata(1); + if(err) + { + err = cxt->als_ctl.enable_nodata(1); + if(err) + ALSPS_ERR("alsps enable(%d) err 3 timers = %d\n", enable, err); + } + } + ALSPS_LOG("alsps real enable \n" ); + } + + } + if(0==enable) + { + if(false==cxt->is_als_active_data && false ==cxt->is_als_active_nodata) + { + err = cxt->als_ctl.enable_nodata(0); + if(err) + { + ALSPS_ERR("alsps enable(%d) err = %d\n", enable, err); + } + ALSPS_LOG("alsps real disable \n" ); + } + + } + + return err; +} +static int als_enable_data(int enable) +{ + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + if(NULL == cxt->als_ctl.open_report_data) + { + ALSPS_ERR("no als control path\n"); + return -1; + } + + if(1 == enable) + { + ALSPS_LOG("ALSPS enable data\n"); + cxt->is_als_active_data =true; + cxt->is_als_first_data_after_enable = true; + cxt->als_ctl.open_report_data(1); + if(false == cxt->is_als_polling_run && cxt->is_als_batch_enable == false) + { + if(false == cxt->als_ctl.is_report_input_direct) + { + mod_timer(&cxt->timer_als, jiffies + atomic_read(&cxt->delay_als)/(1000/HZ)); + cxt->is_als_polling_run = true; + } + } + } + if(0 == enable) + { + ALSPS_LOG("ALSPS disable \n"); + cxt->is_als_active_data =false; + cxt->als_ctl.open_report_data(0); + if(true == cxt->is_als_polling_run) + { + if(false == cxt->als_ctl.is_report_input_direct ) + { + cxt->is_als_polling_run = false; + del_timer_sync(&cxt->timer_als); + cancel_work_sync(&cxt->report_als); + cxt->drv_data.als_data.values[0] = ALSPS_INVALID_VALUE; + } + } + } + als_real_enable(enable); + return 0; +} + +static int ps_real_enable(int enable) +{ + int err =0; + struct alsps_context *cxt = NULL; + cxt = alsps_context_obj; + if(1==enable) + { + + if(true==cxt->is_ps_active_data || true ==cxt->is_ps_active_nodata) + { + err = cxt->ps_ctl.enable_nodata(1); + if(err) + { + err = cxt->ps_ctl.enable_nodata(1); + if(err) + { + err = cxt->ps_ctl.enable_nodata(1); + if(err) + ALSPS_ERR("ps enable(%d) err 3 timers = %d\n", enable, err); + } + } + ALSPS_LOG("ps real enable \n" ); + } + + } + if(0==enable) + { + if(false==cxt->is_ps_active_data && false ==cxt->is_ps_active_nodata) + { + err = cxt->ps_ctl.enable_nodata(0); + if(err) + { + ALSPS_ERR("ps enable(%d) err = %d\n", enable, err); + } + ALSPS_LOG("ps real disable \n" ); + } + + } + + return err; +} +static int ps_enable_data(int enable) +{ + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + if(NULL == cxt->ps_ctl.open_report_data) + { + ALSPS_ERR("no ps control path\n"); + return -1; + } + + if(1 == enable) + { + ALSPS_LOG("PS enable data\n"); + cxt->is_ps_active_data =true; + cxt->is_ps_first_data_after_enable = true; + cxt->ps_ctl.open_report_data(1); + if(false == cxt->is_ps_polling_run && cxt->is_ps_batch_enable == false) + { + if(false == cxt->ps_ctl.is_report_input_direct) + { + mod_timer(&cxt->timer_ps, jiffies + atomic_read(&cxt->delay_ps)/(1000/HZ)); + cxt->is_ps_polling_run = true; + } + } + } + if(0 == enable) + { + ALSPS_LOG("PS disable \n"); + cxt->is_ps_active_data =false; + cxt->ps_ctl.open_report_data(0); + if(true == cxt->is_ps_polling_run) + { + if(false == cxt->ps_ctl.is_report_input_direct ) + { + cxt->is_ps_polling_run = false; + del_timer_sync(&cxt->timer_ps); + cancel_work_sync(&cxt->report_ps); + cxt->drv_data.ps_data.values[0] = ALSPS_INVALID_VALUE; + } + } + } + ps_real_enable(enable); + return 0; +} + +static ssize_t als_store_active(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ALSPS_LOG("als_store_active buf=%s\n",buf); + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + + if (!strncmp(buf, "1", 1)) + { + als_enable_data(1); + } + else if (!strncmp(buf, "0", 1)) + { + als_enable_data(0); + } + else + { + ALSPS_ERR(" alsps_store_active error !!\n"); + } + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + ALSPS_LOG(" alsps_store_active done\n"); + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t als_show_active(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct alsps_context *cxt = NULL; + cxt = alsps_context_obj; + int div=cxt->als_data.vender_div; + ALSPS_LOG("als vender_div value: %d\n", div); + return snprintf(buf, PAGE_SIZE, "%d\n", div); +} + +static ssize_t als_store_delay(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) + +{ + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *devobj = (struct alsps_context*)dev_get_drvdata(dev); + int delay; + int mdelay=0; + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + if(NULL == cxt->als_ctl.set_delay) + { + ALSPS_LOG("als_ctl set_delay NULL\n"); + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; + } + + if (1 != sscanf(buf, "%d", &delay)) { + ALSPS_ERR("invalid format!!\n"); + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; + } + + if(false == cxt->als_ctl.is_report_input_direct) + { + mdelay = (int)delay/1000/1000; + atomic_set(&alsps_context_obj->delay_als, mdelay); + } + cxt->als_ctl.set_delay(delay); + ALSPS_LOG(" als_delay %d ns\n",delay); + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; + +} + +static ssize_t als_show_delay(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + ALSPS_LOG(" not support now\n"); + return len; +} + + +static ssize_t als_store_batch(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ALSPS_LOG("als_store_batch buf=%s\n",buf); + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + if(cxt->als_ctl.is_support_batch){ + if (!strncmp(buf, "1", 1)) + { + cxt->is_als_batch_enable = true; + } + else if (!strncmp(buf, "0", 1)) + { + cxt->is_als_batch_enable = false; + } + else + { + ALSPS_ERR(" als_store_batch error !!\n"); + } + }else{ + ALSPS_LOG(" als_store_batch not supported\n"); + } + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + ALSPS_LOG(" als_store_batch done: %d\n", cxt->is_als_batch_enable); + return count; + +} + +static ssize_t als_show_batch(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static ssize_t als_store_flush(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *devobj = (struct alsps_context*)dev_get_drvdata(dev); + //do read FIFO data function and report data immediately + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; +} + +static ssize_t als_show_flush(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static ssize_t als_show_devnum(struct device* dev, + struct device_attribute *attr, char *buf) +{ + char *devname =NULL; + devname = dev_name(&alsps_context_obj->idev->dev); + return snprintf(buf, PAGE_SIZE, "%s\n", devname+5); +} +static ssize_t ps_store_active(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ALSPS_LOG("ps_store_active buf=%s\n",buf); + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + + if (!strncmp(buf, "1", 1)) + { + ps_enable_data(1); + } + else if (!strncmp(buf, "0", 1)) + { + ps_enable_data(0); + } + else + { + ALSPS_ERR(" ps_store_active error !!\n"); + } + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + ALSPS_LOG(" ps_store_active done\n"); + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t ps_show_active(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct alsps_context *cxt = NULL; + cxt = alsps_context_obj; + int div=cxt->ps_data.vender_div; + ALSPS_LOG("ps vender_div value: %d\n", div); + return snprintf(buf, PAGE_SIZE, "%d\n", div); +} + +static ssize_t ps_store_delay(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) + +{ + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *devobj = (struct alsps_context*)dev_get_drvdata(dev); + int delay; + int mdelay=0; + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + if(NULL == cxt->ps_ctl.set_delay) + { + ALSPS_LOG("ps_ctl set_delay NULL\n"); + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; + } + + if (1 != sscanf(buf, "%d", &delay)) { + ALSPS_ERR("invalid format!!\n"); + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; + } + + if(false == cxt->ps_ctl.is_report_input_direct) + { + mdelay = (int)delay/1000/1000; + atomic_set(&alsps_context_obj->delay_ps, mdelay); + } + cxt->ps_ctl.set_delay(delay); + ALSPS_LOG(" ps_delay %d ns\n",delay); + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; + +} + +static ssize_t ps_show_delay(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + ALSPS_LOG(" not support now\n"); + return len; +} + + +static ssize_t ps_store_batch(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + ALSPS_LOG("ps_store_batch buf=%s\n",buf); + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + if(cxt->ps_ctl.is_support_batch){ + if (!strncmp(buf, "1", 1)) + { + cxt->is_ps_batch_enable = true; + } + else if (!strncmp(buf, "0", 1)) + { + cxt->is_ps_batch_enable = false; + } + else + { + ALSPS_ERR(" ps_store_batch error !!\n"); + } + }else{ + ALSPS_LOG(" ps_store_batch not supported\n"); + } + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + ALSPS_LOG(" ps_store_batch done: %d\n", cxt->is_ps_batch_enable); + return count; + +} + +static ssize_t ps_show_batch(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static ssize_t ps_store_flush(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&alsps_context_obj->alsps_op_mutex); + struct alsps_context *devobj = (struct alsps_context*)dev_get_drvdata(dev); + //do read FIFO data function and report data immediately + mutex_unlock(&alsps_context_obj->alsps_op_mutex); + return count; +} + +static ssize_t ps_show_flush(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static ssize_t ps_show_devnum(struct device* dev, + struct device_attribute *attr, char *buf) +{ + char *devname =NULL; + devname = dev_name(&alsps_context_obj->idev->dev); + return snprintf(buf, PAGE_SIZE, "%s\n", devname+5); +} +static int als_ps_remove(struct platform_device *pdev) +{ + ALSPS_LOG("als_ps_remove\n"); + return 0; +} + +static int als_ps_probe(struct platform_device *pdev) +{ + ALSPS_LOG("als_ps_probe\n"); + return 0; +} + +static struct platform_driver als_ps_driver = { + .probe = als_ps_probe, + .remove = als_ps_remove, + .driver = + { + .name = "als_ps", + } +}; + +static int alsps_real_driver_init(void) +{ + int i =0; + int err=0; + ALSPS_LOG(" alsps_real_driver_init +\n"); + for(i = 0; i < MAX_CHOOSE_ALSPS_NUM; i++) + { + ALSPS_LOG("alsps_real_driver_init i=%d\n",i); + if(0 != alsps_init_list[i]) + { + ALSPS_LOG(" alsps try to init driver %s\n", alsps_init_list[i]->name); + err = alsps_init_list[i]->init(); + if(0 == err) + { + ALSPS_LOG(" alsps real driver %s probe ok\n", alsps_init_list[i]->name); + break; + } + } + } + + if(i == MAX_CHOOSE_ALSPS_NUM) + { + ALSPS_LOG(" alsps_real_driver_init fail\n"); + err=-1; + } + return err; +} + + int alsps_driver_add(struct alsps_init_info* obj) +{ + int err=0; + int i =0; + + ALSPS_FUN(); + + for(i =0; i < MAX_CHOOSE_ALSPS_NUM; i++ ) + { + if(i == 0){ + ALSPS_LOG("register alsps driver for the first time\n"); + if(platform_driver_register(&als_ps_driver)) + { + ALSPS_ERR("failed to register gensor driver already exist\n"); + } + } + + if(NULL == alsps_init_list[i]) + { + obj->platform_diver_addr = &als_ps_driver; + alsps_init_list[i] = obj; + break; + } + } + if(NULL==alsps_init_list[i]) + { + ALSPS_ERR("ALSPS driver add err \n"); + err=-1; + } + + return err; +} +EXPORT_SYMBOL_GPL(alsps_driver_add); + +int ps_report_interrupt_data(int value) +{ + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + ps_data_report(cxt->idev,value,3); + + return 0; +} +/*----------------------------------------------------------------------------*/ +EXPORT_SYMBOL_GPL(ps_report_interrupt_data); + +static int alsps_misc_init(struct alsps_context *cxt) +{ + + int err=0; + cxt->mdev.minor = MISC_DYNAMIC_MINOR; + cxt->mdev.name = ALSPS_MISC_DEV_NAME; + if((err = misc_register(&cxt->mdev))) + { + ALSPS_ERR("unable to register alsps misc device!!\n"); + } + return err; +} + +static void alsps_input_destroy(struct alsps_context *cxt) +{ + struct input_dev *dev = cxt->idev; + + input_unregister_device(dev); + input_free_device(dev); +} + +static int alsps_input_init(struct alsps_context *cxt) +{ + struct input_dev *dev; + int err = 0; + + dev = input_allocate_device(); + if (NULL == dev) + return -ENOMEM; + + dev->name = ALSPS_INPUTDEV_NAME; + + input_set_capability(dev, EV_ABS, EVENT_TYPE_ALS_VALUE); + input_set_capability(dev, EV_ABS, EVENT_TYPE_PS_VALUE); + input_set_capability(dev, EV_ABS, EVENT_TYPE_ALS_STATUS); + input_set_capability(dev, EV_ABS, EVENT_TYPE_PS_STATUS); + + input_set_abs_params(dev, EVENT_TYPE_ALS_VALUE, ALSPS_VALUE_MIN, ALSPS_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_PS_VALUE, ALSPS_VALUE_MIN, ALSPS_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_ALS_STATUS, ALSPS_STATUS_MIN, ALSPS_STATUS_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_PS_STATUS, ALSPS_STATUS_MIN, ALSPS_STATUS_MAX, 0, 0); + input_set_drvdata(dev, cxt); + + err = input_register_device(dev); + if (err < 0) { + input_free_device(dev); + return err; + } + cxt->idev= dev; + + return 0; +} + + +DEVICE_ATTR(alsactive, S_IWUSR | S_IRUGO, als_show_active, als_store_active); +DEVICE_ATTR(alsdelay, S_IWUSR | S_IRUGO, als_show_delay, als_store_delay); +DEVICE_ATTR(alsbatch, S_IWUSR | S_IRUGO, als_show_batch, als_store_batch); +DEVICE_ATTR(alsflush, S_IWUSR | S_IRUGO, als_show_flush, als_store_flush); +DEVICE_ATTR(alsdevnum, S_IWUSR | S_IRUGO, als_show_devnum, NULL); +DEVICE_ATTR(psactive, S_IWUSR | S_IRUGO, ps_show_active, ps_store_active); +DEVICE_ATTR(psdelay, S_IWUSR | S_IRUGO, ps_show_delay, ps_store_delay); +DEVICE_ATTR(psbatch, S_IWUSR | S_IRUGO, ps_show_batch, ps_store_batch); +DEVICE_ATTR(psflush, S_IWUSR | S_IRUGO, ps_show_flush, ps_store_flush); +DEVICE_ATTR(psdevnum, S_IWUSR | S_IRUGO, ps_show_devnum, NULL); + + +static struct attribute *alsps_attributes[] = { + &dev_attr_alsactive.attr, + &dev_attr_alsdelay.attr, + &dev_attr_alsbatch.attr, + &dev_attr_alsflush.attr, + &dev_attr_alsdevnum.attr, + &dev_attr_psactive.attr, + &dev_attr_psdelay.attr, + &dev_attr_psbatch.attr, + &dev_attr_psflush.attr, + &dev_attr_psdevnum.attr, + NULL +}; + +static struct attribute_group alsps_attribute_group = { + .attrs = alsps_attributes +}; + +int als_register_data_path(struct als_data_path *data) +{ + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + cxt->als_data.get_data = data->get_data; + cxt->als_data.vender_div = data->vender_div; + ALSPS_LOG("alsps register data path vender_div: %d\n", cxt->als_data.vender_div); + if(NULL == cxt->als_data.get_data) + { + ALSPS_LOG("alsps register data path fail \n"); + return -1; + } + return 0; +} + +int ps_register_data_path(struct ps_data_path *data) +{ + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + cxt->ps_data.get_data = data->get_data; + cxt->ps_data.vender_div = data->vender_div; + ALSPS_LOG("alsps register data path vender_div: %d\n", cxt->ps_data.vender_div); + if(NULL == cxt->ps_data.get_data) + { + ALSPS_LOG("alsps register data path fail \n"); + return -1; + } + return 0; +} + +int als_register_control_path(struct als_control_path *ctl) +{ + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + cxt->als_ctl.set_delay = ctl->set_delay; + cxt->als_ctl.open_report_data= ctl->open_report_data; + cxt->als_ctl.enable_nodata = ctl->enable_nodata; + cxt->als_ctl.is_support_batch = ctl->is_support_batch; + cxt->als_ctl.is_report_input_direct= ctl->is_report_input_direct; + + if(NULL==cxt->als_ctl.set_delay || NULL==cxt->als_ctl.open_report_data + || NULL==cxt->als_ctl.enable_nodata) + { + ALSPS_LOG("alsps register control path fail \n"); + return -1; + } + + return 0; +} + +int ps_register_control_path(struct ps_control_path *ctl) +{ + struct alsps_context *cxt = NULL; + int err =0; + cxt = alsps_context_obj; + cxt->ps_ctl.set_delay = ctl->set_delay; + cxt->ps_ctl.open_report_data= ctl->open_report_data; + cxt->ps_ctl.enable_nodata = ctl->enable_nodata; + cxt->ps_ctl.is_support_batch = ctl->is_support_batch; + cxt->ps_ctl.is_report_input_direct= ctl->is_report_input_direct; + + if(NULL==cxt->ps_ctl.set_delay || NULL==cxt->ps_ctl.open_report_data + || NULL==cxt->ps_ctl.enable_nodata) + { + ALSPS_LOG("ps register control path fail \n"); + return -1; + } + + //add misc dev for sensor hal control cmd + err = alsps_misc_init(alsps_context_obj); + if(err) + { + ALSPS_ERR("unable to register alsps misc device!!\n"); + return -2; + } + err = sysfs_create_group(&alsps_context_obj->mdev.this_device->kobj, + &alsps_attribute_group); + if (err < 0) + { + ALSPS_ERR("unable to create alsps attribute file\n"); + return -3; + } + + + kobject_uevent(&alsps_context_obj->mdev.this_device->kobj, KOBJ_ADD); + + return 0; +} + +static int alsps_probe(struct platform_device *pdev) +{ + + int err; + ALSPS_LOG("+++++++++++++alsps_probe!!\n"); + + alsps_context_obj = alsps_context_alloc_object(); + if (!alsps_context_obj) + { + err = -ENOMEM; + ALSPS_ERR("unable to allocate devobj!\n"); + goto exit_alloc_data_failed; + } + + //init real alspseleration driver + err = alsps_real_driver_init(); + if(err) + { + ALSPS_ERR("alsps real driver init fail\n"); + goto real_driver_init_fail; + } + + //init input dev + err = alsps_input_init(alsps_context_obj); + if(err) + { + ALSPS_ERR("unable to register alsps input device!\n"); + goto exit_alloc_input_dev_failed; + } + + atomic_set(&(alsps_context_obj->early_suspend), 0); + alsps_context_obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1, + alsps_context_obj->early_drv.suspend = alsps_early_suspend, + alsps_context_obj->early_drv.resume = alsps_late_resume, + register_early_suspend(&alsps_context_obj->early_drv); + + + ALSPS_LOG("----alsps_probe OK !!\n"); + return 0; + + exit_hwmsen_create_attr_failed: + exit_misc_register_failed: + + exit_err_sysfs: + + if (err) + { + ALSPS_ERR("sysfs node creation error \n"); + alsps_input_destroy(alsps_context_obj); + } + + real_driver_init_fail: + exit_alloc_input_dev_failed: + kfree(alsps_context_obj); + + exit_alloc_data_failed: + + + ALSPS_LOG("----alsps_probe fail !!!\n"); + return err; +} + + + +static int alsps_remove(struct platform_device *pdev) +{ + ALSPS_FUN(f); + int err=0; + input_unregister_device(alsps_context_obj->idev); + sysfs_remove_group(&alsps_context_obj->idev->dev.kobj, + &alsps_attribute_group); + + if((err = misc_deregister(&alsps_context_obj->mdev))) + { + ALSPS_ERR("misc_deregister fail: %d\n", err); + } + kfree(alsps_context_obj); + + return 0; +} + +static void alsps_early_suspend(struct early_suspend *h) +{ + atomic_set(&(alsps_context_obj->early_suspend), 1); + ALSPS_LOG(" alsps_early_suspend ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(alsps_context_obj->early_suspend))); + return ; +} +/*----------------------------------------------------------------------------*/ +static void alsps_late_resume(struct early_suspend *h) +{ + atomic_set(&(alsps_context_obj->early_suspend), 0); + ALSPS_LOG(" alsps_late_resume ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(alsps_context_obj->early_suspend))); + return ; +} + +static int alsps_suspend(struct platform_device *dev, pm_message_t state) +{ + return 0; +} +/*----------------------------------------------------------------------------*/ +static int alsps_resume(struct platform_device *dev) +{ + return 0; +} + +static struct platform_driver alsps_driver = +{ + .probe = alsps_probe, + .remove = alsps_remove, + .suspend = alsps_suspend, + .resume = alsps_resume, + .driver = + { + .name = ALSPS_PL_DEV_NAME, + } +}; + +static int __init alsps_init(void) +{ + ALSPS_FUN(); + + if(platform_driver_register(&alsps_driver)) + { + ALSPS_ERR("failed to register alsps driver\n"); + return -ENODEV; + } + + return 0; +} + +static void __exit alsps_exit(void) +{ + platform_driver_unregister(&alsps_driver); + platform_driver_unregister(&als_ps_driver); + +} + +module_init(alsps_init); +module_exit(alsps_exit); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("ALSPS device driver"); +MODULE_AUTHOR("Mediatek"); + diff --git a/arch/arm/mach-mt8127/ford/alsps/alsps.h b/arch/arm/mach-mt8127/ford/alsps/alsps.h new file mode 100644 index 00000000000..8abb1d16e3e --- /dev/null +++ b/arch/arm/mach-mt8127/ford/alsps/alsps.h @@ -0,0 +1,153 @@ + +#ifndef __ALSPS_H__ +#define __ALSPS_H__ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define ALSPS_TAG " " +#define ALSPS_FUN(f) printk(ALSPS_TAG"%s\n", __func__) +#define ALSPS_ERR(fmt, args...) printk(ALSPS_TAG"%s %d : "fmt, __func__, __LINE__, ##args) +#define ALSPS_LOG(fmt, args...) printk(ALSPS_TAG fmt, ##args) +#define ALSPS_VER(fmt, args...) printk(ALSPS_TAG"%s: "fmt, __func__, ##args) //((void)0) + +#define OP_ALSPS_DELAY 0X01 +#define OP_ALSPS_ENABLE 0X02 +#define OP_ALSPS_GET_DATA 0X04 + +#define ALSPS_INVALID_VALUE -1 + +#define EVENT_TYPE_ALS_VALUE ABS_X +#define EVENT_TYPE_PS_VALUE ABS_Z +#define EVENT_TYPE_ALS_STATUS ABS_WHEEL +#define EVENT_TYPE_PS_STATUS ABS_Y + + +#define ALSPS_VALUE_MAX (32767) +#define ALSPS_VALUE_MIN (-32768) +#define ALSPS_STATUS_MIN (0) +#define ALSPS_STATUS_MAX (64) +#define ALSPS_DIV_MAX (32767) +#define ALSPS_DIV_MIN (1) + + +#define MAX_CHOOSE_ALSPS_NUM 5 + +struct als_control_path +{ + int (*open_report_data)(int open);//open data rerport to HAL + int (*enable_nodata)(int en);//only enable not report event to HAL + int (*set_delay)(u64 delay); + int (*access_data_fifo)();//version2.used for flush operate + bool is_report_input_direct; + bool is_support_batch;//version2.used for batch mode support flag + bool is_polling_mode; +}; + +struct ps_control_path +{ + int (*open_report_data)(int open);//open data rerport to HAL + int (*enable_nodata)(int en);//only enable not report event to HAL + int (*set_delay)(u64 delay); + int (*access_data_fifo)();//version2.used for flush operate + bool is_report_input_direct; + bool is_support_batch;//version2.used for batch mode support flag + bool is_polling_mode; +}; + +struct als_data_path +{ + int (*get_data)(int *als_value, int *status); + int vender_div; +}; + +struct ps_data_path +{ + int (*get_data)(int *ps_value, int *status); + int vender_div; +}; + +struct alsps_init_info +{ + char *name; + int (*init)(void); + int (*uninit)(void); + struct platform_driver* platform_diver_addr; +}; + +struct alsps_data{ + hwm_sensor_data als_data ; + hwm_sensor_data ps_data ; + int data_updata; +}; + +struct alsps_drv_obj { + void *self; + int polling; + int (*alsps_operate)(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout); +}; + +struct alsps_context { + struct input_dev *idev; + struct miscdevice mdev; + struct work_struct report_ps; + struct work_struct report_als; + struct mutex alsps_op_mutex; + struct timer_list timer_als; /*als polling timer */ + struct timer_list timer_ps; /* ps polling timer */ + + atomic_t trace; + atomic_t delay_als; /*als polling period for reporting input event*/ + atomic_t delay_ps;/*ps polling period for reporting input event*/ + atomic_t wake; /*user-space request to wake-up, used with stop*/ + + struct early_suspend early_drv; + atomic_t early_suspend; + + struct alsps_data drv_data; + struct als_control_path als_ctl; + struct als_data_path als_data; + struct ps_control_path ps_ctl; + struct ps_data_path ps_data; + + bool is_als_active_nodata;// Active, but HAL don't need data sensor. such as orientation need + bool is_als_active_data;// Active and HAL need data . + bool is_ps_active_nodata;// Active, but HAL don't need data sensor. such as orientation need + bool is_ps_active_data;// Active and HAL need data . + + bool is_als_first_data_after_enable; + bool is_ps_first_data_after_enable; + bool is_als_polling_run; + bool is_ps_polling_run; + bool is_als_batch_enable; //version2.this is used for judging whether sensor is in batch mode + bool is_ps_batch_enable; //version2.this is used for judging whether sensor is in batch mode + +}; + +//for auto detect +extern int alsps_driver_add(struct alsps_init_info* obj) ; +extern int ps_report_interrupt_data(int value); +extern int als_data_report(struct input_dev *dev, int value,int status); +extern int als_register_control_path(struct als_control_path *ctl); +extern int als_register_data_path(struct als_data_path *data); +extern int ps_data_report(struct input_dev *dev, int value,int status); +extern int ps_register_control_path(struct ps_control_path *ctl); +extern int ps_register_data_path(struct ps_data_path *data); + + + + + +#endif diff --git a/arch/arm/mach-mt8127/ford/alsps/cust_alsps.c b/arch/arm/mach-mt8127/ford/alsps/cust_alsps.c new file mode 100644 index 00000000000..6b95a7a8fd1 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/alsps/cust_alsps.c @@ -0,0 +1,27 @@ +#include +#include +#include +//#include + +static struct alsps_hw cust_alsps_hw = { + .i2c_num = 2, + .polling_mode_ps =0, + .polling_mode_als =1, + .power_id = MT65XX_POWER_NONE, /*LDO is not used*/ + .power_vol = VOL_DEFAULT, /*LDO is not used*/ + .i2c_addr = {0x72, 0x48, 0x78, 0x00}, + /*Lenovo-sw chenlj2 add 2011-06-03,modify parameter below two lines*/ + //.als_level = { 4, 40, 80, 120, 160, 250, 400, 800, 1200, 1600, 2000, 3000, 5000, 10000, 65535}, + //.als_value = {10, 20,20, 120, 120, 280, 280, 280, 1600, 1600, 1600, 6000, 6000, 9000, 10240, 10240}, + .als_level = { 5, 10, 25, 50, 100, 150, 200, 400, 1000, 1500, 2000, 3000, 5000, 8000, 10000}, + .als_value = {10, 50, 100, 150, 200, 250, 280, 280, 1600, 1600, 1600, 6000, 6000, 9000, 10240, 10240}, + .ps_threshold_high = 120, + .ps_threshold_low = 100, + .ps_threshold = 900, +}; +struct alsps_hw *get_cust_alsps_hw(void) { + return &cust_alsps_hw; +} +int APDS9930_CMM_PPCOUNT_VALUE = 0x08; +int APDS9930_CMM_CONTROL_VALUE = 0xE4; +int ZOOM_TIME = 4; diff --git a/arch/arm/mach-mt8127/ford/alsps/inc/cust_alsps.h b/arch/arm/mach-mt8127/ford/alsps/inc/cust_alsps.h new file mode 100644 index 00000000000..4ed2153a815 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/alsps/inc/cust_alsps.h @@ -0,0 +1,42 @@ +#ifndef __CUST_ALSPS_H__ +#define __CUST_ALSPS_H__ + +#include + +#define C_CUST_ALS_LEVEL 16 +#define C_CUST_I2C_ADDR_NUM 4 + +#define MAX_THRESHOLD_HIGH 0xffff +#define MIN_THRESHOLD_LOW 0x0 + +struct alsps_hw { + int i2c_num; /*!< the i2c bus used by ALS/PS */ + int power_id; /*!< the VDD power id of the als chip */ + int power_vol; /*!< the VDD power voltage of the als chip */ + int polling_mode; /*!< 1: polling mode ; 0:interrupt mode*/ + int polling_mode_ps; /*!< 1: polling mode ; 0:interrupt mode*/ + int polling_mode_als; /*!< 1: polling mode ; 0:interrupt mode*/ + unsigned char i2c_addr[C_CUST_I2C_ADDR_NUM]; /*!< i2c address list, some chip will have multiple address */ + unsigned int als_level[C_CUST_ALS_LEVEL-1]; /*!< (C_CUST_ALS_LEVEL-1) levels divides all range into C_CUST_ALS_LEVEL levels*/ + unsigned int als_value[C_CUST_ALS_LEVEL]; /*!< the value reported in each level */ + unsigned int ps_threshold; /*!< the threshold of proximity sensor */ + unsigned int als_window_loss; /*!< the window loss */ + unsigned int ps_threshold_high; + unsigned int ps_threshold_low; + unsigned int als_threshold_high; + unsigned int als_threshold_low; + int als_power_vio_id; /*!< the VIO power id of the als chip */ + int als_power_vio_vol; /*!< the VIO power voltage of the als chip */ + int ps_power_vdd_id; /*!< the VDD power id of the ps chip */ + int ps_power_vdd_vol; /*!< the VDD power voltage of the ps chip */ + int ps_power_vio_id; /*!< the VIO power id of the ps chip */ + int ps_power_vio_vol; /*!< the VIO power voltage of the ps chip */ + int power_lp_mode_ctrl; /*!< 1: disable ldo low power mode when p sensor enabled ; 0: no action*/ + bool is_batch_supported_ps; + bool is_batch_supported_als; +}; + +extern struct alsps_hw* get_cust_alsps_hw(void); + +__weak int pmic_ldo_suspend_enable(int enable); +#endif diff --git a/arch/arm/mach-mt8127/ford/cam_cal/Makefile b/arch/arm/mach-mt8127/ford/cam_cal/Makefile new file mode 100755 index 00000000000..e97b9706c07 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/cam_cal/Makefile @@ -0,0 +1,3 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := dummy_cam_cal.o diff --git a/arch/arm/mach-mt8127/ford/cam_cal/dummy_cam_cal.c b/arch/arm/mach-mt8127/ford/cam_cal/dummy_cam_cal.c new file mode 100644 index 00000000000..32ff50ffde8 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/cam_cal/dummy_cam_cal.c @@ -0,0 +1,647 @@ +/* + * Driver for CAM_CAL + * + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include "kd_camera_hw.h" +#include "cam_cal.h" +#include "cam_cal_define.h" + +#include "dummy_cam_cal.h" +#include // for SMP + +//#define CAM_CALGETDLT_DEBUG //test +//#define CAM_CAL_DEBUG //test +#ifdef CAM_CAL_DEBUG +#define CAM_CALDB printk +#else +#define CAM_CALDB(x,...) +#endif + + +static DEFINE_SPINLOCK(g_CAM_CALLock); // for SMP + +#define CAM_CAL_I2C_BUSNUM 1 +static struct i2c_board_info __initdata kd_cam_cal_dev={ I2C_BOARD_INFO("dummy_cam_cal", 0xAB>>1)}; //make dummy_eeprom co-exist + +/******************************************************************************* +* +********************************************************************************/ +#define CAM_CAL_ICS_REVISION 1 //seanlin111208 +/******************************************************************************* +* +********************************************************************************/ +#define CAM_CAL_DRVNAME "dummy_cam_cal" +#define CAM_CAL_I2C_GROUP_ID 0 +/******************************************************************************* +* +********************************************************************************/ +/* fix warning MSG +static unsigned short g_pu2Normal_i2c[] = {S24CS64A_DEVICE_ID , I2C_CLIENT_END}; +static unsigned short g_u2Ignore = I2C_CLIENT_END; +static struct i2c_client_address_data g_stCAM_CAL_Addr_data = { + .normal_i2c = g_pu2Normal_i2c, + .probe = &g_u2Ignore, + .ignore = &g_u2Ignore +}; */ +static struct i2c_client * g_pstI2Cclient = NULL; + +//81 is used for V4L driver +static dev_t g_CAM_CALdevno = MKDEV(CAM_CAL_DEV_MAJOR_NUMBER,0); +static struct cdev * g_pCAM_CAL_CharDrv = NULL; +//static spinlock_t g_CAM_CALLock; +static struct class *CAM_CAL_class = NULL; +static atomic_t g_CAM_CALatomic; +/******************************************************************************* +* +********************************************************************************/ +// maximun read length is limited at "I2C_FIFO_SIZE" in I2c-mt65xx.c which is 8 bytes +int iWriteCAM_CAL(u16 a_u2Addr , u32 a_u4Bytes, u8 * puDataInBytes) +{ + int i4RetValue = 0; + u32 u4Index = 0; + char puSendCmd[8] = {(char)(a_u2Addr >> 8) , (char)(a_u2Addr & 0xFF) , + 0, 0, 0, 0, 0, 0}; + if(a_u4Bytes + 2 > 8) + { + CAM_CALDB("[CAM_CAL] exceed I2c-mt65xx.c 8 bytes limitation (include address 2 Byte)\n"); + return -1; + } + + for(u4Index = 0 ; u4Index < a_u4Bytes ; u4Index += 1 ) + { + puSendCmd[(u4Index + 2)] = puDataInBytes[u4Index]; + } + + i4RetValue = i2c_master_send(g_pstI2Cclient, puSendCmd, (a_u4Bytes + 2)); + if (i4RetValue != (a_u4Bytes + 2)) + { + CAM_CALDB("[CAM_CAL] I2C write failed!! \n"); + return -1; + } + mdelay(10); //for tWR singnal --> write data form buffer to memory. + + //CAM_CALDB("[CAM_CAL] iWriteCAM_CAL done!! \n"); + return 0; +} + + +// maximun read length is limited at "I2C_FIFO_SIZE" in I2c-mt65xx.c which is 8 bytes +int iReadCAM_CAL(u16 a_u2Addr, u32 ui4_length, u8 * a_puBuff) +{ + int i4RetValue = 0; + char puReadCmd[2] = {(char)(a_u2Addr >> 8) , (char)(a_u2Addr & 0xFF)}; + + //CAM_CALDB("[CAM_CAL] iReadCAM_CAL!! \n"); + + if(ui4_length > 8) + { + CAM_CALDB("[CAM_CAL] exceed I2c-mt65xx.c 8 bytes limitation\n"); + return -1; + } + spin_lock(&g_CAM_CALLock); //for SMP + g_pstI2Cclient->addr = g_pstI2Cclient->addr & (I2C_MASK_FLAG | I2C_WR_FLAG); + spin_unlock(&g_CAM_CALLock); // for SMP + + //CAM_CALDB("[EERPOM] i2c_master_send \n"); + i4RetValue = i2c_master_send(g_pstI2Cclient, puReadCmd, 2); + if (i4RetValue != 2) + { + CAM_CALDB("[CAM_CAL] I2C send read address failed!! \n"); + return -1; + } + + //CAM_CALDB("[EERPOM] i2c_master_recv \n"); + i4RetValue = i2c_master_recv(g_pstI2Cclient, (char *)a_puBuff, ui4_length); + if (i4RetValue != ui4_length) + { + CAM_CALDB("[CAM_CAL] I2C read data failed!! \n"); + return -1; + } + spin_lock(&g_CAM_CALLock); //for SMP + g_pstI2Cclient->addr = g_pstI2Cclient->addr & I2C_MASK_FLAG; + spin_unlock(&g_CAM_CALLock); // for SMP + + //CAM_CALDB("[CAM_CAL] iReadCAM_CAL done!! \n"); + return 0; +} + + +static int iWriteData(unsigned int ui4_offset, unsigned int ui4_length, unsigned char * pinputdata) +{ + int i4RetValue = 0; + int i4ResidueDataLength; + u32 u4IncOffset = 0; + u32 u4CurrentOffset; + u8 * pBuff; + + CAM_CALDB("[CAM_CAL] iWriteData\n" ); + + + if (ui4_offset + ui4_length >= 0x2000) + { + CAM_CALDB("[CAM_CAL] Write Error!! S-24CS64A not supprt address >= 0x2000!! \n" ); + return -1; + } + + i4ResidueDataLength = (int)ui4_length; + u4CurrentOffset = ui4_offset; + pBuff = pinputdata; + CAM_CALDB("[CAM_CAL] iWriteData u4CurrentOffset is %d \n",u4CurrentOffset); + do + { + if(i4ResidueDataLength >= 6) + { + i4RetValue = iWriteCAM_CAL((u16)u4CurrentOffset, 6, pBuff); + if (i4RetValue != 0) + { + CAM_CALDB("[CAM_CAL] I2C iWriteData failed!! \n"); + return -1; + } + u4IncOffset += 6; + i4ResidueDataLength -= 6; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + } + else + { + i4RetValue = iWriteCAM_CAL((u16)u4CurrentOffset, i4ResidueDataLength, pBuff); + if (i4RetValue != 0) + { + CAM_CALDB("[CAM_CAL] I2C iWriteData failed!! \n"); + return -1; + } + u4IncOffset += 6; + i4ResidueDataLength -= 6; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + //break; + } + }while (i4ResidueDataLength > 0); + CAM_CALDB("[CAM_CAL] iWriteData done\n" ); + + return 0; +} + +//int iReadData(stCAM_CAL_INFO_STRUCT * st_pOutputBuffer) +static int iReadData(unsigned int ui4_offset, unsigned int ui4_length, unsigned char * pinputdata) +{ + int i4RetValue = 0; + int i4ResidueDataLength; + u32 u4IncOffset = 0; + u32 u4CurrentOffset; + u8 * pBuff; + CAM_CALDB("[CAM_CAL] iReadData \n" ); + + if (ui4_offset + ui4_length >= 0x2000) + { + CAM_CALDB("[CAM_CAL] Read Error!! S-24CS64A not supprt address >= 0x2000!! \n" ); + return -1; + } + + i4ResidueDataLength = (int)ui4_length; + u4CurrentOffset = ui4_offset; + pBuff = pinputdata; + do + { + if(i4ResidueDataLength >= 8) + { + i4RetValue = iReadCAM_CAL((u16)u4CurrentOffset, 8, pBuff); + if (i4RetValue != 0) + { + CAM_CALDB("[CAM_CAL] I2C iReadData failed!! \n"); + return -1; + } + u4IncOffset += 8; + i4ResidueDataLength -= 8; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + } + else + { + i4RetValue = iReadCAM_CAL((u16)u4CurrentOffset, i4ResidueDataLength, pBuff); + if (i4RetValue != 0) + { + CAM_CALDB("[CAM_CAL] I2C iReadData failed!! \n"); + return -1; + } + u4IncOffset += 8; + i4ResidueDataLength -= 8; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + //break; + } + }while (i4ResidueDataLength > 0); +//fix warning MSG CAM_CALDB("[CAM_CAL] iReadData finial address is %d length is %d buffer address is 0x%x\n",u4CurrentOffset, i4ResidueDataLength, pBuff); + CAM_CALDB("[CAM_CAL] iReadData done\n" ); + return 0; +} + + +/******************************************************************************* +* +********************************************************************************/ +#define NEW_UNLOCK_IOCTL +#ifndef NEW_UNLOCK_IOCTL +static int CAM_CAL_Ioctl(struct inode * a_pstInode, +struct file * a_pstFile, +unsigned int a_u4Command, +unsigned long a_u4Param) +#else +static long CAM_CAL_Ioctl( + struct file *file, + unsigned int a_u4Command, + unsigned long a_u4Param +) +#endif +{ + int i4RetValue = 0; + u8 * pBuff = NULL; + u8 * pWorkingBuff = NULL; + stCAM_CAL_INFO_STRUCT *ptempbuf; + +#ifdef CAM_CALGETDLT_DEBUG + struct timeval ktv1, ktv2; + unsigned long TimeIntervalUS; +#endif + + if(_IOC_NONE == _IOC_DIR(a_u4Command)) + { + } + else + { + pBuff = (u8 *)kmalloc(sizeof(stCAM_CAL_INFO_STRUCT),GFP_KERNEL); + + if(NULL == pBuff) + { + CAM_CALDB("[CAM_CAL] ioctl allocate mem failed\n"); + return -ENOMEM; + } + + if(_IOC_WRITE & _IOC_DIR(a_u4Command)) + { + if(copy_from_user((u8 *) pBuff , (u8 *) a_u4Param, sizeof(stCAM_CAL_INFO_STRUCT))) + { //get input structure address + kfree(pBuff); + CAM_CALDB("[CAM_CAL] ioctl copy from user failed\n"); + return -EFAULT; + } + } + } + + ptempbuf = (stCAM_CAL_INFO_STRUCT *)pBuff; + pWorkingBuff = (u8*)kmalloc(ptempbuf->u4Length,GFP_KERNEL); + if(NULL == pWorkingBuff) + { + kfree(pBuff); + CAM_CALDB("[CAM_CAL] ioctl allocate mem failed\n"); + return -ENOMEM; + } +//fix warning MSG CAM_CALDB("[CAM_CAL] init Working buffer address 0x%x command is 0x%08x\n", pWorkingBuff, a_u4Command); + + + if(copy_from_user((u8*)pWorkingBuff , (u8*)ptempbuf->pu1Params, ptempbuf->u4Length)) + { + kfree(pBuff); + kfree(pWorkingBuff); + CAM_CALDB("[CAM_CAL] ioctl copy from user failed\n"); + return -EFAULT; + } + + switch(a_u4Command) + { + case CAM_CALIOC_S_WRITE: + CAM_CALDB("[CAM_CAL] Write CMD \n"); +#ifdef CAM_CALGETDLT_DEBUG + do_gettimeofday(&ktv1); +#endif + i4RetValue = iWriteData((u16)ptempbuf->u4Offset, ptempbuf->u4Length, pWorkingBuff); +#ifdef CAM_CALGETDLT_DEBUG + do_gettimeofday(&ktv2); + if(ktv2.tv_sec > ktv1.tv_sec) + { + TimeIntervalUS = ktv1.tv_usec + 1000000 - ktv2.tv_usec; + } + else + { + TimeIntervalUS = ktv2.tv_usec - ktv1.tv_usec; + } + printk("Write data %d bytes take %lu us\n",ptempbuf->u4Length, TimeIntervalUS); +#endif + break; + case CAM_CALIOC_G_READ: + CAM_CALDB("[CAM_CAL] Read CMD \n"); +#ifdef CAM_CALGETDLT_DEBUG + do_gettimeofday(&ktv1); +#endif + CAM_CALDB("[CAM_CAL] offset %d \n", ptempbuf->u4Offset); + CAM_CALDB("[CAM_CAL] length %d \n", ptempbuf->u4Length); +//fix warning MSG CAM_CALDB("[CAM_CAL] Before read Working buffer address 0x%x \n", pWorkingBuff); + + i4RetValue = iReadData((u16)ptempbuf->u4Offset, ptempbuf->u4Length, pWorkingBuff); +//fix warning MSG CAM_CALDB("[CAM_CAL] After read Working buffer address 0x%x \n", pWorkingBuff); + + +#ifdef CAM_CALGETDLT_DEBUG + do_gettimeofday(&ktv2); + if(ktv2.tv_sec > ktv1.tv_sec) + { + TimeIntervalUS = ktv1.tv_usec + 1000000 - ktv2.tv_usec; + } + else + { + TimeIntervalUS = ktv2.tv_usec - ktv1.tv_usec; + } + printk("Read data %d bytes take %lu us\n",ptempbuf->u4Length, TimeIntervalUS); +#endif + + break; + default : + CAM_CALDB("[CAM_CAL] No CMD \n"); + i4RetValue = -EPERM; + break; + } + + if(_IOC_READ & _IOC_DIR(a_u4Command)) + { + //copy data to user space buffer, keep other input paremeter unchange. + CAM_CALDB("[CAM_CAL] to user length %d \n", ptempbuf->u4Length); +//fix warning MSG CAM_CALDB("[CAM_CAL] to user Working buffer address 0x%x \n", pWorkingBuff); + if(copy_to_user((u8 __user *) ptempbuf->pu1Params , (u8 *)pWorkingBuff , ptempbuf->u4Length)) + { + kfree(pBuff); + kfree(pWorkingBuff); + CAM_CALDB("[CAM_CAL] ioctl copy to user failed\n"); + return -EFAULT; + } + } + + kfree(pBuff); + kfree(pWorkingBuff); + return i4RetValue; +} + + +static u32 g_u4Opened = 0; +//#define +//Main jobs: +// 1.check for device-specified errors, device not ready. +// 2.Initialize the device if it is opened for the first time. +static int CAM_CAL_Open(struct inode * a_pstInode, struct file * a_pstFile) +{ + CAM_CALDB("[S24CAM_CAL] CAM_CAL_Open\n"); + spin_lock(&g_CAM_CALLock); + if(g_u4Opened) + { + spin_unlock(&g_CAM_CALLock); + return -EBUSY; + } + else + { + g_u4Opened = 1; + atomic_set(&g_CAM_CALatomic,0); + } + spin_unlock(&g_CAM_CALLock); + +//#if defined(MT6572) + // do nothing +//#else + //if(TRUE != hwPowerOn(MT65XX_POWER_LDO_VCAMA, VOL_2800, "S24CS64A")) + //{ + // CAM_CALDB("[CAM_CAL] Fail to enable analog gain\n"); + // return -EIO; + //} +//#endif + + return 0; +} + +//Main jobs: +// 1.Deallocate anything that "open" allocated in private_data. +// 2.Shut down the device on last close. +// 3.Only called once on last time. +// Q1 : Try release multiple times. +static int CAM_CAL_Release(struct inode * a_pstInode, struct file * a_pstFile) +{ + spin_lock(&g_CAM_CALLock); + + g_u4Opened = 0; + + atomic_set(&g_CAM_CALatomic,0); + + spin_unlock(&g_CAM_CALLock); + + return 0; +} + +static const struct file_operations g_stCAM_CAL_fops = +{ + .owner = THIS_MODULE, + .open = CAM_CAL_Open, + .release = CAM_CAL_Release, + //.ioctl = CAM_CAL_Ioctl + .unlocked_ioctl = CAM_CAL_Ioctl +}; + +#define CAM_CAL_DYNAMIC_ALLOCATE_DEVNO 1 +inline static int RegisterCAM_CALCharDrv(void) +{ + struct device* CAM_CAL_device = NULL; + +#if CAM_CAL_DYNAMIC_ALLOCATE_DEVNO + if( alloc_chrdev_region(&g_CAM_CALdevno, 0, 1,CAM_CAL_DRVNAME) ) + { + CAM_CALDB("[CAM_CAL] Allocate device no failed\n"); + + return -EAGAIN; + } +#else + if( register_chrdev_region( g_CAM_CALdevno , 1 , CAM_CAL_DRVNAME) ) + { + CAM_CALDB("[CAM_CAL] Register device no failed\n"); + + return -EAGAIN; + } +#endif + + //Allocate driver + g_pCAM_CAL_CharDrv = cdev_alloc(); + + if(NULL == g_pCAM_CAL_CharDrv) + { + unregister_chrdev_region(g_CAM_CALdevno, 1); + + CAM_CALDB("[CAM_CAL] Allocate mem for kobject failed\n"); + + return -ENOMEM; + } + + //Attatch file operation. + cdev_init(g_pCAM_CAL_CharDrv, &g_stCAM_CAL_fops); + + g_pCAM_CAL_CharDrv->owner = THIS_MODULE; + + //Add to system + if(cdev_add(g_pCAM_CAL_CharDrv, g_CAM_CALdevno, 1)) + { + CAM_CALDB("[CAM_CAL] Attatch file operation failed\n"); + + unregister_chrdev_region(g_CAM_CALdevno, 1); + + return -EAGAIN; + } + + CAM_CAL_class = class_create(THIS_MODULE, "CAM_CALdrv"); + if (IS_ERR(CAM_CAL_class)) { + int ret = PTR_ERR(CAM_CAL_class); + CAM_CALDB("Unable to create class, err = %d\n", ret); + return ret; + } + CAM_CAL_device = device_create(CAM_CAL_class, NULL, g_CAM_CALdevno, NULL, CAM_CAL_DRVNAME); + + return 0; +} + +inline static void UnregisterCAM_CALCharDrv(void) +{ + //Release char driver + cdev_del(g_pCAM_CAL_CharDrv); + + unregister_chrdev_region(g_CAM_CALdevno, 1); + + device_destroy(CAM_CAL_class, g_CAM_CALdevno); + class_destroy(CAM_CAL_class); +} + + +////////////////////////////////////////////////////////////////////// +#ifndef CAM_CAL_ICS_REVISION +static int CAM_CAL_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); +#elif 0 +static int CAM_CAL_i2c_detect(struct i2c_client *client, struct i2c_board_info *info); +#else +#endif +static int CAM_CAL_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int CAM_CAL_i2c_remove(struct i2c_client *); + +static const struct i2c_device_id CAM_CAL_i2c_id[] = {{CAM_CAL_DRVNAME,0},{}}; +#if 0 //test110314 Please use the same I2C Group ID as Sensor +static unsigned short force[] = {CAM_CAL_I2C_GROUP_ID, S24CS64A_DEVICE_ID, I2C_CLIENT_END, I2C_CLIENT_END}; +#else +//static unsigned short force[] = {CAM_CAL_I2C_GROUP_ID, S24CS64A_DEVICE_ID, I2C_CLIENT_END, I2C_CLIENT_END}; +#endif +//static const unsigned short * const forces[] = { force, NULL }; +//static struct i2c_client_address_data addr_data = { .forces = forces,}; + + +static struct i2c_driver CAM_CAL_i2c_driver = { + .probe = CAM_CAL_i2c_probe, + .remove = CAM_CAL_i2c_remove, +// .detect = CAM_CAL_i2c_detect, + .driver.name = CAM_CAL_DRVNAME, + .id_table = CAM_CAL_i2c_id, +}; + +#ifndef CAM_CAL_ICS_REVISION +static int CAM_CAL_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info) { + strcpy(info->type, CAM_CAL_DRVNAME); + return 0; +} +#endif +static int CAM_CAL_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { +int i4RetValue = 0; + CAM_CALDB("[CAM_CAL] Attach I2C \n"); +// spin_lock_init(&g_CAM_CALLock); + + //get sensor i2c client + spin_lock(&g_CAM_CALLock); //for SMP + g_pstI2Cclient = client; + g_pstI2Cclient->addr = S24CS64A_DEVICE_ID>>1; + spin_unlock(&g_CAM_CALLock); // for SMP + + CAM_CALDB("[CAM_CAL] g_pstI2Cclient->addr = 0x%8x \n",g_pstI2Cclient->addr); + //Register char driver + i4RetValue = RegisterCAM_CALCharDrv(); + + if(i4RetValue){ + CAM_CALDB("[CAM_CAL] register char device failed!\n"); + return i4RetValue; + } + + + CAM_CALDB("[CAM_CAL] Attached!! \n"); + return 0; +} + +static int CAM_CAL_i2c_remove(struct i2c_client *client) +{ + return 0; +} + +static int CAM_CAL_probe(struct platform_device *pdev) +{ + return i2c_add_driver(&CAM_CAL_i2c_driver); +} + +static int CAM_CAL_remove(struct platform_device *pdev) +{ + i2c_del_driver(&CAM_CAL_i2c_driver); + return 0; +} + +// platform structure +static struct platform_driver g_stCAM_CAL_Driver = { + .probe = CAM_CAL_probe, + .remove = CAM_CAL_remove, + .driver = { + .name = CAM_CAL_DRVNAME, + .owner = THIS_MODULE, + } +}; + + +static struct platform_device g_stCAM_CAL_Device = { + .name = CAM_CAL_DRVNAME, + .id = 0, + .dev = { + } +}; + +static int __init CAM_CAL_i2C_init(void) +{ + i2c_register_board_info(CAM_CAL_I2C_BUSNUM, &kd_cam_cal_dev, 1); + if(platform_driver_register(&g_stCAM_CAL_Driver)){ + CAM_CALDB("failed to register CAM_CAL driver\n"); + return -ENODEV; + } + + if (platform_device_register(&g_stCAM_CAL_Device)) + { + CAM_CALDB("failed to register CAM_CAL driver\n"); + return -ENODEV; + } + + return 0; +} + +static void __exit CAM_CAL_i2C_exit(void) +{ + platform_driver_unregister(&g_stCAM_CAL_Driver); +} + +module_init(CAM_CAL_i2C_init); +module_exit(CAM_CAL_i2C_exit); + +MODULE_DESCRIPTION("CAM_CAL driver"); +MODULE_AUTHOR("Sean Lin "); +MODULE_LICENSE("GPL"); + + diff --git a/arch/arm/mach-mt8127/ford/cam_cal/dummy_cam_cal.h b/arch/arm/mach-mt8127/ford/cam_cal/dummy_cam_cal.h new file mode 100644 index 00000000000..bf7e9099bb0 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/cam_cal/dummy_cam_cal.h @@ -0,0 +1,30 @@ +/***************************************************************************** + * + * Filename: + * --------- + * S-24CS64A.h + * + * Project: + * -------- + * ALPS + * + * Description: + * ------------ + * Header file of CAM_CAL driver + * + * + * Author: + * ------- + * Ronnie Lai (MTK01420) + * + *============================================================================*/ +#ifndef __CAM_CAL_H +#define __CAM_CAL_H + +#define CAM_CAL_DEV_MAJOR_NUMBER 226 + +/* CAM_CAL READ/WRITE ID */ +#define S24CS64A_DEVICE_ID 0xAB //0xFE // + +#endif /* __CAM_CAL_H */ + diff --git a/arch/arm/mach-mt8127/ford/cam_cal/inc/cam_cal.h b/arch/arm/mach-mt8127/ford/cam_cal/inc/cam_cal.h new file mode 100644 index 00000000000..8dd6b365e20 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/cam_cal/inc/cam_cal.h @@ -0,0 +1,27 @@ +#ifndef _CAM_CAL_H +#define _CAM_CAL_H + +#include + + +#define CAM_CALAGIC 'i' +//IOCTRL(inode * ,file * ,cmd ,arg ) +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" + +/******************************************************************************* +* +********************************************************************************/ + +//CAM_CAL write +#define CAM_CALIOC_S_WRITE _IOW(CAM_CALAGIC,0,stCAM_CAL_INFO_STRUCT) +//CAM_CAL read +#define CAM_CALIOC_G_READ _IOWR(CAM_CALAGIC,5,stPCAM_CAL_INFO_STRUCT) + +#endif //_CAM_CAL_H + + diff --git a/arch/arm/mach-mt8127/ford/cam_cal/inc/cam_cal_define.h b/arch/arm/mach-mt8127/ford/cam_cal/inc/cam_cal_define.h new file mode 100644 index 00000000000..c5e07e4114d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/cam_cal/inc/cam_cal_define.h @@ -0,0 +1,10 @@ +#ifndef _CAM_CAL_DATA_H +#define _CAM_CAL_DATA_H + + +typedef struct{ + u32 u4Offset; + u32 u4Length; + u8 * pu1Params; +}stCAM_CAL_INFO_STRUCT, *stPCAM_CAL_INFO_STRUCT; +#endif //_CAM_CAL_DATA_H diff --git a/arch/arm/mach-mt8127/ford/camera/camera/Makefile b/arch/arm/mach-mt8127/ford/camera/camera/Makefile new file mode 100755 index 00000000000..f9cc9d0542f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/camera/camera/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += dummyds.o +obj-y += kd_camera_hw.o diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/dummy.c b/arch/arm/mach-mt8127/ford/camera/camera/dummyds.c similarity index 100% rename from drivers/misc/mediatek/hdmi/nxp_tda19989/dummy.c rename to arch/arm/mach-mt8127/ford/camera/camera/dummyds.c diff --git a/arch/arm/mach-mt8127/ford/camera/camera/kd_camera_hw.c b/arch/arm/mach-mt8127/ford/camera/camera/kd_camera_hw.c new file mode 100644 index 00000000000..90cc7dce291 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/camera/camera/kd_camera_hw.c @@ -0,0 +1,1967 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /*for printk */ + +#include "kd_camera_hw.h" + +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_camera_feature.h" + +/*extern void ISP_MCLK1_EN(BOOL En);*/ +/****************************************************************************** + * Debug configuration +******************************************************************************/ +#define PFX "[kd_camera_hw]" +#define PK_DBG_NONE(fmt, arg...) do {} while (0) +#define PK_DBG_FUNC(fmt, arg...) xlog_printk(ANDROID_LOG_INFO, PFX , fmt, ##arg) + +#define DEBUG_CAMERA_HW_K +#ifdef DEBUG_CAMERA_HW_K +#define PK_DBG PK_DBG_FUNC +#define PK_ERR(fmt, arg...) xlog_printk(ANDROID_LOG_ERR, PFX , fmt, ##arg) +#define PK_XLOG_INFO(fmt, args...) \ + do { \ + xlog_printk(ANDROID_LOG_INFO, PFX , fmt, ##arg); \ + } while(0) +#else +#define PK_DBG(a,...) +#define PK_ERR(a,...) +#define PK_XLOG_INFO(fmt, args...) +#endif + +u32 pinSetIdx = 0; /*default main sensor */ + +#define IDX_PS_CMRST 0 +#define IDX_PS_CMPDN 4 + +#define IDX_PS_MODE 1 +#define IDX_PS_ON 2 +#define IDX_PS_OFF 3 +u32 pinSet[2][8] = { + /*for main sensor */ + { + GPIO_CAMERA_CMRST_PIN, + GPIO_CAMERA_CMRST_PIN_M_GPIO, /* mode */ + GPIO_OUT_ONE, /* ON state */ + GPIO_OUT_ZERO, /* OFF state */ + GPIO_CAMERA_CMPDN_PIN, + GPIO_CAMERA_CMPDN_PIN_M_GPIO, + GPIO_OUT_ONE, + GPIO_OUT_ZERO, + } + , + /*for sub sensor */ + { + GPIO_CAMERA_CMRST1_PIN, + GPIO_CAMERA_CMRST1_PIN_M_GPIO, + GPIO_OUT_ONE, + GPIO_OUT_ZERO, + GPIO_CAMERA_CMPDN1_PIN, + GPIO_CAMERA_CMPDN1_PIN_M_GPIO, + GPIO_OUT_ONE, + GPIO_OUT_ZERO, + } + , +}; + +/*static void MainCameraDigtalPowerCtrl(kal_bool on){ + if(mt_set_gpio_mode(GPIO_MAIN_CAMERA_12V_POWER_CTRL_PIN,0)){PK_DBG("[[CAMERA SENSOR] Set MAIN CAMERA_DIGITAL POWER_PIN !\n");} + if(mt_set_gpio_dir(GPIO_MAIN_CAMERA_12V_POWER_CTRL_PIN,GPIO_DIR_OUT)){PK_DBG("[[CAMERA SENSOR] Set CAMERA_POWER_PULL_PIN DISABLE !\n");} + if(mt_set_gpio_out(GPIO_MAIN_CAMERA_12V_POWER_CTRL_PIN,on)){PK_DBG("[[CAMERA SENSOR] Set CAMERA_POWER_PULL_PIN DISABLE !\n");;} +} + +#ifndef GPIO_MAIN_CAMERA_28V_POWER_CTRL_PIN +#define GPIO_MAIN_CAMERA_28V_POWER_CTRL_PIN GPIO37 +#endif +static void MainCameraAnalogPowerCtrl(kal_bool on){ + if(mt_set_gpio_mode(GPIO_MAIN_CAMERA_28V_POWER_CTRL_PIN,0)){PK_DBG("[[CAMERA SENSOR] Set MAIN CAMERA_DIGITAL POWER_PIN !\n");} + if(mt_set_gpio_dir(GPIO_MAIN_CAMERA_28V_POWER_CTRL_PIN,GPIO_DIR_OUT)){PK_DBG("[[CAMERA SENSOR] Set CAMERA_POWER_PULL_PIN DISABLE !\n");} + if(mt_set_gpio_out(GPIO_MAIN_CAMERA_28V_POWER_CTRL_PIN,on)){PK_DBG("[[CAMERA SENSOR] Set CAMERA_POWER_PULL_PIN DISABLE !\n");;} +}*/ +static void Rst_PDN_Init(void) +{ + if (mt_set_gpio_mode + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_MODE])) { + PK_DBG("[CAMERA LENS] set gpio mode failed!!\n"); + } + + if (mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_DIR_OUT)) { + PK_DBG("[CAMERA LENS] set gpio dir failed!!\n"); + } + + if (mt_set_gpio_mode + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_MODE])) { + PK_DBG("[CAMERA SENSOR] set gpio mode failed!!\n"); + } + + if (mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_DIR_OUT)) { + PK_DBG("[CAMERA SENSOR] set gpio dir failed!!\n"); + } +} + +static void disable_inactive_sensor(void) +{ + /*disable inactive sensor */ + if (GPIO_CAMERA_INVALID != pinSet[1 - pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[1 - pinSetIdx][IDX_PS_CMRST], + pinSet[1 - pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + /*low == reset sensor */ + if (mt_set_gpio_out + (pinSet[1 - pinSetIdx][IDX_PS_CMPDN], + pinSet[1 - pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } /*high == power down lens module */ + } +} + +static int kd_poweron_sub_devices(MT65XX_POWER_VOLTAGE VOL_D2, + MT65XX_POWER_VOLTAGE VOL_A, + MT65XX_POWER_VOLTAGE VOL_D, + MT65XX_POWER_VOLTAGE VOL_A2, char *mode_name) +{ + int ret = 0; + + if (VOL_D2 >= 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_D2, mode_name); + + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr0; + } + + if (VOL_A > 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_A, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr1; + } + + /*if(VOL_D > 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_D_SUB, VOL_D,mode_name); + if(ret != TRUE){ + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr2; + } + */ + + if (VOL_A2 > 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_A2, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_A2\n"); + goto poweronerr3; + } + + poweronerr3: + poweronerr2: + poweronerr1: + poweronerr0: + return ret; +} + +/* +hupeng 130116 +For some IC, the VOL_D should before VOL_D2, such as s5k3h2 +*/ +static int kd_poweron_main_devices(MT65XX_POWER_VOLTAGE VOL_D2, + MT65XX_POWER_VOLTAGE VOL_A, + MT65XX_POWER_VOLTAGE VOL_D, + MT65XX_POWER_VOLTAGE VOL_A2, char *mode_name, + int VOL_D_first) +{ + int ret = 0; + + if (VOL_D_first) { + if (VOL_D > 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_D, mode_name); + } else { + if (VOL_D2 >= 0) + ret = + hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_D2, mode_name); + } + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr0; + } + + if (VOL_A > 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_A, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr1; + } + + if (VOL_D_first) { + if (VOL_D2 > 0) + ret = + hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_D2, mode_name); + } else { + if (VOL_D >= 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_D, mode_name); + } + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr2; + } + + if (VOL_A2 > 0) + ret = hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_A2, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_A2\n"); + goto poweronerr3; + } + poweronerr3: + poweronerr2: + poweronerr1: + poweronerr0: + return ret; +} + +static int kd_powerdown_sub_devices(char *mode_name) +{ + int ret = 0; + ret = hwPowerDown(CAMERA_POWER_VCAM_A, mode_name); + if (TRUE != ret) { + PK_DBG("[CAMERA SENSOR] Fail to OFF analog power\n"); + goto _kd_powerdown_sub_exit_; + } + ret = hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name); + if (TRUE != ret) { + PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n"); + goto _kd_powerdown_sub_exit_; + } + _kd_powerdown_sub_exit_: + return ret; +} + +static int kd_powerdown_main_devices(char *mode_name) +{ + int ret = 0; + ret = hwPowerDown(CAMERA_POWER_VCAM_D, mode_name); + if (TRUE != ret) { + PK_DBG("[CAMERA SENSOR] Fail to OFF digital power\n"); + goto _kd_powerdown_main_exit_; + } + ret = hwPowerDown(CAMERA_POWER_VCAM_A, mode_name); + if (TRUE != ret) { + PK_DBG("[CAMERA SENSOR] Fail to OFF analog power\n"); + goto _kd_powerdown_main_exit_; + } + ret = hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name); + if (TRUE != ret) { + PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n"); + goto _kd_powerdown_main_exit_; + } + ret = hwPowerDown(CAMERA_POWER_VCAM_A2, mode_name); + if (TRUE != ret) { + PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n"); + goto _kd_powerdown_main_exit_; + } + + _kd_powerdown_main_exit_: + return ret; +} + +static int kd_hi544_poweron(char *mode_name) +{ + int ret; + printk("kd_hi544_poweron start..\n"); + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1200, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_A2\n"); + goto poweronerr; + } + mdelay(10); /*wait power to be stable >5ms */ + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], pinSet[0][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(1); + mdelay(2); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + poweronerr: + return ret; +} + +static int kd_hi544_powerdown(char *mode_name) +{ + int ret; + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out(pinSet[0][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + mdelay(10); + mdelay(1); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + ret = kd_powerdown_main_devices(mode_name); + /* + if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST]) { + + if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!!\n");} + } + */ + return ret; +} + +static int kd_gc2355_poweron(char *mode_name) +{ + int ret; + PK_DBG("[kd_gc2355_poweron]:----darren----start,pinSetIdx:%d\n", + pinSetIdx); + /* ret = kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1800, 0, mode_name,0); */ + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800, mode_name); + + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + mdelay(5); +#if 1 + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + mdelay(5); +#endif + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + mdelay(5); /* wait power to be stable */ + disable_inactive_sensor(); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + PK_DBG("---darren_power:reset on\n"); + PK_DBG("---darren_power:reset off\n"); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + PK_DBG("---darren_power:reset on\n"); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; +} + +static int kd_gc2355_powerdown(char *mode_name) +{ + int ret; + PK_DBG("[kd_gc2235_powerdown] start,pinSetIdx:%d\n", pinSetIdx); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + /*ret = kd_powerdown_sub_devices(mode_name); */ + ret = hwPowerDown(CAMERA_POWER_VCAM_A, mode_name); + ret = hwPowerDown(CAMERA_POWER_VCAM_D, mode_name); + ret = hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name); + poweronerr: + return ret; +} + +static int kd_sp2509_poweron(char *mode_name) +{ + int ret; + PK_DBG("[kd_sp2509_poweron]:----darren----start,pinSetIdx:%d\n", + pinSetIdx); + /* ret = kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1800, 0, mode_name,0); */ + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + } + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800, mode_name); + + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + mdelay(5); +#if 0 + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + mdelay(5); +#endif + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + mdelay(5); /* wait power to be stable */ + disable_inactive_sensor(); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(5); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + + mdelay(5); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(5); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + + } + poweronerr: + return ret; +} + + +static int kd_sp2509_powerdown(char *mode_name) +{ + int ret; + PK_DBG("[kd_sp2509_powerdown] start,pinSetIdx:%d\n", pinSetIdx); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + + /*ret = kd_powerdown_sub_devices(mode_name); */ + ret = hwPowerDown(CAMERA_POWER_VCAM_A, mode_name); + //ret = hwPowerDown(CAMERA_POWER_VCAM_D, mode_name); + ret = hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name); + poweronerr: + return ret; +} +static int kd_gc2035_poweron(char *mode_name) +{ + int ret; + PK_DBG("[kd_gc2035_poweron]:----darren----start,pinSetIdx:%d\n", + pinSetIdx); + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_2800, mode_name); + + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + mdelay(5); + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + mdelay(5); + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + mdelay(5); + disable_inactive_sensor(); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + PK_DBG("---darren_power:reset on\n"); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + PK_DBG("---darren_power:reset off\n"); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + PK_DBG("---darren_power:reset on\n"); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; +} + +static int kd_gc2035_powerdown(char *mode_name) +{ + int ret; + PK_DBG("[kd_gc2235_powerdown] start,pinSetIdx:%d\n", pinSetIdx); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name); + ret = hwPowerDown(CAMERA_POWER_VCAM_A, mode_name); + ret = hwPowerDown(CAMERA_POWER_VCAM_D, mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + poweronerr: + return ret; +} + +static int kd_hi257_poweron(char *mode_name) +{ + int ret; + PK_DBG("[kd_hi257_poweron]:----darren----start,pinSetIdx:%d\n", + pinSetIdx); + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + mdelay(5); + mdelay(1); + disable_inactive_sensor(); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(5); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + PK_DBG("---darren_power:reset on\n"); + PK_DBG("---darren_power:reset off\n"); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + PK_DBG("---darren_power:reset on\n"); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; +} + +static int kd_hi257_powerdown(char *mode_name) +{ + int ret; + + PK_DBG("[kd_hi257_powerdown] start,pinSetIdx:%d\n", pinSetIdx); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + mdelay(2); + mdelay(1); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + mdelay(2); + ret = hwPowerDown(CAMERA_POWER_VCAM_D, mode_name); + mdelay(2); + ret = hwPowerDown(CAMERA_POWER_VCAM_A, mode_name); + mdelay(2); + ret = hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name); + poweronerr: + return ret; +} + +/****************************hi253yuv**********************************/ +static int kd_hi253yuv_poweron(char *mode_name) +{ + int ret; + ret = + kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1800, + 0 /*VOL_2800 */ , mode_name, 0); + PK_DBG("kd_hi253yuv_poweron start..pinSetIdx=%d\n", pinSetIdx); + mdelay(5); + disable_inactive_sensor(); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(1); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; +} + +static int kd_hi253yuv_powerdown(char *mode_name) +{ + int ret; + PK_DBG("kd_hi253yuv_powerdown start..\n"); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_main_devices(mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + poweronerr: + return ret; +} + +/****************************sp0a19yuv**********************************/ +static int kd_sp0a19yuv_poweron(char *mode_name) +{ + int ret; + + printk("[kd_sp0a19yuv_poweron]:----darren----start,pinSetIdx:%d\n", + pinSetIdx); + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + mdelay(5); + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + mdelay(5); + /* + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + mdelay(5); + */ + + disable_inactive_sensor(); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + PK_DBG("---darren_power:reset on\n"); + } + poweronerr: + return ret; +} + +static int kd_sp0a19yuv_powerdown(char *mode_name) +{ + int ret; + printk("[kd_sp0a19yuv_powerdown] start,pinSetIdx:%d\n", pinSetIdx); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + ret = hwPowerDown(CAMERA_POWER_VCAM_D2, mode_name); + ret = hwPowerDown(CAMERA_POWER_VCAM_A, mode_name); + poweronerr: + return ret; +} + +/****************************gc0329**********************************/ +static int kd_gc0312_poweron(char *mode_name) +{ + int ret; + PK_DBG("statr to run kd_gc0312_poweron! %d\n\n", pinSetIdx); + ret = + kd_poweron_sub_devices(VOL_1800, VOL_2800, VOL_1800, + 0 /*VOL_2800 */ , mode_name); + /*ergate-008 */ + mdelay(5); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; + +} + +static int kd_gc0312yuv_powerdown(char *mode_name) +{ + int ret; + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_sub_devices(mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + return ret; +} + +/****************************gc0329**********************************/ +static int kd_gc0329_poweron(char *mode_name) +{ + int ret; + printk("statr to run kd_gc0329_poweron! %d\n\n", pinSetIdx); + ret = + kd_poweron_sub_devices(VOL_1800, VOL_2800, VOL_1800, + 0 /*VOL_2800 */ , mode_name); + + /*ergate-008 */ + mdelay(5); + disable_inactive_sensor(); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; + +} + +static int kd_gc0329yuv_powerdown(char *mode_name) +{ + int ret; + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_sub_devices(mode_name); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + return ret; +} + +/****************************gc0328**********************************/ +static int kd_gc0328_poweron(char *mode_name) +{ + int ret; + printk("statr to run kd_gc0328_poweron!\n\n"); + ret = + kd_poweron_sub_devices(VOL_1800, VOL_2800, VOL_1800, + 0 /*VOL_2800 */ , mode_name); + /*ergate-008 */ + mdelay(5); + disable_inactive_sensor(); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; + +} + +static int kd_gc0328yuv_powerdown(char *mode_name) +{ + int ret; + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_sub_devices(mode_name); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + + return ret; +} + +/****************************hi704yuv**********************************/ +static int kd_hi704yuv_poweron(char *mode_name) +{ + int ret; + ret = + kd_poweron_sub_devices(VOL_1800, VOL_2800, 0, + 0 /*VOL_2800 */ , mode_name); + PK_DBG("kd_hi704yuv_poweron start..pinSetIdx=%d\n", pinSetIdx); + /*ergate-016 */ + mdelay(5); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(1); + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; +} + +static int kd_hi704yuv_powerdown(char *mode_name) +{ + int ret; + + PK_DBG("kd_hi704yuv_powerdown start..\n"); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_sub_devices(mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[1][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + poweronerr: + return ret; +} + +/****************************ov8825mipi_raw**********************************/ +static int kd_ov8825mipiraw_poweron(char *mode_name) +{ + int ret; + ret = + kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1500, VOL_2800, + mode_name, 0); + PK_DBG("kd_ov8825mipiraw_poweron start..\n"); + + /*ergate-016 */ + mdelay(5); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(1); + + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + PK_DBG("kd_ov8825mipiraw_poweron success!\n\n\n"); + poweronerr: + return ret; +} + +static int kd_ov8825mipiraw_powerdown(char *mode_name) +{ + int ret; + PK_DBG("kd_ov8825mipiraw_powerdown start..\n"); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + + ret = kd_powerdown_main_devices(mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + poweronerr: + return ret; +} + +/****************************ar0833mipi_raw**********************************/ +static int kd_ar0833mipiraw_poweron(char *mode_name) +{ + int ret; + ret = + kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1200, VOL_2800, + mode_name, 0); + PK_DBG("kd_ar0833mipiraw_poweron start..\n"); + /*ergate-016 */ + mdelay(5); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(1); + + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + + PK_DBG("kd_ar0833mipiraw_poweron success!\n\n\n"); + + poweronerr: + return ret; +} + +static int kd_ar0833mipiraw_powerdown(char *mode_name) +{ + int ret; + + PK_DBG("kd_ar0833mipiraw_powerdown start..\n"); + + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_main_devices(mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + poweronerr: + return ret; +} + +/****************************s5k3h2yx_mipi_raw**********************************/ +static int kd_s5k3h2yxmipiraw_poweron(char *mode_name) +{ + int ret; + ret = + kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1200, VOL_2800, + mode_name, 1); + PK_DBG("kd_s5k3h2yxmipiraw start..\n"); + + /*ergate-016 */ + mdelay(5); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(1); + + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; +} + +static int kd_s5k3h2yxmipiraw_powerdown(char *mode_name) +{ + int ret; + PK_DBG("kd_s5k3h2yxmipiraw_powerdown start..\n"); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_main_devices(mode_name); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + poweronerr: + return ret; +} + +static int kd_s5k4e1gamipi_poweron(char *mode_name) +{ + int ret; + PK_DBG("kd_s5k4e1gamipi_poweron start to power on just now\n\n\n"); + ret = + kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1500, VOL_2800, + mode_name, 0); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(5); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(1); + } + printk("kd_s5k4e1gamipi_poweron success!\n\n\n"); + + return ret; + +} + +static int kd_s5k4e1gamipi_powerdown(char *mode_name) +{ + int ret; + PK_DBG("kdCISModulePower--off s5k4e1gamipi\n"); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_main_devices(mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + return ret; +} + +static int kd_s5k5cagx_yuv_poweron(char *mode_name) +{ + int ret; + PK_DBG + ("[CAMERA SENSOR] kdCISModulePowerOn get in---S5K5cagX_YUV pinSetIdx=%d\n", + pinSetIdx); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + msleep(1); + ret = + kd_poweron_main_devices(VOL_1800, VOL_2800, VOL_1500, VOL_2800, + mode_name, 0); + msleep(5); + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + msleep(3); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + msleep(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + msleep(1); + } + return ret; +} + +static int kd_s5k5cagx_yuv_powerdown(char *mode_name) +{ + int ret; + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + ret = kd_powerdown_main_devices(mode_name); + return ret; +} + +static int kd_t8ev3mipiraw_poweron(char *mode_name) +{ + int ret; + PK_DBG("[kd_t8ev3_poweron]:----darren----start,pinSetIdx:%d\n", + pinSetIdx); + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + mdelay(5); + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800, mode_name); + + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + mdelay(5); + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + mdelay(5); + ret = hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_A2\n"); + goto poweronerr; + } + if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) { + if (mt_set_gpio_mode + (pinSet[pinSetIdx][IDX_PS_CMPDN], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_MODE])) { + PK_DBG("[CAMERA SENSOR] set gpio mode failed!!\n"); + } + if (mt_set_gpio_dir + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_DIR_OUT)) { + PK_DBG("[CAMERA SENSOR] set gpio dir failed!!\n"); + } + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(5); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMPDN], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + mdelay(80); + PK_DBG("---darren_power:reset on\n"); + if (mt_set_gpio_mode + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_MODE])) { + PK_DBG("[CAMERA SENSOR] set gpio mode failed!!\n"); + } + if (mt_set_gpio_dir + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_DIR_OUT)) { + PK_DBG("[CAMERA SENSOR] set gpio dir failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], GPIO_OUT_ONE)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(2); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[pinSetIdx][IDX_PS_CMRST], + pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + } + poweronerr: + return ret; +} + +static int kd_t8ev3mipiraw_powerdown(char *mode_name) +{ + int ret; + /*PK_DBG("kd_t8ev3_powerdown start..\n"); */ + printk("kd_t8ev3_powerdown startt..\n"); + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], + pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_main_devices(mode_name); + + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + return ret; +} + +static int kd_ov5648_poweron(char *mode_name) +{ + int ret; + printk("kd_ov5648_poweron start..\n"); + ret = hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_D2\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_A\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1500, mode_name); + if (ret != TRUE) { + PK_DBG("[CAMERA SENSOR] Fail to enable digital power VCAM_D\n"); + goto poweronerr; + } + ret = hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800, mode_name); + if (ret != TRUE) { + PK_DBG + ("[CAMERA SENSOR] Fail to enable digital power VCAM_A2\n"); + goto poweronerr; + } + mdelay(10); /* wait power to be stable >5ms */ + /*PDN pin */ + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], pinSet[0][IDX_PS_CMPDN + IDX_PS_ON])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], pinSet[0][IDX_PS_CMRST + IDX_PS_OFF])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(10); + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMRST], pinSet[0][IDX_PS_CMRST + IDX_PS_ON])) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + mdelay(5); + poweronerr: + return ret; +} + +static int kd_ov5648_powerdown(char *mode_name) +{ + int ret; + if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) { + if (mt_set_gpio_out(pinSet[0][IDX_PS_CMRST], GPIO_OUT_ZERO)) { + PK_DBG("[CAMERA SENSOR] set gpio failed!!\n"); + } + } + ret = kd_powerdown_main_devices(mode_name); + if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST]) { + if (mt_set_gpio_out + (pinSet[0][IDX_PS_CMPDN], + pinSet[0][IDX_PS_CMPDN + IDX_PS_OFF])) { + PK_DBG("[CAMERA LENS] set gpio failed!!\n"); + } + } + return ret; +} + +int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, + char *currSensorName, BOOL On, char *mode_name) +{ + printk("%s(), sensor idx = %d, name = %s\n", __func__, SensorIdx, + currSensorName); + if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx) { + if (currSensorName && + ((0 == + strcmp(SENSOR_DRVNAME_OV8825_MIPI_RAW, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW, + currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_AR0833_MIPI_RAW, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_GC2355_MIPI_RAW, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_GC2356_MIPI_RAW, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_GC2355_MIPI_RAW_HUAQUAN, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_S5K5CAGX_YUV, currSensorName)) + || (0 == strcmp(SENSOR_DRVNAME_SP0A19_RAW, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW, currSensorName)) + || (0 == + strcmp(SENSOR_DRVNAME_SP2509_MIPI_RAW, currSensorName)) + )) + pinSetIdx = 0; + else { + PK_DBG + ("kdCISModulePowerOn main get in--- sensorIdx not compare with sensro ++currSensorName=%s\n", + currSensorName); + goto _kdCISModulePowerOn_exit_; + } + } else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) { + if (currSensorName && ((0 == strcmp(SENSOR_DRVNAME_GC0312_YUV,currSensorName)) + || (0 == strcmp(SENSOR_DRVNAME_GC0312_YUV_BLX,currSensorName)) + || (0 == strcmp(SENSOR_DRVNAME_GC0312_RAW,currSensorName)) + || (0 == strcmp(SENSOR_DRVNAME_HI704_YUV,currSensorName)) + || (0 == strcmp(SENSOR_DRVNAME_SP0A19_RAW,currSensorName)) + )) + pinSetIdx = 1; + else { + PK_DBG + ("kdCISModulePowerOn sub get in --- sensorIdx not compare with sensro ++currSensorName=%s\n", + currSensorName); + goto _kdCISModulePowerOn_exit_; + } + } else if (DUAL_CAMERA_MAIN_2_SENSOR == SensorIdx) { + /* pinSetIdx = 2; */ + } + /*power ON */ + PK_DBG("kdCISModulePowerOn:SensorIdx:%d,pinSetIdx:%d", SensorIdx, + pinSetIdx); + Rst_PDN_Init(); + /*power ON */ + if (On) { + PK_DBG("kdCISModulePowerOn -on:currSensorName=%s\n", + currSensorName); + if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_OV8825_MIPI_RAW, + currSensorName))) { + PK_DBG("is ov8825 on\n"); + if (TRUE != kd_ov8825mipiraw_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_AR0833_MIPI_RAW, + currSensorName))) { + PK_DBG("is ar0833 on\n"); + if (TRUE != kd_ar0833mipiraw_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW, + currSensorName))) { + PK_DBG("is s5k4e1ga on\n"); + if (TRUE != kd_s5k4e1gamipi_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC2355_MIPI_RAW, + currSensorName))) { + PK_DBG("is gc2355 on\n"); + if (TRUE != kd_gc2355_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC2355_MIPI_RAW_HUAQUAN, + currSensorName))) { + PK_DBG("is gc2355 on\n"); + if (TRUE != kd_gc2355_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC2356_MIPI_RAW, + currSensorName))) { + PK_DBG("is gc2356 on\n"); + if (TRUE != kd_gc2355_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == strcmp(SENSOR_DRVNAME_SP2509_MIPI_RAW, + currSensorName))) { + PK_DBG("is sp2509 on\n"); + if (TRUE != kd_sp2509_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == strcmp(SENSOR_DRVNAME_GC2035_YUV, + currSensorName))) { + PK_DBG("is gc2035 on\n"); + if (TRUE != kd_gc2035_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW, + currSensorName))) { + PK_DBG("is hi544 on\n"); + if (TRUE != kd_hi544_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0329_YUV, + currSensorName))) { + PK_DBG("is gc0329 on\n"); + if (TRUE != kd_gc0329_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0312_YUV, + currSensorName))) { + PK_DBG("is gc0312 on\n"); + if (TRUE != kd_gc0312_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + }else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0312_YUV_BLX, + currSensorName))) { + PK_DBG("is gc0312 BLX on\n"); + if (TRUE != kd_gc0312_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + }else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0312_RAW, + currSensorName))) { + PK_DBG("is gc0312 RAW on\n"); + if (TRUE != kd_gc0312_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_HI704_YUV, + currSensorName))) { + PK_DBG("is hi704 on\n"); + if (TRUE != kd_hi704yuv_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_S5K5CAGX_YUV, + currSensorName))) { + PK_DBG("is s5k5ca on\n"); + if (TRUE != kd_s5k5cagx_yuv_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_HI253_YUV, + currSensorName))) { + PK_DBG("is hi253 on\n"); + if (TRUE != kd_hi253yuv_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_SP0A19_RAW, + currSensorName))) { + PK_DBG("is SP0A19 on\n"); + if (TRUE != kd_sp0a19yuv_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW, + currSensorName))) { + PK_DBG("is ov5648mipi on\n"); + if (TRUE != kd_ov5648_poweron(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else { + PK_DBG + ("kdCISModulePowerOn get in--- other , please add the power on code!!!!!!\n"); + goto _kdCISModulePowerOn_exit_; + } + } else { /*power OFF */ + PK_DBG("kdCISModulePowerOn -off:currSensorName=%s\n", + currSensorName); + if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_OV8825_MIPI_RAW, + currSensorName))) { + PK_DBG("is ov8825 down\n"); + if (TRUE != kd_ov8825mipiraw_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_AR0833_MIPI_RAW, + currSensorName))) { + PK_DBG("is ar0833 down\n"); + if (TRUE != kd_ar0833mipiraw_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_S5K4E1GA_MIPI_RAW, + currSensorName))) { + PK_DBG("is s5k4e1ga down\n"); + if (TRUE != kd_s5k4e1gamipi_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0329_YUV, + currSensorName))) { + PK_DBG("is gc0329 down\n"); + if (TRUE != kd_gc0329yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0312_YUV, + currSensorName))) { + PK_DBG("is gc0312 down\n"); + if (TRUE != kd_gc0312yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0312_YUV_BLX, + currSensorName))) { + PK_DBG("is gc0312 BLX down\n"); + if (TRUE != kd_gc0312yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC0312_RAW, + currSensorName))) { + PK_DBG("is gc0312 RAW down\n"); + if (TRUE != kd_gc0312yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_HI704_YUV, + currSensorName))) { + PK_DBG("is hi704 down\n"); + if (TRUE != kd_hi704yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC2355_MIPI_RAW, + currSensorName))) { + PK_DBG("is gc2335 down\n"); + if (TRUE != kd_gc2355_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC2355_MIPI_RAW_HUAQUAN, + currSensorName))) { + PK_DBG("is gc2335 down\n"); + if (TRUE != kd_gc2355_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC2356_MIPI_RAW, + currSensorName))) { + PK_DBG("is gc2356 down\n"); + if (TRUE != kd_gc2355_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_SP2509_MIPI_RAW, + currSensorName))) { + PK_DBG("is sp2509 down\n"); + if (TRUE != kd_sp2509_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_GC2035_YUV, + currSensorName))) { + PK_DBG("is gc2035 down\n"); + if (TRUE != kd_gc2035_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_S5K5CAGX_YUV, + currSensorName))) { + PK_DBG("is s5k5eayx_yuv down\n"); + if (TRUE != kd_s5k5cagx_yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_HI253_YUV, + currSensorName))) { + PK_DBG("is hi253 down\n"); + if (TRUE != kd_hi253yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_HI544_MIPI_RAW, + currSensorName))) { + PK_DBG("is hi544 down\n"); + if (TRUE != kd_hi544_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_SP0A19_RAW, + currSensorName))) { + PK_DBG("is SP0A19 down\n"); + if (TRUE != kd_sp0a19yuv_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else if (currSensorName + && (0 == + strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW, + currSensorName))) { + PK_DBG("is ov5648_mipi_raw down\n"); + if (TRUE != kd_ov5648_powerdown(mode_name)) + goto _kdCISModulePowerOn_exit_; + } else { + PK_DBG + ("kdCISModulePowerDown get in--- other , please add the power down code!!!!!!\n"); + goto _kdCISModulePowerOn_exit_; + } + } + return 0; + + _kdCISModulePowerOn_exit_: + return -EIO; +} + +EXPORT_SYMBOL(kdCISModulePowerOn); diff --git a/arch/arm/mach-mt8127/ford/camera/camera/kd_camera_hw.h b/arch/arm/mach-mt8127/ford/camera/camera/kd_camera_hw.h new file mode 100644 index 00000000000..bb1a5e59cbb --- /dev/null +++ b/arch/arm/mach-mt8127/ford/camera/camera/kd_camera_hw.h @@ -0,0 +1,78 @@ +#ifndef _KD_CAMERA_HW_H_ +#define _KD_CAMERA_HW_H_ + + +#include +#include + + + + +// +//Power +#ifdef CONFIG_MTK_PMIC_MT6397 + #define CAMERA_POWER_VCAM_A MT65XX_POWER_LDO_VCAMA + #define CAMERA_POWER_VCAM_D MT65XX_POWER_LDO_VCAMD + #define CAMERA_POWER_VCAM_A2 MT65XX_POWER_LDO_VCAMAF + #define CAMERA_POWER_VCAM_D2 MT65XX_POWER_LDO_VCAMIO +#else + #define CAMERA_POWER_VCAM_A MT6323_POWER_LDO_VCAMA + #define CAMERA_POWER_VCAM_D MT6323_POWER_LDO_VCAMD + #define CAMERA_POWER_VCAM_A2 MT6323_POWER_LDO_VCAM_AF + #define CAMERA_POWER_VCAM_D2 MT6323_POWER_LDO_VCAM_IO +#endif + +//FIXME, should defined in DCT tool +// +/* +#ifndef GPIO_CAMERA_LDO_EN_PIN +#define GPIO_CAMERA_LDO_EN_PIN GPIO94 +#endif +// +#ifndef GPIO_CAMERA_CMRST_PIN +#define GPIO_CAMERA_CMRST_PIN GPIO9 +#endif +// +#ifndef GPIO_CAMERA_CMRST_PIN_M_GPIO +#define GPIO_CAMERA_CMRST_PIN_M_GPIO GPIO_MODE_00 +#endif +// +#ifndef GPIO_CAMERA_CMPDN_PIN +#define GPIO_CAMERA_CMPDN_PIN GPIO10 +#endif +// +#ifndef GPIO_CAMERA_LDO_EN_PIN_M_GPIO +#define GPIO_CAMERA_LDO_EN_PIN_M_GPIO GPIO_MODE_00 +#endif +// +#ifndef GPIO_CAMERA_CMPDN_PIN_M_GPIO +#define GPIO_CAMERA_CMPDN_PIN_M_GPIO GPIO_MODE_00 +#endif +// +#ifndef GPIO_CAMERA_CMRST1_PIN +#define GPIO_CAMERA_CMRST1_PIN GPIO3 +#endif +// +#ifndef GPIO_CAMERA_CMRST1_PIN_M_GPIO +#define GPIO_CAMERA_CMRST1_PIN_M_GPIO GPIO_MODE_00 +#endif +// +#ifndef GPIO_CAMERA_CMPDN1_PIN +#define GPIO_CAMERA_CMPDN1_PIN GPIO4 +#endif +// +#ifndef GPIO_CAMERA_CMPDN1_PIN_M_GPIO +#define GPIO_CAMERA_CMPDN1_PIN_M_GPIO GPIO_MODE_00 +#endif + + + +//i2c id for sensor device, MT8320_fpga, the I2C is attached on 1 +#define IMG_SENSOR_I2C_GROUP_ID 0 + +#define A60373_WRITE_ID (0xC0) +#define A60373_READ_ID (0xC1) +*/ + + +#endif diff --git a/arch/arm/mach-mt8127/ford/core/Makefile b/arch/arm/mach-mt8127/ford/core/Makefile new file mode 100755 index 00000000000..7e6aa1c853f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/core/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := board.o + diff --git a/arch/arm/mach-mt8127/ford/core/board-custom.h b/arch/arm/mach-mt8127/ford/core/board-custom.h new file mode 100644 index 00000000000..93d88239e1e --- /dev/null +++ b/arch/arm/mach-mt8127/ford/core/board-custom.h @@ -0,0 +1,119 @@ +#ifndef __ARCH_ARM_MACH_MT6575_CUSTOM_BOARD_H +#define __ARCH_ARM_MACH_MT6575_CUSTOM_BOARD_H + +#include + +/*=======================================================================*/ +/* MT6575 SD */ +/*=======================================================================*/ +#define CFG_DEV_MSDC0 +#define CFG_DEV_MSDC1 +//#define CFG_DEV_MSDC2 +//#define CFG_DEV_MSDC3 +//#define CFG_DEV_MSDC4 +#if defined(CONFIG_MTK_COMBO) || defined(CONFIG_MTK_COMBO_MODULE) +/* +SDIO slot index number used by connectivity combo chip: +0: invalid (used by memory card) +1: MSDC1 +2: MSDC2 +*/ +#define CONFIG_MTK_WCN_CMB_SDIO_SLOT (3) /* MSDC3 */ +#else +#undef CONFIG_MTK_WCN_CMB_SDIO_SLOT +#endif +/*For MT6582 platform we disable COMBO SDIO SLOT defination*/ +#undef CONFIG_MTK_WCN_CMB_SDIO_SLOT + +#if 0 /* FIXME. */ +/*=======================================================================*/ +/* MT6575 UART */ +/*=======================================================================*/ +#define CFG_DEV_UART1 +#define CFG_DEV_UART2 +#define CFG_DEV_UART3 +#define CFG_DEV_UART4 + +#define CFG_UART_PORTS (4) + +/*=======================================================================*/ +/* MT6575 I2C */ +/*=======================================================================*/ +#define CFG_DEV_I2C +//#define CFG_I2C_HIGH_SPEED_MODE +//#define CFG_I2C_DMA_MODE + +/*=======================================================================*/ +/* MT6575 ADB */ +/*=======================================================================*/ +#define ADB_SERIAL "E1K" + +#endif + +/*=======================================================================*/ +/* MT6575 NAND FLASH */ +/*=======================================================================*/ +#if 0 +#define RAMDOM_READ 1<<0 +#define CACHE_READ 1<<1 +/******************************************************************************* + * NFI & ECC Configuration + *******************************************************************************/ +typedef struct +{ + u16 id; //deviceid+menuid + u8 addr_cycle; + u8 iowidth; + u16 totalsize; + u16 blocksize; + u16 pagesize; + u32 timmingsetting; + char devciename[14]; + u32 advancedmode; // +}flashdev_info,*pflashdev_info; + +static const flashdev_info g_FlashTable[]={ + //micro + {0xAA2C, 5, 8, 256, 128, 2048, 0x01113, "MT29F2G08ABD", 0}, + {0xB12C, 4, 16, 128, 128, 2048, 0x01113, "MT29F1G16ABC", 0}, + {0xBA2C, 5, 16, 256, 128, 2048, 0x01113, "MT29F2G16ABD", 0}, + {0xAC2C, 5, 8, 512, 128, 2048, 0x01113, "MT29F4G08ABC", 0}, + {0xBC2C, 5, 16, 512, 128, 2048, 0x44333, "MT29F4G16ABD", 0}, + //samsung + {0xBAEC, 5, 16, 256, 128, 2048, 0x01123, "K522H1GACE", 0}, + {0xBCEC, 5, 16, 512, 128, 2048, 0x01123, "K524G2GACB", 0}, + {0xDAEC, 5, 8, 256, 128, 2048, 0x33222, "K9F2G08U0A", RAMDOM_READ}, + {0xF1EC, 4, 8, 128, 128, 2048, 0x01123, "K9F1G08U0A", RAMDOM_READ}, + {0xAAEC, 5, 8, 256, 128, 2048, 0x01123, "K9F2G08R0A", 0}, + //hynix + {0xD3AD, 5, 8, 1024, 256, 2048, 0x44333, "HY27UT088G2A", 0}, + {0xA1AD, 4, 8, 128, 128, 2048, 0x01123, "H8BCSOPJOMCP", 0}, + {0xBCAD, 5, 16, 512, 128, 2048, 0x01123, "H8BCSOUNOMCR", 0}, + {0xBAAD, 5, 16, 256, 128, 2048, 0x01123, "H8BCSOSNOMCR", 0}, + //toshiba + {0x9598, 5, 16, 816, 128, 2048, 0x00113, "TY9C000000CMG", 0}, + {0x9498, 5, 16, 375, 128, 2048, 0x00113, "TY9C000000CMG", 0}, + {0xC198, 4, 16, 128, 128, 2048, 0x44333, "TC58NWGOS8C", 0}, + {0xBA98, 5, 16, 256, 128, 2048, 0x02113, "TC58NYG1S8C", 0}, + //st-micro + {0xBA20, 5, 16, 256, 128, 2048, 0x01123, "ND02CGR4B2DI6", 0}, + + // elpida + {0xBC20, 5, 16, 512, 128, 2048, 0x01123, "04GR4B2DDI6", 0}, + {0x0000, 0, 0, 0, 0, 0, 0, "xxxxxxxxxxxxx", 0} +}; +#endif + + +#define NFI_DEFAULT_ACCESS_TIMING (0x44333) + +//uboot only support 1 cs +#define NFI_CS_NUM (2) +#define NFI_DEFAULT_CS (0) + +#define USE_AHB_MODE (1) + +#define PLATFORM_EVB (1) + +#endif /* __ARCH_ARM_MACH_MT6575_CUSTOM_BOARD_H */ + diff --git a/arch/arm/mach-mt8127/ford/core/board.c b/arch/arm/mach-mt8127/ford/core/board.c new file mode 100644 index 00000000000..433bae2fe0a --- /dev/null +++ b/arch/arm/mach-mt8127/ford/core/board.c @@ -0,0 +1,863 @@ +/* system header files */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +// Fix-me: marked for early porting +#include +#include +#include +#include "board-custom.h" +#if defined(CONFIG_MTK_COMBO) || defined(CONFIG_MTK_COMBO_MODULE) +#include + +#endif + +#if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) + +static sdio_irq_handler_t mtk_wcn_cmb_sdio_eirq_handler = NULL; +int mtk_wcn_sdio_irq_flag_set (int falg); +static atomic_t sdio_irq_enable_flag; +static pm_callback_t mtk_wcn_cmb_sdio_pm_cb = NULL; +static void *mtk_wcn_cmb_sdio_pm_data = NULL; +static void *mtk_wcn_cmb_sdio_eirq_data = NULL; +//static pm_message_t mt_wifi_pm_state = { .event = PM_EVENT_HIBERNATE }; +//static int mt_wifi_pm_late_cb = 0; + +const static u32 mtk_wcn_cmb_sdio_eint_pin = GPIO_WIFI_EINT_PIN; +const static u32 mtk_wcn_cmb_sdio_eint_num = CUST_EINT_WIFI_NUM; +const static u32 mtk_wcn_cmb_sdio_eint_m_eint = GPIO_WIFI_EINT_PIN_M_EINT; +const static u32 mtk_wcn_cmb_sdio_eint_m_gpio = GPIO_WIFI_EINT_PIN_M_GPIO; + + + #if (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 0) + static unsigned char combo_port_pwr_map[4] = {0x0, 0xFF, 0xFF, 0xFF}; + /* + index: port number of combo chip (1:SDIO1, 2:SDIO2, no SDIO0) + value: slot power status of (0:off, 1:on, 0xFF:invalid) + */ + #elif (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 1) + static unsigned char combo_port_pwr_map[4] = {0xFF, 0x0, 0xFF, 0xFF}; + /* + index: port number of combo chip (1:SDIO1, 2:SDIO2, no SDIO0) + value: slot power status of (0:off, 1:on, 0xFF:invalid) + */ + #elif (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 2) + static unsigned char combo_port_pwr_map[4] = {0xFF, 0xFF, 0x0, 0xFF}; + /* + index: port number of combo chip (1:SDIO1, 2:SDIO2, no SDIO0) + value: slot power status of (0:off, 1:on, 0xFF:invalid) + */ + + #elif (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 3) + static unsigned char combo_port_pwr_map[4] = {0xFF, 0xFF, 0xFF, 0x0}; + /* + index: port number of combo chip (1:SDIO1, 2:SDIO2, no SDIO0) + value: slot power status of (0:off, 1:on, 0xFF:invalid) + */ + + #else + #error "unsupported CONFIG_MTK_WCN_CMB_SDIO_SLOT" CONFIG_MTK_WCN_CMB_SDIO_SLOT + #endif + +#else +#if 0 +static sdio_irq_handler_t mt_wifi_irq_handler = NULL; +static pm_message_t mt_wifi_pm_state = { .event = PM_EVENT_HIBERNATE }; +static pm_callback_t mt_wifi_pm_cb = NULL; +static void *mt_wifi_pm_data = NULL; +static void *mt_wifi_irq_data = NULL; +static int mt_wifi_pm_late_cb = 0; +#endif +/* temp solution to avoid compile error */ + +#ifndef CUST_EINT_WIFI_NUM +#define CUST_EINT_WIFI_NUM 0 +#endif + +#ifndef CUST_EINT_WIFI_TYPE +#define CUST_EINT_WIFI_TYPE 0 +#endif + +#endif +/*=======================================================================*/ +/* Board Specific Devices Power Management */ +/*=======================================================================*/ +extern kal_bool pmic_chrdet_status(void); +extern U32 pmic_config_interface (U32 RegNum, U32 val, U32 MASK, U32 SHIFT); +extern U32 pmic_read_interface (U32 RegNum, U32 *val, U32 MASK, U32 SHIFT); +extern int accdet_cable_type_state(void); +void mt_power_off(void) +{ +#ifdef CONFIG_MTK_PMIC_MT6397 + int ret_val=0; + int reg_val=0; +#endif + int bbpu_down = 0; + + printk("mt_power_off\n"); + +#ifdef CONFIG_MTK_PMIC_MT6397 + //Enable CA15 by default for different PMIC behavior + pmic_config_interface(VCA15_CON7, 0x1, PMIC_VCA15_EN_MASK, PMIC_VCA15_EN_SHIFT); + pmic_config_interface(VSRMCA15_CON7, 0x1, PMIC_VSRMCA15_EN_MASK, PMIC_VSRMCA15_EN_SHIFT); + udelay(200); + + ret_val=pmic_read_interface(VCA15_CON7, ®_val, 0xFFFF, 0); + printk("Reg[0x%x]=0x%x\n", VCA15_CON7, reg_val); + ret_val=pmic_read_interface(VSRMCA15_CON7, ®_val, 0xFFFF, 0); + printk("Reg[0x%x]=0x%x\n", VSRMCA15_CON7, reg_val); +#endif + +#ifdef CONFIG_MTK_AUTO_POWER_ON_WITH_CHARGER + if (pmic_chrdet_status() == KAL_TRUE) + rtc_mark_enter_kpoc(); +#endif + // Set the right PMIC Audio Power off Sequence + if (accdet_cable_type_state()) + { + pmic_config_interface(AUDTOP_CON6, 0x17E2, 0xFFFF, 0); + mdelay(3000); + pmic_config_interface(AUDTOP_CON6, 0x15E2, 0xFFFF, 0); + } + /* pull PWRBB low */ + if (pmic_chrdet_status() == KAL_FALSE) { + bbpu_down = 1; + rtc_bbpu_power_down(); + } + + while (1) { + pr_info("check charger\n"); + if (pmic_chrdet_status() == KAL_TRUE) { +#ifdef CONFIG_MTK_AUTO_POWER_ON_WITH_CHARGER + arch_reset(0, "enter_kpoc"); +#else + arch_reset(0, "charger"); +#endif + } else if (bbpu_down == 0) { + bbpu_down = 1; + rtc_bbpu_power_down(); + } + } +} + +/*=======================================================================*/ +/* Board Specific Devices */ +/*=======================================================================*/ +/*GPS driver*/ +/*FIXME: remove mt3326 notation */ +struct mt3326_gps_hardware mt3326_gps_hw = { + .ext_power_on = NULL, + .ext_power_off = NULL, +}; + +/*=======================================================================*/ +/* Board Specific Devices Init */ +/*=======================================================================*/ +#ifdef MTK_BT_SUPPORT +void mt_bt_power_on(void) +{ + printk(KERN_INFO "+mt_bt_power_on\n"); + +#if defined(CONFIG_MTK_COMBO) || defined(CONFIG_MTK_COMBO_MODULE) + /* combo chip product */ + /* + * Ignore rfkill0/state call. Controll BT power on/off through device /dev/stpbt. + */ +#else + /* standalone product */ +#endif + + printk(KERN_INFO "-mt_bt_power_on\n"); +} +EXPORT_SYMBOL(mt_bt_power_on); + +void mt_bt_power_off(void) +{ + printk(KERN_INFO "+mt_bt_power_off\n"); + +#if defined(CONFIG_MTK_COMBO) || defined(CONFIG_MTK_COMBO_MODULE) + /* combo chip product */ + /* + * Ignore rfkill0/state call. Controll BT power on/off through device /dev/stpbt. + */ +#else + /* standalone product */ +#endif + + printk(KERN_INFO "-mt_bt_power_off\n"); +} +EXPORT_SYMBOL(mt_bt_power_off); + +int mt_bt_suspend(pm_message_t state) +{ + printk(KERN_INFO "+mt_bt_suspend\n"); + printk(KERN_INFO "-mt_bt_suspend\n"); + return MT_BT_OK; +} + +int mt_bt_resume(pm_message_t state) +{ + printk(KERN_INFO "+mt_bt_resume\n"); + printk(KERN_INFO "-mt_bt_resume\n"); + return MT_BT_OK; +} +#endif + + + +#if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) +static void mtk_wcn_cmb_sdio_enable_eirq(void) + { + mt_eint_unmask(mtk_wcn_cmb_sdio_eint_num);/* CUST_EINT_WIFI_NUM */ + } + +static void mtk_wcn_cmb_sdio_disable_eirq(void) + { + mt_eint_mask(mtk_wcn_cmb_sdio_eint_num); /* CUST_EINT_WIFI_NUM */ + } + +static void mtk_wcn_cmb_sdio_eirq_handler_stub(void) + { + if ((NULL != mtk_wcn_cmb_sdio_eirq_handler) && (0 != atomic_read(&sdio_irq_enable_flag))) { + mtk_wcn_cmb_sdio_eirq_handler(mtk_wcn_cmb_sdio_eirq_data); + } + } + +static void mtk_wcn_cmb_sdio_request_eirq(sdio_irq_handler_t irq_handler, void *data) + { + mtk_wcn_sdio_irq_flag_set (0); + mtk_wcn_cmb_sdio_eirq_data = data; + mtk_wcn_cmb_sdio_eirq_handler = irq_handler; + #if CUST_EINT_WIFI_DEBOUNCE_EN + mt_eint_set_hw_debounce(mtk_wcn_cmb_sdio_eint_num, CUST_EINT_WIFI_DEBOUNCE_CN); /*CUST_EINT_WIFI_NUM */ + #endif + mt_set_gpio_pull_enable(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_UP); + mt_eint_registration(mtk_wcn_cmb_sdio_eint_num/*CUST_EINT_WIFI_NUM */, + CUST_EINT_WIFI_TYPE, + mtk_wcn_cmb_sdio_eirq_handler_stub, + 0); + mt_eint_mask(mtk_wcn_cmb_sdio_eint_num);/*CUST_EINT_WIFI_NUM */ + + } + +static void mtk_wcn_cmb_sdio_register_pm(pm_callback_t pm_cb, void *data) + { + printk( KERN_INFO "mtk_wcn_cmb_sdio_register_pm (0x%p, 0x%p)\n", pm_cb, data); + /* register pm change callback */ + mtk_wcn_cmb_sdio_pm_cb = pm_cb; + mtk_wcn_cmb_sdio_pm_data = data; + } + +static void mtk_wcn_cmb_sdio_on (int sdio_port_num) { + pm_message_t state = { .event = PM_EVENT_USER_RESUME }; + + printk(KERN_INFO "mtk_wcn_cmb_sdio_on (%d) \n", sdio_port_num); + + /* 1. disable sdio eirq */ + mtk_wcn_cmb_sdio_disable_eirq(); + mt_set_gpio_pull_enable(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_DISABLE); /* GPIO_WIFI_EINT_PIN */ + mt_set_gpio_mode(mtk_wcn_cmb_sdio_eint_pin, mtk_wcn_cmb_sdio_eint_m_eint); /* EINT mode */ + + /* 2. call sd callback */ + if (mtk_wcn_cmb_sdio_pm_cb) { + //printk(KERN_INFO "mtk_wcn_cmb_sdio_pm_cb(PM_EVENT_USER_RESUME, 0x%p, 0x%p) \n", mtk_wcn_cmb_sdio_pm_cb, mtk_wcn_cmb_sdio_pm_data); + mtk_wcn_cmb_sdio_pm_cb(state, mtk_wcn_cmb_sdio_pm_data); + } + else { + printk(KERN_WARNING "mtk_wcn_cmb_sdio_on no sd callback!!\n"); + } +} + +static void mtk_wcn_cmb_sdio_off (int sdio_port_num) { + pm_message_t state = { .event = PM_EVENT_USER_SUSPEND }; + + printk(KERN_INFO "mtk_wcn_cmb_sdio_off (%d) \n", sdio_port_num); + + /* 1. call sd callback */ + if (mtk_wcn_cmb_sdio_pm_cb) { + //printk(KERN_INFO "mtk_wcn_cmb_sdio_off(PM_EVENT_USER_SUSPEND, 0x%p, 0x%p) \n", mtk_wcn_cmb_sdio_pm_cb, mtk_wcn_cmb_sdio_pm_data); + mtk_wcn_cmb_sdio_pm_cb(state, mtk_wcn_cmb_sdio_pm_data); + } + else { + printk(KERN_WARNING "mtk_wcn_cmb_sdio_off no sd callback!!\n"); + } + + /* 2. disable sdio eirq */ + mtk_wcn_cmb_sdio_disable_eirq(); + /*printk(KERN_INFO "[mt6620] set WIFI_EINT input pull down\n");*/ + mt_set_gpio_mode(mtk_wcn_cmb_sdio_eint_pin, mtk_wcn_cmb_sdio_eint_m_gpio); /* GPIO mode */ + mt_set_gpio_dir(mtk_wcn_cmb_sdio_eint_pin, GPIO_DIR_IN); + mt_set_gpio_pull_select(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_UP); + mt_set_gpio_pull_enable(mtk_wcn_cmb_sdio_eint_pin, GPIO_PULL_ENABLE); +} + +int board_sdio_ctrl (unsigned int sdio_port_num, unsigned int on) { +#if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) + sdio_port_num = CONFIG_MTK_WCN_CMB_SDIO_SLOT; + printk(KERN_WARNING "mt_combo_sdio_ctrl: force set sdio port to (%d)\n", sdio_port_num); +#endif + if ((sdio_port_num >= 4) || (combo_port_pwr_map[sdio_port_num] == 0xFF) ) { + /* invalid sdio port number or slot mapping */ + printk(KERN_WARNING "mt_mtk_wcn_cmb_sdio_ctrl invalid port(%d, %d)\n", sdio_port_num, combo_port_pwr_map[sdio_port_num]); + return -1; + } + /*printk(KERN_INFO "mt_mtk_wcn_cmb_sdio_ctrl (%d, %d)\n", sdio_port_num, on);*/ + + if (!combo_port_pwr_map[sdio_port_num] && on) { + printk(KERN_INFO "board_sdio_ctrl force off before on\n"); + mtk_wcn_cmb_sdio_off(sdio_port_num); + combo_port_pwr_map[sdio_port_num] = 0; + /* off -> on */ + mtk_wcn_cmb_sdio_on(sdio_port_num); + combo_port_pwr_map[sdio_port_num] = 1; + } + else if (combo_port_pwr_map[sdio_port_num] && !on) { + /* on -> off */ + mtk_wcn_cmb_sdio_off(sdio_port_num); + combo_port_pwr_map[sdio_port_num] = 0; + } + else { + return -2; + } + return 0; +} +EXPORT_SYMBOL(board_sdio_ctrl); +int mtk_wcn_sdio_irq_flag_set (int flag) +{ + + if (0 != flag) + { + atomic_set(&sdio_irq_enable_flag, 1); + } + else + { + atomic_set(&sdio_irq_enable_flag, 0); + } + printk(KERN_INFO "sdio_irq_enable_flag:%d\n", atomic_read(&sdio_irq_enable_flag)); + + return atomic_read(&sdio_irq_enable_flag); +} +EXPORT_SYMBOL(mtk_wcn_sdio_irq_flag_set); + +#endif +#if defined(CONFIG_WLAN) +#if !defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) +#if 0 +static void mt_wifi_enable_irq(void) +{ + mt_eint_unmask(CUST_EINT_WIFI_NUM); +} + +static void mt_wifi_disable_irq(void) +{ + mt_eint_mask(CUST_EINT_WIFI_NUM); +} + +static void mt_wifi_eirq_handler(void) +{ + if (mt_wifi_irq_handler) { + mt_wifi_irq_handler(mt_wifi_irq_data); + } +} + +static void mt_wifi_request_irq(sdio_irq_handler_t irq_handler, void *data) +{ + #if CUST_EINT_WIFI_SENSITIVE + mt_eint_set_sens(CUST_EINT_WIFI_NUM, CUST_EINT_WIFI_SENSITIVE); + #endif + + #if CUST_EINT_WIFI_DEBOUNCE_EN + mt_eint_set_hw_debounce(CUST_EINT_WIFI_NUM, CUST_EINT_WIFI_DEBOUNCE_CN); + #endif + mt_eint_registration(CUST_EINT_WIFI_NUM, + CUST_EINT_WIFI_TYPE, + mt_wifi_eirq_handler, + 0); + mt_eint_mask(CUST_EINT_WIFI_NUM); + + mt_wifi_irq_handler = irq_handler; + mt_wifi_irq_data = data; +} + +static void mt_wifi_register_pm(pm_callback_t pm_cb, void *data) +{ + /* register pm change callback */ + mt_wifi_pm_cb = pm_cb; + mt_wifi_pm_data = data; +} +#endif + +#endif /* end of !defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) */ + +int mt_wifi_resume(pm_message_t state) +{ + int evt = state.event; + + if (evt != PM_EVENT_USER_RESUME && evt != PM_EVENT_RESUME) { + return -1; + } + + /*printk(KERN_INFO "[WIFI] %s Resume\n", evt == PM_EVENT_RESUME ? "PM":"USR");*/ + +#if defined(CONFIG_MTK_COMBO) || defined(CONFIG_MTK_COMBO_MODULE) + /* combo chip product: notify combo driver to turn on Wi-Fi */ + + +#endif + + return 0; +} + +int mt_wifi_suspend(pm_message_t state) +{ + int evt = state.event; +#if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) + static int is_1st_suspend_from_boot = 1; +#endif + + if (evt != PM_EVENT_USER_SUSPEND && evt != PM_EVENT_SUSPEND) { + return -1; + } + +#if defined(CONFIG_MTK_COMBO) || defined(CONFIG_MTK_COMBO_MODULE) + #if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) + /* combo chip product: notify combo driver to turn on Wi-Fi */ + if (is_1st_suspend_from_boot) { + pm_message_t state = { .event = PM_EVENT_USER_SUSPEND }; + + if (mtk_wcn_cmb_sdio_pm_cb) { + is_1st_suspend_from_boot = 0; + /* *** IMPORTANT DEPENDENDY*** + RFKILL: set wifi and bt suspend by default in probe() + MT6573-SD: sd host is added to MMC stack and suspend is ZERO by default + (which means NOT suspended). + + When boot up, RFKILL will set wifi off and this function gets + called. In order to successfully resume wifi at 1st time, pm_cb here + shall be called once to let MT6573-SD do sd host suspend and remove + sd host from MMC. Then wifi can be turned on successfully. + + Boot->SD host added to MMC (suspend=0)->RFKILL set wifi off + ->SD host removed from MMC (suspend=1)->RFKILL set wifi on + */ + printk(KERN_INFO "1st mt_wifi_suspend (PM_EVENT_USER_SUSPEND) \n"); + (*mtk_wcn_cmb_sdio_pm_cb)(state, mtk_wcn_cmb_sdio_pm_data); + } + else { + printk(KERN_WARNING "1st mt_wifi_suspend but no sd callback!!\n"); + } + } + else { + /* combo chip product, notify combo driver */ + } + #endif + +#else +#endif + return 0; +} + +void mt_wifi_power_on(void) +{ + pm_message_t state = { .event = PM_EVENT_USER_RESUME }; + + (void)mt_wifi_resume(state); +} +EXPORT_SYMBOL(mt_wifi_power_on); + +void mt_wifi_power_off(void) +{ + pm_message_t state = { .event = PM_EVENT_USER_SUSPEND }; + + (void)mt_wifi_suspend(state); +} +EXPORT_SYMBOL(mt_wifi_power_off); + +#endif /* end of defined(CONFIG_WLAN) */ + +/* Board Specific Devices */ +/*=======================================================================*/ + +/*=======================================================================*/ +/* Board Specific Devices Init */ +/*=======================================================================*/ + +/*=======================================================================*/ +/* Board Devices Capability */ +/*=======================================================================*/ +#define MSDC_SDCARD_FLAG (MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE | MSDC_HIGHSPEED) +#define MSDC_SDIO_FLAG (MSDC_EXT_SDIO_IRQ | MSDC_HIGHSPEED) + +#if defined(CFG_DEV_MSDC0) +#if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) && (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 0) + struct msdc_hw msdc0_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 0, + .cmd_drv = 0, + .dat_drv = 0, + .data_pins = 4, + .data_offset = 0, + //MT6620 use External IRQ, wifi uses high speed. here wifi manage his own suspend and resume, does not support hot plug + .flags = MSDC_SDIO_FLAG,//MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE,(this flag is for SD card) + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_SDIO, + .boot = 0, + .request_sdio_eirq = mtk_wcn_cmb_sdio_request_eirq, + .enable_sdio_eirq = mtk_wcn_cmb_sdio_enable_eirq, + .disable_sdio_eirq = mtk_wcn_cmb_sdio_disable_eirq, + .register_pm = mtk_wcn_cmb_sdio_register_pm, + }; + #else + struct msdc_hw msdc0_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 4, + .cmd_drv = 2, + .dat_drv = 2, + .data_pins = 8, + .data_offset = 0, + .flags = MSDC_SYS_SUSPEND | MSDC_HIGHSPEED | MSDC_UHS1 | MSDC_DDR, + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_EMMC, + .boot = MSDC_BOOT_EN, + }; + #endif +#endif +#if defined(CFG_DEV_MSDC1) +#if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) && (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 1) +struct msdc_hw msdc1_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 4, + .cmd_drv = 3, + .dat_drv = 3, + .clk_drv_sd_18 = 4, /* sdr104 mode */ + .cmd_drv_sd_18 = 4, + .dat_drv_sd_18 = 4, + .clk_drv_sd_18_sdr50 = 4, /* sdr50 mode */ + .cmd_drv_sd_18_sdr50 = 4, + .dat_drv_sd_18_sdr50 = 4, + .clk_drv_sd_18_ddr50 = 4, /* ddr50 mode */ + .cmd_drv_sd_18_ddr50 = 4, + .dat_drv_sd_18_ddr50 = 4, + .data_pins = 4, + .data_offset = 0, + .flags = MSDC_SDIO_FLAG, + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_SDIO, + .boot = 0, + .cd_level = MSDC_CD_LOW, +}; + + +#else + +struct msdc_hw msdc1_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 6, + .cmd_drv = 6, + .dat_drv = 6, + .clk_drv_sd_18 = 3, /* sdr104 mode */ + .cmd_drv_sd_18 = 3, + .dat_drv_sd_18 = 2, + .clk_drv_sd_18_sdr50 = 3, /* sdr50 mode */ + .cmd_drv_sd_18_sdr50 = 3, + .dat_drv_sd_18_sdr50 = 2, + .clk_drv_sd_18_ddr50 = 3, /* ddr50 mode */ + .cmd_drv_sd_18_ddr50 = 3, + .dat_drv_sd_18_ddr50 = 2, + .data_pins = 4, + .data_offset = 0, +#ifdef CUST_EINT_MSDC1_INS_NUM + .flags = MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE | MSDC_HIGHSPEED | MSDC_UHS1 |MSDC_DDR , + +#else + .flags = MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_HIGHSPEED | MSDC_UHS1 |MSDC_DDR, +#endif + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_SD, + .boot = 0, + .cd_level = MSDC_CD_HIGH, +}; +#endif +#endif +#if defined(CFG_DEV_MSDC2) + #if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) && (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 2) + /* MSDC2 settings for MT66xx combo connectivity chip */ + struct msdc_hw msdc2_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 0, + .cmd_drv = 0, + .dat_drv = 0, + .data_pins = 4, + .data_offset = 0, + //MT6620 use External IRQ, wifi uses high speed. here wifi manage his own suspend and resume, does not support hot plug + .flags = MSDC_SDIO_FLAG,//MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE, + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_SDIO, + .boot = 0, + .request_sdio_eirq = mtk_wcn_cmb_sdio_request_eirq, + .enable_sdio_eirq = mtk_wcn_cmb_sdio_enable_eirq, + .disable_sdio_eirq = mtk_wcn_cmb_sdio_disable_eirq, + .register_pm = mtk_wcn_cmb_sdio_register_pm, + }; + #else + +#if 0 +struct msdc_hw msdc2_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 3, + .cmd_drv = 2, + .dat_drv = 2, + .clk_drv_sd_18 = 4, + .cmd_drv_sd_18 = 3, + .dat_drv_sd_18 = 3, + .data_pins = 4, + .data_offset = 0, + .flags = MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE | MSDC_HIGHSPEED, + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_SD, + .boot = 0, + .cd_level = MSDC_CD_LOW, +}; +#endif + #endif +#endif +#if defined(CFG_DEV_MSDC3) + #if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) && (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 3) + /* MSDC3 settings for MT66xx combo connectivity chip */ + struct msdc_hw msdc3_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 0, + .cmd_drv = 0, + .dat_drv = 0, + .data_pins = 4, + .data_offset = 0, + //MT6620 use External IRQ, wifi uses high speed. here wifi manage his own suspend and resume, does not support hot plug + .flags = MSDC_SDIO_FLAG,//MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE, + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_SDIO, + .boot = 0, + .request_sdio_eirq = mtk_wcn_cmb_sdio_request_eirq, + .enable_sdio_eirq = mtk_wcn_cmb_sdio_enable_eirq, + .disable_sdio_eirq = mtk_wcn_cmb_sdio_disable_eirq, + .register_pm = mtk_wcn_cmb_sdio_register_pm, + }; + #if 0 + + struct msdc_hw msdc3_hw = { + .clk_src = 1, + .cmd_edge = MSDC_SMPL_FALLING, + .data_edge = MSDC_SMPL_FALLING, + .clk_drv = 4, + .cmd_drv = 4, + .dat_drv = 4, + .data_pins = 4, + .data_offset = 0, + .flags = MSDC_SDCARD_FLAG, + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + }; + #endif + #endif +#endif +#if defined(CFG_DEV_MSDC4) + #if defined(CONFIG_MTK_WCN_CMB_SDIO_SLOT) && (CONFIG_MTK_WCN_CMB_SDIO_SLOT == 4) + struct msdc_hw msdc4_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 0, + .cmd_drv = 0, + .dat_drv = 0, + .data_pins = 4, + .data_offset = 0, + //MT6620 use External IRQ, wifi uses high speed. here wifi manage his own suspend and resume, does not support hot plug + .flags = MSDC_SDIO_FLAG,//MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE,(this flag is for SD card) + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_SDIO, + .boot = 0, + .request_sdio_eirq = mtk_wcn_cmb_sdio_request_eirq, + .enable_sdio_eirq = mtk_wcn_cmb_sdio_enable_eirq, + .disable_sdio_eirq = mtk_wcn_cmb_sdio_disable_eirq, + .register_pm = mtk_wcn_cmb_sdio_register_pm, + }; + #else + struct msdc_hw msdc4_hw = { + .clk_src = MSDC_CLKSRC_200MHZ, + .cmd_edge = MSDC_SMPL_FALLING, + .rdata_edge = MSDC_SMPL_FALLING, + .wdata_edge = MSDC_SMPL_FALLING, + .clk_drv = 1, + .cmd_drv = 0, + .dat_drv = 0, + .data_pins = 8, + .data_offset = 0, + .flags = MSDC_SYS_SUSPEND | MSDC_HIGHSPEED | MSDC_UHS1 |MSDC_DDR, + .dat0rddly = 0, + .dat1rddly = 0, + .dat2rddly = 0, + .dat3rddly = 0, + .dat4rddly = 0, + .dat5rddly = 0, + .dat6rddly = 0, + .dat7rddly = 0, + .datwrddly = 0, + .cmdrrddly = 0, + .cmdrddly = 0, + .host_function = MSDC_EMMC, + .boot = MSDC_BOOT_EN, + }; + #endif +#endif + +/* MT6575 NAND Driver */ +#if defined(CONFIG_MTK_MTD_NAND) +struct mt6575_nand_host_hw mt6575_nand_hw = { + .nfi_bus_width = 8, + .nfi_access_timing = NFI_DEFAULT_ACCESS_TIMING, + .nfi_cs_num = NFI_CS_NUM, + .nand_sec_size = 512, + .nand_sec_shift = 9, + .nand_ecc_size = 2048, + .nand_ecc_bytes = 32, + .nand_ecc_mode = NAND_ECC_HW, +}; +#endif diff --git a/arch/arm/mach-mt8127/ford/core/logger_custom.h b/arch/arm/mach-mt8127/ford/core/logger_custom.h new file mode 100644 index 00000000000..7ffb8dfeeee --- /dev/null +++ b/arch/arm/mach-mt8127/ford/core/logger_custom.h @@ -0,0 +1,13 @@ +#ifndef __LOGGER_CUSTOM_H +#define __LOGGER_CUSTOM_H + +#include + +#define __MAIN_BUF_SIZE 64*1024 +#define __EVENTS_BUF_SIZE 256*1024 +#define __RADIO_BUF_SIZE 64*1024 +#define __SYSTEM_BUF_SIZE 64*1024 + +#endif /* __LOGGER_CUSTOM_H */ + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/Makefile b/arch/arm/mach-mt8127/ford/dct/dct/Makefile new file mode 100755 index 00000000000..1ec48f355e7 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := pmic_drv.o + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/codegen.dws b/arch/arm/mach-mt8127/ford/dct/dct/codegen.dws new file mode 100755 index 00000000000..4b32233f7f4 Binary files /dev/null and b/arch/arm/mach-mt8127/ford/dct/dct/codegen.dws differ diff --git a/arch/arm/mach-mt8127/ford/dct/dct/cust_adc.h b/arch/arm/mach-mt8127/ford/dct/dct/cust_adc.h new file mode 100644 index 00000000000..d2e60a5dd72 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/cust_adc.h @@ -0,0 +1,15 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_AUXADC_TOOL_H +#define __CUST_AUXADC_TOOL_H + + + + +#endif //_CUST_AUXADC_TOOL_H + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/cust_eint.h b/arch/arm/mach-mt8127/ford/dct/dct/cust_eint.h new file mode 100755 index 00000000000..81d71c86cca --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/cust_eint.h @@ -0,0 +1,69 @@ +/* + * Generated by MTK SP DrvGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Tue Apr 07 23:26:37 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_EINTH +#define __CUST_EINTH +#ifdef __cplusplus +extern "C" { +#endif +#define CUST_EINTF_TRIGGER_RISING 1 //High Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_FALLING 2 //Low Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_HIGH 4 //High Polarity and Level Sensitive +#define CUST_EINTF_TRIGGER_LOW 8 //Low Polarity and Level Sensitive +#define CUST_EINT_DEBOUNCE_DISABLE 0 +#define CUST_EINT_DEBOUNCE_ENABLE 1 +////////////////////////////////////////////////////////////////////////////// + + +#define CUST_EINT_KPD_SLIDE_NUM 0 +#define CUST_EINT_KPD_SLIDE_DEBOUNCE_CN 0 +#define CUST_EINT_KPD_SLIDE_TYPE CUST_EINTF_TRIGGER_LOW +#define CUST_EINT_KPD_SLIDE_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_GSE_1_NUM 1 +#define CUST_EINT_GSE_1_DEBOUNCE_CN 0 +#define CUST_EINT_GSE_1_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_GSE_1_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_ACCDET_NUM 4 +#define CUST_EINT_ACCDET_DEBOUNCE_CN 256 +#define CUST_EINT_ACCDET_TYPE CUST_EINTF_TRIGGER_LOW +#define CUST_EINT_ACCDET_DEBOUNCE_EN CUST_EINT_DEBOUNCE_ENABLE + +#define CUST_EINT_MSDC1_INS_NUM 6 +#define CUST_EINT_MSDC1_INS_DEBOUNCE_CN 0 +#define CUST_EINT_MSDC1_INS_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_MSDC1_INS_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_TOUCH_PANEL_NUM 7 +#define CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN 1 +#define CUST_EINT_TOUCH_PANEL_TYPE CUST_EINTF_TRIGGER_FALLING +#define CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_GSE_2_NUM 10 +#define CUST_EINT_GSE_2_DEBOUNCE_CN 0 +#define CUST_EINT_GSE_2_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_GSE_2_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_MSE_NUM 11 +#define CUST_EINT_MSE_DEBOUNCE_CN 0 +#define CUST_EINT_MSE_TYPE CUST_EINTF_TRIGGER_LOW +#define CUST_EINT_MSE_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_MT6323_PMIC_NUM 24 +#define CUST_EINT_MT6323_PMIC_DEBOUNCE_CN 1 +#define CUST_EINT_MT6323_PMIC_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_MT6323_PMIC_DEBOUNCE_EN CUST_EINT_DEBOUNCE_ENABLE + + + +////////////////////////////////////////////////////////////////////////////// +#ifdef __cplusplus +} +#endif +#endif //_CUST_EINT_H + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/cust_eint_ext.h b/arch/arm/mach-mt8127/ford/dct/dct/cust_eint_ext.h new file mode 100644 index 00000000000..415d3fbcbec --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/cust_eint_ext.h @@ -0,0 +1,34 @@ +/* + * Generated by MTK SP DrvGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_EINTH +#define __CUST_EINTH + +#ifdef __cplusplus +extern "C" { +#endif + +#define CUST_EINTF_TRIGGER_RISING 1 //High Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_FALLING 2 //Low Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_HIGH 4 //High Polarity and Level Sensitive +#define CUST_EINTF_TRIGGER_LOW 8 //Low Polarity and Level Sensitive + +#define CUST_EINT_DEBOUNCE_DISABLE 0 +#define CUST_EINT_DEBOUNCE_ENABLE 1 + +////////////////////////////////////////////////////////////////////////////// + + + + +////////////////////////////////////////////////////////////////////////////// +#ifdef __cplusplus +} + +#endif +#endif //_CUST_EINT__EXT_H + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/cust_gpio_boot.h b/arch/arm/mach-mt8127/ford/dct/dct/cust_gpio_boot.h new file mode 100755 index 00000000000..512b40ee055 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/cust_gpio_boot.h @@ -0,0 +1,1348 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Wed Jan 28 16:08:15 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_GPIO_BOOT_H__ +#define __CUST_GPIO_BOOT_H__ + + +//Configuration for GPIO SMT(Schmidt Trigger) Group output start +//Configuration for GPIO SMT(Schmidt Trigger) Group output end +//Configureation for Pin 0 +#define GPIO0_MODE GPIO_MODE_01 +#define GPIO0_DIR GPIO_DIR_IN +#define GPIO0_PULLEN GPIO_PULL_DISABLE +#define GPIO0_PULL GPIO_PULL_DOWN +#define GPIO0_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 1 +#define GPIO1_MODE GPIO_MODE_01 +#define GPIO1_DIR GPIO_DIR_IN +#define GPIO1_PULLEN GPIO_PULL_DISABLE +#define GPIO1_PULL GPIO_PULL_DOWN +#define GPIO1_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 2 +#define GPIO2_MODE GPIO_MODE_00 +#define GPIO2_DIR GPIO_DIR_IN +#define GPIO2_PULLEN GPIO_PULL_ENABLE +#define GPIO2_PULL GPIO_PULL_DOWN +#define GPIO2_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 3 +#define GPIO3_MODE GPIO_MODE_01 +#define GPIO3_DIR GPIO_DIR_IN +#define GPIO3_PULLEN GPIO_PULL_DISABLE +#define GPIO3_PULL GPIO_PULL_DOWN +#define GPIO3_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 4 +#define GPIO4_MODE GPIO_MODE_01 +#define GPIO4_DIR GPIO_DIR_IN +#define GPIO4_PULLEN GPIO_PULL_DISABLE +#define GPIO4_PULL GPIO_PULL_DOWN +#define GPIO4_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 5 +#define GPIO5_MODE GPIO_MODE_00 +#define GPIO5_DIR GPIO_DIR_IN +#define GPIO5_PULLEN GPIO_PULL_ENABLE +#define GPIO5_PULL GPIO_PULL_DOWN +#define GPIO5_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 6 +#define GPIO6_MODE GPIO_MODE_00 +#define GPIO6_DIR GPIO_DIR_IN +#define GPIO6_PULLEN GPIO_PULL_ENABLE +#define GPIO6_PULL GPIO_PULL_DOWN +#define GPIO6_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 7 +#define GPIO7_MODE GPIO_MODE_01 +#define GPIO7_DIR GPIO_DIR_OUT +#define GPIO7_PULLEN GPIO_PULL_DISABLE +#define GPIO7_PULL GPIO_PULL_DOWN +#define GPIO7_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 8 +#define GPIO8_MODE GPIO_MODE_01 +#define GPIO8_DIR GPIO_DIR_IN +#define GPIO8_PULLEN GPIO_PULL_ENABLE +#define GPIO8_PULL GPIO_PULL_DOWN +#define GPIO8_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 9 +#define GPIO9_MODE GPIO_MODE_01 +#define GPIO9_DIR GPIO_DIR_OUT +#define GPIO9_PULLEN GPIO_PULL_DISABLE +#define GPIO9_PULL GPIO_PULL_DOWN +#define GPIO9_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 10 +#define GPIO10_MODE GPIO_MODE_01 +#define GPIO10_DIR GPIO_DIR_IN +#define GPIO10_PULLEN GPIO_PULL_ENABLE +#define GPIO10_PULL GPIO_PULL_DOWN +#define GPIO10_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 11 +#define GPIO11_MODE GPIO_MODE_01 +#define GPIO11_DIR GPIO_DIR_OUT +#define GPIO11_PULLEN GPIO_PULL_DISABLE +#define GPIO11_PULL GPIO_PULL_DOWN +#define GPIO11_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 12 +#define GPIO12_MODE GPIO_MODE_01 +#define GPIO12_DIR GPIO_DIR_OUT +#define GPIO12_PULLEN GPIO_PULL_DISABLE +#define GPIO12_PULL GPIO_PULL_DOWN +#define GPIO12_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 13 +#define GPIO13_MODE GPIO_MODE_00 +#define GPIO13_DIR GPIO_DIR_IN +#define GPIO13_PULLEN GPIO_PULL_ENABLE +#define GPIO13_PULL GPIO_PULL_DOWN +#define GPIO13_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 14 +#define GPIO14_MODE GPIO_MODE_00 +#define GPIO14_DIR GPIO_DIR_IN +#define GPIO14_PULLEN GPIO_PULL_ENABLE +#define GPIO14_PULL GPIO_PULL_DOWN +#define GPIO14_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 15 +#define GPIO15_MODE GPIO_MODE_00 +#define GPIO15_DIR GPIO_DIR_IN +#define GPIO15_PULLEN GPIO_PULL_ENABLE +#define GPIO15_PULL GPIO_PULL_DOWN +#define GPIO15_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 16 +#define GPIO16_MODE GPIO_MODE_00 +#define GPIO16_DIR GPIO_DIR_IN +#define GPIO16_PULLEN GPIO_PULL_ENABLE +#define GPIO16_PULL GPIO_PULL_DOWN +#define GPIO16_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 17 +#define GPIO17_MODE GPIO_MODE_00 +#define GPIO17_DIR GPIO_DIR_IN +#define GPIO17_PULLEN GPIO_PULL_ENABLE +#define GPIO17_PULL GPIO_PULL_DOWN +#define GPIO17_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 18 +#define GPIO18_MODE GPIO_MODE_00 +#define GPIO18_DIR GPIO_DIR_IN +#define GPIO18_PULLEN GPIO_PULL_ENABLE +#define GPIO18_PULL GPIO_PULL_DOWN +#define GPIO18_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 19 +#define GPIO19_MODE GPIO_MODE_00 +#define GPIO19_DIR GPIO_DIR_IN +#define GPIO19_PULLEN GPIO_PULL_ENABLE +#define GPIO19_PULL GPIO_PULL_DOWN +#define GPIO19_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 20 +#define GPIO20_MODE GPIO_MODE_00 +#define GPIO20_DIR GPIO_DIR_IN +#define GPIO20_PULLEN GPIO_PULL_ENABLE +#define GPIO20_PULL GPIO_PULL_DOWN +#define GPIO20_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 21 +#define GPIO21_MODE GPIO_MODE_00 +#define GPIO21_DIR GPIO_DIR_IN +#define GPIO21_PULLEN GPIO_PULL_ENABLE +#define GPIO21_PULL GPIO_PULL_DOWN +#define GPIO21_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 22 +#define GPIO22_MODE GPIO_MODE_00 +#define GPIO22_DIR GPIO_DIR_IN +#define GPIO22_PULLEN GPIO_PULL_ENABLE +#define GPIO22_PULL GPIO_PULL_UP +#define GPIO22_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 23 +#define GPIO23_MODE GPIO_MODE_00 +#define GPIO23_DIR GPIO_DIR_IN +#define GPIO23_PULLEN GPIO_PULL_ENABLE +#define GPIO23_PULL GPIO_PULL_UP +#define GPIO23_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 24 +#define GPIO24_MODE GPIO_MODE_00 +#define GPIO24_DIR GPIO_DIR_IN +#define GPIO24_PULLEN GPIO_PULL_ENABLE +#define GPIO24_PULL GPIO_PULL_DOWN +#define GPIO24_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 25 +#define GPIO25_MODE GPIO_MODE_00 +#define GPIO25_DIR GPIO_DIR_IN +#define GPIO25_PULLEN GPIO_PULL_ENABLE +#define GPIO25_PULL GPIO_PULL_DOWN +#define GPIO25_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 26 +#define GPIO26_MODE GPIO_MODE_00 +#define GPIO26_DIR GPIO_DIR_IN +#define GPIO26_PULLEN GPIO_PULL_DISABLE +#define GPIO26_PULL GPIO_PULL_DOWN +#define GPIO26_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 27 +#define GPIO27_MODE GPIO_MODE_00 +#define GPIO27_DIR GPIO_DIR_OUT +#define GPIO27_PULLEN GPIO_PULL_DISABLE +#define GPIO27_PULL GPIO_PULL_DOWN +#define GPIO27_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 28 +#define GPIO28_MODE GPIO_MODE_00 +#define GPIO28_DIR GPIO_DIR_IN +#define GPIO28_PULLEN GPIO_PULL_ENABLE +#define GPIO28_PULL GPIO_PULL_UP +#define GPIO28_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 29 +#define GPIO29_MODE GPIO_MODE_00 +#define GPIO29_DIR GPIO_DIR_IN +#define GPIO29_PULLEN GPIO_PULL_ENABLE +#define GPIO29_PULL GPIO_PULL_UP +#define GPIO29_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 30 +#define GPIO30_MODE GPIO_MODE_00 +#define GPIO30_DIR GPIO_DIR_OUT +#define GPIO30_PULLEN GPIO_PULL_ENABLE +#define GPIO30_PULL GPIO_PULL_DOWN +#define GPIO30_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 31 +#define GPIO31_MODE GPIO_MODE_00 +#define GPIO31_DIR GPIO_DIR_IN +#define GPIO31_PULLEN GPIO_PULL_ENABLE +#define GPIO31_PULL GPIO_PULL_DOWN +#define GPIO31_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 32 +#define GPIO32_MODE GPIO_MODE_00 +#define GPIO32_DIR GPIO_DIR_OUT +#define GPIO32_PULLEN GPIO_PULL_ENABLE +#define GPIO32_PULL GPIO_PULL_UP +#define GPIO32_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 33 +#define GPIO33_MODE GPIO_MODE_00 +#define GPIO33_DIR GPIO_DIR_IN +#define GPIO33_PULLEN GPIO_PULL_ENABLE +#define GPIO33_PULL GPIO_PULL_DOWN +#define GPIO33_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 34 +#define GPIO34_MODE GPIO_MODE_00 +#define GPIO34_DIR GPIO_DIR_IN +#define GPIO34_PULLEN GPIO_PULL_ENABLE +#define GPIO34_PULL GPIO_PULL_DOWN +#define GPIO34_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 35 +#define GPIO35_MODE GPIO_MODE_00 +#define GPIO35_DIR GPIO_DIR_IN +#define GPIO35_PULLEN GPIO_PULL_ENABLE +#define GPIO35_PULL GPIO_PULL_DOWN +#define GPIO35_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 36 +#define GPIO36_MODE GPIO_MODE_01 +#define GPIO36_DIR GPIO_DIR_IN +#define GPIO36_PULLEN GPIO_PULL_ENABLE +#define GPIO36_PULL GPIO_PULL_UP +#define GPIO36_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 37 +#define GPIO37_MODE GPIO_MODE_01 +#define GPIO37_DIR GPIO_DIR_IN +#define GPIO37_PULLEN GPIO_PULL_ENABLE +#define GPIO37_PULL GPIO_PULL_UP +#define GPIO37_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 38 +#define GPIO38_MODE GPIO_MODE_02 +#define GPIO38_DIR GPIO_DIR_IN +#define GPIO38_PULLEN GPIO_PULL_ENABLE +#define GPIO38_PULL GPIO_PULL_UP +#define GPIO38_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 39 +#define GPIO39_MODE GPIO_MODE_01 +#define GPIO39_DIR GPIO_DIR_IN +#define GPIO39_PULLEN GPIO_PULL_DISABLE +#define GPIO39_PULL GPIO_PULL_DOWN +#define GPIO39_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 40 +#define GPIO40_MODE GPIO_MODE_01 +#define GPIO40_DIR GPIO_DIR_IN +#define GPIO40_PULLEN GPIO_PULL_DISABLE +#define GPIO40_PULL GPIO_PULL_DOWN +#define GPIO40_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 41 +#define GPIO41_MODE GPIO_MODE_01 +#define GPIO41_DIR GPIO_DIR_IN +#define GPIO41_PULLEN GPIO_PULL_DISABLE +#define GPIO41_PULL GPIO_PULL_DOWN +#define GPIO41_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 42 +#define GPIO42_MODE GPIO_MODE_01 +#define GPIO42_DIR GPIO_DIR_IN +#define GPIO42_PULLEN GPIO_PULL_DISABLE +#define GPIO42_PULL GPIO_PULL_DOWN +#define GPIO42_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 43 +#define GPIO43_MODE GPIO_MODE_00 +#define GPIO43_DIR GPIO_DIR_IN +#define GPIO43_PULLEN GPIO_PULL_ENABLE +#define GPIO43_PULL GPIO_PULL_DOWN +#define GPIO43_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 44 +#define GPIO44_MODE GPIO_MODE_00 +#define GPIO44_DIR GPIO_DIR_OUT +#define GPIO44_PULLEN GPIO_PULL_ENABLE +#define GPIO44_PULL GPIO_PULL_DOWN +#define GPIO44_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 45 +#define GPIO45_MODE GPIO_MODE_00 +#define GPIO45_DIR GPIO_DIR_OUT +#define GPIO45_PULLEN GPIO_PULL_DISABLE +#define GPIO45_PULL GPIO_PULL_DOWN +#define GPIO45_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 46 +#define GPIO46_MODE GPIO_MODE_00 +#define GPIO46_DIR GPIO_DIR_IN +#define GPIO46_PULLEN GPIO_PULL_ENABLE +#define GPIO46_PULL GPIO_PULL_DOWN +#define GPIO46_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 47 +#define GPIO47_MODE GPIO_MODE_00 +#define GPIO47_DIR GPIO_DIR_IN +#define GPIO47_PULLEN GPIO_PULL_ENABLE +#define GPIO47_PULL GPIO_PULL_DOWN +#define GPIO47_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 48 +#define GPIO48_MODE GPIO_MODE_00 +#define GPIO48_DIR GPIO_DIR_IN +#define GPIO48_PULLEN GPIO_PULL_ENABLE +#define GPIO48_PULL GPIO_PULL_DOWN +#define GPIO48_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 49 +#define GPIO49_MODE GPIO_MODE_00 +#define GPIO49_DIR GPIO_DIR_IN +#define GPIO49_PULLEN GPIO_PULL_ENABLE +#define GPIO49_PULL GPIO_PULL_DOWN +#define GPIO49_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 50 +#define GPIO50_MODE GPIO_MODE_00 +#define GPIO50_DIR GPIO_DIR_OUT +#define GPIO50_PULLEN GPIO_PULL_ENABLE +#define GPIO50_PULL GPIO_PULL_DOWN +#define GPIO50_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 51 +#define GPIO51_MODE GPIO_MODE_00 +#define GPIO51_DIR GPIO_DIR_IN +#define GPIO51_PULLEN GPIO_PULL_ENABLE +#define GPIO51_PULL GPIO_PULL_DOWN +#define GPIO51_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 52 +#define GPIO52_MODE GPIO_MODE_00 +#define GPIO52_DIR GPIO_DIR_IN +#define GPIO52_PULLEN GPIO_PULL_ENABLE +#define GPIO52_PULL GPIO_PULL_DOWN +#define GPIO52_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 53 +#define GPIO53_MODE GPIO_MODE_00 +#define GPIO53_DIR GPIO_DIR_OUT +#define GPIO53_PULLEN GPIO_PULL_DISABLE +#define GPIO53_PULL GPIO_PULL_DOWN +#define GPIO53_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 54 +#define GPIO54_MODE GPIO_MODE_00 +#define GPIO54_DIR GPIO_DIR_OUT +#define GPIO54_PULLEN GPIO_PULL_DISABLE +#define GPIO54_PULL GPIO_PULL_DOWN +#define GPIO54_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 55 +#define GPIO55_MODE GPIO_MODE_00 +#define GPIO55_DIR GPIO_DIR_OUT +#define GPIO55_PULLEN GPIO_PULL_DISABLE +#define GPIO55_PULL GPIO_PULL_DOWN +#define GPIO55_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 56 +#define GPIO56_MODE GPIO_MODE_00 +#define GPIO56_DIR GPIO_DIR_OUT +#define GPIO56_PULLEN GPIO_PULL_DISABLE +#define GPIO56_PULL GPIO_PULL_DOWN +#define GPIO56_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 57 +#define GPIO57_MODE GPIO_MODE_01 +#define GPIO57_DIR GPIO_DIR_IN +#define GPIO57_PULLEN GPIO_PULL_ENABLE +#define GPIO57_PULL GPIO_PULL_UP +#define GPIO57_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 58 +#define GPIO58_MODE GPIO_MODE_01 +#define GPIO58_DIR GPIO_DIR_IN +#define GPIO58_PULLEN GPIO_PULL_ENABLE +#define GPIO58_PULL GPIO_PULL_UP +#define GPIO58_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 59 +#define GPIO59_MODE GPIO_MODE_01 +#define GPIO59_DIR GPIO_DIR_OUT +#define GPIO59_PULLEN GPIO_PULL_DISABLE +#define GPIO59_PULL GPIO_PULL_DOWN +#define GPIO59_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 60 +#define GPIO60_MODE GPIO_MODE_01 +#define GPIO60_DIR GPIO_DIR_OUT +#define GPIO60_PULLEN GPIO_PULL_DISABLE +#define GPIO60_PULL GPIO_PULL_DOWN +#define GPIO60_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 61 +#define GPIO61_MODE GPIO_MODE_01 +#define GPIO61_DIR GPIO_DIR_IN +#define GPIO61_PULLEN GPIO_PULL_ENABLE +#define GPIO61_PULL GPIO_PULL_DOWN +#define GPIO61_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 62 +#define GPIO62_MODE GPIO_MODE_01 +#define GPIO62_DIR GPIO_DIR_IN +#define GPIO62_PULLEN GPIO_PULL_ENABLE +#define GPIO62_PULL GPIO_PULL_DOWN +#define GPIO62_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 63 +#define GPIO63_MODE GPIO_MODE_01 +#define GPIO63_DIR GPIO_DIR_OUT +#define GPIO63_PULLEN GPIO_PULL_ENABLE +#define GPIO63_PULL GPIO_PULL_DOWN +#define GPIO63_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 64 +#define GPIO64_MODE GPIO_MODE_01 +#define GPIO64_DIR GPIO_DIR_IN +#define GPIO64_PULLEN GPIO_PULL_ENABLE +#define GPIO64_PULL GPIO_PULL_DOWN +#define GPIO64_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 65 +#define GPIO65_MODE GPIO_MODE_01 +#define GPIO65_DIR GPIO_DIR_OUT +#define GPIO65_PULLEN GPIO_PULL_DISABLE +#define GPIO65_PULL GPIO_PULL_DOWN +#define GPIO65_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 66 +#define GPIO66_MODE GPIO_MODE_01 +#define GPIO66_DIR GPIO_DIR_IN +#define GPIO66_PULLEN GPIO_PULL_ENABLE +#define GPIO66_PULL GPIO_PULL_DOWN +#define GPIO66_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 67 +#define GPIO67_MODE GPIO_MODE_01 +#define GPIO67_DIR GPIO_DIR_IN +#define GPIO67_PULLEN GPIO_PULL_ENABLE +#define GPIO67_PULL GPIO_PULL_DOWN +#define GPIO67_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 68 +#define GPIO68_MODE GPIO_MODE_01 +#define GPIO68_DIR GPIO_DIR_IN +#define GPIO68_PULLEN GPIO_PULL_ENABLE +#define GPIO68_PULL GPIO_PULL_DOWN +#define GPIO68_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 69 +#define GPIO69_MODE GPIO_MODE_01 +#define GPIO69_DIR GPIO_DIR_IN +#define GPIO69_PULLEN GPIO_PULL_ENABLE +#define GPIO69_PULL GPIO_PULL_DOWN +#define GPIO69_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 70 +#define GPIO70_MODE GPIO_MODE_01 +#define GPIO70_DIR GPIO_DIR_IN +#define GPIO70_PULLEN GPIO_PULL_ENABLE +#define GPIO70_PULL GPIO_PULL_DOWN +#define GPIO70_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 71 +#define GPIO71_MODE GPIO_MODE_01 +#define GPIO71_DIR GPIO_DIR_IN +#define GPIO71_PULLEN GPIO_PULL_ENABLE +#define GPIO71_PULL GPIO_PULL_DOWN +#define GPIO71_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 72 +#define GPIO72_MODE GPIO_MODE_00 +#define GPIO72_DIR GPIO_DIR_IN +#define GPIO72_PULLEN GPIO_PULL_ENABLE +#define GPIO72_PULL GPIO_PULL_DOWN +#define GPIO72_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 73 +#define GPIO73_MODE GPIO_MODE_00 +#define GPIO73_DIR GPIO_DIR_IN +#define GPIO73_PULLEN GPIO_PULL_ENABLE +#define GPIO73_PULL GPIO_PULL_DOWN +#define GPIO73_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 74 +#define GPIO74_MODE GPIO_MODE_00 +#define GPIO74_DIR GPIO_DIR_IN +#define GPIO74_PULLEN GPIO_PULL_ENABLE +#define GPIO74_PULL GPIO_PULL_DOWN +#define GPIO74_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 75 +#define GPIO75_MODE GPIO_MODE_01 +#define GPIO75_DIR GPIO_DIR_IN +#define GPIO75_PULLEN GPIO_PULL_ENABLE +#define GPIO75_PULL GPIO_PULL_UP +#define GPIO75_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 76 +#define GPIO76_MODE GPIO_MODE_01 +#define GPIO76_DIR GPIO_DIR_IN +#define GPIO76_PULLEN GPIO_PULL_ENABLE +#define GPIO76_PULL GPIO_PULL_UP +#define GPIO76_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 77 +#define GPIO77_MODE GPIO_MODE_01 +#define GPIO77_DIR GPIO_DIR_IN +#define GPIO77_PULLEN GPIO_PULL_ENABLE +#define GPIO77_PULL GPIO_PULL_UP +#define GPIO77_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 78 +#define GPIO78_MODE GPIO_MODE_01 +#define GPIO78_DIR GPIO_DIR_IN +#define GPIO78_PULLEN GPIO_PULL_ENABLE +#define GPIO78_PULL GPIO_PULL_UP +#define GPIO78_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 79 +#define GPIO79_MODE GPIO_MODE_01 +#define GPIO79_DIR GPIO_DIR_IN +#define GPIO79_PULLEN GPIO_PULL_ENABLE +#define GPIO79_PULL GPIO_PULL_UP +#define GPIO79_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 80 +#define GPIO80_MODE GPIO_MODE_01 +#define GPIO80_DIR GPIO_DIR_OUT +#define GPIO80_PULLEN GPIO_PULL_DISABLE +#define GPIO80_PULL GPIO_PULL_DOWN +#define GPIO80_DATAOUT GPIO_OUT_ONE + +//Configureation for Pin 81 +#define GPIO81_MODE GPIO_MODE_00 +#define GPIO81_DIR GPIO_DIR_IN +#define GPIO81_PULLEN GPIO_PULL_ENABLE +#define GPIO81_PULL GPIO_PULL_DOWN +#define GPIO81_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 82 +#define GPIO82_MODE GPIO_MODE_00 +#define GPIO82_DIR GPIO_DIR_IN +#define GPIO82_PULLEN GPIO_PULL_ENABLE +#define GPIO82_PULL GPIO_PULL_DOWN +#define GPIO82_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 83 +#define GPIO83_MODE GPIO_MODE_00 +#define GPIO83_DIR GPIO_DIR_OUT +#define GPIO83_PULLEN GPIO_PULL_DISABLE +#define GPIO83_PULL GPIO_PULL_DOWN +#define GPIO83_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 84 +#define GPIO84_MODE GPIO_MODE_00 +#define GPIO84_DIR GPIO_DIR_IN +#define GPIO84_PULLEN GPIO_PULL_ENABLE +#define GPIO84_PULL GPIO_PULL_DOWN +#define GPIO84_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 85 +#define GPIO85_MODE GPIO_MODE_00 +#define GPIO85_DIR GPIO_DIR_IN +#define GPIO85_PULLEN GPIO_PULL_ENABLE +#define GPIO85_PULL GPIO_PULL_DOWN +#define GPIO85_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 86 +#define GPIO86_MODE GPIO_MODE_00 +#define GPIO86_DIR GPIO_DIR_IN +#define GPIO86_PULLEN GPIO_PULL_ENABLE +#define GPIO86_PULL GPIO_PULL_DOWN +#define GPIO86_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 87 +#define GPIO87_MODE GPIO_MODE_00 +#define GPIO87_DIR GPIO_DIR_OUT +#define GPIO87_PULLEN GPIO_PULL_ENABLE +#define GPIO87_PULL GPIO_PULL_DOWN +#define GPIO87_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 88 +#define GPIO88_MODE GPIO_MODE_00 +#define GPIO88_DIR GPIO_DIR_OUT +#define GPIO88_PULLEN GPIO_PULL_ENABLE +#define GPIO88_PULL GPIO_PULL_DOWN +#define GPIO88_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 89 +#define GPIO89_MODE GPIO_MODE_00 +#define GPIO89_DIR GPIO_DIR_OUT +#define GPIO89_PULLEN GPIO_PULL_ENABLE +#define GPIO89_PULL GPIO_PULL_DOWN +#define GPIO89_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 90 +#define GPIO90_MODE GPIO_MODE_00 +#define GPIO90_DIR GPIO_DIR_OUT +#define GPIO90_PULLEN GPIO_PULL_ENABLE +#define GPIO90_PULL GPIO_PULL_DOWN +#define GPIO90_DATAOUT GPIO_OUT_ONE + +//Configureation for Pin 91 +#define GPIO91_MODE GPIO_MODE_01 +#define GPIO91_DIR GPIO_DIR_IN +#define GPIO91_PULLEN GPIO_PULL_DISABLE +#define GPIO91_PULL GPIO_PULL_DOWN +#define GPIO91_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 92 +#define GPIO92_MODE GPIO_MODE_01 +#define GPIO92_DIR GPIO_DIR_IN +#define GPIO92_PULLEN GPIO_PULL_DISABLE +#define GPIO92_PULL GPIO_PULL_DOWN +#define GPIO92_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 93 +#define GPIO93_MODE GPIO_MODE_01 +#define GPIO93_DIR GPIO_DIR_IN +#define GPIO93_PULLEN GPIO_PULL_DISABLE +#define GPIO93_PULL GPIO_PULL_DOWN +#define GPIO93_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 94 +#define GPIO94_MODE GPIO_MODE_01 +#define GPIO94_DIR GPIO_DIR_IN +#define GPIO94_PULLEN GPIO_PULL_DISABLE +#define GPIO94_PULL GPIO_PULL_DOWN +#define GPIO94_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 95 +#define GPIO95_MODE GPIO_MODE_01 +#define GPIO95_DIR GPIO_DIR_IN +#define GPIO95_PULLEN GPIO_PULL_DISABLE +#define GPIO95_PULL GPIO_PULL_DOWN +#define GPIO95_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 96 +#define GPIO96_MODE GPIO_MODE_01 +#define GPIO96_DIR GPIO_DIR_IN +#define GPIO96_PULLEN GPIO_PULL_DISABLE +#define GPIO96_PULL GPIO_PULL_DOWN +#define GPIO96_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 97 +#define GPIO97_MODE GPIO_MODE_01 +#define GPIO97_DIR GPIO_DIR_IN +#define GPIO97_PULLEN GPIO_PULL_DISABLE +#define GPIO97_PULL GPIO_PULL_DOWN +#define GPIO97_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 98 +#define GPIO98_MODE GPIO_MODE_01 +#define GPIO98_DIR GPIO_DIR_IN +#define GPIO98_PULLEN GPIO_PULL_DISABLE +#define GPIO98_PULL GPIO_PULL_DOWN +#define GPIO98_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 99 +#define GPIO99_MODE GPIO_MODE_01 +#define GPIO99_DIR GPIO_DIR_IN +#define GPIO99_PULLEN GPIO_PULL_DISABLE +#define GPIO99_PULL GPIO_PULL_DOWN +#define GPIO99_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 100 +#define GPIO100_MODE GPIO_MODE_01 +#define GPIO100_DIR GPIO_DIR_IN +#define GPIO100_PULLEN GPIO_PULL_DISABLE +#define GPIO100_PULL GPIO_PULL_DOWN +#define GPIO100_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 101 +#define GPIO101_MODE GPIO_MODE_01 +#define GPIO101_DIR GPIO_DIR_IN +#define GPIO101_PULLEN GPIO_PULL_DISABLE +#define GPIO101_PULL GPIO_PULL_DOWN +#define GPIO101_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 102 +#define GPIO102_MODE GPIO_MODE_01 +#define GPIO102_DIR GPIO_DIR_IN +#define GPIO102_PULLEN GPIO_PULL_DISABLE +#define GPIO102_PULL GPIO_PULL_DOWN +#define GPIO102_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 103 +#define GPIO103_MODE GPIO_MODE_01 +#define GPIO103_DIR GPIO_DIR_IN +#define GPIO103_PULLEN GPIO_PULL_DISABLE +#define GPIO103_PULL GPIO_PULL_DOWN +#define GPIO103_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 104 +#define GPIO104_MODE GPIO_MODE_01 +#define GPIO104_DIR GPIO_DIR_IN +#define GPIO104_PULLEN GPIO_PULL_DISABLE +#define GPIO104_PULL GPIO_PULL_DOWN +#define GPIO104_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 105 +#define GPIO105_MODE GPIO_MODE_01 +#define GPIO105_DIR GPIO_DIR_IN +#define GPIO105_PULLEN GPIO_PULL_DISABLE +#define GPIO105_PULL GPIO_PULL_DOWN +#define GPIO105_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 106 +#define GPIO106_MODE GPIO_MODE_01 +#define GPIO106_DIR GPIO_DIR_IN +#define GPIO106_PULLEN GPIO_PULL_DISABLE +#define GPIO106_PULL GPIO_PULL_DOWN +#define GPIO106_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 107 +#define GPIO107_MODE GPIO_MODE_02 +#define GPIO107_DIR GPIO_DIR_IN +#define GPIO107_PULLEN GPIO_PULL_ENABLE +#define GPIO107_PULL GPIO_PULL_DOWN +#define GPIO107_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 108 +#define GPIO108_MODE GPIO_MODE_02 +#define GPIO108_DIR GPIO_DIR_IN +#define GPIO108_PULLEN GPIO_PULL_ENABLE +#define GPIO108_PULL GPIO_PULL_DOWN +#define GPIO108_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 109 +#define GPIO109_MODE GPIO_MODE_02 +#define GPIO109_DIR GPIO_DIR_IN +#define GPIO109_PULLEN GPIO_PULL_ENABLE +#define GPIO109_PULL GPIO_PULL_DOWN +#define GPIO109_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 110 +#define GPIO110_MODE GPIO_MODE_02 +#define GPIO110_DIR GPIO_DIR_IN +#define GPIO110_PULLEN GPIO_PULL_ENABLE +#define GPIO110_PULL GPIO_PULL_DOWN +#define GPIO110_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 111 +#define GPIO111_MODE GPIO_MODE_02 +#define GPIO111_DIR GPIO_DIR_IN +#define GPIO111_PULLEN GPIO_PULL_ENABLE +#define GPIO111_PULL GPIO_PULL_DOWN +#define GPIO111_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 112 +#define GPIO112_MODE GPIO_MODE_02 +#define GPIO112_DIR GPIO_DIR_IN +#define GPIO112_PULLEN GPIO_PULL_ENABLE +#define GPIO112_PULL GPIO_PULL_DOWN +#define GPIO112_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 113 +#define GPIO113_MODE GPIO_MODE_02 +#define GPIO113_DIR GPIO_DIR_IN +#define GPIO113_PULLEN GPIO_PULL_ENABLE +#define GPIO113_PULL GPIO_PULL_DOWN +#define GPIO113_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 114 +#define GPIO114_MODE GPIO_MODE_02 +#define GPIO114_DIR GPIO_DIR_IN +#define GPIO114_PULLEN GPIO_PULL_ENABLE +#define GPIO114_PULL GPIO_PULL_DOWN +#define GPIO114_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 115 +#define GPIO115_MODE GPIO_MODE_02 +#define GPIO115_DIR GPIO_DIR_IN +#define GPIO115_PULLEN GPIO_PULL_DISABLE +#define GPIO115_PULL GPIO_PULL_DOWN +#define GPIO115_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 116 +#define GPIO116_MODE GPIO_MODE_02 +#define GPIO116_DIR GPIO_DIR_IN +#define GPIO116_PULLEN GPIO_PULL_DISABLE +#define GPIO116_PULL GPIO_PULL_DOWN +#define GPIO116_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 117 +#define GPIO117_MODE GPIO_MODE_00 +#define GPIO117_DIR GPIO_DIR_IN +#define GPIO117_PULLEN GPIO_PULL_ENABLE +#define GPIO117_PULL GPIO_PULL_DOWN +#define GPIO117_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 118 +#define GPIO118_MODE GPIO_MODE_00 +#define GPIO118_DIR GPIO_DIR_IN +#define GPIO118_PULLEN GPIO_PULL_ENABLE +#define GPIO118_PULL GPIO_PULL_DOWN +#define GPIO118_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 119 +#define GPIO119_MODE GPIO_MODE_01 +#define GPIO119_DIR GPIO_DIR_OUT +#define GPIO119_PULLEN GPIO_PULL_DISABLE +#define GPIO119_PULL GPIO_PULL_DOWN +#define GPIO119_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 120 +#define GPIO120_MODE GPIO_MODE_01 +#define GPIO120_DIR GPIO_DIR_IN +#define GPIO120_PULLEN GPIO_PULL_ENABLE +#define GPIO120_PULL GPIO_PULL_DOWN +#define GPIO120_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 121 +#define GPIO121_MODE GPIO_MODE_01 +#define GPIO121_DIR GPIO_DIR_IN +#define GPIO121_PULLEN GPIO_PULL_DISABLE +#define GPIO121_PULL GPIO_PULL_DOWN +#define GPIO121_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 122 +#define GPIO122_MODE GPIO_MODE_01 +#define GPIO122_DIR GPIO_DIR_IN +#define GPIO122_PULLEN GPIO_PULL_DISABLE +#define GPIO122_PULL GPIO_PULL_DOWN +#define GPIO122_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 123 +#define GPIO123_MODE GPIO_MODE_01 +#define GPIO123_DIR GPIO_DIR_IN +#define GPIO123_PULLEN GPIO_PULL_DISABLE +#define GPIO123_PULL GPIO_PULL_DOWN +#define GPIO123_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 124 +#define GPIO124_MODE GPIO_MODE_01 +#define GPIO124_DIR GPIO_DIR_IN +#define GPIO124_PULLEN GPIO_PULL_DISABLE +#define GPIO124_PULL GPIO_PULL_DOWN +#define GPIO124_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 125 +#define GPIO125_MODE GPIO_MODE_01 +#define GPIO125_DIR GPIO_DIR_IN +#define GPIO125_PULLEN GPIO_PULL_DISABLE +#define GPIO125_PULL GPIO_PULL_DOWN +#define GPIO125_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 126 +#define GPIO126_MODE GPIO_MODE_01 +#define GPIO126_DIR GPIO_DIR_IN +#define GPIO126_PULLEN GPIO_PULL_DISABLE +#define GPIO126_PULL GPIO_PULL_DOWN +#define GPIO126_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 127 +#define GPIO127_MODE GPIO_MODE_01 +#define GPIO127_DIR GPIO_DIR_IN +#define GPIO127_PULLEN GPIO_PULL_DISABLE +#define GPIO127_PULL GPIO_PULL_DOWN +#define GPIO127_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 128 +#define GPIO128_MODE GPIO_MODE_01 +#define GPIO128_DIR GPIO_DIR_IN +#define GPIO128_PULLEN GPIO_PULL_DISABLE +#define GPIO128_PULL GPIO_PULL_DOWN +#define GPIO128_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 129 +#define GPIO129_MODE GPIO_MODE_01 +#define GPIO129_DIR GPIO_DIR_IN +#define GPIO129_PULLEN GPIO_PULL_DISABLE +#define GPIO129_PULL GPIO_PULL_DOWN +#define GPIO129_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 130 +#define GPIO130_MODE GPIO_MODE_01 +#define GPIO130_DIR GPIO_DIR_IN +#define GPIO130_PULLEN GPIO_PULL_DISABLE +#define GPIO130_PULL GPIO_PULL_DOWN +#define GPIO130_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 131 +#define GPIO131_MODE GPIO_MODE_01 +#define GPIO131_DIR GPIO_DIR_IN +#define GPIO131_PULLEN GPIO_PULL_DISABLE +#define GPIO131_PULL GPIO_PULL_DOWN +#define GPIO131_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 132 +#define GPIO132_MODE GPIO_MODE_01 +#define GPIO132_DIR GPIO_DIR_IN +#define GPIO132_PULLEN GPIO_PULL_DISABLE +#define GPIO132_PULL GPIO_PULL_DOWN +#define GPIO132_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 133 +#define GPIO133_MODE GPIO_MODE_01 +#define GPIO133_DIR GPIO_DIR_IN +#define GPIO133_PULLEN GPIO_PULL_DISABLE +#define GPIO133_PULL GPIO_PULL_DOWN +#define GPIO133_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 134 +#define GPIO134_MODE GPIO_MODE_01 +#define GPIO134_DIR GPIO_DIR_IN +#define GPIO134_PULLEN GPIO_PULL_DISABLE +#define GPIO134_PULL GPIO_PULL_DOWN +#define GPIO134_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 135 +#define GPIO135_MODE GPIO_MODE_01 +#define GPIO135_DIR GPIO_DIR_IN +#define GPIO135_PULLEN GPIO_PULL_DISABLE +#define GPIO135_PULL GPIO_PULL_DOWN +#define GPIO135_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 136 +#define GPIO136_MODE GPIO_MODE_01 +#define GPIO136_DIR GPIO_DIR_IN +#define GPIO136_PULLEN GPIO_PULL_DISABLE +#define GPIO136_PULL GPIO_PULL_DOWN +#define GPIO136_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 137 +#define GPIO137_MODE GPIO_MODE_01 +#define GPIO137_DIR GPIO_DIR_IN +#define GPIO137_PULLEN GPIO_PULL_DISABLE +#define GPIO137_PULL GPIO_PULL_DOWN +#define GPIO137_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 138 +#define GPIO138_MODE GPIO_MODE_00 +#define GPIO138_DIR GPIO_DIR_IN +#define GPIO138_PULLEN GPIO_PULL_ENABLE +#define GPIO138_PULL GPIO_PULL_DOWN +#define GPIO138_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 139 +#define GPIO139_MODE GPIO_MODE_00 +#define GPIO139_DIR GPIO_DIR_IN +#define GPIO139_PULLEN GPIO_PULL_ENABLE +#define GPIO139_PULL GPIO_PULL_DOWN +#define GPIO139_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 140 +#define GPIO140_MODE GPIO_MODE_00 +#define GPIO140_DIR GPIO_DIR_IN +#define GPIO140_PULLEN GPIO_PULL_ENABLE +#define GPIO140_PULL GPIO_PULL_DOWN +#define GPIO140_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 141 +#define GPIO141_MODE GPIO_MODE_00 +#define GPIO141_DIR GPIO_DIR_IN +#define GPIO141_PULLEN GPIO_PULL_ENABLE +#define GPIO141_PULL GPIO_PULL_DOWN +#define GPIO141_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 142 +#define GPIO142_MODE GPIO_MODE_00 +#define GPIO142_DIR GPIO_DIR_IN +#define GPIO142_PULLEN GPIO_PULL_ENABLE +#define GPIO142_PULL GPIO_PULL_DOWN +#define GPIO142_DATAOUT GPIO_OUT_ZERO + +//Configureation for pmic gpio + +//Configureation for Pin 0 +#define GPIOEXT0_MODE GPIO_MODE_00 +#define GPIOEXT0_DIR GPIO_DIR_IN +#define GPIOEXT0_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT0_PULL GPIO_PULL_DOWN +#define GPIOEXT0_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT0_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 1 +#define GPIOEXT1_MODE GPIO_MODE_00 +#define GPIOEXT1_DIR GPIO_DIR_IN +#define GPIOEXT1_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT1_PULL GPIO_PULL_DOWN +#define GPIOEXT1_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT1_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 2 +#define GPIOEXT2_MODE GPIO_MODE_00 +#define GPIOEXT2_DIR GPIO_DIR_IN +#define GPIOEXT2_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT2_PULL GPIO_PULL_DOWN +#define GPIOEXT2_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT2_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 3 +#define GPIOEXT3_MODE GPIO_MODE_00 +#define GPIOEXT3_DIR GPIO_DIR_IN +#define GPIOEXT3_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT3_PULL GPIO_PULL_DOWN +#define GPIOEXT3_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT3_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 4 +#define GPIOEXT4_MODE GPIO_MODE_00 +#define GPIOEXT4_DIR GPIO_DIR_IN +#define GPIOEXT4_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT4_PULL GPIO_PULL_DOWN +#define GPIOEXT4_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT4_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 5 +#define GPIOEXT5_MODE GPIO_MODE_01 +#define GPIOEXT5_DIR GPIO_DIR_IN +#define GPIOEXT5_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT5_PULL GPIO_PULL_DOWN +#define GPIOEXT5_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT5_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 6 +#define GPIOEXT6_MODE GPIO_MODE_01 +#define GPIOEXT6_DIR GPIO_DIR_IN +#define GPIOEXT6_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT6_PULL GPIO_PULL_DOWN +#define GPIOEXT6_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT6_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 7 +#define GPIOEXT7_MODE GPIO_MODE_01 +#define GPIOEXT7_DIR GPIO_DIR_IN +#define GPIOEXT7_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT7_PULL GPIO_PULL_DOWN +#define GPIOEXT7_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT7_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 8 +#define GPIOEXT8_MODE GPIO_MODE_01 +#define GPIOEXT8_DIR GPIO_DIR_IN +#define GPIOEXT8_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT8_PULL GPIO_PULL_DOWN +#define GPIOEXT8_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT8_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 9 +#define GPIOEXT9_MODE GPIO_MODE_00 +#define GPIOEXT9_DIR GPIO_DIR_IN +#define GPIOEXT9_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT9_PULL GPIO_PULL_DOWN +#define GPIOEXT9_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT9_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 10 +#define GPIOEXT10_MODE GPIO_MODE_00 +#define GPIOEXT10_DIR GPIO_DIR_IN +#define GPIOEXT10_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT10_PULL GPIO_PULL_DOWN +#define GPIOEXT10_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT10_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 11 +#define GPIOEXT11_MODE GPIO_MODE_00 +#define GPIOEXT11_DIR GPIO_DIR_IN +#define GPIOEXT11_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT11_PULL GPIO_PULL_DOWN +#define GPIOEXT11_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT11_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 12 +#define GPIOEXT12_MODE GPIO_MODE_00 +#define GPIOEXT12_DIR GPIO_DIR_IN +#define GPIOEXT12_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT12_PULL GPIO_PULL_DOWN +#define GPIOEXT12_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT12_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 13 +#define GPIOEXT13_MODE GPIO_MODE_00 +#define GPIOEXT13_DIR GPIO_DIR_IN +#define GPIOEXT13_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT13_PULL GPIO_PULL_DOWN +#define GPIOEXT13_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT13_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 14 +#define GPIOEXT14_MODE GPIO_MODE_00 +#define GPIOEXT14_DIR GPIO_DIR_IN +#define GPIOEXT14_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT14_PULL GPIO_PULL_DOWN +#define GPIOEXT14_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT14_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 15 +#define GPIOEXT15_MODE GPIO_MODE_00 +#define GPIOEXT15_DIR GPIO_DIR_IN +#define GPIOEXT15_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT15_PULL GPIO_PULL_DOWN +#define GPIOEXT15_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT15_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 16 +#define GPIOEXT16_MODE GPIO_MODE_00 +#define GPIOEXT16_DIR GPIO_DIR_IN +#define GPIOEXT16_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT16_PULL GPIO_PULL_DOWN +#define GPIOEXT16_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT16_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 17 +#define GPIOEXT17_MODE GPIO_MODE_00 +#define GPIOEXT17_DIR GPIO_DIR_IN +#define GPIOEXT17_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT17_PULL GPIO_PULL_DOWN +#define GPIOEXT17_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT17_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 18 +#define GPIOEXT18_MODE GPIO_MODE_00 +#define GPIOEXT18_DIR GPIO_DIR_IN +#define GPIOEXT18_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT18_PULL GPIO_PULL_DOWN +#define GPIOEXT18_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT18_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 19 +#define GPIOEXT19_MODE GPIO_MODE_00 +#define GPIOEXT19_DIR GPIO_DIR_IN +#define GPIOEXT19_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT19_PULL GPIO_PULL_DOWN +#define GPIOEXT19_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT19_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 20 +#define GPIOEXT20_MODE GPIO_MODE_00 +#define GPIOEXT20_DIR GPIO_DIR_IN +#define GPIOEXT20_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT20_PULL GPIO_PULL_DOWN +#define GPIOEXT20_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT20_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 21 +#define GPIOEXT21_MODE GPIO_MODE_00 +#define GPIOEXT21_DIR GPIO_DIR_IN +#define GPIOEXT21_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT21_PULL GPIO_PULL_DOWN +#define GPIOEXT21_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT21_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 22 +#define GPIOEXT22_MODE GPIO_MODE_00 +#define GPIOEXT22_DIR GPIO_DIR_IN +#define GPIOEXT22_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT22_PULL GPIO_PULL_DOWN +#define GPIOEXT22_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT22_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 23 +#define GPIOEXT23_MODE GPIO_MODE_00 +#define GPIOEXT23_DIR GPIO_DIR_IN +#define GPIOEXT23_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT23_PULL GPIO_PULL_DOWN +#define GPIOEXT23_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT23_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 24 +#define GPIOEXT24_MODE GPIO_MODE_00 +#define GPIOEXT24_DIR GPIO_DIR_IN +#define GPIOEXT24_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT24_PULL GPIO_PULL_DOWN +#define GPIOEXT24_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT24_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 25 +#define GPIOEXT25_MODE GPIO_MODE_00 +#define GPIOEXT25_DIR GPIO_DIR_IN +#define GPIOEXT25_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT25_PULL GPIO_PULL_DOWN +#define GPIOEXT25_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT25_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 26 +#define GPIOEXT26_MODE GPIO_MODE_00 +#define GPIOEXT26_DIR GPIO_DIR_IN +#define GPIOEXT26_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT26_PULL GPIO_PULL_DOWN +#define GPIOEXT26_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT26_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 27 +#define GPIOEXT27_MODE GPIO_MODE_00 +#define GPIOEXT27_DIR GPIO_DIR_IN +#define GPIOEXT27_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT27_PULL GPIO_PULL_DOWN +#define GPIOEXT27_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT27_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 28 +#define GPIOEXT28_MODE GPIO_MODE_00 +#define GPIOEXT28_DIR GPIO_DIR_IN +#define GPIOEXT28_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT28_PULL GPIO_PULL_DOWN +#define GPIOEXT28_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT28_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 29 +#define GPIOEXT29_MODE GPIO_MODE_00 +#define GPIOEXT29_DIR GPIO_DIR_IN +#define GPIOEXT29_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT29_PULL GPIO_PULL_DOWN +#define GPIOEXT29_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT29_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 30 +#define GPIOEXT30_MODE GPIO_MODE_00 +#define GPIOEXT30_DIR GPIO_DIR_IN +#define GPIOEXT30_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT30_PULL GPIO_PULL_DOWN +#define GPIOEXT30_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT30_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 31 +#define GPIOEXT31_MODE GPIO_MODE_00 +#define GPIOEXT31_DIR GPIO_DIR_IN +#define GPIOEXT31_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT31_PULL GPIO_PULL_DOWN +#define GPIOEXT31_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT31_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 32 +#define GPIOEXT32_MODE GPIO_MODE_00 +#define GPIOEXT32_DIR GPIO_DIR_IN +#define GPIOEXT32_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT32_PULL GPIO_PULL_DOWN +#define GPIOEXT32_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT32_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 33 +#define GPIOEXT33_MODE GPIO_MODE_00 +#define GPIOEXT33_DIR GPIO_DIR_IN +#define GPIOEXT33_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT33_PULL GPIO_PULL_DOWN +#define GPIOEXT33_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT33_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 34 +#define GPIOEXT34_MODE GPIO_MODE_00 +#define GPIOEXT34_DIR GPIO_DIR_IN +#define GPIOEXT34_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT34_PULL GPIO_PULL_DOWN +#define GPIOEXT34_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT34_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 35 +#define GPIOEXT35_MODE GPIO_MODE_00 +#define GPIOEXT35_DIR GPIO_DIR_IN +#define GPIOEXT35_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT35_PULL GPIO_PULL_DOWN +#define GPIOEXT35_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT35_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 36 +#define GPIOEXT36_MODE GPIO_MODE_00 +#define GPIOEXT36_DIR GPIO_DIR_IN +#define GPIOEXT36_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT36_PULL GPIO_PULL_DOWN +#define GPIOEXT36_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT36_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 37 +#define GPIOEXT37_MODE GPIO_MODE_00 +#define GPIOEXT37_DIR GPIO_DIR_IN +#define GPIOEXT37_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT37_PULL GPIO_PULL_DOWN +#define GPIOEXT37_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT37_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 38 +#define GPIOEXT38_MODE GPIO_MODE_00 +#define GPIOEXT38_DIR GPIO_DIR_IN +#define GPIOEXT38_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT38_PULL GPIO_PULL_DOWN +#define GPIOEXT38_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT38_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 39 +#define GPIOEXT39_MODE GPIO_MODE_00 +#define GPIOEXT39_DIR GPIO_DIR_IN +#define GPIOEXT39_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT39_PULL GPIO_PULL_DOWN +#define GPIOEXT39_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT39_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 40 +#define GPIOEXT40_MODE GPIO_MODE_00 +#define GPIOEXT40_DIR GPIO_DIR_IN +#define GPIOEXT40_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT40_PULL GPIO_PULL_DOWN +#define GPIOEXT40_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT40_DATAINV GPIO_DATA_UNINV + + + +#endif /* __CUST_GPIO_BOOT_H__ */ + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/cust_gpio_usage.h b/arch/arm/mach-mt8127/ford/dct/dct/cust_gpio_usage.h new file mode 100755 index 00000000000..21938b73b11 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/cust_gpio_usage.h @@ -0,0 +1,143 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_GPIO_USAGE_H__ +#define __CUST_GPIO_USAGE_H__ + + +#define GPIO_PMIC_EINT_PIN (GPIO2 | 0x80000000) +#define GPIO_PMIC_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_PMIC_EINT_PIN_M_EINT GPIO_PMIC_EINT_PIN_M_GPIO + +#define GPIO_AUD_CLK_MOSI_PIN (GPIO7 | 0x80000000) +#define GPIO_AUD_CLK_MOSI_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_AUD_CLK_MOSI_PIN_M_CLK GPIO_MODE_01 + +#define GPIO_AUD_DAT_MISO_PIN (GPIO8 | 0x80000000) +#define GPIO_AUD_DAT_MISO_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_AUD_DAT_MISO_PIN_M_AUD_MISO GPIO_MODE_01 + +#define GPIO_AUD_DAT_MOSI_PIN (GPIO9 | 0x80000000) +#define GPIO_AUD_DAT_MOSI_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_AUD_DAT_MOSI_PIN_M_AUD_MOSI GPIO_MODE_01 + +#define GPIO_QWERTYSLIDE_EINT_PIN (GPIO22 | 0x80000000) +#define GPIO_QWERTYSLIDE_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_QWERTYSLIDE_EINT_PIN_M_PWM GPIO_MODE_01 +#define GPIO_QWERTYSLIDE_EINT_PIN_M_EINT GPIO_QWERTYSLIDE_EINT_PIN_M_GPIO + +#define GPIO_ACCDET_EINT_PIN (GPIO26 | 0x80000000) +#define GPIO_ACCDET_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_ACCDET_EINT_PIN_M_CLK GPIO_MODE_01 +#define GPIO_ACCDET_EINT_PIN_M_EINT GPIO_ACCDET_EINT_PIN_M_GPIO +#define GPIO_ACCDET_EINT_PIN_CLK CLK_OUT2 +#define GPIO_ACCDET_EINT_PIN_FREQ GPIO_CLKSRC_NONE + +#define GPIO_OTG_DRVVBUS_PIN (GPIO27 | 0x80000000) +#define GPIO_OTG_DRVVBUS_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_OTG_DRVVBUS_PIN_M_KCOL GPIO_MODE_06 + +#define GPIO_CTP_EINT_PIN (GPIO29 | 0x80000000) +#define GPIO_CTP_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_CTP_EINT_PIN_M_EINT GPIO_CTP_EINT_PIN_M_GPIO + +#define GPIO_SPEAKER_EN_PIN (GPIO30 | 0x80000000) +#define GPIO_SPEAKER_EN_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_SPEAKER_EN_PIN_M_CLK GPIO_MODE_02 +#define GPIO_SPEAKER_EN_PIN_CLK CLK_OUT3 +#define GPIO_SPEAKER_EN_PIN_FREQ GPIO_CLKSRC_NONE + +#define GPIO_KPD_KCOL0_PIN (GPIO36 | 0x80000000) +#define GPIO_KPD_KCOL0_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_KPD_KCOL0_PIN_M_KCOL GPIO_MODE_01 + +#define GPIO_KPD_KCOL1_PIN (GPIO37 | 0x80000000) +#define GPIO_KPD_KCOL1_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_KPD_KCOL1_PIN_M_KCOL GPIO_MODE_01 + +#define GPIO_OTG_IDDIG_EINT_PIN (GPIO38 | 0x80000000) +#define GPIO_OTG_IDDIG_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_OTG_IDDIG_EINT_PIN_M_KCOL GPIO_MODE_01 +#define GPIO_OTG_IDDIG_EINT_PIN_M_IDDIG GPIO_MODE_02 + +#define GPIO_CTP_RST_PIN (GPIO45 | 0x80000000) +#define GPIO_CTP_RST_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMRST_PIN (GPIO53 | 0x80000000) +#define GPIO_CAMERA_CMRST_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMPDN1_PIN (GPIO54 | 0x80000000) +#define GPIO_CAMERA_CMPDN1_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMRST1_PIN (GPIO55 | 0x80000000) +#define GPIO_CAMERA_CMRST1_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMPDN_PIN (GPIO56 | 0x80000000) +#define GPIO_CAMERA_CMPDN_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_I2C1_SDA_PIN (GPIO57 | 0x80000000) +#define GPIO_I2C1_SDA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C1_SDA_PIN_M_SDA GPIO_MODE_01 + +#define GPIO_I2C1_SCA_PIN (GPIO58 | 0x80000000) +#define GPIO_I2C1_SCA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C1_SCA_PIN_M_SCL GPIO_MODE_01 + +#define GPIO_I2C0_SDA_PIN (GPIO75 | 0x80000000) +#define GPIO_I2C0_SDA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C0_SDA_PIN_M_SDA GPIO_MODE_01 + +#define GPIO_I2C0_SCA_PIN (GPIO76 | 0x80000000) +#define GPIO_I2C0_SCA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C0_SCA_PIN_M_SCL GPIO_MODE_01 + +#define GPIO_I2C2_SDA_PIN (GPIO77 | 0x80000000) +#define GPIO_I2C2_SDA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C2_SDA_PIN_M_PWM GPIO_MODE_02 +#define GPIO_I2C2_SDA_PIN_M_SDA GPIO_MODE_01 + +#define GPIO_I2C2_SCA_PIN (GPIO78 | 0x80000000) +#define GPIO_I2C2_SCA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C2_SCA_PIN_M_PWM GPIO_MODE_02 +#define GPIO_I2C2_SCA_PIN_M_SCL GPIO_MODE_01 + +#define GPIO_UART_URXD1_PIN (GPIO79 | 0x80000000) +#define GPIO_UART_URXD1_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_UART_URXD1_PIN_M_URXD GPIO_MODE_01 +#define GPIO_UART_URXD1_PIN_M_UTXD GPIO_MODE_02 + +#define GPIO_UART_UTXD1_PIN (GPIO80 | 0x80000000) +#define GPIO_UART_UTXD1_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_UART_UTXD1_PIN_M_UTXD GPIO_MODE_01 +#define GPIO_UART_UTXD1_PIN_M_URXD GPIO_MODE_02 + +#define GPIO_LCM_PWR (GPIO83 | 0x80000000) +#define GPIO_LCM_PWR_M_GPIO GPIO_MODE_00 + +#define GPIO_LCM_STB (GPIO88 | 0x80000000) +#define GPIO_LCM_STB_M_GPIO GPIO_MODE_00 +#define GPIO_LCM_STB_M_PWM GPIO_MODE_03 +#define GPIO_LCM_STB_M_PWM GPIO_MODE_06 + +#define GPIO_LCM_RST (GPIO89 | 0x80000000) +#define GPIO_LCM_RST_M_GPIO GPIO_MODE_00 +#define GPIO_LCM_RST_M_PWM GPIO_MODE_06 + + +/*Output for default variable names*/ +/*@XXX_XX_PIN in gpio.cmp */ + + + + +/*Output for default variable names*/ +/*@XXX_XX_PIN in gpio.cmp */ + + + +#endif /* __CUST_GPIO_USAGE_H__ */ + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/cust_kpd.h b/arch/arm/mach-mt8127/ford/dct/dct/cust_kpd.h new file mode 100644 index 00000000000..d089166965d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/cust_kpd.h @@ -0,0 +1,105 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef _CUST_KPD_H_ +#define _CUST_KPD_H_ +#include +#include + +#define KPD_YES 1 +#define KPD_NO 0 + +/* available keys (Linux keycodes) */ +#define KEY_CALL KEY_SEND +#define KEY_ENDCALL KEY_END +#undef KEY_OK +#define KEY_OK KEY_REPLY /* DPAD_CENTER */ +#define KEY_FOCUS KEY_HP +#define KEY_AT KEY_EMAIL +#define KEY_POUND 228 //KEY_KBDILLUMTOGGLE +#define KEY_STAR 227 //KEY_SWITCHVIDEOMODE +#define KEY_DEL KEY_BACKSPACE +#define KEY_SYM KEY_COMPOSE +/* KEY_HOME */ +/* KEY_BACK */ +/* KEY_VOLUMEDOWN */ +/* KEY_VOLUMEUP */ +/* KEY_MUTE */ +/* KEY_MENU */ +/* KEY_UP */ +/* KEY_DOWN */ +/* KEY_LEFT */ +/* KEY_RIGHT */ +/* KEY_CAMERA */ +/* KEY_POWER */ +/* KEY_TAB */ +/* KEY_ENTER */ +/* KEY_LEFTSHIFT */ +/* KEY_COMMA */ +/* KEY_DOT */ /* PERIOD */ +/* KEY_SLASH */ +/* KEY_LEFTALT */ +/* KEY_RIGHTALT */ +/* KEY_SPACE */ +/* KEY_SEARCH */ +/* KEY_0 ~ KEY_9 */ +/* KEY_A ~ KEY_Z */ + +/* + * Power key's HW keycodes are 8, 17, 26, 35, 44, 53, 62, 71. Only [8] works + * for Power key in Keypad driver, so we set KEY_ENDCALL in [8] because + * EndCall key is Power key in Android. If KPD_PWRKEY_USE_EINT is YES, these + * eight keycodes will not work for Power key. + */ + + +#define KPD_KEY_DEBOUNCE 1024 /* (val / 32) ms */ +#define KPD_PWRKEY_MAP KEY_POWER +#define MTK_PMIC_PWR_KEY 8 + +/* HW keycode [0 ~ 71] -> Linux keycode */ +#define KPD_INIT_KEYMAP() \ +{ \ + [0] = KEY_VOLUMEUP, \ + [1] = KEY_VOLUMEDOWN, \ +} +/*****************************************************************/ +/*******************Preload Customation***************************/ +/*****************************************************************/ +#define KPD_PWRKEY_EINT_GPIO GPIO0 + +#define KPD_PWRKEY_GPIO_DIN 0 + +#define KPD_DL_KEY1 0 /* KEY_VOLUMEUP */ +#define KPD_DL_KEY2 1 /* KEY_VOLUMEDOWN */ +#define KPD_DL_KEY3 8 /* KEY_POWER */ +/*****************************************************************/ +/*******************Uboot Customation***************************/ +/*****************************************************************/ +#define MT65XX_RECOVERY_KEY 0 /* KEY_VOLUMEUP */ +#define MT65XX_FACTORY_KEY 1 /* KEY_VOLUMEDOWN */ +/*****************************************************************/ +/*******************factory Customation***************************/ +/*****************************************************************/ +#define KEYS_PWRKEY_MAP { KEY_POWER, "Power" } +#define DEFINE_KEYS_KEYMAP(x) \ + struct key x[] = { \ + KEYS_PWRKEY_MAP, \ + { KEY_VOLUMEUP, "VLUp" }, \ + { KEY_VOLUMEDOWN, "VLDown" }, \ +} +#define CUST_KEY_UP KEY_VOLUMEUP +#define CUST_KEY_VOLUP KEY_VOLUMEUP +#define CUST_KEY_DOWN KEY_VOLUMEDOWN +#define CUST_KEY_VOLDOWN KEY_VOLUMEDOWN +#define CUST_KEY_CONFIRM KEY_VOLUMEUP +/*****************************************************************/ +/*******************recovery Customation****************************/ +/*****************************************************************/ +#endif + + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/cust_power.h b/arch/arm/mach-mt8127/ford/dct/dct/cust_power.h new file mode 100644 index 00000000000..d26a780fd02 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/cust_power.h @@ -0,0 +1,9 @@ +/* + * Generated by MTK SP DrvGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#define GPIO_DVDD28_DPI GPIO_VIO28 + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/pmic_drv.c b/arch/arm/mach-mt8127/ford/dct/dct/pmic_drv.c new file mode 100644 index 00000000000..9b7328000e8 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/pmic_drv.c @@ -0,0 +1,16 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + + + +#include "pmic_drv.h" + + + + +//For PMIC driver use + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct/pmic_drv.h b/arch/arm/mach-mt8127/ford/dct/dct/pmic_drv.h new file mode 100644 index 00000000000..ca0cb16851b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct/pmic_drv.h @@ -0,0 +1,30 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + + + +#include + + +//****for customer use*******// + + +//PMIC default enable/disable result + +//PMIC mode select +typedef enum +{ + BY_ENABLE = 0, + BY_SRCLKEN = 1 +}MODE_sel_enum; + +////For Common use + +//For PMIC driver use + + + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/Makefile b/arch/arm/mach-mt8127/ford/dct/dct_austin/Makefile new file mode 100755 index 00000000000..1ec48f355e7 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := pmic_drv.o + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/codegen.dws b/arch/arm/mach-mt8127/ford/dct/dct_austin/codegen.dws new file mode 100755 index 00000000000..6621ec1f161 Binary files /dev/null and b/arch/arm/mach-mt8127/ford/dct/dct_austin/codegen.dws differ diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_adc.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_adc.h new file mode 100755 index 00000000000..d2e60a5dd72 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_adc.h @@ -0,0 +1,15 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_AUXADC_TOOL_H +#define __CUST_AUXADC_TOOL_H + + + + +#endif //_CUST_AUXADC_TOOL_H + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_eint.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_eint.h new file mode 100755 index 00000000000..81d71c86cca --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_eint.h @@ -0,0 +1,69 @@ +/* + * Generated by MTK SP DrvGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Tue Apr 07 23:26:37 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_EINTH +#define __CUST_EINTH +#ifdef __cplusplus +extern "C" { +#endif +#define CUST_EINTF_TRIGGER_RISING 1 //High Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_FALLING 2 //Low Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_HIGH 4 //High Polarity and Level Sensitive +#define CUST_EINTF_TRIGGER_LOW 8 //Low Polarity and Level Sensitive +#define CUST_EINT_DEBOUNCE_DISABLE 0 +#define CUST_EINT_DEBOUNCE_ENABLE 1 +////////////////////////////////////////////////////////////////////////////// + + +#define CUST_EINT_KPD_SLIDE_NUM 0 +#define CUST_EINT_KPD_SLIDE_DEBOUNCE_CN 0 +#define CUST_EINT_KPD_SLIDE_TYPE CUST_EINTF_TRIGGER_LOW +#define CUST_EINT_KPD_SLIDE_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_GSE_1_NUM 1 +#define CUST_EINT_GSE_1_DEBOUNCE_CN 0 +#define CUST_EINT_GSE_1_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_GSE_1_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_ACCDET_NUM 4 +#define CUST_EINT_ACCDET_DEBOUNCE_CN 256 +#define CUST_EINT_ACCDET_TYPE CUST_EINTF_TRIGGER_LOW +#define CUST_EINT_ACCDET_DEBOUNCE_EN CUST_EINT_DEBOUNCE_ENABLE + +#define CUST_EINT_MSDC1_INS_NUM 6 +#define CUST_EINT_MSDC1_INS_DEBOUNCE_CN 0 +#define CUST_EINT_MSDC1_INS_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_MSDC1_INS_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_TOUCH_PANEL_NUM 7 +#define CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN 1 +#define CUST_EINT_TOUCH_PANEL_TYPE CUST_EINTF_TRIGGER_FALLING +#define CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_GSE_2_NUM 10 +#define CUST_EINT_GSE_2_DEBOUNCE_CN 0 +#define CUST_EINT_GSE_2_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_GSE_2_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_MSE_NUM 11 +#define CUST_EINT_MSE_DEBOUNCE_CN 0 +#define CUST_EINT_MSE_TYPE CUST_EINTF_TRIGGER_LOW +#define CUST_EINT_MSE_DEBOUNCE_EN CUST_EINT_DEBOUNCE_DISABLE + +#define CUST_EINT_MT6323_PMIC_NUM 24 +#define CUST_EINT_MT6323_PMIC_DEBOUNCE_CN 1 +#define CUST_EINT_MT6323_PMIC_TYPE CUST_EINTF_TRIGGER_HIGH +#define CUST_EINT_MT6323_PMIC_DEBOUNCE_EN CUST_EINT_DEBOUNCE_ENABLE + + + +////////////////////////////////////////////////////////////////////////////// +#ifdef __cplusplus +} +#endif +#endif //_CUST_EINT_H + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_eint_ext.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_eint_ext.h new file mode 100755 index 00000000000..415d3fbcbec --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_eint_ext.h @@ -0,0 +1,34 @@ +/* + * Generated by MTK SP DrvGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_EINTH +#define __CUST_EINTH + +#ifdef __cplusplus +extern "C" { +#endif + +#define CUST_EINTF_TRIGGER_RISING 1 //High Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_FALLING 2 //Low Polarity and Edge Sensitive +#define CUST_EINTF_TRIGGER_HIGH 4 //High Polarity and Level Sensitive +#define CUST_EINTF_TRIGGER_LOW 8 //Low Polarity and Level Sensitive + +#define CUST_EINT_DEBOUNCE_DISABLE 0 +#define CUST_EINT_DEBOUNCE_ENABLE 1 + +////////////////////////////////////////////////////////////////////////////// + + + + +////////////////////////////////////////////////////////////////////////////// +#ifdef __cplusplus +} + +#endif +#endif //_CUST_EINT__EXT_H + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_gpio_boot.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_gpio_boot.h new file mode 100755 index 00000000000..33fdc981a4c --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_gpio_boot.h @@ -0,0 +1,1348 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Wed Jan 28 16:08:15 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_GPIO_BOOT_H__ +#define __CUST_GPIO_BOOT_H__ + + +//Configuration for GPIO SMT(Schmidt Trigger) Group output start +//Configuration for GPIO SMT(Schmidt Trigger) Group output end +//Configureation for Pin 0 +#define GPIO0_MODE GPIO_MODE_01 +#define GPIO0_DIR GPIO_DIR_IN +#define GPIO0_PULLEN GPIO_PULL_DISABLE +#define GPIO0_PULL GPIO_PULL_DOWN +#define GPIO0_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 1 +#define GPIO1_MODE GPIO_MODE_01 +#define GPIO1_DIR GPIO_DIR_IN +#define GPIO1_PULLEN GPIO_PULL_DISABLE +#define GPIO1_PULL GPIO_PULL_DOWN +#define GPIO1_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 2 +#define GPIO2_MODE GPIO_MODE_00 +#define GPIO2_DIR GPIO_DIR_IN +#define GPIO2_PULLEN GPIO_PULL_ENABLE +#define GPIO2_PULL GPIO_PULL_DOWN +#define GPIO2_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 3 +#define GPIO3_MODE GPIO_MODE_01 +#define GPIO3_DIR GPIO_DIR_IN +#define GPIO3_PULLEN GPIO_PULL_DISABLE +#define GPIO3_PULL GPIO_PULL_DOWN +#define GPIO3_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 4 +#define GPIO4_MODE GPIO_MODE_01 +#define GPIO4_DIR GPIO_DIR_IN +#define GPIO4_PULLEN GPIO_PULL_DISABLE +#define GPIO4_PULL GPIO_PULL_DOWN +#define GPIO4_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 5 +#define GPIO5_MODE GPIO_MODE_00 +#define GPIO5_DIR GPIO_DIR_IN +#define GPIO5_PULLEN GPIO_PULL_ENABLE +#define GPIO5_PULL GPIO_PULL_DOWN +#define GPIO5_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 6 +#define GPIO6_MODE GPIO_MODE_00 +#define GPIO6_DIR GPIO_DIR_IN +#define GPIO6_PULLEN GPIO_PULL_ENABLE +#define GPIO6_PULL GPIO_PULL_DOWN +#define GPIO6_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 7 +#define GPIO7_MODE GPIO_MODE_01 +#define GPIO7_DIR GPIO_DIR_OUT +#define GPIO7_PULLEN GPIO_PULL_DISABLE +#define GPIO7_PULL GPIO_PULL_DOWN +#define GPIO7_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 8 +#define GPIO8_MODE GPIO_MODE_01 +#define GPIO8_DIR GPIO_DIR_IN +#define GPIO8_PULLEN GPIO_PULL_ENABLE +#define GPIO8_PULL GPIO_PULL_DOWN +#define GPIO8_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 9 +#define GPIO9_MODE GPIO_MODE_01 +#define GPIO9_DIR GPIO_DIR_OUT +#define GPIO9_PULLEN GPIO_PULL_DISABLE +#define GPIO9_PULL GPIO_PULL_DOWN +#define GPIO9_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 10 +#define GPIO10_MODE GPIO_MODE_01 +#define GPIO10_DIR GPIO_DIR_IN +#define GPIO10_PULLEN GPIO_PULL_ENABLE +#define GPIO10_PULL GPIO_PULL_DOWN +#define GPIO10_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 11 +#define GPIO11_MODE GPIO_MODE_01 +#define GPIO11_DIR GPIO_DIR_OUT +#define GPIO11_PULLEN GPIO_PULL_DISABLE +#define GPIO11_PULL GPIO_PULL_DOWN +#define GPIO11_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 12 +#define GPIO12_MODE GPIO_MODE_01 +#define GPIO12_DIR GPIO_DIR_OUT +#define GPIO12_PULLEN GPIO_PULL_DISABLE +#define GPIO12_PULL GPIO_PULL_DOWN +#define GPIO12_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 13 +#define GPIO13_MODE GPIO_MODE_00 +#define GPIO13_DIR GPIO_DIR_IN +#define GPIO13_PULLEN GPIO_PULL_ENABLE +#define GPIO13_PULL GPIO_PULL_DOWN +#define GPIO13_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 14 +#define GPIO14_MODE GPIO_MODE_00 +#define GPIO14_DIR GPIO_DIR_IN +#define GPIO14_PULLEN GPIO_PULL_ENABLE +#define GPIO14_PULL GPIO_PULL_DOWN +#define GPIO14_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 15 +#define GPIO15_MODE GPIO_MODE_00 +#define GPIO15_DIR GPIO_DIR_IN +#define GPIO15_PULLEN GPIO_PULL_ENABLE +#define GPIO15_PULL GPIO_PULL_DOWN +#define GPIO15_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 16 +#define GPIO16_MODE GPIO_MODE_00 +#define GPIO16_DIR GPIO_DIR_IN +#define GPIO16_PULLEN GPIO_PULL_ENABLE +#define GPIO16_PULL GPIO_PULL_DOWN +#define GPIO16_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 17 +#define GPIO17_MODE GPIO_MODE_00 +#define GPIO17_DIR GPIO_DIR_IN +#define GPIO17_PULLEN GPIO_PULL_ENABLE +#define GPIO17_PULL GPIO_PULL_DOWN +#define GPIO17_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 18 +#define GPIO18_MODE GPIO_MODE_00 +#define GPIO18_DIR GPIO_DIR_IN +#define GPIO18_PULLEN GPIO_PULL_ENABLE +#define GPIO18_PULL GPIO_PULL_DOWN +#define GPIO18_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 19 +#define GPIO19_MODE GPIO_MODE_00 +#define GPIO19_DIR GPIO_DIR_IN +#define GPIO19_PULLEN GPIO_PULL_ENABLE +#define GPIO19_PULL GPIO_PULL_DOWN +#define GPIO19_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 20 +#define GPIO20_MODE GPIO_MODE_00 +#define GPIO20_DIR GPIO_DIR_IN +#define GPIO20_PULLEN GPIO_PULL_ENABLE +#define GPIO20_PULL GPIO_PULL_DOWN +#define GPIO20_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 21 +#define GPIO21_MODE GPIO_MODE_00 +#define GPIO21_DIR GPIO_DIR_IN +#define GPIO21_PULLEN GPIO_PULL_ENABLE +#define GPIO21_PULL GPIO_PULL_DOWN +#define GPIO21_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 22 +#define GPIO22_MODE GPIO_MODE_00 +#define GPIO22_DIR GPIO_DIR_IN +#define GPIO22_PULLEN GPIO_PULL_ENABLE +#define GPIO22_PULL GPIO_PULL_UP +#define GPIO22_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 23 +#define GPIO23_MODE GPIO_MODE_00 +#define GPIO23_DIR GPIO_DIR_IN +#define GPIO23_PULLEN GPIO_PULL_ENABLE +#define GPIO23_PULL GPIO_PULL_UP +#define GPIO23_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 24 +#define GPIO24_MODE GPIO_MODE_00 +#define GPIO24_DIR GPIO_DIR_IN +#define GPIO24_PULLEN GPIO_PULL_ENABLE +#define GPIO24_PULL GPIO_PULL_DOWN +#define GPIO24_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 25 +#define GPIO25_MODE GPIO_MODE_00 +#define GPIO25_DIR GPIO_DIR_IN +#define GPIO25_PULLEN GPIO_PULL_ENABLE +#define GPIO25_PULL GPIO_PULL_DOWN +#define GPIO25_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 26 +#define GPIO26_MODE GPIO_MODE_00 +#define GPIO26_DIR GPIO_DIR_IN +#define GPIO26_PULLEN GPIO_PULL_DISABLE +#define GPIO26_PULL GPIO_PULL_DOWN +#define GPIO26_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 27 +#define GPIO27_MODE GPIO_MODE_00 +#define GPIO27_DIR GPIO_DIR_OUT +#define GPIO27_PULLEN GPIO_PULL_DISABLE +#define GPIO27_PULL GPIO_PULL_DOWN +#define GPIO27_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 28 +#define GPIO28_MODE GPIO_MODE_00 +#define GPIO28_DIR GPIO_DIR_IN +#define GPIO28_PULLEN GPIO_PULL_ENABLE +#define GPIO28_PULL GPIO_PULL_UP +#define GPIO28_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 29 +#define GPIO29_MODE GPIO_MODE_00 +#define GPIO29_DIR GPIO_DIR_IN +#define GPIO29_PULLEN GPIO_PULL_ENABLE +#define GPIO29_PULL GPIO_PULL_UP +#define GPIO29_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 30 +#define GPIO30_MODE GPIO_MODE_00 +#define GPIO30_DIR GPIO_DIR_OUT +#define GPIO30_PULLEN GPIO_PULL_ENABLE +#define GPIO30_PULL GPIO_PULL_DOWN +#define GPIO30_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 31 +#define GPIO31_MODE GPIO_MODE_00 +#define GPIO31_DIR GPIO_DIR_IN +#define GPIO31_PULLEN GPIO_PULL_ENABLE +#define GPIO31_PULL GPIO_PULL_DOWN +#define GPIO31_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 32 +#define GPIO32_MODE GPIO_MODE_00 +#define GPIO32_DIR GPIO_DIR_OUT +#define GPIO32_PULLEN GPIO_PULL_ENABLE +#define GPIO32_PULL GPIO_PULL_UP +#define GPIO32_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 33 +#define GPIO33_MODE GPIO_MODE_00 +#define GPIO33_DIR GPIO_DIR_IN +#define GPIO33_PULLEN GPIO_PULL_ENABLE +#define GPIO33_PULL GPIO_PULL_DOWN +#define GPIO33_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 34 +#define GPIO34_MODE GPIO_MODE_00 +#define GPIO34_DIR GPIO_DIR_IN +#define GPIO34_PULLEN GPIO_PULL_ENABLE +#define GPIO34_PULL GPIO_PULL_DOWN +#define GPIO34_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 35 +#define GPIO35_MODE GPIO_MODE_00 +#define GPIO35_DIR GPIO_DIR_IN +#define GPIO35_PULLEN GPIO_PULL_ENABLE +#define GPIO35_PULL GPIO_PULL_DOWN +#define GPIO35_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 36 +#define GPIO36_MODE GPIO_MODE_01 +#define GPIO36_DIR GPIO_DIR_IN +#define GPIO36_PULLEN GPIO_PULL_ENABLE +#define GPIO36_PULL GPIO_PULL_UP +#define GPIO36_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 37 +#define GPIO37_MODE GPIO_MODE_01 +#define GPIO37_DIR GPIO_DIR_IN +#define GPIO37_PULLEN GPIO_PULL_ENABLE +#define GPIO37_PULL GPIO_PULL_UP +#define GPIO37_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 38 +#define GPIO38_MODE GPIO_MODE_02 +#define GPIO38_DIR GPIO_DIR_IN +#define GPIO38_PULLEN GPIO_PULL_ENABLE +#define GPIO38_PULL GPIO_PULL_UP +#define GPIO38_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 39 +#define GPIO39_MODE GPIO_MODE_01 +#define GPIO39_DIR GPIO_DIR_IN +#define GPIO39_PULLEN GPIO_PULL_DISABLE +#define GPIO39_PULL GPIO_PULL_DOWN +#define GPIO39_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 40 +#define GPIO40_MODE GPIO_MODE_01 +#define GPIO40_DIR GPIO_DIR_IN +#define GPIO40_PULLEN GPIO_PULL_DISABLE +#define GPIO40_PULL GPIO_PULL_DOWN +#define GPIO40_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 41 +#define GPIO41_MODE GPIO_MODE_01 +#define GPIO41_DIR GPIO_DIR_IN +#define GPIO41_PULLEN GPIO_PULL_DISABLE +#define GPIO41_PULL GPIO_PULL_DOWN +#define GPIO41_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 42 +#define GPIO42_MODE GPIO_MODE_01 +#define GPIO42_DIR GPIO_DIR_IN +#define GPIO42_PULLEN GPIO_PULL_DISABLE +#define GPIO42_PULL GPIO_PULL_DOWN +#define GPIO42_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 43 +#define GPIO43_MODE GPIO_MODE_00 +#define GPIO43_DIR GPIO_DIR_IN +#define GPIO43_PULLEN GPIO_PULL_ENABLE +#define GPIO43_PULL GPIO_PULL_DOWN +#define GPIO43_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 44 +#define GPIO44_MODE GPIO_MODE_00 +#define GPIO44_DIR GPIO_DIR_OUT +#define GPIO44_PULLEN GPIO_PULL_ENABLE +#define GPIO44_PULL GPIO_PULL_DOWN +#define GPIO44_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 45 +#define GPIO45_MODE GPIO_MODE_00 +#define GPIO45_DIR GPIO_DIR_OUT +#define GPIO45_PULLEN GPIO_PULL_DISABLE +#define GPIO45_PULL GPIO_PULL_DOWN +#define GPIO45_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 46 +#define GPIO46_MODE GPIO_MODE_00 +#define GPIO46_DIR GPIO_DIR_IN +#define GPIO46_PULLEN GPIO_PULL_ENABLE +#define GPIO46_PULL GPIO_PULL_DOWN +#define GPIO46_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 47 +#define GPIO47_MODE GPIO_MODE_00 +#define GPIO47_DIR GPIO_DIR_IN +#define GPIO47_PULLEN GPIO_PULL_ENABLE +#define GPIO47_PULL GPIO_PULL_DOWN +#define GPIO47_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 48 +#define GPIO48_MODE GPIO_MODE_00 +#define GPIO48_DIR GPIO_DIR_IN +#define GPIO48_PULLEN GPIO_PULL_ENABLE +#define GPIO48_PULL GPIO_PULL_DOWN +#define GPIO48_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 49 +#define GPIO49_MODE GPIO_MODE_00 +#define GPIO49_DIR GPIO_DIR_IN +#define GPIO49_PULLEN GPIO_PULL_ENABLE +#define GPIO49_PULL GPIO_PULL_DOWN +#define GPIO49_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 50 +#define GPIO50_MODE GPIO_MODE_00 +#define GPIO50_DIR GPIO_DIR_OUT +#define GPIO50_PULLEN GPIO_PULL_ENABLE +#define GPIO50_PULL GPIO_PULL_DOWN +#define GPIO50_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 51 +#define GPIO51_MODE GPIO_MODE_00 +#define GPIO51_DIR GPIO_DIR_IN +#define GPIO51_PULLEN GPIO_PULL_ENABLE +#define GPIO51_PULL GPIO_PULL_DOWN +#define GPIO51_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 52 +#define GPIO52_MODE GPIO_MODE_00 +#define GPIO52_DIR GPIO_DIR_IN +#define GPIO52_PULLEN GPIO_PULL_ENABLE +#define GPIO52_PULL GPIO_PULL_DOWN +#define GPIO52_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 53 +#define GPIO53_MODE GPIO_MODE_00 +#define GPIO53_DIR GPIO_DIR_OUT +#define GPIO53_PULLEN GPIO_PULL_DISABLE +#define GPIO53_PULL GPIO_PULL_DOWN +#define GPIO53_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 54 +#define GPIO54_MODE GPIO_MODE_00 +#define GPIO54_DIR GPIO_DIR_OUT +#define GPIO54_PULLEN GPIO_PULL_DISABLE +#define GPIO54_PULL GPIO_PULL_DOWN +#define GPIO54_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 55 +#define GPIO55_MODE GPIO_MODE_00 +#define GPIO55_DIR GPIO_DIR_OUT +#define GPIO55_PULLEN GPIO_PULL_DISABLE +#define GPIO55_PULL GPIO_PULL_DOWN +#define GPIO55_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 56 +#define GPIO56_MODE GPIO_MODE_00 +#define GPIO56_DIR GPIO_DIR_OUT +#define GPIO56_PULLEN GPIO_PULL_DISABLE +#define GPIO56_PULL GPIO_PULL_DOWN +#define GPIO56_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 57 +#define GPIO57_MODE GPIO_MODE_01 +#define GPIO57_DIR GPIO_DIR_IN +#define GPIO57_PULLEN GPIO_PULL_ENABLE +#define GPIO57_PULL GPIO_PULL_UP +#define GPIO57_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 58 +#define GPIO58_MODE GPIO_MODE_01 +#define GPIO58_DIR GPIO_DIR_IN +#define GPIO58_PULLEN GPIO_PULL_ENABLE +#define GPIO58_PULL GPIO_PULL_UP +#define GPIO58_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 59 +#define GPIO59_MODE GPIO_MODE_01 +#define GPIO59_DIR GPIO_DIR_OUT +#define GPIO59_PULLEN GPIO_PULL_DISABLE +#define GPIO59_PULL GPIO_PULL_DOWN +#define GPIO59_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 60 +#define GPIO60_MODE GPIO_MODE_01 +#define GPIO60_DIR GPIO_DIR_OUT +#define GPIO60_PULLEN GPIO_PULL_DISABLE +#define GPIO60_PULL GPIO_PULL_DOWN +#define GPIO60_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 61 +#define GPIO61_MODE GPIO_MODE_01 +#define GPIO61_DIR GPIO_DIR_IN +#define GPIO61_PULLEN GPIO_PULL_ENABLE +#define GPIO61_PULL GPIO_PULL_DOWN +#define GPIO61_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 62 +#define GPIO62_MODE GPIO_MODE_01 +#define GPIO62_DIR GPIO_DIR_IN +#define GPIO62_PULLEN GPIO_PULL_ENABLE +#define GPIO62_PULL GPIO_PULL_DOWN +#define GPIO62_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 63 +#define GPIO63_MODE GPIO_MODE_01 +#define GPIO63_DIR GPIO_DIR_OUT +#define GPIO63_PULLEN GPIO_PULL_ENABLE +#define GPIO63_PULL GPIO_PULL_DOWN +#define GPIO63_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 64 +#define GPIO64_MODE GPIO_MODE_01 +#define GPIO64_DIR GPIO_DIR_IN +#define GPIO64_PULLEN GPIO_PULL_ENABLE +#define GPIO64_PULL GPIO_PULL_DOWN +#define GPIO64_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 65 +#define GPIO65_MODE GPIO_MODE_01 +#define GPIO65_DIR GPIO_DIR_OUT +#define GPIO65_PULLEN GPIO_PULL_DISABLE +#define GPIO65_PULL GPIO_PULL_DOWN +#define GPIO65_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 66 +#define GPIO66_MODE GPIO_MODE_01 +#define GPIO66_DIR GPIO_DIR_IN +#define GPIO66_PULLEN GPIO_PULL_ENABLE +#define GPIO66_PULL GPIO_PULL_DOWN +#define GPIO66_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 67 +#define GPIO67_MODE GPIO_MODE_01 +#define GPIO67_DIR GPIO_DIR_IN +#define GPIO67_PULLEN GPIO_PULL_ENABLE +#define GPIO67_PULL GPIO_PULL_DOWN +#define GPIO67_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 68 +#define GPIO68_MODE GPIO_MODE_01 +#define GPIO68_DIR GPIO_DIR_IN +#define GPIO68_PULLEN GPIO_PULL_ENABLE +#define GPIO68_PULL GPIO_PULL_DOWN +#define GPIO68_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 69 +#define GPIO69_MODE GPIO_MODE_01 +#define GPIO69_DIR GPIO_DIR_IN +#define GPIO69_PULLEN GPIO_PULL_ENABLE +#define GPIO69_PULL GPIO_PULL_DOWN +#define GPIO69_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 70 +#define GPIO70_MODE GPIO_MODE_01 +#define GPIO70_DIR GPIO_DIR_IN +#define GPIO70_PULLEN GPIO_PULL_ENABLE +#define GPIO70_PULL GPIO_PULL_DOWN +#define GPIO70_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 71 +#define GPIO71_MODE GPIO_MODE_01 +#define GPIO71_DIR GPIO_DIR_IN +#define GPIO71_PULLEN GPIO_PULL_ENABLE +#define GPIO71_PULL GPIO_PULL_DOWN +#define GPIO71_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 72 +#define GPIO72_MODE GPIO_MODE_00 +#define GPIO72_DIR GPIO_DIR_IN +#define GPIO72_PULLEN GPIO_PULL_ENABLE +#define GPIO72_PULL GPIO_PULL_DOWN +#define GPIO72_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 73 +#define GPIO73_MODE GPIO_MODE_00 +#define GPIO73_DIR GPIO_DIR_IN +#define GPIO73_PULLEN GPIO_PULL_ENABLE +#define GPIO73_PULL GPIO_PULL_DOWN +#define GPIO73_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 74 +#define GPIO74_MODE GPIO_MODE_00 +#define GPIO74_DIR GPIO_DIR_IN +#define GPIO74_PULLEN GPIO_PULL_ENABLE +#define GPIO74_PULL GPIO_PULL_DOWN +#define GPIO74_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 75 +#define GPIO75_MODE GPIO_MODE_01 +#define GPIO75_DIR GPIO_DIR_IN +#define GPIO75_PULLEN GPIO_PULL_ENABLE +#define GPIO75_PULL GPIO_PULL_UP +#define GPIO75_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 76 +#define GPIO76_MODE GPIO_MODE_01 +#define GPIO76_DIR GPIO_DIR_IN +#define GPIO76_PULLEN GPIO_PULL_ENABLE +#define GPIO76_PULL GPIO_PULL_UP +#define GPIO76_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 77 +#define GPIO77_MODE GPIO_MODE_01 +#define GPIO77_DIR GPIO_DIR_IN +#define GPIO77_PULLEN GPIO_PULL_ENABLE +#define GPIO77_PULL GPIO_PULL_UP +#define GPIO77_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 78 +#define GPIO78_MODE GPIO_MODE_01 +#define GPIO78_DIR GPIO_DIR_IN +#define GPIO78_PULLEN GPIO_PULL_ENABLE +#define GPIO78_PULL GPIO_PULL_UP +#define GPIO78_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 79 +#define GPIO79_MODE GPIO_MODE_01 +#define GPIO79_DIR GPIO_DIR_IN +#define GPIO79_PULLEN GPIO_PULL_ENABLE +#define GPIO79_PULL GPIO_PULL_UP +#define GPIO79_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 80 +#define GPIO80_MODE GPIO_MODE_01 +#define GPIO80_DIR GPIO_DIR_OUT +#define GPIO80_PULLEN GPIO_PULL_DISABLE +#define GPIO80_PULL GPIO_PULL_DOWN +#define GPIO80_DATAOUT GPIO_OUT_ONE + +//Configureation for Pin 81 +#define GPIO81_MODE GPIO_MODE_00 +#define GPIO81_DIR GPIO_DIR_IN +#define GPIO81_PULLEN GPIO_PULL_ENABLE +#define GPIO81_PULL GPIO_PULL_DOWN +#define GPIO81_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 82 +#define GPIO82_MODE GPIO_MODE_00 +#define GPIO82_DIR GPIO_DIR_IN +#define GPIO82_PULLEN GPIO_PULL_ENABLE +#define GPIO82_PULL GPIO_PULL_DOWN +#define GPIO82_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 83 +#define GPIO83_MODE GPIO_MODE_00 +#define GPIO83_DIR GPIO_DIR_OUT +#define GPIO83_PULLEN GPIO_PULL_DISABLE +#define GPIO83_PULL GPIO_PULL_DOWN +#define GPIO83_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 84 +#define GPIO84_MODE GPIO_MODE_00 +#define GPIO84_DIR GPIO_DIR_IN +#define GPIO84_PULLEN GPIO_PULL_ENABLE +#define GPIO84_PULL GPIO_PULL_DOWN +#define GPIO84_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 85 +#define GPIO85_MODE GPIO_MODE_00 +#define GPIO85_DIR GPIO_DIR_IN +#define GPIO85_PULLEN GPIO_PULL_ENABLE +#define GPIO85_PULL GPIO_PULL_DOWN +#define GPIO85_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 86 +#define GPIO86_MODE GPIO_MODE_00 +#define GPIO86_DIR GPIO_DIR_IN +#define GPIO86_PULLEN GPIO_PULL_ENABLE +#define GPIO86_PULL GPIO_PULL_DOWN +#define GPIO86_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 87 +#define GPIO87_MODE GPIO_MODE_00 +#define GPIO87_DIR GPIO_DIR_OUT +#define GPIO87_PULLEN GPIO_PULL_ENABLE +#define GPIO87_PULL GPIO_PULL_DOWN +#define GPIO87_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 88 +#define GPIO88_MODE GPIO_MODE_00 +#define GPIO88_DIR GPIO_DIR_IN +#define GPIO88_PULLEN GPIO_PULL_ENABLE +#define GPIO88_PULL GPIO_PULL_DOWN +#define GPIO88_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 89 +#define GPIO89_MODE GPIO_MODE_00 +#define GPIO89_DIR GPIO_DIR_OUT +#define GPIO89_PULLEN GPIO_PULL_ENABLE +#define GPIO89_PULL GPIO_PULL_DOWN +#define GPIO89_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 90 +#define GPIO90_MODE GPIO_MODE_00 +#define GPIO90_DIR GPIO_DIR_OUT +#define GPIO90_PULLEN GPIO_PULL_ENABLE +#define GPIO90_PULL GPIO_PULL_DOWN +#define GPIO90_DATAOUT GPIO_OUT_ONE + +//Configureation for Pin 91 +#define GPIO91_MODE GPIO_MODE_01 +#define GPIO91_DIR GPIO_DIR_IN +#define GPIO91_PULLEN GPIO_PULL_DISABLE +#define GPIO91_PULL GPIO_PULL_DOWN +#define GPIO91_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 92 +#define GPIO92_MODE GPIO_MODE_01 +#define GPIO92_DIR GPIO_DIR_IN +#define GPIO92_PULLEN GPIO_PULL_DISABLE +#define GPIO92_PULL GPIO_PULL_DOWN +#define GPIO92_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 93 +#define GPIO93_MODE GPIO_MODE_01 +#define GPIO93_DIR GPIO_DIR_IN +#define GPIO93_PULLEN GPIO_PULL_DISABLE +#define GPIO93_PULL GPIO_PULL_DOWN +#define GPIO93_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 94 +#define GPIO94_MODE GPIO_MODE_01 +#define GPIO94_DIR GPIO_DIR_IN +#define GPIO94_PULLEN GPIO_PULL_DISABLE +#define GPIO94_PULL GPIO_PULL_DOWN +#define GPIO94_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 95 +#define GPIO95_MODE GPIO_MODE_01 +#define GPIO95_DIR GPIO_DIR_IN +#define GPIO95_PULLEN GPIO_PULL_DISABLE +#define GPIO95_PULL GPIO_PULL_DOWN +#define GPIO95_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 96 +#define GPIO96_MODE GPIO_MODE_01 +#define GPIO96_DIR GPIO_DIR_IN +#define GPIO96_PULLEN GPIO_PULL_DISABLE +#define GPIO96_PULL GPIO_PULL_DOWN +#define GPIO96_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 97 +#define GPIO97_MODE GPIO_MODE_01 +#define GPIO97_DIR GPIO_DIR_IN +#define GPIO97_PULLEN GPIO_PULL_DISABLE +#define GPIO97_PULL GPIO_PULL_DOWN +#define GPIO97_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 98 +#define GPIO98_MODE GPIO_MODE_01 +#define GPIO98_DIR GPIO_DIR_IN +#define GPIO98_PULLEN GPIO_PULL_DISABLE +#define GPIO98_PULL GPIO_PULL_DOWN +#define GPIO98_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 99 +#define GPIO99_MODE GPIO_MODE_01 +#define GPIO99_DIR GPIO_DIR_IN +#define GPIO99_PULLEN GPIO_PULL_DISABLE +#define GPIO99_PULL GPIO_PULL_DOWN +#define GPIO99_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 100 +#define GPIO100_MODE GPIO_MODE_01 +#define GPIO100_DIR GPIO_DIR_IN +#define GPIO100_PULLEN GPIO_PULL_DISABLE +#define GPIO100_PULL GPIO_PULL_DOWN +#define GPIO100_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 101 +#define GPIO101_MODE GPIO_MODE_01 +#define GPIO101_DIR GPIO_DIR_IN +#define GPIO101_PULLEN GPIO_PULL_DISABLE +#define GPIO101_PULL GPIO_PULL_DOWN +#define GPIO101_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 102 +#define GPIO102_MODE GPIO_MODE_01 +#define GPIO102_DIR GPIO_DIR_IN +#define GPIO102_PULLEN GPIO_PULL_DISABLE +#define GPIO102_PULL GPIO_PULL_DOWN +#define GPIO102_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 103 +#define GPIO103_MODE GPIO_MODE_01 +#define GPIO103_DIR GPIO_DIR_IN +#define GPIO103_PULLEN GPIO_PULL_DISABLE +#define GPIO103_PULL GPIO_PULL_DOWN +#define GPIO103_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 104 +#define GPIO104_MODE GPIO_MODE_01 +#define GPIO104_DIR GPIO_DIR_IN +#define GPIO104_PULLEN GPIO_PULL_DISABLE +#define GPIO104_PULL GPIO_PULL_DOWN +#define GPIO104_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 105 +#define GPIO105_MODE GPIO_MODE_01 +#define GPIO105_DIR GPIO_DIR_IN +#define GPIO105_PULLEN GPIO_PULL_DISABLE +#define GPIO105_PULL GPIO_PULL_DOWN +#define GPIO105_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 106 +#define GPIO106_MODE GPIO_MODE_01 +#define GPIO106_DIR GPIO_DIR_IN +#define GPIO106_PULLEN GPIO_PULL_DISABLE +#define GPIO106_PULL GPIO_PULL_DOWN +#define GPIO106_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 107 +#define GPIO107_MODE GPIO_MODE_02 +#define GPIO107_DIR GPIO_DIR_IN +#define GPIO107_PULLEN GPIO_PULL_ENABLE +#define GPIO107_PULL GPIO_PULL_DOWN +#define GPIO107_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 108 +#define GPIO108_MODE GPIO_MODE_02 +#define GPIO108_DIR GPIO_DIR_IN +#define GPIO108_PULLEN GPIO_PULL_ENABLE +#define GPIO108_PULL GPIO_PULL_DOWN +#define GPIO108_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 109 +#define GPIO109_MODE GPIO_MODE_02 +#define GPIO109_DIR GPIO_DIR_IN +#define GPIO109_PULLEN GPIO_PULL_ENABLE +#define GPIO109_PULL GPIO_PULL_DOWN +#define GPIO109_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 110 +#define GPIO110_MODE GPIO_MODE_02 +#define GPIO110_DIR GPIO_DIR_IN +#define GPIO110_PULLEN GPIO_PULL_ENABLE +#define GPIO110_PULL GPIO_PULL_DOWN +#define GPIO110_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 111 +#define GPIO111_MODE GPIO_MODE_02 +#define GPIO111_DIR GPIO_DIR_IN +#define GPIO111_PULLEN GPIO_PULL_ENABLE +#define GPIO111_PULL GPIO_PULL_DOWN +#define GPIO111_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 112 +#define GPIO112_MODE GPIO_MODE_02 +#define GPIO112_DIR GPIO_DIR_IN +#define GPIO112_PULLEN GPIO_PULL_ENABLE +#define GPIO112_PULL GPIO_PULL_DOWN +#define GPIO112_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 113 +#define GPIO113_MODE GPIO_MODE_02 +#define GPIO113_DIR GPIO_DIR_IN +#define GPIO113_PULLEN GPIO_PULL_ENABLE +#define GPIO113_PULL GPIO_PULL_DOWN +#define GPIO113_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 114 +#define GPIO114_MODE GPIO_MODE_02 +#define GPIO114_DIR GPIO_DIR_IN +#define GPIO114_PULLEN GPIO_PULL_ENABLE +#define GPIO114_PULL GPIO_PULL_DOWN +#define GPIO114_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 115 +#define GPIO115_MODE GPIO_MODE_02 +#define GPIO115_DIR GPIO_DIR_IN +#define GPIO115_PULLEN GPIO_PULL_DISABLE +#define GPIO115_PULL GPIO_PULL_DOWN +#define GPIO115_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 116 +#define GPIO116_MODE GPIO_MODE_02 +#define GPIO116_DIR GPIO_DIR_IN +#define GPIO116_PULLEN GPIO_PULL_DISABLE +#define GPIO116_PULL GPIO_PULL_DOWN +#define GPIO116_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 117 +#define GPIO117_MODE GPIO_MODE_00 +#define GPIO117_DIR GPIO_DIR_IN +#define GPIO117_PULLEN GPIO_PULL_ENABLE +#define GPIO117_PULL GPIO_PULL_DOWN +#define GPIO117_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 118 +#define GPIO118_MODE GPIO_MODE_00 +#define GPIO118_DIR GPIO_DIR_IN +#define GPIO118_PULLEN GPIO_PULL_ENABLE +#define GPIO118_PULL GPIO_PULL_DOWN +#define GPIO118_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 119 +#define GPIO119_MODE GPIO_MODE_01 +#define GPIO119_DIR GPIO_DIR_OUT +#define GPIO119_PULLEN GPIO_PULL_DISABLE +#define GPIO119_PULL GPIO_PULL_DOWN +#define GPIO119_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 120 +#define GPIO120_MODE GPIO_MODE_01 +#define GPIO120_DIR GPIO_DIR_IN +#define GPIO120_PULLEN GPIO_PULL_ENABLE +#define GPIO120_PULL GPIO_PULL_DOWN +#define GPIO120_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 121 +#define GPIO121_MODE GPIO_MODE_01 +#define GPIO121_DIR GPIO_DIR_IN +#define GPIO121_PULLEN GPIO_PULL_DISABLE +#define GPIO121_PULL GPIO_PULL_DOWN +#define GPIO121_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 122 +#define GPIO122_MODE GPIO_MODE_01 +#define GPIO122_DIR GPIO_DIR_IN +#define GPIO122_PULLEN GPIO_PULL_DISABLE +#define GPIO122_PULL GPIO_PULL_DOWN +#define GPIO122_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 123 +#define GPIO123_MODE GPIO_MODE_01 +#define GPIO123_DIR GPIO_DIR_IN +#define GPIO123_PULLEN GPIO_PULL_DISABLE +#define GPIO123_PULL GPIO_PULL_DOWN +#define GPIO123_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 124 +#define GPIO124_MODE GPIO_MODE_01 +#define GPIO124_DIR GPIO_DIR_IN +#define GPIO124_PULLEN GPIO_PULL_DISABLE +#define GPIO124_PULL GPIO_PULL_DOWN +#define GPIO124_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 125 +#define GPIO125_MODE GPIO_MODE_01 +#define GPIO125_DIR GPIO_DIR_IN +#define GPIO125_PULLEN GPIO_PULL_DISABLE +#define GPIO125_PULL GPIO_PULL_DOWN +#define GPIO125_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 126 +#define GPIO126_MODE GPIO_MODE_01 +#define GPIO126_DIR GPIO_DIR_IN +#define GPIO126_PULLEN GPIO_PULL_DISABLE +#define GPIO126_PULL GPIO_PULL_DOWN +#define GPIO126_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 127 +#define GPIO127_MODE GPIO_MODE_01 +#define GPIO127_DIR GPIO_DIR_IN +#define GPIO127_PULLEN GPIO_PULL_DISABLE +#define GPIO127_PULL GPIO_PULL_DOWN +#define GPIO127_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 128 +#define GPIO128_MODE GPIO_MODE_01 +#define GPIO128_DIR GPIO_DIR_IN +#define GPIO128_PULLEN GPIO_PULL_DISABLE +#define GPIO128_PULL GPIO_PULL_DOWN +#define GPIO128_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 129 +#define GPIO129_MODE GPIO_MODE_01 +#define GPIO129_DIR GPIO_DIR_IN +#define GPIO129_PULLEN GPIO_PULL_DISABLE +#define GPIO129_PULL GPIO_PULL_DOWN +#define GPIO129_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 130 +#define GPIO130_MODE GPIO_MODE_01 +#define GPIO130_DIR GPIO_DIR_IN +#define GPIO130_PULLEN GPIO_PULL_DISABLE +#define GPIO130_PULL GPIO_PULL_DOWN +#define GPIO130_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 131 +#define GPIO131_MODE GPIO_MODE_01 +#define GPIO131_DIR GPIO_DIR_IN +#define GPIO131_PULLEN GPIO_PULL_DISABLE +#define GPIO131_PULL GPIO_PULL_DOWN +#define GPIO131_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 132 +#define GPIO132_MODE GPIO_MODE_01 +#define GPIO132_DIR GPIO_DIR_IN +#define GPIO132_PULLEN GPIO_PULL_DISABLE +#define GPIO132_PULL GPIO_PULL_DOWN +#define GPIO132_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 133 +#define GPIO133_MODE GPIO_MODE_01 +#define GPIO133_DIR GPIO_DIR_IN +#define GPIO133_PULLEN GPIO_PULL_DISABLE +#define GPIO133_PULL GPIO_PULL_DOWN +#define GPIO133_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 134 +#define GPIO134_MODE GPIO_MODE_01 +#define GPIO134_DIR GPIO_DIR_IN +#define GPIO134_PULLEN GPIO_PULL_DISABLE +#define GPIO134_PULL GPIO_PULL_DOWN +#define GPIO134_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 135 +#define GPIO135_MODE GPIO_MODE_01 +#define GPIO135_DIR GPIO_DIR_IN +#define GPIO135_PULLEN GPIO_PULL_DISABLE +#define GPIO135_PULL GPIO_PULL_DOWN +#define GPIO135_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 136 +#define GPIO136_MODE GPIO_MODE_01 +#define GPIO136_DIR GPIO_DIR_IN +#define GPIO136_PULLEN GPIO_PULL_DISABLE +#define GPIO136_PULL GPIO_PULL_DOWN +#define GPIO136_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 137 +#define GPIO137_MODE GPIO_MODE_01 +#define GPIO137_DIR GPIO_DIR_IN +#define GPIO137_PULLEN GPIO_PULL_DISABLE +#define GPIO137_PULL GPIO_PULL_DOWN +#define GPIO137_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 138 +#define GPIO138_MODE GPIO_MODE_00 +#define GPIO138_DIR GPIO_DIR_IN +#define GPIO138_PULLEN GPIO_PULL_ENABLE +#define GPIO138_PULL GPIO_PULL_DOWN +#define GPIO138_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 139 +#define GPIO139_MODE GPIO_MODE_00 +#define GPIO139_DIR GPIO_DIR_IN +#define GPIO139_PULLEN GPIO_PULL_ENABLE +#define GPIO139_PULL GPIO_PULL_DOWN +#define GPIO139_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 140 +#define GPIO140_MODE GPIO_MODE_00 +#define GPIO140_DIR GPIO_DIR_IN +#define GPIO140_PULLEN GPIO_PULL_ENABLE +#define GPIO140_PULL GPIO_PULL_DOWN +#define GPIO140_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 141 +#define GPIO141_MODE GPIO_MODE_00 +#define GPIO141_DIR GPIO_DIR_IN +#define GPIO141_PULLEN GPIO_PULL_ENABLE +#define GPIO141_PULL GPIO_PULL_DOWN +#define GPIO141_DATAOUT GPIO_OUT_ZERO + +//Configureation for Pin 142 +#define GPIO142_MODE GPIO_MODE_00 +#define GPIO142_DIR GPIO_DIR_IN +#define GPIO142_PULLEN GPIO_PULL_ENABLE +#define GPIO142_PULL GPIO_PULL_DOWN +#define GPIO142_DATAOUT GPIO_OUT_ZERO + +//Configureation for pmic gpio + +//Configureation for Pin 0 +#define GPIOEXT0_MODE GPIO_MODE_00 +#define GPIOEXT0_DIR GPIO_DIR_IN +#define GPIOEXT0_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT0_PULL GPIO_PULL_DOWN +#define GPIOEXT0_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT0_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 1 +#define GPIOEXT1_MODE GPIO_MODE_00 +#define GPIOEXT1_DIR GPIO_DIR_IN +#define GPIOEXT1_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT1_PULL GPIO_PULL_DOWN +#define GPIOEXT1_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT1_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 2 +#define GPIOEXT2_MODE GPIO_MODE_00 +#define GPIOEXT2_DIR GPIO_DIR_IN +#define GPIOEXT2_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT2_PULL GPIO_PULL_DOWN +#define GPIOEXT2_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT2_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 3 +#define GPIOEXT3_MODE GPIO_MODE_00 +#define GPIOEXT3_DIR GPIO_DIR_IN +#define GPIOEXT3_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT3_PULL GPIO_PULL_DOWN +#define GPIOEXT3_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT3_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 4 +#define GPIOEXT4_MODE GPIO_MODE_00 +#define GPIOEXT4_DIR GPIO_DIR_IN +#define GPIOEXT4_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT4_PULL GPIO_PULL_DOWN +#define GPIOEXT4_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT4_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 5 +#define GPIOEXT5_MODE GPIO_MODE_01 +#define GPIOEXT5_DIR GPIO_DIR_IN +#define GPIOEXT5_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT5_PULL GPIO_PULL_DOWN +#define GPIOEXT5_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT5_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 6 +#define GPIOEXT6_MODE GPIO_MODE_01 +#define GPIOEXT6_DIR GPIO_DIR_IN +#define GPIOEXT6_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT6_PULL GPIO_PULL_DOWN +#define GPIOEXT6_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT6_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 7 +#define GPIOEXT7_MODE GPIO_MODE_01 +#define GPIOEXT7_DIR GPIO_DIR_IN +#define GPIOEXT7_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT7_PULL GPIO_PULL_DOWN +#define GPIOEXT7_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT7_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 8 +#define GPIOEXT8_MODE GPIO_MODE_01 +#define GPIOEXT8_DIR GPIO_DIR_IN +#define GPIOEXT8_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT8_PULL GPIO_PULL_DOWN +#define GPIOEXT8_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT8_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 9 +#define GPIOEXT9_MODE GPIO_MODE_00 +#define GPIOEXT9_DIR GPIO_DIR_IN +#define GPIOEXT9_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT9_PULL GPIO_PULL_DOWN +#define GPIOEXT9_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT9_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 10 +#define GPIOEXT10_MODE GPIO_MODE_00 +#define GPIOEXT10_DIR GPIO_DIR_IN +#define GPIOEXT10_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT10_PULL GPIO_PULL_DOWN +#define GPIOEXT10_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT10_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 11 +#define GPIOEXT11_MODE GPIO_MODE_00 +#define GPIOEXT11_DIR GPIO_DIR_IN +#define GPIOEXT11_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT11_PULL GPIO_PULL_DOWN +#define GPIOEXT11_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT11_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 12 +#define GPIOEXT12_MODE GPIO_MODE_00 +#define GPIOEXT12_DIR GPIO_DIR_IN +#define GPIOEXT12_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT12_PULL GPIO_PULL_DOWN +#define GPIOEXT12_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT12_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 13 +#define GPIOEXT13_MODE GPIO_MODE_00 +#define GPIOEXT13_DIR GPIO_DIR_IN +#define GPIOEXT13_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT13_PULL GPIO_PULL_DOWN +#define GPIOEXT13_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT13_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 14 +#define GPIOEXT14_MODE GPIO_MODE_00 +#define GPIOEXT14_DIR GPIO_DIR_IN +#define GPIOEXT14_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT14_PULL GPIO_PULL_DOWN +#define GPIOEXT14_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT14_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 15 +#define GPIOEXT15_MODE GPIO_MODE_00 +#define GPIOEXT15_DIR GPIO_DIR_IN +#define GPIOEXT15_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT15_PULL GPIO_PULL_DOWN +#define GPIOEXT15_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT15_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 16 +#define GPIOEXT16_MODE GPIO_MODE_00 +#define GPIOEXT16_DIR GPIO_DIR_IN +#define GPIOEXT16_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT16_PULL GPIO_PULL_DOWN +#define GPIOEXT16_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT16_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 17 +#define GPIOEXT17_MODE GPIO_MODE_00 +#define GPIOEXT17_DIR GPIO_DIR_IN +#define GPIOEXT17_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT17_PULL GPIO_PULL_DOWN +#define GPIOEXT17_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT17_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 18 +#define GPIOEXT18_MODE GPIO_MODE_00 +#define GPIOEXT18_DIR GPIO_DIR_IN +#define GPIOEXT18_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT18_PULL GPIO_PULL_DOWN +#define GPIOEXT18_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT18_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 19 +#define GPIOEXT19_MODE GPIO_MODE_00 +#define GPIOEXT19_DIR GPIO_DIR_IN +#define GPIOEXT19_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT19_PULL GPIO_PULL_DOWN +#define GPIOEXT19_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT19_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 20 +#define GPIOEXT20_MODE GPIO_MODE_00 +#define GPIOEXT20_DIR GPIO_DIR_IN +#define GPIOEXT20_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT20_PULL GPIO_PULL_DOWN +#define GPIOEXT20_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT20_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 21 +#define GPIOEXT21_MODE GPIO_MODE_00 +#define GPIOEXT21_DIR GPIO_DIR_IN +#define GPIOEXT21_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT21_PULL GPIO_PULL_DOWN +#define GPIOEXT21_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT21_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 22 +#define GPIOEXT22_MODE GPIO_MODE_00 +#define GPIOEXT22_DIR GPIO_DIR_IN +#define GPIOEXT22_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT22_PULL GPIO_PULL_DOWN +#define GPIOEXT22_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT22_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 23 +#define GPIOEXT23_MODE GPIO_MODE_00 +#define GPIOEXT23_DIR GPIO_DIR_IN +#define GPIOEXT23_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT23_PULL GPIO_PULL_DOWN +#define GPIOEXT23_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT23_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 24 +#define GPIOEXT24_MODE GPIO_MODE_00 +#define GPIOEXT24_DIR GPIO_DIR_IN +#define GPIOEXT24_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT24_PULL GPIO_PULL_DOWN +#define GPIOEXT24_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT24_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 25 +#define GPIOEXT25_MODE GPIO_MODE_00 +#define GPIOEXT25_DIR GPIO_DIR_IN +#define GPIOEXT25_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT25_PULL GPIO_PULL_DOWN +#define GPIOEXT25_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT25_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 26 +#define GPIOEXT26_MODE GPIO_MODE_00 +#define GPIOEXT26_DIR GPIO_DIR_IN +#define GPIOEXT26_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT26_PULL GPIO_PULL_DOWN +#define GPIOEXT26_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT26_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 27 +#define GPIOEXT27_MODE GPIO_MODE_00 +#define GPIOEXT27_DIR GPIO_DIR_IN +#define GPIOEXT27_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT27_PULL GPIO_PULL_DOWN +#define GPIOEXT27_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT27_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 28 +#define GPIOEXT28_MODE GPIO_MODE_00 +#define GPIOEXT28_DIR GPIO_DIR_IN +#define GPIOEXT28_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT28_PULL GPIO_PULL_DOWN +#define GPIOEXT28_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT28_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 29 +#define GPIOEXT29_MODE GPIO_MODE_00 +#define GPIOEXT29_DIR GPIO_DIR_IN +#define GPIOEXT29_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT29_PULL GPIO_PULL_DOWN +#define GPIOEXT29_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT29_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 30 +#define GPIOEXT30_MODE GPIO_MODE_00 +#define GPIOEXT30_DIR GPIO_DIR_IN +#define GPIOEXT30_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT30_PULL GPIO_PULL_DOWN +#define GPIOEXT30_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT30_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 31 +#define GPIOEXT31_MODE GPIO_MODE_00 +#define GPIOEXT31_DIR GPIO_DIR_IN +#define GPIOEXT31_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT31_PULL GPIO_PULL_DOWN +#define GPIOEXT31_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT31_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 32 +#define GPIOEXT32_MODE GPIO_MODE_00 +#define GPIOEXT32_DIR GPIO_DIR_IN +#define GPIOEXT32_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT32_PULL GPIO_PULL_DOWN +#define GPIOEXT32_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT32_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 33 +#define GPIOEXT33_MODE GPIO_MODE_00 +#define GPIOEXT33_DIR GPIO_DIR_IN +#define GPIOEXT33_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT33_PULL GPIO_PULL_DOWN +#define GPIOEXT33_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT33_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 34 +#define GPIOEXT34_MODE GPIO_MODE_00 +#define GPIOEXT34_DIR GPIO_DIR_IN +#define GPIOEXT34_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT34_PULL GPIO_PULL_DOWN +#define GPIOEXT34_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT34_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 35 +#define GPIOEXT35_MODE GPIO_MODE_00 +#define GPIOEXT35_DIR GPIO_DIR_IN +#define GPIOEXT35_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT35_PULL GPIO_PULL_DOWN +#define GPIOEXT35_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT35_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 36 +#define GPIOEXT36_MODE GPIO_MODE_00 +#define GPIOEXT36_DIR GPIO_DIR_IN +#define GPIOEXT36_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT36_PULL GPIO_PULL_DOWN +#define GPIOEXT36_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT36_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 37 +#define GPIOEXT37_MODE GPIO_MODE_00 +#define GPIOEXT37_DIR GPIO_DIR_IN +#define GPIOEXT37_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT37_PULL GPIO_PULL_DOWN +#define GPIOEXT37_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT37_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 38 +#define GPIOEXT38_MODE GPIO_MODE_00 +#define GPIOEXT38_DIR GPIO_DIR_IN +#define GPIOEXT38_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT38_PULL GPIO_PULL_DOWN +#define GPIOEXT38_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT38_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 39 +#define GPIOEXT39_MODE GPIO_MODE_00 +#define GPIOEXT39_DIR GPIO_DIR_IN +#define GPIOEXT39_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT39_PULL GPIO_PULL_DOWN +#define GPIOEXT39_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT39_DATAINV GPIO_DATA_UNINV + +//Configureation for Pin 40 +#define GPIOEXT40_MODE GPIO_MODE_00 +#define GPIOEXT40_DIR GPIO_DIR_IN +#define GPIOEXT40_PULLEN GPIO_PULL_ENABLE +#define GPIOEXT40_PULL GPIO_PULL_DOWN +#define GPIOEXT40_DATAOUT GPIO_OUT_ZERO +#define GPIOEXT40_DATAINV GPIO_DATA_UNINV + + + +#endif /* __CUST_GPIO_BOOT_H__ */ + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_gpio_usage.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_gpio_usage.h new file mode 100755 index 00000000000..5387cedcb5d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_gpio_usage.h @@ -0,0 +1,138 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef __CUST_GPIO_USAGE_H__ +#define __CUST_GPIO_USAGE_H__ + + +#define GPIO_PMIC_EINT_PIN (GPIO2 | 0x80000000) +#define GPIO_PMIC_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_PMIC_EINT_PIN_M_EINT GPIO_PMIC_EINT_PIN_M_GPIO + +#define GPIO_AUD_CLK_MOSI_PIN (GPIO7 | 0x80000000) +#define GPIO_AUD_CLK_MOSI_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_AUD_CLK_MOSI_PIN_M_CLK GPIO_MODE_01 + +#define GPIO_AUD_DAT_MISO_PIN (GPIO8 | 0x80000000) +#define GPIO_AUD_DAT_MISO_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_AUD_DAT_MISO_PIN_M_AUD_MISO GPIO_MODE_01 + +#define GPIO_AUD_DAT_MOSI_PIN (GPIO9 | 0x80000000) +#define GPIO_AUD_DAT_MOSI_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_AUD_DAT_MOSI_PIN_M_AUD_MOSI GPIO_MODE_01 + +#define GPIO_QWERTYSLIDE_EINT_PIN (GPIO22 | 0x80000000) +#define GPIO_QWERTYSLIDE_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_QWERTYSLIDE_EINT_PIN_M_PWM GPIO_MODE_01 +#define GPIO_QWERTYSLIDE_EINT_PIN_M_EINT GPIO_QWERTYSLIDE_EINT_PIN_M_GPIO + +#define GPIO_ACCDET_EINT_PIN (GPIO26 | 0x80000000) +#define GPIO_ACCDET_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_ACCDET_EINT_PIN_M_CLK GPIO_MODE_01 +#define GPIO_ACCDET_EINT_PIN_M_EINT GPIO_ACCDET_EINT_PIN_M_GPIO +#define GPIO_ACCDET_EINT_PIN_CLK CLK_OUT2 +#define GPIO_ACCDET_EINT_PIN_FREQ GPIO_CLKSRC_NONE + +#define GPIO_OTG_DRVVBUS_PIN (GPIO27 | 0x80000000) +#define GPIO_OTG_DRVVBUS_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_OTG_DRVVBUS_PIN_M_KCOL GPIO_MODE_06 + +#define GPIO_CTP_EINT_PIN (GPIO29 | 0x80000000) +#define GPIO_CTP_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_CTP_EINT_PIN_M_EINT GPIO_CTP_EINT_PIN_M_GPIO + +#define GPIO_SPEAKER_EN_PIN (GPIO30 | 0x80000000) +#define GPIO_SPEAKER_EN_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_SPEAKER_EN_PIN_M_CLK GPIO_MODE_02 +#define GPIO_SPEAKER_EN_PIN_CLK CLK_OUT3 +#define GPIO_SPEAKER_EN_PIN_FREQ GPIO_CLKSRC_NONE + +#define GPIO_KPD_KCOL0_PIN (GPIO36 | 0x80000000) +#define GPIO_KPD_KCOL0_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_KPD_KCOL0_PIN_M_KCOL GPIO_MODE_01 + +#define GPIO_KPD_KCOL1_PIN (GPIO37 | 0x80000000) +#define GPIO_KPD_KCOL1_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_KPD_KCOL1_PIN_M_KCOL GPIO_MODE_01 + +#define GPIO_OTG_IDDIG_EINT_PIN (GPIO38 | 0x80000000) +#define GPIO_OTG_IDDIG_EINT_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_OTG_IDDIG_EINT_PIN_M_KCOL GPIO_MODE_01 +#define GPIO_OTG_IDDIG_EINT_PIN_M_IDDIG GPIO_MODE_02 + +#define GPIO_CTP_RST_PIN (GPIO45 | 0x80000000) +#define GPIO_CTP_RST_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMRST_PIN (GPIO53 | 0x80000000) +#define GPIO_CAMERA_CMRST_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMPDN1_PIN (GPIO54 | 0x80000000) +#define GPIO_CAMERA_CMPDN1_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMRST1_PIN (GPIO55 | 0x80000000) +#define GPIO_CAMERA_CMRST1_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_CAMERA_CMPDN_PIN (GPIO56 | 0x80000000) +#define GPIO_CAMERA_CMPDN_PIN_M_GPIO GPIO_MODE_00 + +#define GPIO_I2C1_SDA_PIN (GPIO57 | 0x80000000) +#define GPIO_I2C1_SDA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C1_SDA_PIN_M_SDA GPIO_MODE_01 + +#define GPIO_I2C1_SCA_PIN (GPIO58 | 0x80000000) +#define GPIO_I2C1_SCA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C1_SCA_PIN_M_SCL GPIO_MODE_01 + +#define GPIO_I2C0_SDA_PIN (GPIO75 | 0x80000000) +#define GPIO_I2C0_SDA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C0_SDA_PIN_M_SDA GPIO_MODE_01 + +#define GPIO_I2C0_SCA_PIN (GPIO76 | 0x80000000) +#define GPIO_I2C0_SCA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C0_SCA_PIN_M_SCL GPIO_MODE_01 + +#define GPIO_I2C2_SDA_PIN (GPIO77 | 0x80000000) +#define GPIO_I2C2_SDA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C2_SDA_PIN_M_PWM GPIO_MODE_02 +#define GPIO_I2C2_SDA_PIN_M_SDA GPIO_MODE_01 + +#define GPIO_I2C2_SCA_PIN (GPIO78 | 0x80000000) +#define GPIO_I2C2_SCA_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_I2C2_SCA_PIN_M_PWM GPIO_MODE_02 +#define GPIO_I2C2_SCA_PIN_M_SCL GPIO_MODE_01 + +#define GPIO_UART_URXD1_PIN (GPIO79 | 0x80000000) +#define GPIO_UART_URXD1_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_UART_URXD1_PIN_M_URXD GPIO_MODE_01 +#define GPIO_UART_URXD1_PIN_M_UTXD GPIO_MODE_02 + +#define GPIO_UART_UTXD1_PIN (GPIO80 | 0x80000000) +#define GPIO_UART_UTXD1_PIN_M_GPIO GPIO_MODE_00 +#define GPIO_UART_UTXD1_PIN_M_UTXD GPIO_MODE_01 +#define GPIO_UART_UTXD1_PIN_M_URXD GPIO_MODE_02 + +#define GPIO_LCM_PWR (GPIO83 | 0x80000000) +#define GPIO_LCM_PWR_M_GPIO GPIO_MODE_00 + +#define GPIO_LCM_RST (GPIO89 | 0x80000000) +#define GPIO_LCM_RST_M_GPIO GPIO_MODE_00 +#define GPIO_LCM_RST_M_PWM GPIO_MODE_06 + + +/*Output for default variable names*/ +/*@XXX_XX_PIN in gpio.cmp */ + + + + +/*Output for default variable names*/ +/*@XXX_XX_PIN in gpio.cmp */ + + + +#endif /* __CUST_GPIO_USAGE_H__ */ + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_kpd.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_kpd.h new file mode 100755 index 00000000000..10ab836889c --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_kpd.h @@ -0,0 +1,105 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#ifndef _CUST_KPD_H_ +#define _CUST_KPD_H_ +#include +#include + +#define KPD_YES 1 +#define KPD_NO 0 + +/* available keys (Linux keycodes) */ +#define KEY_CALL KEY_SEND +#define KEY_ENDCALL KEY_END +#undef KEY_OK +#define KEY_OK KEY_REPLY /* DPAD_CENTER */ +#define KEY_FOCUS KEY_HP +#define KEY_AT KEY_EMAIL +#define KEY_POUND 228 //KEY_KBDILLUMTOGGLE +#define KEY_STAR 227 //KEY_SWITCHVIDEOMODE +#define KEY_DEL KEY_BACKSPACE +#define KEY_SYM KEY_COMPOSE +/* KEY_HOME */ +/* KEY_BACK */ +/* KEY_VOLUMEDOWN */ +/* KEY_VOLUMEUP */ +/* KEY_MUTE */ +/* KEY_MENU */ +/* KEY_UP */ +/* KEY_DOWN */ +/* KEY_LEFT */ +/* KEY_RIGHT */ +/* KEY_CAMERA */ +/* KEY_POWER */ +/* KEY_TAB */ +/* KEY_ENTER */ +/* KEY_LEFTSHIFT */ +/* KEY_COMMA */ +/* KEY_DOT */ /* PERIOD */ +/* KEY_SLASH */ +/* KEY_LEFTALT */ +/* KEY_RIGHTALT */ +/* KEY_SPACE */ +/* KEY_SEARCH */ +/* KEY_0 ~ KEY_9 */ +/* KEY_A ~ KEY_Z */ + +/* + * Power key's HW keycodes are 8, 17, 26, 35, 44, 53, 62, 71. Only [8] works + * for Power key in Keypad driver, so we set KEY_ENDCALL in [8] because + * EndCall key is Power key in Android. If KPD_PWRKEY_USE_EINT is YES, these + * eight keycodes will not work for Power key. + */ + + +#define KPD_KEY_DEBOUNCE 1024 /* (val / 32) ms */ +#define KPD_PWRKEY_MAP KEY_POWER +#define MTK_PMIC_PWR_KEY 8 + +/* HW keycode [0 ~ 71] -> Linux keycode */ +#define KPD_INIT_KEYMAP() \ +{ \ + [0] = KEY_VOLUMEUP, \ + [1] = KEY_VOLUMEDOWN, \ +} +/*****************************************************************/ +/*******************Preload Customation***************************/ +/*****************************************************************/ +#define KPD_PWRKEY_EINT_GPIO GPIO0 + +#define KPD_PWRKEY_GPIO_DIN 0 + +#define KPD_DL_KEY1 0 /* KEY_VOLUMEUP */ +#define KPD_DL_KEY2 1 /* KEY_VOLUMEDOWN */ +#define KPD_DL_KEY3 8 /* KEY_POWER */ +/*****************************************************************/ +/*******************Uboot Customation***************************/ +/*****************************************************************/ +#define MT65XX_RECOVERY_KEY 0 /* KEY_VOLUMEUP */ +#define MT65XX_FACTORY_KEY 1 /* KEY_VOLUMEDOWN */ +/*****************************************************************/ +/*******************factory Customation***************************/ +/*****************************************************************/ +#define KEYS_PWRKEY_MAP { KEY_POWER, "Power" } +#define DEFINE_KEYS_KEYMAP(x) \ + struct key x[] = { \ + KEYS_PWRKEY_MAP, \ + { KEY_VOLUMEUP, "VLUp" }, \ + { KEY_VOLUMEDOWN, "VLDown" }, \ +} +#define CUST_KEY_UP KEY_VOLUMEUP +#define CUST_KEY_VOLUP KEY_VOLUMEUP +#define CUST_KEY_DOWN KEY_VOLUMEDOWN +#define CUST_KEY_VOLDOWN KEY_VOLUMEDOWN +#define CUST_KEY_CONFIRM KEY_VOLUMEUP +/*****************************************************************/ +/*******************recovery Customation****************************/ +/*****************************************************************/ +#endif + + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_power.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_power.h new file mode 100755 index 00000000000..d26a780fd02 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/cust_power.h @@ -0,0 +1,9 @@ +/* + * Generated by MTK SP DrvGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + +#define GPIO_DVDD28_DPI GPIO_VIO28 + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/pmic_drv.c b/arch/arm/mach-mt8127/ford/dct/dct_austin/pmic_drv.c new file mode 100755 index 00000000000..9b7328000e8 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/pmic_drv.c @@ -0,0 +1,16 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + + + +#include "pmic_drv.h" + + + + +//For PMIC driver use + + diff --git a/arch/arm/mach-mt8127/ford/dct/dct_austin/pmic_drv.h b/arch/arm/mach-mt8127/ford/dct/dct_austin/pmic_drv.h new file mode 100755 index 00000000000..ca0cb16851b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/dct/dct_austin/pmic_drv.h @@ -0,0 +1,30 @@ +/* + * Generated by MTK SP Drv_CodeGen Version 03.13.6 for MT8127. Copyright MediaTek Inc. (C) 2013. + * Thu Jan 29 20:42:51 2015 + * Do Not Modify the File. + */ + + + +#include + + +//****for customer use*******// + + +//PMIC default enable/disable result + +//PMIC mode select +typedef enum +{ + BY_ENABLE = 0, + BY_SRCLKEN = 1 +}MODE_sel_enum; + +////For Common use + +//For PMIC driver use + + + + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/Makefile b/arch/arm/mach-mt8127/ford/eeprom/Makefile old mode 100644 new mode 100755 similarity index 68% rename from drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/Makefile rename to arch/arm/mach-mt8127/ford/eeprom/Makefile index 4efeeda2585..6ec6676af91 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/Makefile +++ b/arch/arm/mach-mt8127/ford/eeprom/Makefile @@ -1,4 +1,4 @@ include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += hi708yuv_Sensor.o +obj-y := dummy_eeprom.o diff --git a/arch/arm/mach-mt8127/ford/eeprom/dummy_eeprom.c b/arch/arm/mach-mt8127/ford/eeprom/dummy_eeprom.c new file mode 100644 index 00000000000..faafd31f13b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/eeprom/dummy_eeprom.c @@ -0,0 +1,643 @@ +/* + * Driver for EEPROM + * + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include "kd_camera_hw.h" +#include "eeprom.h" +#include "eeprom_define.h" + +#include "dummy_eeprom.h" +#include // for SMP + +//#define EEPROMGETDLT_DEBUG //test +//#define EEPROM_DEBUG //test +#ifdef EEPROM_DEBUG +#define EEPROMDB printk +#else +#define EEPROMDB(x,...) +#endif + + +static DEFINE_SPINLOCK(g_EEPROMLock); // for SMP + +#define EEPROM_I2C_BUSNUM 1 +static struct i2c_board_info __initdata kd_eeprom_dev={ I2C_BOARD_INFO("dummy_eeprom", 0xA0>>1)}; + +/******************************************************************************* +* +********************************************************************************/ +#define EEPROM_ICS_REVISION 1 //seanlin111208 +/******************************************************************************* +* +********************************************************************************/ +#define EEPROM_DRVNAME "dummy_eeprom" +#define EEPROM_I2C_GROUP_ID 0 +/******************************************************************************* +* +********************************************************************************/ +/* fix warning MSG +static unsigned short g_pu2Normal_i2c[] = {S24CS64A_DEVICE_ID , I2C_CLIENT_END}; +static unsigned short g_u2Ignore = I2C_CLIENT_END; +static struct i2c_client_address_data g_stEEPROM_Addr_data = { + .normal_i2c = g_pu2Normal_i2c, + .probe = &g_u2Ignore, + .ignore = &g_u2Ignore +}; */ +static struct i2c_client * g_pstI2Cclient = NULL; + +//81 is used for V4L driver +static dev_t g_EEPROMdevno = MKDEV(EEPROM_DEV_MAJOR_NUMBER,0); +static struct cdev * g_pEEPROM_CharDrv = NULL; +//static spinlock_t g_EEPROMLock; +static struct class *EEPROM_class = NULL; +static atomic_t g_EEPROMatomic; +/******************************************************************************* +* +********************************************************************************/ +// maximun read length is limited at "I2C_FIFO_SIZE" in I2c-mt65xx.c which is 8 bytes +int iWriteEEPROM(u16 a_u2Addr , u32 a_u4Bytes, u8 * puDataInBytes) +{ + int i4RetValue = 0; + u32 u4Index = 0; + char puSendCmd[8] = {(char)(a_u2Addr >> 8) , (char)(a_u2Addr & 0xFF) , + 0, 0, 0, 0, 0, 0}; + if(a_u4Bytes + 2 > 8) + { + EEPROMDB("[EEPROM] exceed I2c-mt65xx.c 8 bytes limitation (include address 2 Byte)\n"); + return -1; + } + + for(u4Index = 0 ; u4Index < a_u4Bytes ; u4Index += 1 ) + { + puSendCmd[(u4Index + 2)] = puDataInBytes[u4Index]; + } + + i4RetValue = i2c_master_send(g_pstI2Cclient, puSendCmd, (a_u4Bytes + 2)); + if (i4RetValue != (a_u4Bytes + 2)) + { + EEPROMDB("[EEPROM] I2C write failed!! \n"); + return -1; + } + mdelay(10); //for tWR singnal --> write data form buffer to memory. + + //EEPROMDB("[EEPROM] iWriteEEPROM done!! \n"); + return 0; +} + + +// maximun read length is limited at "I2C_FIFO_SIZE" in I2c-mt65xx.c which is 8 bytes +int iReadEEPROM(u16 a_u2Addr, u32 ui4_length, u8 * a_puBuff) +{ + int i4RetValue = 0; + char puReadCmd[2] = {(char)(a_u2Addr >> 8) , (char)(a_u2Addr & 0xFF)}; + + //EEPROMDB("[EEPROM] iReadEEPROM!! \n"); + + if(ui4_length > 8) + { + EEPROMDB("[EEPROM] exceed I2c-mt65xx.c 8 bytes limitation\n"); + return -1; + } + spin_lock(&g_EEPROMLock); //for SMP + g_pstI2Cclient->addr = g_pstI2Cclient->addr & (I2C_MASK_FLAG | I2C_WR_FLAG); + spin_unlock(&g_EEPROMLock); // for SMP + + //EEPROMDB("[EERPOM] i2c_master_send \n"); + i4RetValue = i2c_master_send(g_pstI2Cclient, puReadCmd, 2); + if (i4RetValue != 2) + { + EEPROMDB("[EEPROM] I2C send read address failed!! \n"); + return -1; + } + + //EEPROMDB("[EERPOM] i2c_master_recv \n"); + i4RetValue = i2c_master_recv(g_pstI2Cclient, (char *)a_puBuff, ui4_length); + if (i4RetValue != ui4_length) + { + EEPROMDB("[EEPROM] I2C read data failed!! \n"); + return -1; + } + spin_lock(&g_EEPROMLock); //for SMP + g_pstI2Cclient->addr = g_pstI2Cclient->addr & I2C_MASK_FLAG; + spin_unlock(&g_EEPROMLock); // for SMP + + //EEPROMDB("[EEPROM] iReadEEPROM done!! \n"); + return 0; +} + + +static int iWriteData(unsigned int ui4_offset, unsigned int ui4_length, unsigned char * pinputdata) +{ + int i4RetValue = 0; + int i4ResidueDataLength; + u32 u4IncOffset = 0; + u32 u4CurrentOffset; + u8 * pBuff; + + EEPROMDB("[EEPROM] iWriteData\n" ); + + + if (ui4_offset + ui4_length >= 0x2000) + { + EEPROMDB("[EEPROM] Write Error!! S-24CS64A not supprt address >= 0x2000!! \n" ); + return -1; + } + + i4ResidueDataLength = (int)ui4_length; + u4CurrentOffset = ui4_offset; + pBuff = pinputdata; + EEPROMDB("[EEPROM] iWriteData u4CurrentOffset is %d \n",u4CurrentOffset); + do + { + if(i4ResidueDataLength >= 6) + { + i4RetValue = iWriteEEPROM((u16)u4CurrentOffset, 6, pBuff); + if (i4RetValue != 0) + { + EEPROMDB("[EEPROM] I2C iWriteData failed!! \n"); + return -1; + } + u4IncOffset += 6; + i4ResidueDataLength -= 6; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + } + else + { + i4RetValue = iWriteEEPROM((u16)u4CurrentOffset, i4ResidueDataLength, pBuff); + if (i4RetValue != 0) + { + EEPROMDB("[EEPROM] I2C iWriteData failed!! \n"); + return -1; + } + u4IncOffset += 6; + i4ResidueDataLength -= 6; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + //break; + } + }while (i4ResidueDataLength > 0); + EEPROMDB("[EEPROM] iWriteData done\n" ); + + return 0; +} + +//int iReadData(stEEPROM_INFO_STRUCT * st_pOutputBuffer) +static int iReadData(unsigned int ui4_offset, unsigned int ui4_length, unsigned char * pinputdata) +{ + int i4RetValue = 0; + int i4ResidueDataLength; + u32 u4IncOffset = 0; + u32 u4CurrentOffset; + u8 * pBuff; + EEPROMDB("[EEPROM] iReadData \n" ); + + if (ui4_offset + ui4_length >= 0x2000) + { + EEPROMDB("[EEPROM] Read Error!! S-24CS64A not supprt address >= 0x2000!! \n" ); + return -1; + } + + i4ResidueDataLength = (int)ui4_length; + u4CurrentOffset = ui4_offset; + pBuff = pinputdata; + do + { + if(i4ResidueDataLength >= 8) + { + i4RetValue = iReadEEPROM((u16)u4CurrentOffset, 8, pBuff); + if (i4RetValue != 0) + { + EEPROMDB("[EEPROM] I2C iReadData failed!! \n"); + return -1; + } + u4IncOffset += 8; + i4ResidueDataLength -= 8; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + } + else + { + i4RetValue = iReadEEPROM((u16)u4CurrentOffset, i4ResidueDataLength, pBuff); + if (i4RetValue != 0) + { + EEPROMDB("[EEPROM] I2C iReadData failed!! \n"); + return -1; + } + u4IncOffset += 8; + i4ResidueDataLength -= 8; + u4CurrentOffset = ui4_offset + u4IncOffset; + pBuff = pinputdata + u4IncOffset; + //break; + } + }while (i4ResidueDataLength > 0); +//fix warning MSG EEPROMDB("[EEPROM] iReadData finial address is %d length is %d buffer address is 0x%x\n",u4CurrentOffset, i4ResidueDataLength, pBuff); + EEPROMDB("[EEPROM] iReadData done\n" ); + return 0; +} + + +/******************************************************************************* +* +********************************************************************************/ +#define NEW_UNLOCK_IOCTL +#ifndef NEW_UNLOCK_IOCTL +static int EEPROM_Ioctl(struct inode * a_pstInode, +struct file * a_pstFile, +unsigned int a_u4Command, +unsigned long a_u4Param) +#else +static long EEPROM_Ioctl( + struct file *file, + unsigned int a_u4Command, + unsigned long a_u4Param +) +#endif +{ + int i4RetValue = 0; + u8 * pBuff = NULL; + u8 * pWorkingBuff = NULL; + stEEPROM_INFO_STRUCT *ptempbuf; + +#ifdef EEPROMGETDLT_DEBUG + struct timeval ktv1, ktv2; + unsigned long TimeIntervalUS; +#endif + + if(_IOC_NONE == _IOC_DIR(a_u4Command)) + { + } + else + { + pBuff = (u8 *)kmalloc(sizeof(stEEPROM_INFO_STRUCT),GFP_KERNEL); + + if(NULL == pBuff) + { + EEPROMDB("[EEPROM] ioctl allocate mem failed\n"); + return -ENOMEM; + } + + if(_IOC_WRITE & _IOC_DIR(a_u4Command)) + { + if(copy_from_user((u8 *) pBuff , (u8 *) a_u4Param, sizeof(stEEPROM_INFO_STRUCT))) + { //get input structure address + kfree(pBuff); + EEPROMDB("[EEPROM] ioctl copy from user failed\n"); + return -EFAULT; + } + } + } + + ptempbuf = (stEEPROM_INFO_STRUCT *)pBuff; + pWorkingBuff = (u8*)kmalloc(ptempbuf->u4Length,GFP_KERNEL); + if(NULL == pWorkingBuff) + { + kfree(pBuff); + EEPROMDB("[EEPROM] ioctl allocate mem failed\n"); + return -ENOMEM; + } +//fix warning MSG EEPROMDB("[EEPROM] init Working buffer address 0x%x command is 0x%08x\n", pWorkingBuff, a_u4Command); + + + if(copy_from_user((u8*)pWorkingBuff , (u8*)ptempbuf->pu1Params, ptempbuf->u4Length)) + { + kfree(pBuff); + kfree(pWorkingBuff); + EEPROMDB("[EEPROM] ioctl copy from user failed\n"); + return -EFAULT; + } + + switch(a_u4Command) + { + case EEPROMIOC_S_WRITE: + EEPROMDB("[EEPROM] Write CMD \n"); +#ifdef EEPROMGETDLT_DEBUG + do_gettimeofday(&ktv1); +#endif + i4RetValue = iWriteData((u16)ptempbuf->u4Offset, ptempbuf->u4Length, pWorkingBuff); +#ifdef EEPROMGETDLT_DEBUG + do_gettimeofday(&ktv2); + if(ktv2.tv_sec > ktv1.tv_sec) + { + TimeIntervalUS = ktv1.tv_usec + 1000000 - ktv2.tv_usec; + } + else + { + TimeIntervalUS = ktv2.tv_usec - ktv1.tv_usec; + } + printk("Write data %d bytes take %lu us\n",ptempbuf->u4Length, TimeIntervalUS); +#endif + break; + case EEPROMIOC_G_READ: + EEPROMDB("[EEPROM] Read CMD \n"); +#ifdef EEPROMGETDLT_DEBUG + do_gettimeofday(&ktv1); +#endif + EEPROMDB("[EEPROM] offset %d \n", ptempbuf->u4Offset); + EEPROMDB("[EEPROM] length %d \n", ptempbuf->u4Length); +//fix warning MSG EEPROMDB("[EEPROM] Before read Working buffer address 0x%x \n", pWorkingBuff); + + i4RetValue = iReadData((u16)ptempbuf->u4Offset, ptempbuf->u4Length, pWorkingBuff); +//fix warning MSG EEPROMDB("[EEPROM] After read Working buffer address 0x%x \n", pWorkingBuff); + + +#ifdef EEPROMGETDLT_DEBUG + do_gettimeofday(&ktv2); + if(ktv2.tv_sec > ktv1.tv_sec) + { + TimeIntervalUS = ktv1.tv_usec + 1000000 - ktv2.tv_usec; + } + else + { + TimeIntervalUS = ktv2.tv_usec - ktv1.tv_usec; + } + printk("Read data %d bytes take %lu us\n",ptempbuf->u4Length, TimeIntervalUS); +#endif + + break; + default : + EEPROMDB("[EEPROM] No CMD \n"); + i4RetValue = -EPERM; + break; + } + + if(_IOC_READ & _IOC_DIR(a_u4Command)) + { + //copy data to user space buffer, keep other input paremeter unchange. + EEPROMDB("[EEPROM] to user length %d \n", ptempbuf->u4Length); +//fix warning MSG EEPROMDB("[EEPROM] to user Working buffer address 0x%x \n", pWorkingBuff); + if(copy_to_user((u8 __user *) ptempbuf->pu1Params , (u8 *)pWorkingBuff , ptempbuf->u4Length)) + { + kfree(pBuff); + kfree(pWorkingBuff); + EEPROMDB("[EEPROM] ioctl copy to user failed\n"); + return -EFAULT; + } + } + + kfree(pBuff); + kfree(pWorkingBuff); + return i4RetValue; +} + + +static u32 g_u4Opened = 0; +//#define +//Main jobs: +// 1.check for device-specified errors, device not ready. +// 2.Initialize the device if it is opened for the first time. +static int EEPROM_Open(struct inode * a_pstInode, struct file * a_pstFile) +{ + EEPROMDB("[S24EEPROM] EEPROM_Open\n"); + spin_lock(&g_EEPROMLock); + if(g_u4Opened) + { + spin_unlock(&g_EEPROMLock); + return -EBUSY; + } + else + { + g_u4Opened = 1; + atomic_set(&g_EEPROMatomic,0); + } + spin_unlock(&g_EEPROMLock); + + //if(TRUE != hwPowerOn(MT65XX_POWER_LDO_VCAMA, VOL_2800, "S24CS64A")) + //{ + // EEPROMDB("[EEPROM] Fail to enable analog gain\n"); + // return -EIO; + //} + + return 0; +} + +//Main jobs: +// 1.Deallocate anything that "open" allocated in private_data. +// 2.Shut down the device on last close. +// 3.Only called once on last time. +// Q1 : Try release multiple times. +static int EEPROM_Release(struct inode * a_pstInode, struct file * a_pstFile) +{ + spin_lock(&g_EEPROMLock); + + g_u4Opened = 0; + + atomic_set(&g_EEPROMatomic,0); + + spin_unlock(&g_EEPROMLock); + + return 0; +} + +static const struct file_operations g_stEEPROM_fops = +{ + .owner = THIS_MODULE, + .open = EEPROM_Open, + .release = EEPROM_Release, + //.ioctl = EEPROM_Ioctl + .unlocked_ioctl = EEPROM_Ioctl +}; + +#define EEPROM_DYNAMIC_ALLOCATE_DEVNO 1 +inline static int RegisterEEPROMCharDrv(void) +{ + struct device* EEPROM_device = NULL; + +#if EEPROM_DYNAMIC_ALLOCATE_DEVNO + if( alloc_chrdev_region(&g_EEPROMdevno, 0, 1,EEPROM_DRVNAME) ) + { + EEPROMDB("[EEPROM] Allocate device no failed\n"); + + return -EAGAIN; + } +#else + if( register_chrdev_region( g_EEPROMdevno , 1 , EEPROM_DRVNAME) ) + { + EEPROMDB("[EEPROM] Register device no failed\n"); + + return -EAGAIN; + } +#endif + + //Allocate driver + g_pEEPROM_CharDrv = cdev_alloc(); + + if(NULL == g_pEEPROM_CharDrv) + { + unregister_chrdev_region(g_EEPROMdevno, 1); + + EEPROMDB("[EEPROM] Allocate mem for kobject failed\n"); + + return -ENOMEM; + } + + //Attatch file operation. + cdev_init(g_pEEPROM_CharDrv, &g_stEEPROM_fops); + + g_pEEPROM_CharDrv->owner = THIS_MODULE; + + //Add to system + if(cdev_add(g_pEEPROM_CharDrv, g_EEPROMdevno, 1)) + { + EEPROMDB("[EEPROM] Attatch file operation failed\n"); + + unregister_chrdev_region(g_EEPROMdevno, 1); + + return -EAGAIN; + } + + EEPROM_class = class_create(THIS_MODULE, "EEPROMdrv"); + if (IS_ERR(EEPROM_class)) { + int ret = PTR_ERR(EEPROM_class); + EEPROMDB("Unable to create class, err = %d\n", ret); + return ret; + } + EEPROM_device = device_create(EEPROM_class, NULL, g_EEPROMdevno, NULL, EEPROM_DRVNAME); + + return 0; +} + +inline static void UnregisterEEPROMCharDrv(void) +{ + //Release char driver + cdev_del(g_pEEPROM_CharDrv); + + unregister_chrdev_region(g_EEPROMdevno, 1); + + device_destroy(EEPROM_class, g_EEPROMdevno); + class_destroy(EEPROM_class); +} + + +////////////////////////////////////////////////////////////////////// +#ifndef EEPROM_ICS_REVISION +static int EEPROM_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); +#elif 0 +static int EEPROM_i2c_detect(struct i2c_client *client, struct i2c_board_info *info); +#else +#endif +static int EEPROM_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int EEPROM_i2c_remove(struct i2c_client *); + +static const struct i2c_device_id EEPROM_i2c_id[] = {{EEPROM_DRVNAME,0},{}}; +#if 0 //test110314 Please use the same I2C Group ID as Sensor +static unsigned short force[] = {EEPROM_I2C_GROUP_ID, S24CS64A_DEVICE_ID, I2C_CLIENT_END, I2C_CLIENT_END}; +#else +//static unsigned short force[] = {EEPROM_I2C_GROUP_ID, S24CS64A_DEVICE_ID, I2C_CLIENT_END, I2C_CLIENT_END}; +#endif +//static const unsigned short * const forces[] = { force, NULL }; +//static struct i2c_client_address_data addr_data = { .forces = forces,}; + + +static struct i2c_driver EEPROM_i2c_driver = { + .probe = EEPROM_i2c_probe, + .remove = EEPROM_i2c_remove, +// .detect = EEPROM_i2c_detect, + .driver.name = EEPROM_DRVNAME, + .id_table = EEPROM_i2c_id, +}; + +#ifndef EEPROM_ICS_REVISION +static int EEPROM_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info) { + strcpy(info->type, EEPROM_DRVNAME); + return 0; +} +#endif +static int EEPROM_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { +int i4RetValue = 0; + EEPROMDB("[EEPROM] Attach I2C \n"); +// spin_lock_init(&g_EEPROMLock); + + //get sensor i2c client + spin_lock(&g_EEPROMLock); //for SMP + g_pstI2Cclient = client; + g_pstI2Cclient->addr = S24CS64A_DEVICE_ID>>1; + spin_unlock(&g_EEPROMLock); // for SMP + + EEPROMDB("[EEPROM] g_pstI2Cclient->addr = 0x%8x \n",g_pstI2Cclient->addr); + //Register char driver + i4RetValue = RegisterEEPROMCharDrv(); + + if(i4RetValue){ + EEPROMDB("[EEPROM] register char device failed!\n"); + return i4RetValue; + } + + + EEPROMDB("[EEPROM] Attached!! \n"); + return 0; +} + +static int EEPROM_i2c_remove(struct i2c_client *client) +{ + return 0; +} + +static int EEPROM_probe(struct platform_device *pdev) +{ + return i2c_add_driver(&EEPROM_i2c_driver); +} + +static int EEPROM_remove(struct platform_device *pdev) +{ + i2c_del_driver(&EEPROM_i2c_driver); + return 0; +} + +// platform structure +static struct platform_driver g_stEEPROM_Driver = { + .probe = EEPROM_probe, + .remove = EEPROM_remove, + .driver = { + .name = EEPROM_DRVNAME, + .owner = THIS_MODULE, + } +}; + + +static struct platform_device g_stEEPROM_Device = { + .name = EEPROM_DRVNAME, + .id = 0, + .dev = { + } +}; + +static int __init EEPROM_i2C_init(void) +{ + i2c_register_board_info(EEPROM_I2C_BUSNUM, &kd_eeprom_dev, 1); + if(platform_driver_register(&g_stEEPROM_Driver)){ + EEPROMDB("failed to register EEPROM driver\n"); + return -ENODEV; + } + + if (platform_device_register(&g_stEEPROM_Device)) + { + EEPROMDB("failed to register EEPROM driver\n"); + return -ENODEV; + } + + return 0; +} + +static void __exit EEPROM_i2C_exit(void) +{ + platform_driver_unregister(&g_stEEPROM_Driver); +} + +module_init(EEPROM_i2C_init); +module_exit(EEPROM_i2C_exit); + +MODULE_DESCRIPTION("EEPROM driver"); +MODULE_AUTHOR("Sean Lin "); +MODULE_LICENSE("GPL"); + + diff --git a/arch/arm/mach-mt8127/ford/eeprom/dummy_eeprom.h b/arch/arm/mach-mt8127/ford/eeprom/dummy_eeprom.h new file mode 100644 index 00000000000..4f703c97058 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/eeprom/dummy_eeprom.h @@ -0,0 +1,30 @@ +/***************************************************************************** + * + * Filename: + * --------- + * S-24CS64A.h + * + * Project: + * -------- + * ALPS + * + * Description: + * ------------ + * Header file of EEPROM driver + * + * + * Author: + * ------- + * Ronnie Lai (MTK01420) + * + *============================================================================*/ +#ifndef __EEPROM_H +#define __EEPROM_H + +#define EEPROM_DEV_MAJOR_NUMBER 226 + +/* EEPROM READ/WRITE ID */ +#define S24CS64A_DEVICE_ID 0xA0 //0xFE // + +#endif /* __EEPROM_H */ + diff --git a/arch/arm/mach-mt8127/ford/eeprom/inc/eeprom.h b/arch/arm/mach-mt8127/ford/eeprom/inc/eeprom.h new file mode 100644 index 00000000000..1c68295fddf --- /dev/null +++ b/arch/arm/mach-mt8127/ford/eeprom/inc/eeprom.h @@ -0,0 +1,27 @@ +#ifndef _EEPROM_H +#define _EEPROM_H + +#include + + +#define EEPROMAGIC 'i' +//IOCTRL(inode * ,file * ,cmd ,arg ) +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" + +/******************************************************************************* +* +********************************************************************************/ + +//EEPROM write +#define EEPROMIOC_S_WRITE _IOW(EEPROMAGIC,0,stEEPROM_INFO_STRUCT) +//EEPROM read +#define EEPROMIOC_G_READ _IOWR(EEPROMAGIC,5,stPEEPROM_INFO_STRUCT) + +#endif //_EEPROM_H + + diff --git a/arch/arm/mach-mt8127/ford/eeprom/inc/eeprom_define.h b/arch/arm/mach-mt8127/ford/eeprom/inc/eeprom_define.h new file mode 100644 index 00000000000..4424df379c8 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/eeprom/inc/eeprom_define.h @@ -0,0 +1,12 @@ +#ifndef _EEPROM_DATA_H +#define _EEPROM_DATA_H + +//#define MT6516ISP_MaxTableSize_CNT 4096 +//#define EEPROM_DBG_MESSAGE + +typedef struct{ + u32 u4Offset; + u32 u4Length; + u8 * pu1Params; +}stEEPROM_INFO_STRUCT, *stPEEPROM_INFO_STRUCT; +#endif //_EEPROM_DATA_H diff --git a/arch/arm/mach-mt8127/ford/flashlight/constant_flashlight/Makefile b/arch/arm/mach-mt8127/ford/flashlight/constant_flashlight/Makefile new file mode 100755 index 00000000000..8f07c9426b7 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/flashlight/constant_flashlight/Makefile @@ -0,0 +1,3 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += leds_strobe.o diff --git a/arch/arm/mach-mt8127/ford/flashlight/constant_flashlight/leds_strobe.c b/arch/arm/mach-mt8127/ford/flashlight/constant_flashlight/leds_strobe.c new file mode 100644 index 00000000000..e9ce35096d7 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/flashlight/constant_flashlight/leds_strobe.c @@ -0,0 +1,401 @@ +#include //constant xx +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "kd_flashlight.h" +#include +#include +#include "kd_camera_hw.h" +#include +#include +#include +#include +#include + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) +#include +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#include +#else +#include +#endif +#endif + + + +/****************************************************************************** + * Debug configuration +******************************************************************************/ +// availible parameter +// ANDROID_LOG_ASSERT +// ANDROID_LOG_ERROR +// ANDROID_LOG_WARNING +// ANDROID_LOG_INFO +// ANDROID_LOG_DEBUG +// ANDROID_LOG_VERBOSE +#define TAG_NAME "leds_strobe.c" +#define PK_DBG_NONE(fmt, arg...) do {} while (0) +#define PK_DBG_FUNC(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG , TAG_NAME, KERN_INFO "%s: " fmt, __FUNCTION__ ,##arg) +#define PK_WARN(fmt, arg...) xlog_printk(ANDROID_LOG_WARNING, TAG_NAME, KERN_WARNING "%s: " fmt, __FUNCTION__ ,##arg) +#define PK_NOTICE(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG , TAG_NAME, KERN_NOTICE "%s: " fmt, __FUNCTION__ ,##arg) +#define PK_INFO(fmt, arg...) xlog_printk(ANDROID_LOG_INFO , TAG_NAME, KERN_INFO "%s: " fmt, __FUNCTION__ ,##arg) +#define PK_TRC_FUNC(f) xlog_printk(ANDROID_LOG_DEBUG , TAG_NAME, "<%s>\n", __FUNCTION__); +#define PK_TRC_VERBOSE(fmt, arg...) xlog_printk(ANDROID_LOG_VERBOSE, TAG_NAME, fmt, ##arg) +#define PK_ERROR(fmt, arg...) xlog_printk(ANDROID_LOG_ERROR , TAG_NAME, KERN_ERR "%s: " fmt, __FUNCTION__ ,##arg) + + +#define DEBUG_LEDS_STROBE +#ifdef DEBUG_LEDS_STROBE +#define PK_DBG PK_DBG_FUNC +#define PK_VER PK_TRC_VERBOSE +#define PK_ERR PK_ERROR +#else +#define PK_DBG(a,...) +#define PK_VER(a,...) +#define PK_ERR(a,...) +#endif + +/****************************************************************************** + * local variables +******************************************************************************/ + +static DEFINE_SPINLOCK(g_strobeSMPLock); /* cotta-- SMP proection */ + + +static u32 strobe_Res = 0; +static u32 strobe_Timeus = 0; +static BOOL g_strobe_On = 0; + +static int g_duty=-1; +static int g_timeOutTimeMs=0; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) +static DEFINE_MUTEX(g_strobeSem); +#else +static DECLARE_MUTEX(g_strobeSem); +#endif + + +#define STROBE_DEVICE_ID 0x60 + + +static struct work_struct workTimeOut; + +/***************************************************************************** +Functions +*****************************************************************************/ +#ifdef GPIO_CAMERA_FLASH_EN_PIN +#define GPIO_ENF GPIO_CAMERA_FLASH_EN_PIN +#else +#define GPIO_ENF 0xFF +#endif + +#ifdef GPIO_CAMERA_FLASH_MODE_PIN +#define GPIO_ENT GPIO_CAMERA_FLASH_MODE_PIN +#define GPIO_ENT_IS_AVALIABLE 1 +#else +#define GPIO_ENT 0xFF +#define GPIO_ENT_IS_AVALIABLE 0 +#endif + +/*CAMERA-FLASH-EN */ + + +extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); +extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); +static void work_timeOutFunc(struct work_struct *data); + + + + + + + + + + + + + + +int FL_Enable(void) +{ + if (g_duty==0) + { +#if 0 + mt_set_gpio_out(GPIO_ENT,GPIO_OUT_ONE); + mt_set_gpio_out(GPIO_ENF,GPIO_OUT_ZERO); +#else + #if GPIO_ENT_IS_AVALIABLE + mt_set_gpio_out(GPIO_ENT,GPIO_OUT_ZERO); + #endif + mt_set_gpio_out(GPIO_ENF,GPIO_OUT_ONE); +#endif + PK_DBG(" FL_Enable line=%d\n",__LINE__); + } + else + { +#if GPIO_ENT_IS_AVALIABLE + mt_set_gpio_out(GPIO_ENT,GPIO_OUT_ZERO); +#endif + mt_set_gpio_out(GPIO_ENF,GPIO_OUT_ONE); + PK_DBG(" FL_Enable line=%d\n",__LINE__); + } + + return 0; +} + +int FL_Disable(void) +{ +#if GPIO_ENT_IS_AVALIABLE + mt_set_gpio_out(GPIO_ENT,GPIO_OUT_ZERO); +#endif + mt_set_gpio_out(GPIO_ENF,GPIO_OUT_ZERO); + PK_DBG(" FL_Disable line=%d\n",__LINE__); + return 0; +} + +int FL_dim_duty(kal_uint32 duty) +{ + g_duty=duty; + PK_DBG(" FL_dim_duty line=%d\n",__LINE__); + return 0; +} + + +int FL_Init(void) +{ + + PK_DBG(" FL_Init - start line=%d\n",__LINE__); + PK_DBG(" GPIO_ENF=0x%x, GPIO_MODE_00=0x%x \n",GPIO_ENF,GPIO_MODE_00); + + if (mt_set_gpio_mode(GPIO_ENF,GPIO_MODE_00)) + { + PK_DBG("[constant_flashlight] set gpio mode failed!! \n"); + } + if (mt_set_gpio_dir(GPIO_ENF,GPIO_DIR_OUT)) + { + PK_DBG("[constant_flashlight] set gpio dir failed!! \n"); + } + if (mt_set_gpio_out(GPIO_ENF,GPIO_OUT_ZERO)) + { + PK_DBG("[constant_flashlight] set gpio failed!! \n"); + } + + /*Init. to disable*/ +#if GPIO_ENT_IS_AVALIABLE + PK_DBG(" FL_Init - start line=%d\n",__LINE__); + if (mt_set_gpio_mode(GPIO_ENT,GPIO_MODE_00)) + { + PK_DBG("[constant_flashlight] set gpio mode failed!! \n"); + } + if (mt_set_gpio_dir(GPIO_ENT,GPIO_DIR_OUT)) + { + PK_DBG("[constant_flashlight] set gpio dir failed!! \n"); + } + if (mt_set_gpio_out(GPIO_ENT,GPIO_OUT_ZERO)) + { + PK_DBG("[constant_flashlight] set gpio failed!! \n"); + } +#endif + INIT_WORK(&workTimeOut, work_timeOutFunc); + PK_DBG(" FL_Init - end line=%d\n",__LINE__); + return 0; +} + + +int FL_Uninit(void) +{ + FL_Disable(); + return 0; +} + +/***************************************************************************** +User interface +*****************************************************************************/ + +static void work_timeOutFunc(struct work_struct *data) +{ + FL_Disable(); + PK_DBG("ledTimeOut_callback\n"); + //printk(KERN_ALERT "work handler function./n"); +} + + + +enum hrtimer_restart ledTimeOutCallback(struct hrtimer *timer) +{ + schedule_work(&workTimeOut); + return HRTIMER_NORESTART; +} +static struct hrtimer g_timeOutTimer; +void timerInit(void) +{ + g_timeOutTimeMs=1000; //1s + hrtimer_init( &g_timeOutTimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL ); + g_timeOutTimer.function=ledTimeOutCallback; + +} + + + +static int constant_flashlight_ioctl(MUINT32 cmd, MUINT32 arg) +{ + int i4RetValue = 0; + int ior_shift; + int iow_shift; + int iowr_shift; + ior_shift = cmd - (_IOR(FLASHLIGHT_MAGIC,0, int)); + iow_shift = cmd - (_IOW(FLASHLIGHT_MAGIC,0, int)); + iowr_shift = cmd - (_IOWR(FLASHLIGHT_MAGIC,0, int)); + PK_DBG("constant_flashlight_ioctl() line=%d ior_shift=%d, iow_shift=%d iowr_shift=%d arg=%d\n",__LINE__, ior_shift, iow_shift, iowr_shift, arg); + switch (cmd) + { + + case FLASH_IOC_SET_TIME_OUT_TIME_MS: + PK_DBG("FLASH_IOC_SET_TIME_OUT_TIME_MS: %d\n",arg); + g_timeOutTimeMs=arg; + break; + + + case FLASH_IOC_SET_DUTY : + PK_DBG("FLASHLIGHT_DUTY: %d\n",arg); + FL_dim_duty(arg); + break; + + + case FLASH_IOC_SET_STEP: + PK_DBG("FLASH_IOC_SET_STEP: %d\n",arg); + + break; + + case FLASH_IOC_SET_ONOFF : + PK_DBG("FLASHLIGHT_ONOFF: %d\n",arg); + if (arg==1) + { + if (g_timeOutTimeMs!=0) + { + ktime_t ktime; + ktime = ktime_set( 0, g_timeOutTimeMs*1000000 ); + hrtimer_start( &g_timeOutTimer, ktime, HRTIMER_MODE_REL ); + } + FL_Enable(); + } + else + { + FL_Disable(); + hrtimer_cancel( &g_timeOutTimer ); + } + break; + default : + PK_DBG(" No such command \n"); + i4RetValue = -EPERM; + break; + } + return i4RetValue; +} + + + + +static int constant_flashlight_open(void *pArg) +{ + int i4RetValue = 0; + PK_DBG("constant_flashlight_open line=%d\n", __LINE__); + + if (0 == strobe_Res) + { + FL_Init(); + timerInit(); + } + PK_DBG("constant_flashlight_open line=%d\n", __LINE__); + spin_lock_irq(&g_strobeSMPLock); + + + if (strobe_Res) + { + PK_ERR(" busy!\n"); + i4RetValue = -EBUSY; + } + else + { + strobe_Res += 1; + } + + + spin_unlock_irq(&g_strobeSMPLock); + PK_DBG("constant_flashlight_open line=%d\n", __LINE__); + + return i4RetValue; + +} + + +static int constant_flashlight_release(void *pArg) +{ + PK_DBG(" constant_flashlight_release\n"); + + if (strobe_Res) + { + spin_lock_irq(&g_strobeSMPLock); + + strobe_Res = 0; + strobe_Timeus = 0; + + /* LED On Status */ + g_strobe_On = FALSE; + + spin_unlock_irq(&g_strobeSMPLock); + + FL_Uninit(); + } + + PK_DBG(" Done\n"); + + return 0; + +} + + +FLASHLIGHT_FUNCTION_STRUCT constantFlashlightFunc= +{ + constant_flashlight_open, + constant_flashlight_release, + constant_flashlight_ioctl +}; + + +MUINT32 constantFlashlightInit(PFLASHLIGHT_FUNCTION_STRUCT *pfFunc) +{ + if (pfFunc != NULL) + { + *pfFunc = &constantFlashlightFunc; + } + return 0; +} + + + +/* LED flash control for high current capture mode*/ +ssize_t strobe_VDIrq(void) +{ + + return 0; +} + +EXPORT_SYMBOL(strobe_VDIrq); + + diff --git a/arch/arm/mach-mt8127/ford/gyroscope/Makefile b/arch/arm/mach-mt8127/ford/gyroscope/Makefile new file mode 100755 index 00000000000..1bd38649586 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/gyroscope/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := cust_gyro.o + diff --git a/arch/arm/mach-mt8127/ford/gyroscope/cust_gyro.c b/arch/arm/mach-mt8127/ford/gyroscope/cust_gyro.c new file mode 100644 index 00000000000..ba96afa264b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/gyroscope/cust_gyro.c @@ -0,0 +1,31 @@ +#include +#include +#include + +/*---------------------------------------------------------------------------*/ +/* +int cust_gyro_power(struct gyro_hw *hw, unsigned int on, char* devname) +{ + if (hw->power_id == MT65XX_POWER_NONE) + return 0; + if (on) + return hwPowerOn(hw->power_id, hw->power_vol, devname); + else + return hwPowerDown(hw->power_id, devname); +} +*/ +/*---------------------------------------------------------------------------*/ +static struct gyro_hw cust_gyro_hw = { + .addr = 0xd0, + .i2c_num = 2, + .direction = 7, + .power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ + .power_vol= VOL_DEFAULT, /*!< LDO is not used */ + .firlen = 16, /*!< don't enable low pass fileter */ + // .power = cust_gyro_power, +}; +/*---------------------------------------------------------------------------*/ +struct gyro_hw* get_cust_gyro_hw(void) +{ + return &cust_gyro_hw; +} diff --git a/arch/arm/mach-mt8127/ford/gyroscope/gyroscope.c b/arch/arm/mach-mt8127/ford/gyroscope/gyroscope.c new file mode 100644 index 00000000000..126340985f1 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/gyroscope/gyroscope.c @@ -0,0 +1,799 @@ + +#include "gyroscope.h" + +static struct gyro_context *gyro_context_obj = NULL; + + +static struct gyro_init_info* gyroscope_init_list[MAX_CHOOSE_GYRO_NUM]= {0}; //modified +static void gyro_early_suspend(struct early_suspend *h); +static void gyro_late_resume(struct early_suspend *h); + +static void gyro_work_func(struct work_struct *work) +{ + + struct gyro_context *cxt = NULL; + int out_size; + //hwm_sensor_data sensor_data; + int x,y,z,status,div; + int64_t nt; + struct timespec time; + int err, idx; + + cxt = gyro_context_obj; + + if(NULL == cxt->gyro_data.get_data) + { + GYRO_ERR("gyro driver not register data path\n"); + } + + + time.tv_sec = time.tv_nsec = 0; + time = get_monotonic_coarse(); + nt = time.tv_sec*1000000000LL+time.tv_nsec; + + //add wake lock to make sure data can be read before system suspend + cxt->gyro_data.get_data(&x,&y,&z,&status); + + if(err) + { + GYRO_ERR("get gyro data fails!!\n" ); + goto gyro_loop; + } + else + { + if((x != cxt->drv_data.gyro_data.values[0]) + || (y != cxt->drv_data.gyro_data.values[1]) + || (z != cxt->drv_data.gyro_data.values[2])) + { + if( 0 == x && 0==y + && 0 == z) + { + goto gyro_loop; + } + + cxt->drv_data.gyro_data.values[0] = x; + cxt->drv_data.gyro_data.values[1] = y; + cxt->drv_data.gyro_data.values[2] = z; + cxt->drv_data.gyro_data.status = status; + cxt->drv_data.gyro_data.time = nt; + + } + } + + if(true == cxt->is_first_data_after_enable) + { + cxt->is_first_data_after_enable = false; + //filter -1 value + if(GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[0] || + GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[1] || + GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[2]) + { + GYRO_LOG(" read invalid data \n"); + goto gyro_loop; + + } + } + //report data to input device + //printk("new gyro work run....\n"); + //GYRO_LOG("gyro data[%d,%d,%d] \n" ,cxt->drv_data.gyro_data.values[0], + //cxt->drv_data.gyro_data.values[1],cxt->drv_data.gyro_data.values[2]); + + gyro_data_report(cxt->drv_data.gyro_data.values[0], + cxt->drv_data.gyro_data.values[1],cxt->drv_data.gyro_data.values[2], + cxt->drv_data.gyro_data.status); + + gyro_loop: + if(true == cxt->is_polling_run) + { + { + mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); + } + + } +} + +static void gyro_poll(unsigned long data) +{ + struct gyro_context *obj = (struct gyro_context *)data; + if(obj != NULL) + { + schedule_work(&obj->report); + } +} + +static struct gyro_context *gyro_context_alloc_object(void) +{ + + struct gyro_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL); + GYRO_LOG("gyro_context_alloc_object++++\n"); + if(!obj) + { + GYRO_ERR("Alloc gyro object error!\n"); + return NULL; + } + atomic_set(&obj->delay, 200); /*5Hz*/// set work queue delay time 200ms + atomic_set(&obj->wake, 0); + INIT_WORK(&obj->report, gyro_work_func); + init_timer(&obj->timer); + obj->timer.expires = jiffies + atomic_read(&obj->delay)/(1000/HZ); + obj->timer.function = gyro_poll; + obj->timer.data = (unsigned long)obj; + obj->is_first_data_after_enable = false; + obj->is_polling_run = false; + obj->is_batch_enable = false; + mutex_init(&obj->gyro_op_mutex); + GYRO_LOG("gyro_context_alloc_object----\n"); + return obj; +} + +static int gyro_real_enable(int enable) +{ + int err =0; + struct gyro_context *cxt = NULL; + cxt = gyro_context_obj; + if(1==enable) + { + + if(true==cxt->is_active_data || true ==cxt->is_active_nodata) + { + err = cxt->gyro_ctl.enable_nodata(1); + if(err) + { + err = cxt->gyro_ctl.enable_nodata(1); + if(err) + { + err = cxt->gyro_ctl.enable_nodata(1); + if(err) + GYRO_ERR("gyro enable(%d) err 3 timers = %d\n", enable, err); + } + } + GYRO_LOG("gyro real enable \n" ); + } + + } + if(0==enable) + { + if(false==cxt->is_active_data && false ==cxt->is_active_nodata) + { + err = cxt->gyro_ctl.enable_nodata(0); + if(err) + { + GYRO_ERR("gyro enable(%d) err = %d\n", enable, err); + } + GYRO_LOG("gyro real disable \n" ); + } + + } + + return err; +} +static int gyro_enable_data(int enable) +{ + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + if(NULL == cxt->gyro_ctl.open_report_data) + { + GYRO_ERR("no gyro control path\n"); + return -1; + } + + if(1 == enable) + { + GYRO_LOG("gyro enable data\n"); + cxt->is_active_data =true; + cxt->is_first_data_after_enable = true; + cxt->gyro_ctl.open_report_data(1); + if(false == cxt->is_polling_run && cxt->is_batch_enable == false) + { + if(false == cxt->gyro_ctl.is_report_input_direct) + { + mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); + cxt->is_polling_run = true; + } + } + } + if(0 == enable) + { + GYRO_LOG("gyro disable \n"); + + cxt->is_active_data =false; + cxt->gyro_ctl.open_report_data(0); + if(true == cxt->is_polling_run) + { + if(false == cxt->gyro_ctl.is_report_input_direct) + { + cxt->is_polling_run = false; + del_timer_sync(&cxt->timer); + cancel_work_sync(&cxt->report); + cxt->drv_data.gyro_data.values[0] = GYRO_INVALID_VALUE; + cxt->drv_data.gyro_data.values[1] = GYRO_INVALID_VALUE; + cxt->drv_data.gyro_data.values[2] = GYRO_INVALID_VALUE; + } + } + + } + gyro_real_enable(enable); + return 0; +} + + + +int gyro_enable_nodata(int enable) +{ + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + if(NULL == cxt->gyro_ctl.enable_nodata) + { + GYRO_ERR("gyro_enable_nodata:gyro ctl path is NULL\n"); + return -1; + } + + if(1 == enable) + { + cxt->is_active_nodata = true; + } + + if(0 == enable) + { + cxt->is_active_nodata = false; + } + gyro_real_enable(enable); + return 0; +} + + +static ssize_t gyro_show_enable_nodata(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + GYRO_LOG(" not support now\n"); + return len; +} + +static ssize_t gyro_store_enable_nodata(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + GYRO_LOG("gyro_store_enable nodata buf=%s\n",buf); + mutex_lock(&gyro_context_obj->gyro_op_mutex); + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + if(NULL == cxt->gyro_ctl.enable_nodata) + { + GYRO_LOG("gyro_ctl enable nodata NULL\n"); + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + return count; + } + if (!strncmp(buf, "1", 1)) + { + gyro_enable_nodata(1); + } + else if (!strncmp(buf, "0", 1)) + { + gyro_enable_nodata(0); + } + else + { + GYRO_ERR(" gyro_store enable nodata cmd error !!\n"); + } + mutex_unlock(&gyro_context_obj->gyro_op_mutex); +} + +static ssize_t gyro_store_active(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + GYRO_LOG("gyro_store_active buf=%s\n",buf); + mutex_lock(&gyro_context_obj->gyro_op_mutex); + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + if(NULL == cxt->gyro_ctl.open_report_data) + { + GYRO_LOG("gyro_ctl enable NULL\n"); + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + return count; + } + if (!strncmp(buf, "1", 1)) + { + // cxt->gyro_ctl.enable(1); + gyro_enable_data(1); + + } + else if (!strncmp(buf, "0", 1)) + { + + //cxt->gyro_ctl.enable(0); + gyro_enable_data(0); + } + else + { + GYRO_ERR(" gyro_store_active error !!\n"); + } + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + GYRO_LOG(" gyro_store_active done\n"); + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t gyro_show_active(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct gyro_context *cxt = NULL; + cxt = gyro_context_obj; + + int len = 0; + GYRO_LOG("gyro show active not support now\n"); + int div=cxt->gyro_data.vender_div; + GYRO_LOG("gyro vender_div value: %d\n", div); + return snprintf(buf, PAGE_SIZE, "%d\n", div); + + //return len; +} + +static ssize_t gyro_store_delay(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&gyro_context_obj->gyro_op_mutex); + struct gyro_context *devobj = (struct gyro_context*)dev_get_drvdata(dev); + int delay; + int mdelay=0; + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + if(NULL == cxt->gyro_ctl.set_delay) + { + GYRO_LOG("gyro_ctl set_delay NULL\n"); + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + return count; + } + + if (1 != sscanf(buf, "%d", &delay)) { + GYRO_ERR("invalid format!!\n"); + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + return count; + } + + if(false == cxt->gyro_ctl.is_report_input_direct) + { + mdelay = (int)delay/1000/1000; + atomic_set(&gyro_context_obj->delay, mdelay); + } + cxt->gyro_ctl.set_delay(delay); + GYRO_LOG(" gyro_delay %d ns\n",delay); + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + return count; +} + +static ssize_t gyro_show_delay(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + GYRO_LOG(" not support now\n"); + return len; +} + +static ssize_t gyro_store_batch(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + GYRO_LOG("gyro_store_batch buf=%s\n",buf); + mutex_lock(&gyro_context_obj->gyro_op_mutex); + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + if(cxt->gyro_ctl.is_support_batch){ + + if (!strncmp(buf, "1", 1)) + { + cxt->is_batch_enable = true; + } + else if (!strncmp(buf, "0", 1)) + { + cxt->is_batch_enable = false; + } + else + { + GYRO_ERR(" gyro_store_batch error !!\n"); + } + }else{ + GYRO_LOG(" gyro_store_batch not support\n"); + } + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + GYRO_LOG(" gyro_store_batch done: %d\n", cxt->is_batch_enable); + return count; + +} + +static ssize_t gyro_show_batch(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static ssize_t gyro_store_flush(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&gyro_context_obj->gyro_op_mutex); + struct gyro_context *devobj = (struct gyro_context*)dev_get_drvdata(dev); + //do read FIFO data function and report data immediately + mutex_unlock(&gyro_context_obj->gyro_op_mutex); + return count; +} + +static ssize_t gyro_show_flush(struct device* dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", 0); +} + +static ssize_t gyro_show_devnum(struct device* dev, + struct device_attribute *attr, char *buf) +{ + char *devname = NULL; + devname = dev_name(&gyro_context_obj->idev->dev); + return snprintf(buf, PAGE_SIZE, "%s\n", devname+5); +} +static int gyroscope_remove(struct platform_device *pdev) +{ + GYRO_LOG("gyroscope_remove\n"); + return 0; +} + +static int gyroscope_probe(struct platform_device *pdev) +{ + GYRO_LOG("gyroscope_probe\n"); + return 0; +} + +static struct platform_driver gyroscope_driver = { + .probe = gyroscope_probe, + .remove = gyroscope_remove, + .driver = + { + .name = "gyroscope", + } +}; + +static int gyro_real_driver_init(void) +{ + int i =0; + int err=0; + GYRO_LOG(" gyro_real_driver_init +\n"); + for(i = 0; i < MAX_CHOOSE_GYRO_NUM; i++) + { + GYRO_LOG(" i=%d\n",i); + if(0 != gyroscope_init_list[i]) + { + GYRO_LOG(" gyro try to init driver %s\n", gyroscope_init_list[i]->name); + err = gyroscope_init_list[i]->init(); + if(0 == err) + { + GYRO_LOG(" gyro real driver %s probe ok\n", gyroscope_init_list[i]->name); + break; + } + } + } + + if(i == MAX_CHOOSE_GYRO_NUM) + { + GYRO_LOG(" gyro_real_driver_init fail\n"); + err=-1; + } + return err; +} + + int gyro_driver_add(struct gyro_init_info* obj) +{ + int err=0; + int i =0; + + GYRO_FUN(f); + + for(i =0; i < MAX_CHOOSE_GYRO_NUM; i++ ) + { + if(i == 0){ + GYRO_LOG("register gyro driver for the first time\n"); + if(platform_driver_register(&gyroscope_driver)) + { + GYRO_ERR("failed to register gyro driver already exist\n"); + } + } + + if(NULL == gyroscope_init_list[i]) + { + obj->platform_diver_addr = &gyroscope_driver; + gyroscope_init_list[i] = obj; + break; + } + } + if(NULL==gyroscope_init_list[i]) + { + GYRO_ERR("gyro driver add err \n"); + err=-1; + } + + return err; +} +EXPORT_SYMBOL_GPL(gyro_driver_add); + +static int gyro_misc_init(struct gyro_context *cxt) +{ + + int err=0; + cxt->mdev.minor = MISC_DYNAMIC_MINOR; + cxt->mdev.name = GYRO_MISC_DEV_NAME; + if((err = misc_register(&cxt->mdev))) + { + GYRO_ERR("unable to register gyro misc device!!\n"); + } + return err; +} + +static void gyro_input_destroy(struct gyro_context *cxt) +{ + struct input_dev *dev = cxt->idev; + + input_unregister_device(dev); + input_free_device(dev); +} + +static int gyro_input_init(struct gyro_context *cxt) +{ + struct input_dev *dev; + int err = 0; + + dev = input_allocate_device(); + if (NULL == dev) + return -ENOMEM; + + dev->name = GYRO_INPUTDEV_NAME; + + input_set_capability(dev, EV_ABS, EVENT_TYPE_GYRO_X); + input_set_capability(dev, EV_ABS, EVENT_TYPE_GYRO_Y); + input_set_capability(dev, EV_ABS, EVENT_TYPE_GYRO_Z); + input_set_capability(dev, EV_ABS, EVENT_TYPE_GYRO_STATUS); + + input_set_abs_params(dev, EVENT_TYPE_GYRO_X, GYRO_VALUE_MIN, GYRO_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_GYRO_Y, GYRO_VALUE_MIN, GYRO_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_GYRO_Z, GYRO_VALUE_MIN, GYRO_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_GYRO_STATUS, GYRO_STATUS_MIN, GYRO_STATUS_MAX, 0, 0); + input_set_drvdata(dev, cxt); + + err = input_register_device(dev); + if (err < 0) { + input_free_device(dev); + return err; + } + cxt->idev= dev; + + return 0; +} + +DEVICE_ATTR(gyroenablenodata, S_IWUSR | S_IRUGO, gyro_show_enable_nodata, gyro_store_enable_nodata); +DEVICE_ATTR(gyroactive, S_IWUSR | S_IRUGO, gyro_show_active, gyro_store_active); +DEVICE_ATTR(gyrodelay, S_IWUSR | S_IRUGO, gyro_show_delay, gyro_store_delay); +DEVICE_ATTR(gyrobatch, S_IWUSR | S_IRUGO, gyro_show_batch, gyro_store_batch); +DEVICE_ATTR(gyroflush, S_IWUSR | S_IRUGO, gyro_show_flush, gyro_store_flush); +DEVICE_ATTR(gyrodevnum, S_IWUSR | S_IRUGO, gyro_show_devnum, NULL); + +static struct attribute *gyro_attributes[] = { + &dev_attr_gyroenablenodata.attr, + &dev_attr_gyroactive.attr, + &dev_attr_gyrodelay.attr, + &dev_attr_gyrobatch.attr, + &dev_attr_gyroflush.attr, + &dev_attr_gyrodevnum.attr, + NULL +}; + +static struct attribute_group gyro_attribute_group = { + .attrs = gyro_attributes +}; + +int gyro_register_data_path(struct gyro_data_path *data) +{ + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + cxt->gyro_data.get_data = data->get_data; + cxt->gyro_data.vender_div = data->vender_div; + GYRO_LOG("gyro register data path vender_div: %d\n", cxt->gyro_data.vender_div); + if(NULL == cxt->gyro_data.get_data) + { + GYRO_LOG("gyro register data path fail \n"); + return -1; + } + return 0; +} + +int gyro_register_control_path(struct gyro_control_path *ctl) +{ + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + cxt->gyro_ctl.set_delay = ctl->set_delay; + cxt->gyro_ctl.open_report_data= ctl->open_report_data; + cxt->gyro_ctl.enable_nodata = ctl->enable_nodata; + cxt->gyro_ctl.is_support_batch = ctl->is_support_batch; + + if(NULL==cxt->gyro_ctl.set_delay || NULL==cxt->gyro_ctl.open_report_data + || NULL==cxt->gyro_ctl.enable_nodata) + { + GYRO_LOG("gyro register control path fail \n"); + return -1; + } + + //add misc dev for sensor hal control cmd + err = gyro_misc_init(gyro_context_obj); + if(err) + { + GYRO_ERR("unable to register gyro misc device!!\n"); + return -2; + } + err = sysfs_create_group(&gyro_context_obj->mdev.this_device->kobj, + &gyro_attribute_group); + if (err < 0) + { + GYRO_ERR("unable to create gyro attribute file\n"); + return -3; + } + + kobject_uevent(&gyro_context_obj->mdev.this_device->kobj, KOBJ_ADD); + + return 0; +} + +int gyro_data_report(int x, int y, int z,int status) +{ + //GYRO_LOG("+gyro_data_report! %d, %d, %d, %d\n",x,y,z,status); + struct gyro_context *cxt = NULL; + int err =0; + cxt = gyro_context_obj; + input_report_abs(cxt->idev, EVENT_TYPE_GYRO_X, x); + input_report_abs(cxt->idev, EVENT_TYPE_GYRO_Y, y); + input_report_abs(cxt->idev, EVENT_TYPE_GYRO_Z, z); + input_report_abs(cxt->idev, EVENT_TYPE_GYRO_STATUS, status); + input_sync(cxt->idev); +} + +static int gyro_probe(struct platform_device *pdev) +{ + + int err; + GYRO_LOG("+++++++++++++gyro_probe!!\n"); + + gyro_context_obj = gyro_context_alloc_object(); + if (!gyro_context_obj) + { + err = -ENOMEM; + GYRO_ERR("unable to allocate devobj!\n"); + goto exit_alloc_data_failed; + } + + //init real gyroeleration driver + err = gyro_real_driver_init(); + if(err) + { + GYRO_ERR("gyro real driver init fail\n"); + goto real_driver_init_fail; + } + + //init input dev + err = gyro_input_init(gyro_context_obj); + if(err) + { + GYRO_ERR("unable to register gyro input device!\n"); + goto exit_alloc_input_dev_failed; + } + + atomic_set(&(gyro_context_obj->early_suspend), 0); + gyro_context_obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1, + gyro_context_obj->early_drv.suspend = gyro_early_suspend, + gyro_context_obj->early_drv.resume = gyro_late_resume, + register_early_suspend(&gyro_context_obj->early_drv); + + GYRO_LOG("----gyro_probe OK !!\n"); + return 0; + + exit_hwmsen_create_attr_failed: + exit_misc_register_failed: + + exit_err_sysfs: + + if (err) + { + GYRO_ERR("sysfs node creation error \n"); + gyro_input_destroy(gyro_context_obj); + } + + real_driver_init_fail: + exit_alloc_input_dev_failed: + kfree(gyro_context_obj); + + exit_alloc_data_failed: + + + GYRO_LOG("----gyro_probe fail !!!\n"); + return err; +} + + + +static int gyro_remove(struct platform_device *pdev) +{ + GYRO_FUN(f); + int err=0; + input_unregister_device(gyro_context_obj->idev); + sysfs_remove_group(&gyro_context_obj->idev->dev.kobj, + &gyro_attribute_group); + + if((err = misc_deregister(&gyro_context_obj->mdev))) + { + GYRO_ERR("misc_deregister fail: %d\n", err); + } + kfree(gyro_context_obj); + + return 0; +} + +static void gyro_early_suspend(struct early_suspend *h) +{ + atomic_set(&(gyro_context_obj->early_suspend), 1); + GYRO_LOG(" gyro_early_suspend ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(gyro_context_obj->early_suspend))); + return ; +} +/*----------------------------------------------------------------------------*/ +static void gyro_late_resume(struct early_suspend *h) +{ + atomic_set(&(gyro_context_obj->early_suspend), 0); + GYRO_LOG(" gyro_late_resume ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(gyro_context_obj->early_suspend))); + return ; +} + +static int gyro_suspend(struct platform_device *dev, pm_message_t state) +{ + return 0; +} +/*----------------------------------------------------------------------------*/ +static int gyro_resume(struct platform_device *dev) +{ + return 0; +} + +static struct platform_driver gyro_driver = +{ + .probe = gyro_probe, + .remove = gyro_remove, + .suspend = gyro_suspend, + .resume = gyro_resume, + .driver = + { + .name = GYRO_PL_DEV_NAME,//mt_gyro_pl + } +}; + +static int __init gyro_init(void) +{ + GYRO_FUN(f); + + if(platform_driver_register(&gyro_driver)) + { + GYRO_ERR("failed to register gyro driver\n"); + return -ENODEV; + } + + return 0; +} + +static void __exit gyro_exit(void) +{ + platform_driver_unregister(&gyro_driver); + platform_driver_unregister(&gyroscope_driver); +} + +module_init(gyro_init); +module_exit(gyro_exit); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("GYROSCOPE device driver"); +MODULE_AUTHOR("Mediatek"); + diff --git a/arch/arm/mach-mt8127/ford/gyroscope/gyroscope.h b/arch/arm/mach-mt8127/ford/gyroscope/gyroscope.h new file mode 100644 index 00000000000..20550defd12 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/gyroscope/gyroscope.h @@ -0,0 +1,116 @@ + +#ifndef __GYROSCOPE_H__ +#define __GYROSCOPE_H__ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define GYRO_TAG " " +#define GYRO_FUN(f) printk(GYRO_TAG"%s\n", __func__) +#define GYRO_ERR(fmt, args...) printk(GYRO_TAG"%s %d : "fmt, __func__, __LINE__, ##args) +#define GYRO_LOG(fmt, args...) printk(GYRO_TAG fmt, ##args) +#define GYRO_VER(fmt, args...) printk(GYRO_TAG"%s: "fmt, __func__, ##args) //((void)0) + +#define OP_GYRO_DELAY 0X01 +#define OP_GYRO_ENABLE 0X02 +#define OP_GYRO_GET_DATA 0X04 + +#define GYRO_INVALID_VALUE -1 + +#define EVENT_TYPE_GYRO_X ABS_X +#define EVENT_TYPE_GYRO_Y ABS_Y +#define EVENT_TYPE_GYRO_Z ABS_Z +#define EVENT_TYPE_GYRO_STATUS ABS_WHEEL + + +#define GYRO_VALUE_MAX (32767) +#define GYRO_VALUE_MIN (-32768) +#define GYRO_STATUS_MIN (0) +#define GYRO_STATUS_MAX (64) +#define GYRO_DIV_MAX (32767) +#define GYRO_DIV_MIN (1) + + +#define MAX_CHOOSE_GYRO_NUM 5 + +struct gyro_control_path +{ + int (*open_report_data)(int open);//open data rerport to HAL + int (*enable_nodata)(int en);//only enable not report event to HAL + int (*set_delay)(u64 delay); + bool is_report_input_direct; + bool is_support_batch; +}; + +struct gyro_data_path +{ + int (*get_data)(int *x,int *y, int *z,int *status); + int vender_div; +}; + +struct gyro_init_info +{ + char *name; + int (*init)(void); + int (*uninit)(void); + struct platform_driver* platform_diver_addr; +}; + +struct gyro_data{ + hwm_sensor_data gyro_data ; + int data_updata; + //struct mutex lock; +}; + +struct gyro_drv_obj { + void *self; + int polling; + int (*gyro_operate)(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout); +}; + +struct gyro_context { + struct input_dev *idev; + struct miscdevice mdev; + struct work_struct report; + struct mutex gyro_op_mutex; + atomic_t delay; /*polling period for reporting input event*/ + atomic_t wake; /*user-space request to wake-up, used with stop*/ + struct timer_list timer; /* polling timer */ + atomic_t trace; + + struct early_suspend early_drv; + atomic_t early_suspend; + //struct gyro_drv_obj drv_obj; + struct gyro_data drv_data; + struct gyro_control_path gyro_ctl; + struct gyro_data_path gyro_data; + bool is_active_nodata; // Active, but HAL don't need data sensor. such as orientation need + bool is_active_data; // Active and HAL need data . + bool is_first_data_after_enable; + bool is_polling_run; + bool is_batch_enable; +}; + +//driver API for internal +//extern int gyro_enable_nodata(int enable); +//extern int gyro_attach(struct gyro_drv_obj *obj); +//driver API for third party vendor + +//for auto detect +extern int gyro_driver_add(struct gyro_init_info* obj) ; +extern int gyro_data_report(int x, int y, int z,int status); +extern int gyro_register_control_path(struct gyro_control_path *ctl); +extern int gyro_register_data_path(struct gyro_data_path *data); +#endif diff --git a/arch/arm/mach-mt8127/ford/gyroscope/inc/cust_gyro.h b/arch/arm/mach-mt8127/ford/gyroscope/inc/cust_gyro.h new file mode 100644 index 00000000000..9e415257c71 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/gyroscope/inc/cust_gyro.h @@ -0,0 +1,23 @@ +#ifndef __CUST_GYRO_H__ +#define __CUST_GYRO_H__ + +#include + +#define GYRO_CUST_I2C_ADDR_NUM 2 + +struct gyro_hw { + unsigned short addr; + int i2c_num; /*!< the i2c bus used by the chip */ + int direction; /*!< the direction of the chip */ + int power_id; /*!< the LDO ID of the chip, MT6516_POWER_NONE means the power is always on*/ + int power_vol; /*!< the Power Voltage used by the chip */ + int firlen; /*!< the length of low pass filter */ + int (*power)(struct gyro_hw *hw, unsigned int on, char *devname); + unsigned char i2c_addr[GYRO_CUST_I2C_ADDR_NUM]; /*!< i2c address list,for chips which has different addresses with different HW layout */ + int power_vio_id; /*!< the LDO ID of the chip, MT6516_POWER_NONE means the power is always on*/ + int power_vio_vol; /*!< the Power Voltage used by the chip */ + bool is_batch_supported; +}; + +extern struct gyro_hw* get_cust_gyro_hw(void); +#endif diff --git a/arch/arm/mach-mt8127/ford/gyroscope/mpu6050.c b/arch/arm/mach-mt8127/ford/gyroscope/mpu6050.c new file mode 100644 index 00000000000..2a382c333ad --- /dev/null +++ b/arch/arm/mach-mt8127/ford/gyroscope/mpu6050.c @@ -0,0 +1,1869 @@ +/* MPU6050 motion sensor driver + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "mpu6050.h" +#include +#include + +#include +#include +#include +#include + +#define INV_GYRO_AUTO_CALI 1 + +#define POWER_NONE_MACRO MT65XX_POWER_NONE +/*----------------------------------------------------------------------------*/ +#define MPU6050_DEFAULT_FS MPU6050_FS_1000 +#define MPU6050_DEFAULT_LSB MPU6050_FS_1000_LSB +/*---------------------------------------------------------------------------*/ +#define DEBUG 1 +/*----------------------------------------------------------------------------*/ +#define CONFIG_MPU6050_LOWPASS /*apply low pass filter on output*/ +/*----------------------------------------------------------------------------*/ +#define MPU6050_AXIS_X 0 +#define MPU6050_AXIS_Y 1 +#define MPU6050_AXIS_Z 2 +#define MPU6050_AXES_NUM 3 +#define MPU6050_DATA_LEN 6 +#define MPU6050_DEV_NAME "MPU6050GY" /* name must different with gsensor mpu6050 */ +/*----------------------------------------------------------------------------*/ +static const struct i2c_device_id mpu6050_i2c_id[] = {{MPU6050_DEV_NAME,0},{}}; +static struct i2c_board_info __initdata i2c_mpu6050={ I2C_BOARD_INFO(MPU6050_DEV_NAME, (MPU6050_I2C_SLAVE_ADDR>>1))}; + +int packet_thresh = 75; // 600 ms / 8ms/sample + +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int mpu6050_i2c_remove(struct i2c_client *client); +static int mpu6050_i2c_detect(struct i2c_client *client, struct i2c_board_info *info); + +/*----------------------------------------------------------------------------*/ +typedef enum +{ + GYRO_TRC_FILTER = 0x01, + GYRO_TRC_RAWDATA = 0x02, + GYRO_TRC_IOCTL = 0x04, + GYRO_TRC_CALI = 0X08, + GYRO_TRC_INFO = 0X10, + GYRO_TRC_DATA = 0X20, +} GYRO_TRC; +/*----------------------------------------------------------------------------*/ +struct scale_factor +{ + u8 whole; + u8 fraction; +}; +/*----------------------------------------------------------------------------*/ +struct data_resolution +{ + struct scale_factor scalefactor; + int sensitivity; +}; +/*----------------------------------------------------------------------------*/ +#define C_MAX_FIR_LENGTH (32) +/*----------------------------------------------------------------------------*/ +struct data_filter +{ + s16 raw[C_MAX_FIR_LENGTH][MPU6050_AXES_NUM]; + int sum[MPU6050_AXES_NUM]; + int num; + int idx; +}; +/*----------------------------------------------------------------------------*/ +struct mpu6050_i2c_data +{ + struct i2c_client *client; + struct gyro_hw *hw; + struct hwmsen_convert cvt; + + /*misc*/ + struct data_resolution *reso; + atomic_t trace; + atomic_t suspend; + atomic_t selftest; + atomic_t filter; + s16 cali_sw[MPU6050_AXES_NUM+1]; + + /*data*/ + s8 offset[MPU6050_AXES_NUM+1]; /*+1: for 4-byte alignment*/ + s16 data[MPU6050_AXES_NUM+1]; + +#if defined(CONFIG_MPU6050_LOWPASS) + atomic_t firlen; + atomic_t fir_en; + struct data_filter fir; +#endif + /*early suspend*/ +#if defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_drv; +#endif +#if INV_GYRO_AUTO_CALI==1 + s16 inv_cali_raw[MPU6050_AXES_NUM+1]; + s16 temperature; + struct mutex temperature_mutex;//for temperature protection + struct mutex raw_data_mutex;//for inv_cali_raw[] protection +#endif +}; +/*----------------------------------------------------------------------------*/ +static struct i2c_driver mpu6050_i2c_driver = { + .driver = { + .name = MPU6050_DEV_NAME, + }, + .probe = mpu6050_i2c_probe, + .remove = mpu6050_i2c_remove, + .detect = mpu6050_i2c_detect, +#if !defined(CONFIG_HAS_EARLYSUSPEND) + .suspend = mpu6050_suspend, + .resume = mpu6050_resume, +#endif + .id_table = mpu6050_i2c_id, +}; + +/*----------------------------------------------------------------------------*/ +static struct i2c_client *mpu6050_i2c_client = NULL; +static struct platform_driver mpu6050_gyro_driver; +static struct mpu6050_i2c_data *obj_i2c_data = NULL; +static bool sensor_power = false; + + + +/*----------------------------------------------------------------------------*/ +#define GYRO_TAG "[Gyroscope] " +#define GYRO_FUN(f) printk(KERN_INFO GYRO_TAG"%s\n", __FUNCTION__) +#define GYRO_ERR(fmt, args...) printk(KERN_ERR GYRO_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) +#define GYRO_LOG(fmt, args...) printk(KERN_INFO GYRO_TAG fmt, ##args) +/*----------------------------------------------------------------------------*/ + +extern int MPU6050_gse_power(void); +extern int MPU6050_gse_mode(void); + +#ifdef MPU6050_ACCESS_BY_GSE_I2C +extern int MPU6050_i2c_master_send(u8 *buf, u8 len); +extern int MPU6050_i2c_master_recv(u8 *buf, u8 len); +extern int MPU6050_hwmsen_read_block(u8 addr, u8 *buf, u8 len); +extern int MPU6050_hwmsen_read_byte(u8 addr, u8 *buf); +#endif + +static unsigned int power_on = 0; + +int MPU6050_gyro_power(void) +{ + return(power_on); +} +EXPORT_SYMBOL(MPU6050_gyro_power); + +int MPU6050_gyro_mode(void) +{ + return sensor_power; +} +EXPORT_SYMBOL(MPU6050_gyro_mode); + +/*--------------------gyroscopy power control function----------------------------------*/ +static void MPU6050_power(struct gyro_hw *hw, unsigned int on) +{ + + if (hw->power_id != POWER_NONE_MACRO) // have externel LDO + { + GYRO_LOG("power %s\n", on ? "on" : "off"); + if (power_on == on) // power status not change + { + GYRO_LOG("ignore power control: %d\n", on); + } + else if (on) // power on + { + if (!hwPowerOn(hw->power_id, hw->power_vol, "MPU6050GY")) + { + GYRO_ERR("power on fails!!\n"); + } + } + else // power off + { + if (MPU6050_gse_power() == false) + { + if (!hwPowerDown(hw->power_id, "MPU6050GY")) + { + GYRO_ERR("power off fail!!\n"); + } + } + } + } + power_on = on; +} +/*----------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------*/ +static int MPU6050_write_rel_calibration(struct mpu6050_i2c_data *obj, int dat[MPU6050_AXES_NUM]) +{ + obj->cali_sw[MPU6050_AXIS_X] = obj->cvt.sign[MPU6050_AXIS_X]*dat[obj->cvt.map[MPU6050_AXIS_X]]; + obj->cali_sw[MPU6050_AXIS_Y] = obj->cvt.sign[MPU6050_AXIS_Y]*dat[obj->cvt.map[MPU6050_AXIS_Y]]; + obj->cali_sw[MPU6050_AXIS_Z] = obj->cvt.sign[MPU6050_AXIS_Z]*dat[obj->cvt.map[MPU6050_AXIS_Z]]; +#if DEBUG + if (atomic_read(&obj->trace) & GYRO_TRC_CALI) + { + GYRO_LOG("test (%5d, %5d, %5d) ->(%5d, %5d, %5d)->(%5d, %5d, %5d))\n", + obj->cvt.sign[MPU6050_AXIS_X],obj->cvt.sign[MPU6050_AXIS_Y],obj->cvt.sign[MPU6050_AXIS_Z], + dat[MPU6050_AXIS_X], dat[MPU6050_AXIS_Y], dat[MPU6050_AXIS_Z], + obj->cvt.map[MPU6050_AXIS_X],obj->cvt.map[MPU6050_AXIS_Y],obj->cvt.map[MPU6050_AXIS_Z]); + GYRO_LOG("write gyro calibration data (%5d, %5d, %5d)\n", + obj->cali_sw[MPU6050_AXIS_X],obj->cali_sw[MPU6050_AXIS_Y],obj->cali_sw[MPU6050_AXIS_Z]); + } +#endif + return 0; +} + + +/*----------------------------------------------------------------------------*/ +static int MPU6050_ResetCalibration(struct i2c_client *client) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + + memset(obj->cali_sw, 0x00, sizeof(obj->cali_sw)); + return 0; +} +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadCalibration(struct i2c_client *client, int dat[MPU6050_AXES_NUM]) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + + dat[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->cali_sw[MPU6050_AXIS_X]; + dat[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->cali_sw[MPU6050_AXIS_Y]; + dat[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->cali_sw[MPU6050_AXIS_Z]; + +#if DEBUG + if (atomic_read(&obj->trace) & GYRO_TRC_CALI) + { + GYRO_LOG("Read gyro calibration data (%5d, %5d, %5d)\n", + dat[MPU6050_AXIS_X],dat[MPU6050_AXIS_Y],dat[MPU6050_AXIS_Z]); + } +#endif + + return 0; +} +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +static int MPU6050_WriteCalibration(struct i2c_client *client, int dat[MPU6050_AXES_NUM]) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int err = 0; + int cali[MPU6050_AXES_NUM]; + + + GYRO_FUN(); + if (!obj || ! dat) + { + GYRO_ERR("null ptr!!\n"); + return -EINVAL; + } + else + { + cali[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->cali_sw[MPU6050_AXIS_X]; + cali[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->cali_sw[MPU6050_AXIS_Y]; + cali[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->cali_sw[MPU6050_AXIS_Z]; + cali[MPU6050_AXIS_X] += dat[MPU6050_AXIS_X]; + cali[MPU6050_AXIS_Y] += dat[MPU6050_AXIS_Y]; + cali[MPU6050_AXIS_Z] += dat[MPU6050_AXIS_Z]; +#if DEBUG + if (atomic_read(&obj->trace) & GYRO_TRC_CALI) + { + GYRO_LOG("write gyro calibration data (%5d, %5d, %5d)-->(%5d, %5d, %5d)\n", + dat[MPU6050_AXIS_X], dat[MPU6050_AXIS_Y], dat[MPU6050_AXIS_Z], + cali[MPU6050_AXIS_X],cali[MPU6050_AXIS_Y],cali[MPU6050_AXIS_Z]); + } +#endif + return MPU6050_write_rel_calibration(obj, cali); + } + + return err; +} +/*----------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadStart(struct i2c_client *client, bool enable) +{ + u8 databuf[2] = {0}; + int res = 0; + GYRO_FUN(); + + databuf[0] = MPU6050_REG_FIFO_EN; + + if (enable) + { + //enable xyz gyro in FIFO + databuf[1] = (MPU6050_FIFO_GYROX_EN|MPU6050_FIFO_GYROY_EN|MPU6050_FIFO_GYROZ_EN); + } + else + { + //disable xyz gyro in FIFO + databuf[1] = 0; + } + +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + GYRO_ERR(" enable xyz gyro in FIFO error,enable: 0x%x!\n", databuf[1]); + return MPU6050_ERR_I2C; + } + GYRO_LOG("MPU6050_ReadStart: enable xyz gyro in FIFO: 0x%x\n", databuf[1]); + return MPU6050_SUCCESS; +} + + + +//----------------------------------------------------------------------------// +static int MPU6050_SetPowerMode(struct i2c_client *client, bool enable) +{ + u8 databuf[2] = {0}; + int res = 0; + + if (enable == sensor_power) + { + GYRO_LOG("Sensor power status is newest!\n"); + return MPU6050_SUCCESS; + } + +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_byte(MPU6050_REG_PWR_CTL, databuf)) +#else + if (hwmsen_read_byte(client, MPU6050_REG_PWR_CTL, databuf)) +#endif + { + GYRO_ERR("read power ctl register err!\n"); + return MPU6050_ERR_I2C; + } + + databuf[0] &= ~MPU6050_SLEEP; + if (enable == FALSE) + { + if (MPU6050_gse_mode() == false) + { + databuf[0] |= MPU6050_SLEEP; + } + } + else + { + // do nothing + } + + + databuf[1] = databuf[0]; + databuf[0] = MPU6050_REG_PWR_CTL; + +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + + if (res <= 0) + { + GYRO_LOG("set power mode failed!\n"); + return MPU6050_ERR_I2C; + } + else + { + GYRO_LOG("set power mode ok %d!\n", enable); + } + msleep(200); + + sensor_power = enable; + + return MPU6050_SUCCESS; +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_SetDataFormat(struct i2c_client *client, u8 dataformat) +{ + u8 databuf[2] = {0}; + int res = 0; + GYRO_FUN(); + + databuf[0] = MPU6050_REG_CFG; + databuf[1] = dataformat; +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + //read sample rate after written for test + udelay(500); +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_byte(MPU6050_REG_CFG, databuf)) +#else + if (hwmsen_read_byte(client, MPU6050_REG_CFG, databuf)) +#endif + { + GYRO_ERR("read data format register err!\n"); + return MPU6050_ERR_I2C; + } + else + { + GYRO_LOG("read data format: 0x%x\n", databuf[0]); + } + + return MPU6050_SUCCESS; +} + +static int MPU6050_SetFullScale(struct i2c_client *client, u8 dataformat) +{ + u8 databuf[2] = {0}; + int res = 0; + GYRO_FUN(); + + databuf[0] = MPU6050_REG_GYRO_CFG; + databuf[1] = dataformat; +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + return MPU6050_ERR_I2C; + } + + //read sample rate after written for test + udelay(500); +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_byte(MPU6050_REG_GYRO_CFG, databuf)) +#else + if (hwmsen_read_byte(client, MPU6050_REG_GYRO_CFG, databuf)) +#endif + { + GYRO_ERR("read data format register err!\n"); + return MPU6050_ERR_I2C; + } + else + { + GYRO_LOG("read data format: 0x%x\n", databuf[0]); + } + + return MPU6050_SUCCESS; +} + + +// set the sample rate +static int MPU6050_SetSampleRate(struct i2c_client *client, int sample_rate) +{ + u8 databuf[2] = {0}; + int rate_div = 0; + int res = 0; + GYRO_FUN(); +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_byte(MPU6050_REG_CFG, databuf)) +#else + if (hwmsen_read_byte(client, MPU6050_REG_CFG, databuf)) +#endif + { + GYRO_ERR("read gyro data format register err!\n"); + return MPU6050_ERR_I2C; + } + else + { + GYRO_LOG("read gyro data format register: 0x%x\n", databuf[0]); + } + + if ((databuf[0] & 0x07) == 0) //Analog sample rate is 8KHz + { + rate_div = 8 * 1024 / sample_rate - 1; + } + else // 1kHz + { + rate_div = 1024 / sample_rate - 1; + } + + if (rate_div > 255) // rate_div: 0 to 255; + { + rate_div = 255; + } + else if (rate_div < 0) + { + rate_div = 0; + } + + databuf[0] = MPU6050_REG_SAMRT_DIV; + databuf[1] = rate_div; +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + GYRO_ERR("write sample rate register err!\n"); + return MPU6050_ERR_I2C; + } + + //read sample div after written for test + udelay(500); +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_byte(MPU6050_REG_SAMRT_DIV, databuf)) +#else + if (hwmsen_read_byte(client, MPU6050_REG_SAMRT_DIV, databuf)) +#endif + { + GYRO_ERR("read gyro sample rate register err!\n"); + return MPU6050_ERR_I2C; + } + else + { + GYRO_LOG("read gyro sample rate: 0x%x\n", databuf[0]); + } + + return MPU6050_SUCCESS; +} +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +static int MPU6050_FIFOConfig(struct i2c_client *client, u8 clk) +{ + u8 databuf[2] = {0}; + int res = 0; + GYRO_FUN(); + + //use gyro X, Y or Z for clocking + databuf[0] = MPU6050_REG_PWR_CTL; + databuf[1] = clk; +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + GYRO_ERR("write Power CTRL register err!\n"); + return MPU6050_ERR_I2C; + } + GYRO_LOG("MPU6050 use gyro X for clocking OK!\n"); + + mdelay(50); + + //enable xyz gyro in FIFO + databuf[0] = MPU6050_REG_FIFO_EN; + databuf[1] = (MPU6050_FIFO_GYROX_EN|MPU6050_FIFO_GYROY_EN|MPU6050_FIFO_GYROZ_EN); +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + GYRO_ERR("write Power CTRL register err!\n"); + return MPU6050_ERR_I2C; + } + GYRO_LOG("MPU6050 enable xyz gyro in FIFO OK!\n"); + + //disable AUX_VDDIO + databuf[0] = MPU6050_REG_AUX_VDD; + databuf[1] = MPU6050_AUX_VDDIO_DIS; +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + GYRO_ERR("write AUX_VDD register err!\n"); + return MPU6050_ERR_I2C; + } + GYRO_LOG("MPU6050 disable AUX_VDDIO OK!\n"); + + //enable FIFO and reset FIFO + databuf[0] = MPU6050_REG_FIFO_CTL; + databuf[1] = (MPU6050_FIFO_EN | MPU6050_FIFO_RST); +#ifdef MPU6050_ACCESS_BY_GSE_I2C + res = MPU6050_i2c_master_send(databuf, 0x2); +#else + res = i2c_master_send(client, databuf, 0x2); +#endif + if (res <= 0) + { + GYRO_ERR("write FIFO CTRL register err!\n"); + return MPU6050_ERR_I2C; + } + + GYRO_LOG("MPU6050_FIFOConfig OK!\n"); + return MPU6050_SUCCESS; +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadFifoData(struct i2c_client *client, s16 *data, int* datalen) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + u8 buf[MPU6050_DATA_LEN] = {0}; + s16 tmp1[MPU6050_AXES_NUM] = {0}; + s16 tmp2[MPU6050_AXES_NUM] = {0}; + int err = 0; + u8 tmp = 0; + int packet_cnt = 0; + int i; + GYRO_FUN(); + + if (NULL == client) + { + return -EINVAL; + } + + //stop putting data in FIFO + MPU6050_ReadStart(client, FALSE); + + //read data number of bytes in FIFO +#ifdef MPU6050_ACCESS_BY_GSE_I2C + err = MPU6050_hwmsen_read_byte(MPU6050_REG_FIFO_CNTH, &tmp); +#else + err = hwmsen_read_byte(client, MPU6050_REG_FIFO_CNTH, &tmp); +#endif + if (err) + { + GYRO_ERR("read data high number of bytes error: %d\n", err); + return -1; + } + packet_cnt = tmp<< 8; + +#ifdef MPU6050_ACCESS_BY_GSE_I2C + err = MPU6050_hwmsen_read_byte(MPU6050_REG_FIFO_CNTL, &tmp); +#else + err = hwmsen_read_byte(client, MPU6050_REG_FIFO_CNTL, &tmp); +#endif + if (err) + { + GYRO_ERR("read data low number of bytes error: %d\n", err); + return -1; + } + packet_cnt = (packet_cnt + tmp) /MPU6050_DATA_LEN; + + GYRO_LOG("MPU6050 Read Data packet number OK: %d\n", packet_cnt); + + *datalen = packet_cnt; + + //Within +-5% range: timing_tolerance * packet_thresh=0.05*75 + if (packet_cnt && (abs(packet_thresh -packet_cnt) < 4)) + { + //read data in FIFO + for (i = 0; i < packet_cnt; i++) + { +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_block(MPU6050_REG_FIFO_DATA, buf, MPU6050_DATA_LEN)) +#else + if (hwmsen_read_block(client, MPU6050_REG_FIFO_DATA, buf, MPU6050_DATA_LEN)) +#endif + { + GYRO_ERR("MPU6050 read data from FIFO error: %d\n", err); + return -2; + } + else + { + GYRO_LOG("MPU6050 read Data of diff address from FIFO OK !\n"); + } + + tmp1[MPU6050_AXIS_X] = (s16)((buf[MPU6050_AXIS_X*2+1]) | (buf[MPU6050_AXIS_X*2] << 8)); + tmp1[MPU6050_AXIS_Y] = (s16)((buf[MPU6050_AXIS_Y*2+1]) | (buf[MPU6050_AXIS_Y*2] << 8)); + tmp1[MPU6050_AXIS_Z] = (s16)((buf[MPU6050_AXIS_Z*2+1]) | (buf[MPU6050_AXIS_Z*2] << 8)); + + //remap coordinate// + tmp2[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*tmp1[MPU6050_AXIS_X]; + tmp2[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*tmp1[MPU6050_AXIS_Y]; + tmp2[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*tmp1[MPU6050_AXIS_Z]; + + data[3* i +MPU6050_AXIS_X] = tmp2[MPU6050_AXIS_X]; + data[3* i +MPU6050_AXIS_Y] = tmp2[MPU6050_AXIS_Y]; + data[3* i +MPU6050_AXIS_Z] = tmp2[MPU6050_AXIS_Z]; + + GYRO_LOG("gyro FIFO packet[%d]:[%04X %04X %04X] => [%5d %5d %5d]\n", i, + data[3*i +MPU6050_AXIS_X], data[3*i +MPU6050_AXIS_Y], data[3*i +MPU6050_AXIS_Z], + data[3*i +MPU6050_AXIS_X], data[3*i +MPU6050_AXIS_Y], data[3*i +MPU6050_AXIS_Z]); + } + + } + else + { + GYRO_ERR("MPU6050 Incorrect packet count: %d\n", packet_cnt); + return -3; + } + + return 0; +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadGyroData(struct i2c_client *client, char *buf, int bufsize) +{ + char databuf[6]; + int data[3]; + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + + if (atomic_read(&obj->suspend)) + { + return -3; + } + + if (sensor_power == false) + { + MPU6050_SetPowerMode(client, true); + } + +#if INV_GYRO_AUTO_CALI==1 +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_block(MPU6050_REG_TEMPH, databuf, 2)) +#else + if (hwmsen_read_block(client, MPU6050_REG_TEMPH, databuf, 2)) +#endif + { + GYRO_ERR("MPU6050 read temperature data error\n"); + return -2; + } + else + { + mutex_lock(&obj->temperature_mutex); + obj->temperature = ((s16)((databuf[1]) | (databuf[0] << 8))); + mutex_unlock(&obj->temperature_mutex); + } +#endif + +#ifdef MPU6050_ACCESS_BY_GSE_I2C + if (MPU6050_hwmsen_read_block(MPU6050_REG_GYRO_XH, databuf, 6)) +#else + if (hwmsen_read_block(client, MPU6050_REG_GYRO_XH, databuf, 6)) +#endif + { + GYRO_ERR("MPU6050 read gyroscope data error\n"); + return -2; + } + else + { + obj->data[MPU6050_AXIS_X] = ((s16)((databuf[MPU6050_AXIS_X*2+1]) | (databuf[MPU6050_AXIS_X*2] << 8))); + obj->data[MPU6050_AXIS_Y] = ((s16)((databuf[MPU6050_AXIS_Y*2+1]) | (databuf[MPU6050_AXIS_Y*2] << 8))); + obj->data[MPU6050_AXIS_Z] = ((s16)((databuf[MPU6050_AXIS_Z*2+1]) | (databuf[MPU6050_AXIS_Z*2] << 8))); +#if DEBUG + if (atomic_read(&obj->trace) & GYRO_TRC_RAWDATA) + { + GYRO_LOG("read gyro register: %d, %d, %d, %d, %d, %d", + databuf[0], databuf[1], databuf[2], databuf[3], databuf[4], databuf[5]); + GYRO_LOG("get gyro raw data (0x%08X, 0x%08X, 0x%08X) -> (%5d, %5d, %5d)\n", + obj->data[MPU6050_AXIS_X],obj->data[MPU6050_AXIS_Y],obj->data[MPU6050_AXIS_Z], + obj->data[MPU6050_AXIS_X],obj->data[MPU6050_AXIS_Y],obj->data[MPU6050_AXIS_Z]); + } +#endif +#if INV_GYRO_AUTO_CALI==1 + mutex_lock(&obj->raw_data_mutex); + /*remap coordinate*/ + obj->inv_cali_raw[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->data[MPU6050_AXIS_X]; + obj->inv_cali_raw[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->data[MPU6050_AXIS_Y]; + obj->inv_cali_raw[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->data[MPU6050_AXIS_Z]; + mutex_unlock(&obj->raw_data_mutex); +#endif + obj->data[MPU6050_AXIS_X] = obj->data[MPU6050_AXIS_X] + obj->cali_sw[MPU6050_AXIS_X]; + obj->data[MPU6050_AXIS_Y] = obj->data[MPU6050_AXIS_Y] + obj->cali_sw[MPU6050_AXIS_Y]; + obj->data[MPU6050_AXIS_Z] = obj->data[MPU6050_AXIS_Z] + obj->cali_sw[MPU6050_AXIS_Z]; + + /*remap coordinate*/ + data[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->data[MPU6050_AXIS_X]; + data[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->data[MPU6050_AXIS_Y]; + data[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->data[MPU6050_AXIS_Z]; + + //Out put the degree/second(o/s) + data[MPU6050_AXIS_X] = data[MPU6050_AXIS_X] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB; + data[MPU6050_AXIS_Y] = data[MPU6050_AXIS_Y] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB; + data[MPU6050_AXIS_Z] = data[MPU6050_AXIS_Z] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB; + + + } + + sprintf(buf, "%04x %04x %04x", data[MPU6050_AXIS_X],data[MPU6050_AXIS_Y],data[MPU6050_AXIS_Z]); + +#if DEBUG + if (atomic_read(&obj->trace) & GYRO_TRC_DATA) + { + GYRO_LOG("get gyro data packet:[%d %d %d]\n", data[0], data[1], data[2]); + } +#endif + + return 0; + +} + +//for factory mode +static int MPU6050_PROCESS_SMT_DATA(struct i2c_client *client, short *data) +{ + int total_num = 0; + int retval =0; + long xSum = 0; + long ySum = 0; + long zSum = 0; + long xAvg, yAvg, zAvg; + long xRMS, yRMS, zRMS; + int i=0; + + int bias_thresh = 5242; // 40 dps * 131.072 LSB/dps + //float RMS_thresh = 687.19f; // (.2 dps * 131.072) ^ 2 + long RMS_thresh = 68719; // (.2 dps * 131.072) ^ 2 + + total_num = data[0]; + retval = data[1]; + GYRO_LOG("MPU6050 read gyro data OK, total number: %d \n", total_num); + for (i = 0; i < total_num; i++) + { + xSum =xSum + data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X +2]; + ySum =ySum + data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y +2]; + zSum =zSum + data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z +2]; + + /* + FLPLOGD("read gyro data OK: packet_num:%d, [X:%5d, Y:%5d, Z:%5d]\n", i, data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X +2], data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y +2], data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z +2]); + FLPLOGD("MPU6050 xSum: %5d, ySum: %5d, zSum: %5d \n", xSum, ySum, zSum); + */ + + } + GYRO_LOG("MPU6050 xSum: %5ld, ySum: %5ld, zSum: %5ld \n", xSum, ySum, zSum); + + if (total_num != 0) + { + xAvg = (xSum / total_num); + yAvg = (ySum / total_num); + zAvg = (zSum / total_num); + } + else + { + xAvg = xSum; + yAvg = ySum; + zAvg = zSum; + } + + GYRO_LOG("MPU6050 xAvg: %ld, yAvg: %ld, zAvg: %ld \n", xAvg, yAvg, zAvg); + + if ( abs(xAvg) >bias_thresh) + { + GYRO_LOG("X-Gyro bias exceeded threshold \n"); + retval |= 1 << 3; + } + if ( abs(yAvg) > bias_thresh) + { + GYRO_LOG("Y-Gyro bias exceeded threshold \n"); + retval |= 1 << 4; + } + if ( abs(zAvg ) > bias_thresh) + { + GYRO_LOG("Z-Gyro bias exceeded threshold \n"); + retval |= 1 << 5; + } + + xRMS = 0; + yRMS = 0; + zRMS = 0; + + //Finally, check RMS + for ( i = 0; i < total_num ; i++) + { + xRMS += (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X+2]-xAvg)*(data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X+2]-xAvg); + yRMS += (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y+2]-yAvg)*(data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y+2]-yAvg); + zRMS += (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z+2]-zAvg)*(data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z+2]-zAvg); + } + + GYRO_LOG("MPU6050 xRMS: %ld, yRMS: %ld, zRMS: %ld \n", xRMS, yRMS, zRMS); + xRMS = 100*xRMS; + yRMS = 100*yRMS; + zRMS = 100*zRMS; + + if (FACTORY_BOOT == get_boot_mode()) + return retval; + if ( xRMS > RMS_thresh * total_num) + { + GYRO_LOG("X-Gyro RMS exceeded threshold, RMS_thresh: %ld \n", RMS_thresh * total_num); + retval |= 1 << 6; + } + if ( yRMS > RMS_thresh * total_num ) + { + GYRO_LOG("Y-Gyro RMS exceeded threshold, RMS_thresh: %ld \n", RMS_thresh * total_num); + retval |= 1 << 7; + } + if ( zRMS > RMS_thresh * total_num ) + { + GYRO_LOG("Z-Gyro RMS exceeded threshold, RMS_thresh: %ld \n", RMS_thresh * total_num); + retval |= 1 << 8; + } + if ( xRMS == 0 || yRMS == 0 || zRMS == 0) + //If any of the RMS noise value returns zero, then we might have dead gyro or FIFO/register failure + retval |= 1 << 9; + GYRO_LOG("retval %d \n", retval); + return retval; + +} + + + +/*----------------------------------------------------------------------------*/ +static int MPU6050_SMTReadSensorData(struct i2c_client *client, s16 *buf, int bufsize) +{ + //S16 gyro[MPU6050_AXES_NUM*MPU6050_FIFOSIZE]; + int res = 0; + int i; + int datalen, total_num= 0; + + GYRO_FUN(); + + if (sensor_power == false) + { + MPU6050_SetPowerMode(client, true); + } + + if (NULL == buf) + { + return -1; + } + if (NULL == client) + { + *buf = 0; + return -2; + } + + for (i = 0; i < MPU6050_AXES_NUM; i++) + { + res = MPU6050_FIFOConfig(client, (i+1)); + if (res) + { + GYRO_ERR("MPU6050_FIFOConfig error:%d!\n", res); + return -3; + } + + //putting data in FIFO during the delayed 600ms + mdelay(600); + + res = MPU6050_ReadFifoData(client, &(buf[total_num+2]), &datalen); + if (res) + { + if (res == (-3)) + { + buf[1] = (1<< i); + } + else + { + GYRO_ERR("MPU6050_ReadData error:%d!\n", res); + return -3; + } + } + else + { + buf[0] = datalen; + total_num+=datalen*MPU6050_AXES_NUM; + } + } + + GYRO_LOG("gyroscope read data OK, total packet: %d", buf[0] ); + + return 0; +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadChipInfo(struct i2c_client *client, char *buf, int bufsize) +{ + u8 databuf[10]; + + memset(databuf, 0, sizeof(u8)*10); + + if ((NULL == buf)||(bufsize<=30)) + { + return -1; + } + + if (NULL == client) + { + *buf = 0; + return -2; + } + + sprintf(buf, "MPU6050 Chip"); + return 0; +} + +#if INV_GYRO_AUTO_CALI==1 +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadGyroDataRaw(struct i2c_client *client, char *buf, int bufsize) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + + mutex_lock(&obj->raw_data_mutex); + //return gyro raw LSB in device orientation + sprintf(buf, "%x %x %x", obj->inv_cali_raw[MPU6050_AXIS_X],obj->inv_cali_raw[MPU6050_AXIS_Y],obj->inv_cali_raw[MPU6050_AXIS_Z]); + +#if DEBUG + if (atomic_read(&obj->trace) & GYRO_TRC_DATA) + { + GYRO_LOG("get gyro raw data packet:[%d %d %d]\n", obj->inv_cali_raw[0], obj->inv_cali_raw[1], obj->inv_cali_raw[2]); + } +#endif + mutex_unlock(&obj->raw_data_mutex); + + return 0; + +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadTemperature(struct i2c_client *client, char *buf, int bufsize) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + + mutex_lock(&obj->temperature_mutex); + sprintf(buf, "%x", obj->temperature); + +#if DEBUG + if (atomic_read(&obj->trace) & GYRO_TRC_DATA) + { + GYRO_LOG("get gyro temperature:[%d]\n", obj->temperature); + } +#endif + mutex_unlock(&obj->temperature_mutex); + + return 0; + +} + +/*----------------------------------------------------------------------------*/ +static int MPU6050_ReadPowerStatus(struct i2c_client *client, char *buf, int bufsize) +{ +#if DEBUG + GYRO_LOG("get gyro PowerStatus:[%d]\n", sensor_power); +#endif + + sprintf(buf, "%x", sensor_power); + + return 0; + +} +#endif + +/*----------------------------------------------------------------------------*/ +static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mpu6050_i2c_client; + char strbuf[MPU6050_BUFSIZE]; + if (NULL == client) + { + GYRO_ERR("i2c client is null!!\n"); + return 0; + } + + MPU6050_ReadChipInfo(client, strbuf, MPU6050_BUFSIZE); + return snprintf(buf, PAGE_SIZE, "%s\n", strbuf); +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mpu6050_i2c_client; + char strbuf[MPU6050_BUFSIZE]; + + if (NULL == client) + { + GYRO_ERR("i2c client is null!!\n"); + return 0; + } + + MPU6050_ReadGyroData(client, strbuf, MPU6050_BUFSIZE); + return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t show_trace_value(struct device_driver *ddri, char *buf) +{ + ssize_t res; + struct mpu6050_i2c_data *obj = obj_i2c_data; + if (obj == NULL) + { + GYRO_ERR("i2c_data obj is null!!\n"); + return 0; + } + + res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace)); + return res; +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct mpu6050_i2c_data *obj = obj_i2c_data; + int trace; + if (obj == NULL) + { + GYRO_ERR("i2c_data obj is null!!\n"); + return 0; + } + + if (1 == sscanf(buf, "0x%x", &trace)) + { + atomic_set(&obj->trace, trace); + } + else + { + GYRO_ERR("invalid content: '%s', length = %d\n", buf, count); + } + + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_status_value(struct device_driver *ddri, char *buf) +{ + ssize_t len = 0; + struct mpu6050_i2c_data *obj = obj_i2c_data; + if (obj == NULL) + { + GYRO_ERR("i2c_data obj is null!!\n"); + return 0; + } + + if (obj->hw) + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n", + obj->hw->i2c_num, obj->hw->direction, obj->hw->power_id, obj->hw->power_vol); + } + else + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n"); + } + return len; +} +/*----------------------------------------------------------------------------*/ +static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL); +static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL); +static DRIVER_ATTR(trace, S_IWUSR | S_IRUGO, show_trace_value, store_trace_value); +static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL); +/*----------------------------------------------------------------------------*/ +static struct driver_attribute *MPU6050_attr_list[] = { + &driver_attr_chipinfo, /*chip information*/ + &driver_attr_sensordata, /*dump sensor data*/ + &driver_attr_trace, /*trace log*/ + &driver_attr_status, +}; +/*----------------------------------------------------------------------------*/ +static int mpu6050_create_attr(struct device_driver *driver) +{ + int idx, err = 0; + int num = (int)(sizeof(MPU6050_attr_list)/sizeof(MPU6050_attr_list[0])); + if (driver == NULL) + { + return -EINVAL; + } + + for (idx = 0; idx < num; idx++) + { + if (0 != (err = driver_create_file(driver, MPU6050_attr_list[idx]))) + { + GYRO_ERR("driver_create_file (%s) = %d\n", MPU6050_attr_list[idx]->attr.name, err); + break; + } + } + return err; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_delete_attr(struct device_driver *driver) +{ + int idx ,err = 0; + int num = (int)(sizeof(MPU6050_attr_list)/sizeof(MPU6050_attr_list[0])); + + if (driver == NULL) + { + return -EINVAL; + } + + + for (idx = 0; idx < num; idx++) + { + driver_remove_file(driver, MPU6050_attr_list[idx]); + } + + + return err; +} + +/*----------------------------------------------------------------------------*/ +static int mpu6050_gpio_config(void) +{ + //because we donot use EINT ,to support low power + // config to GPIO input mode + PD + //set GPIO_MSE_EINT_PIN + mt_set_gpio_mode(GPIO_GYRO_EINT_PIN, GPIO_GYRO_EINT_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_GYRO_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_GYRO_EINT_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(GPIO_GYRO_EINT_PIN, GPIO_PULL_DOWN); + return 0; +} +static int mpu6050_init_client(struct i2c_client *client, bool enable) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int res = 0; + bool sensor_power_org; + + GYRO_FUN(); + mpu6050_gpio_config(); + + sensor_power_org = sensor_power; + res = MPU6050_SetPowerMode(client, true); + if (res != MPU6050_SUCCESS) + { + return res; + } + + + + // The range should at least be 17.45 rad/s (ie: ~1000 deg/s). + res = MPU6050_SetDataFormat(client, (MPU6050_SYNC_GYROX << MPU6050_EXT_SYNC)| + MPU6050_RATE_1K_LPFB_188HZ); + + res = MPU6050_SetFullScale(client, (MPU6050_DEFAULT_FS << MPU6050_FS_RANGE)); + if (res != MPU6050_SUCCESS) + { + return res; + } + + // Set 125HZ sample rate + res = MPU6050_SetSampleRate(client, 125); + if (res != MPU6050_SUCCESS ) + { + return res; + } + + res = MPU6050_SetPowerMode(client, sensor_power_org); + if (res != MPU6050_SUCCESS) + { + return res; + } + + GYRO_LOG("mpu6050_init_client OK!\n"); + +#ifdef CONFIG_MPU6050_LOWPASS + memset(&obj->fir, 0x00, sizeof(obj->fir)); +#endif + + return MPU6050_SUCCESS; +} + +/*----------------------------------------------------------------------------*/ +int mpu6050_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + struct mpu6050_i2c_data *priv = (struct mpu6050_i2c_data*)self; + hwm_sensor_data* gyro_data; + char buff[MPU6050_BUFSIZE]; + + switch (command) + { + case SENSOR_DELAY: + if ((buff_in == NULL) || (size_in < sizeof(int))) + { + GYRO_ERR("Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + + } + break; + + case SENSOR_ENABLE: + if ((buff_in == NULL) || (size_in < sizeof(int))) + { + GYRO_ERR("Enable gyroscope parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if (((value == 0) && (sensor_power == false)) ||((value == 1) && (sensor_power == true))) + { + GYRO_LOG("gyroscope device have updated!\n"); + } + else + { + err = MPU6050_SetPowerMode(priv->client, !sensor_power); + } + } + break; + + case SENSOR_GET_DATA: + if ((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + GYRO_ERR("get gyroscope data parameter error!\n"); + err = -EINVAL; + } + else + { + gyro_data = (hwm_sensor_data *)buff_out; + err = MPU6050_ReadGyroData(priv->client, buff, MPU6050_BUFSIZE); + if(!err) + { + sscanf(buff, "%x %x %x", &gyro_data->values[0], + &gyro_data->values[1], &gyro_data->values[2]); + gyro_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; + gyro_data->value_divide = DEGREE_TO_RAD; + } + } + break; + default: + GYRO_ERR("gyroscope operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + +/****************************************************************************** + * Function Configuration +******************************************************************************/ +static int mpu6050_open(struct inode *inode, struct file *file) +{ + file->private_data = mpu6050_i2c_client; + + if (file->private_data == NULL) + { + GYRO_ERR("null pointer!!\n"); + return -EINVAL; + } + return nonseekable_open(inode, file); +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} +/*----------------------------------------------------------------------------*/ +static long mpu6050_unlocked_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct i2c_client *client = (struct i2c_client*)file->private_data; + char strbuf[MPU6050_BUFSIZE] = {0}; + s16 *SMTdata; + void __user *data; + long err = 0; + int copy_cnt = 0; + SENSOR_DATA sensor_data; + int cali[3]; + int smtRes=0; + + if (_IOC_DIR(cmd) & _IOC_READ) + { + err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + } + else if (_IOC_DIR(cmd) & _IOC_WRITE) + { + err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + } + + if (err) + { + GYRO_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd)); + return -EFAULT; + } + + switch (cmd) + { + case GYROSCOPE_IOCTL_INIT: + mpu6050_init_client(client, false); + break; + + case GYROSCOPE_IOCTL_SMT_DATA: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + SMTdata = kzalloc(sizeof(*SMTdata) * 800, GFP_KERNEL); + if (SMTdata == NULL) + { + err = -ENOMEM; + break; + } + memset(SMTdata, 0, sizeof(*SMTdata) * 800); + MPU6050_SMTReadSensorData(client, SMTdata, 800); + + GYRO_LOG("gyroscope read data from kernel OK: SMTdata[0]:%d, copied packet:%d!\n", SMTdata[0], + ((SMTdata[0]*MPU6050_AXES_NUM+2)*sizeof(s16)+1)); + + smtRes = MPU6050_PROCESS_SMT_DATA(client,SMTdata); + GYRO_LOG("ioctl smtRes: %d!\n", smtRes); + copy_cnt = copy_to_user(data, &smtRes, sizeof(smtRes)); + kfree(SMTdata); + if (copy_cnt) + { + err = -EFAULT; + GYRO_ERR("copy gyro data to user failed!\n"); + } + GYRO_LOG("copy gyro data to user OK: %d!\n", copy_cnt); + break; + + case GYROSCOPE_IOCTL_READ_SENSORDATA: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + MPU6050_ReadGyroData(client, strbuf, MPU6050_BUFSIZE); + if (copy_to_user(data, strbuf, sizeof(strbuf))) + { + err = -EFAULT; + break; + } + break; + + case GYROSCOPE_IOCTL_SET_CALI: + data = (void __user*)arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + if (copy_from_user(&sensor_data, data, sizeof(sensor_data))) + { + err = -EFAULT; + break; + } + + else + { + cali[MPU6050_AXIS_X] = sensor_data.x * MPU6050_DEFAULT_LSB / MPU6050_FS_MAX_LSB; + cali[MPU6050_AXIS_Y] = sensor_data.y * MPU6050_DEFAULT_LSB / MPU6050_FS_MAX_LSB; + cali[MPU6050_AXIS_Z] = sensor_data.z * MPU6050_DEFAULT_LSB / MPU6050_FS_MAX_LSB; + GYRO_LOG("gyro set cali:[%5d %5d %5d]\n", + cali[MPU6050_AXIS_X], cali[MPU6050_AXIS_Y], cali[MPU6050_AXIS_Z]); + err = MPU6050_WriteCalibration(client, cali); + } + break; + + case GYROSCOPE_IOCTL_CLR_CALI: + err = MPU6050_ResetCalibration(client); + break; + + case GYROSCOPE_IOCTL_GET_CALI: + data = (void __user*)arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + err = MPU6050_ReadCalibration(client, cali); + if (err) + { + break; + } + + sensor_data.x = cali[MPU6050_AXIS_X] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB; + sensor_data.y = cali[MPU6050_AXIS_Y] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB; + sensor_data.z = cali[MPU6050_AXIS_Z] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB; + if (copy_to_user(data, &sensor_data, sizeof(sensor_data))) + { + err = -EFAULT; + break; + } + break; + +#if INV_GYRO_AUTO_CALI==1 + case GYROSCOPE_IOCTL_READ_SENSORDATA_RAW: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + MPU6050_ReadGyroDataRaw(client, strbuf, MPU6050_BUFSIZE); + if (copy_to_user(data, strbuf, sizeof(strbuf))) + { + err = -EFAULT; + break; + } + break; + + case GYROSCOPE_IOCTL_READ_TEMPERATURE: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + MPU6050_ReadTemperature(client, strbuf, MPU6050_BUFSIZE); + if (copy_to_user(data, strbuf, sizeof(strbuf))) + { + err = -EFAULT; + break; + } + break; + + case GYROSCOPE_IOCTL_GET_POWER_STATUS: + data = (void __user *) arg; + if (data == NULL) + { + err = -EINVAL; + break; + } + + MPU6050_ReadPowerStatus(client, strbuf, MPU6050_BUFSIZE); + if (copy_to_user(data, strbuf, sizeof(strbuf))) + { + err = -EFAULT; + break; + } + break; +#endif + + default: + GYRO_ERR("unknown IOCTL: 0x%08x\n", cmd); + err = -ENOIOCTLCMD; + break; + } + return err; +} + + +/*----------------------------------------------------------------------------*/ +static struct file_operations mpu6050_fops = { + .open = mpu6050_open, + .release = mpu6050_release, + .unlocked_ioctl = mpu6050_unlocked_ioctl, +}; +/*----------------------------------------------------------------------------*/ +static struct miscdevice mpu6050_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "gyroscope", + .fops = &mpu6050_fops, +}; +/*----------------------------------------------------------------------------*/ +#ifndef CONFIG_HAS_EARLYSUSPEND +/*----------------------------------------------------------------------------*/ +static int mpu6050_suspend(struct i2c_client *client, pm_message_t msg) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + GYRO_FUN(); + + if (msg.event == PM_EVENT_SUSPEND) + { + if (obj == NULL) + { + GYRO_ERR("null pointer!!\n"); + return -EINVAL; + } + atomic_set(&obj->suspend, 1); + + err = MPU6050_SetPowerMode(client, false); + if (err <= 0) + { + return err; + } + } + return err; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_resume(struct i2c_client *client) +{ + struct mpu6050_i2c_data *obj = i2c_get_clientdata(client); + int err; + GYRO_FUN(); + + if (obj == NULL) + { + GYRO_ERR("null pointer!!\n"); + return -EINVAL; + } + + MPU6050_power(obj->hw, 1); + err = mpu6050_init_client(client, false); + if (err) + { + GYRO_ERR("initialize client fail!!\n"); + return err; + } + atomic_set(&obj->suspend, 0); + + return 0; +} +/*----------------------------------------------------------------------------*/ +#else /*CONFIG_HAS_EARLY_SUSPEND is defined*/ +/*----------------------------------------------------------------------------*/ +static void mpu6050_early_suspend(struct early_suspend *h) +{ + struct mpu6050_i2c_data *obj = container_of(h, struct mpu6050_i2c_data, early_drv); + int err; + //u8 databuf[2]; + GYRO_FUN(); + + if (obj == NULL) + { + GYRO_ERR("null pointer!!\n"); + return; + } + atomic_set(&obj->suspend, 1); + err = MPU6050_SetPowerMode(obj->client, false); + if (err) + { + GYRO_ERR("write power control fail!!\n"); + return; + } + + sensor_power = false; + + MPU6050_power(obj->hw, 0); +} +/*----------------------------------------------------------------------------*/ +static void mpu6050_late_resume(struct early_suspend *h) +{ + struct mpu6050_i2c_data *obj = container_of(h, struct mpu6050_i2c_data, early_drv); + int err; + GYRO_FUN(); + + if (obj == NULL) + { + GYRO_ERR("null pointer!!\n"); + return; + } + + MPU6050_power(obj->hw, 1); + err = mpu6050_init_client(obj->client, false); + if (err) + { + GYRO_ERR("initialize client fail! err code %d!\n", err); + return; + } + atomic_set(&obj->suspend, 0); +} +/*----------------------------------------------------------------------------*/ +#endif /*CONFIG_HAS_EARLYSUSPEND*/ +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + strcpy(info->type, MPU6050_DEV_NAME); + return 0; +} + +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_client *new_client; + struct mpu6050_i2c_data *obj; + struct hwmsen_object sobj; + int err = 0; + GYRO_FUN(); + + if (!(obj = kzalloc(sizeof(*obj), GFP_KERNEL))) + { + err = -ENOMEM; + goto exit; + } + + memset(obj, 0, sizeof(struct mpu6050_i2c_data)); + + obj->hw = get_cust_gyro_hw(); + err = hwmsen_get_convert(obj->hw->direction, &obj->cvt); + if (err) + { + GYRO_ERR("invalid direction: %d\n", obj->hw->direction); + goto exit; + } + + + GYRO_LOG("gyro_default_i2c_addr: %x\n", client->addr); +#ifdef MPU6050_ACCESS_BY_GSE_I2C + obj->hw->addr = MPU6050_I2C_SLAVE_ADDR; /* mtk i2c not allow to probe two same address */ +#endif + + GYRO_LOG("gyro_custom_i2c_addr: %x\n", obj->hw->addr); + if (0!=obj->hw->addr) + { + client->addr = obj->hw->addr >> 1; + GYRO_LOG("gyro_use_i2c_addr: %x\n", client->addr); + } + + obj_i2c_data = obj; + obj->client = client; + new_client = obj->client; + i2c_set_clientdata(new_client,obj); + + atomic_set(&obj->trace, 0); + atomic_set(&obj->suspend, 0); + + + + mpu6050_i2c_client = new_client; + err = mpu6050_init_client(new_client, false); + if (err) + { + goto exit_init_failed; + } + + + err = misc_register(&mpu6050_device); + if (err) + { + GYRO_ERR("mpu6050_device misc register failed!\n"); + goto exit_misc_device_register_failed; + } + + err = mpu6050_create_attr(&mpu6050_gyro_driver.driver); + if (err) + { + GYRO_ERR("mpu6050 create attribute err = %d\n", err); + goto exit_create_attr_failed; + } + + + sobj.self = obj; + sobj.polling = 1; + sobj.sensor_operate = mpu6050_operate; + err = hwmsen_attach(ID_GYROSCOPE, &sobj); + if (err) + { + GYRO_ERR("hwmsen_attach fail = %d\n", err); + goto exit_kfree; + } + + +#ifdef CONFIG_HAS_EARLYSUSPEND + obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 2, + obj->early_drv.suspend = mpu6050_early_suspend, + obj->early_drv.resume = mpu6050_late_resume, + register_early_suspend(&obj->early_drv); +#endif + +#if INV_GYRO_AUTO_CALI==1 + mutex_init(&obj->temperature_mutex); + mutex_init(&obj->raw_data_mutex); +#endif + + GYRO_LOG("%s: OK\n", __func__); + return 0; + + exit_create_attr_failed: + misc_deregister(&mpu6050_device); + exit_misc_device_register_failed: + exit_init_failed: + //i2c_detach_client(new_client); + exit_kfree: + kfree(obj); + exit: + GYRO_ERR("%s: err = %d\n", __func__, err); + return err; +} + +/*----------------------------------------------------------------------------*/ +static int mpu6050_i2c_remove(struct i2c_client *client) +{ + int err = 0; + + err = mpu6050_delete_attr(&mpu6050_gyro_driver.driver); + if (err) + { + GYRO_ERR("mpu6050_delete_attr fail: %d\n", err); + } + + err = misc_deregister(&mpu6050_device); + if (err) + { + GYRO_ERR("misc_deregister fail: %d\n", err); + } + + err = hwmsen_detach(ID_ACCELEROMETER); + if (err) + { + GYRO_ERR("hwmsen_detach fail: %d\n", err); + } + + mpu6050_i2c_client = NULL; + i2c_unregister_device(client); + kfree(i2c_get_clientdata(client)); + return 0; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_probe(struct platform_device *pdev) +{ + struct gyro_hw *hw = get_cust_gyro_hw(); + GYRO_FUN(); + MPU6050_power(hw, 1); + if (i2c_add_driver(&mpu6050_i2c_driver)) + { + GYRO_ERR("add driver error\n"); + return -1; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static int mpu6050_remove(struct platform_device *pdev) +{ + struct gyro_hw *hw = get_cust_gyro_hw(); + GYRO_FUN(); + MPU6050_power(hw, 0); + i2c_del_driver(&mpu6050_i2c_driver); + return 0; +} +/*----------------------------------------------------------------------------*/ +static struct platform_driver mpu6050_gyro_driver = { + .probe = mpu6050_probe, + .remove = mpu6050_remove, + .driver = { + .name = "gyroscope", + } +}; + +/*----------------------------------------------------------------------------*/ +static int __init mpu6050_init(void) +{ + struct gyro_hw *hw = get_cust_gyro_hw(); + GYRO_LOG("%s: i2c_number=%d\n", __func__,hw->i2c_num); + i2c_register_board_info(hw->i2c_num, &i2c_mpu6050, 1); + if (platform_driver_register(&mpu6050_gyro_driver)) + { + GYRO_ERR("failed to register driver"); + return -ENODEV; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static void __exit mpu6050_exit(void) +{ + GYRO_FUN(); + platform_driver_unregister(&mpu6050_gyro_driver); +} +/*----------------------------------------------------------------------------*/ +module_init(mpu6050_init); +module_exit(mpu6050_exit); +/*----------------------------------------------------------------------------*/ +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("MPU6050 gyroscope driver"); +MODULE_AUTHOR("Yucong.Xiong@mediatek.com"); diff --git a/arch/arm/mach-mt8127/ford/gyroscope/mpu6050.h b/arch/arm/mach-mt8127/ford/gyroscope/mpu6050.h new file mode 100644 index 00000000000..1f5f2164f2f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/gyroscope/mpu6050.h @@ -0,0 +1,84 @@ +#ifndef MPU6050_H +#define MPU6050_H + +#include + +#define MPU6050_ACCESS_BY_GSE_I2C + +#ifdef MPU6050_ACCESS_BY_GSE_I2C + #define MPU6050_I2C_SLAVE_ADDR (0xD2) /* mtk i2c not allow to probe two same address */ +#else + #define MPU6050_I2C_SLAVE_ADDR 0xD0 +#endif + + +/* MPU6050 Register Map (Please refer to MPU6050 Specifications) */ + +#define MPU6050_REG_DEVID 0x75 +#define MPU6050_REG_FIFO_EN 0x23 +#define MPU6050_REG_AUX_VDD 0x01 + +#define MPU6050_REG_SAMRT_DIV 0x19 +#define MPU6050_REG_CFG 0x1A //set external sync, full-scale range and sample rate, low pass filter bandwidth +#define MPU6050_REG_GYRO_CFG 0x1B // full-scale range and sample rate, + + +#define MPU6050_REG_GYRO_XH 0x43 + +#define MPU6050_REG_TEMPH 0x41 + + +#define MPU6050_REG_FIFO_CNTH 0x72 +#define MPU6050_REG_FIFO_CNTL 0x73 +#define MPU6050_REG_FIFO_DATA 0x74 +#define MPU6050_REG_FIFO_CTL 0x6A +#define MPU6050_REG_PWR_CTL 0x6B +#define MPU6050_REG_PWR_CTL2 0x6C + + +/*MPU6050 Register Bit definitions*/ + +#define MPU6050_FIFO_GYROX_EN 0x40 //insert the X Gyro data into FIFO +#define MPU6050_FIFO_GYROY_EN 0x20 //insert the Y Gyro data into FIFO +#define MPU6050_FIFO_GYROZ_EN 0x10 //insert the Z Gyro data into FIFO + +#define MPU6050_AUX_VDDIO_DIS 0x00 //disable VDD level for the secondary I2C bus clock and data lines + +// for MPU6050_REG_CFG +#define MPU6050_EXT_SYNC 0x03 //0x05 //captue the state of external frame sync input pin to insert into LSB of registers +#define MPU6050_SYNC_GYROX 0x02 + +// for MPU6050_REG_GYRO_CFG +#define MPU6050_FS_RANGE 0x03 //set the full-scale range of the gyro sensors +#define MPU6050_FS_1000 0x02 + + +#define MPU6050_FS_1000_LSB 33 +#define MPU6050_FS_MAX_LSB 131 + +#define MPU6050_RATE_1K_LPFB_188HZ 0x01 +#define MPU6050_RATE_1K_LPFB_256HZ 0x00 + +#define MPU6050_FIFO_EN 0x40 //enable FIFO operation for sensor data + +#define MPU6050_FIFO_RST 0x40 //reset FIFO function + +#define MPU6050_SLEEP 0x40 //enable low power sleep mode + + +#define MPU6050_SUCCESS 0 +#define MPU6050_ERR_I2C -1 +#define MPU6050_ERR_STATUS -3 +#define MPU6050_ERR_SETUP_FAILURE -4 +#define MPU6050_ERR_GETGSENSORDATA -5 +#define MPU6050_ERR_IDENTIFICATION -6 + + +#define MPU6050_BUFSIZE 60 + +// 1 rad = 180/PI degree, MAX_LSB = 131, +// 180*131/PI = 7506 +#define DEGREE_TO_RAD 7506 + +#endif //MPU6050_H + diff --git a/arch/arm/mach-mt8127/ford/hdmi/Makefile b/arch/arm/mach-mt8127/ford/hdmi/Makefile new file mode 100755 index 00000000000..0672c01f00d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/hdmi/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := hdmi_cust.o + diff --git a/arch/arm/mach-mt8127/ford/hdmi/hdmi_cust.c b/arch/arm/mach-mt8127/ford/hdmi/hdmi_cust.c new file mode 100644 index 00000000000..6db935087a1 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/hdmi/hdmi_cust.c @@ -0,0 +1,131 @@ +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include + +/****************************************************************** +** Basic define +******************************************************************/ +#ifndef s32 + #define s32 signed int +#endif +#ifndef s64 + #define s64 signed long long +#endif + +static bool cust_power_on = false; +int cust_hdmi_power_on(int on) +{ +/* + if(on > 0) + { + printk("MHL_Power power %x, rst %x \n" ,GPIO_MHL_POWER_CTRL_PIN, GPIO_MHL_RST_B_PIN); + mt_set_gpio_mode(GPIO_MHL_POWER_CTRL_PIN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_MHL_POWER_CTRL_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_MHL_POWER_CTRL_PIN, GPIO_OUT_ONE); +#ifdef PMIC_APP_MHL_POWER_LDO1 + if(cust_power_on == false) + { + hwPowerOn(PMIC_APP_MHL_POWER_LDO1, VOL_1200,"MHL"); + cust_power_on = true; + } +#else + printk("Error: PMIC_APP_MHL_POWER_LDO1 not defined -\n" ); +#endif + } + else + { +#ifdef PMIC_APP_MHL_POWER_LDO1 + if(cust_power_on == true) + { + hwPowerDown(PMIC_APP_MHL_POWER_LDO1, "MHL"); + cust_power_on = false; + } +#endif + } +*/ + return 0; +} + + +int cust_hdmi_dpi_gpio_on(int on) +{ +/* + unsigned int dpi_pin_start = 0; + if(on > 0) + { +#ifdef GPIO_EXT_DISP_DPI0_PIN + for(dpi_pin_start = GPIO_EXT_DISP_DPI0_PIN; dpi_pin_start < GPIO_EXT_DISP_DPI0_PIN + 16; dpi_pin_start++) + { + mt_set_gpio_mode(dpi_pin_start, GPIO_MODE_01); + } + printk("%s, %d GPIO_EXT_DISP_DPI0_PIN is defined+ %x\n", __func__, __LINE__, GPIO_EXT_DISP_DPI0_PIN); +#else + printk("%s,%d Error: GPIO_EXT_DISP_DPI0_PIN is not defined\n", __func__, __LINE__); +#endif + + } + else + { +#ifdef GPIO_EXT_DISP_DPI0_PIN + for(dpi_pin_start = GPIO_EXT_DISP_DPI0_PIN; dpi_pin_start < GPIO_EXT_DISP_DPI0_PIN + 16; dpi_pin_start++) + { + mt_set_gpio_mode(dpi_pin_start, GPIO_MODE_00); + mt_set_gpio_dir(dpi_pin_start, GPIO_DIR_IN); + mt_set_gpio_pull_enable(dpi_pin_start, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(dpi_pin_start, GPIO_PULL_DOWN); + } + printk("%s, %d GPIO_EXT_DISP_DPI0_PIN is defined- %x\n", __func__, __LINE__, GPIO_EXT_DISP_DPI0_PIN); +#endif + } +*/ + return 0; +} + +int cust_hdmi_i2s_gpio_on(int on) +{ +/* + if(on > 0) + { +#ifdef GPIO_MHL_I2S_OUT_WS_PIN + mt_set_gpio_mode(GPIO_MHL_I2S_OUT_WS_PIN, GPIO_MHL_I2S_OUT_WS_PIN_M_I2S3_WS); + mt_set_gpio_mode(GPIO_MHL_I2S_OUT_CK_PIN, GPIO_MHL_I2S_OUT_CK_PIN_M_I2S3_BCK); + mt_set_gpio_mode(GPIO_MHL_I2S_OUT_DAT_PIN, GPIO_MHL_I2S_OUT_DAT_PIN_M_I2S3_DO); +#else + printk("%s,%d Error. GPIO_MHL_I2S_OUT_WS_PIN is not defined\n", __func__, __LINE__); +#endif + } + else + { +#ifdef GPIO_MHL_I2S_OUT_WS_PIN + mt_set_gpio_pull_enable(GPIO_MHL_I2S_OUT_WS_PIN, GPIO_PULL_DISABLE); + mt_set_gpio_pull_enable(GPIO_MHL_I2S_OUT_CK_PIN, GPIO_PULL_DISABLE); + mt_set_gpio_pull_enable(GPIO_MHL_I2S_OUT_DAT_PIN, GPIO_PULL_DISABLE); +#endif + } +*/ + return 0; +} + +int get_hdmi_i2c_addr(void) +{ +// return (SII_I2C_ADDR); + return 0; +} + +int get_hdmi_i2c_channel(void) +{ +// return (HDMI_I2C_CHANNEL); + return 0; +} \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/hdmi/hdmi_cust.h b/arch/arm/mach-mt8127/ford/hdmi/hdmi_cust.h new file mode 100644 index 00000000000..e97a8981ea8 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/hdmi/hdmi_cust.h @@ -0,0 +1,47 @@ +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef HDMI_CUSTOMIZATION_H +#define HDMI_CUSTOMIZATION_H + +/****************************************************************** +** scale adjustment +******************************************************************/ +/* +#define USING_SCALE_ADJUSTMENT + +///if mhl chip CI2CA pin is pull up, the folloing should be defined. otherwise, please mask it. +#define SII_I2C_ADDR (0x72) +#define HDMI_I2C_CHANNEL 3 +*/ + + + +/****************************************************************** +** MHL GPIO Customization +******************************************************************/ +//#define MHL_PHONE_GPIO_REUSAGE +void ChangeGPIOToI2S(); +void ChangeI2SToGPIO(); + +int cust_hdmi_power_on(int on); + +int cust_hdmi_dpi_gpio_on(int on); + +int cust_hdmi_i2s_gpio_on(int on); + +int get_hdmi_i2c_addr(void); + +int get_hdmi_i2c_channel(void); + + +#endif diff --git a/arch/arm/mach-mt8127/ford/hdmi/inc/hdmi_drv.h b/arch/arm/mach-mt8127/ford/hdmi/inc/hdmi_drv.h new file mode 100644 index 00000000000..beb48034122 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/hdmi/inc/hdmi_drv.h @@ -0,0 +1,226 @@ +#ifndef __HDMI_DRV_H__ +#define __HDMI_DRV_H__ + +#ifdef CONFIG_MTK_MT8193_HDMI_SUPPORT + +#include "mt8193hdmictrl.h" +#include "mt8193edid.h" +#include "mt8193cec.h" + +#define AVD_TMR_ISR_TICKS 5 +#define MDI_BOUCING_TIMING 50//20 //20ms + +typedef enum +{ + HDMI_CEC_CMD=0, + HDMI_PLUG_DETECT_CMD, + HDMI_HDCP_PROTOCAL_CMD, + HDMI_DISABLE_HDMI_TASK_CMD, + MAX_HDMI_TMR_NUMBER + +}HDMI_TASK_COMMAND_TYPE_T; + +#endif + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +typedef enum +{ + HDMI_POLARITY_RISING = 0, + HDMI_POLARITY_FALLING = 1 +}HDMI_POLARITY; + +typedef enum +{ + HDMI_CLOCK_PHASE_0 = 0, + HDMI_CLOCK_PHASE_90 = 1 +}HDMI_CLOCK_PHASE; + +typedef enum +{ + HDMI_COLOR_ORDER_RGB = 0, + HDMI_COLOR_ORDER_BGR = 1 +}HDMI_COLOR_ORDER; + +typedef enum +{ + IO_DRIVING_CURRENT_8MA = (1 << 0), + IO_DRIVING_CURRENT_4MA = (1 << 1), + IO_DRIVING_CURRENT_2MA = (1 << 2), + IO_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), +}IO_DRIVING_CURRENT; + +#if !defined(CONFIG_MTK_MT8193_HDMI_SUPPORT) +typedef enum +{ + HDMI_VIDEO_720x480p_60Hz = 0, + HDMI_VIDEO_1280x720p_60Hz =2, + HDMI_VIDEO_1920x1080p_30Hz =6, + HDMI_VIDEO_RESOLUTION_NUM +}HDMI_VIDEO_RESOLUTION; +#endif + +typedef enum +{ + HDMI_VIN_FORMAT_RGB565, + HDMI_VIN_FORMAT_RGB666, + HDMI_VIN_FORMAT_RGB888, +} HDMI_VIDEO_INPUT_FORMAT; + +typedef enum +{ + HDMI_VOUT_FORMAT_RGB888, + HDMI_VOUT_FORMAT_YUV422, + HDMI_VOUT_FORMAT_YUV444, +}HDMI_VIDEO_OUTPUT_FORMAT; + +typedef enum +{ + HDMI_AUDIO_PCM_16bit_48000, + HDMI_AUDIO_PCM_16bit_44100, + HDMI_AUDIO_PCM_16bit_32000, + HDMI_AUDIO_SOURCE_STREAM, +}HDMI_AUDIO_FORMAT; + +typedef struct +{ + HDMI_VIDEO_RESOLUTION vformat; + HDMI_VIDEO_INPUT_FORMAT vin; + HDMI_VIDEO_OUTPUT_FORMAT vout; + HDMI_AUDIO_FORMAT aformat; +}HDMI_CONFIG; + +typedef enum{ + HDMI_OUTPUT_MODE_LCD_MIRROR, + HDMI_OUTPUT_MODE_VIDEO_MODE, + HDMI_OUTPUT_MODE_DPI_BYPASS +}HDMI_OUTPUT_MODE; + +typedef enum{ + HDMI_CABLE, + MHL_CABLE, + MHL_SMB_CABLE, + MHL_2_CABLE ///MHL 2.0 +}HDMI_CABLE_TYPE; + +typedef struct +{ + unsigned int width; + unsigned int height; + + HDMI_CONFIG init_config; + + /* polarity parameters */ + HDMI_POLARITY clk_pol; + HDMI_POLARITY de_pol; + HDMI_POLARITY vsync_pol; + HDMI_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + HDMI_COLOR_ORDER rgb_order; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + IO_DRIVING_CURRENT io_driving_current; + HDMI_OUTPUT_MODE output_mode; + + int is_force_awake; + int is_force_landscape; + + unsigned int scaling_factor; // determine the scaling of output screen size, valid value 0~10 + // 0 means no scaling, 5 means scaling to 95%, 10 means 90% + HDMI_CABLE_TYPE cabletype; + bool NeedSwHDCP; +}HDMI_PARAMS; + +typedef enum{ + HDMI_STATE_NO_DEVICE, + HDMI_STATE_ACTIVE, + HDMI_STATE_CONNECTING, + #if defined(CONFIG_MTK_MT8193_HDMI_SUPPORT) + HDMI_STATE_PLUGIN_ONLY, + HDMI_STATE_EDID_UPDATE, + HDMI_STATE_CEC_UPDATE + #endif +}HDMI_STATE; + +// --------------------------------------------------------------------------- + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + void (*wait_transfer_done)(void); + void (*state_callback)(HDMI_STATE state); +}HDMI_UTIL_FUNCS; + + +typedef struct +{ + void (*set_util_funcs)(const HDMI_UTIL_FUNCS *util); + void (*get_params)(HDMI_PARAMS *params); + + int (*init)(void); + int (*enter)(void); + int (*exit)(void); + void (*suspend)(void); + void (*resume)(void); + int (*audio_config)(HDMI_AUDIO_FORMAT aformat); + int (*video_config)(HDMI_VIDEO_RESOLUTION vformat, HDMI_VIDEO_INPUT_FORMAT vin, HDMI_VIDEO_OUTPUT_FORMAT vou); + int (*video_enable)(bool enable); + int (*audio_enable)(bool enable); + int (*irq_enable)(bool enable); + int (*power_on)(void); + void (*power_off)(void); + HDMI_STATE (*get_state)(void); + void (*set_mode)(unsigned char ucMode); + void (*dump)(void); + #if !defined(CONFIG_MTK_MT8193_HDMI_SUPPORT) + void (*read)(unsigned char u8Reg); + void (*write)(unsigned char u8Reg, unsigned char u8Data); + void (*log_enable)(bool enable); + #else + void (*read)(u16 u2Reg, u32 *p4Data); + void (*write)(u16 u2Reg, u32 u4Data); + void (*log_enable)(u16 enable); + void (*InfoframeSetting)(u8 i1typemode, u8 i1typeselect); + void (*checkedid)(u8 i1noedid); + void (*colordeep)(u8 u1colorspace, u8 u1deepcolor); + void (*enablehdcp)(u8 u1hdcponoff); + void (*setcecrxmode)(u8 u1cecrxmode); + void (*hdmistatus)(void); + void (*hdcpkey)(u8 *pbhdcpkey); + void (*getedid)(HDMI_EDID_INFO_T *pv_get_info); + void (*setcecla)(CEC_DRV_ADDR_CFG_T* prAddr); + void (*sendsltdata)(u8 *pu1Data); + void (*getceccmd)(CEC_FRAME_DESCRIPTION* frame); + void (*getsltdata)(CEC_SLT_DATA* rCecSltData); + void (*setceccmd)(CEC_SEND_MSG_T* msg); + void (*cecenable)(u8 u1EnCec); + void (*getcecaddr)(CEC_ADDRESS *cecaddr); + void (*mutehdmi)(u8 u1flagvideomute, u8 u1flagaudiomute); + #endif +} HDMI_DRIVER; + + +// --------------------------------------------------------------------------- +// HDMI Driver Functions +// --------------------------------------------------------------------------- + +const HDMI_DRIVER* HDMI_GetDriver(void); + +#endif // __HDMI_DRV_H__ diff --git a/arch/arm/mach-mt8127/ford/headset/Makefile b/arch/arm/mach-mt8127/ford/headset/Makefile new file mode 100755 index 00000000000..6cbe08cfb67 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/headset/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := accdet_custom.o + diff --git a/arch/arm/mach-mt8127/ford/headset/accdet_custom.c b/arch/arm/mach-mt8127/ford/headset/accdet_custom.c new file mode 100644 index 00000000000..cd763f30808 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/headset/accdet_custom.c @@ -0,0 +1,28 @@ +#include "accdet_custom_def.h" +#include + +//key press customization: long press time +struct headset_key_custom headset_key_custom_setting = { + 2000 +}; + +struct headset_key_custom* get_headset_key_custom_setting(void) +{ + return &headset_key_custom_setting; +} + +#ifdef ACCDET_MULTI_KEY_FEATURE +static struct headset_mode_settings cust_headset_settings = { + 0x900, 0x900, 1, 0x3f0, 0x800, 0x800, 0x20 +}; +#else +//headset mode register settings(for MT6575) +static struct headset_mode_settings cust_headset_settings = { + 0x900, 0x400, 1, 0x3f0, 0x3000, 0x3000, 0x20 +}; +#endif + +struct headset_mode_settings* get_cust_headset_settings(void) +{ + return &cust_headset_settings; +} \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/headset/accdet_custom.h b/arch/arm/mach-mt8127/ford/headset/accdet_custom.h new file mode 100644 index 00000000000..9cbde46a1a3 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/headset/accdet_custom.h @@ -0,0 +1,14 @@ +struct headset_mode_settings{ + int pwm_width; //pwm frequence + int pwm_thresh; //pwm duty + int fall_delay; //falling stable time + int rise_delay; //rising stable time + int debounce0; //hook switch or double check debounce + int debounce1; //mic bias debounce + int debounce3; //plug out debounce +}; + +//key press customization: long press time +struct headset_key_custom{ + int headset_long_press_time; +}; diff --git a/arch/arm/mach-mt8127/ford/headset/accdet_custom_def.h b/arch/arm/mach-mt8127/ford/headset/accdet_custom_def.h new file mode 100644 index 00000000000..bac773afd4d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/headset/accdet_custom_def.h @@ -0,0 +1,15 @@ +// use accdet + EINT solution +#define ACCDET_EINT +// support multi_key feature +#define ACCDET_MULTI_KEY_FEATURE +// after 5s disable accdet +#define ACCDET_LOW_POWER + +//#define ACCDET_PIN_RECOGNIZATION +#define ACCDET_28V_MODE + +#define ACCDET_SHORT_PLUGOUT_DEBOUNCE +#define ACCDET_SHORT_PLUGOUT_DEBOUNCE_CN 20 + +//extern struct headset_mode_settings* get_cust_headset_settings(void); +//extern int get_long_press_time_cust(void); \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/keypad/Makefile b/arch/arm/mach-mt8127/ford/keypad/Makefile new file mode 100755 index 00000000000..64e2e3df12a --- /dev/null +++ b/arch/arm/mach-mt8127/ford/keypad/Makefile @@ -0,0 +1,3 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := mtk_kpd_bkl.o diff --git a/arch/arm/mach-mt8127/ford/keypad/mtk_kpd.h b/arch/arm/mach-mt8127/ford/keypad/mtk_kpd.h new file mode 100644 index 00000000000..87c2e05a78c --- /dev/null +++ b/arch/arm/mach-mt8127/ford/keypad/mtk_kpd.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2010 MediaTek, Inc. + * + * Author: Terry Chang + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef _MTK_KPD_H_ +#define _MTK_KPD_H_ + +#include +#include +#include +#include +/* include PMIC header file */ +#include +#include +#include +#include +#include +#include +#include +#include + +#define KPD_PWRKEY_MAP KEY_POWER +#define KPD_PWRKEY_USE_EINT KPD_NO +#define KPD_PWRKEY_USE_PMIC KPD_YES +#define KPD_DRV_CTRL_BACKLIGHT KPD_NO /* retired, move to Lights framework */ +#define KPD_BACKLIGHT_TIME 8 /* sec */ +/* the keys can wake up the system and we should enable backlight */ +#define KPD_BACKLIGHT_WAKE_KEY \ +{ \ + KEY_ENDCALL, KEY_POWER, \ +} + +#ifdef CONFIG_MTK_HALL_SENSOR +#define KPD_HAS_SLIDE_QWERTY KPD_YES +#else +#define KPD_HAS_SLIDE_QWERTY KPD_No +#endif + +#if 0 +static inline bool powerOn_slidePin_interface() { + return hwPowerOn(MT65XX_POWER_LDO_VCAM_IO, VOL_2800, "Qwerty slide"); +} +static inline bool powerOff_slidePin_interface(){ + return hwPowerDown(MT65XX_POWER_LDO_VCAM_IO, "Qwerty slide"); +} +#endif +#define CUST_EINT_KPD_SLIDE_POLARITY 0 +#define KPD_SLIDE_EINT CUST_EINT_KPD_SLIDE_NUM +#define KPD_SLIDE_DEBOUNCE CUST_EINT_KPD_SLIDE_DEBOUNCE_CN /* ms */ +#define KPD_SLIDE_POLARITY CUST_EINT_KPD_SLIDE_POLARITY +#define KPD_SLIDE_SENSITIVE CUST_EINT_KPD_SLIDE_SENSITIVE + +#if KPD_DRV_CTRL_BACKLIGHT +extern void kpd_enable_backlight(void); +extern void kpd_disable_backlight(void); +extern void kpd_backlight_handler(bool pressed, u16 linux_keycode); +#else +#define kpd_enable_backlight() do {} while (0) +#define kpd_disable_backlight() do {} while (0) +#define kpd_backlight_handler(pressed, linux_keycode) do {} while (0) +#endif + +/* for META tool */ +extern void kpd_set_backlight(bool onoff, void *val1, void *val2); + +#if KPD_PWRKEY_USE_PMIC +void kpd_pwrkey_pmic_handler(unsigned long pressed); +#else +static inline void kpd_pwrkey_pmic_handler(unsigned long data){} +#endif + +void kpd_pmic_rstkey_handler(unsigned long pressed); + +#define ONEKEY_REBOOT_NORMAL_MODE +//#define TWOKEY_REBOOT_NORMAL_MODE +#define ONEKEY_REBOOT_OTHER_MODE +//#define TWOKEY_REBOOT_OTHER_MODE +#define KPD_PMIC_RSTKEY_MAP KEY_VOLUMEDOWN +#define KPD_PMIC_LPRST_TD 1 /* timeout period. 0: 7sec; 1: 11sec; 2: 14sec; 3: 5sec */ + +#endif diff --git a/arch/arm/mach-mt8127/ford/keypad/mtk_kpd_bkl.c b/arch/arm/mach-mt8127/ford/keypad/mtk_kpd_bkl.c new file mode 100644 index 00000000000..3b81032692b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/keypad/mtk_kpd_bkl.c @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2010 MediaTek, Inc. + * + * Author: Terry Chang + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include /* custom file */ + +#if KPD_DRV_CTRL_BACKLIGHT +void kpd_enable_backlight(void) +{ + /*mt6326_kpled_dim_duty_Full(); + mt6326_kpled_Enable();*/ +} + +void kpd_disable_backlight(void) +{ + /*mt6326_kpled_dim_duty_0(); + mt6326_kpled_Disable();*/ +} +#endif + +/* for META tool */ +void kpd_set_backlight(bool onoff, void *val1, void *val2) +{ + /*u8 div = *(u8 *)val1; + u8 duty = *(u8 *)val2; + + if (div > 15) + div = 15; + pmic_kp_dim_div(div); + + if (duty > 31) + duty = 31; + pmic_kp_dim_duty(duty); + + if (onoff) + mt6326_kpled_Enable(); + else + mt6326_kpled_Disable();*/ +} diff --git a/arch/arm/mach-mt8127/ford/lcm/CPT_CLAP070WP03XG_LVDS.c b/arch/arm/mach-mt8127/ford/lcm/CPT_CLAP070WP03XG_LVDS.c new file mode 100644 index 00000000000..57ce37ed11e --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lcm/CPT_CLAP070WP03XG_LVDS.c @@ -0,0 +1,391 @@ +#ifndef BUILD_LK +#include +#endif +#ifdef BUILD_LK +#include +#include +#include +#include + +#elif (defined BUILD_UBOOT) +#include +#else +#include +#include +#include +#endif +#include "lcm_drv.h" +#include "mt8193_lvds.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#if defined(MTK_ALPS_BOX_SUPPORT) +/*for 8127 box hdmi main path */ +#define FRAME_WIDTH (1920) +#define FRAME_HEIGHT (1080) +#else +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (1280) +#endif + +//#define GPIO_LCD_RST_EN GPIO90 +//#define GPIO_LCD_STB_EN GPIO89 + + +#ifdef GPIO_LCM_PWR +#define GPIO_LCD_PWR GPIO_LCM_PWR +#else +#define GPIO_LCD_PWR 0xFFFFFFFF +#endif + +#ifdef GPIO_LCM_PWR_EN +#define GPIO_LCD_PWR_EN GPIO_LCM_PWR_EN +#else +#define GPIO_LCD_PWR_EN 0xFFFFFFFF +#endif + +#ifdef GPIO_LCM_PWR2_EN +#define GPIO_LCD_PWR2_EN GPIO_LCM_PWR2_EN +#else +#define GPIO_LCD_PWR2_EN 0xFFFFFFFF +#endif + + +#ifdef GPIO_LCM_RST +#define GPIO_LCD_RST_EN GPIO_LCM_RST +#else +#define GPIO_LCD_RST_EN 0xFFFFFFFF +#endif + +#ifdef GPIO_LCM_STB +#define GPIO_LCD_STB_EN GPIO_LCM_STB +#else +#define GPIO_LCD_STB_EN 0xFFFFFFFF +#endif + + +#ifdef GPIO_LCM_LVL_SHIFT_EN +#define GPIO_SHIFT_EN GPIO_LCM_LVL_SHIFT_EN +#else +#define GPIO_SHIFT_EN 0xFFFFFFFF +#endif + +#ifdef GPIO_LCM_BL_EN +#define GPIO_LCD_BL_EN GPIO_LCM_BL_EN +#else +#define GPIO_LCD_BL_EN 0xFFFFFFFF +#endif + + +#ifdef GPIO_LCM_BRIDGE_EN +#define GPIO_LCD_BRIDGE_EN GPIO_LCM_BRIDGE_EN +#else +#define GPIO_LCD_BRIDGE_EN 0xFFFFFFFF +#endif + + + +#define HSYNC_PULSE_WIDTH 16 +#define HSYNC_BACK_PORCH 16 +#define HSYNC_FRONT_PORCH 32 +#define VSYNC_PULSE_WIDTH 2 +#define VSYNC_BACK_PORCH 2 +#define VSYNC_FRONT_PORCH 4 + + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (mt_set_reset_pin((v))) + +#define UDELAY(n) +#define MDELAY(n) + + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +static __inline void send_ctrl_cmd(unsigned int cmd) +{ + +} + +static __inline void send_data_cmd(unsigned int data) +{ + +} + +static __inline void set_lcm_register(unsigned int regIndex, + unsigned int regData) +{ + +} + + +static void lcm_set_gpio_output(unsigned int GPIO, unsigned int output) +{ + + if(GPIO == 0xFFFFFFFF) + { + #ifdef BUILD_LK + printf("[LK/LCM] GPIO_LCD_PWR = 0x%x \n",GPIO_LCD_PWR); + printf("[LK/LCM] GPIO_LCD_PWR_EN = 0x%x\n",GPIO_LCD_PWR_EN); + printf("[LK/LCM] GPIO_LCD_PWR2_EN = 0x%x \n",GPIO_LCD_PWR2_EN); + printf("[LK/LCM] GPIO_LCD_RST_EN = 0x%x \n",GPIO_LCD_RST_EN); + printf("[LK/LCM] GPIO_LCD_STB_EN = 0x%x\n",GPIO_LCD_STB_EN); + printf("[LK/LCM] GPIO_SHIFT_EN = 0x%x\n",GPIO_SHIFT_EN); + printf("[LK/LCM] GPIO_LCD_BL_EN = 0x%x\n",GPIO_LCD_BL_EN); + printf("[LK/LCM] GPIO_LCD_BRIDGE_EN = 0x%x \n",GPIO_LCD_BRIDGE_EN); + + #elif (defined BUILD_UBOOT) + // do nothing in uboot + #else + //printf("kernel] lcm_set gpio() \n"); + #endif + return; + } + + mt_set_gpio_mode(GPIO, GPIO_MODE_00); + mt_set_gpio_dir(GPIO, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO, (output>0)? GPIO_OUT_ONE: GPIO_OUT_ZERO); +} + + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->dpi.PLL_CLOCK = 67; //67MHz + + + /* RGB interface configurations */ + params->dpi.mipi_pll_clk_ref = 0; + params->dpi.mipi_pll_clk_div1 = 0x80000101; //lvds pll 65M + params->dpi.mipi_pll_clk_div2 = 0x800a0000; + //params->dpi.dpi_clk_div = 2; + //params->dpi.dpi_clk_duty = 1; + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = HSYNC_PULSE_WIDTH; + params->dpi.hsync_back_porch = HSYNC_BACK_PORCH; + params->dpi.hsync_front_porch = HSYNC_FRONT_PORCH; + params->dpi.vsync_pulse_width = VSYNC_PULSE_WIDTH; + params->dpi.vsync_back_porch = VSYNC_BACK_PORCH; + params->dpi.vsync_front_porch = VSYNC_FRONT_PORCH; + + + //params->dpi.i2x_en = 1; + params->dpi.lvds_tx_en = 1; + params->dpi.ssc_disable = 1; + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 0; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_init() enter\n"); + +lcm_set_gpio_output(GPIO_LCD_PWR, 1); +lcm_set_gpio_output(GPIO_LCD_PWR_EN, 0); +lcm_set_gpio_output(GPIO_LCD_PWR2_EN, 1); + +//VGP6 3.3V +//pmic_config_interface(0x424, 0x1, 0x1, 15); +//pmic_config_interface(0x45a, 0x07, 0x07, 5); + +#ifdef CONFIG_MTK_PMIC_MT6397 + upmu_set_rg_vgp6_vosel(0x7); + upmu_set_rg_vgp6_sw_en(0x1); +#else + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); +#endif +//hwPowerOn(MT65XX_POWER_LDO_VGP6, VOL_3300, "LCM"); + +lcm_set_gpio_output(GPIO_LCD_RST_EN,GPIO_OUT_ONE); + +MDELAY(20); + +lcm_set_gpio_output(GPIO_LCD_STB_EN,GPIO_OUT_ONE); + +MDELAY(20); + +lcm_set_gpio_output(GPIO_LCD_BL_EN, GPIO_OUT_ONE); + + +#elif (defined BUILD_UBOOT) + // do nothing in uboot +#else + printk("[LCM] lcm_init() enter\n"); + +lcm_set_gpio_output(GPIO_LCD_RST_EN,GPIO_OUT_ONE); + + + MDELAY(20); + +lcm_set_gpio_output(GPIO_LCD_STB_EN,GPIO_OUT_ONE); + + + MDELAY(20); + +lcm_set_gpio_output(GPIO_LCD_BL_EN, GPIO_OUT_ONE); + + +#endif + +} + + +static void lcm_suspend(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_suspend() enter\n"); + +lcm_set_gpio_output(GPIO_LCD_BL_EN, 0); +MDELAY(20); + + + +lcm_set_gpio_output(GPIO_LCD_RST_EN,GPIO_OUT_ZERO); +lcm_set_gpio_output(GPIO_LCD_STB_EN,GPIO_OUT_ZERO); + +lcm_set_gpio_output(GPIO_LCD_PWR, 0); +lcm_set_gpio_output(GPIO_LCD_PWR_EN, 0); +lcm_set_gpio_output(GPIO_LCD_PWR2_EN, 0); + + +MDELAY(20); + +#elif (defined BUILD_UBOOT) + // do nothing in uboot +#else + printk("[LCM] lcm_suspend() enter\n"); + + lcm_set_gpio_output(GPIO_LCD_BL_EN, 0); + + MDELAY(20); + +lcm_set_gpio_output(GPIO_LCD_RST_EN,GPIO_OUT_ZERO); +lcm_set_gpio_output(GPIO_LCD_STB_EN,GPIO_OUT_ZERO); + + lcm_set_gpio_output(GPIO_LCD_PWR, 0); + lcm_set_gpio_output(GPIO_LCD_PWR_EN, 0); + lcm_set_gpio_output(GPIO_LCD_PWR2_EN, 0); + + MDELAY(20); +#ifdef CONFIG_MTK_PMIC_MT6397 + hwPowerDown(MT65XX_POWER_LDO_VGP6, "LCM");// +#else + hwPowerDown(MT6323_POWER_LDO_VGP1, "LCM");// +#endif + + MDELAY(20); + +#endif + +} + + +static void lcm_resume(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_resume() enter\n"); +//VGP6 3.3V + +#ifdef CONFIG_MTK_PMIC_MT6397 + upmu_set_rg_vgp6_vosel(0x7); + upmu_set_rg_vgp6_sw_en(0x1); +#else + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); +#endif +//pmic_config_interface(0x424, 0x1, 0x1, 15); +//pmic_config_interface(0x45a, 0x07, 0x07, 5); + +// hwPowerOn(MT65XX_POWER_LDO_VGP6, VOL_3300, "LCM"); + + lcm_set_gpio_output(GPIO_LCD_STB_EN,GPIO_OUT_ONE); + MDELAY(20); + + lcm_set_gpio_output(GPIO_LCD_PWR, 1); + lcm_set_gpio_output(GPIO_LCD_PWR_EN, 1); + lcm_set_gpio_output(GPIO_LCD_PWR2_EN, 1); + + MDELAY(5); + + + lcm_set_gpio_output(GPIO_LCD_RST_EN,GPIO_OUT_ONE); + MDELAY(20); + + lcm_set_gpio_output(GPIO_LCD_BL_EN, 1); + +#elif (defined BUILD_UBOOT) + // do nothing in uboot +#else + printk("[LCM] lcm_resume() enter\n"); + +#ifdef CONFIG_MTK_PMIC_MT6397 + hwPowerOn(MT65XX_POWER_LDO_VGP6, VOL_3300, "LCM"); +#else + hwPowerOn(MT6323_POWER_LDO_VGP1, VOL_3300, "LCM"); +#endif + lcm_set_gpio_output(GPIO_LCD_PWR, 1); + lcm_set_gpio_output(GPIO_LCD_PWR_EN, 1); + lcm_set_gpio_output(GPIO_LCD_PWR2_EN, 1); + + MDELAY(5); + + lcm_set_gpio_output(GPIO_LCD_STB_EN, 1); + MDELAY(5); + lcm_set_gpio_output(GPIO_LCD_RST_EN, 1); + MDELAY(20); + + + lcm_set_gpio_output(GPIO_LCD_BL_EN, 1); + +#endif + +} + +LCM_DRIVER cpt_clap070wp03xg_lvds_lcm_drv = +{ + .name = "cpt_clap070wp03xg_lvds", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, +}; + diff --git a/arch/arm/mach-mt8127/ford/lcm/Makefile b/arch/arm/mach-mt8127/ford/lcm/Makefile new file mode 100755 index 00000000000..1df98423dcc --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lcm/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := CPT_CLAP070WP03XG_LVDS.o +obj-y += mt65xx_lcm_list.o diff --git a/arch/arm/mach-mt8127/ford/lcm/inc/lcm_drv.h b/arch/arm/mach-mt8127/ford/lcm/inc/lcm_drv.h new file mode 100644 index 00000000000..033cfc6cad2 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lcm/inc/lcm_drv.h @@ -0,0 +1,634 @@ +#ifndef __LCM_DRV_H__ +#define __LCM_DRV_H__ + + +// --------------------------------------------------------------------------- + +#ifndef ARY_SIZE +#define ARY_SIZE(x) (sizeof((x)) / sizeof((x[0]))) +#endif + +// --------------------------------------------------------------------------- + +/* common enumerations */ + +typedef enum +{ + LCM_TYPE_DBI = 0, + LCM_TYPE_DPI, + LCM_TYPE_DSI +} LCM_TYPE; + + +typedef enum +{ + LCM_CTRL_NONE = 0, + LCM_CTRL_SERIAL_DBI, + LCM_CTRL_PARALLEL_DBI, + LCM_CTRL_GPIO +} LCM_CTRL; + + +typedef enum +{ + LCM_POLARITY_RISING = 0, + LCM_POLARITY_FALLING = 1 +} LCM_POLARITY; + + +typedef enum +{ + LCM_CLOCK_PHASE_0 = 0, + LCM_CLOCK_PHASE_90 = 1 +} LCM_CLOCK_PHASE; + + +typedef enum +{ + LCM_COLOR_ORDER_RGB = 0, + LCM_COLOR_ORDER_BGR = 1 +} LCM_COLOR_ORDER; + + +typedef enum +{ + LCM_DRIVING_CURRENT_DEFAULT, + LCM_DRIVING_CURRENT_8MA = (1 << 0), + LCM_DRIVING_CURRENT_4MA = (1 << 1), + LCM_DRIVING_CURRENT_2MA = (1 << 2), + LCM_DRIVING_CURRENT_SLEW_CNTL = (1 << 3), + LCM_DRIVING_CURRENT_6575_4MA = (1 << 4), + LCM_DRIVING_CURRENT_6575_8MA = (3 << 4), + LCM_DRIVING_CURRENT_6575_12MA = (2 << 4), + LCM_DRIVING_CURRENT_6575_16MA = (4 << 4), + LCM_DRIVING_CURRENT_6MA, + LCM_DRIVING_CURRENT_12MA, + LCM_DRIVING_CURRENT_16MA +} LCM_DRIVING_CURRENT; + +typedef enum{ + LCM_INTERFACE_NOTDEFINED = 0, + LCM_INTERFACE_DSI0, + LCM_INTERFACE_DSI1, + LCM_INTERFACE_DSI_DUAL, + LCM_INTERFACE_DPI0, + LCM_INTERFACE_DPI1, + LCM_INTERFACE_DBI0 +}LCM_INTERFACE_ID; + +typedef enum{ + LCM_IOCTL_NULL = 0, +}LCM_IOCTL; + +/* DBI related enumerations */ + +typedef enum +{ + LCM_DBI_CLOCK_FREQ_104M = 0, + LCM_DBI_CLOCK_FREQ_52M, + LCM_DBI_CLOCK_FREQ_26M, + LCM_DBI_CLOCK_FREQ_13M, + LCM_DBI_CLOCK_FREQ_7M +} LCM_DBI_CLOCK_FREQ; + + +typedef enum +{ + LCM_DBI_DATA_WIDTH_8BITS = 0, + LCM_DBI_DATA_WIDTH_9BITS = 1, + LCM_DBI_DATA_WIDTH_16BITS = 2, + LCM_DBI_DATA_WIDTH_18BITS = 3, + LCM_DBI_DATA_WIDTH_24BITS = 4, + LCM_DBI_DATA_WIDTH_32BITS = 5 +} LCM_DBI_DATA_WIDTH; + + +typedef enum +{ + LCM_DBI_CPU_WRITE_8_BITS = 8, + LCM_DBI_CPU_WRITE_16_BITS = 16, + LCM_DBI_CPU_WRITE_32_BITS = 32, +} LCM_DBI_CPU_WRITE_BITS; + + +typedef enum +{ + LCM_DBI_FORMAT_RGB332 = 0, + LCM_DBI_FORMAT_RGB444 = 1, + LCM_DBI_FORMAT_RGB565 = 2, + LCM_DBI_FORMAT_RGB666 = 3, + LCM_DBI_FORMAT_RGB888 = 4 +} LCM_DBI_FORMAT; + + +typedef enum +{ + LCM_DBI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DBI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DBI_TRANS_SEQ; + + +typedef enum +{ + LCM_DBI_PADDING_ON_LSB = 0, + LCM_DBI_PADDING_ON_MSB = 1 +} LCM_DBI_PADDING; + + +typedef enum +{ + LCM_DBI_TE_MODE_DISABLED = 0, + LCM_DBI_TE_MODE_VSYNC_ONLY = 1, + LCM_DBI_TE_MODE_VSYNC_OR_HSYNC = 2, +} LCM_DBI_TE_MODE; + + +typedef enum +{ + LCM_DBI_TE_VS_WIDTH_CNT_DIV_8 = 0, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_16 = 1, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_32 = 2, + LCM_DBI_TE_VS_WIDTH_CNT_DIV_64 = 3, +} LCM_DBI_TE_VS_WIDTH_CNT_DIV; + + +/* DPI related enumerations */ + +typedef enum +{ + LCM_DPI_FORMAT_RGB565 = 0, + LCM_DPI_FORMAT_RGB666 = 1, + LCM_DPI_FORMAT_RGB888 = 2 +} LCM_DPI_FORMAT; + +typedef enum +{ + LCM_SERIAL_CLOCK_FREQ_104M = 0, + LCM_SERIAL_CLOCK_FREQ_26M, + LCM_SERIAL_CLOCK_FREQ_52M +} LCM_SERIAL_CLOCK_FREQ; + +typedef enum +{ + LCM_SERIAL_CLOCK_DIV_2 = 0, + LCM_SERIAL_CLOCK_DIV_4 = 1, + LCM_SERIAL_CLOCK_DIV_8 = 2, + LCM_SERIAL_CLOCK_DIV_16 = 3, +} LCM_SERIAL_CLOCK_DIV; + + +/* DSI related enumerations */ + +typedef enum +{ + CMD_MODE = 0, + SYNC_PULSE_VDO_MODE = 1, + SYNC_EVENT_VDO_MODE = 2, + BURST_VDO_MODE = 3 +} LCM_DSI_MODE_CON; + + +typedef enum +{ + LCM_ONE_LANE = 1, + LCM_TWO_LANE = 2, + LCM_THREE_LANE = 3, + LCM_FOUR_LANE = 4, +} LCM_LANE_NUM; + + +typedef enum +{ + LCM_DSI_FORMAT_RGB565 = 0, + LCM_DSI_FORMAT_RGB666 = 1, + LCM_DSI_FORMAT_RGB888 = 2 +} LCM_DSI_FORMAT; + + +typedef enum +{ + LCM_DSI_TRANS_SEQ_MSB_FIRST = 0, + LCM_DSI_TRANS_SEQ_LSB_FIRST = 1 +} LCM_DSI_TRANS_SEQ; + + +typedef enum +{ + LCM_DSI_PADDING_ON_LSB = 0, + LCM_DSI_PADDING_ON_MSB = 1 +} LCM_DSI_PADDING; + + +typedef enum +{ + LCM_PACKED_PS_16BIT_RGB565=0, + LCM_LOOSELY_PS_18BIT_RGB666=1, + LCM_PACKED_PS_24BIT_RGB888=2, + LCM_PACKED_PS_18BIT_RGB666=3 +} LCM_PS_TYPE; + +typedef enum +{ + LCM_DSI_6589_PLL_CLOCK_NULL = 0, + LCM_DSI_6589_PLL_CLOCK_201_5 = 1, + LCM_DSI_6589_PLL_CLOCK_208 = 2, + LCM_DSI_6589_PLL_CLOCK_214_5 = 3, + LCM_DSI_6589_PLL_CLOCK_221 = 4, + LCM_DSI_6589_PLL_CLOCK_227_5 = 5, + LCM_DSI_6589_PLL_CLOCK_234 = 6, + LCM_DSI_6589_PLL_CLOCK_240_5 = 7, + LCM_DSI_6589_PLL_CLOCK_247 = 8, + LCM_DSI_6589_PLL_CLOCK_253_5 = 9, + LCM_DSI_6589_PLL_CLOCK_260 = 10, + LCM_DSI_6589_PLL_CLOCK_266_5 = 11, + LCM_DSI_6589_PLL_CLOCK_273 = 12, + LCM_DSI_6589_PLL_CLOCK_279_5 = 13, + LCM_DSI_6589_PLL_CLOCK_286 = 14, + LCM_DSI_6589_PLL_CLOCK_292_5 = 15, + LCM_DSI_6589_PLL_CLOCK_299 = 16, + LCM_DSI_6589_PLL_CLOCK_305_5 = 17, + LCM_DSI_6589_PLL_CLOCK_312 = 18, + LCM_DSI_6589_PLL_CLOCK_318_5 = 19, + LCM_DSI_6589_PLL_CLOCK_325 = 20, + LCM_DSI_6589_PLL_CLOCK_331_5 = 21, + LCM_DSI_6589_PLL_CLOCK_338 = 22, + LCM_DSI_6589_PLL_CLOCK_344_5 = 23, + LCM_DSI_6589_PLL_CLOCK_351 = 24, + LCM_DSI_6589_PLL_CLOCK_357_5 = 25, + LCM_DSI_6589_PLL_CLOCK_364 = 26, + LCM_DSI_6589_PLL_CLOCK_370_5 = 27, + LCM_DSI_6589_PLL_CLOCK_377 = 28, + LCM_DSI_6589_PLL_CLOCK_383_5 = 29, + LCM_DSI_6589_PLL_CLOCK_390 = 30, + LCM_DSI_6589_PLL_CLOCK_396_5 = 31, + LCM_DSI_6589_PLL_CLOCK_403 = 32, + LCM_DSI_6589_PLL_CLOCK_409_5 = 33, + LCM_DSI_6589_PLL_CLOCK_416 = 34, + LCM_DSI_6589_PLL_CLOCK_422_5 = 35, + LCM_DSI_6589_PLL_CLOCK_429 = 36, + LCM_DSI_6589_PLL_CLOCK_435_5 = 37, + LCM_DSI_6589_PLL_CLOCK_442 = 38, + LCM_DSI_6589_PLL_CLOCK_448_5 = 39, + LCM_DSI_6589_PLL_CLOCK_455 = 40, + LCM_DSI_6589_PLL_CLOCK_461_5 = 41, + LCM_DSI_6589_PLL_CLOCK_468 = 42, + LCM_DSI_6589_PLL_CLOCK_474_5 = 43, + LCM_DSI_6589_PLL_CLOCK_481 = 44, + LCM_DSI_6589_PLL_CLOCK_487_5 = 45, + LCM_DSI_6589_PLL_CLOCK_494 = 46, + LCM_DSI_6589_PLL_CLOCK_500_5 = 47, + LCM_DSI_6589_PLL_CLOCK_507 = 48, + LCM_DSI_6589_PLL_CLOCK_513_5 = 49, + LCM_DSI_6589_PLL_CLOCK_520 = 50, +} LCM_DSI_PLL_CLOCK; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DBI_TRANS_SEQ trans_seq; + LCM_DBI_PADDING padding; + LCM_DBI_FORMAT format; + LCM_DBI_DATA_WIDTH width; +} LCM_DBI_DATA_FORMAT; + + +typedef struct +{ + LCM_POLARITY cs_polarity; + LCM_POLARITY clk_polarity; + LCM_CLOCK_PHASE clk_phase; + unsigned int is_non_dbi_mode; + + LCM_SERIAL_CLOCK_FREQ clock_base; + LCM_SERIAL_CLOCK_DIV clock_div; +////////////////////////////////////MT6575 added params, and if lcm driver is for 6575, only care these below params + unsigned int css; + unsigned int csh; + unsigned int rd_1st; + unsigned int rd_2nd; + unsigned int wr_1st; + unsigned int wr_2nd; + + unsigned int sif_3wire; + unsigned int sif_sdi; + LCM_POLARITY sif_1st_pol; + LCM_POLARITY sif_sck_def; + unsigned int sif_div2; + unsigned int sif_hw_cs; +//////////////////////////////////// +} LCM_DBI_SERIAL_PARAMS; + + +typedef struct +{ + /* timing parameters */ + unsigned int write_setup; + unsigned int write_hold; + unsigned int write_wait; + unsigned int read_setup; + unsigned int read_hold; + unsigned int read_latency; + unsigned int wait_period; + /*only for 6575*/ + unsigned int cs_high_width; +} LCM_DBI_PARALLEL_PARAMS; + + +typedef struct +{ + LCM_COLOR_ORDER color_order; + LCM_DSI_TRANS_SEQ trans_seq; + LCM_DSI_PADDING padding; + LCM_DSI_FORMAT format; +} LCM_DSI_DATA_FORMAT; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + /* common parameters for serial & parallel interface */ + unsigned int port; + LCM_DBI_CLOCK_FREQ clock_freq; + LCM_DBI_DATA_WIDTH data_width; + LCM_DBI_DATA_FORMAT data_format; + LCM_DBI_CPU_WRITE_BITS cpu_write_bits; + LCM_DRIVING_CURRENT io_driving_current; + LCM_DRIVING_CURRENT msb_io_driving_current; + + /* tearing control */ + LCM_DBI_TE_MODE te_mode; + LCM_POLARITY te_edge_polarity; + unsigned int te_hs_delay_cnt; + unsigned int te_vs_width_cnt; + LCM_DBI_TE_VS_WIDTH_CNT_DIV te_vs_width_cnt_div; + + /* particular parameters for serial & parallel interface */ + LCM_DBI_SERIAL_PARAMS serial; + LCM_DBI_PARALLEL_PARAMS parallel; +} LCM_DBI_PARAMS; + + +typedef struct +{ + /* + Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 + / (mipi_pll_clk_ref + 1) + / (2 * mipi_pll_clk_div2) + / dpi_clk_div + */ + unsigned int mipi_pll_clk_ref; // 0..1 + unsigned int mipi_pll_clk_div1; // 0..63 + unsigned int mipi_pll_clk_div2; // 0..15 + unsigned int mipi_pll_clk_fbk_div; //PCLK=> 8: 26MHz, 10: 35MHz, 12: 40MHz + unsigned int dpi_clk_div; // 2..32 + unsigned int dpi_clk_duty; // (dpi_clk_div - 1) .. 31 + unsigned int PLL_CLOCK; + unsigned int dpi_clock; + unsigned int ssc_disable; + unsigned int ssc_range; + + unsigned int width; + unsigned int height; + unsigned int bg_width; + unsigned int bg_height; + + /* polarity parameters */ + LCM_POLARITY clk_pol; + LCM_POLARITY de_pol; + LCM_POLARITY vsync_pol; + LCM_POLARITY hsync_pol; + + /* timing parameters */ + unsigned int hsync_pulse_width; + unsigned int hsync_back_porch; + unsigned int hsync_front_porch; + unsigned int vsync_pulse_width; + unsigned int vsync_back_porch; + unsigned int vsync_front_porch; + + /* output format parameters */ + LCM_DPI_FORMAT format; + LCM_COLOR_ORDER rgb_order; + unsigned int is_serial_output; + unsigned int i2x_en; + unsigned int i2x_edge; + unsigned int embsync; + unsigned int lvds_tx_en; + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + /* iopad parameters */ + LCM_DRIVING_CURRENT io_driving_current; + LCM_DRIVING_CURRENT lsb_io_driving_current; + +} LCM_DPI_PARAMS; + + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_DSI_MODE_CON mode; + unsigned int DSI_WMEM_CONTI; + unsigned int DSI_RMEM_CONTI; + unsigned int VC_NUM; + + LCM_LANE_NUM LANE_NUM; + LCM_DSI_DATA_FORMAT data_format; + + /* intermediate buffers parameters */ + unsigned int intermediat_buffer_num; // 2..3 + + LCM_PS_TYPE PS; + unsigned int word_count; + + unsigned int packet_size; + + unsigned int vertical_sync_active; + unsigned int vertical_backporch; + unsigned int vertical_frontporch; + unsigned int vertical_active_line; + + unsigned int horizontal_sync_active; + unsigned int horizontal_backporch; + unsigned int horizontal_frontporch; + unsigned int horizontal_blanking_pixel; + unsigned int horizontal_active_pixel; + unsigned int horizontal_bllp; + + unsigned int line_byte; + unsigned int horizontal_sync_active_byte; + unsigned int horizontal_backporch_byte; + unsigned int horizontal_frontporch_byte; + unsigned int rgb_byte; + + unsigned int horizontal_sync_active_word_count; + unsigned int horizontal_backporch_word_count; + unsigned int horizontal_frontporch_word_count; + + unsigned char HS_TRAIL; + unsigned char HS_ZERO; + unsigned char HS_PRPR; + unsigned char LPX; + + unsigned char TA_SACK; + unsigned char TA_GET; + unsigned char TA_SURE; + unsigned char TA_GO; + + unsigned char CLK_TRAIL; + unsigned char CLK_ZERO; + unsigned char LPX_WAIT; + unsigned char CONT_DET; + + unsigned char CLK_HS_PRPR; + unsigned char CLK_HS_POST; + unsigned char DA_HS_EXIT; + unsigned char CLK_HS_EXIT; + + unsigned int pll_select; + unsigned int pll_div1; + unsigned int pll_div2; + unsigned int fbk_div; + unsigned int fbk_sel; + unsigned int rg_bir; + unsigned int rg_bic; + unsigned int rg_bp; + unsigned int PLL_CLOCK; + unsigned int dsi_clock; + unsigned int ssc_disable; + unsigned int ssc_range; + unsigned int compatibility_for_nvk; + unsigned int cont_clock; + unsigned int ufoe_enable; + + unsigned int lcm_int_te_monitor; + unsigned int lcm_int_te_period; + + unsigned int lcm_ext_te_monitor; + unsigned int lcm_ext_te_enable; + + unsigned int noncont_clock; + unsigned int noncont_clock_period; + +} LCM_DSI_PARAMS; + +// --------------------------------------------------------------------------- + +typedef struct +{ + LCM_TYPE type; + LCM_CTRL ctrl; //! how to control LCM registers + LCM_INTERFACE_ID lcm_if; + LCM_INTERFACE_ID lcm_cmd_if; + /* common parameters */ + unsigned int width; + unsigned int height; + unsigned int io_select_mode; //DBI or DPI should select IO mode according to chip spec + + /* particular parameters */ + LCM_DBI_PARAMS dbi; + LCM_DPI_PARAMS dpi; + LCM_DSI_PARAMS dsi; + unsigned int physical_width; + unsigned int physical_height; + unsigned int od_table_size; + void *od_table; +} LCM_PARAMS; + + +// --------------------------------------------------------------------------- + +#define REGFLAG_ESCAPE_ID (0x00) +#define REGFLAG_DELAY_MS_V3 (0xFF) + +typedef struct { + unsigned char id; + unsigned char cmd; + unsigned char count; + unsigned char para_list[128]; +} LCM_setting_table_V3; + +typedef struct +{ + void (*set_reset_pin)(unsigned int value); + void (*set_chip_select)(unsigned int value); + int (*set_gpio_out)(unsigned int gpio, unsigned int value); + + void (*udelay)(unsigned int us); + void (*mdelay)(unsigned int ms); + + void (*send_cmd)(unsigned int cmd); + void (*send_data)(unsigned int data); + unsigned int (*read_data)(void); + + void (*dsi_set_cmdq_V3)(LCM_setting_table_V3 *para_list, unsigned int size, unsigned char force_update); + void (*dsi_set_cmdq_V2)(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update); + void (*dsi_set_cmdq)(unsigned int *pdata, unsigned int queue_size, unsigned char force_update); + void (*dsi_write_cmd)(unsigned int cmd); + void (*dsi_write_regs)(unsigned int addr, unsigned int *para, unsigned int nums); + unsigned int (*dsi_read_reg)(void); + unsigned int (*dsi_dcs_read_lcm_reg)(unsigned char cmd); + unsigned int (*dsi_dcs_read_lcm_reg_v2)(unsigned char cmd, unsigned char *buffer, unsigned char buffer_size); + void (*wait_transfer_done)(void); + + /** FIXME: GPIO mode should not be configured in lcm driver + REMOVE ME after GPIO customization is done + */ + int (*set_gpio_mode)(unsigned int pin, unsigned int mode); + int (*set_gpio_dir)(unsigned int pin, unsigned int dir); + int (*set_gpio_pull_enable)(unsigned int pin, unsigned char pull_en); + +} LCM_UTIL_FUNCS; +typedef enum +{ + LCM_DRV_IOCTL_ENABLE_CMD_MODE = 0x100, +}LCM_DRV_IOCTL_CMD; + +typedef struct +{ + const char* name; + void (*set_util_funcs)(const LCM_UTIL_FUNCS *util); + void (*get_params)(LCM_PARAMS *params); + + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + + // for power-on sequence refinement + void (*init_power)(void); + void (*suspend_power)(void); + void (*resume_power)(void); + + void (*update)(unsigned int x, unsigned int y, unsigned int width, unsigned int height); + unsigned int (*compare_id)(void); + + ///////////////////////////CABC backlight related function + void (*set_backlight)(unsigned int level); + void (*set_pwm)(unsigned int divider); + unsigned int (*get_pwm)(unsigned int divider); + void (*set_backlight_mode)(unsigned int mode); + /////////////////////////// + + /////////////ESD_RECOVERY////////////////////// + unsigned int (*esd_check)(void); + unsigned int (*esd_recover)(void); + unsigned int (*check_status)(void); + unsigned int (*ata_check)(unsigned char *buffer); + void (*read_fb)(unsigned char *buffer); + int (*ioctl)(LCM_DRV_IOCTL_CMD cmd, unsigned int data); + ///////////////////////////////////////////////// +} LCM_DRIVER; + + +// --------------------------------------------------------------------------- +// LCM Driver Functions +// --------------------------------------------------------------------------- + +const LCM_DRIVER* LCM_GetDriver(void); +unsigned char which_lcd_module_triple(void); + +#endif // __LCM_DRV_H__ diff --git a/arch/arm/mach-mt8127/ford/lcm/inc/mt8193_lvds.h b/arch/arm/mach-mt8127/ford/lcm/inc/mt8193_lvds.h new file mode 100644 index 00000000000..5337071badf --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lcm/inc/mt8193_lvds.h @@ -0,0 +1,357 @@ + +// LVDSTX(Base Address:+800h/+900h) +// 1.Basic setting +#define LVDS_OUTPUT_CTRL 0x0818 + #define RG_LVDSRX_FIFO_EN 0x80000000 //[31] lvdsrx fifo enable + #define RG_DPMODE 0x00000008 //[3] Reserved for ASFIFO test + #define RG_SYNC_TRIG_MODE 0x00000004 //[2] lvds 7-> trig vsync mode enable + #define RG_OUT_FIFO_EN 0x00000002 //[1] lvds output fifo enable + #define RG_LVDS_E 0x00000001 //[0] lvds 7bit-4bit fifo enable + +#define LVDS_CLK_CTRL 0x0820 + #define RG_TEST_CK_SEL2 0x00000400 //[10] 0->lvds ifclk, 1->scan clock + #define RG_TEST_CK_SEL1 0x00000200 //[9] 0->lvds ctsclk, 1->scan clock + #define RG_TEST_CK_SEL0 0x00000100 //[8] 0->lvds pclk, 1->scan clock + #define RG_TEST_CK_EN 0x00000004 //[2] lvdstx test pattern clock enable + #define RG_RX_CK_EN 0x00000002 //[1] lvdsrx clock enable + #define RG_TX_CK_EN 0x00000001 //[0] lvdstx clock enable + +#define LVDS_CLK_RESET 0x082c + #define RG_CTSCLK_RESET_B 0x00000002 //[1] contraol ctsclk_reset_b + #define RG_PCLK_RESET_B 0x00000001 //[0] control pclk_reset_b + +typedef enum +{ + LCD_DATA_FORMAT_VESA8BIT = 0, + LCD_DATA_FORMAT_VESA6BIT = 1, + LCD_DATA_FORMAT_DISM8BIT = 2 +} LCD_DATA_FMT; + + +// 2.VESA Standard 8Bit/6Bit encoder +#define LVDS_FMT_CTRL 0x0800 + #define RG_8BIT_FORMAT 0x00000000 //[6:4] Data format select 8-bit mode, 000->8bit mode + #define RG_6BIT_FORMAT 0x00000010 //[6:4] Data format select 8-bit mode, 001->6bit mode + #define RG_DE_INV 0x00000004 //[2] Input DE invert + #define RG_VSYNC_INV 0x00000002 //[1] Input VSYNC invert + #define RG_HSYNC_INV 0x00000001 //[0] Input HSYNC invert + +// 3.R_SEL/G_SEL/B_SEL should be set to the same value +#define LVDS_R_SEL 0x080c + #define RG_R_SEL_VESA 0x00000000 //VESA Standard + #define RG_R_SEL_DISM 0x00492492 //DISM Standard + +#define LVDS_G_SEL 0x0810 + #define RG_G_SEL_VESA 0x00000000 //VESA Standard + #define RG_G_SEL_DISM 0x00492492 //DISM Standard + +#define LVDS_B_SEL 0x0814 + #define RG_B_SEL_VESA 0x00000000 //VESA Standard + #define RG_B_SEL_DISM 0x00492492 //DISM Standard + +// 4.Build-in test pattern +#define LVDS_RG_HV_TOTAL 0x0908 + #define LVDS_PTGEN_V_TOTAL 0x027b0000 //[27:16] V total From register for test ptgen + #define LVDS_PTGEN_H_TOTAL 0x00000540 //[12:0] H total From register for test ptgen + +#define LVDS_RG_HV_WIDTH 0x090c + #define LVDS_PTGEN_V_WIDTH 0x00050000 //[27:16] V width From register for test ptgen + #define LVDS_PTGEN_H_WIDTH 0x00000080 //[12:0] H width From register for test ptgen + +#define LVDS_RG_HV_START 0x0910 + #define LVDS_PTGEN_V_START 0x00150000 //[27:16] V start From register for test ptgen + #define LVDS_PTGEN_H_START 0x00000118 //[12:0] H start From register for test ptgen + +#define LVDS_RG_HV_ACTIVE 0x0914 + #define LVDS_PTGEN_V_ACTIVE 0x02580000 //[27:16] V active From register for test ptgen + #define LVDS_PTGEN_H_ACTIVE 0x00000400 //[12:0] H active From register for test ptgen + +#define LVDS_RG_PTGEN_CTRL 0x0918 + #define LVDS_COLOR_BAR_TH 0x04000000 //[27:16] Threshold of de_v_count for test enable + #define LVDS_PTGEN_TYPE 0x00000200 //[15:8] [1:0] 10:generate configurable color bar + #define LVDS_TST_PAT_EN 0x00000001 //[0] Test Patgen Enable + +#define LVDS_RG_PTGEN_BD 0x091c + #define LVDS_PTGEN_BD_B 0x00200000 //[23:16] Background B From register for test ptgen + #define LVDS_PTGEN_BD_G 0x00002000 //[15:8] Background G From register for test ptgen + #define LVDS_PTGEN_BD_R 0x000000ff //[7:0] Background R From register for test ptgen + +#define LVDS_RG_PTGEN_DATA 0x0920 + #define LVDS_PTGEN_B 0x00ff0000 //[23:16] B From register for test ptgen + #define LVDS_PTGEN_G 0x00002000 //[15:8] G From register for test ptgen + #define LVDS_PTGEN_R 0x00000020 //[7:0] R From register for test ptgen + +// 5.CRC check for digital function +#define LVDS_CRC_CTRL 0x0904 + #define RG_CRC_CLR 0x00000002 //[1] lvdstx_crc crc check clear control + #define RG_CRC_START 0x00000001 //[0] lvdstx_crc crc check start control + +#define LVDS_TX_CRC_STATUS 0x0934 + +// 6.LVDS analog test +#define LVDS_RG_TST_CH 0x0830 + #define RG_LVDS_CH2 0x00a00000 //[23:20] Channel 2 From register for ANA test + #define RG_LVDS_CH1 0x00002800 //[13:10] Channel 1 From register for ANA test + #define RG_LVDS_CH0 0x0000000a //[3:0] Channel 0 From register for ANA test + +#define LVDS_RG_TST_CLK 0x0834 + #define RG_LVDS_PAT_EN 0x80000000 //[31] Source From register for Analog test enable + #define RG_LVDS_CLK 0x00002800 //[13:10] Clcok channel From register for ANA test + #define RG_LVDS_CH3 0x0000000a //[3:0] Channel 3 From register for ANA test + +// 7.Lvdstx_fmt output control +#define LVDS_RG_SRC 0x0804 + #define RG_B 0x00000000 //[31:24] Register source for B + #define RG_G 0x00000000 //[23:16] Register source for G + #define RG_R 0x00000000 //[15:8] Register source for R + #define RG_B_SEL 0x00000000 //[5:4] 00->B, 01->R, 10->G, 11->rg_b + #define RG_G_SEL 0x00000000 //[3:2] 00->G, 01->B, 10->R, 11->rg_g + #define RG_R_SEL 0x00000000 //[1:0] 00->R, 01->G, 10->B, 11->rg_r + +#define LVDS_RG_CTRL 0x0808 + #define RG_DE 0x00000000 //[8] Register source for DE + #define RG_VSYNC 0x00000000 //[7] Register source for VSYNC + #define RG_HSYNC 0x00000000 //[6] Register source for HSYNC + #define RG_DE_SEL 0x00000000 //[5:4] 00->de, 01->hsync, 10->vsync, 11->rg_de + #define RG_VSYNC_SEL 0x00000000 //[3:2] 00->vsync, 01->de, 10->hsync, 11->rg_vsync + #define RG_HSYNC_SEL 0x00000000 //[1:0] 00->hsync, 01->vsync, 10->de, 11->rg_hsync + +// 8.Channel swap and bit invert +#define LVDS_CH_SWAP 0x081c + #define RG_SWAP_SEL 0x80000000 //[31] lvds_pa*_tmds_[6:0] Swap + #define RG_TOP_PN 0x00000000 //[28:24] Channel P/N Swap + #define RG_ML_SWAP 0x00000000 //[20:16] Channel MSB/LSB Swap + #define RG_CLK_SEL 0x00000000 //[14:12] Clock channel source select + #define RG_CH3_SEL 0x00000000 //[11:9] Channel 3 Source select + #define RG_CH2_SEL 0x00000000 //[8:6] Channel 2 Source select + #define RG_CH1_SEL 0x00000000 //[5:3] Channel 1 Source select + #define RG_CH0_SEL 0x00000000 //[2:0] Channel 0 Source select + + +// DGI0 (Base Address:+400h/+500h) +// 1.Basic setting +#define DGI0_DEC_CTRL 0x0400 + #define FIFO_WRITE_EN 0x00008000 //[15] fifo write enable + #define RESET_COUNTER 0x08000000 //[27] reset the counter for timing generate + #define CLEAR_COUNTER 0x00000000 + +#define DGI0_FIFO_CTRL 0x0404 + #define SW_RST 0x00080000 //[19] soft reset + #define FIFO_RESET_ON 0x00020000 //[17] fifo reset or not + #define RD_START 0x00000040 //[6:0] + +#define DGI0_DATA_OUT_CTRL 0x0408 + #define DATA_OUT_SWAP 0x04000000 //[26]rise fifo data and fall fifo swap bit + #define TTL_TIM_SWAP 0x00003000 //[14:12] ttl out timing swap HSYNC ->DE + #define TTL_TIM_SWAP2 0x00005000 //[14:12] ttl out timing swap VSYNC ->DE + +#define DGI0_DITHER_CTRL0 0x0410 + #define FRC_EN 0x10000000 //[28] frc dither enable + #define FCNT_DIF_EN 0x00000800 //[11] fcnt diffuse enable + #define SYNC_SEL 0x00000200 //[9] 0->internal sync generation by input DE, 1->input sync + #define OUT_FMT 0x00000010 //[5:4] 00->4bit, 01->6bit, 10->8bit, 11->10bit + +#define DGI0_DITHER_CTRL1 0x0414 +#define DGI0_DITHER_CTRL2 0x0418 + +#define DGI0_TG_CTRL00 0x041c + #define PRGS_OUT 0x00104000 //[20] progressive out + +#define DGI0_TG_CTRL01 0x0420 + #define RG_VSYNC_FORWARD 0x80000000 //[31] verical delay forward or back + #define RG_VSYNC_DELAY 0x00020000 //[28:16] vertical delay + #define RG_HSYNC_DELAY 0x000003a8 //[12:0] horizontal delay + +#define DGI0_TG_CTRL02 0x0424 + #define VSYNC_TOTAL 0x020d0000 //[27:16] vertical total + #define HSYNC_TOTAL 0x000003aa //[12:0] horizontal total + +#define DGI0_TG_CTRL03 0x0428 + #define VSYNC_WIDTH 0x00060000 //[24:16] vsync width + #define HSYNC_WIDTH 0x0000003e //[11:0] hsync width + +#define DGI0_TG_CTRL04 0x042c + #define H_ACT2_EN 0x00000400 //[10] horizontal active 2 enable + #define V_ACT2_EN 0x00000200 //[9] vertical active 2 enable + #define HD_ON 0x00000100 //[8] HD on + #define VSYNC_POL 0x00000040 //[6] vsync polarity + #define HSYNC_POL 0x00000020 //[5] hsync polarity + #define DE_POL 0x00000010 //[4] de polarity + +#define DGI0_TG_CTRL05 0x0430 + #define X_ACTIVE_START 0x007a0000 //[28:16] horizontal start point + #define X_ACTIVE_END 0x00000399 //[12:0] horizontal end point + +#define DGI0_TG_CTRL06 0x0434 + #define Y_ACTIVE_OSTART 0x00240000 //[27:16] odd vertical start point + #define Y_ACTIVE_OEND 0x00000203 //[11:0] odd vertical end point + +#define DGI0_TG_CTRL07 0x0438 + #define Y_ACTIVE_ESTART 0x00240000 //[27:16] even vertical start point + #define Y_ACTIVE_EEND 0x00000203 //[11:0] even vertical end point + +#define DGI0_TG_CTRL08 0x043c + #define X_ACTIVE_START_1 0x007a0000 //[28:16] horizontal start point 1 + #define X_ACTIVE_END_1 0x00000399 //[12:0] horizontal end point 1 + +#define DGI0_TG_CTRL09 0x0440 + #define Y_ACTIVE_OSTART_1 0x00240000 //[27:16] odd vertical start point 1 + #define Y_ACTIVE_OEND_1 0x00000203 //[11:0] odd vertical end point 1 + +#define DGI0_TG_CTRL10 0x0444 + #define Y_ACTIVE_ESTART_1 0x00240000 //[27:16] even vertical start point 1 + #define Y_ACTIVE_EEND_1 0x00000203 //[11:0] even vertical end point 1 + +#define DGI0_ANAIF_CTRL2 0x0448 + #define HDMIPLL_REG_CLK_SEL 0x00000000 //[31] hdmipll reference clock select bit, 0->dgi1_ref_clk, 1->dgi0_ref_clk + #define DGI1_DEL_D2_D4_SEL 0x00000000 //[17] dgi1 reference clock devide 2 or devide 4 select, 0->devide 2, 1->devide 4 + #define DGI1_DEL_D1_SEL 0x00000000 //[16] dgi1 reference clock devide 1 select, 0->devide 1, 1->select the d2_d4 clock + #define DGI0_DEL_D2_D4_SEL 0x00000000 //[1] dgi0 reference clock devide 2 or devide 4 select, 0->devide 2, 1->devide 4 + #define DGI0_DEL_D1_SEL 0x00000000 //[0] dgi0 reference clock devide 1 select, 0->devide 1, 1->select the d2_d4 clock + +#define DGI0_ANAIF_CTRL0 0x044c + #define DGI0_CLK_DELAY_SEL1 0x0000000 //[29:24] dgi0 clock delay chain select 1 + #define DGI0_CLK_DELAY_SEL0 0x0000000 //[21:16] dgi0 clock delay chain select 0 + #define DGI0_CK_INV_PRE_CTRL 0x0000000 //[1] dgi0 pad clock invert + #define DGI0_PAD_CLK_ENABLE 0x0000001 //[0] dgi0 pad clock enable + #define DGI0_PAD_CLK_DISABLE 0x0000000 //[0] dgi0 pad clock disable + +#define DGI0_ANAIF_CTRL1 0x0450 + #define DGI1_PAD_CLK_INV_EN 0x0000000 //[31] invter clock + #define DGI1_CLK_DELAY_SEL1 0x0000000 //[29:24] dgi1 clock delay chain select 1 + #define DGI1_CLK_DELAY_SEL0 0x0000000 //[21:16] dgi1 clock delay chain select 0 + #define DATA_IN_TV_MODE 0x0000000 //[9] data in TV mode + #define DATA_IN_BIT_INV 0x0000000 //[8] data in bit inv + #define ANAIF_DGI1_CLK_SEL 0x0000000 //[6] anaif dgi1 clock select from dgi0 clock or dgi1 clock + #define CLK_SEL_TV_MODE 0x0000000 //[4] clock in TV mode + #define CLK_MODE_SEL 0x0000000 //[3] clock mode select + #define NWEB_CLK_EN 0x0000000 //[2] nweb clock enable + #define DGI1_PAD_CLK_EN 0x0000000 //[1] dgi1 pad clk enable + #define TV_MODE_CLK_EN 0x0000000 //[0] TV mode clock enable + + +#define DGI0_TTL_ANAIF_CTRL 0x0454 + #define TTL_CLK_TEST_MODE 0x00000000 //[31] ttl clock test mode, 0->lvds display clock, 1->dgi0 anaif clock + #define TTL_CLK_DELAY_SEL1 0x00000000 //[21:16] ttl clock delay chain select 1 + #define TTL_CLK_DELAY_SEL0 0x00000000 //[13:8] ttl clock delay chain select 0 + #define TTL_CLK_INV_ENABLE 0x00000001 //[0] ttl clock invert enable + +#define DGI0_TTL_ANAIF_CTRL1 0x0458 + #define PAD_TTL_EN_PP 0x00000002 //[1] enable ttl out preplace, set to 1 + #define PAD_TTL_EN_FUN_SEL 0x00000001 //[0] TTL Pinmux, 1->function 2, 0->function 1 + +#define DGI0_CLK_RST_CTRL 0x045c + #define DGI0_TEST_MODE 0x80000000 //[31] dgi0 clk_out test mode + #define CLK_OUT_TO_IN_INV 0x00000000 //[5] clk_in_inv use clk_out when pat_gen + #define CLK_OUT_TO_IN 0x00000000 //[4] clk_in use clk_out when pat_gen + #define CLK_PAT_GEN_EN 0x00000008 //[3] pat_gen clock enable + #define DGI0_CLK_OUT_ENABLE 0x00000004 //[2] dgi0 clk_out enable + #define DGI0_CLK_IN_INV_ENABLE 0x00000002 //[1] dgi0 clk_in_inv enable + #define DGI0_CLK_IN_ENABLE 0x00000001 //[0] dgi0 clk_in enable + #define DGI0_CLK_OUT_DISABLE 0x00000000 //[2] dgi0 clk_out disable + +#define DGI0_PAT_GEN_CTRL0 0x0500 + #define RG_PTGEN_V_TOTAL 0x027b0000 //[27:16] V total From register for test ptgen + #define RG_PTGEN_H_TOTAL 0x00000540 //[12:0] H total From register for test ptgen + +#define DGI0_PAT_GEN_CTRL1 0x0504 + #define RG_PTGEN_V_WIDTH 0x00050000 //[27:16] V width From register for test ptgen + #define RG_PTGEN_H_WIDTH 0x00000080 //[12:0] H width From register for test ptgen + +#define DGI0_PAT_GEN_CTRL2 0x0508 + #define RG_PTGEN_V_START 0x00150000 //[27:16] V start From register for test ptgen + #define RG_PTGEN_H_START 0x00000118 //[12:0] H start From register for test ptgen + +#define DGI0_PAT_GEN_CTRL3 0x050c + #define RG_PTGEN_V_ACTIVE 0x02580000 //[27:16] V active From register for test ptgen + #define RG_PTGEN_H_ACTIVE 0x00000400 //[12:0] H active From register for test ptgen + +#define DGI0_PAT_GEN_CTRL4 0x0510 + #define RG_COLOR_BAR_TH 0x04000000 //[27:16] Threshold of de_v_count for test enable + #define RG_PTGEN_TYPE 0x00000200 //[15:8] [1:0]=10:generate configurable color bar + #define PAT_GEN_RST 0x00000004 //[2] pat_gen reset + #define PAT_IN 0x00000002 //[1] data in use pattern gen data + #define RG_TST_PAT_EN 0x00000001 //[0] Test Patgen Enable + +#define DGI0_PAT_GEN_CTRL5 0x0514 + #define RG_PTGEN_BD_B 0x00ff0000 //[23:16] Background B From register for test ptgen + #define RG_PTGEN_BD_G 0x00008800 //[15:8] Background G From register for test ptgen + #define RG_PTGEN_BD_R 0x00000044 //[7:0] Background R From register for test ptgen + +#define DGI0_PAT_GEN_CTRL6 0x0518 + #define RG_PTGEN_B 0x00ff0000 //[23:16] B From register for test ptgen + #define RG_PTGEN_G 0x00008800 //[15:8] G From register for test ptgen + #define RG_PTGEN_R 0x00000044 //[7:0] R From register for test ptgen + +#define DGI0_CRC_MON_CT 0x051c + #define C_CRC_CLR 0x00000002 + #define C_CRC_START 0x00000001 + +#define DGI0_CRC_OUT 0x0520 + #define CRC_RDY 0x10000000 + #define CRC_OUT 0x00ffffff + +#define DGI0_MON 0x0524 + +//ckgen setting +#define REG_LVDS_DISP_CKCFG 0x1014 +#define REG_LVDS_CTSCLKCFG 0x1018 +#define REG_LVDS_PWR_RST_B 0x1108 +#define REG_LVDS_PWR_CTRL 0x110c + +#define RG_LVDSWRAP_CTRL1 0x1254 + #define RG_DCXO_POR_MON_EN 0x00000100 //[8]dcxo_por mon enable + #define RG_PLL1_DIV 0x00000004 //[3:0] rg_pll1_div + #define RG_PLL1_DIV2 0x00000002 //[3:0] rg_pll1_div + #define RG_PLL1_DIV3 0x00000006 //[3:0] rg_pll1_div + +#define REG_LVDS_ANACFG0 0x1310 + #define RG_LVDS_APD 0xf8000000 //[31:27] + #define RG_LVDS_BIASA_PD 0x02000000 //[25] + #define RG_LVDS_ATERM_EN 0x00800000 //[24:23]00: No source termination; 10: 1k Ohm termination; 01: 100 Ohm termination; 11: 90 Ohm termination; + #define RG_LVDS_APSRC 0x00400000 //[22:20]LVDS A Group P Slew Rate Control; Strongest: 000; Weakest: 111 + #define RG_LVDS_ANSRC 0x00070000 //[19:17]LVDS A Group N Slew Rate Control; Strongest: 111; Weakest: 000 + #define RG_LVDS_ATVCM 0x0000c000 //[16:14]LVDS A Group Common Mode Voltage Control + #define RG_LVDS_ATVO 0x00002000 //LVDS A Group Output Swing Control + +#define REG_LVDS_ANACFG1 0x1314 + #define RG_LVDS_AE4 0x80000000 //[31]A Group TTL Output Enable 4ma strength control. + #define RG_LVDS_AE8 0x40000000 //[30]A Group TTL Output Enable 8ma strength control. + #define RG_LVDS_ASR 0x20000000 //[29]A Group TTL Output Slew Rate control + #define RG_LVDS_ASMTEN 0x10000000 //[28]A Group TTL Input Smitch Trigger Enable + #define RG_LVDS_AMINI_SEL_CK0 0x00000000 //[1] A Group Mini-LVDS ck channel enable + +#define REG_LVDS_ANACFG2 0x1318 + #define RG_VPLL_BC 0x30000000 //[31:27]Integral path cap value + #define RG_VPLL_BIC 0x02000000 //[26:24]Integral path charge pump current + #define RG_VPLL_BIR 0x00200000 //[23:20]Proportional path charge pump current + #define RG_VPLL_BP 0x00010000 //[19:16]Power down for VOPLL Bias + #define RG_VPLL_BG_PD 0x00008000 //[15]Power down for Bandgap + #define RG_VPLL_BR 0x00005000 //[14:12]Proportional path res value + #define RG_VPLL_BIAS_PD 0x00000800 //[11]Power down for VOPLL Bias + +#define REG_LVDS_ANACFG3 0x131c + #define RG_VPLL_DIV 0x00040000 //[21:17]Divider setting + #define RG_VPLL_DPIX_CKSEL 0x00001000 //[13:12]VPLL_DPIX_CLK Selection + #define RG_LVDS_DELAY 0x00000080 //[10:8]LVDS_DPIX_CLK Delay setting 70ps / step + #define RG_VPLL_MKVCO 0x00000040 //[7]VCO Range From 160 MHz~ 390 MHz + #define RG_VPLL_POSTDIV_EN 0x00000010 //[4] + +#define REG_LVDS_ANACFG4 0x1320 + #define RG_VPLL_RST 0x00800000 //[23] + #define RG_T2TTLO_EN 0x00000800 //[11] + #define RG_VPLL_PD 0x00000400 //[10] + #define RG_BYPASS 0x00000200 //[9]mini clock by pass phase interpolater + #define RG_LVDS_BYPASS 0x00000100 //[8] + +#define REG_PLL_GPANACFG0 0x134c + #define RG_PLL1_EN 0x80000000 //[31]Power Down 0: Power down 1: Power on + #define RG_PLL1_FBDIV 0x4c000000 //[30:26] Feedback divide ratio (N+1 Divider) + #define RG_PLL1_FBDIV2 0x2c000000 // + #define RG_PLL1_FBDIV3 0x6c000000 // + #define RG_PLL1_PREDIV 0x01000000 //[25:24] Pre-divider ratio + #define RG_PLL1_RST_DLY 0x00300000 //[21:20]Reset Time Control,Tin=1/Fref 00: 2^5 * Tin + #define RG_PLL1_LF 0x00000800 //[11]Frequency Band Control + #define RG_PLL1_MONCKEN 0x00000100 //[8]PLL1 clock monitor enable + #define RG_PLL1_VODEN 0x00000080 //[7]CHP OverDrive Enable + #define RG_NFIPLL_EN 0x00000002 //[1]Power Down 0: Power down 1: Power on diff --git a/arch/arm/mach-mt8127/ford/lcm/inc/sn65dsi83_i2c.h b/arch/arm/mach-mt8127/ford/lcm/inc/sn65dsi83_i2c.h new file mode 100644 index 00000000000..6b9191ed649 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lcm/inc/sn65dsi83_i2c.h @@ -0,0 +1,29 @@ +/***************************************************************************** +* +* Filename: +* --------- +* sn65dsi83.h +* +* Project: +* -------- +* Android +* +* Description: +* ------------ +* sn65dsi83 header file +* +* Author: +* ------- +* +****************************************************************************/ + +#ifndef _sn65dsi83_SW_H_ +#define _sn65dsi83_SW_H_ +#ifndef BUILD_LK + +//--------------------------------------------------------- +extern int sn65dsi83_read_byte(kal_uint8 cmd, kal_uint8 *returnData); +extern int sn65dsi83_write_byte(kal_uint8 cmd, kal_uint8 writeData); +#endif +#endif // _fan5405_SW_H_ + diff --git a/arch/arm/mach-mt8127/ford/lcm/mt65xx_lcm_list.c b/arch/arm/mach-mt8127/ford/lcm/mt65xx_lcm_list.c new file mode 100644 index 00000000000..baa92391789 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lcm/mt65xx_lcm_list.c @@ -0,0 +1,964 @@ +#include +#ifdef BUILD_LK +#include +#else +#include +#include +#endif +#include +//used to identify float ID PIN status +#define LCD_HW_ID_STATUS_LOW 0 +#define LCD_HW_ID_STATUS_HIGH 1 +#define LCD_HW_ID_STATUS_FLOAT 0x02 +#define LCD_HW_ID_STATUS_ERROR 0x03 + +#ifdef BUILD_LK +#define LCD_DEBUG(fmt) dprintf(CRITICAL,fmt) +#else +#define LCD_DEBUG(fmt) printk(fmt) +#endif +extern LCM_DRIVER otm1282a_hd720_dsi_vdo_lcm_drv; +extern LCM_DRIVER r63319_wqhd_dsi_vdo_truly_lcm_drv; +extern LCM_DRIVER nt35598_wqhd_dsi_vdo_truly_lcm_drv; +extern LCM_DRIVER lp079x01_lcm_drv; +extern LCM_DRIVER hx8369_lcm_drv; +extern LCM_DRIVER hx8369_6575_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_hvga_lcm_drv; +extern LCM_DRIVER hx8363_6575_dsi_qvga_lcm_drv; +extern LCM_DRIVER hx8363b_wvga_dsi_cmd_drv; +extern LCM_DRIVER bm8578_lcm_drv; +extern LCM_DRIVER nt35582_mcu_lcm_drv; +extern LCM_DRIVER nt35582_mcu_6575_lcm_drv; +extern LCM_DRIVER nt35582_rgb_6575_lcm_drv; +extern LCM_DRIVER hx8357b_lcm_drv; +extern LCM_DRIVER hx8357c_hvga_dsi_cmd_drv; +extern LCM_DRIVER hx8369_dsi_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_hvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_6575_qvga_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369b_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369b_wvga_dsi_vdo_drv; +extern LCM_DRIVER hx8389b_qhd_dsi_vdo_drv; +extern LCM_DRIVER hx8369_hvga_lcm_drv; +extern LCM_DRIVER ili9481_lcm_drv; +extern LCM_DRIVER nt35582_lcm_drv; +extern LCM_DRIVER s6d0170_lcm_drv; +extern LCM_DRIVER spfd5461a_lcm_drv; +extern LCM_DRIVER ta7601_lcm_drv; +extern LCM_DRIVER tft1p3037_lcm_drv; +extern LCM_DRIVER ha5266_lcm_drv; +extern LCM_DRIVER hsd070idw1_lcm_drv; +extern LCM_DRIVER lg4571_lcm_drv; +extern LCM_DRIVER lg4573b_wvga_dsi_vdo_lh430mv1_drv; +extern LCM_DRIVER lvds_wsvga_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_lcm_drv; +extern LCM_DRIVER lvds_wsvga_ti_n_lcm_drv; +extern LCM_DRIVER nt35565_3d_lcm_drv; +extern LCM_DRIVER tm070ddh03_lcm_drv; +extern LCM_DRIVER r61408_lcm_drv; +extern LCM_DRIVER r61408_wvga_dsi_cmd_drv; +extern LCM_DRIVER nt35510_lcm_drv; +extern LCM_DRIVER nt35510_dpi_lcm_drv; +extern LCM_DRIVER nt35510_hvga_lcm_drv; +extern LCM_DRIVER nt35510_qvga_lcm_drv; +extern LCM_DRIVER nt35510_wvga_dsi_cmd_drv; +extern LCM_DRIVER nt35510_6517_lcm_drv; +extern LCM_DRIVER nt35510_dsi_cmd_6572_drv; +extern LCM_DRIVER nt35510_dsi_cmd_6572_hvga_drv; +extern LCM_DRIVER nt35510_dsi_cmd_6572_fwvga_drv; +extern LCM_DRIVER nt35510_dsi_cmd_6572_qvga_drv; +extern LCM_DRIVER nt35510_dsi_vdo_6572_drv; +extern LCM_DRIVER nt35510_dpi_6572_lcm_drv; +extern LCM_DRIVER nt35510_mcu_6572_lcm_drv; +extern LCM_DRIVER nt51012_hd720_dsi_vdo_lcm_drv; +extern LCM_DRIVER r63303_idisplay_lcm_drv; +extern LCM_DRIVER hj080ia_lcm_drv; +extern LCM_DRIVER hj101na02a_lcm_drv; +extern LCM_DRIVER hj101na02a_8135_lcm_drv; +extern LCM_DRIVER hsd070pfw3_lcm_drv; +extern LCM_DRIVER hsd070pfw3_8135_lcm_drv; +extern LCM_DRIVER cm_n070ice_dsi_vdo_lcm_drv; +extern LCM_DRIVER ej101ia_lcm_drv; +extern LCM_DRIVER scf0700m48ggu02_lcm_drv; +extern LCM_DRIVER nt35510_fwvga_lcm_drv; +#if defined(GN_SSD2825_SMD_S6E8AA) +extern LCM_DRIVER gn_ssd2825_smd_s6e8aa; +#endif +extern LCM_DRIVER nt35517_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8369_dsi_bld_lcm_drv; +extern LCM_DRIVER hx8369_dsi_tm_lcm_drv; +extern LCM_DRIVER otm1280a_hd720_dsi_cmd_drv; +extern LCM_DRIVER otm8018b_dsi_vdo_lcm_drv; +extern LCM_DRIVER otm8018b_dsi_vdo_txd_fwvga_lcm_drv; +extern LCM_DRIVER nt35512_dsi_vdo_lcm_drv; +extern LCM_DRIVER nt35512_wvga_dsi_vdo_boe_drv; +extern LCM_DRIVER hx8369_rgb_6585_fpga_lcm_drv; +extern LCM_DRIVER hx8369_rgb_6572_fpga_lcm_drv; +extern LCM_DRIVER hx8369_mcu_6572_lcm_drv; +extern LCM_DRIVER hx8369a_wvga_dsi_cmd_drv; +extern LCM_DRIVER hx8369a_wvga_dsi_vdo_drv; +extern LCM_DRIVER hx8392a_dsi_cmd_lcm_drv; +extern LCM_DRIVER nt35590_hd720_dsi_vdo_truly_lcm_drv; +extern LCM_DRIVER ssd2075_hd720_dsi_vdo_truly_lcm_drv; +extern LCM_DRIVER nt35590_hd720_dsi_cmd_drv; +extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_lcm_drv; +extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_fwvga_lcm_drv; +extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_wvga_lcm_drv; +extern LCM_DRIVER nt35590_hd720_dsi_cmd_auo_qhd_lcm_drv; +extern LCM_DRIVER nt35590_hd720_dsi_cmd_cmi_lcm_drv; +extern LCM_DRIVER nt35516_qhd_dsi_cmd_ipsboe_lcm_drv; +extern LCM_DRIVER nt35516_qhd_dsi_cmd_ipsboe_wvga_lcm_drv; +extern LCM_DRIVER nt35516_qhd_dsi_cmd_ipsboe_fwvga_lcm_drv; +extern LCM_DRIVER nt35516_qhd_dsi_cmd_ips9k1431_drv; +extern LCM_DRIVER nt35516_qhd_dsi_cmd_tft9k1342_drv; +extern LCM_DRIVER bp070ws1_lcm_drv; +extern LCM_DRIVER bp101wx1_lcm_drv; +extern LCM_DRIVER bp101wx1_n_lcm_drv; +extern LCM_DRIVER nt35516_qhd_rav4_lcm_drv; +extern LCM_DRIVER r63311_fhd_dsi_vdo_sharp_lcm_drv; +extern LCM_DRIVER r81592_hvga_dsi_cmd_drv; +extern LCM_DRIVER rm68190_dsi_vdo_lcm_drv; +extern LCM_DRIVER nt35596_fhd_dsi_vdo_truly_lcm_drv; +extern LCM_DRIVER nt35595_fhd_dsi_vdo_truly_lcm_drv; +extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_lcm_drv; +extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_tps65132_lcm_drv; +extern LCM_DRIVER nt35595_fhd_dsi_cmd_truly_tps65132_720p_lcm_drv; +extern LCM_DRIVER nt35596_fhd_dsi_vdo_yassy_lcm_drv; +extern LCM_DRIVER nt35590_hd720_dsi_cmd_truly2_lcm_drv; +extern LCM_DRIVER otm9608_wvga_dsi_cmd_drv; +extern LCM_DRIVER nt35510_dbi_18bit_gionee_lcm_drv; +extern LCM_DRIVER otm8009a_fwvga_dsi_cmd_tianma_lcm_drv; +extern LCM_DRIVER otm8009a_fwvga_dsi_vdo_tianma_lcm_drv; +extern LCM_DRIVER hx8389b_qhd_dsi_vdo_tianma_lcm_drv; +extern LCM_DRIVER cm_otc3108bhv161_dsi_vdo_lcm_drv; +extern LCM_DRIVER auo_b079xat02_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8389b_qhd_dsi_vdo_tianma055xdhp_lcm_drv; +extern LCM_DRIVER cpt_claa101fp01_dsi_vdo_lcm_drv; +extern LCM_DRIVER h070d_18dm_lcm_drv; +extern LCM_DRIVER hx8394a_hd720_dsi_vdo_tianma_lcm_drv; +extern LCM_DRIVER cpt_clap070wp03xg_sn65dsi83_lcm_drv; +extern LCM_DRIVER nt35520_hd720_tm_lcm_drv; +extern LCM_DRIVER nt35520_hd720_boe_lcm_drv; +extern LCM_DRIVER nt35521_hd720_dsi_vdo_boe_lcm_drv; +extern LCM_DRIVER nt35521_hd720_tm_lcm_drv; +extern LCM_DRIVER r69429_wuxga_dsi_vdo_lcm_drv; +extern LCM_DRIVER r69429_wuxga_dsi_cmd_lcm_drv; +extern LCM_DRIVER rm68210_hd720_dsi_ufoe_cmd_lcm_drv; +extern LCM_DRIVER r63311_fhd_dsi_vedio_lcm_drv; +extern LCM_DRIVER cpt_clap070wp03xg_lvds_lcm_drv; +extern LCM_DRIVER otm8018b_dsi_vdo_lcsh72_lcm_drv; +extern LCM_DRIVER hx8369_dsi_cmd_6571_lcm_drv; +extern LCM_DRIVER hx8369_dsi_vdo_6571_lcm_drv; +extern LCM_DRIVER hx8369_dbi_6571_lcm_drv; +extern LCM_DRIVER hx8369_dpi_6571_lcm_drv; +extern LCM_DRIVER nt35510_dsi_cmd_6571_lcm_drv; +extern LCM_DRIVER nt35510_dsi_cmd_6571_hvga_lcm_drv; +extern LCM_DRIVER nt35510_dsi_cmd_6571_qvga_lcm_drv; +extern LCM_DRIVER nt35510_dsi_vdo_6571_lcm_drv; +extern LCM_DRIVER nt35510_dbi_6571_lcm_drv; +extern LCM_DRIVER nt35510_dpi_6571_lcm_drv; +extern LCM_DRIVER nt35590_dsi_cmd_6571_fwvga_lcm_drv; +extern LCM_DRIVER nt35590_dsi_cmd_6571_qhd_lcm_drv; +extern LCM_DRIVER it6151_edp_dsi_video_sharp_lcm_drv; +extern LCM_DRIVER nt35517_qhd_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8389b_qhd_dsi_vdo_lgd_lcm_drv; +extern LCM_DRIVER it6151_fhd_edp_dsi_video_auo_lcm_drv; +extern LCM_DRIVER tf070mc_rgb_v18_mt6571_lcm_drv; +extern LCM_DRIVER zs070ih5015b3h6_mt6571_lcm_drv; +extern LCM_DRIVER a080ean01_dsi_vdo_lcm_drv; +LCM_DRIVER* lcm_driver_list[] = +{ +#if defined(OTM8018B_DSI_VDO_TXD_FWVGA) + &otm8018b_dsi_vdo_txd_fwvga_lcm_drv, +#endif + +#if defined(TF070MC_RGB_V18_MT6571) + &tf070mc_rgb_v18_mt6571_lcm_drv, +#endif + +#if defined(ZS070IH5015B3H6_RGB_MT6571) + &zs070ih5015b3h6_mt6571_lcm_drv, +#endif + +#if defined(OTM1282A_HD720_DSI_VDO) + &otm1282a_hd720_dsi_vdo_lcm_drv, +#endif + +#if defined(R63311_FHD_DSI_VDO) + &r63311_fhd_dsi_vedio_lcm_drv, +#endif +#if defined(NT35517_QHD_DSI_VDO) + &nt35517_dsi_vdo_lcm_drv, +#endif + + +#if defined(LP079X01) + &lp079x01_lcm_drv, +#endif + +#if defined(HX8369) + &hx8369_lcm_drv, +#endif + +#if defined(HX8369_6575) + &hx8369_6575_lcm_drv, +#endif + +#if defined(BM8578) + &bm8578_lcm_drv, +#endif + +#if defined(NT35582_MCU) + &nt35582_mcu_lcm_drv, +#endif + +#if defined(NT35582_MCU_6575) + &nt35582_mcu_6575_lcm_drv, +#endif + +#if defined(NT35590_HD720_DSI_CMD_TRULY2) + &nt35590_hd720_dsi_cmd_truly2_lcm_drv, +#endif + +#if defined(NT35590_HD720_DSI_VDO_TRULY) + &nt35590_hd720_dsi_vdo_truly_lcm_drv, +#endif + +#if defined(SSD2075_HD720_DSI_VDO_TRULY) + &ssd2075_hd720_dsi_vdo_truly_lcm_drv, +#endif + +#if defined(NT35590_HD720_DSI_CMD) + &nt35590_hd720_dsi_cmd_drv, +#endif + +#if defined(NT35590_HD720_DSI_CMD_AUO) + &nt35590_hd720_dsi_cmd_auo_lcm_drv, +#endif + +#if defined(NT35590_HD720_DSI_CMD_AUO_WVGA) + &nt35590_hd720_dsi_cmd_auo_wvga_lcm_drv, +#endif + +#if defined(NT35590_HD720_DSI_CMD_AUO_QHD) + &nt35590_hd720_dsi_cmd_auo_qhd_lcm_drv, +#endif + +#if defined(NT35590_HD720_DSI_CMD_AUO_FWVGA) + &nt35590_hd720_dsi_cmd_auo_fwvga_lcm_drv, +#endif + +#if defined(NT35590_HD720_DSI_CMD_CMI) + &nt35590_hd720_dsi_cmd_cmi_lcm_drv, +#endif + +#if defined(NT35582_RGB_6575) + &nt35582_rgb_6575_lcm_drv, +#endif + +#if defined(NT51012_HD720_DSI_VDO) + &nt51012_hd720_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_RGB_6585_FPGA) + &hx8369_rgb_6585_fpga_lcm_drv, +#endif + +#if defined(HX8369_RGB_6572_FPGA) + &hx8369_rgb_6572_fpga_lcm_drv, +#endif + +#if defined(HX8369_MCU_6572) + &hx8369_mcu_6572_lcm_drv, +#endif + +#if defined(HX8369A_WVGA_DSI_CMD) + &hx8369a_wvga_dsi_cmd_drv, +#endif + +#if defined(HX8369A_WVGA_DSI_VDO) + &hx8369a_wvga_dsi_vdo_drv, +#endif + +#if defined(HX8357B) + &hx8357b_lcm_drv, +#endif + +#if defined(HX8357C_HVGA_DSI_CMD) + &hx8357c_hvga_dsi_cmd_drv, +#endif + +#if defined(R61408) + &r61408_lcm_drv, +#endif + +#if defined(R61408_WVGA_DSI_CMD) + &r61408_wvga_dsi_cmd_drv, +#endif + +#if defined(HX8369_DSI_VDO) + &hx8369_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369_DSI) + &hx8369_dsi_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_NFC_ZTE) + &hx8369_dsi_6575_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_HVGA) + &hx8369_dsi_6575_hvga_lcm_drv, +#endif + +#if defined(HX8369_6575_DSI_QVGA) + &hx8369_dsi_6575_qvga_lcm_drv, +#endif + +#if defined(HX8369_HVGA) + &hx8369_hvga_lcm_drv, +#endif + +#if defined(NT35510) + &nt35510_lcm_drv, +#endif + +#if defined(NT35510_RGB_6575) + &nt35510_dpi_lcm_drv, +#endif + +#if defined(NT35510_HVGA) + &nt35510_hvga_lcm_drv, +#endif + +#if defined(NT35510_QVGA) + &nt35510_qvga_lcm_drv, +#endif + +#if defined(NT35510_WVGA_DSI_CMD) + &nt35510_wvga_dsi_cmd_drv, +#endif + +#if defined(NT35510_6517) + &nt35510_6517_lcm_drv, +#endif + +#if defined(NT35510_DSI_CMD_6572) + &nt35510_dsi_cmd_6572_drv, +#endif + +#if defined(NT35510_DSI_CMD_6572_HVGA) + &nt35510_dsi_cmd_6572_hvga_drv, +#endif + +#if defined(NT35510_DSI_CMD_6572_FWVGA) + &nt35510_dsi_cmd_6572_fwvga_drv, +#endif + +#if defined(NT35510_DSI_CMD_6572_QVGA) + &nt35510_dsi_cmd_6572_qvga_drv, +#endif + +#if defined(NT35510_DSI_VDO_6572) + &nt35510_dsi_vdo_6572_drv, +#endif + +#if defined(NT35510_DPI_6572) + &nt35510_dpi_6572_lcm_drv, +#endif + +#if defined(NT35510_MCU_6572) + &nt35510_mcu_6572_lcm_drv, +#endif + +#if defined(ILI9481) + &ili9481_lcm_drv, +#endif + +#if defined(NT35582) + &nt35582_lcm_drv, +#endif + +#if defined(S6D0170) + &s6d0170_lcm_drv, +#endif + +#if defined(SPFD5461A) + &spfd5461a_lcm_drv, +#endif + +#if defined(TA7601) + &ta7601_lcm_drv, +#endif + +#if defined(TFT1P3037) + &tft1p3037_lcm_drv, +#endif + +#if defined(HA5266) + &ha5266_lcm_drv, +#endif + +#if defined(HSD070IDW1) + &hsd070idw1_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI) + &hx8363_6575_dsi_lcm_drv, +#endif + +#if defined(HX8363_6575_DSI_HVGA) + &hx8363_6575_dsi_hvga_lcm_drv, +#endif + +#if defined(HX8363B_WVGA_DSI_CMD) + &hx8363b_wvga_dsi_cmd_drv, +#endif + +#if defined(LG4571) + &lg4571_lcm_drv, +#endif + +#if defined(LG4573B_WVGA_DSI_VDO_LH430MV1) + &lg4573b_wvga_dsi_vdo_lh430mv1_drv, +#endif + +#if defined(LVDS_WSVGA) + &lvds_wsvga_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI) + &lvds_wsvga_ti_lcm_drv, +#endif + +#if defined(LVDS_WSVGA_TI_N) + &lvds_wsvga_ti_n_lcm_drv, +#endif + +#if defined(NT35565_3D) + &nt35565_3d_lcm_drv, +#endif + +#if defined(TM070DDH03) + &tm070ddh03_lcm_drv, +#endif +#if defined(R63303_IDISPLAY) + &r63303_idisplay_lcm_drv, +#endif + +#if defined(HX8369B_DSI_VDO) + &hx8369b_dsi_vdo_lcm_drv, +#endif + +#if defined(HX8369B_WVGA_DSI_VDO) + &hx8369b_wvga_dsi_vdo_drv, +#endif + +#if defined(HX8369B_QHD_DSI_VDO) + &hx8389b_qhd_dsi_vdo_drv, +#endif + +#if defined(GN_SSD2825_SMD_S6E8AA) + &gn_ssd2825_smd_s6e8aa, +#endif +#if defined(HX8369_TM_DSI) + &hx8369_dsi_tm_lcm_drv, +#endif + +#if defined(HX8369_BLD_DSI) + &hx8369_dsi_bld_lcm_drv, +#endif + +#if defined(HJ080IA) + &hj080ia_lcm_drv, +#endif + +#if defined(HJ101NA02A) + &hj101na02a_lcm_drv, +#endif + +#if defined(HJ101NA02A_8135) + &hj101na02a_8135_lcm_drv, +#endif + +#if defined(HSD070PFW3) + &hsd070pfw3_lcm_drv, +#endif + +#if defined(HSD070PFW3_8135) + &hsd070pfw3_8135_lcm_drv, +#endif + +#if defined(EJ101IA) + &ej101ia_lcm_drv, +#endif + +#if defined(SCF0700M48GGU02) + &scf0700m48ggu02_lcm_drv, +#endif + +#if defined(OTM1280A_HD720_DSI_CMD) + &otm1280a_hd720_dsi_cmd_drv, +#endif + +#if defined(OTM8018B_DSI_VDO) + &otm8018b_dsi_vdo_lcm_drv, +#endif + +#if defined(NT35512_DSI_VDO) + &nt35512_dsi_vdo_lcm_drv, +#endif + +#if defined(NT35512_WVGA_DSI_VDO_BOE) + &nt35512_wvga_dsi_vdo_boe_drv, +#endif + +#if defined(HX8392A_DSI_CMD) + &hx8392a_dsi_cmd_lcm_drv, +#endif + +#if defined(NT35516_QHD_DSI_CMD_IPSBOE) + &nt35516_qhd_dsi_cmd_ipsboe_lcm_drv, +#endif + +#if defined(NT35516_QHD_DSI_CMD_IPSBOE_WVGA) + &nt35516_qhd_dsi_cmd_ipsboe_wvga_lcm_drv, +#endif + +#if defined(NT35516_QHD_DSI_CMD_IPSBOE_FWVGA) + &nt35516_qhd_dsi_cmd_ipsboe_fwvga_lcm_drv, +#endif + +#if defined(NT35516_QHD_DSI_CMD_IPS9K1431) + &nt35516_qhd_dsi_cmd_ips9k1431_drv, +#endif + +#if defined(NT35516_QHD_DSI_CMD_TFT9K1342) + &nt35516_qhd_dsi_cmd_tft9k1342_drv, +#endif + +#if defined(NT35516_QHD_DSI_VEDIO) + &nt35516_qhd_rav4_lcm_drv, +#endif + +#if defined(BP070WS1) + &bp070ws1_lcm_drv, +#endif + +#if defined(BP101WX1) + &bp101wx1_lcm_drv, +#endif + +#if defined(BP101WX1_N) + &bp101wx1_n_lcm_drv, +#endif + +#if defined(CM_N070ICE_DSI_VDO) + &cm_n070ice_dsi_vdo_lcm_drv, +#endif + +#if defined(CM_OTC3108BH161_DSI_VDO) + &cm_otc3108bhv161_dsi_vdo_lcm_drv, +#endif +#if defined(NT35510_FWVGA) + &nt35510_fwvga_lcm_drv, +#endif + +#if defined(R63311_FHD_DSI_VDO_SHARP) + &r63311_fhd_dsi_vdo_sharp_lcm_drv, +#endif + +#if defined(R81592_HVGA_DSI_CMD) + &r81592_hvga_dsi_cmd_drv, +#endif + +#if defined(RM68190_QHD_DSI_VDO) + &rm68190_dsi_vdo_lcm_drv, +#endif + +#if defined(NT35596_FHD_DSI_VDO_TRULY) + &nt35596_fhd_dsi_vdo_truly_lcm_drv, +#endif + +#if defined(NT35595_FHD_DSI_VDO_TRULY) + &nt35595_fhd_dsi_vdo_truly_lcm_drv, +#endif + +#if defined(R63319_WQHD_DSI_VDO_TRULY) + &r63319_wqhd_dsi_vdo_truly_lcm_drv, +#endif + + +#if defined(NT35598_WQHD_DSI_VDO_TRULY) + &nt35598_wqhd_dsi_vdo_truly_lcm_drv, +#endif + +#if defined(NT35595_FHD_DSI_CMD_TRULY_TPS65132) + &nt35595_fhd_dsi_cmd_truly_tps65132_lcm_drv, +#endif + +#if defined(NT35595_FHD_DSI_CMD_TRULY_TPS65132_720P) + &nt35595_fhd_dsi_cmd_truly_tps65132_720p_lcm_drv, +#endif + +#if defined(NT35595_FHD_DSI_CMD_TRULY) + &nt35595_fhd_dsi_cmd_truly_lcm_drv, +#endif + + +#if defined(NT35596_FHD_DSI_VDO_YASSY) + &nt35596_fhd_dsi_vdo_yassy_lcm_drv, +#endif + +#if defined(AUO_B079XAT02_DSI_VDO) + &auo_b079xat02_dsi_vdo_lcm_drv, +#endif +#if defined(OTM9608_WVGA_DSI_CMD) + &otm9608_wvga_dsi_cmd_drv, +#endif + +#if defined(NT35510_DBI_18BIT_GIONEE) + &nt35510_dbi_18bit_gionee_lcm_drv, +#endif + +#if defined(OTM8009A_FWVGA_DSI_CMD_TIANMA) + &otm8009a_fwvga_dsi_cmd_tianma_lcm_drv, +#endif + +#if defined(OTM8009A_FWVGA_DSI_VDO_TIANMA) + &otm8009a_fwvga_dsi_vdo_tianma_lcm_drv, +#endif + +#if defined(HX8389B_QHD_DSI_VDO_TIANMA) + &hx8389b_qhd_dsi_vdo_tianma_lcm_drv, +#endif +#if defined(HX8389B_QHD_DSI_VDO_TIANMA055XDHP) + &hx8389b_qhd_dsi_vdo_tianma055xdhp_lcm_drv, +#endif + +#if defined(CPT_CLAA101FP01_DSI_VDO) + &cpt_claa101fp01_dsi_vdo_lcm_drv, +#endif + +#if defined(IT6151_EDP_DSI_VIDEO_SHARP) + &it6151_edp_dsi_video_sharp_lcm_drv, +#endif + +#if defined(CPT_CLAP070WP03XG_SN65DSI83) + &cpt_clap070wp03xg_sn65dsi83_lcm_drv, +#endif +#if defined(NT35520_HD720_DSI_CMD_TM) + &nt35520_hd720_tm_lcm_drv, +#endif +#if defined(NT35520_HD720_DSI_CMD_BOE) + &nt35520_hd720_boe_lcm_drv, +#endif +#if defined(NT35521_HD720_DSI_VDO_BOE) + &nt35521_hd720_dsi_vdo_boe_lcm_drv, +#endif +#if defined(NT35521_HD720_DSI_VIDEO_TM) + &nt35521_hd720_tm_lcm_drv, +#endif +#if defined(H070D_18DM) + &h070d_18dm_lcm_drv, +#endif +#if defined(R69429_WUXGA_DSI_VDO) + &r69429_wuxga_dsi_vdo_lcm_drv, +#endif + + +#if defined(HX8394A_HD720_DSI_VDO_TIANMA) + &hx8394a_hd720_dsi_vdo_tianma_lcm_drv, +#endif + +#if defined(R69429_WUXGA_DSI_CMD) + &r69429_wuxga_dsi_cmd_lcm_drv, +#endif + +#if defined(RM68210_HD720_DSI_UFOE_CMD) + &rm68210_hd720_dsi_ufoe_cmd_lcm_drv, +#endif + +#if defined(CPT_CLAP070WP03XG_LVDS) + &cpt_clap070wp03xg_lvds_lcm_drv, +#endif + +#if defined(OTM8018B_DSI_VDO_LCSH72) + &otm8018b_dsi_vdo_lcsh72_lcm_drv, +#endif + +#if defined(HX8369_DSI_CMD_6571) + &hx8369_dsi_cmd_6571_lcm_drv, +#endif + +#if defined(HX8369_DSI_VDO_6571) + &hx8369_dsi_vdo_6571_lcm_drv, +#endif + +#if defined(HX8369_DBI_6571) + &hx8369_dbi_6571_lcm_drv, +#endif + +#if defined(HX8369_DPI_6571) + &hx8369_dpi_6571_lcm_drv, +#endif + +#if defined(HX8389B_QHD_DSI_VDO_LGD) + &hx8389b_qhd_dsi_vdo_lgd_lcm_drv, +#endif + +#if defined(NT35510_DSI_CMD_6571) + &nt35510_dsi_cmd_6571_lcm_drv, +#endif + +#if defined(NT35510_DSI_CMD_6571_HVGA) + &nt35510_dsi_cmd_6571_hvga_lcm_drv, +#endif + +#if defined(NT35510_DSI_CMD_6571_QVGA) + &nt35510_dsi_cmd_6571_qvga_lcm_drv, +#endif + +#if defined(NT35510_DSI_VDO_6571) + &nt35510_dsi_vdo_6571_lcm_drv, +#endif + +#if defined(NT35510_DBI_6571) + &nt35510_dbi_6571_lcm_drv, +#endif + +#if defined(NT35510_DPI_6571) + &nt35510_dpi_6571_lcm_drv, +#endif + +#if defined(NT35590_DSI_CMD_6571_FWVGA) + &nt35590_dsi_cmd_6571_fwvga_lcm_drv, +#endif + +#if defined(NT35590_DSI_CMD_6571_QHD) + &nt35590_dsi_cmd_6571_qhd_lcm_drv, +#endif + +#if defined(NT35517_QHD_DSI_VIDEO) + &nt35517_qhd_dsi_vdo_lcm_drv, +#endif + +#if defined(IT6151_FHD_EDP_DSI_VIDEO_AUO) + &it6151_fhd_edp_dsi_video_auo_lcm_drv, +#endif + +#if defined(A080EAN01_DSI_VDO) + &a080ean01_dsi_vdo_lcm_drv, +#endif +}; + +#define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) +#define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line) +#define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1] + +unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*); +/*LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*));*/ +#if defined(NT35520_HD720_DSI_CMD_TM) | defined(NT35520_HD720_DSI_CMD_BOE) | defined(NT35521_HD720_DSI_VDO_BOE) | defined(NT35521_HD720_DSI_VIDEO_TM) +#ifdef BUILD_LK +extern void mdelay(unsigned long msec); +#endif +static unsigned char lcd_id_pins_value = 0xFF; + + +/****************************************************************************** +Function: which_lcd_module_triple + Description: read LCD ID PIN status,could identify three status:high¡¢low¡¢float + Input: none + Output: none + Return: LCD ID1|ID0 value + Others: +******************************************************************************/ +unsigned char which_lcd_module_triple(void) +{ + unsigned char high_read0 = 0; + unsigned char low_read0 = 0; + unsigned char high_read1 = 0; + unsigned char low_read1 = 0; + unsigned char lcd_id0 = 0; + unsigned char lcd_id1 = 0; + unsigned char lcd_id = 0; + //Solve Coverity scan warning : check return value + unsigned int ret = 0; + //only recognise once + if(0xFF != lcd_id_pins_value) + { + return lcd_id_pins_value; + } + //Solve Coverity scan warning : check return value + ret = mt_set_gpio_mode(GPIO_DISP_ID0_PIN, GPIO_MODE_00); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_mode fail\n"); + } + ret = mt_set_gpio_dir(GPIO_DISP_ID0_PIN, GPIO_DIR_IN); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_dir fail\n"); + } + ret = mt_set_gpio_pull_enable(GPIO_DISP_ID0_PIN, GPIO_PULL_ENABLE); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_pull_enable fail\n"); + } + ret = mt_set_gpio_mode(GPIO_DISP_ID1_PIN, GPIO_MODE_00); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_mode fail\n"); + } + ret = mt_set_gpio_dir(GPIO_DISP_ID1_PIN, GPIO_DIR_IN); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_dir fail\n"); + } + ret = mt_set_gpio_pull_enable(GPIO_DISP_ID1_PIN, GPIO_PULL_ENABLE); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_pull_enable fail\n"); + } + //pull down ID0 ID1 PIN + ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN,GPIO_PULL_DOWN); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n"); + } + ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN,GPIO_PULL_DOWN); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n"); + } + //delay 100ms , for discharging capacitance + mdelay(100); + //get ID0 ID1 status + low_read0 = mt_get_gpio_in(GPIO_DISP_ID0_PIN); + low_read1 = mt_get_gpio_in(GPIO_DISP_ID1_PIN); + //pull up ID0 ID1 PIN + ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN,GPIO_PULL_UP); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_pull_select->UP fail\n"); + } + ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN,GPIO_PULL_UP); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_pull_select->UP fail\n"); + } + //delay 100ms , for charging capacitance + mdelay(100); + //get ID0 ID1 status + high_read0 = mt_get_gpio_in(GPIO_DISP_ID0_PIN); + high_read1 = mt_get_gpio_in(GPIO_DISP_ID1_PIN); + + if( low_read0 != high_read0 ) + { + /*float status , pull down ID0 ,to prevent electric leakage*/ + ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN,GPIO_PULL_DOWN); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n"); + } + lcd_id0 = LCD_HW_ID_STATUS_FLOAT; + } + else if((LCD_HW_ID_STATUS_LOW == low_read0) && (LCD_HW_ID_STATUS_LOW == high_read0)) + { + /*low status , pull down ID0 ,to prevent electric leakage*/ + ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN,GPIO_PULL_DOWN); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_pull_select->Down fail\n"); + } + lcd_id0 = LCD_HW_ID_STATUS_LOW; + } + else if((LCD_HW_ID_STATUS_HIGH == low_read0) && (LCD_HW_ID_STATUS_HIGH == high_read0)) + { + /*high status , pull up ID0 ,to prevent electric leakage*/ + ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN,GPIO_PULL_UP); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_pull_select->UP fail\n"); + } + lcd_id0 = LCD_HW_ID_STATUS_HIGH; + } + else + { + LCD_DEBUG(" Read LCD_id0 error\n"); + ret = mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN,GPIO_PULL_DISABLE); + if(0 != ret) + { + LCD_DEBUG("ID0 mt_set_gpio_pull_select->Disbale fail\n"); + } + lcd_id0 = LCD_HW_ID_STATUS_ERROR; + } + + + if( low_read1 != high_read1 ) + { + /*float status , pull down ID1 ,to prevent electric leakage*/ + ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN,GPIO_PULL_DOWN); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n"); + } + lcd_id1 = LCD_HW_ID_STATUS_FLOAT; + } + else if((LCD_HW_ID_STATUS_LOW == low_read1) && (LCD_HW_ID_STATUS_LOW == high_read1)) + { + /*low status , pull down ID1 ,to prevent electric leakage*/ + ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN,GPIO_PULL_DOWN); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_pull_select->Down fail\n"); + } + lcd_id1 = LCD_HW_ID_STATUS_LOW; + } + else if((LCD_HW_ID_STATUS_HIGH == low_read1) && (LCD_HW_ID_STATUS_HIGH == high_read1)) + { + /*high status , pull up ID1 ,to prevent electric leakage*/ + ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN,GPIO_PULL_UP); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_pull_select->UP fail\n"); + } + lcd_id1 = LCD_HW_ID_STATUS_HIGH; + } + else + { + + LCD_DEBUG(" Read LCD_id1 error\n"); + ret = mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN,GPIO_PULL_DISABLE); + if(0 != ret) + { + LCD_DEBUG("ID1 mt_set_gpio_pull_select->Disable fail\n"); + } + lcd_id1 = LCD_HW_ID_STATUS_ERROR; + } +#ifdef BUILD_LK + dprintf(CRITICAL,"which_lcd_module_triple,lcd_id0:%d\n",lcd_id0); + dprintf(CRITICAL,"which_lcd_module_triple,lcd_id1:%d\n",lcd_id1); +#else + printk("which_lcd_module_triple,lcd_id0:%d\n",lcd_id0); + printk("which_lcd_module_triple,lcd_id1:%d\n",lcd_id1); +#endif + lcd_id = lcd_id0 | (lcd_id1 << 2); + +#ifdef BUILD_LK + dprintf(CRITICAL,"which_lcd_module_triple,lcd_id:%d\n",lcd_id); +#else + printk("which_lcd_module_triple,lcd_id:%d\n",lcd_id); +#endif + + lcd_id_pins_value = lcd_id; + return lcd_id; +} +#endif diff --git a/arch/arm/mach-mt8127/ford/leds/Makefile b/arch/arm/mach-mt8127/ford/leds/Makefile new file mode 100755 index 00000000000..5581b72bc32 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/leds/Makefile @@ -0,0 +1,5 @@ + +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-$(CONFIG_MTK_LEDS) += mt65xx/ + diff --git a/arch/arm/mach-mt8127/ford/leds/mt65xx/Makefile b/arch/arm/mach-mt8127/ford/leds/mt65xx/Makefile new file mode 100755 index 00000000000..a6906ffcfd5 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/leds/mt65xx/Makefile @@ -0,0 +1,3 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := cust_leds.o diff --git a/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds.c b/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds.c new file mode 100644 index 00000000000..c152acc299f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds.c @@ -0,0 +1,128 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +extern int disp_bls_set_backlight(unsigned int level); + +// Only support 64 levels of backlight (when lcd-backlight = MT65XX_LED_MODE_PWM) +#define BACKLIGHT_LEVEL_PWM_64_FIFO_MODE_SUPPORT 64 +// Support 256 levels of backlight (when lcd-backlight = MT65XX_LED_MODE_PWM) +#define BACKLIGHT_LEVEL_PWM_256_SUPPORT 256 + +// Configure the support type "BACKLIGHT_LEVEL_PWM_256_SUPPORT" or "BACKLIGHT_LEVEL_PWM_64_FIFO_MODE_SUPPORT" !! +#define BACKLIGHT_LEVEL_PWM_MODE_CONFIG BACKLIGHT_LEVEL_PWM_256_SUPPORT + +unsigned int Cust_GetBacklightLevelSupport_byPWM(void) +{ + return BACKLIGHT_LEVEL_PWM_MODE_CONFIG; +} + +unsigned int brightness_mapping(unsigned int level) +{ + unsigned int mapped_level; + + mapped_level = level; + + return mapped_level; +} +/* +unsigned int Cust_SetBacklight(int level, int div) +{ + kal_uint32 ret=0; +// mtkfb_set_backlight_pwm(div); +// mtkfb_set_backlight_level(brightness_mapping(level)); + + + * To explain How to set these para for cust_led_list[] of led/backlight + * "name" para: led or backlight + * "mode" para:which mode for led/backlight + * such as: + * MT65XX_LED_MODE_NONE, + * MT65XX_LED_MODE_PWM, + * MT65XX_LED_MODE_GPIO, + * MT65XX_LED_MODE_PMIC, + * MT65XX_LED_MODE_CUST_LCM, + * MT65XX_LED_MODE_CUST_BLS_PWM + * + *"data" para: control methord for led/backlight + * such as: + * MT65XX_LED_PMIC_LCD_ISINK=0, + * MT65XX_LED_PMIC_NLED_ISINK0, + * MT65XX_LED_PMIC_NLED_ISINK1, + * MT65XX_LED_PMIC_NLED_ISINK2, + * MT65XX_LED_PMIC_NLED_ISINK3 + * + *"PWM_config" para:PWM(AP side Or BLS module), by default setting{0,0,0,0,0} Or {0} + *struct PWM_config { + * int clock_source; + * int div; + * int low_duration; + * int High_duration; + * BOOL pmic_pad;//AP side PWM pin in PMIC chip (only 89 needs confirm); 1:yes 0:no(default) + *}; + *------------------------------------------------------------------------------------------- + * for AP PWM setting as follow: + *1. PWM config data + * clock_source: clock source frequency, can be 0/1 + * div: clock division, can be any value within 0~7 (i.e. 1/2^(div) = /1, /2, /4, /8, /16, /32, /64, /128) + * low_duration: only for BACKLIGHT_LEVEL_PWM_64_FIFO_MODE_SUPPORT + * High_duration: only for BACKLIGHT_LEVEL_PWM_64_FIFO_MODE_SUPPORT + * + *2. PWM freq. + * If BACKLIGHT_LEVEL_PWM_MODE_CONFIG = BACKLIGHT_LEVEL_PWM_256_SUPPORT, + * PWM freq. = clock source / 2^(div) / 256 + * + * If BACKLIGHT_LEVEL_PWM_MODE_CONFIG = BACKLIGHT_LEVEL_PWM_64_FIFO_MODE_SUPPORT, + * PWM freq. = clock source / 2^(div) / [(High_duration+1)(Level')+(low_duration+1)(64 - Level')] + * = clock source / 2^(div) / [(High_duration+1)*64] (when low_duration = High_duration) + *Clock source: + * 0: block clock/1625 = 26M/1625 = 16K (MT6571) + * 1: block clock = 26M (MT6571) + *Div: 0~7 + * + *For example, in MT6571, PWM_config = {1,1,0,0,0} + * ==> PWM freq. = 26M/2^1/256 = 50.78 KHz ( when BACKLIGHT_LEVEL_PWM_256_SUPPORT ) + * ==> PWM freq. = 26M/2^1/(0+1)*64 = 203.13 KHz ( when BACKLIGHT_LEVEL_PWM_64_FIFO_MODE_SUPPORT ) + *------------------------------------------------------------------------------------------- + * for BLS PWM setting as follow: + *1. PWM config data + * clock_source: clock source frequency, can be 0/1/2/3 + * div: clock division, can be any value within 0~1023 + * low_duration: non-use + * High_duration: non-use + * pmic_pad: non-use + * + *2. PWM freq.= clock source / (div + 1) /1024 + *Clock source: + * 0: 26 MHz + * 1: 104 MHz + * 2: 124.8 MHz + * 3: 156 MHz + *Div: 0~1023 + * + *By default, clock_source = 0 and div = 0 => PWM freq. = 26 KHz + *------------------------------------------------------------------------------------------- + */ +static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = { + {"red", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK2,{0}}, + {"green", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK1,{0}}, + {"blue", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0,{0}}, + {"jogball-backlight", MT65XX_LED_MODE_NONE, -1,{0}}, + {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1,{0}}, + {"button-backlight", MT65XX_LED_MODE_NONE, -1,{0}}, + {"lcd-backlight", MT65XX_LED_MODE_CUST_BLS_PWM, (int)disp_bls_set_backlight,{0,0,0,0,0}}, +}; + +struct cust_mt65xx_led *get_cust_led_list(void) +{ + return cust_led_list; +} + diff --git a/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds.h b/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds.h new file mode 100644 index 00000000000..2fd28733209 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds.h @@ -0,0 +1,20 @@ +#ifndef _CUST_LEDS_H +#define _CUST_LEDS_H + +#include +enum mt65xx_led_type +{ + MT65XX_LED_TYPE_RED = 0, + MT65XX_LED_TYPE_GREEN, + MT65XX_LED_TYPE_BLUE, + MT65XX_LED_TYPE_JOGBALL, + MT65XX_LED_TYPE_KEYBOARD, + MT65XX_LED_TYPE_BUTTON, + MT65XX_LED_TYPE_LCD, + MT65XX_LED_TYPE_TOTAL, +}; + + + +#endif + diff --git a/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds_def.h b/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds_def.h new file mode 100644 index 00000000000..0824e0368cf --- /dev/null +++ b/arch/arm/mach-mt8127/ford/leds/mt65xx/cust_leds_def.h @@ -0,0 +1,53 @@ +#ifndef _CUST_LEDS_DEF_H +#define _CUST_LEDS_DEF_H + +//#define CUST_LEDS_BACKLIGHT_PMIC_PARA /* parallel */ +//#define CUST_LEDS_BACKLIGHT_PMIC_SERI /* series */ +enum mt65xx_led_mode +{ + MT65XX_LED_MODE_NONE, + MT65XX_LED_MODE_PWM, + MT65XX_LED_MODE_GPIO, + MT65XX_LED_MODE_PMIC, + //MT65XX_LED_MODE_CUST, + MT65XX_LED_MODE_CUST_LCM, + MT65XX_LED_MODE_CUST_BLS_PWM +}; + +enum mt65xx_led_pmic +{ + MT65XX_LED_PMIC_LCD_ISINK=0, + MT65XX_LED_PMIC_NLED_ISINK0, + MT65XX_LED_PMIC_NLED_ISINK1, + MT65XX_LED_PMIC_NLED_ISINK2, + MT65XX_LED_PMIC_NLED_ISINK3 +}; +struct PWM_config +{ + int clock_source; + int div; + int low_duration; + int High_duration; + BOOL pmic_pad; +}; +typedef int (*cust_brightness_set)(int level, int div); +typedef int (*cust_set_brightness)(int level); + +/* + * name : must the same as lights HAL + * mode : control mode + * data : + * PWM: pwm number + * GPIO: gpio id + * PMIC: enum mt65xx_led_pmic + * CUST: custom set brightness function pointer +*/ +struct cust_mt65xx_led { + char *name; + enum mt65xx_led_mode mode; + int data; + struct PWM_config config_data; +}; + +extern struct cust_mt65xx_led *get_cust_led_list(void); +#endif /* _CUST_LEDS_DEF_H */ diff --git a/arch/arm/mach-mt8127/ford/lens/Makefile b/arch/arm/mach-mt8127/ford/lens/Makefile new file mode 100755 index 00000000000..1d76c11a1b8 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/Makefile @@ -0,0 +1,3 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := dummy_lens.o diff --git a/arch/arm/mach-mt8127/ford/lens/dummy_lens.c b/arch/arm/mach-mt8127/ford/lens/dummy_lens.c new file mode 100644 index 00000000000..f6ac5876877 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/dummy_lens.c @@ -0,0 +1,40 @@ +/* + * MD218A voice coil motor driver + * + * + */ + +#include +#include +#include +#include +#include +#include +#include + + +//#define DUMMY_LENS_DEBUG +#ifdef DUMMY_LENS_DEBUG +#define DUMMY_LENSDB printk +#else +#define DUMMY_LENSDB(x,...) +#endif + +static int __init DUMMY_LENS_i2C_init(void) +{ + return 0; +} + +static void __exit DUMMY_LENS_i2C_exit(void) +{ + +} + +module_init(DUMMY_LENS_i2C_init); +module_exit(DUMMY_LENS_i2C_exit); + +MODULE_DESCRIPTION("Dummy lens module driver"); +MODULE_AUTHOR("KY Chen "); +MODULE_LICENSE("GPL"); + + diff --git a/arch/arm/mach-mt8127/ford/lens/inc/AD5820AF.h b/arch/arm/mach-mt8127/ford/lens/inc/AD5820AF.h new file mode 100644 index 00000000000..2a7d08a1090 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/AD5820AF.h @@ -0,0 +1,43 @@ +#ifndef _AD5820AF_H +#define _AD5820AF_H + +#include +//#include "kd_imgsensor.h" + +#define AD5820AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stAD5820AF_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define AD5820AFIOC_G_MOTORINFO _IOR(AD5820AF_MAGIC,0,stAD5820AF_MotorInfo) + +#define AD5820AFIOC_T_MOVETO _IOW(AD5820AF_MAGIC,1,unsigned long) + +#define AD5820AFIOC_T_SETINFPOS _IOW(AD5820AF_MAGIC,2,unsigned long) + +#define AD5820AFIOC_T_SETMACROPOS _IOW(AD5820AF_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/AD5823.h b/arch/arm/mach-mt8127/ford/lens/inc/AD5823.h new file mode 100644 index 00000000000..d960c3d7fbe --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/AD5823.h @@ -0,0 +1,43 @@ +#ifndef _AD5823_H +#define _AD5823_H + +#include +//#include "kd_imgsensor.h" + +#define AD5823_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stAD5823_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define AD5823IOC_G_MOTORINFO _IOR(AD5823_MAGIC,0,stAD5823_MotorInfo) + +#define AD5823IOC_T_MOVETO _IOW(AD5823_MAGIC,1,unsigned long) + +#define AD5823IOC_T_SETINFPOS _IOW(AD5823_MAGIC,2,unsigned long) + +#define AD5823IOC_T_SETMACROPOS _IOW(AD5823_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/AD5823AF.h b/arch/arm/mach-mt8127/ford/lens/inc/AD5823AF.h new file mode 100644 index 00000000000..6ef68305c29 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/AD5823AF.h @@ -0,0 +1,43 @@ +#ifndef _AD5823AF_H +#define _AD5823AF_H + +#include +//#include "kd_imgsensor.h" + +#define AD5823AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stAD5823AF_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define AD5823AFIOC_G_MOTORINFO _IOR(AD5823AF_MAGIC,0,stAD5823AF_MotorInfo) + +#define AD5823AFIOC_T_MOVETO _IOW(AD5823AF_MAGIC,1,unsigned long) + +#define AD5823AFIOC_T_SETINFPOS _IOW(AD5823AF_MAGIC,2,unsigned long) + +#define AD5823AFIOC_T_SETMACROPOS _IOW(AD5823AF_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/BU6424AF.h b/arch/arm/mach-mt8127/ford/lens/inc/BU6424AF.h new file mode 100644 index 00000000000..f2be508b605 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/BU6424AF.h @@ -0,0 +1,43 @@ +#ifndef _BU6424AF_H +#define _BU6424AF_H + +#include +//#include "kd_imgsensor.h" + +#define BU6424AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stBU6424AF_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define BU6424AFIOC_G_MOTORINFO _IOR(BU6424AF_MAGIC,0,stBU6424AF_MotorInfo) + +#define BU6424AFIOC_T_MOVETO _IOW(BU6424AF_MAGIC,1,unsigned long) + +#define BU6424AFIOC_T_SETINFPOS _IOW(BU6424AF_MAGIC,2,unsigned long) + +#define BU6424AFIOC_T_SETMACROPOS _IOW(BU6424AF_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/BU6429AF.h b/arch/arm/mach-mt8127/ford/lens/inc/BU6429AF.h new file mode 100644 index 00000000000..37997bfdc69 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/BU6429AF.h @@ -0,0 +1,43 @@ +#ifndef _BU6429AF_H +#define _BU6429AF_H + +#include +//#include "kd_imgsensor.h" + +#define BU6429AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stBU6429AF_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define BU6429AFIOC_G_MOTORINFO _IOR(BU6429AF_MAGIC,0,stBU6429AF_MotorInfo) + +#define BU6429AFIOC_T_MOVETO _IOW(BU6429AF_MAGIC,1,unsigned long) + +#define BU6429AFIOC_T_SETINFPOS _IOW(BU6429AF_MAGIC,2,unsigned long) + +#define BU6429AFIOC_T_SETMACROPOS _IOW(BU6429AF_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/DW9714AF.h b/arch/arm/mach-mt8127/ford/lens/inc/DW9714AF.h new file mode 100644 index 00000000000..45ce7be3018 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/DW9714AF.h @@ -0,0 +1,81 @@ +#ifndef _DW9714AF_H +#define _DW9714AF_H + +#include +//#include "kd_imgsensor.h" + +#define DW9714AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stDW9714AF_MotorInfo; + + +//Structures +//#define LensdrvCM3 +#ifdef LensdrvCM3 +typedef struct { + //APERTURE , won't be supported on most devices. + float Aperture; + //FILTER_DENSITY, won't be supported on most devices. + float FilterDensity; + //FOCAL_LENGTH, lens optical zoom setting. won't be supported on most devices. + float FocalLength; + //FOCAL_DISTANCE, current focus distance, lens to objects. + float FocalDistance; + //OPTICAL_STABILIZATION_MODE + u16 u4OIS_Mode; + //FACING + u16 Facing; + //Optical axis angle, optical axis is perpendicular to LCM, usually is {0,0}. + float OpticalAxisAng[2]; + //Optical axis position (mm), usually is {0,0,0}. + float Position[3]; + //Focus range, DOF, + float FocusRange; + //State + u16 State; + //INFO + float InfoAvalibleMinFocusDistance; + float InfoAvalibleApertures; + float InfoAvalibleFilterDensity; + u16 InfoAvalibleOptStabilization; + float InfoAvalibleFocalLength; + float InfoAvalibleHypeDistance; +}stDW9714AF_MotorMETAInfo; +#endif + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define DW9714AFIOC_G_MOTORINFO _IOR(DW9714AF_MAGIC,0,stDW9714AF_MotorInfo) + +#define DW9714AFIOC_T_MOVETO _IOW(DW9714AF_MAGIC,1,unsigned long) + +#define DW9714AFIOC_T_SETINFPOS _IOW(DW9714AF_MAGIC,2,unsigned long) + +#define DW9714AFIOC_T_SETMACROPOS _IOW(DW9714AF_MAGIC,3,unsigned long) +#ifdef LensdrvCM3 +#define DW9714AFIOC_G_MOTORMETAINFO _IOR(DW9714AF_MAGIC,4,stDW9714AF_MotorMETAInfo) +#endif + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/DW9718AF.h b/arch/arm/mach-mt8127/ford/lens/inc/DW9718AF.h new file mode 100644 index 00000000000..f18e46762de --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/DW9718AF.h @@ -0,0 +1,81 @@ +#ifndef _DW9718AF_H +#define _DW9718AF_H + +#include +//#include "kd_imgsensor.h" + +#define DW9718AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stDW9718AF_MotorInfo; + + +//Structures +//#define LensdrvCM3 +#ifdef LensdrvCM3 +typedef struct { + //APERTURE , won't be supported on most devices. + float Aperture; + //FILTER_DENSITY, won't be supported on most devices. + float FilterDensity; + //FOCAL_LENGTH, lens optical zoom setting. won't be supported on most devices. + float FocalLength; + //FOCAL_DISTANCE, current focus distance, lens to objects. + float FocalDistance; + //OPTICAL_STABILIZATION_MODE + u16 u4OIS_Mode; + //FACING + u16 Facing; + //Optical axis angle, optical axis is perpendicular to LCM, usually is {0,0}. + float OpticalAxisAng[2]; + //Optical axis position (mm), usually is {0,0,0}. + float Position[3]; + //Focus range, DOF, + float FocusRange; + //State + u16 State; + //INFO + float InfoAvalibleMinFocusDistance; + float InfoAvalibleApertures; + float InfoAvalibleFilterDensity; + u16 InfoAvalibleOptStabilization; + float InfoAvalibleFocalLength; + float InfoAvalibleHypeDistance; +}stDW9718AF_MotorMETAInfo; +#endif + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define DW9718AFIOC_G_MOTORINFO _IOR(DW9718AF_MAGIC,0,stDW9718AF_MotorInfo) + +#define DW9718AFIOC_T_MOVETO _IOW(DW9718AF_MAGIC,1,unsigned long) + +#define DW9718AFIOC_T_SETINFPOS _IOW(DW9718AF_MAGIC,2,unsigned long) + +#define DW9718AFIOC_T_SETMACROPOS _IOW(DW9718AF_MAGIC,3,unsigned long) +#ifdef LensdrvCM3 +#define DW9718AFIOC_G_MOTORMETAINFO _IOR(DW9718AF_MAGIC,4,stDW9718AF_MotorMETAInfo) +#endif + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/FM50AF.h b/arch/arm/mach-mt8127/ford/lens/inc/FM50AF.h new file mode 100644 index 00000000000..836f6f4c53d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/FM50AF.h @@ -0,0 +1,43 @@ +#ifndef _FM50AF_H +#define _FM50AF_H + +#include +//#include "kd_imgsensor.h" + +#define FM50AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +//Support SR? +bool bIsSupportSR; +} stFM50AF_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define FM50AFIOC_G_MOTORINFO _IOR(FM50AF_MAGIC,0,stFM50AF_MotorInfo) + +#define FM50AFIOC_T_MOVETO _IOW(FM50AF_MAGIC,1,unsigned long) + +#define FM50AFIOC_T_SETINFPOS _IOW(FM50AF_MAGIC,2,unsigned long) + +#define FM50AFIOC_T_SETMACROPOS _IOW(FM50AF_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/MT9P017AF.h b/arch/arm/mach-mt8127/ford/lens/inc/MT9P017AF.h new file mode 100644 index 00000000000..03b60c43d30 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/MT9P017AF.h @@ -0,0 +1,41 @@ +#ifndef _MT9P017AF_H +#define _MT9P017AF_H + +#include +//#include "kd_imgsensor.h" + +#define MT9P017AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +} stMT9P017AF_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define MT9P017AFIOC_G_MOTORINFO _IOR(MT9P017AF_MAGIC,0,stMT9P017AF_MotorInfo) + +#define MT9P017AFIOC_T_MOVETO _IOW(MT9P017AF_MAGIC,1,unsigned long) + +#define MT9P017AFIOC_T_SETINFPOS _IOW(MT9P017AF_MAGIC,2,unsigned long) + +#define MT9P017AFIOC_T_SETMACROPOS _IOW(MT9P017AF_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/lens/inc/OV8825AF.h b/arch/arm/mach-mt8127/ford/lens/inc/OV8825AF.h new file mode 100644 index 00000000000..37ae8e165c0 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/lens/inc/OV8825AF.h @@ -0,0 +1,41 @@ +#ifndef _OV8825AF_H +#define _OV8825AF_H + +#include +//#include "kd_imgsensor.h" + +#define OV8825AF_MAGIC 'A' +//IOCTRL(inode * ,file * ,cmd ,arg ) + + +//Structures +typedef struct { +//current position +unsigned long u4CurrentPosition; +//macro position +unsigned long u4MacroPosition; +//Infiniti position +unsigned long u4InfPosition; +//Motor Status +bool bIsMotorMoving; +//Motor Open? +bool bIsMotorOpen; +} stOV8825AF_MotorInfo; + +//Control commnad +//S means "set through a ptr" +//T means "tell by a arg value" +//G means "get by a ptr" +//Q means "get by return a value" +//X means "switch G and S atomically" +//H means "switch T and Q atomically" +#define OV8825AFIOC_G_MOTORINFO _IOR(OV8825AF_MAGIC,0,stOV8825AF_MotorInfo) + +#define OV8825AFIOC_T_MOVETO _IOW(OV8825AF_MAGIC,1,unsigned long) + +#define OV8825AFIOC_T_SETINFPOS _IOW(OV8825AF_MAGIC,2,unsigned long) + +#define OV8825AFIOC_T_SETMACROPOS _IOW(OV8825AF_MAGIC,3,unsigned long) + +#else +#endif diff --git a/arch/arm/mach-mt8127/ford/magnetometer/Makefile b/arch/arm/mach-mt8127/ford/magnetometer/Makefile new file mode 100755 index 00000000000..8b9466605d4 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/magnetometer/Makefile @@ -0,0 +1,3 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += cust_mag.o \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/magnetometer/akm09911.c b/arch/arm/mach-mt8127/ford/magnetometer/akm09911.c new file mode 100644 index 00000000000..d361d2548fc --- /dev/null +++ b/arch/arm/mach-mt8127/ford/magnetometer/akm09911.c @@ -0,0 +1,2788 @@ +/* akm09911.c - akm09911 compass driver + * + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +//#include +#include +#include +#include + + +#define POWER_NONE_MACRO MT65XX_POWER_NONE + +#include +#include "akm09911.h" +#include + +/*----------------------------------------------------------------------------*/ +#define DEBUG 0 +#define AKM09911_DEV_NAME "akm09911" +#define DRIVER_VERSION "1.0.1" +/*----------------------------------------------------------------------------*/ +#define AKM09911_DEBUG 1 +#define AKM09911_DEBUG_MSG 0 +#define AKM09911_DEBUG_FUNC 0 +#define AKM09911_DEBUG_DATA 1 +#define MAX_FAILURE_COUNT 3 +#define AKM09911_RETRY_COUNT 10 +#define AKM09911_DEFAULT_DELAY 100 + +//#define AKM_Pseudogyro // enable this if you need use 6D gyro +//#define AKM_Device_AK8963 //if use AK09911 code to compatible AK8963C, need define this + + +#if AKM09911_DEBUG_MSG +#define AKMDBG(format, ...) printk(KERN_ERR "AKM09911 " format "\n", ## __VA_ARGS__) +#else +#define AKMDBG(format, ...) +#endif + +#if AKM09911_DEBUG_FUNC +#define AKMFUNC(func) printk(KERN_INFO "AKM09911 " func " is called\n") +#else +#define AKMFUNC(func) +#endif + +static struct i2c_client *this_client = NULL; + +/* Addresses to scan -- protected by sense_data_mutex */ +static char sense_data[SENSOR_DATA_SIZE]; +static struct mutex sense_data_mutex; +// calibration msensor and orientation data +static int sensor_data[CALIBRATION_DATA_SIZE]; +static struct mutex sensor_data_mutex; +static DECLARE_WAIT_QUEUE_HEAD(data_ready_wq); +static DECLARE_WAIT_QUEUE_HEAD(open_wq); + +static short akmd_delay = AKM09911_DEFAULT_DELAY; + +static atomic_t open_flag = ATOMIC_INIT(0); +static atomic_t m_flag = ATOMIC_INIT(0); +static atomic_t o_flag = ATOMIC_INIT(0); + +static int factory_mode=0; +static int ecompass_status = 0; + +static int mEnabled=0; + +static struct proc_dir_entry *akm09911_ecompass_status_proc = NULL; + + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +static const struct i2c_device_id akm09911_i2c_id[] = {{AKM09911_DEV_NAME,0},{}}; +static struct i2c_board_info __initdata i2c_akm09911={ I2C_BOARD_INFO("akm09911", (AKM09911_I2C_ADDRESS>>1))}; +/*the adapter id will be available in customization*/ +//static unsigned short akm09911_force[] = {0x00, AKM09911_I2C_ADDRESS, I2C_CLIENT_END, I2C_CLIENT_END}; +//static const unsigned short *const akm09911_forces[] = { akm09911_force, NULL }; +//static struct i2c_client_address_data akm09911_addr_data = { .forces = akm09911_forces,}; +/*----------------------------------------------------------------------------*/ +static int akm09911_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int akm09911_i2c_remove(struct i2c_client *client); +static int akm09911_i2c_detect(struct i2c_client *client, struct i2c_board_info *info); +static int akm_probe(struct platform_device *pdev); +static int akm_remove(struct platform_device *pdev); + + +/*----------------------------------------------------------------------------*/ +typedef enum { + AMK_FUN_DEBUG = 0x01, + AMK_DATA_DEBUG = 0X02, + AMK_HWM_DEBUG = 0X04, + AMK_CTR_DEBUG = 0X08, + AMK_I2C_DEBUG = 0x10, +} AMK_TRC; + + +/*----------------------------------------------------------------------------*/ +struct akm09911_i2c_data { + struct i2c_client *client; + struct mag_hw *hw; + atomic_t layout; + atomic_t trace; + struct hwmsen_convert cvt; +#if defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_drv; +#endif +}; +/*----------------------------------------------------------------------------*/ +static struct i2c_driver akm09911_i2c_driver = { + .driver = { +// .owner = THIS_MODULE, + .name = AKM09911_DEV_NAME, + }, + .probe = akm09911_i2c_probe, + .remove = akm09911_i2c_remove, + .detect = akm09911_i2c_detect, +#if !defined(CONFIG_HAS_EARLYSUSPEND) + .suspend = akm09911_suspend, + .resume = akm09911_resume, +#endif + .id_table = akm09911_i2c_id, +// .address_data = &akm09911_addr_data, +}; + +/*----------------------------------------------------------------------------*/ +static struct platform_driver akm_sensor_driver = { + .probe = akm_probe, + .remove = akm_remove, + .driver = { + .name = "msensor", + .owner = THIS_MODULE, + } +}; + + +/*----------------------------------------------------------------------------*/ +static atomic_t dev_open_count; +/*----------------------------------------------------------------------------*/ +static void akm09911_power(struct mag_hw *hw, unsigned int on) +{ + static unsigned int power_on = 0; + + if(hw->power_id != POWER_NONE_MACRO) + { + AKMDBG("power %s\n", on ? "on" : "off"); + if(power_on == on) + { + AKMDBG("ignore power control: %d\n", on); + } + else if(on) + { + if(!hwPowerOn(hw->power_id, hw->power_vol, "akm09911")) + { + printk(KERN_ERR "power on fails!!\n"); + } + } + else + { + if(!hwPowerDown(hw->power_id, "akm09911")) + { + printk(KERN_ERR "power off fail!!\n"); + } + } + } + power_on = on; +} +static long AKI2C_RxData(char *rxData, int length) +{ + uint8_t loop_i; + +#if DEBUG + int i; + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); + char addr = rxData[0]; +#endif + + + /* Caller should check parameter validity.*/ + if((rxData == NULL) || (length < 1)) + { + return -EINVAL; + } + + for(loop_i = 0; loop_i < AKM09911_RETRY_COUNT; loop_i++) + { + this_client->addr = this_client->addr & I2C_MASK_FLAG; + this_client->addr = this_client->addr | I2C_WR_FLAG; + if(i2c_master_send(this_client, (const char*)rxData, ((length<<0X08) | 0X01))) + { + break; + } + mdelay(10); + } + + if(loop_i >= AKM09911_RETRY_COUNT) + { + printk(KERN_ERR "%s retry over %d\n", __func__, AKM09911_RETRY_COUNT); + return -EIO; + } +#if DEBUG + if(atomic_read(&data->trace) & AMK_I2C_DEBUG) + { + printk(KERN_INFO "RxData: len=%02x, addr=%02x\n data=", length, addr); + for(i = 0; i < length; i++) + { + printk(KERN_INFO " %02x", rxData[i]); + } + printk(KERN_INFO "\n"); + } +#endif + return 0; +} + +static long AKI2C_TxData(char *txData, int length) +{ + uint8_t loop_i; + +#if DEBUG + int i; + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + + /* Caller should check parameter validity.*/ + if ((txData == NULL) || (length < 2)) + { + return -EINVAL; + } + + this_client->addr = this_client->addr & I2C_MASK_FLAG; + for(loop_i = 0; loop_i < AKM09911_RETRY_COUNT; loop_i++) + { + if(i2c_master_send(this_client, (const char*)txData, length) > 0) + { + break; + } + mdelay(10); + } + + if(loop_i >= AKM09911_RETRY_COUNT) + { + printk(KERN_ERR "%s retry over %d\n", __func__, AKM09911_RETRY_COUNT); + return -EIO; + } +#if DEBUG + if(atomic_read(&data->trace) & AMK_I2C_DEBUG) + { + printk(KERN_INFO "TxData: len=%02x, addr=%02x\n data=", length, txData[0]); + for(i = 0; i < (length-1); i++) + { + printk(KERN_INFO " %02x", txData[i + 1]); + } + printk(KERN_INFO "\n"); + } +#endif + return 0; +} + +/* +static long AKECS_Set_CNTL1(unsigned char mode) +{ + unsigned char buffer[2]; + //int err; + + //Set measure mode + buffer[0] = AK09911_REG_CNTL1; + buffer[1] = mode; + + return AKI2C_TxData(buffer, 2);; +} +*/ + + +static long AKECS_SetMode_SngMeasure(void) +{ + char buffer[2]; + #ifdef AKM_Device_AK8963 + + buffer[0] = AK8963_REG_CNTL1; + buffer[1] = AK8963_MODE_SNG_MEASURE; + + #else + /* Set measure mode */ + buffer[0] = AK09911_REG_CNTL2; + buffer[1] = AK09911_MODE_SNG_MEASURE; + #endif + + /* Set data */ + return AKI2C_TxData(buffer, 2); + } + +static long AKECS_SetMode_SelfTest(void) +{ + char buffer[2]; + #ifdef AKM_Device_AK8963 + + buffer[0] = AK8963_REG_CNTL1; + buffer[1] = AK8963_MODE_SELF_TEST; + + #else + + /* Set measure mode */ + buffer[0] = AK09911_REG_CNTL2; + buffer[1] = AK09911_MODE_SELF_TEST; + /* Set data */ + #endif + return AKI2C_TxData(buffer, 2); +} +static long AKECS_SetMode_FUSEAccess(void) +{ + char buffer[2]; + + #ifdef AKM_Device_AK8963 + buffer[0] = AK8963_REG_CNTL1; + buffer[1] = AK8963_MODE_FUSE_ACCESS; + #else + /* Set measure mode */ + buffer[0] = AK09911_REG_CNTL2; + buffer[1] = AK09911_MODE_FUSE_ACCESS; + /* Set data */ + #endif + return AKI2C_TxData(buffer, 2); +} +static int AKECS_SetMode_PowerDown(void) +{ + char buffer[2]; + #ifdef AKM_Device_AK8963 + buffer[0] = AK8963_REG_CNTL1; + buffer[1] = AK8963_MODE_POWERDOWN; + #else + /* Set powerdown mode */ + buffer[0] = AK09911_REG_CNTL2; + buffer[1] = AK09911_MODE_POWERDOWN; + /* Set data */ + #endif + return AKI2C_TxData(buffer, 2); +} + +static long AKECS_Reset(int hard) +{ + unsigned char buffer[2]; + long err = 0; + + if (hard != 0) { + //TODO change to board setting + //gpio_set_value(akm->rstn, 0); + udelay(5); + //gpio_set_value(akm->rstn, 1); + } else { + /* Set measure mode */ + #ifdef AKM_Device_AK8963 + buffer[0] = AK8963_REG_CNTL2; + buffer[1] = 0x01; + #else + buffer[0] = AK09911_REG_CNTL3; + buffer[1] = 0x01; + #endif + err = AKI2C_TxData(buffer, 2); + if (err < 0) { + AKMDBG("%s: Can not set SRST bit.", __func__); + } else { + AKMDBG("Soft reset is done."); + } + } + + /* Device will be accessible 300 us after */ + udelay(300); // 100 + + return err; +} + +static long AKECS_SetMode(char mode) +{ + long ret; + + switch (mode & 0x1F){ + + + case AK09911_MODE_SNG_MEASURE: + ret = AKECS_SetMode_SngMeasure(); + break; + + case AK09911_MODE_SELF_TEST: + case AK8963_MODE_SELF_TEST: + ret = AKECS_SetMode_SelfTest(); + break; + + case AK09911_MODE_FUSE_ACCESS: + case AK8963_MODE_FUSE_ACCESS: + ret = AKECS_SetMode_FUSEAccess(); + break; + + case AK09911_MODE_POWERDOWN: + ret = AKECS_SetMode_PowerDown(); + break; + + default: + AKMDBG("%s: Unknown mode(%d)", __func__, mode); + return -EINVAL; + } + + /* wait at least 100us after changing mode */ + udelay(100); + + return ret; +} + +static int AKECS_CheckDevice(void) +{ + char buffer[2]; + int ret; + AKMDBG(" AKM check device id"); + /* Set measure mode */ + #ifdef AKM_Device_AK8963 + buffer[0] = AK8963_REG_WIA; + #else + buffer[0] = AK09911_REG_WIA1; + #endif + + + + /* Read data */ + ret = AKI2C_RxData(buffer, 1); + AKMDBG(" AKM check device id = %x",buffer[0]); + AKMDBG("ret = %d",ret); + if(ret < 0) + { + return ret; + } + /* Check read data */ + if(buffer[0] != 0x48) + { + return -ENXIO; + } + + return 0; +} + +// Daemon application save the data +static void AKECS_SaveData(int *buf) +{ +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + + mutex_lock(&sensor_data_mutex); + memcpy(sensor_data, buf, sizeof(sensor_data)); + mutex_unlock(&sensor_data_mutex); + +#if DEBUG + if(atomic_read(&data->trace) & AMK_HWM_DEBUG) + { + AKMDBG("Get daemon data: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d!\n", + sensor_data[0],sensor_data[1],sensor_data[2],sensor_data[3], + sensor_data[4],sensor_data[5],sensor_data[6],sensor_data[7], + sensor_data[8],sensor_data[9],sensor_data[10],sensor_data[11], + sensor_data[12],sensor_data[13],sensor_data[14],sensor_data[15], + sensor_data[16],sensor_data[17],sensor_data[18],sensor_data[19], + sensor_data[20],sensor_data[21],sensor_data[22],sensor_data[23], + sensor_data[24],sensor_data[25]); + } +#endif + +} + +// M-sensor daemon application have set the sng mode +static long AKECS_GetData(char *rbuf, int size) +{ + char temp; + int loop_i,ret; +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + + if(size < SENSOR_DATA_SIZE) + { + printk(KERN_ERR "buff size is too small %d!\n", size); + return -1; + } + + memset(rbuf, 0, SENSOR_DATA_SIZE); + #ifdef AKM_Device_AK8963 + rbuf[0] = AK8963_REG_ST1; + #else + rbuf[0] = AK09911_REG_ST1; + #endif + + for(loop_i = 0; loop_i < AKM09911_RETRY_COUNT; loop_i++) + { + if((ret = AKI2C_RxData(rbuf, 1))) + { + printk(KERN_ERR "read ST1 resigster failed!\n"); + return -1; + } + + if((rbuf[0] & 0x01) == 0x01) + { + break; + } + msleep(2); + #ifdef AKM_Device_AK8963 + rbuf[0] = AK8963_REG_ST1; + #else + rbuf[0] = AK09911_REG_ST1; + #endif + } + + if(loop_i >= AKM09911_RETRY_COUNT) + { + printk(KERN_ERR "Data read retry larger the max count!\n"); + if(0 ==factory_mode) + { + return -1;//if return we can not get data at factory mode + } + } + + temp = rbuf[0]; + #ifdef AKM_Device_AK8963 + rbuf[1]= AK8963_REG_HXL; + ret = AKI2C_RxData(&rbuf[1], SENSOR_DATA_SIZE -2); + #else + rbuf[1]= AK09911_REG_HXL; + ret = AKI2C_RxData(&rbuf[1], SENSOR_DATA_SIZE -1); + #endif + if(ret < 0) + { + printk(KERN_ERR "AKM8975 akm8975_work_func: I2C failed\n"); + return -1; + } + rbuf[0] = temp; + #ifdef AKM_Device_AK8963 + rbuf[8]=rbuf[7]; + rbuf[7]=0; + #endif + mutex_lock(&sense_data_mutex); + memcpy(sense_data, rbuf, sizeof(sense_data)); + mutex_unlock(&sense_data_mutex); + +#if DEBUG + if(atomic_read(&data->trace) & AMK_DATA_DEBUG) + { + AKMDBG("Get device data: %d, %d, %d, %d , %d, %d, %d, %d!\n", + sense_data[0],sense_data[1],sense_data[2],sense_data[3], + sense_data[4],sense_data[5],sense_data[6],sense_data[7]); + } +#endif + + return 0; +} + +// Get Msensor Raw data +static int AKECS_GetRawData(char *rbuf, int size) +{ + char strbuf[SENSOR_DATA_SIZE]; + s16 data[3]; + if((atomic_read(&open_flag) == 0) || (factory_mode == 1)) + { + AKECS_SetMode_SngMeasure(); + msleep(10); + } + + AKECS_GetData(strbuf, SENSOR_DATA_SIZE); + data[0] = (s16)(strbuf[1] | (strbuf[2] << 8)); + data[1] = (s16)(strbuf[3] | (strbuf[4] << 8)); + data[2] = (s16)(strbuf[5] | (strbuf[6] << 8)); + + sprintf(rbuf, "%x %x %x", data[0], data[1], data[2]); + + return 0; + +} + + + +static int AKECS_GetOpenStatus(void) +{ + wait_event_interruptible(open_wq, (atomic_read(&open_flag) != 0)); + return atomic_read(&open_flag); +} + +static int AKECS_GetCloseStatus(void) +{ + wait_event_interruptible(open_wq, (atomic_read(&open_flag) <= 0)); + return atomic_read(&open_flag); +} + + + + +/*----------------------------------------------------------------------------*/ +static int akm09911_ReadChipInfo(char *buf, int bufsize) +{ + if((!buf)||(bufsize <= AKM09911_BUFSIZE -1)) + { + return -1; + } + if(!this_client) + { + *buf = 0; + return -2; + } + + sprintf(buf, "akm09911 Chip"); + return 0; +} + +/*----------------------------shipment test------------------------------------------------*/ +/*! + @return If @a testdata is in the range of between @a lolimit and @a hilimit, + the return value is 1, otherwise -1. + @param[in] testno A pointer to a text string. + @param[in] testname A pointer to a text string. + @param[in] testdata A data to be tested. + @param[in] lolimit The maximum allowable value of @a testdata. + @param[in] hilimit The minimum allowable value of @a testdata. + @param[in,out] pf_total + */ +int +TEST_DATA(const char testno[], + const char testname[], + const int testdata, + const int lolimit, + const int hilimit, + int * pf_total) +{ + int pf; //Pass;1, Fail;-1 + + if ((testno == NULL) && (strncmp(testname, "START", 5) == 0)) { + // Display header + AKMDBG("--------------------------------------------------------------------\n"); + AKMDBG(" Test No. Test Name Fail Test Data [ Low High]\n"); + AKMDBG("--------------------------------------------------------------------\n"); + + pf = 1; + } else if ((testno == NULL) && (strncmp(testname, "END", 3) == 0)) { + // Display result + AKMDBG("--------------------------------------------------------------------\n"); + if (*pf_total == 1) { + AKMDBG("Factory shipment test was passed.\n\n"); + } else { + AKMDBG("Factory shipment test was failed.\n\n"); + } + + pf = 1; + } else { + if ((lolimit <= testdata) && (testdata <= hilimit)) { + //Pass + pf = 1; + } else { + //Fail + pf = -1; + } + + //display result + AKMDBG(" %7s %-10s %c %9d [%9d %9d]\n", + testno, testname, ((pf == 1) ? ('.') : ('F')), testdata, + lolimit, hilimit); + } + + //Pass/Fail check + if (*pf_total != 0) { + if ((*pf_total == 1) && (pf == 1)) { + *pf_total = 1; //Pass + } else { + *pf_total = -1; //Fail + } + } + return pf; +} +int FST_AK8963(void) + { + int pf_total; //p/f flag for this subtest + char i2cData[16]; + int hdata[3]; + int asax; + int asay; + int asaz; + + //*********************************************** + // Reset Test Result + //*********************************************** + pf_total = 1; + + //*********************************************** + // Step1 + //*********************************************** + + // Set to PowerDown mode + //if (AKECS_SetMode(AK8963_MODE_POWERDOWN) < 0) { + // AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + // return 0; + //} + AKECS_Reset(0); + msleep(1); + + // When the serial interface is SPI, + // write "00011011" to I2CDIS register(to disable I2C,). + if(CSPEC_SPI_USE == 1){ + i2cData[0] = AK8963_REG_I2CDIS; + i2cData[1] = 0x1B; + if (AKI2C_TxData(i2cData, 2) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + } + + // Read values from WIA to ASTC. + i2cData[0] = AK8963_REG_WIA; + if (AKI2C_RxData(i2cData, 7) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // TEST + TEST_DATA(TLIMIT_NO_RST_WIA, TLIMIT_TN_RST_WIA, (int)i2cData[0], TLIMIT_LO_RST_WIA, TLIMIT_HI_RST_WIA, &pf_total); + TEST_DATA(TLIMIT_NO_RST_INFO, TLIMIT_TN_RST_INFO, (int)i2cData[1], TLIMIT_LO_RST_INFO, TLIMIT_HI_RST_INFO, &pf_total); + TEST_DATA(TLIMIT_NO_RST_ST1, TLIMIT_TN_RST_ST1, (int)i2cData[2], TLIMIT_LO_RST_ST1, TLIMIT_HI_RST_ST1, &pf_total); + TEST_DATA(TLIMIT_NO_RST_HXL, TLIMIT_TN_RST_HXL, (int)i2cData[3], TLIMIT_LO_RST_HXL, TLIMIT_HI_RST_HXL, &pf_total); + TEST_DATA(TLIMIT_NO_RST_HXH, TLIMIT_TN_RST_HXH, (int)i2cData[4], TLIMIT_LO_RST_HXH, TLIMIT_HI_RST_HXH, &pf_total); + TEST_DATA(TLIMIT_NO_RST_HYL, TLIMIT_TN_RST_HYL, (int)i2cData[5], TLIMIT_LO_RST_HYL, TLIMIT_HI_RST_HYL, &pf_total); + TEST_DATA(TLIMIT_NO_RST_HYH, TLIMIT_TN_RST_HYH, (int)i2cData[6], TLIMIT_LO_RST_HYH, TLIMIT_HI_RST_HYH, &pf_total); + // our i2c only most can read 8 byte at one time , + i2cData[7]= AK8963_REG_HZL; + if (AKI2C_RxData((i2cData+7), 6) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + TEST_DATA(TLIMIT_NO_RST_HZL, TLIMIT_TN_RST_HZL, (int)i2cData[7], TLIMIT_LO_RST_HZL, TLIMIT_HI_RST_HZL, &pf_total); + TEST_DATA(TLIMIT_NO_RST_HZH, TLIMIT_TN_RST_HZH, (int)i2cData[8], TLIMIT_LO_RST_HZH, TLIMIT_HI_RST_HZH, &pf_total); + TEST_DATA(TLIMIT_NO_RST_ST2, TLIMIT_TN_RST_ST2, (int)i2cData[9], TLIMIT_LO_RST_ST2, TLIMIT_HI_RST_ST2, &pf_total); + TEST_DATA(TLIMIT_NO_RST_CNTL, TLIMIT_TN_RST_CNTL, (int)i2cData[10], TLIMIT_LO_RST_CNTL, TLIMIT_HI_RST_CNTL, &pf_total); + // i2cData[11] is BLANK. + TEST_DATA(TLIMIT_NO_RST_ASTC, TLIMIT_TN_RST_ASTC, (int)i2cData[12], TLIMIT_LO_RST_ASTC, TLIMIT_HI_RST_ASTC, &pf_total); + + // Read values from I2CDIS. + i2cData[0] = AK8963_REG_I2CDIS; + if (AKI2C_RxData(i2cData, 1) < 0 ) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + if(CSPEC_SPI_USE == 1){ + TEST_DATA(TLIMIT_NO_RST_I2CDIS, TLIMIT_TN_RST_I2CDIS, (int)i2cData[0], TLIMIT_LO_RST_I2CDIS_USESPI, TLIMIT_HI_RST_I2CDIS_USESPI, &pf_total); + }else{ + TEST_DATA(TLIMIT_NO_RST_I2CDIS, TLIMIT_TN_RST_I2CDIS, (int)i2cData[0], TLIMIT_LO_RST_I2CDIS_USEI2C, TLIMIT_HI_RST_I2CDIS_USEI2C, &pf_total); + } + + // Set to FUSE ROM access mode + if (AKECS_SetMode(AK8963_MODE_FUSE_ACCESS) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Read values from ASAX to ASAZ + i2cData[0] = AK8963_FUSE_ASAX; + if (AKI2C_RxData(i2cData, 3) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + asax = (int)i2cData[0]; + asay = (int)i2cData[1]; + asaz = (int)i2cData[2]; + + // TEST + TEST_DATA(TLIMIT_NO_ASAX, TLIMIT_TN_ASAX, asax, TLIMIT_LO_ASAX, TLIMIT_HI_ASAX, &pf_total); + TEST_DATA(TLIMIT_NO_ASAY, TLIMIT_TN_ASAY, asay, TLIMIT_LO_ASAY, TLIMIT_HI_ASAY, &pf_total); + TEST_DATA(TLIMIT_NO_ASAZ, TLIMIT_TN_ASAZ, asaz, TLIMIT_LO_ASAZ, TLIMIT_HI_ASAZ, &pf_total); + + // Read values. CNTL + i2cData[0] = AK8963_REG_CNTL1; + if (AKI2C_RxData(i2cData, 1)< 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Set to PowerDown mode + if (AKECS_SetMode(AK8963_MODE_POWERDOWN) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // TEST + TEST_DATA(TLIMIT_NO_WR_CNTL, TLIMIT_TN_WR_CNTL, (int)i2cData[0], TLIMIT_LO_WR_CNTL, TLIMIT_HI_WR_CNTL, &pf_total); + + + //*********************************************** + // Step2 + //*********************************************** + + // Set to SNG measurement pattern (Set CNTL register) + if (AKECS_SetMode(AK8963_MODE_SNG_MEASURE) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Wait for DRDY pin changes to HIGH. + msleep(10); + // Get measurement data from AK8963 + // ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + ST2 + // = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 = 8 bytes + if (AKECS_GetData(i2cData,SENSOR_DATA_SIZE) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8)); + hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8)); + hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8)); + // AK8963 @ 14 BIT + hdata[0] <<= 2; + hdata[1] <<= 2; + hdata[2] <<= 2; + + + // TEST + TEST_DATA(TLIMIT_NO_SNG_ST1, TLIMIT_TN_SNG_ST1, (int)i2cData[0], TLIMIT_LO_SNG_ST1, TLIMIT_HI_SNG_ST1, &pf_total); + TEST_DATA(TLIMIT_NO_SNG_HX, TLIMIT_TN_SNG_HX, hdata[0], TLIMIT_LO_SNG_HX, TLIMIT_HI_SNG_HX, &pf_total); + TEST_DATA(TLIMIT_NO_SNG_HY, TLIMIT_TN_SNG_HY, hdata[1], TLIMIT_LO_SNG_HY, TLIMIT_HI_SNG_HY, &pf_total); + TEST_DATA(TLIMIT_NO_SNG_HZ, TLIMIT_TN_SNG_HZ, hdata[2], TLIMIT_LO_SNG_HZ, TLIMIT_HI_SNG_HZ, &pf_total); + TEST_DATA(TLIMIT_NO_SNG_ST2, TLIMIT_TN_SNG_ST2, (int)i2cData[8], TLIMIT_LO_SNG_ST2, TLIMIT_HI_SNG_ST2, &pf_total); + + // Generate magnetic field for self-test (Set ASTC register) + i2cData[0] = AK8963_REG_ASTC; + i2cData[1] = 0x40; + if (AKI2C_TxData(i2cData, 2) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Set to Self-test mode (Set CNTL register) + if (AKECS_SetMode(AK8963_MODE_SELF_TEST) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Wait for DRDY pin changes to HIGH. + msleep(10); + // Get measurement data from AK8963 + // ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + ST2 + // = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 = 8Byte + if (AKECS_GetData(i2cData,SENSOR_DATA_SIZE) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // TEST + TEST_DATA(TLIMIT_NO_SLF_ST1, TLIMIT_TN_SLF_ST1, (int)i2cData[0], TLIMIT_LO_SLF_ST1, TLIMIT_HI_SLF_ST1, &pf_total); + + hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8)); + hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8)); + hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8)); + + // AK8963 @ 14 BIT + hdata[0] <<= 2; + hdata[1] <<= 2; + hdata[2] <<= 2; + + AKMDBG("hdata[0] = %d\n",hdata[0] ); + AKMDBG("asax = %d\n",asax ); + TEST_DATA( + TLIMIT_NO_SLF_RVHX, + TLIMIT_TN_SLF_RVHX, + (hdata[0])*((asax - 128)/2/128 + 1), + TLIMIT_LO_SLF_RVHX, + TLIMIT_HI_SLF_RVHX, + &pf_total + ); + + TEST_DATA( + TLIMIT_NO_SLF_RVHY, + TLIMIT_TN_SLF_RVHY, + (hdata[1])*((asay - 128)/2/128 + 1), + TLIMIT_LO_SLF_RVHY, + TLIMIT_HI_SLF_RVHY, + &pf_total + ); + + TEST_DATA( + TLIMIT_NO_SLF_RVHZ, + TLIMIT_TN_SLF_RVHZ, + (hdata[2])*((asaz - 128)/2/128 + 1), + TLIMIT_LO_SLF_RVHZ, + TLIMIT_HI_SLF_RVHZ, + &pf_total + ); + // TEST + TEST_DATA(TLIMIT_NO_SLF_ST2, TLIMIT_TN_SLF_ST2, (int)i2cData[8], TLIMIT_LO_SLF_ST2, TLIMIT_HI_SLF_ST2, &pf_total); + + // Set to Normal mode for self-test. + i2cData[0] = AK8963_REG_ASTC; + i2cData[1] = 0x00; + if (AKI2C_TxData(i2cData, 2) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + AKMDBG("pf_total = %d\n",pf_total ); + return pf_total; + } + + + +/*! + Execute "Onboard Function Test" (NOT includes "START" and "END" command). + @retval 1 The test is passed successfully. + @retval -1 The test is failed. + @retval 0 The test is aborted by kind of system error. + */ +int FST_AK09911(void) +{ + int pf_total; //p/f flag for this subtest + char i2cData[16]; + int hdata[3]; + int asax; + int asay; + int asaz; + + //*********************************************** + // Reset Test Result + //*********************************************** + pf_total = 1; + + //*********************************************** + // Step1 + //*********************************************** + + // Reset device. + if (AKECS_Reset(0) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Read values from WIA. + i2cData[0] = AK09911_REG_WIA1; + if (AKI2C_RxData(i2cData, 2) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // TEST + TEST_DATA(TLIMIT_NO_RST_WIA1_09911, TLIMIT_TN_RST_WIA1_09911, (int)i2cData[0], TLIMIT_LO_RST_WIA1_09911, TLIMIT_HI_RST_WIA1_09911, &pf_total); + TEST_DATA(TLIMIT_NO_RST_WIA2_09911, TLIMIT_TN_RST_WIA2_09911, (int)i2cData[1], TLIMIT_LO_RST_WIA2_09911, TLIMIT_HI_RST_WIA2_09911, &pf_total); + + // Set to FUSE ROM access mode + if (AKECS_SetMode(AK09911_MODE_FUSE_ACCESS) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Read values from ASAX to ASAZ + i2cData[0] = AK09911_FUSE_ASAX; + if (AKI2C_RxData(i2cData, 3) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + asax = (int)i2cData[0]; + asay = (int)i2cData[1]; + asaz = (int)i2cData[2]; + + // TEST + TEST_DATA(TLIMIT_NO_ASAX_09911, TLIMIT_TN_ASAX_09911, asax, TLIMIT_LO_ASAX_09911, TLIMIT_HI_ASAX_09911, &pf_total); + TEST_DATA(TLIMIT_NO_ASAY_09911, TLIMIT_TN_ASAY_09911, asay, TLIMIT_LO_ASAY_09911, TLIMIT_HI_ASAY_09911, &pf_total); + TEST_DATA(TLIMIT_NO_ASAZ_09911, TLIMIT_TN_ASAZ_09911, asaz, TLIMIT_LO_ASAZ_09911, TLIMIT_HI_ASAZ_09911, &pf_total); + + // Set to PowerDown mode + if (AKECS_SetMode(AK09911_MODE_POWERDOWN) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + //*********************************************** + // Step2 + //*********************************************** + + // Set to SNG measurement pattern (Set CNTL register) + if (AKECS_SetMode(AK09911_MODE_SNG_MEASURE) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Wait for DRDY pin changes to HIGH. + //usleep(AKM_MEASURE_TIME_US); + // Get measurement data from AK09911 + // ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + TEMP + ST2 + // = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 + 1 = 9yte + //if (AKD_GetMagneticData(i2cData) != AKD_SUCCESS) { + if (AKECS_GetData(i2cData,SENSOR_DATA_SIZE) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + //hdata[0] = (int)((((uint)(i2cData[2]))<<8)+(uint)(i2cData[1])); + //hdata[1] = (int)((((uint)(i2cData[4]))<<8)+(uint)(i2cData[3])); + //hdata[2] = (int)((((uint)(i2cData[6]))<<8)+(uint)(i2cData[5])); + + hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8)); + hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8)); + hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8)); + + // TEST + i2cData[0] &= 0x7F; + TEST_DATA(TLIMIT_NO_SNG_ST1_09911, TLIMIT_TN_SNG_ST1_09911, (int)i2cData[0], TLIMIT_LO_SNG_ST1_09911, TLIMIT_HI_SNG_ST1_09911, &pf_total); + + // TEST + TEST_DATA(TLIMIT_NO_SNG_HX_09911, TLIMIT_TN_SNG_HX_09911, hdata[0], TLIMIT_LO_SNG_HX_09911, TLIMIT_HI_SNG_HX_09911, &pf_total); + TEST_DATA(TLIMIT_NO_SNG_HY_09911, TLIMIT_TN_SNG_HY_09911, hdata[1], TLIMIT_LO_SNG_HY_09911, TLIMIT_HI_SNG_HY_09911, &pf_total); + TEST_DATA(TLIMIT_NO_SNG_HZ_09911, TLIMIT_TN_SNG_HZ_09911, hdata[2], TLIMIT_LO_SNG_HZ_09911, TLIMIT_HI_SNG_HZ_09911, &pf_total); + TEST_DATA(TLIMIT_NO_SNG_ST2_09911, TLIMIT_TN_SNG_ST2_09911, (int)i2cData[8], TLIMIT_LO_SNG_ST2_09911, TLIMIT_HI_SNG_ST2_09911, &pf_total); + + // Set to Self-test mode (Set CNTL register) + if (AKECS_SetMode(AK09911_MODE_SELF_TEST) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // Wait for DRDY pin changes to HIGH. + //usleep(AKM_MEASURE_TIME_US); + // Get measurement data from AK09911 + // ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + TEMP + ST2 + // = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 + 1 = 9byte + //if (AKD_GetMagneticData(i2cData) != AKD_SUCCESS) { + if (AKECS_GetData(i2cData,SENSOR_DATA_SIZE) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return 0; + } + + // TEST + i2cData[0] &= 0x7F; + TEST_DATA(TLIMIT_NO_SLF_ST1_09911, TLIMIT_TN_SLF_ST1_09911, (int)i2cData[0], TLIMIT_LO_SLF_ST1_09911, TLIMIT_HI_SLF_ST1_09911, &pf_total); + + //hdata[0] = (int)((((uint)(i2cData[2]))<<8)+(uint)(i2cData[1])); + //hdata[1] = (int)((((uint)(i2cData[4]))<<8)+(uint)(i2cData[3])); + //hdata[2] = (int)((((uint)(i2cData[6]))<<8)+(uint)(i2cData[5])); + + hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8)); + hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8)); + hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8)); + + // TEST + TEST_DATA( + TLIMIT_NO_SLF_RVHX_09911, + TLIMIT_TN_SLF_RVHX_09911, + (hdata[0])*(asax/128 + 1), + TLIMIT_LO_SLF_RVHX_09911, + TLIMIT_HI_SLF_RVHX_09911, + &pf_total + ); + + TEST_DATA( + TLIMIT_NO_SLF_RVHY_09911, + TLIMIT_TN_SLF_RVHY_09911, + (hdata[1])*(asay/128 + 1), + TLIMIT_LO_SLF_RVHY_09911, + TLIMIT_HI_SLF_RVHY_09911, + &pf_total + ); + + TEST_DATA( + TLIMIT_NO_SLF_RVHZ_09911, + TLIMIT_TN_SLF_RVHZ_09911, + (hdata[2])*(asaz/128 + 1), + TLIMIT_LO_SLF_RVHZ_09911, + TLIMIT_HI_SLF_RVHZ_09911, + &pf_total + ); + + TEST_DATA( + TLIMIT_NO_SLF_ST2_09911, + TLIMIT_TN_SLF_ST2_09911, + (int)i2cData[8], + TLIMIT_LO_SLF_ST2_09911, + TLIMIT_HI_SLF_ST2_09911, + &pf_total + ); + + return pf_total; +} + +/*! + Execute "Onboard Function Test" (includes "START" and "END" command). + @retval 1 The test is passed successfully. + @retval -1 The test is failed. + @retval 0 The test is aborted by kind of system error. + */ +int FctShipmntTestProcess_Body(void) +{ + int pf_total = 1; + + //*********************************************** + // Reset Test Result + //*********************************************** + TEST_DATA(NULL, "START", 0, 0, 0, &pf_total); + + //*********************************************** + // Step 1 to 2 + //*********************************************** + #ifdef AKM_Device_AK8963 + pf_total = FST_AK8963(); + #else + pf_total = FST_AK09911(); + #endif + + //*********************************************** + // Judge Test Result + //*********************************************** + TEST_DATA(NULL, "END", 0, 0, 0, &pf_total); + + return pf_total; +} + +static ssize_t store_shipment_test(struct device_driver * ddri,const char * buf, size_t count) +{ + //struct i2c_client *client = this_client; + //struct akm09911_i2c_data *data = i2c_get_clientdata(client); + //int layout = 0; + + + return count; +} + +static ssize_t show_shipment_test(struct device_driver *ddri, char *buf) +{ + char result[10]; + int res = 0; + res = FctShipmntTestProcess_Body(); + if(1 == res) + { + AKMDBG("shipment_test pass\n"); + strcpy(result,"y"); + } + else if(-1 == res) + { + AKMDBG("shipment_test fail\n"); + strcpy(result,"n"); + } + else + { + AKMDBG("shipment_test NaN\n"); + strcpy(result,"NaN"); + } + + return sprintf(buf, "%s\n", result); +} + +static ssize_t show_daemon_name(struct device_driver *ddri, char *buf) +{ + char strbuf[AKM09911_BUFSIZE]; + sprintf(strbuf, "akmd09911"); + return sprintf(buf, "%s", strbuf); +} + +static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf) +{ + char strbuf[AKM09911_BUFSIZE]; + akm09911_ReadChipInfo(strbuf, AKM09911_BUFSIZE); + return sprintf(buf, "%s\n", strbuf); +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf) +{ + + char sensordata[SENSOR_DATA_SIZE]; + char strbuf[AKM09911_BUFSIZE]; + if(atomic_read(&open_flag) == 0) + { + AKECS_SetMode_SngMeasure(); + msleep(10); + AKECS_GetData(sensordata, SENSOR_DATA_SIZE); + } + else + { + mutex_lock(&sense_data_mutex); + memcpy(sensordata, sense_data, sizeof(sensordata)); + mutex_unlock(&sense_data_mutex); + } + + + + sprintf(strbuf, "%d %d %d %d %d %d %d %d %d\n", sensordata[0],sensordata[1],sensordata[2], + sensordata[3],sensordata[4],sensordata[5],sensordata[6],sensordata[7],sensordata[8]); + + return sprintf(buf, "%s\n", strbuf); +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_posturedata_value(struct device_driver *ddri, char *buf) +{ + short tmp[3]; + char strbuf[AKM09911_BUFSIZE]; + tmp[0] = sensor_data[13] * CONVERT_O / CONVERT_O_DIV; + tmp[1] = sensor_data[14] * CONVERT_O / CONVERT_O_DIV; + tmp[2] = sensor_data[15] * CONVERT_O / CONVERT_O_DIV; + sprintf(strbuf, "%d, %d, %d\n", tmp[0],tmp[1], tmp[2]); + + return sprintf(buf, "%s\n", strbuf);; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t show_layout_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); + + return sprintf(buf, "(%d, %d)\n[%+2d %+2d %+2d]\n[%+2d %+2d %+2d]\n", + data->hw->direction,atomic_read(&data->layout), data->cvt.sign[0], data->cvt.sign[1], + data->cvt.sign[2],data->cvt.map[0], data->cvt.map[1], data->cvt.map[2]); +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_layout_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); + int layout = 0; + + if(1 == sscanf(buf, "%d", &layout)) + { + atomic_set(&data->layout, layout); + if(!hwmsen_get_convert(layout, &data->cvt)) + { + printk(KERN_ERR "HWMSEN_GET_CONVERT function error!\r\n"); + } + else if(!hwmsen_get_convert(data->hw->direction, &data->cvt)) + { + printk(KERN_ERR "invalid layout: %d, restore to %d\n", layout, data->hw->direction); + } + else + { + printk(KERN_ERR "invalid layout: (%d, %d)\n", layout, data->hw->direction); + hwmsen_get_convert(0, &data->cvt); + } + } + else + { + printk(KERN_ERR "invalid format = '%s'\n", buf); + } + + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_status_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); + ssize_t len = 0; + + if(data->hw) + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n", + data->hw->i2c_num, data->hw->direction, data->hw->power_id, data->hw->power_vol); + } + else + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n"); + } + + len += snprintf(buf+len, PAGE_SIZE-len, "OPEN: %d\n", atomic_read(&dev_open_count)); + return len; +} +/*----------------------------------------------------------------------------*/ +static ssize_t show_trace_value(struct device_driver *ddri, char *buf) +{ + ssize_t res; + struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client); + if(NULL == obj) + { + printk(KERN_ERR "akm09911_i2c_data is null!!\n"); + return 0; + } + + res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace)); + return res; +} +/*----------------------------------------------------------------------------*/ +static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client); + int trace; + if(NULL == obj) + { + printk(KERN_ERR "akm09911_i2c_data is null!!\n"); + return 0; + } + + if(1 == sscanf(buf, "0x%x", &trace)) + { + atomic_set(&obj->trace, trace); + } + else + { + printk(KERN_ERR "invalid content: '%s', length = %d\n", buf, count); + } + + return count; +} +/*----------------------------------------------------------------------------*/ +static DRIVER_ATTR(daemon, S_IRUGO, show_daemon_name, NULL); +static DRIVER_ATTR(shipmenttest,S_IRUGO | S_IWUSR, show_shipment_test, store_shipment_test); +static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL); +static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL); +static DRIVER_ATTR(posturedata, S_IRUGO, show_posturedata_value, NULL); +static DRIVER_ATTR(layout, S_IRUGO | S_IWUSR, show_layout_value, store_layout_value ); +static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL); +static DRIVER_ATTR(trace, S_IRUGO | S_IWUSR, show_trace_value, store_trace_value ); +/*----------------------------------------------------------------------------*/ +static struct driver_attribute *akm09911_attr_list[] = { + &driver_attr_daemon, + &driver_attr_shipmenttest, + &driver_attr_chipinfo, + &driver_attr_sensordata, + &driver_attr_posturedata, + &driver_attr_layout, + &driver_attr_status, + &driver_attr_trace, +}; +/*----------------------------------------------------------------------------*/ +static int akm09911_create_attr(struct device_driver *driver) +{ + int idx, err = 0; + int num = (int)(sizeof(akm09911_attr_list)/sizeof(akm09911_attr_list[0])); + if (driver == NULL) + { + return -EINVAL; + } + + for(idx = 0; idx < num; idx++) + { + if((err = driver_create_file(driver, akm09911_attr_list[idx]))) + { + printk(KERN_ERR "driver_create_file (%s) = %d\n", akm09911_attr_list[idx]->attr.name, err); + break; + } + } + return err; +} +/*----------------------------------------------------------------------------*/ +static int akm09911_delete_attr(struct device_driver *driver) +{ + int idx ,err = 0; + int num = (int)(sizeof(akm09911_attr_list)/sizeof(akm09911_attr_list[0])); + + if(driver == NULL) + { + return -EINVAL; + } + + + for(idx = 0; idx < num; idx++) + { + driver_remove_file(driver, akm09911_attr_list[idx]); + } + + + return err; +} + + +/*----------------------------------------------------------------------------*/ +static int akm09911_open(struct inode *inode, struct file *file) +{ + struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client); + int ret = -1; + + if(atomic_read(&obj->trace) & AMK_CTR_DEBUG) + { + AKMDBG("Open device node:akm09911\n"); + } + ret = nonseekable_open(inode, file); + + return ret; +} +/*----------------------------------------------------------------------------*/ +static int akm09911_release(struct inode *inode, struct file *file) +{ + struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client); + atomic_dec(&dev_open_count); + if(atomic_read(&obj->trace) & AMK_CTR_DEBUG) + { + AKMDBG("Release device node:akm09911\n"); + } + return 0; +} + + +/*----------------------------------------------------------------------------*/ +//static int akm09911_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg) +static long akm09911_unlocked_ioctl(struct file *file, unsigned int cmd,unsigned long arg) +{ + void __user *argp = (void __user *)arg; + + /* NOTE: In this function the size of "char" should be 1-byte. */ + char sData[SENSOR_DATA_SIZE];/* for GETDATA */ + char rwbuf[RWBUF_SIZE]; /* for READ/WRITE */ + char buff[AKM09911_BUFSIZE]; /* for chip information */ + char mode; /* for SET_MODE*/ + int value[26]; /* for SET_YPR */ + int64_t delay[3]; /* for GET_DELAY */ + int status; /* for OPEN/CLOSE_STATUS */ + long ret = -1; /* Return value. */ + int layout; + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); + hwm_sensor_data* osensor_data; + uint32_t enable; + /* These two buffers are initialized at start up. + After that, the value is not changed */ + unsigned char sense_info[AKM_SENSOR_INFO_SIZE]; + unsigned char sense_conf[AKM_SENSOR_CONF_SIZE]; + + // printk(KERN_ERR"akm09911 cmd:0x%x\n", cmd); + switch (cmd) + { + case ECS_IOCTL_WRITE: + //AKMFUNC("ECS_IOCTL_WRITE"); + if(argp == NULL) + { + AKMDBG("invalid argument."); + return -EINVAL; + } + if(copy_from_user(rwbuf, argp, sizeof(rwbuf))) + { + AKMDBG("copy_from_user failed."); + return -EFAULT; + } + + if((rwbuf[0] < 2) || (rwbuf[0] > (RWBUF_SIZE-1))) + { + AKMDBG("invalid argument."); + return -EINVAL; + } + ret = AKI2C_TxData(&rwbuf[1], rwbuf[0]); + if(ret < 0) + { + return ret; + } + break; + case ECS_IOCTL_RESET: + ret = AKECS_Reset(0); // sw: 0, hw: 1 + if (ret < 0) + return ret; + break; + case ECS_IOCTL_READ: + //AKMFUNC("ECS_IOCTL_READ"); + if(argp == NULL) + { + AKMDBG("invalid argument."); + return -EINVAL; + } + + if(copy_from_user(rwbuf, argp, sizeof(rwbuf))) + { + AKMDBG("copy_from_user failed."); + return -EFAULT; + } + + if((rwbuf[0] < 1) || (rwbuf[0] > (RWBUF_SIZE-1))) + { + AKMDBG("invalid argument."); + return -EINVAL; + } + ret = AKI2C_RxData(&rwbuf[1], rwbuf[0]); + if (ret < 0) + { + return ret; + } + if(copy_to_user(argp, rwbuf, rwbuf[0]+1)) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + case ECS_IOCTL_GET_INFO: + + #ifdef AKM_Device_AK8963 + sense_info[0] = AK8963_REG_WIA; + #else + sense_info[0] = AK09911_REG_WIA1; + #endif + + ret = AKI2C_RxData(sense_info, AKM_SENSOR_INFO_SIZE); + if (ret < 0) + { + return ret; + } + if(copy_to_user(argp, sense_info, AKM_SENSOR_INFO_SIZE)) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + case ECS_IOCTL_GET_CONF: + /* Set FUSE access mode */ + #ifdef AKM_Device_AK8963 + ret = AKECS_SetMode(AK8963_MODE_FUSE_ACCESS); + #else + ret = AKECS_SetMode(AK09911_MODE_FUSE_ACCESS); + #endif + if (ret < 0) + return ret; + #ifdef AKM_Device_AK8963 + sense_conf[0] = AK8963_FUSE_ASAX; + #else + sense_conf[0] = AK09911_FUSE_ASAX; + #endif + + ret = AKI2C_RxData(sense_conf, AKM_SENSOR_CONF_SIZE); + if (ret < 0) + { + return ret; + } + if(copy_to_user(argp, sense_conf, AKM_SENSOR_CONF_SIZE)) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + #ifdef AKM_Device_AK8963 + ret = AKECS_SetMode(AK8963_MODE_POWERDOWN); + #else + ret = AKECS_SetMode(AK09911_MODE_POWERDOWN); + #endif + if (ret < 0) + return ret; + + break; + + case ECS_IOCTL_SET_MODE: + //AKMFUNC("ECS_IOCTL_SET_MODE"); + if(argp == NULL) + { + AKMDBG("invalid argument."); + return -EINVAL; + } + if(copy_from_user(&mode, argp, sizeof(mode))) + { + AKMDBG("copy_from_user failed."); + return -EFAULT; + } + ret = AKECS_SetMode(mode); // MATCH command from AKMD PART + if(ret < 0) + { + return ret; + } + break; + + case ECS_IOCTL_GETDATA: + //AKMFUNC("ECS_IOCTL_GETDATA"); + ret = AKECS_GetData(sData, SENSOR_DATA_SIZE); + if(ret < 0) + { + return ret; + } + + if(copy_to_user(argp, sData, sizeof(sData))) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + + case ECS_IOCTL_SET_YPR_09911: + //AKMFUNC("ECS_IOCTL_SET_YPR"); + if(argp == NULL) + { + AKMDBG("invalid argument."); + return -EINVAL; + } + if(copy_from_user(value, argp, sizeof(value))) + { + AKMDBG("copy_from_user failed."); + return -EFAULT; + } + AKECS_SaveData(value); + break; + + case ECS_IOCTL_GET_OPEN_STATUS: + //AKMFUNC("IOCTL_GET_OPEN_STATUS"); + status = AKECS_GetOpenStatus(); + //AKMDBG("AKECS_GetOpenStatus returned (%d)", status); + if(copy_to_user(argp, &status, sizeof(status))) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + + case ECS_IOCTL_GET_CLOSE_STATUS: + //AKMFUNC("IOCTL_GET_CLOSE_STATUS"); + status = AKECS_GetCloseStatus(); + //AKMDBG("AKECS_GetCloseStatus returned (%d)", status); + if(copy_to_user(argp, &status, sizeof(status))) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + + case ECS_IOCTL_GET_OSENSOR_STATUS: + //AKMFUNC("ECS_IOCTL_GET_OSENSOR_STATUS"); + status = atomic_read(&o_flag); + if(copy_to_user(argp, &status, sizeof(status))) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + + case ECS_IOCTL_GET_DELAY_09911: + //AKMFUNC("IOCTL_GET_DELAY"); + delay[0] = (int)akmd_delay * 1000000; + delay[1] = (int)akmd_delay * 1000000; + delay[2] = (int)akmd_delay * 1000000; + if(copy_to_user(argp, delay, sizeof(delay))) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + + case ECS_IOCTL_GET_LAYOUT_09911: + layout = atomic_read(&data->layout); + printk(KERN_ERR "layout=%d\r\n",layout); + if(copy_to_user(argp, &layout, sizeof(layout))) + { + AKMDBG("copy_to_user failed."); + return -EFAULT; + } + break; + + case MSENSOR_IOCTL_READ_CHIPINFO: + if(argp == NULL) + { + printk(KERN_ERR "IO parameter pointer is NULL!\r\n"); + break; + } + + akm09911_ReadChipInfo(buff, AKM09911_BUFSIZE); + if(copy_to_user(argp, buff, strlen(buff)+1)) + { + return -EFAULT; + } + break; + + case MSENSOR_IOCTL_READ_SENSORDATA: + if(argp == NULL) + { + printk(KERN_ERR "IO parameter pointer is NULL!\r\n"); + break; + } + + AKECS_GetRawData(buff, AKM09911_BUFSIZE); + + if(copy_to_user(argp, buff, strlen(buff)+1)) + { + return -EFAULT; + } + break; + + case MSENSOR_IOCTL_SENSOR_ENABLE: + + if(argp == NULL) + { + printk(KERN_ERR "IO parameter pointer is NULL!\r\n"); + break; + } + if(copy_from_user(&enable, argp, sizeof(enable))) + { + AKMDBG("copy_from_user failed."); + return -EFAULT; + } + else + { + printk( "MSENSOR_IOCTL_SENSOR_ENABLE enable=%d!\r\n",enable); + factory_mode = 1; + if(1 == enable) + { + atomic_set(&o_flag, 1); + atomic_set(&open_flag, 1); + } + else + { + atomic_set(&o_flag, 0); + if(atomic_read(&m_flag) == 0) + { + atomic_set(&open_flag, 0); + } + } + wake_up(&open_wq); + + } + + break; + + case MSENSOR_IOCTL_READ_FACTORY_SENSORDATA: + if(argp == NULL) + { + printk(KERN_ERR "IO parameter pointer is NULL!\r\n"); + break; + } + + //AKECS_GetRawData(buff, AKM09911_BUFSIZE); + osensor_data = (hwm_sensor_data *)buff; + mutex_lock(&sensor_data_mutex); + + osensor_data->values[0] = sensor_data[13] * CONVERT_O; + osensor_data->values[1] = sensor_data[14] * CONVERT_O; + osensor_data->values[2] = sensor_data[15] * CONVERT_O; + osensor_data->status = sensor_data[8]; + osensor_data->value_divide = CONVERT_O_DIV; + + mutex_unlock(&sensor_data_mutex); + + sprintf(buff, "%x %x %x %x %x", osensor_data->values[0], osensor_data->values[1], + osensor_data->values[2],osensor_data->status,osensor_data->value_divide); + if(copy_to_user(argp, buff, strlen(buff)+1)) + { + return -EFAULT; + } + + break; + + default: + printk(KERN_ERR "%s not supported = 0x%04x", __FUNCTION__, cmd); + return -ENOIOCTLCMD; + break; + } + + return 0; +} +/*----------------------------------------------------------------------------*/ +static struct file_operations akm09911_fops = { + .owner = THIS_MODULE, + .open = akm09911_open, + .release = akm09911_release, + //.unlocked_ioctl = akm09911_ioctl, + .unlocked_ioctl = akm09911_unlocked_ioctl, +}; +/*----------------------------------------------------------------------------*/ +static struct miscdevice akm09911_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "msensor", + .fops = &akm09911_fops, +}; +/*----------------------------------------------------------------------------*/ +int akm09911_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + hwm_sensor_data* msensor_data; + +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + +#if DEBUG + if(atomic_read(&data->trace) & AMK_FUN_DEBUG) + { + AKMFUNC("akm09911_operate"); + } +#endif + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if(value <= 10) + { + value = 10; + } + akmd_delay = value; + } + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + + value = *(int *)buff_in; + + if(value == 1) + { + atomic_set(&m_flag, 1); + atomic_set(&open_flag, 1); + } + else + { + atomic_set(&m_flag, 0); + if(atomic_read(&o_flag) == 0) + { + // atomic_set(&m_flag, 0); // if gyro, rv,la ,gravity open , then m flag open + atomic_set(&open_flag, 0); + } + } + wake_up(&open_wq); + + // TODO: turn device into standby or normal mode + } + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + printk(KERN_ERR "get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + msensor_data = (hwm_sensor_data *)buff_out; + mutex_lock(&sensor_data_mutex); + + msensor_data->values[0] = sensor_data[5] * CONVERT_M; + msensor_data->values[1] = sensor_data[6] * CONVERT_M; + msensor_data->values[2] = sensor_data[7] * CONVERT_M; + msensor_data->status = sensor_data[8]; + msensor_data->value_divide = CONVERT_M_DIV; + + mutex_unlock(&sensor_data_mutex); +#if DEBUG + if(atomic_read(&data->trace) & AMK_HWM_DEBUG) + { + AKMDBG("Hwm get m-sensor data: %d, %d, %d. divide %d, status %d!\n", + msensor_data->values[0],msensor_data->values[1],msensor_data->values[2], + msensor_data->value_divide,msensor_data->status); + } +#endif + } + break; + default: + printk(KERN_ERR "msensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + +/*----------------------------------------------------------------------------*/ +int akm09911_orientation_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + hwm_sensor_data* osensor_data; +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + +#if DEBUG + if(atomic_read(&data->trace) & AMK_FUN_DEBUG) + { + AKMFUNC("akm09911_orientation_operate"); + } +#endif + + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if(value <= 10) + { + value = 10; + } + akmd_delay = value; + } + break; + + case SENSOR_ENABLE: + + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + + value = *(int *)buff_in; + // printk(KERN_ERR "akm09911_orientation_operate SENSOR_ENABLE=%d mEnabled=%d\n",value,mEnabled); + + if (mEnabled <= 0) { + if(value == 1) + { + atomic_set(&o_flag, 1); + atomic_set(&open_flag, 1); + } + } + else if (mEnabled == 1){ + if (!value ) + { + atomic_set(&o_flag, 0); + if(atomic_read(&m_flag) == 0) + { + atomic_set(&open_flag, 0); + } + } + } + + if (value ) { + mEnabled++; + if (mEnabled > 32767) mEnabled = 32767; + } else { + mEnabled--; + if (mEnabled < 0) mEnabled = 0; + } + wake_up(&open_wq); + } + + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + printk(KERN_ERR "get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + osensor_data = (hwm_sensor_data *)buff_out; + mutex_lock(&sensor_data_mutex); + + osensor_data->values[0] = sensor_data[13] * CONVERT_O; + osensor_data->values[1] = sensor_data[14] * CONVERT_O; + osensor_data->values[2] = sensor_data[15] * CONVERT_O; + osensor_data->status = sensor_data[8]; + osensor_data->value_divide = CONVERT_O_DIV; + + mutex_unlock(&sensor_data_mutex); +#if DEBUG + if(atomic_read(&data->trace) & AMK_HWM_DEBUG) + { + AKMDBG("Hwm get o-sensor data: %d, %d, %d. divide %d, status %d!\n", + osensor_data->values[0],osensor_data->values[1],osensor_data->values[2], + osensor_data->value_divide,osensor_data->status); + } +#endif + } + break; + default: + printk(KERN_ERR "gsensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + +#ifdef AKM_Pseudogyro +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +int akm09911_gyroscope_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + hwm_sensor_data* gyrosensor_data; +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + +#if DEBUG + if(atomic_read(&data->trace) & AMK_FUN_DEBUG) + { + AKMFUNC("akm09911_gyroscope_operate"); + } +#endif + + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + + akmd_delay = 10; // fix to 100Hz + } + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + + value = *(int *)buff_in; + // printk(KERN_ERR "akm09911_gyroscope_operate SENSOR_ENABLE=%d mEnabled=%d\n",value,mEnabled); + if (mEnabled <= 0) { + if(value == 1) + { + atomic_set(&o_flag, 1); + atomic_set(&open_flag, 1); + } + } + else if (mEnabled == 1){ + if (!value ) + { + atomic_set(&o_flag, 0); + if(atomic_read(&m_flag) == 0) + { + atomic_set(&open_flag, 0); + } + } + } + + if (value ) { + mEnabled++; + if (mEnabled > 32767) mEnabled = 32767; + } else { + mEnabled--; + if (mEnabled < 0) mEnabled = 0; + } + + wake_up(&open_wq); + } + + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + printk(KERN_ERR "get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + gyrosensor_data = (hwm_sensor_data *)buff_out; + mutex_lock(&sensor_data_mutex); + + gyrosensor_data->values[0] = sensor_data[9] * CONVERT_Q16; + gyrosensor_data->values[1] = sensor_data[10] * CONVERT_Q16; + gyrosensor_data->values[2] = sensor_data[11] * CONVERT_Q16; + gyrosensor_data->status = sensor_data[12]; + gyrosensor_data->value_divide = CONVERT_Q16_DIV; + + mutex_unlock(&sensor_data_mutex); +#if DEBUG + if(atomic_read(&data->trace) & AMK_HWM_DEBUG) + { + AKMDBG("Hwm get gyro-sensor data: %d, %d, %d. divide %d, status %d!\n", + gyrosensor_data->values[0],gyrosensor_data->values[1],gyrosensor_data->values[2], + gyrosensor_data->value_divide,gyrosensor_data->status); + } +#endif + } + break; + default: + printk(KERN_ERR "gyrosensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + +/*----------------------------------------------------------------------------*/ +int akm09911_rotation_vector_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + hwm_sensor_data* RV_data; +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + +#if DEBUG + if(atomic_read(&data->trace) & AMK_FUN_DEBUG) + { + AKMFUNC("akm09911_rotation_vector_operate"); + } +#endif + + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + akmd_delay = 10; // fix to 100Hz + } + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + + value = *(int *)buff_in; + + if (mEnabled <= 0) { + if(value == 1) + { + atomic_set(&o_flag, 1); + atomic_set(&open_flag, 1); + } + } + else if (mEnabled == 1){ + if (!value ) + { + atomic_set(&o_flag, 0); + if(atomic_read(&m_flag) == 0) + { + atomic_set(&open_flag, 0); + } + } + } + + if (value ) { + mEnabled++; + if (mEnabled > 32767) mEnabled = 32767; + } else { + mEnabled--; + if (mEnabled < 0) mEnabled = 0; + } + wake_up(&open_wq); + } + + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + printk(KERN_ERR "get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + RV_data = (hwm_sensor_data *)buff_out; + mutex_lock(&sensor_data_mutex); + + RV_data->values[0] = sensor_data[22] * CONVERT_Q16; + RV_data->values[1] = sensor_data[23] * CONVERT_Q16; + RV_data->values[2] = sensor_data[24] * CONVERT_Q16; + RV_data->status = 0 ; //sensor_data[19]; fix w-> 0 w + RV_data->value_divide = CONVERT_Q16_DIV; + + mutex_unlock(&sensor_data_mutex); +#if DEBUG + if(atomic_read(&data->trace) & AMK_HWM_DEBUG) + { + AKMDBG("Hwm get rv-sensor data: %d, %d, %d. divide %d, status %d!\n", + RV_data->values[0],RV_data->values[1],RV_data->values[2], + RV_data->value_divide,RV_data->status); + } +#endif + } + break; + default: + printk(KERN_ERR "RV operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + + +/*----------------------------------------------------------------------------*/ +int akm09911_gravity_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + hwm_sensor_data* gravity_data; +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + +#if DEBUG + if(atomic_read(&data->trace) & AMK_FUN_DEBUG) + { + AKMFUNC("akm09911_gravity_operate"); + } +#endif + + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if(value <= 10) + { + value = 10; + } + akmd_delay = value; + } + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + + value = *(int *)buff_in; + + if (mEnabled <= 0) { + if(value == 1) + { + atomic_set(&o_flag, 1); + atomic_set(&open_flag, 1); + } + } + else if (mEnabled == 1){ + if (!value ) + { + atomic_set(&o_flag, 0); + if(atomic_read(&m_flag) == 0) + { + atomic_set(&open_flag, 0); + } + } + } + + if (value ) { + mEnabled++; + if (mEnabled > 32767) mEnabled = 32767; + } else { + mEnabled--; + if (mEnabled < 0) mEnabled = 0; + } + wake_up(&open_wq); + } + + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + printk(KERN_ERR "get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + gravity_data = (hwm_sensor_data *)buff_out; + mutex_lock(&sensor_data_mutex); + + gravity_data->values[0] = sensor_data[16] * CONVERT_Q16; + gravity_data->values[1] = sensor_data[17] * CONVERT_Q16; + gravity_data->values[2] = sensor_data[18] * CONVERT_Q16; + gravity_data->status = sensor_data[4]; + gravity_data->value_divide = CONVERT_Q16_DIV; + + mutex_unlock(&sensor_data_mutex); +#if DEBUG + if(atomic_read(&data->trace) & AMK_HWM_DEBUG) + { + AKMDBG("Hwm get gravity-sensor data: %d, %d, %d. divide %d, status %d!\n", + gravity_data->values[0],gravity_data->values[1],gravity_data->values[2], + gravity_data->value_divide,gravity_data->status); + } +#endif + } + break; + default: + printk(KERN_ERR "gravity operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + + +/*----------------------------------------------------------------------------*/ +int akm09911_linear_accelration_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value; + hwm_sensor_data* LA_data; +#if DEBUG + struct i2c_client *client = this_client; + struct akm09911_i2c_data *data = i2c_get_clientdata(client); +#endif + +#if DEBUG + if(atomic_read(&data->trace) & AMK_FUN_DEBUG) + { + AKMFUNC("akm09911_linear_accelration_operate"); + } +#endif + + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if(value <= 10) + { + value = 10; + } + akmd_delay = value; + } + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + printk(KERN_ERR "Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + + value = *(int *)buff_in; + + if (mEnabled <= 0) { + if(value == 1) + { + atomic_set(&o_flag, 1); + atomic_set(&open_flag, 1); + } + } + else if (mEnabled == 1){ + if (!value ) + { + atomic_set(&o_flag, 0); + if(atomic_read(&m_flag) == 0) + { + atomic_set(&open_flag, 0); + } + } + } + + if (value ) { + mEnabled++; + if (mEnabled > 32767) mEnabled = 32767; + } else { + mEnabled--; + if (mEnabled < 0) mEnabled = 0; + } + wake_up(&open_wq); + } + + break; + + case SENSOR_GET_DATA: + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + printk(KERN_ERR "get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + LA_data = (hwm_sensor_data *)buff_out; + mutex_lock(&sensor_data_mutex); + + LA_data->values[0] = sensor_data[19] * CONVERT_Q16; + LA_data->values[1] = sensor_data[20] * CONVERT_Q16; + LA_data->values[2] = sensor_data[21] * CONVERT_Q16; + LA_data->status = sensor_data[4]; + LA_data->value_divide = CONVERT_Q16_DIV; + + mutex_unlock(&sensor_data_mutex); +#if DEBUG + if(atomic_read(&data->trace) & AMK_HWM_DEBUG) + { + AKMDBG("Hwm get LA-sensor data: %d, %d, %d. divide %d, status %d!\n", + LA_data->values[0],LA_data->values[1],LA_data->values[2], + LA_data->value_divide,LA_data->status); + } +#endif + } + break; + default: + printk(KERN_ERR "linear_accelration operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + +#endif + +#ifndef CONFIG_HAS_EARLYSUSPEND +/*----------------------------------------------------------------------------*/ +static int akm09911_suspend(struct i2c_client *client, pm_message_t msg) +{ + int err; + struct akm09911_i2c_data *obj = i2c_get_clientdata(client) + + + if(msg.event == PM_EVENT_SUSPEND) + { + akm09911_power(obj->hw, 0); + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static int akm09911_resume(struct i2c_client *client) +{ + int err; + struct akm09911_i2c_data *obj = i2c_get_clientdata(client) + + + akm09911_power(obj->hw, 1); + + + return 0; +} +/*----------------------------------------------------------------------------*/ +#else /*CONFIG_HAS_EARLY_SUSPEND is defined*/ +/*----------------------------------------------------------------------------*/ +static void akm09911_early_suspend(struct early_suspend *h) +{ + struct akm09911_i2c_data *obj = container_of(h, struct akm09911_i2c_data, early_drv); + int err = 0; + + if(NULL == obj) + { + printk(KERN_ERR "null pointer!!\n"); + return; + } + if ((err = AKECS_SetMode(AK09911_MODE_POWERDOWN)) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return; + } + + akm09911_power(obj->hw, 0); +} +/*----------------------------------------------------------------------------*/ +static void akm09911_late_resume(struct early_suspend *h) +{ + struct akm09911_i2c_data *obj = container_of(h, struct akm09911_i2c_data, early_drv); + int err; + + + if(NULL == obj) + { + printk(KERN_ERR "null pointer!!\n"); + return; + } + akm09911_power(obj->hw, 1); + + if ((err = AKECS_SetMode(AK09911_MODE_SNG_MEASURE)) < 0) { + AKMDBG("%s:%d Error.\n", __FUNCTION__, __LINE__); + return; + } +} +/*----------------------------------------------------------------------------*/ +#endif /*CONFIG_HAS_EARLYSUSPEND*/ +/*----------------------------------------------------------------------------*/ +static int akm09911_i2c_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + strcpy(info->type, AKM09911_DEV_NAME); + return 0; +} + +static int ecompass_status_read_proc(struct file *file, char *buffer, size_t count, loff_t *ppos) +{ + char *page = NULL; + char *ptr = NULL; + int len = 0; + int err = -1; + + page = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!page) + { + kfree(page); + return -ENOMEM; + } + ptr = page; + + ptr += sprintf(ptr, "%d\n", ecompass_status); + + len = ptr - page; + if(*ppos >= len) + { + kfree(page); + return 0; + } + err = copy_to_user(buffer,(char *)page,len); + *ppos += len; + if(err) + { + kfree(page); + return err; + } + kfree(page); + return len; +} + +static const struct file_operations akm09911_ecompass_status_proc_fops = { + .read = ecompass_status_read_proc +}; + + +/*----------------------------------------------------------------------------*/ +static int akm09911_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_client *new_client; + struct akm09911_i2c_data *data; + int err = 0; + struct hwmsen_object sobj_m, sobj_o; + struct hwmsen_object sobj_gyro, sobj_rv; + struct hwmsen_object sobj_gravity, sobj_la; + + if(!(data = kmalloc(sizeof(struct akm09911_i2c_data), GFP_KERNEL))) + { + err = -ENOMEM; + goto exit; + } + memset(data, 0, sizeof(struct akm09911_i2c_data)); + data->hw = get_cust_mag_hw(); + + atomic_set(&data->layout, data->hw->direction); + atomic_set(&data->trace, 0); + + mutex_init(&sense_data_mutex); + mutex_init(&sensor_data_mutex); + + init_waitqueue_head(&data_ready_wq); + init_waitqueue_head(&open_wq); + + data->client = client; + new_client = data->client; + i2c_set_clientdata(new_client, data); + + this_client = new_client; + + printk(KERN_ERR " AKM09911 akm09911_probe: befor init prob \n"); + /* Check connection */ + err = AKECS_CheckDevice(); + if(err < 0) + { + printk(KERN_ERR "AKM09911 akm09911_probe: check device connect error\n"); + goto exit_init_failed; + } + + + /* Register sysfs attribute */ + if((err = akm09911_create_attr(&akm_sensor_driver.driver))) + { + printk(KERN_ERR "create attribute err = %d\n", err); + goto exit_sysfs_create_group_failed; + } + + + if((err = misc_register(&akm09911_device))) + { + printk(KERN_ERR "akm09911_device register failed\n"); + goto exit_misc_device_register_failed; } + + sobj_m.self = data; + sobj_m.polling = 1; + sobj_m.sensor_operate = akm09911_operate; + if((err = hwmsen_attach(ID_MAGNETIC, &sobj_m))) + { + printk(KERN_ERR "attach fail = %d\n", err); + goto exit_kfree; + } + + sobj_o.self = data; + sobj_o.polling = 1; + sobj_o.sensor_operate = akm09911_orientation_operate; + if((err = hwmsen_attach(ID_ORIENTATION, &sobj_o))) + { + printk(KERN_ERR "attach fail = %d\n", err); + goto exit_kfree; + } + +#ifdef AKM_Pseudogyro + //pseudo gyro sensor + sobj_gyro.self = data; + sobj_gyro.polling = 1; + sobj_gyro.sensor_operate = akm09911_gyroscope_operate; + if(err = hwmsen_attach(ID_GYROSCOPE, &sobj_gyro)) + { + printk(KERN_ERR "attach fail = %d\n", err); + goto exit_kfree; + } + + //rotation vector sensor + + sobj_rv.self = data; + sobj_rv.polling = 1; + sobj_rv.sensor_operate = akm09911_rotation_vector_operate; + if(err = hwmsen_attach(ID_ROTATION_VECTOR, &sobj_rv)) + { + printk(KERN_ERR "attach fail = %d\n", err); + goto exit_kfree; + } + + //Gravity sensor + + sobj_gravity.self = data; + sobj_gravity.polling = 1; + sobj_gravity.sensor_operate = akm09911_gravity_operate; + if(err = hwmsen_attach( ID_GRAVITY, &sobj_gravity)) + { + printk(KERN_ERR "attach fail = %d\n", err); + goto exit_kfree; + } + + //LINEAR_ACCELERATION sensor + + sobj_la.self = data; + sobj_la.polling = 1; + sobj_la.sensor_operate = akm09911_linear_accelration_operate; + if(err = hwmsen_attach( ID_LINEAR_ACCELERATION, &sobj_la)) + { + // printk(KERN_ERR "attach fail = %d\n", err); + goto exit_kfree; + } + +#endif + +#if CONFIG_HAS_EARLYSUSPEND + data->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 2, + data->early_drv.suspend = akm09911_early_suspend, + data->early_drv.resume = akm09911_late_resume, + register_early_suspend(&data->early_drv); +#endif + + AKMDBG("%s: OK\n", __func__); + ecompass_status = 1; + return 0; + + exit_sysfs_create_group_failed: + exit_init_failed: + exit_misc_device_register_failed: + exit_kfree: + kfree(data); + exit: + printk(KERN_ERR "%s: err = %d\n", __func__, err); + ecompass_status = 0; + return err; +} +/*----------------------------------------------------------------------------*/ +static int akm09911_i2c_remove(struct i2c_client *client) +{ + int err; + + if((err = akm09911_delete_attr(&akm_sensor_driver.driver))) + { + printk(KERN_ERR "akm09911_delete_attr fail: %d\n", err); + } + + this_client = NULL; + i2c_unregister_device(client); + kfree(i2c_get_clientdata(client)); + misc_deregister(&akm09911_device); + return 0; +} +/*----------------------------------------------------------------------------*/ +static int akm_probe(struct platform_device *pdev) +{ + struct mag_hw *hw = get_cust_mag_hw(); + + akm09911_power(hw, 1); + + atomic_set(&dev_open_count, 0); + //akm09911_force[0] = hw->i2c_num; + + if(i2c_add_driver(&akm09911_i2c_driver)) + { + printk(KERN_ERR "add driver error\n"); + return -1; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static int akm_remove(struct platform_device *pdev) +{ + struct mag_hw *hw = get_cust_mag_hw(); + + akm09911_power(hw, 0); + atomic_set(&dev_open_count, 0); + i2c_del_driver(&akm09911_i2c_driver); + return 0; +} +/*----------------------------------------------------------------------------*/ +static int __init akm09911_init(void) +{ + struct mag_hw *hw = get_cust_mag_hw(); + printk("akm09911: i2c_number=%d\n",hw->i2c_num); + // register cat /proc/ecompass_status + akm09911_ecompass_status_proc = proc_create("ecompass_status", 0, NULL, &akm09911_ecompass_status_proc_fops); + if (akm09911_ecompass_status_proc == NULL) + { + printk(KERN_ERR "create_proc_entry ecompass_status failed"); + } + + i2c_register_board_info(hw->i2c_num, &i2c_akm09911, 1); + if(platform_driver_register(&akm_sensor_driver)) + { + printk(KERN_ERR "failed to register driver"); + return -ENODEV; + } + return 0; +} +/*----------------------------------------------------------------------------*/ +static void __exit akm09911_exit(void) +{ + platform_driver_unregister(&akm_sensor_driver); +} +/*----------------------------------------------------------------------------*/ +module_init(akm09911_init); +module_exit(akm09911_exit); + +MODULE_AUTHOR("viral wang "); +MODULE_DESCRIPTION("AKM09911 compass driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(DRIVER_VERSION); diff --git a/arch/arm/mach-mt8127/ford/magnetometer/akm09911.h b/arch/arm/mach-mt8127/ford/magnetometer/akm09911.h new file mode 100644 index 00000000000..8fa660b6a28 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/magnetometer/akm09911.h @@ -0,0 +1,414 @@ +/* + * Definitions for akm09911 compass chip. + */ +#ifndef AKM09911_H +#define AKM09911_H + +#include + +#define AKM09911_I2C_NAME "akm09911" + +#define AKM09911_I2C_ADDRESS 0x18 +#define AKM09911_BUFSIZE 0x20 + +#define SENSOR_DATA_SIZE 9 /* Rx buffer size, i.e from ST1 to ST2 */ +#define RWBUF_SIZE 16 /* Read/Write buffer size.*/ +#define CALIBRATION_DATA_SIZE 26 + +/*! \name AK09911 register address +\anchor AK09911_REG +Defines a register address of the AK09911.*/ +/*! @{*/ +/* Device specific constant values */ +#define AK09911_REG_WIA1 0x00 +#define AK09911_REG_WIA2 0x01 +#define AK09911_REG_INFO1 0x02 +#define AK09911_REG_INFO2 0x03 +#define AK09911_REG_ST1 0x10 +#define AK09911_REG_HXL 0x11 +#define AK09911_REG_HXH 0x12 +#define AK09911_REG_HYL 0x13 +#define AK09911_REG_HYH 0x14 +#define AK09911_REG_HZL 0x15 +#define AK09911_REG_HZH 0x16 +#define AK09911_REG_TMPS 0x17 +#define AK09911_REG_ST2 0x18 +#define AK09911_REG_CNTL1 0x30 +#define AK09911_REG_CNTL2 0x31 +#define AK09911_REG_CNTL3 0x32 + +/*! \name AK09911 fuse-rom address +\anchor AK09911_FUSE +Defines a read-only address of the fuse ROM of the AK09911.*/ +#define AK09911_FUSE_ASAX 0x60 +#define AK09911_FUSE_ASAY 0x61 +#define AK09911_FUSE_ASAZ 0x62 + +/*! \name AK09911 operation mode + \anchor AK09911_Mode + Defines an operation mode of the AK09911.*/ +#define AK09911_MODE_SNG_MEASURE 0x01 +#define AK09911_MODE_SELF_TEST 0x10 +#define AK09911_MODE_FUSE_ACCESS 0x1F +#define AK09911_MODE_POWERDOWN 0x00 +#define AK09911_RESET_DATA 0x01 + +#define AK09911_REGS_SIZE 13 +#define AK09911_WIA1_VALUE 0x48 +#define AK09911_WIA2_VALUE 0x05 + +/* Device specific constant values for AK8963*/ +#define AK8963_REG_WIA 0x00 +#define AK8963_REG_INFO 0x01 +#define AK8963_REG_ST1 0x02 +#define AK8963_REG_HXL 0x03 +#define AK8963_REG_HXH 0x04 +#define AK8963_REG_HYL 0x05 +#define AK8963_REG_HYH 0x06 +#define AK8963_REG_HZL 0x07 +#define AK8963_REG_HZH 0x08 +#define AK8963_REG_ST2 0x09 +#define AK8963_REG_CNTL1 0x0A +#define AK8963_REG_CNTL2 0x0B +#define AK8963_REG_ASTC 0x0C +#define AK8963_REG_TS1 0x0D +#define AK8963_REG_TS2 0x0E +#define AK8963_REG_I2CDIS 0x0F + +#define AK8963_FUSE_ASAX 0x10 +#define AK8963_FUSE_ASAY 0x11 +#define AK8963_FUSE_ASAZ 0x12 + +#define AK8963_MODE_SNG_MEASURE 0x01 +#define AK8963_MODE_SELF_TEST 0x08 +#define AK8963_MODE_FUSE_ACCESS 0x0F +#define AK8963_MODE_POWERDOWN 0x00 +#define AK8963_RESET_DATA 0x01 + +#define AK8963_REGS_SIZE 13 +#define AK8963_WIA_VALUE 0x48 + + +/* To avoid device dependency, convert to general name */ +#define AKM_I2C_NAME "akm09911" +#define AKM_MISCDEV_NAME "akm09911_dev" +#define AKM_SYSCLS_NAME "compass" +#define AKM_SYSDEV_NAME "akm09911" +#define AKM_REG_MODE AK09911_REG_CNTL2 +#define AKM_REG_RESET AK09911_REG_CNTL3 +#define AKM_REG_STATUS AK09911_REG_ST1 +#define AKM_MEASURE_TIME_US 10000 +#define AKM_DRDY_IS_HIGH(x) ((x) & 0x01) +#define AKM_SENSOR_INFO_SIZE 2 +#define AKM_SENSOR_CONF_SIZE 3 +#define AKM_SENSOR_DATA_SIZE 9 + +#define AKM_YPR_DATA_SIZE 26 +#define AKM_RWBUF_SIZE 16 +#define AKM_REGS_SIZE AK09911_REGS_SIZE +#define AKM_REGS_1ST_ADDR AK09911_REG_WIA1 +#define AKM_FUSE_1ST_ADDR AK09911_FUSE_ASAX + +#define AKM_MODE_SNG_MEASURE AK09911_MODE_SNG_MEASURE +#define AKM_MODE_SELF_TEST AK09911_MODE_SELF_TEST +#define AKM_MODE_FUSE_ACCESS AK09911_MODE_FUSE_ACCESS +#define AKM_MODE_POWERDOWN AK09911_MODE_POWERDOWN +#define AKM_RESET_DATA AK09911_RESET_DATA + +#define ACC_DATA_FLAG 0 +#define MAG_DATA_FLAG 1 +#define FUSION_DATA_FLAG 2 +#define AKM_NUM_SENSORS 3 + +#define ACC_DATA_READY (1<<(ACC_DATA_FLAG)) +#define MAG_DATA_READY (1<<(MAG_DATA_FLAG)) +#define FUSION_DATA_READY (1<<(FUSION_DATA_FLAG)) +/*! @}*/ + + + +// conversion of magnetic data (for AK09911) to uT units +//#define CONVERT_M (1.0f*0.06f) +// conversion of orientation data to degree units +//#define CONVERT_O (1.0f/64.0f) + +#define CONVERT_M 6 +#define CONVERT_M_DIV 100 // 6/100 = CONVERT_M +#define CONVERT_O 1 +#define CONVERT_O_DIV 64 // 1/64 = CONVERT_O + +#define CONVERT_Q16 1 +#define CONVERT_Q16_DIV 65536 // 1/64 = CONVERT_O + + + +#define CSPEC_SPI_USE 0 +#define DBG_LEVEL0 0x0001 // Critical +#define DBG_LEVEL1 0x0002 // Notice +#define DBG_LEVEL2 0x0003 // Information +#define DBG_LEVEL3 0x0004 // Debug +#define DBGFLAG DBG_LEVEL2 + +/* +//sensors_io.h need modify@junger +#define AKMIO 0xA1 + +* IOCTLs for AKM library * +#define ECS_IOCTL_READ _IOWR(AKMIO, 0x01, char*) +#define ECS_IOCTL_WRITE _IOW(AKMIO, 0x02, char*) +#define ECS_IOCTL_SET_MODE _IOW(AKMIO, 0x03, short) +#define ECS_IOCTL_GETDATA _IOR(AKMIO, 0x04, char[SENSOR_DATA_SIZE]) +#define ECS_IOCTL_SET_YPR _IOW(AKMIO, 0x05, int[YPR_DATA_SIZE]) +#define ECS_IOCTL_GET_OPEN_STATUS _IOR(AKMIO, 0x06, int) +#define ECS_IOCTL_GET_CLOSE_STATUS _IOR(AKMIO, 0x07, int) +#define ECS_IOCTL_GET_DELAY _IOR(AKMIO, 0x08, long long int[AKM_NUM_SENSORS]) +#define ECS_IOCTL_GET_LAYOUT _IOR(AKMIO, 0x09, char) +#define ECS_IOCTL_GET_OUTBIT _IOR(AKMIO, 0x0B, char) +#define ECS_IOCTL_RESET _IO(AKMIO, 0x0C) +#define ECS_IOCTL_GET_ACCEL _IOR(AKMIO, 0x30, short[3]) +*/ + +/* IOCTLs for Msensor misc. device library */ +#define MSENSOR 0x83 +/* IOCTLs for AKM library */ +#define ECS_IOCTL_WRITE _IOW(MSENSOR, 0x0b, char*) +#define ECS_IOCTL_READ _IOWR(MSENSOR, 0x0c, char*) +#define ECS_IOCTL_RESET _IO(MSENSOR, 0x0d) /* NOT used in AK8975 */ +#define ECS_IOCTL_SET_MODE _IOW(MSENSOR, 0x0e, short) +#define ECS_IOCTL_GETDATA _IOR(MSENSOR, 0x0f, char[SENSOR_DATA_SIZE]) +#define ECS_IOCTL_SET_YPR _IOW(MSENSOR, 0x10, short[12]) +#define ECS_IOCTL_GET_OPEN_STATUS _IOR(MSENSOR, 0x11, int) +#define ECS_IOCTL_GET_CLOSE_STATUS _IOR(MSENSOR, 0x12, int) +#define ECS_IOCTL_GET_OSENSOR_STATUS _IOR(MSENSOR, 0x13, int) +#define ECS_IOCTL_GET_DELAY _IOR(MSENSOR, 0x14, short) +#define ECS_IOCTL_GET_PROJECT_NAME _IOR(MSENSOR, 0x15, char[64]) +#define ECS_IOCTL_GET_MATRIX _IOR(MSENSOR, 0x16, short [4][3][3]) +#define ECS_IOCTL_GET_LAYOUT _IOR(MSENSOR, 0x17, int[3]) + +#define ECS_IOCTL_GET_OUTBIT _IOR(MSENSOR, 0x23, char) +#define ECS_IOCTL_GET_ACCEL _IOR(MSENSOR, 0x24, short[3]) + +//#define ECS_IOCTL_GET_INFO _IOR(MSENSOR, 0x27, unsigned char[AKM_SENSOR_INFO_SIZE]) +#define ECS_IOCTL_GET_CONF _IOR(MSENSOR, 0x28, unsigned char[AKM_SENSOR_CONF_SIZE]) +#define ECS_IOCTL_SET_YPR_09911 _IOW(MSENSOR, 0x29, int[26]) +#define ECS_IOCTL_GET_DELAY_09911 _IOR(MSENSOR, 0x30, int64_t[3]) +#define ECS_IOCTL_GET_LAYOUT_09911 _IOR(MSENSOR, 0x31, char) + +#ifndef DBGPRINT +#define DBGPRINT(level, format, ...) \ + ((((level) != 0) && ((level) <= DBGFLAG)) \ + ? (printk(KERN_INFO, (format), ##__VA_ARGS__)) \ + : (void)0) + +#endif + +struct akm09911_platform_data { + char layout; + char outbit; + int gpio_DRDY; + int gpio_RSTN; +}; + +/*** Limit of factory shipment test *******************************************/ +#define TLIMIT_TN_REVISION_09911 "" +#define TLIMIT_NO_RST_WIA1_09911 "1-3" +#define TLIMIT_TN_RST_WIA1_09911 "RST_WIA1" +#define TLIMIT_LO_RST_WIA1_09911 0x48 +#define TLIMIT_HI_RST_WIA1_09911 0x48 +#define TLIMIT_NO_RST_WIA2_09911 "1-4" +#define TLIMIT_TN_RST_WIA2_09911 "RST_WIA2" +#define TLIMIT_LO_RST_WIA2_09911 0x05 +#define TLIMIT_HI_RST_WIA2_09911 0x05 + +#define TLIMIT_NO_ASAX_09911 "1-7" +#define TLIMIT_TN_ASAX_09911 "ASAX" +#define TLIMIT_LO_ASAX_09911 1 +#define TLIMIT_HI_ASAX_09911 254 +#define TLIMIT_NO_ASAY_09911 "1-8" +#define TLIMIT_TN_ASAY_09911 "ASAY" +#define TLIMIT_LO_ASAY_09911 1 +#define TLIMIT_HI_ASAY_09911 254 +#define TLIMIT_NO_ASAZ_09911 "1-9" +#define TLIMIT_TN_ASAZ_09911 "ASAZ" +#define TLIMIT_LO_ASAZ_09911 1 +#define TLIMIT_HI_ASAZ_09911 254 + +#define TLIMIT_NO_SNG_ST1_09911 "2-3" +#define TLIMIT_TN_SNG_ST1_09911 "SNG_ST1" +#define TLIMIT_LO_SNG_ST1_09911 1 +#define TLIMIT_HI_SNG_ST1_09911 1 + +#define TLIMIT_NO_SNG_HX_09911 "2-4" +#define TLIMIT_TN_SNG_HX_09911 "SNG_HX" +#define TLIMIT_LO_SNG_HX_09911 -8189 +#define TLIMIT_HI_SNG_HX_09911 8189 + +#define TLIMIT_NO_SNG_HY_09911 "2-6" +#define TLIMIT_TN_SNG_HY_09911 "SNG_HY" +#define TLIMIT_LO_SNG_HY_09911 -8189 +#define TLIMIT_HI_SNG_HY_09911 8189 + +#define TLIMIT_NO_SNG_HZ_09911 "2-8" +#define TLIMIT_TN_SNG_HZ_09911 "SNG_HZ" +#define TLIMIT_LO_SNG_HZ_09911 -8189 +#define TLIMIT_HI_SNG_HZ_09911 8189 + +#define TLIMIT_NO_SNG_ST2_09911 "2-10" +#define TLIMIT_TN_SNG_ST2_09911 "SNG_ST2" +#define TLIMIT_LO_SNG_ST2_09911 0 +#define TLIMIT_HI_SNG_ST2_09911 0 + +#define TLIMIT_NO_SLF_ST1_09911 "2-13" +#define TLIMIT_TN_SLF_ST1_09911 "SLF_ST1" +#define TLIMIT_LO_SLF_ST1_09911 1 +#define TLIMIT_HI_SLF_ST1_09911 1 + +#define TLIMIT_NO_SLF_RVHX_09911 "2-14" +#define TLIMIT_TN_SLF_RVHX_09911 "SLF_REVSHX" +#define TLIMIT_LO_SLF_RVHX_09911 -30 +#define TLIMIT_HI_SLF_RVHX_09911 30 + +#define TLIMIT_NO_SLF_RVHY_09911 "2-16" +#define TLIMIT_TN_SLF_RVHY_09911 "SLF_REVSHY" +#define TLIMIT_LO_SLF_RVHY_09911 -30 +#define TLIMIT_HI_SLF_RVHY_09911 30 + +#define TLIMIT_NO_SLF_RVHZ_09911 "2-18" +#define TLIMIT_TN_SLF_RVHZ_09911 "SLF_REVSHZ" +#define TLIMIT_LO_SLF_RVHZ_09911 -400 +#define TLIMIT_HI_SLF_RVHZ_09911 -50 + +#define TLIMIT_NO_SLF_ST2_09911 "2-20" +#define TLIMIT_TN_SLF_ST2_09911 "SLF_ST2" +#define TLIMIT_LO_SLF_ST2_09911 0 +#define TLIMIT_HI_SLF_ST2_09911 0 + +/*** Limit of factory shipment test *******************************************/ + +#define TLIMIT_TN_REVISION "" +#define TLIMIT_NO_RST_WIA "1-3" +#define TLIMIT_TN_RST_WIA "RST_WIA" +#define TLIMIT_LO_RST_WIA 0x48 +#define TLIMIT_HI_RST_WIA 0x48 +#define TLIMIT_NO_RST_INFO "1-4" +#define TLIMIT_TN_RST_INFO "RST_INFO" +#define TLIMIT_LO_RST_INFO 0 +#define TLIMIT_HI_RST_INFO 255 +#define TLIMIT_NO_RST_ST1 "1-5" +#define TLIMIT_TN_RST_ST1 "RST_ST1" +#define TLIMIT_LO_RST_ST1 0 +#define TLIMIT_HI_RST_ST1 0 +#define TLIMIT_NO_RST_HXL "1-6" +#define TLIMIT_TN_RST_HXL "RST_HXL" +#define TLIMIT_LO_RST_HXL 0 +#define TLIMIT_HI_RST_HXL 0 +#define TLIMIT_NO_RST_HXH "1-7" +#define TLIMIT_TN_RST_HXH "RST_HXH" +#define TLIMIT_LO_RST_HXH 0 +#define TLIMIT_HI_RST_HXH 0 +#define TLIMIT_NO_RST_HYL "1-8" +#define TLIMIT_TN_RST_HYL "RST_HYL" +#define TLIMIT_LO_RST_HYL 0 +#define TLIMIT_HI_RST_HYL 0 +#define TLIMIT_NO_RST_HYH "1-9" +#define TLIMIT_TN_RST_HYH "RST_HYH" +#define TLIMIT_LO_RST_HYH 0 +#define TLIMIT_HI_RST_HYH 0 +#define TLIMIT_NO_RST_HZL "1-10" +#define TLIMIT_TN_RST_HZL "RST_HZL" +#define TLIMIT_LO_RST_HZL 0 +#define TLIMIT_HI_RST_HZL 0 +#define TLIMIT_NO_RST_HZH "1-11" +#define TLIMIT_TN_RST_HZH "RST_HZH" +#define TLIMIT_LO_RST_HZH 0 +#define TLIMIT_HI_RST_HZH 0 +#define TLIMIT_NO_RST_ST2 "1-12" +#define TLIMIT_TN_RST_ST2 "RST_ST2" +#define TLIMIT_LO_RST_ST2 0 +#define TLIMIT_HI_RST_ST2 0 +#define TLIMIT_NO_RST_CNTL "1-13" +#define TLIMIT_TN_RST_CNTL "RST_CNTL" +#define TLIMIT_LO_RST_CNTL 0 +#define TLIMIT_HI_RST_CNTL 0 +#define TLIMIT_NO_RST_ASTC "1-14" +#define TLIMIT_TN_RST_ASTC "RST_ASTC" +#define TLIMIT_LO_RST_ASTC 0 +#define TLIMIT_HI_RST_ASTC 0 +#define TLIMIT_NO_RST_I2CDIS "1-15" +#define TLIMIT_TN_RST_I2CDIS "RST_I2CDIS" +#define TLIMIT_LO_RST_I2CDIS_USEI2C 0 +#define TLIMIT_HI_RST_I2CDIS_USEI2C 0 +#define TLIMIT_LO_RST_I2CDIS_USESPI 1 +#define TLIMIT_HI_RST_I2CDIS_USESPI 1 +#define TLIMIT_NO_ASAX "1-17" +#define TLIMIT_TN_ASAX "ASAX" +#define TLIMIT_LO_ASAX 1 +#define TLIMIT_HI_ASAX 254 +#define TLIMIT_NO_ASAY "1-18" +#define TLIMIT_TN_ASAY "ASAY" +#define TLIMIT_LO_ASAY 1 +#define TLIMIT_HI_ASAY 254 +#define TLIMIT_NO_ASAZ "1-19" +#define TLIMIT_TN_ASAZ "ASAZ" +#define TLIMIT_LO_ASAZ 1 +#define TLIMIT_HI_ASAZ 254 +#define TLIMIT_NO_WR_CNTL "1-20" +#define TLIMIT_TN_WR_CNTL "WR_CNTL" +#define TLIMIT_LO_WR_CNTL 0x0F +#define TLIMIT_HI_WR_CNTL 0x0F + +#define TLIMIT_NO_SNG_ST1 "2-3" +#define TLIMIT_TN_SNG_ST1 "SNG_ST1" +#define TLIMIT_LO_SNG_ST1 1 +#define TLIMIT_HI_SNG_ST1 1 + +#define TLIMIT_NO_SNG_HX "2-4" +#define TLIMIT_TN_SNG_HX "SNG_HX" +#define TLIMIT_LO_SNG_HX -32759 +#define TLIMIT_HI_SNG_HX 32759 + +#define TLIMIT_NO_SNG_HY "2-6" +#define TLIMIT_TN_SNG_HY "SNG_HY" +#define TLIMIT_LO_SNG_HY -32759 +#define TLIMIT_HI_SNG_HY 32759 + +#define TLIMIT_NO_SNG_HZ "2-8" +#define TLIMIT_TN_SNG_HZ "SNG_HZ" +#define TLIMIT_LO_SNG_HZ -32759 +#define TLIMIT_HI_SNG_HZ 32759 + +#define TLIMIT_NO_SNG_ST2 "2-10" +#define TLIMIT_TN_SNG_ST2 "SNG_ST2" +#define TLIMIT_LO_SNG_ST2 0 +#define TLIMIT_HI_SNG_ST2 0 + +#define TLIMIT_NO_SLF_ST1 "2-14" +#define TLIMIT_TN_SLF_ST1 "SLF_ST1" +#define TLIMIT_LO_SLF_ST1 1 +#define TLIMIT_HI_SLF_ST1 1 + +#define TLIMIT_NO_SLF_RVHX "2-15" +#define TLIMIT_TN_SLF_RVHX "SLF_REVSHX" +#define TLIMIT_LO_SLF_RVHX -200 +#define TLIMIT_HI_SLF_RVHX 200 + +#define TLIMIT_NO_SLF_RVHY "2-17" +#define TLIMIT_TN_SLF_RVHY "SLF_REVSHY" +#define TLIMIT_LO_SLF_RVHY -200 +#define TLIMIT_HI_SLF_RVHY 200 + +#define TLIMIT_NO_SLF_RVHZ "2-19" +#define TLIMIT_TN_SLF_RVHZ "SLF_REVSHZ" +#define TLIMIT_LO_SLF_RVHZ -3200 +#define TLIMIT_HI_SLF_RVHZ -800 + +#define TLIMIT_NO_SLF_ST2 "2-21" +#define TLIMIT_TN_SLF_ST2 "SLF_ST2" +#define TLIMIT_LO_SLF_ST2 0 +#define TLIMIT_HI_SLF_ST2 0 + + + +#endif + + diff --git a/arch/arm/mach-mt8127/ford/magnetometer/cust_mag.c b/arch/arm/mach-mt8127/ford/magnetometer/cust_mag.c new file mode 100644 index 00000000000..1625a638bbc --- /dev/null +++ b/arch/arm/mach-mt8127/ford/magnetometer/cust_mag.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include + + +static struct mag_hw cust_mag_hw = { + .i2c_num = 2, + .direction = 7, + .power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ + .power_vol= VOL_DEFAULT, /*!< LDO is not used */ +}; +static struct mag_hw cust_mag_hw_rotation270 = { + .i2c_num = 2, + .direction = 4, + .power_id = MT65XX_POWER_NONE, /*!< LDO is not used */ + .power_vol= VOL_DEFAULT, /*!< LDO is not used */ +}; +struct mag_hw* get_cust_mag_hw(void) +{ + /*if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "270", 3)) */ + /* return &cust_mag_hw_rotation270;*/ /*for p2[wsvga]*/ + /*else*/ + return &cust_mag_hw; +} diff --git a/arch/arm/mach-mt8127/ford/magnetometer/inc/cust_mag.h b/arch/arm/mach-mt8127/ford/magnetometer/inc/cust_mag.h new file mode 100644 index 00000000000..2a9a6f58e94 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/magnetometer/inc/cust_mag.h @@ -0,0 +1,20 @@ +#ifndef __CUST_MAG_H__ +#define __CUST_MAG_H__ + +#include + +#define M_CUST_I2C_ADDR_NUM 2 + +struct mag_hw { + int i2c_num; + int direction; + int power_id; + int power_vol; + unsigned char i2c_addr[M_CUST_I2C_ADDR_NUM]; /*!< i2c address list,for chips which has different addresses with different HW layout */ + int power_vio_id; + int power_vio_vol; + bool is_batch_supported; +}; + +extern struct mag_hw* get_cust_mag_hw(void); +#endif diff --git a/arch/arm/mach-mt8127/ford/magnetometer/mag.c b/arch/arm/mach-mt8127/ford/magnetometer/mag.c new file mode 100644 index 00000000000..11fb199f510 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/magnetometer/mag.c @@ -0,0 +1,1011 @@ + +#include "mag.h" +#include "accel.h" + +static struct mag_context *mag_context_obj = NULL; + +static struct mag_init_info* msensor_init_list[MAX_CHOOSE_G_NUM]= {0}; //modified + +static void mag_early_suspend(struct early_suspend *h); +static void mag_late_resume(struct early_suspend *h); + +static void mag_work_func(struct work_struct *work) +{ + + struct mag_context *cxt = NULL; + int out_size; + hwm_sensor_data sensor_data; + int64_t nt; + struct timespec time; + int err, idx; + int i; + + cxt = mag_context_obj; + memset(&sensor_data, 0, sizeof(sensor_data)); + time.tv_sec = time.tv_nsec = 0; + time = get_monotonic_coarse(); + nt = time.tv_sec*1000000000LL+time.tv_nsec; + + for(i = 0; i < MAX_M_V_SENSOR; i++) + { + if (NULL == cxt->drv_obj[i]) + { + //MAG_LOG("%d driver not atteched\n",i); + continue; + } + + if((0 == cxt->drv_obj[i]->polling) || !(cxt->active_data_sensor&(0x01<drv_obj[i]->polling,cxt->active_data_sensor); + continue; + } + + err = cxt->drv_obj[i]->mag_operate(cxt->drv_obj[i]->self,OP_MAG_GET_DATA, NULL, 0, + &sensor_data, sizeof(hwm_sensor_data), &out_size); + + if(err) + { + MAG_ERR("get %d data fails!!\n" ,i); + return; + } + else + { + { + if( 0 == sensor_data.values[0] && 0==sensor_data.values[1] + && 0 == sensor_data.values[2]) + { + MAG_ERR("data is zero.\n" ); + continue; + } + + cxt->drv_data[i].mag_data.values[0] = sensor_data.values[0]; + cxt->drv_data[i].mag_data.values[1] = sensor_data.values[1]; + cxt->drv_data[i].mag_data.values[2] = sensor_data.values[2]; + cxt->drv_data[i].mag_data.status = sensor_data.status; + cxt->drv_data[i].mag_data.time = nt; + } + } + + if(true == cxt->is_first_data_after_enable) + { + cxt->is_first_data_after_enable = false; + //filter -1 value + if(MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[0] || + MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[1] || + MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[2]) + { + MAG_LOG(" read invalid data \n"); + continue; + + } + } + + if(ID_M_V_MAGNETIC ==i) + { + mag_data_report(MAGNETIC,cxt->drv_data[i].mag_data.values[0], + cxt->drv_data[i].mag_data.values[1], + cxt->drv_data[i].mag_data.values[2], + cxt->drv_data[i].mag_data.status); + + MAG_LOG("mag_type(%d) data[%d,%d,%d] \n" ,i,cxt->drv_data[i].mag_data.values[0], + cxt->drv_data[i].mag_data.values[1],cxt->drv_data[i].mag_data.values[2]); + } + + if(ID_M_V_ORIENTATION ==i) + { + mag_data_report(ORIENTATION,cxt->drv_data[i].mag_data.values[0], + cxt->drv_data[i].mag_data.values[1], + cxt->drv_data[i].mag_data.values[2], + cxt->drv_data[i].mag_data.status); + + MAG_LOG("mag_type(%d) data[%d,%d,%d] \n" ,i,cxt->drv_data[i].mag_data.values[0], + cxt->drv_data[i].mag_data.values[1],cxt->drv_data[i].mag_data.values[2]); + } + + + } + + //report data to input device + //printk("new mag work run....\n"); + + if(true == cxt->is_polling_run) + { + mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); + } +} + +static void mag_poll(unsigned long data) +{ + struct mag_context *obj = (struct mag_context *)data; + if(obj != NULL) + { + schedule_work(&obj->report); + } +} + +static struct mag_context *mag_context_alloc_object(void) +{ + + struct mag_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL); + MAG_LOG("mag_context_alloc_object++++\n"); + if(!obj) + { + MAG_ERR("Alloc magel object error!\n"); + return NULL; + } + atomic_set(&obj->delay, 200); /*5Hz*/// set work queue delay time 200ms + atomic_set(&obj->wake, 0); + INIT_WORK(&obj->report, mag_work_func); + init_timer(&obj->timer); + obj->timer.expires = jiffies + atomic_read(&obj->delay)/(1000/HZ); + obj->timer.function = mag_poll; + obj->timer.data = (unsigned long)obj; + obj->is_first_data_after_enable = false; + obj->is_polling_run = false; + obj->active_data_sensor = 0; + obj->active_nodata_sensor = 0; + obj->is_batch_enable = false; + mutex_init(&obj->mag_op_mutex); + MAG_LOG("mag_context_alloc_object----\n"); + return obj; +} +static int mag_enable_data(int handle,int enable) +{ + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(NULL == cxt->drv_obj[handle]) + { + MAG_ERR("no real mag driver\n"); + return -1; + } + + if(1 == enable) + { + MAG_LOG("MAG(%d) enable \n",handle); + cxt->is_first_data_after_enable = true; + cxt->active_data_sensor |= 1<mag_ctl.o_enable(1); + cxt->mag_ctl.o_open_report_data(1); + } + if(ID_M_V_MAGNETIC == handle) + { + cxt->mag_ctl.m_enable(1); + cxt->mag_ctl.m_open_report_data(1); + } + + if((0!=cxt->active_data_sensor) && (false == cxt->is_polling_run)&&(false == cxt->is_batch_enable)) + { + if(false == cxt->mag_ctl.is_report_input_direct) + { + MAG_LOG("MAG(%d) mod timer \n",handle); + mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); + cxt->is_polling_run = true; + } + } + + + } + if(0 == enable) + { + MAG_LOG("MAG(%d) disable \n",handle); + cxt->active_data_sensor &= ~(1<mag_ctl.o_enable(0); + cxt->mag_ctl.o_open_report_data(0); + } + if(ID_M_V_MAGNETIC == handle) + { + cxt->mag_ctl.m_enable(0); + cxt->mag_ctl.m_open_report_data(0); + } + + if(0 == cxt->active_data_sensor && true == cxt->is_polling_run) + { + if(false == cxt->mag_ctl.is_report_input_direct) + { + MAG_LOG("MAG(%d) del timer \n",handle); + cxt->is_polling_run = false; + del_timer_sync(&cxt->timer); + cancel_work_sync(&cxt->report); + cxt->drv_data[handle].mag_data.values[0] = MAG_INVALID_VALUE; + cxt->drv_data[handle].mag_data.values[1] = MAG_INVALID_VALUE; + cxt->drv_data[handle].mag_data.values[2] = MAG_INVALID_VALUE; + } + + } + + } + //mag_real_enable(handle,enable); + return 0; +} + +static int m_enable_data(int en) +{ + int err; + err=mag_enable_data(ID_M_V_MAGNETIC,en); + return err; +} +static int o_enable_data(int en) +{ + int err; + err=mag_enable_data(ID_M_V_ORIENTATION,en); + return err; +} + +/* +static int m_set_delay(u64 delay)//ns +{ + int m_delay =0; + m_delay = (int)delay/1000/1000; + + if(NULL == mag_context_obj->drv_obj[ID_M_V_MAGNETIC]) + { + MAG_ERR("no real mag driver\n"); + return -1; + } + if(mag_context_obj->drv_obj[ID_M_V_MAGNETIC]->mag_operate(mag_context_obj->drv_obj[ID_M_V_MAGNETIC]->self, OP_MAG_DELAY, &m_delay,sizeof(int), NULL, 0, NULL) != 0) + { + MAG_ERR("mag sensor_operate set delay function error \r\n"); + } + + atomic_set(&mag_context_obj->delay, m_delay); + MAG_LOG(" mag_delay %d ms\n",m_delay); + return 0; +} + +static int o_set_delay(u64 delay)//ns +{ + int m_delay =0; + m_delay = (int)delay/1000/1000; + + if(NULL == mag_context_obj->drv_obj[ID_M_V_ORIENTATION]) + { + MAG_ERR("no real mag odriver\n"); + return -1; + } + + if(mag_context_obj->drv_obj[ID_M_V_ORIENTATION]->mag_operate(mag_context_obj->drv_obj[ID_M_V_ORIENTATION]->self, OP_MAG_DELAY, &m_delay,sizeof(int), NULL, 0, NULL) != 0) + { + MAG_ERR("mag osensor_operate set delay function error \r\n"); + } + atomic_set(&mag_context_obj->delay, m_delay); + MAG_LOG(" mag_odelay %d ms\n",m_delay); + return 0; + +} +*/ + +/*----------------------------------------------------------------------------*/ +static ssize_t mag_show_magdev(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + printk("sensor test: mag function!\n"); + return len; +} +/*----------------------------------------------------------------------------*/ + +static ssize_t mag_store_oactive(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + MAG_LOG("mag_store_oactive buf=%s\n",buf); + mutex_lock(&mag_context_obj->mag_op_mutex); + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(NULL == cxt->mag_ctl.o_enable) + { + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG("mag_ctl o-enable NULL\n"); + return count; + } + + if (!strncmp(buf, "1", 1)) + { + mag_enable_data(ID_M_V_ORIENTATION,1); + //cxt->mag_ctl.o_enable(1); + } + else if (!strncmp(buf, "0", 1)) + { + mag_enable_data(ID_M_V_ORIENTATION,0); + //cxt->mag_ctl.o_enable(0); + } + else + { + MAG_ERR(" mag_store_oactive error !!\n"); + } + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG(" mag_store_oactive done\n"); + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t mag_show_oactive(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct mag_context *cxt = NULL; + cxt = mag_context_obj; + + int div = cxt->mag_dev_data.div_o; + ACC_LOG("acc mag_dev_data o_div value: %d\n", div); + return snprintf(buf, PAGE_SIZE, "%d\n", div); + +} + +static ssize_t mag_store_active(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + MAG_LOG("mag_store_active buf=%s\n",buf); + mutex_lock(&mag_context_obj->mag_op_mutex); + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(NULL == cxt->mag_ctl.m_enable) + { + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG("mag_ctl path is NULL\n"); + return count; + } + + if (!strncmp(buf, "1", 1)) + { + mag_enable_data(ID_M_V_MAGNETIC,1); + //cxt->mag_ctl.m_enable(1); + } + else if (!strncmp(buf, "0", 1)) + { + mag_enable_data(ID_M_V_MAGNETIC,0); + //cxt->mag_ctl.m_enable(0); + } + else + { + MAG_ERR(" mag_store_active error !!\n"); + } + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG(" mag_store_active done\n"); + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t mag_show_active(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct mag_context *cxt = NULL; + cxt = mag_context_obj; + + int div = cxt->mag_dev_data.div_m; + ACC_LOG("acc mag_dev_data m_div value: %d\n", div); + return snprintf(buf, PAGE_SIZE, "%d\n", div); +} + +static ssize_t mag_store_odelay(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&mag_context_obj->mag_op_mutex); + struct mag_context *devobj = (struct mag_context*)dev_get_drvdata(dev); + int delay=0; + int mdelay=0; + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(NULL == cxt->mag_ctl.o_set_delay) + { + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG("mag_ctl o_delay NULL\n"); + return count; + } + + MAG_LOG(" mag_odelay ++ \n"); + + + if (1 != sscanf(buf, "%d", &delay)) { + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_ERR("invalid format!!\n"); + return count; + } + if(false == cxt->mag_ctl.is_report_input_direct) + { + mdelay = (int)delay/1000/1000; + atomic_set(&mag_context_obj->delay, mdelay); + } + cxt->mag_ctl.o_set_delay(delay); + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG(" mag_odelay %d ns done\n",delay); + return count; +} + +static ssize_t mag_show_odelay(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + MAG_LOG(" not support now\n"); + return len; +} + +static ssize_t mag_store_delay(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + mutex_lock(&mag_context_obj->mag_op_mutex); + struct mag_context *devobj = (struct mag_context*)dev_get_drvdata(dev); + int delay=0; + int mdelay=0; + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(NULL == cxt->mag_ctl.m_set_delay) + { + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG("mag_ctl m_delay NULL\n"); + return count; + } + + MAG_LOG(" mag_delay ++ \n"); + + if (1 != sscanf(buf, "%d", &delay)) { + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_ERR("invalid format!!\n"); + return count; + } + if(false == cxt->mag_ctl.is_report_input_direct) + { + mdelay = (int)delay/1000/1000; + atomic_set(&mag_context_obj->delay, mdelay); + } + cxt->mag_ctl.m_set_delay(delay); + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG(" mag_delay %d ns done\n",delay); + return count; +} + +static ssize_t mag_show_delay(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + MAG_LOG(" not support now\n"); + return len; +} + +static ssize_t mag_store_batch(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + MAG_LOG("mag_store_batch buf=%s\n",buf); + mutex_lock(&mag_context_obj->mag_op_mutex); + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(cxt->mag_ctl.is_support_batch){ + if (!strncmp(buf, "1", 1)) + { + cxt->is_batch_enable = true; + } + else if (!strncmp(buf, "0", 1)) + { + cxt->is_batch_enable = false; + } + else + { + MAG_ERR(" mag_store_batch error !!\n"); + } + }else{ + MAG_LOG(" mag_store_batch not supported\n"); + } + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG(" mag_store_batch done: %d\n", cxt->is_batch_enable); + return count; +} + + +static ssize_t mag_show_batch(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + MAG_LOG(" not support now\n"); + return len; +} + +static ssize_t mag_store_flush(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return count; +} +static ssize_t mag_show_sensordevnum(struct device* dev, + struct device_attribute *attr, char *buf) +{ + struct mag_context *cxt = NULL; + char *devname = NULL; + cxt = mag_context_obj; + devname = dev_name(&cxt->idev->dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", devname+5); +} + + +static ssize_t mag_show_flush(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + MAG_LOG(" not support now\n"); + return len; +} + +static ssize_t mag_store_obatch(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + MAG_LOG("mag_store_obatch buf=%s\n",buf); + mutex_lock(&mag_context_obj->mag_op_mutex); + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(cxt->mag_ctl.is_support_batch){ + if (!strncmp(buf, "1", 1)) + { + cxt->is_batch_enable = true; + } + else if (!strncmp(buf, "0", 1)) + { + cxt->is_batch_enable = false; + } + else + { + MAG_ERR(" mag_store_obatch error !!\n"); + } + }else{ + MAG_LOG(" mag_store_obatch not supported\n"); + } + mutex_unlock(&mag_context_obj->mag_op_mutex); + MAG_LOG(" mag_store_obatch done: %d\n", cxt->is_batch_enable); + return count; + +} + + +static ssize_t mag_show_obatch(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + MAG_LOG(" not support now\n"); + return len; +} + +static ssize_t mag_store_oflush(struct device* dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return count; +} + + +static ssize_t mag_show_oflush(struct device* dev, + struct device_attribute *attr, char *buf) +{ + int len = 0; + MAG_LOG(" not support now\n"); + return len; +} + + +int mag_attach(int sensor,struct mag_drv_obj *obj) +{ + int err = 0; + MAG_FUN(); + //mag_context_obj->drv_obj[sensor] = obj; + mag_context_obj->drv_obj[sensor] = kzalloc(sizeof(struct mag_drv_obj), GFP_KERNEL); + if(mag_context_obj->drv_obj[sensor] == NULL) + { + err = -EPERM; + MAG_ERR(" mag attatch alloc fail \n"); + return err; + } + + memcpy(mag_context_obj->drv_obj[sensor], obj, sizeof(*obj)); + if(NULL == mag_context_obj->drv_obj[sensor]) + { + err =-1; + MAG_ERR(" mag attatch fail \n"); + } + return err; +} +/*----------------------------------------------------------------------------*/ +EXPORT_SYMBOL_GPL(mag_attach); + + +static int msensor_remove(struct platform_device *pdev) +{ + MAG_LOG("msensor_remove\n"); + return 0; +} + +static int msensor_probe(struct platform_device *pdev) +{ + MAG_LOG("msensor_probe\n"); + return 0; +} + +static struct platform_driver msensor_driver = { + .probe = msensor_probe, + .remove = msensor_remove, + .driver = + { + .name = "msensor", + } +}; + +static int mag_real_driver_init(void) +{ + int i =0; + int err=0; + MAG_LOG(" mag_real_driver_init +\n"); + for(i = 0; i < MAX_CHOOSE_G_NUM; i++) + { + MAG_LOG(" i=%d\n",i); + if(0 != msensor_init_list[i]) + { + MAG_LOG(" mag try to init driver %s\n", msensor_init_list[i]->name); + err = msensor_init_list[i]->init(); + if(0 == err) + { + MAG_LOG(" mag real driver %s probe ok\n", msensor_init_list[i]->name); + break; + } + } + } + + if(i == MAX_CHOOSE_G_NUM) + { + MAG_LOG(" mag_real_driver_init fail\n"); + err =-1; + } + return err; +} + + int mag_driver_add(struct mag_init_info* obj) +{ + int err=0; + int i =0; + + MAG_FUN(); + + for(i =0; i < MAX_CHOOSE_G_NUM; i++ ) + { + if(i == 0){ + MAG_LOG("register mensor driver for the first time\n"); + if(platform_driver_register(&msensor_driver)) + { + MAG_ERR("failed to register msensor driver already exist\n"); + } + } + if(NULL == msensor_init_list[i]) + { + obj->platform_diver_addr = &msensor_driver; + msensor_init_list[i] = obj; + break; + } + } + if(NULL==msensor_init_list[i]) + { + MAG_ERR("MAG driver add err \n"); + err =-1; + } + + return err; +} +EXPORT_SYMBOL_GPL(mag_driver_add); + +static int mag_misc_init(struct mag_context *cxt) +{ + + int err=0; + cxt->mdev.minor = MISC_DYNAMIC_MINOR; + cxt->mdev.name = MAG_MISC_DEV_NAME; + + if((err = misc_register(&cxt->mdev))) + { + MAG_ERR("unable to register mag misc device!!\n"); + } + return err; +} + +static void mag_input_destroy(struct mag_context *cxt) +{ + struct input_dev *dev = cxt->idev; + + input_unregister_device(dev); + input_free_device(dev); +} + +static int mag_input_init(struct mag_context *cxt) +{ + struct input_dev *dev; + int err = 0; + + dev = input_allocate_device(); + if (NULL == dev) + return -ENOMEM; + + dev->name = MAG_INPUTDEV_NAME; + + input_set_capability(dev, EV_ABS, EVENT_TYPE_MAGEL_X); + input_set_capability(dev, EV_ABS, EVENT_TYPE_MAGEL_Y); + input_set_capability(dev, EV_ABS, EVENT_TYPE_MAGEL_Z); + input_set_capability(dev, EV_ABS, EVENT_TYPE_MAGEL_STATUS); + + input_set_capability(dev, EV_ABS, EVENT_TYPE_O_X); + input_set_capability(dev, EV_ABS, EVENT_TYPE_O_Y); + input_set_capability(dev, EV_ABS, EVENT_TYPE_O_Z); + input_set_capability(dev, EV_ABS, EVENT_TYPE_O_STATUS); + + input_set_abs_params(dev, EVENT_TYPE_MAGEL_X, MAG_VALUE_MIN, MAG_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_MAGEL_Y, MAG_VALUE_MIN, MAG_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_MAGEL_Z, MAG_VALUE_MIN, MAG_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_MAGEL_STATUS, MAG_STATUS_MIN, MAG_STATUS_MAX, 0, 0); + + input_set_abs_params(dev, EVENT_TYPE_O_X, MAG_VALUE_MIN, MAG_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_O_Y, MAG_VALUE_MIN, MAG_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_O_Z, MAG_VALUE_MIN, MAG_VALUE_MAX, 0, 0); + input_set_abs_params(dev, EVENT_TYPE_O_STATUS, MAG_STATUS_MIN, MAG_STATUS_MAX, 0, 0); + + input_set_drvdata(dev, cxt); + + err = input_register_device(dev); + if (err < 0) { + input_free_device(dev); + return err; + } + cxt->idev= dev; + + return 0; +} + +DEVICE_ATTR(magdev, S_IWUSR | S_IRUGO, mag_show_magdev, NULL); +DEVICE_ATTR(magactive, S_IWUSR | S_IRUGO, mag_show_active, mag_store_active); +DEVICE_ATTR(magdelay, S_IWUSR | S_IRUGO, mag_show_delay, mag_store_delay); +DEVICE_ATTR(magoactive, S_IWUSR | S_IRUGO, mag_show_oactive, mag_store_oactive); +DEVICE_ATTR(magodelay, S_IWUSR | S_IRUGO, mag_show_odelay, mag_store_odelay); +DEVICE_ATTR(magbatch, S_IWUSR | S_IRUGO, mag_show_batch, mag_store_batch); +DEVICE_ATTR(magflush, S_IWUSR | S_IRUGO, mag_show_flush, mag_store_flush); +DEVICE_ATTR(magobatch, S_IWUSR | S_IRUGO, mag_show_obatch, mag_store_obatch); +DEVICE_ATTR(magoflush, S_IWUSR | S_IRUGO, mag_show_oflush, mag_store_oflush); +DEVICE_ATTR(magdevnum, S_IWUSR | S_IRUGO, mag_show_sensordevnum, NULL); + +static struct attribute *mag_attributes[] = { + &dev_attr_magdev.attr, + &dev_attr_magactive.attr, + &dev_attr_magdelay.attr, + &dev_attr_magbatch.attr, + &dev_attr_magflush.attr, + &dev_attr_magoactive.attr, + &dev_attr_magodelay.attr, + &dev_attr_magobatch.attr, + &dev_attr_magoflush.attr, + &dev_attr_magdevnum.attr, + NULL +}; + +static struct attribute_group mag_attribute_group = { + .attrs = mag_attributes +}; + + +int mag_register_data_path(struct mag_data_path *data) +{ + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + cxt->mag_dev_data.div_m = data->div_m; + cxt->mag_dev_data.div_o = data->div_o; + MAG_LOG("mag register data path div_o: %d\n", cxt->mag_dev_data.div_o); + MAG_LOG("mag register data path div_m: %d\n", cxt->mag_dev_data.div_m); + + return 0; +} + +int mag_register_control_path(struct mag_control_path *ctl) +{ + struct mag_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + + cxt->mag_ctl.m_set_delay = ctl->m_set_delay; + cxt->mag_ctl.m_enable= ctl->m_enable; + cxt->mag_ctl.m_open_report_data= ctl->m_open_report_data; + cxt->mag_ctl.o_set_delay = ctl->o_set_delay; + cxt->mag_ctl.o_open_report_data= ctl->o_open_report_data; + cxt->mag_ctl.o_enable= ctl->o_enable; + cxt->mag_ctl.is_report_input_direct = ctl->is_report_input_direct; + cxt->mag_ctl.is_support_batch = ctl->is_support_batch; + + if(NULL==cxt->mag_ctl.m_set_delay || NULL==cxt->mag_ctl.m_enable + || NULL==cxt->mag_ctl.m_open_report_data + || NULL==cxt->mag_ctl.o_set_delay || NULL==cxt->mag_ctl.o_open_report_data + || NULL==cxt->mag_ctl.o_enable) + { + MAG_LOG("mag register control path fail \n"); + return -1; + } + + //add misc dev for sensor hal control cmd + err = mag_misc_init(mag_context_obj); + if(err) + { + MAG_ERR("unable to register acc misc device!!\n"); + return -2; + } + err = sysfs_create_group(&mag_context_obj->mdev.this_device->kobj, + &mag_attribute_group); + if (err < 0) + { + MAG_ERR("unable to create acc attribute file\n"); + return -3; + } + + kobject_uevent(&mag_context_obj->mdev.this_device->kobj, KOBJ_ADD); + + return 0; +} + +int mag_data_report(MAG_TYPE type,int x, int y, int z, int status) +{ + //MAG_LOG("update!valus: %d, %d, %d, %d\n" , x, y, z, status); + struct acc_context *cxt = NULL; + int err =0; + cxt = mag_context_obj; + if(MAGNETIC==type) + { + input_report_abs(cxt->idev, EVENT_TYPE_MAGEL_STATUS, status); + input_report_abs(cxt->idev, EVENT_TYPE_MAGEL_X, x); + input_report_abs(cxt->idev, EVENT_TYPE_MAGEL_Y, y); + input_report_abs(cxt->idev, EVENT_TYPE_MAGEL_Z, z); + input_sync(cxt->idev); + } + if(ORIENTATION==type) + { + input_report_abs(cxt->idev, EVENT_TYPE_O_STATUS, status); + input_report_abs(cxt->idev, EVENT_TYPE_O_X, x); + input_report_abs(cxt->idev, EVENT_TYPE_O_Y, y); + input_report_abs(cxt->idev, EVENT_TYPE_O_Z, z); + input_sync(cxt->idev); + } + + return 0; +} + +static int mag_probe(struct platform_device *pdev) +{ + + int err; + MAG_LOG("+++++++++++++mag_probe!!\n"); + mag_context_obj = mag_context_alloc_object(); + if (!mag_context_obj) + { + err = -ENOMEM; + MAG_ERR("unable to allocate devobj!\n"); + goto exit_alloc_data_failed; + } + + //init real mageleration driver + err = mag_real_driver_init(); + if(err) + { + goto mag_real_driver_init_fail; + MAG_ERR("mag_real_driver_init fail\n"); + } + //init input dev + err = mag_input_init(mag_context_obj); + if(err) + { + MAG_ERR("unable to register mag input device!\n"); + goto exit_alloc_input_dev_failed; + } + + atomic_set(&(mag_context_obj->early_suspend), 0); + mag_context_obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1, + mag_context_obj->early_drv.suspend = mag_early_suspend, + mag_context_obj->early_drv.resume = mag_late_resume, + register_early_suspend(&mag_context_obj->early_drv); + + MAG_LOG("----magel_probe OK !!\n"); + return 0; + + exit_hwmsen_create_attr_failed: + exit_misc_register_failed: + + exit_err_sysfs: + + if (err) + { + MAG_ERR("sysfs node creation error \n"); + mag_input_destroy(mag_context_obj); + } + + mag_real_driver_init_fail: + exit_alloc_input_dev_failed: + kfree(mag_context_obj); + + exit_alloc_data_failed: + + MAG_LOG("----magel_probe fail !!!\n"); + return err; +} + + + +static int mag_remove(struct platform_device *pdev) +{ + MAG_FUN(f); + int err=0; + input_unregister_device(mag_context_obj->idev); + sysfs_remove_group(&mag_context_obj->idev->dev.kobj, + &mag_attribute_group); + + if((err = misc_deregister(&mag_context_obj->mdev))) + { + MAG_ERR("misc_deregister fail: %d\n", err); + } + kfree(mag_context_obj); + + return 0; +} + +static void mag_early_suspend(struct early_suspend *h) +{ + atomic_set(&(mag_context_obj->early_suspend), 1); + MAG_LOG(" mag_context_obj ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(mag_context_obj->early_suspend))); + return ; +} +/*----------------------------------------------------------------------------*/ +static void mag_late_resume(struct early_suspend *h) +{ + atomic_set(&(mag_context_obj->early_suspend), 0); + MAG_LOG(" mag_context_obj ok------->hwm_obj->early_suspend=%d \n",atomic_read(&(mag_context_obj->early_suspend))); + return ; +} + +static int mag_suspend(struct platform_device *dev, pm_message_t state) +{ + return 0; +} +/*----------------------------------------------------------------------------*/ +static int mag_resume(struct platform_device *dev) +{ + return 0; +} + +static struct platform_driver mag_driver = +{ + .probe = mag_probe, + .remove = mag_remove, + .suspend = mag_suspend, + .resume = mag_resume, + .driver = + { + .name = MAG_PL_DEV_NAME, + } +}; + +static int __init mag_init(void) +{ + MAG_FUN(); + + if(platform_driver_register(&mag_driver)) + { + MAG_ERR("failed to register mag driver\n"); + return -ENODEV; + } + + return 0; +} + +static void __exit mag_exit(void) +{ + platform_driver_unregister(&mag_driver); + platform_driver_unregister(&msensor_driver); +} + +module_init(mag_init); +module_exit(mag_exit); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("MAGELEROMETER device driver"); +MODULE_AUTHOR("Mediatek"); + diff --git a/arch/arm/mach-mt8127/ford/magnetometer/mag.h b/arch/arm/mach-mt8127/ford/magnetometer/mag.h new file mode 100644 index 00000000000..e4c4e8367bc --- /dev/null +++ b/arch/arm/mach-mt8127/ford/magnetometer/mag.h @@ -0,0 +1,141 @@ + +#ifndef __MAG_H__ +#define __MAG_H__ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define MAG_TAG " " +#define MAG_FUN(f) printk(MAG_TAG"%s\n", __func__) +#define MAG_ERR(fmt, args...) printk(MAG_TAG"%s %d : "fmt, __func__, __LINE__, ##args) +#define MAG_LOG(fmt, args...) printk(MAG_TAG fmt, ##args) +#define MAG_VER(fmt, args...) printk(MAG_TAG"%s: "fmt, __func__, ##args) //((void)0) + +#define OP_MAG_DELAY 0X01 +#define OP_MAG_ENABLE 0X02 +#define OP_MAG_GET_DATA 0X04 + + +#define MAG_INVALID_VALUE -1 + +#define EVENT_TYPE_MAGEL_X ABS_X +#define EVENT_TYPE_MAGEL_Y ABS_Y +#define EVENT_TYPE_MAGEL_Z ABS_Z +#define EVENT_DIV_MAGEL ABS_RUDDER +#define EVENT_TYPE_MAGEL_STATUS ABS_WHEEL + +#define EVENT_TYPE_O_X ABS_RX +#define EVENT_TYPE_O_Y ABS_RY +#define EVENT_TYPE_O_Z ABS_RZ +#define EVENT_DIV_O ABS_GAS +#define EVENT_TYPE_O_STATUS ABS_THROTTLE + +#define MAG_DIV_MAX (32767) +#define MAG_DIV_MIN (1) + +#define MAG_VALUE_MAX (32767) +#define MAG_VALUE_MIN (-32768) +#define MAG_STATUS_MIN (0) +#define MAG_STATUS_MAX (64) + +#define MAX_CHOOSE_G_NUM 5 + +#define MAX_M_V_SENSOR 5 + +#define ID_M_V_MAGNETIC 0 +#define ID_M_V_ORIENTATION 1 + +typedef enum mag_type { + MAGNETIC=0, + ORIENTATION=1, +}MAG_TYPE; + +struct mag_data_path +{ + int div_m; + int div_o; + +}; + +struct mag_control_path +{ + int (*m_open_report_data)(int en); + int (*m_set_delay)(u64 delay); + int (*m_enable)(int en); + int (*o_open_report_data)(int en); + int (*o_set_delay)(u64 delay); + int (*o_enable)(int en); + bool is_report_input_direct; + bool is_support_batch; +}; + + +struct mag_init_info +{ + char *name; + int (*init)(void); + int (*uninit)(void); + struct platform_driver* platform_diver_addr; +}; + +struct mag_data{ + hwm_sensor_data mag_data ; + int data_updata; + //struct mutex lock; +}; + +struct mag_drv_obj { + void *self; + int polling; + int (*mag_operate)(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout); +}; + +struct mag_context { + struct input_dev *idev; + struct miscdevice mdev; + struct work_struct report; + struct mutex mag_op_mutex; + atomic_t delay; /*polling period for reporting input event*/ + atomic_t wake; /*user-space request to wake-up, used with stop*/ + struct timer_list timer; /* polling timer */ + atomic_t trace; + + struct early_suspend early_drv; + struct mag_data_path mag_dev_data; + struct mag_control_path mag_ctl; + atomic_t early_suspend; + struct mag_drv_obj* drv_obj[MAX_M_V_SENSOR]; + struct mag_data drv_data[MAX_M_V_SENSOR]; + bool is_first_data_after_enable; + bool is_polling_run; + bool is_batch_enable; + uint32_t active_nodata_sensor; + uint32_t active_data_sensor; + //bool mag_type_enabled[MAX_M_V_SENSOR]; + //uint32_t mag_active_sensor; + +}; + +extern int mag_attach(int sensor,struct mag_drv_obj *obj); + +extern int mag_driver_add(struct mag_init_info* obj) ; +extern int mag_data_report(MAG_TYPE type,int x, int y, int z,int status); +extern int mag_register_control_path(struct mag_control_path *ctl); +extern int mag_register_data_path(struct mag_data_path *ctl); + + + + +#endif diff --git a/arch/arm/mach-mt8127/ford/power/cust_battery_meter.h b/arch/arm/mach-mt8127/ford/power/cust_battery_meter.h new file mode 100644 index 00000000000..7b4c699fd0f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/power/cust_battery_meter.h @@ -0,0 +1,134 @@ +#ifndef _CUST_BATTERY_METER_H +#define _CUST_BATTERY_METER_H + +#include + +/* ============================================================ + define + ============================================================ +#define SOC_BY_AUXADC */ +#ifdef CONFIG_MTK_PMIC_MT6397 +#define SOC_BY_HW_FG /*fg auxadc*/ +#else + #define SOC_BY_SW_FG /*oam*/ +#endif + +/*#define CONFIG_DIS_CHECK_BATTERY*/ +/*#define FIXED_TBAT_25*/ + +#if defined(CONFIG_MTK_BQ24296_SUPPORT) \ + || defined(CONFIG_MTK_BQ24196_SUPPORT) +#define BAT_VOL_USE_ISENSE +#define SWCHR_POWER_PATH +#endif + +#if defined(CONFIG_MTK_FAN5402_SUPPORT) \ + || defined(CONFIG_MTK_FAN5405_SUPPORT) \ + || defined(CONFIG_MTK_BQ24158_SUPPORT) \ + || defined(CONFIG_MTK_BQ24196_SUPPORT) \ + || defined(CONFIG_MTK_BQ24296_SUPPORT) \ + || defined(CONFIG_MTK_NCP1851_SUPPORT) \ + || defined(CONFIG_MTK_NCP1854_SUPPORT) \ + || defined(CONFIG_MTK_BQ24160_SUPPORT) \ + || defined(CONFIG_MTK_BQ24157_SUPPORT) \ + || defined(CONFIG_MTK_BQ24250_SUPPORT) \ + || defined(CONFIG_MTK_BQ24261_SUPPORT) +#define EXTERNAL_SWCHR_SUPPORT +#endif + +/* ADC Channel Number */ +#ifdef CONFIG_MTK_PMIC_MT6397 +#define CUST_TABT_NUMBER 8 +#ifdef BAT_VOL_USE_ISENSE +#define VBAT_CHANNEL_NUMBER 1 /* w/ powerpath, battery voltage is ISENSE(1)*/ +#define ISENSE_CHANNEL_NUMBER 0 /* w/ powerpath, system voltage is VSENSE(0)*/ +#else +#define VBAT_CHANNEL_NUMBER 0 +#define ISENSE_CHANNEL_NUMBER 1 +#endif +#define VCHARGER_CHANNEL_NUMBER 2 +#define VBATTEMP_CHANNEL_NUMBER 3 + +#else /*6323*/ + +#define CUST_TABT_NUMBER 17 +#ifdef BAT_VOL_USE_ISENSE +#define VBAT_CHANNEL_NUMBER 6 /* w/ powerpath, battery voltage is ISENSE(1)*/ +#define ISENSE_CHANNEL_NUMBER 7 /* w/ powerpath, system voltage is VSENSE(0)*/ +#else +#define VBAT_CHANNEL_NUMBER 7 +#define ISENSE_CHANNEL_NUMBER 6 +#endif +#define VCHARGER_CHANNEL_NUMBER 4 +#define VBATTEMP_CHANNEL_NUMBER 5 + +#endif + +/* ADC resistor */ +#define R_BAT_SENSE 4 +#define R_I_SENSE 4 +#define R_CHARGER_1 330 +#define R_CHARGER_2 39 + +#define TEMPERATURE_T0 110 +#define TEMPERATURE_T1 0 +#define TEMPERATURE_T2 25 +#define TEMPERATURE_T3 50 +#define TEMPERATURE_T 255 /* This should be fixed, never change the value*/ + +#define FG_METER_RESISTANCE 0 + +/* Qmax for battery */ +#define Q_MAX_POS_50 2983 +#define Q_MAX_POS_25 3024 +#define Q_MAX_POS_0 2969 +#define Q_MAX_NEG_10 2725 + +#define Q_MAX_POS_50_H_CURRENT 2908 +#define Q_MAX_POS_25_H_CURRENT 2851 +#define Q_MAX_POS_0_H_CURRENT 2372 +#define Q_MAX_NEG_10_H_CURRENT 1946 + +/* Discharge Percentage */ +#define OAM_D5 0 /* 1 : D5, 0: D2*/ + +/* battery meter parameter */ +#define CUST_TRACKING_POINT 14 +#define CUST_R_SENSE 200 +#define CUST_HW_CC 0 +#define AGING_TUNING_VALUE 100 +#define CUST_R_FG_OFFSET 23 + +#define OCV_BOARD_COMPESATE 0 /*mV*/ +#define R_FG_BOARD_BASE 1000 +#define R_FG_BOARD_SLOPE 1000 /*slope*/ +#define CAR_TUNE_VALUE 89 + +/* HW Fuel gague */ +#define CURRENT_DETECT_R_FG (-1) /*turn off auto detect for auxadc gauge*/ +#define MinErrorOffset 1000 +#define FG_VBAT_AVERAGE_SIZE 18 +#define R_FG_VALUE 20 /* mOhm, base is 20*/ + +#define CUST_POWERON_DELTA_CAPACITY_TOLRANCE 60 +#define CUST_POWERON_LOW_CAPACITY_TOLRANCE 5 +#define CUST_POWERON_MAX_VBAT_TOLRANCE 70 +#define CUST_POWERON_DELTA_VBAT_TOLRANCE 60 + +/* Disable Battery check for HQA */ +#ifdef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION +#define FIXED_TBAT_25 +#endif + +/* Dynamic change wake up period of battery thread when suspend*/ +#define VBAT_NORMAL_WAKEUP 3600 /*3.6V*/ +#define VBAT_LOW_POWER_WAKEUP 3500 /*3.5v*/ +#define NORMAL_WAKEUP_PERIOD 5400 /*90 * 60 = 90 min*/ +#define LOW_POWER_WAKEUP_PERIOD 300 /*5 * 60 = 5 min*/ +#define CLOSE_POWEROFF_WAKEUP_PERIOD 30 /*30 s*/ + +#ifdef CONFIG_AUSTIN_PROJECT +#define CUST_CAPACITY_OCV2CV_TRANSFORM +#endif + +#endif /*#ifndef _CUST_BATTERY_METER_H*/ diff --git a/arch/arm/mach-mt8127/ford/power/cust_battery_meter_table.h b/arch/arm/mach-mt8127/ford/power/cust_battery_meter_table.h new file mode 100755 index 00000000000..d7d1289c2e5 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/power/cust_battery_meter_table.h @@ -0,0 +1,2117 @@ +#ifndef _CUST_BATTERY_METER_TABLE_H +#define _CUST_BATTERY_METER_TABLE_H + +#include + +// ============================================================ +// define +// ============================================================ +#define BAT_NTC_10 1 +#define BAT_NTC_47 0 +#define BAT_NTC_100 0 + +#ifdef CONFIG_MTK_PMIC_MT6397 +#define RBAT_PULL_UP_R 24000 +#define RBAT_PULL_DOWN_R 100000000 +#define RBAT_PULL_UP_VOLT 1200 + +#else + +#if (BAT_NTC_10 == 1) +#define RBAT_PULL_UP_R 16900 +#define RBAT_PULL_DOWN_R 27000 +#endif +#if (BAT_NTC_47 == 1) +#define RBAT_PULL_UP_R 61900 +#define RBAT_PULL_DOWN_R 100000 +#endif +#if (BAT_NTC_100 == 1) +#define RBAT_PULL_UP_R 24000 +#define RBAT_PULL_DOWN_R 100000000 +#endif +#define RBAT_PULL_UP_VOLT 1800 +#endif + +// ============================================================ +// ENUM +// ============================================================ + +// ============================================================ +// structure +// ============================================================ + +// ============================================================ +// typedef +// ============================================================ +typedef struct _BATTERY_PROFILE_STRUC { + kal_int32 percentage; + kal_int32 voltage; +} BATTERY_PROFILE_STRUC, *BATTERY_PROFILE_STRUC_P; + +typedef struct _R_PROFILE_STRUC { + kal_int32 resistance; /* Ohm */ + kal_int32 voltage; +} R_PROFILE_STRUC, *R_PROFILE_STRUC_P; + +typedef enum { + T1_0C, + T2_25C, + T3_50C +} PROFILE_TEMPERATURE; + +// ============================================================ +// External Variables +// ============================================================ + +// ============================================================ +// External function +// ============================================================ + +// ============================================================ +// Table +// ============================================================ +#if (BAT_NTC_10 == 1) +BATT_TEMPERATURE Batt_Temperature_Table[2][17] = { + { + {-20, 76241}, + {-15, 58649}, + {-10, 45569}, + {-5, 35735}, + {0, 28271}, + {5, 22551}, + {10, 18136}, + {15, 14696}, + {20, 11997}, + {25, 10000}, + {30, 8365}, + {35, 7011}, + {40, 5951}, + {45, 4992}, + {50, 4217}, + {55, 3579}, + {60, 3051} + }, + { + {-20, 76241}, + {-15, 58649}, + {-10, 45569}, + {-5, 35735}, + {0, 28271}, + {5, 22551}, + {10, 18136}, + {15, 14696}, + {20, 11997}, + {25, 10000}, + {30, 8365}, + {35, 7011}, + {40, 5951}, + {45, 4992}, + {50, 4217}, + {55, 3579}, + {60, 3051} + } +}; +#endif + +#if (BAT_NTC_47 == 1) +BATT_TEMPERATURE Batt_Temperature_Table[] = { + {-20, 483954}, + {-15, 360850}, + {-10, 271697}, + {-5, 206463}, + {0, 158214}, + {5, 122259}, + {10, 95227}, + {15, 74730}, + {20, 59065}, + {25, 47000}, + {30, 37643}, + {35, 30334}, + {40, 24591}, + {45, 20048}, + {50, 16433}, + {55, 13539}, + {60, 11210} +}; +#endif + +#if (BAT_NTC_100 == 1) +BATT_TEMPERATURE Batt_Temperature_Table[] = { + {-20, 1151037}, + {-15, 846579}, + {-10, 628988}, + {-5, 471632}, + {0, 357012}, + {5, 272500}, + {10, 209710}, + {15, 162651}, + {20, 127080}, + {25, 100000}, + {30, 79222}, + {35, 63167}, + {40, 50677}, + {45, 40904}, + {50, 33195}, + {55, 27091}, + {60, 22224} +}; +#endif +/*battery fuel gauge para gen +Now we using MTK default behavior +*/ + +/* The following data is for temperature -10 C */ +/* Total data num: 103 */ +/* T0 -10C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t0[2][103] = { + { + {0, 4185}, + {1, 4170}, + {2, 4157}, + {3, 4144}, + {4, 4133}, + {6, 4122}, + {7, 4112}, + {8, 4102}, + {9, 4092}, + {10, 4083}, + {11, 4073}, + {12, 4063}, + {13, 4051}, + {14, 4041}, + {15, 4031}, + {16, 4020}, + {18, 4011}, + {19, 4002}, + {20, 3993}, + {21, 3984}, + {22, 3976}, + {23, 3968}, + {24, 3960}, + {25, 3952}, + {26, 3944}, + {27, 3936}, + {29, 3929}, + {30, 3921}, + {31, 3911}, + {32, 3905}, + {33, 3898}, + {34, 3890}, + {35, 3883}, + {36, 3876}, + {37, 3869}, + {38, 3863}, + {40, 3856}, + {41, 3850}, + {42, 3844}, + {43, 3838}, + {44, 3833}, + {45, 3828}, + {46, 3823}, + {47, 3817}, + {48, 3813}, + {49, 3809}, + {51, 3805}, + {52, 3802}, + {53, 3800}, + {54, 3798}, + {55, 3795}, + {56, 3793}, + {57, 3791}, + {58, 3789}, + {59, 3788}, + {60, 3786}, + {62, 3785}, + {63, 3784}, + {64, 3782}, + {65, 3780}, + {66, 3779}, + {67, 3777}, + {68, 3775}, + {69, 3773}, + {70, 3771}, + {71, 3768}, + {73, 3765}, + {74, 3762}, + {75, 3757}, + {76, 3752}, + {77, 3747}, + {78, 3741}, + {79, 3733}, + {80, 3724}, + {81, 3709}, + {82, 3701}, + {83, 3690}, + {85, 3677}, + {86, 3663}, + {87, 3654}, + {87, 3648}, + {88, 3644}, + {88, 3642}, + {88, 3639}, + {89, 3637}, + {89, 3635}, + {89, 3634}, + {90, 3633}, + {90, 3631}, + {90, 3630}, + {90, 3629}, + {90, 3628}, + {90, 3626}, + {91, 3626}, + {91, 3625}, + {91, 3624}, + {91, 3623}, + {91, 3623}, + {91, 3623}, + {91, 3621}, + {91, 3621}, + {91, 3621}, + {100, 3400} + }, + { + {0, 4191}, + {1, 4175}, + {2, 4163}, + {4, 4151}, + {5, 4141}, + {6, 4132}, + {7, 4121}, + {8, 4112}, + {10, 4103}, + {11, 4095}, + {12, 4086}, + {13, 4079}, + {14, 4072}, + {16, 4063}, + {17, 4054}, + {18, 4044}, + {19, 4031}, + {20, 4020}, + {22, 4010}, + {23, 4000}, + {24, 3992}, + {25, 3983}, + {27, 3974}, + {28, 3968}, + {29, 3961}, + {30, 3956}, + {31, 3950}, + {33, 3943}, + {34, 3937}, + {35, 3931}, + {36, 3925}, + {37, 3919}, + {39, 3911}, + {40, 3905}, + {41, 3899}, + {42, 3893}, + {43, 3885}, + {45, 3879}, + {46, 3873}, + {47, 3868}, + {48, 3862}, + {49, 3855}, + {51, 3849}, + {52, 3844}, + {53, 3839}, + {54, 3836}, + {55, 3831}, + {57, 3826}, + {58, 3821}, + {59, 3817}, + {60, 3813}, + {61, 3811}, + {63, 3807}, + {64, 3805}, + {65, 3801}, + {66, 3797}, + {67, 3795}, + {69, 3792}, + {70, 3790}, + {71, 3788}, + {72, 3786}, + {74, 3785}, + {75, 3783}, + {76, 3782}, + {77, 3781}, + {78, 3780}, + {80, 3779}, + {81, 3777}, + {82, 3776}, + {83, 3775}, + {84, 3774}, + {86, 3772}, + {87, 3770}, + {88, 3769}, + {89, 3767}, + {90, 3765}, + {92, 3764}, + {93, 3761}, + {94, 3759}, + {95, 3756}, + {96, 3752}, + {98, 3750}, + {99, 3746}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3740}, + {100, 3400}, + {100, 3400}, + {100, 3400}, + {100, 3400}, + } + +}; + +/* Total data num: 103 */ +/* T0 r_profile N10C */ +R_PROFILE_STRUC r_profile_t0[2][103] = { + { + {480, 4185}, + {480, 4170}, + {490, 4157}, + {490, 4144}, + {492, 4133}, + {493, 4122}, + {497, 4112}, + {497, 4102}, + {498, 4092}, + {502, 4083}, + {503, 4073}, + {505, 4063}, + {505, 4051}, + {508, 4041}, + {508, 4031}, + {507, 4020}, + {508, 4011}, + {508, 4002}, + {507, 3993}, + {507, 3984}, + {507, 3976}, + {508, 3968}, + {507, 3960}, + {508, 3952}, + {508, 3944}, + {505, 3936}, + {507, 3929}, + {507, 3921}, + {503, 3911}, + {507, 3905}, + {507, 3898}, + {505, 3890}, + {505, 3883}, + {503, 3876}, + {503, 3869}, + {505, 3863}, + {503, 3856}, + {503, 3850}, + {503, 3844}, + {502, 3838}, + {503, 3833}, + {503, 3828}, + {505, 3823}, + {502, 3817}, + {503, 3813}, + {503, 3809}, + {503, 3805}, + {507, 3802}, + {512, 3800}, + {517, 3798}, + {522, 3795}, + {528, 3793}, + {535, 3791}, + {540, 3789}, + {547, 3788}, + {548, 3786}, + {555, 3785}, + {558, 3784}, + {563, 3782}, + {567, 3780}, + {575, 3779}, + {580, 3777}, + {587, 3775}, + {593, 3773}, + {603, 3771}, + {613, 3768}, + {623, 3765}, + {637, 3762}, + {650, 3757}, + {665, 3752}, + {683, 3747}, + {700, 3741}, + {712, 3733}, + {725, 3724}, + {725, 3709}, + {743, 3701}, + {752, 3690}, + {755, 3677}, + {758, 3663}, + {757, 3654}, + {747, 3648}, + {740, 3644}, + {737, 3642}, + {732, 3639}, + {728, 3637}, + {725, 3635}, + {723, 3634}, + {722, 3633}, + {718, 3631}, + {717, 3630}, + {715, 3629}, + {713, 3628}, + {710, 3626}, + {710, 3626}, + {708, 3625}, + {707, 3624}, + {705, 3623}, + {705, 3623}, + {705, 3623}, + {702, 3621}, + {702, 3621}, + {702, 3621}, + {1007, 3400} + }, + { + {672, 4191}, + {672, 4175}, + {677, 4163}, + {672, 4151}, + {675, 4141}, + {678, 4132}, + {673, 4121}, + {673, 4112}, + {673, 4103}, + {675, 4095}, + {673, 4086}, + {675, 4079}, + {675, 4072}, + {675, 4063}, + {673, 4054}, + {673, 4044}, + {668, 4031}, + {667, 4020}, + {667, 4010}, + {665, 4000}, + {665, 3992}, + {663, 3983}, + {660, 3974}, + {662, 3968}, + {663, 3961}, + {663, 3956}, + {663, 3950}, + {660, 3943}, + {662, 3937}, + {662, 3931}, + {660, 3925}, + {660, 3919}, + {655, 3911}, + {655, 3905}, + {653, 3899}, + {655, 3893}, + {650, 3885}, + {653, 3879}, + {652, 3873}, + {655, 3868}, + {653, 3862}, + {652, 3855}, + {653, 3849}, + {650, 3844}, + {650, 3839}, + {657, 3836}, + {655, 3831}, + {655, 3826}, + {655, 3821}, + {657, 3817}, + {662, 3813}, + {663, 3811}, + {663, 3807}, + {667, 3805}, + {668, 3801}, + {665, 3797}, + {670, 3795}, + {670, 3792}, + {675, 3790}, + {677, 3788}, + {680, 3786}, + {685, 3785}, + {685, 3783}, + {690, 3782}, + {692, 3781}, + {697, 3780}, + {702, 3779}, + {705, 3777}, + {708, 3776}, + {712, 3775}, + {718, 3774}, + {720, 3772}, + {722, 3770}, + {730, 3769}, + {733, 3767}, + {738, 3765}, + {747, 3764}, + {752, 3761}, + {757, 3759}, + {765, 3756}, + {770, 3752}, + {782, 3750}, + {795, 3746}, + {803, 3740}, + {812, 3736}, + {822, 3731}, + {833, 3725}, + {850, 3719}, + {868, 3714}, + {887, 3705}, + {908, 3700}, + {942, 3695}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + {985, 3400}, + } +}; + +/* The following data is for temperature 0 C + Total data num: 103 + T1 0C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t1[2][103] = { + { + {0, 4190}, + {1, 4172}, + {2, 4158}, + {3, 4144}, + {4, 4133}, + {5, 4122}, + {6, 4111}, + {7, 4101}, + {8, 4091}, + {9, 4081}, + {10, 4072}, + {11, 4061}, + {12, 4051}, + {13, 4041}, + {14, 4030}, + {15, 4022}, + {16, 4013}, + {17, 4003}, + {18, 3994}, + {19, 3987}, + {20, 3978}, + {21, 3969}, + {22, 3962}, + {23, 3956}, + {24, 3948}, + {25, 3941}, + {26, 3934}, + {27, 3927}, + {28, 3920}, + {29, 3912}, + {30, 3906}, + {31, 3899}, + {32, 3893}, + {33, 3885}, + {34, 3879}, + {35, 3872}, + {36, 3865}, + {37, 3857}, + {38, 3850}, + {39, 3843}, + {40, 3837}, + {41, 3831}, + {42, 3823}, + {43, 3817}, + {44, 3812}, + {45, 3807}, + {46, 3802}, + {47, 3797}, + {48, 3793}, + {49, 3791}, + {50, 3788}, + {51, 3787}, + {52, 3785}, + {53, 3783}, + {54, 3782}, + {55, 3781}, + {56, 3780}, + {57, 3779}, + {58, 3779}, + {59, 3777}, + {60, 3777}, + {61, 3776}, + {62, 3775}, + {63, 3774}, + {64, 3772}, + {65, 3770}, + {66, 3767}, + {67, 3765}, + {68, 3762}, + {69, 3759}, + {70, 3755}, + {71, 3750}, + {72, 3744}, + {73, 3736}, + {74, 3729}, + {75, 3720}, + {76, 3709}, + {78, 3698}, + {79, 3686}, + {80, 3672}, + {81, 3659}, + {82, 3646}, + {83, 3633}, + {84, 3621}, + {85, 3611}, + {86, 3600}, + {87, 3589}, + {88, 3579}, + {89, 3570}, + {90, 3559}, + {91, 3550}, + {92, 3540}, + {93, 3528}, + {93, 3523}, + {94, 3519}, + {94, 3517}, + {94, 3516}, + {94, 3513}, + {95, 3512}, + {95, 3511}, + {95, 3511}, + {95, 3509}, + {100, 3400} + }, + { + {0, 4182}, + {1, 4168}, + {2, 4158}, + {3, 4146}, + {5, 4137}, + {6, 4127}, + {7, 4117}, + {8, 4108}, + {9, 4100}, + {10, 4091}, + {11, 4084}, + {13, 4077}, + {14, 4071}, + {15, 4063}, + {16, 4053}, + {17, 4043}, + {18, 4031}, + {19, 4020}, + {21, 4012}, + {22, 4002}, + {23, 3993}, + {24, 3986}, + {25, 3979}, + {26, 3972}, + {27, 3967}, + {29, 3962}, + {30, 3957}, + {31, 3952}, + {32, 3946}, + {33, 3940}, + {34, 3935}, + {35, 3929}, + {36, 3922}, + {38, 3916}, + {39, 3910}, + {40, 3904}, + {41, 3898}, + {42, 3891}, + {43, 3884}, + {44, 3878}, + {46, 3872}, + {47, 3865}, + {48, 3858}, + {49, 3853}, + {50, 3847}, + {51, 3842}, + {52, 3837}, + {54, 3832}, + {55, 3827}, + {56, 3822}, + {57, 3818}, + {58, 3814}, + {59, 3811}, + {60, 3807}, + {62, 3805}, + {63, 3802}, + {64, 3797}, + {65, 3795}, + {66, 3792}, + {67, 3791}, + {68, 3788}, + {70, 3786}, + {71, 3785}, + {72, 3783}, + {73, 3781}, + {74, 3780}, + {75, 3780}, + {76, 3779}, + {78, 3777}, + {79, 3776}, + {80, 3776}, + {81, 3775}, + {82, 3774}, + {83, 3772}, + {84, 3772}, + {86, 3770}, + {87, 3769}, + {88, 3766}, + {89, 3765}, + {90, 3762}, + {91, 3761}, + {92, 3759}, + {94, 3756}, + {95, 3752}, + {96, 3749}, + {97, 3745}, + {98, 3739}, + {99, 3734}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728}, + {100, 3728} + } + +}; + +/* Total data num: 103*/ +/* T1 r_profile 0C */ +R_PROFILE_STRUC r_profile_t1[2][103] = { + { + {258, 4190}, + {258, 4172}, + {263, 4158}, + {262, 4144}, + {265, 4133}, + {267, 4122}, + {267, 4111}, + {268, 4101}, + {268, 4091}, + {270, 4081}, + {275, 4072}, + {275, 4061}, + {277, 4051}, + {278, 4041}, + {277, 4030}, + {282, 4022}, + {283, 4013}, + {278, 4003}, + {283, 3994}, + {285, 3987}, + {283, 3978}, + {285, 3969}, + {285, 3962}, + {288, 3956}, + {287, 3948}, + {290, 3941}, + {290, 3934}, + {292, 3927}, + {292, 3920}, + {290, 3912}, + {293, 3906}, + {292, 3899}, + {293, 3893}, + {293, 3885}, + {293, 3879}, + {292, 3872}, + {292, 3865}, + {282, 3857}, + {288, 3850}, + {285, 3843}, + {285, 3837}, + {287, 3831}, + {280, 3823}, + {282, 3817}, + {282, 3812}, + {282, 3807}, + {278, 3802}, + {277, 3797}, + {277, 3793}, + {282, 3791}, + {280, 3788}, + {287, 3787}, + {290, 3785}, + {293, 3783}, + {297, 3782}, + {302, 3781}, + {305, 3780}, + {305, 3779}, + {310, 3779}, + {312, 3777}, + {315, 3777}, + {318, 3776}, + {320, 3775}, + {325, 3774}, + {328, 3772}, + {333, 3770}, + {338, 3767}, + {345, 3765}, + {355, 3762}, + {365, 3759}, + {378, 3755}, + {390, 3750}, + {405, 3744}, + {415, 3736}, + {428, 3729}, + {435, 3720}, + {440, 3709}, + {445, 3698}, + {445, 3686}, + {445, 3672}, + {445, 3659}, + {448, 3646}, + {445, 3633}, + {450, 3621}, + {455, 3611}, + {462, 3600}, + {465, 3589}, + {473, 3579}, + {482, 3570}, + {492, 3559}, + {505, 3550}, + {525, 3540}, + {543, 3528}, + {538, 3523}, + {532, 3519}, + {528, 3517}, + {527, 3516}, + {522, 3513}, + {520, 3512}, + {518, 3511}, + {518, 3511}, + {515, 3509}, + {345, 3400} + }, + { + {333, 4182}, + {333, 4168}, + {338, 4158}, + {340, 4146}, + {343, 4137}, + {343, 4127}, + {345, 4117}, + {347, 4108}, + {350, 4100}, + {352, 4091}, + {353, 4084}, + {355, 4077}, + {360, 4071}, + {360, 4063}, + {360, 4053}, + {365, 4043}, + {363, 4031}, + {362, 4020}, + {367, 4012}, + {365, 4002}, + {363, 3993}, + {368, 3986}, + {367, 3979}, + {367, 3972}, + {370, 3967}, + {373, 3962}, + {373, 3957}, + {373, 3952}, + {375, 3946}, + {372, 3940}, + {377, 3935}, + {375, 3929}, + {373, 3922}, + {373, 3916}, + {372, 3910}, + {375, 3904}, + {373, 3898}, + {370, 3891}, + {367, 3884}, + {367, 3878}, + {367, 3872}, + {363, 3865}, + {360, 3858}, + {360, 3853}, + {358, 3847}, + {358, 3842}, + {360, 3837}, + {358, 3832}, + {358, 3827}, + {355, 3822}, + {357, 3818}, + {357, 3814}, + {358, 3811}, + {360, 3807}, + {362, 3805}, + {363, 3802}, + {360, 3797}, + {360, 3795}, + {362, 3792}, + {367, 3791}, + {365, 3788}, + {367, 3786}, + {372, 3785}, + {373, 3783}, + {372, 3781}, + {375, 3780}, + {378, 3780}, + {378, 3779}, + {380, 3777}, + {382, 3776}, + {387, 3776}, + {388, 3775}, + {392, 3774}, + {397, 3772}, + {400, 3772}, + {402, 3770}, + {403, 3769}, + {407, 3766}, + {412, 3765}, + {410, 3762}, + {417, 3761}, + {425, 3759}, + {427, 3756}, + {432, 3752}, + {435, 3749}, + {440, 3745}, + {447, 3739}, + {453, 3734}, + {460, 3728}, + {468, 3721}, + {478, 3715}, + {490, 3707}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + {500, 3400}, + } +}; + +/* The following data is for temperature 25 C */ +/* Total data num: 103 */ +/* T2 25C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t2[2][103] = { + { + {0, 4178}, + {1, 4164}, + {2, 4151}, + {3, 4139}, + {4, 4129}, + {5, 4117}, + {6, 4107}, + {7, 4097}, + {8, 4087}, + {9, 4077}, + {10, 4069}, + {11, 4059}, + {12, 4049}, + {13, 4039}, + {14, 4029}, + {15, 4020}, + {16, 4012}, + {17, 4002}, + {18, 3993}, + {19, 3986}, + {20, 3978}, + {21, 3969}, + {22, 3962}, + {23, 3955}, + {24, 3948}, + {25, 3940}, + {26, 3932}, + {27, 3926}, + {28, 3920}, + {29, 3912}, + {30, 3905}, + {31, 3899}, + {32, 3894}, + {33, 3886}, + {34, 3880}, + {35, 3874}, + {36, 3869}, + {37, 3863}, + {38, 3855}, + {39, 3848}, + {40, 3841}, + {41, 3832}, + {42, 3822}, + {42, 3814}, + {43, 3807}, + {44, 3802}, + {45, 3797}, + {46, 3792}, + {47, 3788}, + {48, 3786}, + {49, 3783}, + {50, 3781}, + {51, 3780}, + {52, 3779}, + {53, 3777}, + {54, 3776}, + {55, 3775}, + {56, 3774}, + {57, 3772}, + {58, 3772}, + {59, 3770}, + {60, 3769}, + {61, 3769}, + {62, 3767}, + {63, 3766}, + {64, 3765}, + {65, 3764}, + {66, 3762}, + {67, 3760}, + {68, 3757}, + {69, 3754}, + {70, 3750}, + {71, 3745}, + {72, 3738}, + {73, 3731}, + {74, 3724}, + {75, 3715}, + {76, 3704}, + {77, 3693}, + {78, 3679}, + {79, 3667}, + {80, 3652}, + {81, 3641}, + {82, 3628}, + {83, 3617}, + {84, 3606}, + {85, 3596}, + {86, 3585}, + {87, 3575}, + {88, 3564}, + {89, 3555}, + {90, 3545}, + {91, 3534}, + {92, 3524}, + {93, 3516}, + {94, 3509}, + {95, 3502}, + {96, 3495}, + {97, 3486}, + {98, 3472}, + {99, 3450}, + {100, 3400}, + {100, 3400} + }, + { + {0, 4165}, + {1, 4151}, + {2, 4139}, + {3, 4129}, + {4, 4118}, + {5, 4110}, + {6, 4101}, + {7, 4091}, + {8, 4082}, + {9, 4074}, + {10, 4064}, + {11, 4056}, + {12, 4050}, + {13, 4043}, + {14, 4033}, + {15, 4024}, + {16, 4014}, + {17, 4004}, + {18, 3996}, + {19, 3987}, + {20, 3981}, + {21, 3973}, + {22, 3967}, + {23, 3962}, + {24, 3956}, + {25, 3951}, + {26, 3943}, + {27, 3937}, + {28, 3931}, + {29, 3926}, + {30, 3919}, + {31, 3912}, + {32, 3907}, + {33, 3903}, + {34, 3896}, + {35, 3890}, + {36, 3885}, + {37, 3880}, + {38, 3875}, + {39, 3870}, + {40, 3865}, + {41, 3859}, + {43, 3853}, + {44, 3847}, + {45, 3839}, + {46, 3829}, + {47, 3822}, + {48, 3816}, + {49, 3810}, + {50, 3805}, + {51, 3800}, + {52, 3796}, + {53, 3792}, + {54, 3788}, + {55, 3786}, + {56, 3783}, + {57, 3780}, + {58, 3777}, + {59, 3774}, + {60, 3771}, + {61, 3770}, + {62, 3767}, + {63, 3765}, + {64, 3764}, + {65, 3761}, + {66, 3760}, + {67, 3759}, + {68, 3757}, + {69, 3756}, + {70, 3755}, + {71, 3754}, + {72, 3752}, + {73, 3752}, + {74, 3751}, + {75, 3750}, + {76, 3749}, + {77, 3746}, + {78, 3744}, + {79, 3741}, + {80, 3738}, + {81, 3734}, + {82, 3730}, + {83, 3725}, + {84, 3723}, + {85, 3719}, + {86, 3713}, + {87, 3708}, + {88, 3700}, + {89, 3694}, + {90, 3688}, + {91, 3679}, + {92, 3671}, + {93, 3666}, + {94, 3663}, + {95, 3662}, + {96, 3659}, + {97, 3656}, + {98, 3653}, + {99, 3648}, + {100, 3637}, + {100, 3637}, + {100, 3637}, + {100, 3637} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 25C */ +R_PROFILE_STRUC r_profile_t2[2][103] = { + { + {132, 4178}, + {132, 4164}, + {132, 4151}, + {132, 4139}, + {133, 4129}, + {130, 4117}, + {133, 4107}, + {133, 4097}, + {133, 4087}, + {133, 4077}, + {137, 4069}, + {135, 4059}, + {137, 4049}, + {137, 4039}, + {135, 4029}, + {138, 4020}, + {138, 4012}, + {137, 4002}, + {138, 3993}, + {138, 3986}, + {140, 3978}, + {140, 3969}, + {140, 3962}, + {142, 3955}, + {142, 3948}, + {143, 3940}, + {142, 3932}, + {142, 3926}, + {145, 3920}, + {147, 3912}, + {145, 3905}, + {145, 3899}, + {147, 3894}, + {147, 3886}, + {147, 3880}, + {147, 3874}, + {148, 3869}, + {148, 3863}, + {148, 3855}, + {147, 3848}, + {145, 3841}, + {143, 3832}, + {138, 3822}, + {135, 3814}, + {132, 3807}, + {132, 3802}, + {132, 3797}, + {130, 3792}, + {130, 3788}, + {132, 3786}, + {132, 3783}, + {130, 3781}, + {133, 3780}, + {133, 3779}, + {133, 3777}, + {135, 3776}, + {137, 3775}, + {137, 3774}, + {137, 3772}, + {138, 3772}, + {137, 3770}, + {137, 3769}, + {138, 3769}, + {138, 3767}, + {140, 3766}, + {140, 3765}, + {143, 3764}, + {143, 3762}, + {145, 3760}, + {147, 3757}, + {150, 3754}, + {152, 3750}, + {150, 3745}, + {153, 3738}, + {152, 3731}, + {157, 3724}, + {160, 3715}, + {162, 3704}, + {162, 3693}, + {160, 3679}, + {163, 3667}, + {162, 3652}, + {163, 3641}, + {165, 3628}, + {165, 3617}, + {163, 3606}, + {165, 3596}, + {165, 3585}, + {165, 3575}, + {163, 3564}, + {165, 3555}, + {168, 3545}, + {167, 3534}, + {168, 3524}, + {172, 3516}, + {175, 3509}, + {180, 3502}, + {188, 3495}, + {197, 3486}, + {208, 3472}, + {222, 3450}, + {243, 3400}, + {243, 3400} + }, + { + {133, 4165}, + {133, 4151}, + {135, 4139}, + {138, 4129}, + {138, 4118}, + {142, 4110}, + {140, 4101}, + {143, 4091}, + {142, 4082}, + {143, 4074}, + {142, 4064}, + {145, 4056}, + {147, 4050}, + {147, 4043}, + {147, 4033}, + {147, 4024}, + {147, 4014}, + {148, 4004}, + {150, 3996}, + {148, 3987}, + {153, 3981}, + {153, 3973}, + {153, 3967}, + {155, 3962}, + {153, 3956}, + {140, 3951}, + {157, 3943}, + {163, 3937}, + {165, 3931}, + {167, 3926}, + {163, 3919}, + {163, 3912}, + {162, 3907}, + {168, 3903}, + {167, 3896}, + {167, 3890}, + {167, 3885}, + {167, 3880}, + {168, 3875}, + {168, 3870}, + {172, 3865}, + {170, 3859}, + {168, 3853}, + {165, 3847}, + {163, 3839}, + {155, 3829}, + {152, 3822}, + {150, 3816}, + {148, 3810}, + {145, 3805}, + {145, 3800}, + {145, 3796}, + {145, 3792}, + {142, 3788}, + {145, 3786}, + {143, 3783}, + {143, 3780}, + {142, 3777}, + {143, 3774}, + {145, 3771}, + {147, 3770}, + {147, 3767}, + {145, 3765}, + {147, 3764}, + {147, 3761}, + {147, 3760}, + {150, 3759}, + {148, 3757}, + {148, 3756}, + {148, 3755}, + {150, 3754}, + {148, 3752}, + {150, 3752}, + {150, 3751}, + {152, 3750}, + {153, 3749}, + {150, 3746}, + {152, 3744}, + {150, 3741}, + {150, 3738}, + {148, 3734}, + {147, 3730}, + {145, 3725}, + {147, 3723}, + {152, 3719}, + {148, 3713}, + {148, 3708}, + {148, 3700}, + {148, 3694}, + {153, 3688}, + {152, 3679}, + {152, 3671}, + {152, 3666}, + {153, 3663}, + {157, 3662}, + {160, 3659}, + {163, 3656}, + {172, 3653}, + {180, 3648}, + {185, 3637}, + {185, 3637}, + {185, 3637}, + {185, 3637} + } +}; + +/* The following data is for temperature 55 C */ +/* Total data num: 103 */ +/* T3 50C:{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t3[2][103] = { + { + {0, 4179}, + {1, 4167}, + {2, 4154}, + {3, 4143}, + {4, 4132}, + {5, 4121}, + {6, 4111}, + {7, 4100}, + {8, 4090}, + {9, 4080}, + {10, 4070}, + {11, 4060}, + {12, 4051}, + {13, 4040}, + {14, 4031}, + {15, 4023}, + {16, 4013}, + {17, 4004}, + {18, 3996}, + {19, 3987}, + {20, 3978}, + {21, 3971}, + {22, 3962}, + {23, 3953}, + {24, 3946}, + {25, 3938}, + {26, 3932}, + {27, 3924}, + {28, 3916}, + {29, 3910}, + {30, 3903}, + {31, 3895}, + {32, 3889}, + {33, 3883}, + {34, 3876}, + {35, 3870}, + {36, 3864}, + {37, 3858}, + {38, 3852}, + {39, 3847}, + {40, 3838}, + {41, 3831}, + {42, 3821}, + {43, 3810}, + {44, 3802}, + {45, 3796}, + {46, 3790}, + {47, 3786}, + {48, 3780}, + {49, 3777}, + {50, 3774}, + {51, 3770}, + {52, 3767}, + {53, 3765}, + {54, 3764}, + {55, 3762}, + {56, 3761}, + {57, 3760}, + {58, 3759}, + {59, 3757}, + {60, 3756}, + {61, 3755}, + {62, 3755}, + {63, 3754}, + {64, 3751}, + {65, 3750}, + {66, 3749}, + {67, 3748}, + {68, 3745}, + {69, 3744}, + {70, 3740}, + {71, 3736}, + {72, 3730}, + {73, 3720}, + {74, 3712}, + {75, 3703}, + {76, 3693}, + {77, 3683}, + {78, 3671}, + {79, 3657}, + {80, 3645}, + {81, 3632}, + {82, 3621}, + {83, 3610}, + {84, 3599}, + {85, 3589}, + {86, 3579}, + {87, 3568}, + {88, 3558}, + {89, 3548}, + {90, 3538}, + {91, 3528}, + {92, 3517}, + {93, 3509}, + {94, 3503}, + {95, 3497}, + {96, 3488}, + {97, 3480}, + {98, 3469}, + {99, 3445}, + {100, 3400}, + {100, 3400}, + {100, 3400} + }, + { + {0, 4168}, + {1, 4154}, + {2, 4144}, + {3, 4134}, + {4, 4125}, + {5, 4115}, + {6, 4106}, + {7, 4096}, + {8, 4087}, + {9, 4079}, + {10, 4070}, + {11, 4061}, + {12, 4054}, + {13, 4045}, + {14, 4036}, + {15, 4029}, + {16, 4022}, + {17, 4013}, + {19, 4005}, + {20, 3998}, + {21, 3992}, + {22, 3983}, + {23, 3976}, + {24, 3969}, + {25, 3963}, + {26, 3957}, + {27, 3950}, + {28, 3943}, + {29, 3937}, + {30, 3932}, + {31, 3925}, + {32, 3919}, + {33, 3914}, + {34, 3907}, + {35, 3903}, + {36, 3896}, + {37, 3891}, + {38, 3886}, + {39, 3881}, + {40, 3876}, + {41, 3873}, + {42, 3867}, + {43, 3862}, + {44, 3857}, + {45, 3850}, + {46, 3843}, + {47, 3833}, + {48, 3824}, + {49, 3818}, + {50, 3812}, + {51, 3807}, + {52, 3803}, + {53, 3800}, + {54, 3796}, + {56, 3793}, + {57, 3791}, + {58, 3787}, + {59, 3785}, + {60, 3782}, + {61, 3779}, + {62, 3776}, + {63, 3775}, + {64, 3772}, + {65, 3770}, + {66, 3769}, + {67, 3766}, + {68, 3765}, + {69, 3764}, + {70, 3761}, + {71, 3760}, + {72, 3759}, + {73, 3759}, + {74, 3757}, + {75, 3755}, + {76, 3751}, + {77, 3745}, + {78, 3740}, + {79, 3738}, + {80, 3735}, + {81, 3733}, + {82, 3729}, + {83, 3725}, + {84, 3720}, + {85, 3717}, + {86, 3713}, + {87, 3709}, + {88, 3704}, + {90, 3695}, + {91, 3688}, + {92, 3682}, + {93, 3674}, + {94, 3666}, + {95, 3662}, + {96, 3659}, + {97, 3658}, + {98, 3656}, + {99, 3653}, + {100, 3650}, + {100, 3650}, + {100, 3650}, + {100, 3650}, + {100, 3650}, + {100, 3650} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 50C */ +R_PROFILE_STRUC r_profile_t3[2][103] = { + { + {108, 4179}, + {108, 4167}, + {105, 4154}, + {105, 4143}, + {105, 4132}, + {105, 4121}, + {105, 4111}, + {107, 4100}, + {105, 4090}, + {105, 4080}, + {108, 4070}, + {105, 4060}, + {105, 4051}, + {105, 4040}, + {105, 4031}, + {108, 4023}, + {108, 4013}, + {107, 4004}, + {108, 3996}, + {108, 3987}, + {107, 3978}, + {108, 3971}, + {110, 3962}, + {107, 3953}, + {108, 3946}, + {107, 3938}, + {112, 3932}, + {110, 3924}, + {110, 3916}, + {110, 3910}, + {112, 3903}, + {112, 3895}, + {112, 3889}, + {112, 3883}, + {113, 3876}, + {115, 3870}, + {115, 3864}, + {117, 3858}, + {117, 3852}, + {120, 3847}, + {115, 3838}, + {115, 3831}, + {112, 3821}, + {108, 3810}, + {107, 3802}, + {108, 3796}, + {107, 3790}, + {108, 3786}, + {103, 3780}, + {105, 3777}, + {107, 3774}, + {103, 3770}, + {103, 3767}, + {103, 3765}, + {107, 3764}, + {105, 3762}, + {105, 3761}, + {105, 3760}, + {107, 3759}, + {107, 3757}, + {107, 3756}, + {108, 3755}, + {110, 3755}, + {110, 3754}, + {107, 3751}, + {110, 3750}, + {110, 3749}, + {112, 3748}, + {112, 3745}, + {113, 3744}, + {112, 3740}, + {113, 3736}, + {113, 3730}, + {107, 3720}, + {110, 3712}, + {110, 3703}, + {112, 3693}, + {112, 3683}, + {115, 3671}, + {112, 3657}, + {115, 3645}, + {113, 3632}, + {113, 3621}, + {113, 3610}, + {112, 3599}, + {112, 3589}, + {113, 3579}, + {112, 3568}, + {112, 3558}, + {113, 3548}, + {112, 3538}, + {113, 3528}, + {112, 3517}, + {113, 3509}, + {113, 3503}, + {118, 3497}, + {115, 3488}, + {118, 3480}, + {123, 3469}, + {120, 3445}, + {123, 3400}, + {123, 3400}, + {123, 3400} + }, + { + {103, 4168}, + {103, 4154}, + {105, 4144}, + {107, 4134}, + {108, 4125}, + {107, 4115}, + {108, 4106}, + {105, 4096}, + {105, 4087}, + {107, 4079}, + {108, 4070}, + {107, 4061}, + {108, 4054}, + {110, 4045}, + {107, 4036}, + {110, 4029}, + {112, 4022}, + {110, 4013}, + {108, 4005}, + {110, 3998}, + {113, 3992}, + {112, 3983}, + {110, 3976}, + {110, 3969}, + {113, 3963}, + {115, 3957}, + {115, 3950}, + {113, 3943}, + {115, 3937}, + {117, 3932}, + {117, 3925}, + {117, 3919}, + {118, 3914}, + {117, 3907}, + {120, 3903}, + {120, 3896}, + {120, 3891}, + {122, 3886}, + {123, 3881}, + {123, 3876}, + {127, 3873}, + {125, 3867}, + {125, 3862}, + {128, 3857}, + {125, 3850}, + {123, 3843}, + {115, 3833}, + {112, 3824}, + {112, 3818}, + {107, 3812}, + {105, 3807}, + {105, 3803}, + {107, 3800}, + {105, 3796}, + {105, 3793}, + {105, 3787}, + {108, 3785}, + {107, 3782}, + {107, 3779}, + {107, 3776}, + {108, 3775}, + {107, 3772}, + {108, 3770}, + {110, 3769}, + {107, 3766}, + {110, 3765}, + {112, 3764}, + {110, 3761}, + {112, 3760}, + {112, 3759}, + {115, 3759}, + {113, 3757}, + {113, 3755}, + {108, 3751}, + {105, 3745}, + {105, 3740}, + {108, 3738}, + {107, 3735}, + {108, 3733}, + {110, 3729}, + {110, 3725}, + {107, 3720}, + {107, 3717}, + {105, 3713}, + {107, 3709}, + {107, 3704}, + {103, 3695}, + {107, 3688}, + {108, 3682}, + {107, 3674}, + {110, 3666}, + {108, 3662}, + {107, 3659}, + {112, 3658}, + {113, 3656}, + {115, 3653}, + {118, 3650}, + {122, 3643}, + {117, 3624}, + {118, 3583}, + {122, 3529}, + {123, 3456}, + {133, 3400} + } +}; + +/* The following data is for temperature empty C */ +/* Total data num: 103 */ +/* battery profile for actual temperature. The size should be the same as T1, T2 and T3 */ +BATTERY_PROFILE_STRUC battery_profile_temperature[] = { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + +}; + +/* Total data num: 103 */ +/* r-table profile for actual temperature. The size should be the same as T1, T2 and T3 */ +R_PROFILE_STRUC r_profile_temperature[] = { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + +}; + +// ============================================================ +// function prototype +// ============================================================ +int fgauge_get_saddles(void); +BATTERY_PROFILE_STRUC_P fgauge_get_profile(kal_uint32 temperature); + +int fgauge_get_saddles_r_table(void); +R_PROFILE_STRUC_P fgauge_get_profile_r_table(kal_uint32 temperature); + +#endif /* #ifndef _CUST_BATTERY_METER_TABLE_H */ diff --git a/arch/arm/mach-mt8127/ford/power/cust_battery_meter_table_austin.h b/arch/arm/mach-mt8127/ford/power/cust_battery_meter_table_austin.h new file mode 100755 index 00000000000..39d9c7e0332 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/power/cust_battery_meter_table_austin.h @@ -0,0 +1,5568 @@ +#ifndef _CUST_BATTERY_METER_TABLE_H +#define _CUST_BATTERY_METER_TABLE_H + +#include + +// ============================================================ +// define +// ============================================================ +#define BAT_NTC_10 1 +#define BAT_NTC_47 0 +#define BAT_NTC_100 0 + +#ifdef CONFIG_MTK_PMIC_MT6397 +#define RBAT_PULL_UP_R 24000 +#define RBAT_PULL_DOWN_R 100000000 +#define RBAT_PULL_UP_VOLT 1200 + +#else + +#if (BAT_NTC_10 == 1) +#define RBAT_PULL_UP_R 16900 +#define RBAT_PULL_DOWN_R 27000 +#endif +#if (BAT_NTC_47 == 1) +#define RBAT_PULL_UP_R 61900 +#define RBAT_PULL_DOWN_R 100000 +#endif +#if (BAT_NTC_100 == 1) +#define RBAT_PULL_UP_R 24000 +#define RBAT_PULL_DOWN_R 100000000 +#endif +#define RBAT_PULL_UP_VOLT 1800 +#endif + +// ============================================================ +// ENUM +// ============================================================ + +// ============================================================ +// structure +// ============================================================ + +// ============================================================ +// typedef +// ============================================================ +typedef struct _BATTERY_PROFILE_STRUC { + kal_int32 percentage; + kal_int32 voltage; +} BATTERY_PROFILE_STRUC, *BATTERY_PROFILE_STRUC_P; + +typedef struct _R_PROFILE_STRUC { + kal_int32 resistance; /* Ohm */ + kal_int32 voltage; +} R_PROFILE_STRUC, *R_PROFILE_STRUC_P; + +typedef enum { + T1_0C, + T2_25C, + T3_50C +} PROFILE_TEMPERATURE; + +// ============================================================ +// External Variables +// ============================================================ + +// ============================================================ +// External function +// ============================================================ + +// ============================================================ +// Table +// ============================================================ +#if (BAT_NTC_10 == 1) +BATT_TEMPERATURE Batt_Temperature_Table[2][17] = { + { + {-20, 76241}, + {-15, 58649}, + {-10, 45569}, + {-5, 35735}, + {0, 28271}, + {5, 22551}, + {10, 18136}, + {15, 14696}, + {20, 11997}, + {25, 10000}, + {30, 8365}, + {35, 7011}, + {40, 5951}, + {45, 4992}, + {50, 4217}, + {55, 3579}, + {60, 3051} + }, + { + {-20, 76241}, + {-15, 58649}, + {-10, 45569}, + {-5, 35735}, + {0, 28271}, + {5, 22551}, + {10, 18136}, + {15, 14696}, + {20, 11997}, + {25, 10000}, + {30, 8365}, + {35, 7011}, + {40, 5951}, + {45, 4992}, + {50, 4217}, + {55, 3579}, + {60, 3051} + } +}; +#endif + +#if (BAT_NTC_47 == 1) +BATT_TEMPERATURE Batt_Temperature_Table[] = { + {-20, 483954}, + {-15, 360850}, + {-10, 271697}, + {-5, 206463}, + {0, 158214}, + {5, 122259}, + {10, 95227}, + {15, 74730}, + {20, 59065}, + {25, 47000}, + {30, 37643}, + {35, 30334}, + {40, 24591}, + {45, 20048}, + {50, 16433}, + {55, 13539}, + {60, 11210} +}; +#endif + +#if (BAT_NTC_100 == 1) +BATT_TEMPERATURE Batt_Temperature_Table[] = { + {-20, 1151037}, + {-15, 846579}, + {-10, 628988}, + {-5, 471632}, + {0, 357012}, + {5, 272500}, + {10, 209710}, + {15, 162651}, + {20, 127080}, + {25, 100000}, + {30, 79222}, + {35, 63167}, + {40, 50677}, + {45, 40904}, + {50, 33195}, + {55, 27091}, + {60, 22224} +}; +#endif +/*battery fuel gauge para gen +Now we using MTK default behavior +*/ + +/* The following data is for temperature -10 C */ +/* Total data num: 103 */ +/* T0 -10C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t0[2][103] = { + { + {0,4168}, + {1,4153}, + {2,4141}, + {3,4131}, + {4,4121}, + {5,4111}, + {6,4102}, + {7,4094}, + {8,4083}, + {9,4077}, + {10,4074}, + {11,4070}, + {12,4069}, + {13,4061}, + {14,4045}, + {15,4022}, + {16,3996}, + {17,3977}, + {18,3963}, + {19,3953}, + {20,3945}, + {21,3936}, + {22,3930}, + {23,3919}, + {24,3914}, + {25,3910}, + {26,3905}, + {27,3901}, + {28,3898}, + {29,3893}, + {30,3888}, + {31,3881}, + {32,3874}, + {33,3869}, + {34,3863}, + {35,3857}, + {36,3852}, + {37,3844}, + {38,3839}, + {39,3834}, + {40,3829}, + {41,3826}, + {42,3819}, + {43,3814}, + {44,3811}, + {45,3807}, + {46,3802}, + {47,3800}, + {48,3796}, + {49,3792}, + {50,3787}, + {51,3785}, + {52,3781}, + {53,3779}, + {54,3776}, + {55,3772}, + {56,3770}, + {57,3767}, + {58,3766}, + {59,3764}, + {60,3762}, + {61,3760}, + {62,3759}, + {63,3759}, + {64,3757}, + {65,3756}, + {66,3755}, + {67,3752}, + {68,3751}, + {69,3750}, + {70,3749}, + {71,3748}, + {72,3746}, + {73,3744}, + {74,3743}, + {75,3740}, + {76,3738}, + {77,3735}, + {78,3731}, + {79,3729}, + {80,3725}, + {81,3723}, + {82,3719}, + {83,3714}, + {84,3709}, + {85,3704}, + {86,3698}, + {87,3693}, + {88,3689}, + {89,3684}, + {90,3681}, + {91,3676}, + {92,3669}, + {93,3664}, + {94,3657}, + {95,3646}, + {96,3628}, + {97,3602}, + {98,3563}, + {98,3524}, + {99,3491}, + {99,3457}, + {100,3425} + }, + { + {0,4193}, + {1,4180}, + {2,4169}, + {3,4158}, + {4,4148}, + {5,4137}, + {6,4128}, + {7,4119}, + {8,4110}, + {9,4101}, + {10,4093}, + {11,4087}, + {12,4079}, + {13,4071}, + {14,4062}, + {15,4050}, + {16,4038}, + {17,4025}, + {18,4013}, + {19,4002}, + {20,3992}, + {21,3983}, + {22,3974}, + {23,3967}, + {24,3959}, + {25,3952}, + {26,3946}, + {27,3939}, + {28,3933}, + {29,3926}, + {30,3920}, + {31,3914}, + {32,3908}, + {33,3901}, + {34,3895}, + {35,3889}, + {35,3883}, + {36,3877}, + {37,3871}, + {38,3866}, + {39,3860}, + {40,3855}, + {41,3850}, + {42,3845}, + {43,3841}, + {44,3836}, + {45,3832}, + {46,3828}, + {47,3824}, + {48,3821}, + {49,3817}, + {50,3814}, + {51,3810}, + {52,3807}, + {53,3804}, + {54,3802}, + {55,3799}, + {56,3796}, + {57,3794}, + {58,3792}, + {59,3790}, + {60,3788}, + {61,3786}, + {62,3785}, + {63,3783}, + {64,3782}, + {65,3780}, + {66,3779}, + {67,3777}, + {68,3775}, + {69,3774}, + {70,3772}, + {71,3770}, + {72,3768}, + {73,3766}, + {74,3764}, + {75,3761}, + {76,3758}, + {77,3755}, + {78,3752}, + {79,3749}, + {80,3746}, + {81,3742}, + {82,3738}, + {83,3734}, + {84,3729}, + {85,3724}, + {86,3719}, + {87,3713}, + {88,3707}, + {89,3703}, + {90,3699}, + {91,3694}, + {92,3690}, + {93,3685}, + {94,3679}, + {95,3667}, + {96,3647}, + {97,3615}, + {98,3573}, + {99,3521}, + {99,3450}, + {100,3419} + } + +}; + +/* Total data num: 103 */ +/* T0 r_profile N10C */ +R_PROFILE_STRUC r_profile_t0[2][103] = { + { + {515,4168}, + {515,4153}, + {548,4141}, + {553,4131}, + {558,4121}, + {563,4111}, + {568,4102}, + {568,4094}, + {563,4083}, + {560,4077}, + {575,4074}, + {588,4070}, + {608,4069}, + {618,4061}, + {613,4045}, + {608,4022}, + {598,3996}, + {590,3977}, + {585,3963}, + {583,3953}, + {583,3945}, + {578,3936}, + {580,3930}, + {580,3919}, + {578,3914}, + {580,3910}, + {578,3905}, + {583,3901}, + {585,3898}, + {580,3893}, + {580,3888}, + {575,3881}, + {570,3874}, + {578,3869}, + {578,3863}, + {575,3857}, + {578,3852}, + {570,3844}, + {573,3839}, + {573,3834}, + {573,3829}, + {578,3826}, + {573,3819}, + {575,3814}, + {580,3811}, + {580,3807}, + {580,3802}, + {585,3800}, + {583,3796}, + {585,3792}, + {585,3787}, + {590,3785}, + {590,3781}, + {593,3779}, + {592,3776}, + {592,3772}, + {595,3770}, + {595,3767}, + {600,3766}, + {602,3764}, + {603,3762}, + {602,3760}, + {605,3759}, + {608,3759}, + {610,3757}, + {613,3756}, + {615,3755}, + {590,3752}, + {610,3751}, + {615,3750}, + {618,3749}, + {620,3748}, + {625,3746}, + {628,3744}, + {633,3743}, + {635,3740}, + {643,3738}, + {648,3735}, + {645,3731}, + {655,3729}, + {660,3725}, + {670,3723}, + {680,3719}, + {690,3714}, + {700,3709}, + {713,3704}, + {730,3698}, + {750,3693}, + {778,3689}, + {805,3684}, + {850,3681}, + {908,3676}, + {970,3669}, + {1060,3664}, + {1188,3657}, + {1353,3646}, + {1533,3628}, + {1693,3602}, + {1843,3563}, + {1810,3524}, + {1728,3491}, + {1643,3457}, + {1563,3425} + }, + { + {268,4193}, + {428,4180}, + {430,4169}, + {432,4158}, + {433,4148}, + {432,4137}, + {433,4128}, + {433,4119}, + {432,4110}, + {438,4101}, + {438,4093}, + {442,4087}, + {442,4079}, + {443,4071}, + {443,4062}, + {440,4050}, + {438,4038}, + {435,4025}, + {433,4013}, + {432,4002}, + {432,3992}, + {432,3983}, + {428,3974}, + {430,3967}, + {428,3959}, + {428,3952}, + {428,3946}, + {428,3939}, + {428,3933}, + {425,3926}, + {425,3920}, + {425,3914}, + {425,3908}, + {423,3901}, + {422,3895}, + {420,3889}, + {420,3883}, + {418,3877}, + {418,3871}, + {418,3866}, + {418,3860}, + {420,3855}, + {420,3850}, + {420,3845}, + {422,3841}, + {422,3836}, + {422,3832}, + {423,3828}, + {423,3824}, + {427,3821}, + {427,3817}, + {430,3814}, + {430,3810}, + {432,3807}, + {433,3804}, + {437,3802}, + {437,3799}, + {437,3796}, + {442,3794}, + {443,3792}, + {445,3790}, + {447,3788}, + {450,3786}, + {453,3785}, + {457,3783}, + {460,3782}, + {463,3780}, + {468,3779}, + {472,3777}, + {475,3775}, + {482,3774}, + {485,3772}, + {488,3770}, + {493,3768}, + {498,3766}, + {505,3764}, + {508,3761}, + {512,3758}, + {518,3755}, + {522,3752}, + {530,3749}, + {537,3746}, + {545,3742}, + {555,3738}, + {563,3734}, + {575,3729}, + {588,3724}, + {605,3719}, + {625,3713}, + {645,3707}, + {675,3703}, + {710,3699}, + {753,3694}, + {808,3690}, + {877,3685}, + {972,3679}, + {1082,3667}, + {1203,3647}, + {1335,3615}, + {1447,3573}, + {1535,3521}, + {1457,3450}, + {1390,3419} + } +}; + +/* The following data is for temperature 0 C + Total data num: 103 + T1 0C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t1[2][103] = { + { + {0,4182}, + {1,4169}, + {2,4158}, + {3,4149}, + {4,4139}, + {5,4130}, + {6,4121}, + {7,4112}, + {8,4104}, + {9,4096}, + {10,4091}, + {11,4090}, + {12,4088}, + {13,4083}, + {14,4070}, + {15,4049}, + {16,4022}, + {17,4003}, + {18,3990}, + {19,3979}, + {20,3971}, + {21,3965}, + {22,3959}, + {23,3955}, + {24,3950}, + {25,3946}, + {26,3943}, + {27,3941}, + {28,3937}, + {29,3933}, + {29,3928}, + {30,3922}, + {31,3914}, + {32,3907}, + {33,3899}, + {34,3893}, + {35,3885}, + {36,3877}, + {37,3871}, + {38,3864}, + {39,3858}, + {40,3852}, + {41,3847}, + {42,3841}, + {43,3836}, + {44,3832}, + {45,3828}, + {46,3823}, + {47,3820}, + {48,3816}, + {49,3812}, + {50,3809}, + {51,3806}, + {52,3803}, + {53,3800}, + {54,3797}, + {55,3796}, + {56,3792}, + {57,3790}, + {58,3788}, + {59,3786}, + {60,3784}, + {61,3782}, + {62,3780}, + {63,3780}, + {64,3779}, + {65,3778}, + {66,3777}, + {67,3776}, + {68,3775}, + {69,3775}, + {70,3773}, + {71,3772}, + {72,3770}, + {73,3769}, + {74,3768}, + {75,3766}, + {76,3764}, + {77,3762}, + {78,3760}, + {79,3757}, + {80,3754}, + {81,3751}, + {82,3746}, + {83,3741}, + {84,3737}, + {85,3732}, + {86,3727}, + {87,3720}, + {87,3714}, + {88,3706}, + {89,3702}, + {90,3698}, + {91,3696}, + {92,3694}, + {93,3692}, + {94,3688}, + {95,3680}, + {96,3660}, + {97,3620}, + {98,3562}, + {99,3484}, + {100,3400} + }, + { + {0,4195}, + {1,4184}, + {2,4173}, + {3,4163}, + {4,4153}, + {5,4143}, + {6,4134}, + {7,4124}, + {8,4115}, + {9,4106}, + {10,4098}, + {11,4090}, + {12,4085}, + {13,4078}, + {14,4069}, + {15,4059}, + {16,4047}, + {17,4036}, + {18,4024}, + {19,4014}, + {20,4004}, + {21,3995}, + {22,3987}, + {23,3980}, + {24,3973}, + {25,3966}, + {26,3960}, + {27,3954}, + {28,3948}, + {29,3942}, + {30,3936}, + {31,3929}, + {32,3922}, + {33,3915}, + {34,3908}, + {35,3900}, + {36,3893}, + {37,3886}, + {38,3879}, + {39,3873}, + {40,3866}, + {41,3861}, + {42,3855}, + {43,3850}, + {44,3846}, + {45,3841}, + {46,3837}, + {46,3832}, + {47,3829}, + {48,3825}, + {49,3821}, + {50,3818}, + {51,3815}, + {52,3812}, + {53,3809}, + {54,3806}, + {55,3803}, + {56,3800}, + {57,3798}, + {58,3796}, + {59,3793}, + {60,3791}, + {61,3789}, + {62,3787}, + {63,3786}, + {64,3784}, + {65,3783}, + {66,3781}, + {67,3780}, + {68,3778}, + {69,3776}, + {70,3774}, + {71,3772}, + {72,3769}, + {73,3767}, + {74,3765}, + {75,3762}, + {76,3759}, + {77,3756}, + {78,3753}, + {79,3750}, + {80,3746}, + {81,3742}, + {82,3737}, + {83,3733}, + {84,3728}, + {85,3724}, + {86,3719}, + {87,3712}, + {88,3705}, + {89,3700}, + {90,3697}, + {91,3694}, + {92,3691}, + {93,3687}, + {94,3680}, + {95,3669}, + {96,3644}, + {97,3605}, + {98,3556}, + {99,3494}, + {100,3411}, + {100,3411} + } +}; + +/* Total data num: 103*/ +/* T1 r_profile 0C */ +R_PROFILE_STRUC r_profile_t1[2][103] = { + { + {295,4182}, + {295,4169}, + {298,4158}, + {305,4149}, + {308,4139}, + {310,4130}, + {315,4121}, + {315,4112}, + {318,4104}, + {315,4096}, + {318,4091}, + {333,4090}, + {343,4088}, + {350,4083}, + {350,4070}, + {348,4049}, + {340,4022}, + {340,4003}, + {343,3990}, + {338,3979}, + {338,3971}, + {343,3965}, + {340,3959}, + {345,3955}, + {343,3950}, + {343,3946}, + {345,3943}, + {350,3941}, + {348,3937}, + {348,3933}, + {348,3928}, + {345,3922}, + {338,3914}, + {335,3907}, + {330,3899}, + {328,3893}, + {323,3885}, + {318,3877}, + {318,3871}, + {310,3864}, + {310,3858}, + {308,3852}, + {308,3847}, + {305,3841}, + {300,3836}, + {303,3832}, + {305,3828}, + {300,3823}, + {300,3820}, + {303,3816}, + {300,3812}, + {303,3809}, + {303,3806}, + {303,3803}, + {303,3800}, + {300,3797}, + {308,3796}, + {303,3792}, + {305,3790}, + {305,3788}, + {308,3786}, + {308,3784}, + {308,3782}, + {305,3780}, + {310,3780}, + {310,3779}, + {310,3778}, + {310,3777}, + {310,3776}, + {313,3775}, + {315,3775}, + {313,3773}, + {315,3772}, + {313,3770}, + {315,3769}, + {318,3768}, + {318,3766}, + {320,3764}, + {320,3762}, + {323,3760}, + {323,3757}, + {323,3754}, + {325,3751}, + {323,3746}, + {323,3741}, + {325,3737}, + {328,3732}, + {328,3727}, + {328,3720}, + {330,3714}, + {330,3706}, + {333,3702}, + {335,3698}, + {345,3696}, + {358,3694}, + {373,3692}, + {395,3688}, + {418,3680}, + {440,3660}, + {468,3620}, + {535,3562}, + {663,3484}, + {945,3400} + }, + { + {225,4195}, + {220,4184}, + {222,4173}, + {222,4163}, + {223,4153}, + {225,4143}, + {227,4134}, + {227,4124}, + {227,4115}, + {228,4106}, + {230,4098}, + {230,4090}, + {228,4085}, + {233,4078}, + {233,4069}, + {233,4059}, + {233,4047}, + {235,4036}, + {235,4024}, + {237,4014}, + {235,4004}, + {235,3995}, + {235,3987}, + {238,3980}, + {238,3973}, + {238,3966}, + {238,3960}, + {240,3954}, + {240,3948}, + {240,3942}, + {240,3936}, + {238,3929}, + {237,3922}, + {235,3915}, + {233,3908}, + {230,3900}, + {228,3893}, + {227,3886}, + {225,3879}, + {225,3873}, + {222,3866}, + {223,3861}, + {222,3855}, + {222,3850}, + {223,3846}, + {217,3841}, + {222,3837}, + {222,3832}, + {223,3829}, + {217,3825}, + {215,3821}, + {212,3818}, + {222,3815}, + {225,3812}, + {225,3809}, + {225,3806}, + {225,3803}, + {225,3800}, + {225,3798}, + {228,3796}, + {225,3793}, + {223,3791}, + {222,3789}, + {225,3787}, + {230,3786}, + {232,3784}, + {233,3783}, + {233,3781}, + {235,3780}, + {237,3778}, + {237,3776}, + {238,3774}, + {233,3772}, + {233,3769}, + {232,3767}, + {242,3765}, + {242,3762}, + {242,3759}, + {245,3756}, + {245,3753}, + {250,3750}, + {252,3746}, + {253,3742}, + {250,3737}, + {250,3733}, + {250,3728}, + {260,3724}, + {265,3719}, + {267,3712}, + {268,3705}, + {272,3700}, + {282,3697}, + {293,3694}, + {307,3691}, + {322,3687}, + {333,3680}, + {355,3669}, + {373,3644}, + {435,3605}, + {498,3556}, + {597,3494}, + {757,3411}, + {757,3411} + } +}; + +/* The following data is for temperature 25 C */ +/* Total data num: 103 */ +/* T2 25C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t2[2][103] = { + { + {0,4190}, + {1,4174}, + {2,4163}, + {3,4152}, + {4,4142}, + {5,4133}, + {6,4123}, + {7,4115}, + {8,4106}, + {9,4097}, + {10,4090}, + {11,4087}, + {12,4085}, + {13,4081}, + {14,4071}, + {15,4054}, + {16,4034}, + {17,4018}, + {18,4005}, + {19,3996}, + {20,3988}, + {21,3982}, + {22,3976}, + {23,3972}, + {24,3969}, + {25,3968}, + {26,3965}, + {27,3960}, + {28,3955}, + {29,3947}, + {30,3942}, + {31,3936}, + {32,3931}, + {33,3926}, + {34,3920}, + {35,3914}, + {36,3909}, + {37,3904}, + {38,3899}, + {39,3893}, + {40,3886}, + {41,3880}, + {42,3873}, + {43,3865}, + {44,3855}, + {45,3847}, + {46,3841}, + {47,3834}, + {48,3828}, + {49,3824}, + {50,3821}, + {51,3817}, + {52,3814}, + {53,3811}, + {54,3808}, + {55,3806}, + {56,3803}, + {57,3800}, + {58,3797}, + {59,3795}, + {60,3793}, + {61,3791}, + {62,3790}, + {63,3787}, + {64,3786}, + {65,3785}, + {66,3783}, + {67,3782}, + {68,3781}, + {69,3781}, + {70,3780}, + {71,3779}, + {72,3777}, + {73,3776}, + {74,3775}, + {75,3771}, + {76,3770}, + {77,3767}, + {78,3764}, + {79,3761}, + {80,3757}, + {81,3754}, + {82,3750}, + {83,3748}, + {84,3744}, + {85,3739}, + {86,3733}, + {87,3726}, + {88,3721}, + {89,3717}, + {90,3708}, + {91,3700}, + {92,3697}, + {93,3695}, + {94,3694}, + {95,3693}, + {96,3692}, + {97,3689}, + {98,3682}, + {99,3659}, + {100,3615}, + {100,3600}, + {100,3600} + }, + { + {0,4189}, + {1,4177}, + {2,4167}, + {3,4156}, + {4,4146}, + {5,4136}, + {6,4126}, + {7,4117}, + {8,4107}, + {9,4098}, + {10,4089}, + {11,4081}, + {12,4075}, + {13,4069}, + {14,4059}, + {15,4049}, + {16,4038}, + {18,4027}, + {19,4016}, + {20,4006}, + {21,3998}, + {22,3990}, + {23,3983}, + {24,3976}, + {25,3970}, + {26,3966}, + {27,3961}, + {28,3954}, + {29,3948}, + {30,3941}, + {31,3934}, + {32,3927}, + {33,3920}, + {34,3913}, + {35,3906}, + {36,3898}, + {37,3890}, + {38,3882}, + {39,3874}, + {40,3866}, + {41,3859}, + {42,3853}, + {43,3847}, + {44,3842}, + {45,3837}, + {46,3833}, + {47,3828}, + {48,3824}, + {49,3820}, + {50,3816}, + {52,3813}, + {53,3810}, + {54,3807}, + {55,3803}, + {56,3800}, + {57,3798}, + {58,3795}, + {59,3793}, + {60,3790}, + {61,3788}, + {62,3785}, + {63,3783}, + {64,3781}, + {65,3779}, + {66,3777}, + {67,3776}, + {68,3774}, + {69,3772}, + {70,3769}, + {71,3766}, + {72,3763}, + {73,3759}, + {74,3756}, + {75,3752}, + {76,3748}, + {77,3745}, + {78,3742}, + {79,3739}, + {80,3736}, + {81,3732}, + {82,3728}, + {83,3724}, + {84,3719}, + {86,3714}, + {87,3710}, + {88,3705}, + {89,3698}, + {90,3690}, + {91,3686}, + {92,3684}, + {93,3682}, + {94,3680}, + {95,3676}, + {96,3669}, + {97,3652}, + {98,3619}, + {99,3576}, + {100,3520}, + {100,3520}, + {100,3520}, + {100,3520}, + {100,3520}, + {100,3520} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 25C */ +R_PROFILE_STRUC r_profile_t2[2][103] = { + { + {123,4190}, + {123,4174}, + {128,4163}, + {125,4152}, + {128,4142}, + {128,4133}, + {128,4123}, + {133,4115}, + {130,4106}, + {130,4097}, + {128,4090}, + {132,4087}, + {138,4085}, + {143,4081}, + {140,4071}, + {140,4054}, + {138,4034}, + {140,4018}, + {140,4005}, + {158,3996}, + {158,3988}, + {155,3982}, + {158,3976}, + {158,3972}, + {165,3969}, + {165,3968}, + {165,3965}, + {168,3960}, + {168,3955}, + {170,3947}, + {170,3942}, + {173,3936}, + {173,3931}, + {175,3926}, + {175,3920}, + {180,3914}, + {180,3909}, + {183,3904}, + {185,3899}, + {183,3893}, + {180,3886}, + {178,3880}, + {170,3873}, + {148,3865}, + {140,3855}, + {138,3847}, + {133,3841}, + {128,3834}, + {128,3828}, + {128,3824}, + {130,3821}, + {133,3817}, + {133,3814}, + {130,3811}, + {135,3808}, + {133,3806}, + {133,3803}, + {130,3800}, + {133,3797}, + {130,3795}, + {135,3793}, + {158,3791}, + {153,3790}, + {158,3787}, + {158,3786}, + {155,3785}, + {158,3783}, + {158,3782}, + {158,3781}, + {158,3781}, + {158,3780}, + {153,3779}, + {155,3777}, + {155,3776}, + {150,3775}, + {153,3771}, + {150,3770}, + {148,3767}, + {153,3764}, + {150,3761}, + {153,3757}, + {148,3754}, + {153,3750}, + {153,3748}, + {153,3744}, + {148,3739}, + {150,3733}, + {150,3726}, + {155,3721}, + {148,3717}, + {150,3708}, + {153,3700}, + {130,3697}, + {133,3695}, + {138,3694}, + {145,3693}, + {150,3692}, + {150,3689}, + {148,3682}, + {150,3659}, + {160,3615}, + {165,3600}, + {180,3600} + }, + { + {115,4189}, + {115,4177}, + {117,4167}, + {117,4156}, + {117,4146}, + {117,4136}, + {118,4126}, + {118,4117}, + {118,4107}, + {120,4098}, + {120,4089}, + {122,4081}, + {123,4075}, + {125,4069}, + {120,4059}, + {120,4049}, + {122,4038}, + {122,4027}, + {122,4016}, + {122,4006}, + {123,3998}, + {125,3990}, + {127,3983}, + {127,3976}, + {128,3970}, + {132,3966}, + {132,3961}, + {128,3954}, + {132,3948}, + {132,3941}, + {132,3934}, + {132,3927}, + {132,3920}, + {132,3913}, + {132,3906}, + {130,3898}, + {130,3890}, + {128,3882}, + {125,3874}, + {123,3866}, + {122,3859}, + {122,3853}, + {120,3847}, + {120,3842}, + {120,3837}, + {120,3833}, + {118,3828}, + {118,3824}, + {118,3820}, + {118,3816}, + {118,3813}, + {120,3810}, + {120,3807}, + {118,3803}, + {118,3800}, + {120,3798}, + {120,3795}, + {122,3793}, + {122,3790}, + {122,3788}, + {122,3785}, + {122,3783}, + {123,3781}, + {123,3779}, + {123,3777}, + {125,3776}, + {125,3774}, + {125,3772}, + {123,3769}, + {122,3766}, + {122,3763}, + {122,3759}, + {122,3756}, + {122,3752}, + {120,3748}, + {122,3745}, + {122,3742}, + {122,3739}, + {122,3736}, + {122,3732}, + {122,3728}, + {123,3724}, + {123,3719}, + {123,3714}, + {125,3710}, + {125,3705}, + {125,3698}, + {123,3690}, + {125,3686}, + {127,3684}, + {128,3682}, + {132,3680}, + {133,3676}, + {137,3669}, + {137,3652}, + {137,3619}, + {133,3576}, + {147,3520}, + {147,3520}, + {147,3520}, + {147,3520}, + {147,3520}, + {147,3520} + } +}; + +/* The following data is for temperature 55 C */ +/* Total data num: 103 */ +/* T3 50C:{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t3[2][103] = { + { + {0,4162}, + {1,4151}, + {2,4141}, + {3,4132}, + {4,4122}, + {5,4113}, + {6,4105}, + {7,4095}, + {8,4086}, + {9,4079}, + {10,4071}, + {11,4063}, + {12,4059}, + {13,4053}, + {14,4043}, + {15,4029}, + {16,4017}, + {17,4007}, + {18,4000}, + {19,3997}, + {20,3992}, + {21,3986}, + {22,3978}, + {23,3972}, + {24,3966}, + {25,3960}, + {26,3953}, + {27,3947}, + {28,3941}, + {29,3935}, + {30,3930}, + {31,3925}, + {32,3917}, + {33,3912}, + {34,3907}, + {35,3903}, + {36,3898}, + {37,3891}, + {38,3886}, + {39,3881}, + {40,3876}, + {41,3872}, + {42,3865}, + {43,3855}, + {44,3845}, + {45,3837}, + {46,3828}, + {47,3823}, + {48,3819}, + {49,3816}, + {50,3812}, + {52,3808}, + {53,3805}, + {54,3802}, + {55,3798}, + {56,3796}, + {57,3793}, + {58,3791}, + {59,3790}, + {60,3787}, + {61,3785}, + {62,3783}, + {63,3781}, + {64,3780}, + {65,3777}, + {66,3775}, + {67,3774}, + {68,3772}, + {69,3771}, + {70,3770}, + {71,3769}, + {72,3767}, + {73,3765}, + {74,3760}, + {75,3754}, + {76,3750}, + {77,3745}, + {78,3743}, + {79,3740}, + {80,3736}, + {81,3733}, + {82,3730}, + {83,3726}, + {84,3724}, + {85,3720}, + {86,3714}, + {87,3708}, + {88,3702}, + {89,3697}, + {90,3692}, + {91,3682}, + {92,3678}, + {93,3677}, + {94,3676}, + {95,3676}, + {96,3673}, + {97,3671}, + {98,3666}, + {99,3642}, + {100,3602}, + {100,3600}, + {100,3600}, + {100,3600} + }, + { + {0,4179}, + {1,4168}, + {2,4157}, + {3,4147}, + {4,4137}, + {5,4127}, + {6,4118}, + {7,4108}, + {8,4098}, + {9,4089}, + {10,4080}, + {11,4071}, + {12,4063}, + {13,4054}, + {14,4046}, + {15,4038}, + {16,4029}, + {17,4020}, + {18,4010}, + {20,4004}, + {21,3997}, + {22,3990}, + {23,3982}, + {24,3975}, + {25,3969}, + {26,3961}, + {27,3955}, + {28,3948}, + {29,3941}, + {30,3934}, + {31,3928}, + {32,3922}, + {33,3916}, + {34,3910}, + {35,3903}, + {36,3898}, + {37,3890}, + {38,3883}, + {39,3874}, + {40,3865}, + {41,3857}, + {42,3850}, + {43,3843}, + {44,3838}, + {45,3832}, + {46,3828}, + {47,3824}, + {48,3820}, + {49,3816}, + {50,3812}, + {51,3809}, + {52,3805}, + {53,3801}, + {54,3799}, + {55,3796}, + {57,3793}, + {58,3790}, + {59,3787}, + {60,3785}, + {61,3783}, + {62,3780}, + {63,3779}, + {64,3776}, + {65,3774}, + {66,3772}, + {67,3770}, + {68,3769}, + {69,3767}, + {70,3763}, + {71,3756}, + {72,3750}, + {73,3746}, + {74,3741}, + {75,3738}, + {76,3734}, + {77,3731}, + {78,3727}, + {79,3724}, + {80,3721}, + {81,3718}, + {82,3715}, + {83,3711}, + {84,3707}, + {85,3702}, + {86,3697}, + {87,3692}, + {88,3687}, + {89,3680}, + {90,3674}, + {91,3671}, + {92,3668}, + {94,3666}, + {95,3663}, + {96,3658}, + {97,3647}, + {98,3621}, + {99,3584}, + {100,3520}, + {100,3520}, + {100,3520}, + {100,3520}, + {100,3520}, + {100,3520} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 50C */ +R_PROFILE_STRUC r_profile_t3[2][103] = { + { + {95,4162}, + {95,4151}, + {95,4141}, + {97,4132}, + {92,4122}, + {90,4113}, + {95,4105}, + {95,4094}, + {93,4086}, + {95,4078}, + {100,4070}, + {95,4062}, + {98,4059}, + {98,4053}, + {100,4043}, + {97,4029}, + {98,4017}, + {97,4006}, + {95,4000}, + {112,3997}, + {113,3992}, + {115,3986}, + {115,3978}, + {115,3972}, + {115,3966}, + {115,3960}, + {117,3953}, + {117,3947}, + {117,3941}, + {117,3935}, + {118,3930}, + {119,3925}, + {120,3917}, + {122,3912}, + {123,3907}, + {133,3903}, + {133,3898}, + {130,3891}, + {130,3886}, + {133,3881}, + {135,3876}, + {140,3872}, + {140,3865}, + {130,3855}, + {110,3845}, + {108,3837}, + {97,3828}, + {98,3823}, + {95,3819}, + {97,3816}, + {92,3812}, + {95,3808}, + {95,3805}, + {98,3802}, + {92,3798}, + {95,3796}, + {93,3793}, + {95,3791}, + {98,3790}, + {98,3787}, + {98,3785}, + {115,3783}, + {120,3781}, + {120,3780}, + {120,3777}, + {117,3775}, + {120,3774}, + {120,3772}, + {120,3771}, + {120,3770}, + {120,3769}, + {120,3767}, + {118,3765}, + {110,3760}, + {112,3754}, + {118,3750}, + {110,3745}, + {112,3743}, + {113,3740}, + {110,3736}, + {112,3733}, + {112,3730}, + {110,3726}, + {115,3724}, + {115,3720}, + {112,3714}, + {110,3708}, + {112,3702}, + {112,3697}, + {118,3692}, + {110,3682}, + {112,3678}, + {115,3677}, + {95,3676}, + {98,3676}, + {98,3673}, + {100,3671}, + {110,3666}, + {97,3642}, + {105,3602}, + {107,3600}, + {115,3600}, + {128,3600} + }, + { + {85,4179}, + {87,4168}, + {85,4157}, + {87,4147}, + {87,4137}, + {87,4127}, + {88,4118}, + {88,4108}, + {87,4098}, + {87,4089}, + {87,4080}, + {87,4071}, + {88,4063}, + {88,4054}, + {88,4046}, + {88,4038}, + {88,4029}, + {90,4020}, + {88,4010}, + {92,4004}, + {90,3997}, + {90,3990}, + {90,3982}, + {90,3975}, + {92,3969}, + {92,3961}, + {92,3955}, + {93,3948}, + {93,3941}, + {92,3934}, + {93,3928}, + {95,3922}, + {95,3916}, + {97,3910}, + {95,3903}, + {98,3898}, + {95,3890}, + {95,3883}, + {93,3874}, + {92,3865}, + {92,3857}, + {90,3850}, + {88,3843}, + {88,3838}, + {87,3832}, + {87,3828}, + {88,3824}, + {88,3820}, + {88,3816}, + {88,3812}, + {88,3809}, + {88,3805}, + {87,3801}, + {88,3799}, + {88,3796}, + {88,3793}, + {88,3790}, + {88,3787}, + {88,3785}, + {90,3783}, + {90,3780}, + {93,3779}, + {90,3776}, + {92,3774}, + {92,3772}, + {92,3770}, + {95,3769}, + {95,3767}, + {93,3763}, + {87,3756}, + {88,3750}, + {90,3746}, + {88,3741}, + {90,3738}, + {88,3734}, + {90,3731}, + {88,3727}, + {88,3724}, + {90,3721}, + {88,3718}, + {90,3715}, + {90,3711}, + {92,3707}, + {90,3702}, + {90,3697}, + {90,3692}, + {92,3687}, + {90,3680}, + {90,3674}, + {90,3671}, + {90,3668}, + {92,3666}, + {95,3663}, + {98,3658}, + {97,3647}, + {95,3621}, + {95,3584}, + {98,3520}, + {98,3520}, + {98,3520}, + {98,3520}, + {98,3520}, + {98,3520} + } +}; +#if defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) +/* The following data is 0 cycle aging data for temperature -10 C */ +/* Total data num: 103 */ +/* T0 -10C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t0_0cycle[2][103] = { + { + {0,4168}, + {1,4153}, + {2,4141}, + {3,4131}, + {4,4121}, + {5,4111}, + {6,4102}, + {7,4094}, + {8,4083}, + {9,4077}, + {10,4074}, + {11,4070}, + {12,4069}, + {13,4061}, + {14,4045}, + {15,4022}, + {16,3996}, + {17,3977}, + {18,3963}, + {19,3953}, + {20,3945}, + {21,3936}, + {22,3930}, + {23,3919}, + {24,3914}, + {25,3910}, + {26,3905}, + {27,3901}, + {28,3898}, + {29,3893}, + {30,3888}, + {31,3881}, + {32,3874}, + {33,3869}, + {34,3863}, + {35,3857}, + {36,3852}, + {37,3844}, + {38,3839}, + {39,3834}, + {40,3829}, + {41,3826}, + {42,3819}, + {43,3814}, + {44,3811}, + {45,3807}, + {46,3802}, + {47,3800}, + {48,3796}, + {49,3792}, + {50,3787}, + {51,3785}, + {52,3781}, + {53,3779}, + {54,3776}, + {55,3772}, + {56,3770}, + {57,3767}, + {58,3766}, + {59,3764}, + {60,3762}, + {61,3760}, + {62,3759}, + {63,3759}, + {64,3757}, + {65,3756}, + {66,3755}, + {67,3752}, + {68,3751}, + {69,3750}, + {70,3749}, + {71,3748}, + {72,3746}, + {73,3744}, + {74,3743}, + {75,3740}, + {76,3738}, + {77,3735}, + {78,3731}, + {79,3729}, + {80,3725}, + {81,3723}, + {82,3719}, + {83,3714}, + {84,3709}, + {85,3704}, + {86,3698}, + {87,3693}, + {88,3689}, + {89,3684}, + {90,3681}, + {91,3676}, + {92,3669}, + {93,3664}, + {94,3657}, + {95,3646}, + {96,3628}, + {97,3602}, + {98,3563}, + {98,3524}, + {99,3491}, + {99,3457}, + {100,3425} + }, + { + {0,4193}, + {1,4180}, + {2,4169}, + {3,4158}, + {4,4148}, + {5,4137}, + {6,4128}, + {7,4119}, + {8,4110}, + {9,4101}, + {10,4093}, + {11,4087}, + {12,4079}, + {13,4071}, + {14,4062}, + {15,4050}, + {16,4038}, + {17,4025}, + {18,4013}, + {19,4002}, + {20,3992}, + {21,3983}, + {22,3974}, + {23,3967}, + {24,3959}, + {25,3952}, + {26,3946}, + {27,3939}, + {28,3933}, + {29,3926}, + {30,3920}, + {31,3914}, + {32,3908}, + {33,3901}, + {34,3895}, + {35,3889}, + {35,3883}, + {36,3877}, + {37,3871}, + {38,3866}, + {39,3860}, + {40,3855}, + {41,3850}, + {42,3845}, + {43,3841}, + {44,3836}, + {45,3832}, + {46,3828}, + {47,3824}, + {48,3821}, + {49,3817}, + {50,3814}, + {51,3810}, + {52,3807}, + {53,3804}, + {54,3802}, + {55,3799}, + {56,3796}, + {57,3794}, + {58,3792}, + {59,3790}, + {60,3788}, + {61,3786}, + {62,3785}, + {63,3783}, + {64,3782}, + {65,3780}, + {66,3779}, + {67,3777}, + {68,3775}, + {69,3774}, + {70,3772}, + {71,3770}, + {72,3768}, + {73,3766}, + {74,3764}, + {75,3761}, + {76,3758}, + {77,3755}, + {78,3752}, + {79,3749}, + {80,3746}, + {81,3742}, + {82,3738}, + {83,3734}, + {84,3729}, + {85,3724}, + {86,3719}, + {87,3713}, + {88,3707}, + {89,3703}, + {90,3699}, + {91,3694}, + {92,3690}, + {93,3685}, + {94,3679}, + {95,3667}, + {96,3647}, + {97,3615}, + {98,3573}, + {99,3521}, + {99,3450}, + {100,3419} + } + +}; + +/* Total data num: 103 */ +/* T0 r_profile N10C */ +R_PROFILE_STRUC r_profile_t0_0cycle[2][103] = { + { + {515,4168}, + {515,4153}, + {548,4141}, + {553,4131}, + {558,4121}, + {563,4111}, + {568,4102}, + {568,4094}, + {563,4083}, + {560,4077}, + {575,4074}, + {588,4070}, + {608,4069}, + {618,4061}, + {613,4045}, + {608,4022}, + {598,3996}, + {590,3977}, + {585,3963}, + {583,3953}, + {583,3945}, + {578,3936}, + {580,3930}, + {580,3919}, + {578,3914}, + {580,3910}, + {578,3905}, + {583,3901}, + {585,3898}, + {580,3893}, + {580,3888}, + {575,3881}, + {570,3874}, + {578,3869}, + {578,3863}, + {575,3857}, + {578,3852}, + {570,3844}, + {573,3839}, + {573,3834}, + {573,3829}, + {578,3826}, + {573,3819}, + {575,3814}, + {580,3811}, + {580,3807}, + {580,3802}, + {585,3800}, + {583,3796}, + {585,3792}, + {585,3787}, + {590,3785}, + {590,3781}, + {593,3779}, + {592,3776}, + {592,3772}, + {595,3770}, + {595,3767}, + {600,3766}, + {602,3764}, + {603,3762}, + {602,3760}, + {605,3759}, + {608,3759}, + {610,3757}, + {613,3756}, + {615,3755}, + {590,3752}, + {610,3751}, + {615,3750}, + {618,3749}, + {620,3748}, + {625,3746}, + {628,3744}, + {633,3743}, + {635,3740}, + {643,3738}, + {648,3735}, + {645,3731}, + {655,3729}, + {660,3725}, + {670,3723}, + {680,3719}, + {690,3714}, + {700,3709}, + {713,3704}, + {730,3698}, + {750,3693}, + {778,3689}, + {805,3684}, + {850,3681}, + {908,3676}, + {970,3669}, + {1060,3664}, + {1188,3657}, + {1353,3646}, + {1533,3628}, + {1693,3602}, + {1843,3563}, + {1810,3524}, + {1728,3491}, + {1643,3457}, + {1563,3425} + }, + { + {268,4193}, + {428,4180}, + {430,4169}, + {432,4158}, + {433,4148}, + {432,4137}, + {433,4128}, + {433,4119}, + {432,4110}, + {438,4101}, + {438,4093}, + {442,4087}, + {442,4079}, + {443,4071}, + {443,4062}, + {440,4050}, + {438,4038}, + {435,4025}, + {433,4013}, + {432,4002}, + {432,3992}, + {432,3983}, + {428,3974}, + {430,3967}, + {428,3959}, + {428,3952}, + {428,3946}, + {428,3939}, + {428,3933}, + {425,3926}, + {425,3920}, + {425,3914}, + {425,3908}, + {423,3901}, + {422,3895}, + {420,3889}, + {420,3883}, + {418,3877}, + {418,3871}, + {418,3866}, + {418,3860}, + {420,3855}, + {420,3850}, + {420,3845}, + {422,3841}, + {422,3836}, + {422,3832}, + {423,3828}, + {423,3824}, + {427,3821}, + {427,3817}, + {430,3814}, + {430,3810}, + {432,3807}, + {433,3804}, + {437,3802}, + {437,3799}, + {437,3796}, + {442,3794}, + {443,3792}, + {445,3790}, + {447,3788}, + {450,3786}, + {453,3785}, + {457,3783}, + {460,3782}, + {463,3780}, + {468,3779}, + {472,3777}, + {475,3775}, + {482,3774}, + {485,3772}, + {488,3770}, + {493,3768}, + {498,3766}, + {505,3764}, + {508,3761}, + {512,3758}, + {518,3755}, + {522,3752}, + {530,3749}, + {537,3746}, + {545,3742}, + {555,3738}, + {563,3734}, + {575,3729}, + {588,3724}, + {605,3719}, + {625,3713}, + {645,3707}, + {675,3703}, + {710,3699}, + {753,3694}, + {808,3690}, + {877,3685}, + {972,3679}, + {1082,3667}, + {1203,3647}, + {1335,3615}, + {1447,3573}, + {1535,3521}, + {1457,3450}, + {1390,3419} + } +}; + +/* The following data is 0 cycle aging data for temperature 0 C + Total data num: 103 + T1 0C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t1_0cycle[2][103] = { + { + {0,4182}, + {1,4169}, + {2,4158}, + {3,4149}, + {4,4139}, + {5,4130}, + {6,4121}, + {7,4112}, + {8,4104}, + {9,4096}, + {10,4091}, + {11,4090}, + {12,4088}, + {13,4083}, + {14,4070}, + {15,4049}, + {16,4022}, + {17,4003}, + {18,3990}, + {19,3979}, + {20,3971}, + {21,3965}, + {22,3959}, + {23,3955}, + {24,3950}, + {25,3946}, + {26,3943}, + {27,3941}, + {28,3937}, + {29,3933}, + {29,3928}, + {30,3922}, + {31,3914}, + {32,3907}, + {33,3899}, + {34,3893}, + {35,3885}, + {36,3877}, + {37,3871}, + {38,3864}, + {39,3858}, + {40,3852}, + {41,3847}, + {42,3841}, + {43,3836}, + {44,3832}, + {45,3828}, + {46,3823}, + {47,3820}, + {48,3816}, + {49,3812}, + {50,3809}, + {51,3806}, + {52,3803}, + {53,3800}, + {54,3797}, + {55,3796}, + {56,3792}, + {57,3790}, + {58,3788}, + {59,3786}, + {60,3784}, + {61,3782}, + {62,3780}, + {63,3780}, + {64,3779}, + {65,3778}, + {66,3777}, + {67,3776}, + {68,3775}, + {69,3775}, + {70,3773}, + {71,3772}, + {72,3770}, + {73,3769}, + {74,3768}, + {75,3766}, + {76,3764}, + {77,3762}, + {78,3760}, + {79,3757}, + {80,3754}, + {81,3751}, + {82,3746}, + {83,3741}, + {84,3737}, + {85,3732}, + {86,3727}, + {87,3720}, + {87,3714}, + {88,3706}, + {89,3702}, + {90,3698}, + {91,3696}, + {92,3694}, + {93,3692}, + {94,3688}, + {95,3680}, + {96,3660}, + {97,3620}, + {98,3562}, + {99,3484}, + {100,3400} + }, + { + {0,4195}, + {1,4184}, + {2,4173}, + {3,4163}, + {4,4153}, + {5,4143}, + {6,4134}, + {7,4124}, + {8,4115}, + {9,4106}, + {10,4098}, + {11,4090}, + {12,4085}, + {13,4078}, + {14,4069}, + {15,4059}, + {16,4047}, + {17,4036}, + {18,4024}, + {19,4014}, + {20,4004}, + {21,3995}, + {22,3987}, + {23,3980}, + {24,3973}, + {25,3966}, + {26,3960}, + {27,3954}, + {28,3948}, + {29,3942}, + {30,3936}, + {31,3929}, + {32,3922}, + {33,3915}, + {34,3908}, + {35,3900}, + {36,3893}, + {37,3886}, + {38,3879}, + {39,3873}, + {40,3866}, + {41,3861}, + {42,3855}, + {43,3850}, + {44,3846}, + {45,3841}, + {46,3837}, + {46,3832}, + {47,3829}, + {48,3825}, + {49,3821}, + {50,3818}, + {51,3815}, + {52,3812}, + {53,3809}, + {54,3806}, + {55,3803}, + {56,3800}, + {57,3798}, + {58,3796}, + {59,3793}, + {60,3791}, + {61,3789}, + {62,3787}, + {63,3786}, + {64,3784}, + {65,3783}, + {66,3781}, + {67,3780}, + {68,3778}, + {69,3776}, + {70,3774}, + {71,3772}, + {72,3769}, + {73,3767}, + {74,3765}, + {75,3762}, + {76,3759}, + {77,3756}, + {78,3753}, + {79,3750}, + {80,3746}, + {81,3742}, + {82,3737}, + {83,3733}, + {84,3728}, + {85,3724}, + {86,3719}, + {87,3712}, + {88,3705}, + {89,3700}, + {90,3697}, + {91,3694}, + {92,3691}, + {93,3687}, + {94,3680}, + {95,3669}, + {96,3644}, + {97,3605}, + {98,3556}, + {99,3494}, + {100,3411}, + {100,3411} + } +}; + +/* Total data num: 103*/ +/* T1 r_profile 0C */ +R_PROFILE_STRUC r_profile_t1_0cycle[2][103] = { + { + {295,4182}, + {295,4169}, + {298,4158}, + {305,4149}, + {308,4139}, + {310,4130}, + {315,4121}, + {315,4112}, + {318,4104}, + {315,4096}, + {318,4091}, + {333,4090}, + {343,4088}, + {350,4083}, + {350,4070}, + {348,4049}, + {340,4022}, + {340,4003}, + {343,3990}, + {338,3979}, + {338,3971}, + {343,3965}, + {340,3959}, + {345,3955}, + {343,3950}, + {343,3946}, + {345,3943}, + {350,3941}, + {348,3937}, + {348,3933}, + {348,3928}, + {345,3922}, + {338,3914}, + {335,3907}, + {330,3899}, + {328,3893}, + {323,3885}, + {318,3877}, + {318,3871}, + {310,3864}, + {310,3858}, + {308,3852}, + {308,3847}, + {305,3841}, + {300,3836}, + {303,3832}, + {305,3828}, + {300,3823}, + {300,3820}, + {303,3816}, + {300,3812}, + {303,3809}, + {303,3806}, + {303,3803}, + {303,3800}, + {300,3797}, + {308,3796}, + {303,3792}, + {305,3790}, + {305,3788}, + {308,3786}, + {308,3784}, + {308,3782}, + {305,3780}, + {310,3780}, + {310,3779}, + {310,3778}, + {310,3777}, + {310,3776}, + {313,3775}, + {315,3775}, + {313,3773}, + {315,3772}, + {313,3770}, + {315,3769}, + {318,3768}, + {318,3766}, + {320,3764}, + {320,3762}, + {323,3760}, + {323,3757}, + {323,3754}, + {325,3751}, + {323,3746}, + {323,3741}, + {325,3737}, + {328,3732}, + {328,3727}, + {328,3720}, + {330,3714}, + {330,3706}, + {333,3702}, + {335,3698}, + {345,3696}, + {358,3694}, + {373,3692}, + {395,3688}, + {418,3680}, + {440,3660}, + {468,3620}, + {535,3562}, + {663,3484}, + {945,3400} + }, + { + {225,4195}, + {220,4184}, + {222,4173}, + {222,4163}, + {223,4153}, + {225,4143}, + {227,4134}, + {227,4124}, + {227,4115}, + {228,4106}, + {230,4098}, + {230,4090}, + {228,4085}, + {233,4078}, + {233,4069}, + {233,4059}, + {233,4047}, + {235,4036}, + {235,4024}, + {237,4014}, + {235,4004}, + {235,3995}, + {235,3987}, + {238,3980}, + {238,3973}, + {238,3966}, + {238,3960}, + {240,3954}, + {240,3948}, + {240,3942}, + {240,3936}, + {238,3929}, + {237,3922}, + {235,3915}, + {233,3908}, + {230,3900}, + {228,3893}, + {227,3886}, + {225,3879}, + {225,3873}, + {222,3866}, + {223,3861}, + {222,3855}, + {222,3850}, + {223,3846}, + {217,3841}, + {222,3837}, + {222,3832}, + {223,3829}, + {217,3825}, + {215,3821}, + {212,3818}, + {222,3815}, + {225,3812}, + {225,3809}, + {225,3806}, + {225,3803}, + {225,3800}, + {225,3798}, + {228,3796}, + {225,3793}, + {223,3791}, + {222,3789}, + {225,3787}, + {230,3786}, + {232,3784}, + {233,3783}, + {233,3781}, + {235,3780}, + {237,3778}, + {237,3776}, + {238,3774}, + {233,3772}, + {233,3769}, + {232,3767}, + {242,3765}, + {242,3762}, + {242,3759}, + {245,3756}, + {245,3753}, + {250,3750}, + {252,3746}, + {253,3742}, + {250,3737}, + {250,3733}, + {250,3728}, + {260,3724}, + {265,3719}, + {267,3712}, + {268,3705}, + {272,3700}, + {282,3697}, + {293,3694}, + {307,3691}, + {322,3687}, + {333,3680}, + {355,3669}, + {373,3644}, + {435,3605}, + {498,3556}, + {597,3494}, + {757,3411}, + {757,3411} + } +}; + +/* The following data is 0 cycle aging data for temperature 25 C */ +/* Total data num: 103 */ +/* T2 25C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t2_0cycle[2][103] = { + { + {0,4190}, + {1,4174}, + {2,4163}, + {3,4152}, + {4,4142}, + {5,4133}, + {6,4123}, + {7,4115}, + {8,4106}, + {9,4097}, + {10,4090}, + {11,4087}, + {12,4085}, + {13,4081}, + {14,4071}, + {15,4054}, + {16,4034}, + {17,4018}, + {18,4005}, + {19,3996}, + {20,3988}, + {21,3982}, + {22,3976}, + {23,3972}, + {24,3969}, + {25,3968}, + {26,3965}, + {27,3960}, + {28,3955}, + {29,3947}, + {30,3942}, + {31,3936}, + {32,3931}, + {33,3926}, + {34,3920}, + {35,3914}, + {36,3909}, + {37,3904}, + {38,3899}, + {39,3893}, + {40,3886}, + {41,3880}, + {42,3873}, + {43,3865}, + {44,3855}, + {45,3847}, + {46,3841}, + {47,3834}, + {48,3828}, + {49,3824}, + {50,3821}, + {51,3817}, + {52,3814}, + {53,3811}, + {54,3808}, + {55,3806}, + {56,3803}, + {57,3800}, + {58,3797}, + {59,3795}, + {60,3793}, + {61,3791}, + {62,3790}, + {63,3787}, + {64,3786}, + {65,3785}, + {66,3783}, + {67,3782}, + {68,3781}, + {69,3781}, + {70,3780}, + {71,3779}, + {72,3777}, + {73,3776}, + {74,3775}, + {75,3771}, + {76,3770}, + {77,3767}, + {78,3764}, + {79,3761}, + {80,3757}, + {81,3754}, + {82,3750}, + {83,3748}, + {84,3744}, + {85,3739}, + {86,3733}, + {87,3726}, + {88,3721}, + {89,3717}, + {90,3708}, + {91,3700}, + {92,3697}, + {93,3695}, + {94,3694}, + {95,3693}, + {96,3692}, + {97,3689}, + {98,3682}, + {99,3659}, + {100,3615}, + {100,3600}, + {100,3600} + }, + { + {0,4190}, + {1,4178}, + {2,4167}, + {3,4157}, + {4,4146}, + {5,4136}, + {6,4126}, + {7,4116}, + {8,4108}, + {9,4098}, + {10,4090}, + {11,4082}, + {12,4077}, + {13,4070}, + {14,4061}, + {15,4049}, + {16,4038}, + {17,4027}, + {18,4017}, + {19,4007}, + {20,3999}, + {21,3991}, + {22,3984}, + {23,3978}, + {24,3972}, + {25,3968}, + {26,3963}, + {27,3956}, + {28,3950}, + {29,3944}, + {30,3938}, + {31,3932}, + {32,3925}, + {33,3919}, + {34,3913}, + {35,3907}, + {36,3900}, + {37,3893}, + {38,3884}, + {39,3875}, + {40,3867}, + {41,3859}, + {42,3852}, + {43,3847}, + {44,3841}, + {45,3836}, + {46,3832}, + {47,3828}, + {48,3824}, + {49,3820}, + {50,3816}, + {51,3813}, + {52,3810}, + {53,3806}, + {54,3804}, + {55,3801}, + {56,3798}, + {57,3795}, + {58,3793}, + {59,3791}, + {60,3788}, + {61,3787}, + {62,3784}, + {63,3782}, + {64,3781}, + {65,3779}, + {66,3778}, + {67,3777}, + {68,3775}, + {69,3774}, + {70,3772}, + {71,3769}, + {72,3766}, + {73,3762}, + {74,3759}, + {75,3756}, + {76,3751}, + {77,3748}, + {78,3745}, + {79,3743}, + {80,3739}, + {81,3735}, + {82,3731}, + {83,3727}, + {84,3721}, + {85,3717}, + {86,3713}, + {87,3707}, + {88,3700}, + {89,3694}, + {90,3689}, + {91,3687}, + {92,3684}, + {93,3682}, + {94,3679}, + {95,3671}, + {96,3653}, + {97,3619}, + {98,3574}, + {99,3518}, + {100,3445}, + {100,3445}, + {100,3445} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 25C */ +R_PROFILE_STRUC r_profile_t2_0cycle[2][103] = { + { + {123,4190}, + {123,4174}, + {128,4163}, + {125,4152}, + {128,4142}, + {128,4133}, + {128,4123}, + {133,4115}, + {130,4106}, + {130,4097}, + {128,4090}, + {132,4087}, + {138,4085}, + {143,4081}, + {140,4071}, + {140,4054}, + {138,4034}, + {140,4018}, + {140,4005}, + {158,3996}, + {158,3988}, + {155,3982}, + {158,3976}, + {158,3972}, + {165,3969}, + {165,3968}, + {165,3965}, + {168,3960}, + {168,3955}, + {170,3947}, + {170,3942}, + {173,3936}, + {173,3931}, + {175,3926}, + {175,3920}, + {180,3914}, + {180,3909}, + {183,3904}, + {185,3899}, + {183,3893}, + {180,3886}, + {178,3880}, + {170,3873}, + {148,3865}, + {140,3855}, + {138,3847}, + {133,3841}, + {128,3834}, + {128,3828}, + {128,3824}, + {130,3821}, + {133,3817}, + {133,3814}, + {130,3811}, + {135,3808}, + {133,3806}, + {133,3803}, + {130,3800}, + {133,3797}, + {130,3795}, + {135,3793}, + {158,3791}, + {153,3790}, + {158,3787}, + {158,3786}, + {155,3785}, + {158,3783}, + {158,3782}, + {158,3781}, + {158,3781}, + {158,3780}, + {153,3779}, + {155,3777}, + {155,3776}, + {150,3775}, + {153,3771}, + {150,3770}, + {148,3767}, + {153,3764}, + {150,3761}, + {153,3757}, + {148,3754}, + {153,3750}, + {153,3748}, + {153,3744}, + {148,3739}, + {150,3733}, + {150,3726}, + {155,3721}, + {148,3717}, + {150,3708}, + {153,3700}, + {130,3697}, + {133,3695}, + {138,3694}, + {145,3693}, + {150,3692}, + {150,3689}, + {148,3682}, + {150,3659}, + {160,3615}, + {165,3600}, + {180,3600} + }, + { + {138,4190}, + {138,4178}, + {138,4167}, + {142,4157}, + {138,4146}, + {140,4136}, + {142,4126}, + {140,4116}, + {143,4108}, + {142,4098}, + {143,4090}, + {143,4082}, + {147,4077}, + {145,4070}, + {145,4061}, + {142,4049}, + {142,4038}, + {143,4027}, + {145,4017}, + {145,4007}, + {147,3999}, + {145,3991}, + {143,3984}, + {145,3978}, + {145,3972}, + {148,3968}, + {148,3963}, + {147,3956}, + {147,3950}, + {150,3944}, + {153,3938}, + {155,3932}, + {153,3925}, + {155,3919}, + {157,3913}, + {157,3907}, + {157,3900}, + {155,3893}, + {152,3884}, + {148,3875}, + {147,3867}, + {145,3859}, + {143,3852}, + {143,3847}, + {142,3841}, + {142,3836}, + {142,3832}, + {142,3828}, + {143,3824}, + {142,3820}, + {142,3816}, + {142,3813}, + {142,3810}, + {142,3806}, + {142,3804}, + {142,3801}, + {142,3798}, + {142,3795}, + {143,3793}, + {143,3791}, + {143,3788}, + {145,3787}, + {142,3784}, + {142,3782}, + {145,3781}, + {145,3779}, + {147,3778}, + {147,3777}, + {145,3775}, + {145,3774}, + {145,3772}, + {143,3769}, + {143,3766}, + {143,3762}, + {145,3759}, + {145,3756}, + {142,3751}, + {143,3748}, + {143,3745}, + {145,3743}, + {143,3739}, + {145,3735}, + {145,3731}, + {147,3727}, + {143,3721}, + {147,3717}, + {148,3713}, + {147,3707}, + {147,3700}, + {148,3694}, + {150,3689}, + {152,3687}, + {152,3684}, + {155,3682}, + {160,3679}, + {162,3671}, + {162,3653}, + {163,3619}, + {168,3574}, + {175,3518}, + {188,3445}, + {188,3445}, + {188,3445} + } +}; + +/* The following data is 0 cycle aging data for temperature 55 C */ +/* Total data num: 103 */ +/* T3 50C:{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t3_0cycle[2][103] = { + { + {0,4162}, + {1,4151}, + {2,4141}, + {3,4132}, + {4,4122}, + {5,4113}, + {6,4105}, + {7,4095}, + {8,4086}, + {9,4079}, + {10,4071}, + {11,4063}, + {12,4059}, + {13,4053}, + {14,4043}, + {15,4029}, + {16,4017}, + {17,4007}, + {18,4000}, + {19,3997}, + {20,3992}, + {21,3986}, + {22,3978}, + {23,3972}, + {24,3966}, + {25,3960}, + {26,3953}, + {27,3947}, + {28,3941}, + {29,3935}, + {30,3930}, + {31,3925}, + {32,3917}, + {33,3912}, + {34,3907}, + {35,3903}, + {36,3898}, + {37,3891}, + {38,3886}, + {39,3881}, + {40,3876}, + {41,3872}, + {42,3865}, + {43,3855}, + {44,3845}, + {45,3837}, + {46,3828}, + {47,3823}, + {48,3819}, + {49,3816}, + {50,3812}, + {52,3808}, + {53,3805}, + {54,3802}, + {55,3798}, + {56,3796}, + {57,3793}, + {58,3791}, + {59,3790}, + {60,3787}, + {61,3785}, + {62,3783}, + {63,3781}, + {64,3780}, + {65,3777}, + {66,3775}, + {67,3774}, + {68,3772}, + {69,3771}, + {70,3770}, + {71,3769}, + {72,3767}, + {73,3765}, + {74,3760}, + {75,3754}, + {76,3750}, + {77,3745}, + {78,3743}, + {79,3740}, + {80,3736}, + {81,3733}, + {82,3730}, + {83,3726}, + {84,3724}, + {85,3720}, + {86,3714}, + {87,3708}, + {88,3702}, + {89,3697}, + {90,3692}, + {91,3682}, + {92,3678}, + {93,3677}, + {94,3676}, + {95,3676}, + {96,3673}, + {97,3671}, + {98,3666}, + {99,3642}, + {100,3602}, + {100,3600}, + {100,3600}, + {100,3600} + }, + { + {0,4179}, + {1,4168}, + {2,4157}, + {3,4147}, + {4,4137}, + {5,4127}, + {6,4118}, + {7,4108}, + {8,4098}, + {9,4089}, + {10,4080}, + {11,4071}, + {12,4063}, + {13,4054}, + {14,4046}, + {15,4038}, + {16,4029}, + {17,4020}, + {18,4010}, + {19,4004}, + {20,3997}, + {21,3990}, + {22,3982}, + {23,3975}, + {24,3969}, + {25,3961}, + {26,3955}, + {27,3948}, + {28,3941}, + {29,3934}, + {30,3928}, + {31,3922}, + {32,3916}, + {33,3910}, + {34,3903}, + {35,3898}, + {36,3890}, + {37,3883}, + {38,3874}, + {39,3865}, + {40,3857}, + {41,3850}, + {42,3843}, + {43,3838}, + {44,3832}, + {45,3828}, + {46,3824}, + {47,3820}, + {48,3816}, + {49,3812}, + {50,3809}, + {51,3805}, + {53,3801}, + {54,3799}, + {55,3796}, + {56,3793}, + {57,3790}, + {58,3787}, + {59,3785}, + {60,3783}, + {61,3780}, + {62,3779}, + {63,3776}, + {64,3774}, + {65,3772}, + {66,3770}, + {67,3769}, + {68,3767}, + {69,3763}, + {70,3756}, + {71,3750}, + {72,3746}, + {73,3741}, + {74,3738}, + {75,3734}, + {76,3731}, + {77,3727}, + {78,3724}, + {79,3721}, + {80,3718}, + {81,3715}, + {82,3711}, + {83,3707}, + {84,3702}, + {85,3697}, + {86,3692}, + {87,3687}, + {88,3680}, + {89,3674}, + {90,3671}, + {91,3668}, + {92,3666}, + {93,3663}, + {94,3658}, + {95,3647}, + {96,3621}, + {97,3584}, + {98,3538}, + {99,3480}, + {100,3403}, + {100,3403}, + {100,3403}, + {100,3403} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 50C */ +R_PROFILE_STRUC r_profile_t3_0cycle[2][103] = { + { + {95,4162}, + {95,4151}, + {95,4141}, + {97,4132}, + {92,4122}, + {90,4113}, + {95,4105}, + {95,4094}, + {93,4086}, + {95,4078}, + {100,4070}, + {95,4062}, + {98,4059}, + {98,4053}, + {100,4043}, + {97,4029}, + {98,4017}, + {97,4006}, + {95,4000}, + {112,3997}, + {113,3992}, + {115,3986}, + {115,3978}, + {115,3972}, + {115,3966}, + {115,3960}, + {117,3953}, + {117,3947}, + {117,3941}, + {117,3935}, + {118,3930}, + {119,3925}, + {120,3917}, + {122,3912}, + {123,3907}, + {133,3903}, + {133,3898}, + {130,3891}, + {130,3886}, + {133,3881}, + {135,3876}, + {140,3872}, + {140,3865}, + {130,3855}, + {110,3845}, + {108,3837}, + {97,3828}, + {98,3823}, + {95,3819}, + {97,3816}, + {92,3812}, + {95,3808}, + {95,3805}, + {98,3802}, + {92,3798}, + {95,3796}, + {93,3793}, + {95,3791}, + {98,3790}, + {98,3787}, + {98,3785}, + {115,3783}, + {120,3781}, + {120,3780}, + {120,3777}, + {117,3775}, + {120,3774}, + {120,3772}, + {120,3771}, + {120,3770}, + {120,3769}, + {120,3767}, + {118,3765}, + {110,3760}, + {112,3754}, + {118,3750}, + {110,3745}, + {112,3743}, + {113,3740}, + {110,3736}, + {112,3733}, + {112,3730}, + {110,3726}, + {115,3724}, + {115,3720}, + {112,3714}, + {110,3708}, + {112,3702}, + {112,3697}, + {118,3692}, + {110,3682}, + {112,3678}, + {115,3677}, + {95,3676}, + {98,3676}, + {98,3673}, + {100,3671}, + {110,3666}, + {97,3642}, + {105,3602}, + {107,3600}, + {115,3600}, + {128,3600} + }, + { + {110,4179}, + {112,4168}, + {110,4157}, + {112,4147}, + {112,4137}, + {112,4127}, + {113,4118}, + {113,4108}, + {112,4098}, + {112,4089}, + {112,4080}, + {112,4071}, + {113,4063}, + {113,4054}, + {113,4046}, + {113,4038}, + {113,4029}, + {115,4020}, + {113,4010}, + {117,4004}, + {115,3997}, + {115,3990}, + {115,3982}, + {115,3975}, + {117,3969}, + {117,3961}, + {117,3955}, + {118,3948}, + {118,3941}, + {117,3934}, + {118,3928}, + {120,3922}, + {120,3916}, + {122,3910}, + {120,3903}, + {123,3898}, + {120,3890}, + {120,3883}, + {118,3874}, + {117,3865}, + {117,3857}, + {115,3850}, + {113,3843}, + {113,3838}, + {112,3832}, + {112,3828}, + {113,3824}, + {113,3820}, + {113,3816}, + {113,3812}, + {113,3809}, + {113,3805}, + {112,3801}, + {113,3799}, + {113,3796}, + {113,3793}, + {113,3790}, + {113,3787}, + {113,3785}, + {115,3783}, + {115,3780}, + {118,3779}, + {115,3776}, + {117,3774}, + {117,3772}, + {117,3770}, + {120,3769}, + {120,3767}, + {118,3763}, + {112,3756}, + {113,3750}, + {115,3746}, + {113,3741}, + {115,3738}, + {113,3734}, + {115,3731}, + {113,3727}, + {113,3724}, + {115,3721}, + {113,3718}, + {115,3715}, + {115,3711}, + {117,3707}, + {115,3702}, + {115,3697}, + {115,3692}, + {117,3687}, + {115,3680}, + {115,3674}, + {115,3671}, + {115,3668}, + {117,3666}, + {120,3663}, + {123,3658}, + {122,3647}, + {120,3621}, + {120,3584}, + {123,3538}, + {127,3480}, + {133,3403}, + {133,3403}, + {133,3403}, + {133,3403} + } +}; + +/* The following data is 500 cycle aging data for temperature -10 C */ +/* Total data num: 103 */ +/* T0 -10C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t0_500cycle[2][103] = { + { + {0,4168}, + {1,4153}, + {2,4141}, + {3,4131}, + {4,4121}, + {5,4111}, + {6,4102}, + {7,4094}, + {8,4083}, + {9,4077}, + {10,4074}, + {11,4070}, + {12,4069}, + {13,4061}, + {14,4045}, + {15,4022}, + {16,3996}, + {17,3977}, + {18,3963}, + {19,3953}, + {20,3945}, + {21,3936}, + {22,3930}, + {23,3919}, + {24,3914}, + {25,3910}, + {26,3905}, + {27,3901}, + {28,3898}, + {29,3893}, + {30,3888}, + {31,3881}, + {32,3874}, + {33,3869}, + {34,3863}, + {35,3857}, + {36,3852}, + {37,3844}, + {38,3839}, + {39,3834}, + {40,3829}, + {41,3826}, + {42,3819}, + {43,3814}, + {44,3811}, + {45,3807}, + {46,3802}, + {47,3800}, + {48,3796}, + {49,3792}, + {50,3787}, + {51,3785}, + {52,3781}, + {53,3779}, + {54,3776}, + {55,3772}, + {56,3770}, + {57,3767}, + {58,3766}, + {59,3764}, + {60,3762}, + {61,3760}, + {62,3759}, + {63,3759}, + {64,3757}, + {65,3756}, + {66,3755}, + {67,3752}, + {68,3751}, + {69,3750}, + {70,3749}, + {71,3748}, + {72,3746}, + {73,3744}, + {74,3743}, + {75,3740}, + {76,3738}, + {77,3735}, + {78,3731}, + {79,3729}, + {80,3725}, + {81,3723}, + {82,3719}, + {83,3714}, + {84,3709}, + {85,3704}, + {86,3698}, + {87,3693}, + {88,3689}, + {89,3684}, + {90,3681}, + {91,3676}, + {92,3669}, + {93,3664}, + {94,3657}, + {95,3646}, + {96,3628}, + {97,3602}, + {98,3563}, + {98,3524}, + {99,3491}, + {99,3457}, + {100,3425} + }, + { + {0,4193}, + {1,4180}, + {2,4169}, + {3,4158}, + {4,4148}, + {5,4137}, + {6,4128}, + {7,4119}, + {8,4110}, + {9,4101}, + {10,4093}, + {11,4087}, + {12,4079}, + {13,4071}, + {14,4062}, + {15,4050}, + {16,4038}, + {17,4025}, + {18,4013}, + {19,4002}, + {20,3992}, + {21,3983}, + {22,3974}, + {23,3967}, + {24,3959}, + {25,3952}, + {26,3946}, + {27,3939}, + {28,3933}, + {29,3926}, + {30,3920}, + {31,3914}, + {32,3908}, + {33,3901}, + {34,3895}, + {35,3889}, + {35,3883}, + {36,3877}, + {37,3871}, + {38,3866}, + {39,3860}, + {40,3855}, + {41,3850}, + {42,3845}, + {43,3841}, + {44,3836}, + {45,3832}, + {46,3828}, + {47,3824}, + {48,3821}, + {49,3817}, + {50,3814}, + {51,3810}, + {52,3807}, + {53,3804}, + {54,3802}, + {55,3799}, + {56,3796}, + {57,3794}, + {58,3792}, + {59,3790}, + {60,3788}, + {61,3786}, + {62,3785}, + {63,3783}, + {64,3782}, + {65,3780}, + {66,3779}, + {67,3777}, + {68,3775}, + {69,3774}, + {70,3772}, + {71,3770}, + {72,3768}, + {73,3766}, + {74,3764}, + {75,3761}, + {76,3758}, + {77,3755}, + {78,3752}, + {79,3749}, + {80,3746}, + {81,3742}, + {82,3738}, + {83,3734}, + {84,3729}, + {85,3724}, + {86,3719}, + {87,3713}, + {88,3707}, + {89,3703}, + {90,3699}, + {91,3694}, + {92,3690}, + {93,3685}, + {94,3679}, + {95,3667}, + {96,3647}, + {97,3615}, + {98,3573}, + {99,3521}, + {99,3450}, + {100,3419} + } + +}; + +/* Total data num: 103 */ +/* T0 r_profile N10C */ +R_PROFILE_STRUC r_profile_t0_500cycle[2][103] = { + { + {515,4168}, + {515,4153}, + {548,4141}, + {553,4131}, + {558,4121}, + {563,4111}, + {568,4102}, + {568,4094}, + {563,4083}, + {560,4077}, + {575,4074}, + {588,4070}, + {608,4069}, + {618,4061}, + {613,4045}, + {608,4022}, + {598,3996}, + {590,3977}, + {585,3963}, + {583,3953}, + {583,3945}, + {578,3936}, + {580,3930}, + {580,3919}, + {578,3914}, + {580,3910}, + {578,3905}, + {583,3901}, + {585,3898}, + {580,3893}, + {580,3888}, + {575,3881}, + {570,3874}, + {578,3869}, + {578,3863}, + {575,3857}, + {578,3852}, + {570,3844}, + {573,3839}, + {573,3834}, + {573,3829}, + {578,3826}, + {573,3819}, + {575,3814}, + {580,3811}, + {580,3807}, + {580,3802}, + {585,3800}, + {583,3796}, + {585,3792}, + {585,3787}, + {590,3785}, + {590,3781}, + {593,3779}, + {592,3776}, + {592,3772}, + {595,3770}, + {595,3767}, + {600,3766}, + {602,3764}, + {603,3762}, + {602,3760}, + {605,3759}, + {608,3759}, + {610,3757}, + {613,3756}, + {615,3755}, + {590,3752}, + {610,3751}, + {615,3750}, + {618,3749}, + {620,3748}, + {625,3746}, + {628,3744}, + {633,3743}, + {635,3740}, + {643,3738}, + {648,3735}, + {645,3731}, + {655,3729}, + {660,3725}, + {670,3723}, + {680,3719}, + {690,3714}, + {700,3709}, + {713,3704}, + {730,3698}, + {750,3693}, + {778,3689}, + {805,3684}, + {850,3681}, + {908,3676}, + {970,3669}, + {1060,3664}, + {1188,3657}, + {1353,3646}, + {1533,3628}, + {1693,3602}, + {1843,3563}, + {1810,3524}, + {1728,3491}, + {1643,3457}, + {1563,3425} + }, + { + {268,4193}, + {428,4180}, + {430,4169}, + {432,4158}, + {433,4148}, + {432,4137}, + {433,4128}, + {433,4119}, + {432,4110}, + {438,4101}, + {438,4093}, + {442,4087}, + {442,4079}, + {443,4071}, + {443,4062}, + {440,4050}, + {438,4038}, + {435,4025}, + {433,4013}, + {432,4002}, + {432,3992}, + {432,3983}, + {428,3974}, + {430,3967}, + {428,3959}, + {428,3952}, + {428,3946}, + {428,3939}, + {428,3933}, + {425,3926}, + {425,3920}, + {425,3914}, + {425,3908}, + {423,3901}, + {422,3895}, + {420,3889}, + {420,3883}, + {418,3877}, + {418,3871}, + {418,3866}, + {418,3860}, + {420,3855}, + {420,3850}, + {420,3845}, + {422,3841}, + {422,3836}, + {422,3832}, + {423,3828}, + {423,3824}, + {427,3821}, + {427,3817}, + {430,3814}, + {430,3810}, + {432,3807}, + {433,3804}, + {437,3802}, + {437,3799}, + {437,3796}, + {442,3794}, + {443,3792}, + {445,3790}, + {447,3788}, + {450,3786}, + {453,3785}, + {457,3783}, + {460,3782}, + {463,3780}, + {468,3779}, + {472,3777}, + {475,3775}, + {482,3774}, + {485,3772}, + {488,3770}, + {493,3768}, + {498,3766}, + {505,3764}, + {508,3761}, + {512,3758}, + {518,3755}, + {522,3752}, + {530,3749}, + {537,3746}, + {545,3742}, + {555,3738}, + {563,3734}, + {575,3729}, + {588,3724}, + {605,3719}, + {625,3713}, + {645,3707}, + {675,3703}, + {710,3699}, + {753,3694}, + {808,3690}, + {877,3685}, + {972,3679}, + {1082,3667}, + {1203,3647}, + {1335,3615}, + {1447,3573}, + {1535,3521}, + {1457,3450}, + {1390,3419} + } +}; + +/* The following data is 500 cycle aging data for temperature 0 C + Total data num: 103 + T1 0C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t1_500cycle[2][103] = { + { + {0,4192}, + {1,4176}, + {2,4165}, + {3,4154}, + {4,4144}, + {5,4134}, + {6,4125}, + {7,4116}, + {8,4107}, + {9,4099}, + {10,4091}, + {11,4084}, + {12,4076}, + {13,4067}, + {14,4059}, + {15,4049}, + {16,4039}, + {17,4029}, + {18,4019}, + {19,4011}, + {20,4003}, + {21,3995}, + {22,3988}, + {23,3982}, + {24,3976}, + {25,3971}, + {26,3966}, + {27,3960}, + {28,3955}, + {29,3949}, + {30,3943}, + {31,3936}, + {32,3930}, + {33,3923}, + {34,3917}, + {35,3910}, + {36,3901}, + {37,3892}, + {38,3882}, + {39,3871}, + {41,3862}, + {42,3855}, + {43,3848}, + {44,3842}, + {45,3837}, + {46,3832}, + {47,3828}, + {48,3824}, + {49,3821}, + {50,3816}, + {51,3813}, + {52,3810}, + {53,3808}, + {54,3804}, + {55,3802}, + {56,3799}, + {57,3797}, + {58,3795}, + {59,3793}, + {60,3792}, + {61,3790}, + {62,3789}, + {63,3788}, + {64,3786}, + {65,3784}, + {66,3783}, + {67,3781}, + {68,3780}, + {69,3778}, + {70,3776}, + {71,3775}, + {72,3772}, + {73,3769}, + {74,3767}, + {75,3764}, + {76,3760}, + {77,3756}, + {78,3752}, + {79,3749}, + {80,3744}, + {81,3740}, + {82,3735}, + {83,3730}, + {84,3724}, + {85,3717}, + {86,3711}, + {87,3704}, + {88,3698}, + {89,3693}, + {90,3688}, + {91,3684}, + {92,3680}, + {93,3676}, + {94,3669}, + {95,3657}, + {96,3635}, + {97,3599}, + {98,3546}, + {99,3472}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400} + }, + { + {0,4190}, + {1,4176}, + {2,4164}, + {3,4153}, + {4,4142}, + {5,4131}, + {6,4121}, + {7,4111}, + {8,4102}, + {9,4094}, + {10,4087}, + {11,4079}, + {12,4071}, + {13,4060}, + {15,4047}, + {16,4035}, + {17,4023}, + {18,4012}, + {19,4002}, + {20,3993}, + {21,3985}, + {22,3978}, + {23,3971}, + {24,3965}, + {25,3959}, + {26,3954}, + {27,3948}, + {28,3943}, + {29,3937}, + {30,3931}, + {31,3924}, + {32,3916}, + {33,3908}, + {34,3898}, + {35,3889}, + {36,3880}, + {37,3871}, + {38,3863}, + {39,3856}, + {40,3850}, + {41,3845}, + {43,3839}, + {44,3834}, + {45,3830}, + {46,3826}, + {47,3822}, + {48,3818}, + {49,3814}, + {50,3810}, + {51,3807}, + {52,3804}, + {53,3801}, + {54,3798}, + {55,3796}, + {56,3794}, + {57,3792}, + {58,3790}, + {59,3788}, + {60,3787}, + {61,3786}, + {62,3785}, + {63,3784}, + {64,3783}, + {65,3781}, + {66,3780}, + {67,3779}, + {68,3777}, + {69,3775}, + {71,3772}, + {72,3769}, + {73,3766}, + {74,3762}, + {75,3758}, + {76,3755}, + {77,3751}, + {78,3748}, + {79,3744}, + {80,3740}, + {81,3735}, + {82,3730}, + {83,3725}, + {84,3719}, + {85,3714}, + {86,3707}, + {87,3701}, + {88,3694}, + {89,3688}, + {90,3684}, + {91,3680}, + {92,3676}, + {93,3671}, + {94,3663}, + {95,3645}, + {96,3612}, + {97,3568}, + {98,3531}, + {99,3503}, + {99,3479}, + {99,3457}, + {100,3435}, + {100,3415}, + {100,3400}, + {100,3400} + } +}; + +/* Total data num: 103*/ +/* T1 r_profile 0C */ +R_PROFILE_STRUC r_profile_t1_500cycle[2][103] = { + { + {455,4192}, + {455,4176}, + {463,4165}, + {463,4154}, + {468,4144}, + {465,4134}, + {465,4125}, + {470,4116}, + {468,4107}, + {470,4099}, + {478,4091}, + {482,4084}, + {482,4076}, + {485,4067}, + {488,4059}, + {485,4049}, + {488,4039}, + {488,4029}, + {488,4019}, + {490,4011}, + {495,4003}, + {495,3995}, + {498,3988}, + {502,3982}, + {500,3976}, + {508,3971}, + {513,3966}, + {515,3960}, + {525,3955}, + {522,3949}, + {528,3943}, + {528,3936}, + {530,3930}, + {530,3923}, + {532,3917}, + {535,3910}, + {528,3901}, + {525,3892}, + {515,3882}, + {507,3871}, + {498,3862}, + {498,3855}, + {498,3848}, + {495,3842}, + {493,3837}, + {495,3832}, + {498,3828}, + {498,3824}, + {500,3821}, + {502,3816}, + {508,3813}, + {513,3810}, + {515,3808}, + {518,3804}, + {523,3802}, + {525,3799}, + {533,3797}, + {540,3795}, + {550,3793}, + {558,3792}, + {565,3790}, + {575,3789}, + {585,3788}, + {593,3786}, + {602,3784}, + {613,3783}, + {615,3781}, + {625,3780}, + {635,3778}, + {642,3776}, + {660,3775}, + {665,3772}, + {675,3769}, + {688,3767}, + {700,3764}, + {708,3760}, + {720,3756}, + {730,3752}, + {750,3749}, + {763,3744}, + {780,3740}, + {800,3735}, + {815,3730}, + {833,3724}, + {853,3717}, + {870,3711}, + {898,3704}, + {922,3698}, + {950,3693}, + {983,3688}, + {1013,3684}, + {1060,3680}, + {1115,3676}, + {1175,3669}, + {1225,3657}, + {1283,3635}, + {1340,3599}, + {1410,3546}, + {1500,3472}, + {1503,3400}, + {1503,3400}, + {1503,3400}, + {1503,3400} + }, + { + {225,4190}, + {363,4176}, + {367,4164}, + {368,4153}, + {370,4142}, + {368,4131}, + {370,4121}, + {370,4111}, + {372,4102}, + {375,4094}, + {380,4087}, + {382,4079}, + {383,4071}, + {383,4060}, + {380,4047}, + {380,4035}, + {378,4023}, + {378,4012}, + {380,4002}, + {377,3993}, + {378,3985}, + {380,3978}, + {382,3971}, + {385,3965}, + {387,3959}, + {390,3954}, + {392,3948}, + {395,3943}, + {397,3937}, + {398,3931}, + {400,3924}, + {398,3916}, + {398,3908}, + {395,3898}, + {393,3889}, + {392,3880}, + {388,3871}, + {388,3863}, + {388,3856}, + {388,3850}, + {390,3845}, + {390,3839}, + {392,3834}, + {395,3830}, + {397,3826}, + {400,3822}, + {402,3818}, + {403,3814}, + {405,3810}, + {407,3807}, + {410,3804}, + {413,3801}, + {415,3798}, + {418,3796}, + {422,3794}, + {425,3792}, + {428,3790}, + {432,3788}, + {437,3787}, + {443,3786}, + {448,3785}, + {455,3784}, + {462,3783}, + {467,3781}, + {473,3780}, + {482,3779}, + {487,3777}, + {495,3775}, + {500,3772}, + {507,3769}, + {517,3766}, + {523,3762}, + {532,3758}, + {542,3755}, + {553,3751}, + {567,3748}, + {578,3744}, + {595,3740}, + {610,3735}, + {628,3730}, + {650,3725}, + {673,3719}, + {702,3714}, + {733,3707}, + {772,3701}, + {817,3694}, + {872,3688}, + {940,3684}, + {1018,3680}, + {1110,3676}, + {1202,3671}, + {1288,3663}, + {1363,3645}, + {1438,3612}, + {1533,3568}, + {1560,3531}, + {1527,3503}, + {1492,3479}, + {1430,3457}, + {1427,3435}, + {1405,3415}, + {1415,3400}, + {1415,3400} + } +}; + +/* The following data is 500 cycle aging data for temperature 25 C */ +/* Total data num: 103 */ +/* T2 25C{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t2_500cycle[2][103] = { + { + {0,4181}, + {1,4168}, + {2,4157}, + {3,4146}, + {4,4137}, + {5,4126}, + {6,4117}, + {7,4107}, + {8,4098}, + {9,4090}, + {10,4081}, + {11,4073}, + {12,4066}, + {13,4058}, + {14,4050}, + {15,4041}, + {16,4032}, + {18,4023}, + {19,4014}, + {20,4006}, + {21,3999}, + {22,3992}, + {23,3986}, + {24,3980}, + {25,3973}, + {26,3968}, + {27,3962}, + {28,3955}, + {29,3949}, + {30,3943}, + {31,3937}, + {32,3931}, + {33,3925}, + {34,3920}, + {35,3913}, + {36,3905}, + {37,3896}, + {38,3885}, + {39,3874}, + {40,3866}, + {41,3858}, + {42,3852}, + {43,3847}, + {44,3841}, + {45,3836}, + {46,3831}, + {47,3827}, + {48,3823}, + {49,3819}, + {51,3815}, + {52,3812}, + {53,3808}, + {54,3805}, + {55,3802}, + {56,3799}, + {57,3796}, + {58,3794}, + {59,3791}, + {60,3789}, + {61,3786}, + {62,3784}, + {63,3782}, + {64,3780}, + {65,3778}, + {66,3776}, + {67,3774}, + {68,3772}, + {69,3769}, + {70,3767}, + {71,3764}, + {72,3760}, + {73,3757}, + {74,3753}, + {75,3748}, + {76,3744}, + {77,3741}, + {78,3738}, + {79,3734}, + {80,3731}, + {81,3727}, + {82,3722}, + {83,3717}, + {85,3711}, + {86,3705}, + {87,3699}, + {88,3692}, + {89,3684}, + {90,3680}, + {91,3677}, + {92,3674}, + {93,3672}, + {94,3668}, + {95,3662}, + {96,3645}, + {97,3610}, + {98,3562}, + {99,3495}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400} + }, + { + {0,4187}, + {1,4175}, + {2,4164}, + {3,4154}, + {4,4144}, + {5,4134}, + {6,4124}, + {7,4115}, + {8,4105}, + {9,4097}, + {10,4087}, + {11,4079}, + {12,4074}, + {13,4067}, + {14,4058}, + {15,4046}, + {16,4035}, + {18,4024}, + {19,4014}, + {20,4005}, + {21,3996}, + {22,3988}, + {23,3981}, + {24,3976}, + {25,3970}, + {26,3966}, + {27,3961}, + {28,3955}, + {29,3949}, + {30,3942}, + {31,3936}, + {32,3930}, + {33,3924}, + {34,3916}, + {35,3906}, + {36,3894}, + {37,3883}, + {38,3874}, + {39,3867}, + {40,3860}, + {41,3855}, + {42,3849}, + {43,3844}, + {44,3839}, + {45,3834}, + {46,3831}, + {47,3826}, + {48,3823}, + {49,3819}, + {50,3815}, + {52,3812}, + {53,3809}, + {54,3805}, + {55,3802}, + {56,3800}, + {57,3797}, + {58,3794}, + {59,3792}, + {60,3789}, + {61,3787}, + {62,3785}, + {63,3783}, + {64,3781}, + {65,3780}, + {66,3778}, + {67,3776}, + {68,3774}, + {69,3770}, + {70,3766}, + {71,3761}, + {72,3757}, + {73,3753}, + {74,3749}, + {75,3746}, + {76,3743}, + {77,3740}, + {78,3736}, + {79,3733}, + {80,3730}, + {81,3726}, + {82,3721}, + {83,3717}, + {85,3711}, + {86,3706}, + {87,3700}, + {88,3694}, + {89,3687}, + {90,3684}, + {91,3681}, + {92,3679}, + {93,3675}, + {94,3670}, + {95,3662}, + {96,3638}, + {97,3599}, + {98,3551}, + {99,3489}, + {100,3405}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 25C */ +R_PROFILE_STRUC r_profile_t2_500cycle[2][103] = { + { + {140,4181}, + {140,4168}, + {143,4157}, + {140,4146}, + {145,4137}, + {143,4126}, + {145,4117}, + {143,4107}, + {143,4098}, + {145,4090}, + {145,4081}, + {145,4073}, + {148,4066}, + {148,4058}, + {148,4050}, + {148,4041}, + {150,4032}, + {150,4023}, + {150,4014}, + {150,4006}, + {153,3999}, + {153,3992}, + {153,3986}, + {153,3980}, + {153,3973}, + {160,3968}, + {158,3962}, + {160,3955}, + {160,3949}, + {163,3943}, + {165,3937}, + {168,3931}, + {173,3925}, + {175,3920}, + {178,3913}, + {180,3905}, + {180,3896}, + {178,3885}, + {170,3874}, + {168,3866}, + {165,3858}, + {160,3852}, + {163,3847}, + {163,3841}, + {160,3836}, + {158,3831}, + {158,3827}, + {160,3823}, + {158,3819}, + {158,3815}, + {160,3812}, + {160,3808}, + {160,3805}, + {160,3802}, + {160,3799}, + {160,3796}, + {165,3794}, + {163,3791}, + {163,3789}, + {163,3786}, + {165,3784}, + {165,3782}, + {165,3780}, + {168,3778}, + {168,3776}, + {168,3774}, + {170,3772}, + {165,3769}, + {170,3767}, + {173,3764}, + {170,3760}, + {175,3757}, + {175,3753}, + {175,3748}, + {178,3744}, + {180,3741}, + {180,3738}, + {183,3734}, + {185,3731}, + {185,3727}, + {188,3722}, + {190,3717}, + {188,3711}, + {190,3705}, + {195,3699}, + {198,3692}, + {200,3684}, + {203,3680}, + {205,3677}, + {213,3674}, + {223,3672}, + {233,3668}, + {245,3662}, + {258,3645}, + {275,3610}, + {290,3562}, + {308,3495}, + {348,3400}, + {348,3400}, + {348,3400}, + {348,3400}, + {348,3400}, + {348,3400} + }, + { + {138,4187}, + {153,4175}, + {153,4164}, + {155,4154}, + {153,4144}, + {157,4134}, + {158,4124}, + {157,4115}, + {158,4105}, + {160,4097}, + {158,4087}, + {158,4079}, + {160,4074}, + {163,4067}, + {162,4058}, + {163,4046}, + {163,4035}, + {162,4024}, + {162,4014}, + {163,4005}, + {162,3996}, + {160,3988}, + {160,3981}, + {163,3976}, + {163,3970}, + {168,3966}, + {168,3961}, + {167,3955}, + {170,3949}, + {168,3942}, + {172,3936}, + {172,3930}, + {175,3924}, + {175,3916}, + {173,3906}, + {170,3894}, + {165,3883}, + {165,3874}, + {167,3867}, + {162,3860}, + {165,3855}, + {165,3849}, + {162,3844}, + {163,3839}, + {163,3834}, + {163,3831}, + {163,3826}, + {165,3823}, + {163,3819}, + {167,3815}, + {165,3812}, + {167,3809}, + {167,3805}, + {165,3802}, + {168,3800}, + {167,3797}, + {165,3794}, + {167,3792}, + {167,3789}, + {168,3787}, + {170,3785}, + {170,3783}, + {168,3781}, + {172,3780}, + {173,3778}, + {173,3776}, + {175,3774}, + {173,3770}, + {168,3766}, + {168,3761}, + {168,3757}, + {172,3753}, + {170,3749}, + {173,3746}, + {175,3743}, + {177,3740}, + {178,3736}, + {177,3733}, + {180,3730}, + {183,3726}, + {187,3721}, + {188,3717}, + {188,3711}, + {187,3706}, + {190,3700}, + {195,3694}, + {195,3687}, + {195,3684}, + {198,3681}, + {203,3679}, + {213,3675}, + {217,3670}, + {227,3662}, + {237,3638}, + {247,3599}, + {255,3551}, + {282,3489}, + {322,3405}, + {393,3400}, + {393,3400}, + {393,3400}, + {393,3400}, + {393,3400} + } +}; + +/* The following data is 500 cycle aging data for temperature 55 C */ +/* Total data num: 103 */ +/* T3 50C:{DOD,OCV} */ +BATTERY_PROFILE_STRUC battery_profile_t3_500cycle[2][103] = { + { + {0,4176}, + {1,4163}, + {2,4152}, + {3,4142}, + {4,4132}, + {5,4122}, + {6,4113}, + {7,4103}, + {8,4094}, + {9,4086}, + {10,4077}, + {11,4068}, + {12,4060}, + {13,4052}, + {15,4043}, + {16,4036}, + {17,4028}, + {18,4019}, + {19,4013}, + {20,4005}, + {21,3998}, + {22,3991}, + {23,3984}, + {24,3977}, + {25,3970}, + {26,3964}, + {27,3957}, + {28,3951}, + {29,3945}, + {30,3939}, + {31,3933}, + {32,3927}, + {33,3921}, + {34,3915}, + {35,3907}, + {36,3898}, + {37,3887}, + {38,3877}, + {39,3869}, + {40,3861}, + {42,3855}, + {43,3849}, + {44,3844}, + {45,3839}, + {46,3834}, + {47,3831}, + {48,3826}, + {49,3822}, + {50,3818}, + {51,3814}, + {52,3810}, + {53,3807}, + {54,3804}, + {55,3800}, + {56,3798}, + {57,3795}, + {58,3792}, + {59,3789}, + {60,3787}, + {61,3784}, + {62,3783}, + {63,3780}, + {64,3778}, + {65,3775}, + {66,3773}, + {67,3770}, + {69,3765}, + {70,3761}, + {71,3756}, + {72,3751}, + {73,3746}, + {74,3741}, + {75,3736}, + {76,3732}, + {77,3728}, + {78,3724}, + {79,3720}, + {80,3718}, + {81,3715}, + {82,3711}, + {83,3706}, + {84,3701}, + {85,3695}, + {86,3689}, + {87,3682}, + {88,3675}, + {89,3670}, + {90,3668}, + {91,3666}, + {92,3664}, + {93,3660}, + {94,3656}, + {96,3644}, + {97,3616}, + {98,3572}, + {99,3513}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400} + }, + { + {0,4178}, + {1,4167}, + {2,4157}, + {3,4147}, + {4,4138}, + {5,4128}, + {6,4118}, + {7,4109}, + {8,4100}, + {9,4090}, + {10,4081}, + {12,4072}, + {13,4064}, + {14,4056}, + {15,4047}, + {16,4039}, + {17,4030}, + {18,4021}, + {19,4014}, + {20,4005}, + {21,3999}, + {22,3991}, + {23,3984}, + {24,3976}, + {25,3970}, + {26,3963}, + {27,3956}, + {28,3950}, + {29,3943}, + {30,3937}, + {31,3930}, + {32,3924}, + {33,3917}, + {35,3909}, + {36,3897}, + {37,3886}, + {38,3876}, + {39,3868}, + {40,3862}, + {41,3856}, + {42,3851}, + {43,3846}, + {44,3841}, + {45,3836}, + {46,3832}, + {47,3828}, + {48,3823}, + {49,3820}, + {50,3816}, + {51,3813}, + {52,3809}, + {53,3806}, + {54,3803}, + {55,3800}, + {57,3796}, + {58,3793}, + {59,3791}, + {60,3788}, + {61,3786}, + {62,3783}, + {63,3781}, + {64,3779}, + {65,3777}, + {66,3775}, + {67,3772}, + {68,3766}, + {69,3758}, + {70,3751}, + {71,3746}, + {72,3741}, + {73,3738}, + {74,3733}, + {75,3730}, + {76,3726}, + {77,3724}, + {79,3720}, + {80,3718}, + {81,3714}, + {82,3710}, + {83,3705}, + {84,3700}, + {85,3695}, + {86,3690}, + {87,3684}, + {88,3677}, + {89,3672}, + {90,3669}, + {91,3667}, + {92,3664}, + {93,3660}, + {94,3655}, + {95,3638}, + {96,3606}, + {97,3563}, + {98,3511}, + {100,3444}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400}, + {100,3400} + } +}; + +/* Total data num: 103 */ +/* T3 r_profile 50C */ +R_PROFILE_STRUC r_profile_t3_500cycle[2][103] = { + { + {93,4176}, + {93,4163}, + {95,4152}, + {98,4142}, + {98,4132}, + {98,4122}, + {98,4113}, + {98,4103}, + {98,4094}, + {98,4086}, + {98,4077}, + {98,4068}, + {100,4060}, + {98,4052}, + {98,4043}, + {103,4036}, + {100,4028}, + {98,4019}, + {103,4013}, + {100,4005}, + {103,3998}, + {100,3991}, + {103,3984}, + {103,3977}, + {103,3970}, + {105,3964}, + {103,3957}, + {105,3951}, + {105,3945}, + {108,3939}, + {108,3933}, + {110,3927}, + {115,3921}, + {115,3915}, + {115,3907}, + {115,3898}, + {113,3887}, + {113,3877}, + {113,3869}, + {108,3861}, + {108,3855}, + {105,3849}, + {105,3844}, + {105,3839}, + {105,3834}, + {108,3831}, + {105,3826}, + {105,3822}, + {105,3818}, + {103,3814}, + {100,3810}, + {105,3807}, + {105,3804}, + {103,3800}, + {105,3798}, + {105,3795}, + {103,3792}, + {103,3789}, + {108,3787}, + {105,3784}, + {108,3783}, + {108,3780}, + {108,3778}, + {108,3775}, + {108,3773}, + {108,3770}, + {103,3765}, + {105,3761}, + {105,3756}, + {103,3751}, + {105,3746}, + {103,3741}, + {103,3736}, + {103,3732}, + {103,3728}, + {105,3724}, + {103,3720}, + {105,3718}, + {108,3715}, + {105,3711}, + {105,3706}, + {108,3701}, + {108,3695}, + {108,3689}, + {108,3682}, + {110,3675}, + {108,3670}, + {110,3668}, + {113,3666}, + {115,3664}, + {113,3660}, + {118,3656}, + {125,3644}, + {130,3616}, + {128,3572}, + {133,3513}, + {148,3400}, + {148,3400}, + {148,3400}, + {148,3400}, + {148,3400}, + {148,3400}, + {148,3400} + }, + { + {110,4178}, + {128,4167}, + {130,4157}, + {128,4147}, + {132,4138}, + {132,4128}, + {128,4118}, + {130,4109}, + {132,4100}, + {130,4090}, + {130,4081}, + {130,4072}, + {132,4064}, + {133,4056}, + {132,4047}, + {133,4039}, + {132,4030}, + {132,4021}, + {133,4014}, + {132,4005}, + {133,3999}, + {133,3991}, + {133,3984}, + {133,3976}, + {133,3970}, + {135,3963}, + {135,3956}, + {137,3950}, + {135,3943}, + {138,3937}, + {138,3930}, + {138,3924}, + {140,3917}, + {140,3909}, + {135,3897}, + {133,3886}, + {133,3876}, + {132,3868}, + {132,3862}, + {132,3856}, + {132,3851}, + {133,3846}, + {133,3841}, + {132,3836}, + {133,3832}, + {133,3828}, + {132,3823}, + {133,3820}, + {133,3816}, + {133,3813}, + {133,3809}, + {133,3806}, + {133,3803}, + {135,3800}, + {133,3796}, + {133,3793}, + {135,3791}, + {133,3788}, + {135,3786}, + {135,3783}, + {135,3781}, + {137,3779}, + {137,3777}, + {137,3775}, + {138,3772}, + {133,3766}, + {132,3758}, + {132,3751}, + {133,3746}, + {132,3741}, + {135,3738}, + {133,3733}, + {133,3730}, + {133,3726}, + {135,3724}, + {133,3720}, + {135,3718}, + {135,3714}, + {137,3710}, + {135,3705}, + {135,3700}, + {137,3695}, + {138,3690}, + {137,3684}, + {138,3677}, + {138,3672}, + {138,3669}, + {140,3667}, + {142,3664}, + {143,3660}, + {148,3655}, + {148,3638}, + {148,3606}, + {148,3563}, + {153,3511}, + {158,3444}, + {167,3400}, + {167,3400}, + {167,3400}, + {167,3400}, + {167,3400}, + {167,3400}, + {167,3400} + } +}; + +#endif + +/* The following data is for temperature empty C */ +/* Total data num: 103 */ +/* battery profile for actual temperature. The size should be the same as T1, T2 and T3 */ +BATTERY_PROFILE_STRUC battery_profile_temperature[] = { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + +}; + +/* Total data num: 103 */ +/* r-table profile for actual temperature. The size should be the same as T1, T2 and T3 */ +R_PROFILE_STRUC r_profile_temperature[] = { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + +}; + +// ============================================================ +// function prototype +// ============================================================ +int fgauge_get_saddles(void); +BATTERY_PROFILE_STRUC_P fgauge_get_profile(kal_uint32 temperature); + +int fgauge_get_saddles_r_table(void); +R_PROFILE_STRUC_P fgauge_get_profile_r_table(kal_uint32 temperature); + +#endif /* #ifndef _CUST_BATTERY_METER_TABLE_H */ diff --git a/arch/arm/mach-mt8127/ford/power/cust_charging.h b/arch/arm/mach-mt8127/ford/power/cust_charging.h new file mode 100755 index 00000000000..e422ac2bdc2 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/power/cust_charging.h @@ -0,0 +1,127 @@ +#ifndef _CUST_BAT_H_ +#define _CUST_BAT_H_ + +/* stop charging while in talking mode */ +#define STOP_CHARGING_IN_TAKLING +#define TALKING_RECHARGE_VOLTAGE 3800 +#define TALKING_SYNC_TIME 60 + +/* Battery Temperature Protection */ +#define MTK_TEMPERATURE_RECHARGE_SUPPORT +#define MAX_CHARGE_TEMPERATURE 60 +#define MAX_CHARGE_TEMPERATURE_MINUS_X_DEGREE 47 +#define MIN_CHARGE_TEMPERATURE 0 +#define MIN_CHARGE_TEMPERATURE_PLUS_X_DEGREE 6 +#define ERR_CHARGE_TEMPERATURE 0xFF + +/* Linear Charging Threshold */ +#define V_PRE2CC_THRES 3400 //mV +#define V_CC2TOPOFF_THRES 4050 +#define RECHARGING_VOLTAGE 4110 +#define CHARGING_FULL_CURRENT 150 //mA + +/* Charging Current Setting */ +//#define CONFIG_USB_IF +#define USB_CHARGER_CURRENT_SUSPEND 0 // def CONFIG_USB_IF +#define USB_CHARGER_CURRENT_UNCONFIGURED CHARGE_CURRENT_70_00_MA // 70mA +#define USB_CHARGER_CURRENT_CONFIGURED CHARGE_CURRENT_500_00_MA // 500mA + +#define USB_CHARGER_CURRENT CHARGE_CURRENT_500_00_MA //500mA +#define AC_CHARGER_CURRENT CHARGE_CURRENT_1000_00_MA +#define NON_STD_AC_CHARGER_CURRENT CHARGE_CURRENT_1000_00_MA +#define CHARGING_HOST_CHARGER_CURRENT CHARGE_CURRENT_1000_00_MA +#define APPLE_0_5A_CHARGER_CURRENT CHARGE_CURRENT_500_00_MA +#define APPLE_1_0A_CHARGER_CURRENT CHARGE_CURRENT_1000_00_MA +#define APPLE_2_1A_CHARGER_CURRENT CHARGE_CURRENT_1000_00_MA + + +/* Precise Tunning */ +#define BATTERY_AVERAGE_DATA_NUMBER 3 +#ifdef CONFIG_AUSTIN_PROJECT +#define BATTERY_AVERAGE_SIZE 10 +#else +#define BATTERY_AVERAGE_SIZE 30 +#endif + +/* charger error check */ +#define BAT_LOW_TEMP_PROTECT_ENABLE /*stop charging if temp < MIN_CHARGE_TEMPERATURE*/ +#define V_CHARGER_ENABLE 0 // 1:ON , 0:OFF +#define V_CHARGER_MAX 6500 // 6.5 V +#define V_CHARGER_MIN 4400 // 4.4 V + +/* Tracking TIME */ +#define ONEHUNDRED_PERCENT_TRACKING_TIME 10 // 10 second +#define NPERCENT_TRACKING_TIME 20 // 20 second +#define SYNC_TO_REAL_TRACKING_TIME 60 // 60 second +#define V_0PERCENT_TRACKING 3400 //3400mV + +/* Battery Notify */ +#define BATTERY_NOTIFY_CASE_0001_VCHARGER +#define BATTERY_NOTIFY_CASE_0002_VBATTEMP +//#define BATTERY_NOTIFY_CASE_0003_ICHARGING +//#define BATTERY_NOTIFY_CASE_0004_VBAT +//#define BATTERY_NOTIFY_CASE_0005_TOTAL_CHARGINGTIME + +/* JEITA parameter */ +//#define MTK_JEITA_STANDARD_SUPPORT +#define CUST_SOC_JEITA_SYNC_TIME 30 +#define JEITA_RECHARGE_VOLTAGE 4110 // for linear charging +#define JEITA_TEMP_ABOVE_POS_60_CV_VOLTAGE BATTERY_VOLT_04_000000_V +#define JEITA_TEMP_POS_45_TO_POS_60_CV_VOLTAGE BATTERY_VOLT_04_000000_V +#define JEITA_TEMP_POS_10_TO_POS_45_CV_VOLTAGE BATTERY_VOLT_04_200000_V +#define JEITA_TEMP_POS_0_TO_POS_10_CV_VOLTAGE BATTERY_VOLT_04_200000_V +#define JEITA_TEMP_NEG_10_TO_POS_0_CV_VOLTAGE BATTERY_VOLT_03_900000_V +#define JEITA_TEMP_BELOW_NEG_10_CV_VOLTAGE BATTERY_VOLT_03_900000_V + +/* For JEITA Linear Charging only */ +#define JEITA_NEG_10_TO_POS_0_FULL_CURRENT 120 //mA +#define JEITA_TEMP_POS_45_TO_POS_60_RECHARGE_VOLTAGE 4000 +#define JEITA_TEMP_POS_10_TO_POS_45_RECHARGE_VOLTAGE 4100 +#define JEITA_TEMP_POS_0_TO_POS_10_RECHARGE_VOLTAGE 4000 +#define JEITA_TEMP_NEG_10_TO_POS_0_RECHARGE_VOLTAGE 3800 +#define JEITA_TEMP_POS_45_TO_POS_60_CC2TOPOFF_THRESHOLD 4050 +#define JEITA_TEMP_POS_10_TO_POS_45_CC2TOPOFF_THRESHOLD 4050 +#define JEITA_TEMP_POS_0_TO_POS_10_CC2TOPOFF_THRESHOLD 4050 +#define JEITA_TEMP_NEG_10_TO_POS_0_CC2TOPOFF_THRESHOLD 3850 + + +#ifdef CONFIG_MTK_FAN5405_SUPPORT +#define FAN5405_BUSNUM 1 +#endif + +#ifdef CONFIG_MTK_BQ24158_SUPPORT +#define BQ24158_BUSNUM 1 +#endif + +#ifdef CONFIG_MTK_BQ24296_SUPPORT +#define BQ24296_BUSNUM 2 +#endif + +#ifdef CONFIG_MTK_BQ24297_SUPPORT +#define BQ24297_BUSNUM 1 +#endif + +/* High battery support */ +/* #define HIGH_BATTERY_VOLTAGE_SUPPORT */ + +/* Disable Battery check for HQA */ +#ifdef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION +#define CONFIG_DIS_CHECK_BATTERY +#endif + + +//#define MTK_WIRELESS_CHARGER_SUPPORT 1 + +/* Pump Express support (fast charging) */ +#ifdef CONFIG_MTK_PUMP_EXPRESS_SUPPORT +#define TA_START_VCHR_TUNUNG_VOLTAGE 3400 +#define TA_CHARGING_CURRENT CHARGE_CURRENT_1500_00_MA +#undef V_CHARGER_MAX +#ifdef TA_9V_SUPPORT +#define V_CHARGER_MAX 9500 // 9.5 V +#else +#define V_CHARGER_MAX 6000 // 6.0 V +#endif +#endif + +#endif /* _CUST_BAT_H_ */ diff --git a/arch/arm/mach-mt8127/ford/power/cust_diso.h b/arch/arm/mach-mt8127/ford/power/cust_diso.h new file mode 100644 index 00000000000..56b87830f24 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/power/cust_diso.h @@ -0,0 +1,58 @@ +#ifndef _CUST_DISO_H_ +#define _CUST_DISO_H_ + +#define MTK_AUXADC_IRQ_SUPPORT + +#define MTK_LOAD_SWITCH_FPF3040 +//#define MTK_DISCRETE_SWITCH +//#define MTK_DSC_USE_EINT + +#ifdef MTK_LOAD_SWITCH_FPF3040 +#define VIN_SEL_FLAG +#define VIN_SEL_FLAG_DEFAULT_LOW + +#define AP_AUXADC_DISO_VDC_CHANNEL 0 +#define AP_AUXADC_DISO_VUSB_CHANNEL 1 +#define R_DISO_DC_PULL_UP 10000 +#define R_DISO_DC_PULL_DOWN 1000 +#define R_DISO_VBUS_PULL_UP 5100 +#define R_DISO_VBUS_PULL_DOWN 1000 +#define VDC_MIN_VOLTAGE BATTERY_VOLT_04_440000_V //FPF3040 min value is 4000, set larger for PMIC detect +#define VDC_MAX_VOLTAGE BATTERY_VOLT_10_500000_V +#define VBUS_MIN_VOLTAGE BATTERY_VOLT_04_440000_V //FPF3040 min value is 4000, set larger for PMIC detect +#define VBUS_MAX_VOLTAGE BATTERY_VOLT_07_000000_V +#define SWITCH_RISING_TIMING 105 +#define SWITCH_FALLING_TIMING 105 +#define LOAD_SWITCH_TIMING_MARGIN 30 +#define AUXADC_CHANNEL_DEBOUNCE 0x2 +#define AUXADC_CHANNEL_DELAY_PERIOD 0x5 +#define CUST_GPIO_VIN_SEL 18 + +#elif defined(MTK_DISCRETE_SWITCH) +#ifdef MTK_DSC_USE_EINT +#define VIN_SEL_FLAG +#endif + +#define CUST_GPIO_VIN_SEL 20 +#define CUST_EINT_VDC_NUM 42 +#define CUST_EINT_VUSB_NUM 43 +#define CUST_EINT_VDC_DEBOUNCE_CN 1 +#define CUST_EINT_VUSB_DEBOUNCE_CN 1 +#define AP_AUXADC_DISO_VDC_CHANNEL 0 +#define AP_AUXADC_DISO_VUSB_CHANNEL 1 +#define R_DISO_DC_PULL_UP 10000 +#define R_DISO_DC_PULL_DOWN 1000 +#define R_DISO_VBUS_PULL_UP 5100 +#define R_DISO_VBUS_PULL_DOWN 1000 +#define VDC_MIN_VOLTAGE BATTERY_VOLT_04_440000_V //FPF3040 min value is 4000, set larger for PMIC detect +#define VDC_MAX_VOLTAGE BATTERY_VOLT_10_500000_V +#define VBUS_MIN_VOLTAGE BATTERY_VOLT_04_440000_V //FPF3040 min value is 4000, set larger for PMIC detect +#define VBUS_MAX_VOLTAGE BATTERY_VOLT_07_000000_V +#define SWITCH_RISING_TIMING 105 +#define SWITCH_FALLING_TIMING 105 +#define LOAD_SWITCH_TIMING_MARGIN 30 +#define AUXADC_CHANNEL_DEBOUNCE 0x2 +#define AUXADC_CHANNEL_DELAY_PERIOD 0x5 +#endif + +#endif diff --git a/arch/arm/mach-mt8127/ford/power/cust_pe.h b/arch/arm/mach-mt8127/ford/power/cust_pe.h new file mode 100644 index 00000000000..46b6c15a94c --- /dev/null +++ b/arch/arm/mach-mt8127/ford/power/cust_pe.h @@ -0,0 +1,21 @@ +#ifndef _CUST_PE_H_ +#define _CUST_PE_H_ + +/* Pump Express support (fast charging) */ +#ifdef CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT +#define TA_START_BATTERY_SOC 1 +#define TA_STOP_BATTERY_SOC 95 +#define TA_AC_9V_INPUT_CURRENT CHARGE_CURRENT_1500_00_MA +#define TA_AC_7V_INPUT_CURRENT CHARGE_CURRENT_1500_00_MA +#define TA_AC_CHARGING_CURRENT CHARGE_CURRENT_2500_00_MA +#define TA_9V_SUPPORT + +#undef V_CHARGER_MAX +#ifdef TA_9V_SUPPORT +#define V_CHARGER_MAX 10500 // 10.5 V +#else +#define V_CHARGER_MAX 7500 // 7.5 V +#endif +#endif + +#endif /* _CUST_PE_H_ */ diff --git a/arch/arm/mach-mt8127/ford/power/cust_pmic.h b/arch/arm/mach-mt8127/ford/power/cust_pmic.h new file mode 100644 index 00000000000..f78148a577b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/power/cust_pmic.h @@ -0,0 +1,5 @@ +#ifndef _CUST_PMIC_H_ +#define _CUST_PMIC_H_ + + +#endif /* _CUST_PMIC_H_ */ diff --git a/arch/arm/mach-mt8127/ford/rtc/rtc-mt.h b/arch/arm/mach-mt8127/ford/rtc/rtc-mt.h new file mode 100644 index 00000000000..dfcd287af38 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/rtc/rtc-mt.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2010 MediaTek, Inc. + * + * Author: Terry Chang + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef _RTC_MT_H_ +#define _RTC_MT_H_ + +#define RTC_YES 1 +#define RTC_NO 0 + +/* + * Reset to default date if RTC time is over 2038/1/19 3:14:7 + * Year (YEA) : 1970 ~ 2037 + * Month (MTH) : 1 ~ 12 + * Day of Month (DOM): 1 ~ 31 + */ +#define RTC_OVER_TIME_RESET RTC_YES +#define RTC_DEFAULT_YEA 2010 +#define RTC_DEFAULT_MTH 1 +#define RTC_DEFAULT_DOM 1 + +#endif diff --git a/arch/arm/mach-mt8127/ford/sound/Makefile b/arch/arm/mach-mt8127/ford/sound/Makefile new file mode 100755 index 00000000000..01a5017a842 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/sound/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := yusu_android_speaker.o + diff --git a/arch/arm/mach-mt8127/ford/sound/inc/external_codec_driver.h b/arch/arm/mach-mt8127/ford/sound/inc/external_codec_driver.h new file mode 100644 index 00000000000..90793b5bc36 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/sound/inc/external_codec_driver.h @@ -0,0 +1,104 @@ +/******************************************************************************* + * + * Filename: + * --------- + * external_codec_driver.h + * + * Project: + * -------- + * MT6592_phone_v1 + * + * Description: + * ------------ + * external codec control + * + * Author: + * ------- + * Stephen Chen + * + * + *------------------------------------------------------------------------------ + * $Revision$ + * $Modtime:$ + * $Log:$ + * * + * + *******************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _EXTERNAL_CODEC_DRIVER_H_ +#define _EXTERNAL_CODEC_DRIVER_H_ + +/* CS4398 registers addresses */ +#define CS4398_CHIPID 0x01 /* Chip ID */ +#define CS4398_MODE 0x02 /* Mode Control */ +#define CS4398_MIXING 0x03 +#define CS4398_MUTE 0x04 /* Mute Control */ +#define CS4398_VOLA 0x05 /* DAC Channel A Volume Control */ +#define CS4398_VOLB 0x06 /* DAC Channel B Volume Control */ +#define CS4398_RAMP 0x07 +#define CS4398_MISC1 0x08 +#define CS4398_MISC2 0x09 + +#define CS4398_FIRSTREG 0x01 +#define CS4398_LASTREG 0x09 +#define CS4398_NUMREGS (CS4398_LASTREG - CS4398_FIRSTREG + 1) + +typedef enum +{ + DIF_LEFT_JUSTIFIED, + DIF_I2S, + DIF_RIGHT_JUSTIFIED_16BIT, + DIF_RIGHT_JUSTIFIED_24BIT, + DIF_RIGHT_JUSTIFIED_20BIT, + DIF_RIGHT_JUSTIFIED_18BIT, + NUM_OF_DIF +} DIGITAL_INTERFACE_FORMAT; + + +enum ECODEC_CONTROL_SUBCOMMAND +{ + ECODEC_GETREGISTER_VALUE, + ECODEC_SETREGISTER_VALUE, +}; + +enum AUDIO_ECODEC_CONTROL_COMMAND +{ + NUM_AUD_ECODEC_COMMAND, +}; + +typedef struct +{ + unsigned long int command; + unsigned long int param1; + unsigned long int param2; +} ECODEC_Control; + +void ExtCodec_Init(void); +void ExtCodec_PowerOn(void); +void ExtCodec_PowerOff(void); +bool ExtCodec_Register(void); +void ExtCodec_Mute(void); +void ExtCodec_SetGain(u8 leftright, u8 gain); +u8 ExtCodec_ReadReg(u8 addr); +void ExtCodec_DumpReg(void); +void ExtCodecDevice_Suspend(void); +void ExtCodecDevice_Resume(void); +void cust_extcodec_gpio_on(void); +void cust_extcodec_gpio_off(void); +void cust_extHPAmp_gpio_on(void); +void cust_extHPAmp_gpio_off(void); +void cust_extPLL_gpio_config(void); +#endif diff --git a/arch/arm/mach-mt8127/ford/sound/inc/yusu_android_speaker.h b/arch/arm/mach-mt8127/ford/sound/inc/yusu_android_speaker.h new file mode 100644 index 00000000000..2bb04c61690 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/sound/inc/yusu_android_speaker.h @@ -0,0 +1,146 @@ +/******************************************************************************* + * + * Filename: + * --------- + * Yusu_android_speaker.h + * + * Project: + * -------- + * Yusu + * + * Description: + * ------------ + * speaker select + * + * Author: + * ------- + * ChiPeng Chang (mtk02308) + * + * + *------------------------------------------------------------------------------ + * $Revision$ + * $Modtime:$ + * $Log:$ + * + * 06 17 2012 weiguo.li + * [ALPS00302429] [Need Patch] [Volunteer Patch]modify speaker driver + * . + * + * 12 14 2011 weiguo.li + * [ALPS00102848] [Need Patch] [Volunteer Patch] build waring in yusu_android_speaker.h + * . + * + * 11 10 2011 weiguo.li + * [ALPS00091610] [Need Patch] [Volunteer Patch]chang yusu_android_speaker.c function name and modules use it + * . + * + * 09 28 2011 weiguo.li + * [ALPS00076254] [Need Patch] [Volunteer Patch]LGE audio driver using Voicebuffer for incall + * . + * + * 07 08 2011 weiguo.li + * [ALPS00059378] poring lge code to alps(audio) + * . + * + * 07 23 2010 chipeng.chang + * [ALPS00122386][Music]The playing music is no sound after below steps. + * when mode change , record deivce for volume setting. + * + * 07 03 2010 chipeng.chang + * [ALPS00002838][Need Patch] [Volunteer Patch] for speech volume step + * modify for headset customization. + * + *******************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _YUSU_ANDROID_SPEAKER_H_ +#define _YUSU_ANDROID_SPEAKER_H_ + + enum EAMP_CONTROL_SUBCOMMAND + { + EAMP_SPEAKER_CLOSE =0, + EAMP_SPEAKER_OPEN, + EAMP_HEADPHONE_OPEN, + EAMP_HEADPHONE_CLOSE, + EAMP_EARPIECE_OPEN, + EAMP_EARPIECE_CLOSE, + EAMP_GETREGISTER_VALUE, + EAMP_SETREGISTER_VALUE, + EAMP_SETAMP_GAIN, + EAMP_GETAMP_GAIN, + EAMP_GET_CTRP_NUM , + EAMP_GET_CTRP_BITS, + EAMP_GET_CTRP_TABLE, + EAMP_SETMODE, + }; + +enum AUDIO_AMP_CONTROL_COMMAND{ + AUD_AMP_GET_CTRP_NUM , + AUD_AMP_GET_CTRP_BITS, + AUD_AMP_GET_CTRP_TABLE, + AUD_AMP_GET_REGISTER, + AUD_AMP_SET_REGISTER, + AUD_AMP_SET_AMPGAIN, // gain is use for low 24bits as external amp , device should base on control point set to AMPLL_CON0_REG + AUD_AMP_GET_AMPGAIN, + AUD_AMP_SET_MODE, + NUM_AUD_AMP_COMMAND +}; + +typedef struct { + unsigned long int command; + unsigned long int param1; + unsigned long int param2; +}AMP_Control; + +enum SPEAKER_CHANNEL +{ + Channel_None = 0 , + Channel_Right, + Channel_Left, + Channel_Stereo +}; + +bool Speaker_Init(void); +bool Speaker_DeInit(void); +bool Speaker_Register(void); +int ExternalAmp(void); + +void Sound_Speaker_Turnon(int channel); +void Sound_Speaker_Turnoff(int channel); +void Sound_Speaker_SetVolLevel(int level); + +void Sound_Headset_Turnon(void); +void Sound_Headset_Turnoff(void); + +//now for kernal use +void AudioAMPDevice_Suspend(void); +void AudioAMPDevice_Resume(void); +// used for AEE beep sound +void AudioAMPDevice_SpeakerLouderOpen(void); //some times kernal need to force speaker for notification +void AudioAMPDevice_SpeakerLouderClose(void); +void AudioAMPDevice_mute(void); + + +int Audio_eamp_command(unsigned int type, unsigned long args, unsigned int count); + + + + +kal_int32 Sound_ExtFunction(const char* name, void* param, int param_size); + + +#endif + + diff --git a/arch/arm/mach-mt8127/ford/sound/yusu_android_speaker.c b/arch/arm/mach-mt8127/ford/sound/yusu_android_speaker.c new file mode 100644 index 00000000000..8d398811aec --- /dev/null +++ b/arch/arm/mach-mt8127/ford/sound/yusu_android_speaker.c @@ -0,0 +1,248 @@ +/***************************************************************************** +* E X T E R N A L R E F E R E N C E S +****************************************************************************** +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "yusu_android_speaker.h" + +#include +#include + +/***************************************************************************** +* C O M P I L E R F L A G S +****************************************************************************** +*/ +//#define CONFIG_DEBUG_MSG +#ifdef CONFIG_DEBUG_MSG +#define PRINTK(format, args...) printk( KERN_EMERG format,##args ) +#else +#define PRINTK(format, args...) +#endif + +#define AMP_CLASS_AB +//#define AMP_CLASS_D +//#define ENABLE_2_IN_1_SPK + +#if !defined(AMP_CLASS_AB) && !defined(AMP_CLASS_D) +#error "MT6323 SPK AMP TYPE does not be defined!!!" +#endif +/***************************************************************************** +* C O N S T A N T S +****************************************************************************** +*/ + +#define SPK_WARM_UP_TIME (55) //unit is ms +#define SPK_AMP_GAIN (4) //4:15dB +#define RCV_AMP_GAIN (1) //1:-3dB +#define SPK_R_ENABLE (1) +#define SPK_L_ENABLE (1) +/***************************************************************************** +* D A T A T Y P E S +****************************************************************************** +*/ +static int Speaker_Volume=0; +static bool gsk_on=false; // speaker is open? +static bool gsk_resume=false; +static bool gsk_forceon=false; +/***************************************************************************** +* F U N C T I O N D E F I N I T I O N +****************************************************************************** +*/ +extern void Yusu_Sound_AMP_Switch(BOOL enable); + +bool Speaker_Init(void) +{ + PRINTK("+Speaker_Init Success"); + mt_set_gpio_mode(GPIO_SPEAKER_EN_PIN,GPIO_MODE_00); // gpio mode + mt_set_gpio_pull_enable(GPIO_SPEAKER_EN_PIN,GPIO_PULL_ENABLE); + mt_set_gpio_dir(GPIO_SPEAKER_EN_PIN,GPIO_DIR_OUT); // output + mt_set_gpio_out(GPIO_SPEAKER_EN_PIN,GPIO_OUT_ZERO); // high + PRINTK("-Speaker_Init Success"); + return true; +} + +bool Speaker_Register(void) +{ + return false; +} + +int ExternalAmp(void) +{ + return 0; +} + +bool Speaker_DeInit(void) +{ + return false; +} + +void Sound_SpeakerL_SetVolLevel(int level) +{ + PRINTK(" Sound_SpeakerL_SetVolLevel level=%d\n",level); +} + +void Sound_SpeakerR_SetVolLevel(int level) +{ + PRINTK(" Sound_SpeakerR_SetVolLevel level=%d\n",level); +} + +void Sound_Speaker_Turnon(int channel) +{ + PRINTK("Sound_Speaker_Turnon channel = %d\n",channel); + if(gsk_on) + return; + mt_set_gpio_dir(GPIO_SPEAKER_EN_PIN,GPIO_DIR_OUT); // output + mt_set_gpio_out(GPIO_SPEAKER_EN_PIN,GPIO_OUT_ONE); // low + msleep(SPK_WARM_UP_TIME); + gsk_on = true; +} + +void Sound_Speaker_Turnoff(int channel) +{ + PRINTK("Sound_Speaker_Turnoff channel = %d\n",channel); + if(!gsk_on) + return; + mt_set_gpio_dir(GPIO_SPEAKER_EN_PIN,GPIO_DIR_OUT); // output + mt_set_gpio_out(GPIO_SPEAKER_EN_PIN,GPIO_OUT_ZERO); // high + gsk_on = false; +} + +void Sound_Speaker_SetVolLevel(int level) +{ + Speaker_Volume =level; +} + +void Sound_Headset_Turnon(void) +{ +} + +void Sound_Headset_Turnoff(void) +{ +} + +void Sound_Earpiece_Turnon(void) +{ +#if defined(ENABLE_2_IN_1_SPK) + +#if defined(AMP_CLASS_D) + +#endif + +#endif +} + +void Sound_Earpiece_Turnoff(void) +{ +#if defined(ENABLE_2_IN_1_SPK) + +#if defined(AMP_CLASS_D) + +#endif + +#endif +} + +//kernal use +void AudioAMPDevice_Suspend(void) +{ + PRINTK("AudioDevice_Suspend\n"); + if(gsk_on) + { + Sound_Speaker_Turnoff(Channel_Stereo); + gsk_resume = true; + } + +} +void AudioAMPDevice_Resume(void) +{ + PRINTK("AudioDevice_Resume\n"); + if(gsk_resume) + Sound_Speaker_Turnon(Channel_Stereo); + gsk_resume = false; +} +void AudioAMPDevice_SpeakerLouderOpen(void) +{ + PRINTK("AudioDevice_SpeakerLouderOpen\n"); + gsk_forceon = false; + if(gsk_on) + return; + Sound_Speaker_Turnon(Channel_Stereo); + gsk_forceon = true; + return ; + +} +void AudioAMPDevice_SpeakerLouderClose(void) +{ + PRINTK("AudioDevice_SpeakerLouderClose\n"); + + if(gsk_forceon) + Sound_Speaker_Turnoff(Channel_Stereo); + gsk_forceon = false; + +} +void AudioAMPDevice_mute(void) +{ + PRINTK("AudioDevice_mute\n"); + if(gsk_on) + Sound_Speaker_Turnoff(Channel_Stereo); +} + +int Audio_eamp_command(unsigned int type, unsigned long args, unsigned int count) +{ + return 0; +} +static char *ExtFunArray[] = +{ + "InfoMATVAudioStart", + "InfoMATVAudioStop", + "End", +}; + +kal_int32 Sound_ExtFunction(const char* name, void* param, int param_size) +{ + int i = 0; + int funNum = -1; + + //Search the supported function defined in ExtFunArray + while(strcmp("End",ExtFunArray[i]) != 0 ) { //while function not equal to "End" + + if (strcmp(name,ExtFunArray[i]) == 0 ) { //When function name equal to table, break + funNum = i; + break; + } + i++; + } + + switch (funNum) { + case 0: //InfoMATVAudioStart + printk("RunExtFunction InfoMATVAudioStart \n"); + break; + + case 1: //InfoMATVAudioStop + printk("RunExtFunction InfoMATVAudioStop \n"); + break; + + default: + break; + } + + return 1; +} + + diff --git a/arch/arm/mach-mt8127/ford/ssw/Makefile b/arch/arm/mach-mt8127/ford/ssw/Makefile new file mode 100755 index 00000000000..ae302a83ac3 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/ssw/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := sim_switch.o + diff --git a/arch/arm/mach-mt8127/ford/ssw/inc/ssw.h b/arch/arm/mach-mt8127/ford/ssw/inc/ssw.h new file mode 100644 index 00000000000..ac41b969a67 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/ssw/inc/ssw.h @@ -0,0 +1,59 @@ +#ifndef __SSW_H__ +#define __SSW_H__ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +/*-------------------------debug log define--------------------------------*/ +static int dbg_en = 1; +#define SSW_DBG(format, args...) do{ \ + if(dbg_en) \ + {\ + printk(KERN_ERR "[SSW] "format,##args);\ + }\ +}while(0) + + +/*-------------------------variable define----------------------------------*/ +#if 0 +#ifndef SSW_DUAL_TALK +#define SSW_DUAL_TALK 0 +#endif + +#ifndef SSW_SING_TALK +#define SSW_SING_TALK 1 +#endif +#endif + +/*------------------------Error Code---------------------------------------*/ +#define SSW_SUCCESS (0) +#define SSW_INVALID_PARA (-1) + +enum { + SSW_INVALID = 0xFFFFFFFF, + SSW_INTERN = 0, + SSW_EXT_FXLA2203 = 1, + SSW_EXT_SINGLE_COMMON = 2, +}; + +#endif + + diff --git a/arch/arm/mach-mt8127/ford/ssw/sim_switch.c b/arch/arm/mach-mt8127/ford/ssw/sim_switch.c new file mode 100644 index 00000000000..e5f8ba4c996 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/ssw/sim_switch.c @@ -0,0 +1,349 @@ + +#include + +/*--------------Feature option---------------*/ +#define __ENABLE_SSW_SYSFS 1 + + +/*--------------SIM mode list----------------*/ +#define SINGLE_TALK_MDSYS (0x1) +#define SINGLE_TALK_MDSYS_LITE (0x2) +#define DUAL_TALK (0x3) +#define DUAL_TALK_SWAP (0x4) + +/*----------------Error Code-----------------*/ +#define SSW_SUCCESS (0) +#define SSW_INVALID_PARA (-1) + + +/*--------------Global varible---------------*/ +unsigned int sim_mode_curr = SINGLE_TALK_MDSYS; + +unsigned int get_sim_switch_type(void) +{ + printk("[ccci/ssw]SSW_GENERIC\n"); + return SSW_INTERN; +} +EXPORT_SYMBOL(get_sim_switch_type); + +struct mutex sim_switch_mutex; + + +static inline void sim_switch_writel(void *addr, unsigned offset, u32 data) +{ + *((volatile unsigned int*)(addr + offset)) = data; +} + +static inline u32 sim_switch_readl(const void *addr, unsigned offset) +{ + + u32 rc = 0; + rc = *((volatile unsigned int*)(addr + offset)); + return rc; +} + +static int set_sim_gpio(unsigned int mode); +static int get_current_ssw_mode(void); + +/*---------------------------------------------------------------------------*/ +/*define sysfs entry for configuring debug level and sysrq*/ +ssize_t ssw_attr_show(struct kobject *kobj, struct attribute *attr, char *buffer); +ssize_t ssw_attr_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size); +ssize_t ssw_mode_show(struct kobject *kobj, char *page); +ssize_t ssw_mode_store(struct kobject *kobj, const char *page, size_t size); + +struct sysfs_ops ssw_sysfs_ops = { + .show = ssw_attr_show, + .store = ssw_attr_store, +}; + +struct ssw_sys_entry { + struct attribute attr; + ssize_t (*show)(struct kobject *kobj, char *page); + ssize_t (*store)(struct kobject *kobj, const char *page, size_t size); +}; + +static struct ssw_sys_entry mode_entry = { + { .name = "mode", .mode = S_IRUGO | S_IWUSR }, // remove .owner = NULL, + ssw_mode_show, + ssw_mode_store, +}; + +struct attribute *ssw_attributes[] = { + &mode_entry.attr, + NULL, +}; + +struct kobj_type ssw_ktype = { + .sysfs_ops = &ssw_sysfs_ops, + .default_attrs = ssw_attributes, +}; + +static struct ssw_sysobj_t { + struct kobject kobj; +} ssw_sysobj; + + +int ssw_sysfs_init(void) +{ + struct ssw_sysobj_t *obj = &ssw_sysobj; + + memset(&obj->kobj, 0x00, sizeof(obj->kobj)); + + obj->kobj.parent = kernel_kobj; + if (kobject_init_and_add(&obj->kobj, &ssw_ktype, NULL, "mtk_ssw")) { + kobject_put(&obj->kobj); + return -ENOMEM; + } + kobject_uevent(&obj->kobj, KOBJ_ADD); + + return 0; +} + +ssize_t ssw_attr_show(struct kobject *kobj, struct attribute *attr, char *buffer) +{ + struct ssw_sys_entry *entry = container_of(attr, struct ssw_sys_entry, attr); + return entry->show(kobj, buffer); +} + +ssize_t ssw_attr_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size) +{ + struct ssw_sys_entry *entry = container_of(attr, struct ssw_sys_entry, attr); + return entry->store(kobj, buffer, size); +} + +ssize_t ssw_mode_show(struct kobject *kobj, char *buffer) +{ + int remain = PAGE_SIZE; + int len; + char *ptr = buffer; + + len = scnprintf(ptr, remain, "0x%x\n", get_current_ssw_mode()); + ptr += len; + remain -= len; + SSW_DBG("ssw_mode_show\n"); + + return (PAGE_SIZE-remain); +} + +ssize_t ssw_mode_store(struct kobject *kobj, const char *buffer, size_t size) +{ + int mode; + int res = sscanf(buffer, "%x", &mode); + + if (res != 1) + { + printk("%s: expect 1 numbers\n", __FUNCTION__); + } + else + { + SSW_DBG("ssw_mode_store %d\n", mode); + //Switch sim mode + if ((sim_mode_curr != mode) && (SSW_SUCCESS == set_sim_gpio(mode))) + { + sim_mode_curr = mode; + } + } + return size; +} +/*---------------------------------------------------------------------------*/ + + + +int get_current_ssw_mode(void) +{ + return sim_mode_curr; +} + + +static int set_sim_gpio(unsigned int mode) +{ + SSW_DBG("set_sim_gpio %d\n", mode); + + switch(mode) + { + case SINGLE_TALK_MDSYS: + #if defined(GPIO_SIM1_SCLK) && defined(GPIO_SIM1_SIO) && defined(GPIO_SIM2_SCLK) && defined(GPIO_SIM2_SIO) + mt_set_gpio_mode(GPIO_SIM1_SCLK, 1); //SIM1_SCLK + mt_set_gpio_mode(GPIO_SIM1_SIO, 1); //SIM1_SIO + mt_set_gpio_mode(GPIO_SIM2_SCLK, 1); //SIM2_SCLK + mt_set_gpio_mode(GPIO_SIM2_SIO, 1); //SIM2_SIO + //mt_set_gpio_mode(GPIO_SIM1_SRST, 4); //SIM1_SRST, 6582 not use reset pin + //mt_set_gpio_mode(GPIO_SIM2_SRST, 4); //SIM2_SRST, 6582 not use reset pin + #endif + break; + + default: + SSW_DBG("Mode(%d) not supported!!!", mode); + return SSW_INVALID_PARA; + } + +#if 0 + SSW_DBG("Current sim mode(%d), GPIO0_MODE(%d, %d), GPIO1_MODE(%d, %d), GPIO2_MODE(%d, %d), GPIO3_MODE(%d, %d), GPIO89_MODE(%d, %d), GPIO90_MODE(%d, %d)\n", \ + mode, mt_get_gpio_mode(GPIO0), mt_get_gpio_dir(GPIO0), mt_get_gpio_mode(GPIO1), mt_get_gpio_dir(GPIO1), \ + mt_get_gpio_mode(GPIO2), mt_get_gpio_dir(GPIO2), mt_get_gpio_mode(GPIO3), mt_get_gpio_dir(GPIO3), \ + mt_get_gpio_mode(GPIO89), mt_get_gpio_dir(GPIO89), mt_get_gpio_mode(GPIO90), mt_get_gpio_dir(GPIO90)); +#else + #if defined(GPIO_SIM1_SCLK) && defined(GPIO_SIM1_SIO) && defined(GPIO_SIM2_SCLK) && defined(GPIO_SIM2_SIO) + SSW_DBG("Current sim mode(%d), GPIO_SIM1_SCLK_MODE(%d, %d), GPIO_SIM1_SIO_MODE(%d, %d), GPIO_SIM2_SCLK_MODE(%d, %d), GPIO_SIM2_SIO_MODE(%d, %d)\n", \ + mode, mt_get_gpio_mode(GPIO_SIM1_SCLK), mt_get_gpio_dir(GPIO_SIM1_SCLK), mt_get_gpio_mode(GPIO_SIM1_SIO), mt_get_gpio_dir(GPIO_SIM1_SIO), \ + mt_get_gpio_mode(GPIO_SIM2_SCLK), mt_get_gpio_dir(GPIO_SIM2_SCLK), mt_get_gpio_mode(GPIO_SIM2_SIO), mt_get_gpio_dir(GPIO_SIM2_SIO)); + #endif +#endif + + return SSW_SUCCESS; +} + + +int switch_sim_mode(int id, char *buf, unsigned int len) +{ + unsigned int mode = *((unsigned int *)buf); + + SSW_DBG("sim switch: %d(%d)\n", mode, sim_mode_curr); + + mutex_lock(&sim_switch_mutex); + + if ((sim_mode_curr != mode) && (SSW_SUCCESS == set_sim_gpio(mode))) + { + sim_mode_curr = mode; + } + + mutex_unlock(&sim_switch_mutex); + + SSW_DBG("sim switch(%d) OK\n", sim_mode_curr); + + return 0; + +} +EXPORT_SYMBOL(switch_sim_mode); + +//To decide sim mode according to compile option +static int get_sim_mode_init(void) +{ + unsigned int sim_mode = 0; + unsigned int md1_enable, md2_enable = 0; + + md1_enable = get_modem_is_enabled(MD_SYS1); + md2_enable = get_modem_is_enabled(MD_SYS2); + + if (md1_enable){ + sim_mode = SINGLE_TALK_MDSYS; + if (md2_enable) + sim_mode = DUAL_TALK; + } + else if (md2_enable) + sim_mode = SINGLE_TALK_MDSYS_LITE; + + return sim_mode; +} + +//sim switch hardware initial +static int sim_switch_init(void) +{ + SSW_DBG("sim_switch_init\n"); + + //better to set pull_en and pull_sel first, then mode + //if GPIO in sim mode, no need to set direction, because hw has done this when setting mode + /* + mt_set_gpio_dir(GPIO_SIM1_SCLK, GPIO_DIR_OUT); //GPIO0->SIM2_CLK, out + mt_set_gpio_dir(GPIO_SIM1_SIO, GPIO_DIR_IN); //GPIO1->SIM2_SIO, in + mt_set_gpio_dir(GPIO_SIM2_SCLK, GPIO_DIR_OUT); //GPIO2->SIM1_CLK, out + mt_set_gpio_dir(GPIO_SIM2_SIO, GPIO_DIR_IN); //GPIO3->SIM1_SIO, in + */ + //mt_set_gpio_dir(GPIO89, GPIO_DIR_OUT); //GPIO89->SIM1_SRST, out, 6572 not use reset pin + //mt_set_gpio_dir(GPIO90, GPIO_DIR_OUT); //GPIO90->SIM2_SRST, out, 6572 not use reset pin + + sim_mode_curr = get_sim_mode_init(); + if (SSW_SUCCESS != set_sim_gpio(sim_mode_curr)) + { + SSW_DBG("sim_switch_init fail \n"); + return SSW_INVALID_PARA; + } + + return 0; +} + + +static int sim_switch_probe(struct platform_device *dev) +{ + SSW_DBG("Enter sim_switch_probe\n"); + + //sim_switch_init(); + + mutex_init(&sim_switch_mutex); + + //register_ccci_kern_func(ID_SSW_SWITCH_MODE, switch_sim_mode); + + return 0; +} + +static int sim_switch_remove(struct platform_device *dev) +{ + //SSW_DBG("sim_switch_remove \n"); + return 0; +} + +static void sim_switch_shutdown(struct platform_device *dev) +{ + //SSW_DBG("sim_switch_shutdown \n"); +} + +static int sim_switch_suspend(struct platform_device *dev, pm_message_t state) +{ + //SSW_DBG("sim_switch_suspend \n"); + return 0; +} + +static int sim_switch_resume(struct platform_device *dev) +{ + //SSW_DBG("sim_switch_resume \n"); + return 0; +} + + +static struct platform_driver sim_switch_driver = +{ + .driver = { + .name = "sim-switch", + }, + .probe = sim_switch_probe, + .remove = sim_switch_remove, + .shutdown = sim_switch_shutdown, + .suspend = sim_switch_suspend, + .resume = sim_switch_resume, +}; + + +static int __init sim_switch_driver_init(void) +{ + int ret = 0; + + SSW_DBG("sim_switch_driver_init\n"); + ret = platform_driver_register(&sim_switch_driver); + if (ret) { + SSW_DBG("ssw_driver register fail(%d)\n", ret); + return ret; + } +#if __ENABLE_SSW_SYSFS + ssw_sysfs_init(); +#endif + + sim_switch_init(); + + return ret; +} + + +static void __exit sim_switch_driver_exit(void) +{ + return; +} + + +module_init(sim_switch_driver_init); +module_exit(sim_switch_driver_exit); + + +MODULE_DESCRIPTION("MTK SIM Switch Driver"); +MODULE_AUTHOR("Anny "); +MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-mt8127/ford/touchpanel/AmazonA+_5436i_ofilm0x51_V0x1a_20160128_app.i b/arch/arm/mach-mt8127/ford/touchpanel/AmazonA+_5436i_ofilm0x51_V0x1a_20160128_app.i new file mode 100644 index 00000000000..a1fc3feae5b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/AmazonA+_5436i_ofilm0x51_V0x1a_20160128_app.i @@ -0,0 +1,1816 @@ +0x2, 0x69,0xbd,0x2, 0x64,0x14,0x7e,0xb3,0xf, 0x20,0xb4,0x1, 0x4, 0xe4,0x12,0xf, +0xf8,0xe4,0x7a,0xb3,0xe, 0x3c,0x7a,0xb3,0xe, 0x4d,0x22,0x2, 0x4d,0xf, 0xe5,0x1a, +0xc4,0x54,0x7, 0xb4,0x2, 0x3, 0x74,0x1, 0x22,0xe4,0x22,0x2, 0x5f,0xea,0xc2,0x8e, +0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2, +0x8e,0x22,0x22,0x2, 0x3f,0xf6,0x7e,0x34,0xe, 0x2a,0x12,0x6a,0x48,0x7e,0x34,0xe, +0x2a,0x12,0x6d,0x80,0xe5,0x67,0x60,0xfc,0x22,0x22,0xff,0x2, 0x58,0xf3,0x7c,0xab, +0x4c,0x77,0x7e,0x34,0xb, 0xd2,0xa, 0x2a,0x68,0x3, 0x2, 0x2f,0xdd,0x2, 0x5e,0x96, +0x2, 0x5c,0xc7,0x2, 0x5c,0xff,0xca,0x3b,0x7c,0xe7,0x7c,0xdb,0x75,0x40,0x0, 0x7e, +0x83,0xc, 0xdf,0x4c,0x88,0x78,0xe, 0x7e,0x34,0x10,0x6c,0x7e,0x24,0x0, 0x5, 0xe4, +0x12,0x6f,0x1, 0xc1,0x7e,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x33,0xc, 0xcb, +0xbe,0x34,0xff,0xff,0x78,0x7, 0xe4,0xa, 0x3a,0x19,0xb3,0x10,0x6c,0xb, 0xa0,0xbe, +0xa0,0x5, 0x78,0xe3,0x6c,0xaa,0x80,0x43,0x7e,0x70,0x7, 0xac,0x7a,0x9, 0x93,0xc, +0x5c,0x49,0x83,0xc, 0x58,0x49,0x93,0xc, 0x5a,0xa, 0x39,0x9, 0xb3,0x10,0x6c,0x70, +0x28,0x6c,0x77,0x7e,0x30,0x14,0xac,0x39,0x7e,0x50,0x4, 0xac,0x57,0x2d,0x21,0x59, +0x82,0x10,0x8, 0x7e,0x30,0x14,0xac,0x39,0x7e,0x50,0x4, 0xac,0x57,0x2d,0x21,0x59, +0x92,0x10,0xa, 0xb, 0x70,0xa5,0xbf,0x5, 0xda,0xb, 0xa0,0xbc,0x8a,0x38,0xb9,0x9f, +0x11,0x7a,0x1f,0x10,0x9e,0x7a,0x1f,0x10,0xa2,0x7a,0x1f,0x10,0xcc,0x74,0x7, 0xac, +0xbe,0x49,0x35,0xc, 0x58,0x49,0x25,0xc, 0x5a,0x74,0x7, 0xac,0xbd,0x49,0x15,0xc, +0x7b,0x49,0x5, 0xc, 0x7d,0x12,0x61,0xe6,0x7d,0xf3,0x74,0x7, 0xac,0xbd,0x9, 0xf5, +0xc, 0x7f,0xbe,0xf0,0x5, 0x40,0x2, 0x6c,0xff,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, +0x58,0x49,0x25,0xc, 0x5a,0x74,0x4, 0xac,0xbf,0x49,0x15,0x10,0xa6,0x49,0x5, 0x10, +0xa8,0x12,0x61,0xe6,0x7d,0x3f,0x6d,0x22,0x7e,0x33,0x10,0xc7,0xa, 0x13,0x6d,0x0, +0x12,0x68,0x4c,0x7e,0x17,0xd, 0x57,0x12,0x68,0x66,0x7d,0xf3,0x7e,0x73,0x10,0xc8, +0xa, 0xe7,0xbd,0xef,0x28,0x2, 0x7d,0xfe,0x75,0x40,0x0, 0x6c,0xcc,0x7e,0x90,0x14, +0xac,0x9f,0x49,0x24,0x10,0xc, 0x49,0x34,0x10,0x10,0xbd,0x32,0x78,0xe, 0x49,0x54, +0x10,0xe, 0x49,0x34,0x10,0x12,0xbd,0x35,0x78,0x2, 0xa1,0x60,0x7e,0xb3,0x10,0xc5, +0xf5,0x41,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, 0x58,0x1e,0x34,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x9d,0x32,0x12,0x6e,0xf1,0x1a,0x26,0x1a,0x24,0x7a,0x1f,0x10,0x9e,0x74, +0x7, 0xac,0xbe,0x49,0x35,0xc, 0x5a,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x74, +0x14,0xac,0xbf,0x49,0x25,0x10,0xe, 0x9d,0x32,0x12,0x6e,0xf1,0x1a,0x26,0x1a,0x24, +0x7a,0x1f,0x10,0xa2,0x7d,0x13,0x7e,0x1f,0x10,0x9e,0x7d,0xe3,0x2d,0xe1,0x7a,0xe7, +0x10,0x0, 0xbe,0xe4,0x0, 0x4, 0x8, 0x74,0xbe,0x18,0x0, 0x0, 0x78,0x6, 0xb, 0x1c, +0x7a,0x1f,0x10,0x9e,0x7e,0x1f,0x10,0xa2,0xbe,0x18,0x0, 0x0, 0x78,0xa, 0x7e,0x1f, +0x10,0xa2,0xb, 0x1c,0x7a,0x1f,0x10,0xa2,0x7e,0xe4,0x0, 0x64,0x7e,0x6f,0x10,0xa2, +0x7f,0x16,0x7d,0x1e,0x12,0x68,0x5d,0x7e,0x5f,0x10,0x9e,0x7f,0x5, 0x12,0x68,0xb9, +0x7f,0x1, 0x7a,0xf, 0x10,0xcc,0xe5,0x41,0xa, 0x3b,0x6d,0x22,0xbf,0x10,0x8, 0x4, +0xb, 0xc0,0x80,0x28,0x7e,0x1f,0x10,0xcc,0xbe,0x18,0x0, 0x64,0x8, 0x1e,0x7f,0x15, +0x7d,0x1e,0x12,0x68,0x5d,0x7f,0x6, 0x12,0x68,0xb9,0x7f,0x1, 0x7a,0xf, 0x10,0xcc, +0xe5,0x41,0xa, 0x3b,0x6d,0x22,0xbf,0x10,0x8, 0x2, 0x5, 0x40,0x74,0x14,0xac,0xbf, +0x49,0x25,0x10,0xc, 0x49,0x35,0x10,0x10,0x9d,0x32,0x12,0x6e,0xf1,0x1a,0x26,0x1a, +0x24,0x7a,0x1f,0x10,0x9e,0x74,0x14,0xac,0xbf,0x49,0x25,0x10,0xe, 0x49,0x35,0x10, +0x12,0x9d,0x32,0x12,0x6e,0xf1,0x1a,0x26,0x1a,0x24,0x7a,0x1f,0x10,0xa2,0x7e,0x1f, +0x10,0x9e,0xbe,0x18,0x0, 0x0, 0x78,0x6, 0xb, 0x1c,0x7a,0x1f,0x10,0x9e,0x7e,0x1f, +0x10,0xa2,0xbe,0x18,0x0, 0x0, 0x78,0x6, 0xb, 0x1c,0x7a,0x1f,0x10,0xa2,0x7e,0xe4, +0x0, 0x64,0x7e,0x6f,0x10,0xa2,0x7f,0x16,0x7d,0x1e,0x12,0x68,0x5d,0x7e,0x5f,0x10, +0x9e,0x7f,0x5, 0x12,0x68,0xb9,0x7f,0x1, 0x7a,0xf, 0x10,0xcc,0xe5,0x41,0xa, 0x3b, +0x6d,0x22,0xbf,0x10,0x8, 0x4, 0xb, 0xc0,0x80,0x28,0x7e,0x1f,0x10,0xcc,0xbe,0x18, +0x0, 0x64,0x8, 0x1e,0x7f,0x15,0x7d,0x1e,0x12,0x68,0x5d,0x7f,0x6, 0x12,0x68,0xb9, +0x7f,0x1, 0x7a,0xf, 0x10,0xcc,0xe5,0x41,0xa, 0x3b,0x6d,0x22,0xbf,0x10,0x8, 0x2, +0x5, 0x40,0x74,0x14,0xac,0xbf,0x49,0x35,0x10,0x14,0x49,0x25,0x10,0x16,0x49,0x15, +0x10,0xc, 0x49,0x5, 0x10,0xe, 0x12,0x61,0xe6,0x7a,0x37,0x10,0x6, 0xbe,0x37,0x10, +0x0, 0x8, 0x2, 0xa1,0x4d,0xe5,0x41,0xa, 0xeb,0xbe,0xe7,0x10,0xba,0x7e,0x1f,0x10, +0xcc,0x40,0x13,0x2e,0x18,0x0, 0xf, 0x7d,0x1f,0x12,0x68,0x5d,0x2f,0x11,0x2f,0x11, +0x7e,0x8, 0x0, 0x55,0x80,0x11,0x2e,0x18,0x0, 0xf, 0x7d,0x1f,0x12,0x68,0x5d,0x2f, +0x11,0x2f,0x11,0x7e,0x8, 0x0, 0x46,0x12,0x68,0xb9,0x7a,0x1f,0x10,0xcc,0xe5,0x40, +0x60,0x2, 0xa1,0x1, 0x4c,0xcc,0x68,0x2, 0xa1,0x1, 0x74,0x14,0xac,0xbf,0x49,0x35, +0x10,0xc, 0x6d,0x22,0x49,0x15,0x10,0x14,0x6d,0x0, 0x9f,0x1, 0x7a,0xf, 0x10,0x9e, +0x7e,0x37,0x10,0x0, 0x7d,0x21,0x7e,0x17,0x10,0x6, 0x12,0x62,0x31,0x7d,0x13,0x1a, +0x2, 0x1a,0x0, 0x7a,0xf, 0x10,0x2, 0x74,0x14,0xac,0xbf,0x49,0x35,0x10,0xc, 0x6d, +0x22,0x2f,0x10,0x7a,0x1f,0x10,0x2, 0x7e,0x14,0x0, 0x10,0x7e,0x1f,0x10,0x2, 0x12, +0x68,0x5d,0x7a,0x1f,0x10,0x2, 0x74,0x7, 0xac,0xbe,0x49,0x15,0xc, 0x58,0x6d,0x0, +0x7e,0x1f,0x10,0x2, 0x2f,0x10,0x7a,0x1f,0x10,0x2, 0xbe,0x18,0x0, 0x0, 0x48,0x1d, +0x74,0x6, 0xac,0xbf,0x49,0xe5,0x10,0x7a,0x4d,0xee,0x78,0x11,0x7e,0x8, 0x0, 0x2, +0x12,0x68,0xb9,0x7d,0xe3,0x74,0x7, 0xac,0xbe,0x59,0xe5,0xc, 0x58,0x74,0x14,0xac, +0xbf,0x49,0x35,0x10,0xe, 0x6d,0x22,0x49,0x15,0x10,0x16,0x6d,0x0, 0x9f,0x1, 0x7a, +0xf, 0x10,0xa2,0x7e,0x37,0x10,0x0, 0x7d,0x21,0x7e,0x17,0x10,0x6, 0x12,0x62,0x31, +0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x7a,0xf, 0x10,0x2, 0x74,0x14,0xac,0xbf,0x49,0x35, +0x10,0xe, 0x6d,0x22,0x2f,0x10,0x7a,0x1f,0x10,0x2, 0x7e,0x14,0x0, 0x10,0x7e,0x1f, +0x10,0x2, 0x12,0x68,0x5d,0x7a,0x1f,0x10,0x2, 0x74,0x7, 0xac,0xbe,0x49,0x15,0xc, +0x5a,0x6d,0x0, 0x7e,0x1f,0x10,0x2, 0x2f,0x10,0x7a,0x1f,0x10,0x2, 0xbe,0x18,0x0, +0x0, 0x48,0x1d,0x74,0x6, 0xac,0xbf,0x49,0xe5,0x10,0x7a,0x4d,0xee,0x78,0x11,0x7e, +0x8, 0x0, 0x2, 0x12,0x68,0xb9,0x7d,0xe3,0x74,0x7, 0xac,0xbe,0x59,0xe5,0xc, 0x5a, +0x7e,0x90,0x6, 0xac,0x9f,0x49,0x54,0x10,0x76,0x4d,0x55,0x78,0x14,0x7e,0x1f,0x10, +0x9e,0x7d,0x53,0x59,0x54,0x10,0x76,0x7e,0x1f,0x10,0xa2,0x7d,0x53,0x59,0x54,0x10, +0x78,0x49,0x34,0x10,0x76,0x1a,0x26,0x1a,0x24,0x7e,0x6f,0x10,0x9e,0x7f,0x6, 0x12, +0x68,0x4c,0xbe,0x18,0x0, 0x0, 0x48,0x15,0x49,0x34,0x10,0x78,0x1a,0x26,0x1a,0x24, +0x7e,0xf, 0x10,0xa2,0x12,0x68,0x4c,0xbe,0x18,0x0, 0x0, 0x58,0x34,0x74,0x6, 0xac, +0xbf,0x49,0xe5,0x10,0x7a,0xbe,0xe4,0x0, 0x3, 0x58,0xe, 0x7e,0x70,0x6, 0xac,0x7f, +0x2e,0x34,0x10,0x7a,0xb, 0xe4,0x1b,0x38,0xe0,0x7d,0xed,0x74,0x6, 0xac,0xbf,0x59, +0xe5,0x10,0x76,0x7e,0x1f,0x10,0xa2,0x7d,0xe3,0x74,0x6, 0xac,0xbf,0x59,0xe5,0x10, +0x78,0xe5,0x40,0xbe,0xb0,0x2, 0x40,0xe, 0x74,0x6, 0xac,0xbf,0x49,0x45,0x10,0x7a, +0xbe,0x44,0x0, 0x2, 0x48,0x5, 0x75,0x40,0x0, 0x80,0xc, 0x4d,0x44,0x78,0x8, 0x7e, +0xe4,0x0, 0x1, 0x59,0xe5,0x10,0x7a,0xbe,0xc0,0x2, 0x40,0xf, 0x7e,0x70,0x6, 0xac, +0x7f,0x49,0x23,0x10,0x7a,0xbe,0x24,0x0, 0x2, 0x48,0x4, 0x6c,0xcc,0x80,0x33,0x4d, +0x22,0x78,0x2f,0x7e,0xe4,0x0, 0x1, 0x59,0xe3,0x10,0x7a,0x80,0x25,0x7e,0xe4,0x0, +0x2, 0x74,0x6, 0xac,0xbf,0x59,0xe5,0x10,0x7a,0x75,0x40,0x0, 0x6c,0xcc,0x80,0x12, +0x6d,0xee,0x74,0x6, 0xac,0xbf,0x59,0xe5,0x10,0x76,0x59,0xe5,0x10,0x78,0x59,0xe5, +0x10,0x7a,0xbe,0xf4,0x1, 0x0, 0x28,0x4, 0x7e,0xf4,0x1, 0x0, 0x74,0x7, 0xac,0xbd, +0x49,0x25,0xc, 0x7b,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, 0x58,0x9d,0x32,0x12,0x6e, +0xf1,0x7d,0x13,0xe5,0x40,0x60,0x1f,0x7e,0x2f,0x10,0xcc,0x7d,0x31,0x6d,0x22,0x7f, +0x2, 0x12,0x68,0x4c,0x74,0xa, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14, +0x78,0xf4,0x7d,0x13,0x80,0xc, 0x7d,0x31,0xad,0x3f,0x7c,0x76,0x7c,0x65,0xa, 0x24, +0x7d,0x13,0x7e,0x70,0x7, 0xac,0x7d,0x49,0x3, 0xc, 0x7b,0x74,0x7, 0xac,0xbe,0x49, +0x25,0xc, 0x58,0xbd,0x20,0x7d,0xe3,0x28,0xd, 0x2e,0xe4,0xc, 0x7b,0x7d,0x20,0x2d, +0x21,0x1b,0xe8,0x20,0x80,0x9, 0x2e,0xe4,0xc, 0x7b,0x9d,0x1, 0x1b,0xe8,0x0, 0x74, +0x7, 0xac,0xbd,0x49,0x25,0xc, 0x7d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, 0x5a,0x9d, +0x32,0x12,0x6e,0xf1,0x7d,0x13,0x4c,0xcc,0x68,0x1f,0x7e,0x2f,0x10,0xcc,0x7d,0x31, +0x6d,0x22,0x7f,0x2, 0x12,0x68,0x4c,0x74,0xa, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e, +0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x80,0xc, 0x7d,0x31,0xad,0x3f,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7d,0x13,0x7e,0x10,0x7, 0xac,0x1d,0x49,0x30,0xc, 0x7d,0x74,0x7, +0xac,0xbe,0x49,0x25,0xc, 0x5a,0xbd,0x23,0x28,0xd, 0x2e,0x4, 0xc, 0x7d,0x7d,0x23, +0x2d,0x21,0x1b,0x8, 0x20,0x80,0xe, 0x7e,0x50,0x7, 0xac,0x5d,0x2e,0x24,0xc, 0x7d, +0x9d,0x31,0x1b,0x28,0x30,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xc, 0x58,0x74,0x4, +0xac,0xbf,0x59,0x35,0x10,0xa6,0x49,0x34,0xc, 0x5a,0x59,0x35,0x10,0xa8,0xda,0x3b, +0x22,0xca,0xd8,0xca,0x79,0x6d,0xff,0x7e,0xb3,0xc, 0xdf,0x70,0x2, 0xe1,0x46,0x7e, +0xb3,0xc, 0xe0,0x60,0x2, 0xe1,0x46,0x7e,0xf3,0xb, 0x96,0x7e,0xd3,0xb, 0x97,0x6d, +0x0, 0x6c,0xee,0x6c,0xaa,0xa, 0x4d,0x80,0x39,0x7e,0x30,0x18,0xac,0x3f,0x2d,0x14, +0x3e,0x14,0x2e,0x17,0xd, 0xdd,0xb, 0x18,0xe0,0xbe,0xe4,0x0, 0x3c,0x8, 0x29,0xb, +0xe0,0xbe,0xf0,0x0, 0x28,0xd, 0x7d,0xe1,0x9e,0xe4,0x0, 0x30,0xb, 0xe8,0xe0,0x2d, +0xe, 0xb, 0xa0,0xbe,0xf0,0xc, 0x50,0x8, 0x49,0xe1,0x0, 0x30,0x2d,0xe, 0xb, 0xa0, +0x1b,0x44,0xbe,0x44,0x0, 0x0, 0x58,0xc1,0xa, 0x4d,0x80,0x37,0x7e,0x30,0x18,0xac, +0x3f,0x2d,0x14,0x3e,0x14,0x2e,0x17,0xd, 0xdd,0xb, 0x18,0xe0,0xbe,0xe4,0x0, 0x3c, +0x8, 0x2d,0xb, 0xe0,0xbe,0xf0,0x0, 0x28,0xd, 0x7d,0xe1,0x9e,0xe4,0x0, 0x30,0xb, +0xe8,0xe0,0x2d,0xe, 0xb, 0xa0,0xbe,0xf0,0xc, 0x50,0x8, 0x49,0xe1,0x0, 0x30,0x2d, +0xe, 0xb, 0xa0,0x7d,0xe4,0xb, 0xe4,0x7d,0x4e,0xbe,0xe4,0x0, 0x18,0x48,0xbd,0xbe, +0xe0,0x3, 0x50,0x2, 0x80,0x10,0x7d,0x30,0x12,0x6e,0xf1,0xa, 0x2a,0x12,0x68,0x1a, +0xbe,0x34,0x0, 0xf, 0x8, 0x6, 0x75,0x15,0x0, 0xe4,0x80,0x7f,0x6d,0xee,0x7e,0x30, +0x18,0xac,0x3f,0xa, 0x3d,0x2d,0x13,0x3e,0x14,0x2e,0x17,0xd, 0xdd,0xbe,0xf0,0x0, +0x28,0xb, 0x7d,0x31,0x9e,0x34,0x0, 0x30,0xb, 0x38,0x30,0x2d,0xe3,0xbe,0xf0,0xc, +0x50,0x6, 0x49,0x31,0x0, 0x30,0x2d,0xe3,0x7e,0x70,0x8, 0x80,0x1c,0x7e,0x50,0x2, +0xac,0x57,0x9, 0x62,0x10,0xd0,0x1a,0x26,0xbd,0x2e,0x8, 0xd, 0x7e,0x50,0x2, 0xac, +0x57,0x9, 0x62,0x10,0xd1,0x1a,0x26,0x2d,0xf2,0x7c,0x67,0x1b,0x70,0xa5,0xbe,0x0, +0xdc,0xb, 0x18,0x30,0x12,0x6e,0xf1,0xbe,0x34,0x3, 0xe8,0x8, 0x4, 0x2e,0xf4,0x0, +0x28,0xbe,0xf4,0x0, 0xfa,0x28,0x4, 0x7e,0xf4,0x0, 0xfa,0xe5,0x15,0xa, 0xeb,0xbd, +0xef,0x50,0x6, 0x7d,0x3f,0x7c,0xb7,0xf5,0x15,0xe5,0x15,0xda,0x79,0xda,0xd8,0x22, +0x6d,0x33,0x7a,0x37,0xf, 0x18,0x74,0x1, 0x7a,0xb3,0xf, 0x1a,0x74,0x8, 0x7a,0xb3, +0xf, 0x1b,0x74,0xc, 0x7a,0xb3,0xf, 0x1c,0x74,0x1e,0x7a,0xb3,0xf, 0x1d,0x7a,0xb3, +0xf, 0x1e,0x74,0xa, 0x7a,0xb3,0xf, 0x1f,0x74,0x1, 0x7a,0xb3,0xf, 0x20,0x22,0xff, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x46,0xc, 0x75,0x47,0x0, +0x75,0x48,0x17,0x75,0x49,0x0, 0x7e,0x34,0x11,0xfd,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6f,0x1, 0x75,0x3f,0x0, 0x1, 0xe5,0x7e,0x71,0x3f,0x74,0x2, 0xac,0x7b,0x9, 0xb3, +0xb, 0x96,0xf5,0x40,0x9, 0x73,0xb, 0x97,0x7a,0x71,0x41,0x7c,0xab,0x1b,0xa1,0x7a, +0xa1,0x42,0xb, 0xb1,0xf5,0x43,0x7c,0xb7,0x24,0xfe,0xf5,0x44,0x7c,0xb7,0xb, 0xb1, +0xf5,0x45,0xbe,0xa0,0x0, 0x58,0x3, 0x75,0x42,0x0, 0x7e,0xa3,0xe, 0x2a,0xa, 0x2a, +0x1b,0x24,0xe5,0x43,0x1a,0x3b,0xbd,0x32,0x8, 0x5, 0x7c,0xba,0x14,0xf5,0x43,0xe5, +0x44,0xbe,0xb0,0x0, 0x58,0x3, 0x75,0x44,0x0, 0x7e,0xa3,0xe, 0x2b,0xa, 0x2a,0x1b, +0x24,0xe5,0x45,0x1a,0x3b,0xbd,0x32,0x8, 0x5, 0x7c,0xba,0x14,0xf5,0x45,0xe5,0x42, +0xbe,0xb1,0x46,0x58,0x3, 0x85,0x42,0x46,0xe5,0x43,0xbe,0xb1,0x47,0x8, 0x3, 0x85, +0x43,0x47,0xe5,0x44,0xbe,0xb1,0x48,0x58,0x3, 0x85,0x44,0x48,0xe5,0x45,0xbe,0xb1, +0x49,0x8, 0x3, 0x85,0x45,0x49,0x7e,0xf1,0x42,0x80,0x22,0x7e,0xe1,0x44,0x80,0x15, +0x7e,0x34,0x11,0xfd,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x1a,0x2e,0x2d,0x21, +0x12,0x2f,0xdd,0xb, 0xe0,0xe5,0x45,0xbc,0xbe,0x58,0xe5,0xb, 0xf0,0xe5,0x43,0xbc, +0xbf,0x58,0xd8,0x5, 0x3f,0x7e,0x73,0xc, 0x3d,0xbe,0x71,0x3f,0x28,0x2, 0x1, 0x27, +0xbe,0x70,0x0, 0x38,0x2, 0x81,0x8a,0x7e,0xe1,0x48,0x81,0x82,0x6c,0xff,0x80,0x1f, +0x1a,0x3e,0x3e,0x34,0x1a,0x2f,0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36, +0xb, 0x38,0x30,0xe, 0x34,0xe, 0x34,0x3e,0x24,0x59,0x32,0x11,0xe3,0xb, 0xf0,0x7e, +0x73,0xe, 0x2a,0xbc,0x7f,0x18,0xd9,0x7e,0xf1,0x46,0x81,0x78,0x7e,0x34,0x11,0xfd, +0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x1a,0x2e,0x2d,0x21,0x12,0x5f,0x74,0x70, +0x2, 0x81,0x76,0x1a,0xf, 0x7d,0x10,0x3e,0x14,0x49,0x31,0x11,0xdd,0x7a,0x35,0x4c, +0x49,0x31,0x11,0xdf,0x7a,0x35,0x4e,0x49,0x31,0x11,0xe1,0x7a,0x35,0x50,0x49,0x31, +0x11,0xe3,0x7a,0x35,0x52,0x49,0x31,0x11,0xe5,0x7a,0x35,0x54,0x49,0x31,0x11,0xe7, +0x7a,0x35,0x56,0x49,0x11,0x11,0xe9,0x7a,0x15,0x58,0xbe,0xf0,0x3, 0x48,0x6b,0x7e, +0x73,0xe, 0x2a,0xa, 0x17,0x1b,0x16,0xbd,0x1, 0x18,0x5f,0x7e,0x35,0x56,0x2e,0x35, +0x4e,0x7d,0x23,0x3e,0x24,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x15,0x58, +0x2e,0x15,0x4c,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x32,0x7e,0x25,0x54,0x2e,0x25, +0x50,0x7d,0x12,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x21,0x9d,0x32,0x7e,0x15,0x52,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x7d,0x21,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x9d,0x25,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x81,0x4d,0x4c,0xff,0x78,0x50,0x7e,0x35, +0x52,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x7d,0x23,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x3e,0x34,0x2d,0x32,0x2e, +0x35,0x52,0x7e,0x25,0x54,0x7d,0x12,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d, +0x31,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x7e,0x15,0x56,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x13,0x9e,0x15,0x56,0x7e,0x35,0x58,0x3e,0x34,0x61,0xf4,0xbe,0xf0, +0x1, 0x78,0x5b,0x7e,0x25,0x50,0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x23,0x7e,0x35,0x52,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x9d,0x31,0x9d,0x32,0x7e,0x25,0x54,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x9d,0x32,0x7e,0x15,0x56,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2e, +0x15,0x56,0x2d,0x13,0x7e,0x35,0x58,0x3e,0x34,0x2e,0x35,0x58,0x61,0xf4,0xbe,0xf0, +0x2, 0x78,0x72,0x7e,0x25,0x52,0x7d,0x12,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x9d,0x31,0x3e,0x24,0x3e,0x24,0x2d,0x23,0x7e,0x15,0x50,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x2e,0x15,0x50,0x7e,0x35,0x4e,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x9e,0x35,0x4e,0x9d,0x31,0x2d,0x32,0x7e,0x25,0x54,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x2e,0x25,0x54,0x9d,0x32,0x7e,0x15,0x56,0x7d,0x21,0x3e, +0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x2d,0x13,0x7e,0x35,0x58,0x3e,0x34, +0x2e,0x35,0x58,0x61,0xf4,0x7e,0xa3,0xe, 0x2a,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x78, +0x72,0x7e,0x25,0x4e,0x7d,0x32,0x3e,0x34,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x23, +0x7e,0x35,0x4c,0x3e,0x34,0x2e,0x35,0x4c,0x9d,0x23,0x7e,0x35,0x50,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2e,0x35,0x50,0x9d,0x23,0x7e,0x35,0x52,0x7d, +0x43,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x14,0x3e,0x34,0x3e,0x34,0x2d, +0x31,0x2d,0x32,0x7e,0x25,0x54,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x2e,0x25,0x54,0x9d,0x32,0x7e,0x15,0x56,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9e,0x15, +0x56,0x81,0x4d,0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x5d,0x7e,0x25,0x4c,0x3e,0x24, +0x2e,0x25,0x4c,0x7e,0x35,0x4e,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2e,0x35,0x4e,0x9d, +0x32,0x7e,0x25,0x50,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32, +0x7e,0x15,0x52,0x7d,0x21,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x12,0x2d,0x13,0x7e, +0x35,0x54,0x7d,0x23,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x2d,0x32,0x9d,0x13,0x80,0x57,0x7c,0xba,0x14,0xbc,0xbf,0x78,0x53,0x7e, +0x35,0x4e,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9e,0x35,0x4e,0x7e,0x25,0x4c,0x3e,0x24, +0x9d,0x32,0x7e,0x25,0x50,0x7d,0x12,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x9d,0x32,0x7e,0x15,0x52,0x7d,0x51,0x3e,0x54, +0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7d,0x21,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x25,0x3e,0x14,0x2d,0x12,0x2e,0x15,0x52,0x2d,0x13,0x7a, +0x15,0x4a,0x7e,0x25,0x4a,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, +0x24,0x3e,0x24,0x3e,0x24,0x1a,0x3e,0x3e,0x34,0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d, +0x31,0x2d,0x36,0x1b,0x38,0x20,0xb, 0xf0,0xe5,0x47,0xbc,0xbf,0x48,0x2, 0x21,0x2c, +0xb, 0xe0,0xe5,0x49,0xbc,0xbe,0x48,0x2, 0x1, 0xfc,0xda,0x3b,0x22,0xca,0x3b,0x75, +0x41,0x0, 0x6c,0xcc,0x6c,0xdd,0x7e,0xc4,0xff,0xff,0x75,0x43,0xff,0x7e,0xb3,0xc, +0x3d,0x7e,0xe7,0xd, 0x4e,0xb4,0x1, 0x4, 0x1e,0xe4,0x80,0x0, 0x1e,0xe4,0x1e,0xe4, +0x2e,0xe7,0xd, 0x4e,0xf5,0x3f,0x7e,0xf7,0xd, 0xdd,0x7e,0x34,0x12,0x1, 0x7e,0x24, +0x0, 0x1e,0xe4,0x12,0x6f,0x1, 0x7e,0x31,0x3f,0x74,0x2, 0xac,0x3b,0x7e,0x24,0xb, +0x96,0x7e,0x34,0x11,0xe3,0x12,0x6e,0xc8,0x75,0x40,0x0, 0x6c,0xee,0xc1,0x3f,0x7e, +0x14,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0xff,0xa1,0xa8,0x74,0x2, 0xac,0xbf,0x9, 0xb5, +0x11,0xe3,0xbe,0xb0,0xff,0x78,0x2, 0xa1,0xa6,0x7c,0xbf,0x12,0x64,0x2, 0x70,0x2, +0xa1,0xa6,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x11,0xe4,0xa, 0x27,0x74,0x2, 0xac,0xbe, +0x9, 0x75,0x12,0x67,0xa, 0x37,0x9d,0x32,0x12,0x6e,0xf1,0x7d,0x3, 0x74,0x2, 0xac, +0xbf,0x9, 0x75,0x11,0xe3,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x12,0x66,0xa, +0x37,0x9d,0x32,0x12,0x6e,0xf1,0x2d,0x3, 0xbd,0x10,0x40,0x6a,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x11,0xe3,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x12,0x66,0xa, 0x37, +0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x3, 0x18,0x4b,0x74,0x2, 0xac,0xbf,0x9, +0x75,0x11,0xe4,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x12,0x67,0xa, 0x37,0x9d, +0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x3, 0x18,0x2c,0xbd,0x10,0x78,0x21,0x7d,0x10, +0x7a,0xe1,0x42,0x7c,0xbc,0x12,0x60,0xbc,0x7d,0x43,0x7c,0xbf,0x12,0x60,0xbc,0xbd, +0x34,0x8, 0x7, 0x7a,0xc1,0x43,0x7c,0xcf,0x80,0xc, 0x7a,0xf1,0x43,0x80,0x7, 0x7d, +0x10,0x7c,0xcf,0x7a,0xe1,0x42,0xb, 0xf0,0xe5,0x3f,0xbc,0xbf,0x28,0x2, 0x81,0xea, +0xbe,0xc0,0xff,0x78,0x2, 0xc1,0x3d,0xe5,0x42,0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7d,0x23,0x5d,0x2c,0x68,0x2d,0x7e,0x50,0x2, 0xac,0x5c,0x9, +0x12,0x11,0xe3,0x74,0x2, 0xac,0xbd,0x19,0x15,0x12,0x1, 0x9, 0x12,0x11,0xe4,0x19, +0x15,0x12,0x2, 0x74,0xff,0x19,0xb2,0x11,0xe3,0x5, 0x40,0xb, 0xd0,0x7e,0x24,0xff, +0xff,0x9d,0x23,0x5d,0xc2,0x80,0x46,0x7e,0x90,0x2, 0xac,0x9c,0x9, 0x14,0x11,0xe3, +0x7e,0x50,0x18,0xac,0x51,0x9, 0xa4,0x11,0xe4,0xa, 0xba,0x2d,0x2b,0x3e,0x24,0x2d, +0x2f,0xb, 0x28,0x20,0xbd,0x2e,0x40,0x25,0x7e,0x50,0x2, 0xac,0x5d,0x19,0x12,0x12, +0x1, 0x19,0xa2,0x12,0x2, 0x7e,0xa0,0xff,0x7e,0x50,0x2, 0xac,0x5c,0x19,0xa2,0x11, +0xe3,0x5, 0x40,0xb, 0xd0,0x7e,0x4, 0xff,0xff,0x9d,0x3, 0x5d,0xc0,0xb, 0xe0,0xe5, +0x5c,0xbc,0xbe,0x28,0x2, 0x81,0xdf,0xbe,0xd1,0x5c,0x50,0x2, 0xc1,0xfd,0x7e,0xe1, +0x40,0xc1,0xf6,0x6d,0xdd,0x7e,0x30,0xff,0x6c,0xff,0x80,0x4a,0x7c,0xbf,0x12,0x64, +0x2, 0x60,0x41,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xa2,0x11,0xe3,0xbe,0xa0,0xff,0x68, +0x33,0x7e,0x10,0x18,0xac,0x1a,0x9, 0x22,0x11,0xe4,0xa, 0x32,0x2d,0x3, 0x3e,0x4, +0x7d,0x30,0x2d,0x3f,0xb, 0x38,0xc0,0xbe,0xc4,0x0, 0x0, 0x58,0x5, 0x6d,0xcc,0x1b, +0x38,0xc0,0x2d,0xf, 0xb, 0x8, 0xc0,0xbd,0xcd,0x8, 0x9, 0x7a,0xa1,0x41,0x7c,0xc2, +0x7d,0xdc,0x7c,0x3f,0xb, 0xf0,0xe5,0x3f,0xbc,0xbf,0x38,0xb0,0xbe,0x30,0xff,0x68, +0x43,0xbd,0xed,0x50,0x3f,0x7e,0x70,0x2, 0xac,0x73,0x9, 0x43,0x11,0xe3,0x7e,0x50, +0x18,0xac,0x45,0x9, 0x23,0x11,0xe4,0xa, 0xc2,0x2d,0x2c,0x3e,0x24,0x2d,0x2f,0xb, +0x28,0x20,0xbe,0x27,0xd, 0x4e,0x40,0x1c,0xbe,0x31,0x43,0x68,0x17,0x7e,0x21,0x41, +0x74,0x2, 0xac,0xbd,0x19,0x25,0x12,0x1, 0x19,0xc5,0x12,0x2, 0x74,0xff,0x19,0xb3, +0x11,0xe3,0xb, 0xd0,0xb, 0xe0,0xbe,0xe0,0x5, 0x50,0x2, 0xc1,0x53,0x7e,0x24,0x12, +0x1, 0x7e,0x34,0x11,0xe3,0x7e,0x14,0x0, 0x1e,0x12,0x6e,0xc8,0x7a,0xd1,0x3f,0x7e, +0x34,0x12,0x66,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6f,0x1, 0xe5,0x3f,0xbe,0xb0, +0x0, 0x28,0x38,0x7e,0x31,0x3f,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x11,0xe3,0x7e,0x34, +0xb, 0x96,0x12,0x6e,0xc8,0x7e,0x31,0x3f,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x11,0xe3, +0x7e,0x34,0x12,0x66,0x12,0x6e,0xc8,0x6c,0xee,0x80,0xa, 0x7c,0xbe,0x7e,0x70,0x1, +0x12,0x0, 0x5e,0xb, 0xe0,0xe5,0x3f,0xbc,0xbe,0x38,0xf0,0x85,0x3f,0x5c,0xe5,0x3f, +0x7a,0xb3,0xc, 0x3d,0x7e,0x73,0xc, 0x3d,0xbe,0x70,0x5, 0x28,0x6, 0x74,0x5, 0x7a, +0xb3,0xc, 0x3d,0xda,0x3b,0x22,0x7e,0x73,0xc, 0x54,0x7a,0x73,0x12,0xb9,0x7e,0xb3, +0xc, 0x56,0x60,0xa, 0x7e,0xb3,0x12,0xb9,0x44,0x80,0x7a,0xb3,0x12,0xb9,0x7e,0xb3, +0xc, 0x55,0x60,0xa, 0x7e,0xb3,0x12,0xb9,0x44,0x40,0x7a,0xb3,0x12,0xb9,0xe5,0x64, +0x7a,0xb3,0x12,0xb5,0x7e,0x73,0xc, 0x3d,0x7a,0x73,0x12,0xb6,0x74,0xff,0x7a,0xb3, +0x12,0xb7,0x7e,0x73,0xc, 0x3e,0x7a,0x73,0x12,0xb8,0x7e,0x73,0xe, 0x49,0x7a,0x73, +0x12,0xc3,0x7e,0x1f,0x12,0xbf,0xb, 0x1c,0x7a,0x1f,0x12,0xbf,0x7e,0x73,0xc, 0xa2, +0x7a,0x73,0x12,0xcc,0x7e,0x73,0xc, 0xa9,0x7a,0x73,0x12,0xcd,0x7e,0x73,0xc, 0xb0, +0x7a,0x73,0x12,0xce,0x7e,0x73,0xc, 0xb7,0x7a,0x73,0x12,0xcf,0x7e,0x73,0xc, 0xbe, +0x7a,0x73,0x12,0xd0,0xe4,0x2, 0x27,0xd3,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0xca,0x3b,0x7c,0xfb,0x7e,0x34,0x6e,0x23,0x7d,0xd3,0x7e,0xb3,0xc, 0x3d,0x7c,0xdb, +0x75,0x5b,0x0, 0xe4,0x7a,0xb3,0x12,0x62,0x7a,0xb3,0x12,0x63,0x6d,0x33,0x7d,0x43, +0x7e,0x34,0x7f,0xff,0x7d,0xe3,0x7e,0x37,0xd, 0xdd,0x7d,0xf3,0x6c,0xee,0x6c,0xaa, +0xa, 0x3e,0x19,0xa3,0x11,0xe3,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x12,0x44,0x19,0xa3, +0x12,0x45,0xbc,0xde,0x28,0x13,0x7c,0xbe,0x12,0x60,0xbc,0x7d,0xc3,0xbd,0x4c,0x18, +0x2, 0x7d,0x4c,0xbd,0xec,0x48,0x2, 0x7d,0xec,0xb, 0xe0,0xbe,0xe0,0xf, 0x78,0xce, +0xbe,0xd0,0x2, 0x50,0x2, 0x81,0x5, 0x7d,0x3e,0x2d,0x34,0xe, 0x34,0x7d,0xe3,0x6c, +0xee,0x74,0x6, 0x7c,0x3e,0xac,0x3b,0x7d,0x1, 0x2d,0xd, 0x7d,0x30,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0x30,0xbd,0x3e,0x58,0x1c,0x7d,0x30,0xb, 0x35,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x30,0x7d,0xa3,0x7d,0x30,0xb, 0x36,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30, +0x7d,0xb3,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc6,0x6c,0xee,0x61,0xf6,0x7e, +0xa0,0x2, 0x7c,0x7e,0xac,0x7a,0x9, 0xb3,0xb, 0x96,0xf5,0x3f,0x9, 0xb3,0xb, 0x97, +0xf5,0x40,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x11,0xe3,0x70,0xc, 0xa, 0x5e, +0xb, 0x54,0x7c,0xab,0xa, 0x3e,0x19,0xa3,0x11,0xe3,0x7c,0xbd,0x14,0xbc,0xbe,0x78, +0x2, 0x61,0xfc,0xa, 0x5e,0xb, 0x54,0xf5,0x48,0x61,0xed,0x7e,0xa1,0x48,0x74,0x2, +0x7c,0x7a,0xac,0x7b,0x9, 0xa3,0xb, 0x96,0x7a,0xa1,0x41,0x9, 0xb3,0xb, 0x97,0xf5, +0x42,0xa, 0x2a,0xe5,0x3f,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0x7c,0xb7,0xf5,0x46, +0xe5,0x42,0xa, 0x2b,0xe5,0x40,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0x7c,0xb7,0xf5, +0x47,0x75,0x4c,0x2, 0x75,0x4a,0x0, 0x7c,0xbe,0x12,0x60,0xbc,0x7d,0x83,0xe5,0x48, +0x12,0x60,0xbc,0x7d,0xd3,0x7d,0xe8,0xbd,0xd8,0x58,0x2, 0x7d,0xed,0x7d,0x3e,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0x7d,0xc3,0xe5, +0x46,0xbe,0xb0,0x1, 0x38,0x43,0xe5,0x47,0xbe,0xb0,0x1, 0x38,0x3c,0x7c,0xbf,0x54, +0x2, 0xb4,0x2, 0x35,0x7e,0x71,0x41,0x74,0x18,0xac,0x7b,0xe5,0x40,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x20,0x7e,0x71,0x3f,0x74,0x18,0xac,0x7b,0xe5, +0x42,0xa, 0x1b,0x2d,0x31,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30,0x2d,0x32,0xbd,0x3c, +0x18,0x2, 0x61,0x83,0x75,0x4a,0x1, 0x61,0x83,0xe5,0x46,0xbe,0xb0,0x1, 0x38,0x9, +0xe5,0x47,0xbe,0xb0,0x1, 0x38,0x2, 0x61,0x83,0xe5,0x46,0xbe,0xb0,0x3, 0x40,0x2, +0x61,0x83,0xe5,0x47,0xbe,0xb0,0x3, 0x40,0x2, 0x61,0x83,0x7c,0xbf,0x54,0x1, 0xb4, +0x1, 0x2, 0x80,0x2, 0x61,0x83,0x6d,0x33,0x7d,0x93,0x75,0x4b,0x0, 0x85,0x3f,0x43, +0x85,0x41,0x44,0xe5,0x41,0xbe,0xb1,0x3f,0x50,0x6, 0x85,0x41,0x43,0x85,0x3f,0x44, +0x7e,0xc1,0x40,0x85,0x42,0x45,0xe5,0x42,0xbe,0xb1,0x40,0x50,0x6, 0x7e,0xc1,0x42, +0x85,0x40,0x45,0x75,0x4e,0x0, 0x75,0x4f,0x0, 0xe5,0x44,0xbe,0xb1,0x43,0x78,0x21, +0x75,0x4e,0x1, 0xe5,0x43,0x60,0x5, 0xe5,0x43,0xb4,0xc, 0x3, 0x75,0x4f,0x1, 0xe5, +0x43,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x43,0xe5,0x44,0xbe,0xb0,0xc, 0x50,0x2, 0x5, +0x44,0xe5,0x45,0xbc,0xbc,0x78,0x1f,0x75,0x4e,0x1, 0x4c,0xcc,0x68,0x5, 0xbe,0xc0, +0x17,0x78,0x3, 0x75,0x4f,0x1, 0xbe,0xc0,0x0, 0x28,0x2, 0x1b,0xc0,0xe5,0x45,0xbe, +0xb0,0x17,0x50,0x2, 0x5, 0x45,0x85,0x43,0x4d,0x41,0xbd,0x7c,0x1c,0x80,0x66,0xe5, +0x43,0xbe,0xb1,0x4d,0x68,0x11,0xe5,0x44,0xbe,0xb1,0x4d,0x68,0xa, 0xbc,0xc1,0x68, +0x6, 0xe5,0x45,0xbc,0xb1,0x78,0x27,0x7e,0x71,0x4d,0x74,0x18,0xac,0xb7,0xa, 0x21, +0x2d,0x25,0x7d,0x42,0x3e,0x44,0x7d,0x14,0x2d,0x1f,0xb, 0x18,0x30,0xbe,0x34,0x0, +0x0, 0x8, 0x7, 0xb, 0x18,0x30,0x2d,0x39,0x7d,0x93,0x5, 0x4b,0x80,0x25,0x7e,0x71, +0x4d,0x74,0x18,0xac,0x7b,0xa, 0x21,0x2d,0x32,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30, +0xbd,0x3b,0x8, 0xc, 0xe5,0x4c,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x4c,0x1, 0x80,0x3, +0x75,0x4c,0x0, 0xb, 0x10,0xe5,0x45,0xbc,0xb1,0x50,0x94,0x5, 0x4d,0xe5,0x44,0xbe, +0xb1,0x4d,0x50,0x87,0x7e,0x71,0x44,0x74,0x18,0x7c,0x97,0xac,0x9b,0xa, 0x2c,0x7d, +0x34,0x2d,0x32,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x20,0x7d,0x39,0x9d,0x32,0x7e,0x51, +0x43,0x7c,0x15,0xac,0x1b,0xe5,0x45,0xa, 0x5b,0x7d,0x20,0x2d,0x25,0x3e,0x24,0x2d, +0x2f,0xb, 0x28,0x20,0x9d,0x32,0xa, 0x1c,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x2f, +0xb, 0x28,0x20,0x9d,0x32,0x7d,0x24,0x2d,0x25,0x3e,0x24,0x2d,0x2f,0xb, 0x28,0x20, +0x9d,0x32,0x7d,0x93,0x7d,0x3d,0x2d,0x38,0x7d,0xc3,0xe5,0x4e,0xb4,0x1, 0xe, 0xe5, +0x4f,0x70,0xa, 0x7d,0x39,0x9d,0x3c,0x7d,0x93,0x15,0x4b,0x15,0x4b,0xe5,0x4b,0xbe, +0xb0,0x4, 0x28,0x6, 0xe5,0x4b,0x24,0xfc,0xf5,0x4b,0xbe,0x94,0x0, 0x0, 0x58,0x4, +0x6d,0x33,0x7d,0x93,0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x3a,0x1a,0x26,0x1a,0x24, +0x12,0x68,0x4c,0xe5,0x4b,0xa, 0x1b,0x6d,0x0, 0x12,0x68,0x4c,0x7f,0x21,0x7d,0x39, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x68,0x5d,0xbf,0x12,0x8, 0xa, 0xe5, +0x4c,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x4a,0x2, 0x7e,0xb3,0xc, 0x43,0xb4,0x1, 0x3, +0x75,0x4a,0x2, 0xe5,0x4a,0xbe,0xb0,0x0, 0x28,0x61,0xe5,0x4a,0xa, 0x3b,0x2e,0x34, +0x12,0x61,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x48,0xa, 0x1b,0x9, 0xb1,0x11, +0xe3,0x70,0xc, 0xa, 0x3e,0x9, 0xa3,0x11,0xe3,0x19,0xa1,0x11,0xe3,0x80,0x3c,0x75, +0x49,0x0, 0x80,0x32,0x9, 0x81,0x11,0xe3,0xa, 0x2e,0x9, 0x62,0x11,0xe3,0xbc,0x68, +0x28,0x12,0xe5,0x49,0xa, 0xb, 0x9, 0x70,0x11,0xe3,0xbc,0x76,0x78,0x16,0x19,0x80, +0x11,0xe3,0x80,0x10,0xe5,0x49,0xa, 0x2b,0x9, 0x72,0x11,0xe3,0xbc,0x78,0x78,0x4, +0x19,0x62,0x11,0xe3,0x5, 0x49,0xbe,0xd1,0x49,0x38,0xc9,0x5, 0x48,0xbe,0xd1,0x48, +0x28,0x2, 0x1, 0xeb,0xb, 0xe0,0xbc,0xde,0x28,0x2, 0x1, 0xaf,0x7e,0x34,0x11,0xe3, +0x12,0x3c,0xf7,0xf5,0x5b,0xda,0x3b,0x22,0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb, +0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55,0x7e,0x37,0xd, 0x5b,0x7a,0x35,0x59,0x6c, +0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xb, 0xd9,0xe4,0x19,0xb3,0xb, 0xda,0x7c, +0xad,0x3e,0xa0,0xb, 0xa0,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xb, 0x96,0xf5,0x55, +0x9, 0xc3,0xb, 0x97,0xbc,0xdc,0x28,0x2, 0x81,0x62,0x7e,0xb3,0xe, 0x2b,0xa, 0xb, +0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xa, 0x3c,0xbd,0x30,0x8, 0x2, 0x81,0x62,0x7c,0x3a, +0x81,0x98,0xbc,0xdc,0x38,0x2, 0x81,0x72,0x7c,0x3c,0x2c,0x3d,0xb, 0x30,0x6c,0x55, +0x81,0x9c,0xa, 0x3d,0xa, 0xc, 0x2d,0x3, 0x7e,0xb3,0xe, 0x2b,0xa, 0x3b,0x1b,0x34, +0xbd,0x3, 0x38,0x2, 0x81,0x9c,0xa, 0xb, 0x1b,0x4, 0xa, 0x3c,0xbd,0x30,0x8, 0x2, +0x81,0x9c,0x7c,0x3b,0x2c,0x3d,0x9c,0x3c,0x7c,0x5c,0x9c,0x5d,0xbe,0xd1,0x55,0x28, +0x2, 0x81,0xbd,0x7e,0xb3,0xe, 0x2a,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5, +0x55,0xa, 0x3b,0xbd,0x30,0x8, 0x2, 0x81,0xbd,0x7c,0x4a,0x81,0xfa,0xbe,0xd1,0x55, +0x38,0x2, 0x81,0xcf,0x7e,0x41,0x55,0x2c,0x4d,0xb, 0x40,0x6c,0x22,0x81,0xff,0xa, +0x3d,0xe5,0x55,0xa, 0xb, 0x2d,0x3, 0x7e,0xa3,0xe, 0x2a,0xa, 0x3a,0x1b,0x34,0xbd, +0x3, 0x38,0x2, 0x81,0xff,0xa, 0xa, 0x1b,0x4, 0xe5,0x55,0xa, 0x3b,0xbd,0x30,0x8, +0x2, 0x81,0xff,0x7c,0x4a,0x2c,0x4d,0x9e,0x41,0x55,0x7e,0x21,0x55,0x9c,0x2d,0x7e, +0x37,0xd, 0xdd,0x7c,0xb2,0x7e,0x23,0xd, 0x4d,0x7e,0x4, 0x9, 0xa0,0x12,0x6a,0xaf, +0x7e,0x37,0x9, 0xa0,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xa2,0x7d,0x20,0x7a,0x1d, +0x43,0x7e,0x37,0x9, 0xa4,0x7d,0x3, 0x7e,0x37,0x9, 0xa6,0x7d,0x20,0x7a,0x1d,0x47, +0x7e,0x37,0x9, 0xa8,0x7d,0x3, 0x7e,0x37,0x9, 0xaa,0x7d,0x20,0x7a,0x1d,0x4b,0x7e, +0x37,0x9, 0xac,0x7d,0x3, 0x7e,0x37,0x9, 0xae,0x7d,0x20,0x7a,0x1d,0x4f,0xa, 0x4d, +0xe5,0x55,0xa, 0x5b,0x9d,0x54,0xf5,0x53,0xe1,0x7, 0xa, 0x4d,0xa, 0x5c,0x9d,0x54, +0xf5,0x54,0xc1,0xf3,0xe5,0x53,0xbe,0xb0,0x0, 0x58,0x2, 0xc1,0xf1,0x7e,0x73,0xe, +0x2a,0xbe,0x71,0x53,0x18,0x2, 0xc1,0xf1,0xe5,0x54,0xbe,0xb0,0x0, 0x58,0x2, 0xc1, +0xf1,0x7e,0x73,0xe, 0x2b,0xbe,0x71,0x54,0x18,0x2, 0xc1,0xf1,0xe5,0x54,0x1a,0x2b, +0x3e,0x24,0xe5,0x53,0x1a,0x3b,0x7e,0x14,0x0, 0x30,0xad,0x13,0x2d,0x21,0x2e,0x27, +0xd, 0xdd,0xb, 0x28,0x20,0x7e,0x33,0xd, 0x4d,0xa, 0x13,0x9d,0x21,0x7a,0x25,0x57, +0xbe,0x24,0x0, 0x0, 0x18,0x2, 0xc1,0xf1,0x7e,0x25,0x59,0xbe,0x25,0x57,0x28,0x2, +0xa1,0xd2,0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0xb, 0xda,0x7e,0x29,0xb0,0x4, 0x7a, +0x29,0xb0,0xe5,0x55,0xa, 0x2b,0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x1, 0x8, +0x2, 0xa1,0xf6,0xa, 0x2c,0xe5,0x54,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34, +0x0, 0x1, 0x18,0x2, 0xc1,0xf1,0x75,0x56,0x0, 0xc1,0x82,0xbe,0xe1,0x56,0x78,0x2, +0xc1,0x80,0xe5,0x56,0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x96,0xa, 0x27,0xe5,0x53, +0x1a,0x3b,0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x1, 0x8, 0x2, 0xc1,0x41,0xe5, +0x56,0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x97,0xa, 0x27,0xe5,0x54,0x1a,0x3b,0x9d, +0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x1, 0x8, 0x2, 0xc1,0x41,0x75,0x56,0xff,0xc1, +0x8d,0xe5,0x56,0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x96,0xa, 0x27,0xe5,0x53,0x1a, +0x3b,0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x2, 0x8, 0x2, 0xc1,0x80,0xe5,0x56, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x97,0xa, 0x27,0xe5,0x54,0x1a,0x3b,0x9d,0x32, +0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x2, 0x8, 0x2, 0xc1,0x80,0x75,0x56,0x0, 0xc1,0x8d, +0x5, 0x56,0x7e,0x73,0xc, 0x3d,0xbe,0x71,0x56,0x8, 0x2, 0xa1,0xfb,0xe5,0x56,0x60, +0x2, 0xc1,0x9f,0x7e,0x35,0x57,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x57,0xe5, +0x56,0x70,0x2, 0xc1,0xae,0xe5,0x56,0xb4,0xff,0x2, 0x80,0x2, 0xc1,0xf1,0x7e,0xf5, +0x57,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0xe5,0x53,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12, +0x68,0x4c,0x7f,0x1, 0x7e,0x1d,0x47,0x9f,0x10,0x7a,0x1d,0x47,0xe5,0x54,0x1a,0x1b, +0x1a,0x2, 0x7f,0x17,0x12,0x68,0x4c,0x7f,0x1, 0x7e,0x1d,0x4f,0x9f,0x10,0x7a,0x1d, +0x4f,0x7e,0x1d,0x43,0x9f,0x17,0x7a,0x1d,0x43,0x7e,0x1d,0x4b,0x9f,0x17,0x7a,0x1d, +0x4b,0x5, 0x54,0xa, 0x2d,0xa, 0x3c,0x2d,0x32,0x1a,0x27,0xe5,0x54,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0xa1,0x64,0x5, 0x53,0xa, 0x2d,0xe5,0x55,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x53,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0xa1,0x5a,0x74,0x6, 0x7e,0x1d,0x47, +0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x47,0x7e,0xd, 0x43,0x7e,0x1d,0x47,0x12,0x68, +0x68,0x2e,0x34,0x0, 0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xb, 0xd4,0x74,0x6, +0x7e,0x1d,0x4f,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x4f,0x7e,0x7d,0x4b,0x7e,0x1d, +0x4f,0x7f,0x7, 0x12,0x68,0x68,0x2e,0x34,0x0, 0x20,0x59,0x36,0xb, 0xd6,0x7e,0xb3, +0xd, 0x5a,0x7f,0x17,0x70,0x2, 0xe1,0x74,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60, +0x80,0x14,0x78,0xf4,0x7a,0x1d,0x4b,0xbe,0x18,0x0, 0x7f,0x38,0x2, 0xe1,0x86,0x7e, +0x18,0x0, 0x7f,0x7a,0x1d,0x4b,0x7e,0x2d,0x4b,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f, +0x19,0xa3,0xb, 0xd9,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xb, 0xda,0x7e,0x70,0x7, 0xac, +0x7f,0x19,0xa3,0xb, 0xda,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xb, 0xda,0xbe,0x70,0xf, +0x38,0x2, 0xe1,0xc0,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xb, 0xda, +0xda,0x3b,0x22,0x74,0x1, 0x12,0x63,0xce,0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6, +0xac,0xa9,0xd6,0xec,0xd2,0x86,0x7e,0x34,0x0, 0x3f,0x12,0x5e,0x65,0x92,0x7, 0x30, +0x7, 0xe, 0xe5,0x3f,0xbe,0xb0,0x2, 0x50,0x7, 0xe5,0x3f,0x24,0xff,0xa9,0x93,0xea, +0x75,0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xff,0xff, +0xca,0x3b,0x75,0x40,0x0, 0x75,0x42,0x0, 0x75,0x44,0x0, 0x7e,0xd4,0xc, 0xc1,0x7e, +0xb3,0xc, 0xe8,0x70,0xe, 0x7e,0xb3,0xc, 0xe4,0x70,0x8, 0x7e,0xb3,0xc, 0xe5,0x70, +0x2, 0x41,0xc0,0x20,0x4, 0x6, 0x7e,0x44,0x0, 0x84,0x80,0x4, 0x7e,0x44,0x0, 0xa8, +0x7d,0x34,0x7e,0x24,0x0, 0x24,0x74,0xff,0x12,0x6f,0x1, 0x74,0xaa,0x7a,0x49,0xb0, +0x19,0xb4,0x0, 0x1, 0x7e,0x73,0xc, 0xe1,0x19,0x74,0x0, 0x3, 0x75,0x41,0x0, 0x6c, +0xff,0x41,0x53,0x74,0x7, 0xac,0xbf,0x9, 0xc5,0xc, 0xa2,0x7c,0xac,0x5e,0xa0,0xf, +0xa, 0xca,0x2d,0xcd,0x7e,0xc9,0xd0,0x7c,0xbc,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x10, +0xb4,0xb0,0x2, 0x80,0x2, 0x41,0x51,0x7c,0xca,0xbe,0xd0,0x1, 0x68,0x2, 0x41,0x51, +0xbe,0xd0,0x3, 0x78,0x2, 0x41,0x51,0x12,0x60,0x4d,0x50,0x59,0x7e,0xb3,0xc, 0xdf, +0xb4,0x1, 0x5, 0x75,0x43,0x0, 0x80,0x5, 0x12,0x62,0xd2,0xf5,0x43,0x4c,0xdd,0x68, +0x5, 0xbe,0xd0,0x2, 0x78,0x24,0xa, 0x5c,0x9, 0xa5,0xc, 0xeb,0xbe,0xa1,0x43,0x50, +0xe, 0xa, 0xcc,0x2e,0xc4,0xc, 0xeb,0x7c,0xba,0x4, 0x7a,0xc9,0xb0,0x41,0x51,0xbe, +0xa1,0x43,0x78,0x2, 0x6c,0xdd,0x74,0xff,0x80,0x15,0xa, 0x5c,0x9, 0x75,0xc, 0xeb, +0xbe,0x71,0x43,0x50,0x9, 0xe4,0xa, 0xcc,0x19,0xbc,0xc, 0xeb,0x41,0x51,0xe4,0xa, +0xcc,0x19,0xbc,0xc, 0xeb,0x7e,0xa1,0x41,0x74,0x6, 0xa4,0xf5,0x3f,0x74,0x7, 0xac, +0xbf,0x9, 0xe5,0xc, 0xa3,0x9, 0xb5,0xc, 0xa4,0xc4,0x54,0xf0,0xf5,0x44,0x7e,0x73, +0xd, 0x40,0xbc,0x7c,0x28,0x54,0x7e,0xb3,0xc, 0xe6,0x70,0x28,0x7c,0xbe,0xa, 0x3c, +0x2e,0x34,0x12,0x87,0x7e,0x50,0x1, 0x7e,0x40,0xf, 0x12,0x5b,0xe1,0x7c,0xeb,0xe5, +0x44,0xa, 0x3c,0x2e,0x34,0x12,0x8c,0x7e,0x50,0x10,0x7e,0x40,0x20,0x12,0x5b,0xe1, +0xf5,0x44,0x80,0xc, 0xa, 0x5c,0x9, 0xe5,0x12,0x87,0x9, 0xb5,0x12,0x8c,0xf5,0x44, +0xa, 0x5c,0x2d,0x5d,0x7e,0x59,0xb0,0xb4,0x1, 0x10,0xe4,0xa, 0xcc,0x19,0xbc,0x12, +0x87,0x19,0xbc,0x12,0x8c,0x6c,0xee,0x75,0x44,0x0, 0x7e,0xb3,0xd, 0x59,0xb4,0xff, +0x14,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xc, 0xa2,0xbe,0xb0,0xff,0x68,0x5, 0x7e,0xe0, +0x1, 0x80,0x2, 0x6c,0xee,0x7e,0x50,0x7, 0xac,0x5f,0x49,0xe2,0xc, 0x9e,0x49,0xf2, +0xc, 0xa0,0xbe,0xd0,0x1, 0x78,0x27,0x75,0x45,0x0, 0x7e,0x71,0x45,0x74,0x7, 0xac, +0x7b,0x9, 0xb3,0x12,0x95,0x54,0xf, 0xbc,0xbc,0x78,0xa, 0x49,0xe3,0x12,0x91,0x49, +0xf3,0x12,0x93,0x80,0x9, 0x5, 0x45,0xe5,0x45,0xbe,0xb0,0x5, 0x40,0xdc,0x7d,0xce, +0x7d,0x5c,0xa, 0x5a,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x3f,0xa, 0x3b,0x7d,0x13, +0x2d,0x14,0x19,0xa1,0x0, 0x5, 0x7d,0x1c,0x7d,0x53,0x2d,0x54,0x19,0x35,0x0, 0x6, +0x7d,0xcf,0x7d,0x1c,0xa, 0x12,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x54,0x19,0x35, +0x0, 0x7, 0x7d,0x1c,0x7d,0x53,0x2d,0x54,0x19,0x35,0x0, 0x8, 0x7d,0x53,0x2d,0x54, +0x19,0xe5,0x0, 0x9, 0xe5,0x44,0x7d,0x13,0x2d,0x14,0x19,0xb1,0x0, 0xa, 0x9, 0xa2, +0xc, 0xa2,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x24,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x23,0xbe,0xd0, +0x1, 0x68,0x2, 0x5, 0x40,0x5, 0x42,0x7c,0xbd,0x3, 0x3, 0x54,0xc0,0x7c,0x4b,0x7d, +0x53,0x2d,0x54,0x2e,0x54,0x0, 0x5, 0x7e,0x59,0x50,0x2c,0x54,0x7a,0x59,0x50,0x80, +0xe, 0x2d,0x34,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, +0x41,0xb, 0xf0,0x7e,0x73,0xd, 0x40,0xbc,0x7f,0x28,0x2, 0x1, 0x53,0xe5,0x40,0x19, +0xb4,0x0, 0x4, 0xe5,0x42,0xbe,0xb0,0x0, 0x38,0x7, 0x7e,0xb3,0xc, 0xe5,0xb4,0x1, +0x35,0x74,0x24,0x19,0xb4,0x0, 0x2, 0xe4,0x19,0xb4,0x0, 0x23,0x6c,0xff,0xa, 0x5f, +0x2d,0x54,0x7e,0x59,0x60,0x7d,0x54,0x2e,0x54,0x0, 0x23,0x7e,0x59,0x70,0x6c,0x76, +0x7a,0x59,0x70,0xb, 0xf0,0xbe,0xf0,0x23,0x78,0xe4,0xb2,0x4, 0x12,0x0, 0x1e,0x70, +0x5, 0x74,0x1, 0x12,0xf, 0xf8,0x7e,0xb3,0xc, 0xe4,0x60,0x5, 0x7d,0x3d,0x12,0x5e, +0x2, 0xe4,0x7a,0xb3,0xc, 0xe8,0x7a,0xb3,0xc, 0xe4,0x7a,0xb3,0xc, 0xe5,0x80,0x4, +0xe4,0x12,0xf, 0xf8,0x7e,0x24,0xc, 0x9e,0x7e,0x34,0x12,0x91,0x7e,0x14,0x0, 0x23, +0x12,0x6e,0xc8,0xe5,0x42,0x70,0xd, 0x7e,0x34,0x12,0x91,0x7e,0x24,0x0, 0x23,0x74, +0xff,0x12,0x6f,0x1, 0xda,0x3b,0x22,0x7e,0xf4,0xc, 0xc1,0x6c,0xaa,0x7e,0x0, 0xff, +0x7e,0x30,0x7, 0xac,0x3a,0x19,0x1, 0xc, 0x5c,0x7c,0xa, 0x2e,0x0, 0x3f,0xe4,0xa5, +0xf6,0xb, 0xa0,0xbe,0xa0,0x5, 0x78,0xe5,0x7e,0x3, 0xc, 0xdf,0xa5,0xb8,0x0, 0x2, +0x80,0x2, 0x61,0x3a,0x7e,0xb3,0xc, 0xe0,0x70,0x2, 0x81,0xc2,0x7d,0x3f,0x2e,0x34, +0x0, 0xa, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6f,0x1, 0x7d,0x3f,0x2e,0x34,0x0, +0x14,0x7e,0x24,0x0, 0xa, 0x12,0x6f,0x1, 0x81,0xc2,0x7e,0xb3,0xc, 0xe0,0x60,0x2, +0x61,0x64,0xa5,0xb8,0x1, 0x2, 0x80,0x2, 0x61,0x64,0x7e,0x17,0xc, 0x58,0x59,0x1f, +0x0, 0xa, 0x7e,0x17,0xc, 0x5a,0x59,0x1f,0x0, 0x14,0x75,0x3f,0x1, 0xe4,0x7a,0xb3, +0xc, 0x5c,0x81,0xc2,0x6c,0xaa,0x7e,0x24,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59, +0x23,0x9, 0x8c,0x7c,0xba,0x7c,0x4a,0x30,0xe0,0x2, 0x61,0x8f,0x1e,0x40,0x7e,0x50, +0x2, 0xac,0x45,0x2d,0x2f,0x49,0x22,0x0, 0xa, 0x59,0x23,0x9, 0x78,0x61,0xa0,0x1e, +0x40,0x7e,0x50,0x2, 0xac,0x45,0x2d,0x2f,0x49,0x12,0x0, 0x14,0x59,0x13,0x9, 0x78, +0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xbf,0x6c,0xaa,0x61,0xd7,0x7c,0xba,0x7c,0x2a,0x30, +0xe0,0x2, 0x61,0xc1,0x1e,0x20,0x7e,0x30,0x7, 0xac,0x23,0x49,0x11,0xc, 0x58,0x61, +0xcc,0x1e,0x20,0x7e,0x30,0x7, 0xac,0x23,0x49,0x11,0xc, 0x5a,0x7e,0x70,0x2, 0xac, +0x7a,0x59,0x13,0x9, 0x8c,0xb, 0xa0,0xa, 0xe0,0x3e,0xe4,0xa, 0x1a,0xbd,0x1e,0x40, +0xca,0x7e,0x34,0x9, 0x78,0x7e,0x24,0x9, 0x8c,0x74,0x5, 0x12,0x6d,0x39,0x7d,0x13, +0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7a,0x7c,0xb7,0x7d,0xe1,0x70,0x2, 0x81,0x4, 0x1e, +0xe4,0x14,0x78,0xfb,0x5e,0xe4,0x0, 0x7, 0x7d,0x3e,0x7c,0x7, 0xa, 0xe0,0x1b,0xe4, +0x7d,0x3e,0x7c,0x87,0x7e,0x3, 0xc, 0xdf,0xbc,0x8, 0x38,0x2, 0x81,0x8b,0x7e,0x70, +0x2, 0xac,0x7a,0x7d,0xe3,0x2d,0xef,0x49,0xee,0x0, 0xa, 0xbe,0xe4,0xff,0xff,0x68, +0x2, 0x81,0x57,0x6c,0x11,0x7e,0x70,0x2, 0xac,0x71,0x7d,0xe3,0x2d,0xef,0x49,0xee, +0x0, 0xa, 0xbe,0xe4,0xff,0xff,0x68,0x2, 0x81,0x4e,0x7c,0x91,0x81,0x59,0xb, 0x10, +0xbe,0x10,0x5, 0x40,0xe0,0x81,0x59,0x7c,0x9a,0x7e,0x70,0x7, 0xac,0x78,0x19,0x93, +0xc, 0x5c,0x7c,0x9, 0x2e,0x0, 0x3f,0x74,0x1, 0xa5,0xf6,0x7e,0x50,0x7, 0xac,0x58, +0x49,0xe2,0xc, 0x58,0x7e,0x70,0x2, 0xac,0x79,0x7d,0xd3,0x2d,0xdf,0x59,0xed,0x0, +0xa, 0x49,0xe2,0xc, 0x5a,0x2d,0x3f,0x59,0xe3,0x0, 0x14,0xb, 0xa0,0xbe,0xa0,0x5, +0x68,0x2, 0x61,0xf2,0x6c,0xaa,0x7c,0xa, 0x2e,0x0, 0x3f,0xa5,0xe6,0xbe,0xb0,0x1, +0x78,0x2, 0x81,0xbb,0x7e,0xe4,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0x23,0x2d, +0x2f,0x59,0xe2,0x0, 0xa, 0x2d,0x3f,0x59,0xe3,0x0, 0x14,0xb, 0xa0,0xbe,0xa0,0x5, +0x78,0xd4,0x7e,0x13,0xc, 0xdf,0x6c,0xaa,0x7c,0xa, 0x2e,0x0, 0x3f,0xa5,0xe6,0xb4, +0x1, 0x2, 0x80,0x2, 0xa1,0xa, 0xa, 0xea,0x2d,0xef,0x9, 0xbe,0x0, 0x5, 0xb4,0x1, +0x2, 0x80,0x2, 0x81,0xeb,0x74,0x3, 0x19,0xbe,0x0, 0x5, 0xa, 0xea,0x2d,0xef,0x9, +0xe, 0x0, 0x5, 0xa5,0xb8,0x3, 0x2, 0x80,0x2, 0x81,0xfe,0xe4,0xa1,0x33,0xa5,0xb8, +0x0, 0x2, 0x80,0x2, 0xa1,0x36,0x74,0x2, 0xa1,0x33,0xa, 0xea,0x2d,0xef,0x9, 0xbe, +0x0, 0x5, 0xbe,0xb0,0x2, 0x78,0x2, 0xa1,0x1d,0x60,0x2, 0xa1,0x31,0x74,0x1, 0x7a, +0xe9,0xb0,0x7c,0x61,0xb, 0x10,0x7e,0x70,0x7, 0xac,0x67,0x19,0xa3,0xc, 0x5c,0xa1, +0x36,0x74,0x3, 0x7a,0xe9,0xb0,0xa, 0x1a,0x2d,0x1f,0x7e,0x19,0x0, 0x19,0x1, 0x0, +0x5, 0xb, 0xa0,0xbe,0xa0,0x5, 0x40,0x80,0x22,0xca,0x3b,0x6c,0xcc,0xc1,0xc5,0x74, +0x2, 0xac,0xbc,0x9, 0xd5,0xb, 0x96,0x9, 0xe5,0xb, 0x97,0x7e,0x50,0x18,0xac,0x5d, +0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0xb, 0x38,0x30, +0x7a,0x35,0x41,0x75,0x43,0x2, 0x6c,0xff,0x7e,0x70,0x5, 0xac,0x7f,0x7d,0x23,0x2e, +0x24,0x6f,0x20,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc,0xbd,0x38,0x15,0x2e, +0x34,0x6f,0x21,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xbc,0xbd,0x40,0x5, 0x7a, +0xf1,0x43,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xcd,0xe5,0x43,0xbe,0xb0,0x2, +0x40,0x2, 0xc1,0xc3,0x7c,0xbc,0x12,0x64,0x2, 0x70,0x2, 0xc1,0xc3,0xbe,0xe0,0x0, +0x7e,0x50,0x18,0x28,0x16,0xac,0x5d,0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32, +0x2e,0x37,0xd, 0xdd,0x1b,0x35,0xb, 0x38,0x30,0x80,0x13,0xac,0x5d,0x3e,0x24,0x7e, +0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0x49,0x33,0x0, 0x2, 0x7a,0x35, +0x44,0xbe,0xe0,0x17,0x7e,0x50,0x18,0x50,0x15,0xac,0x5d,0x3e,0x24,0x7e,0x70,0x2, +0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0x49,0x33,0x0, 0x2, 0x80,0x14,0xac,0x5d, +0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0x1b,0x35,0xb, +0x38,0x30,0x7a,0x35,0x46,0x7e,0x71,0x43,0x74,0x5, 0xac,0x7b,0x7d,0x23,0x2e,0x24, +0x6f,0x22,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc,0xbe,0x28,0x2, 0xc1,0xc3, +0x2e,0x34,0x6f,0x23,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xbc,0xbe,0x40,0x73, +0x6c,0xff,0x80,0x67,0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0xb, 0x96,0xf5,0x3f,0x9, +0xb3,0xb, 0x97,0xf5,0x40,0xbc,0xcf,0x68,0x50,0xe5,0x3f,0xbe,0xb0,0x2, 0x38,0x49, +0xa, 0x2e,0xe5,0x40,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0xc, 0x18, +0x38,0x74,0x18,0xac,0xbd,0x7d,0xf5,0x3e,0xf4,0x74,0x2, 0xac,0xbe,0x2d,0xf5,0x2e, +0xf7,0xd, 0xdd,0x49,0xef,0x0, 0x30,0x49,0xff,0xff,0xd0,0x2d,0xfe,0x2e,0xf5,0x44, +0x2e,0xf5,0x46,0x7e,0xe5,0x41,0x3e,0xe4,0x3e,0xe4,0x9d,0xef,0xbe,0xe4,0x0, 0xc8, +0x58,0x7, 0x7c,0xbc,0x6c,0x77,0x12,0x0, 0x5e,0xb, 0xf0,0x7e,0x73,0xc, 0x3d,0xbc, +0x7f,0x38,0x91,0xb, 0xc0,0x7e,0x73,0xc, 0x3d,0xbc,0x7c,0x28,0x2, 0xa1,0x4f,0x12, +0x5a,0x60,0x75,0x40,0x0, 0x6d,0x33,0x7a,0x35,0x41,0x7e,0x73,0xc, 0x3d,0xbe,0x70, +0x1, 0x38,0x2, 0xe1,0x9d,0x6c,0xcc,0xe1,0x93,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xb, 0x96,0xf5,0x3f,0x9, 0xb3,0xb, 0x97,0xf5,0x40,0x60,0x9, 0xe5,0x40,0xb4,0x1, +0x2, 0x80,0x2, 0xe1,0x91,0xe5,0x3f,0xbe,0xb0,0x0, 0x38,0x2, 0xe1,0x91,0xe5,0x3f, +0xbe,0xb0,0xb, 0x50,0x7c,0x6c,0xff,0x80,0x70,0xbc,0xcf,0x68,0x6a,0x74,0x2, 0xac, +0xbf,0x9, 0xd5,0xb, 0x96,0x9, 0xe5,0xb, 0x97,0x4c,0xee,0x78,0x5a,0x7e,0x50,0x18, +0xac,0x5d,0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0xb, +0x38,0x10,0x7a,0x15,0x41,0x7e,0x51,0x3f,0x74,0x18,0xac,0x5b,0x3e,0x24,0x7e,0x71, +0x40,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0x49,0x23,0xff,0xd0,0x49, +0x33,0x0, 0x30,0x2d,0x32,0x7e,0x24,0x0, 0xa, 0x12,0x68,0x1a,0x7d,0x23,0x7d,0x31, +0x9d,0x32,0x7a,0x35,0x41,0xbe,0x34,0x0, 0x46,0x58,0xc, 0xbe,0xd0,0xc, 0x78,0x7, +0x7c,0xbf,0x6c,0x77,0x12,0x0, 0x5e,0xb, 0xf0,0x7e,0x73,0xc, 0x3d,0xbc,0x7f,0x38, +0x88,0xb, 0xc0,0x7e,0x73,0xc, 0x3d,0xbc,0x7c,0x28,0x2, 0xc1,0xe9,0xda,0x3b,0x22, +0x7e,0xb3,0xd, 0x62,0x1b,0xb1,0x68,0x29,0x4, 0x78,0x4e,0x7e,0x34,0x3f,0xe0,0x7a, +0x37,0xe, 0x4f,0x7e,0x34,0x15,0x1c,0x7a,0x37,0xe, 0x53,0x7e,0x34,0x8, 0x48,0x7a, +0x37,0xe, 0x61,0x7e,0x34,0x0, 0x34,0x7a,0x37,0xe, 0x63,0x7e,0x34,0x0, 0x33,0x80, +0x24,0x7e,0x34,0x3f,0xe0,0x7a,0x37,0xe, 0x4f,0x7e,0x34,0x29,0x1c,0x7a,0x37,0xe, +0x53,0x7e,0x34,0x10,0x91,0x7a,0x37,0xe, 0x61,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0xe, +0x63,0x7e,0x34,0x0, 0x22,0x7a,0x37,0xe, 0x65,0x22,0xf5,0x12,0x75,0x13,0x0, 0x22, +0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0xf, 0xa1,0xa5,0xbe,0x1, +0x69,0x7e,0xa3,0xe, 0x2a,0xbc,0xa7,0x28,0x15,0x7a,0x71,0x1b,0x74,0x30,0xac,0x7b, +0x2e,0x37,0x12,0xd3,0x7a,0x37,0x0, 0xcd,0xe4,0x7a,0xb3,0xd, 0xc7,0x22,0x7a,0x71, +0x1b,0xe4,0x7a,0xb3,0xd, 0xc7,0xa, 0x1a,0xa, 0x27,0x9d,0x21,0xbe,0x24,0x0, 0x4, +0x58,0x19,0x7e,0xb3,0x0, 0xcc,0x7d,0x32,0x20,0xe0,0x8, 0x3e,0x34,0x49,0x33,0x0, +0x68,0x80,0x22,0x3e,0x34,0x49,0x33,0x0, 0xcf,0x80,0x1a,0x7c,0xb7,0x9e,0xb3,0xe, +0x2a,0xb4,0x4, 0x6, 0x7e,0x34,0x12,0xb5,0x80,0xb, 0xb4,0x5, 0x2, 0x80,0x2, 0x41, +0x33,0x7e,0x34,0xd, 0xdf,0x7a,0x37,0x0, 0xcd,0x22,0xa5,0xbe,0x0, 0x3f,0x7a,0x71, +0x1a,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf, +0x1, 0x15,0x7e,0xb3,0xe, 0xa4,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x1, 0x80,0x37, +0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3,0xe, 0xa4,0xb4,0x3, 0x7, 0x74,0x1, +0x7e,0x70,0x3, 0x80,0x22,0x74,0x27,0x7e,0x70,0x3, 0x2, 0x63,0x8, 0xa5,0xbe,0x2, +0x19,0xa5,0xbf,0x4, 0x7, 0x74,0x1, 0x7e,0x70,0x4, 0x80,0xb, 0xa5,0xbf,0x5, 0x2, +0x80,0x2, 0x41,0x33,0xe4,0x6c,0x77,0x2, 0x63,0xb6,0xa5,0xbe,0x3, 0xd, 0xbe,0x70, +0xd, 0x28,0x3, 0x7e,0x70,0xd, 0x7a,0x73,0xe, 0x2a,0x22,0xa5,0xbe,0x4, 0xd, 0xbe, +0x70,0x18,0x28,0x3, 0x7e,0x70,0x18,0x7a,0x73,0xe, 0x2b,0x22,0xa5,0xbe,0x5, 0x5, +0x7a,0x73,0xe, 0x2c,0x22,0xa5,0xbe,0x7, 0x1c,0x7a,0x73,0xe, 0x4a,0x7c,0xb7,0x54, +0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0xe, 0x53,0x5e,0x70,0x3, 0x4d,0x32, +0x7a,0x37,0xe, 0x53,0x22,0xbe,0x60,0x8, 0x40,0x2b,0xbe,0x60,0xc, 0x38,0x26,0xa5, +0xbe,0xa, 0xc, 0x4c,0x77,0x68,0x3, 0x7e,0x70,0x1, 0x7a,0x73,0xe, 0x3a,0x22,0x7e, +0x23,0xe, 0x3a,0x7e,0x30,0x2, 0xac,0x23,0x7e,0x50,0x4, 0xac,0x56,0x2d,0x21,0x49, +0x22,0x0, 0x50,0x41,0x27,0xa5,0xbe,0x4c,0x5, 0x7a,0x73,0xd, 0x40,0x22,0xa5,0xbe, +0xfb,0x27,0x7a,0x71,0x17,0x7e,0x37,0xe, 0x4f,0x5e,0x70,0xdf,0x7a,0x37,0xe, 0x4f, +0xe5,0x17,0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x4e,0x37,0xe, 0x4f,0x7a,0x37,0xe, 0x4f,0x22,0xa5,0xbe,0x4e,0x5, 0x7a,0x73,0xe, +0x49,0x22,0xa5,0xbe,0x4f,0x3, 0xb2,0x86,0x22,0xbe,0x60,0x7b,0x40,0x1d,0xbe,0x60, +0x9f,0x38,0x18,0xa, 0x26,0x9, 0x62,0xc, 0x79,0x7e,0xb3,0xe, 0x3a,0xa, 0x26,0x70, +0x5, 0x19,0x72,0xd, 0xdf,0x22,0x19,0x72,0xd, 0x65,0x22,0xbe,0x60,0xa0,0x40,0x11, +0xbe,0x60,0xac,0x38,0xc, 0xa, 0x26,0x2e,0x27,0xe, 0x6b,0x9e,0x24,0x0, 0xa0,0x80, +0x56,0xbe,0x60,0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0xe, +0x6d,0x9e,0x24,0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38, +0xc, 0xa, 0x26,0x2e,0x27,0xe, 0x6f,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2, +0x40,0x11,0xbe,0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0xe, 0x71,0x9e,0x24,0x0, +0xd2,0x80,0x14,0xbe,0x60,0xd6,0x40,0x13,0xbe,0x60,0xed,0x38,0xe, 0xa, 0x26,0x2e, +0x27,0xe, 0x73,0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x22,0xa5,0xbe,0xf8,0x4, 0x7a, +0x73,0xf, 0xfb,0x22,0xca,0x3b,0x7e,0xf7,0x11,0x3b,0x7d,0xef,0x6c,0xaa,0x7e,0xe0, +0xff,0x7e,0x70,0x4, 0x7e,0xc0,0x3c,0x75,0x3f,0x14,0xe5,0x22,0xb4,0x1, 0x6, 0x7e, +0xc0,0x64,0x75,0x3f,0x1e,0x7e,0xb3,0x11,0xe1,0x4, 0x7a,0xb3,0x11,0xe1,0x7e,0x63, +0x11,0xe1,0xbe,0x60,0x9, 0x28,0x6, 0x74,0x9, 0x7a,0xb3,0x11,0xe1,0x7e,0xb3,0xf, +0xf4,0xb4,0x1, 0x3, 0x7e,0x70,0x9, 0x7e,0x63,0x11,0xdf,0xa, 0x16,0x9, 0x61,0xd, +0x19,0xbe,0x63,0xe, 0x49,0x68,0x2, 0x61,0xf4,0x7e,0xd0,0x1, 0x80,0x1e,0xbe,0xd0, +0x4, 0x68,0x17,0x7e,0x10,0x14,0xac,0x1d,0x49,0x10,0x11,0x3b,0xbd,0x1e,0x50,0x4, +0x7d,0xe1,0x7c,0xad,0xbd,0x1f,0x28,0x2, 0x7d,0xf1,0xb, 0xd0,0xbc,0x7d,0x38,0xde, +0x7e,0x73,0xf, 0xa0,0x7e,0x50,0x14,0xac,0x57,0x49,0x22,0x11,0x3b,0x7e,0x30,0x14, +0xac,0x3a,0x49,0x11,0x11,0x3d,0xbe,0x14,0x0, 0x8, 0x50,0x2, 0x61,0x6f,0xbc,0x7a, +0x78,0x2, 0x61,0x6f,0xe5,0x22,0xb4,0x1, 0x40,0x7e,0x70,0x2, 0xac,0x7c,0xbd,0x3e, +0x28,0x1e,0x7e,0x14,0x0, 0x3, 0xad,0x1e,0x7d,0x31,0x1e,0x34,0xbd,0x32,0x50,0x6a, +0xa, 0x1c,0x1e,0x14,0x7d,0x32,0x9d,0x3e,0xbd,0x31,0x28,0x5e,0x7c,0xea,0x80,0x5a, +0x7d,0x3e,0x3e,0x34,0x3e,0x34,0xbd,0x32,0x40,0xb, 0x7e,0x70,0x4, 0xac,0x7c,0x2d, +0x3e,0xbd,0x32,0x50,0x45,0x7c,0xea,0x80,0x41,0xa, 0x3c,0xbd,0x3e,0x28,0x20,0x7e, +0x4, 0x0, 0x3, 0x7d,0xde,0xad,0xd0,0x7d,0x3d,0x1e,0x34,0xbd,0x32,0x50,0x2b,0xa, +0x1c,0x8d,0x10,0x7d,0x32,0x9d,0x3e,0xbd,0x31,0x28,0x1f,0x7c,0xea,0x80,0x1b,0x7e, +0x14,0x0, 0x3, 0xad,0x1e,0x7d,0x31,0x1e,0x34,0xbd,0x32,0x40,0xb, 0x7e,0x70,0x2, +0xac,0x7c,0x2d,0x3e,0xbd,0x32,0x50,0x2, 0x7c,0xea,0xe5,0x3f,0xa, 0x3b,0xbd,0x3e, +0x28,0xd, 0x7e,0x71,0x3f,0x74,0x2, 0xac,0x7b,0xbd,0x32,0x50,0x2, 0x7c,0xea,0x6c, +0xff,0x7e,0xb3,0xf, 0xf4,0x70,0x16,0x7e,0xa1,0x3f,0x74,0x2, 0xa4,0xbd,0x5e,0x40, +0x19,0x7e,0xa1,0x3f,0x74,0x4, 0xa4,0xbd,0x5f,0x50,0x1a,0x80,0xd, 0x7e,0xb3,0xf, +0xf3,0xb4,0x1, 0x11,0xbe,0xe4,0x0, 0x28,0x28,0xb, 0x12,0x63,0x7d,0x7e,0xf0,0xf, +0x74,0xf, 0x12,0x4a,0x90,0x7e,0xb3,0xf, 0xf4,0xb4,0x1, 0x48,0x7e,0x73,0x11,0xe1, +0xbe,0x70,0x9, 0x40,0x3f,0x4c,0xff,0x78,0x3b,0x7e,0xd0,0x5, 0x74,0x14,0xac,0xbd, +0x49,0xe5,0x11,0x3b,0xa, 0x3c,0xbd,0x3e,0x50,0x17,0xa, 0x5d,0x9e,0x54,0x0, 0x5, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0xa, 0x3f,0x2d,0x32,0x7c, +0xf7,0xb, 0xd0,0xbe,0xd0,0x8, 0x28,0xd4,0x4c,0xff,0x68,0x8, 0x12,0x63,0x7d,0x7c, +0xbf,0x12,0x4a,0x90,0x7e,0x73,0xc, 0xdf,0xbe,0x70,0x0, 0x28,0x5f,0x7e,0x73,0xc, +0xe0,0xbe,0x70,0x0, 0x28,0x56,0x6d,0xff,0x6c,0xdd,0x74,0x14,0xac,0xbd,0x49,0xe5, +0x11,0x3b,0xbd,0xef,0x28,0x2, 0x7d,0xfe,0xb, 0xd0,0xbe,0xd0,0x4, 0x78,0xeb,0xbe, +0xf4,0x0, 0x14,0x50,0x3c,0x7e,0xb3,0x11,0xe2,0x4, 0x7a,0xb3,0x11,0xe2,0x7e,0xb3, +0xf, 0xf4,0xb4,0x1, 0x5, 0x7e,0xd0,0x4, 0x80,0x3, 0x7e,0xd0,0x8, 0x7e,0x73,0x11, +0xe2,0xbc,0x7d,0x28,0x1c,0x7e,0x73,0xe, 0x49,0xbe,0x73,0xd, 0x19,0x68,0x12,0x6c, +0xee,0xe4,0x7a,0xb3,0xf, 0xf4,0x7a,0xb3,0xf, 0xf3,0x80,0x5, 0xe4,0x7a,0xb3,0x11, +0xe2,0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xc3,0xc, 0xdf,0x7e,0xb3,0xc, 0xe0, +0xf5,0x3f,0x4c,0xcc,0x78,0x57,0x6c,0xff,0x7e,0x34,0x7f,0xff,0x74,0x4, 0xac,0xbf, +0x59,0x35,0x10,0xa6,0x59,0x35,0x10,0xa8,0x7e,0x24,0x1, 0x0, 0x7c,0xbf,0x3e,0xb0, +0x24,0x8, 0xa, 0x3b,0x1b,0x38,0x20,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xda,0xe5,0x3f, +0xbe,0xb0,0x0, 0x38,0x2, 0xc1,0x8e,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac, +0x7f,0x19,0xa3,0xc, 0x7f,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xf0,0x74,0x1, 0x7a,0xb3, +0xc, 0xe4,0xe4,0x7a,0xb3,0xc, 0xe6,0x7a,0xb3,0xc, 0xe7,0xc1,0x8e,0x6c,0xff,0x7e, +0x70,0xff,0x74,0x7, 0xac,0xbf,0x19,0x75,0x11,0xe7,0x7e,0x34,0x7f,0xff,0x59,0x35, +0x11,0xe3,0x59,0x35,0x11,0xe5,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xe2,0xe5,0x3f,0x70, +0x1b,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xc, 0x7f,0xb, +0xf0,0xbe,0xf0,0x5, 0x78,0xf0,0x74,0x1, 0x7a,0xb3,0xc, 0xe3,0x6c,0xff,0x80,0x30, +0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0xc, 0x58,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0xc, 0x5a, +0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0, +0xbc,0xcf,0x38,0xcc,0xe5,0x3f,0x70,0x20,0x6c,0xff,0x80,0x16,0x7e,0x30,0x7, 0xac, +0x3f,0x7d,0x31,0x2e,0x34,0xc, 0x58,0x2e,0x14,0xc, 0x7b,0x74,0x7, 0x12,0x68,0xed, +0xb, 0xf0,0xbc,0xcf,0x38,0xe6,0x80,0x6b,0x6c,0xee,0x6c,0xff,0x6c,0xdd,0x7e,0x70, +0x7, 0xac,0x7d,0x9, 0xa3,0xc, 0x7f,0x7e,0x50,0x7, 0xac,0x5f,0x9, 0xb2,0xc, 0x5c, +0xbc,0xba,0x78,0x1e,0xbe,0xb0,0xff,0x68,0x19,0xbe,0xe0,0x5, 0x50,0x1b,0x2e,0x34, +0xc, 0x7b,0x7e,0x30,0x7, 0xac,0x3e,0x2e,0x14,0x11,0xe3,0x74,0x7, 0x12,0x68,0xed, +0x80,0x7, 0xb, 0xd0,0xbe,0xd0,0x5, 0x40,0xc5,0xbe,0xd0,0x5, 0x78,0x1c,0xbe,0xe0, +0x5, 0x50,0x17,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xc, 0x58,0x7e,0x30,0x7, 0xac, +0x3e,0x2e,0x14,0x11,0xe3,0x74,0x7, 0x12,0x68,0xed,0xb, 0xe0,0xb, 0xf0,0xbe,0xf0, +0x5, 0x78,0x99,0x6c,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x7d,0x31,0x2e,0x34,0x11,0xe3, +0x2e,0x14,0xc, 0x7b,0x74,0x7, 0x12,0x68,0xed,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xe5, +0x6c,0xff,0x80,0x4e,0x7c,0xdf,0x6c,0xee,0x80,0x21,0x7e,0x90,0x7, 0xac,0x9f,0x9, +0xa4,0xc, 0x7f,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xc, 0x5c,0xbc,0xba,0x78,0x9, +0xbe,0xa0,0xff,0x68,0x4, 0x7c,0xde,0x80,0x6, 0xb, 0xe0,0xbc,0xce,0x38,0xdb,0xbe, +0xd0,0x5, 0x40,0x2, 0x7c,0xdf,0xe5,0x3f,0x70,0xf, 0x7e,0x24,0xc, 0x58,0x7e,0x34, +0xc, 0x7b,0x7e,0x14,0x0, 0x23,0x12,0x6e,0xc8,0x7c,0xbf,0x7c,0x7d,0x12,0x0, 0x76, +0xb, 0xf0,0xbc,0xcf,0x38,0xae,0x6c,0xff,0x74,0x7, 0xac,0xbf,0x49,0x35,0xc, 0x7b, +0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x59,0x35,0xc, 0x58,0x74,0x7, 0xac,0xbf, +0x49,0x35,0xc, 0x7d,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x59,0x35,0xc, 0x5a, +0x74,0x7, 0xac,0xbf,0x9, 0x75,0xc, 0x7f,0x19,0x75,0xc, 0x5c,0xb, 0xf0,0xbe,0xf0, +0x5, 0x78,0xc5,0xbe,0xc0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0xc, 0xe8,0xda,0x3b, +0x22,0xca,0xf8,0x7e,0xa3,0xc, 0xdf,0x7e,0x4, 0xc, 0xc1,0x4c,0xaa,0x78,0x9, 0x7e, +0xb3,0xc, 0xf1,0x12,0x1f,0xfa,0xe1,0xd0,0x6c,0x99,0x7e,0x30,0x7, 0xac,0x39,0x7d, +0xf1,0x2e,0xf4,0xc, 0x9e,0x9, 0x8f,0x0, 0x4, 0xbe,0x80,0xff,0x78,0x2, 0xe1,0xaa, +0xa, 0x18,0x2d,0x10,0x7e,0x19,0xb0,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xaa,0xb, 0xf8, +0x30,0x7e,0x50,0x4, 0xac,0x58,0x49,0x22,0x11,0x12,0x12,0x63,0x5d,0x7d,0xe3,0x49, +0x3f,0x0, 0x2, 0x7e,0x50,0x4, 0xac,0x58,0x49,0x22,0x11,0x14,0x12,0x63,0x5d,0x7d, +0xd3,0x7e,0xb3,0xc, 0x3d,0xb4,0x2, 0x1d,0x7e,0xb3,0xb, 0x98,0xa, 0x2b,0x7e,0xb3, +0xb, 0x96,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0x7c,0xf7,0xbe,0xf0,0x2, 0x38,0x10, +0x75,0x12,0xa, 0x80,0xb, 0xe5,0x12,0xb4,0xa, 0x6, 0x7e,0xb3,0xc, 0xf1,0xf5,0x12, +0xe5,0x12,0xa, 0x1b,0xbd,0x1e,0x28,0x48,0xbd,0x1d,0x28,0x44,0x7e,0x30,0x4, 0xac, +0x38,0x49,0x11,0x11,0x12,0x1b,0xf8,0x10,0x7e,0x30,0x4, 0xac,0x38,0x49,0x11,0x11, +0x14,0x59,0x1f,0x0, 0x2, 0xa, 0x18,0x2d,0x10,0x7e,0x19,0xb0,0xb4,0x2, 0x7, 0xbe, +0xa0,0x0, 0x28,0x2, 0x1b,0xa0,0x4c,0xaa,0x78,0x6d,0x5, 0x13,0x7e,0xb3,0xc, 0xf2, +0xbe,0xb1,0x12,0x28,0x62,0xe5,0x13,0xbe,0xb0,0x32,0x40,0x5b,0x5, 0x12,0x80,0x35, +0xb, 0xf8,0x20,0x7e,0x70,0x4, 0xac,0x78,0x59,0x23,0x11,0x12,0x49,0x1f,0x0, 0x2, +0x59,0x13,0x11,0x14,0xe5,0x12,0xbe,0xb0,0xa, 0x68,0x1a,0x7e,0xb3,0xc, 0xf1,0xbe, +0xb1,0x12,0x78,0x8, 0x7e,0xb3,0xc, 0xf2,0xf5,0x12,0x80,0x9, 0xe5,0x12,0xbe,0xb0, +0x1, 0x28,0x2, 0x15,0x12,0x75,0x13,0x0, 0x80,0x1d,0xa, 0x18,0x2d,0x10,0x7e,0x19, +0xb0,0x70,0x14,0xb, 0xf8,0x20,0x7e,0x70,0x4, 0xac,0x78,0x59,0x23,0x11,0x12,0x49, +0x1f,0x0, 0x2, 0x59,0x13,0x11,0x14,0xb, 0x90,0xbe,0x90,0x5, 0x68,0x2, 0xc1,0xaa, +0xda,0xf8,0x22,0x60,0xe, 0x80,0x4, 0xe4,0x12,0x62,0xe4,0xe5,0x1a,0xc4,0x54,0x7, +0xb4,0x2, 0xf4,0xe5,0x1a,0xc4,0x54,0x7, 0xb4,0x2, 0x13,0x43,0x1a,0x80,0x80,0x4, +0xe4,0x12,0x62,0xe4,0xe5,0x1a,0xc4,0x54,0x7, 0xbe,0xb0,0x2, 0x68,0xf2,0x22,0xff, +0xca,0x3b,0x75,0x44,0x0, 0xe4,0x7a,0xb3,0x11,0xe4,0x12,0x4f,0x76,0x7e,0xb3,0xe, +0x2a,0xf5,0x3f,0x7e,0xb3,0xe, 0x2b,0xf5,0x40,0x7e,0xb3,0xc, 0x3d,0xf5,0x41,0x70, +0x5, 0xe4,0x7a,0xb3,0x12,0xf0,0x7e,0x37,0x12,0xeb,0xbe,0x34,0x0, 0x0, 0x28,0x5, +0x75,0x44,0x1, 0x80,0x5, 0xe4,0x7a,0xb3,0x12,0xf0,0x6d,0x66,0x7e,0xa1,0x41,0x74, +0x6, 0xa4,0x7a,0x55,0x42,0xbe,0x54,0x0, 0x1e,0x50,0x7, 0x7e,0x34,0x0, 0x1e,0x7a, +0x35,0x42,0x6c,0xff,0x80,0x3e,0x7e,0x70,0x30,0xac,0x7f,0x2e,0x37,0xd, 0xdd,0x6c, +0xee,0x80,0x29,0x7d,0x23,0xb, 0x35,0xb, 0x28,0x20,0x7e,0x14,0x6f,0x3f,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x10,0xbd,0x12,0x50,0x11,0x7e,0x14,0x6f,0x41,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x10,0xbd,0x12,0x28,0x2, 0xb, 0x64,0xb, 0xe0,0xe5,0x40,0xbc,0xbe, +0x38,0xd1,0xb, 0xf0,0xe5,0x3f,0xbc,0xbf,0x38,0xbc,0xbe,0x64,0x0, 0x3c,0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x12,0xef,0x7e,0x35,0x42,0xbd,0x36,0x50,0x2d,0x7e,0xa3,0x12, +0xf0,0x4c,0xaa,0x78,0xa, 0x7e,0x37,0x12,0xed,0xbe,0x34,0x0, 0xbe,0x8, 0x1b,0x75, +0x44,0x1, 0x74,0x1, 0x7a,0xb3,0x11,0xe4,0x7e,0x34,0x3, 0x20,0x7a,0x37,0x12,0xeb, +0x4c,0xaa,0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x12,0xf0,0x7e,0xb3,0x11,0xe4,0x70,0xd, +0x7e,0xb3,0x12,0xf0,0xb4,0x1, 0x6, 0x74,0x2, 0x7a,0xb3,0x12,0xf0,0x7e,0xe7,0x12, +0xe9,0xe5,0x44,0xb4,0x1, 0x2, 0x80,0x2, 0x41,0x1d,0x6c,0xff,0x41,0x15,0x7c,0xbf, +0x12,0x64,0x2, 0x70,0x2, 0x41,0x13,0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0xb, 0x96, +0xf5,0x45,0x9, 0xb3,0xb, 0x97,0xf5,0x46,0xe4,0x7a,0xb3,0x11,0xe3,0x7c,0xbf,0x12, +0x60,0xbc,0x7a,0x35,0x47,0x6d,0xdd,0xe5,0x45,0xbe,0xb0,0x0, 0x38,0x2, 0x41,0x0, +0xe5,0x3f,0xa, 0xfb,0x1b,0xf4,0xe5,0x45,0xa, 0xcb,0xbd,0xcf,0x48,0x2, 0x41,0x0, +0xe5,0x46,0xbe,0xb0,0x0, 0x38,0x2, 0x41,0x0, 0xe5,0x40,0xa, 0xfb,0x1b,0xf4,0xe5, +0x46,0xa, 0xbb,0xbd,0xbf,0x48,0x2, 0x41,0x0, 0xe5,0x45,0xa, 0xfb,0x1b,0xf4,0x7d, +0x3f,0x7c,0xe7,0x80,0x3e,0xe5,0x46,0xa, 0x1b,0x1b,0x14,0x80,0x2a,0xe5,0x45,0xbc, +0xbe,0x78,0x6, 0xe5,0x46,0xbc,0xb3,0x68,0x1c,0x7e,0x90,0x30,0xac,0x9e,0x74,0x2, +0xac,0xb3,0x7d,0xf5,0x2d,0xf4,0x2e,0xf7,0xd, 0xdd,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, +0x0, 0x8, 0x2, 0x2d,0xdf,0xb, 0x30,0x7d,0xab,0xb, 0xa4,0xa, 0xf3,0xbd,0xfa,0x8, +0xcc,0xb, 0xe0,0x7d,0xac,0xb, 0xa4,0xa, 0xfe,0xbd,0xfa,0x8, 0xb8,0x7e,0xf5,0x47, +0x7e,0x34,0x0, 0x6, 0xad,0x3f,0xbd,0x3d,0x28,0x1e,0xbe,0xe4,0x0, 0x0, 0x28,0x7, +0xbe,0xe5,0x47,0x38,0x2, 0x80,0x6, 0xbe,0xf4,0x0, 0xb4,0x28,0x6, 0x74,0x1, 0x7a, +0xb3,0x11,0xe3,0x75,0x49,0x0, 0x80,0xf, 0xbe,0xf4,0x1, 0x68,0x28,0x6, 0x74,0x1, +0x7a,0xb3,0x11,0xe3,0x75,0x49,0x1, 0x74,0x1, 0x7a,0xb3,0x11,0xe3,0x7e,0xb3,0x12, +0xef,0x60,0x13,0xe5,0x45,0x7e,0x71,0x46,0x7e,0x61,0x49,0x12,0x4b,0x32,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x11,0xe3,0x7e,0xb3,0x11,0xe3,0x70,0x7, 0x7c,0xbf,0x6c,0x77, +0x12,0x0, 0x5e,0xb, 0xf0,0xe5,0x41,0xbc,0xbf,0x28,0x2, 0x1, 0xfe,0xda,0x3b,0x22, +0xca,0x79,0x75,0x42,0x0, 0x75,0x43,0x0, 0x6c,0xff,0x6c,0xee,0x74,0x2, 0xac,0xbe, +0x2e,0x57,0xd, 0xd9,0xb, 0x58,0xe0,0xbe,0xe4,0x1, 0xf4,0x8, 0x2, 0x5, 0x42,0xbe, +0xe4,0xff,0x9c,0x58,0x2, 0x5, 0x43,0xb, 0xe0,0xbe,0xe0,0x18,0x78,0xde,0x6d,0x0, +0x7d,0xf0,0x6c,0x33,0x61,0xe4,0x7e,0x70,0x2, 0xac,0x73,0x9, 0xb3,0xb, 0x96,0xf5, +0x3f,0x9, 0x23,0xb, 0x97,0x9f,0x66,0x75,0x45,0x0, 0x7c,0xb3,0x12,0x60,0xbc,0x7d, +0x43,0xbd,0x4f,0x8, 0x2, 0x7d,0xf4,0x7e,0x73,0xe, 0x2b,0xa, 0x37,0x1b,0x34,0xe5, +0x42,0xa, 0x5b,0xbd,0x53,0x58,0x2, 0x61,0x29,0xe5,0x3f,0xbe,0xb0,0x0, 0x38,0x2, +0x61,0x29,0x7e,0xa3,0xe, 0x2a,0x7c,0xba,0x14,0xa, 0x2b,0xe5,0x3f,0xa, 0x3b,0xbd, +0x32,0x48,0x2, 0x61,0x29,0xbe,0x20,0x0, 0x38,0x2, 0x61,0x29,0xbe,0x20,0x17,0x50, +0x78,0x1b,0x34,0x7c,0xb7,0xf5,0x40,0x80,0x62,0xa, 0x32,0x1b,0x34,0x7c,0xb7,0xf5, +0x41,0x80,0x4a,0xe5,0x40,0xbe,0xb0,0x0, 0x48,0x41,0xa, 0x3a,0x1b,0x34,0x7c,0xb7, +0x1a,0xbb,0xe5,0x40,0x1a,0xab,0xbd,0xab,0x18,0x31,0xe5,0x41,0xbe,0xb0,0x0, 0x48, +0x2a,0xe5,0x41,0xbe,0xb0,0x17,0x18,0x23,0x7e,0xb4,0x0, 0x18,0xad,0xba,0xe5,0x41, +0x1a,0x3b,0x2d,0x3b,0x3e,0x34,0x2e,0x37,0xd, 0xdd,0xb, 0x38,0x30,0xbe,0x34,0x0, +0x0, 0x8, 0x8, 0x1a,0x26,0x1a,0x24,0x2f,0x61,0x5, 0x45,0x5, 0x41,0xa, 0x22,0xb, +0x24,0xe5,0x41,0x1a,0x3b,0xbd,0x32,0x8, 0xaa,0x5, 0x40,0xe5,0x3f,0xa, 0x2b,0xb, +0x24,0xe5,0x40,0x1a,0x3b,0xbd,0x32,0x8, 0x90,0x7d,0x34,0x1a,0x26,0x1a,0x24,0x2f, +0x11,0xbf,0x61,0x18,0xf, 0xbe,0x68,0x0, 0x0, 0x8, 0x9, 0xe5,0x45,0xbe,0xb0,0x5, +0x40,0x2, 0x80,0x63,0x75,0x44,0x0, 0x6c,0xee,0x80,0x4f,0x7e,0x50,0x30,0xac,0x5e, +0x7e,0x70,0x2, 0xac,0x72,0x7d,0xb3,0x2d,0xb2,0x2e,0xb7,0xd, 0xdd,0xb, 0xb8,0xe0, +0xbd,0xe4,0x18,0x34,0x7d,0xae,0x3e,0xa4,0xbd,0xa4,0x48,0x2c,0x6d,0x99,0x7d,0xa9, +0xa5,0xba,0x0, 0x2, 0x80,0x14,0xa5,0xba,0x17,0x9, 0x7d,0xab,0x1b,0xa5,0xb, 0xa8, +0xa0,0x80,0xb, 0x7d,0xab,0x1b,0xa5,0xb, 0xa8,0xa0,0x49,0x9b,0x0, 0x2, 0xbd,0xae, +0x58,0x6, 0xbd,0x9e,0x58,0x2, 0x5, 0x44,0xb, 0xe0,0x7e,0xb3,0xe, 0x2a,0xbc,0xbe, +0x38,0xa9,0xbe,0xb1,0x44,0x38,0x5, 0x7e,0xf0,0x20,0x80,0x31,0x7e,0x70,0x2, 0xac, +0x72,0x2e,0x37,0xd, 0xd9,0xb, 0x38,0x30,0xbe,0x34,0x0, 0x0, 0x48,0x15,0x7e,0x71, +0x3f,0x74,0x2, 0xac,0x7b,0x2e,0x37,0xd, 0xd9,0x49,0x33,0x0, 0x30,0xbe,0x34,0x0, +0x0, 0x58,0xa, 0xe5,0x43,0xbe,0xb0,0xc, 0x40,0x3, 0x7e,0xf0,0x8, 0xbe,0xf0,0x0, +0x38,0xc, 0xb, 0x30,0x7e,0xb3,0xc, 0x3d,0xbc,0xb3,0x28,0x2, 0x41,0x56,0xbe,0xf4, +0x3, 0x20,0x8, 0x3, 0x7e,0xf0,0x20,0x4c,0xff,0x78,0x3e,0x6c,0x33,0x80,0x29,0x74, +0x2, 0xac,0xb3,0x9, 0x65,0xb, 0xb4,0x7a,0x61,0x3f,0x9, 0x25,0xb, 0xb5,0x7e,0x70, +0x18,0xac,0x67,0xa, 0x22,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xd, 0xdd,0xb, 0x38,0x40, +0xbd,0x4, 0x8, 0x2, 0x7d,0x4, 0xb, 0x30,0x7e,0x73,0xc, 0x3e,0xbc,0x73,0x38,0xcf, +0xbe,0x4, 0xfd,0xa8,0x58,0x3, 0x7e,0xf0,0x20,0x7c,0xbf,0xda,0x79,0x22,0xca,0x3b, +0x7e,0x34,0x12,0x2c,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6f,0x1, 0x7e,0xe0,0x1, 0x7e, +0x73,0xe, 0x4c,0x7a,0x73,0x11,0xe3,0x7a,0xb3,0xe, 0x4c,0x6c,0xdd,0x6c,0xcc,0x80, +0x11,0xa, 0x3c,0x2e,0x37,0xe, 0x6d,0x7e,0x39,0x70,0xbc,0x7d,0x40,0x2, 0x7c,0xd7, +0xb, 0xc0,0x7e,0x73,0xe, 0x2a,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1b,0x50,0xc, 0xa, +0x2d,0x7e,0x34,0x0, 0x1b,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd,0x7a,0xd1,0x3f, +0x7e,0x34,0xe, 0x2a,0x12,0x66,0x66,0x7e,0x34,0xe, 0x2a,0x12,0x6e,0x4d,0xa1,0xf0, +0x12,0x63,0x3b,0x12,0x6d,0xf8,0xe5,0x66,0x60,0xfc,0xa9,0xb7,0xea,0x7e,0x37,0xd, +0xdd,0x7e,0x27,0xd, 0xdb,0x7e,0x14,0x18,0x0, 0x12,0x5d,0x9d,0x6c,0xcc,0x80,0x60, +0x6c,0xff,0x80,0x52,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3,0x12,0x14,0x6d, +0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x11,0xe4,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70, +0x2, 0xac,0x7f,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14, +0xe, 0x14,0xe, 0x14,0xe, 0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x11,0xe4,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xa, 0x3f,0x2e,0x34,0x12,0x14,0x7e,0x39,0xb0, +0x4, 0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0xe, 0x2b,0xbc,0x7f,0x38,0xa6,0xb, 0xc0, +0x7e,0x73,0xe, 0x2a,0xbc,0x7c,0x38,0x98,0x75,0x40,0x0, 0x6c,0xcc,0xa1,0xcf,0xa, +0x3c,0x9, 0xa3,0x12,0x14,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x21,0x34,0x7e,0x70,0x2, +0xac,0x7c,0x59,0x43,0x11,0xe4,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x11, +0xe4,0xa, 0xa, 0x8d,0x10,0x59,0x12,0x11,0xe4,0x2e,0x24,0x11,0xe4,0xb, 0x28,0x30, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, +0xac,0x5c,0x49,0x32,0x11,0xe4,0xbe,0x34,0x1f,0x40,0x50,0x22,0xa, 0x1c,0x2e,0x14, +0x12,0x2c,0x7e,0x19,0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0xe, 0x73,0x7e, +0x19,0xb0,0xbc,0xbd,0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34, +0x23,0x28,0x28,0x27,0xa, 0x3c,0x2e,0x34,0x12,0x2c,0x7e,0x39,0xb0,0x4, 0x7a,0x39, +0xb0,0xa, 0x3c,0x2e,0x37,0xe, 0x73,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14, +0x7a,0x39,0xb0,0x80,0x8, 0x5, 0x40,0x6c,0xee,0x80,0x2, 0x5, 0x40,0xb, 0xc0,0x7e, +0x73,0xe, 0x2b,0xbc,0x7c,0x28,0x2, 0xa1,0x2f,0x7e,0x34,0xe, 0x2a,0x12,0x66,0x66, +0x7e,0x34,0xe, 0x2a,0x12,0x6e,0x4d,0x7e,0x73,0xe, 0x2b,0xbe,0x71,0x40,0x68,0xe, +0x7e,0xa1,0x3f,0x7c,0xba,0x14,0xf5,0x3f,0x4c,0xaa,0x68,0x2, 0x81,0xa0,0x7e,0x73, +0x11,0xe3,0x7a,0x73,0xe, 0x4c,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x12,0x2c, +0xbc,0x7d,0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xe, 0x2b,0xbc,0x7f, +0x38,0xe8,0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xc, 0xdf,0x4c,0xff,0x78, +0xe, 0x7e,0x34,0x10,0x6c,0x7e,0x24,0x0, 0x5, 0xe4,0x12,0x6f,0x1, 0xe1,0xda,0x6c, +0xee,0x74,0x2, 0xac,0xbe,0x49,0x15,0xc, 0xcb,0xbe,0x14,0xff,0xff,0x78,0x7, 0xe4, +0xa, 0x1e,0x19,0xb1,0x10,0x6c,0xb, 0xe0,0xbe,0xe0,0x5, 0x78,0xe4,0x6c,0xee,0xe1, +0xd4,0x74,0x7, 0xac,0xbe,0x9, 0xd5,0xc, 0x5c,0x49,0xf5,0xc, 0x58,0x49,0xe5,0xc, +0x5a,0xa, 0x1d,0x9, 0xb1,0x10,0x6c,0x70,0x29,0x6c,0xcc,0x7e,0x70,0x14,0xac,0x7d, +0x7e,0x30,0x4, 0xac,0x3c,0x2d,0x13,0x59,0xf1,0x10,0x8, 0x7e,0x70,0x14,0xac,0x7d, +0x7e,0x30,0x4, 0xac,0x3c,0x2d,0x13,0x59,0xe1,0x10,0xa, 0xb, 0xc0,0xbe,0xc0,0x5, +0x78,0xd9,0xa, 0x1d,0x9, 0xb1,0x10,0x6c,0xbe,0xb0,0x5, 0x50,0xa, 0xa, 0x1d,0x2e, +0x14,0x10,0x6c,0x4, 0x7a,0x19,0xb0,0xa, 0x1d,0x9, 0xb1,0x10,0x6c,0x70,0x2, 0xe1, +0x44,0x74,0x14,0xac,0xbd,0x49,0x45,0x10,0x18,0x49,0x35,0x10,0x14,0x2d,0x43,0x49, +0x25,0x10,0x1a,0x49,0x5, 0x10,0x16,0x2d,0x2, 0x9d,0x3f,0x12,0x6e,0xf1,0x7d,0xd3, +0x74,0x14,0xac,0xbd,0x49,0x35,0x10,0x16,0x9d,0x3e,0x12,0x6e,0xf1,0x7d,0xc3,0x7e, +0x30,0x14,0xac,0x3d,0x49,0x31,0x10,0x10,0x49,0x51,0x10,0xc, 0xbd,0x53,0x78,0xc, +0x49,0x51,0x10,0x12,0x49,0x11,0x10,0xe, 0xbd,0x15,0x68,0x2c,0xbe,0xd4,0x0, 0x33, +0x38,0x32,0xbe,0xc4,0x0, 0x1e,0x38,0x2c,0x7e,0x34,0x0, 0x6, 0x7d,0xbf,0xad,0xb3, +0x7d,0xfb,0x2d,0xf4,0x1e,0xf4,0x1e,0xf4,0x1e,0xf4,0xad,0x3e,0x7d,0xe3,0x2d,0xe0, +0x1e,0xe4,0x1e,0xe4,0x1e,0xe4,0x80,0xc, 0x1e,0x44,0x2d,0xf4,0x1e,0xf4,0x1e,0x4, +0x2d,0xe0,0x1e,0xe4,0xa, 0x1d,0x9, 0xb1,0x10,0x6c,0x60,0x76,0x74,0x14,0xac,0xbd, +0x49,0x25,0x10,0x10,0x7d,0x3f,0x9d,0x32,0x12,0x6e,0xf1,0x7d,0x43,0x74,0x14,0xac, +0xbd,0x49,0x25,0x10,0x12,0x7d,0x3e,0x9d,0x32,0x12,0x6e,0xf1,0x7d,0x3, 0xbe,0x44, +0x0, 0x33,0x38,0x6, 0xbe,0x4, 0x0, 0x33,0x28,0x24,0x7e,0x30,0x14,0xac,0x3d,0x7d, +0x31,0x2e,0x34,0x10,0x10,0x2e,0x14,0x10,0xc, 0x74,0x4, 0x12,0x68,0xed,0x74,0x14, +0xac,0xbd,0x59,0xf5,0x10,0x10,0x74,0x14,0xac,0xbd,0x59,0xe5,0x10,0x12,0x7e,0x30, +0x14,0xac,0x3d,0x7d,0x31,0x2e,0x34,0x10,0x14,0x2e,0x14,0x10,0x18,0x74,0x4, 0x12, +0x68,0xed,0x74,0x14,0xac,0xbd,0x59,0xf5,0x10,0x14,0x74,0x14,0xac,0xbd,0x59,0xe5, +0x10,0x16,0x74,0x7, 0xac,0xbe,0x59,0xf5,0xc, 0x58,0x74,0x7, 0xac,0xbe,0x59,0xe5, +0xc, 0x5a,0xb, 0xe0,0xbc,0xfe,0x28,0x2, 0xc1,0x61,0xda,0x3b,0x22,0x7d,0x12,0x5e, +0x14,0x0, 0x7, 0x2e,0x14,0x6f,0x2a,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0x1e, +0x24,0x1e,0x24,0x1e,0x24,0x2d,0x23,0x7e,0x29,0x70,0x4c,0x7b,0x7a,0x29,0x70,0x22, +0xca,0x3b,0x7e,0xb3,0xe, 0x3b,0xf5,0x3f,0xe4,0x7a,0xb3,0xe, 0x3b,0x7e,0xb3,0xe, +0x39,0xf5,0x40,0x74,0x1, 0x7a,0xb3,0xe, 0x39,0x7e,0x37,0xe, 0x47,0x7e,0x24,0x0, +0x25,0xe4,0x12,0x6f,0x1, 0x7e,0xe0,0x7, 0x12,0x63,0x3b,0x6c,0xff,0x7e,0x24,0x0, +0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0xa, 0xef,0x2e,0xe7,0xe, 0x47, +0x7e,0xe9,0x70,0x4c,0x75,0x7a,0xe9,0x70,0xb, 0xf0,0xbe,0xf0,0x25,0x78,0xde,0x7e, +0x34,0xe, 0x2a,0x12,0x6a,0x48,0x7e,0x34,0xe, 0x2a,0x12,0x6d,0x80,0xe5,0x67,0x60, +0xfc,0x7e,0x37,0xd, 0xd9,0x7e,0x25,0x61,0x12,0x58,0xa2,0x6c,0xff,0xa, 0xef,0x9, +0xde,0xc, 0xf4,0x74,0x2, 0xac,0xbf,0x7d,0xe5,0x2e,0xe7,0xd, 0xd9,0xb, 0xe8,0xe0, +0xbe,0xe4,0x25,0x80,0x18,0x21,0x7e,0xe4,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x7d,0x2e,0x6e,0x24,0xff,0xff,0xa, 0xed,0x2e,0xe7,0xe, 0x47,0x7e, +0xe9,0x70,0x5c,0x75,0x7a,0xe9,0x70,0xb, 0xf0,0xbe,0xf0,0x25,0x78,0xbf,0x1b,0xe0, +0xbe,0xe0,0x0, 0x48,0x2, 0x1, 0x28,0x7e,0xb3,0xe, 0x38,0xb4,0x1, 0x2, 0x80,0x2, +0x21,0x9e,0x7e,0xe0,0xa, 0x74,0x2, 0x7a,0xb3,0xe, 0x39,0x21,0x94,0x12,0x63,0x3b, +0x7e,0x73,0xe, 0x2a,0xa, 0x37,0x7e,0x53,0xe, 0x2b,0xa, 0xe5,0x2d,0xe3,0x7d,0x3e, +0x7c,0xc7,0x6c,0xff,0x80,0x78,0x7e,0xa3,0xe, 0x2b,0xbc,0xaf,0x28,0x11,0xa, 0x3f, +0x9, 0xd3,0xc, 0xf4,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x37,0xd, 0xd9,0x80,0x27,0xa, +0x2a,0xa, 0x3f,0x9d,0x32,0x2e,0x37,0xe, 0x32,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34, +0x0, 0x18,0x7c,0xd7,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x37,0xd, 0xd9,0x2e,0x34,0x0, +0x30,0x74,0x2, 0xa4,0x9d,0x35,0xb, 0x38,0xf0,0xbe,0xf4,0x31,0x38,0x48,0x11,0xa, +0xed,0x2e,0xe7,0xe, 0x47,0x7e,0xe9,0xb0,0xbe,0xb0,0xfe,0x50,0x1f,0x4, 0x80,0x15, +0xbe,0xf4,0x19,0xc8,0x18,0x14,0xa, 0xed,0x2e,0xe7,0xe, 0x47,0x7e,0xe9,0xb0,0xbe, +0xb0,0x0, 0x28,0x8, 0x14,0x7a,0xe9,0xb0,0x80,0x2, 0x1b,0xc0,0xb, 0xf0,0x7e,0x73, +0xe, 0x2a,0xa, 0x27,0x7e,0x73,0xe, 0x2b,0xa, 0x37,0x2d,0x32,0xa, 0xef,0xbd,0xe3, +0x58,0x2, 0x1, 0xe6,0x4c,0xcc,0x68,0x26,0x7e,0x34,0xe, 0x2a,0x12,0x6a,0x48,0x7e, +0x34,0xe, 0x2a,0x12,0x6d,0x80,0xe5,0x67,0x60,0xfc,0x7e,0x37,0xd, 0xd9,0x7e,0x25, +0x61,0x12,0x58,0xa2,0x7c,0xae,0x1b,0xe0,0x4c,0xaa,0x68,0x2, 0x1, 0xcd,0xe5,0x3f, +0x7a,0xb3,0xe, 0x3b,0xe5,0x40,0x7a,0xb3,0xe, 0x39,0xda,0x3b,0x22,0xca,0x3b,0x75, +0x3f,0x0, 0x7e,0x34,0xa, 0xd9,0x7e,0x24,0x0, 0x4, 0xe4,0x12,0x6f,0x1, 0xe4,0x7a, +0xb3,0xb, 0x8c,0x7a,0xb3,0xb, 0x8d,0x7a,0xb3,0xb, 0x8e,0x7a,0xb3,0xb, 0x8f,0x7e, +0xb3,0xd, 0xd5,0xb4,0x1, 0x2, 0x80,0x2, 0x61,0x47,0x7e,0x34,0x11,0xe3,0x7e,0x24, +0x0, 0x5, 0x74,0xff,0x12,0x6f,0x1, 0x7e,0x34,0x11,0xe8,0x7e,0x24,0x0, 0x5, 0x74, +0xff,0x12,0x6f,0x1, 0x7e,0x37,0xd, 0xd9,0x7e,0xb3,0xe, 0x2b,0x7e,0x27,0xd, 0x46, +0x7e,0x14,0x11,0xe3,0x6c,0x11,0x12,0x48,0x0, 0x7c,0xeb,0x7e,0x37,0xd, 0xd9,0x2e, +0x34,0x0, 0x30,0x7e,0xb3,0xe, 0x2a,0x7e,0x27,0xd, 0x44,0x7e,0x14,0x11,0xe8,0x12, +0x48,0x0, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x5a,0xa, 0x3a,0x9, 0xb3,0x11,0xe8, +0xa, 0x4a,0x19,0xb4,0xb, 0x91,0x6c,0xcc,0x80,0x44,0x7c,0xbf,0xc4,0x23,0x54,0x1f, +0x7c,0x6b,0x7a,0x61,0x3f,0xa, 0x2a,0x9, 0x72,0x11,0xe8,0x7e,0x50,0x2, 0xac,0x5f, +0x19,0x72,0xa, 0x75,0xa, 0x1c,0x9, 0x71,0x11,0xe3,0x19,0x72,0xa, 0x76,0x7c,0xbf, +0x54,0x7, 0x7e,0x70,0x1, 0x60,0x5, 0x3e,0x70,0x14,0x78,0xfb,0xa, 0x46,0x2e,0x44, +0xa, 0xd9,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xc0,0xbc,0xec, +0x38,0xb8,0xb, 0xa0,0xbc,0xda,0x38,0xa2,0x7a,0xf3,0xb, 0x8c,0x7a,0xd3,0xb, 0x90, +0x7e,0x34,0x11,0xe3,0x7e,0x24,0x0, 0x5, 0x74,0xff,0x12,0x6f,0x1, 0x7e,0x34,0x11, +0xe8,0x7e,0x24,0x0, 0x5, 0x74,0xff,0x12,0x6f,0x1, 0x7e,0x37,0xd, 0xd9,0x7e,0xb3, +0xe, 0x2b,0x7e,0x27,0xd, 0x48,0x7e,0x14,0x11,0xe3,0x7e,0x10,0x1, 0x12,0x48,0x0, +0x7c,0xeb,0x7e,0x37,0xd, 0xd9,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0xe, 0x2a,0x7e,0x27, +0xd, 0x48,0x7e,0x14,0x11,0xe8,0x12,0x48,0x0, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80, +0x27,0x6c,0xcc,0x80,0x1d,0xa, 0x3a,0x9, 0x73,0x11,0xe8,0x7e,0x90,0x2, 0xac,0x9f, +0x19,0x74,0xa, 0xa7,0xa, 0x3c,0x9, 0xb3,0x11,0xe3,0x19,0xb4,0xa, 0xa8,0xb, 0xf0, +0xb, 0xc0,0xbc,0xec,0x38,0xdf,0xb, 0xa0,0xbc,0xda,0x38,0xd5,0x7a,0xf3,0xb, 0x8d, +0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x37,0xd, 0xd9,0xb, 0x38,0x20,0xbe,0x27, +0xd, 0x4a,0x8, 0x9, 0x7e,0xb3,0xb, 0x8e,0x4, 0x7a,0xb3,0xb, 0x8e,0x6d,0x33,0x9e, +0x37,0xd, 0x4a,0xbd,0x23,0x58,0x9, 0x7e,0xb3,0xb, 0x8f,0x4, 0x7a,0xb3,0xb, 0x8f, +0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xcb,0xda,0x3b,0x22,0x7c,0xab,0xbe,0xa0,0x10,0x40, +0x11,0xbe,0xa0,0x4b,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0x0, 0xcd,0x9e,0x34,0x0, 0x10, +0x81,0xc5,0x4c,0xaa,0x78,0x3, 0xe5,0x1a,0x22,0xbe,0xa0,0x1, 0x78,0x3, 0xe5,0x1b, +0x22,0xbe,0xa0,0x2, 0x78,0x5, 0x7e,0xb3,0xc, 0xf3,0x22,0xbe,0xa0,0x3, 0x40,0x11, +0xbe,0xa0,0x5, 0x38,0xc, 0xa, 0x3a,0x2e,0x34,0xe, 0x2a,0x9e,0x34,0x0, 0x3, 0x81, +0xc5,0xbe,0xa0,0x6, 0x78,0x3, 0x74,0x80,0x22,0xbe,0xa0,0x7, 0x78,0x5, 0x7e,0xb3, +0xe, 0x4a,0x22,0xbe,0xa0,0x8, 0x40,0x1b,0xbe,0xa0,0xc, 0x38,0x16,0x7e,0x43,0xe, +0x3a,0x7e,0x50,0x2, 0xac,0x45,0x7e,0x70,0x4, 0xac,0x7a,0x2d,0x32,0x49,0x33,0x0, +0x50,0x81,0xc5,0xbe,0xa0,0x4c,0x78,0x5, 0x7e,0xb3,0xd, 0x40,0x22,0xbe,0xa0,0xfb, +0x78,0x3, 0xe5,0x17,0x22,0xbe,0xa0,0x4e,0x78,0x5, 0x7e,0xb3,0xe, 0x49,0x22,0xbe, +0xa0,0x50,0x40,0x11,0xbe,0xa0,0x51,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x2e,0x9e, +0x34,0x0, 0x50,0x81,0xc5,0xbe,0xa0,0x52,0x40,0x11,0xbe,0xa0,0x55,0x38,0xc, 0xa, +0x3a,0x2e,0x37,0xe, 0x30,0x9e,0x34,0x0, 0x52,0x81,0xc5,0xbe,0xa0,0x56,0x40,0x11, +0xbe,0xa0,0x62,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x32,0x9e,0x34,0x0, 0x56,0x81, +0xc5,0xbe,0xa0,0x63,0x40,0x11,0xbe,0xa0,0x7a,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, +0x34,0x9e,0x34,0x0, 0x63,0x81,0xc5,0xbe,0xa0,0x7b,0x40,0x1d,0xbe,0xa0,0x9f,0x38, +0x18,0xa, 0x3a,0x9, 0xa3,0xc, 0x79,0x7e,0xb3,0xe, 0x3a,0xa, 0x3a,0x70,0x5, 0x9, +0xb3,0xd, 0xdf,0x22,0x9, 0xb3,0xd, 0x65,0x22,0xbe,0xa0,0xa0,0x40,0x11,0xbe,0xa0, +0xac,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x6b,0x9e,0x34,0x0, 0xa0,0x80,0x56,0xbe, +0xa0,0xad,0x40,0x11,0xbe,0xa0,0xb9,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x6d,0x9e, +0x34,0x0, 0xad,0x80,0x40,0xbe,0xa0,0xba,0x40,0x11,0xbe,0xa0,0xd1,0x38,0xc, 0xa, +0x3a,0x2e,0x37,0xe, 0x6f,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe,0xa0,0xd2,0x40,0x11, +0xbe,0xa0,0xd5,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x71,0x9e,0x34,0x0, 0xd2,0x80, +0x14,0xbe,0xa0,0xd6,0x40,0x13,0xbe,0xa0,0xed,0x38,0xe, 0xa, 0x3a,0x2e,0x37,0xe, +0x73,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xf8,0x78,0x5, 0x7e,0xb3, +0xf, 0xfb,0x22,0xbe,0xa0,0xf9,0x78,0x7, 0x7e,0xb3,0xe, 0xbc,0x54,0xfd,0x22,0x74, +0xff,0x22,0xca,0x79,0x74,0xd, 0x7a,0xb3,0xe, 0x2a,0x74,0x18,0x7a,0xb3,0xe, 0x2b, +0x74,0x4, 0x7a,0xb3,0xe, 0x2c,0xe4,0x7a,0xb3,0xe, 0x2d,0x7e,0x34,0xf, 0xa6,0x7a, +0x37,0xe, 0x2e,0x7e,0x34,0xf, 0xa2,0x7a,0x37,0xe, 0x30,0x7e,0x34,0xd, 0xc8,0x7a, +0x37,0xe, 0x32,0x7e,0x34,0xd, 0xaf,0x7a,0x37,0xe, 0x34,0x74,0xf, 0x7a,0xb3,0xe, +0x36,0x74,0x14,0x7a,0xb3,0xe, 0x37,0x74,0x3, 0x7a,0xb3,0xe, 0x39,0xe4,0x7a,0xb3, +0xe, 0x3a,0x7a,0xb3,0xe, 0x3b,0x7a,0xb3,0xe, 0x3c,0x74,0x2, 0x7a,0xb3,0xe, 0x3d, +0x74,0x45,0x7a,0xb3,0xe, 0x3e,0x74,0x71,0x7a,0xb3,0xe, 0x3f,0x74,0x3, 0x7a,0xb3, +0xe, 0x40,0x7e,0x34,0x1f,0xff,0x7a,0x37,0xe, 0x41,0x6d,0x33,0x7a,0x37,0xe, 0x43, +0x7e,0x34,0xc, 0x44,0x7a,0x37,0xe, 0x45,0x7e,0x34,0xd, 0xdf,0x7a,0x37,0xe, 0x47, +0x74,0x2b,0x7a,0xb3,0xe, 0x49,0x74,0x7, 0x7a,0xb3,0xe, 0x4a,0xe4,0x7a,0xb3,0xe, +0x4b,0x7a,0xb3,0xe, 0x4c,0x7a,0xb3,0xe, 0x4d,0x74,0x2, 0x7a,0xb3,0xe, 0x4e,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0xe, 0x4f,0x7e,0x24,0x0, 0xf4,0x7a,0x27,0xe, 0x51,0x7a, +0x37,0xe, 0x4f,0x7e,0x34,0x29,0x1c,0x7a,0x37,0xe, 0x53,0x7e,0x34,0x10,0x91,0x7a, +0x37,0xe, 0x61,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0xe, 0x63,0x7e,0x34,0x0, 0x22,0x7a, +0x37,0xe, 0x65,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0xe, 0x55,0x7e,0x34,0x3, 0xcf,0x7a, +0x37,0xe, 0x57,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0xe, 0x59,0x7e,0x34,0x5, 0x84,0x7a, +0x37,0xe, 0x5b,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0xe, 0x5d,0x7e,0x34,0x0, 0xf, 0x7a, +0x37,0xe, 0x5f,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0xe, 0x67,0xe4,0x7a,0xb3,0xe, 0x69, +0x74,0x7, 0x7a,0xb3,0xe, 0x6a,0x7e,0x34,0xf, 0xb, 0x7a,0x37,0xe, 0x6b,0x7e,0x34, +0xd, 0xa2,0x7a,0x37,0xe, 0x6d,0x7e,0x34,0xd, 0x28,0x7a,0x37,0xe, 0x6f,0x12,0x3b, +0xd8,0x7e,0x34,0xf, 0xfc,0x7a,0x37,0xe, 0x71,0x7e,0x34,0xd, 0x8a,0x7a,0x37,0xe, +0x73,0x7e,0x34,0xf, 0x22,0x7a,0x37,0xe, 0x75,0x12,0x58,0x51,0x6c,0xaa,0xbe,0xa0, +0x18,0x50,0x15,0xa, 0x3a,0x2e,0x37,0xe, 0x34,0x7e,0x39,0xf0,0x7c,0xbf,0x30,0xe0, +0x3, 0x2e,0xf0,0x18,0x1e,0xf0,0x80,0x10,0xa, 0x3a,0x2e,0x37,0xe, 0x32,0x9, 0xb3, +0xff,0xe8,0xa, 0x7b,0x2e,0x74,0x0, 0x18,0xa, 0x3a,0x19,0xf3,0xc, 0xf4,0xb, 0xa0, +0xbe,0xa0,0x25,0x40,0xc9,0xda,0x79,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xe3,0xe, 0x2a, +0x7e,0xd3,0xe, 0x2b,0x7e,0xb3,0xd, 0xd6,0xb4,0x1, 0x2, 0x80,0x2, 0xe1,0x9a,0x6c, +0xcc,0xe1,0x8c,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0xb, 0x96,0xf5,0x40,0x9, 0xb3, +0xb, 0x97,0xf5,0x41,0x75,0x3f,0x2, 0x7e,0x73,0xc, 0x5d,0x7a,0x71,0x64,0xbe,0x70, +0x30,0x50,0xa, 0x7e,0xb3,0xc, 0x3d,0xb4,0x1, 0x3, 0x75,0x3f,0x1, 0x7e,0xb3,0xc, +0x43,0xb4,0x1, 0x3, 0x75,0x3f,0x2, 0xe5,0x41,0x70,0xb, 0xe5,0x40,0x60,0x28,0xe5, +0x40,0xbe,0xb0,0xc, 0x68,0x21,0xe5,0x41,0xb4,0x17,0xb, 0xe5,0x40,0x60,0x18,0xe5, +0x40,0xb4,0xc, 0x2, 0x80,0x11,0xe5,0x41,0x70,0x2, 0x80,0xb, 0xe5,0x41,0xb4,0x17, +0x2, 0x80,0x4, 0xe5,0x40,0x70,0x4, 0x74,0x8, 0x80,0xb, 0xe5,0x40,0xb4,0xc, 0x4, +0x74,0x20,0x80,0x2, 0x74,0x8, 0x7a,0xb3,0xd, 0x4d,0xe5,0x40,0xbe,0xb0,0x0, 0x28, +0x1f,0xa, 0x2e,0x1b,0x24,0xe5,0x40,0xa, 0x3b,0xbd,0x32,0x58,0x13,0xe5,0x41,0xbe, +0xb0,0x0, 0x28,0xc, 0xa, 0x2d,0x1b,0x24,0xe5,0x41,0xa, 0x3b,0xbd,0x32,0x48,0x3, +0x75,0x3f,0x1, 0x75,0x42,0x0, 0x80,0x3e,0xe5,0x42,0xbc,0xbc,0x68,0x36,0x7e,0x71, +0x42,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xb, 0x96,0x9, 0x33,0xb, 0x97,0xa, 0x2a,0xe5, +0x40,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x3, 0x18,0x16,0xa, 0x23, +0xe5,0x41,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75, +0x3f,0x1, 0x80,0xb, 0x5, 0x42,0x7e,0x23,0xc, 0x3d,0xbe,0x21,0x42,0x38,0xb9,0xe5, +0x3f,0x7c,0x7c,0x7c,0x6f,0x12,0x14,0x8, 0xb, 0xf0,0xb, 0xc0,0x7e,0x73,0xc, 0x3d, +0xbc,0x7c,0x28,0x2, 0xc1,0x93,0x7a,0xf3,0xc, 0x3d,0xda,0x3b,0x22,0xe5,0x25,0xbe, +0xb0,0x1, 0x68,0xf9,0xe5,0x66,0x60,0xfc,0xe5,0x67,0x60,0xfc,0x20,0x93,0xfd,0xc2, +0x96,0xc2,0x95,0xc2,0x88,0xa9,0xc6,0xac,0xa9,0xc6,0xec,0xa9,0xd6,0xeb,0xc2,0x89, +0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x12,0xe1,0x70,0x17,0xe5,0xcc,0x7a, +0xb3,0x12,0xe2,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x12,0xe4,0x74,0x1, +0x7a,0xb3,0x12,0xe1,0xa9,0xc0,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0x75,0x87,0x2, 0x0, 0x0, 0x22, +0xca,0xd8,0xca,0x79,0x7e,0x83,0xc, 0xdf,0x4c,0x88,0x78,0x27,0x6c,0x99,0x6d,0x11, +0x74,0x2, 0xac,0xb9,0x59,0x15,0x11,0x3, 0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x39, +0x19,0xa1,0x10,0xe4,0x74,0x2, 0xa, 0x19,0x19,0xb1,0x11,0xd, 0xb, 0x90,0xbe,0x90, +0x5, 0x78,0xdb,0x6c,0x99,0x21,0x73,0x74,0x7, 0xac,0xb9,0x9, 0xf5,0xc, 0x5c,0x5e, +0xf0,0xf, 0xbe,0xf0,0x5, 0x40,0x2, 0x21,0x71,0xa, 0x1f,0x9, 0xb1,0xc, 0xc1,0xbe, +0xb0,0x1, 0x78,0x2, 0x21,0x53,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x9, 0xd5,0x10,0xe4, +0xbc,0xdf,0x68,0x2, 0x21,0x48,0x49,0x25,0x10,0xe2,0x74,0x7, 0xac,0xb9,0x49,0x35, +0xc, 0x5a,0x9d,0x32,0x12,0x6e,0xf1,0x7d,0x3, 0x74,0x7, 0xac,0xbe,0x49,0x25,0x10, +0xe0,0x74,0x7, 0xac,0xb9,0x49,0x35,0xc, 0x58,0x9d,0x32,0x12,0x6e,0xf1,0x2d,0x3, +0xa, 0x1d,0x9, 0xa1,0x11,0xd, 0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3d, +0x59,0x1, 0x11,0x3, 0xa, 0x1d,0x2e,0x14,0x11,0xd, 0x7c,0xba,0x14,0x7a,0x19,0xb0, +0x21,0x71,0x7e,0xf4,0x0, 0x32,0x7d,0xef,0x7e,0xd4,0x0, 0x96,0x74,0x2, 0xac,0xbd, +0x49,0x15,0x11,0x3, 0xbd,0x1e,0x28,0x6, 0xbd,0xe0,0x50,0x2, 0x80,0x74,0x7d,0xc1, +0x2d,0xcf,0xbd,0xc0,0x50,0x6, 0xbd,0x1f,0x28,0x2, 0x80,0x66,0xbd,0xd0,0x50,0x5e, +0xa, 0x1f,0x9, 0xb1,0xc, 0xc1,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1f, +0x19,0xb1,0xc, 0xc1,0x74,0x3, 0x19,0xb1,0xc, 0xc6,0x7e,0x70,0x7, 0xac,0x7e,0x2e, +0x34,0x10,0xe0,0x7e,0x14,0x11,0xe3,0x74,0x7, 0x12,0x68,0xed,0xbe,0x80,0x0, 0x28, +0x2d,0x1b,0x80,0x7e,0x70,0x7, 0xac,0x78,0x2e,0x34,0xc, 0x58,0x7e,0x30,0x7, 0xac, +0x39,0x2e,0x14,0xc, 0x58,0x74,0x7, 0x12,0x68,0xed,0x7e,0x34,0x11,0xe3,0x7e,0x30, +0x7, 0xac,0x38,0x2e,0x14,0xc, 0x58,0x74,0x7, 0x12,0x68,0xed,0x1b,0x90,0x74,0x2, +0xac,0xbd,0x59,0x5, 0x11,0x3, 0x80,0x29,0xb, 0xe0,0xbe,0xe0,0x5, 0x50,0x2, 0x1, +0x58,0x80,0x1e,0x6d,0x11,0x74,0x2, 0xac,0xbf,0x59,0x15,0x11,0x3, 0x7e,0xa0,0xff, +0x7e,0x30,0x7, 0xac,0x3f,0x19,0xa1,0x10,0xe4,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x11, +0xd, 0xb, 0x90,0xbc,0x89,0x28,0x2, 0x1, 0x37,0x7a,0x83,0xc, 0xdf,0x7e,0x24,0xc, +0x58,0x7e,0x34,0x10,0xe0,0x7e,0x14,0x0, 0x23,0x12,0x6e,0xc8,0xda,0x79,0xda,0xd8, +0x22,0x6c,0x77,0x7e,0x63,0xc, 0x40,0xa, 0x16,0x7e,0x63,0xc, 0x3f,0xa, 0x26,0x2d, +0x21,0xbe,0x24,0x0, 0x4e,0x38,0x2, 0x41,0x28,0x75,0x60,0x14,0x75,0x5f,0x1, 0x6c, +0xaa,0x80,0x2d,0x7c,0xba,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x6f,0x32,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7c,0x3b,0x6e,0x30,0xff,0x7c,0xba,0xc4,0x23,0x54,0x1f, +0xa, 0x2b,0x2e,0x24,0xb, 0xd2,0x7e,0x29,0x60,0x5c,0x63,0x7a,0x29,0x60,0xb, 0xa0, +0x7e,0x63,0xc, 0x3d,0xbc,0x6a,0x38,0xcb,0x6c,0xaa,0x80,0x32,0x7c,0xba,0x54,0x7, +0xa, 0x2b,0x2e,0x24,0x6f,0x32,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x7c,0x3b, +0x6e,0x30,0xff,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xa, 0xd9,0x7e, +0x29,0x60,0x5c,0x63,0x7a,0x29,0x60,0xe4,0x7a,0xb3,0xb, 0x8c,0xb, 0xa0,0x7e,0x63, +0xb, 0x8c,0xbc,0x6a,0x38,0xc6,0xe4,0x22,0xe5,0x5f,0xb4,0x1, 0x2, 0x80,0x2, 0x41, +0xb3,0x15,0x60,0xe5,0x60,0x60,0x79,0x6c,0xaa,0x80,0x2d,0x7c,0xba,0x54,0x7, 0xa, +0x2b,0x2e,0x24,0x6f,0x32,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x7c,0x3b,0x6e, +0x30,0xff,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xb, 0xd2,0x7e,0x29, +0x60,0x5c,0x63,0x7a,0x29,0x60,0xb, 0xa0,0x7e,0x63,0xc, 0x3d,0xbc,0x6a,0x38,0xcb, +0x6c,0xaa,0x80,0x32,0x7c,0xba,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x6f,0x32,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x7c,0x3b,0x6e,0x30,0xff,0x7c,0xba,0xc4,0x23,0x54, +0x1f,0xa, 0x2b,0x2e,0x24,0xa, 0xd9,0x7e,0x29,0x60,0x5c,0x63,0x7a,0x29,0x60,0xe4, +0x7a,0xb3,0xb, 0x8c,0xb, 0xa0,0x7e,0x63,0xb, 0x8c,0xbc,0x6a,0x38,0xc6,0xe4,0x22, +0x75,0x5f,0x0, 0x7c,0xb7,0x22,0x7e,0x24,0xe, 0x7d,0x7e,0xb3,0xc, 0xdf,0x70,0xc, +0x74,0x19,0x7a,0xb3,0xd, 0x56,0x7e,0x34,0x0, 0x64,0x80,0xa, 0x74,0x11,0x7a,0xb3, +0xd, 0x56,0x7e,0x34,0x0, 0x46,0x7a,0x37,0xd, 0x4e,0x7e,0xb3,0xe, 0xfd,0x20,0xe0, +0x2, 0x61,0xd7,0x54,0xfe,0x7a,0xb3,0xe, 0xfd,0x9, 0x72,0x0, 0x2, 0xbe,0x73,0xd, +0x4c,0x68,0x16,0x7a,0x73,0xd, 0x4c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xd, 0x42,0x7e,0x29,0x70,0xbe,0x73,0xd, 0x56, +0x68,0xe, 0x7a,0x73,0xd, 0x56,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xd, 0x4e, +0x9, 0x72,0x0, 0x1, 0xa, 0x37,0xbe,0x37,0xd, 0x50,0x68,0x4, 0x7a,0x37,0xd, 0x50, +0x7e,0x17,0xd, 0x57,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x9, 0x72,0x0, 0x5, +0xa, 0x37,0xbd,0x31,0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37, +0xd, 0x57,0x9, 0x72,0x0, 0x8, 0xbe,0x73,0xf, 0x1c,0x68,0x24,0x7a,0x73,0xf, 0x1c, +0xbe,0x70,0xf, 0x40,0x5, 0xe4,0x19,0xb2,0x0, 0x8, 0x9, 0x72,0x0, 0x8, 0xa, 0x37, +0x2e,0x34,0x6f,0x11,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0xf, 0x1b, +0x9, 0x72,0x0, 0x9, 0xbe,0x73,0xf, 0x1e,0x68,0x8, 0x7a,0x73,0xf, 0x1e,0x7a,0x73, +0xf, 0x1d,0x9, 0x72,0x0, 0x7, 0xbe,0x73,0xf, 0x1f,0x68,0x4, 0x7a,0x73,0xf, 0x1f, +0x9, 0xb2,0x0, 0xb, 0xbe,0xb1,0x21,0x68,0x2, 0xf5,0x21,0x9, 0x72,0x0, 0x25,0xa, +0x37,0xbe,0x37,0xf, 0x18,0x68,0x4, 0x7a,0x37,0xf, 0x18,0x9, 0x72,0x0, 0x6, 0xbe, +0x73,0xf, 0x1a,0x68,0x4, 0x7a,0x73,0xf, 0x1a,0x9, 0x72,0x0, 0x24,0xbe,0x73,0xf, +0x20,0x68,0x4, 0x7a,0x73,0xf, 0x20,0x22,0x7e,0x34,0x0, 0x60,0x12,0x5f,0x22,0x7c, +0xab,0x7a,0xa1,0x3e,0xbe,0xa0,0x8, 0x40,0x2, 0x81,0xf6,0xbe,0xa0,0x4, 0x50,0x5, +0x7e,0x40,0x6, 0x80,0x3, 0x7e,0x40,0x5, 0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e, +0xa0,0x3, 0xa4,0x90,0x3c,0x7, 0x73,0x2, 0x3c,0x1f,0x2, 0x3c,0x24,0x2, 0x3c,0x29, +0x2, 0x3c,0x2e,0x2, 0x3c,0x33,0x2, 0x3c,0x38,0x2, 0x3c,0x3d,0x2, 0x3c,0x42,0x7e, +0x50,0x5e,0x80,0x26,0x7e,0x50,0x5f,0x80,0x21,0x7e,0x50,0x61,0x80,0x1c,0x7e,0x50, +0x63,0x80,0x17,0x7e,0x50,0x65,0x80,0x12,0x7e,0x50,0x67,0x80,0xd, 0x7e,0x50,0x69, +0x80,0x8, 0x7e,0x50,0x6a,0x80,0x3, 0x7e,0x50,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3, +0xf, 0xfc,0xa, 0x3b,0x7e,0xb3,0xf, 0xb, 0xa, 0x4b,0x2d,0x34,0x7c,0xb7,0x7c,0x1a, +0x2e,0x10,0x3f,0xa5,0xf7,0x7c,0x3b,0xa, 0x33,0x5e,0x34,0x0, 0x1, 0xbe,0x34,0x0, +0x1, 0x78,0x1c,0x7c,0x13,0xac,0x15,0x7e,0x70,0x3, 0xac,0x75,0xe, 0x34,0xe, 0x34, +0x2d,0x3, 0x7c,0xba,0x3e,0xb0,0x24,0x43,0xa, 0x3b,0x1b,0x38,0x0, 0x80,0xd, 0xac, +0x35,0x7c,0xba,0x3e,0xb0,0x24,0x43,0xa, 0x3b,0x1b,0x38,0x10,0x7c,0xba,0x3e,0xb0, +0x24,0x43,0xa, 0x3b,0xb, 0x38,0x10,0x7e,0x34,0x0, 0xa, 0x7d,0xf1,0x8d,0xf3,0x8d, +0xf3,0x7d,0x3e,0xbe,0x70,0x0, 0x40,0x1a,0xbc,0x47,0x28,0x16,0x7e,0xe4,0x0, 0x64, +0x7d,0xf1,0x8d,0xfe,0x7d,0xf, 0x9d,0x4, 0x7c,0x61,0xa, 0xa, 0x19,0x60,0xf, 0xfc, +0x80,0x1b,0xbc,0x47,0x38,0x17,0xbe,0x70,0x9, 0x38,0x12,0x7e,0x4, 0x0, 0x64,0x8d, +0x10,0xb, 0x14,0x9d,0x14,0x7c,0x63,0xa, 0x1a,0x19,0x61,0xf, 0xfc,0xb, 0xa0,0xbe, +0xa0,0x4, 0x68,0x2, 0x81,0x4c,0x22,0xca,0x3b,0x7d,0x43,0x7e,0x13,0xc, 0x3d,0x7e, +0xf7,0xd, 0xdd,0x6c,0x0, 0x7e,0xf0,0x1, 0x80,0x16,0xa, 0x50,0x2d,0x54,0x7e,0x59, +0x70,0xa, 0x5f,0x2d,0x54,0x7e,0x59,0x30,0xbc,0x37,0x40,0x2, 0x7c,0xf, 0xb, 0xf0, +0xbc,0x1f,0x38,0xe6,0xa, 0x50,0x2d,0x54,0x7e,0x59,0x0, 0x6c,0x33,0x7e,0xf0,0x1, +0xc1,0x9, 0x75,0x54,0x0, 0x6d,0xee,0x6c,0x22,0x75,0x50,0x0, 0x75,0x51,0x0, 0x6c, +0xee,0xa1,0xc8,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xb, 0x96,0xf5,0x52,0x9, 0xb3, +0xb, 0x97,0xf5,0x53,0x7c,0xbe,0x12,0x60,0xbc,0x7d,0xd3,0xa, 0x5e,0x2d,0x54,0x7e, +0x59,0x70,0xbc,0x7f,0x78,0x60,0xb, 0x20,0xe5,0x52,0x25,0x50,0xf5,0x50,0xe5,0x53, +0x25,0x51,0xf5,0x51,0x7e,0x51,0x52,0xac,0x52,0xe5,0x50,0xa, 0x3b,0x9d,0x32,0x12, +0x6e,0xf1,0x7c,0xd7,0x7e,0x51,0x53,0xac,0x52,0xe5,0x51,0xa, 0x3b,0x9d,0x32,0x12, +0x6e,0xf1,0x7c,0xc7,0x7e,0x71,0x54,0xac,0x72,0xa, 0x5d,0xbd,0x53,0x8, 0xb, 0xa, +0x22,0xa, 0x3d,0x12,0x68,0x1a,0x7c,0xb7,0xf5,0x54,0x7e,0x71,0x54,0xac,0x72,0xa, +0x5c,0xbd,0x53,0x8, 0xb, 0xa, 0x22,0xa, 0x3c,0x12,0x68,0x1a,0x7c,0xb7,0xf5,0x54, +0xbd,0xed,0x58,0x2, 0x7d,0xed,0xb, 0xe0,0xbc,0x1e,0x28,0x2, 0xa1,0x43,0xbe,0x20, +0x0, 0x28,0x34,0xe5,0x50,0x8c,0xb2,0xf5,0x50,0xe5,0x51,0x8c,0xb2,0xf5,0x51,0x7e, +0xa1,0x50,0x7e,0x70,0x2, 0xac,0x73,0x19,0xa3,0x12,0x44,0xe5,0x51,0x19,0xb3,0x12, +0x45,0x7e,0x71,0x50,0x74,0x18,0xac,0x7b,0xe5,0x51,0xa, 0x5b,0x2d,0x53,0x3e,0x54, +0x2d,0x5f,0x1b,0x58,0xe0,0xb, 0x30,0xb, 0xf0,0xbc,0xf, 0x40,0x2, 0xa1,0x32,0x7c, +0xb3,0xda,0x3b,0x22,0xca,0x79,0x7e,0xf0,0x1, 0x7e,0xe3,0xe, 0x4c,0xe4,0x7a,0xb3, +0xe, 0x4c,0x7e,0x34,0xe, 0x2a,0x12,0x66,0x66,0x7e,0x34,0xe, 0x2a,0x12,0x6e,0x4d, +0x12,0x63,0x3b,0x12,0x6d,0xf8,0xe5,0x66,0x60,0xfc,0xa9,0xb7,0xea,0x7e,0x37,0xd, +0xdd,0x7e,0x27,0xd, 0xdb,0x7e,0x14,0x18,0x0, 0x12,0x5d,0x9d,0x6c,0xaa,0x80,0x6a, +0x6c,0x77,0x80,0x5c,0x4c,0xaa,0x78,0x12,0xe4,0xa, 0x47,0x19,0xb4,0x12,0x13,0x6d, +0x44,0x7e,0x50,0x2, 0xac,0x57,0x59,0x42,0x11,0xe3,0xa, 0x2a,0x2e,0x27,0xe, 0x32, +0x7e,0x29,0x60,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e, +0x27,0xd, 0xdd,0xb, 0x28,0x0, 0xe, 0x4, 0xe, 0x4, 0xe, 0x4, 0xe, 0x4, 0xe, 0x4, +0x7e,0x30,0x2, 0xac,0x37,0x2e,0x14,0x11,0xe3,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18, +0x20,0xa, 0x47,0x2e,0x44,0x12,0x13,0x7e,0x49,0xb0,0x4, 0x7a,0x49,0xb0,0xb, 0x70, +0x7e,0x63,0xe, 0x2b,0xbc,0x67,0x38,0x9c,0xb, 0xa0,0x7e,0x63,0xe, 0x2a,0xbc,0x6a, +0x38,0x8e,0x6c,0xaa,0x80,0x59,0xa, 0x3a,0x9, 0x73,0x12,0x13,0xa5,0xbf,0x0, 0xf, +0x7e,0x44,0x21,0x34,0x7e,0x50,0x2, 0xac,0x5a,0x59,0x42,0x11,0xe3,0x80,0x25,0x7e, +0x50,0x2, 0xac,0x5a,0x49,0x12,0x11,0xe3,0xa, 0x7, 0x8d,0x10,0x59,0x12,0x11,0xe3, +0x2e,0x24,0x11,0xe3,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0x11,0xe3,0xbe,0x34,0x1b, +0x58,0x40,0x6, 0xbe,0x34,0x27,0x10,0x28,0x4, 0x6c,0xff,0x80,0xa, 0xb, 0xa0,0x7e, +0xb3,0xe, 0x2b,0xbc,0xba,0x38,0x9f,0x7a,0xe3,0xe, 0x4c,0x7c,0xbf,0xda,0x79,0x22, +0x12,0x60,0xde,0x12,0x60,0x27,0x12,0x63,0x19,0x74,0x1, 0x7a,0xb3,0xe, 0x3b,0x7a, +0xb3,0xe, 0x4c,0x12,0x64,0x22,0x12,0x64,0x35,0x74,0x1, 0x7a,0xb3,0xe, 0xa4,0x7e, +0x34,0x12,0xb5,0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6f,0x1, 0x7e,0xa3,0x12,0xb4,0x7c, +0xba,0x4, 0x7a,0xb3,0x12,0xb4,0x7a,0xa3,0xe, 0x8e,0x7e,0x73,0x12,0xb4,0x7a,0x73, +0x12,0xc9,0x7e,0xb3,0xe, 0xa4,0xb4,0x1, 0x2, 0x80,0x2, 0xe1,0xf0,0x12,0x63,0x19, +0x12,0x63,0xaa,0x12,0x55,0x40,0x12,0x61,0x3c,0x12,0x63,0xd9,0x12,0x5d,0x6a,0x7e, +0xb3,0xc, 0x54,0x20,0xe2,0xc, 0x7e,0xb3,0xd, 0x5d,0xbe,0xb0,0x1, 0x68,0x3, 0x12, +0x5b,0xa2,0x7e,0xb3,0xd, 0xd6,0x70,0x6, 0x7e,0xb3,0xd, 0xd5,0x60,0xad,0x12,0x6, +0x81,0x7a,0xb3,0xc, 0xe9,0x12,0x60,0x98,0x12,0xf, 0x76,0x12,0x39,0x91,0x7e,0x37, +0xd, 0xdd,0x12,0x8, 0x6, 0x12,0x64,0x43,0x12,0x49,0xed,0x7e,0xb3,0xf, 0x20,0xb4, +0x1, 0x4, 0xe4,0x12,0xf, 0xf8,0x12,0x5e,0xc5,0x12,0x1a,0xe7,0x12,0x38,0x0, 0x12, +0x64,0x29,0x12,0x5b,0x24,0x12,0x26,0x91,0x12,0x18,0x0, 0x12,0x49,0x49,0xe1,0x5b, +0x12,0x63,0xc2,0x2, 0x0, 0x6, 0xa9,0xc0,0x93,0x75,0x18,0x0, 0x75,0x19,0x0, 0x32, +0xca,0xf8,0x6c,0xff,0x12,0x5b,0x63,0x7d,0x43,0x7e,0xa0,0x5, 0x6c,0x77,0x7e,0x30, +0x5, 0xac,0x37,0x2e,0x14,0x6e,0xaf,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x24, +0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70,0x5, 0x40,0xe1,0xbe,0xa0,0x6, +0x78,0x2, 0x1, 0xf6,0x7e,0x63,0xc, 0x3d,0xbe,0x60,0x0, 0x38,0x2, 0x1, 0xf6,0x6c, +0x77,0x1, 0xec,0x6c,0x66,0x6c,0x55,0x6c,0x44,0x7e,0x10,0x30,0xac,0x17,0x7e,0x30, +0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xd, 0xdd,0xb, 0x18,0x40,0xbe,0x70,0x0, 0x28, +0x4c,0x7e,0xb3,0xe, 0x2a,0xa, 0xb, 0x1b,0x4, 0xa, 0x17,0xbd,0x10,0x58,0x3e,0xbe, +0x44,0x0, 0x28,0x48,0x36,0xbe,0x44,0x0, 0x78,0x18,0x30,0x7e,0x30,0x18,0xac,0x37, +0xa, 0x4, 0x2d,0x10,0x3e,0x14,0x2e,0x17,0xd, 0xdd,0x49,0x1, 0xff,0xd0,0x3e,0x4, +0xbd,0x4, 0x58,0x13,0x49,0x11,0x0, 0x30,0x3e,0x14,0xbd,0x14,0x58,0x9, 0xb, 0x50, +0xbe,0x50,0x5, 0x40,0x8, 0x80,0x2e,0x6c,0x55,0x80,0x2, 0x6c,0x55,0x7e,0x30,0x5, +0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6e,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd, +0x4, 0x18,0x17,0xb, 0x60,0x2e,0x14,0x6e,0xb3,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4, +0x93,0xbc,0xb6,0x38,0x7, 0x7e,0xf0,0x20,0x80,0xb, 0x6c,0x66,0xb, 0x40,0xbe,0x40, +0x18,0x50,0x2, 0x1, 0x49,0xbe,0xf0,0x0, 0x38,0xc, 0xb, 0x70,0x7e,0xb3,0xe, 0x2a, +0xbc,0xb7,0x28,0x2, 0x1, 0x43,0x7c,0xbf,0xda,0xf8,0x22,0xca,0x3b,0x7e,0x34,0xb, +0xd2,0x7e,0x24,0x0, 0x2, 0xe4,0x12,0x6f,0x1, 0xe4,0x7a,0xb3,0xc, 0x3d,0x7a,0xb3, +0xc, 0x3e,0x7a,0xb3,0xc, 0x3f,0x7a,0xb3,0xc, 0x40,0x7e,0xb3,0xd, 0xd6,0xb4,0x1, +0x2, 0x80,0x2, 0x21,0xe4,0x7e,0xb3,0xe, 0x2a,0xf5,0x3f,0x7e,0xb3,0xe, 0x2b,0xf5, +0x40,0x7e,0x37,0xd, 0x50,0x7a,0x35,0x41,0x7e,0x37,0xd, 0x52,0x7a,0x35,0x43,0x7e, +0x37,0xd, 0x54,0x7a,0x35,0x45,0x7e,0x34,0x0, 0xf, 0x7a,0x35,0x4b,0x7e,0x37,0xd, +0xdd,0x7e,0x24,0x0, 0x3f,0x7e,0x14,0x0, 0x47,0x7e,0x4, 0x9, 0xa0,0x12,0x69,0xe, +0xe5,0x47,0x7a,0xb3,0xc, 0x3d,0xe5,0x48,0x7a,0xb3,0xc, 0x3e,0xe5,0x49,0x7a,0xb3, +0xc, 0x3f,0xe5,0x4a,0x7a,0xb3,0xc, 0x40,0x6c,0xdd,0x80,0x54,0x7e,0xc3,0xc, 0x3d, +0xbc,0xcd,0x28,0x28,0x74,0x2, 0xac,0xbd,0x49,0x75,0x9, 0xa0,0x7d,0x47,0x5e,0x44, +0xff,0x0, 0xa, 0x38,0x19,0x75,0xb, 0x96,0x7d,0x37,0x5e,0x34,0x0, 0xff,0x19,0x75, +0xb, 0x97,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x0, 0x5e,0x80,0x22,0xa, 0x3c,0xa, 0x2d, +0x9d,0x23,0x3e,0x24,0x49,0x72,0x9, 0xbe,0x7d,0x37,0x5e,0x34,0xff,0x0, 0xa, 0x36, +0x19,0x72,0xb, 0xb4,0x7d,0x37,0x5e,0x34,0x0, 0xff,0x19,0x72,0xb, 0xb5,0xb, 0xd0, +0x7e,0x73,0xc, 0x3e,0xa, 0x37,0x7e,0x53,0xc, 0x3d,0xa, 0x25,0x2d,0x23,0xa, 0x3d, +0xbd,0x32,0x40,0x98,0xda,0x3b,0x22,0x7c,0x15,0x7c,0xab,0x7d,0x43,0x7e,0x70,0x2, +0xac,0x7a,0x2d,0x43,0x7d,0x34,0x1b,0x36,0x12,0x62,0x18,0x7d,0xb3,0x7d,0x34,0x1b, +0x35,0x12,0x62,0x18,0x7d,0xc3,0x7d,0x34,0x12,0x62,0x18,0x7d,0x13,0x7d,0x34,0xb, +0x35,0x12,0x62,0x18,0x7d,0xd3,0x7d,0x34,0xb, 0x36,0x12,0x62,0x18,0x7d,0x43,0xbe, +0xa0,0x1, 0x28,0xa, 0xa, 0x31,0x1b,0x35,0xa, 0xaa,0xbd,0xa3,0x48,0x2a,0xbe,0xa0, +0x1, 0x78,0x4, 0x6d,0xbb,0x80,0x21,0x4c,0xaa,0x78,0x6, 0x6d,0xcc,0x7d,0xbc,0x80, +0x17,0x7c,0xb1,0x24,0xfe,0xbc,0xba,0x78,0x4, 0x6d,0x44,0x80,0xb, 0x7c,0xb1,0x14, +0xbc,0xba,0x78,0x4, 0x6d,0x44,0x7d,0xd4,0x7d,0xfc,0x6d,0xee,0x7d,0x3b,0x6d,0x22, +0x2f,0x17,0x6d,0x0, 0x2f,0x1, 0x7d,0x3d,0x6d,0x22,0x2f,0x10,0x7d,0xf4,0x2f,0x71, +0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12,0x68,0x4c,0x7d,0x1b,0x3e,0x14,0x6d,0x0, 0x9f, +0x10,0x7d,0x1c,0x6d,0x0, 0x9f,0x10,0x7d,0x1d,0x6d,0x0, 0x2f,0x1, 0x7d,0x34,0x3e, +0x34,0x6d,0x22,0x2f,0x10,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x7f,0x7, 0x12,0x68, +0x68,0x2e,0x34,0x0, 0x20,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x30,0xbe,0xa0,0x3e, +0x38,0x2b,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78, +0x11,0x30,0x4, 0x6, 0x7e,0x34,0x0, 0x84,0x80,0x4, 0x7e,0x34,0x0, 0xa8,0x7a,0x37, +0x0, 0xdf,0xa, 0x3a,0x2e,0x37,0x0, 0xdf,0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78, +0x3, 0xe5,0x1a,0x22,0xbe,0xa0,0x80,0x40,0x1a,0xbe,0xa0,0xdf,0x38,0x15,0xbe,0xa0, +0xa5,0x78,0x9, 0x7e,0xb3,0x0, 0xcc,0x4, 0x7a,0xb3,0x0, 0xcc,0xa, 0x3a,0x9, 0xb3, +0xd, 0xfd,0x22,0xbe,0xa0,0xf9,0x78,0x7, 0x7e,0xb3,0xe, 0xbc,0x54,0xfd,0x22,0xbe, +0xa0,0xfa,0x78,0x2, 0xe4,0x22,0xbe,0xa0,0xfb,0x78,0x5, 0x7e,0xb3,0xb, 0x96,0x22, +0xbe,0xa0,0xfc,0x78,0xc, 0x7e,0xb3,0xd, 0xd6,0xc4,0x54,0xf0,0x4e,0xb3,0xd, 0xd5, +0x22,0xbe,0xa0,0xfd,0x78,0x2, 0xe4,0x22,0xbe,0xa0,0xfe,0x78,0x2, 0xe4,0x22,0xbe, +0xa0,0xff,0x78,0x18,0xe5,0x22,0xbe,0xb0,0x0, 0x28,0x6, 0x7e,0x44,0x0, 0x80,0x80, +0x2, 0x6d,0x44,0x7e,0x73,0xe, 0x49,0xa, 0x57,0x4d,0x54,0x22,0xe4,0x22,0x30,0x90, +0x78,0xc2,0x90,0x5, 0x19,0xe5,0x19,0xb4,0x1, 0x6, 0xe5,0x91,0xf5,0x1d,0x80,0x3c, +0xe5,0x1a,0xc4,0x7c,0x1b,0x5e,0x10,0x7, 0xa5,0xb9,0x0, 0xe, 0xe5,0x19,0x25,0x1d, +0x24,0xfe,0x7e,0x71,0x91,0x12,0x47,0x6f,0x80,0x22,0xa5,0xb9,0x4, 0xe, 0xe5,0x19, +0x25,0x1d,0x24,0xfe,0x7e,0x71,0x91,0x12,0x20,0x0, 0x80,0x10,0xa5,0xb9,0x2, 0xc, +0xe5,0x19,0x25,0x1d,0x24,0xfe,0x7e,0x71,0x91,0x12,0x5e,0xf4,0xe5,0x1a,0xc4,0x7c, +0x3b,0x5e,0x30,0x7, 0xa5,0xbb,0x0, 0x9, 0xe5,0x1d,0x12,0x42,0xa6,0xf5,0x91,0x80, +0x18,0xa5,0xbb,0x4, 0x9, 0xe5,0x1d,0x12,0x33,0x4a,0xf5,0x91,0x80,0xb, 0xa5,0xbb, +0x2, 0x7, 0xe5,0x1d,0x12,0x63,0x8d,0xf5,0x91,0x30,0x91,0x35,0xc2,0x91,0x5, 0x18, +0xe5,0x1a,0xc4,0x7c,0x3b,0x5e,0x30,0x7, 0xa5,0xbb,0x0, 0xa, 0xe5,0x18,0x25,0x1d, +0x12,0x42,0xa6,0xf5,0x91,0x22,0xa5,0xbb,0x4, 0xa, 0xe5,0x18,0x25,0x1d,0x12,0x33, +0x4a,0xf5,0x91,0x22,0xa5,0xbb,0x2, 0x9, 0xe5,0x18,0x25,0x1d,0x12,0x63,0x8d,0xf5, +0x91,0x22,0xca,0x79,0x7c,0xeb,0x7e,0x73,0xc, 0x3d,0xbe,0x70,0x1, 0x38,0x2, 0x81, +0xbd,0x7c,0xbe,0x12,0x10,0x0, 0x7e,0xa3,0xc, 0x42,0x4c,0xaa,0x68,0x1a,0x7e,0xb3, +0x12,0x62,0x70,0x8, 0x7e,0xb3,0x12,0x63,0x70,0x2, 0x80,0xc, 0xbe,0xa0,0x1, 0x28, +0xc, 0xe5,0x5d,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x22,0x7e,0xf0,0x1, +0x7e,0x73,0xc, 0x3d,0xbe,0x73,0xc, 0x42,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, +0x9e,0x73,0x12,0x62,0xbe,0x73,0xc, 0x42,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c, +0xff,0x78,0x5, 0x7c,0xbe,0x12,0x10,0x0, 0xe5,0x5b,0x7a,0xb3,0xc, 0x3d,0x7e,0x31, +0x5b,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x12,0x44,0x7e,0x34,0xb, 0x96,0x12,0x6e,0xc8, +0x75,0x5d,0x64,0x75,0x5e,0x64,0x7e,0x34,0x0, 0x5d,0x7e,0x24,0x0, 0x5e,0x12,0x4e, +0xe0,0xe5,0x5d,0xb4,0x64,0x3, 0x75,0x5d,0x0, 0xe5,0x5e,0xb4,0x64,0x3, 0x75,0x5e, +0x0, 0xe5,0x5e,0xbe,0xb1,0x5d,0x28,0xb, 0x85,0x5e,0x5d,0x80,0x6, 0x75,0x5d,0x64, +0x75,0x5e,0x64,0xda,0x79,0x22,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x40,0x2b,0xbe,0x24, +0x0, 0x3f,0x38,0x25,0x7e,0x14,0x0, 0x3f,0x9d,0x12,0x7e,0x34,0x1, 0xdf,0xad,0x31, +0x7c,0x76,0x7c,0x65,0xa, 0x24,0xbe,0x34,0x0, 0x34,0x40,0x4, 0x7e,0x34,0x0, 0x34, +0x7e,0x24,0x0, 0x34,0x9d,0x23,0x7d,0x32,0x22,0xbe,0x24,0x3, 0x0, 0x40,0x1f,0x9e, +0x24,0x3, 0x0, 0x7e,0x34,0x1, 0x45,0xad,0x23,0x7c,0x76,0x7c,0x65,0xa, 0x24,0xbe, +0x34,0x0, 0x34,0x40,0x4, 0x7e,0x34,0x0, 0x33,0x2e,0x34,0x3, 0xcc,0x22,0xbe,0x24, +0x1, 0x9f,0x38,0x8, 0x7e,0x34,0x1, 0x9f,0x9d,0x32,0x80,0x6, 0x7d,0x32,0x9e,0x34, +0x1, 0xa0,0x7e,0x14,0x1, 0x50,0xad,0x13,0x7c,0x32,0x7c,0x21,0xa, 0x0, 0x7d,0x31, +0xbe,0x24,0x1, 0x9f,0x38,0x16,0xbe,0x34,0x1, 0xcb,0x50,0xa, 0x7e,0x24,0x1, 0xff, +0x9d,0x23,0x7d,0x32,0x80,0xa, 0x7e,0x34,0x0, 0x34,0x80,0x4, 0x2e,0x34,0x2, 0x0, +0xbe,0x34,0x0, 0x34,0x50,0x5, 0x7e,0x34,0x0, 0x34,0x22,0xbe,0x34,0x3, 0xcc,0x28, +0x4, 0x7e,0x34,0x3, 0xcc,0x22,0x7d,0x3, 0xbe,0x4, 0x0, 0x3f,0x38,0x27,0x7e,0x24, +0x0, 0x3f,0x9d,0x20,0x7e,0x54,0x0, 0x6d,0xad,0x52,0x7c,0xba,0x7c,0xa9,0xa, 0x48, +0x7d,0x35,0xbe,0x34,0x0, 0x13,0x40,0x4, 0x7e,0x34,0x0, 0x13,0x7e,0x4, 0x0, 0x13, +0x9d,0x3, 0x7d,0x30,0x22,0xbe,0x4, 0x5, 0xc0,0x40,0x23,0x7d,0x20,0x9e,0x24,0x5, +0xbf,0x7e,0x54,0x0, 0x95,0xad,0x52,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x7d,0x35,0xbe, +0x34,0x0, 0x13,0x40,0x4, 0x7e,0x34,0x0, 0x12,0x2e,0x34,0x2, 0x45,0x22,0xbe,0x4, +0x2, 0xff,0x38,0xc, 0x7e,0x34,0x2, 0xff,0x9d,0x30,0x7e,0x14,0x0, 0x66,0x80,0xa, +0x7d,0x30,0x9e,0x34,0x3, 0x0, 0x7e,0x14,0x0, 0x67,0x7d,0x53,0xad,0x51,0x7c,0xba, +0x7c,0xa9,0xa, 0x48,0x7d,0x35,0xbe,0x4, 0x2, 0xff,0x38,0xa, 0x7e,0x4, 0x1, 0x2b, +0x9d,0x3, 0x7d,0x30,0x80,0x4, 0x2e,0x34,0x1, 0x2c,0xbe,0x34,0x0, 0x13,0x50,0x5, +0x7e,0x34,0x0, 0x13,0x22,0xbe,0x34,0x2, 0x45,0x28,0x4, 0x7e,0x34,0x2, 0x45,0x22, +0x6c,0x33,0x7e,0xb3,0xc, 0x3d,0xb4,0x1, 0x2, 0x80,0x2, 0xc1,0xc6,0x7e,0x23,0xc, +0x3e,0xbe,0x20,0x0, 0x38,0x2, 0xc1,0xc6,0x6c,0x22,0xc1,0xbc,0x74,0x2, 0xac,0xb2, +0x9, 0x15,0xb, 0x96,0x9, 0x5, 0xb, 0x97,0xa5,0xb8,0x17,0x6e,0xa5,0xb9,0xc, 0x6a, +0x7e,0x70,0x2, 0xac,0x70,0x2e,0x37,0xd, 0xd9,0xb, 0x38,0x20,0xbe,0x24,0x0, 0xc8, +0x48,0x1c,0x74,0x2, 0xac,0xb1,0x2e,0x57,0xd, 0xd9,0x49,0x55,0x0, 0x30,0xbe,0x54, +0x0, 0xc8,0x48,0xa, 0x3e,0x24,0x49,0x33,0xff,0xfe,0xbd,0x32,0x48,0x3c,0x7e,0x70, +0x18,0xac,0x71,0xa, 0x20,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xd, 0xdd,0x49,0x33,0xff, +0xfe,0xbe,0x34,0x0, 0x14,0x58,0x23,0x7c,0xb2,0x12,0x60,0xbc,0x7d,0x23,0x7e,0x70, +0x18,0xac,0x71,0xa, 0x50,0x2d,0x35,0x3e,0x34,0x2e,0x37,0xd, 0xdd,0x49,0x33,0xff, +0xa0,0x3e,0x34,0xbd,0x32,0x48,0x3, 0x7e,0x30,0x10,0xb, 0x20,0x7e,0x73,0xc, 0x3d, +0xbc,0x72,0x28,0x2, 0xc1,0x3c,0x7c,0xb3,0x22,0x6d,0x33,0x7d,0x13,0x7e,0x44,0x5, +0xe0,0x6c,0x11,0x80,0x2c,0x6c,0x0, 0x74,0x18,0xac,0xb1,0x7d,0xf5,0x3e,0xf4,0x74, +0x2, 0xac,0xb0,0x2d,0xf5,0x2d,0xf4,0x49,0x2f,0x0, 0x30,0xb, 0xf8,0x30,0x9d,0x32, +0x12,0x6e,0xf1,0xbd,0x31,0x28,0x2, 0x7d,0x13,0xb, 0x0, 0xa5,0xb8,0x17,0xd8,0xb, +0x10,0x7e,0x53,0xe, 0x7b,0xa, 0x55,0x1b,0x54,0xa, 0x21,0xbd,0x25,0x48,0xc6,0x7e, +0x43,0x11,0xe0,0x7e,0x50,0x2, 0xac,0x45,0x7e,0x63,0x11,0xdf,0x7e,0x70,0x14,0xac, +0x67,0x2d,0x32,0x59,0x13,0x11,0x2b,0x7e,0x43,0x11,0xdf,0x7e,0x50,0x14,0xac,0x45, +0x49,0x32,0x11,0x3d,0x7c,0x7, 0xb, 0x0, 0xbe,0x0, 0x8, 0x40,0x3, 0x7e,0x0, 0x8, +0xa, 0x30,0x59,0x32,0x11,0x3d,0x6d,0x11,0x6c,0x11,0x7e,0x70,0x2, 0xac,0x71,0x7e, +0x3, 0x11,0xdf,0x74,0x14,0xac,0xb0,0x2d,0x35,0x49,0x43,0x11,0x2b,0xbd,0x41,0x28, +0x2, 0x7d,0x14,0xb, 0x10,0xbe,0x10,0x8, 0x40,0xe0,0x59,0x15,0x11,0x3b,0x22,0x70, +0x56,0x7a,0x71,0x1a,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5,0xbf,0x4, +0x15,0x7e,0xb3,0xe, 0xa4,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x2e,0x74, +0x27,0x7e,0x70,0x3, 0x80,0x64,0xa5,0xbf,0x2, 0x17,0x7e,0x37,0xd, 0xdd,0x7a,0x37, +0x12,0xd3,0x7e,0x37,0xd, 0xd9,0x7a,0x37,0x12,0xd5,0x74,0x1, 0x7a,0xb3,0x12,0xe5, +0x22,0x7e,0xb3,0xe, 0xa4,0xb4,0x3, 0x8, 0x74,0x1, 0x7e,0x70,0x1, 0x2, 0x63,0xb6, +0x74,0x27,0x7e,0x70,0x1, 0x80,0x33,0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5, +0xbf,0xaa,0x5, 0x7e,0x60,0x5, 0x80,0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80, +0x7, 0xa5,0xbf,0x66,0x18,0x7e,0x60,0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0, +0x80,0x40,0xa, 0xbe,0xb0,0xdf,0x38,0x5, 0x24,0x80,0x2, 0x63,0x8, 0x22,0xff,0xff, +0xca,0xf8,0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x1, 0x9a,0x7e,0x90, +0x2, 0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44, +0xff,0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0x5, 0x50,0x6b,0x4c,0xff,0x78, +0x14,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd, +0xe4,0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5, +0xb, 0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18, +0x37,0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5, +0xb, 0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, +0xf4,0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, +0xda,0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x2, 0x1, 0xe, +0x7c,0xba,0xda,0xf8,0x22,0x7e,0x34,0xe, 0x7d,0x7e,0x24,0x0, 0x81,0xe4,0x12,0x6f, +0x1, 0x74,0x3, 0x7a,0xb3,0xe, 0x7f,0x7a,0xb3,0xe, 0x80,0x7a,0xb3,0xe, 0x81,0x74, +0x11,0x7a,0xb3,0xe, 0x7d,0x74,0x2d,0x7a,0xb3,0xe, 0x7e,0x74,0xa0,0x7a,0xb3,0xe, +0x82,0x74,0xa, 0x7a,0xb3,0xe, 0x84,0x74,0xc, 0x7a,0xb3,0xe, 0x85,0x74,0x1e,0x7a, +0xb3,0xe, 0x86,0xe4,0x7a,0xb3,0xe, 0x88,0xf5,0x22,0xf5,0x21,0x7a,0xb3,0xe, 0xa2, +0x74,0x1, 0x7a,0xb3,0xe, 0x83,0x7a,0xb3,0xe, 0xa1,0x7a,0xb3,0xe, 0xa4,0x74,0x1a, +0x7a,0xb3,0xe, 0xa3,0x74,0x51,0x7a,0xb3,0xe, 0xa5,0x74,0xf, 0x7a,0xb3,0xe, 0xac, +0x12,0x6f,0x3a,0xa, 0x36,0x7a,0x73,0xe, 0xa6,0x12,0x6f,0x3a,0x7a,0x73,0xe, 0xa7, +0x12,0x64,0x3b,0xa, 0x36,0x7a,0x73,0xe, 0x9e,0x12,0x64,0x3b,0x7a,0x73,0xe, 0x9f, +0xe4,0x7a,0xb3,0xe, 0xaf,0x12,0x63,0x9c,0x7a,0xb3,0xe, 0xae,0x12,0x62,0x8e,0x7a, +0xb3,0xe, 0xa0,0xe4,0x7a,0xb3,0xe, 0xb5,0x22,0x7e,0x73,0xc, 0x41,0x7a,0x73,0xc, +0x42,0x7e,0xa3,0xc, 0xdf,0x7a,0xa3,0xc, 0xe0,0xe4,0x7a,0xb3,0xc, 0xe3,0x7e,0x37, +0xf, 0x18,0x4d,0x33,0x78,0x38,0xbe,0xa0,0x0, 0x28,0x7, 0xe4,0x7a,0xb3,0x12,0xe3, +0x80,0x6e,0x7e,0xb3,0xf, 0x1a,0x30,0xe0,0x67,0x7e,0xb3,0xf, 0x1f,0xbe,0xb3,0x12, +0xe3,0x38,0x5d,0xe4,0x7a,0xb3,0x12,0xe3,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0xf, 0x18, +0x74,0x1, 0x7a,0xb3,0xe, 0xa2,0x74,0x1e,0x7a,0xb3,0xf, 0x1d,0x80,0x42,0xbe,0x34, +0x0, 0x1, 0x78,0x1c,0xbe,0xa0,0x0, 0x28,0x37,0x6d,0x22,0x7a,0x27,0xf, 0x18,0xe4, +0x7a,0xb3,0xe, 0xa2,0x7a,0xb3,0x12,0xe3,0x74,0x26,0x7a,0xb3,0x12,0xe6,0x80,0x1a, +0xbe,0x34,0x0, 0x3, 0x78,0x1a,0x12,0x63,0x3b,0x12,0x37,0x9d,0x12,0x54,0xdc,0x6d, +0x33,0x7a,0x37,0xf, 0x18,0xe4,0x7a,0xb3,0xe, 0xa2,0x74,0x1, 0x7a,0xb3,0x12,0xe5, +0x7e,0xb3,0x12,0xe5,0x70,0x6, 0x12,0x51,0x76,0x2, 0x5a,0x1a,0x22,0xca,0x3b,0x6c, +0xff,0x7e,0x34,0xc, 0x58,0x7e,0x24,0x0, 0x23,0xe4,0x12,0x6f,0x1, 0x7e,0xb3,0xd, +0xd5,0x60,0x6, 0x7e,0xb3,0xd, 0xd6,0x70,0x17,0x7e,0x34,0xb, 0xd2,0x7e,0x24,0x0, +0x2, 0xe4,0x12,0x6f,0x1, 0x7e,0x34,0xa, 0xd9,0x7e,0x24,0x0, 0x4, 0x12,0x6f,0x1, +0x6c,0xee,0x80,0x59,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0xb, 0x96,0x9, 0xc5,0xb, 0x97, +0x4c,0xdd,0x68,0x5, 0xbe,0xd0,0xb, 0x78,0x20,0xbe,0xc0,0xd, 0x78,0x1b,0x7e,0x73, +0xc, 0x3d,0xbe,0x70,0x1, 0x28,0x12,0x7c,0xbe,0x12,0x60,0xbc,0xbe,0x34,0x0, 0x96, +0x58,0x7, 0x7c,0xbe,0x6c,0x77,0x12,0x0, 0x5e,0x7c,0xbe,0x12,0x64,0x2, 0x60,0x1b, +0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0xb, 0xd4,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34, +0xc, 0x58,0x7e,0x14,0x0, 0x7, 0x12,0x6e,0xc8,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xc, +0x3d,0xbc,0x7e,0x38,0x9f,0x7a,0x73,0xc, 0x41,0x7a,0xf3,0xc, 0xdf,0xda,0x3b,0x22, +0xca,0x79,0x7c,0x1b,0x7e,0x3, 0xf, 0xa0,0xa, 0x30,0x9, 0x3, 0xd, 0x19,0x7e,0xf0, +0x5, 0xa, 0x1f,0x9e,0x14,0x0, 0x5, 0x7c,0xe3,0xa, 0x1f,0x9, 0x71,0xd, 0x19,0xbc, +0x70,0x68,0x71,0x7c,0xb1,0x30,0xe0,0x6c,0xa, 0x1e,0x9, 0x61,0xf, 0xf7,0xa, 0x1f, +0x2e,0x14,0xd, 0x19,0x7e,0x19,0x70,0x2c,0x76,0x7a,0x19,0x70,0xa, 0x1e,0x9, 0x61, +0x11,0x26,0xa, 0x1f,0x9, 0x71,0xd, 0x19,0xbc,0x76,0x38,0x10,0x74,0x1, 0xa, 0x2e, +0x19,0xb2,0xf, 0xf7,0xa, 0x2f,0x19,0x62,0xd, 0x19,0x80,0x1c,0xa, 0x1e,0x9, 0xa1, +0x11,0x27,0xbc,0x7a,0x40,0x12,0x74,0xff,0xa, 0x1e,0x19,0xb1,0xf, 0xf7,0xa, 0x3a, +0x1b,0x34,0xa, 0x1f,0x19,0x71,0xd, 0x19,0xa, 0x1f,0x9, 0xb1,0xd, 0x19,0x12,0x61, +0xb3,0x40,0xa5,0x7e,0x70,0x14,0xac,0x7f,0x2e,0x34,0x11,0x2b,0x7e,0x24,0x0, 0x14, +0xe4,0x12,0x6f,0x1, 0x1e,0x10,0xb, 0xf0,0xbe,0xf0,0x8, 0x38,0x2, 0x41,0xa1,0xda, +0x79,0x22,0xca,0x3b,0x7c,0x9b,0x75,0x4a,0x1, 0x7e,0xf0,0x30,0x7e,0xe0,0xd0,0xbe, +0x90,0x1, 0x38,0x4, 0x7c,0xef,0x80,0x10,0x7e,0x63,0xe, 0x2a,0xa, 0x16,0x1b,0x15, +0xa, 0x29,0xbd,0x21,0x48,0x2, 0x7c,0xfe,0x7e,0xd0,0x2, 0x7e,0xc0,0xfe,0xbe,0x70, +0x1, 0x38,0x4, 0x7c,0xcd,0x80,0x7, 0xbe,0x70,0x16,0x40,0x2, 0x7c,0xdc,0x74,0x30, +0xac,0x9b,0x74,0x2, 0xac,0xb7,0x7d,0xf5,0x2d,0xf4,0x2e,0xf7,0xd, 0xdd,0xb, 0xf8, +0x20,0x7d,0x32,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0xc, 0x12,0x68,0x5d,0x7e,0x8, +0x0, 0x10,0x12,0x68,0xb9,0x7d,0x23,0x1a,0x3c,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30, +0xbd,0x32,0x18,0x27,0x1a,0x3d,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30,0xbd,0x32,0x18, +0x1a,0x1a,0x3e,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30,0xbd,0x32,0x18,0xd, 0x1a,0x3f, +0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30,0xbd,0x32,0x8, 0x3, 0x75,0x4a,0x0, 0xe5,0x4a, +0xda,0x3b,0x22,0x7e,0xa0,0x1, 0xe4,0x7a,0xb3,0xc, 0x55,0x74,0x1, 0x7a,0xb3,0xc, +0x56,0x7e,0x73,0xc, 0x3d,0xa5,0xbf,0x0, 0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0xe1,0xbe, +0x70,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xc, 0x56,0x7e,0xb3,0xc, 0x42,0xbe,0xb0,0x0, +0x28,0x5, 0xe4,0x7a,0xb3,0xc, 0x56,0x7e,0xb3,0xb, 0x8d,0xbe,0xb0,0x0, 0x28,0xd, +0x74,0x1, 0x7a,0xb3,0xc, 0x56,0x12,0x4d,0xac,0x7c,0xab,0x80,0x1d,0x7e,0xb3,0xb, +0x8c,0x70,0x17,0x7e,0xb3,0xc, 0x3d,0xbe,0xb0,0x0, 0x28,0xe, 0xbe,0xa0,0x3, 0x50, +0x3, 0x7e,0xa0,0x3, 0x74,0x1, 0x7a,0xb3,0xc, 0x56,0x7e,0xb3,0x0, 0xe1,0xbc,0xba, +0x50,0x4, 0x7a,0xa3,0x0, 0xe1,0x7e,0x73,0xc, 0x3d,0xbe,0x70,0x0, 0x28,0xb, 0x7e, +0xb3,0xb, 0x8c,0x70,0x5, 0xe4,0x7a,0xb3,0xc, 0x3d,0x7e,0xa3,0x0, 0xe1,0x74,0x2, +0xa4,0x7a,0x57,0xc, 0x4f,0x7e,0xa3,0x0, 0xe1,0x74,0x2, 0xa4,0x7a,0x57,0xc, 0x51, +0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, 0x78,0xc, 0x7e,0x34,0xe, 0x2a, +0x12,0x6e,0x72,0xa9,0xc7,0xea,0x80,0x2f,0xbe,0xd0,0x5, 0x78,0x27,0x12,0x63,0x6d, +0x50,0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0xe, 0x49,0x7e,0xf3,0xe, 0x4c,0xe4,0x7a,0xb3, +0xe, 0x4c,0x12,0x57,0x4e,0x7a,0xb3,0xe, 0x49,0x74,0x1, 0x7a,0xb3,0xe, 0x77,0x80, +0x6, 0xe4,0x80,0x56,0xe4,0x80,0x53,0x7e,0xb3,0xf, 0xa1,0x7e,0x34,0xe, 0x2a,0xb4, +0x1, 0xa, 0x12,0x66,0x66,0xe4,0x7a,0xb3,0xf, 0xa1,0x80,0xa, 0x12,0x6c,0xe3,0x7e, +0x34,0xe, 0x2a,0x12,0x6b,0xda,0x7e,0x34,0xe, 0x2a,0x12,0x6e,0x4d,0x7e,0xb3,0xe, +0xa4,0xb4,0x3, 0xa, 0x7e,0x73,0xf, 0xfb,0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x6d, +0xf8,0xbe,0xd0,0x5, 0x78,0x12,0x12,0x63,0x6d,0x50,0xd, 0x7a,0xe3,0xe, 0x49,0x7a, +0xf3,0xe, 0x4c,0xe4,0x7a,0xb3,0xe, 0x77,0x74,0x1, 0xda,0x79,0xda,0xd8,0x22,0xca, +0xb8,0xca,0x39,0x12,0x0, 0x2e,0x7e,0x35,0x1e,0xb, 0x34,0x7a,0x35,0x1e,0xbe,0x34, +0x3, 0xe8,0x40,0x33,0x6d,0x33,0x7a,0x35,0x1e,0x12,0x0, 0x1e,0xb4,0x1, 0x1a,0x7e, +0xb3,0xd, 0xc7,0x4, 0x7a,0xb3,0xd, 0xc7,0x7e,0x73,0xd, 0xc7,0xbe,0x70,0x4, 0x28, +0x8, 0xe4,0x7a,0xb3,0xd, 0xc7,0x53,0x1a,0x8f,0x7e,0xb3,0x12,0xe3,0xbe,0xb0,0x64, +0x50,0x5, 0x4, 0x7a,0xb3,0x12,0xe3,0x7e,0x73,0x12,0xe7,0xbe,0x73,0x12,0xe6,0x28, +0xb, 0x7e,0xb3,0x12,0xe6,0x4, 0x7a,0xb3,0x12,0xe6,0x80,0x6, 0x74,0x1, 0x7a,0xb3, +0x12,0xe5,0x7e,0xb3,0x12,0xe8,0x60,0x5, 0x14,0x7a,0xb3,0x12,0xe8,0x7e,0x37,0xe, +0x4, 0xb, 0x34,0x7a,0x37,0xe, 0x4, 0x7e,0x37,0xa, 0x73,0xbe,0x37,0xe, 0x4, 0x28, +0x3, 0x12,0x63,0x3b,0x7e,0x37,0xd, 0x25,0xbe,0x34,0x0, 0x0, 0x28,0x6, 0x1b,0x34, +0x7a,0x37,0xd, 0x25,0x12,0x63,0x4c,0xda,0x39,0xda,0xb8,0x32,0x7e,0xa0,0x1, 0x74, +0x1, 0x7a,0xb3,0xc, 0x56,0x6d,0x44,0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x2e,0x27, +0xd, 0xd9,0xb, 0x28,0x20,0xbd,0x24,0x58,0x11,0xbe,0x70,0x17,0x40,0x5, 0xbe,0x70, +0x18,0x40,0x7, 0xbe,0x70,0x25,0x50,0x2, 0x7d,0x42,0xb, 0x70,0xa5,0xbf,0x25,0xd9, +0x7e,0xb3,0x0, 0xf2,0x4, 0x7a,0xb3,0x0, 0xf2,0xb4,0x8, 0x5, 0xe4,0x7a,0xb3,0x0, +0xf2,0x7e,0x63,0x0, 0xf2,0x7e,0x70,0x2, 0xac,0x67,0x59,0x43,0x0, 0xe2,0x6c,0x77, +0x7e,0x30,0x2, 0xac,0x37,0x49,0x21,0x0, 0xe2,0xbd,0x24,0x8, 0x2, 0x7d,0x42,0xb, +0x70,0xa5,0xbf,0x8, 0xeb,0xbe,0x44,0xf9,0xc0,0x58,0x5, 0x7e,0xa0,0x4, 0x80,0x14, +0xbe,0x44,0xfc,0xe0,0x58,0x5, 0x7e,0xa0,0x3, 0x80,0x9, 0xbe,0x44,0xfe,0x70,0x58, +0x3, 0x7e,0xa0,0x2, 0xbe,0xa0,0x4, 0x40,0xb, 0x74,0x1, 0x7a,0xb3,0xc, 0x55,0xe4, +0x7a,0xb3,0xe, 0x3c,0x7c,0xba,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32, +0x2e,0x37,0xd, 0xd9,0xb, 0x38,0x10,0xbe,0x17,0xc, 0x51,0x8, 0x15,0x30,0x2, 0x2a, +0x7d,0x2, 0x2e,0x7, 0xd, 0xd7,0xb, 0x8, 0x30,0x2e,0x37,0xc, 0x51,0x1b,0x8, 0x30, +0x80,0x18,0x6d,0x33,0x9e,0x37,0xc, 0x51,0xbd,0x13,0x58,0xe, 0x2e,0x27,0xd, 0xd7, +0xb, 0x28,0x30,0x9e,0x37,0xc, 0x51,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78, +0xb8,0x20,0x0, 0x6, 0x6d,0x33,0x7a,0x37,0xc, 0x51,0x6c,0xaa,0x7e,0x50,0x2, 0xac, +0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xc, 0x51,0x8, 0x15,0x30,0x2, 0x2a,0x7d,0x2, +0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xc, 0x51,0x1b,0x8, 0x30,0x80,0x18, +0x6d,0x33,0x9e,0x37,0xc, 0x51,0xbd,0x13,0x58,0xe, 0x2e,0x24,0x8, 0xe4,0xb, 0x28, +0x30,0x9e,0x37,0xc, 0x51,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xbd,0x22, +0xca,0xf8,0x7d,0x12,0x7d,0x3, 0x7e,0x73,0xc, 0x3d,0xbe,0x70,0x2, 0x50,0x9, 0xe4, +0x7a,0x9, 0xb0,0x7a,0x19,0xb0,0x80,0x7b,0x6c,0xaa,0x80,0x6f,0xa, 0x4a,0xb, 0x44, +0x80,0x5f,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0xb, 0x96,0xa, 0x2b,0x7e,0x70,0x2, +0xac,0x7a,0x9, 0xb3,0xb, 0x96,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0x7c,0x87,0x7e, +0x70,0x2, 0xac,0x79,0x9, 0xb3,0xb, 0x97,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x9, +0xb3,0xb, 0x97,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0xf1,0x7c,0xf7,0x4c,0xaa,0x78,0xb, +0xbe,0x90,0x1, 0x78,0x6, 0x7a,0x9, 0x80,0x7a,0x19,0xf0,0x7e,0x9, 0xb0,0xbc,0xb8, +0x28,0x3, 0x7a,0x9, 0x80,0x7e,0x19,0xb0,0xbc,0xbf,0x28,0x3, 0x7a,0x19,0xf0,0xb, +0x90,0x7e,0xb3,0xc, 0x3d,0xbc,0xb9,0x38,0x99,0xb, 0xa0,0x7e,0xb3,0xc, 0x3d,0xbc, +0xba,0x38,0x89,0xda,0xf8,0x22,0xca,0xf8,0x6c,0xff,0x12,0x5b,0x63,0x7d,0x43,0x7a, +0x47,0x12,0xed,0x6c,0x33,0x80,0x11,0x7c,0xb3,0x12,0x60,0xbc,0x7d,0x53,0x3e,0x54, +0xbd,0x54,0x50,0x2, 0xb, 0xf0,0xb, 0x30,0x7e,0x73,0xc, 0x3d,0xbc,0x73,0x38,0xe7, +0xe4,0x7a,0xb3,0x12,0xef,0xbe,0x70,0x1, 0x28,0x18,0x74,0x2, 0xac,0xbf,0xa, 0x37, +0x1b,0x34,0xbd,0x53,0x48,0xc, 0xbe,0x44,0x0, 0xbe,0x28,0x6, 0x74,0x1, 0x7a,0xb3, +0x12,0xef,0xbe,0x44,0x3, 0x20,0x28,0x5, 0xe4,0x7a,0xb3,0xc, 0x3d,0x7e,0x34,0x0, +0xaa,0xad,0x34,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7d,0x43,0xbe,0x44,0x0, 0x3c,0x50, +0x4, 0x7e,0x44,0x0, 0x3c,0x7e,0xb3,0x12,0xf0,0xbe,0xb0,0x2, 0x68,0x4, 0x7a,0x47, +0x12,0xe9,0xda,0xf8,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38,0xfa,0x22, +0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0xe, 0x4c,0xf5,0x42,0xe4,0x7a,0xb3,0xe, +0x4c,0x7e,0x34,0xe, 0x2a,0x12,0x66,0x66,0x7e,0x34,0xe, 0x2a,0x12,0x6e,0x4d,0x75, +0x3f,0x0, 0x12,0x6d,0xf8,0xe5,0x66,0x60,0xfc,0xa9,0xb7,0xea,0x7d,0x36,0x7d,0x27, +0x7e,0x14,0x18,0x0, 0x12,0x5d,0x9d,0x75,0x40,0x0, 0x80,0x36,0x75,0x41,0x0, 0x80, +0x26,0x7e,0x51,0x40,0x74,0x18,0xac,0x5b,0xe5,0x41,0xa, 0x3b,0x2d,0x23,0x3e,0x24, +0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30, +0x2d,0x31,0x1b,0x28,0x30,0x5, 0x41,0x7e,0x73,0xe, 0x2b,0xbe,0x71,0x41,0x38,0xd1, +0x5, 0x40,0x7e,0x73,0xe, 0x2a,0xbe,0x71,0x40,0x38,0xc1,0x5, 0x3f,0xe5,0x3f,0xbe, +0xb0,0x4, 0x40,0x9e,0xe5,0x42,0x7a,0xb3,0xe, 0x4c,0xda,0x3b,0x22,0x7e,0xa3,0xc, +0x3d,0x4c,0xaa,0x78,0xc, 0x74,0xff,0x7a,0xb3,0x12,0x84,0x6d,0x33,0x7a,0x37,0x12, +0x85,0x7e,0xb3,0xc, 0xe0,0x70,0x5c,0xbe,0xa0,0x1, 0x78,0x57,0xe4,0x12,0x60,0xbc, +0xbe,0x34,0x0, 0x64,0x18,0x4d,0x7e,0x63,0x12,0x84,0xa5,0xbe,0xff,0x1a,0x7e,0x73, +0xb, 0x97,0x7a,0x73,0x12,0x84,0x7e,0x50,0x2, 0xac,0x57,0x2e,0x27,0xd, 0xd9,0xb, +0x28,0x20,0x7a,0x27,0x12,0x85,0x80,0x26,0x7e,0x73,0xb, 0x97,0xbe,0x73,0x12,0x84, +0x78,0x21,0x7e,0x70,0x2, 0xac,0x67,0x2e,0x37,0xd, 0xd9,0xb, 0x38,0x30,0x7e,0x27, +0x12,0x85,0x2e,0x24,0x0, 0x32,0xbd,0x32,0x8, 0x9, 0x7a,0x37,0x12,0x85,0xe4,0x7a, +0xb3,0xc, 0x3d,0x22,0x74,0x5, 0x7a,0xb3,0xd, 0x40,0x74,0x14,0x7a,0xb3,0xd, 0x41, +0x7e,0x34,0x0, 0xc8,0x7a,0x37,0xd, 0x42,0x7a,0x37,0xd, 0x44,0x7a,0x37,0xd, 0x46, +0x7a,0x37,0xd, 0x48,0x7a,0x37,0xd, 0x4a,0x74,0x3, 0x7a,0xb3,0xd, 0x4c,0x74,0x4, +0x7a,0xb3,0xd, 0x4d,0x7e,0x34,0x0, 0x46,0x7a,0x37,0xd, 0x4e,0x7e,0x34,0x0, 0x2d, +0x7a,0x37,0xd, 0x50,0x7e,0x34,0x0, 0x1e,0x7a,0x37,0xd, 0x52,0x7e,0x34,0x0, 0x50, +0x7a,0x37,0xd, 0x54,0x74,0x11,0x7a,0xb3,0xd, 0x56,0xe4,0x7a,0xb3,0xd, 0x59,0x74, +0x4, 0x7a,0xb3,0xd, 0x5a,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xd, 0x5b,0x7e,0x34,0xa, +0x0, 0x7a,0x37,0xd, 0x57,0x22,0x7e,0xb3,0x12,0xe1,0x70,0x17,0xe5,0xcc,0x7a,0xb3, +0x12,0xe2,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x12,0xe4,0x74,0x1, 0x7a, +0xb3,0x12,0xe1,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc,0xc2,0xca,0xc2, +0xc8,0xa9,0xc4,0xcb,0x80,0x3b,0xe5,0x25,0xbe,0xb0,0x1, 0x68,0x30,0xe5,0x66,0xb4, +0x1, 0x2b,0xe5,0x67,0xb4,0x1, 0x26,0x7e,0x37,0xf, 0x18,0xbe,0x34,0x0, 0x1, 0x78, +0x3, 0xa9,0xc4,0xc9,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0xe4,0x12,0x62, +0xe4,0x7e,0xb3,0x12,0xe5,0x60,0xbf,0x22,0xca,0xf8,0x74,0x3, 0x7a,0xb3,0x12,0xd8, +0x12,0x60,0xde,0x12,0x60,0x27,0xe4,0x7a,0xb3,0xe, 0x3b,0x7a,0xb3,0xe, 0x4c,0x12, +0x64,0x35,0x74,0x3, 0x7a,0xb3,0x12,0xd8,0x12,0x63,0x3b,0x7e,0xb3,0x12,0xd7,0x70, +0x15,0x12,0x63,0x3b,0x75,0x9a,0x80,0x74,0x1, 0x7a,0xb3,0x12,0xd7,0x75,0x9a,0x7f, +0x74,0xff,0x7a,0xb3,0x12,0xd7,0x7e,0xf3,0x12,0xd8,0xbe,0xf0,0x3, 0x78,0x1d,0xe5, +0x1a,0x30,0xe7,0xd4,0x12,0x55,0x40,0x7e,0x37,0xd, 0xd9,0x7a,0x37,0x12,0xd5,0x7e, +0x37,0xd, 0xdd,0x7a,0x37,0x12,0xd3,0x53,0x1a,0x7f,0x80,0xbc,0x7a,0xf3,0xe, 0xa4, +0x12,0x63,0xc2,0x12,0x0, 0x42,0xda,0xf8,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xe5, +0x25,0xbe,0xb0,0x1, 0x68,0xf9,0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6f,0x1, +0x7d,0x37,0x7e,0x24,0x0, 0x4a,0x12,0x6f,0x1, 0x75,0x3f,0x1, 0x12,0x60,0xfe,0xe5, +0x25,0xbe,0xb0,0x1, 0x68,0xf9,0x75,0x40,0x0, 0x7e,0x51,0x40,0x74,0x2, 0xac,0x5b, +0x49,0x2, 0xa, 0x26,0x1e,0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d, +0x30,0x1b,0x18,0x30,0x49,0x12,0x9, 0xdc,0x1e,0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28, +0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x40,0xe5,0x40,0xb4,0x25,0xcc,0x5, 0x3f,0xe5, +0x3f,0xbe,0xb0,0x5, 0x40,0xb6,0xda,0x3b,0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9, +0xd5,0xcb,0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68, +0x18,0xbe,0x34,0x73,0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, +0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c, +0xb7,0x54,0xfe,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68, +0x8, 0x75,0xf6,0xff,0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75, +0xf5,0x80,0x74,0x1, 0x12,0x62,0xa5,0xa9,0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf, +0xc2,0xc9,0xa9,0xc5,0xcb,0x74,0x1, 0x22,0xca,0xf8,0x7d,0x42,0x7c,0x5b,0x7c,0xa5, +0x74,0x7, 0xac,0x5b,0x2d,0x24,0x6c,0x33,0x7c,0x27,0x80,0x48,0x7e,0x90,0x7, 0xac, +0x93,0x9, 0xf4,0xc, 0x7f,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0,0xc, 0x5c,0xbc,0xfb, +0x78,0x30,0xbe,0xf0,0xff,0x68,0x2b,0x19,0xf2,0x0, 0x4, 0x49,0xf4,0xc, 0x7b,0x1b, +0x28,0xf0,0x49,0x44,0xc, 0x7d,0x59,0x42,0x0, 0x2, 0x9, 0xb0,0xc, 0x5d,0x19,0xb2, +0x0, 0x5, 0x9, 0xb0,0xc, 0x5e,0x19,0xb2,0x0, 0x6, 0xb, 0xa0,0x2e,0x24,0x0, 0x7, +0x80,0x6, 0xb, 0x20,0xbc,0x62,0x38,0xb4,0xb, 0x30,0xbe,0x30,0x5, 0x40,0xa9,0x7c, +0xba,0xda,0xf8,0x22,0x7e,0x34,0xc, 0x58,0x7e,0x24,0x0, 0x23,0x74,0xff,0x12,0x6f, +0x1, 0x7e,0x34,0xc, 0x7b,0x7e,0x24,0x0, 0x23,0x12,0x6f,0x1, 0x7e,0x34,0xc, 0x9e, +0x7e,0x24,0x0, 0x23,0x12,0x6f,0x1, 0x7e,0x34,0xc, 0xeb,0x7e,0x24,0x0, 0x5, 0xe4, +0x12,0x6f,0x1, 0x7e,0x34,0xc, 0xc1,0x7e,0x24,0x0, 0xa, 0x74,0x3, 0x12,0x6f,0x1, +0x7e,0x34,0xc, 0xcb,0x7e,0x24,0x0, 0x14,0x74,0xff,0x12,0x6f,0x1, 0x7e,0x34,0xc, +0xdf,0x7e,0x24,0x0, 0xb, 0xe4,0x12,0x6f,0x1, 0x12,0x62,0x77,0x74,0x8, 0x7a,0xb3, +0xc, 0xf1,0x74,0x4, 0x7a,0xb3,0xc, 0xf2,0xe4,0x7a,0xb3,0xc, 0xf3,0x22,0x12,0x63, +0x3b,0x7e,0xb3,0xe, 0xa4,0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55, +0x7e,0xb3,0x0, 0xf5,0xbe,0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xf5,0x22, +0x7e,0xb3,0x0, 0xf5,0xb4,0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xf5,0x74,0xfa,0x12, +0x62,0xa5,0x75,0x9a,0x80,0x7e,0x34,0x77,0xf8,0x12,0x5f,0x4b,0x7e,0x34,0x77,0xf8, +0x74,0x66,0x12,0x52,0xc9,0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x52,0xc9,0x80,0x12, +0x7e,0xb3,0x0, 0xf5,0xb4,0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xf5,0x74,0xfa,0x12, +0x62,0xa5,0x75,0xe9,0xff,0x22,0x7e,0x34,0xf, 0x8, 0x7e,0x50,0x3c,0x7e,0xa0,0x4, +0xe5,0x21,0xb4,0x1, 0x3, 0x7e,0xa0,0x2, 0x7e,0xb3,0xf, 0xf4,0xb4,0x1, 0x3, 0x7e, +0xa0,0x1, 0xe5,0x22,0xb4,0x1, 0x3, 0x7e,0x50,0x64,0x7e,0x43,0xf, 0xa0,0x7e,0x30, +0x14,0xac,0x34,0x49,0x11,0x11,0x3b,0xa, 0x25,0x1e,0x24,0xbd,0x12,0x40,0x3, 0x7e, +0xa0,0x1, 0x19,0xa3,0x0, 0x2, 0x7d,0x23,0xb, 0x24,0x7e,0x29,0xb0,0x4, 0x7a,0x29, +0xb0,0xe4,0x7a,0x39,0xb0,0x9, 0x43,0x0, 0x2, 0x9, 0x53,0x0, 0x1, 0xbc,0x54,0x40, +0xa, 0xe4,0x19,0xb3,0x0, 0x1, 0x74,0x1, 0x7a,0x39,0xb0,0x22,0x0, 0x0, 0x0, 0x0, +0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x12,0xe1,0xb4,0x1, 0x14,0x7e,0x73,0x12,0xe4, +0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a,0xb3,0x12,0xe1,0x80,0xb, +0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xd0,0xca,0xc2,0xa8, +0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x12,0xe8,0x7e,0xb3,0x12,0xe8,0x70,0xfa,0x12,0x64, +0xb, 0x12,0x55,0xf3,0x12,0x60,0xde,0x12,0x63,0x3b,0x12,0x60,0x27,0x12,0x61,0xcd, +0x12,0x53,0xa4,0x74,0x1, 0x7a,0xb3,0xe, 0x3b,0x7a,0xb3,0xe, 0x4c,0x2, 0x64,0x35, +0xe5,0x25,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x25,0xb4,0x2, 0x3f,0xa9,0xd7,0xea,0x7e, +0x37,0xd, 0xdd,0x7e,0x27,0xd, 0xdb,0x7e,0x14,0x18,0x0, 0x12,0x5d,0x9d,0x12,0x5f, +0x9c,0x74,0x1, 0x7a,0xb3,0xd, 0xd6,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e, +0x14,0x9, 0xdc,0x12,0x5c,0x1b,0x7e,0x37,0xd, 0xd9,0x7e,0x27,0xd, 0xd7,0x7e,0x14, +0xa, 0x26,0x12,0x5c,0x1b,0x74,0x1, 0x7a,0xb3,0xd, 0xd5,0x12,0x5c,0x55,0x12,0x61, +0x96,0x12,0x5e,0x34,0x12,0x54,0x76,0x2, 0x60,0xfe,0x7e,0x71,0x24,0x3e,0x70,0x3e, +0x70,0x7c,0xb7,0x24,0x26,0xa, 0x2b,0xb, 0x28,0x50,0x7c,0xab,0x7c,0xb7,0x24,0x28, +0xa, 0x3b,0xb, 0x38,0x20,0x4d,0x22,0x68,0x1f,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34,0xe, 0x2a,0x12,0x6e,0x72,0x7d, +0x32,0x7e,0x24,0x18,0x0, 0x12,0x58,0xa2,0x5, 0x24,0xe5,0x23,0xbe,0xb1,0x24,0x28, +0xe, 0x12,0x59,0x3f,0xb4,0x1, 0x4, 0x75,0x25,0x1, 0x22,0x75,0x25,0x3, 0x22,0x75, +0x25,0x2, 0x22,0x12,0x48,0xa5,0x12,0x34,0xe2,0x12,0x7, 0xd0,0x7e,0x34,0x8, 0x50, +0x7a,0x37,0xd, 0xd7,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xd, 0xd9,0x7e,0x34,0x8, 0x9a, +0x7e,0x27,0xd, 0xd7,0x12,0x62,0x60,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xd, 0xdb,0x7e, +0x34,0x3, 0x70,0x7a,0x37,0xd, 0xdd,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xd, 0xdb,0x12, +0x62,0x49,0x12,0x5a,0xe4,0x12,0x51,0x4, 0x12,0x61,0xcd,0x12,0x53,0xa4,0x12,0x5c, +0x8e,0x12,0x63,0xee,0x74,0x1, 0x7a,0xb3,0xf, 0xa1,0x22,0x6c,0xaa,0x6c,0x77,0x7e, +0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d,0x1, 0x2e,0x7, 0xd, +0xdd,0xb, 0x8, 0x20,0xbe,0x27,0xc, 0x4f,0x8, 0x12,0x7d,0x41,0x2e,0x47,0xd, 0xdb, +0xb, 0x48,0x0, 0x2e,0x7, 0xc, 0x4f,0x1b,0x48,0x0, 0x80,0x18,0x6d,0x0, 0x9e,0x7, +0xc, 0x4f,0xbd,0x20,0x58,0xe, 0x2e,0x17,0xd, 0xdb,0xb, 0x18,0x20,0x9e,0x27,0xc, +0x4f,0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0,0xbe,0xa0,0xd, 0x40, +0xac,0x22,0x7e,0xb3,0xe, 0x38,0xb4,0x1, 0x26,0x7e,0x73,0xa, 0x70,0x7a,0x73,0xe, +0x36,0x7e,0x73,0xa, 0x71,0x7a,0x73,0xe, 0x37,0x7e,0x73,0xa, 0x72,0x7a,0x73,0xe, +0x39,0x7e,0x34,0xc, 0x44,0x7a,0x37,0xe, 0x45,0x7e,0x34,0xd, 0xdf,0x80,0x24,0x7e, +0x73,0xf, 0x21,0x7a,0x73,0xe, 0x36,0x7e,0x73,0xf, 0x54,0x7a,0x73,0xe, 0x37,0x7e, +0x73,0xf, 0x55,0x7a,0x73,0xe, 0x39,0x7e,0x34,0xf, 0xa8,0x7a,0x37,0xe, 0x45,0x7e, +0x34,0xd, 0x65,0x7a,0x37,0xe, 0x47,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2e,0x37,0xd, 0xd9,0xb, 0x38,0x10,0x2e,0x27,0xd, 0xd7,0xb, 0x28,0x30,0x2d, +0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e, +0x24,0x3, 0x70,0x74,0x18,0x7e,0x13,0xe, 0x2a,0x6c,0x0, 0x2, 0x6c,0x35,0x7e,0xb3, +0x11,0xdf,0x4, 0x7a,0xb3,0x11,0xdf,0x7e,0xb3,0xf, 0xf4,0xb4,0x1, 0x5, 0x7e,0xa0, +0x9, 0x80,0x3, 0x7e,0xa0,0x4, 0x7e,0xb3,0x11,0xdf,0xb4,0x4, 0x5, 0x4, 0x7a,0xb3, +0x11,0xdf,0x7e,0xb3,0x11,0xdf,0xbc,0xba,0x40,0x1e,0xe4,0x7a,0xb3,0x11,0xdf,0x7e, +0xb3,0x11,0xe0,0x4, 0x7a,0xb3,0x11,0xe0,0xbe,0xb0,0x8, 0x40,0xb, 0xe4,0x7a,0xb3, +0x11,0xe0,0x74,0x1, 0x7a,0xb3,0xf, 0xf3,0x7e,0xb3,0x11,0xdf,0xa, 0x3b,0x9, 0xb3, +0xd, 0x19,0x22,0xca,0xf8,0x7e,0xb3,0xd, 0xd5,0xb4,0x1, 0x48,0x6c,0xff,0x80,0x3c, +0x7e,0x37,0xd, 0xd9,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0x75, +0x7e,0x53,0xe, 0x2a,0x12,0x41,0xe7,0x74,0x7, 0xac,0xbf,0x59,0x35,0xa, 0xdd,0x7e, +0x37,0xd, 0xd9,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0x76,0x7e,0x53,0xe, 0x2b,0x12, +0x41,0xe7,0x74,0x7, 0xac,0xbf,0x59,0x35,0xa, 0xdf,0xb, 0xf0,0x7e,0x73,0xb, 0x8c, +0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0x75,0x1a,0x0, 0x12,0x0, 0x70,0x2, 0x58,0x0, +0x75,0x18,0x0, 0xe5,0x1a,0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5, +0x1d,0x12,0x42,0xa6,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0x1d,0x12,0x33, +0x4a,0xf5,0x91,0x75,0x19,0x0, 0x7e,0x34,0x0, 0x84,0x7e,0x24,0x0, 0x24,0x74,0xff, +0x12,0x6f,0x1, 0x7e,0x34,0x0, 0xa8,0x7e,0x24,0x0, 0x24,0x12,0x6f,0x1, 0x74,0xaa, +0x7a,0xb3,0x0, 0x84,0x7a,0xb3,0x0, 0x85,0x7a,0xb3,0x0, 0xa8,0x7a,0xb3,0x0, 0xa9, +0x22,0xe4,0x7a,0xb3,0xe, 0x77,0x7a,0xb3,0xe, 0x7a,0x74,0x4, 0x7a,0xb3,0xe, 0x7b, +0x7e,0x34,0x11,0x2b,0x7e,0x24,0x0, 0xb4,0xe4,0x12,0x6f,0x1, 0x7a,0xb3,0xf, 0x8, +0x7a,0xb3,0xf, 0x9, 0x74,0x4, 0x7a,0xb3,0xf, 0xa, 0xe4,0x7a,0xb3,0xf, 0xf4,0x7a, +0xb3,0xf, 0xf3,0x74,0x4, 0x7a,0xb3,0xf, 0xf6,0x74,0xff,0x7a,0xb3,0xf, 0xf7,0x74, +0x1, 0x7a,0xb3,0xf, 0xf8,0x74,0xff,0x7a,0xb3,0xf, 0xf9,0x74,0x1, 0x7a,0xb3,0xf, +0xfa,0x22,0x6c,0xaa,0xa, 0x1a,0x9, 0x31,0xc, 0xf4,0x7e,0x23,0xe, 0x39,0xbe,0x20, +0x3, 0x28,0xe, 0x7e,0x10,0x2, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80, +0x1a,0x7e,0x20,0x3, 0x9e,0x23,0xe, 0x39,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x2, 0xb, +0x8, 0x0, 0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f,0xff,0x9d, +0x40,0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0xa0,0xbe,0xa0,0x25, +0x40,0xb2,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75,0x66,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28, +0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, 0x1b, +0x28,0x30,0xe5,0x25,0xb4,0x1, 0x3, 0x12,0x55,0x9a,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca, +0xf8,0xe5,0x23,0xbe,0xb1,0x24,0x38,0x4, 0x6c,0xff,0x80,0x39,0xe5,0x24,0x3e,0xb0, +0x3e,0xb0,0x24,0x26,0xa, 0x3b,0xb, 0x38,0x40,0xbe,0x90,0x1, 0x68,0xa, 0xbe,0x90, +0x2, 0x68,0x5, 0xbe,0x90,0x3, 0x78,0x7, 0x7c,0xb9,0x12,0x5f,0xc3,0x7c,0xfb,0xbe, +0x90,0x4, 0x68,0xa, 0xbe,0x90,0x5, 0x68,0x5, 0xbe,0x90,0x6, 0x78,0x7, 0x7c,0xb9, +0x12,0x4c,0x71,0x7c,0xfb,0x7c,0xbf,0xda,0xf8,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x7e, +0xb3,0xe, 0x4d,0x60,0x3, 0xb4,0x1, 0x37,0xa9,0xc6,0xea,0xb4,0x1, 0x7, 0x12,0x3e, +0x14,0x70,0x7, 0x80,0x0, 0x12,0x2c,0x3e,0x7c,0xfb,0x7e,0x37,0xd, 0xdd,0x7e,0x27, +0xd, 0xdb,0x12,0x62,0x49,0x7e,0x37,0xd, 0xdd,0x7e,0x27,0xd, 0xdb,0x12,0x50,0x0, +0xbe,0xf0,0x1, 0x78,0x4, 0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0xe, 0x4d,0xda, +0xf8,0x22,0x7c,0xab,0x7e,0x44,0x0, 0x4, 0x7c,0x7a,0x3e,0x70,0x3e,0x70,0x7c,0xb7, +0x24,0x26,0xa, 0x2b,0x1b,0x28,0x40,0x6d,0x22,0x7c,0xb7,0x24,0x28,0xa, 0x3b,0x1b, +0x38,0x20,0xb, 0xa0,0x12,0x63,0x6d,0x50,0x1e,0x7e,0x4, 0x0, 0x5, 0x7c,0x7a,0x3e, +0x70,0x3e,0x70,0x7c,0xb7,0x24,0x26,0xa, 0x1b,0x1b,0x18,0x0, 0x7c,0xb7,0x24,0x28, +0xa, 0x3b,0x1b,0x38,0x20,0xb, 0xa0,0x7c,0xba,0x22,0xd2,0xcd,0xa9,0xd1,0xc9,0xa9, +0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x12,0xe1,0xb4,0x1, 0x15,0x7e,0x73,0x12,0xe4, +0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x7e,0xb3,0x12,0xe2,0xf5,0xcc,0x80, +0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x75,0xcc,0x0, 0xa9, +0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x12,0xe1,0x22, +0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x2c,0x7c,0xbe,0x12,0x64,0x2, 0x60,0x23,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x24,0xb, 0x96,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x34,0xb, +0x96,0x7e,0x14,0x0, 0x2, 0x12,0x6e,0xc8,0x7c,0xbf,0x7e,0x70,0x1, 0x12,0x0, 0x5e, +0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xc, 0x3d,0xbc,0x7e,0x38,0xcc,0x7a,0xf3,0xc, 0x3d, +0xda,0x79,0x22,0x12,0x61,0x78,0x12,0x63,0x2a,0x12,0x64,0xb, 0x12,0x55,0xf3,0x12, +0x0, 0x59,0x12,0x62,0xf6,0x74,0x1, 0x7a,0xb3,0xe, 0xa4,0x7e,0xb3,0xe, 0xa4,0x24, +0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68,0x13,0x24,0x5, 0x78,0xeb, +0x12,0x3f,0x30,0x80,0xe6,0x12,0x51,0xe8,0x80,0xe1,0x12,0x60,0x0, 0x80,0xdc,0x12, +0x54,0xe, 0x80,0xd7,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0xc, 0x45,0x7a,0x37,0xc, 0x47, +0x7e,0x34,0x0, 0x50,0x7a,0x37,0xc, 0x49,0x7e,0x34,0x0, 0x19,0x7a,0x37,0xc, 0x4b, +0x7e,0x34,0x0, 0x32,0x7a,0x37,0xc, 0x4d,0x7e,0x34,0x0, 0x2, 0x7a,0x37,0xc, 0x4f, +0x7a,0x37,0xc, 0x51,0xe4,0x7a,0xb3,0xc, 0x53,0x7e,0xb3,0xc, 0x54,0x54,0xfb,0x7a, +0xb3,0xc, 0x54,0x22,0xca,0xf8,0x7e,0x24,0xc, 0x58,0x7e,0x34,0xc, 0x9e,0x7e,0x14, +0x0, 0x23,0x12,0x6e,0xc8,0x6c,0xff,0x74,0x7, 0xac,0xbf,0x49,0x35,0xc, 0x58,0x12, +0x44,0xc6,0x74,0x7, 0xac,0xbf,0x59,0x35,0xc, 0x9e,0x49,0x35,0xc, 0x5a,0x12,0x45, +0x76,0x74,0x7, 0xac,0xbf,0x59,0x35,0xc, 0xa0,0xb, 0xf0,0xbe,0xf0,0x5, 0x40,0xd7, +0xda,0xf8,0x22,0xca,0x3b,0x6d,0x77,0x6c,0xdd,0x80,0x2a,0x7e,0x70,0x2, 0xac,0x7d, +0x9, 0xb3,0xb, 0x96,0xf5,0x4a,0x9, 0xc3,0xb, 0x97,0x7c,0xbd,0x12,0x60,0xbc,0x7a, +0x35,0x4b,0xbd,0x37,0x8, 0xd, 0x7e,0x75,0x4b,0xe5,0x4a,0x7a,0xb3,0x12,0x65,0x7a, +0xc3,0x12,0x64,0xb, 0xd0,0x7e,0x73,0xc, 0x3d,0xbc,0x7d,0x38,0xce,0x7d,0x37,0xda, +0x3b,0x22,0x12,0x2a,0x20,0x7c,0xab,0xbe,0xa1,0x16,0x28,0x3, 0x7a,0xa1,0x16,0x12, +0x40,0x0, 0x7c,0xab,0xbe,0xa1,0x16,0x28,0x3, 0x7a,0xa1,0x16,0x12,0x46,0x20,0x7c, +0xab,0xbe,0xa1,0x16,0x28,0x3, 0x7a,0xa1,0x16,0x7e,0xa1,0x16,0xe5,0x16,0xbe,0xb0, +0x0, 0x28,0xb, 0x15,0x16,0xe4,0x7a,0xb3,0xc, 0x3d,0x7a,0xb3,0xb, 0x8c,0x7c,0xba, +0x22,0x7c,0xa4,0x7c,0x15,0x7d,0x13,0x7c,0xb, 0x7e,0x19,0x70,0xa5,0xbf,0x0, 0x6, +0x7a,0x19,0x0, 0x7c,0xb0,0x22,0xa, 0x27,0xa, 0x30,0x9d,0x32,0x12,0x6e,0xf1,0xa, +0x2a,0xbd,0x32,0x8, 0x12,0x7e,0x19,0xa0,0xbc,0xa0,0x7c,0xba,0x50,0x4, 0x2c,0xb1, +0x80,0x2, 0x9c,0xb1,0x7a,0x19,0xb0,0x7e,0x19,0xb0,0x22,0xca,0x3b,0x7d,0x72,0x7d, +0x63,0x7d,0x21,0x7d,0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6e,0xc8,0x7e,0xb3,0xe, 0x3b, +0xb4,0x1, 0x1f,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38, +0x10,0x2d,0x26,0xb, 0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25, +0x78,0xe3,0xda,0x3b,0x22,0x7e,0xb3,0xe, 0x3c,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, +0x7a,0xb3,0xe, 0x38,0x12,0x56,0xa2,0x12,0x30,0x0, 0xe4,0x7a,0xb3,0xe, 0x38,0x12, +0x56,0xa2,0x12,0x30,0x0, 0x7e,0x34,0xe, 0x2a,0x12,0x6e,0x72,0x7e,0x37,0xd, 0xd7, +0x7e,0x24,0x8, 0xe4,0x12,0x52,0x59,0x74,0x2, 0x7a,0xb3,0xe, 0x3c,0x22,0x74,0x1, +0x7a,0xb3,0x10,0xc6,0x74,0xc8,0x7a,0xb3,0x10,0xc7,0x74,0x32,0x7a,0xb3,0x10,0xc8, +0x74,0x3a,0x7a,0xb3,0x10,0xc2,0x74,0x24,0x7a,0xb3,0x10,0xc3,0x7a,0xb3,0x10,0xc4, +0x74,0x12,0x7a,0xb3,0x10,0xc5,0x7e,0x34,0x4, 0x0, 0x7a,0x37,0x10,0xbe,0x7e,0x34, +0x2, 0x58,0x7a,0x37,0x10,0xbc,0x22,0x7e,0x30,0x70,0xe4,0x7e,0x34,0x0, 0x3f,0x12, +0x5e,0x65,0x92,0x7, 0x30,0x7, 0xa, 0xe5,0x3f,0xbe,0xb0,0xff,0x68,0x3, 0x7e,0x31, +0x3f,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x7c,0xb3,0x54,0xfe,0xf5,0x92,0xd2,0xad, +0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22,0xca, +0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0, +0x83,0xc0,0x82,0x75,0x67,0x1, 0x75,0xe6,0x0, 0xe5,0x25,0xb4,0x1, 0x3, 0x12,0x55, +0x9a,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda, +0x5b,0xda,0x6b,0xda,0x7b,0x32,0xe5,0x21,0xb4,0x1, 0xe, 0x7e,0x34,0x0, 0x96,0x7a, +0x37,0xd, 0x4e,0x7e,0x34,0x0, 0x5a,0x80,0x1c,0x7e,0x37,0x12,0xeb,0xbe,0x34,0x0, +0x0, 0x28,0x6, 0x7e,0x34,0x0, 0x96,0x80,0x4, 0x7e,0x34,0x0, 0x46,0x7a,0x37,0xd, +0x4e,0x7e,0x34,0x0, 0x2d,0x7a,0x37,0xd, 0x50,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12, +0x4b,0xd3,0x7e,0xb3,0xc, 0x55,0x60,0xc, 0x12,0x56,0xf8,0x7e,0xb3,0x12,0xba,0x4, +0x7a,0xb3,0x12,0xba,0x5, 0x63,0xbe,0xf1,0x63,0x38,0xf, 0x75,0x63,0x0, 0x7e,0xb3, +0xc, 0x56,0x60,0x6, 0x12,0x4e,0x47,0x12,0x56,0x4b,0xda,0xf8,0x22,0xca,0xf8,0x7d, +0x1, 0x7d,0x13,0x7e,0xf3,0xe, 0x4c,0xbe,0xf0,0x1, 0x78,0xd, 0x7d,0x30,0x74,0x18, +0x7e,0x13,0xe, 0x2a,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff,0x78,0x10,0x7d,0x30,0x6d, +0x22,0x74,0x18,0x7e,0x13,0xe, 0x2a,0x7e,0x0, 0x4, 0x12,0x6c,0x35,0xda,0xf8,0x22, +0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c,0x33,0x4c,0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac, +0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d,0x30,0x80,0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, +0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe,0x30,0x3, 0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d, +0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d,0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d, +0x23,0x19,0xb2,0x0, 0x5, 0x7e,0x24,0xff,0xff,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, +0x2d,0x3, 0x59,0x20,0x0, 0xa, 0x2d,0x13,0x59,0x21,0x0, 0x14,0xb, 0xa0,0xbe,0xa0, +0x5, 0x40,0xd1,0x22,0x30,0x3, 0x2d,0x7e,0xb3,0xc, 0xe0,0x70,0x27,0x7e,0xb3,0xc, +0xdf,0x70,0x21,0x7e,0x73,0xf, 0xa0,0xa, 0x37,0x9, 0x73,0xd, 0x19,0x7a,0x73,0xe, +0x49,0xe4,0x7a,0xb3,0xe, 0x4d,0x12,0x59,0x8a,0xc2,0x3, 0x7e,0xb3,0xe, 0xb5,0x4, +0x7a,0xb3,0xe, 0xb5,0x22,0x7d,0x23,0x70,0x6, 0x7e,0x34,0x0, 0xfa,0x80,0x14,0xb4, +0x1, 0x6, 0x7e,0x34,0x0, 0xfc,0x80,0xb, 0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xfe,0x80, +0x2, 0xc3,0x22,0x9, 0xb3,0x0, 0x1, 0x7e,0x39,0xa0,0x6c,0xba,0xb4,0xff,0x5, 0x7a, +0x29,0xa0,0xd3,0x22,0xc3,0x22,0x7d,0x13,0x7d,0x32,0x5e,0x34,0x0, 0x7, 0x2e,0x34, +0x6f,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0xb, 0x7e,0x34,0x0, 0xff, +0x9d,0x30,0x7c,0x67,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x2d,0x21,0x7e,0x29,0x70,0x5c, +0x76,0x7a,0x29,0x70,0x22,0x7e,0x73,0xc, 0xe0,0xbe,0x70,0x0, 0x38,0x25,0xbe,0x73, +0xc, 0xdf,0x50,0x11,0x7e,0x63,0xc, 0xe9,0xbe,0x61,0x14,0x28,0xb, 0x5, 0x14,0x7a, +0x73,0xc, 0xdf,0x80,0x3, 0x75,0x14,0x0, 0x7e,0xb3,0xc, 0xdf,0x70,0x5, 0xe4,0x7a, +0xb3,0xc, 0xe8,0x22,0x7c,0x17,0x7c,0xb, 0xa5,0xb8,0x0, 0x13,0x7a,0x11,0x1a,0xe5, +0x1a,0xc4,0x54,0x7, 0x68,0x15,0x7c,0xb0,0x7c,0x71,0x12,0x47,0x6f,0x80,0xc, 0xbe, +0x0, 0x80,0x50,0x7, 0x7c,0xb0,0x7c,0x71,0x12,0x20,0x0, 0x7c,0xb0,0x7c,0x71,0x2, +0x47,0x6f,0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0xf5,0xf1,0x7c,0xb7,0xf5,0xf2,0x75, +0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9,0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc, +0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5,0xcb,0x22,0xc2,0xaf,0x75,0xfb,0x0, +0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54,0x1e,0x54,0x3e,0x54,0x3e,0x54,0xf5, +0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, 0x12,0x62,0xa5,0xc2,0xc9,0xa9,0xc5, +0xcb,0xd2,0xaf,0x22,0x7d,0x42,0x7d,0x23,0x7d,0x34,0x5e,0x34,0x0, 0x7, 0x2e,0x34, +0x6f,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x7d,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x2d,0x32,0x7e,0x39,0xb0,0x5c,0xba,0x22,0xca,0xf8,0x12,0x63, +0x6d,0x50,0x1d,0xa9,0xc7,0xea,0x7e,0xf3,0xe, 0x4c,0xe4,0x7a,0xb3,0xe, 0x4c,0x7e, +0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x5d,0x9d,0x7a,0xf3,0xe, 0x4c, +0xda,0xf8,0x22,0xb4,0x1, 0x3, 0xe4,0x80,0x5, 0xb4,0x2, 0x8, 0x74,0x1, 0x7a,0xb3, +0xe, 0x38,0x80,0x2, 0xe4,0x22,0x12,0x56,0xa2,0x7e,0x34,0xe, 0x2a,0x12,0x6a,0x48, +0x7e,0x34,0xe, 0x2a,0x12,0x6d,0x80,0x74,0x1, 0x22,0xca,0x2b,0xca,0x1b,0xca,0xb, +0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12,0x43,0x5e,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32, +0xe4,0x7a,0xb3,0xe, 0x3c,0x7a,0xb3,0xe, 0x4d,0x7a,0xb3,0xc, 0xf3,0x12,0x60,0x27, +0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0xe, 0xa4,0x53,0x1a,0x8f,0x74,0x2, 0x80,0x2, +0x74,0xff,0x7a,0xb3,0xc, 0xf3,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x5c,0x55,0x7e, +0xb3,0xe, 0x3c,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x59,0x8a,0x7e,0xb3,0xe, +0x4d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0xc2,0x7, 0x7e, +0xa0,0x3c,0xe5,0x22,0xb4,0x1, 0x3, 0x7e,0xa0,0x64,0xa, 0x3a,0x1e,0x34,0xbe,0x37, +0x11,0x3b,0x50,0xc, 0x7e,0x73,0xe, 0x49,0xbe,0x73,0xd, 0x19,0x78,0x2, 0xd2,0x7, +0xa2,0x7, 0x22,0x12,0x63,0x6d,0x50,0x1f,0x12,0x64,0x2f,0x7a,0xb3,0x0, 0xf4,0x7e, +0xb3,0xf, 0xa0,0xbe,0xb0,0x4, 0x68,0xf, 0x7e,0x73,0x0, 0xf4,0xbe,0x70,0xff,0x68, +0x6, 0xd2,0x3, 0x7a,0x73,0xf, 0xa0,0x22,0x12,0x60,0x73,0x12,0x1d,0x49,0x7e,0xb3, +0xc, 0x54,0x20,0xe2,0x6, 0x12,0x5a,0x60,0x12,0x28,0x0, 0x12,0x5a,0x60,0x74,0x3, +0x12,0x44,0x12,0x12,0x5a,0x60,0x12,0x50,0x8d,0x2, 0xc, 0x8d,0x7c,0x6b,0x74,0x2, +0xac,0xb6,0x9, 0x75,0xb, 0x96,0x9, 0x65,0xb, 0x97,0x7e,0x50,0x30,0xac,0x57,0x7e, +0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xd, 0xdd,0xb, 0x38,0x30,0x22,0x7e,0x24, +0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6e,0xdf,0x12,0x6e,0x95,0x7e, +0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x46,0x75,0x25, +0x0, 0x75,0x65,0x0, 0x75,0x24,0x0, 0x12,0x61,0x1d,0x12,0x59,0xd2,0xf5,0x23,0x12, +0x59,0x3f,0xb4,0x1, 0x4, 0x75,0x25,0x1, 0x22,0x75,0x25,0x3, 0x22,0x7e,0x34,0x0, +0x1, 0x7a,0x35,0x26,0x7e,0x34,0x9, 0xdc,0x7a,0x35,0x28,0x7e,0x34,0x0, 0x2, 0x7a, +0x35,0x2a,0x7e,0x34,0xa, 0x26,0x7a,0x35,0x2c,0x74,0x2, 0x22,0x7e,0x24,0x8, 0x9a, +0x7e,0x34,0xf, 0xa9,0x7e,0x14,0x0, 0x4a,0x12,0x6e,0xc8,0x7e,0x24,0x9, 0x2e,0x7e, +0x34,0xf, 0x56,0x7e,0x14,0x0, 0x4a,0x2, 0x6e,0xc8,0xe4,0x7a,0xb3,0x12,0xe6,0x7a, +0xb3,0x12,0xe5,0x7e,0xb3,0xe, 0xa2,0x70,0x6, 0x7e,0x73,0xf, 0x1b,0x80,0x4, 0x7e, +0x73,0xf, 0x1d,0x7a,0x73,0x12,0xe7,0x22,0x7e,0x24,0x13,0xb0,0x7e,0x34,0x0, 0xfa, +0x7e,0x14,0x0, 0x4, 0x12,0x6e,0xc8,0x7e,0x24,0xc, 0xfe,0x7e,0x34,0x0, 0xfe,0x7e, +0x14,0x0, 0x2, 0x2, 0x6e,0xc8,0xe5,0x22,0xb4,0x1, 0x14,0xe5,0x21,0x70,0x10,0x7e, +0xb3,0xf, 0xa0,0x60,0x7, 0xe4,0x7a,0xb3,0xf, 0xa0,0xd2,0x3, 0x12,0x58,0x51,0x85, +0x21,0x22,0x22,0xc2,0x7, 0x6c,0xaa,0xa, 0x4a,0x9, 0x74,0xd, 0x19,0xbc,0x7b,0x78, +0x2, 0xd2,0x7, 0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xed,0xa2,0x7, 0x22,0x7e,0x34,0xa, +0x75,0x7e,0x24,0x1, 0xcf,0xe4,0x12,0x6f,0x1, 0x7e,0x34,0xb, 0xd4,0x7e,0x24,0x0, +0x69,0x74,0xff,0x2, 0x6f,0x1, 0x7d,0x40,0x7d,0x51,0x7d,0x3, 0x7d,0x32,0x9d,0x34, +0x12,0x6e,0xf1,0x7d,0x13,0x7d,0x30,0x9d,0x35,0x12,0x6e,0xf1,0x2d,0x31,0x22,0xc2, +0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, +0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0x7e,0x53,0xd, 0x41,0xa, 0x25,0x3e,0x24, +0x3e,0x24,0xb, 0x38,0x30,0x9d,0x32,0xbe,0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33, +0x22,0x7d,0x41,0x7d,0x12,0x1a,0x26,0x1a,0x24,0x1a,0x2, 0x1a,0x0, 0x12,0x68,0x4c, +0x7d,0x14,0x1a,0x2, 0x1a,0x0, 0x2, 0x68,0xb9,0x7d,0x2, 0xe4,0x7a,0xb3,0xd, 0xd6, +0x7e,0x24,0x2, 0x70,0x12,0x6f,0x1, 0x7d,0x30,0x7e,0x24,0x2, 0x70,0x2, 0x6f,0x1, +0x7d,0x2, 0xe4,0x7a,0xb3,0xd, 0xd5,0x7e,0x24,0x0, 0x4a,0x12,0x6f,0x1, 0x7d,0x30, +0x7e,0x24,0x0, 0x4a,0x2, 0x6f,0x1, 0x7e,0x34,0x10,0x94,0x7e,0x24,0x0, 0xa, 0xe4, +0x12,0x6f,0x1, 0x7e,0x34,0x0, 0x8, 0x7e,0x24,0x0, 0xa, 0x2, 0x6f,0x1, 0x7e,0x34, +0x0, 0x24,0x12,0x5f,0x22,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57, +0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0xc2,0x6, 0x7e,0x73, +0x12,0xf0,0xbe,0x70,0x0, 0x28,0x8, 0x7e,0xb3,0x12,0xef,0x60,0x2, 0xd2,0x6, 0xa2, +0x6, 0x22,0x6c,0x55,0x12,0x60,0x4d,0x40,0x5, 0x12,0x63,0xe4,0x50,0x3, 0x7e,0x50, +0x3, 0x7c,0xb5,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, 0x3, 0x43,0x87,0x2, 0xb4, +0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x12,0xd8,0xe4,0x7a,0xb3,0x12, +0xdf,0x74,0xff,0x7a,0xb3,0x12,0xd7,0x22,0xa, 0x2b,0x19,0x72,0xe, 0x7d,0x7e,0xb3, +0xe, 0xfd,0x44,0x1, 0x7a,0xb3,0xe, 0xfd,0x22,0x6d,0x33,0x7a,0x37,0xe, 0x4, 0x7e, +0x34,0x0, 0x64,0x7a,0x37,0xa, 0x73,0x2, 0x63,0xf8,0x6d,0x33,0x7a,0x37,0xe, 0x4, +0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0x73,0x2, 0x64,0x1b,0x6d,0x33,0x7a,0x37,0xe, +0x4, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0x73,0x2, 0x63,0xf8,0x7e,0x37,0x12,0xeb, +0xbe,0x34,0x0, 0x0, 0x28,0x6, 0x1b,0x34,0x7a,0x37,0x12,0xeb,0x22,0x7d,0x13,0xbd, +0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22,0xc2,0x5, 0x7e, +0xb3,0xf, 0x8, 0xb4,0x1, 0x3, 0xd3,0x80,0x1, 0xc3,0x92,0x5, 0x22,0x74,0x1, 0x7a, +0xb3,0xf, 0xf4,0xe4,0x7a,0xb3,0xf, 0xf3,0x7a,0xb3,0x11,0xe1,0x22,0x70,0x2, 0x80, +0x8, 0xbe,0xb0,0x80,0x50,0x3, 0x2, 0x33,0x4a,0x2, 0x42,0xa6,0x7e,0x34,0x0, 0x21, +0x12,0x5f,0x22,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x12,0x61,0x5a,0x12,0x3a,0xb6, +0x12,0x5d,0x36,0x2, 0x1f,0xa0,0xbe,0xb0,0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x12, +0xd7,0x22,0xe5,0x25,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x66,0x60,0xfc,0x22,0xd2,0xcf, +0xa9,0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xe4,0x7a,0xb3,0xc, 0x41,0x12,0x31, +0xad,0x2, 0x40,0xfb,0xc2,0x7, 0x30,0x3, 0x2, 0xd2,0x7, 0xa2,0x7, 0x22,0x75,0x23, +0x0, 0x75,0x24,0x0, 0x75,0x25,0x0, 0x22,0xa9,0x32,0x99,0x5, 0xd2,0x9c,0xa9,0xd6, +0xdf,0x22,0x7e,0x34,0xb, 0xd2,0xa, 0x2b,0x2, 0x5f,0x74,0x12,0x17,0xc3,0x12,0x64, +0x40,0x2, 0x57,0xf7,0x12,0x63,0xf8,0x53,0x1a,0xfd,0x32,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0x7e,0xb3,0xc, 0xf1,0x2, 0x1f,0xfa,0x12,0x24,0x66,0x2, 0x2e,0x27,0x12, +0x46,0xc9,0x2, 0x22,0x34,0x12,0x0, 0x59,0x2, 0x60,0xfe,0x7e,0x34,0x25,0x4, 0x22, +0x2, 0x61,0xff,0x2, 0x36,0x78,0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20, +0x0, 0x41,0x0, 0x42,0x0, 0x22,0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40, +0x0, 0xa3,0x0, 0xa5,0x0, 0x44,0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60, +0x0, 0xe5,0x0, 0xe8,0x0, 0x66,0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80, +0x1, 0x47,0x1, 0x4b,0x0, 0x88,0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0, +0x1, 0x89,0x1, 0xad,0x0, 0xaa,0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xaa,0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0, +0x1, 0x69,0x1, 0x6c,0x0, 0x88,0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80, +0x1, 0x27,0x1, 0x9, 0x0, 0x66,0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60, +0x0, 0xc5,0x0, 0xc6,0x0, 0x44,0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40, +0x0, 0x83,0x0, 0x64,0x0, 0x22,0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20, +0x0, 0x21,0x0, 0x21,0x0, 0x0, 0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0, +0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0xca,0x79,0x7d,0x73,0x12,0x6c,0xe3,0x49,0x27,0x0, +0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x27,0x7e,0x34,0x1c,0xc, +0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c,0xe, 0x1b,0x38,0x20,0x49,0x27, +0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2d,0x7e,0x34,0x1c, +0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34,0x1c,0x14,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x7e,0x29,0x30, +0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38,0x10,0x9, 0x72,0x0, 0x3, 0xa, +0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, 0x25,0x4d,0x23,0x7e,0x34,0x1c, +0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27,0x7e,0x34,0x1c,0x16,0x1b,0x38, +0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0xa, 0x2a,0x49,0x37, +0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e,0x34,0x1c,0x1e,0x1b,0x38,0x20, +0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, 0x4b,0x2d,0x32,0xb, 0x38,0x20, +0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x19,0x78,0xe4,0x6d,0x22, +0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34, +0x64,0x46,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e,0x24,0x1c,0x22,0x1b,0x28,0x30, +0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x66,0x44,0x7e,0x4, 0x0, 0xff,0xb, +0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x66,0x46,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xe2, +0x7d,0x37,0x12,0x6b,0xda,0x49,0x27,0x0, 0x39,0x7e,0x34,0x1c,0x28,0x1b,0x38,0x20, +0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38,0x20,0x49,0x27,0x0, 0x31,0x7e, +0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33,0x7e,0x34,0x1c,0x2e,0x1b,0x38, +0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x6c,0x8c, +0x49,0x37,0x0, 0x47,0x12,0x6d,0xc1,0x49,0x37,0x0, 0x49,0x49,0x27,0x0, 0xa, 0x9, +0xb7,0x0, 0x1, 0x12,0x6b,0x13,0x49,0x27,0x0, 0x35,0x7e,0x34,0x1c,0x52,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b,0x38,0x20,0x49,0x27,0x0, 0x37, +0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7, +0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5, +0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, +0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, +0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad, +0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22, +0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f, +0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14, +0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d, +0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1, +0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, +0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f, +0x22,0x9f,0x21,0x7f,0x12,0x12,0x68,0x68,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, +0x12,0x68,0x68,0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, +0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xa9,0xd6, +0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5,0xba,0x7e,0x55,0x4b,0xf5,0xbb,0xf5,0xbc, +0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x9, 0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3, +0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c,0xba,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5, +0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5,0xc6,0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6, +0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e, +0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, 0x1a,0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6, +0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c,0xb1,0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50, +0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x69,0x8f,0x43,0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9, +0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xa, 0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75, +0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, 0x75,0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0, +0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, 0x1, 0xa9,0xc6,0xcb,0x22,0x75,0x84,0x1, +0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x12,0xf0, +0xd2,0x0, 0xc2,0x1, 0xd2,0x2, 0xc2,0x3, 0x75,0x3e,0x0, 0x75,0x17,0x1, 0x75,0x18, +0x0, 0x75,0x19,0x0, 0x75,0x1b,0x0, 0x75,0x1c,0x0, 0x75,0x1d,0x0, 0xc2,0x4, 0x75, +0x5c,0x0, 0x75,0x5d,0x64,0x75,0x5e,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x16, +0x0, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x63,0x0, 0x75,0x5f,0x0, 0x75,0x65,0x0, +0x75,0x61,0x18,0x75,0x62,0x0, 0x75,0x66,0x0, 0x75,0x67,0x0, 0x7e,0x4, 0x0, 0xff, +0x7e,0x14,0x6f,0x43,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, +0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b, +0x44,0x78,0xf2,0x80,0xdf,0x2, 0x5a,0xa3,0x7d,0x3, 0x75,0xcc,0x18,0x75,0xcd,0x7, +0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca,0x54,0x1, 0x4c,0xba,0xf5,0xca,0xa9,0xd0, +0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, 0x70,0x0, 0xe, 0x2e,0x70,0xff,0xa9,0x94, +0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c,0xab,0xe5,0xe3,0x54, +0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, 0x13,0x54,0x3, 0xa, 0x5b,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54,0xe7,0x4c,0xba,0xf5,0xe3,0xa9,0xc1,0xe3, +0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x6b,0x77,0x9, 0xb0,0x0, 0x14,0xf5,0xe7,0x22,0x7c, +0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba, +0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2,0x1e,0xb0,0x1e,0xb0, +0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1e,0x50,0x1e,0x50, +0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1, +0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0,0x43,0xc2,0x7, 0x80, +0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0xa9, +0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13,0x2e,0x4, +0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c,0x33,0x80,0x43,0xa, +0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0,0xb, 0x2d,0x3, 0x7e, +0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, +0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c,0xb2,0x1e,0xb0,0x7e, +0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d,0xf, 0x1b,0x48,0x0, +0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, 0x9, 0xb2,0x0, 0xc, +0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54,0x7f,0xf5,0xe5,0x75, +0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4,0xb, 0x6c,0xaa,0xa, +0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39,0xb0,0xf5,0xe5,0x75, +0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4, +0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0x6d,0x11,0x7e,0x24,0x1c,0x1c, +0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0xa3,0x0, 0x50, +0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e,0x19,0x40,0xa, +0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, 0x14,0x1b,0x8, +0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0x49, +0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0xb, 0x50,0xbe, +0x50,0xd, 0x40,0xb1,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7c,0xb3, +0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5,0xc3,0xe5,0xc4, +0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23,0x4e,0x24,0x0, +0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2,0x0, 0x0, 0x0, +0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33, +0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13,0x2e,0x4, 0x1c,0x30,0x1b,0x8, 0x40,0xb, 0x30, +0xa5,0xbb,0x3, 0xec,0x6c,0x33,0x80,0x36,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c, +0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e,0x9, 0x10,0xa, 0xf1,0x60,0x5, +0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e,0x20,0x7e,0x90,0x2, 0xac,0x92, +0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3, +0x38,0xc6,0x22,0x9, 0xa3,0x0, 0x24,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xc1,0xc9,0x80, +0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, 0x9, 0x53,0x0, 0x2, 0x3e,0x50,0xe5,0xca,0x54, +0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0,0xca,0xd2,0xcd,0xbe,0xa0,0x1, 0x78,0x5, 0xa9, +0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9,0x7e,0x14,0x1d,0x0, 0xb, 0x18,0x20,0x5e,0x24, +0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3,0x0, 0x3f,0xb4,0x1, 0xc, 0x75,0xe4,0x32,0x9, +0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5,0xe5,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7, +0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7, +0xf5,0xbc,0x7a,0xa1,0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, +0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6, +0xa, 0x3b,0xe5,0xc6,0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22, +0x75,0x67,0x0, 0x75,0xe4,0x3, 0x49,0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff, +0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24,0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5, +0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4,0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0, +0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea,0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1, +0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, +0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d,0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10, +0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22,0x75,0x66,0x0, 0xa9,0xc6,0xea,0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28, +0x30,0x4e,0x34,0x0, 0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b, +0x28,0x30,0x22,0x1, 0x5e,0x0, 0xf, 0x0, 0xe6,0x1, 0x2c,0x0, 0xe, 0x0, 0xbe,0x0, +0xfa,0x0, 0xc, 0x0, 0x96,0x0, 0xc8,0x0, 0xa, 0x0, 0x78,0x0, 0x78,0x0, 0x8, 0x0, +0x5a,0x0, 0x50,0x0, 0x6, 0x0, 0x2d,0x0, 0x3c,0x0, 0x5, 0x0, 0x15,0x9, 0xb3,0x0, +0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80,0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e, +0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, 0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38, +0x20,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, 0x75,0xe4,0x4, 0x75,0xe5, +0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33, +0x54,0xe0,0xf5,0xe5,0x22,0x75,0x66,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e, +0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34,0x0, 0x1, 0x2, 0x4f,0xf5,0x0, +0x78,0x0, 0x28,0x17,0x0, 0xf0,0x0, 0x3c,0x17,0x1, 0x40,0x0, 0x64,0x17,0x2, 0x26, +0x0, 0x96,0x17,0x3, 0x20,0x0, 0xfa,0x17,0x7d,0x3, 0x80,0xa, 0x7e,0x29,0xb0,0x7a, +0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55,0x78,0xee,0x22,0x75, +0x67,0x1, 0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x4f, +0xf5,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32, +0x22,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5, +0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, +0x4, 0x5, 0xc, 0x17,0x0, 0x6, 0x7, 0x0, 0xb, 0xc, 0x1, 0x2, 0x4, 0x8, 0x10,0x20, +0x40,0x80,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x7e,0x34,0x1, 0x5, 0x22,0x0, +0x1e,0x2, 0xd0,0x0, 0x1, 0xa, 0x70,0xf, 0x0, 0x1, 0xa, 0x71,0x14,0x0, 0x1, 0xa, +0x72,0x3, 0x0, 0x1, 0xc, 0x44,0x80,0x0, 0x1, 0xc, 0x57,0x0, 0x0, 0x9, 0xd, 0x19, +0x2b,0x21,0x31,0x38,0x2b,0x15,0x20,0x2b,0x36,0x0, 0x18,0xd, 0x28,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd, 0x62,0x2, 0x0, 0x18,0xd, 0x8a,0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xd, 0xa2,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xd, 0xaf,0xc, 0xd, 0xe, 0xf, 0x10, +0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, +0x9, 0xa, 0xb, 0x0, 0x1, 0xd, 0xc7,0x0, 0x0, 0xd, 0xd, 0xc8,0xc, 0xb, 0xa, 0x9, +0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0xd, 0xf, 0xb, 0xc, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0xd, 0x0, 0x1, 0xf, 0x21,0xf, 0x0, +0x32,0xf, 0x22,0x0, 0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, +0xed,0x1, 0x4a,0x1, 0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, +0x1f,0x7, 0xc, 0x7, 0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, +0x2d,0xc, 0x6e,0xc, 0x83,0x0, 0x1, 0xf, 0x54,0x14,0x0, 0x1, 0xf, 0x55,0x0, 0x0, +0x1, 0xf, 0xa0,0x0, 0x0, 0x4, 0xf, 0xa2,0xff,0xff,0xff,0xff,0x0, 0x2, 0xf, 0xa6, +0xff,0xf, 0x0, 0x1, 0xf, 0xa8,0x80,0x0, 0x1, 0xf, 0xfb,0x0, 0x0, 0x4, 0xf, 0xfc, +0x23,0x23,0x23,0x2d,0x0, 0x8, 0x0, 0x68,0x8, 0x9a,0x8, 0xca,0x9, 0x2e,0x9, 0x5e, +0x0, 0x14,0x0, 0x70,0xa, 0x70,0xf, 0x21,0xa, 0x71,0xf, 0x54,0xe, 0x3a,0xe, 0x3a, +0xa, 0x72,0xf, 0x55,0xc, 0x44,0xf, 0xa8,0x0, 0x1, 0x0, 0xcc,0x0, 0x0, 0x8, 0x0, +0xcf,0x8, 0x50,0x8, 0x80,0x8, 0xe4,0x9, 0x14,0x0, 0x1, 0x12,0x84,0xff,0x0, 0x2, +0x12,0x85,0x0, 0x0, 0x0, 0x5, 0x10,0x71,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e,0x10, +0x76,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x4, 0x10,0x9e,0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x10,0xa2,0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0x10,0xcb,0x0, 0x0, 0x4, 0x10,0xcc,0x0, 0x0, 0x0, 0x0, 0x0, 0x10,0x10,0xd0, +0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2,0x8, +0x0, 0x1, 0x12,0xe1,0x0, 0x0, 0x1, 0x12,0xe3,0x0, 0x0, 0x1, 0x0, 0xf3,0x0, 0x0, +0x1, 0x0, 0xe1,0x1, 0x0, 0x10,0x0, 0xe2,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xf2,0xff,0x0, 0x2, 0x12, +0xe9,0x0, 0x0, 0x0, 0x2, 0x12,0xeb,0x0, 0x0, 0x0, 0x2, 0x12,0xed,0x0, 0x0, 0x0, +0x1, 0x12,0xf0,0x0, 0x0, 0x5, 0x11,0x26,0x14,0x1d,0x26,0x2f,0x36,0x0, 0x1, 0x11, +0xdf,0x3, 0x0, 0x1, 0x11,0xe0,0x0, 0x0, 0x1, 0x11,0xe1,0x0, 0x0, 0x1, 0x11,0xe2, +0x0, 0x0, 0x1, 0x0, 0xf5,0x0, 0x0, 0x1, 0x12,0xb4,0x0, 0x0, 0x0, 0x53,0x5a,0x1e, +0xe1,0xff,0xff,0x71,0x6d,0x8e,0x92,0x6f,0x90,0x1a,0x51, \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/touchpanel/FT5436I_Ref_V0x18_20150915_app.i b/arch/arm/mach-mt8127/ford/touchpanel/FT5436I_Ref_V0x18_20150915_app.i new file mode 100644 index 00000000000..2232b61a930 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/FT5436I_Ref_V0x18_20150915_app.i @@ -0,0 +1,1794 @@ +0x2, 0x68,0x61,0x2, 0x62,0xc2,0x7e,0xb3,0xf, 0x1e,0xb4,0x1, 0x4, 0xe4,0x12,0xf, +0xf8,0xe4,0x7a,0xb3,0xe, 0x3a,0x7a,0xb3,0xe, 0x4b,0x22,0x2, 0x4b,0xc6,0xe5,0x18, +0xc4,0x54,0x7, 0xb4,0x2, 0x3, 0x74,0x1, 0x22,0xe4,0x22,0x2, 0x61,0x44,0xc2,0x8e, +0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2, +0x8e,0x22,0x22,0x2, 0x62,0x7f,0x7e,0x34,0xe, 0x28,0x12,0x68,0xec,0x7e,0x34,0xe, +0x28,0x12,0x6c,0x24,0xe5,0x65,0x60,0xfc,0x22,0x22,0x22,0x2, 0x58,0x0, 0x7c,0xab, +0x4c,0x77,0x7e,0x34,0xb, 0xd2,0xa, 0x2a,0x68,0x3, 0x2, 0x2f,0xdd,0x2, 0x5d,0x23, +0x2, 0x4f,0xc8,0x2, 0x5b,0x8c,0xca,0x3b,0x7c,0xe7,0x7c,0xdb,0x75,0x40,0x0, 0x7e, +0x83,0xc, 0xdf,0x4c,0x88,0x78,0xe, 0x7e,0x34,0x10,0x6a,0x7e,0x24,0x0, 0x5, 0xe4, +0x12,0x6d,0xa5,0xc1,0x7e,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x33,0xc, 0xcb, +0xbe,0x34,0xff,0xff,0x78,0x7, 0xe4,0xa, 0x3a,0x19,0xb3,0x10,0x6a,0xb, 0xa0,0xbe, +0xa0,0x5, 0x78,0xe3,0x6c,0xaa,0x80,0x43,0x7e,0x70,0x7, 0xac,0x7a,0x9, 0x93,0xc, +0x5c,0x49,0x83,0xc, 0x58,0x49,0x93,0xc, 0x5a,0xa, 0x39,0x9, 0xb3,0x10,0x6a,0x70, +0x28,0x6c,0x77,0x7e,0x30,0x14,0xac,0x39,0x7e,0x50,0x4, 0xac,0x57,0x2d,0x21,0x59, +0x82,0x10,0x6, 0x7e,0x30,0x14,0xac,0x39,0x7e,0x50,0x4, 0xac,0x57,0x2d,0x21,0x59, +0x92,0x10,0x8, 0xb, 0x70,0xa5,0xbf,0x5, 0xda,0xb, 0xa0,0xbc,0x8a,0x38,0xb9,0x9f, +0x11,0x7a,0x1f,0x10,0x9c,0x7a,0x1f,0x10,0xa0,0x7a,0x1f,0x10,0xca,0x74,0x7, 0xac, +0xbe,0x49,0x35,0xc, 0x58,0x49,0x25,0xc, 0x5a,0x74,0x7, 0xac,0xbd,0x49,0x15,0xc, +0x7b,0x49,0x5, 0xc, 0x7d,0x12,0x60,0x6e,0x7d,0xf3,0x74,0x7, 0xac,0xbd,0x9, 0xf5, +0xc, 0x7f,0xbe,0xf0,0x5, 0x40,0x2, 0x6c,0xff,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, +0x58,0x49,0x25,0xc, 0x5a,0x74,0x4, 0xac,0xbf,0x49,0x15,0x10,0xa4,0x49,0x5, 0x10, +0xa6,0x12,0x60,0x6e,0x7d,0x3f,0x6d,0x22,0x7e,0x33,0x10,0xc5,0xa, 0x13,0x6d,0x0, +0x12,0x66,0xf0,0x7e,0x17,0xd, 0x55,0x12,0x67,0xa, 0x7d,0xf3,0x7e,0x73,0x10,0xc6, +0xa, 0xe7,0xbd,0xef,0x28,0x2, 0x7d,0xfe,0x75,0x40,0x0, 0x6c,0xcc,0x7e,0x90,0x14, +0xac,0x9f,0x49,0x24,0x10,0xa, 0x49,0x34,0x10,0xe, 0xbd,0x32,0x78,0xe, 0x49,0x54, +0x10,0xc, 0x49,0x34,0x10,0x10,0xbd,0x35,0x78,0x2, 0xa1,0x60,0x7e,0xb3,0x10,0xc3, +0xf5,0x41,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, 0x58,0x1e,0x34,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x9d,0x32,0x12,0x6d,0x95,0x1a,0x26,0x1a,0x24,0x7a,0x1f,0x10,0x9c,0x74, +0x7, 0xac,0xbe,0x49,0x35,0xc, 0x5a,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x74, +0x14,0xac,0xbf,0x49,0x25,0x10,0xc, 0x9d,0x32,0x12,0x6d,0x95,0x1a,0x26,0x1a,0x24, +0x7a,0x1f,0x10,0xa0,0x7d,0x13,0x7e,0x1f,0x10,0x9c,0x7d,0xe3,0x2d,0xe1,0x7a,0xe7, +0xf, 0xfe,0xbe,0xe4,0x0, 0x4, 0x8, 0x74,0xbe,0x18,0x0, 0x0, 0x78,0x6, 0xb, 0x1c, +0x7a,0x1f,0x10,0x9c,0x7e,0x1f,0x10,0xa0,0xbe,0x18,0x0, 0x0, 0x78,0xa, 0x7e,0x1f, +0x10,0xa0,0xb, 0x1c,0x7a,0x1f,0x10,0xa0,0x7e,0xe4,0x0, 0x64,0x7e,0x6f,0x10,0xa0, +0x7f,0x16,0x7d,0x1e,0x12,0x67,0x1, 0x7e,0x5f,0x10,0x9c,0x7f,0x5, 0x12,0x67,0x5d, +0x7f,0x1, 0x7a,0xf, 0x10,0xca,0xe5,0x41,0xa, 0x3b,0x6d,0x22,0xbf,0x10,0x8, 0x4, +0xb, 0xc0,0x80,0x28,0x7e,0x1f,0x10,0xca,0xbe,0x18,0x0, 0x64,0x8, 0x1e,0x7f,0x15, +0x7d,0x1e,0x12,0x67,0x1, 0x7f,0x6, 0x12,0x67,0x5d,0x7f,0x1, 0x7a,0xf, 0x10,0xca, +0xe5,0x41,0xa, 0x3b,0x6d,0x22,0xbf,0x10,0x8, 0x2, 0x5, 0x40,0x74,0x14,0xac,0xbf, +0x49,0x25,0x10,0xa, 0x49,0x35,0x10,0xe, 0x9d,0x32,0x12,0x6d,0x95,0x1a,0x26,0x1a, +0x24,0x7a,0x1f,0x10,0x9c,0x74,0x14,0xac,0xbf,0x49,0x25,0x10,0xc, 0x49,0x35,0x10, +0x10,0x9d,0x32,0x12,0x6d,0x95,0x1a,0x26,0x1a,0x24,0x7a,0x1f,0x10,0xa0,0x7e,0x1f, +0x10,0x9c,0xbe,0x18,0x0, 0x0, 0x78,0x6, 0xb, 0x1c,0x7a,0x1f,0x10,0x9c,0x7e,0x1f, +0x10,0xa0,0xbe,0x18,0x0, 0x0, 0x78,0x6, 0xb, 0x1c,0x7a,0x1f,0x10,0xa0,0x7e,0xe4, +0x0, 0x64,0x7e,0x6f,0x10,0xa0,0x7f,0x16,0x7d,0x1e,0x12,0x67,0x1, 0x7e,0x5f,0x10, +0x9c,0x7f,0x5, 0x12,0x67,0x5d,0x7f,0x1, 0x7a,0xf, 0x10,0xca,0xe5,0x41,0xa, 0x3b, +0x6d,0x22,0xbf,0x10,0x8, 0x4, 0xb, 0xc0,0x80,0x28,0x7e,0x1f,0x10,0xca,0xbe,0x18, +0x0, 0x64,0x8, 0x1e,0x7f,0x15,0x7d,0x1e,0x12,0x67,0x1, 0x7f,0x6, 0x12,0x67,0x5d, +0x7f,0x1, 0x7a,0xf, 0x10,0xca,0xe5,0x41,0xa, 0x3b,0x6d,0x22,0xbf,0x10,0x8, 0x2, +0x5, 0x40,0x74,0x14,0xac,0xbf,0x49,0x35,0x10,0x12,0x49,0x25,0x10,0x14,0x49,0x15, +0x10,0xa, 0x49,0x5, 0x10,0xc, 0x12,0x60,0x6e,0x7a,0x37,0x10,0x4, 0xbe,0x37,0xf, +0xfe,0x8, 0x2, 0xa1,0x4d,0xe5,0x41,0xa, 0xeb,0xbe,0xe7,0x10,0xb8,0x7e,0x1f,0x10, +0xca,0x40,0x13,0x2e,0x18,0x0, 0xf, 0x7d,0x1f,0x12,0x67,0x1, 0x2f,0x11,0x2f,0x11, +0x7e,0x8, 0x0, 0x55,0x80,0x11,0x2e,0x18,0x0, 0xf, 0x7d,0x1f,0x12,0x67,0x1, 0x2f, +0x11,0x2f,0x11,0x7e,0x8, 0x0, 0x46,0x12,0x67,0x5d,0x7a,0x1f,0x10,0xca,0xe5,0x40, +0x60,0x2, 0xa1,0x1, 0x4c,0xcc,0x68,0x2, 0xa1,0x1, 0x74,0x14,0xac,0xbf,0x49,0x35, +0x10,0xa, 0x6d,0x22,0x49,0x15,0x10,0x12,0x6d,0x0, 0x9f,0x1, 0x7a,0xf, 0x10,0x9c, +0x7e,0x37,0xf, 0xfe,0x7d,0x21,0x7e,0x17,0x10,0x4, 0x12,0x60,0xb9,0x7d,0x13,0x1a, +0x2, 0x1a,0x0, 0x7a,0xf, 0x10,0x0, 0x74,0x14,0xac,0xbf,0x49,0x35,0x10,0xa, 0x6d, +0x22,0x2f,0x10,0x7a,0x1f,0x10,0x0, 0x7e,0x14,0x0, 0x10,0x7e,0x1f,0x10,0x0, 0x12, +0x67,0x1, 0x7a,0x1f,0x10,0x0, 0x74,0x7, 0xac,0xbe,0x49,0x15,0xc, 0x58,0x6d,0x0, +0x7e,0x1f,0x10,0x0, 0x2f,0x10,0x7a,0x1f,0x10,0x0, 0xbe,0x18,0x0, 0x0, 0x48,0x1d, +0x74,0x6, 0xac,0xbf,0x49,0xe5,0x10,0x78,0x4d,0xee,0x78,0x11,0x7e,0x8, 0x0, 0x2, +0x12,0x67,0x5d,0x7d,0xe3,0x74,0x7, 0xac,0xbe,0x59,0xe5,0xc, 0x58,0x74,0x14,0xac, +0xbf,0x49,0x35,0x10,0xc, 0x6d,0x22,0x49,0x15,0x10,0x14,0x6d,0x0, 0x9f,0x1, 0x7a, +0xf, 0x10,0xa0,0x7e,0x37,0xf, 0xfe,0x7d,0x21,0x7e,0x17,0x10,0x4, 0x12,0x60,0xb9, +0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x7a,0xf, 0x10,0x0, 0x74,0x14,0xac,0xbf,0x49,0x35, +0x10,0xc, 0x6d,0x22,0x2f,0x10,0x7a,0x1f,0x10,0x0, 0x7e,0x14,0x0, 0x10,0x7e,0x1f, +0x10,0x0, 0x12,0x67,0x1, 0x7a,0x1f,0x10,0x0, 0x74,0x7, 0xac,0xbe,0x49,0x15,0xc, +0x5a,0x6d,0x0, 0x7e,0x1f,0x10,0x0, 0x2f,0x10,0x7a,0x1f,0x10,0x0, 0xbe,0x18,0x0, +0x0, 0x48,0x1d,0x74,0x6, 0xac,0xbf,0x49,0xe5,0x10,0x78,0x4d,0xee,0x78,0x11,0x7e, +0x8, 0x0, 0x2, 0x12,0x67,0x5d,0x7d,0xe3,0x74,0x7, 0xac,0xbe,0x59,0xe5,0xc, 0x5a, +0x7e,0x90,0x6, 0xac,0x9f,0x49,0x54,0x10,0x74,0x4d,0x55,0x78,0x14,0x7e,0x1f,0x10, +0x9c,0x7d,0x53,0x59,0x54,0x10,0x74,0x7e,0x1f,0x10,0xa0,0x7d,0x53,0x59,0x54,0x10, +0x76,0x49,0x34,0x10,0x74,0x1a,0x26,0x1a,0x24,0x7e,0x6f,0x10,0x9c,0x7f,0x6, 0x12, +0x66,0xf0,0xbe,0x18,0x0, 0x0, 0x48,0x15,0x49,0x34,0x10,0x76,0x1a,0x26,0x1a,0x24, +0x7e,0xf, 0x10,0xa0,0x12,0x66,0xf0,0xbe,0x18,0x0, 0x0, 0x58,0x34,0x74,0x6, 0xac, +0xbf,0x49,0xe5,0x10,0x78,0xbe,0xe4,0x0, 0x3, 0x58,0xe, 0x7e,0x70,0x6, 0xac,0x7f, +0x2e,0x34,0x10,0x78,0xb, 0xe4,0x1b,0x38,0xe0,0x7d,0xed,0x74,0x6, 0xac,0xbf,0x59, +0xe5,0x10,0x74,0x7e,0x1f,0x10,0xa0,0x7d,0xe3,0x74,0x6, 0xac,0xbf,0x59,0xe5,0x10, +0x76,0xe5,0x40,0xbe,0xb0,0x2, 0x40,0xe, 0x74,0x6, 0xac,0xbf,0x49,0x45,0x10,0x78, +0xbe,0x44,0x0, 0x2, 0x48,0x5, 0x75,0x40,0x0, 0x80,0xc, 0x4d,0x44,0x78,0x8, 0x7e, +0xe4,0x0, 0x1, 0x59,0xe5,0x10,0x78,0xbe,0xc0,0x2, 0x40,0xf, 0x7e,0x70,0x6, 0xac, +0x7f,0x49,0x23,0x10,0x78,0xbe,0x24,0x0, 0x2, 0x48,0x4, 0x6c,0xcc,0x80,0x33,0x4d, +0x22,0x78,0x2f,0x7e,0xe4,0x0, 0x1, 0x59,0xe3,0x10,0x78,0x80,0x25,0x7e,0xe4,0x0, +0x2, 0x74,0x6, 0xac,0xbf,0x59,0xe5,0x10,0x78,0x75,0x40,0x0, 0x6c,0xcc,0x80,0x12, +0x6d,0xee,0x74,0x6, 0xac,0xbf,0x59,0xe5,0x10,0x74,0x59,0xe5,0x10,0x76,0x59,0xe5, +0x10,0x78,0xbe,0xf4,0x1, 0x0, 0x28,0x4, 0x7e,0xf4,0x1, 0x0, 0x74,0x7, 0xac,0xbd, +0x49,0x25,0xc, 0x7b,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, 0x58,0x9d,0x32,0x12,0x6d, +0x95,0x7d,0x13,0xe5,0x40,0x60,0x1f,0x7e,0x2f,0x10,0xca,0x7d,0x31,0x6d,0x22,0x7f, +0x2, 0x12,0x66,0xf0,0x74,0xa, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14, +0x78,0xf4,0x7d,0x13,0x80,0xc, 0x7d,0x31,0xad,0x3f,0x7c,0x76,0x7c,0x65,0xa, 0x24, +0x7d,0x13,0x7e,0x70,0x7, 0xac,0x7d,0x49,0x3, 0xc, 0x7b,0x74,0x7, 0xac,0xbe,0x49, +0x25,0xc, 0x58,0xbd,0x20,0x7d,0xe3,0x28,0xd, 0x2e,0xe4,0xc, 0x7b,0x7d,0x20,0x2d, +0x21,0x1b,0xe8,0x20,0x80,0x9, 0x2e,0xe4,0xc, 0x7b,0x9d,0x1, 0x1b,0xe8,0x0, 0x74, +0x7, 0xac,0xbd,0x49,0x25,0xc, 0x7d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xc, 0x5a,0x9d, +0x32,0x12,0x6d,0x95,0x7d,0x13,0x4c,0xcc,0x68,0x1f,0x7e,0x2f,0x10,0xca,0x7d,0x31, +0x6d,0x22,0x7f,0x2, 0x12,0x66,0xf0,0x74,0xa, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e, +0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x80,0xc, 0x7d,0x31,0xad,0x3f,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7d,0x13,0x7e,0x10,0x7, 0xac,0x1d,0x49,0x30,0xc, 0x7d,0x74,0x7, +0xac,0xbe,0x49,0x25,0xc, 0x5a,0xbd,0x23,0x28,0xd, 0x2e,0x4, 0xc, 0x7d,0x7d,0x23, +0x2d,0x21,0x1b,0x8, 0x20,0x80,0xe, 0x7e,0x50,0x7, 0xac,0x5d,0x2e,0x24,0xc, 0x7d, +0x9d,0x31,0x1b,0x28,0x30,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xc, 0x58,0x74,0x4, +0xac,0xbf,0x59,0x35,0x10,0xa4,0x49,0x34,0xc, 0x5a,0x59,0x35,0x10,0xa6,0xda,0x3b, +0x22,0xca,0xd8,0xca,0x79,0x6d,0xff,0x7e,0xb3,0xc, 0xdf,0x70,0x2, 0xe1,0x46,0x7e, +0xb3,0xc, 0xe0,0x60,0x2, 0xe1,0x46,0x7e,0xf3,0xb, 0x96,0x7e,0xd3,0xb, 0x97,0x6d, +0x0, 0x6c,0xee,0x6c,0xaa,0xa, 0x4d,0x80,0x39,0x7e,0x30,0x18,0xac,0x3f,0x2d,0x14, +0x3e,0x14,0x2e,0x17,0xd, 0xdb,0xb, 0x18,0xe0,0xbe,0xe4,0x0, 0x3c,0x8, 0x29,0xb, +0xe0,0xbe,0xf0,0x0, 0x28,0xd, 0x7d,0xe1,0x9e,0xe4,0x0, 0x30,0xb, 0xe8,0xe0,0x2d, +0xe, 0xb, 0xa0,0xbe,0xf0,0xc, 0x50,0x8, 0x49,0xe1,0x0, 0x30,0x2d,0xe, 0xb, 0xa0, +0x1b,0x44,0xbe,0x44,0x0, 0x0, 0x58,0xc1,0xa, 0x4d,0x80,0x37,0x7e,0x30,0x18,0xac, +0x3f,0x2d,0x14,0x3e,0x14,0x2e,0x17,0xd, 0xdb,0xb, 0x18,0xe0,0xbe,0xe4,0x0, 0x3c, +0x8, 0x2d,0xb, 0xe0,0xbe,0xf0,0x0, 0x28,0xd, 0x7d,0xe1,0x9e,0xe4,0x0, 0x30,0xb, +0xe8,0xe0,0x2d,0xe, 0xb, 0xa0,0xbe,0xf0,0xc, 0x50,0x8, 0x49,0xe1,0x0, 0x30,0x2d, +0xe, 0xb, 0xa0,0x7d,0xe4,0xb, 0xe4,0x7d,0x4e,0xbe,0xe4,0x0, 0x18,0x48,0xbd,0xbe, +0xe0,0x3, 0x50,0x2, 0x80,0x10,0x7d,0x30,0x12,0x6d,0x95,0xa, 0x2a,0x12,0x66,0xbe, +0xbe,0x34,0x0, 0xf, 0x8, 0x6, 0x75,0x13,0x0, 0xe4,0x80,0x7f,0x6d,0xee,0x7e,0x30, +0x18,0xac,0x3f,0xa, 0x3d,0x2d,0x13,0x3e,0x14,0x2e,0x17,0xd, 0xdb,0xbe,0xf0,0x0, +0x28,0xb, 0x7d,0x31,0x9e,0x34,0x0, 0x30,0xb, 0x38,0x30,0x2d,0xe3,0xbe,0xf0,0xc, +0x50,0x6, 0x49,0x31,0x0, 0x30,0x2d,0xe3,0x7e,0x70,0x8, 0x80,0x1c,0x7e,0x50,0x2, +0xac,0x57,0x9, 0x62,0x10,0xce,0x1a,0x26,0xbd,0x2e,0x8, 0xd, 0x7e,0x50,0x2, 0xac, +0x57,0x9, 0x62,0x10,0xcf,0x1a,0x26,0x2d,0xf2,0x7c,0x67,0x1b,0x70,0xa5,0xbe,0x0, +0xdc,0xb, 0x18,0x30,0x12,0x6d,0x95,0xbe,0x34,0x3, 0xe8,0x8, 0x4, 0x2e,0xf4,0x0, +0x28,0xbe,0xf4,0x0, 0xfa,0x28,0x4, 0x7e,0xf4,0x0, 0xfa,0xe5,0x13,0xa, 0xeb,0xbd, +0xef,0x50,0x6, 0x7d,0x3f,0x7c,0xb7,0xf5,0x13,0xe5,0x13,0xda,0x79,0xda,0xd8,0x22, +0x6d,0x33,0x7a,0x37,0xf, 0x16,0x74,0x1, 0x7a,0xb3,0xf, 0x18,0x74,0x8, 0x7a,0xb3, +0xf, 0x19,0x74,0xc, 0x7a,0xb3,0xf, 0x1a,0x74,0x1e,0x7a,0xb3,0xf, 0x1b,0x7a,0xb3, +0xf, 0x1c,0x74,0xa, 0x7a,0xb3,0xf, 0x1d,0x74,0x1, 0x7a,0xb3,0xf, 0x1e,0x22,0xff, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x46,0xc, 0x75,0x47,0x0, +0x75,0x48,0x17,0x75,0x49,0x0, 0x7e,0x34,0x11,0xe7,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6d,0xa5,0x75,0x3f,0x0, 0x1, 0xe5,0x7e,0x71,0x3f,0x74,0x2, 0xac,0x7b,0x9, 0xb3, +0xb, 0x96,0xf5,0x40,0x9, 0x73,0xb, 0x97,0x7a,0x71,0x41,0x7c,0xab,0x1b,0xa1,0x7a, +0xa1,0x42,0xb, 0xb1,0xf5,0x43,0x7c,0xb7,0x24,0xfe,0xf5,0x44,0x7c,0xb7,0xb, 0xb1, +0xf5,0x45,0xbe,0xa0,0x0, 0x58,0x3, 0x75,0x42,0x0, 0x7e,0xa3,0xe, 0x28,0xa, 0x2a, +0x1b,0x24,0xe5,0x43,0x1a,0x3b,0xbd,0x32,0x8, 0x5, 0x7c,0xba,0x14,0xf5,0x43,0xe5, +0x44,0xbe,0xb0,0x0, 0x58,0x3, 0x75,0x44,0x0, 0x7e,0xa3,0xe, 0x29,0xa, 0x2a,0x1b, +0x24,0xe5,0x45,0x1a,0x3b,0xbd,0x32,0x8, 0x5, 0x7c,0xba,0x14,0xf5,0x45,0xe5,0x42, +0xbe,0xb1,0x46,0x58,0x3, 0x85,0x42,0x46,0xe5,0x43,0xbe,0xb1,0x47,0x8, 0x3, 0x85, +0x43,0x47,0xe5,0x44,0xbe,0xb1,0x48,0x58,0x3, 0x85,0x44,0x48,0xe5,0x45,0xbe,0xb1, +0x49,0x8, 0x3, 0x85,0x45,0x49,0x7e,0xf1,0x42,0x80,0x22,0x7e,0xe1,0x44,0x80,0x15, +0x7e,0x34,0x11,0xe7,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x1a,0x2e,0x2d,0x21, +0x12,0x2f,0xdd,0xb, 0xe0,0xe5,0x45,0xbc,0xbe,0x58,0xe5,0xb, 0xf0,0xe5,0x43,0xbc, +0xbf,0x58,0xd8,0x5, 0x3f,0x7e,0x73,0xc, 0x3d,0xbe,0x71,0x3f,0x28,0x2, 0x1, 0x27, +0xbe,0x70,0x0, 0x38,0x2, 0x81,0x8a,0x7e,0xe1,0x48,0x81,0x82,0x6c,0xff,0x80,0x1f, +0x1a,0x3e,0x3e,0x34,0x1a,0x2f,0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36, +0xb, 0x38,0x30,0xe, 0x34,0xe, 0x34,0x3e,0x24,0x59,0x32,0x11,0xcd,0xb, 0xf0,0x7e, +0x73,0xe, 0x28,0xbc,0x7f,0x18,0xd9,0x7e,0xf1,0x46,0x81,0x78,0x7e,0x34,0x11,0xe7, +0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x1a,0x2e,0x2d,0x21,0x12,0x5e,0x2d,0x70, +0x2, 0x81,0x76,0x1a,0xf, 0x7d,0x10,0x3e,0x14,0x49,0x31,0x11,0xc7,0x7a,0x35,0x4c, +0x49,0x31,0x11,0xc9,0x7a,0x35,0x4e,0x49,0x31,0x11,0xcb,0x7a,0x35,0x50,0x49,0x31, +0x11,0xcd,0x7a,0x35,0x52,0x49,0x31,0x11,0xcf,0x7a,0x35,0x54,0x49,0x31,0x11,0xd1, +0x7a,0x35,0x56,0x49,0x11,0x11,0xd3,0x7a,0x15,0x58,0xbe,0xf0,0x3, 0x48,0x6b,0x7e, +0x73,0xe, 0x28,0xa, 0x17,0x1b,0x16,0xbd,0x1, 0x18,0x5f,0x7e,0x35,0x56,0x2e,0x35, +0x4e,0x7d,0x23,0x3e,0x24,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x15,0x58, +0x2e,0x15,0x4c,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x32,0x7e,0x25,0x54,0x2e,0x25, +0x50,0x7d,0x12,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x21,0x9d,0x32,0x7e,0x15,0x52,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x7d,0x21,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x9d,0x25,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x81,0x4d,0x4c,0xff,0x78,0x50,0x7e,0x35, +0x52,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x7d,0x23,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x3e,0x34,0x2d,0x32,0x2e, +0x35,0x52,0x7e,0x25,0x54,0x7d,0x12,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d, +0x31,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x7e,0x15,0x56,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x13,0x9e,0x15,0x56,0x7e,0x35,0x58,0x3e,0x34,0x61,0xf4,0xbe,0xf0, +0x1, 0x78,0x5b,0x7e,0x25,0x50,0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x23,0x7e,0x35,0x52,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x9d,0x31,0x9d,0x32,0x7e,0x25,0x54,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x9d,0x32,0x7e,0x15,0x56,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2e, +0x15,0x56,0x2d,0x13,0x7e,0x35,0x58,0x3e,0x34,0x2e,0x35,0x58,0x61,0xf4,0xbe,0xf0, +0x2, 0x78,0x72,0x7e,0x25,0x52,0x7d,0x12,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x9d,0x31,0x3e,0x24,0x3e,0x24,0x2d,0x23,0x7e,0x15,0x50,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x2e,0x15,0x50,0x7e,0x35,0x4e,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x9e,0x35,0x4e,0x9d,0x31,0x2d,0x32,0x7e,0x25,0x54,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x2e,0x25,0x54,0x9d,0x32,0x7e,0x15,0x56,0x7d,0x21,0x3e, +0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x2d,0x13,0x7e,0x35,0x58,0x3e,0x34, +0x2e,0x35,0x58,0x61,0xf4,0x7e,0xa3,0xe, 0x28,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x78, +0x72,0x7e,0x25,0x4e,0x7d,0x32,0x3e,0x34,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x23, +0x7e,0x35,0x4c,0x3e,0x34,0x2e,0x35,0x4c,0x9d,0x23,0x7e,0x35,0x50,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2e,0x35,0x50,0x9d,0x23,0x7e,0x35,0x52,0x7d, +0x43,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x14,0x3e,0x34,0x3e,0x34,0x2d, +0x31,0x2d,0x32,0x7e,0x25,0x54,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x2e,0x25,0x54,0x9d,0x32,0x7e,0x15,0x56,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9e,0x15, +0x56,0x81,0x4d,0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x5d,0x7e,0x25,0x4c,0x3e,0x24, +0x2e,0x25,0x4c,0x7e,0x35,0x4e,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2e,0x35,0x4e,0x9d, +0x32,0x7e,0x25,0x50,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32, +0x7e,0x15,0x52,0x7d,0x21,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x12,0x2d,0x13,0x7e, +0x35,0x54,0x7d,0x23,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x2d,0x32,0x9d,0x13,0x80,0x57,0x7c,0xba,0x14,0xbc,0xbf,0x78,0x53,0x7e, +0x35,0x4e,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9e,0x35,0x4e,0x7e,0x25,0x4c,0x3e,0x24, +0x9d,0x32,0x7e,0x25,0x50,0x7d,0x12,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x9d,0x32,0x7e,0x15,0x52,0x7d,0x51,0x3e,0x54, +0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7d,0x21,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x25,0x3e,0x14,0x2d,0x12,0x2e,0x15,0x52,0x2d,0x13,0x7a, +0x15,0x4a,0x7e,0x25,0x4a,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, +0x24,0x3e,0x24,0x3e,0x24,0x1a,0x3e,0x3e,0x34,0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d, +0x31,0x2d,0x36,0x1b,0x38,0x20,0xb, 0xf0,0xe5,0x47,0xbc,0xbf,0x48,0x2, 0x21,0x2c, +0xb, 0xe0,0xe5,0x49,0xbc,0xbe,0x48,0x2, 0x1, 0xfc,0xda,0x3b,0x22,0xca,0x3b,0x75, +0x41,0x0, 0x6c,0xcc,0x6c,0xdd,0x7e,0xc4,0xff,0xff,0x75,0x43,0xff,0x7e,0xb3,0xc, +0x3d,0x7e,0xe7,0xd, 0x4c,0xb4,0x1, 0x4, 0x1e,0xe4,0x80,0x0, 0x1e,0xe4,0x1e,0xe4, +0x2e,0xe7,0xd, 0x4c,0xf5,0x3f,0x7e,0xf7,0xd, 0xdb,0x7e,0x34,0x11,0xeb,0x7e,0x24, +0x0, 0x1e,0xe4,0x12,0x6d,0xa5,0x7e,0x31,0x3f,0x74,0x2, 0xac,0x3b,0x7e,0x24,0xb, +0x96,0x7e,0x34,0x11,0xcd,0x12,0x6d,0x6c,0x75,0x40,0x0, 0x6c,0xee,0xc1,0x3f,0x7e, +0x14,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0xff,0xa1,0xa8,0x74,0x2, 0xac,0xbf,0x9, 0xb5, +0x11,0xcd,0xbe,0xb0,0xff,0x78,0x2, 0xa1,0xa6,0x7c,0xbf,0x12,0x62,0xb0,0x70,0x2, +0xa1,0xa6,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x11,0xce,0xa, 0x27,0x74,0x2, 0xac,0xbe, +0x9, 0x75,0x12,0x51,0xa, 0x37,0x9d,0x32,0x12,0x6d,0x95,0x7d,0x3, 0x74,0x2, 0xac, +0xbf,0x9, 0x75,0x11,0xcd,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x12,0x50,0xa, +0x37,0x9d,0x32,0x12,0x6d,0x95,0x2d,0x3, 0xbd,0x10,0x40,0x6a,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x11,0xcd,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x12,0x50,0xa, 0x37, +0x9d,0x32,0x12,0x6d,0x95,0xbe,0x34,0x0, 0x3, 0x18,0x4b,0x74,0x2, 0xac,0xbf,0x9, +0x75,0x11,0xce,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x12,0x51,0xa, 0x37,0x9d, +0x32,0x12,0x6d,0x95,0xbe,0x34,0x0, 0x3, 0x18,0x2c,0xbd,0x10,0x78,0x21,0x7d,0x10, +0x7a,0xe1,0x42,0x7c,0xbc,0x12,0x5f,0x5f,0x7d,0x43,0x7c,0xbf,0x12,0x5f,0x5f,0xbd, +0x34,0x8, 0x7, 0x7a,0xc1,0x43,0x7c,0xcf,0x80,0xc, 0x7a,0xf1,0x43,0x80,0x7, 0x7d, +0x10,0x7c,0xcf,0x7a,0xe1,0x42,0xb, 0xf0,0xe5,0x3f,0xbc,0xbf,0x28,0x2, 0x81,0xea, +0xbe,0xc0,0xff,0x78,0x2, 0xc1,0x3d,0xe5,0x42,0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7d,0x23,0x5d,0x2c,0x68,0x2d,0x7e,0x50,0x2, 0xac,0x5c,0x9, +0x12,0x11,0xcd,0x74,0x2, 0xac,0xbd,0x19,0x15,0x11,0xeb,0x9, 0x12,0x11,0xce,0x19, +0x15,0x11,0xec,0x74,0xff,0x19,0xb2,0x11,0xcd,0x5, 0x40,0xb, 0xd0,0x7e,0x24,0xff, +0xff,0x9d,0x23,0x5d,0xc2,0x80,0x46,0x7e,0x90,0x2, 0xac,0x9c,0x9, 0x14,0x11,0xcd, +0x7e,0x50,0x18,0xac,0x51,0x9, 0xa4,0x11,0xce,0xa, 0xba,0x2d,0x2b,0x3e,0x24,0x2d, +0x2f,0xb, 0x28,0x20,0xbd,0x2e,0x40,0x25,0x7e,0x50,0x2, 0xac,0x5d,0x19,0x12,0x11, +0xeb,0x19,0xa2,0x11,0xec,0x7e,0xa0,0xff,0x7e,0x50,0x2, 0xac,0x5c,0x19,0xa2,0x11, +0xcd,0x5, 0x40,0xb, 0xd0,0x7e,0x4, 0xff,0xff,0x9d,0x3, 0x5d,0xc0,0xb, 0xe0,0xe5, +0x1d,0xbc,0xbe,0x28,0x2, 0x81,0xdf,0xbe,0xd1,0x1d,0x50,0x2, 0xc1,0xfd,0x7e,0xe1, +0x40,0xc1,0xf6,0x6d,0xdd,0x7e,0x30,0xff,0x6c,0xff,0x80,0x4a,0x7c,0xbf,0x12,0x62, +0xb0,0x60,0x41,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xa2,0x11,0xcd,0xbe,0xa0,0xff,0x68, +0x33,0x7e,0x10,0x18,0xac,0x1a,0x9, 0x22,0x11,0xce,0xa, 0x32,0x2d,0x3, 0x3e,0x4, +0x7d,0x30,0x2d,0x3f,0xb, 0x38,0xc0,0xbe,0xc4,0x0, 0x0, 0x58,0x5, 0x6d,0xcc,0x1b, +0x38,0xc0,0x2d,0xf, 0xb, 0x8, 0xc0,0xbd,0xcd,0x8, 0x9, 0x7a,0xa1,0x41,0x7c,0xc2, +0x7d,0xdc,0x7c,0x3f,0xb, 0xf0,0xe5,0x3f,0xbc,0xbf,0x38,0xb0,0xbe,0x30,0xff,0x68, +0x43,0xbd,0xed,0x50,0x3f,0x7e,0x70,0x2, 0xac,0x73,0x9, 0x43,0x11,0xcd,0x7e,0x50, +0x18,0xac,0x45,0x9, 0x23,0x11,0xce,0xa, 0xc2,0x2d,0x2c,0x3e,0x24,0x2d,0x2f,0xb, +0x28,0x20,0xbe,0x27,0xd, 0x4c,0x40,0x1c,0xbe,0x31,0x43,0x68,0x17,0x7e,0x21,0x41, +0x74,0x2, 0xac,0xbd,0x19,0x25,0x11,0xeb,0x19,0xc5,0x11,0xec,0x74,0xff,0x19,0xb3, +0x11,0xcd,0xb, 0xd0,0xb, 0xe0,0xbe,0xe0,0x5, 0x50,0x2, 0xc1,0x53,0x7e,0x24,0x11, +0xeb,0x7e,0x34,0x11,0xcd,0x7e,0x14,0x0, 0x1e,0x12,0x6d,0x6c,0x7a,0xd1,0x3f,0x7e, +0x34,0x12,0x50,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xa5,0xe5,0x3f,0xbe,0xb0, +0x0, 0x28,0x38,0x7e,0x31,0x3f,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x11,0xcd,0x7e,0x34, +0xb, 0x96,0x12,0x6d,0x6c,0x7e,0x31,0x3f,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x11,0xcd, +0x7e,0x34,0x12,0x50,0x12,0x6d,0x6c,0x6c,0xee,0x80,0xa, 0x7c,0xbe,0x7e,0x70,0x1, +0x12,0x0, 0x5e,0xb, 0xe0,0xe5,0x3f,0xbc,0xbe,0x38,0xf0,0x85,0x3f,0x1d,0xe5,0x3f, +0x7a,0xb3,0xc, 0x3d,0x7e,0x73,0xc, 0x3d,0xbe,0x70,0x5, 0x28,0x6, 0x74,0x5, 0x7a, +0xb3,0xc, 0x3d,0xda,0x3b,0x22,0x7e,0x73,0xc, 0x54,0x7a,0x73,0x12,0xa3,0x7e,0xb3, +0xc, 0x56,0x60,0xa, 0x7e,0xb3,0x12,0xa3,0x44,0x80,0x7a,0xb3,0x12,0xa3,0x7e,0xb3, +0xc, 0x55,0x60,0xa, 0x7e,0xb3,0x12,0xa3,0x44,0x40,0x7a,0xb3,0x12,0xa3,0xe5,0x62, +0x7a,0xb3,0x12,0x9f,0x7e,0x73,0xc, 0x3d,0x7a,0x73,0x12,0xa0,0x74,0xff,0x7a,0xb3, +0x12,0xa1,0x7e,0x73,0xc, 0x3e,0x7a,0x73,0x12,0xa2,0x7e,0x73,0xe, 0x47,0x7a,0x73, +0x12,0xad,0x7e,0x1f,0x12,0xa9,0xb, 0x1c,0x7a,0x1f,0x12,0xa9,0x7e,0x73,0xc, 0xa2, +0x7a,0x73,0x12,0xb6,0x7e,0x73,0xc, 0xa9,0x7a,0x73,0x12,0xb7,0x7e,0x73,0xc, 0xb0, +0x7a,0x73,0x12,0xb8,0x7e,0x73,0xc, 0xb7,0x7a,0x73,0x12,0xb9,0x7e,0x73,0xc, 0xbe, +0x7a,0x73,0x12,0xba,0xe4,0x2, 0x5d,0xaf,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0xca,0x3b,0x7c,0xfb,0x7e,0x34,0x6c,0xc7,0x7d,0xd3,0x7e,0xb3,0xc, 0x3d,0x7c,0xdb, +0x75,0x1c,0x0, 0xe4,0x7a,0xb3,0x12,0x4c,0x7a,0xb3,0x12,0x4d,0x6d,0x33,0x7d,0x43, +0x7e,0x34,0x7f,0xff,0x7d,0xe3,0x7e,0x37,0xd, 0xdb,0x7d,0xf3,0x6c,0xee,0x6c,0xaa, +0xa, 0x3e,0x19,0xa3,0x11,0xcd,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x12,0x2e,0x19,0xa3, +0x12,0x2f,0xbc,0xde,0x28,0x13,0x7c,0xbe,0x12,0x5f,0x5f,0x7d,0xc3,0xbd,0x4c,0x18, +0x2, 0x7d,0x4c,0xbd,0xec,0x48,0x2, 0x7d,0xec,0xb, 0xe0,0xbe,0xe0,0xf, 0x78,0xce, +0xbe,0xd0,0x2, 0x50,0x2, 0x81,0x5, 0x7d,0x3e,0x2d,0x34,0xe, 0x34,0x7d,0xe3,0x6c, +0xee,0x74,0x6, 0x7c,0x3e,0xac,0x3b,0x7d,0x1, 0x2d,0xd, 0x7d,0x30,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0x30,0xbd,0x3e,0x58,0x1c,0x7d,0x30,0xb, 0x35,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x30,0x7d,0xa3,0x7d,0x30,0xb, 0x36,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30, +0x7d,0xb3,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc6,0x6c,0xee,0x61,0xf6,0x7e, +0xa0,0x2, 0x7c,0x7e,0xac,0x7a,0x9, 0xb3,0xb, 0x96,0xf5,0x3f,0x9, 0xb3,0xb, 0x97, +0xf5,0x40,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x11,0xcd,0x70,0xc, 0xa, 0x5e, +0xb, 0x54,0x7c,0xab,0xa, 0x3e,0x19,0xa3,0x11,0xcd,0x7c,0xbd,0x14,0xbc,0xbe,0x78, +0x2, 0x61,0xfc,0xa, 0x5e,0xb, 0x54,0xf5,0x48,0x61,0xed,0x7e,0xa1,0x48,0x74,0x2, +0x7c,0x7a,0xac,0x7b,0x9, 0xa3,0xb, 0x96,0x7a,0xa1,0x41,0x9, 0xb3,0xb, 0x97,0xf5, +0x42,0xa, 0x2a,0xe5,0x3f,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0x95,0x7c,0xb7,0xf5,0x46, +0xe5,0x42,0xa, 0x2b,0xe5,0x40,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0x95,0x7c,0xb7,0xf5, +0x47,0x75,0x4c,0x2, 0x75,0x4a,0x0, 0x7c,0xbe,0x12,0x5f,0x5f,0x7d,0x83,0xe5,0x48, +0x12,0x5f,0x5f,0x7d,0xd3,0x7d,0xe8,0xbd,0xd8,0x58,0x2, 0x7d,0xed,0x7d,0x3e,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0x7d,0xc3,0xe5, +0x46,0xbe,0xb0,0x1, 0x38,0x43,0xe5,0x47,0xbe,0xb0,0x1, 0x38,0x3c,0x7c,0xbf,0x54, +0x2, 0xb4,0x2, 0x35,0x7e,0x71,0x41,0x74,0x18,0xac,0x7b,0xe5,0x40,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x20,0x7e,0x71,0x3f,0x74,0x18,0xac,0x7b,0xe5, +0x42,0xa, 0x1b,0x2d,0x31,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30,0x2d,0x32,0xbd,0x3c, +0x18,0x2, 0x61,0x83,0x75,0x4a,0x1, 0x61,0x83,0xe5,0x46,0xbe,0xb0,0x1, 0x38,0x9, +0xe5,0x47,0xbe,0xb0,0x1, 0x38,0x2, 0x61,0x83,0xe5,0x46,0xbe,0xb0,0x3, 0x40,0x2, +0x61,0x83,0xe5,0x47,0xbe,0xb0,0x3, 0x40,0x2, 0x61,0x83,0x7c,0xbf,0x54,0x1, 0xb4, +0x1, 0x2, 0x80,0x2, 0x61,0x83,0x6d,0x33,0x7d,0x93,0x75,0x4b,0x0, 0x85,0x3f,0x43, +0x85,0x41,0x44,0xe5,0x41,0xbe,0xb1,0x3f,0x50,0x6, 0x85,0x41,0x43,0x85,0x3f,0x44, +0x7e,0xc1,0x40,0x85,0x42,0x45,0xe5,0x42,0xbe,0xb1,0x40,0x50,0x6, 0x7e,0xc1,0x42, +0x85,0x40,0x45,0x75,0x4e,0x0, 0x75,0x4f,0x0, 0xe5,0x44,0xbe,0xb1,0x43,0x78,0x21, +0x75,0x4e,0x1, 0xe5,0x43,0x60,0x5, 0xe5,0x43,0xb4,0xc, 0x3, 0x75,0x4f,0x1, 0xe5, +0x43,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x43,0xe5,0x44,0xbe,0xb0,0xc, 0x50,0x2, 0x5, +0x44,0xe5,0x45,0xbc,0xbc,0x78,0x1f,0x75,0x4e,0x1, 0x4c,0xcc,0x68,0x5, 0xbe,0xc0, +0x17,0x78,0x3, 0x75,0x4f,0x1, 0xbe,0xc0,0x0, 0x28,0x2, 0x1b,0xc0,0xe5,0x45,0xbe, +0xb0,0x17,0x50,0x2, 0x5, 0x45,0x85,0x43,0x4d,0x41,0xbd,0x7c,0x1c,0x80,0x66,0xe5, +0x43,0xbe,0xb1,0x4d,0x68,0x11,0xe5,0x44,0xbe,0xb1,0x4d,0x68,0xa, 0xbc,0xc1,0x68, +0x6, 0xe5,0x45,0xbc,0xb1,0x78,0x27,0x7e,0x71,0x4d,0x74,0x18,0xac,0xb7,0xa, 0x21, +0x2d,0x25,0x7d,0x42,0x3e,0x44,0x7d,0x14,0x2d,0x1f,0xb, 0x18,0x30,0xbe,0x34,0x0, +0x0, 0x8, 0x7, 0xb, 0x18,0x30,0x2d,0x39,0x7d,0x93,0x5, 0x4b,0x80,0x25,0x7e,0x71, +0x4d,0x74,0x18,0xac,0x7b,0xa, 0x21,0x2d,0x32,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30, +0xbd,0x3b,0x8, 0xc, 0xe5,0x4c,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x4c,0x1, 0x80,0x3, +0x75,0x4c,0x0, 0xb, 0x10,0xe5,0x45,0xbc,0xb1,0x50,0x94,0x5, 0x4d,0xe5,0x44,0xbe, +0xb1,0x4d,0x50,0x87,0x7e,0x71,0x44,0x74,0x18,0x7c,0x97,0xac,0x9b,0xa, 0x2c,0x7d, +0x34,0x2d,0x32,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x20,0x7d,0x39,0x9d,0x32,0x7e,0x51, +0x43,0x7c,0x15,0xac,0x1b,0xe5,0x45,0xa, 0x5b,0x7d,0x20,0x2d,0x25,0x3e,0x24,0x2d, +0x2f,0xb, 0x28,0x20,0x9d,0x32,0xa, 0x1c,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x2f, +0xb, 0x28,0x20,0x9d,0x32,0x7d,0x24,0x2d,0x25,0x3e,0x24,0x2d,0x2f,0xb, 0x28,0x20, +0x9d,0x32,0x7d,0x93,0x7d,0x3d,0x2d,0x38,0x7d,0xc3,0xe5,0x4e,0xb4,0x1, 0xe, 0xe5, +0x4f,0x70,0xa, 0x7d,0x39,0x9d,0x3c,0x7d,0x93,0x15,0x4b,0x15,0x4b,0xe5,0x4b,0xbe, +0xb0,0x4, 0x28,0x6, 0xe5,0x4b,0x24,0xfc,0xf5,0x4b,0xbe,0x94,0x0, 0x0, 0x58,0x4, +0x6d,0x33,0x7d,0x93,0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x3a,0x1a,0x26,0x1a,0x24, +0x12,0x66,0xf0,0xe5,0x4b,0xa, 0x1b,0x6d,0x0, 0x12,0x66,0xf0,0x7f,0x21,0x7d,0x39, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x67,0x1, 0xbf,0x12,0x8, 0xa, 0xe5, +0x4c,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x4a,0x2, 0x7e,0xb3,0xc, 0x43,0xb4,0x1, 0x3, +0x75,0x4a,0x2, 0xe5,0x4a,0xbe,0xb0,0x0, 0x28,0x61,0xe5,0x4a,0xa, 0x3b,0x2e,0x34, +0x12,0x4b,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x48,0xa, 0x1b,0x9, 0xb1,0x11, +0xcd,0x70,0xc, 0xa, 0x3e,0x9, 0xa3,0x11,0xcd,0x19,0xa1,0x11,0xcd,0x80,0x3c,0x75, +0x49,0x0, 0x80,0x32,0x9, 0x81,0x11,0xcd,0xa, 0x2e,0x9, 0x62,0x11,0xcd,0xbc,0x68, +0x28,0x12,0xe5,0x49,0xa, 0xb, 0x9, 0x70,0x11,0xcd,0xbc,0x76,0x78,0x16,0x19,0x80, +0x11,0xcd,0x80,0x10,0xe5,0x49,0xa, 0x2b,0x9, 0x72,0x11,0xcd,0xbc,0x78,0x78,0x4, +0x19,0x62,0x11,0xcd,0x5, 0x49,0xbe,0xd1,0x49,0x38,0xc9,0x5, 0x48,0xbe,0xd1,0x48, +0x28,0x2, 0x1, 0xeb,0xb, 0xe0,0xbc,0xde,0x28,0x2, 0x1, 0xaf,0x7e,0x34,0x11,0xcd, +0x12,0x3b,0xd2,0xf5,0x1c,0xda,0x3b,0x22,0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb, +0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55,0x7e,0x37,0xd, 0x59,0x7a,0x35,0x59,0x6c, +0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xb, 0xd9,0xe4,0x19,0xb3,0xb, 0xda,0x7c, +0xad,0x3e,0xa0,0xb, 0xa0,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xb, 0x96,0xf5,0x55, +0x9, 0xc3,0xb, 0x97,0xbc,0xdc,0x28,0x2, 0x81,0x62,0x7e,0xb3,0xe, 0x29,0xa, 0xb, +0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xa, 0x3c,0xbd,0x30,0x8, 0x2, 0x81,0x62,0x7c,0x3a, +0x81,0x98,0xbc,0xdc,0x38,0x2, 0x81,0x72,0x7c,0x3c,0x2c,0x3d,0xb, 0x30,0x6c,0x55, +0x81,0x9c,0xa, 0x3d,0xa, 0xc, 0x2d,0x3, 0x7e,0xb3,0xe, 0x29,0xa, 0x3b,0x1b,0x34, +0xbd,0x3, 0x38,0x2, 0x81,0x9c,0xa, 0xb, 0x1b,0x4, 0xa, 0x3c,0xbd,0x30,0x8, 0x2, +0x81,0x9c,0x7c,0x3b,0x2c,0x3d,0x9c,0x3c,0x7c,0x5c,0x9c,0x5d,0xbe,0xd1,0x55,0x28, +0x2, 0x81,0xbd,0x7e,0xb3,0xe, 0x28,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5, +0x55,0xa, 0x3b,0xbd,0x30,0x8, 0x2, 0x81,0xbd,0x7c,0x4a,0x81,0xfa,0xbe,0xd1,0x55, +0x38,0x2, 0x81,0xcf,0x7e,0x41,0x55,0x2c,0x4d,0xb, 0x40,0x6c,0x22,0x81,0xff,0xa, +0x3d,0xe5,0x55,0xa, 0xb, 0x2d,0x3, 0x7e,0xa3,0xe, 0x28,0xa, 0x3a,0x1b,0x34,0xbd, +0x3, 0x38,0x2, 0x81,0xff,0xa, 0xa, 0x1b,0x4, 0xe5,0x55,0xa, 0x3b,0xbd,0x30,0x8, +0x2, 0x81,0xff,0x7c,0x4a,0x2c,0x4d,0x9e,0x41,0x55,0x7e,0x21,0x55,0x9c,0x2d,0x7e, +0x37,0xd, 0xdb,0x7c,0xb2,0x7e,0x23,0xd, 0x4b,0x7e,0x4, 0x9, 0xa0,0x12,0x69,0x53, +0x7e,0x37,0x9, 0xa0,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xa2,0x7d,0x20,0x7a,0x1d, +0x43,0x7e,0x37,0x9, 0xa4,0x7d,0x3, 0x7e,0x37,0x9, 0xa6,0x7d,0x20,0x7a,0x1d,0x47, +0x7e,0x37,0x9, 0xa8,0x7d,0x3, 0x7e,0x37,0x9, 0xaa,0x7d,0x20,0x7a,0x1d,0x4b,0x7e, +0x37,0x9, 0xac,0x7d,0x3, 0x7e,0x37,0x9, 0xae,0x7d,0x20,0x7a,0x1d,0x4f,0xa, 0x4d, +0xe5,0x55,0xa, 0x5b,0x9d,0x54,0xf5,0x53,0xe1,0x7, 0xa, 0x4d,0xa, 0x5c,0x9d,0x54, +0xf5,0x54,0xc1,0xf3,0xe5,0x53,0xbe,0xb0,0x0, 0x58,0x2, 0xc1,0xf1,0x7e,0x73,0xe, +0x28,0xbe,0x71,0x53,0x18,0x2, 0xc1,0xf1,0xe5,0x54,0xbe,0xb0,0x0, 0x58,0x2, 0xc1, +0xf1,0x7e,0x73,0xe, 0x29,0xbe,0x71,0x54,0x18,0x2, 0xc1,0xf1,0xe5,0x54,0x1a,0x2b, +0x3e,0x24,0xe5,0x53,0x1a,0x3b,0x7e,0x14,0x0, 0x30,0xad,0x13,0x2d,0x21,0x2e,0x27, +0xd, 0xdb,0xb, 0x28,0x20,0x7e,0x33,0xd, 0x4b,0xa, 0x13,0x9d,0x21,0x7a,0x25,0x57, +0xbe,0x24,0x0, 0x0, 0x18,0x2, 0xc1,0xf1,0x7e,0x25,0x59,0xbe,0x25,0x57,0x28,0x2, +0xa1,0xd2,0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0xb, 0xda,0x7e,0x29,0xb0,0x4, 0x7a, +0x29,0xb0,0xe5,0x55,0xa, 0x2b,0x9d,0x32,0x12,0x6d,0x95,0xbe,0x34,0x0, 0x1, 0x8, +0x2, 0xa1,0xf6,0xa, 0x2c,0xe5,0x54,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0x95,0xbe,0x34, +0x0, 0x1, 0x18,0x2, 0xc1,0xf1,0x75,0x56,0x0, 0xc1,0x82,0xbe,0xe1,0x56,0x78,0x2, +0xc1,0x80,0xe5,0x56,0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x96,0xa, 0x27,0xe5,0x53, +0x1a,0x3b,0x9d,0x32,0x12,0x6d,0x95,0xbe,0x34,0x0, 0x1, 0x8, 0x2, 0xc1,0x41,0xe5, +0x56,0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x97,0xa, 0x27,0xe5,0x54,0x1a,0x3b,0x9d, +0x32,0x12,0x6d,0x95,0xbe,0x34,0x0, 0x1, 0x8, 0x2, 0xc1,0x41,0x75,0x56,0xff,0xc1, +0x8d,0xe5,0x56,0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x96,0xa, 0x27,0xe5,0x53,0x1a, +0x3b,0x9d,0x32,0x12,0x6d,0x95,0xbe,0x34,0x0, 0x2, 0x8, 0x2, 0xc1,0x80,0xe5,0x56, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xb, 0x97,0xa, 0x27,0xe5,0x54,0x1a,0x3b,0x9d,0x32, +0x12,0x6d,0x95,0xbe,0x34,0x0, 0x2, 0x8, 0x2, 0xc1,0x80,0x75,0x56,0x0, 0xc1,0x8d, +0x5, 0x56,0x7e,0x73,0xc, 0x3d,0xbe,0x71,0x56,0x8, 0x2, 0xa1,0xfb,0xe5,0x56,0x60, +0x2, 0xc1,0x9f,0x7e,0x35,0x57,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x57,0xe5, +0x56,0x70,0x2, 0xc1,0xae,0xe5,0x56,0xb4,0xff,0x2, 0x80,0x2, 0xc1,0xf1,0x7e,0xf5, +0x57,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0xe5,0x53,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12, +0x66,0xf0,0x7f,0x1, 0x7e,0x1d,0x47,0x9f,0x10,0x7a,0x1d,0x47,0xe5,0x54,0x1a,0x1b, +0x1a,0x2, 0x7f,0x17,0x12,0x66,0xf0,0x7f,0x1, 0x7e,0x1d,0x4f,0x9f,0x10,0x7a,0x1d, +0x4f,0x7e,0x1d,0x43,0x9f,0x17,0x7a,0x1d,0x43,0x7e,0x1d,0x4b,0x9f,0x17,0x7a,0x1d, +0x4b,0x5, 0x54,0xa, 0x2d,0xa, 0x3c,0x2d,0x32,0x1a,0x27,0xe5,0x54,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0xa1,0x64,0x5, 0x53,0xa, 0x2d,0xe5,0x55,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x53,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0xa1,0x5a,0x74,0x6, 0x7e,0x1d,0x47, +0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x47,0x7e,0xd, 0x43,0x7e,0x1d,0x47,0x12,0x67, +0xc, 0x2e,0x34,0x0, 0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xb, 0xd4,0x74,0x6, +0x7e,0x1d,0x4f,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x4f,0x7e,0x7d,0x4b,0x7e,0x1d, +0x4f,0x7f,0x7, 0x12,0x67,0xc, 0x2e,0x34,0x0, 0x20,0x59,0x36,0xb, 0xd6,0x7e,0xb3, +0xd, 0x58,0x7f,0x17,0x70,0x2, 0xe1,0x74,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60, +0x80,0x14,0x78,0xf4,0x7a,0x1d,0x4b,0xbe,0x18,0x0, 0x7f,0x38,0x2, 0xe1,0x86,0x7e, +0x18,0x0, 0x7f,0x7a,0x1d,0x4b,0x7e,0x2d,0x4b,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f, +0x19,0xa3,0xb, 0xd9,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xb, 0xda,0x7e,0x70,0x7, 0xac, +0x7f,0x19,0xa3,0xb, 0xda,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xb, 0xda,0xbe,0x70,0xf, +0x38,0x2, 0xe1,0xc0,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xb, 0xda, +0xda,0x3b,0x22,0x74,0x1, 0x12,0x62,0x69,0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6, +0xac,0xa9,0xd6,0xec,0xd2,0x86,0x7e,0x34,0x0, 0x3f,0x12,0x5c,0xf2,0x92,0x7, 0x30, +0x7, 0xe, 0xe5,0x3f,0xbe,0xb0,0x2, 0x50,0x7, 0xe5,0x3f,0x24,0xff,0xa9,0x93,0xea, +0x75,0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xff,0xff, +0xca,0x3b,0x75,0x40,0x0, 0x75,0x42,0x0, 0x75,0x44,0x0, 0x7e,0xd4,0xc, 0xc1,0x7e, +0xb3,0xc, 0xe8,0x70,0xe, 0x7e,0xb3,0xc, 0xe4,0x70,0x8, 0x7e,0xb3,0xc, 0xe5,0x70, +0x2, 0x41,0xc0,0x20,0x4, 0x6, 0x7e,0x44,0x0, 0x82,0x80,0x4, 0x7e,0x44,0x0, 0xa6, +0x7d,0x34,0x7e,0x24,0x0, 0x24,0x74,0xff,0x12,0x6d,0xa5,0x74,0xaa,0x7a,0x49,0xb0, +0x19,0xb4,0x0, 0x1, 0x7e,0x73,0xc, 0xe1,0x19,0x74,0x0, 0x3, 0x75,0x41,0x0, 0x6c, +0xff,0x41,0x53,0x74,0x7, 0xac,0xbf,0x9, 0xc5,0xc, 0xa2,0x7c,0xac,0x5e,0xa0,0xf, +0xa, 0xca,0x2d,0xcd,0x7e,0xc9,0xd0,0x7c,0xbc,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x10, +0xb4,0xb0,0x2, 0x80,0x2, 0x41,0x51,0x7c,0xca,0xbe,0xd0,0x1, 0x68,0x2, 0x41,0x51, +0xbe,0xd0,0x3, 0x78,0x2, 0x41,0x51,0x12,0x5e,0xf0,0x50,0x59,0x7e,0xb3,0xc, 0xdf, +0xb4,0x1, 0x5, 0x75,0x43,0x0, 0x80,0x5, 0x12,0x61,0x70,0xf5,0x43,0x4c,0xdd,0x68, +0x5, 0xbe,0xd0,0x2, 0x78,0x24,0xa, 0x5c,0x9, 0xa5,0xc, 0xeb,0xbe,0xa1,0x43,0x50, +0xe, 0xa, 0xcc,0x2e,0xc4,0xc, 0xeb,0x7c,0xba,0x4, 0x7a,0xc9,0xb0,0x41,0x51,0xbe, +0xa1,0x43,0x78,0x2, 0x6c,0xdd,0x74,0xff,0x80,0x15,0xa, 0x5c,0x9, 0x75,0xc, 0xeb, +0xbe,0x71,0x43,0x50,0x9, 0xe4,0xa, 0xcc,0x19,0xbc,0xc, 0xeb,0x41,0x51,0xe4,0xa, +0xcc,0x19,0xbc,0xc, 0xeb,0x7e,0xa1,0x41,0x74,0x6, 0xa4,0xf5,0x3f,0x74,0x7, 0xac, +0xbf,0x9, 0xe5,0xc, 0xa3,0x9, 0xb5,0xc, 0xa4,0xc4,0x54,0xf0,0xf5,0x44,0x7e,0x73, +0xd, 0x3e,0xbc,0x7c,0x28,0x54,0x7e,0xb3,0xc, 0xe6,0x70,0x28,0x7c,0xbe,0xa, 0x3c, +0x2e,0x34,0x12,0x71,0x7e,0x50,0x1, 0x7e,0x40,0xf, 0x12,0x5a,0xa6,0x7c,0xeb,0xe5, +0x44,0xa, 0x3c,0x2e,0x34,0x12,0x76,0x7e,0x50,0x10,0x7e,0x40,0x20,0x12,0x5a,0xa6, +0xf5,0x44,0x80,0xc, 0xa, 0x5c,0x9, 0xe5,0x12,0x71,0x9, 0xb5,0x12,0x76,0xf5,0x44, +0xa, 0x5c,0x2d,0x5d,0x7e,0x59,0xb0,0xb4,0x1, 0x10,0xe4,0xa, 0xcc,0x19,0xbc,0x12, +0x71,0x19,0xbc,0x12,0x76,0x6c,0xee,0x75,0x44,0x0, 0x7e,0xb3,0xd, 0x57,0xb4,0xff, +0x14,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xc, 0xa2,0xbe,0xb0,0xff,0x68,0x5, 0x7e,0xe0, +0x1, 0x80,0x2, 0x6c,0xee,0x7e,0x50,0x7, 0xac,0x5f,0x49,0xe2,0xc, 0x9e,0x49,0xf2, +0xc, 0xa0,0xbe,0xd0,0x1, 0x78,0x27,0x75,0x45,0x0, 0x7e,0x71,0x45,0x74,0x7, 0xac, +0x7b,0x9, 0xb3,0x12,0x7f,0x54,0xf, 0xbc,0xbc,0x78,0xa, 0x49,0xe3,0x12,0x7b,0x49, +0xf3,0x12,0x7d,0x80,0x9, 0x5, 0x45,0xe5,0x45,0xbe,0xb0,0x5, 0x40,0xdc,0x7d,0xce, +0x7d,0x5c,0xa, 0x5a,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x3f,0xa, 0x3b,0x7d,0x13, +0x2d,0x14,0x19,0xa1,0x0, 0x5, 0x7d,0x1c,0x7d,0x53,0x2d,0x54,0x19,0x35,0x0, 0x6, +0x7d,0xcf,0x7d,0x1c,0xa, 0x12,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x54,0x19,0x35, +0x0, 0x7, 0x7d,0x1c,0x7d,0x53,0x2d,0x54,0x19,0x35,0x0, 0x8, 0x7d,0x53,0x2d,0x54, +0x19,0xe5,0x0, 0x9, 0xe5,0x44,0x7d,0x13,0x2d,0x14,0x19,0xb1,0x0, 0xa, 0x9, 0xa2, +0xc, 0xa2,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x24,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x23,0xbe,0xd0, +0x1, 0x68,0x2, 0x5, 0x40,0x5, 0x42,0x7c,0xbd,0x3, 0x3, 0x54,0xc0,0x7c,0x4b,0x7d, +0x53,0x2d,0x54,0x2e,0x54,0x0, 0x5, 0x7e,0x59,0x50,0x2c,0x54,0x7a,0x59,0x50,0x80, +0xe, 0x2d,0x34,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, +0x41,0xb, 0xf0,0x7e,0x73,0xd, 0x3e,0xbc,0x7f,0x28,0x2, 0x1, 0x53,0xe5,0x40,0x19, +0xb4,0x0, 0x4, 0xe5,0x42,0xbe,0xb0,0x0, 0x38,0x7, 0x7e,0xb3,0xc, 0xe5,0xb4,0x1, +0x35,0x74,0x24,0x19,0xb4,0x0, 0x2, 0xe4,0x19,0xb4,0x0, 0x23,0x6c,0xff,0xa, 0x5f, +0x2d,0x54,0x7e,0x59,0x60,0x7d,0x54,0x2e,0x54,0x0, 0x23,0x7e,0x59,0x70,0x6c,0x76, +0x7a,0x59,0x70,0xb, 0xf0,0xbe,0xf0,0x23,0x78,0xe4,0xb2,0x4, 0x12,0x0, 0x1e,0x70, +0x5, 0x74,0x1, 0x12,0xf, 0xf8,0x7e,0xb3,0xc, 0xe4,0x60,0x5, 0x7d,0x3d,0x12,0x5c, +0x8f,0xe4,0x7a,0xb3,0xc, 0xe8,0x7a,0xb3,0xc, 0xe4,0x7a,0xb3,0xc, 0xe5,0x80,0x4, +0xe4,0x12,0xf, 0xf8,0x7e,0x24,0xc, 0x9e,0x7e,0x34,0x12,0x7b,0x7e,0x14,0x0, 0x23, +0x12,0x6d,0x6c,0xe5,0x42,0x70,0xd, 0x7e,0x34,0x12,0x7b,0x7e,0x24,0x0, 0x23,0x74, +0xff,0x12,0x6d,0xa5,0xda,0x3b,0x22,0x7e,0xf4,0xc, 0xc1,0x6c,0xaa,0x7e,0x0, 0xff, +0x7e,0x30,0x7, 0xac,0x3a,0x19,0x1, 0xc, 0x5c,0x7c,0xa, 0x2e,0x0, 0x3f,0xe4,0xa5, +0xf6,0xb, 0xa0,0xbe,0xa0,0x5, 0x78,0xe5,0x7e,0x3, 0xc, 0xdf,0xa5,0xb8,0x0, 0x2, +0x80,0x2, 0x61,0x3a,0x7e,0xb3,0xc, 0xe0,0x70,0x2, 0x81,0xc2,0x7d,0x3f,0x2e,0x34, +0x0, 0xa, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xa5,0x7d,0x3f,0x2e,0x34,0x0, +0x14,0x7e,0x24,0x0, 0xa, 0x12,0x6d,0xa5,0x81,0xc2,0x7e,0xb3,0xc, 0xe0,0x60,0x2, +0x61,0x64,0xa5,0xb8,0x1, 0x2, 0x80,0x2, 0x61,0x64,0x7e,0x17,0xc, 0x58,0x59,0x1f, +0x0, 0xa, 0x7e,0x17,0xc, 0x5a,0x59,0x1f,0x0, 0x14,0x75,0x3f,0x1, 0xe4,0x7a,0xb3, +0xc, 0x5c,0x81,0xc2,0x6c,0xaa,0x7e,0x24,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59, +0x23,0x9, 0x8c,0x7c,0xba,0x7c,0x4a,0x30,0xe0,0x2, 0x61,0x8f,0x1e,0x40,0x7e,0x50, +0x2, 0xac,0x45,0x2d,0x2f,0x49,0x22,0x0, 0xa, 0x59,0x23,0x9, 0x78,0x61,0xa0,0x1e, +0x40,0x7e,0x50,0x2, 0xac,0x45,0x2d,0x2f,0x49,0x12,0x0, 0x14,0x59,0x13,0x9, 0x78, +0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xbf,0x6c,0xaa,0x61,0xd7,0x7c,0xba,0x7c,0x2a,0x30, +0xe0,0x2, 0x61,0xc1,0x1e,0x20,0x7e,0x30,0x7, 0xac,0x23,0x49,0x11,0xc, 0x58,0x61, +0xcc,0x1e,0x20,0x7e,0x30,0x7, 0xac,0x23,0x49,0x11,0xc, 0x5a,0x7e,0x70,0x2, 0xac, +0x7a,0x59,0x13,0x9, 0x8c,0xb, 0xa0,0xa, 0xe0,0x3e,0xe4,0xa, 0x1a,0xbd,0x1e,0x40, +0xca,0x7e,0x34,0x9, 0x78,0x7e,0x24,0x9, 0x8c,0x74,0x5, 0x12,0x6b,0xdd,0x7d,0x13, +0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7a,0x7c,0xb7,0x7d,0xe1,0x70,0x2, 0x81,0x4, 0x1e, +0xe4,0x14,0x78,0xfb,0x5e,0xe4,0x0, 0x7, 0x7d,0x3e,0x7c,0x7, 0xa, 0xe0,0x1b,0xe4, +0x7d,0x3e,0x7c,0x87,0x7e,0x3, 0xc, 0xdf,0xbc,0x8, 0x38,0x2, 0x81,0x8b,0x7e,0x70, +0x2, 0xac,0x7a,0x7d,0xe3,0x2d,0xef,0x49,0xee,0x0, 0xa, 0xbe,0xe4,0xff,0xff,0x68, +0x2, 0x81,0x57,0x6c,0x11,0x7e,0x70,0x2, 0xac,0x71,0x7d,0xe3,0x2d,0xef,0x49,0xee, +0x0, 0xa, 0xbe,0xe4,0xff,0xff,0x68,0x2, 0x81,0x4e,0x7c,0x91,0x81,0x59,0xb, 0x10, +0xbe,0x10,0x5, 0x40,0xe0,0x81,0x59,0x7c,0x9a,0x7e,0x70,0x7, 0xac,0x78,0x19,0x93, +0xc, 0x5c,0x7c,0x9, 0x2e,0x0, 0x3f,0x74,0x1, 0xa5,0xf6,0x7e,0x50,0x7, 0xac,0x58, +0x49,0xe2,0xc, 0x58,0x7e,0x70,0x2, 0xac,0x79,0x7d,0xd3,0x2d,0xdf,0x59,0xed,0x0, +0xa, 0x49,0xe2,0xc, 0x5a,0x2d,0x3f,0x59,0xe3,0x0, 0x14,0xb, 0xa0,0xbe,0xa0,0x5, +0x68,0x2, 0x61,0xf2,0x6c,0xaa,0x7c,0xa, 0x2e,0x0, 0x3f,0xa5,0xe6,0xbe,0xb0,0x1, +0x78,0x2, 0x81,0xbb,0x7e,0xe4,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0x23,0x2d, +0x2f,0x59,0xe2,0x0, 0xa, 0x2d,0x3f,0x59,0xe3,0x0, 0x14,0xb, 0xa0,0xbe,0xa0,0x5, +0x78,0xd4,0x7e,0x13,0xc, 0xdf,0x6c,0xaa,0x7c,0xa, 0x2e,0x0, 0x3f,0xa5,0xe6,0xb4, +0x1, 0x2, 0x80,0x2, 0xa1,0xa, 0xa, 0xea,0x2d,0xef,0x9, 0xbe,0x0, 0x5, 0xb4,0x1, +0x2, 0x80,0x2, 0x81,0xeb,0x74,0x3, 0x19,0xbe,0x0, 0x5, 0xa, 0xea,0x2d,0xef,0x9, +0xe, 0x0, 0x5, 0xa5,0xb8,0x3, 0x2, 0x80,0x2, 0x81,0xfe,0xe4,0xa1,0x33,0xa5,0xb8, +0x0, 0x2, 0x80,0x2, 0xa1,0x36,0x74,0x2, 0xa1,0x33,0xa, 0xea,0x2d,0xef,0x9, 0xbe, +0x0, 0x5, 0xbe,0xb0,0x2, 0x78,0x2, 0xa1,0x1d,0x60,0x2, 0xa1,0x31,0x74,0x1, 0x7a, +0xe9,0xb0,0x7c,0x61,0xb, 0x10,0x7e,0x70,0x7, 0xac,0x67,0x19,0xa3,0xc, 0x5c,0xa1, +0x36,0x74,0x3, 0x7a,0xe9,0xb0,0xa, 0x1a,0x2d,0x1f,0x7e,0x19,0x0, 0x19,0x1, 0x0, +0x5, 0xb, 0xa0,0xbe,0xa0,0x5, 0x40,0x80,0x22,0xca,0x3b,0x6c,0xcc,0xc1,0xc5,0x74, +0x2, 0xac,0xbc,0x9, 0xd5,0xb, 0x96,0x9, 0xe5,0xb, 0x97,0x7e,0x50,0x18,0xac,0x5d, +0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0xb, 0x38,0x30, +0x7a,0x35,0x41,0x75,0x43,0x2, 0x6c,0xff,0x7e,0x70,0x5, 0xac,0x7f,0x7d,0x23,0x2e, +0x24,0x6d,0xc4,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc,0xbd,0x38,0x15,0x2e, +0x34,0x6d,0xc5,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xbc,0xbd,0x40,0x5, 0x7a, +0xf1,0x43,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xcd,0xe5,0x43,0xbe,0xb0,0x2, +0x40,0x2, 0xc1,0xc3,0x7c,0xbc,0x12,0x62,0xb0,0x70,0x2, 0xc1,0xc3,0xbe,0xe0,0x0, +0x7e,0x50,0x18,0x28,0x16,0xac,0x5d,0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32, +0x2e,0x37,0xd, 0xdb,0x1b,0x35,0xb, 0x38,0x30,0x80,0x13,0xac,0x5d,0x3e,0x24,0x7e, +0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0x49,0x33,0x0, 0x2, 0x7a,0x35, +0x44,0xbe,0xe0,0x17,0x7e,0x50,0x18,0x50,0x15,0xac,0x5d,0x3e,0x24,0x7e,0x70,0x2, +0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0x49,0x33,0x0, 0x2, 0x80,0x14,0xac,0x5d, +0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0x1b,0x35,0xb, +0x38,0x30,0x7a,0x35,0x46,0x7e,0x71,0x43,0x74,0x5, 0xac,0x7b,0x7d,0x23,0x2e,0x24, +0x6d,0xc6,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc,0xbe,0x28,0x2, 0xc1,0xc3, +0x2e,0x34,0x6d,0xc7,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xbc,0xbe,0x40,0x73, +0x6c,0xff,0x80,0x67,0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0xb, 0x96,0xf5,0x3f,0x9, +0xb3,0xb, 0x97,0xf5,0x40,0xbc,0xcf,0x68,0x50,0xe5,0x3f,0xbe,0xb0,0x2, 0x38,0x49, +0xa, 0x2e,0xe5,0x40,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0x95,0xbe,0x34,0x0, 0xc, 0x18, +0x38,0x74,0x18,0xac,0xbd,0x7d,0xf5,0x3e,0xf4,0x74,0x2, 0xac,0xbe,0x2d,0xf5,0x2e, +0xf7,0xd, 0xdb,0x49,0xef,0x0, 0x30,0x49,0xff,0xff,0xd0,0x2d,0xfe,0x2e,0xf5,0x44, +0x2e,0xf5,0x46,0x7e,0xe5,0x41,0x3e,0xe4,0x3e,0xe4,0x9d,0xef,0xbe,0xe4,0x0, 0xc8, +0x58,0x7, 0x7c,0xbc,0x6c,0x77,0x12,0x0, 0x5e,0xb, 0xf0,0x7e,0x73,0xc, 0x3d,0xbc, +0x7f,0x38,0x91,0xb, 0xc0,0x7e,0x73,0xc, 0x3d,0xbc,0x7c,0x28,0x2, 0xa1,0x4f,0x12, +0x59,0x25,0x75,0x40,0x0, 0x6d,0x33,0x7a,0x35,0x41,0x7e,0x73,0xc, 0x3d,0xbe,0x70, +0x1, 0x38,0x2, 0xe1,0x9d,0x6c,0xcc,0xe1,0x93,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xb, 0x96,0xf5,0x3f,0x9, 0xb3,0xb, 0x97,0xf5,0x40,0x60,0x9, 0xe5,0x40,0xb4,0x1, +0x2, 0x80,0x2, 0xe1,0x91,0xe5,0x3f,0xbe,0xb0,0x0, 0x38,0x2, 0xe1,0x91,0xe5,0x3f, +0xbe,0xb0,0xb, 0x50,0x7c,0x6c,0xff,0x80,0x70,0xbc,0xcf,0x68,0x6a,0x74,0x2, 0xac, +0xbf,0x9, 0xd5,0xb, 0x96,0x9, 0xe5,0xb, 0x97,0x4c,0xee,0x78,0x5a,0x7e,0x50,0x18, +0xac,0x5d,0x3e,0x24,0x7e,0x70,0x2, 0xac,0x7e,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0xb, +0x38,0x10,0x7a,0x15,0x41,0x7e,0x51,0x3f,0x74,0x18,0xac,0x5b,0x3e,0x24,0x7e,0x71, +0x40,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0x49,0x23,0xff,0xd0,0x49, +0x33,0x0, 0x30,0x2d,0x32,0x7e,0x24,0x0, 0xa, 0x12,0x66,0xbe,0x7d,0x23,0x7d,0x31, +0x9d,0x32,0x7a,0x35,0x41,0xbe,0x34,0x0, 0x46,0x58,0xc, 0xbe,0xd0,0xc, 0x78,0x7, +0x7c,0xbf,0x6c,0x77,0x12,0x0, 0x5e,0xb, 0xf0,0x7e,0x73,0xc, 0x3d,0xbc,0x7f,0x38, +0x88,0xb, 0xc0,0x7e,0x73,0xc, 0x3d,0xbc,0x7c,0x28,0x2, 0xc1,0xe9,0xda,0x3b,0x22, +0x7e,0x34,0xc, 0x58,0x7e,0x24,0x0, 0x23,0x74,0xff,0x12,0x6d,0xa5,0x7e,0x34,0xc, +0x7b,0x7e,0x24,0x0, 0x23,0x12,0x6d,0xa5,0x7e,0x34,0xc, 0x9e,0x7e,0x24,0x0, 0x23, +0x12,0x6d,0xa5,0x7e,0x34,0xc, 0xeb,0x7e,0x24,0x0, 0x5, 0xe4,0x12,0x6d,0xa5,0x7e, +0x34,0xc, 0xc1,0x7e,0x24,0x0, 0xa, 0x74,0x3, 0x12,0x6d,0xa5,0x7e,0x34,0xc, 0xcb, +0x7e,0x24,0x0, 0x14,0x74,0xff,0x12,0x6d,0xa5,0x7e,0x34,0xc, 0xdf,0x7e,0x24,0x0, +0xb, 0xe4,0x12,0x6d,0xa5,0x12,0x60,0xff,0xe4,0x7a,0xb3,0xc, 0xf1,0x22,0xff,0xff, +0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0xf, 0x9f,0xa5,0xbe,0x1, +0x69,0x7e,0xa3,0xe, 0x28,0xbc,0xa7,0x28,0x15,0x7a,0x71,0x19,0x74,0x30,0xac,0x7b, +0x2e,0x37,0x12,0xbd,0x7a,0x37,0x0, 0xcb,0xe4,0x7a,0xb3,0xd, 0xc5,0x22,0x7a,0x71, +0x19,0xe4,0x7a,0xb3,0xd, 0xc5,0xa, 0x1a,0xa, 0x27,0x9d,0x21,0xbe,0x24,0x0, 0x4, +0x58,0x19,0x7e,0xb3,0x0, 0xca,0x7d,0x32,0x20,0xe0,0x8, 0x3e,0x34,0x49,0x33,0x0, +0x66,0x80,0x22,0x3e,0x34,0x49,0x33,0x0, 0xcd,0x80,0x1a,0x7c,0xb7,0x9e,0xb3,0xe, +0x28,0xb4,0x4, 0x6, 0x7e,0x34,0x12,0x9f,0x80,0xb, 0xb4,0x5, 0x2, 0x80,0x2, 0x41, +0x33,0x7e,0x34,0xd, 0xdd,0x7a,0x37,0x0, 0xcb,0x22,0xa5,0xbe,0x0, 0x3f,0x7a,0x71, +0x18,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf, +0x1, 0x15,0x7e,0xb3,0xe, 0xa2,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x1, 0x80,0x37, +0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3,0xe, 0xa2,0xb4,0x3, 0x7, 0x74,0x1, +0x7e,0x70,0x3, 0x80,0x22,0x74,0x27,0x7e,0x70,0x3, 0x2, 0x61,0xa6,0xa5,0xbe,0x2, +0x19,0xa5,0xbf,0x4, 0x7, 0x74,0x1, 0x7e,0x70,0x4, 0x80,0xb, 0xa5,0xbf,0x5, 0x2, +0x80,0x2, 0x41,0x33,0xe4,0x6c,0x77,0x2, 0x62,0x46,0xa5,0xbe,0x3, 0xd, 0xbe,0x70, +0xd, 0x28,0x3, 0x7e,0x70,0xd, 0x7a,0x73,0xe, 0x28,0x22,0xa5,0xbe,0x4, 0xd, 0xbe, +0x70,0x18,0x28,0x3, 0x7e,0x70,0x18,0x7a,0x73,0xe, 0x29,0x22,0xa5,0xbe,0x5, 0x5, +0x7a,0x73,0xe, 0x2a,0x22,0xa5,0xbe,0x7, 0x1c,0x7a,0x73,0xe, 0x48,0x7c,0xb7,0x54, +0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0xe, 0x51,0x5e,0x70,0x3, 0x4d,0x32, +0x7a,0x37,0xe, 0x51,0x22,0xbe,0x60,0x8, 0x40,0x2b,0xbe,0x60,0xc, 0x38,0x26,0xa5, +0xbe,0xa, 0xc, 0x4c,0x77,0x68,0x3, 0x7e,0x70,0x1, 0x7a,0x73,0xe, 0x38,0x22,0x7e, +0x23,0xe, 0x38,0x7e,0x30,0x2, 0xac,0x23,0x7e,0x50,0x4, 0xac,0x56,0x2d,0x21,0x49, +0x22,0x0, 0x4e,0x41,0x27,0xa5,0xbe,0x4c,0x5, 0x7a,0x73,0xd, 0x3e,0x22,0xa5,0xbe, +0xfb,0x27,0x7a,0x71,0x15,0x7e,0x37,0xe, 0x4d,0x5e,0x70,0xdf,0x7a,0x37,0xe, 0x4d, +0xe5,0x15,0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x4e,0x37,0xe, 0x4d,0x7a,0x37,0xe, 0x4d,0x22,0xa5,0xbe,0x4e,0x5, 0x7a,0x73,0xe, +0x47,0x22,0xa5,0xbe,0x4f,0x3, 0xb2,0x86,0x22,0xbe,0x60,0x7b,0x40,0x1d,0xbe,0x60, +0x9f,0x38,0x18,0xa, 0x26,0x9, 0x62,0xc, 0x77,0x7e,0xb3,0xe, 0x38,0xa, 0x26,0x70, +0x5, 0x19,0x72,0xd, 0xdd,0x22,0x19,0x72,0xd, 0x63,0x22,0xbe,0x60,0xa0,0x40,0x11, +0xbe,0x60,0xac,0x38,0xc, 0xa, 0x26,0x2e,0x27,0xe, 0x69,0x9e,0x24,0x0, 0xa0,0x80, +0x56,0xbe,0x60,0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0xe, +0x6b,0x9e,0x24,0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38, +0xc, 0xa, 0x26,0x2e,0x27,0xe, 0x6d,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2, +0x40,0x11,0xbe,0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0xe, 0x6f,0x9e,0x24,0x0, +0xd2,0x80,0x14,0xbe,0x60,0xd6,0x40,0x13,0xbe,0x60,0xed,0x38,0xe, 0xa, 0x26,0x2e, +0x27,0xe, 0x71,0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x22,0xa5,0xbe,0xf8,0x4, 0x7a, +0x73,0xf, 0xf9,0x22,0xca,0x3b,0x7e,0xf7,0x11,0x25,0x7d,0xef,0x6c,0xaa,0x7e,0xe0, +0xff,0x7e,0x70,0x4, 0x7e,0xc0,0x3c,0x75,0x3f,0x14,0xe5,0x22,0xb4,0x1, 0x6, 0x7e, +0xc0,0x64,0x75,0x3f,0x1e,0x7e,0xb3,0x11,0xcb,0x4, 0x7a,0xb3,0x11,0xcb,0x7e,0x63, +0x11,0xcb,0xbe,0x60,0x9, 0x28,0x6, 0x74,0x9, 0x7a,0xb3,0x11,0xcb,0x7e,0xb3,0xf, +0xf2,0xb4,0x1, 0x3, 0x7e,0x70,0x9, 0x7e,0x63,0x11,0xc9,0xa, 0x16,0x9, 0x61,0xd, +0x17,0xbe,0x63,0xe, 0x47,0x68,0x2, 0x61,0xf4,0x7e,0xd0,0x1, 0x80,0x1e,0xbe,0xd0, +0x4, 0x68,0x17,0x7e,0x10,0x14,0xac,0x1d,0x49,0x10,0x11,0x25,0xbd,0x1e,0x50,0x4, +0x7d,0xe1,0x7c,0xad,0xbd,0x1f,0x28,0x2, 0x7d,0xf1,0xb, 0xd0,0xbc,0x7d,0x38,0xde, +0x7e,0x73,0xf, 0x9e,0x7e,0x50,0x14,0xac,0x57,0x49,0x22,0x11,0x25,0x7e,0x30,0x14, +0xac,0x3a,0x49,0x11,0x11,0x27,0xbe,0x14,0x0, 0x8, 0x50,0x2, 0x61,0x6f,0xbc,0x7a, +0x78,0x2, 0x61,0x6f,0xe5,0x22,0xb4,0x1, 0x40,0x7e,0x70,0x2, 0xac,0x7c,0xbd,0x3e, +0x28,0x1e,0x7e,0x14,0x0, 0x3, 0xad,0x1e,0x7d,0x31,0x1e,0x34,0xbd,0x32,0x50,0x6a, +0xa, 0x1c,0x1e,0x14,0x7d,0x32,0x9d,0x3e,0xbd,0x31,0x28,0x5e,0x7c,0xea,0x80,0x5a, +0x7d,0x3e,0x3e,0x34,0x3e,0x34,0xbd,0x32,0x40,0xb, 0x7e,0x70,0x4, 0xac,0x7c,0x2d, +0x3e,0xbd,0x32,0x50,0x45,0x7c,0xea,0x80,0x41,0xa, 0x3c,0xbd,0x3e,0x28,0x20,0x7e, +0x4, 0x0, 0x3, 0x7d,0xde,0xad,0xd0,0x7d,0x3d,0x1e,0x34,0xbd,0x32,0x50,0x2b,0xa, +0x1c,0x8d,0x10,0x7d,0x32,0x9d,0x3e,0xbd,0x31,0x28,0x1f,0x7c,0xea,0x80,0x1b,0x7e, +0x14,0x0, 0x3, 0xad,0x1e,0x7d,0x31,0x1e,0x34,0xbd,0x32,0x40,0xb, 0x7e,0x70,0x2, +0xac,0x7c,0x2d,0x3e,0xbd,0x32,0x50,0x2, 0x7c,0xea,0xe5,0x3f,0xa, 0x3b,0xbd,0x3e, +0x28,0xd, 0x7e,0x71,0x3f,0x74,0x2, 0xac,0x7b,0xbd,0x32,0x50,0x2, 0x7c,0xea,0x6c, +0xff,0x7e,0xb3,0xf, 0xf2,0x70,0x16,0x7e,0xa1,0x3f,0x74,0x2, 0xa4,0xbd,0x5e,0x40, +0x19,0x7e,0xa1,0x3f,0x74,0x4, 0xa4,0xbd,0x5f,0x50,0x1a,0x80,0xd, 0x7e,0xb3,0xf, +0xf1,0xb4,0x1, 0x11,0xbe,0xe4,0x0, 0x28,0x28,0xb, 0x12,0x62,0x1b,0x7e,0xf0,0xf, +0x74,0xf, 0x12,0x49,0x47,0x7e,0xb3,0xf, 0xf2,0xb4,0x1, 0x48,0x7e,0x73,0x11,0xcb, +0xbe,0x70,0x9, 0x40,0x3f,0x4c,0xff,0x78,0x3b,0x7e,0xd0,0x5, 0x74,0x14,0xac,0xbd, +0x49,0xe5,0x11,0x25,0xa, 0x3c,0xbd,0x3e,0x50,0x17,0xa, 0x5d,0x9e,0x54,0x0, 0x5, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0xa, 0x3f,0x2d,0x32,0x7c, +0xf7,0xb, 0xd0,0xbe,0xd0,0x8, 0x28,0xd4,0x4c,0xff,0x68,0x8, 0x12,0x62,0x1b,0x7c, +0xbf,0x12,0x49,0x47,0x7e,0x73,0xc, 0xdf,0xbe,0x70,0x0, 0x28,0x5f,0x7e,0x73,0xc, +0xe0,0xbe,0x70,0x0, 0x28,0x56,0x6d,0xff,0x6c,0xdd,0x74,0x14,0xac,0xbd,0x49,0xe5, +0x11,0x25,0xbd,0xef,0x28,0x2, 0x7d,0xfe,0xb, 0xd0,0xbe,0xd0,0x4, 0x78,0xeb,0xbe, +0xf4,0x0, 0x14,0x50,0x3c,0x7e,0xb3,0x11,0xcc,0x4, 0x7a,0xb3,0x11,0xcc,0x7e,0xb3, +0xf, 0xf2,0xb4,0x1, 0x5, 0x7e,0xd0,0x4, 0x80,0x3, 0x7e,0xd0,0x8, 0x7e,0x73,0x11, +0xcc,0xbc,0x7d,0x28,0x1c,0x7e,0x73,0xe, 0x47,0xbe,0x73,0xd, 0x17,0x68,0x12,0x6c, +0xee,0xe4,0x7a,0xb3,0xf, 0xf2,0x7a,0xb3,0xf, 0xf1,0x80,0x5, 0xe4,0x7a,0xb3,0x11, +0xcc,0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xc3,0xc, 0xdf,0x7e,0xb3,0xc, 0xe0, +0xf5,0x3f,0x4c,0xcc,0x78,0x57,0x6c,0xff,0x7e,0x34,0x7f,0xff,0x74,0x4, 0xac,0xbf, +0x59,0x35,0x10,0xa4,0x59,0x35,0x10,0xa6,0x7e,0x24,0x1, 0x0, 0x7c,0xbf,0x3e,0xb0, +0x24,0x8, 0xa, 0x3b,0x1b,0x38,0x20,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xda,0xe5,0x3f, +0xbe,0xb0,0x0, 0x38,0x2, 0xc1,0x8e,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac, +0x7f,0x19,0xa3,0xc, 0x7f,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xf0,0x74,0x1, 0x7a,0xb3, +0xc, 0xe4,0xe4,0x7a,0xb3,0xc, 0xe6,0x7a,0xb3,0xc, 0xe7,0xc1,0x8e,0x6c,0xff,0x7e, +0x70,0xff,0x74,0x7, 0xac,0xbf,0x19,0x75,0x11,0xd1,0x7e,0x34,0x7f,0xff,0x59,0x35, +0x11,0xcd,0x59,0x35,0x11,0xcf,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xe2,0xe5,0x3f,0x70, +0x1b,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xc, 0x7f,0xb, +0xf0,0xbe,0xf0,0x5, 0x78,0xf0,0x74,0x1, 0x7a,0xb3,0xc, 0xe3,0x6c,0xff,0x80,0x30, +0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0xc, 0x58,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0xc, 0x5a, +0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0, +0xbc,0xcf,0x38,0xcc,0xe5,0x3f,0x70,0x20,0x6c,0xff,0x80,0x16,0x7e,0x30,0x7, 0xac, +0x3f,0x7d,0x31,0x2e,0x34,0xc, 0x58,0x2e,0x14,0xc, 0x7b,0x74,0x7, 0x12,0x67,0x91, +0xb, 0xf0,0xbc,0xcf,0x38,0xe6,0x80,0x6b,0x6c,0xee,0x6c,0xff,0x6c,0xdd,0x7e,0x70, +0x7, 0xac,0x7d,0x9, 0xa3,0xc, 0x7f,0x7e,0x50,0x7, 0xac,0x5f,0x9, 0xb2,0xc, 0x5c, +0xbc,0xba,0x78,0x1e,0xbe,0xb0,0xff,0x68,0x19,0xbe,0xe0,0x5, 0x50,0x1b,0x2e,0x34, +0xc, 0x7b,0x7e,0x30,0x7, 0xac,0x3e,0x2e,0x14,0x11,0xcd,0x74,0x7, 0x12,0x67,0x91, +0x80,0x7, 0xb, 0xd0,0xbe,0xd0,0x5, 0x40,0xc5,0xbe,0xd0,0x5, 0x78,0x1c,0xbe,0xe0, +0x5, 0x50,0x17,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xc, 0x58,0x7e,0x30,0x7, 0xac, +0x3e,0x2e,0x14,0x11,0xcd,0x74,0x7, 0x12,0x67,0x91,0xb, 0xe0,0xb, 0xf0,0xbe,0xf0, +0x5, 0x78,0x99,0x6c,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x7d,0x31,0x2e,0x34,0x11,0xcd, +0x2e,0x14,0xc, 0x7b,0x74,0x7, 0x12,0x67,0x91,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xe5, +0x6c,0xff,0x80,0x4e,0x7c,0xdf,0x6c,0xee,0x80,0x21,0x7e,0x90,0x7, 0xac,0x9f,0x9, +0xa4,0xc, 0x7f,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xc, 0x5c,0xbc,0xba,0x78,0x9, +0xbe,0xa0,0xff,0x68,0x4, 0x7c,0xde,0x80,0x6, 0xb, 0xe0,0xbc,0xce,0x38,0xdb,0xbe, +0xd0,0x5, 0x40,0x2, 0x7c,0xdf,0xe5,0x3f,0x70,0xf, 0x7e,0x24,0xc, 0x58,0x7e,0x34, +0xc, 0x7b,0x7e,0x14,0x0, 0x23,0x12,0x6d,0x6c,0x7c,0xbf,0x7c,0x7d,0x12,0x0, 0x76, +0xb, 0xf0,0xbc,0xcf,0x38,0xae,0x6c,0xff,0x74,0x7, 0xac,0xbf,0x49,0x35,0xc, 0x7b, +0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x59,0x35,0xc, 0x58,0x74,0x7, 0xac,0xbf, +0x49,0x35,0xc, 0x7d,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x59,0x35,0xc, 0x5a, +0x74,0x7, 0xac,0xbf,0x9, 0x75,0xc, 0x7f,0x19,0x75,0xc, 0x5c,0xb, 0xf0,0xbe,0xf0, +0x5, 0x78,0xc5,0xbe,0xc0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0xc, 0xe8,0xda,0x3b, +0x22,0xca,0x3b,0x6c,0xff,0x7e,0xe3,0xe, 0x28,0x7e,0xd3,0xe, 0x29,0x7e,0xb3,0xd, +0xd4,0xb4,0x1, 0x2, 0x80,0x2, 0xe1,0xb3,0x6c,0xcc,0xe1,0xa5,0x7e,0x70,0x2, 0xac, +0x7c,0x9, 0xb3,0xb, 0x96,0xf5,0x40,0x9, 0xb3,0xb, 0x97,0xf5,0x41,0x75,0x3f,0x2, +0x7e,0x73,0xc, 0x5d,0x7a,0x71,0x62,0xbe,0x70,0x30,0x50,0xa, 0x7e,0xb3,0xc, 0x3d, +0xb4,0x1, 0x3, 0x75,0x3f,0x1, 0x7e,0xb3,0xc, 0x43,0xb4,0x1, 0x3, 0x75,0x3f,0x2, +0xe5,0x41,0x70,0xb, 0xe5,0x40,0x60,0x28,0xe5,0x40,0xbe,0xb0,0xc, 0x68,0x21,0xe5, +0x41,0xb4,0x17,0xb, 0xe5,0x40,0x60,0x18,0xe5,0x40,0xb4,0xc, 0x2, 0x80,0x11,0xe5, +0x41,0x70,0x2, 0x80,0xb, 0xe5,0x41,0xb4,0x17,0x2, 0x80,0x4, 0xe5,0x40,0x70,0x4, +0x74,0x8, 0x80,0xb, 0xe5,0x40,0xb4,0xc, 0x4, 0x74,0x20,0x80,0x2, 0x74,0x8, 0x7a, +0xb3,0xd, 0x4b,0xe5,0x40,0xbe,0xb0,0x0, 0x28,0x1f,0xa, 0x2e,0x1b,0x24,0xe5,0x40, +0xa, 0x3b,0xbd,0x32,0x58,0x13,0xe5,0x41,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2d,0x1b, +0x24,0xe5,0x41,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x3f,0x1, 0x75,0x42,0x0, 0x80, +0x3e,0xe5,0x42,0xbc,0xbc,0x68,0x36,0x7e,0x71,0x42,0x74,0x2, 0xac,0x7b,0x9, 0xa3, +0xb, 0x96,0x9, 0x33,0xb, 0x97,0xa, 0x2a,0xe5,0x40,0xa, 0x3b,0x9d,0x32,0x12,0x6d, +0x95,0xbe,0x34,0x0, 0x3, 0x18,0x16,0xa, 0x23,0xe5,0x41,0xa, 0x3b,0x9d,0x32,0x12, +0x6d,0x95,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x3f,0x1, 0x80,0xb, 0x5, 0x42,0x7e, +0x23,0xc, 0x3d,0xbe,0x21,0x42,0x38,0xb9,0xe5,0x3f,0x7c,0x7c,0x7c,0x6f,0x12,0x14, +0x8, 0xb, 0xf0,0xb, 0xc0,0x7e,0x73,0xc, 0x3d,0xbc,0x7c,0x28,0x2, 0xc1,0xac,0x7a, +0xf3,0xc, 0x3d,0xda,0x3b,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x7e,0xb3,0xe, 0x4b,0x60, +0x3, 0xb4,0x1, 0x37,0xa9,0xc6,0xea,0xb4,0x1, 0x7, 0x12,0x3c,0xef,0x70,0x7, 0x80, +0x0, 0x12,0x2c,0x3e,0x7c,0xfb,0x7e,0x37,0xd, 0xdb,0x7e,0x27,0xd, 0xd9,0x12,0x60, +0xd1,0x7e,0x37,0xd, 0xdb,0x7e,0x27,0xd, 0xd9,0x12,0x4e,0xbc,0xbe,0xf0,0x1, 0x78, +0x4, 0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0xe, 0x4b,0xda,0xf8,0x22,0xff,0xff, +0xca,0x3b,0x75,0x44,0x0, 0xe4,0x7a,0xb3,0x11,0xce,0x12,0x4f,0x49,0x7e,0xb3,0xe, +0x28,0xf5,0x3f,0x7e,0xb3,0xe, 0x29,0xf5,0x40,0x7e,0xb3,0xc, 0x3d,0xf5,0x41,0x70, +0x5, 0xe4,0x7a,0xb3,0x12,0xd2,0x7e,0x37,0x12,0xcd,0xbe,0x34,0x0, 0x0, 0x28,0x5, +0x75,0x44,0x1, 0x80,0x5, 0xe4,0x7a,0xb3,0x12,0xd2,0x6d,0x66,0x7e,0xa1,0x41,0x74, +0x6, 0xa4,0x7a,0x55,0x42,0xbe,0x54,0x0, 0x1e,0x50,0x7, 0x7e,0x34,0x0, 0x1e,0x7a, +0x35,0x42,0x6c,0xff,0x80,0x3e,0x7e,0x70,0x30,0xac,0x7f,0x2e,0x37,0xd, 0xdb,0x6c, +0xee,0x80,0x29,0x7d,0x23,0xb, 0x35,0xb, 0x28,0x20,0x7e,0x14,0x6d,0xe3,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x10,0xbd,0x12,0x50,0x11,0x7e,0x14,0x6d,0xe5,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x10,0xbd,0x12,0x28,0x2, 0xb, 0x64,0xb, 0xe0,0xe5,0x40,0xbc,0xbe, +0x38,0xd1,0xb, 0xf0,0xe5,0x3f,0xbc,0xbf,0x38,0xbc,0xbe,0x64,0x0, 0x3c,0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x12,0xd1,0x7e,0x35,0x42,0xbd,0x36,0x50,0x2d,0x7e,0xa3,0x12, +0xd2,0x4c,0xaa,0x78,0xa, 0x7e,0x37,0x12,0xcf,0xbe,0x34,0x0, 0xbe,0x8, 0x1b,0x75, +0x44,0x1, 0x74,0x1, 0x7a,0xb3,0x11,0xce,0x7e,0x34,0x3, 0x20,0x7a,0x37,0x12,0xcd, +0x4c,0xaa,0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x12,0xd2,0x7e,0xb3,0x11,0xce,0x70,0xd, +0x7e,0xb3,0x12,0xd2,0xb4,0x1, 0x6, 0x74,0x2, 0x7a,0xb3,0x12,0xd2,0x7e,0xe7,0x12, +0xcb,0xe5,0x44,0xb4,0x1, 0x2, 0x80,0x2, 0x41,0x1d,0x6c,0xff,0x41,0x15,0x7c,0xbf, +0x12,0x62,0xb0,0x70,0x2, 0x41,0x13,0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0xb, 0x96, +0xf5,0x45,0x9, 0xb3,0xb, 0x97,0xf5,0x46,0xe4,0x7a,0xb3,0x11,0xcd,0x7c,0xbf,0x12, +0x5f,0x5f,0x7a,0x35,0x47,0x6d,0xdd,0xe5,0x45,0xbe,0xb0,0x0, 0x38,0x2, 0x41,0x0, +0xe5,0x3f,0xa, 0xfb,0x1b,0xf4,0xe5,0x45,0xa, 0xcb,0xbd,0xcf,0x48,0x2, 0x41,0x0, +0xe5,0x46,0xbe,0xb0,0x0, 0x38,0x2, 0x41,0x0, 0xe5,0x40,0xa, 0xfb,0x1b,0xf4,0xe5, +0x46,0xa, 0xbb,0xbd,0xbf,0x48,0x2, 0x41,0x0, 0xe5,0x45,0xa, 0xfb,0x1b,0xf4,0x7d, +0x3f,0x7c,0xe7,0x80,0x3e,0xe5,0x46,0xa, 0x1b,0x1b,0x14,0x80,0x2a,0xe5,0x45,0xbc, +0xbe,0x78,0x6, 0xe5,0x46,0xbc,0xb3,0x68,0x1c,0x7e,0x90,0x30,0xac,0x9e,0x74,0x2, +0xac,0xb3,0x7d,0xf5,0x2d,0xf4,0x2e,0xf7,0xd, 0xdb,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, +0x0, 0x8, 0x2, 0x2d,0xdf,0xb, 0x30,0x7d,0xab,0xb, 0xa4,0xa, 0xf3,0xbd,0xfa,0x8, +0xcc,0xb, 0xe0,0x7d,0xac,0xb, 0xa4,0xa, 0xfe,0xbd,0xfa,0x8, 0xb8,0x7e,0xf5,0x47, +0x7e,0x34,0x0, 0x6, 0xad,0x3f,0xbd,0x3d,0x28,0x1e,0xbe,0xe4,0x0, 0x0, 0x28,0x7, +0xbe,0xe5,0x47,0x38,0x2, 0x80,0x6, 0xbe,0xf4,0x0, 0xb4,0x28,0x6, 0x74,0x1, 0x7a, +0xb3,0x11,0xcd,0x75,0x49,0x0, 0x80,0xf, 0xbe,0xf4,0x1, 0x68,0x28,0x6, 0x74,0x1, +0x7a,0xb3,0x11,0xcd,0x75,0x49,0x1, 0x74,0x1, 0x7a,0xb3,0x11,0xcd,0x7e,0xb3,0x12, +0xd1,0x60,0x13,0xe5,0x45,0x7e,0x71,0x46,0x7e,0x61,0x49,0x12,0x49,0xe9,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x11,0xcd,0x7e,0xb3,0x11,0xcd,0x70,0x7, 0x7c,0xbf,0x6c,0x77, +0x12,0x0, 0x5e,0xb, 0xf0,0xe5,0x41,0xbc,0xbf,0x28,0x2, 0x1, 0xfe,0xda,0x3b,0x22, +0xca,0x79,0x75,0x42,0x0, 0x75,0x43,0x0, 0x6c,0xff,0x6c,0xee,0x74,0x2, 0xac,0xbe, +0x2e,0x57,0xd, 0xd7,0xb, 0x58,0xe0,0xbe,0xe4,0x1, 0xf4,0x8, 0x2, 0x5, 0x42,0xbe, +0xe4,0xff,0x9c,0x58,0x2, 0x5, 0x43,0xb, 0xe0,0xbe,0xe0,0x18,0x78,0xde,0x6d,0x0, +0x7d,0xf0,0x6c,0x33,0x61,0xe4,0x7e,0x70,0x2, 0xac,0x73,0x9, 0xb3,0xb, 0x96,0xf5, +0x3f,0x9, 0x23,0xb, 0x97,0x9f,0x66,0x75,0x45,0x0, 0x7c,0xb3,0x12,0x5f,0x5f,0x7d, +0x43,0xbd,0x4f,0x8, 0x2, 0x7d,0xf4,0x7e,0x73,0xe, 0x29,0xa, 0x37,0x1b,0x34,0xe5, +0x42,0xa, 0x5b,0xbd,0x53,0x58,0x2, 0x61,0x29,0xe5,0x3f,0xbe,0xb0,0x0, 0x38,0x2, +0x61,0x29,0x7e,0xa3,0xe, 0x28,0x7c,0xba,0x14,0xa, 0x2b,0xe5,0x3f,0xa, 0x3b,0xbd, +0x32,0x48,0x2, 0x61,0x29,0xbe,0x20,0x0, 0x38,0x2, 0x61,0x29,0xbe,0x20,0x17,0x50, +0x78,0x1b,0x34,0x7c,0xb7,0xf5,0x40,0x80,0x62,0xa, 0x32,0x1b,0x34,0x7c,0xb7,0xf5, +0x41,0x80,0x4a,0xe5,0x40,0xbe,0xb0,0x0, 0x48,0x41,0xa, 0x3a,0x1b,0x34,0x7c,0xb7, +0x1a,0xbb,0xe5,0x40,0x1a,0xab,0xbd,0xab,0x18,0x31,0xe5,0x41,0xbe,0xb0,0x0, 0x48, +0x2a,0xe5,0x41,0xbe,0xb0,0x17,0x18,0x23,0x7e,0xb4,0x0, 0x18,0xad,0xba,0xe5,0x41, +0x1a,0x3b,0x2d,0x3b,0x3e,0x34,0x2e,0x37,0xd, 0xdb,0xb, 0x38,0x30,0xbe,0x34,0x0, +0x0, 0x8, 0x8, 0x1a,0x26,0x1a,0x24,0x2f,0x61,0x5, 0x45,0x5, 0x41,0xa, 0x22,0xb, +0x24,0xe5,0x41,0x1a,0x3b,0xbd,0x32,0x8, 0xaa,0x5, 0x40,0xe5,0x3f,0xa, 0x2b,0xb, +0x24,0xe5,0x40,0x1a,0x3b,0xbd,0x32,0x8, 0x90,0x7d,0x34,0x1a,0x26,0x1a,0x24,0x2f, +0x11,0xbf,0x61,0x18,0xf, 0xbe,0x68,0x0, 0x0, 0x8, 0x9, 0xe5,0x45,0xbe,0xb0,0x5, +0x40,0x2, 0x80,0x63,0x75,0x44,0x0, 0x6c,0xee,0x80,0x4f,0x7e,0x50,0x30,0xac,0x5e, +0x7e,0x70,0x2, 0xac,0x72,0x7d,0xb3,0x2d,0xb2,0x2e,0xb7,0xd, 0xdb,0xb, 0xb8,0xe0, +0xbd,0xe4,0x18,0x34,0x7d,0xae,0x3e,0xa4,0xbd,0xa4,0x48,0x2c,0x6d,0x99,0x7d,0xa9, +0xa5,0xba,0x0, 0x2, 0x80,0x14,0xa5,0xba,0x17,0x9, 0x7d,0xab,0x1b,0xa5,0xb, 0xa8, +0xa0,0x80,0xb, 0x7d,0xab,0x1b,0xa5,0xb, 0xa8,0xa0,0x49,0x9b,0x0, 0x2, 0xbd,0xae, +0x58,0x6, 0xbd,0x9e,0x58,0x2, 0x5, 0x44,0xb, 0xe0,0x7e,0xb3,0xe, 0x28,0xbc,0xbe, +0x38,0xa9,0xbe,0xb1,0x44,0x38,0x5, 0x7e,0xf0,0x20,0x80,0x31,0x7e,0x70,0x2, 0xac, +0x72,0x2e,0x37,0xd, 0xd7,0xb, 0x38,0x30,0xbe,0x34,0x0, 0x0, 0x48,0x15,0x7e,0x71, +0x3f,0x74,0x2, 0xac,0x7b,0x2e,0x37,0xd, 0xd7,0x49,0x33,0x0, 0x30,0xbe,0x34,0x0, +0x0, 0x58,0xa, 0xe5,0x43,0xbe,0xb0,0xc, 0x40,0x3, 0x7e,0xf0,0x8, 0xbe,0xf0,0x0, +0x38,0xc, 0xb, 0x30,0x7e,0xb3,0xc, 0x3d,0xbc,0xb3,0x28,0x2, 0x41,0x56,0xbe,0xf4, +0x3, 0x20,0x8, 0x3, 0x7e,0xf0,0x20,0x4c,0xff,0x78,0x3e,0x6c,0x33,0x80,0x29,0x74, +0x2, 0xac,0xb3,0x9, 0x65,0xb, 0xb4,0x7a,0x61,0x3f,0x9, 0x25,0xb, 0xb5,0x7e,0x70, +0x18,0xac,0x67,0xa, 0x22,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xd, 0xdb,0xb, 0x38,0x40, +0xbd,0x4, 0x8, 0x2, 0x7d,0x4, 0xb, 0x30,0x7e,0x73,0xc, 0x3e,0xbc,0x73,0x38,0xcf, +0xbe,0x4, 0xfd,0xa8,0x58,0x3, 0x7e,0xf0,0x20,0x7c,0xbf,0xda,0x79,0x22,0xca,0x3b, +0x7e,0x34,0x12,0x16,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6d,0xa5,0x7e,0xe0,0x1, 0x7e, +0x73,0xe, 0x4a,0x7a,0x73,0x11,0xcd,0x7a,0xb3,0xe, 0x4a,0x6c,0xdd,0x6c,0xcc,0x80, +0x11,0xa, 0x3c,0x2e,0x37,0xe, 0x6b,0x7e,0x39,0x70,0xbc,0x7d,0x40,0x2, 0x7c,0xd7, +0xb, 0xc0,0x7e,0x73,0xe, 0x28,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1b,0x50,0xc, 0xa, +0x2d,0x7e,0x34,0x0, 0x1b,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd,0x7a,0xd1,0x3f, +0x7e,0x34,0xe, 0x28,0x12,0x65,0xa, 0x7e,0x34,0xe, 0x28,0x12,0x6c,0xf1,0xa1,0xf0, +0x12,0x61,0xd9,0x12,0x6c,0x9c,0xe5,0x64,0x60,0xfc,0xa9,0xb7,0xea,0x7e,0x37,0xd, +0xdb,0x7e,0x27,0xd, 0xd9,0x7e,0x14,0x18,0x0, 0x12,0x5c,0x2a,0x6c,0xcc,0x80,0x60, +0x6c,0xff,0x80,0x52,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3,0x11,0xfe,0x6d, +0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x11,0xce,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70, +0x2, 0xac,0x7f,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14, +0xe, 0x14,0xe, 0x14,0xe, 0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x11,0xce,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xa, 0x3f,0x2e,0x34,0x11,0xfe,0x7e,0x39,0xb0, +0x4, 0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0xe, 0x29,0xbc,0x7f,0x38,0xa6,0xb, 0xc0, +0x7e,0x73,0xe, 0x28,0xbc,0x7c,0x38,0x98,0x75,0x40,0x0, 0x6c,0xcc,0xa1,0xcf,0xa, +0x3c,0x9, 0xa3,0x11,0xfe,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x21,0x34,0x7e,0x70,0x2, +0xac,0x7c,0x59,0x43,0x11,0xce,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x11, +0xce,0xa, 0xa, 0x8d,0x10,0x59,0x12,0x11,0xce,0x2e,0x24,0x11,0xce,0xb, 0x28,0x30, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, +0xac,0x5c,0x49,0x32,0x11,0xce,0xbe,0x34,0x1f,0x40,0x50,0x22,0xa, 0x1c,0x2e,0x14, +0x12,0x16,0x7e,0x19,0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0xe, 0x71,0x7e, +0x19,0xb0,0xbc,0xbd,0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34, +0x23,0x28,0x28,0x27,0xa, 0x3c,0x2e,0x34,0x12,0x16,0x7e,0x39,0xb0,0x4, 0x7a,0x39, +0xb0,0xa, 0x3c,0x2e,0x37,0xe, 0x71,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14, +0x7a,0x39,0xb0,0x80,0x8, 0x5, 0x40,0x6c,0xee,0x80,0x2, 0x5, 0x40,0xb, 0xc0,0x7e, +0x73,0xe, 0x29,0xbc,0x7c,0x28,0x2, 0xa1,0x2f,0x7e,0x34,0xe, 0x28,0x12,0x65,0xa, +0x7e,0x34,0xe, 0x28,0x12,0x6c,0xf1,0x7e,0x73,0xe, 0x29,0xbe,0x71,0x40,0x68,0xe, +0x7e,0xa1,0x3f,0x7c,0xba,0x14,0xf5,0x3f,0x4c,0xaa,0x68,0x2, 0x81,0xa0,0x7e,0x73, +0x11,0xcd,0x7a,0x73,0xe, 0x4a,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x12,0x16, +0xbc,0x7d,0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xe, 0x29,0xbc,0x7f, +0x38,0xe8,0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xc, 0xdf,0x4c,0xff,0x78, +0xe, 0x7e,0x34,0x10,0x6a,0x7e,0x24,0x0, 0x5, 0xe4,0x12,0x6d,0xa5,0xe1,0xda,0x6c, +0xee,0x74,0x2, 0xac,0xbe,0x49,0x15,0xc, 0xcb,0xbe,0x14,0xff,0xff,0x78,0x7, 0xe4, +0xa, 0x1e,0x19,0xb1,0x10,0x6a,0xb, 0xe0,0xbe,0xe0,0x5, 0x78,0xe4,0x6c,0xee,0xe1, +0xd4,0x74,0x7, 0xac,0xbe,0x9, 0xd5,0xc, 0x5c,0x49,0xf5,0xc, 0x58,0x49,0xe5,0xc, +0x5a,0xa, 0x1d,0x9, 0xb1,0x10,0x6a,0x70,0x29,0x6c,0xcc,0x7e,0x70,0x14,0xac,0x7d, +0x7e,0x30,0x4, 0xac,0x3c,0x2d,0x13,0x59,0xf1,0x10,0x6, 0x7e,0x70,0x14,0xac,0x7d, +0x7e,0x30,0x4, 0xac,0x3c,0x2d,0x13,0x59,0xe1,0x10,0x8, 0xb, 0xc0,0xbe,0xc0,0x5, +0x78,0xd9,0xa, 0x1d,0x9, 0xb1,0x10,0x6a,0xbe,0xb0,0x5, 0x50,0xa, 0xa, 0x1d,0x2e, +0x14,0x10,0x6a,0x4, 0x7a,0x19,0xb0,0xa, 0x1d,0x9, 0xb1,0x10,0x6a,0x70,0x2, 0xe1, +0x44,0x74,0x14,0xac,0xbd,0x49,0x45,0x10,0x16,0x49,0x35,0x10,0x12,0x2d,0x43,0x49, +0x25,0x10,0x18,0x49,0x5, 0x10,0x14,0x2d,0x2, 0x9d,0x3f,0x12,0x6d,0x95,0x7d,0xd3, +0x74,0x14,0xac,0xbd,0x49,0x35,0x10,0x14,0x9d,0x3e,0x12,0x6d,0x95,0x7d,0xc3,0x7e, +0x30,0x14,0xac,0x3d,0x49,0x31,0x10,0xe, 0x49,0x51,0x10,0xa, 0xbd,0x53,0x78,0xc, +0x49,0x51,0x10,0x10,0x49,0x11,0x10,0xc, 0xbd,0x15,0x68,0x2c,0xbe,0xd4,0x0, 0x33, +0x38,0x32,0xbe,0xc4,0x0, 0x1e,0x38,0x2c,0x7e,0x34,0x0, 0x6, 0x7d,0xbf,0xad,0xb3, +0x7d,0xfb,0x2d,0xf4,0x1e,0xf4,0x1e,0xf4,0x1e,0xf4,0xad,0x3e,0x7d,0xe3,0x2d,0xe0, +0x1e,0xe4,0x1e,0xe4,0x1e,0xe4,0x80,0xc, 0x1e,0x44,0x2d,0xf4,0x1e,0xf4,0x1e,0x4, +0x2d,0xe0,0x1e,0xe4,0xa, 0x1d,0x9, 0xb1,0x10,0x6a,0x60,0x76,0x74,0x14,0xac,0xbd, +0x49,0x25,0x10,0xe, 0x7d,0x3f,0x9d,0x32,0x12,0x6d,0x95,0x7d,0x43,0x74,0x14,0xac, +0xbd,0x49,0x25,0x10,0x10,0x7d,0x3e,0x9d,0x32,0x12,0x6d,0x95,0x7d,0x3, 0xbe,0x44, +0x0, 0x33,0x38,0x6, 0xbe,0x4, 0x0, 0x33,0x28,0x24,0x7e,0x30,0x14,0xac,0x3d,0x7d, +0x31,0x2e,0x34,0x10,0xe, 0x2e,0x14,0x10,0xa, 0x74,0x4, 0x12,0x67,0x91,0x74,0x14, +0xac,0xbd,0x59,0xf5,0x10,0xe, 0x74,0x14,0xac,0xbd,0x59,0xe5,0x10,0x10,0x7e,0x30, +0x14,0xac,0x3d,0x7d,0x31,0x2e,0x34,0x10,0x12,0x2e,0x14,0x10,0x16,0x74,0x4, 0x12, +0x67,0x91,0x74,0x14,0xac,0xbd,0x59,0xf5,0x10,0x12,0x74,0x14,0xac,0xbd,0x59,0xe5, +0x10,0x14,0x74,0x7, 0xac,0xbe,0x59,0xf5,0xc, 0x58,0x74,0x7, 0xac,0xbe,0x59,0xe5, +0xc, 0x5a,0xb, 0xe0,0xbc,0xfe,0x28,0x2, 0xc1,0x61,0xda,0x3b,0x22,0x7d,0x12,0x5e, +0x14,0x0, 0x7, 0x2e,0x14,0x6d,0xce,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0x1e, +0x24,0x1e,0x24,0x1e,0x24,0x2d,0x23,0x7e,0x29,0x70,0x4c,0x7b,0x7a,0x29,0x70,0x22, +0xca,0x3b,0x7e,0xb3,0xe, 0x39,0xf5,0x3f,0xe4,0x7a,0xb3,0xe, 0x39,0x7e,0xb3,0xe, +0x37,0xf5,0x40,0x74,0x1, 0x7a,0xb3,0xe, 0x37,0x7e,0x37,0xe, 0x45,0x7e,0x24,0x0, +0x25,0xe4,0x12,0x6d,0xa5,0x7e,0xe0,0x7, 0x12,0x61,0xd9,0x6c,0xff,0x7e,0x24,0x0, +0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0xa, 0xef,0x2e,0xe7,0xe, 0x45, +0x7e,0xe9,0x70,0x4c,0x75,0x7a,0xe9,0x70,0xb, 0xf0,0xbe,0xf0,0x25,0x78,0xde,0x7e, +0x34,0xe, 0x28,0x12,0x68,0xec,0x7e,0x34,0xe, 0x28,0x12,0x6c,0x24,0xe5,0x65,0x60, +0xfc,0x7e,0x37,0xd, 0xd7,0x7e,0x25,0x5f,0x12,0x57,0x90,0x6c,0xff,0xa, 0xef,0x9, +0xde,0xc, 0xf2,0x74,0x2, 0xac,0xbf,0x7d,0xe5,0x2e,0xe7,0xd, 0xd7,0xb, 0xe8,0xe0, +0xbe,0xe4,0x25,0x80,0x18,0x21,0x7e,0xe4,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x7d,0x2e,0x6e,0x24,0xff,0xff,0xa, 0xed,0x2e,0xe7,0xe, 0x45,0x7e, +0xe9,0x70,0x5c,0x75,0x7a,0xe9,0x70,0xb, 0xf0,0xbe,0xf0,0x25,0x78,0xbf,0x1b,0xe0, +0xbe,0xe0,0x0, 0x48,0x2, 0x1, 0x28,0x7e,0xb3,0xe, 0x36,0xb4,0x1, 0x2, 0x80,0x2, +0x21,0x9e,0x7e,0xe0,0xa, 0x74,0x2, 0x7a,0xb3,0xe, 0x37,0x21,0x94,0x12,0x61,0xd9, +0x7e,0x73,0xe, 0x28,0xa, 0x37,0x7e,0x53,0xe, 0x29,0xa, 0xe5,0x2d,0xe3,0x7d,0x3e, +0x7c,0xc7,0x6c,0xff,0x80,0x78,0x7e,0xa3,0xe, 0x29,0xbc,0xaf,0x28,0x11,0xa, 0x3f, +0x9, 0xd3,0xc, 0xf2,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x37,0xd, 0xd7,0x80,0x27,0xa, +0x2a,0xa, 0x3f,0x9d,0x32,0x2e,0x37,0xe, 0x30,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34, +0x0, 0x18,0x7c,0xd7,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x37,0xd, 0xd7,0x2e,0x34,0x0, +0x30,0x74,0x2, 0xa4,0x9d,0x35,0xb, 0x38,0xf0,0xbe,0xf4,0x31,0x38,0x48,0x11,0xa, +0xed,0x2e,0xe7,0xe, 0x45,0x7e,0xe9,0xb0,0xbe,0xb0,0xfe,0x50,0x1f,0x4, 0x80,0x15, +0xbe,0xf4,0x19,0xc8,0x18,0x14,0xa, 0xed,0x2e,0xe7,0xe, 0x45,0x7e,0xe9,0xb0,0xbe, +0xb0,0x0, 0x28,0x8, 0x14,0x7a,0xe9,0xb0,0x80,0x2, 0x1b,0xc0,0xb, 0xf0,0x7e,0x73, +0xe, 0x28,0xa, 0x27,0x7e,0x73,0xe, 0x29,0xa, 0x37,0x2d,0x32,0xa, 0xef,0xbd,0xe3, +0x58,0x2, 0x1, 0xe6,0x4c,0xcc,0x68,0x26,0x7e,0x34,0xe, 0x28,0x12,0x68,0xec,0x7e, +0x34,0xe, 0x28,0x12,0x6c,0x24,0xe5,0x65,0x60,0xfc,0x7e,0x37,0xd, 0xd7,0x7e,0x25, +0x5f,0x12,0x57,0x90,0x7c,0xae,0x1b,0xe0,0x4c,0xaa,0x68,0x2, 0x1, 0xcd,0xe5,0x3f, +0x7a,0xb3,0xe, 0x39,0xe5,0x40,0x7a,0xb3,0xe, 0x37,0xda,0x3b,0x22,0xca,0x3b,0x75, +0x3f,0x0, 0x7e,0x34,0xa, 0xd9,0x7e,0x24,0x0, 0x4, 0xe4,0x12,0x6d,0xa5,0xe4,0x7a, +0xb3,0xb, 0x8c,0x7a,0xb3,0xb, 0x8d,0x7a,0xb3,0xb, 0x8e,0x7a,0xb3,0xb, 0x8f,0x7e, +0xb3,0xd, 0xd3,0xb4,0x1, 0x2, 0x80,0x2, 0x61,0x47,0x7e,0x34,0x11,0xcd,0x7e,0x24, +0x0, 0x5, 0x74,0xff,0x12,0x6d,0xa5,0x7e,0x34,0x11,0xd2,0x7e,0x24,0x0, 0x5, 0x74, +0xff,0x12,0x6d,0xa5,0x7e,0x37,0xd, 0xd7,0x7e,0xb3,0xe, 0x29,0x7e,0x27,0xd, 0x44, +0x7e,0x14,0x11,0xcd,0x6c,0x11,0x12,0x46,0x4b,0x7c,0xeb,0x7e,0x37,0xd, 0xd7,0x2e, +0x34,0x0, 0x30,0x7e,0xb3,0xe, 0x28,0x7e,0x27,0xd, 0x42,0x7e,0x14,0x11,0xd2,0x12, +0x46,0x4b,0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x5a,0xa, 0x3a,0x9, 0xb3,0x11,0xd2, +0xa, 0x4a,0x19,0xb4,0xb, 0x91,0x6c,0xcc,0x80,0x44,0x7c,0xbf,0xc4,0x23,0x54,0x1f, +0x7c,0x6b,0x7a,0x61,0x3f,0xa, 0x2a,0x9, 0x72,0x11,0xd2,0x7e,0x50,0x2, 0xac,0x5f, +0x19,0x72,0xa, 0x75,0xa, 0x1c,0x9, 0x71,0x11,0xcd,0x19,0x72,0xa, 0x76,0x7c,0xbf, +0x54,0x7, 0x7e,0x70,0x1, 0x60,0x5, 0x3e,0x70,0x14,0x78,0xfb,0xa, 0x46,0x2e,0x44, +0xa, 0xd9,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xc0,0xbc,0xec, +0x38,0xb8,0xb, 0xa0,0xbc,0xda,0x38,0xa2,0x7a,0xf3,0xb, 0x8c,0x7a,0xd3,0xb, 0x90, +0x7e,0x34,0x11,0xcd,0x7e,0x24,0x0, 0x5, 0x74,0xff,0x12,0x6d,0xa5,0x7e,0x34,0x11, +0xd2,0x7e,0x24,0x0, 0x5, 0x74,0xff,0x12,0x6d,0xa5,0x7e,0x37,0xd, 0xd7,0x7e,0xb3, +0xe, 0x29,0x7e,0x27,0xd, 0x46,0x7e,0x14,0x11,0xcd,0x7e,0x10,0x1, 0x12,0x46,0x4b, +0x7c,0xeb,0x7e,0x37,0xd, 0xd7,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0xe, 0x28,0x7e,0x27, +0xd, 0x46,0x7e,0x14,0x11,0xd2,0x12,0x46,0x4b,0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80, +0x27,0x6c,0xcc,0x80,0x1d,0xa, 0x3a,0x9, 0x73,0x11,0xd2,0x7e,0x90,0x2, 0xac,0x9f, +0x19,0x74,0xa, 0xa7,0xa, 0x3c,0x9, 0xb3,0x11,0xcd,0x19,0xb4,0xa, 0xa8,0xb, 0xf0, +0xb, 0xc0,0xbc,0xec,0x38,0xdf,0xb, 0xa0,0xbc,0xda,0x38,0xd5,0x7a,0xf3,0xb, 0x8d, +0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x37,0xd, 0xd7,0xb, 0x38,0x20,0xbe,0x27, +0xd, 0x48,0x8, 0x9, 0x7e,0xb3,0xb, 0x8e,0x4, 0x7a,0xb3,0xb, 0x8e,0x6d,0x33,0x9e, +0x37,0xd, 0x48,0xbd,0x23,0x58,0x9, 0x7e,0xb3,0xb, 0x8f,0x4, 0x7a,0xb3,0xb, 0x8f, +0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xcb,0xda,0x3b,0x22,0x7c,0xab,0xbe,0xa0,0x10,0x40, +0x11,0xbe,0xa0,0x4b,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0x0, 0xcb,0x9e,0x34,0x0, 0x10, +0x81,0xc5,0x4c,0xaa,0x78,0x3, 0xe5,0x18,0x22,0xbe,0xa0,0x1, 0x78,0x3, 0xe5,0x19, +0x22,0xbe,0xa0,0x2, 0x78,0x5, 0x7e,0xb3,0xc, 0xf1,0x22,0xbe,0xa0,0x3, 0x40,0x11, +0xbe,0xa0,0x5, 0x38,0xc, 0xa, 0x3a,0x2e,0x34,0xe, 0x28,0x9e,0x34,0x0, 0x3, 0x81, +0xc5,0xbe,0xa0,0x6, 0x78,0x3, 0x74,0x80,0x22,0xbe,0xa0,0x7, 0x78,0x5, 0x7e,0xb3, +0xe, 0x48,0x22,0xbe,0xa0,0x8, 0x40,0x1b,0xbe,0xa0,0xc, 0x38,0x16,0x7e,0x43,0xe, +0x38,0x7e,0x50,0x2, 0xac,0x45,0x7e,0x70,0x4, 0xac,0x7a,0x2d,0x32,0x49,0x33,0x0, +0x4e,0x81,0xc5,0xbe,0xa0,0x4c,0x78,0x5, 0x7e,0xb3,0xd, 0x3e,0x22,0xbe,0xa0,0xfb, +0x78,0x3, 0xe5,0x15,0x22,0xbe,0xa0,0x4e,0x78,0x5, 0x7e,0xb3,0xe, 0x47,0x22,0xbe, +0xa0,0x50,0x40,0x11,0xbe,0xa0,0x51,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x2c,0x9e, +0x34,0x0, 0x50,0x81,0xc5,0xbe,0xa0,0x52,0x40,0x11,0xbe,0xa0,0x55,0x38,0xc, 0xa, +0x3a,0x2e,0x37,0xe, 0x2e,0x9e,0x34,0x0, 0x52,0x81,0xc5,0xbe,0xa0,0x56,0x40,0x11, +0xbe,0xa0,0x62,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x30,0x9e,0x34,0x0, 0x56,0x81, +0xc5,0xbe,0xa0,0x63,0x40,0x11,0xbe,0xa0,0x7a,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, +0x32,0x9e,0x34,0x0, 0x63,0x81,0xc5,0xbe,0xa0,0x7b,0x40,0x1d,0xbe,0xa0,0x9f,0x38, +0x18,0xa, 0x3a,0x9, 0xa3,0xc, 0x77,0x7e,0xb3,0xe, 0x38,0xa, 0x3a,0x70,0x5, 0x9, +0xb3,0xd, 0xdd,0x22,0x9, 0xb3,0xd, 0x63,0x22,0xbe,0xa0,0xa0,0x40,0x11,0xbe,0xa0, +0xac,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x69,0x9e,0x34,0x0, 0xa0,0x80,0x56,0xbe, +0xa0,0xad,0x40,0x11,0xbe,0xa0,0xb9,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x6b,0x9e, +0x34,0x0, 0xad,0x80,0x40,0xbe,0xa0,0xba,0x40,0x11,0xbe,0xa0,0xd1,0x38,0xc, 0xa, +0x3a,0x2e,0x37,0xe, 0x6d,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe,0xa0,0xd2,0x40,0x11, +0xbe,0xa0,0xd5,0x38,0xc, 0xa, 0x3a,0x2e,0x37,0xe, 0x6f,0x9e,0x34,0x0, 0xd2,0x80, +0x14,0xbe,0xa0,0xd6,0x40,0x13,0xbe,0xa0,0xed,0x38,0xe, 0xa, 0x3a,0x2e,0x37,0xe, +0x71,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xf8,0x78,0x5, 0x7e,0xb3, +0xf, 0xf9,0x22,0xbe,0xa0,0xf9,0x78,0x7, 0x7e,0xb3,0xe, 0xba,0x54,0xfd,0x22,0x74, +0xff,0x22,0xca,0x79,0x74,0xd, 0x7a,0xb3,0xe, 0x28,0x74,0x18,0x7a,0xb3,0xe, 0x29, +0x74,0x4, 0x7a,0xb3,0xe, 0x2a,0xe4,0x7a,0xb3,0xe, 0x2b,0x7e,0x34,0xf, 0xa4,0x7a, +0x37,0xe, 0x2c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0xe, 0x2e,0x7e,0x34,0xd, 0xc6,0x7a, +0x37,0xe, 0x30,0x7e,0x34,0xd, 0xad,0x7a,0x37,0xe, 0x32,0x74,0xf, 0x7a,0xb3,0xe, +0x34,0x74,0x14,0x7a,0xb3,0xe, 0x35,0x74,0x3, 0x7a,0xb3,0xe, 0x37,0xe4,0x7a,0xb3, +0xe, 0x38,0x7a,0xb3,0xe, 0x39,0x7a,0xb3,0xe, 0x3a,0x74,0x2, 0x7a,0xb3,0xe, 0x3b, +0x74,0x45,0x7a,0xb3,0xe, 0x3c,0x74,0x71,0x7a,0xb3,0xe, 0x3d,0x74,0x3, 0x7a,0xb3, +0xe, 0x3e,0x7e,0x34,0x1f,0xff,0x7a,0x37,0xe, 0x3f,0x6d,0x33,0x7a,0x37,0xe, 0x41, +0x7e,0x34,0xc, 0x44,0x7a,0x37,0xe, 0x43,0x7e,0x34,0xd, 0xdd,0x7a,0x37,0xe, 0x45, +0x74,0x2b,0x7a,0xb3,0xe, 0x47,0x74,0x7, 0x7a,0xb3,0xe, 0x48,0xe4,0x7a,0xb3,0xe, +0x49,0x7a,0xb3,0xe, 0x4a,0x7a,0xb3,0xe, 0x4b,0x74,0x2, 0x7a,0xb3,0xe, 0x4c,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0xe, 0x4d,0x7e,0x24,0x0, 0xf4,0x7a,0x27,0xe, 0x4f,0x7a, +0x37,0xe, 0x4d,0x7e,0x34,0x29,0x1c,0x7a,0x37,0xe, 0x51,0x7e,0x34,0x10,0x91,0x7a, +0x37,0xe, 0x5f,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0xe, 0x61,0x7e,0x34,0x0, 0x22,0x7a, +0x37,0xe, 0x63,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0xe, 0x53,0x7e,0x34,0x3, 0xcf,0x7a, +0x37,0xe, 0x55,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0xe, 0x57,0x7e,0x34,0x5, 0x84,0x7a, +0x37,0xe, 0x59,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0xe, 0x5b,0x7e,0x34,0x0, 0xf, 0x7a, +0x37,0xe, 0x5d,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0xe, 0x65,0xe4,0x7a,0xb3,0xe, 0x67, +0x74,0x7, 0x7a,0xb3,0xe, 0x68,0x7e,0x34,0xf, 0x9, 0x7a,0x37,0xe, 0x69,0x7e,0x34, +0xd, 0xa0,0x7a,0x37,0xe, 0x6b,0x7e,0x34,0xd, 0x26,0x7a,0x37,0xe, 0x6d,0x12,0x3a, +0xb3,0x7e,0x34,0xf, 0xfa,0x7a,0x37,0xe, 0x6f,0x7e,0x34,0xd, 0x88,0x7a,0x37,0xe, +0x71,0x7e,0x34,0xf, 0x20,0x7a,0x37,0xe, 0x73,0x12,0x57,0x3f,0x6c,0xaa,0xbe,0xa0, +0x18,0x50,0x15,0xa, 0x3a,0x2e,0x37,0xe, 0x32,0x7e,0x39,0xf0,0x7c,0xbf,0x30,0xe0, +0x3, 0x2e,0xf0,0x18,0x1e,0xf0,0x80,0x10,0xa, 0x3a,0x2e,0x37,0xe, 0x30,0x9, 0xb3, +0xff,0xe8,0xa, 0x7b,0x2e,0x74,0x0, 0x18,0xa, 0x3a,0x19,0xf3,0xc, 0xf2,0xb, 0xa0, +0xbe,0xa0,0x25,0x40,0xc9,0xda,0x79,0x22,0x6c,0x77,0x7e,0x63,0xc, 0x40,0xa, 0x16, +0x7e,0x63,0xc, 0x3f,0xa, 0x26,0x2d,0x21,0xbe,0x24,0x0, 0x4e,0x38,0x2, 0xe1,0xf, +0x75,0x5e,0x14,0x75,0x5d,0x1, 0x6c,0xaa,0x80,0x2d,0x7c,0xba,0x54,0x7, 0xa, 0x2b, +0x2e,0x24,0x6d,0xd6,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x7c,0x3b,0x6e,0x30, +0xff,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xb, 0xd2,0x7e,0x29,0x60, +0x5c,0x63,0x7a,0x29,0x60,0xb, 0xa0,0x7e,0x63,0xc, 0x3d,0xbc,0x6a,0x38,0xcb,0x6c, +0xaa,0x80,0x32,0x7c,0xba,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x6d,0xd6,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7c,0x3b,0x6e,0x30,0xff,0x7c,0xba,0xc4,0x23,0x54,0x1f, +0xa, 0x2b,0x2e,0x24,0xa, 0xd9,0x7e,0x29,0x60,0x5c,0x63,0x7a,0x29,0x60,0xe4,0x7a, +0xb3,0xb, 0x8c,0xb, 0xa0,0x7e,0x63,0xb, 0x8c,0xbc,0x6a,0x38,0xc6,0xe4,0x22,0xe5, +0x5d,0xb4,0x1, 0x2, 0x80,0x2, 0xe1,0x9a,0x15,0x5e,0xe5,0x5e,0x60,0x79,0x6c,0xaa, +0x80,0x2d,0x7c,0xba,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x6d,0xd6,0x7a,0x51,0x82,0x7a, +0x41,0x83,0xe4,0x93,0x7c,0x3b,0x6e,0x30,0xff,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xa, +0x2b,0x2e,0x24,0xb, 0xd2,0x7e,0x29,0x60,0x5c,0x63,0x7a,0x29,0x60,0xb, 0xa0,0x7e, +0x63,0xc, 0x3d,0xbc,0x6a,0x38,0xcb,0x6c,0xaa,0x80,0x32,0x7c,0xba,0x54,0x7, 0xa, +0x2b,0x2e,0x24,0x6d,0xd6,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x7c,0x3b,0x6e, +0x30,0xff,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xa, 0xd9,0x7e,0x29, +0x60,0x5c,0x63,0x7a,0x29,0x60,0xe4,0x7a,0xb3,0xb, 0x8c,0xb, 0xa0,0x7e,0x63,0xb, +0x8c,0xbc,0x6a,0x38,0xc6,0xe4,0x22,0x75,0x5d,0x0, 0x7c,0xb7,0x22,0xe5,0x25,0xbe, +0xb0,0x1, 0x68,0xf9,0xe5,0x64,0x60,0xfc,0xe5,0x65,0x60,0xfc,0x20,0x93,0xfd,0xc2, +0x96,0xc2,0x95,0xc2,0x88,0xa9,0xc6,0xac,0xa9,0xc6,0xec,0xa9,0xd6,0xeb,0xc2,0x89, +0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x0, 0xf1,0x70,0x17,0xe5,0xcc,0x7a, +0xb3,0x0, 0xf2,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x0, 0xf4,0x74,0x1, +0x7a,0xb3,0x0, 0xf1,0xa9,0xc0,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0x75,0x87,0x2, 0x0, 0x0, 0x22, +0xca,0xd8,0xca,0x79,0x7e,0x83,0xc, 0xdf,0x4c,0x88,0x78,0x27,0x6c,0x99,0x6d,0x11, +0x74,0x2, 0xac,0xb9,0x59,0x15,0x11,0x1, 0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x39, +0x19,0xa1,0x10,0xe2,0x74,0x2, 0xa, 0x19,0x19,0xb1,0x11,0xb, 0xb, 0x90,0xbe,0x90, +0x5, 0x78,0xdb,0x6c,0x99,0x21,0x73,0x74,0x7, 0xac,0xb9,0x9, 0xf5,0xc, 0x5c,0x5e, +0xf0,0xf, 0xbe,0xf0,0x5, 0x40,0x2, 0x21,0x71,0xa, 0x1f,0x9, 0xb1,0xc, 0xc1,0xbe, +0xb0,0x1, 0x78,0x2, 0x21,0x53,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x9, 0xd5,0x10,0xe2, +0xbc,0xdf,0x68,0x2, 0x21,0x48,0x49,0x25,0x10,0xe0,0x74,0x7, 0xac,0xb9,0x49,0x35, +0xc, 0x5a,0x9d,0x32,0x12,0x6d,0x95,0x7d,0x3, 0x74,0x7, 0xac,0xbe,0x49,0x25,0x10, +0xde,0x74,0x7, 0xac,0xb9,0x49,0x35,0xc, 0x58,0x9d,0x32,0x12,0x6d,0x95,0x2d,0x3, +0xa, 0x1d,0x9, 0xa1,0x11,0xb, 0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3d, +0x59,0x1, 0x11,0x1, 0xa, 0x1d,0x2e,0x14,0x11,0xb, 0x7c,0xba,0x14,0x7a,0x19,0xb0, +0x21,0x71,0x7e,0xf4,0x0, 0x32,0x7d,0xef,0x7e,0xd4,0x0, 0x96,0x74,0x2, 0xac,0xbd, +0x49,0x15,0x11,0x1, 0xbd,0x1e,0x28,0x6, 0xbd,0xe0,0x50,0x2, 0x80,0x74,0x7d,0xc1, +0x2d,0xcf,0xbd,0xc0,0x50,0x6, 0xbd,0x1f,0x28,0x2, 0x80,0x66,0xbd,0xd0,0x50,0x5e, +0xa, 0x1f,0x9, 0xb1,0xc, 0xc1,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1f, +0x19,0xb1,0xc, 0xc1,0x74,0x3, 0x19,0xb1,0xc, 0xc6,0x7e,0x70,0x7, 0xac,0x7e,0x2e, +0x34,0x10,0xde,0x7e,0x14,0x11,0xcd,0x74,0x7, 0x12,0x67,0x91,0xbe,0x80,0x0, 0x28, +0x2d,0x1b,0x80,0x7e,0x70,0x7, 0xac,0x78,0x2e,0x34,0xc, 0x58,0x7e,0x30,0x7, 0xac, +0x39,0x2e,0x14,0xc, 0x58,0x74,0x7, 0x12,0x67,0x91,0x7e,0x34,0x11,0xcd,0x7e,0x30, +0x7, 0xac,0x38,0x2e,0x14,0xc, 0x58,0x74,0x7, 0x12,0x67,0x91,0x1b,0x90,0x74,0x2, +0xac,0xbd,0x59,0x5, 0x11,0x1, 0x80,0x29,0xb, 0xe0,0xbe,0xe0,0x5, 0x50,0x2, 0x1, +0x58,0x80,0x1e,0x6d,0x11,0x74,0x2, 0xac,0xbf,0x59,0x15,0x11,0x1, 0x7e,0xa0,0xff, +0x7e,0x30,0x7, 0xac,0x3f,0x19,0xa1,0x10,0xe2,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x11, +0xb, 0xb, 0x90,0xbc,0x89,0x28,0x2, 0x1, 0x37,0x7a,0x83,0xc, 0xdf,0x7e,0x24,0xc, +0x58,0x7e,0x34,0x10,0xde,0x7e,0x14,0x0, 0x23,0x12,0x6d,0x6c,0xda,0x79,0xda,0xd8, +0x22,0x7e,0x24,0xe, 0x7b,0x7e,0xb3,0xc, 0xdf,0x70,0xc, 0x74,0x19,0x7a,0xb3,0xd, +0x54,0x7e,0x34,0x0, 0x64,0x80,0xa, 0x74,0x11,0x7a,0xb3,0xd, 0x54,0x7e,0x34,0x0, +0x46,0x7a,0x37,0xd, 0x4c,0x7e,0xb3,0xe, 0xfb,0x20,0xe0,0x2, 0x41,0xb2,0x54,0xfe, +0x7a,0xb3,0xe, 0xfb,0x9, 0x72,0x0, 0x2, 0xbe,0x73,0xd, 0x4a,0x68,0x16,0x7a,0x73, +0xd, 0x4a,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x7a,0x37,0xd, 0x40,0x7e,0x29,0x70,0xbe,0x73,0xd, 0x54,0x68,0xe, 0x7a,0x73,0xd, +0x54,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xd, 0x4c,0x9, 0x72,0x0, 0x1, 0xa, +0x37,0xbe,0x37,0xd, 0x4e,0x68,0x4, 0x7a,0x37,0xd, 0x4e,0x7e,0x17,0xd, 0x55,0x1e, +0x14,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x9, 0x72,0x0, 0x5, 0xa, 0x37,0xbd,0x31,0x68, +0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xd, 0x55,0x9, 0x72,0x0, +0x8, 0xbe,0x73,0xf, 0x1a,0x68,0x24,0x7a,0x73,0xf, 0x1a,0xbe,0x70,0xf, 0x40,0x5, +0xe4,0x19,0xb2,0x0, 0x8, 0x9, 0x72,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6d,0xb5,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0xf, 0x19,0x9, 0x72,0x0, 0x9, 0xbe, +0x73,0xf, 0x1c,0x68,0x8, 0x7a,0x73,0xf, 0x1c,0x7a,0x73,0xf, 0x1b,0x9, 0x72,0x0, +0x7, 0xbe,0x73,0xf, 0x1d,0x68,0x4, 0x7a,0x73,0xf, 0x1d,0x9, 0xb2,0x0, 0xb, 0xbe, +0xb1,0x21,0x68,0x2, 0xf5,0x21,0x9, 0x72,0x0, 0x25,0xa, 0x37,0xbe,0x37,0xf, 0x16, +0x68,0x4, 0x7a,0x37,0xf, 0x16,0x9, 0x72,0x0, 0x6, 0xbe,0x73,0xf, 0x18,0x68,0x4, +0x7a,0x73,0xf, 0x18,0x9, 0x72,0x0, 0x24,0xbe,0x73,0xf, 0x1e,0x68,0x4, 0x7a,0x73, +0xf, 0x1e,0x22,0x7e,0x34,0x0, 0x60,0x12,0x5d,0xdb,0x7c,0xab,0x7a,0xa1,0x3e,0xbe, +0xa0,0x8, 0x40,0x2, 0x61,0xd1,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0x40,0x6, 0x80,0x3, +0x7e,0x40,0x5, 0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x3a, +0xe2,0x73,0x2, 0x3a,0xfa,0x2, 0x3a,0xff,0x2, 0x3b,0x4, 0x2, 0x3b,0x9, 0x2, 0x3b, +0xe, 0x2, 0x3b,0x13,0x2, 0x3b,0x18,0x2, 0x3b,0x1d,0x7e,0x50,0x5e,0x80,0x26,0x7e, +0x50,0x5f,0x80,0x21,0x7e,0x50,0x61,0x80,0x1c,0x7e,0x50,0x63,0x80,0x17,0x7e,0x50, +0x65,0x80,0x12,0x7e,0x50,0x67,0x80,0xd, 0x7e,0x50,0x69,0x80,0x8, 0x7e,0x50,0x6a, +0x80,0x3, 0x7e,0x50,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0xf, 0xfa,0xa, 0x3b,0x7e, +0xb3,0xf, 0x9, 0xa, 0x4b,0x2d,0x34,0x7c,0xb7,0x7c,0x1a,0x2e,0x10,0x3f,0xa5,0xf7, +0x7c,0x3b,0xa, 0x33,0x5e,0x34,0x0, 0x1, 0xbe,0x34,0x0, 0x1, 0x78,0x1c,0x7c,0x13, +0xac,0x15,0x7e,0x70,0x3, 0xac,0x75,0xe, 0x34,0xe, 0x34,0x2d,0x3, 0x7c,0xba,0x3e, +0xb0,0x24,0x43,0xa, 0x3b,0x1b,0x38,0x0, 0x80,0xd, 0xac,0x35,0x7c,0xba,0x3e,0xb0, +0x24,0x43,0xa, 0x3b,0x1b,0x38,0x10,0x7c,0xba,0x3e,0xb0,0x24,0x43,0xa, 0x3b,0xb, +0x38,0x10,0x7e,0x34,0x0, 0xa, 0x7d,0xf1,0x8d,0xf3,0x8d,0xf3,0x7d,0x3e,0xbe,0x70, +0x0, 0x40,0x1a,0xbc,0x47,0x28,0x16,0x7e,0xe4,0x0, 0x64,0x7d,0xf1,0x8d,0xfe,0x7d, +0xf, 0x9d,0x4, 0x7c,0x61,0xa, 0xa, 0x19,0x60,0xf, 0xfa,0x80,0x1b,0xbc,0x47,0x38, +0x17,0xbe,0x70,0x9, 0x38,0x12,0x7e,0x4, 0x0, 0x64,0x8d,0x10,0xb, 0x14,0x9d,0x14, +0x7c,0x63,0xa, 0x1a,0x19,0x61,0xf, 0xfa,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x2, 0x61, +0x27,0x22,0xca,0x3b,0x7d,0x43,0x7e,0x13,0xc, 0x3d,0x7e,0xf7,0xd, 0xdb,0x6c,0x0, +0x7e,0xf0,0x1, 0x80,0x16,0xa, 0x50,0x2d,0x54,0x7e,0x59,0x70,0xa, 0x5f,0x2d,0x54, +0x7e,0x59,0x30,0xbc,0x37,0x40,0x2, 0x7c,0xf, 0xb, 0xf0,0xbc,0x1f,0x38,0xe6,0xa, +0x50,0x2d,0x54,0x7e,0x59,0x0, 0x6c,0x33,0x7e,0xf0,0x1, 0x81,0xe4,0x75,0x54,0x0, +0x6d,0xee,0x6c,0x22,0x75,0x50,0x0, 0x75,0x51,0x0, 0x6c,0xee,0x81,0xa3,0x7e,0x70, +0x2, 0xac,0x7e,0x9, 0xb3,0xb, 0x96,0xf5,0x52,0x9, 0xb3,0xb, 0x97,0xf5,0x53,0x7c, +0xbe,0x12,0x5f,0x5f,0x7d,0xd3,0xa, 0x5e,0x2d,0x54,0x7e,0x59,0x70,0xbc,0x7f,0x78, +0x60,0xb, 0x20,0xe5,0x52,0x25,0x50,0xf5,0x50,0xe5,0x53,0x25,0x51,0xf5,0x51,0x7e, +0x51,0x52,0xac,0x52,0xe5,0x50,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0x95,0x7c,0xd7,0x7e, +0x51,0x53,0xac,0x52,0xe5,0x51,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0x95,0x7c,0xc7,0x7e, +0x71,0x54,0xac,0x72,0xa, 0x5d,0xbd,0x53,0x8, 0xb, 0xa, 0x22,0xa, 0x3d,0x12,0x66, +0xbe,0x7c,0xb7,0xf5,0x54,0x7e,0x71,0x54,0xac,0x72,0xa, 0x5c,0xbd,0x53,0x8, 0xb, +0xa, 0x22,0xa, 0x3c,0x12,0x66,0xbe,0x7c,0xb7,0xf5,0x54,0xbd,0xed,0x58,0x2, 0x7d, +0xed,0xb, 0xe0,0xbc,0x1e,0x28,0x2, 0x81,0x1e,0xbe,0x20,0x0, 0x28,0x34,0xe5,0x50, +0x8c,0xb2,0xf5,0x50,0xe5,0x51,0x8c,0xb2,0xf5,0x51,0x7e,0xa1,0x50,0x7e,0x70,0x2, +0xac,0x73,0x19,0xa3,0x12,0x2e,0xe5,0x51,0x19,0xb3,0x12,0x2f,0x7e,0x71,0x50,0x74, +0x18,0xac,0x7b,0xe5,0x51,0xa, 0x5b,0x2d,0x53,0x3e,0x54,0x2d,0x5f,0x1b,0x58,0xe0, +0xb, 0x30,0xb, 0xf0,0xbc,0xf, 0x40,0x2, 0x81,0xd, 0x7c,0xb3,0xda,0x3b,0x22,0xca, +0x79,0x7e,0xf0,0x1, 0x7e,0xe3,0xe, 0x4a,0xe4,0x7a,0xb3,0xe, 0x4a,0x7e,0x34,0xe, +0x28,0x12,0x65,0xa, 0x7e,0x34,0xe, 0x28,0x12,0x6c,0xf1,0x12,0x61,0xd9,0x12,0x6c, +0x9c,0xe5,0x64,0x60,0xfc,0xa9,0xb7,0xea,0x7e,0x37,0xd, 0xdb,0x7e,0x27,0xd, 0xd9, +0x7e,0x14,0x18,0x0, 0x12,0x5c,0x2a,0x6c,0xaa,0x80,0x6a,0x6c,0x77,0x80,0x5c,0x4c, +0xaa,0x78,0x12,0xe4,0xa, 0x47,0x19,0xb4,0x11,0xfd,0x6d,0x44,0x7e,0x50,0x2, 0xac, +0x57,0x59,0x42,0x11,0xcd,0xa, 0x2a,0x2e,0x27,0xe, 0x30,0x7e,0x29,0x60,0x7e,0x90, +0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27,0xd, 0xdb,0xb, 0x28, +0x0, 0xe, 0x4, 0xe, 0x4, 0xe, 0x4, 0xe, 0x4, 0xe, 0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2e,0x14,0x11,0xcd,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xa, 0x47,0x2e,0x44, +0x11,0xfd,0x7e,0x49,0xb0,0x4, 0x7a,0x49,0xb0,0xb, 0x70,0x7e,0x63,0xe, 0x29,0xbc, +0x67,0x38,0x9c,0xb, 0xa0,0x7e,0x63,0xe, 0x28,0xbc,0x6a,0x38,0x8e,0x6c,0xaa,0x80, +0x59,0xa, 0x3a,0x9, 0x73,0x11,0xfd,0xa5,0xbf,0x0, 0xf, 0x7e,0x44,0x21,0x34,0x7e, +0x50,0x2, 0xac,0x5a,0x59,0x42,0x11,0xcd,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5a,0x49, +0x12,0x11,0xcd,0xa, 0x7, 0x8d,0x10,0x59,0x12,0x11,0xcd,0x2e,0x24,0x11,0xcd,0xb, +0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e, +0x50,0x2, 0xac,0x5a,0x49,0x32,0x11,0xcd,0xbe,0x34,0x1b,0x58,0x40,0x6, 0xbe,0x34, +0x27,0x10,0x28,0x4, 0x6c,0xff,0x80,0xa, 0xb, 0xa0,0x7e,0xb3,0xe, 0x29,0xbc,0xba, +0x38,0x9f,0x7a,0xe3,0xe, 0x4a,0x7c,0xbf,0xda,0x79,0x22,0xca,0xf8,0x6c,0xff,0x12, +0x5a,0x28,0x7d,0x43,0x7e,0xa0,0x5, 0x6c,0x77,0x7e,0x30,0x5, 0xac,0x37,0x2e,0x14, +0x6d,0x53,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80, +0x7, 0xb, 0x70,0xbe,0x70,0x5, 0x40,0xe1,0xbe,0xa0,0x6, 0x78,0x2, 0xe1,0x1, 0x7e, +0x63,0xc, 0x3d,0xbe,0x60,0x0, 0x38,0x2, 0xe1,0x1, 0x6c,0x77,0xc1,0xf7,0x6c,0x66, +0x6c,0x55,0x6c,0x44,0x7e,0x10,0x30,0xac,0x17,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10, +0x2e,0x17,0xd, 0xdb,0xb, 0x18,0x40,0xbe,0x70,0x0, 0x28,0x4c,0x7e,0xb3,0xe, 0x28, +0xa, 0xb, 0x1b,0x4, 0xa, 0x17,0xbd,0x10,0x58,0x3e,0xbe,0x44,0x0, 0x28,0x48,0x36, +0xbe,0x44,0x0, 0x78,0x18,0x30,0x7e,0x30,0x18,0xac,0x37,0xa, 0x4, 0x2d,0x10,0x3e, +0x14,0x2e,0x17,0xd, 0xdb,0x49,0x1, 0xff,0xd0,0x3e,0x4, 0xbd,0x4, 0x58,0x13,0x49, +0x11,0x0, 0x30,0x3e,0x14,0xbd,0x14,0x58,0x9, 0xb, 0x50,0xbe,0x50,0x5, 0x40,0x8, +0x80,0x2e,0x6c,0x55,0x80,0x2, 0x6c,0x55,0x7e,0x30,0x5, 0xac,0x3a,0x7d,0xf1,0x2e, +0xf4,0x6d,0x55,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x4, 0x18,0x17,0xb, 0x60, +0x2e,0x14,0x6d,0x57,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xb6,0x38,0x7, +0x7e,0xf0,0x20,0x80,0xb, 0x6c,0x66,0xb, 0x40,0xbe,0x40,0x18,0x50,0x2, 0xc1,0x54, +0xbe,0xf0,0x0, 0x38,0xc, 0xb, 0x70,0x7e,0xb3,0xe, 0x28,0xbc,0xb7,0x28,0x2, 0xc1, +0x4e,0x7c,0xbf,0xda,0xf8,0x22,0xca,0x3b,0x7e,0x34,0xb, 0xd2,0x7e,0x24,0x0, 0x2, +0xe4,0x12,0x6d,0xa5,0xe4,0x7a,0xb3,0xc, 0x3d,0x7a,0xb3,0xc, 0x3e,0x7a,0xb3,0xc, +0x3f,0x7a,0xb3,0xc, 0x40,0x7e,0xb3,0xd, 0xd4,0xb4,0x1, 0x2, 0x80,0x2, 0xe1,0xef, +0x7e,0xb3,0xe, 0x28,0xf5,0x3f,0x7e,0xb3,0xe, 0x29,0xf5,0x40,0x7e,0x37,0xd, 0x4e, +0x7a,0x35,0x41,0x7e,0x37,0xd, 0x50,0x7a,0x35,0x43,0x7e,0x37,0xd, 0x52,0x7a,0x35, +0x45,0x7e,0x34,0x0, 0xf, 0x7a,0x35,0x4b,0x7e,0x37,0xd, 0xdb,0x7e,0x24,0x0, 0x3f, +0x7e,0x14,0x0, 0x47,0x7e,0x4, 0x9, 0xa0,0x12,0x67,0xb2,0xe5,0x47,0x7a,0xb3,0xc, +0x3d,0xe5,0x48,0x7a,0xb3,0xc, 0x3e,0xe5,0x49,0x7a,0xb3,0xc, 0x3f,0xe5,0x4a,0x7a, +0xb3,0xc, 0x40,0x6c,0xdd,0x80,0x54,0x7e,0xc3,0xc, 0x3d,0xbc,0xcd,0x28,0x28,0x74, +0x2, 0xac,0xbd,0x49,0x75,0x9, 0xa0,0x7d,0x47,0x5e,0x44,0xff,0x0, 0xa, 0x38,0x19, +0x75,0xb, 0x96,0x7d,0x37,0x5e,0x34,0x0, 0xff,0x19,0x75,0xb, 0x97,0x7c,0xbd,0x7e, +0x70,0x1, 0x12,0x0, 0x5e,0x80,0x22,0xa, 0x3c,0xa, 0x2d,0x9d,0x23,0x3e,0x24,0x49, +0x72,0x9, 0xbe,0x7d,0x37,0x5e,0x34,0xff,0x0, 0xa, 0x36,0x19,0x72,0xb, 0xb4,0x7d, +0x37,0x5e,0x34,0x0, 0xff,0x19,0x72,0xb, 0xb5,0xb, 0xd0,0x7e,0x73,0xc, 0x3e,0xa, +0x37,0x7e,0x53,0xc, 0x3d,0xa, 0x25,0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x40,0x98,0xda, +0x3b,0x22,0x7e,0x34,0x0, 0x21,0x12,0x5d,0xdb,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22, +0x12,0x5f,0x81,0x12,0x5e,0xca,0x12,0x61,0xb7,0x74,0x1, 0x7a,0xb3,0xe, 0x39,0x7a, +0xb3,0xe, 0x4a,0x12,0x0, 0x59,0x12,0x62,0xdc,0x74,0x1, 0x7a,0xb3,0xe, 0xa2,0x7e, +0x34,0x12,0x9f,0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6d,0xa5,0x7e,0xa3,0x12,0x9e,0x7c, +0xba,0x4, 0x7a,0xb3,0x12,0x9e,0x7a,0xa3,0xe, 0x8c,0x7e,0x73,0x12,0x9e,0x7a,0x73, +0x12,0xb3,0x7e,0xb3,0xe, 0xa2,0xb4,0x1, 0x70,0x12,0x61,0xb7,0x12,0x62,0x3a,0x12, +0x54,0x37,0x12,0x5f,0xc0,0x12,0x62,0x74,0x12,0x5b,0xf7,0x7e,0xb3,0xc, 0x54,0x20, +0xe2,0xc, 0x7e,0xb3,0xd, 0x5b,0xbe,0xb0,0x1, 0x68,0x3, 0x12,0x5a,0x67,0x7e,0xb3, +0xd, 0xd4,0x70,0x6, 0x7e,0xb3,0xd, 0xd3,0x60,0xb1,0x12,0x6, 0x81,0x7a,0xb3,0xc, +0xe9,0x12,0x5f,0x3b,0x12,0xf, 0x76,0x12,0x36,0x78,0x7e,0x37,0xd, 0xdb,0x12,0x8, +0x6, 0x12,0x62,0xe7,0x12,0x48,0xa4,0x7e,0xb3,0xf, 0x1e,0xb4,0x1, 0x4, 0xe4,0x12, +0xf, 0xf8,0x12,0x5d,0x52,0x12,0x1a,0xe7,0x12,0x38,0x0, 0x12,0x62,0xd0,0x12,0x59, +0xe9,0x12,0x18,0x0, 0x12,0x48,0x0, 0x1, 0x2b,0x12,0x62,0x52,0x2, 0x0, 0x6, 0x7c, +0x15,0x7c,0xab,0x7d,0x43,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x43,0x7d,0x34,0x1b,0x36, +0x12,0x60,0xa0,0x7d,0xb3,0x7d,0x34,0x1b,0x35,0x12,0x60,0xa0,0x7d,0xc3,0x7d,0x34, +0x12,0x60,0xa0,0x7d,0x13,0x7d,0x34,0xb, 0x35,0x12,0x60,0xa0,0x7d,0xd3,0x7d,0x34, +0xb, 0x36,0x12,0x60,0xa0,0x7d,0x43,0xbe,0xa0,0x1, 0x28,0xa, 0xa, 0x31,0x1b,0x35, +0xa, 0xaa,0xbd,0xa3,0x48,0x2a,0xbe,0xa0,0x1, 0x78,0x4, 0x6d,0xbb,0x80,0x21,0x4c, +0xaa,0x78,0x6, 0x6d,0xcc,0x7d,0xbc,0x80,0x17,0x7c,0xb1,0x24,0xfe,0xbc,0xba,0x78, +0x4, 0x6d,0x44,0x80,0xb, 0x7c,0xb1,0x14,0xbc,0xba,0x78,0x4, 0x6d,0x44,0x7d,0xd4, +0x7d,0xfc,0x6d,0xee,0x7d,0x3b,0x6d,0x22,0x2f,0x17,0x6d,0x0, 0x2f,0x1, 0x7d,0x3d, +0x6d,0x22,0x2f,0x10,0x7d,0xf4,0x2f,0x71,0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12,0x66, +0xf0,0x7d,0x1b,0x3e,0x14,0x6d,0x0, 0x9f,0x10,0x7d,0x1c,0x6d,0x0, 0x9f,0x10,0x7d, +0x1d,0x6d,0x0, 0x2f,0x1, 0x7d,0x34,0x3e,0x34,0x6d,0x22,0x2f,0x10,0x74,0x6, 0x2f, +0x11,0x14,0x78,0xfb,0x7f,0x7, 0x12,0x67,0xc, 0x2e,0x34,0x0, 0x20,0x22,0x7c,0xab, +0xbe,0xa0,0x1, 0x40,0x30,0xbe,0xa0,0x3e,0x38,0x2b,0xbe,0xa0,0x1, 0x68,0xa, 0xbe, +0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x4, 0x6, 0x7e,0x34,0x0, 0x82, +0x80,0x4, 0x7e,0x34,0x0, 0xa6,0x7a,0x37,0x0, 0xdd,0xa, 0x3a,0x2e,0x37,0x0, 0xdd, +0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0x18,0x22,0xbe,0xa0,0x80,0x40, +0x1a,0xbe,0xa0,0xdf,0x38,0x15,0xbe,0xa0,0xa5,0x78,0x9, 0x7e,0xb3,0x0, 0xca,0x4, +0x7a,0xb3,0x0, 0xca,0xa, 0x3a,0x9, 0xb3,0xd, 0xfb,0x22,0xbe,0xa0,0xf9,0x78,0x7, +0x7e,0xb3,0xe, 0xba,0x54,0xfd,0x22,0xbe,0xa0,0xfa,0x78,0x2, 0xe4,0x22,0xbe,0xa0, +0xfb,0x78,0x5, 0x7e,0xb3,0xb, 0x96,0x22,0xbe,0xa0,0xfc,0x78,0xc, 0x7e,0xb3,0xd, +0xd4,0xc4,0x54,0xf0,0x4e,0xb3,0xd, 0xd3,0x22,0xbe,0xa0,0xfd,0x78,0x2, 0xe4,0x22, +0xbe,0xa0,0xfe,0x78,0x2, 0xe4,0x22,0xbe,0xa0,0xff,0x78,0x18,0xe5,0x22,0xbe,0xb0, +0x0, 0x28,0x6, 0x7e,0x44,0x0, 0x80,0x80,0x2, 0x6d,0x44,0x7e,0x73,0xe, 0x47,0xa, +0x57,0x4d,0x54,0x22,0xe4,0x22,0x30,0x90,0x78,0xc2,0x90,0x5, 0x17,0xe5,0x17,0xb4, +0x1, 0x6, 0xe5,0x91,0xf5,0x1b,0x80,0x3c,0xe5,0x18,0xc4,0x7c,0x1b,0x5e,0x10,0x7, +0xa5,0xb9,0x0, 0xe, 0xe5,0x17,0x25,0x1b,0x24,0xfe,0x7e,0x71,0x91,0x12,0x4e,0x2d, +0x80,0x22,0xa5,0xb9,0x4, 0xe, 0xe5,0x17,0x25,0x1b,0x24,0xfe,0x7e,0x71,0x91,0x12, +0x20,0x0, 0x80,0x10,0xa5,0xb9,0x2, 0xc, 0xe5,0x17,0x25,0x1b,0x24,0xfe,0x7e,0x71, +0x91,0x12,0x5d,0x81,0xe5,0x18,0xc4,0x7c,0x3b,0x5e,0x30,0x7, 0xa5,0xbb,0x0, 0x9, +0xe5,0x1b,0x12,0x41,0x7e,0xf5,0x91,0x80,0x18,0xa5,0xbb,0x4, 0x9, 0xe5,0x1b,0x12, +0x33,0x4a,0xf5,0x91,0x80,0xb, 0xa5,0xbb,0x2, 0x7, 0xe5,0x1b,0x12,0x62,0x2b,0xf5, +0x91,0x30,0x91,0x35,0xc2,0x91,0x5, 0x16,0xe5,0x18,0xc4,0x7c,0x3b,0x5e,0x30,0x7, +0xa5,0xbb,0x0, 0xa, 0xe5,0x16,0x25,0x1b,0x12,0x41,0x7e,0xf5,0x91,0x22,0xa5,0xbb, +0x4, 0xa, 0xe5,0x16,0x25,0x1b,0x12,0x33,0x4a,0xf5,0x91,0x22,0xa5,0xbb,0x2, 0x9, +0xe5,0x16,0x25,0x1b,0x12,0x62,0x2b,0xf5,0x91,0x22,0x7d,0x23,0xbe,0x24,0x0, 0x0, +0x40,0x2b,0xbe,0x24,0x0, 0x3f,0x38,0x25,0x7e,0x14,0x0, 0x3f,0x9d,0x12,0x7e,0x34, +0x2, 0x2d,0xad,0x31,0x7c,0x76,0x7c,0x65,0xa, 0x24,0xbe,0x34,0x0, 0x32,0x40,0x4, +0x7e,0x34,0x0, 0x32,0x7e,0x24,0x0, 0x32,0x9d,0x23,0x7d,0x32,0x22,0xbe,0x24,0x3, +0x0, 0x40,0x1f,0x9e,0x24,0x3, 0x0, 0x7e,0x34,0x2, 0x2d,0xad,0x23,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0xbe,0x34,0x0, 0x32,0x40,0x4, 0x7e,0x34,0x0, 0x31,0x2e,0x34,0x3, +0xce,0x22,0xbe,0x24,0x1, 0x9f,0x38,0xc, 0x7e,0x34,0x1, 0x9f,0x9d,0x32,0x7e,0x14, +0x1, 0x50,0x80,0xa, 0x7d,0x32,0x9e,0x34,0x1, 0xa0,0x7e,0x14,0x1, 0x52,0xad,0x13, +0x7c,0x32,0x7c,0x21,0xa, 0x0, 0x7d,0x31,0xbe,0x24,0x1, 0x9f,0x38,0x16,0xbe,0x34, +0x1, 0xcd,0x50,0xa, 0x7e,0x24,0x1, 0xff,0x9d,0x23,0x7d,0x32,0x80,0xa, 0x7e,0x34, +0x0, 0x32,0x80,0x4, 0x2e,0x34,0x2, 0x0, 0xbe,0x34,0x0, 0x32,0x50,0x5, 0x7e,0x34, +0x0, 0x32,0x22,0xbe,0x34,0x3, 0xce,0x28,0x4, 0x7e,0x34,0x3, 0xce,0x22,0xca,0x79, +0x7c,0xeb,0x7e,0x73,0xc, 0x3d,0xbe,0x70,0x1, 0x38,0x2, 0x81,0x49,0x7c,0xbe,0x12, +0x10,0x0, 0x7e,0xa3,0xc, 0x42,0x4c,0xaa,0x68,0x1a,0x7e,0xb3,0x12,0x4c,0x70,0x8, +0x7e,0xb3,0x12,0x4d,0x70,0x2, 0x80,0xc, 0xbe,0xa0,0x1, 0x28,0xc, 0xe5,0x1e,0xbe, +0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x22,0x7e,0xf0,0x1, 0x7e,0x73,0xc, 0x3d, +0xbe,0x73,0xc, 0x42,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x12,0x4c, +0xbe,0x73,0xc, 0x42,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c, +0xbe,0x12,0x10,0x0, 0xe5,0x1c,0x7a,0xb3,0xc, 0x3d,0x7e,0x31,0x1c,0x74,0x2, 0xac, +0x3b,0x7e,0x24,0x12,0x2e,0x7e,0x34,0xb, 0x96,0x12,0x6d,0x6c,0x75,0x1e,0x64,0x75, +0x1f,0x64,0x7e,0x34,0x0, 0x1e,0x7e,0x24,0x0, 0x1f,0x12,0x4d,0x97,0xe5,0x1e,0xb4, +0x64,0x3, 0x75,0x1e,0x0, 0xe5,0x1f,0xb4,0x64,0x3, 0x75,0x1f,0x0, 0xe5,0x1f,0xbe, +0xb1,0x1e,0x28,0xb, 0x85,0x1f,0x1e,0x80,0x6, 0x75,0x1e,0x64,0x75,0x1f,0x64,0xda, +0x79,0x22,0x7d,0x3, 0xbe,0x4, 0x0, 0x3f,0x38,0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x20, +0x7e,0x54,0x0, 0xc8,0xad,0x52,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x7d,0x35,0xbe,0x34, +0x0, 0x11,0x40,0x4, 0x7e,0x34,0x0, 0x11,0x7e,0x4, 0x0, 0x11,0x9d,0x3, 0x7d,0x30, +0x22,0xbe,0x4, 0x5, 0xc0,0x40,0x23,0x7d,0x20,0x9e,0x24,0x5, 0xbf,0x7e,0x54,0x0, +0xdc,0xad,0x52,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x7d,0x35,0xbe,0x34,0x0, 0x11,0x40, +0x4, 0x7e,0x34,0x0, 0x10,0x2e,0x34,0x2, 0x47,0x22,0xbe,0x4, 0x2, 0xff,0x38,0xc, +0x7e,0x34,0x2, 0xff,0x9d,0x30,0x7e,0x14,0x0, 0x67,0x80,0xa, 0x7d,0x30,0x9e,0x34, +0x3, 0x0, 0x7e,0x14,0x0, 0x68,0x7d,0x53,0xad,0x51,0x7c,0xba,0x7c,0xa9,0xa, 0x48, +0x7d,0x35,0xbe,0x4, 0x2, 0xff,0x38,0xa, 0x7e,0x4, 0x1, 0x2b,0x9d,0x3, 0x7d,0x30, +0x80,0x4, 0x2e,0x34,0x1, 0x2c,0xbe,0x34,0x0, 0x11,0x50,0x5, 0x7e,0x34,0x0, 0x11, +0x22,0xbe,0x34,0x2, 0x47,0x28,0x4, 0x7e,0x34,0x2, 0x47,0x22,0x6c,0x33,0x7e,0xb3, +0xc, 0x3d,0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0xa2,0x7e,0x23,0xc, 0x3e,0xbe,0x20,0x0, +0x38,0x2, 0xa1,0xa2,0x6c,0x22,0xa1,0x98,0x74,0x2, 0xac,0xb2,0x9, 0x15,0xb, 0x96, +0x9, 0x5, 0xb, 0x97,0xa5,0xb8,0x17,0x6e,0xa5,0xb9,0xc, 0x6a,0x7e,0x70,0x2, 0xac, +0x70,0x2e,0x37,0xd, 0xd7,0xb, 0x38,0x20,0xbe,0x24,0x0, 0xc8,0x48,0x1c,0x74,0x2, +0xac,0xb1,0x2e,0x57,0xd, 0xd7,0x49,0x55,0x0, 0x30,0xbe,0x54,0x0, 0xc8,0x48,0xa, +0x3e,0x24,0x49,0x33,0xff,0xfe,0xbd,0x32,0x48,0x3c,0x7e,0x70,0x18,0xac,0x71,0xa, +0x20,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xd, 0xdb,0x49,0x33,0xff,0xfe,0xbe,0x34,0x0, +0x14,0x58,0x23,0x7c,0xb2,0x12,0x5f,0x5f,0x7d,0x23,0x7e,0x70,0x18,0xac,0x71,0xa, +0x50,0x2d,0x35,0x3e,0x34,0x2e,0x37,0xd, 0xdb,0x49,0x33,0xff,0xa0,0x3e,0x34,0xbd, +0x32,0x48,0x3, 0x7e,0x30,0x10,0xb, 0x20,0x7e,0x73,0xc, 0x3d,0xbc,0x72,0x28,0x2, +0xa1,0x18,0x7c,0xb3,0x22,0x6d,0x33,0x7d,0x13,0x7e,0x44,0x5, 0xe0,0x6c,0x11,0x80, +0x2c,0x6c,0x0, 0x74,0x18,0xac,0xb1,0x7d,0xf5,0x3e,0xf4,0x74,0x2, 0xac,0xb0,0x2d, +0xf5,0x2d,0xf4,0x49,0x2f,0x0, 0x30,0xb, 0xf8,0x30,0x9d,0x32,0x12,0x6d,0x95,0xbd, +0x31,0x28,0x2, 0x7d,0x13,0xb, 0x0, 0xa5,0xb8,0x17,0xd8,0xb, 0x10,0x7e,0x53,0xe, +0x79,0xa, 0x55,0x1b,0x54,0xa, 0x21,0xbd,0x25,0x48,0xc6,0x7e,0x43,0x11,0xca,0x7e, +0x50,0x2, 0xac,0x45,0x7e,0x63,0x11,0xc9,0x7e,0x70,0x14,0xac,0x67,0x2d,0x32,0x59, +0x13,0x11,0x15,0x7e,0x43,0x11,0xc9,0x7e,0x50,0x14,0xac,0x45,0x49,0x32,0x11,0x27, +0x7c,0x7, 0xb, 0x0, 0xbe,0x0, 0x8, 0x40,0x3, 0x7e,0x0, 0x8, 0xa, 0x30,0x59,0x32, +0x11,0x27,0x6d,0x11,0x6c,0x11,0x7e,0x70,0x2, 0xac,0x71,0x7e,0x3, 0x11,0xc9,0x74, +0x14,0xac,0xb0,0x2d,0x35,0x49,0x43,0x11,0x15,0xbd,0x41,0x28,0x2, 0x7d,0x14,0xb, +0x10,0xbe,0x10,0x8, 0x40,0xe0,0x59,0x15,0x11,0x25,0x22,0xca,0xf8,0x7c,0xb, 0x6c, +0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0xc1,0xe5,0x7e,0x90,0x2, 0xac,0x9f,0x7d,0xd4, +0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44,0xff,0xff,0xb, 0x44,0xbd, +0x24,0x58,0x70,0xbe,0xa0,0x5, 0x50,0x6b,0x4c,0xff,0x78,0x14,0x49,0xed,0x0, 0x2, +0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xe4,0x18,0x55,0x80,0x1c, +0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5,0xb, 0xf8,0xf0,0x4c,0x11, +0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18,0x37,0xa, 0xca,0x2d,0xc1, +0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5,0xb, 0xc8,0xf0,0x49,0xed, +0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0x6e,0xe4,0xff,0xff, +0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, 0xda,0x2d,0xd1,0x7a,0xd9, +0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x2, 0xc1,0x59,0x7c,0xba,0xda,0xf8,0x22, +0x7e,0x34,0xe, 0x7b,0x7e,0x24,0x0, 0x81,0xe4,0x12,0x6d,0xa5,0x74,0x3, 0x7a,0xb3, +0xe, 0x7d,0x7a,0xb3,0xe, 0x7e,0x7a,0xb3,0xe, 0x7f,0x74,0x11,0x7a,0xb3,0xe, 0x7b, +0x74,0x2d,0x7a,0xb3,0xe, 0x7c,0x74,0xa0,0x7a,0xb3,0xe, 0x80,0x74,0xa, 0x7a,0xb3, +0xe, 0x82,0x74,0xc, 0x7a,0xb3,0xe, 0x83,0x74,0x1e,0x7a,0xb3,0xe, 0x84,0xe4,0x7a, +0xb3,0xe, 0x86,0xf5,0x22,0xf5,0x21,0x7a,0xb3,0xe, 0xa0,0x74,0x1, 0x7a,0xb3,0xe, +0x81,0x7a,0xb3,0xe, 0x9f,0x7a,0xb3,0xe, 0xa2,0x74,0x18,0x7a,0xb3,0xe, 0xa1,0x74, +0xf2,0x7a,0xb3,0xe, 0xa3,0x74,0xf, 0x7a,0xb3,0xe, 0xaa,0x12,0x6d,0xde,0xa, 0x36, +0x7a,0x73,0xe, 0xa4,0x12,0x6d,0xde,0x7a,0x73,0xe, 0xa5,0x12,0x62,0xe2,0xa, 0x36, +0x7a,0x73,0xe, 0x9c,0x12,0x62,0xe2,0x7a,0x73,0xe, 0x9d,0xe4,0x7a,0xb3,0xe, 0xad, +0x12,0x3f,0xf2,0x7a,0xb3,0xe, 0xac,0x12,0x61,0x16,0x7a,0xb3,0xe, 0x9e,0xe4,0x7a, +0xb3,0xe, 0xb3,0x22,0xca,0xf8,0x7d,0x42,0x7c,0x5b,0x7c,0xa5,0x74,0x7, 0xac,0x5b, +0x2d,0x24,0x6c,0x33,0x7c,0x27,0x80,0x48,0x7e,0x90,0x7, 0xac,0x93,0x9, 0xf4,0xc, +0x7f,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0,0xc, 0x5c,0xbc,0xfb,0x78,0x30,0xbe,0xf0, +0xff,0x68,0x2b,0x19,0xf2,0x0, 0x4, 0x49,0xf4,0xc, 0x7b,0x1b,0x28,0xf0,0x49,0x44, +0xc, 0x7d,0x59,0x42,0x0, 0x2, 0x9, 0xb0,0xc, 0x5d,0x19,0xb2,0x0, 0x5, 0x9, 0xb0, +0xc, 0x5e,0x19,0xb2,0x0, 0x6, 0xb, 0xa0,0x2e,0x24,0x0, 0x7, 0x80,0x6, 0xb, 0x20, +0xbc,0x62,0x38,0xb4,0xb, 0x30,0xbe,0x30,0x5, 0x40,0xa9,0x7c,0xba,0xda,0xf8,0x22, +0x7e,0x73,0xc, 0x41,0x7a,0x73,0xc, 0x42,0x7e,0xa3,0xc, 0xdf,0x7a,0xa3,0xc, 0xe0, +0xe4,0x7a,0xb3,0xc, 0xe3,0x7e,0x37,0xf, 0x16,0x4d,0x33,0x78,0x38,0xbe,0xa0,0x0, +0x28,0x7, 0xe4,0x7a,0xb3,0x0, 0xf3,0x80,0x6e,0x7e,0xb3,0xf, 0x18,0x30,0xe0,0x67, +0x7e,0xb3,0xf, 0x1d,0xbe,0xb3,0x0, 0xf3,0x38,0x5d,0xe4,0x7a,0xb3,0x0, 0xf3,0x7e, +0x24,0x0, 0x1, 0x7a,0x27,0xf, 0x16,0x74,0x1, 0x7a,0xb3,0xe, 0xa0,0x74,0x1e,0x7a, +0xb3,0xf, 0x1b,0x80,0x42,0xbe,0x34,0x0, 0x1, 0x78,0x1c,0xbe,0xa0,0x0, 0x28,0x37, +0x6d,0x22,0x7a,0x27,0xf, 0x16,0xe4,0x7a,0xb3,0xe, 0xa0,0x7a,0xb3,0x0, 0xf3,0x74, +0x26,0x7a,0xb3,0x0, 0xf6,0x80,0x1a,0xbe,0x34,0x0, 0x3, 0x78,0x1a,0x12,0x61,0xd9, +0x12,0x37,0x9d,0x12,0x53,0x79,0x6d,0x33,0x7a,0x37,0xf, 0x16,0xe4,0x7a,0xb3,0xe, +0xa0,0x74,0x1, 0x7a,0xb3,0x0, 0xf5,0x7e,0xb3,0x0, 0xf5,0x70,0x6, 0x12,0x50,0xe9, +0x2, 0x58,0xdf,0x22,0xca,0x3b,0x6c,0xff,0x7e,0x34,0xc, 0x58,0x7e,0x24,0x0, 0x23, +0xe4,0x12,0x6d,0xa5,0x7e,0xb3,0xd, 0xd3,0x60,0x6, 0x7e,0xb3,0xd, 0xd4,0x70,0x17, +0x7e,0x34,0xb, 0xd2,0x7e,0x24,0x0, 0x2, 0xe4,0x12,0x6d,0xa5,0x7e,0x34,0xa, 0xd9, +0x7e,0x24,0x0, 0x4, 0x12,0x6d,0xa5,0x6c,0xee,0x80,0x59,0x74,0x2, 0xac,0xbe,0x9, +0xd5,0xb, 0x96,0x9, 0xc5,0xb, 0x97,0x4c,0xdd,0x68,0x5, 0xbe,0xd0,0xb, 0x78,0x20, +0xbe,0xc0,0xd, 0x78,0x1b,0x7e,0x73,0xc, 0x3d,0xbe,0x70,0x1, 0x28,0x12,0x7c,0xbe, +0x12,0x5f,0x5f,0xbe,0x34,0x0, 0x96,0x58,0x7, 0x7c,0xbe,0x6c,0x77,0x12,0x0, 0x5e, +0x7c,0xbe,0x12,0x62,0xb0,0x60,0x1b,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0xb, 0xd4, +0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xc, 0x58,0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x6c, +0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xc, 0x3d,0xbc,0x7e,0x38,0x9f,0x7a,0x73,0xc, 0x41, +0x7a,0xf3,0xc, 0xdf,0xda,0x3b,0x22,0xca,0x79,0x7c,0x1b,0x7e,0x3, 0xf, 0x9e,0xa, +0x30,0x9, 0x3, 0xd, 0x17,0x7e,0xf0,0x5, 0xa, 0x1f,0x9e,0x14,0x0, 0x5, 0x7c,0xe3, +0xa, 0x1f,0x9, 0x71,0xd, 0x17,0xbc,0x70,0x68,0x71,0x7c,0xb1,0x30,0xe0,0x6c,0xa, +0x1e,0x9, 0x61,0xf, 0xf5,0xa, 0x1f,0x2e,0x14,0xd, 0x17,0x7e,0x19,0x70,0x2c,0x76, +0x7a,0x19,0x70,0xa, 0x1e,0x9, 0x61,0x11,0x10,0xa, 0x1f,0x9, 0x71,0xd, 0x17,0xbc, +0x76,0x38,0x10,0x74,0x1, 0xa, 0x2e,0x19,0xb2,0xf, 0xf5,0xa, 0x2f,0x19,0x62,0xd, +0x17,0x80,0x1c,0xa, 0x1e,0x9, 0xa1,0x11,0x11,0xbc,0x7a,0x40,0x12,0x74,0xff,0xa, +0x1e,0x19,0xb1,0xf, 0xf5,0xa, 0x3a,0x1b,0x34,0xa, 0x1f,0x19,0x71,0xd, 0x17,0xa, +0x1f,0x9, 0xb1,0xd, 0x17,0x12,0x60,0x3b,0x40,0xa5,0x7e,0x70,0x14,0xac,0x7f,0x2e, +0x34,0x11,0x15,0x7e,0x24,0x0, 0x14,0xe4,0x12,0x6d,0xa5,0x1e,0x10,0xb, 0xf0,0xbe, +0xf0,0x8, 0x38,0x2, 0x21,0x58,0xda,0x79,0x22,0xca,0x3b,0x7c,0x9b,0x75,0x4a,0x1, +0x7e,0xf0,0x30,0x7e,0xe0,0xd0,0xbe,0x90,0x1, 0x38,0x4, 0x7c,0xef,0x80,0x10,0x7e, +0x63,0xe, 0x28,0xa, 0x16,0x1b,0x15,0xa, 0x29,0xbd,0x21,0x48,0x2, 0x7c,0xfe,0x7e, +0xd0,0x2, 0x7e,0xc0,0xfe,0xbe,0x70,0x1, 0x38,0x4, 0x7c,0xcd,0x80,0x7, 0xbe,0x70, +0x16,0x40,0x2, 0x7c,0xdc,0x74,0x30,0xac,0x9b,0x74,0x2, 0xac,0xb7,0x7d,0xf5,0x2d, +0xf4,0x2e,0xf7,0xd, 0xdb,0xb, 0xf8,0x20,0x7d,0x32,0x1a,0x26,0x1a,0x24,0x7e,0x14, +0x0, 0xc, 0x12,0x67,0x1, 0x7e,0x8, 0x0, 0x10,0x12,0x67,0x5d,0x7d,0x23,0x1a,0x3c, +0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30,0xbd,0x32,0x18,0x27,0x1a,0x3d,0x3e,0x34,0x2d, +0x3f,0xb, 0x38,0x30,0xbd,0x32,0x18,0x1a,0x1a,0x3e,0x3e,0x34,0x2d,0x3f,0xb, 0x38, +0x30,0xbd,0x32,0x18,0xd, 0x1a,0x3f,0x3e,0x34,0x2d,0x3f,0xb, 0x38,0x30,0xbd,0x32, +0x8, 0x3, 0x75,0x4a,0x0, 0xe5,0x4a,0xda,0x3b,0x22,0x7e,0xa0,0x1, 0xe4,0x7a,0xb3, +0xc, 0x55,0x74,0x1, 0x7a,0xb3,0xc, 0x56,0x7e,0x73,0xc, 0x3d,0xa5,0xbf,0x0, 0x6, +0x74,0x1, 0x7a,0xb3,0x0, 0xdf,0xbe,0x70,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xc, 0x56, +0x7e,0xb3,0xc, 0x42,0xbe,0xb0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xc, 0x56,0x7e,0xb3, +0xb, 0x8d,0xbe,0xb0,0x0, 0x28,0xd, 0x74,0x1, 0x7a,0xb3,0xc, 0x56,0x12,0x4c,0x63, +0x7c,0xab,0x80,0x1d,0x7e,0xb3,0xb, 0x8c,0x70,0x17,0x7e,0xb3,0xc, 0x3d,0xbe,0xb0, +0x0, 0x28,0xe, 0xbe,0xa0,0x3, 0x50,0x3, 0x7e,0xa0,0x3, 0x74,0x1, 0x7a,0xb3,0xc, +0x56,0x7e,0xb3,0x0, 0xdf,0xbc,0xba,0x50,0x4, 0x7a,0xa3,0x0, 0xdf,0x7e,0x73,0xc, +0x3d,0xbe,0x70,0x0, 0x28,0xb, 0x7e,0xb3,0xb, 0x8c,0x70,0x5, 0xe4,0x7a,0xb3,0xc, +0x3d,0x7e,0xa3,0x0, 0xdf,0x74,0x2, 0xa4,0x7a,0x57,0xc, 0x4f,0x7e,0xa3,0x0, 0xdf, +0x74,0x2, 0xa4,0x7a,0x57,0xc, 0x51,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0, +0x4, 0x78,0xc, 0x7e,0x34,0xe, 0x28,0x12,0x6d,0x16,0xa9,0xc7,0xea,0x80,0x2f,0xbe, +0xd0,0x5, 0x78,0x27,0x12,0x62,0xb, 0x50,0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0xe, 0x47, +0x7e,0xf3,0xe, 0x4a,0xe4,0x7a,0xb3,0xe, 0x4a,0x12,0x56,0x45,0x7a,0xb3,0xe, 0x47, +0x74,0x1, 0x7a,0xb3,0xe, 0x75,0x80,0x6, 0xe4,0x80,0x56,0xe4,0x80,0x53,0x7e,0xb3, +0xf, 0x9f,0x7e,0x34,0xe, 0x28,0xb4,0x1, 0xa, 0x12,0x65,0xa, 0xe4,0x7a,0xb3,0xf, +0x9f,0x80,0xa, 0x12,0x6b,0x87,0x7e,0x34,0xe, 0x28,0x12,0x6a,0x7e,0x7e,0x34,0xe, +0x28,0x12,0x6c,0xf1,0x7e,0xb3,0xe, 0xa2,0xb4,0x3, 0xa, 0x7e,0x73,0xf, 0xf9,0x2e, +0x70,0xff,0xa9,0x94,0xca,0x12,0x6c,0x9c,0xbe,0xd0,0x5, 0x78,0x12,0x12,0x62,0xb, +0x50,0xd, 0x7a,0xe3,0xe, 0x47,0x7a,0xf3,0xe, 0x4a,0xe4,0x7a,0xb3,0xe, 0x75,0x74, +0x1, 0xda,0x79,0xda,0xd8,0x22,0xca,0xb8,0xca,0x39,0x12,0x0, 0x2e,0x7e,0x35,0x5b, +0xb, 0x34,0x7a,0x35,0x5b,0xbe,0x34,0x3, 0xe8,0x40,0x33,0x6d,0x33,0x7a,0x35,0x5b, +0x12,0x0, 0x1e,0xb4,0x1, 0x1a,0x7e,0xb3,0xd, 0xc5,0x4, 0x7a,0xb3,0xd, 0xc5,0x7e, +0x73,0xd, 0xc5,0xbe,0x70,0x4, 0x28,0x8, 0xe4,0x7a,0xb3,0xd, 0xc5,0x53,0x18,0x8f, +0x7e,0xb3,0x0, 0xf3,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x0, 0xf3,0x7e,0x73, +0x0, 0xf7,0xbe,0x73,0x0, 0xf6,0x28,0xb, 0x7e,0xb3,0x0, 0xf6,0x4, 0x7a,0xb3,0x0, +0xf6,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0xf5,0x7e,0xb3,0x0, 0xf8,0x60,0x5, 0x14, +0x7a,0xb3,0x0, 0xf8,0x7e,0x37,0xe, 0x2, 0xb, 0x34,0x7a,0x37,0xe, 0x2, 0x7e,0x37, +0xa, 0x73,0xbe,0x37,0xe, 0x2, 0x28,0x3, 0x12,0x61,0xd9,0x7e,0x37,0xd, 0x23,0xbe, +0x34,0x0, 0x0, 0x28,0x6, 0x1b,0x34,0x7a,0x37,0xd, 0x23,0x12,0x61,0xea,0xda,0x39, +0xda,0xb8,0x32,0x7e,0xa0,0x1, 0x74,0x1, 0x7a,0xb3,0xc, 0x56,0x6d,0x44,0x6c,0x77, +0x7e,0x50,0x2, 0xac,0x57,0x2e,0x27,0xd, 0xd7,0xb, 0x28,0x20,0xbd,0x24,0x58,0x11, +0xbe,0x70,0x17,0x40,0x5, 0xbe,0x70,0x18,0x40,0x7, 0xbe,0x70,0x25,0x50,0x2, 0x7d, +0x42,0xb, 0x70,0xa5,0xbf,0x25,0xd9,0x7e,0xb3,0x0, 0xf0,0x4, 0x7a,0xb3,0x0, 0xf0, +0xb4,0x8, 0x5, 0xe4,0x7a,0xb3,0x0, 0xf0,0x7e,0x63,0x0, 0xf0,0x7e,0x70,0x2, 0xac, +0x67,0x59,0x43,0x0, 0xe0,0x6c,0x77,0x7e,0x30,0x2, 0xac,0x37,0x49,0x21,0x0, 0xe0, +0xbd,0x24,0x8, 0x2, 0x7d,0x42,0xb, 0x70,0xa5,0xbf,0x8, 0xeb,0xbe,0x44,0xf9,0xc0, +0x58,0x5, 0x7e,0xa0,0x4, 0x80,0x14,0xbe,0x44,0xfc,0xe0,0x58,0x5, 0x7e,0xa0,0x3, +0x80,0x9, 0xbe,0x44,0xfe,0x70,0x58,0x3, 0x7e,0xa0,0x2, 0xbe,0xa0,0x4, 0x40,0xb, +0x74,0x1, 0x7a,0xb3,0xc, 0x55,0xe4,0x7a,0xb3,0xe, 0x3a,0x7c,0xba,0x22,0x6c,0xaa, +0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xd, 0xd7,0xb, 0x38,0x10,0xbe,0x17, +0xc, 0x51,0x8, 0x15,0x30,0x2, 0x2a,0x7d,0x2, 0x2e,0x7, 0xd, 0xd5,0xb, 0x8, 0x30, +0x2e,0x37,0xc, 0x51,0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37,0xc, 0x51,0xbd, +0x13,0x58,0xe, 0x2e,0x27,0xd, 0xd5,0xb, 0x28,0x30,0x9e,0x37,0xc, 0x51,0x1b,0x28, +0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xb8,0x20,0x0, 0x6, 0x6d,0x33,0x7a,0x37,0xc, +0x51,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xc, 0x51, +0x8, 0x15,0x30,0x2, 0x2a,0x7d,0x2, 0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37, +0xc, 0x51,0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37,0xc, 0x51,0xbd,0x13,0x58, +0xe, 0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x9e,0x37,0xc, 0x51,0x1b,0x28,0x30,0xb, +0xa0,0xbe,0xa0,0x25,0x40,0xbd,0x22,0xca,0xf8,0x7d,0x12,0x7d,0x3, 0x7e,0x73,0xc, +0x3d,0xbe,0x70,0x2, 0x50,0x9, 0xe4,0x7a,0x9, 0xb0,0x7a,0x19,0xb0,0x80,0x7b,0x6c, +0xaa,0x80,0x6f,0xa, 0x4a,0xb, 0x44,0x80,0x5f,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3, +0xb, 0x96,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0xb, 0x96,0xa, 0x3b,0x9d, +0x32,0x12,0x6d,0x95,0x7c,0x87,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0xb, 0x97,0xa, +0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0xb, 0x97,0xa, 0x3b,0x9d,0x32,0x12,0x6d, +0x95,0x7c,0xf7,0x4c,0xaa,0x78,0xb, 0xbe,0x90,0x1, 0x78,0x6, 0x7a,0x9, 0x80,0x7a, +0x19,0xf0,0x7e,0x9, 0xb0,0xbc,0xb8,0x28,0x3, 0x7a,0x9, 0x80,0x7e,0x19,0xb0,0xbc, +0xbf,0x28,0x3, 0x7a,0x19,0xf0,0xb, 0x90,0x7e,0xb3,0xc, 0x3d,0xbc,0xb9,0x38,0x99, +0xb, 0xa0,0x7e,0xb3,0xc, 0x3d,0xbc,0xba,0x38,0x89,0xda,0xf8,0x22,0x70,0x56,0x7a, +0x71,0x18,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5,0xbf,0x4, 0x15,0x7e, +0xb3,0xe, 0xa2,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x2e,0x74,0x27,0x7e, +0x70,0x3, 0x80,0x64,0xa5,0xbf,0x2, 0x17,0x7e,0x37,0xd, 0xdb,0x7a,0x37,0x12,0xbd, +0x7e,0x37,0xd, 0xd7,0x7a,0x37,0x12,0xbf,0x74,0x1, 0x7a,0xb3,0x0, 0xf5,0x22,0x7e, +0xb3,0xe, 0xa2,0xb4,0x3, 0x8, 0x74,0x1, 0x7e,0x70,0x1, 0x2, 0x62,0x46,0x74,0x27, +0x7e,0x70,0x1, 0x80,0x33,0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa, +0x5, 0x7e,0x60,0x5, 0x80,0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5, +0xbf,0x66,0x18,0x7e,0x60,0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40, +0xa, 0xbe,0xb0,0xdf,0x38,0x5, 0x24,0x80,0x2, 0x61,0xa6,0x22,0xca,0x3b,0x7d,0x72, +0x7d,0x63,0x7e,0xb3,0xe, 0x4a,0xf5,0x42,0xe4,0x7a,0xb3,0xe, 0x4a,0x7e,0x34,0xe, +0x28,0x12,0x65,0xa, 0x7e,0x34,0xe, 0x28,0x12,0x6c,0xf1,0x75,0x3f,0x0, 0x12,0x6c, +0x9c,0xe5,0x64,0x60,0xfc,0xa9,0xb7,0xea,0x7d,0x36,0x7d,0x27,0x7e,0x14,0x18,0x0, +0x12,0x5c,0x2a,0x75,0x40,0x0, 0x80,0x36,0x75,0x41,0x0, 0x80,0x26,0x7e,0x51,0x40, +0x74,0x18,0xac,0x5b,0xe5,0x41,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x7d,0x32,0x2d,0x36, +0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28, +0x30,0x5, 0x41,0x7e,0x73,0xe, 0x29,0xbe,0x71,0x41,0x38,0xd1,0x5, 0x40,0x7e,0x73, +0xe, 0x28,0xbe,0x71,0x40,0x38,0xc1,0x5, 0x3f,0xe5,0x3f,0xbe,0xb0,0x4, 0x40,0x9e, +0xe5,0x42,0x7a,0xb3,0xe, 0x4a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x12,0x5a,0x28, +0x7d,0x43,0x7a,0x47,0x12,0xcf,0x6c,0x33,0x80,0x11,0x7c,0xb3,0x12,0x5f,0x5f,0x7d, +0x53,0x3e,0x54,0xbd,0x54,0x50,0x2, 0xb, 0xf0,0xb, 0x30,0x7e,0x73,0xc, 0x3d,0xbc, +0x73,0x38,0xe7,0xe4,0x7a,0xb3,0x12,0xd1,0xbe,0x70,0x1, 0x28,0x18,0x74,0x2, 0xac, +0xbf,0xa, 0x37,0x1b,0x34,0xbd,0x53,0x48,0xc, 0xbe,0x44,0x0, 0xbe,0x28,0x6, 0x74, +0x1, 0x7a,0xb3,0x12,0xd1,0xbe,0x44,0x3, 0x20,0x28,0x5, 0xe4,0x7a,0xb3,0xc, 0x3d, +0x7e,0x34,0x0, 0xaa,0xad,0x34,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7d,0x43,0xbe,0x44, +0x0, 0x3c,0x50,0x4, 0x7e,0x44,0x0, 0x3c,0x7e,0xb3,0x12,0xd2,0xbe,0xb0,0x2, 0x68, +0x4, 0x7a,0x47,0x12,0xcb,0xda,0xf8,0x22,0x7e,0x30,0x70,0xe4,0x7e,0x34,0x0, 0x3f, +0x12,0x5c,0xf2,0x92,0x7, 0x30,0x7, 0xa, 0xe5,0x3f,0xbe,0xb0,0xff,0x68,0x3, 0x7e, +0x31,0x3f,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x7c,0xb3,0x54,0xfe,0xf5,0x92,0xd2, +0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22, +0x7e,0xa3,0xc, 0x3d,0x4c,0xaa,0x78,0xc, 0x74,0xff,0x7a,0xb3,0x12,0x6e,0x6d,0x33, +0x7a,0x37,0x12,0x6f,0x7e,0xb3,0xc, 0xe0,0x70,0x5c,0xbe,0xa0,0x1, 0x78,0x57,0xe4, +0x12,0x5f,0x5f,0xbe,0x34,0x0, 0x64,0x18,0x4d,0x7e,0x63,0x12,0x6e,0xa5,0xbe,0xff, +0x1a,0x7e,0x73,0xb, 0x97,0x7a,0x73,0x12,0x6e,0x7e,0x50,0x2, 0xac,0x57,0x2e,0x27, +0xd, 0xd7,0xb, 0x28,0x20,0x7a,0x27,0x12,0x6f,0x80,0x26,0x7e,0x73,0xb, 0x97,0xbe, +0x73,0x12,0x6e,0x78,0x21,0x7e,0x70,0x2, 0xac,0x67,0x2e,0x37,0xd, 0xd7,0xb, 0x38, +0x30,0x7e,0x27,0x12,0x6f,0x2e,0x24,0x0, 0x32,0xbd,0x32,0x8, 0x9, 0x7a,0x37,0x12, +0x6f,0xe4,0x7a,0xb3,0xc, 0x3d,0x22,0x74,0x5, 0x7a,0xb3,0xd, 0x3e,0x74,0x14,0x7a, +0xb3,0xd, 0x3f,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0xd, 0x40,0x7a,0x37,0xd, 0x42,0x7a, +0x37,0xd, 0x44,0x7a,0x37,0xd, 0x46,0x7a,0x37,0xd, 0x48,0x74,0x3, 0x7a,0xb3,0xd, +0x4a,0x74,0x4, 0x7a,0xb3,0xd, 0x4b,0x7e,0x34,0x0, 0x46,0x7a,0x37,0xd, 0x4c,0x7e, +0x34,0x0, 0x2d,0x7a,0x37,0xd, 0x4e,0x7e,0x34,0x0, 0x1e,0x7a,0x37,0xd, 0x50,0x7e, +0x34,0x0, 0x50,0x7a,0x37,0xd, 0x52,0x74,0x11,0x7a,0xb3,0xd, 0x54,0xe4,0x7a,0xb3, +0xd, 0x57,0x74,0x4, 0x7a,0xb3,0xd, 0x58,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xd, 0x59, +0x7e,0x34,0xa, 0x0, 0x7a,0x37,0xd, 0x55,0x22,0x7e,0xb3,0x0, 0xf1,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x0, 0xf2,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x0, 0xf4, +0x74,0x1, 0x7a,0xb3,0x0, 0xf1,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc, +0xc2,0xca,0xc2,0xc8,0xa9,0xc4,0xcb,0x80,0x3b,0xe5,0x25,0xbe,0xb0,0x1, 0x68,0x30, +0xe5,0x64,0xb4,0x1, 0x2b,0xe5,0x65,0xb4,0x1, 0x26,0x7e,0x37,0xf, 0x16,0xbe,0x34, +0x0, 0x1, 0x78,0x3, 0xa9,0xc4,0xc9,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e,0x34, +0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd, +0xe4,0x12,0x61,0x82,0x7e,0xb3,0x0, 0xf5,0x60,0xbf,0x22,0xca,0xf8,0x74,0x3, 0x7a, +0xb3,0x12,0xc2,0x12,0x5f,0x81,0x12,0x5e,0xca,0xe4,0x7a,0xb3,0xe, 0x39,0x7a,0xb3, +0xe, 0x4a,0x12,0x62,0xdc,0x74,0x3, 0x7a,0xb3,0x12,0xc2,0x12,0x61,0xd9,0x7e,0xb3, +0x12,0xc1,0x70,0x15,0x12,0x61,0xd9,0x75,0x9a,0x80,0x74,0x1, 0x7a,0xb3,0x12,0xc1, +0x75,0x9a,0x7f,0x74,0xff,0x7a,0xb3,0x12,0xc1,0x7e,0xf3,0x12,0xc2,0xbe,0xf0,0x3, +0x78,0x1d,0xe5,0x18,0x30,0xe7,0xd4,0x12,0x54,0x37,0x7e,0x37,0xd, 0xd7,0x7a,0x37, +0x12,0xbf,0x7e,0x37,0xd, 0xdb,0x7a,0x37,0x12,0xbd,0x53,0x18,0x7f,0x80,0xbc,0x7a, +0xf3,0xe, 0xa2,0x12,0x62,0x52,0x12,0x0, 0x42,0xda,0xf8,0x22,0xca,0x3b,0x7d,0x72, +0x7d,0x63,0xe5,0x25,0xbe,0xb0,0x1, 0x68,0xf9,0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4, +0x12,0x6d,0xa5,0x7d,0x37,0x7e,0x24,0x0, 0x4a,0x12,0x6d,0xa5,0x75,0x3f,0x1, 0x12, +0x57,0xe1,0xe5,0x25,0xbe,0xb0,0x1, 0x68,0xf9,0x75,0x40,0x0, 0x7e,0x51,0x40,0x74, +0x2, 0xac,0x5b,0x49,0x2, 0xa, 0x26,0x1e,0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, +0x18,0x30,0x2d,0x30,0x1b,0x18,0x30,0x49,0x12,0x9, 0xdc,0x1e,0x14,0x1e,0x14,0x2d, +0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x40,0xe5,0x40,0xb4,0x25,0xcc, +0x5, 0x3f,0xe5,0x3f,0xbe,0xb0,0x5, 0x40,0xb6,0xda,0x3b,0x22,0x7c,0xab,0xc2,0xaf, +0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34, +0x73,0xf8,0x68,0x18,0xbe,0x34,0x73,0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, +0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5, +0xf5,0xf1,0x7c,0xb7,0x54,0xfe,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34, +0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff,0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75, +0xf6,0xff,0x75,0xf5,0x80,0x74,0x1, 0x12,0x61,0x2d,0xa9,0x36,0xf5,0xfc,0x75,0xfb, +0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0x74,0x1, 0x22,0x12,0x61,0xd9,0x7e,0xb3, +0xe, 0xa2,0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x0, +0xf9,0xbe,0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xf9,0x22,0x7e,0xb3,0x0, +0xf9,0xb4,0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xf9,0x74,0xfa,0x12,0x61,0x2d,0x75, +0x9a,0x80,0x7e,0x34,0x77,0xf8,0x12,0x5e,0x4, 0x7e,0x34,0x77,0xf8,0x74,0x66,0x12, +0x52,0x3c,0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x52,0x3c,0x80,0x12,0x7e,0xb3,0x0, +0xf9,0xb4,0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xf9,0x74,0xfa,0x12,0x61,0x2d,0x75, +0xe9,0xff,0x22,0x7e,0x34,0xf, 0x6, 0x7e,0x50,0x3c,0x7e,0xa0,0x4, 0xe5,0x21,0xb4, +0x1, 0x3, 0x7e,0xa0,0x2, 0x7e,0xb3,0xf, 0xf2,0xb4,0x1, 0x3, 0x7e,0xa0,0x1, 0xe5, +0x22,0xb4,0x1, 0x3, 0x7e,0x50,0x64,0x7e,0x43,0xf, 0x9e,0x7e,0x30,0x14,0xac,0x34, +0x49,0x11,0x11,0x25,0xa, 0x25,0x1e,0x24,0xbd,0x12,0x40,0x3, 0x7e,0xa0,0x1, 0x19, +0xa3,0x0, 0x2, 0x7d,0x23,0xb, 0x24,0x7e,0x29,0xb0,0x4, 0x7a,0x29,0xb0,0xe4,0x7a, +0x39,0xb0,0x9, 0x43,0x0, 0x2, 0x9, 0x53,0x0, 0x1, 0xbc,0x54,0x40,0xa, 0xe4,0x19, +0xb3,0x0, 0x1, 0x74,0x1, 0x7a,0x39,0xb0,0x22,0x0, 0x0, 0x0, 0x0, 0xd2,0xcd,0xa9, +0xd1,0xc9,0x7e,0xb3,0x0, 0xf1,0xb4,0x1, 0x14,0x7e,0x73,0x0, 0xf4,0xa, 0x27,0x7e, +0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a,0xb3,0x0, 0xf1,0x80,0xb, 0x7e,0x24,0x0, +0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xd0,0xca,0xc2,0xa8,0xc2,0x95,0x74, +0x2, 0x7a,0xb3,0x0, 0xf8,0x7e,0xb3,0x0, 0xf8,0x70,0xfa,0x12,0x62,0xb9,0x12,0x54, +0xea,0x12,0x5f,0x81,0x12,0x61,0xd9,0x12,0x5e,0xca,0x12,0x60,0x55,0x12,0x1f,0xa0, +0x74,0x1, 0x7a,0xb3,0xe, 0x39,0x7a,0xb3,0xe, 0x4a,0x2, 0x62,0xdc,0x7e,0xb3,0xd, +0x60,0x1b,0xb1,0x68,0x29,0x4, 0x78,0x4e,0x7e,0x34,0x3f,0xe0,0x7a,0x37,0xe, 0x4d, +0x7e,0x34,0x15,0x1c,0x7a,0x37,0xe, 0x51,0x7e,0x34,0x8, 0x48,0x7a,0x37,0xe, 0x5f, +0x7e,0x34,0x0, 0x34,0x7a,0x37,0xe, 0x61,0x7e,0x34,0x0, 0x33,0x80,0x24,0x7e,0x34, +0x3f,0xe0,0x7a,0x37,0xe, 0x4d,0x7e,0x34,0x29,0x1c,0x7a,0x37,0xe, 0x51,0x7e,0x34, +0x10,0x91,0x7a,0x37,0xe, 0x5f,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0xe, 0x61,0x7e,0x34, +0x0, 0x22,0x7a,0x37,0xe, 0x63,0x22,0xe5,0x25,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x25, +0xb4,0x2, 0x3f,0xa9,0xd7,0xea,0x7e,0x37,0xd, 0xdb,0x7e,0x27,0xd, 0xd9,0x7e,0x14, +0x18,0x0, 0x12,0x5c,0x2a,0x12,0x5e,0x55,0x74,0x1, 0x7a,0xb3,0xd, 0xd4,0x7e,0x34, +0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0x9, 0xdc,0x12,0x5a,0xe0,0x7e,0x37,0xd, +0xd7,0x7e,0x27,0xd, 0xd5,0x7e,0x14,0xa, 0x26,0x12,0x5a,0xe0,0x74,0x1, 0x7a,0xb3, +0xd, 0xd3,0x12,0x5b,0x1a,0x12,0x60,0x1e,0x12,0x5c,0xc1,0x12,0x53,0x13,0x2, 0x57, +0xe1,0x7e,0x71,0x24,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x26,0xa, 0x2b,0xb, 0x28, +0x50,0x7c,0xab,0x7c,0xb7,0x24,0x28,0xa, 0x3b,0xb, 0x38,0x20,0x4d,0x22,0x68,0x1f, +0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e, +0x34,0xe, 0x28,0x12,0x6d,0x16,0x7d,0x32,0x7e,0x24,0x18,0x0, 0x12,0x57,0x90,0x5, +0x24,0xe5,0x23,0xbe,0xb1,0x24,0x28,0xe, 0x12,0x58,0x4c,0xb4,0x1, 0x4, 0x75,0x25, +0x1, 0x22,0x75,0x25,0x3, 0x22,0x75,0x25,0x2, 0x22,0x12,0x46,0xf0,0x12,0x34,0xe2, +0x12,0x7, 0xd0,0x7e,0x34,0x8, 0x50,0x7a,0x37,0xd, 0xd5,0x7e,0x34,0x8, 0x9a,0x7a, +0x37,0xd, 0xd7,0x7e,0x34,0x8, 0x9a,0x7e,0x27,0xd, 0xd5,0x12,0x60,0xe8,0x7e,0x34, +0x1, 0x0, 0x7a,0x37,0xd, 0xd9,0x7e,0x34,0x3, 0x70,0x7a,0x37,0xd, 0xdb,0x7e,0x34, +0x3, 0x70,0x7e,0x27,0xd, 0xd9,0x12,0x60,0xd1,0x12,0x59,0xa9,0x12,0x50,0x77,0x12, +0x60,0x55,0x12,0x1f,0xa0,0x12,0x5b,0x53,0x12,0x62,0x93,0x74,0x1, 0x7a,0xb3,0xf, +0x9f,0x22,0x6c,0xaa,0x6c,0x77,0x7e,0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7d,0x1, 0x2e,0x7, 0xd, 0xdb,0xb, 0x8, 0x20,0xbe,0x27,0xc, 0x4f,0x8, +0x12,0x7d,0x41,0x2e,0x47,0xd, 0xd9,0xb, 0x48,0x0, 0x2e,0x7, 0xc, 0x4f,0x1b,0x48, +0x0, 0x80,0x18,0x6d,0x0, 0x9e,0x7, 0xc, 0x4f,0xbd,0x20,0x58,0xe, 0x2e,0x17,0xd, +0xd9,0xb, 0x18,0x20,0x9e,0x27,0xc, 0x4f,0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18, +0xb5,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xac,0x22,0x7e,0xb3,0xe, 0x36,0xb4,0x1, 0x26, +0x7e,0x73,0xa, 0x70,0x7a,0x73,0xe, 0x34,0x7e,0x73,0xa, 0x71,0x7a,0x73,0xe, 0x35, +0x7e,0x73,0xa, 0x72,0x7a,0x73,0xe, 0x37,0x7e,0x34,0xc, 0x44,0x7a,0x37,0xe, 0x43, +0x7e,0x34,0xd, 0xdd,0x80,0x24,0x7e,0x73,0xf, 0x1f,0x7a,0x73,0xe, 0x34,0x7e,0x73, +0xf, 0x52,0x7a,0x73,0xe, 0x35,0x7e,0x73,0xf, 0x53,0x7a,0x73,0xe, 0x37,0x7e,0x34, +0xf, 0xa6,0x7a,0x37,0xe, 0x43,0x7e,0x34,0xd, 0x63,0x7a,0x37,0xe, 0x45,0x22,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xd, 0xd7,0xb, 0x38,0x10,0x2e, +0x27,0xd, 0xd5,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25, +0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, +0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4, +0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e,0x24,0x3, 0x70,0x74,0x18,0x7e,0x13,0xe, 0x28, +0x6c,0x0, 0x2, 0x6a,0xd9,0x7e,0xb3,0x11,0xc9,0x4, 0x7a,0xb3,0x11,0xc9,0x7e,0xb3, +0xf, 0xf2,0xb4,0x1, 0x5, 0x7e,0xa0,0x9, 0x80,0x3, 0x7e,0xa0,0x4, 0x7e,0xb3,0x11, +0xc9,0xb4,0x4, 0x5, 0x4, 0x7a,0xb3,0x11,0xc9,0x7e,0xb3,0x11,0xc9,0xbc,0xba,0x40, +0x1e,0xe4,0x7a,0xb3,0x11,0xc9,0x7e,0xb3,0x11,0xca,0x4, 0x7a,0xb3,0x11,0xca,0xbe, +0xb0,0x8, 0x40,0xb, 0xe4,0x7a,0xb3,0x11,0xca,0x74,0x1, 0x7a,0xb3,0xf, 0xf1,0x7e, +0xb3,0x11,0xc9,0xa, 0x3b,0x9, 0xb3,0xd, 0x17,0x22,0xca,0xf8,0x7e,0xb3,0xd, 0xd3, +0xb4,0x1, 0x48,0x6c,0xff,0x80,0x3c,0x7e,0x37,0xd, 0xd7,0x2e,0x34,0x0, 0x30,0x74, +0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0x75,0x7e,0x53,0xe, 0x28,0x12,0x40,0xbf,0x74,0x7, +0xac,0xbf,0x59,0x35,0xa, 0xdd,0x7e,0x37,0xd, 0xd7,0x74,0x2, 0xac,0xbf,0x9, 0xb5, +0xa, 0x76,0x7e,0x53,0xe, 0x29,0x12,0x40,0xbf,0x74,0x7, 0xac,0xbf,0x59,0x35,0xa, +0xdf,0xb, 0xf0,0x7e,0x73,0xb, 0x8c,0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0x75,0x16, +0x0, 0xe5,0x18,0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0x1b,0x12, +0x41,0x7e,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0x1b,0x12,0x33,0x4a,0xf5, +0x91,0x75,0x17,0x0, 0x7e,0x34,0x0, 0x82,0x7e,0x24,0x0, 0x24,0x74,0xff,0x12,0x6d, +0xa5,0x7e,0x34,0x0, 0xa6,0x7e,0x24,0x0, 0x24,0x12,0x6d,0xa5,0x74,0xaa,0x7a,0xb3, +0x0, 0x82,0x7a,0xb3,0x0, 0x83,0x7a,0xb3,0x0, 0xa6,0x7a,0xb3,0x0, 0xa7,0x22,0xe4, +0x7a,0xb3,0xe, 0x75,0x7a,0xb3,0xe, 0x78,0x74,0x4, 0x7a,0xb3,0xe, 0x79,0x7e,0x34, +0x11,0x15,0x7e,0x24,0x0, 0xb4,0xe4,0x12,0x6d,0xa5,0x7a,0xb3,0xf, 0x6, 0x7a,0xb3, +0xf, 0x7, 0x74,0x4, 0x7a,0xb3,0xf, 0x8, 0xe4,0x7a,0xb3,0xf, 0xf2,0x7a,0xb3,0xf, +0xf1,0x74,0x4, 0x7a,0xb3,0xf, 0xf4,0x74,0xff,0x7a,0xb3,0xf, 0xf5,0x74,0x1, 0x7a, +0xb3,0xf, 0xf6,0x74,0xff,0x7a,0xb3,0xf, 0xf7,0x74,0x1, 0x7a,0xb3,0xf, 0xf8,0x22, +0x6c,0xaa,0xa, 0x1a,0x9, 0x31,0xc, 0xf2,0x7e,0x23,0xe, 0x37,0xbe,0x20,0x3, 0x28, +0xe, 0x7e,0x10,0x2, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x1a,0x7e, +0x20,0x3, 0x9e,0x23,0xe, 0x37,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, +0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f,0xff,0x9d,0x40,0x7e, +0x10,0x2, 0xac,0x1a,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xb2, +0x22,0x75,0x25,0x0, 0x75,0x63,0x0, 0x75,0x24,0x0, 0x12,0x5f,0xa1,0x12,0x58,0x97, +0xf5,0x23,0x12,0x58,0x4c,0xb4,0x1, 0x4, 0x75,0x25,0x1, 0x22,0x75,0x25,0x3, 0x22, +0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0, +0xc0,0x83,0xc0,0x82,0x75,0x64,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34, +0x2, 0x0, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, 0x1b,0x28,0x30,0xe5, +0x25,0xb4,0x1, 0x3, 0x12,0x54,0x91,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda, +0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0xf8,0xe5,0x23, +0xbe,0xb1,0x24,0x38,0x4, 0x6c,0xff,0x80,0x39,0xe5,0x24,0x3e,0xb0,0x3e,0xb0,0x24, +0x26,0xa, 0x3b,0xb, 0x38,0x40,0xbe,0x90,0x1, 0x68,0xa, 0xbe,0x90,0x2, 0x68,0x5, +0xbe,0x90,0x3, 0x78,0x7, 0x7c,0xb9,0x12,0x5e,0x7c,0x7c,0xfb,0xbe,0x90,0x4, 0x68, +0xa, 0xbe,0x90,0x5, 0x68,0x5, 0xbe,0x90,0x6, 0x78,0x7, 0x7c,0xb9,0x12,0x4b,0x28, +0x7c,0xfb,0x7c,0xbf,0xda,0xf8,0x22,0x7c,0xab,0x7e,0x44,0x0, 0x4, 0x7c,0x7a,0x3e, +0x70,0x3e,0x70,0x7c,0xb7,0x24,0x26,0xa, 0x2b,0x1b,0x28,0x40,0x6d,0x22,0x7c,0xb7, +0x24,0x28,0xa, 0x3b,0x1b,0x38,0x20,0xb, 0xa0,0x12,0x62,0xb, 0x50,0x1e,0x7e,0x4, +0x0, 0x5, 0x7c,0x7a,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x26,0xa, 0x1b,0x1b,0x18, +0x0, 0x7c,0xb7,0x24,0x28,0xa, 0x3b,0x1b,0x38,0x20,0xb, 0xa0,0x7c,0xba,0x22,0xd2, +0xcd,0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x0, 0xf1,0xb4,0x1, +0x15,0x7e,0x73,0x0, 0xf4,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x7e,0xb3, +0x0, 0xf2,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38, +0x20,0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, +0x7a,0xb3,0x0, 0xf1,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x2c,0x7c,0xbe,0x12, +0x62,0xb0,0x60,0x23,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x24,0xb, 0x96,0x7e,0x70,0x2, +0xac,0x7f,0x2e,0x34,0xb, 0x96,0x7e,0x14,0x0, 0x2, 0x12,0x6d,0x6c,0x7c,0xbf,0x7e, +0x70,0x1, 0x12,0x0, 0x5e,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xc, 0x3d,0xbc,0x7e,0x38, +0xcc,0x7a,0xf3,0xc, 0x3d,0xda,0x79,0x22,0x12,0x60,0x0, 0x12,0x61,0xc8,0x12,0x62, +0xb9,0x12,0x54,0xea,0x12,0x0, 0x5a,0x12,0x61,0x94,0x74,0x1, 0x7a,0xb3,0xe, 0xa2, +0x7e,0xb3,0xe, 0xa2,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68, +0x13,0x24,0x5, 0x78,0xeb,0x12,0x40,0x0, 0x80,0xe6,0x12,0x51,0x5b,0x80,0xe1,0x12, +0x5e,0xa3,0x80,0xdc,0x12,0x52,0xab,0x80,0xd7,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0xc, +0x45,0x7a,0x37,0xc, 0x47,0x7e,0x34,0x0, 0x50,0x7a,0x37,0xc, 0x49,0x7e,0x34,0x0, +0x19,0x7a,0x37,0xc, 0x4b,0x7e,0x34,0x0, 0x32,0x7a,0x37,0xc, 0x4d,0x7e,0x34,0x0, +0x2, 0x7a,0x37,0xc, 0x4f,0x7a,0x37,0xc, 0x51,0xe4,0x7a,0xb3,0xc, 0x53,0x7e,0xb3, +0xc, 0x54,0x54,0xfb,0x7a,0xb3,0xc, 0x54,0x22,0xca,0xf8,0x7e,0x24,0xc, 0x58,0x7e, +0x34,0xc, 0x9e,0x7e,0x14,0x0, 0x23,0x12,0x6d,0x6c,0x6c,0xff,0x74,0x7, 0xac,0xbf, +0x49,0x35,0xc, 0x58,0x12,0x42,0xea,0x74,0x7, 0xac,0xbf,0x59,0x35,0xc, 0x9e,0x49, +0x35,0xc, 0x5a,0x12,0x44,0x52,0x74,0x7, 0xac,0xbf,0x59,0x35,0xc, 0xa0,0xb, 0xf0, +0xbe,0xf0,0x5, 0x40,0xd7,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x77,0x6c,0xdd,0x80,0x2a, +0x7e,0x70,0x2, 0xac,0x7d,0x9, 0xb3,0xb, 0x96,0xf5,0x4a,0x9, 0xc3,0xb, 0x97,0x7c, +0xbd,0x12,0x5f,0x5f,0x7a,0x35,0x4b,0xbd,0x37,0x8, 0xd, 0x7e,0x75,0x4b,0xe5,0x4a, +0x7a,0xb3,0x12,0x4f,0x7a,0xc3,0x12,0x4e,0xb, 0xd0,0x7e,0x73,0xc, 0x3d,0xbc,0x7d, +0x38,0xce,0x7d,0x37,0xda,0x3b,0x22,0x12,0x2a,0x20,0x7c,0xab,0xbe,0xa1,0x14,0x28, +0x3, 0x7a,0xa1,0x14,0x12,0x3e,0xb, 0x7c,0xab,0xbe,0xa1,0x14,0x28,0x3, 0x7a,0xa1, +0x14,0x12,0x44,0xfc,0x7c,0xab,0xbe,0xa1,0x14,0x28,0x3, 0x7a,0xa1,0x14,0x7e,0xa1, +0x14,0xe5,0x14,0xbe,0xb0,0x0, 0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xc, 0x3d,0x7a, +0xb3,0xb, 0x8c,0x7c,0xba,0x22,0x7c,0xa4,0x7c,0x15,0x7d,0x13,0x7c,0xb, 0x7e,0x19, +0x70,0xa5,0xbf,0x0, 0x6, 0x7a,0x19,0x0, 0x7c,0xb0,0x22,0xa, 0x27,0xa, 0x30,0x9d, +0x32,0x12,0x6d,0x95,0xa, 0x2a,0xbd,0x32,0x8, 0x12,0x7e,0x19,0xa0,0xbc,0xa0,0x7c, +0xba,0x50,0x4, 0x2c,0xb1,0x80,0x2, 0x9c,0xb1,0x7a,0x19,0xb0,0x7e,0x19,0xb0,0x22, +0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d,0x21,0x7d,0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d, +0x6c,0x7e,0xb3,0xe, 0x39,0xb4,0x1, 0x1f,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d,0x26,0xb, 0x28,0x30,0x9d,0x31,0x1b,0x28,0x30, +0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3,0xda,0x3b,0x22,0x7e,0xb3,0xe, 0x3a,0x70,0x32, +0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3,0xe, 0x36,0x12,0x55,0x99,0x12,0x30,0x0, 0xe4, +0x7a,0xb3,0xe, 0x36,0x12,0x55,0x99,0x12,0x30,0x0, 0x7e,0x34,0xe, 0x28,0x12,0x6d, +0x16,0x7e,0x37,0xd, 0xd5,0x7e,0x24,0x8, 0xe4,0x12,0x51,0xcc,0x74,0x2, 0x7a,0xb3, +0xe, 0x3a,0x22,0x74,0x1, 0x7a,0xb3,0x10,0xc4,0x74,0xc8,0x7a,0xb3,0x10,0xc5,0x74, +0x32,0x7a,0xb3,0x10,0xc6,0x74,0x3a,0x7a,0xb3,0x10,0xc0,0x74,0x24,0x7a,0xb3,0x10, +0xc1,0x7a,0xb3,0x10,0xc2,0x74,0x12,0x7a,0xb3,0x10,0xc3,0x7e,0x34,0x4, 0x0, 0x7a, +0x37,0x10,0xbc,0x7e,0x34,0x2, 0x58,0x7a,0x37,0x10,0xba,0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x75,0x65,0x1, 0x75,0xe6,0x0, 0xe5,0x25,0xb4,0x1, 0x3, 0x12,0x54,0x91,0xd0,0x82, +0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b, +0xda,0x7b,0x32,0xe5,0x21,0xb4,0x1, 0xe, 0x7e,0x34,0x0, 0x96,0x7a,0x37,0xd, 0x4c, +0x7e,0x34,0x0, 0x5a,0x80,0x1c,0x7e,0x37,0x12,0xcd,0xbe,0x34,0x0, 0x0, 0x28,0x6, +0x7e,0x34,0x0, 0x96,0x80,0x4, 0x7e,0x34,0x0, 0x46,0x7a,0x37,0xd, 0x4c,0x7e,0x34, +0x0, 0x2d,0x7a,0x37,0xd, 0x4e,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x4a,0x8a,0x7e, +0xb3,0xc, 0x55,0x60,0xc, 0x12,0x55,0xef,0x7e,0xb3,0x12,0xa4,0x4, 0x7a,0xb3,0x12, +0xa4,0x5, 0x61,0xbe,0xf1,0x61,0x38,0xf, 0x75,0x61,0x0, 0x7e,0xb3,0xc, 0x56,0x60, +0x6, 0x12,0x4c,0xfe,0x12,0x55,0x42,0xda,0xf8,0x22,0xca,0xf8,0x7d,0x1, 0x7d,0x13, +0x7e,0xf3,0xe, 0x4a,0xbe,0xf0,0x1, 0x78,0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0xe, +0x28,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff,0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18, +0x7e,0x13,0xe, 0x28,0x7e,0x0, 0x4, 0x12,0x6a,0xd9,0xda,0xf8,0x22,0x7d,0x23,0x7c, +0xab,0x6d,0x33,0x6c,0x33,0x4c,0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, +0xb, 0x8, 0x0, 0x2d,0x30,0x80,0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d, +0x30,0xb, 0x30,0xbe,0x30,0x3, 0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c, +0xaa,0x74,0x3, 0xa, 0x2a,0x2d,0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2, +0x0, 0x5, 0x7e,0x24,0xff,0xff,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59, +0x20,0x0, 0xa, 0x2d,0x13,0x59,0x21,0x0, 0x14,0xb, 0xa0,0xbe,0xa0,0x5, 0x40,0xd1, +0x22,0x30,0x3, 0x2d,0x7e,0xb3,0xc, 0xe0,0x70,0x27,0x7e,0xb3,0xc, 0xdf,0x70,0x21, +0x7e,0x73,0xf, 0x9e,0xa, 0x37,0x9, 0x73,0xd, 0x17,0x7a,0x73,0xe, 0x47,0xe4,0x7a, +0xb3,0xe, 0x4b,0x12,0x27,0xb6,0xc2,0x3, 0x7e,0xb3,0xe, 0xb3,0x4, 0x7a,0xb3,0xe, +0xb3,0x22,0x7d,0x23,0x70,0x6, 0x7e,0x34,0x0, 0xfa,0x80,0x14,0xb4,0x1, 0x6, 0x7e, +0x34,0x0, 0xfc,0x80,0xb, 0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xfe,0x80,0x2, 0xc3,0x22, +0x9, 0xb3,0x0, 0x1, 0x7e,0x39,0xa0,0x6c,0xba,0xb4,0xff,0x5, 0x7a,0x29,0xa0,0xd3, +0x22,0xc3,0x22,0x7d,0x13,0x7d,0x32,0x5e,0x34,0x0, 0x7, 0x2e,0x34,0x6d,0xce,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0xb, 0x7e,0x34,0x0, 0xff,0x9d,0x30,0x7c, +0x67,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x2d,0x21,0x7e,0x29,0x70,0x5c,0x76,0x7a,0x29, +0x70,0x22,0x7e,0x73,0xc, 0xe0,0xbe,0x70,0x0, 0x38,0x25,0xbe,0x73,0xc, 0xdf,0x50, +0x11,0x7e,0x63,0xc, 0xe9,0xbe,0x61,0x12,0x28,0xb, 0x5, 0x12,0x7a,0x73,0xc, 0xdf, +0x80,0x3, 0x75,0x12,0x0, 0x7e,0xb3,0xc, 0xdf,0x70,0x5, 0xe4,0x7a,0xb3,0xc, 0xe8, +0x22,0x7c,0x17,0x7c,0xb, 0xa5,0xb8,0x0, 0x13,0x7a,0x11,0x18,0xe5,0x18,0xc4,0x54, +0x7, 0x68,0x15,0x7c,0xb0,0x7c,0x71,0x12,0x4e,0x2d,0x80,0xc, 0xbe,0x0, 0x80,0x50, +0x7, 0x7c,0xb0,0x7c,0x71,0x12,0x20,0x0, 0x7c,0xb0,0x7c,0x71,0x2, 0x4e,0x2d,0x60, +0xe, 0x80,0x4, 0xe4,0x12,0x61,0x82,0xe5,0x18,0xc4,0x54,0x7, 0xb4,0x2, 0xf4,0xe5, +0x18,0xc4,0x54,0x7, 0xb4,0x2, 0x13,0x43,0x18,0x80,0x80,0x4, 0xe4,0x12,0x61,0x82, +0xe5,0x18,0xc4,0x54,0x7, 0xbe,0xb0,0x2, 0x68,0xf2,0x22,0xd2,0xc9,0xa9,0xd5,0xcb, +0xa, 0x56,0xf5,0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5, +0x83,0xa9,0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9, +0xa9,0xc5,0xcb,0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56, +0x1e,0x54,0x1e,0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90, +0x74,0xa, 0x12,0x61,0x2d,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x7d,0x42,0x7d, +0x23,0x7d,0x34,0x5e,0x34,0x0, 0x7, 0x2e,0x34,0x6d,0xce,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0x7c,0xab,0x7d,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x7e, +0x39,0xb0,0x5c,0xba,0x22,0xca,0xf8,0x12,0x62,0xb, 0x50,0x1d,0xa9,0xc7,0xea,0x7e, +0xf3,0xe, 0x4a,0xe4,0x7a,0xb3,0xe, 0x4a,0x7e,0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14, +0x18,0x0, 0x12,0x5c,0x2a,0x7a,0xf3,0xe, 0x4a,0xda,0xf8,0x22,0xb4,0x1, 0x3, 0xe4, +0x80,0x5, 0xb4,0x2, 0x8, 0x74,0x1, 0x7a,0xb3,0xe, 0x36,0x80,0x2, 0xe4,0x22,0x12, +0x55,0x99,0x7e,0x34,0xe, 0x28,0x12,0x68,0xec,0x7e,0x34,0xe, 0x28,0x12,0x6c,0x24, +0x74,0x1, 0x22,0xe4,0x7a,0xb3,0xe, 0x3a,0x7a,0xb3,0xe, 0x4b,0x7a,0xb3,0xc, 0xf1, +0x12,0x5e,0xca,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0xe, 0xa2,0x53,0x18,0x8f,0x74, +0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0xc, 0xf1,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12, +0x5b,0x1a,0x7e,0xb3,0xe, 0x3a,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x27,0xb6, +0x7e,0xb3,0xe, 0x4b,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22, +0xc2,0x7, 0x7e,0xa0,0x3c,0xe5,0x22,0xb4,0x1, 0x3, 0x7e,0xa0,0x64,0xa, 0x3a,0x1e, +0x34,0xbe,0x37,0x11,0x25,0x50,0xc, 0x7e,0x73,0xe, 0x47,0xbe,0x73,0xd, 0x17,0x78, +0x2, 0xd2,0x7, 0xa2,0x7, 0x22,0x12,0x62,0xb, 0x50,0x1f,0x12,0x62,0xd6,0x7a,0xb3, +0x12,0xd4,0x7e,0xb3,0xf, 0x9e,0xbe,0xb0,0x4, 0x68,0xf, 0x7e,0x73,0x12,0xd4,0xbe, +0x70,0xff,0x68,0x6, 0xd2,0x3, 0x7a,0x73,0xf, 0x9e,0x22,0x12,0x5f,0x16,0x12,0x1d, +0x49,0x7e,0xb3,0xc, 0x54,0x20,0xe2,0x6, 0x12,0x59,0x25,0x12,0x28,0x0, 0x12,0x59, +0x25,0x74,0x3, 0x12,0x43,0x9e,0x12,0x59,0x25,0x12,0x50,0x0, 0x2, 0xc, 0x8d,0x7c, +0x6b,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xb, 0x96,0x9, 0x65,0xb, 0x97,0x7e,0x50,0x30, +0xac,0x57,0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xd, 0xdb,0xb, 0x38,0x30, +0x22,0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0x83,0x12, +0x6d,0x39,0x7e,0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, +0x46,0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x26,0x7e,0x34,0x9, 0xdc,0x7a,0x35,0x28,0x7e, +0x34,0x0, 0x2, 0x7a,0x35,0x2a,0x7e,0x34,0xa, 0x26,0x7a,0x35,0x2c,0x74,0x2, 0x22, +0x7e,0x24,0x8, 0x9a,0x7e,0x34,0xf, 0xa7,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x6c,0x7e, +0x24,0x9, 0x2e,0x7e,0x34,0xf, 0x54,0x7e,0x14,0x0, 0x4a,0x2, 0x6d,0x6c,0xe4,0x7a, +0xb3,0x0, 0xf6,0x7a,0xb3,0x0, 0xf5,0x7e,0xb3,0xe, 0xa0,0x70,0x6, 0x7e,0x73,0xf, +0x19,0x80,0x4, 0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x0, 0xf7,0x22,0x2, 0x60,0x87,0xff, +0x7e,0x24,0x13,0xb0,0x7e,0x34,0x0, 0xfa,0x7e,0x14,0x0, 0x4, 0x12,0x6d,0x6c,0x7e, +0x24,0xc, 0xfe,0x7e,0x34,0x0, 0xfe,0x7e,0x14,0x0, 0x2, 0x2, 0x6d,0x6c,0xe5,0x22, +0xb4,0x1, 0x14,0xe5,0x21,0x70,0x10,0x7e,0xb3,0xf, 0x9e,0x60,0x7, 0xe4,0x7a,0xb3, +0xf, 0x9e,0xd2,0x3, 0x12,0x57,0x3f,0x85,0x21,0x22,0x22,0xc2,0x7, 0x6c,0xaa,0xa, +0x4a,0x9, 0x74,0xd, 0x17,0xbc,0x7b,0x78,0x2, 0xd2,0x7, 0xb, 0xa0,0xbe,0xa0,0x4, +0x40,0xed,0xa2,0x7, 0x22,0x7e,0x34,0xa, 0x75,0x7e,0x24,0x1, 0xcf,0xe4,0x12,0x6d, +0xa5,0x7e,0x34,0xb, 0xd4,0x7e,0x24,0x0, 0x69,0x74,0xff,0x2, 0x6d,0xa5,0x7d,0x40, +0x7d,0x51,0x7d,0x3, 0x7d,0x32,0x9d,0x34,0x12,0x6d,0x95,0x7d,0x13,0x7d,0x30,0x9d, +0x35,0x12,0x6d,0x95,0x2d,0x31,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9, +0x34,0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22, +0x7e,0x53,0xd, 0x3f,0xa, 0x25,0x3e,0x24,0x3e,0x24,0xb, 0x38,0x30,0x9d,0x32,0xbe, +0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x7d,0x41,0x7d,0x12,0x1a,0x26,0x1a, +0x24,0x1a,0x2, 0x1a,0x0, 0x12,0x66,0xf0,0x7d,0x14,0x1a,0x2, 0x1a,0x0, 0x2, 0x67, +0x5d,0x7d,0x2, 0xe4,0x7a,0xb3,0xd, 0xd4,0x7e,0x24,0x2, 0x70,0x12,0x6d,0xa5,0x7d, +0x30,0x7e,0x24,0x2, 0x70,0x2, 0x6d,0xa5,0x7d,0x2, 0xe4,0x7a,0xb3,0xd, 0xd3,0x7e, +0x24,0x0, 0x4a,0x12,0x6d,0xa5,0x7d,0x30,0x7e,0x24,0x0, 0x4a,0x2, 0x6d,0xa5,0x7e, +0x34,0x10,0x92,0x7e,0x24,0x0, 0xa, 0xe4,0x12,0x6d,0xa5,0x7e,0x34,0x0, 0x8, 0x7e, +0x24,0x0, 0xa, 0x2, 0x6d,0xa5,0x7e,0x34,0x0, 0x24,0x12,0x5d,0xdb,0x7c,0x7b,0xa5, +0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57,0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80, +0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5, +0xbf,0x0, 0xee,0x22,0xca,0x2b,0xca,0x1b,0xca,0xb, 0x53,0xcc,0xf8,0x43,0xcc,0x1, +0x12,0x42,0x36,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32,0xc2,0x6, 0x7e,0x73,0x12,0xd2, +0xbe,0x70,0x0, 0x28,0x8, 0x7e,0xb3,0x12,0xd1,0x60,0x2, 0xd2,0x6, 0xa2,0x6, 0x22, +0x6c,0x55,0x12,0x5e,0xf0,0x40,0x5, 0x12,0x62,0x89,0x50,0x3, 0x7e,0x50,0x3, 0x7c, +0xb5,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, 0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, +0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x12,0xc2,0xe4,0x7a,0xb3,0x12,0xc9,0x74, +0xff,0x7a,0xb3,0x12,0xc1,0x22,0xa, 0x2b,0x19,0x72,0xe, 0x7b,0x7e,0xb3,0xe, 0xfb, +0x44,0x1, 0x7a,0xb3,0xe, 0xfb,0x22,0x6d,0x33,0x7a,0x37,0xe, 0x2, 0x7e,0x34,0x0, +0x64,0x7a,0x37,0xa, 0x73,0x2, 0x62,0x9d,0x6d,0x33,0x7a,0x37,0xe, 0x2, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0x73,0x2, 0x62,0xc9,0x6d,0x33,0x7a,0x37,0xe, 0x2, 0x7e, +0x34,0xd, 0xac,0x7a,0x37,0xa, 0x73,0x2, 0x62,0x9d,0x7e,0x37,0x12,0xcd,0xbe,0x34, +0x0, 0x0, 0x28,0x6, 0x1b,0x34,0x7a,0x37,0x12,0xcd,0x22,0x7d,0x13,0xbd,0x21,0x50, +0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22,0xc2,0x5, 0x7e,0xb3,0xf, +0x6, 0xb4,0x1, 0x3, 0xd3,0x80,0x1, 0xc3,0x92,0x5, 0x22,0x74,0x1, 0x7a,0xb3,0xf, +0xf2,0xe4,0x7a,0xb3,0xf, 0xf1,0x7a,0xb3,0x11,0xcb,0x22,0x70,0x2, 0x80,0x8, 0xbe, +0xb0,0x80,0x50,0x3, 0x2, 0x33,0x4a,0x2, 0x41,0x7e,0x12,0x5f,0xde,0x12,0x39,0x91, +0x12,0x5b,0xc3,0x2, 0x53,0xdd,0xbe,0xb0,0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x12, +0xc1,0x22,0xe5,0x25,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x64,0x60,0xfc,0x22,0x6d,0x22, +0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38,0xfa,0x22,0xd2,0xcf,0xa9,0xd4,0xc9,0x75,0xcc, +0x0, 0xc2,0xca,0x22,0xe4,0x7a,0xb3,0xc, 0x41,0x12,0x31,0xad,0x2, 0x3f,0x6, 0xa9, +0xc0,0x93,0x75,0x16,0x0, 0x75,0x17,0x0, 0x32,0xc2,0x7, 0x30,0x3, 0x2, 0xd2,0x7, +0xa2,0x7, 0x22,0x75,0x23,0x0, 0x75,0x24,0x0, 0x75,0x25,0x0, 0x22,0xa9,0x32,0x99, +0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0x18,0x0, 0x12,0x0, 0x70,0x2, 0x56,0xee, +0x7e,0x34,0xb, 0xd2,0xa, 0x2b,0x2, 0x5e,0x2d,0x12,0x17,0xc3,0x12,0x5f,0xfc,0x2, +0x62,0xa7,0x12,0x62,0x9d,0x53,0x18,0xfd,0x32,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22, +0x12,0x24,0x66,0x2, 0x2e,0x27,0x12,0x45,0xa5,0x2, 0x22,0x34,0x12,0x0, 0x5a,0x2, +0x57,0xe1,0x7e,0x34,0x25,0x4, 0x22,0x2, 0x26,0x91,0x0, 0x0, 0x3, 0xe0,0x3, 0xff, +0x3, 0xff,0x0, 0x20,0x0, 0x41,0x0, 0x42,0x0, 0x22,0x3, 0xe0,0x3, 0xbe,0x3, 0x9c, +0x3, 0xdd,0x0, 0x40,0x0, 0xa3,0x0, 0xa5,0x0, 0x44,0x3, 0xc0,0x3, 0x5c,0x3, 0x5a, +0x3, 0xbb,0x0, 0x60,0x0, 0xe5,0x0, 0xe8,0x0, 0x66,0x3, 0xa0,0x3, 0x1a,0x2, 0xf7, +0x3, 0x99,0x0, 0x80,0x1, 0x47,0x1, 0x4b,0x0, 0x88,0x3, 0x80,0x2, 0xb8,0x2, 0xb4, +0x3, 0x77,0x0, 0xa0,0x1, 0x89,0x1, 0xad,0x0, 0xaa,0x3, 0x60,0x2, 0x56,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xaa,0x3, 0x60,0x2, 0x76,0x2, 0x93, +0x3, 0x77,0x0, 0xa0,0x1, 0x69,0x1, 0x6c,0x0, 0x88,0x3, 0x80,0x2, 0xd8,0x2, 0xd5, +0x3, 0x99,0x0, 0x80,0x1, 0x27,0x1, 0x9, 0x0, 0x66,0x3, 0xa0,0x3, 0x3a,0x3, 0x38, +0x3, 0xbb,0x0, 0x60,0x0, 0xc5,0x0, 0xc6,0x0, 0x44,0x3, 0xc0,0x3, 0x7c,0x3, 0x7b, +0x3, 0xdd,0x0, 0x40,0x0, 0x83,0x0, 0x64,0x0, 0x22,0x3, 0xe0,0x3, 0xde,0x3, 0xde, +0x3, 0xff,0x0, 0x20,0x0, 0x21,0x0, 0x21,0x0, 0x0, 0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51, +0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb,0xca,0x79,0x7d,0x73,0x12,0x6b, +0x87,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x27, +0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c,0xe, 0x1b, +0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49,0x27,0x0, +0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34,0x1c,0x14, +0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c,0x67,0x6c, +0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38,0x10,0x9, +0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, 0x25,0x4d, +0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27,0x7e,0x34, +0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa, +0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e,0x34,0x1c, +0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e,0x34,0x1c, +0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, 0x4b,0x2d, +0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x19, +0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, +0xac,0x7a,0x2e,0x34,0x62,0xea,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e,0x24,0x1c, +0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x64,0xe8,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e,0x34,0x1c, +0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x64,0xea,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, 0xa0,0xbe, +0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x6a,0x7e,0x49,0x27,0x0, 0x39,0x7e,0x34,0x1c, +0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33,0x7e,0x34, +0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, +0x1, 0x12,0x6b,0x30,0x49,0x37,0x0, 0x47,0x12,0x6c,0x65,0x49,0x37,0x0, 0x49,0x49, +0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x69,0xb7,0x49,0x27,0x0, 0x35,0x7e,0x34, +0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b,0x38,0x20, +0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22,0xc2,0xd5, +0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30, +0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff, +0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22, +0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21, +0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, +0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d, +0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f, +0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d, +0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, +0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c, +0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7, +0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x67,0xc, 0x9f,0x22,0x9f,0x20, +0x7f,0x2, 0x80,0x3, 0x12,0x67,0xc, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12, +0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18, +0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19, +0x40,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5,0xba,0x7e,0x55,0x4b, +0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x9, 0xb2,0x0, 0x1, +0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c,0xba,0xf5,0xc4,0x75, +0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5,0xc6,0x75,0xc5,0x2, +0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e,0x34,0xff,0xff,0xb, +0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, 0x1a,0x56,0x5e,0x54, +0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c,0xb1,0xf5,0xc6,0x75, +0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x68,0x33,0x43,0xc2,0x9, 0x0, +0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xa, 0xe5,0xc6,0x19, +0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, 0x75,0xc5,0xc, 0xe5, +0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, 0x1, 0xa9,0xc6,0xcb, +0x22,0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9, +0x7e,0xf8,0x12,0xd4,0xd2,0x0, 0xc2,0x1, 0xd2,0x2, 0xc2,0x3, 0x75,0x3e,0x0, 0x75, +0x15,0x1, 0x75,0x16,0x0, 0x75,0x17,0x0, 0x75,0x19,0x0, 0x75,0x1a,0x0, 0x75,0x1b, +0x0, 0xc2,0x4, 0x75,0x1d,0x0, 0x75,0x1e,0x64,0x75,0x1f,0x64,0x75,0x12,0x0, 0x75, +0x13,0x0, 0x75,0x14,0x0, 0x75,0x5b,0x0, 0x75,0x5c,0x0, 0x75,0x61,0x0, 0x75,0x5d, +0x0, 0x75,0x63,0x0, 0x75,0x5f,0x18,0x75,0x60,0x0, 0x75,0x64,0x0, 0x75,0x65,0x0, +0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x6d,0xe7,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69, +0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, +0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x59,0x68,0x7d,0x3, 0x75,0xcc, +0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca,0x54,0x1, 0x4c,0xba, +0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, 0x70,0x0, 0xe, 0x2e, +0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c, +0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, 0x13,0x54,0x3, 0xa, +0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54,0xe7,0x4c,0xba,0xf5, +0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x6a,0x1b,0x9, 0xb0,0x0, 0x14, +0xf5,0xe7,0x22,0x7c,0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2, +0x1e,0xb0,0x1e,0xb0,0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44, +0x1e,0x50,0x1e,0x50,0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd, +0xa, 0x50,0xf5,0xc1,0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0, +0x43,0xc2,0x7, 0x80,0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, +0xac,0x13,0x2e,0x4, 0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c, +0x33,0x80,0x43,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0, +0xb, 0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, +0xb0,0x54,0x1f,0xa, 0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c, +0xb2,0x1e,0xb0,0x7e,0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, +0x9, 0xb2,0x0, 0xc, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54, +0x7f,0xf5,0xe5,0x75,0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4, +0xb, 0x6c,0xaa,0xa, 0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5, +0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39, +0xb0,0xf5,0xe5,0x75,0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff, +0xf5,0xe5,0x75,0xe4,0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0x6d,0x11, +0x7e,0x24,0x1c,0x1c,0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, +0x9, 0xa3,0x0, 0x50,0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14, +0x7e,0x19,0x40,0xa, 0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f, +0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14, +0x1b,0x8, 0x10,0x49,0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, +0x10,0xb, 0x50,0xbe,0x50,0xd, 0x40,0xb1,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7, +0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7, +0xf5,0xbc,0x7c,0xb3,0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0, +0xf5,0xc3,0xe5,0xc4,0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d, +0x23,0x4e,0x24,0x0, 0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42, +0xc2,0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22, +0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13,0x2e,0x4, 0x1c,0x30,0x1b, +0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x3, 0xec,0x6c,0x33,0x80,0x36,0xa, 0x3, 0x2d,0x2, +0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e,0x9, 0x10, +0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e,0x20,0x7e, +0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b,0x48,0x0, +0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x9, 0xa3,0x0, 0x24,0xbe,0xa0,0x1, 0x78,0x5, +0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, 0x9, 0x53,0x0, 0x2, 0x3e, +0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0,0xca,0xd2,0xcd,0xbe,0xa0, +0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9,0x7e,0x14,0x1d,0x0, 0xb, +0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3,0x0, 0x3f,0xb4,0x1, 0xc, +0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5,0xe5,0x22,0x7c,0xab,0xa9, +0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb, +0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7a,0xa1,0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80, +0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75, +0xc5,0xe, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6,0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32, +0xa9,0xc6,0xcb,0x22,0x75,0x65,0x0, 0x75,0xe4,0x3, 0x49,0x23,0x0, 0x17,0x7d,0x52, +0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24,0x1f,0x0, 0xa, 0x24,0x7c, +0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4,0x6, 0x9, 0xb3,0x0, 0x16, +0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea,0x75,0xe6,0x0, 0xa9,0xd1, +0xe1,0xa9,0xd0,0xe1,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2d,0x13, +0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d,0x10,0x2e,0x24,0x1c, +0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22,0x75,0x64,0x0, 0xa9, +0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30, +0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e, +0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, 0x5e,0x0, 0xf, 0x0, 0xe6,0x1, 0x2c,0x0, +0xe, 0x0, 0xbe,0x0, 0xfa,0x0, 0xc, 0x0, 0x96,0x0, 0xc8,0x0, 0xa, 0x0, 0x78,0x0, +0x78,0x0, 0x8, 0x0, 0x5a,0x0, 0x50,0x0, 0x6, 0x0, 0x2d,0x0, 0x3c,0x0, 0x5, 0x0, +0x15,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80,0x3, 0x7e,0x39, +0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, 0x3b,0x7e,0x34, +0x1d,0x6, 0x1b,0x38,0x20,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, 0x75, +0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, 0xb3, +0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x75,0x64,0x1, 0x7e,0x24,0x1d,0x0, +0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34,0x0, 0x1, +0x2, 0x62,0x5e,0x0, 0x78,0x0, 0x28,0x17,0x0, 0xf0,0x0, 0x3c,0x17,0x1, 0x40,0x0, +0x64,0x17,0x2, 0x26,0x0, 0x96,0x17,0x3, 0x20,0x0, 0xfa,0x17,0x7d,0x3, 0x80,0xa, +0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55, +0x78,0xee,0x22,0x75,0x65,0x1, 0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34, +0x0, 0x1, 0x2, 0x62,0x5e,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22, +0x6d,0x33,0x9d,0x32,0x22,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14, +0x4d,0x22,0x78,0xf5,0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, +0x9, 0x8, 0x7, 0x6, 0x4, 0x5, 0xc, 0x17,0x0, 0x6, 0x7, 0x0, 0xb, 0xc, 0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x7e,0x34, +0x1, 0x5, 0x22,0x0, 0x1e,0x2, 0xd0,0x0, 0x1, 0xa, 0x70,0xf, 0x0, 0x1, 0xa, 0x71, +0x14,0x0, 0x1, 0xa, 0x72,0x3, 0x0, 0x1, 0xc, 0x44,0x80,0x0, 0x1, 0xc, 0x57,0x0, +0x0, 0x9, 0xd, 0x17,0x2b,0x21,0x31,0x38,0x2b,0x15,0x20,0x2b,0x36,0x0, 0x18,0xd, +0x26,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd, 0x60,0x2, 0x0, 0x18, +0xd, 0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xd, 0xa0,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xd, 0xad,0xc, +0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, +0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0x0, 0x1, 0xd, 0xc5,0x0, 0x0, 0xd, 0xd, 0xc6, +0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0xd, 0xf, +0x9, 0xc, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0xd, 0x0, 0x1, +0xf, 0x1f,0xf, 0x0, 0x32,0xf, 0x20,0x0, 0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, +0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a,0x1, 0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, +0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, 0x7, 0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, +0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e,0xc, 0x83,0x0, 0x1, 0xf, 0x52,0x14,0x0, 0x1, +0xf, 0x53,0x0, 0x0, 0x1, 0xf, 0x9e,0x0, 0x0, 0x4, 0xf, 0xa0,0xff,0xff,0xff,0xff, +0x0, 0x2, 0xf, 0xa4,0xff,0xf, 0x0, 0x1, 0xf, 0xa6,0x80,0x0, 0x1, 0xf, 0xf9,0x0, +0x0, 0x4, 0xf, 0xfa,0x23,0x23,0x23,0x2d,0x0, 0x8, 0x0, 0x66,0x8, 0x9a,0x8, 0xca, +0x9, 0x2e,0x9, 0x5e,0x0, 0x14,0x0, 0x6e,0xa, 0x70,0xf, 0x1f,0xa, 0x71,0xf, 0x52, +0xe, 0x38,0xe, 0x38,0xa, 0x72,0xf, 0x53,0xc, 0x44,0xf, 0xa6,0x0, 0x1, 0x0, 0xca, +0x0, 0x0, 0x8, 0x0, 0xcd,0x8, 0x50,0x8, 0x80,0x8, 0xe4,0x9, 0x14,0x0, 0x1, 0x12, +0x6e,0xff,0x0, 0x2, 0x12,0x6f,0x0, 0x0, 0x0, 0x5, 0x10,0x6f,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1e,0x10,0x74,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x4, 0x10,0x9c,0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x10,0xa0,0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0x10,0xc9,0x0, 0x0, 0x4, 0x10,0xca,0x0, 0x0, 0x0, 0x0, +0x0, 0x10,0x10,0xce,0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, +0xe7,0x7, 0xe2,0x8, 0x0, 0x1, 0x0, 0xf1,0x0, 0x0, 0x1, 0x0, 0xf3,0x0, 0x0, 0x1, +0x12,0xd3,0x0, 0x0, 0x1, 0x0, 0xdf,0x1, 0x0, 0x10,0x0, 0xe0,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xf0, +0xff,0x0, 0x2, 0x12,0xcb,0x0, 0x0, 0x0, 0x2, 0x12,0xcd,0x0, 0x0, 0x0, 0x2, 0x12, +0xcf,0x0, 0x0, 0x0, 0x1, 0x12,0xd2,0x0, 0x0, 0x5, 0x11,0x10,0x14,0x1d,0x26,0x2f, +0x36,0x0, 0x1, 0x11,0xc9,0x3, 0x0, 0x1, 0x11,0xca,0x0, 0x0, 0x1, 0x11,0xcb,0x0, +0x0, 0x1, 0x11,0xcc,0x0, 0x0, 0x1, 0x0, 0xf9,0x0, 0x0, 0x1, 0x12,0x9e,0x0, 0x0, +0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x70,0x11,0x8f,0xee,0xc5,0x3a,0x18,0xf2, \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/touchpanel/Makefile b/arch/arm/mach-mt8127/ford/touchpanel/Makefile new file mode 100755 index 00000000000..6d8ee4ea975 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/Makefile @@ -0,0 +1,24 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += mtk_tpd.o +obj-y += tpd_button.o +obj-y += tpd_calibrate.o +obj-y += tpd_debug.o +obj-y += tpd_default.o +obj-y += tpd_init.o +obj-y += tpd_misc.o +obj-y += tpd_setting.o + +ifeq ($(CONFIG_AUSTIN_PROJECT), y) + obj-y += goodix_tool.o + obj-y += gt9xx_driver.o + obj-y += gt9xx_update.o +else + obj-y += focaltech_core.o + obj-y += focaltech_ex_fun.o + obj-y += focaltech_ctl.o + obj-y += focaltech_flash.o + obj-y += gsl_ts_driver.o + obj-y += ssd60xx_tp.o +endif + diff --git a/arch/arm/mach-mt8127/ford/touchpanel/focaltech_Gesture.c b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_Gesture.c new file mode 100644 index 00000000000..d0213c8a1a7 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_Gesture.c @@ -0,0 +1,328 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2015, Focaltech Ltd. All rights reserved. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + /******************************************************************************* +* +* File Name: Focaltech_Gestrue.c +* +* Author: Xu YongFeng +* +* Created: 2015-01-29 +* +* Modify by mshl on 2015-03-20 +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTRUE_EN +#include "ft_gesture_lib.h" +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +#define KEY_GESTURE_U KEY_U +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_L KEY_L +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_Z KEY_Z + +#define GESTURE_LEFT 0x20 +#define GESTURE_RIGHT 0x21 +#define GESTURE_UP 0x22 +#define GESTURE_DOWN 0x23 +#define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_O 0x30 +#define GESTURE_W 0x31 +#define GESTURE_M 0x32 +#define GESTURE_E 0x33 +#define GESTURE_L 0x44 +#define GESTURE_S 0x46 +#define GESTURE_V 0x54 +#define GESTURE_Z 0x41 +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_ONETIME 62 +#define FTS_GESTRUE_POINTS_HEADER 8 +#define FTS_GESTURE_OUTPUT_ADRESS 0xD3 +#define FTS_GESTURE_OUTPUT_UNIT_LENGTH 4 + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + +/******************************************************************************* +* Static variables +*******************************************************************************/ +short pointnum = 0; +unsigned short coordinate_x[150] = { 0 }; +unsigned short coordinate_y[150] = { 0 }; + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + +/******************************************************************************* +* Name: fts_Gesture_init +* Brief: +* Input: +* Output: None +* Return: None +*******************************************************************************/ +int fts_Gesture_init(struct input_dev *input_dev) +{ + /*init_para(480,854,60,0,0);*/ + input_set_capability(input_dev, EV_KEY, KEY_POWER); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_U); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_UP); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_DOWN); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_LEFT); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_RIGHT); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_O); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_E); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_M); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_L); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_W); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_S); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_V); + input_set_capability(input_dev, EV_KEY, KEY_GESTURE_Z); + + __set_bit(KEY_GESTURE_RIGHT, input_dev->keybit); + __set_bit(KEY_GESTURE_LEFT, input_dev->keybit); + __set_bit(KEY_GESTURE_UP, input_dev->keybit); + __set_bit(KEY_GESTURE_DOWN, input_dev->keybit); + __set_bit(KEY_GESTURE_U, input_dev->keybit); + __set_bit(KEY_GESTURE_O, input_dev->keybit); + __set_bit(KEY_GESTURE_E, input_dev->keybit); + __set_bit(KEY_GESTURE_M, input_dev->keybit); + __set_bit(KEY_GESTURE_W, input_dev->keybit); + __set_bit(KEY_GESTURE_L, input_dev->keybit); + __set_bit(KEY_GESTURE_S, input_dev->keybit); + __set_bit(KEY_GESTURE_V, input_dev->keybit); + __set_bit(KEY_GESTURE_Z, input_dev->keybit); + + return 0; +} + +/******************************************************************************* +* Name: fts_check_gesture +* Brief: +* Input: +* Output: None +* Return: None +*******************************************************************************/ +static void fts_check_gesture(struct input_dev *input_dev, int gesture_id) +{ + /*printk("fts gesture_id==0x%x\n ",gesture_id);*/ + + switch (gesture_id) { + case GESTURE_LEFT: + input_report_key(input_dev, KEY_GESTURE_LEFT, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_LEFT, 0); + input_sync(input_dev); + break; + case GESTURE_RIGHT: + input_report_key(input_dev, KEY_GESTURE_RIGHT, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_RIGHT, 0); + input_sync(input_dev); + break; + case GESTURE_UP: + input_report_key(input_dev, KEY_GESTURE_UP, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_UP, 0); + input_sync(input_dev); + break; + case GESTURE_DOWN: + input_report_key(input_dev, KEY_GESTURE_DOWN, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_DOWN, 0); + input_sync(input_dev); + break; + case GESTURE_DOUBLECLICK: + input_report_key(input_dev, KEY_GESTURE_U, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_U, 0); + input_sync(input_dev); + break; + case GESTURE_O: + input_report_key(input_dev, KEY_GESTURE_O, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_O, 0); + input_sync(input_dev); + break; + case GESTURE_W: + input_report_key(input_dev, KEY_GESTURE_W, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_W, 0); + input_sync(input_dev); + break; + case GESTURE_M: + input_report_key(input_dev, KEY_GESTURE_M, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_M, 0); + input_sync(input_dev); + break; + case GESTURE_E: + input_report_key(input_dev, KEY_GESTURE_E, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_E, 0); + input_sync(input_dev); + break; + case GESTURE_L: + input_report_key(input_dev, KEY_GESTURE_L, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_L, 0); + input_sync(input_dev); + break; + case GESTURE_S: + input_report_key(input_dev, KEY_GESTURE_S, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_S, 0); + input_sync(input_dev); + break; + case GESTURE_V: + input_report_key(input_dev, KEY_GESTURE_V, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_V, 0); + input_sync(input_dev); + break; + case GESTURE_Z: + input_report_key(input_dev, KEY_GESTURE_Z, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_GESTURE_Z, 0); + input_sync(input_dev); + break; + default: + break; + } + +} + + /************************************************************************ +* Name: fts_read_Gestruedata +* Brief: read data from TP register +* Input: no +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_read_Gestruedata(void) +{ + unsigned char buf[FTS_GESTRUE_POINTS * 3] = { 0 }; + int ret = -1; + int i = 0; + int gestrue_id = 0; + + buf[0] = 0xd3; + pointnum = 0; + + ret = + fts_i2c_read(fts_i2c_client, buf, 1, buf, + FTS_GESTRUE_POINTS_HEADER); + /*printk( "tpd read FTS_GESTRUE_POINTS_HEADER.\n");*/ + + if (ret < 0) { + printk("%s read touchdata failed.\n", __func__); + return ret; + } + + /* FW */ + if (fts_updateinfo_curr.CHIP_ID == 0x54 + || fts_updateinfo_curr.CHIP_ID == 0x58) { + gestrue_id = buf[0]; + pointnum = (short)(buf[1]) & 0xff; + buf[0] = 0xd3; + + if ((pointnum * 4 + 8) < 255) { + ret = + fts_i2c_read(fts_i2c_client, buf, 1, buf, + (pointnum * 4 + 8)); + } else { + ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, 255); + ret = + fts_i2c_read(fts_i2c_client, buf, 0, buf + 255, + (pointnum * 4 + 8) - 255); + } + if (ret < 0) { + printk("%s read touchdata failed.\n", __func__); + return ret; + } + + fts_check_gesture(fts_input_dev, gestrue_id); + for (i = 0; i < pointnum; i++) { + coordinate_x[i] = (((s16) buf[0 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[1 + (4 * i)]) & 0xFF); + coordinate_y[i] = (((s16) buf[2 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[3 + (4 * i)]) & 0xFF); + } + return -1; + } + /*other IC's gestrue in driver*/ + if (0x24 == buf[0]) { + gestrue_id = 0x24; + fts_check_gesture(fts_input_dev, gestrue_id); + printk("%d check_gesture gestrue_id.\n", gestrue_id); + return -1; + } + + pointnum = (short)(buf[1]) & 0xff; + buf[0] = 0xd3; + if ((pointnum * 4 + 8) < 255) { + ret = + fts_i2c_read(fts_i2c_client, buf, 1, buf, + (pointnum * 4 + 8)); + } else { + ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, 255); + ret = + fts_i2c_read(fts_i2c_client, buf, 0, buf + 255, + (pointnum * 4 + 8) - 255); + } + if (ret < 0) { + printk("%s read touchdata failed.\n", __func__); + return ret; + } + + gestrue_id = fetch_object_sample(buf, pointnum); + fts_check_gesture(fts_input_dev, gestrue_id); + printk("%d read gestrue_id.\n", gestrue_id); + + for (i = 0; i < pointnum; i++) { + coordinate_x[i] = (((s16) buf[0 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[1 + (4 * i)]) & 0xFF); + coordinate_y[i] = (((s16) buf[2 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[3 + (4 * i)]) & 0xFF); + } + return -1; +} +#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/focaltech_core.c b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_core.c new file mode 100644 index 00000000000..b81028c3f47 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_core.c @@ -0,0 +1,1880 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2015, Focaltech Ltd. All rights reserved. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + /******************************************************************************* +* +* File Name: Ftxxxx_ts.c +* +* Author: Tsai HsiangYu +* +* Created: 2015-03-02 +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ +/* +/*user defined include header files +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "focaltech_core.h" +*/ + +/*#include "tpd.h"*/ +/*#include "tpd_custom_fts.h"*/ +#include "cust_gpio_usage.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "focaltech_core.h" +#include + +/******************************************************************************* +* 2.Private constant and macro definitions using #define +*******************************************************************************/ +/*register define*/ +#define FTS_RESET_PIN GPIO_CTP_RST_PIN +#define TPD_OK 0 +#define DEVICE_MODE 0x00 +#define GEST_ID 0x01 +#define TD_STATUS 0x02 +#define TOUCH1_XH 0x03 +#define TOUCH1_XL 0x04 +#define TOUCH1_YH 0x05 +#define TOUCH1_YL 0x06 +#define TOUCH2_XH 0x09 +#define TOUCH2_XL 0x0A +#define TOUCH2_YH 0x0B +#define TOUCH2_YL 0x0C +#define TOUCH3_XH 0x0F +#define TOUCH3_XL 0x10 +#define TOUCH3_YH 0x11 +#define TOUCH3_YL 0x12 +#define TPD_MAX_RESET_COUNT 3 +/*if need these function, pls enable this MACRO*/ + +/*#define TPD_PROXIMITY*/ +#define TPD_AUTO_UPGRADE + +#define FTS_CTL_IIC +#define SYSFS_DEBUG +#define FTS_APK_DEBUG + +/*for tp esd check*/ +#define GTP_ESD_PROTECT 0 +#if GTP_ESD_PROTECT +#define TPD_ESD_CHECK_CIRCLE 200 +static struct delayed_work gtp_esd_check_work; +static struct workqueue_struct *gtp_esd_check_workqueue; +static void gtp_esd_check_func(struct work_struct *); + /*add for esd*/ +static int count_irq ; +static unsigned long esd_check_circle = TPD_ESD_CHECK_CIRCLE; +static u8 run_check_91_register; +#endif + +/*#ifdef FTS_CTL_IIC + #include "focaltech_ctl.h" +#endif +#ifdef SYSFS_DEBUG + #include "focaltech_ex_fun.h" +#endif*/ + + /*PROXIMITY*/ +#ifdef TPD_PROXIMITY +#include +#include +#include +#endif +#ifdef TPD_PROXIMITY +#define APS_ERR(fmt, arg...) printk("<> "fmt"\n", ##arg) +#define TPD_PROXIMITY_DEBUG(fmt, arg...) printk("<> "fmt"\n", ##arg) +#define TPD_PROXIMITY_DMESG(fmt, arg...) printk("<> "fmt"\n", ##arg) +static u8 tpd_proximity_flag; + /*add for tpd_proximity by wangdongfang*/ +static u8 tpd_proximity_flag_one; + /*0-->close ; 1--> far away*/ +static u8 tpd_proximity_detect = 1; +#endif +/*dma declare, allocate and release*/ +#define __MSG_DMA_MODE__ +#ifdef __MSG_DMA_MODE__ +u8 *g_dma_buff_va = NULL; +u8 *g_dma_buff_pa = NULL; +#endif + +#ifdef __MSG_DMA_MODE__ + +static void msg_dma_alloct(void) +{ + g_dma_buff_va = (u8 *) dma_alloc_coherent(NULL, 128, &g_dma_buff_pa, GFP_KERNEL); /*DMA size 4096 for customer*/ + if (!g_dma_buff_va) { + TPD_DMESG("[DMA][Error] Allocate DMA I2C Buffer failed!\n"); + } +} + +static void msg_dma_release(void) +{ + if (g_dma_buff_va) { + dma_free_coherent(NULL, 128, g_dma_buff_va, g_dma_buff_pa); + g_dma_buff_va = NULL; + g_dma_buff_pa = NULL; + TPD_DMESG("[DMA][release] Allocate DMA I2C Buffer release!\n"); + } +} +#endif +#ifdef TPD_HAVE_BUTTON +static int tpd_keys_local[TPD_KEY_COUNT] = TPD_KEYS; +static int tpd_keys_dim_local[TPD_KEY_COUNT][4] = TPD_KEYS_DIM; +#endif +#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) +static int tpd_wb_start_local[TPD_WARP_CNT] = TPD_WARP_START; +static int tpd_wb_end_local[TPD_WARP_CNT] = TPD_WARP_END; +#endif +#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) +static int tpd_calmat_local[8] = TPD_CALIBRATION_MATRIX; +static int tpd_def_calmat_local[8] = TPD_CALIBRATION_MATRIX; +#endif +/******************************************************************************* +* 3.Private enumerations, structures and unions using typedef +*******************************************************************************/ + +/*touch info*/ +struct touch_info { + int y[10]; + int x[10]; + int p[10]; + int id[10]; + int count; +}; + +/*register driver and device info*/ +static const struct i2c_device_id fts_tpd_id[] = { {"fts", 0}, {} }; + +static struct i2c_board_info __initdata fts_i2c_tpd = { + I2C_BOARD_INFO("fts", (0x70 >> 1)) }; + +/******************************************************************************* +* 4.Static variables +*******************************************************************************/ +struct i2c_client *fts_i2c_client = NULL; +struct input_dev *fts_input_dev = NULL; +struct task_struct *thread = NULL; + +static int tpd_flag; +static int tpd_halt; +static int point_num; +static int p_point_num; +static u8 buf_addr[2] = { 0 }; +static u8 buf_value[2] = { 0 }; + +unsigned char ft_vendor_id = 0; + +/******************************************************************************* +* 5.Global variable or extern global variabls/functions +*******************************************************************************/ + +/******************************************************************************* +* 6.Static function prototypes +*******************************************************************************/ + +static DECLARE_WAIT_QUEUE_HEAD(waiter); +static DEFINE_MUTEX(i2c_access); +static DEFINE_MUTEX(i2c_rw_access); +static void tpd_eint_interrupt_handler(void); +static int __devinit tpd_probe(struct i2c_client *client, + const struct i2c_device_id *id); +static int tpd_detect(struct i2c_client *client, struct i2c_board_info *info); +static int __devexit tpd_remove(struct i2c_client *client); +static int touch_event_handler(void *unused); +extern void mt_eint_mask(unsigned int eint_num); +extern void mt_eint_unmask(unsigned int eint_num); +extern void mt_eint_set_hw_debounce(unsigned int eint_num, unsigned int ms); +extern void mt_eint_set_polarity(unsigned int eint_num, unsigned int pol); +extern unsigned int mt_eint_set_sens(unsigned int eint_num, unsigned int sens); +extern void mt_eint_registration(unsigned int eint_num, unsigned int flow, + void (EINT_FUNC_PTR) (void), + unsigned int is_auto_umask); + +static struct i2c_driver tpd_i2c_driver = { + .driver = { + .name = "fts", + /*.owner = THIS_MODULE,*/ + }, + .probe = tpd_probe, + .remove = __devexit_p(tpd_remove), + .id_table = fts_tpd_id, + .detect = tpd_detect, + +}; + +/* +* open/release/(I/O) control tpd device +* +*/ +/*#define VELOCITY_CUSTOM_fts*/ +#ifdef VELOCITY_CUSTOM_fts +#include +#include +#include + +/*for magnify velocity*/ +#ifndef TPD_VELOCITY_CUSTOM_X +#define TPD_VELOCITY_CUSTOM_X 10 +#endif +#ifndef TPD_VELOCITY_CUSTOM_Y +#define TPD_VELOCITY_CUSTOM_Y 10 +#endif + +#define TOUCH_IOC_MAGIC 'A' +#define TPD_GET_VELOCITY_CUSTOM_X _IO(TOUCH_IOC_MAGIC, 0) +#define TPD_GET_VELOCITY_CUSTOM_Y _IO(TOUCH_IOC_MAGIC, 1) + +int g_v_magnify_x = TPD_VELOCITY_CUSTOM_X; +int g_v_magnify_y = TPD_VELOCITY_CUSTOM_Y; + +/************************************************************************ +* Name: tpd_misc_open +* Brief: open node +* Input: node, file point +* Output: no +* Return: fail <0 +***********************************************************************/ +static int tpd_misc_open(struct inode *inode, struct file *file) +{ + return nonseekable_open(inode, file); +} + +/************************************************************************ +* Name: tpd_misc_release +* Brief: release node +* Input: node, file point +* Output: no +* Return: 0 +***********************************************************************/ +static int tpd_misc_release(struct inode *inode, struct file *file) +{ + return 0; +} + +/************************************************************************ +* Name: tpd_unlocked_ioctl +* Brief: I/O control for apk +* Input: file point, command +* Output: no +* Return: fail <0 +***********************************************************************/ + +static long tpd_unlocked_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + + void __user *data; + + long err = 0; + + if (_IOC_DIR(cmd) & _IOC_READ) { + err = + !access_ok(VERIFY_WRITE, (void __user *)arg, + _IOC_SIZE(cmd)); + } else if (_IOC_DIR(cmd) & _IOC_WRITE) { + err = + !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + } + + if (err) { + printk("tpd: access error: %08X, (%2d, %2d)\n", cmd, + _IOC_DIR(cmd), _IOC_SIZE(cmd)); + return -EFAULT; + } + + switch (cmd) { + case TPD_GET_VELOCITY_CUSTOM_X: + data = (void __user *)arg; + if (data == NULL) { + err = -EINVAL; + break; + } + + if (copy_to_user(data, &g_v_magnify_x, sizeof(g_v_magnify_x))) { + err = -EFAULT; + break; + } + break; + + case TPD_GET_VELOCITY_CUSTOM_Y: + data = (void __user *)arg; + if (data == NULL) { + err = -EINVAL; + break; + } + + if (copy_to_user(data, &g_v_magnify_y, sizeof(g_v_magnify_y))) { + err = -EFAULT; + break; + } + break; + + default: + printk("tpd: unknown IOCTL: 0x%08x\n", cmd); + err = -ENOIOCTLCMD; + break; + + } + + return err; +} + +static struct file_operations tpd_fops = { + /*.owner = THIS_MODULE,*/ + .open = tpd_misc_open, + .release = tpd_misc_release, + .unlocked_ioctl = tpd_unlocked_ioctl, +}; + +static struct miscdevice tpd_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "touch", + .fops = &tpd_fops, +}; +#endif + +/************************************************************************ +* Name: fts_i2c_read +* Brief: i2c read +* Input: i2c info, write buf, write len, read buf, read len +* Output: get data in the 3rd buf +* Return: fail <0 +***********************************************************************/ +int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, + char *readbuf, int readlen) +{ + int ret, i; + + /* for DMA I2c transfer*/ + + mutex_lock(&i2c_rw_access); + + if (writelen != 0) { + /*DMA Write*/ + memcpy(g_dma_buff_va, writebuf, writelen); + client->addr = client->addr & I2C_MASK_FLAG | I2C_DMA_FLAG; + ret = i2c_master_send(client, (unsigned char *)g_dma_buff_pa, writelen); + if (ret != writelen) + /*dev_err(&client->dev, "###%s i2c write len=%x,buffaddr=%x\n", __func__,ret,*g_dma_buff_pa);*/ + printk("i2c write failed\n"); + client->addr = client->addr & I2C_MASK_FLAG & (~I2C_DMA_FLAG); + } + /*DMA Read */ + + if (readlen != 0) { + client->addr = client->addr & I2C_MASK_FLAG | I2C_DMA_FLAG; + + ret = + i2c_master_recv(client, (unsigned char *)g_dma_buff_pa, + readlen); + + memcpy(readbuf, g_dma_buff_va, readlen); + + client->addr = client->addr & I2C_MASK_FLAG & (~I2C_DMA_FLAG); + } + + mutex_unlock(&i2c_rw_access); + + return ret; + + /* + int ret,i; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "f%s: i2c read error.\n", + __func__); + } + else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; + */ + +} + +/************************************************************************ +* Name: fts_i2c_write +* Brief: i2c write +* Input: i2c info, write buf, write len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret; + int i = 0; + + mutex_lock(&i2c_rw_access); + + /*client->addr = client->addr & I2C_MASK_FLAG;*/ + + /*ret = i2c_master_send(client, writebuf, writelen);*/ + memcpy(g_dma_buff_va, writebuf, writelen); + + client->addr = client->addr & I2C_MASK_FLAG | I2C_DMA_FLAG; + ret = i2c_master_send(client, (unsigned char *)g_dma_buff_pa, writelen); + if (ret != writelen) + /*dev_err(&client->dev, "###%s i2c write len=%x,buffaddr=%x\n", __func__,ret,*g_dma_buff_pa);*/ + printk("i2c write failed\n"); + client->addr = client->addr & I2C_MASK_FLAG & (~I2C_DMA_FLAG); + + mutex_unlock(&i2c_rw_access); + + return ret; + + /* + int ret; + int i = 0; + + client->addr = client->addr & I2C_MASK_FLAG; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + dev_err(&client->dev, "%s i2c write error.\n", __func__); + return ret; + */ + +} + +/************************************************************************ +* Name: fts_write_reg +* Brief: write register +* Input: i2c info, reg address, reg value +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) +{ + unsigned char buf[2] = { 0 }; + + buf[0] = regaddr; + buf[1] = regvalue; + + return fts_i2c_write(client, buf, sizeof(buf)); +} + +/************************************************************************ +* Name: fts_read_reg +* Brief: read register +* Input: i2c info, reg address, reg value +* Output: get reg value +* Return: fail <0 +***********************************************************************/ +int fts_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) +{ + + return fts_i2c_read(client, ®addr, 1, regvalue, 1); + +} + +/************************************************************************ +* Name: tpd_down +* Brief: down info +* Input: x pos, y pos, id number +* Output: no +* Return: no +***********************************************************************/ +static void tpd_down(int x, int y, int p) +{ + + /*if(x > TPD_RES_X) + { + TPD_DEBUG("warning: IC have sampled wrong value.\n");; + return; + } */ + input_report_key(tpd->dev, BTN_TOUCH, 1); + input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, p); + input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 20); + input_report_abs(tpd->dev, ABS_MT_PRESSURE, 0x3f); + input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); + input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y); + /*printk("tpd:D[%4d %4d %4d] ", x, y, p);*/ + /*track id Start 0*/ + /*input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, p); */ + input_mt_sync(tpd->dev); + if (FACTORY_BOOT == get_boot_mode() || RECOVERY_BOOT == get_boot_mode()) { + tpd_button(x, y, 1); + } + /*if(y > TPD_RES_Y) //virtual key debounce to avoid android ANR issue + { + msleep(50); + printk("D virtual key \n"); + } */ + TPD_EM_PRINT(x, y, x, y, p - 1, 1); + +} + + /************************************************************************ +* Name: tpd_up +* Brief: up info +* Input: x pos, y pos, count +* Output: no +* Return: no +***********************************************************************/ +static void tpd_up(int x, int y, int *count) +{ + + input_report_key(tpd->dev, BTN_TOUCH, 0); + /*printk("U[%4d %4d %4d] ", x, y, 0);*/ + input_mt_sync(tpd->dev); + TPD_EM_PRINT(x, y, x, y, 0, 0); + + if (FACTORY_BOOT == get_boot_mode() || RECOVERY_BOOT == get_boot_mode()) { + tpd_button(x, y, 0); + } + +} + + /************************************************************************ +* Name: tpd_touchinfo +* Brief: touch info +* Input: touch info point, no use +* Output: no +* Return: success nonzero +***********************************************************************/ +static int tpd_touchinfo(struct touch_info *cinfo, struct touch_info *pinfo) +{ + int i = 0; + char data[128] = { 0 }; + u16 high_byte, low_byte, reg; + u8 report_rate = 0; + p_point_num = point_num; + if (tpd_halt) { + TPD_DMESG("tpd_touchinfo return ..\n"); + return false; + } + mutex_lock(&i2c_access); + + reg = 0x00; + fts_i2c_read(fts_i2c_client, ®, 1, data, 64); + mutex_unlock(&i2c_access); + + /*get the number of the touch points */ + + point_num = data[2] & 0x0f; + + for (i = 0; i < point_num; i++) { + cinfo->p[i] = data[3 + 6 * i] >> 6; /*event flag */ + cinfo->id[i] = data[3 + 6 * i + 2] >> 4; /*touch id*/ + /*get the X coordinate, 2 bytes */ + high_byte = data[3 + 6 * i]; + high_byte <<= 8; + high_byte &= 0x0f00; + low_byte = data[3 + 6 * i + 1]; + cinfo->x[i] = high_byte | low_byte; + high_byte = data[3 + 6 * i + 2]; + high_byte <<= 8; + high_byte &= 0x0f00; + low_byte = data[3 + 6 * i + 3]; + cinfo->y[i] = high_byte | low_byte; + } + + /*printk(" tpd cinfo->x[0] = %d, cinfo->y[0] = %d, cinfo->p[0] = %d\n", cinfo->x[0], cinfo->y[0], cinfo->p[0]);*/ + return true; + +}; + + /************************************************************************ +* Name: fts_read_Touchdata +* Brief: report the point information +* Input: event info +* Output: get touch data in pinfo +* Return: success is zero +***********************************************************************/ +static unsigned int buf_count_add; +static unsigned int buf_count_neg; +/*unsigned int buf_count_add1;*/ +/*unsigned int buf_count_neg1;*/ +u8 buf_touch_data[30 * POINT_READ_BUF] = { 0 }; /*0xFF*/ + +static int fts_read_Touchdata(struct ts_event *pinfo) +{ + u8 buf[POINT_READ_BUF] = { 0 }; /*0xFF*/ + int ret = -1; + int i = 0; + u8 pointid = FTS_MAX_ID; + /*u8 pt00f=0;*/ + if (tpd_halt) { + TPD_DMESG("tpd_touchinfo return ..\n"); + return false; + } + + mutex_lock(&i2c_access); + ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, POINT_READ_BUF); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s read touchdata failed.\n", + __func__); + mutex_unlock(&i2c_access); + return ret; + } + mutex_unlock(&i2c_access); + + buf_count_add++; + /*buf_count_add1=buf_count_add;*/ + memcpy(buf_touch_data + (((buf_count_add - 1) % 30) * POINT_READ_BUF), + buf, sizeof(u8) * POINT_READ_BUF); + + return 0; +} + + /************************************************************************ +* Name: fts_report_value +* Brief: report the point information +* Input: event info +* Output: no +* Return: success is zero +***********************************************************************/ +static int fts_report_value(struct ts_event *data) +{ + /*struct ts_event *event = NULL;*/ + int i = 0; + int up_point = 0; + int touchs = 0; + u8 pointid = FTS_MAX_ID; + u8 buf[POINT_READ_BUF] = { 0 }; /*0xFF*/ + /*static u8 last_touchpoint=0; //release all touches in final*/ + + buf_count_neg++; + /*buf_count_neg1=buf_count_neg;*/ + memcpy(buf, + buf_touch_data + (((buf_count_neg - 1) % 30) * POINT_READ_BUF), + sizeof(u8) * POINT_READ_BUF); + + memset(data, 0, sizeof(struct ts_event)); + data->touch_point_num = buf[FT_TOUCH_POINT_NUM] & 0x0F; + + data->touch_point = 0; + /* printk("tpd fts_updateinfo_curr.TPD_MAX_POINTS=%d fts_updateinfo_curr.chihID=%d \n", fts_updateinfo_curr.TPD_MAX_POINTS,fts_updateinfo_curr.CHIP_ID);*/ + for (i = 0; i < fts_updateinfo_curr.TPD_MAX_POINTS; i++) { + pointid = (buf[FTS_TOUCH_ID_POS + FTS_TOUCH_STEP * i]) >> 4; + if (pointid >= FTS_MAX_ID) + break; + else + data->touch_point++; + data->au16_x[i] = + (s16) (buf[FTS_TOUCH_X_H_POS + FTS_TOUCH_STEP * i] & 0x0F) + << 8 | (s16) buf[FTS_TOUCH_X_L_POS + FTS_TOUCH_STEP * i]; + data->au16_y[i] = + (s16) (buf[FTS_TOUCH_Y_H_POS + FTS_TOUCH_STEP * i] & 0x0F) + << 8 | (s16) buf[FTS_TOUCH_Y_L_POS + FTS_TOUCH_STEP * i]; + data->au8_touch_event[i] = + buf[FTS_TOUCH_EVENT_POS + FTS_TOUCH_STEP * i] >> 6; + data->au8_finger_id[i] = + (buf[FTS_TOUCH_ID_POS + FTS_TOUCH_STEP * i]) >> 4; + + data->pressure[i] = (buf[FTS_TOUCH_XY_POS + FTS_TOUCH_STEP * i]); /*cannot constant value*/ + data->area[i] = (buf[FTS_TOUCH_MISC + FTS_TOUCH_STEP * i]) >> 4; + if ((data->au8_touch_event[i] == 0 + || data->au8_touch_event[i] == 2) + && ((data->touch_point_num == 0) + || (data->pressure[i] == 0 && data->area[i] == 0))) + return 1; + /* + if(0==data->pressure[i]) + { + data->pressure[i]=0x08; + } + if(0==data->area[i]) + { + data->area[i]=0x08; + } + */ + /*if ( pinfo->au16_x[i]==0 && pinfo->au16_y[i] ==0)*/ + /* pt00f++;*/ + } + /* + if ( pt00f>0 ) { + for(i=0;itouch_point; i++) { + input_mt_slot(tpd->dev, data->au8_finger_id[i]); + if (data->au8_touch_event[i] == 0 + || data->au8_touch_event[i] == 2) { + input_mt_report_slot_state(tpd->dev, MT_TOOL_FINGER, + true); + input_report_abs(tpd->dev, ABS_MT_PRESSURE, data->pressure[i]); /*0x3f*/ + input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, data->area[i]); /*0x05*/ + input_report_abs(tpd->dev, ABS_MT_POSITION_X, + data->au16_x[i]); + input_report_abs(tpd->dev, ABS_MT_POSITION_Y, + data->au16_y[i]); + touchs |= BIT(data->au8_finger_id[i]); + data->touchs |= BIT(data->au8_finger_id[i]); + /* printk("fts_report_value tpd D x[%d] =%d,y[%d]= %d",i,data->au16_x[i],i,data->au16_y[i]);*/ + } else { + up_point++; + input_mt_report_slot_state(tpd->dev, MT_TOOL_FINGER, + false); + data->touchs &= ~BIT(data->au8_finger_id[i]); + } + + } + if (unlikely(data->touchs ^ touchs)) { + for (i = 0; i < CFG_MAX_TOUCH_POINTS; i++) { + if (BIT(i) & (data->touchs ^ touchs)) { + up_point++; + input_mt_slot(tpd->dev, i); + input_mt_report_slot_state(tpd->dev, + MT_TOOL_FINGER, + false); + } + } + } + data->touchs = touchs; + + /* + if((last_touchpoint>0)&&(event->touch_point_num==0)) release all touches in final + { + for (j = 0; j < CFG_MAX_TOUCH_POINTS; j++) { + input_mt_slot(data->input_dev, j); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, 0); + } + last_touchpoint=0; + } + */ + if (data->touch_point == up_point) + input_report_key(tpd->dev, BTN_TOUCH, 0); + else + input_report_key(tpd->dev, BTN_TOUCH, 1); + /* printk("up_point= %d\n", up_point);*/ + input_sync(tpd->dev); + /*last_touchpoint=event->touch_point_num ;//release all touches in final*/ + return 0; + /*printk("tpd D x =%d,y= %d",event->au16_x[0],event->au16_y[0]);*/ +} + +#ifdef TPD_PROXIMITY + /************************************************************************ +* Name: tpd_read_ps +* Brief: read proximity value +* Input: no +* Output: no +* Return: 0 +***********************************************************************/ +int tpd_read_ps(void) +{ + tpd_proximity_detect; + return 0; +} + + /************************************************************************ +* Name: tpd_get_ps_value +* Brief: get proximity value +* Input: no +* Output: no +* Return: 0 +***********************************************************************/ +static int tpd_get_ps_value(void) +{ + return tpd_proximity_detect; +} + + /************************************************************************ +* Name: tpd_enable_ps +* Brief: enable proximity +* Input: enable or not +* Output: no +* Return: 0 +***********************************************************************/ +static int tpd_enable_ps(int enable) +{ + u8 state; + int ret = -1; + + /*i2c_smbus_read_i2c_block_data(fts_i2c_client, 0xB0, 1, &state);*/ + + ret = fts_read_reg(fts_i2c_client, 0xB0, &state); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + + printk("[proxi_fts]read: 999 0xb0's value is 0x%02X\n", state); + + if (enable) { + state |= 0x01; + tpd_proximity_flag = 1; + TPD_PROXIMITY_DEBUG("[proxi_fts]ps function is on\n"); + } else { + state &= 0x00; + tpd_proximity_flag = 0; + TPD_PROXIMITY_DEBUG("[proxi_fts]ps function is off\n"); + } + + /*ret = i2c_smbus_write_i2c_block_data(fts_i2c_client, 0xB0, 1, &state);*/ + ret = fts_write_reg(fts_i2c_client, 0xB0, state); + if (ret < 0) { + printk("[Focal][Touch] write value fail"); + /*return ret;*/ + } + TPD_PROXIMITY_DEBUG("[proxi_fts]write: 0xB0's value is 0x%02X\n", + state); + return 0; +} + + /************************************************************************ +* Name: tpd_ps_operate +* Brief: operate function for proximity +* Input: point, which operation, buf_in , buf_in len, buf_out , buf_out len, no use +* Output: buf_out +* Return: fail <0 +***********************************************************************/ +int tpd_ps_operate(void *self, uint32_t command, void *buff_in, int size_in, + void *buff_out, int size_out, int *actualout) +{ + int err = 0; + int value; + hwm_sensor_data *sensor_data; + TPD_DEBUG("[proxi_fts]command = 0x%02X\n", command); + + switch (command) { + case SENSOR_DELAY: + if ((buff_in == NULL) || (size_in < sizeof(int))) { + APS_ERR("Set delay parameter error!\n"); + err = -EINVAL; + } + /* Do nothing*/ + break; + case SENSOR_ENABLE: + if ((buff_in == NULL) || (size_in < sizeof(int))) { + APS_ERR("Enable sensor parameter error!\n"); + err = -EINVAL; + } else { + value = *(int *)buff_in; + if (value) { + if ((tpd_enable_ps(1) != 0)) { + APS_ERR("enable ps fail: %d\n", err); + return -1; + } + } else { + if ((tpd_enable_ps(0) != 0)) { + APS_ERR("disable ps fail: %d\n", err); + return -1; + } + } + } + break; + case SENSOR_GET_DATA: + if ((buff_out == NULL) || (size_out < sizeof(hwm_sensor_data))) { + APS_ERR("get sensor data parameter error!\n"); + err = -EINVAL; + } else { + sensor_data = (hwm_sensor_data *) buff_out; + err = tpd_read_ps(); + if (err) { + err = -1; + } else { + sensor_data->values[0] = tpd_get_ps_value(); + TPD_PROXIMITY_DEBUG + ("huang sensor_data->values[0] 1082 = %d\n", + sensor_data->values[0]); + sensor_data->value_divide = 1; + sensor_data->status = + SENSOR_STATUS_ACCURACY_MEDIUM; + } + } + break; + default: + APS_ERR + ("proxmy sensor operate function no this parameter %d!\n", + command); + err = -1; + break; + } + return err; +} +#endif + + /************************************************************************ +* Name: touch_event_handler +* Brief: interrupt event from TP, and read/report data to Android system +* Input: no use +* Output: no +* Return: 0 +***********************************************************************/ +static int set_charger_exist = 0; +extern PMU_ChargerStruct BMT_status; +static int touch_event_handler(void *unused) +{ + struct touch_info cinfo, pinfo; + struct ts_event pevent; + int i = 0; + int ret = 0; + + struct sched_param param = {.sched_priority = RTPM_PRIO_TPD }; + sched_setscheduler(current, SCHED_RR, ¶m); + +#ifdef TPD_PROXIMITY + int err; + hwm_sensor_data sensor_data; + u8 proximity_status; +#endif + u8 state; + do { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + set_current_state(TASK_INTERRUPTIBLE); + wait_event_interruptible(waiter, tpd_flag != 0); + + tpd_flag = 0; + + set_current_state(TASK_RUNNING); + /*printk("tpd touch_event_handler\n");*/ +#if FTS_GESTRUE_EN + /*i2c_smbus_read_i2c_block_data(fts_i2c_client, 0xd0, 1, &state);*/ + ret = fts_read_reg(fts_i2c_client, 0xd0, &state); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + /*printk("tpd fts_read_Gestruedata state=%d\n",state);*/ + if (state == 1) { + fts_read_Gestruedata(); + continue; + } +#endif + if (BMT_status.charger_exist == KAL_TRUE) { + if (0==set_charger_exist) { + ret = fts_write_reg(fts_i2c_client, 0x8B, 1); + if (ret < 0) { + printk("[Focal][Touch] write value fail"); + /*return ret;*/ + } + set_charger_exist = 1; + } + } else { + if (1==set_charger_exist) { + ret = fts_write_reg(fts_i2c_client, 0x8B, 0); + if (ret < 0) { + printk("[Focal][Touch] write value fail"); + /*return ret;*/ + } + set_charger_exist = 0; + } + } + +#ifdef TPD_PROXIMITY + + if (tpd_proximity_flag == 1) { + + /*i2c_smbus_read_i2c_block_data(fts_i2c_client, 0xB0, 1, &state);*/ + + ret = fts_read_reg(fts_i2c_client, 0xB0, &state); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + TPD_PROXIMITY_DEBUG + ("proxi_fts 0xB0 state value is 1131 0x%02X\n", + state); + if (!(state & 0x01)) { + tpd_enable_ps(1); + } + /*i2c_smbus_read_i2c_block_data(fts_i2c_client, 0x01, 1, &proximity_status);*/ + ret = + fts_read_reg(fts_i2c_client, 0x01, + &proximity_status); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + TPD_PROXIMITY_DEBUG + ("proxi_fts 0x01 value is 1139 0x%02X\n", + proximity_status); + if (proximity_status == 0xC0) { + tpd_proximity_detect = 0; + } else if (proximity_status == 0xE0) { + tpd_proximity_detect = 1; + } + + TPD_PROXIMITY_DEBUG("tpd_proximity_detect 1149 = %d\n", + tpd_proximity_detect); + err = tpd_read_ps(); + if (err) { + TPD_PROXIMITY_DMESG + ("proxi_fts read ps data 1156: %d\n", err); + } + sensor_data.values[0] = tpd_get_ps_value(); + sensor_data.value_divide = 1; + sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM; + /*if ((err = hwmsen_get_interrupt_data(ID_PROXIMITY, &sensor_data)))*/ + /*{*/ + /* TPD_PROXIMITY_DMESG(" proxi_5206 call hwmsen_get_interrupt_data failed= %d\n", err); */ + /*}*/ + } +#endif + +#ifdef MT_PROTOCOL_B + { + ret = fts_read_Touchdata(&pevent); + /*if (ret == 0)*/ + fts_report_value(&pevent); + } +#else + { + if (tpd_touchinfo(&cinfo, &pinfo)) { + /*printk("tpd point_num = %d\n", point_num);*/ + TPD_DEBUG_SET_TIME; + if (point_num > 0) { + /*only support 3 point*/ + for (i = 0; i < point_num; i++) { + tpd_down(cinfo.x[i], cinfo.y[i], + cinfo.id[i]); + } + input_sync(tpd->dev); + } else { + tpd_up(cinfo.x[0], cinfo.y[0], + &cinfo.id[0]); + /*TPD_DEBUG("release --->\n"); */ + input_sync(tpd->dev); + } + } + } +#endif + } while (!kthread_should_stop()); + return 0; +} + + /************************************************************************ +* Name: fts_reset_tp +* Brief: reset TP +* Input: pull low or high +* Output: no +* Return: 0 +***********************************************************************/ +void fts_reset_tp(int HighOrLow) +{ + + if (HighOrLow) { + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + } else { + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); + } + +} + + /************************************************************************ +* Name: tpd_detect +* Brief: copy device name +* Input: i2c info, board info +* Output: no +* Return: 0 +***********************************************************************/ +static int tpd_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + strcpy(info->type, TPD_DEVICE); + return 0; +} + +/************************************************************************ +* Name: tpd_eint_interrupt_handler +* Brief: deal with the interrupt event +* Input: no +* Output: no +* Return: no +***********************************************************************/ +static void tpd_eint_interrupt_handler(void) +{ + /* printk("TPD interrupt has been triggered\n");*/ + TPD_DEBUG_PRINT_INT; + tpd_flag = 1; +#if GTP_ESD_PROTECT + count_irq++; +#endif + wake_up_interruptible(&waiter); +} + +/************************************************************************ +* Name: fts_init_gpio_hw +* Brief: initial gpio +* Input: no +* Output: no +* Return: 0 +***********************************************************************/ +static int fts_init_gpio_hw(void) +{ + + int ret = 0; + int i = 0; + + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + + return ret; +} + +/************************************************************************ +* Name: tpd_probe +* Brief: driver entrance function for initial/power on/create channel +* Input: i2c info, device id +* Output: no +* Return: 0 +***********************************************************************/ +static int __devinit tpd_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int retval = TPD_OK; + char data; + u8 report_rate = 0; + int err=0; + int reset_count = 0; + unsigned char uc_reg_value; + unsigned char uc_reg_addr; +#ifdef TPD_PROXIMITY + /*int err;*/ + struct hwmsen_object obj_ps; +#endif + + reset_proc: + fts_i2c_client = client; + fts_input_dev = tpd->dev; +#ifdef TPD_CLOSE_POWER_IN_SLEEP + +#else + + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); + msleep(10); + +#endif + + /*power on, need confirm with SA*/ +#ifdef TPD_POWER_SOURCE_CUSTOM + hwPowerOn(TPD_POWER_SOURCE_CUSTOM, VOL_2800, "TP"); +#else + hwPowerOn(MT65XX_POWER_LDO_VGP2, VOL_2800, "TP"); +#endif +#ifdef TPD_POWER_SOURCE_1800 + hwPowerOn(TPD_POWER_SOURCE_1800, VOL_1800, "TP"); +#endif + +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerDown(TPD_POWER_SOURCE, "TP"); + hwPowerOn(TPD_POWER_SOURCE, VOL_3300, "TP"); + msleep(100); +#else + + msleep(10); + TPD_DMESG(" fts reset\n"); + printk(" fts reset\n"); + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); +#endif + + mt_set_gpio_mode(GPIO_CTP_EINT_PIN, GPIO_CTP_EINT_PIN_M_EINT); + mt_set_gpio_dir(GPIO_CTP_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(GPIO_CTP_EINT_PIN, GPIO_PULL_UP); + + msleep(150); + + /*check if tp is connectted, if not return -1*/ + err = i2c_smbus_read_i2c_block_data(fts_i2c_client, 0x00, 1, &data); + TPD_DMESG("gao_i2c:err %d,data:%d\n", err,data); + if(err< 0 || data!=0) { /* reg0 data running state is 0; other state is not 0*/ +#ifdef TPD_POWER_SOURCE_CUSTOM + hwPowerDown(TPD_POWER_SOURCE_CUSTOM, "TP"); +#else + hwPowerDown(MT65XX_POWER_LDO_VGP2, "TP"); +#endif + TPD_DMESG("I2C transfer error, line: %d\n", __LINE__); + if ( ++reset_count < TPD_MAX_RESET_COUNT ) { + goto reset_proc; + } + return -1; + } + + msg_dma_alloct(); + + fts_init_gpio_hw(); + + uc_reg_addr = FTS_REG_POINT_RATE; + fts_i2c_write(fts_i2c_client, &uc_reg_addr, 1); + fts_i2c_read(fts_i2c_client, &uc_reg_addr, 0, &uc_reg_value, 1); + printk("mtk_tpd[FTS] report rate is %dHz.\n", uc_reg_value * 10); + + uc_reg_addr = FTS_REG_FW_VER; + fts_i2c_write(fts_i2c_client, &uc_reg_addr, 1); + fts_i2c_read(fts_i2c_client, &uc_reg_addr, 0, &uc_reg_value, 1); + printk("mtk_tpd[FTS] Firmware version = 0x%x\n", uc_reg_value); + + uc_reg_addr = FTS_REG_VENDOR_ID; + fts_i2c_write(fts_i2c_client, &uc_reg_addr, 1); + fts_i2c_read(fts_i2c_client, &uc_reg_addr, 0, &uc_reg_value, 1); + ft_vendor_id = uc_reg_value; + printk("mtk_tpd[FTS] Vendor id is %x.\n", uc_reg_value); + + uc_reg_addr = FTS_REG_CHIP_ID; + fts_i2c_write(fts_i2c_client, &uc_reg_addr, 1); + retval = + fts_i2c_read(fts_i2c_client, &uc_reg_addr, 0, &uc_reg_value, 1); + printk("mtk_tpd[FTS] chip id is 0x%x.\n", uc_reg_value); + if (retval < 0) { + printk + ("mtk_tpd[FTS] Read I2C error! driver NOt load!! CTP chip id is %d.\n", + uc_reg_value); + return 0; + } + + tpd_load_status = 1; + /* + mt65xx_eint_set_sens(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_SENSITIVE); + mt65xx_eint_set_hw_debounce(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN); + mt65xx_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN, CUST_EINT_TOUCH_PANEL_POLARITY, tpd_eint_interrupt_handler, 1); + mt65xx_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + */ + mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, EINTF_TRIGGER_FALLING, + tpd_eint_interrupt_handler, 1); + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + +#ifdef VELOCITY_CUSTOM_fts + err = misc_register(&tpd_misc_device); + if (err) { + printk("mtk_tpd: tpd_misc_device register failed\n"); + + } +#endif + + thread = kthread_run(touch_event_handler, 0, TPD_DEVICE); + if (IS_ERR(thread)) { + retval = PTR_ERR(thread); + TPD_DMESG(TPD_DEVICE " failed to create kernel thread: %d\n", + retval); + } + +#ifdef SYSFS_DEBUG + fts_create_sysfs(fts_i2c_client); +#endif + HidI2c_To_StdI2c(fts_i2c_client); + fts_get_upgrade_array(); +#ifdef FTS_CTL_IIC + if (fts_rw_iic_drv_init(fts_i2c_client) < 0) + dev_err(&client->dev, + "%s:[FTS] create fts control iic driver failed\n", + __func__); +#endif + +#ifdef FTS_APK_DEBUG + fts_create_apk_debug_channel(fts_i2c_client); +#endif + +#ifdef TPD_AUTO_UPGRADE + printk + ("********************Enter CTP Auto Upgrade********************\n"); + fts_ctpm_auto_upgrade(fts_i2c_client); +#endif + +#ifdef TPD_PROXIMITY + { + obj_ps.polling = 1; /*0--interrupt mode;1--polling mode;*/ + obj_ps.sensor_operate = tpd_ps_operate; + err = hwmsen_attach(ID_PROXIMITY, &obj_ps); + if (err) { + TPD_DEBUG("hwmsen attach fail, return:%d.", err); + } + } +#endif +#if GTP_ESD_PROTECT + INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); + gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, + TPD_ESD_CHECK_CIRCLE); +#endif + +#if FTS_GESTRUE_EN + fts_Gesture_init(tpd->dev); +#endif +#ifdef MT_PROTOCOL_B +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + input_mt_init_slots(tpd->dev, MT_MAX_TOUCH_POINTS); +#endif + input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(tpd->dev, ABS_MT_POSITION_X, 0, TPD_RES_X, 0, 0); + input_set_abs_params(tpd->dev, ABS_MT_POSITION_Y, 0, TPD_RES_Y, 0, 0); + input_set_abs_params(tpd->dev, ABS_MT_PRESSURE, 0, 255, 0, 0); +#endif + + printk("fts Touch Panel Device Probe %s\n", + (retval < TPD_OK) ? "FAIL" : "PASS"); + return 0; + +} + +/************************************************************************ +* Name: tpd_remove +* Brief: remove driver/channel +* Input: i2c info +* Output: no +* Return: 0 +***********************************************************************/ +static int __devexit tpd_remove(struct i2c_client *client) +{ + msg_dma_release(); + +#ifdef FTS_CTL_IIC + fts_rw_iic_drv_exit(); +#endif +#ifdef SYSFS_DEBUG + fts_remove_sysfs(client); +#endif +#if GTP_ESD_PROTECT + destroy_workqueue(gtp_esd_check_workqueue); +#endif + +#ifdef FTS_APK_DEBUG + fts_release_apk_debug_channel(); +#endif + + TPD_DEBUG("TPD removed\n"); + + return 0; +} + +#if GTP_ESD_PROTECT +/************************************************************************ +* Name: force_reset_guitar +* Brief: reset +* Input: no +* Output: no +* Return: 0 +***********************************************************************/ +static void force_reset_guitar(void) +{ + s32 i; + s32 ret; + + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); + msleep(10); + TPD_DMESG("force_reset_guitar\n"); + + hwPowerDown(MT6323_POWER_LDO_VGP1, "TP"); + msleep(200); + hwPowerOn(MT6323_POWER_LDO_VGP1, VOL_2800, "TP"); + msleep(5); + + msleep(10); + TPD_DMESG(" fts ic reset\n"); + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + + mt_set_gpio_mode(GPIO_CTP_EINT_PIN, GPIO_CTP_EINT_PIN_M_EINT); + mt_set_gpio_dir(GPIO_CTP_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(GPIO_CTP_EINT_PIN, GPIO_PULL_UP); + + msleep(300); + +#ifdef TPD_PROXIMITY + if (FT_PROXIMITY_ENABLE == tpd_proximity_flag) { + tpd_enable_ps(FT_PROXIMITY_ENABLE); + } +#endif +} + +extern int apk_debug_flag; +#define A3_REG_VALUE 0x54 +#define RESET_91_REGVALUE_SAMECOUNT 5 +static u8 g_old_91_Reg_Value = 0x00; +static u8 g_first_read_91 = 0x01; +static u8 g_91value_same_count; +/************************************************************************ +* Name: gtp_esd_check_func +* Brief: esd check function +* Input: struct work_struct +* Output: no +* Return: 0 +***********************************************************************/ +static void gtp_esd_check_func(struct work_struct *work) +{ + int i; + int ret = -1; + u8 data, data_old; + u8 flag_error = 0; + int reset_flag = 0; + u8 check_91_reg_flag = 0; + + if (tpd_halt) { + return; + } + if (apk_debug_flag) { + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, + esd_check_circle); + return; + } + + run_check_91_register = 0; + for (i = 0; i < 3; i++) { + /*ret = fts_i2c_smbus_read_i2c_block_data(i2c_client, 0xA3, 1, &data);*/ + ret = fts_read_reg(fts_i2c_client, 0xA3, &data); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + if (ret == 1 && A3_REG_VALUE == data) { + break; + } + } + + if (i >= 3) { + force_reset_guitar(); + printk + ("focal--tpd reset. i >= 3 ret = %d A3_Reg_Value = 0x%02x\n ", + ret, data); + reset_flag = 1; + goto FOCAL_RESET_A3_REGISTER; + } + /*esd check for count*/ + /*ret = fts_i2c_smbus_read_i2c_block_data(i2c_client, 0x8F, 1, &data);*/ + ret = fts_read_reg(fts_i2c_client, 0x8F, &data); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + printk("0x8F:%d, count_irq is %d\n", data, count_irq); + + flag_error = 0; + if ((count_irq - data) > 10) { + if ((data + 200) > (count_irq + 10)) { + flag_error = 1; + } + } + + if ((data - count_irq) > 10) { + flag_error = 1; + } + + if (1 == flag_error) { + printk + ("focal--tpd reset.1 == flag_error...data=%d count_irq\n ", + data, count_irq); + force_reset_guitar(); + reset_flag = 1; + goto FOCAL_RESET_INT; + } + + run_check_91_register = 1; + /*ret = fts_i2c_smbus_read_i2c_block_data(i2c_client, 0x91, 1, &data);*/ + ret = fts_read_reg(fts_i2c_client, 0x91, &data); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + printk + ("focal---------91 register value = 0x%02x old value = 0x%02x\n", + data, g_old_91_Reg_Value); + if (0x01 == g_first_read_91) { + g_old_91_Reg_Value = data; + g_first_read_91 = 0x00; + } else { + if (g_old_91_Reg_Value == data) { + g_91value_same_count++; + printk + ("focal 91 value ==============, g_91value_same_count=%d\n", + g_91value_same_count); + if (RESET_91_REGVALUE_SAMECOUNT == g_91value_same_count) { + force_reset_guitar(); + printk + ("focal--tpd reset. g_91value_same_count = 5\n"); + g_91value_same_count = 0; + reset_flag = 1; + } + /*run_check_91_register = 1;*/ + esd_check_circle = TPD_ESD_CHECK_CIRCLE / 2; + g_old_91_Reg_Value = data; + } else { + g_old_91_Reg_Value = data; + g_91value_same_count = 0; + /*run_check_91_register = 0;*/ + esd_check_circle = TPD_ESD_CHECK_CIRCLE; + } + } + FOCAL_RESET_INT: + FOCAL_RESET_A3_REGISTER: + count_irq = 0; + data = 0; + /*fts_i2c_smbus_write_i2c_block_data(i2c_client, 0x8F, 1, &data);*/ + ret = fts_write_reg(fts_i2c_client, 0x8F, data); + if (ret < 0) { + printk("[Focal][Touch] write value fail"); + /*return ret;*/ + } + if (0 == run_check_91_register) { + g_91value_same_count = 0; + } +#ifdef TPD_PROXIMITY + if ((1 == reset_flag) && (FT_PROXIMITY_ENABLE == tpd_proximity_flag)) { + if ((tpd_enable_ps(FT_PROXIMITY_ENABLE) != 0)) { + APS_ERR("enable ps fail\n"); + return -1; + } + } +#endif + /*end esd check for count*/ + + if (!tpd_halt) { + /*queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, TPD_ESD_CHECK_CIRCLE);*/ + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, + esd_check_circle); + } + + return; +} +#endif + + /************************************************************************ +* Name: tpd_local_init +* Brief: add driver info +* Input: no +* Output: no +* Return: fail <0 +***********************************************************************/ +static int tpd_local_init(void) +{ + TPD_DMESG("Focaltech fts I2C Touchscreen Driver (Built %s @ %s)\n", + __DATE__, __TIME__); + if (i2c_add_driver(&tpd_i2c_driver) != 0) { + TPD_DMESG("fts unable to add i2c driver.\n"); + return -1; + } + if (tpd_load_status == 0) { + TPD_DMESG("fts add error touch panel driver.\n"); + i2c_del_driver(&tpd_i2c_driver); + return -1; + } + /*TINNO_TOUCH_TRACK_IDS <--- finger number*/ + /*TINNO_TOUCH_TRACK_IDS 5*/ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 8, 0)) + /*for linux 3.8*/ + input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, 0, + (TPD_MAX_POINTS_5 - 1), 0, 0); +#endif + +#ifdef TPD_HAVE_BUTTON + /* initialize tpd button data*/ + tpd_button_setting(TPD_KEY_COUNT, tpd_keys_local, tpd_keys_dim_local); +#endif + +#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) + TPD_DO_WARP = 1; + memcpy(tpd_wb_start, tpd_wb_start_local, TPD_WARP_CNT * 4); + memcpy(tpd_wb_end, tpd_wb_start_local, TPD_WARP_CNT * 4); +#endif + +#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) + memcpy(tpd_calmat, tpd_def_calmat_local, 8 * 4); + memcpy(tpd_def_calmat, tpd_def_calmat_local, 8 * 4); +#endif + TPD_DMESG("end %s, %d\n", __FUNCTION__, __LINE__); + tpd_type_cap = 1; + return 0; +} + + /************************************************************************ +* Name: tpd_resume +* Brief: system wake up +* Input: no use +* Output: no +* Return: no +***********************************************************************/ +static void tpd_resume(struct early_suspend *h) +{ + int i = 0, ret = 0; + + TPD_DMESG("TPD wake up\n"); + buf_addr[0] = 0xC0; + buf_addr[1] = 0x8B; + + for (i = 0; i < 2; i++) { + ret = fts_write_reg(fts_i2c_client, buf_addr[i], buf_value[i]); + if (ret < 0) { + printk("[Focal][Touch] write value fail"); + /*return ret;*/ + } + } + +#ifdef TPD_PROXIMITY + if (tpd_proximity_flag == 1) { + if (tpd_proximity_flag_one == 1) { + tpd_proximity_flag_one = 0; + TPD_DMESG(TPD_DEVICE " tpd_proximity_flag_one \n"); + return; + } + } +#endif + +#if FTS_GESTRUE_EN + fts_write_reg(fts_i2c_client, 0xD0, 0x00); +#endif +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerOn(TPD_POWER_SOURCE, VOL_3300, "TP"); +#else + + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); + msleep(1); + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + +#endif + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + msleep(30); + tpd_halt = 0; + +#if GTP_ESD_PROTECT + count_irq = 0; + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, + TPD_ESD_CHECK_CIRCLE); +#endif + + TPD_DMESG("TPD wake up done\n"); + +} + + /************************************************************************ +* Name: tpd_suspend +* Brief: system sleep +* Input: no use +* Output: no +* Return: no +***********************************************************************/ +static void tpd_suspend(struct early_suspend *h) +{ + static char data = 0x3; + int i = 0, ret = 0; + buf_addr[0] = 0xC0; + buf_addr[1] = 0x8B; + + for (i = 0; i < 2; i++) { + ret = + fts_read_reg(fts_i2c_client, buf_addr[i], (buf_value + i)); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + /*return ret;*/ + } + } + + TPD_DMESG("TPD enter sleep\n"); +#ifdef TPD_PROXIMITY + if (tpd_proximity_flag == 1) { + tpd_proximity_flag_one = 1; + return; + } +#endif + +#if FTS_GESTRUE_EN + fts_write_reg(fts_i2c_client, 0xd0, 0x01); + if (fts_updateinfo_curr.CHIP_ID == 0x54 + || fts_updateinfo_curr.CHIP_ID == 0x58) { + fts_write_reg(fts_i2c_client, 0xd1, 0xff); + fts_write_reg(fts_i2c_client, 0xd2, 0xff); + fts_write_reg(fts_i2c_client, 0xd5, 0xff); + fts_write_reg(fts_i2c_client, 0xd6, 0xff); + fts_write_reg(fts_i2c_client, 0xd7, 0xff); + fts_write_reg(fts_i2c_client, 0xd8, 0xff); + } + return; +#endif +#if GTP_ESD_PROTECT + cancel_delayed_work_sync(>p_esd_check_work); +#endif + tpd_halt = 1; + + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + mutex_lock(&i2c_access); +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerDown(TPD_POWER_SOURCE, "TP"); +#else + if (1) {/*((fts_updateinfo_curr.CHIP_ID == 0x59)) {*/ + /*i2c_smbus_write_i2c_block_data(fts_i2c_client, 0xA5, 1, &data); //TP enter sleep mode*/ + ret = fts_write_reg(fts_i2c_client, 0xA5, data); + if (ret < 0) { + printk("[Focal][Touch] write value fail"); + /*return ret;*/ + } + } else { + data = 0x02; + /*i2c_smbus_write_i2c_block_data(fts_i2c_client, 0xA5, 1, &data); //TP enter sleep mode*/ + ret = fts_write_reg(fts_i2c_client, 0xA5, data); + if (ret < 0) { + printk("[Focal][Touch] write value fail"); + /*return ret;*/ + } + } +#endif + set_charger_exist = 0; + mutex_unlock(&i2c_access); + + /*disable_irq_nosync(ts->pdata->intr_gpio);*/ + /**/ + + /*if ((fts_updateinfo_curr.CHIP_ID==0x59))*/ + /*fts_write_reg(ts->client,0xa5,0x02);*/ + /*else*/ + /*fts_write_reg(ts->client,0xa5,0x03); */ + /*msleep(10);*/ + /*release add touches */ + + for (i = 0; i < CFG_MAX_TOUCH_POINTS; i++) { + input_mt_slot(fts_input_dev, i); + input_mt_report_slot_state(fts_input_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(fts_input_dev, false); + input_sync(fts_input_dev); + + TPD_DMESG("TPD enter sleep done\n"); + +} + +static struct tpd_driver_t tpd_device_driver = { + .tpd_device_name = "fts", + .tpd_local_init = tpd_local_init, + .suspend = tpd_suspend, + .resume = tpd_resume, + +#ifdef TPD_HAVE_BUTTON + .tpd_have_button = 1, +#else + .tpd_have_button = 0, +#endif + +}; + + /************************************************************************ +* Name: tpd_suspend +* Brief: called when loaded into kernel +* Input: no +* Output: no +* Return: 0 +***********************************************************************/ +static int __init tpd_driver_init(void) +{ + printk("MediaTek fts touch panel driver init\n"); + i2c_register_board_info(2, &fts_i2c_tpd, 1); + if (tpd_driver_add(&tpd_device_driver) < 0) + TPD_DMESG("add fts driver failed\n"); + return 0; +} + +/************************************************************************ +* Name: tpd_driver_exit +* Brief: should never be called +* Input: no +* Output: no +* Return: 0 +***********************************************************************/ +static void __exit tpd_driver_exit(void) +{ + TPD_DMESG("MediaTek fts touch panel driver exit\n"); + /*input_unregister_device(tpd->dev);*/ + tpd_driver_remove(&tpd_device_driver); +} + +module_init(tpd_driver_init); +module_exit(tpd_driver_exit); diff --git a/arch/arm/mach-mt8127/ford/touchpanel/focaltech_core.h b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_core.h new file mode 100644 index 00000000000..075a5f27c7b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_core.h @@ -0,0 +1,350 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2015, Focaltech Ltd. All rights reserved. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __LINUX_FTXXXX_H__ +#define __LINUX_FTXXXX_H__ + /******************************************************************************* +* +* File Name: Ftxxxx_ts.h +* +* Author: Xu YongFeng +* +* Created: 2015-01-29 +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ + +#include "tpd.h" +/*#include "tpd_custom_fts.h"*/ +#include "cust_gpio_usage.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +/*#include <../fs/proc/internal.h>*/ +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ + +/**********************Custom define begin**********************************************/ + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 8, 0)) +#if defined(MODULE) || defined(CONFIG_HOTPLUG) +#define __devexit_p(x) x +#else +#define __devexit_p(x) NULL +#endif +/* Used for HOTPLUG*/ +#define __devinit __section(.devinit.text) __cold notrace +#define __devinitdata __section(.devinit.data) +/*#define __devinitconst __section(.devinit.rodata)*/ +#define __devexit __section(.devexit.text) __exitused __cold notrace +#define __devexitdata __section(.devexit.data) +#define __devexitconst __section(.devexit.rodata) +#endif + +#define TPD_POWER_SOURCE_CUSTOM MT6323_POWER_LDO_VGP2 +#define IIC_PORT 0 /*MT6572: 1 MT6589:0 , Based on the I2C index you choose for TPM*/ +/*#define TPD_HAVE_BUTTON */ /*// if have virtual key,need define the MACRO*/ +#define TPD_BUTTON_HEIGH (40) +#define TPD_KEY_COUNT 3 +#define TPD_KEYS { KEY_MENU, KEY_HOMEPAGE, KEY_BACK} +#define TPD_KEYS_DIM { {80, 900, 20, TPD_BUTTON_HEIGH}, {240, 900, 20, TPD_BUTTON_HEIGH}, {400, 900, 20, TPD_BUTTON_HEIGH} } + +/*********************Custom Define end*************************************************/ +/*#define MT_PROTOCOL_B*/ +#define TPD_NAME "FTS" +/* Pre-defined definition */ +#define TPD_TYPE_CAPACITIVE +#define TPD_TYPE_RESISTIVE +#define TPD_POWER_SOURCE +#define TPD_I2C_NUMBER 2 +#define TPD_WAKEUP_TRIAL 60 +#define TPD_WAKEUP_DELAY 100 +#define TPD_VELOCITY_CUSTOM_X 15 +#define TPD_VELOCITY_CUSTOM_Y 20 + +#define CFG_MAX_TOUCH_POINTS 5 +#define MT_MAX_TOUCH_POINTS 10 +#define FTS_MAX_ID 0x0F +#define FTS_TOUCH_STEP 6 +#define FTS_FACE_DETECT_POS 1 +#define FTS_TOUCH_X_H_POS 3 +#define FTS_TOUCH_X_L_POS 4 +#define FTS_TOUCH_Y_H_POS 5 +#define FTS_TOUCH_Y_L_POS 6 +#define FTS_TOUCH_EVENT_POS 3 +#define FTS_TOUCH_ID_POS 5 +#define FT_TOUCH_POINT_NUM 2 +#define FTS_TOUCH_XY_POS 7 +#define FTS_TOUCH_MISC 8 +#define POINT_READ_BUF (3 + FTS_TOUCH_STEP * CFG_MAX_TOUCH_POINTS) + +#define FT_FW_NAME_MAX_LEN 50 +#define TPD_DELAY (2*HZ/100) +#define TPD_RES_X 720 +#define TPD_RES_Y 1280 +#define TPD_CALIBRATION_MATRIX {962, 0, 0, 0, 1600, 0, 0, 0}; + +#define TPV_ID 0xf2 +#define OFILM_ID 0x51 + + +/*#define TPD_HAVE_CALIBRATION +#define TPD_HAVE_TREMBLE_ELIMINATION +#define TPD_CLOSE_POWER_IN_SLEEP*/ +/******************************************************************************/ +/*Chip Device Type*/ +#define IC_FT5X06 0 /*x=2,3,4 */ +#define IC_FT5606 1 /*ft5506/FT5606/FT5816 */ +#define IC_FT5316 2 /*ft5x16 */ +#define IC_FT6208 3 /*ft6208 */ +#define IC_FT6x06 4 /*ft6206/FT6306 */ +#define IC_FT5x06i 5 /*ft5306i */ +#define IC_FT5x36 6 /*ft5336/ft5436/FT5436i */ + +/*register address*/ +#define FTS_REG_CHIP_ID 0xA3 /*chip ID*/ +#define FTS_REG_FW_VER 0xA6 /*FW version*/ +#define FTS_REG_VENDOR_ID 0xA8 /*TP vendor ID*/ +#define FTS_REG_POINT_RATE 0x88 /*report rate*/ + +#define TPD_MAX_POINTS_2 2 +#define TPD_MAX_POINTS_5 5 +#define TPD_MAXPOINTS_10 10 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 + +#define FTS_PACKET_LENGTH 128 +#define FTS_DRV_VERSION "drv: MTK_2.3_20150122 \n" + +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_ONETIME 62 +#define FTS_GESTRUE_POINTS_HEADER 8 +#define FTS_GESTURE_OUTPUT_ADRESS 0xD3 +#define FTS_GESTURE_OUTPUT_UNIT_LENGTH 4 + +#define KEY_GESTURE_U KEY_U +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_L KEY_L +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_Z KEY_Z + +#define GESTURE_LEFT 0x20 +#define GESTURE_RIGHT 0x21 +#define GESTURE_UP 0x22 +#define GESTURE_DOWN 0x23 +#define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_O 0x30 +#define GESTURE_W 0x31 +#define GESTURE_M 0x32 +#define GESTURE_E 0x33 +#define GESTURE_L 0x44 +#define GESTURE_S 0x46 +#define GESTURE_V 0x54 +#define GESTURE_Z 0x41 +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ +/* IC info */ +struct fts_Upgrade_Info { + u8 CHIP_ID; + u8 TPD_MAX_POINTS; + u8 AUTO_CLB; + u16 delay_aa; /*delay of write FT_UPGRADE_AA */ + u16 delay_55; /*delay of write FT_UPGRADE_55 */ + u8 upgrade_id_1; /*upgrade id 1 */ + u8 upgrade_id_2; /*upgrade id 2 */ + u16 delay_readid; /*delay of read id */ + u16 delay_earse_flash; /*delay of earse flash */ +}; + +/*touch event info*/ +struct ts_event { + u16 au16_x[CFG_MAX_TOUCH_POINTS]; /*x coordinate */ + u16 au16_y[CFG_MAX_TOUCH_POINTS]; /*y coordinate */ + u8 au8_touch_event[CFG_MAX_TOUCH_POINTS]; /*touch event: 0 -- down; 1-- up; 2 -- contact */ + u8 au8_finger_id[CFG_MAX_TOUCH_POINTS]; /*touch ID */ + u16 pressure[CFG_MAX_TOUCH_POINTS]; + u16 area[CFG_MAX_TOUCH_POINTS]; + u8 touch_point; + int touchs; + u8 touch_point_num; +}; +struct fts_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct ts_event event; + const struct ftxxxx_ts_platform_data *pdata; + struct work_struct touch_event_work; + struct workqueue_struct *ts_workqueue; + struct regulator *vdd; + struct regulator *vcc_i2c; + char fw_name[FT_FW_NAME_MAX_LEN]; + bool loading_fw; + u8 family_id; + struct dentry *dir; + u16 addr; + bool suspended; + char *ts_info; + u8 *tch_data; + u32 tch_data_len; + u8 fw_ver[3]; + u8 fw_vendor_id; +#if defined(CONFIG_FB) + struct notifier_block fb_notif; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif +}; +/******************************************************************************* +* Static variables +*******************************************************************************/ + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +/*Function Switchs: define to open, comment to close*/ +#define FTS_GESTRUE_EN 0 +#define FTS_APK_DEBUG +#define MTK_EN 1 +/*#define CONFIG_TOUCHPANEL_PROXIMITY_SENSOR*/ + +extern struct i2c_client *fts_i2c_client; +extern struct input_dev *fts_input_dev; +extern struct tpd_device *tpd; +/*Getstre functions*/ + +extern struct fts_Upgrade_Info fts_updateinfo_curr; +int fts_rw_iic_drv_init(struct i2c_client *client); +void fts_rw_iic_drv_exit(void); +void fts_get_upgrade_array(void); +#if FTS_GESTRUE_EN +extern int fts_Gesture_init(struct input_dev *input_dev); +extern int fts_read_Gestruedata(void); +#endif +extern int fts_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue); +extern int fts_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue); +extern int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, + char *readbuf, int readlen); +extern int fts_i2c_write(struct i2c_client *client, char *writebuf, + int writelen); +extern int HidI2c_To_StdI2c(struct i2c_client *client); +extern int fts_ctpm_fw_upgrade_with_app_file(struct i2c_client *client, + char *firmware_name); +extern int fts_ctpm_auto_clb(struct i2c_client *client); +extern int fts_ctpm_fw_upgrade_with_i_file(struct i2c_client *client, u8 vendor_id); +extern int fts_ctpm_get_i_file_ver(u8 vendor_id); +extern int fts_remove_sysfs(struct i2c_client *client); +extern void fts_release_apk_debug_channel(void); +extern int fts_ctpm_auto_upgrade(struct i2c_client *client); + +extern void fts_reset_tp(int HighOrLow); +extern int fts_create_sysfs(struct i2c_client *client); +/*Apk and ADB functions*/ +extern int fts_create_apk_debug_channel(struct i2c_client *client); +/* +static DEFINE_MUTEX(i2c_rw_access); + +//upgrade functions +extern void ftxxxx_update_fw_vendor_id(struct ftxxxx_ts_data *data); +extern void ftxxxx_update_fw_ver(struct ftxxxx_ts_data *data); +extern void focaltech_get_upgrade_array(void); +extern int ftxxxx_fw_upgrade(struct device *dev, bool force); + +//Base functions +extern int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +extern int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +extern int ftxxxx_read_reg(struct i2c_client *client, u8 addr, u8 *val); +extern int ftxxxx_write_reg(struct i2c_client *client, u8 addr, const u8 val); + +//Power functions +extern int ftxxxx_ts_suspend(struct device *dev); +extern int ftxxxx_ts_resume(struct device *dev); + +*/ + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ +/* +#define FTS_DBG +#ifdef FTS_DBG +#define FTS_DBG(fmt, args...) printk("[FTS]" fmt, ## args) +#else +#define FTS_DBG(fmt, args...) do{}while(0) +#endif +*/ +#define FTS_DBG +#ifdef FTS_DBG +#define FTS_DBG(fmt, args...) printk("[FTS]" fmt, ## args) +#else +#define FTS_DBG(fmt, args...) do { } while (0) +#endif +#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/focaltech_ctl.c b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_ctl.c new file mode 100644 index 00000000000..55c6cedfbea --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_ctl.c @@ -0,0 +1,382 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2015, Focaltech Ltd. All rights reserved. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + /************************************************************************ +* +* File Name: focaltech_ctl.c +* +* Author: Xu YongFeng +* +* Created: 2015-01-01 +* +* Modify by mshl on 2015-03-20 +* +* Abstract: Function for old APK tool +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ +#include "focaltech_core.h" + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +/*Ô¤ÉèµÄft_rw_iic_drvµÄÖ÷É豸ºÅ*/ +#define FTS_RW_IIC_DRV "ft_rw_iic_drv" +#define FTS_RW_IIC_DRV_MAJOR 210 +#define FTS_I2C_RDWR_MAX_QUEUE 36 +#define FTS_I2C_SLAVEADDR 11 +#define FTS_I2C_RW 12 +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ +typedef struct fts_rw_i2c { + u8 *buf; + u8 flag; /*0-write 1-read */ + __u16 length; /*the length of data*/ +} *pfts_rw_i2c; + +typedef struct fts_rw_i2c_queue { + struct fts_rw_i2c __user *i2c_queue; + int queuenum; +} *pfts_rw_i2c_queue; + +struct fts_rw_i2c_dev { + struct cdev cdev; + struct mutex fts_rw_i2c_mutex; + struct i2c_client *client; +}; + +/******************************************************************************* +* Static variables +*******************************************************************************/ +static int fts_rw_iic_drv_major = FTS_RW_IIC_DRV_MAJOR; +static struct class *fts_class; + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +struct fts_rw_i2c_dev *fts_rw_i2c_dev_tt; + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + +/************************************************************************ +* Name: fts_rw_iic_drv_myread +* Brief: i2c read +* Input: i2c info, data, length +* Output: get data in buf +* Return: fail <0 +***********************************************************************/ +static int fts_rw_iic_drv_myread(struct i2c_client *client, u8 *buf, + int length) +{ + int ret = 0; + ret = fts_i2c_read(client, NULL, 0, buf, length); + + if (ret < 0) { + dev_err(&client->dev, "%s:IIC Read failed\n", __func__); + } + return ret; +} + +/************************************************************************ +* Name: fts_rw_iic_drv_mywrite +* Brief: i2c write +* Input: i2c info, data, length +* Output: no +* Return: fail <0 +***********************************************************************/ +static int fts_rw_iic_drv_mywrite(struct i2c_client *client, u8 *buf, + int length) +{ + int ret = 0; + ret = fts_i2c_write(client, buf, length); + if (ret < 0) { + dev_err(&client->dev, "%s:IIC Write failed\n", __func__); + } + return ret; +} + +/************************************************************************ +* Name: fts_rw_iic_drv_RDWR +* Brief: get package to i2c read/write +* Input: i2c info, package +* Output: put data in i2c_rw_msg.buf +* Return: fail <0 +***********************************************************************/ +static int fts_rw_iic_drv_RDWR(struct i2c_client *client, unsigned long arg) +{ + struct fts_rw_i2c_queue i2c_rw_queue; + struct fts_rw_i2c *i2c_rw_msg; + u8 __user **data_ptrs; + int ret = 0; + int i; + + if (!access_ok + (VERIFY_READ, (struct fts_rw_i2c_queue *)arg, + sizeof(struct fts_rw_i2c_queue))) + return -EFAULT; + + if (copy_from_user(&i2c_rw_queue, + (struct fts_rw_i2c_queue *)arg, + sizeof(struct fts_rw_i2c_queue))) + return -EFAULT; + + if (i2c_rw_queue.queuenum > FTS_I2C_RDWR_MAX_QUEUE) + return -EINVAL; + + i2c_rw_msg = (struct fts_rw_i2c *) + kmalloc(i2c_rw_queue.queuenum * sizeof(struct fts_rw_i2c), + GFP_KERNEL); + if (!i2c_rw_msg) + return -ENOMEM; + + if (copy_from_user(i2c_rw_msg, i2c_rw_queue.i2c_queue, + i2c_rw_queue.queuenum * sizeof(struct fts_rw_i2c))) { + kfree(i2c_rw_msg); + return -EFAULT; + } + + data_ptrs = + kmalloc(i2c_rw_queue.queuenum * sizeof(u8 __user *), GFP_KERNEL); + if (data_ptrs == NULL) { + kfree(i2c_rw_msg); + return -ENOMEM; + } + + ret = 0; + for (i = 0; i < i2c_rw_queue.queuenum; i++) { + if ((i2c_rw_msg[i].length > 8192) || + (i2c_rw_msg[i].flag & I2C_M_RECV_LEN)) { + ret = -EINVAL; + break; + } + data_ptrs[i] = (u8 __user *) i2c_rw_msg[i].buf; + i2c_rw_msg[i].buf = kmalloc(i2c_rw_msg[i].length, GFP_KERNEL); + if (i2c_rw_msg[i].buf == NULL) { + ret = -ENOMEM; + break; + } + + if (copy_from_user + (i2c_rw_msg[i].buf, data_ptrs[i], i2c_rw_msg[i].length)) { + ++i; + ret = -EFAULT; + break; + } + } + + if (ret < 0) { + int j; + for (j = 0; j < i; ++j) + kfree(i2c_rw_msg[j].buf); + kfree(data_ptrs); + kfree(i2c_rw_msg); + return ret; + } + + for (i = 0; i < i2c_rw_queue.queuenum; i++) { + if (i2c_rw_msg[i].flag) { + ret = fts_rw_iic_drv_myread(client, + i2c_rw_msg[i].buf, + i2c_rw_msg[i].length); + if (ret >= 0) + ret = + copy_to_user(data_ptrs[i], + i2c_rw_msg[i].buf, + i2c_rw_msg[i].length); + } else { + ret = fts_rw_iic_drv_mywrite(client, + i2c_rw_msg[i].buf, + i2c_rw_msg[i].length); + } + } + + return ret; + +} + +/************************************************************************ +* Name: fts_rw_iic_drv_open +* Brief: char device open function interface +* Input: node, file point +* Output: no +* Return: 0 +***********************************************************************/ +static int fts_rw_iic_drv_open(struct inode *inode, struct file *filp) +{ + filp->private_data = fts_rw_i2c_dev_tt; + return 0; +} + +/************************************************************************ +* Name: fts_rw_iic_drv_release +* Brief: char device close function interface +* Input: node, file point +* Output: no +* Return: 0 +***********************************************************************/ +static int fts_rw_iic_drv_release(struct inode *inode, struct file *filp) +{ + + return 0; +} + +/************************************************************************ +* Name: fts_rw_iic_drv_ioctl +* Brief: char device I/O control function interface +* Input: file point, command, package +* Output: no +* Return: fail <0 +***********************************************************************/ +static int fts_rw_iic_drv_ioctl(struct file *filp, unsigned int cmd, + unsigned long arg) +{ + int ret = 0; + struct fts_rw_i2c_dev *ftsdev = filp->private_data; + ftsdev = filp->private_data; + + mutex_lock(&fts_rw_i2c_dev_tt->fts_rw_i2c_mutex); + switch (cmd) { + case FTS_I2C_RW: + ret = fts_rw_iic_drv_RDWR(ftsdev->client, arg); + break; + /*#if INTEL_EN + case FTS_RESET_TP: + fts_reset_tp((int)arg); + break; + #endif*/ + default: + ret = -ENOTTY; + break; + } + mutex_unlock(&fts_rw_i2c_dev_tt->fts_rw_i2c_mutex); + return ret; +} + +/* +*char device file operation which will be put to register the char device +*/ +static const struct file_operations fts_rw_iic_drv_fops = { + .owner = THIS_MODULE, + .open = fts_rw_iic_drv_open, + .release = fts_rw_iic_drv_release, + .unlocked_ioctl = fts_rw_iic_drv_ioctl, +}; + +/************************************************************************ +* Name: fts_rw_iic_drv_setup_cdev +* Brief: setup char device +* Input: device point, index number +* Output: no +* Return: no +***********************************************************************/ +static void fts_rw_iic_drv_setup_cdev(struct fts_rw_i2c_dev *dev, int index) +{ + int err, devno = MKDEV(fts_rw_iic_drv_major, index); + + cdev_init(&dev->cdev, &fts_rw_iic_drv_fops); + dev->cdev.owner = THIS_MODULE; + dev->cdev.ops = &fts_rw_iic_drv_fops; + err = cdev_add(&dev->cdev, devno, 1); + if (err) + printk(KERN_NOTICE "Error %d adding LED%d", err, index); +} + +/************************************************************************ +* Name: fts_rw_iic_drv_myinitdev +* Brief: initial char device +* Input: i2c info +* Output: no +* Return: fail <0 +***********************************************************************/ +static int fts_rw_iic_drv_myinitdev(struct i2c_client *client) +{ + int err = 0; + dev_t devno = MKDEV(fts_rw_iic_drv_major, 0); + + if (fts_rw_iic_drv_major) + err = register_chrdev_region(devno, 1, FTS_RW_IIC_DRV); + else { + err = alloc_chrdev_region(&devno, 0, 1, FTS_RW_IIC_DRV); + fts_rw_iic_drv_major = MAJOR(devno); + } + if (err < 0) { + dev_err(&client->dev, + "%s:ft_rw_iic_drv failed error code=%d---\n", __func__, + err); + return err; + } + + fts_rw_i2c_dev_tt = kmalloc(sizeof(struct fts_rw_i2c_dev), GFP_KERNEL); + if (!fts_rw_i2c_dev_tt) { + err = -ENOMEM; + unregister_chrdev_region(devno, 1); + dev_err(&client->dev, "%s:ft_rw_iic_drv failed\n", __func__); + return err; + } + fts_rw_i2c_dev_tt->client = client; + mutex_init(&fts_rw_i2c_dev_tt->fts_rw_i2c_mutex); + fts_rw_iic_drv_setup_cdev(fts_rw_i2c_dev_tt, 0); + + fts_class = class_create(THIS_MODULE, "fts_class"); + if (IS_ERR(fts_class)) { + dev_err(&client->dev, "%s:failed in creating class.\n", + __func__); + return -1; + } + /*create device node */ + device_create(fts_class, NULL, MKDEV(fts_rw_iic_drv_major, 0), + NULL, FTS_RW_IIC_DRV); + + return 0; +} + +/************************************************************************ +* Name: fts_rw_iic_drv_init +* Brief: call initial char device +* Input: i2c info +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_rw_iic_drv_init(struct i2c_client *client) +{ + dev_dbg(&client->dev, "[FTS]----ft_rw_iic_drv init ---\n"); + return fts_rw_iic_drv_myinitdev(client); +} + +/************************************************************************ +* Name: fts_rw_iic_drv_exit +* Brief: delete char device +* Input: no +* Output: no +* Return: no +***********************************************************************/ +void fts_rw_iic_drv_exit(void) +{ + device_destroy(fts_class, MKDEV(fts_rw_iic_drv_major, 0)); + /*delete class created by us */ + class_destroy(fts_class); + /*delet the cdev */ + cdev_del(&fts_rw_i2c_dev_tt->cdev); + kfree(fts_rw_i2c_dev_tt); + unregister_chrdev_region(MKDEV(fts_rw_iic_drv_major, 0), 1); +} diff --git a/arch/arm/mach-mt8127/ford/touchpanel/focaltech_ex_fun.c b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_ex_fun.c new file mode 100644 index 00000000000..3bb8f98778a --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_ex_fun.c @@ -0,0 +1,791 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2015, Focaltech Ltd. All rights reserved. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + /******************************************************************************* +* +* File Name: Focaltech_ex_fun.c +* +* Author: Xu YongFeng +* +* Created: 2015-01-29 +* +* Modify by mshl on 2015-03-20 +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ +#include "focaltech_core.h" + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +/*create apk debug channel*/ +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_AUTOCLB 4 +#define PROC_UPGRADE_INFO 5 +#define PROC_WRITE_DATA 6 +#define PROC_READ_DATA 7 +#define PROC_SET_TEST_FLAG 8 +#define FTS_DEBUG_DIR_NAME "fts_debug" +#define PROC_NAME "ftxxxx-debug" + +#define WRITE_BUF_SIZE 1016 +#define READ_BUF_SIZE 1016 + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + +/******************************************************************************* +* Static variables +*******************************************************************************/ +static unsigned char proc_operate_mode = PROC_UPGRADE; +static struct proc_dir_entry *fts_proc_entry; +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +#if GTP_ESD_PROTECT +int apk_debug_flag = 0; +#endif +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 10, 0)) +/*interface of write proc*/ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static ssize_t fts_debug_write(struct file *filp, const char __user *buff, + size_t count, loff_t *ppos) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = count; + int writelen = 0; + int ret = 0; + + if (copy_from_user(&writebuf, buff, buflen)) { + dev_err(&fts_i2c_client->dev, "%s:copy from user error\n", + __func__); + return -EFAULT; + } + proc_operate_mode = writebuf[0]; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[128]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen - 1] = '\0'; + FTS_DBG("%s\n", upgrade_file_path); + disable_irq(fts_i2c_client->irq); +#if GTP_ESD_PROTECT + apk_debug_flag = 1; +#endif + + ret = + fts_ctpm_fw_upgrade_with_app_file(fts_i2c_client, + upgrade_file_path); +#if GTP_ESD_PROTECT + apk_debug_flag = 0; +#endif + enable_irq(fts_i2c_client->irq); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, + "%s:upgrade failed.\n", __func__); + return ret; + } + } + break; + /*case PROC_SET_TEST_FLAG: + #if GTP_ESD_PROTECT + apk_debug_flag = writebuf[1]; + #endif + break;*/ + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:write iic error\n", + __func__); + return ret; + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:write iic error\n", + __func__); + return ret; + } + break; + case PROC_AUTOCLB: + FTS_DBG("%s: autoclb\n", __func__); + fts_ctpm_auto_clb(fts_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = count - 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:write iic error\n", + __func__); + return ret; + } + break; + default: + break; + } + + return count; +} + +/*interface of read proc*/ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static ssize_t fts_debug_read(struct file *filp, char __user *buff, + size_t count, loff_t *ppos) +{ + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + unsigned char buf[READ_BUF_SIZE]; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + /*after calling fts_debug_write to upgrade*/ + regaddr = 0xA6; + ret = fts_read_reg(fts_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = + sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = + sprintf(buf, "current fw version:0x%02x\n", + regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:read iic error\n", + __func__); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:read iic error\n", + __func__); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + + if (copy_to_user(buff, buf, num_read_chars)) { + dev_err(&fts_i2c_client->dev, "%s:copy to user error\n", + __func__); + return -EFAULT; + } + /*memcpy(buff, buf, num_read_chars);*/ + return num_read_chars; +} + +static const struct file_operations fts_proc_fops = { + .owner = THIS_MODULE, + .read = fts_debug_read, + .write = fts_debug_write, + +}; +#else +/*interface of write proc*/ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static int fts_debug_write(struct file *filp, + const char __user *buff, unsigned long len, + void *data) +{ +/* struct i2c_client *client = (struct i2c_client *)fts_proc_entry->data;*/ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = len; + int writelen = 0; + int ret = 0; + + if (copy_from_user(&writebuf, buff, buflen)) { + dev_err(&fts_i2c_client->dev, "%s:copy from user error\n", + __func__); + return -EFAULT; + } + proc_operate_mode = writebuf[0]; + + switch (proc_operate_mode) { + + case PROC_UPGRADE: + { + char upgrade_file_path[128]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen - 1] = '\0'; + FTS_DBG("%s\n", upgrade_file_path); + disable_irq(fts_i2c_client->irq); +#if GTP_ESD_PROTECT + apk_debug_flag = 1; +#endif + ret = + fts_ctpm_fw_upgrade_with_app_file(fts_i2c_client, + upgrade_file_path); +#if GTP_ESD_PROTECT + apk_debug_flag = 0; +#endif + enable_irq(fts_i2c_client->irq); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, + "%s:upgrade failed.\n", __func__); + return ret; + } + } + break; + /*case PROC_SET_TEST_FLAG: + #if GTP_ESD_PROTECT + apk_debug_flag = writebuf[1]; + #endif + break;*/ + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:write iic error\n", + __func__); + return ret; + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:write iic error\n", + __func__); + return ret; + } + break; + case PROC_AUTOCLB: + FTS_DBG("%s: autoclb\n", __func__); + fts_ctpm_auto_clb(fts_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = len - 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:write iic error\n", + __func__); + return ret; + } + break; + default: + break; + } + + return len; +} + +/*interface of read proc*/ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static int fts_debug_read(char *page, char **start, + off_t off, int count, int *eof, void *data) +{ + /*struct i2c_client *client = (struct i2c_client *)fts_proc_entry->data;*/ + int ret = 0; + unsigned char buf[READ_BUF_SIZE]; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + /*after calling fts_debug_write to upgrade*/ + regaddr = 0xA6; + ret = fts_read_reg(fts_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = + sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = + sprintf(buf, "current fw version:0x%02x\n", + regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:read iic error\n", + __func__); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { + dev_err(&fts_i2c_client->dev, "%s:read iic error\n", + __func__); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + + memcpy(page, buf, num_read_chars); + return num_read_chars; +} +#endif +/************************************************************************ +* Name: fts_create_apk_debug_channel +* Brief: create apk debug channel +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int fts_create_apk_debug_channel(struct i2c_client *client) +{ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 10, 0)) + fts_proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops); +#else + fts_proc_entry = create_proc_entry(PROC_NAME, 0777, NULL); +#endif + if (NULL == fts_proc_entry) { + dev_err(&client->dev, "Couldn't create proc entry!\n"); + + return -ENOMEM; + } else { + dev_info(&client->dev, "Create proc entry success!\n"); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)) + /*fts_proc_entry->data = client;*/ + fts_proc_entry->write_proc = fts_debug_write; + fts_proc_entry->read_proc = fts_debug_read; +#endif + } + return 0; +} + +/************************************************************************ +* Name: fts_release_apk_debug_channel +* Brief: release apk debug channel +* Input: no +* Output: no +* Return: no +***********************************************************************/ +void fts_release_apk_debug_channel(void) +{ + + if (fts_proc_entry) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 10, 0)) + proc_remove(PROC_NAME); +#else + remove_proc_entry(PROC_NAME, NULL); +#endif +} + +/************************************************************************ +* Name: fts_tpfwver_show +* Brief: show tp fw vwersion +* Input: device, device attribute, char buf +* Output: no +* Return: char number +***********************************************************************/ +static ssize_t fts_tpfwver_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t num_read_chars = 0; + u8 fwver = 0; + /*struct i2c_client *client = container_of(dev, struct i2c_client, dev); jacob use globle fts_wq_data data*/ + mutex_lock(&fts_input_dev->mutex); + if (fts_read_reg(fts_i2c_client, FTS_REG_FW_VER, &fwver) < 0) + return -1; + + if (fwver == 255) + num_read_chars = + snprintf(buf, PAGE_SIZE, "get tp fw version fail!\n"); + else { + num_read_chars = snprintf(buf, PAGE_SIZE, "%02X\n", fwver); + } + + mutex_unlock(&fts_input_dev->mutex); + + return num_read_chars; +} + +/************************************************************************ +* Name: fts_tpfwver_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tpfwver_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_tprwreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tprwreg_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_tprwreg_store +* Brief: read/write register +* Input: device, device attribute, char buf, char count +* Output: print register value +* Return: char count +***********************************************************************/ +static ssize_t fts_tprwreg_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + ssize_t num_read_chars = 0; + int retval; + /*u32 wmreg=0; */ + long unsigned int wmreg = 0; + u8 regaddr = 0xff, regvalue = 0xff; + u8 valbuf[5] = { 0 }; + + memset(valbuf, 0, sizeof(valbuf)); + mutex_lock(&fts_input_dev->mutex); + num_read_chars = count - 1; + if (num_read_chars != 2) { + if (num_read_chars != 4) { + dev_err(dev, "please input 2 or 4 character\n"); + goto error_return; + } + } + memcpy(valbuf, buf, num_read_chars); + retval = strict_strtoul(valbuf, 16, &wmreg); + if (0 != retval) { + dev_err(dev, + "%s() - ERROR: Could not convert the given input to a number. The given input was: \"%s\"\n", + __FUNCTION__, buf); + goto error_return; + } + if (2 == num_read_chars) { + /*read register */ + regaddr = wmreg; + printk("[focal][test](0x%02x)\n", regaddr); + if (fts_read_reg(client, regaddr, ®value) < 0) + printk + ("[Focal] %s : Could not read the register(0x%02x)\n", + __func__, regaddr); + else + printk("[Focal] %s : the register(0x%02x) is 0x%02x\n", + __func__, regaddr, regvalue); + } else { + regaddr = wmreg >> 8; + regvalue = wmreg; + if (fts_write_reg(client, regaddr, regvalue) < 0) + dev_err(dev, + "[Focal] %s : Could not write the register(0x%02x)\n", + __func__, regaddr); + else + dev_dbg(dev, + "[Focal] %s : Write 0x%02x into register(0x%02x) successful\n", + __func__, regvalue, regaddr); + } + error_return: + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_fwupdate_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupdate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupdate_store +* Brief: upgrade from *.i +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupdate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + /*struct fts_ts_data *data = NULL;*/ + u8 uc_host_fm_ver; + u8 uc_tp_vendor_id = 0; + int i_ret,i; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + /*data = (struct fts_ts_data *) i2c_get_clientdata(client);*/ + mutex_lock(&fts_input_dev->mutex); + + disable_irq(client->irq); +#if GTP_ESD_PROTECT + apk_debug_flag = 1; +#endif + for(i = 0; i <= 10; i++) { + fts_read_reg(client, FTS_REG_VENDOR_ID, &uc_tp_vendor_id); + if((uc_tp_vendor_id == OFILM_ID) || (uc_tp_vendor_id == TPV_ID)) + break; + } + i_ret = fts_ctpm_fw_upgrade_with_i_file(client, uc_tp_vendor_id); + if (i_ret == 0) { + msleep(300); + uc_host_fm_ver = fts_ctpm_get_i_file_ver(uc_tp_vendor_id); + dev_dbg(dev, "%s [FTS] upgrade to new version 0x%x\n", __func__, + uc_host_fm_ver); + } else { + dev_err(dev, "%s ERROR:[FTS] upgrade failed ret=%d.\n", + __func__, i_ret); + } + + /*fts_EnterUpgradeMode(client, 0 ,false); *//* : mark by focal Elmer */ + /*fts_ctpm_auto_upgrade(client);*/ +#if GTP_ESD_PROTECT + apk_debug_flag = 0; +#endif + enable_irq(client->irq); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_fwupgradeapp_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupgradeapp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupgradeapp_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupgradeapp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + char fwname[128]; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count - 1] = '\0'; + + mutex_lock(&fts_input_dev->mutex); + + disable_irq(client->irq); +#if GTP_ESD_PROTECT + apk_debug_flag = 1; +#endif + fts_ctpm_fw_upgrade_with_app_file(client, fwname); +#if GTP_ESD_PROTECT + apk_debug_flag = 0; +#endif + enable_irq(client->irq); + + mutex_unlock(&fts_input_dev->mutex); + return count; +} + +/************************************************************************ +* Name: fts_ftsgetprojectcode_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_getprojectcode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + + return -EPERM; +} + +/************************************************************************ +* Name: fts_ftsgetprojectcode_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_getprojectcode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/****************************************/ +/* sysfs */ +/*get the fw version +*example:cat ftstpfwver +*/ +static DEVICE_ATTR(ftstpfwver, S_IRUGO | S_IWUSR, fts_tpfwver_show, + fts_tpfwver_store); +/*upgrade from *.i +*example: echo 1 > ftsfwupdate +*/ +static DEVICE_ATTR(ftsfwupdate, S_IRUGO | S_IWUSR, fts_fwupdate_show, + fts_fwupdate_store); +/*read and write register +*read example: echo 88 > ftstprwreg ---read register 0x88 +*write example:echo 8807 > ftstprwreg ---write 0x07 into register 0x88 +* +*note:the number of input must be 2 or 4.if it not enough,please fill in the 0. +*/ +static DEVICE_ATTR(ftstprwreg, S_IRUGO | S_IWUSR, fts_tprwreg_show, + fts_tprwreg_store); +/*upgrade from app.bin +*example:echo "*_app.bin" > ftsfwupgradeapp +*/ +static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO | S_IWUSR, fts_fwupgradeapp_show, + fts_fwupgradeapp_store); +static DEVICE_ATTR(ftsgetprojectcode, S_IRUGO | S_IWUSR, + fts_getprojectcode_show, fts_getprojectcode_store); + +/*add your attr in here*/ +static struct attribute *fts_attributes[] = { + &dev_attr_ftstpfwver.attr, + &dev_attr_ftsfwupdate.attr, + &dev_attr_ftstprwreg.attr, + &dev_attr_ftsfwupgradeapp.attr, + &dev_attr_ftsgetprojectcode.attr, + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +/************************************************************************ +* Name: fts_create_sysfs +* Brief: create sysfs for debug +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int fts_create_sysfs(struct i2c_client *client) +{ + int err; + err = sysfs_create_group(&client->dev.kobj, &fts_attribute_group); + if (0 != err) { + dev_err(&client->dev, + "%s() - ERROR: sysfs_create_group() failed.\n", + __func__); + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return -EIO; + } else { + pr_info("fts:%s() - sysfs_create_group() succeeded.\n", + __func__); + } + /*HidI2c_To_StdI2c(client);*/ + return err; +} + +/************************************************************************ +* Name: fts_remove_sysfs +* Brief: remove sys +* Input: i2c info +* Output: no +* Return: no +***********************************************************************/ +int fts_remove_sysfs(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return 0; +} diff --git a/arch/arm/mach-mt8127/ford/touchpanel/focaltech_flash.c b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_flash.c new file mode 100644 index 00000000000..42b39cc3122 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/focaltech_flash.c @@ -0,0 +1,2320 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2015, Focaltech Ltd. All rights reserved. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + /******************************************************************************* +* +* File Name: Focaltech_IC_Program.c +* +* Author: Xu YongFeng +* +* Created: 2015-01-29 +* +* Modify by mshl on 2015-03-20 +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ +#include "focaltech_core.h" + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +#define FTS_REG_FW_MAJ_VER 0xB1 +#define FTS_REG_FW_MIN_VER 0xB2 +#define FTS_REG_FW_SUB_MIN_VER 0xB3 +#define FTS_FW_MIN_SIZE 8 +#define FTS_FW_MAX_SIZE (54 * 1024) +/* Firmware file is not supporting minor and sub minor so use 0 */ +#define FTS_FW_FILE_MAJ_VER(x) ((x)->data[(x)->size - 2]) +#define FTS_FW_FILE_MIN_VER(x) 0 +#define FTS_FW_FILE_SUB_MIN_VER(x) 0 +#define FTS_FW_FILE_VENDOR_ID(x) ((x)->data[(x)->size - 1]) +#define FTS_FW_FILE_MAJ_VER_FT6X36(x) ((x)->data[0x10a]) +#define FTS_FW_FILE_VENDOR_ID_FT6X36(x) ((x)->data[0x108]) +#define FTS_MAX_TRIES 5 +#define FTS_RETRY_DLY 20 +#define FTS_MAX_WR_BUF 10 +#define FTS_MAX_RD_BUF 2 +#define FTS_FW_PKT_META_LEN 6 +#define FTS_FW_PKT_DLY_MS 20 +#define FTS_FW_LAST_PKT 0x6ffa +#define FTS_EARSE_DLY_MS 100 +#define FTS_55_AA_DLY_NS 5000 +#define FTS_CAL_START 0x04 +#define FTS_CAL_FIN 0x00 +#define FTS_CAL_STORE 0x05 +#define FTS_CAL_RETRY 100 +#define FTS_REG_CAL 0x00 +#define FTS_CAL_MASK 0x70 +#define FTS_BLOADER_SIZE_OFF 12 +#define FTS_BLOADER_NEW_SIZE 30 +#define FTS_DATA_LEN_OFF_OLD_FW 8 +#define FTS_DATA_LEN_OFF_NEW_FW 14 +#define FTS_FINISHING_PKT_LEN_OLD_FW 6 +#define FTS_FINISHING_PKT_LEN_NEW_FW 12 +#define FTS_MAGIC_BLOADER_Z7 0x7bfa +#define FTS_MAGIC_BLOADER_LZ4 0x6ffa +#define FTS_MAGIC_BLOADER_GZF_30 0x7ff4 +#define FTS_MAGIC_BLOADER_GZF 0x7bf4 +#define FTS_REG_ECC 0xCC +#define FTS_RST_CMD_REG2 0xBC +#define FTS_READ_ID_REG 0x90 +#define FTS_ERASE_APP_REG 0x61 +#define FTS_ERASE_PARAMS_CMD 0x63 +#define FTS_FW_WRITE_CMD 0xBF +#define FTS_REG_RESET_FW 0x07 +#define FTS_RST_CMD_REG1 0xFC +#define FTS_FACTORYMODE_VALUE 0x40 +#define FTS_WORKMODE_VALUE 0x00 +#define FTS_APP_INFO_ADDR 0xd7f8 + +#define BL_VERSION_LZ4 0 +#define BL_VERSION_Z7 1 +#define BL_VERSION_GZF 2 +#define FTS_REG_FW_VENDOR_ID 0xA8 + +#define FTS_SETTING_BUF_LEN 128 + +#define FTS_UPGRADE_LOOP 30 +#define FTS_MAX_POINTS_2 2 +#define FTS_MAX_POINTS_5 5 +#define FTS_MAX_POINTS_10 10 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +#define FTS_UPGRADE_AA 0xAA +#define FTS_UPGRADE_55 0x55 +#define HIDTOI2C_DISABLE 1 +#define FTXXXX_INI_FILEPATH_CONFIG "/sdcard/" +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + +/******************************************************************************* +* Static variables +*******************************************************************************/ +static unsigned char CTPM_FW_TPV[] = { +#include "FT5436I_Ref_V0x18_20150915_app.i" +}; + +static unsigned char CTPM_FW_OFILM[] = { +#include "AmazonA+_5436i_ofilm0x51_V0x1a_20160128_app.i" +}; + +struct fts_Upgrade_Info fts_updateinfo[] = { + {0x55, FTS_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 10, 2000}, /*,"FT5x06"*/ + {0x08, FTS_MAX_POINTS_5, AUTO_CLB_NEED, 50, 10, 0x79, 0x06, 100, 2000}, /*,"FT5606"*/ + {0x0a, FTS_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x07, 10, 1500}, /*,"FT5x16"*/ + {0x06, FTS_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x08, 10, 2000}, /*,"FT6x06"*/ + {0x36, FTS_MAX_POINTS_2, AUTO_CLB_NONEED, 10, 10, 0x79, 0x18, 10, 2000}, /*,"FT6x36"*/ + {0x55, FTS_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 10, 2000}, /*,"FT5x06i"*/ + {0x14, FTS_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, /*,"FT5336"*/ + {0x13, FTS_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, /*,"FT3316"*/ + {0x12, FTS_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, /*,"FT5436i"*/ + {0x11, FTS_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, /*,"FT5336i"*/ + {0x54, FTS_MAX_POINTS_5, AUTO_CLB_NONEED, 2, 2, 0x54, 0x2c, 20, 2000}, /*,"FT5x46"*/ + {0x58, FTS_MAX_POINTS_5, AUTO_CLB_NONEED, 2, 2, 0x58, 0x2c, 20, 2000}, /*"FT5822",*/ + {0x59, FTS_MAX_POINTS_10, AUTO_CLB_NONEED, 30, 50, 0x79, 0x10, 1, 2000}, /*"FT5x26",*/ +}; + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +struct fts_Upgrade_Info fts_updateinfo_curr; +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ +int fts_6x36_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); +int fts_6x06_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); +int fts_5x36_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); +int fts_5x06_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); +int fts_5x46_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); +int fts_5822_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); +int fts_5x26_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); +int HidI2c_To_StdI2c(struct i2c_client *client); + +/************************************************************************ +* Name: HidI2c_To_StdI2c +* Brief: HID to I2C +* Input: i2c info +* Output: no +* Return: fail =0 +***********************************************************************/ +int HidI2c_To_StdI2c(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[5] = { 0 }; + int bRet = 0; +#if HIDTOI2C_DISABLE + + return 2; + +#endif + auc_i2c_write_buf[0] = 0xeb; + auc_i2c_write_buf[1] = 0xaa; + auc_i2c_write_buf[2] = 0x09; + bRet = fts_i2c_write(client, auc_i2c_write_buf, 3); + msleep(10); + auc_i2c_write_buf[0] = auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = 0; + fts_i2c_read(client, auc_i2c_write_buf, 0, auc_i2c_write_buf, 3); +/*FTS_DBG("Change to STDI2cValue,REG1 = 0x%x,REG2 = 0x%x,REG3 = 0x%x, iRet=%d\n", reg_val[0], reg_val[1], reg_val[2], iRet);*/ + if (0xeb == auc_i2c_write_buf[0] && 0xaa == auc_i2c_write_buf[1] + && 0x08 == auc_i2c_write_buf[2]) { + pr_info("HidI2c_To_StdI2c successful.\n"); + bRet = 1; + } else { + pr_err("HidI2c_To_StdI2c error.\n"); + bRet = 0; + } + + return bRet; +} + +/******************************************************************************* +* Name: fts_update_fw_vendor_id +* Brief: +* Input: +* Output: None +* Return: None +*******************************************************************************/ +void fts_update_fw_vendor_id(struct fts_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FTS_REG_FW_VENDOR_ID; + err = fts_i2c_read(client, ®_addr, 1, &data->fw_vendor_id, 1); + if (err < 0) + dev_err(&client->dev, "fw vendor id read failed"); +} + +/******************************************************************************* +* Name: fts_update_fw_ver +* Brief: +* Input: +* Output: None +* Return: None +*******************************************************************************/ +void fts_update_fw_ver(struct fts_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FTS_REG_FW_VER; + err = fts_i2c_read(client, ®_addr, 1, &data->fw_ver[0], 1); + if (err < 0) + dev_err(&client->dev, "fw major version read failed"); + + reg_addr = FTS_REG_FW_MIN_VER; + err = fts_i2c_read(client, ®_addr, 1, &data->fw_ver[1], 1); + if (err < 0) + dev_err(&client->dev, "fw minor version read failed"); + + reg_addr = FTS_REG_FW_SUB_MIN_VER; + err = fts_i2c_read(client, ®_addr, 1, &data->fw_ver[2], 1); + if (err < 0) + dev_err(&client->dev, "fw sub minor version read failed"); + + dev_info(&client->dev, "Firmware version = %d.%d.%d\n", + data->fw_ver[0], data->fw_ver[1], data->fw_ver[2]); +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_ReadVendorID +* Brief: read vendor ID +* Input: i2c info, vendor ID +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_ctpm_fw_upgrade_ReadVendorID(struct i2c_client *client, + u8 *ucPVendorID) +{ + u8 reg_val[4] = { 0 }; + u32 i = 0; + u8 auc_i2c_write_buf[10]; + int i_ret; + + *ucPVendorID = 0; + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + fts_write_reg(client, 0xfc, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + fts_write_reg(client, 0xfc, FTS_UPGRADE_55); + msleep(200); + /*********Step 2:Enter upgrade mode *****/ + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + /*continue; */ + } + msleep(10); + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + if (i_ret < 0) { + FTS_DBG("failed writing 0x55 and 0xaa ! \n"); + continue; + } + /*********Step 3:check READ-ID***********************/ + msleep(10); + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + FTS_DBG + ("[FTS] Step 3: READ OK CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + continue; + } + } + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + /*********Step 4: read vendor id from app param area***********************/ + msleep(10); + auc_i2c_write_buf[0] = 0x03; + auc_i2c_write_buf[1] = 0x00; + auc_i2c_write_buf[2] = 0xd7; + auc_i2c_write_buf[3] = 0x84; + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + fts_i2c_write(client, auc_i2c_write_buf, 4); /*send param addr */ + msleep(5); + reg_val[0] = reg_val[1] = 0x00; + i_ret = fts_i2c_read(client, auc_i2c_write_buf, 0, reg_val, 2); + if (0 != reg_val[0]) { + *ucPVendorID = 0; + FTS_DBG + ("In upgrade Vendor ID Mismatch, REG1 = 0x%x, REG2 = 0x%x, Definition:0x%x, i_ret=%d\n", + reg_val[0], reg_val[1], 0, i_ret); + } else { + *ucPVendorID = reg_val[0]; + FTS_DBG + ("In upgrade Vendor ID, REG1 = 0x%x, REG2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } + } + msleep(50); + /*********Step 5: reset the new FW***********************/ + FTS_DBG("Step 5: reset the new FW\n"); + auc_i2c_write_buf[0] = 0x07; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(200); /*make sure CTP startup normally */ + i_ret = HidI2c_To_StdI2c(client); /*Android to Std i2c. */ + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + msleep(10); + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_ReadProjectCode +* Brief: read project code +* Input: i2c info, project code +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_ctpm_fw_upgrade_ReadProjectCode(struct i2c_client *client, + char *pProjectCode) +{ + u8 reg_val[4] = { 0 }; + u32 i = 0; + u8 j = 0; + u8 auc_i2c_write_buf[10]; + int i_ret; + u32 temp; + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + fts_write_reg(client, 0xfc, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + fts_write_reg(client, 0xfc, FTS_UPGRADE_55); + msleep(200); + /*********Step 2:Enter upgrade mode *****/ + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + /*continue; */ + } + msleep(10); + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + if (i_ret < 0) { + FTS_DBG("failed writing 0x55 and 0xaa ! \n"); + continue; + } + /*********Step 3:check READ-ID***********************/ + msleep(10); + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + FTS_DBG + ("[FTS] Step 3: READ OK CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + continue; + } + } + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + /*********Step 4: read vendor id from app param area***********************/ + msleep(10); + /*auc_i2c_write_buf[0] = 0x03; + auc_i2c_write_buf[1] = 0x00; + auc_i2c_write_buf[2] = 0xd7; + auc_i2c_write_buf[3] = 0x84; + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + fts_i2c_write(client, auc_i2c_write_buf, 4); //send param addr + msleep(5); + reg_val[0] = reg_val[1] = 0x00; + i_ret = fts_i2c_read(client, auc_i2c_write_buf, 0, reg_val, 2); + if (0 != reg_val[0]) { + *pProjectCode=0; + FTS_DBG("In upgrade Vendor ID Mismatch, REG1 = 0x%x, REG2 = 0x%x, Definition:0x%x, i_ret=%d\n", reg_val[0], reg_val[1], 0, i_ret); + } else { + *pProjectCode=reg_val[0]; + FTS_DBG("In upgrade Vendor ID, REG1 = 0x%x, REG2 = 0x%x\n", reg_val[0], reg_val[1]); + break; + } + } + */ + /*read project code */ + auc_i2c_write_buf[0] = 0x03; + auc_i2c_write_buf[1] = 0x00; + for (j = 0; j < 33; j++) { + /*if (is_5336_new_bootloader == BL_VERSION_Z7 || is_5336_new_bootloader == BL_VERSION_GZF) + temp = 0x07d0 + j; + else*/ + temp = 0xD7A0 + j; + auc_i2c_write_buf[2] = (u8) (temp >> 8); + auc_i2c_write_buf[3] = (u8) temp; + fts_i2c_read(client, auc_i2c_write_buf, 4, pProjectCode + j, 1); + if (*(pProjectCode + j) == '\0') + break; + } + pr_info("project code = %s \n", pProjectCode); + msleep(50); + /*********Step 5: reset the new FW***********************/ + FTS_DBG("Step 5: reset the new FW\n"); + auc_i2c_write_buf[0] = 0x07; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(200); /*make sure CTP startup normally */ + i_ret = HidI2c_To_StdI2c(client); /*Android to Std i2c. */ + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + msleep(10); + return 0; +} + +/************************************************************************ +* Name: fts_get_upgrade_array +* Brief: decide which ic +* Input: no +* Output: get ic info in fts_updateinfo_curr +* Return: no +***********************************************************************/ +void fts_get_upgrade_array(void) +{ + + u8 chip_id; + u32 i; + int ret = 0; + /*i2c_smbus_read_i2c_block_data(i2c_client,FTS_REG_CHIP_ID,1,&chip_id); + ret = fts_read_reg(fts_i2c_client, FTS_REG_CHIP_ID, &chip_id); + if (ret < 0) { + printk("[Focal][Touch] read value fail"); + + } + printk("%s chip_id = %x\n", __func__, chip_id);*/ + + for (i = 0; + i < sizeof(fts_updateinfo) / sizeof(struct fts_Upgrade_Info); + i++) { + if (0x12 == fts_updateinfo[i].CHIP_ID) { + memcpy(&fts_updateinfo_curr, &fts_updateinfo[i], + sizeof(struct fts_Upgrade_Info)); + break; + } + } + + if (i >= sizeof(fts_updateinfo) / sizeof(struct fts_Upgrade_Info)) { + memcpy(&fts_updateinfo_curr, &fts_updateinfo[0], + sizeof(struct fts_Upgrade_Info)); + } +} + +/************************************************************************ +* Name: fts_ctpm_auto_clb +* Brief: auto calibration +* Input: i2c info +* Output: no +* Return: 0 +***********************************************************************/ +int fts_ctpm_auto_clb(struct i2c_client *client) +{ + unsigned char uc_temp = 0x00; + unsigned char i = 0; + + /*start auto CLB */ + msleep(200); + + fts_write_reg(client, 0, FTS_FACTORYMODE_VALUE); + /*make sure already enter factory mode */ + msleep(100); + /*write command to start calibration */ + fts_write_reg(client, 2, 0x4); + msleep(300); + if ((fts_updateinfo_curr.CHIP_ID == 0x11) || (fts_updateinfo_curr.CHIP_ID == 0x12) || (fts_updateinfo_curr.CHIP_ID == 0x13) || (fts_updateinfo_curr.CHIP_ID == 0x14)) { /*5x36,5x36i*/ + for (i = 0; i < 100; i++) { + fts_read_reg(client, 0x02, &uc_temp); + if (0x02 == uc_temp || 0xFF == uc_temp) { + /*if 0x02, then auto clb ok, else 0xff, auto clb failure */ + break; + } + msleep(20); + } + } else { + for (i = 0; i < 100; i++) { + fts_read_reg(client, 0, &uc_temp); + if (0x0 == ((uc_temp & 0x70) >> 4)) { + /*return to normal mode, calibration finish : auto/test mode auto switch ??? */ + break; + } + msleep(20); + } + } + /*calibration OK */ + fts_write_reg(client, 0, 0x40); /*goto factory mode for store */ + msleep(200); /*make sure already enter factory mode */ + fts_write_reg(client, 2, 0x5); /*store CLB result : write 0x05 to 0x04 ??? */ + msleep(300); + fts_write_reg(client, 0, FTS_WORKMODE_VALUE); /*return to normal mode */ + msleep(300); + + /*store CLB result OK */ + return 0; +} + +/************************************************************************ +* Name: delay_qt_ms +* Brief: delay ms time +* Input: ms time +* Output: no +* Return: 0 +***********************************************************************/ +static void delay_qt_ms(unsigned long w_ms) +{ + unsigned long i; + unsigned long j; + + for (i = 0; i < w_ms; i++) { + for (j = 0; j < 1000; j++) { + udelay(1); + } + } +} + +/************************************************************************ +* Name: fts_6x36_ctpm_fw_upgrade +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_6x36_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[2] = { 0 }; + u32 i = 0; + u32 packet_number; + u32 j; + u32 temp; + u32 lenght; + u32 fw_length; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + + if (pbt_buf[0] != 0x02) { + FTS_DBG("[FTS] FW first byte is not 0x02. so it is invalid \n"); + return -1; + } + + if (dw_lenth > 0x11f) { + fw_length = ((u32) pbt_buf[0x100] << 8) + pbt_buf[0x101]; + if (dw_lenth < fw_length) { + FTS_DBG("[FTS] Fw length is invalid \n"); + return -1; + } + } else { + FTS_DBG("[FTS] Fw length is invalid \n"); + return -1; + } + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register FTS_RST_CMD_REG2 */ + fts_write_reg(client, FTS_RST_CMD_REG2, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + /*write 0x55 to register FTS_RST_CMD_REG2 */ + fts_write_reg(client, FTS_RST_CMD_REG2, FTS_UPGRADE_55); + msleep(fts_updateinfo_curr.delay_55); + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + fts_i2c_write(client, auc_i2c_write_buf, 1); + auc_i2c_write_buf[0] = FTS_UPGRADE_AA; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(fts_updateinfo_curr.delay_readid); + /*********Step 3:check READ-ID***********************/ + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = 0x00; + reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + FTS_DBG + ("[FTS] Step 3: GET CTPM ID OK,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: GET CTPM ID FAIL,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + } + } + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = 0x00; + auc_i2c_write_buf[2] = 0x00; + auc_i2c_write_buf[3] = 0x00; + auc_i2c_write_buf[4] = 0x00; + fts_i2c_write(client, auc_i2c_write_buf, 5); + + /*auc_i2c_write_buf[0] = 0xcd;*/ + /*fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1);*/ + + /*Step 4:erase app and panel paramenter area */ + FTS_DBG("Step 4:erase app and panel paramenter area\n"); + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase app area */ + msleep(fts_updateinfo_curr.delay_earse_flash); + + for (i = 0; i < 200; i++) { + auc_i2c_write_buf[0] = 0x6a; + auc_i2c_write_buf[1] = 0x00; + auc_i2c_write_buf[2] = 0x00; + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = 0x00; + reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (0xb0 == reg_val[0] && 0x02 == reg_val[1]) { + FTS_DBG("[FTS] erase app finished \n"); + break; + } + msleep(50); + } + + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + FTS_DBG("Step 5:write firmware(FW) to ctpm flash\n"); + + dw_lenth = fw_length; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + auc_i2c_write_buf[1] = 0x00; + auc_i2c_write_buf[2] = 0x00; + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = 0x00; + reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (0xb0 == (reg_val[0] & 0xf0) + && (0x03 + (j % 0x0ffd)) == + (((reg_val[0] & 0x0f) << 8) | reg_val[1])) { + FTS_DBG("[FTS] write a block data finished \n"); + break; + } + msleep(1); + } + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, temp + 6); + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + auc_i2c_write_buf[1] = 0x00; + auc_i2c_write_buf[2] = 0x00; + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = 0x00; + reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (0xb0 == (reg_val[0] & 0xf0) + && (0x03 + (j % 0x0ffd)) == + (((reg_val[0] & 0x0f) << 8) | reg_val[1])) { + FTS_DBG("[FTS] write a block data finished \n"); + break; + } + msleep(1); + } + } + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DBG("Step 6: read out checksum\n"); + auc_i2c_write_buf[0] = FTS_REG_ECC; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, + "[FTS]--ecc error! fw_ecc=%02x flash_ecc=%02x\n", + reg_val[0], bt_ecc); + return -EIO; + } + + /*********Step 7: reset the new FW***********************/ + FTS_DBG("Step 7: reset the new FW\n"); + auc_i2c_write_buf[0] = 0x07; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); /*make sure CTP startup normally */ + + return 0; +} + +/************************************************************************ +* Name: fts_6x06_ctpm_fw_upgrade +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_6x06_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[2] = { 0 }; + u32 i = 0; + u32 packet_number; + u32 j; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + int i_ret; + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register FTS_RST_CMD_REG2 */ + + fts_write_reg(client, FTS_RST_CMD_REG2, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + + /*write 0x55 to register FTS_RST_CMD_REG2 */ + fts_write_reg(client, FTS_RST_CMD_REG2, FTS_UPGRADE_55); + + msleep(fts_updateinfo_curr.delay_55); + + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + do { + i++; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + msleep(5); + } while (i_ret <= 0 && i < 5); + + /*********Step 3:check READ-ID***********************/ + msleep(fts_updateinfo_curr.delay_readid); + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + FTS_DBG + ("[FTS] Step 3: CTPM ID OK ,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: CTPM ID FAIL,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + } + } + if (i > FTS_UPGRADE_LOOP) + return -EIO; + auc_i2c_write_buf[0] = 0xcd; + + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + + /*Step 4:erase app and panel paramenter area */ + FTS_DBG("Step 4:erase app and panel paramenter area\n"); + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase app area */ + msleep(fts_updateinfo_curr.delay_earse_flash); + /*erase panel parameter area */ + auc_i2c_write_buf[0] = FTS_ERASE_PARAMS_CMD; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(100); + + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + FTS_DBG("Step 5:write firmware(FW) to ctpm flash\n"); + + dw_lenth = dw_lenth - 8; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + msleep(FTS_PACKET_LENGTH / 6 + 1); + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, temp + 6); + msleep(20); + } + + /*send the last six byte */ + for (i = 0; i < 6; i++) { + temp = 0x6ffa + i; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = 1; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + packet_buf[6] = pbt_buf[dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + fts_i2c_write(client, packet_buf, 7); + msleep(20); + } + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DBG("Step 6: read out checksum\n"); + auc_i2c_write_buf[0] = FTS_REG_ECC; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, + "[FTS]--ecc error! fw_ecc=%02x flash_ecc=%02x\n", + reg_val[0], bt_ecc); + return -EIO; + } + + /*********Step 7: reset the new FW***********************/ + FTS_DBG("Step 7: reset the new FW\n"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); /*make sure CTP startup normally */ + + return 0; +} + +/************************************************************************ +* Name: fts_5x26_ctpm_fw_upgrade +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_5x26_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[4] = { 0 }; + u32 i = 0; + u32 packet_number; + u32 j; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + /*u8 bt_ecc_check;*/ + int i_ret = 0; + /*int x=0;*/ + + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + + /*********Step 1:Reset CTPM *****/ + fts_write_reg(client, 0xfc, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + fts_write_reg(client, 0xfc, FTS_UPGRADE_55); + msleep(fts_updateinfo_curr.delay_55); + + /*********Step 2:Enter upgrade mode and switch protocol*****/ + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + /*: write 0xAA to 0x55 */ + if (i_ret < 0) { + FTS_DBG("failed writing 0x55 and 0xaa ! \n"); + continue; + } + + i_ret = HidI2c_To_StdI2c(client); + if (i_ret < 0) { + FTS_DBG("failed to Switch HidtoI2c Protocol ! \n"); + continue; + } + + /*********Step 3:check READ-ID***********************/ + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + /* : relate on bootloader FW */ + FTS_DBG + ("[FTS] Step 3: READ OK CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + continue; + } + } + + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + /*Step 4:erase app and panel paramenter area */ + FTS_DBG("Step 4:erase app and panel paramenter area\n"); + auc_i2c_write_buf[0] = 0x61; + fts_i2c_write(client, auc_i2c_write_buf, 1); + /*erase app area */ + auc_i2c_write_buf[0] = 0x63; + fts_i2c_write(client, auc_i2c_write_buf, 1); + /*erase panel paramenter area */ + auc_i2c_write_buf[0] = 0x04; + fts_i2c_write(client, auc_i2c_write_buf, 1); + /*erase panel paramenter area */ + msleep(fts_updateinfo_curr.delay_earse_flash); + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + FTS_DBG("Step 5:write firmware(FW) to ctpm flash\n"); + temp = 0; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + /*printk("FT5x26 Upgrade Func - dw_length:%d FTS_PACKET_LENGTH:%d\n,",dw_lenth,FTS_PACKET_LENGTH);*/ + /*printk("FT5x26 Upgrade Func - Packet Number:%d\n",packet_number);*/ + packet_buf[0] = 0xbf; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + /*printk("[FTS][%s] bt_ecc = %x \n", __func__, bt_ecc);*/ + fts_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + msleep(FTS_PACKET_LENGTH / 6 + 1); + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + fts_i2c_write(client, packet_buf, temp + 6); + msleep(20); + } + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DBG("Step 6: read out checksum\n"); + auc_i2c_write_buf[0] = 0xcc; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + printk(KERN_WARNING "Checksum FT5X26:%X %X \n", reg_val[0], bt_ecc); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, + "[FTS]--ecc error! fw_ecc=%02x flash_ecc=%02x\n", + reg_val[0], bt_ecc); + return -EIO; + } + + /*********Step 7: reset the new FW***********************/ + FTS_DBG("Step 7: reset the new FW\n"); + auc_i2c_write_buf[0] = 0x07; + fts_i2c_write(client, auc_i2c_write_buf, 1); + + /********Step 8 Disable Write Flash*****/ + FTS_DBG("Step 8: Disable Write Flash\n"); + auc_i2c_write_buf[0] = 0x04; + fts_i2c_write(client, auc_i2c_write_buf, 1); + + msleep(300); + /*make sure CTP startup normally */ + auc_i2c_write_buf[0] = auc_i2c_write_buf[1] = 0x00; + fts_i2c_write(client, auc_i2c_write_buf, 2); + + return 0; +} + +/************************************************************************ +* Name: fts_5x36_ctpm_fw_upgrade +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_5x36_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[2] = { 0 }; + u32 i = 0; + u8 is_5336_new_bootloader = 0; + u8 is_5336_fwsize_30 = 0; + u32 packet_number; + u32 j; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + int i_ret; + int fw_filenth = dw_lenth; + + if (pbt_buf[fw_filenth - 12] == 30) { + is_5336_fwsize_30 = 1; + } else { + is_5336_fwsize_30 = 0; + } + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register FTS_RST_CMD_REG1 */ + /*write 0xaa to register FTS_RST_CMD_REG1 */ + fts_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + + /*write 0x55 to register FTS_RST_CMD_REG1 */ + fts_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(fts_updateinfo_curr.delay_55); + + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + + /*********Step 3:check READ-ID***********************/ + msleep(fts_updateinfo_curr.delay_readid); + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + printk("[FTS] Step 3: CTPM ID OK,ID1 = 0x%x,ID2 = 0x%x\n", reg_val[0], reg_val[1]); + break; + } else { + printk("[FTS] Step 3: CTPM ID FAILD,ID1 = 0x%x,ID2 = 0x%x\n", reg_val[0], reg_val[1]); + continue; + } + + } + + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + + auc_i2c_write_buf[0] = 0xcd; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + /*********20130705 mshl ********************/ + if (reg_val[0] <= 4) { + is_5336_new_bootloader = BL_VERSION_LZ4; + } else if (reg_val[0] == 7) { + is_5336_new_bootloader = BL_VERSION_Z7; + } else if (reg_val[0] >= 0x0f) { + is_5336_new_bootloader = BL_VERSION_GZF; + } + + /*********Step 4:erase app and panel paramenter area ********************/ + if (is_5336_fwsize_30) { + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase app area */ + msleep(fts_updateinfo_curr.delay_earse_flash); + + auc_i2c_write_buf[0] = FTS_ERASE_PARAMS_CMD; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase config area */ + msleep(50); + } else { + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase app area */ + msleep(fts_updateinfo_curr.delay_earse_flash); + } + + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + + if (is_5336_new_bootloader == BL_VERSION_LZ4 + || is_5336_new_bootloader == BL_VERSION_Z7) { + dw_lenth = dw_lenth - 8; + } else if (is_5336_new_bootloader == BL_VERSION_GZF) { + dw_lenth = dw_lenth - 14; + } + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + packet_buf[1] = 0x00; + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + msleep(FTS_PACKET_LENGTH / 6 + 1); + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, temp + 6); + msleep(20); + } + /*send the last six byte */ + if (is_5336_new_bootloader == BL_VERSION_LZ4 + || is_5336_new_bootloader == BL_VERSION_Z7) { + for (i = 0; i < 6; i++) { + if (is_5336_new_bootloader == + BL_VERSION_Z7 /*&& DEVICE_IC_TYPE==IC_FT5x36 */) { + temp = 0x7bfa + i; + } else if (is_5336_new_bootloader == BL_VERSION_LZ4) { + temp = 0x6ffa + i; + } + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = 1; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + packet_buf[6] = pbt_buf[dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + fts_i2c_write(client, packet_buf, 7); + msleep(10); + } + } else if (is_5336_new_bootloader == BL_VERSION_GZF) { + for (i = 0; i < 12; i++) { + if (is_5336_fwsize_30 /*&& DEVICE_IC_TYPE==IC_FT5x36 */ + ) { + temp = 0x7ff4 + i; + } else if (1 /*DEVICE_IC_TYPE==IC_FT5x36 */) { + temp = 0x7bf4 + i; + } + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = 1; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + packet_buf[6] = pbt_buf[dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + fts_i2c_write(client, packet_buf, 7); + msleep(10); + } + } + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + auc_i2c_write_buf[0] = FTS_REG_ECC; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, + "[FTS]--ecc error! fw_ecc=%02x flash_ecc=%02x\n", + reg_val[0], bt_ecc); + return -EIO; + } + /*********Step 7: reset the new FW***********************/ + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); /*make sure CTP startup normally */ + + return 0; +} + +/************************************************************************ +* Name: fts_5822_ctpm_fw_upgrade +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_5822_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[4] = { 0 }; + u32 i = 0; + u32 packet_number; + u32 j; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + u8 bt_ecc_check; + int i_ret; + + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + fts_write_reg(client, 0xfc, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + fts_write_reg(client, 0xfc, FTS_UPGRADE_55); + msleep(200); + /*********Step 2:Enter upgrade mode *****/ + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + continue; + } + msleep(5); + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); /*: write 0xAA to 0x55 ??? */ + if (i_ret < 0) { + FTS_DBG("failed writing 0x55 and 0xaa ! \n"); + continue; + } + /*********Step 3:check READ-ID***********************/ + msleep(1); + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + /* : relate on bootloader FW */ + FTS_DBG + ("[FTS] Step 3: READ OK CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + continue; + } + } + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + /*Step 4:erase app and panel paramenter area */ + FTS_DBG("Step 4:erase app and panel paramenter area\n"); + auc_i2c_write_buf[0] = 0x61; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase app area : trigger erase command */ + msleep(1350); + for (i = 0; i < 15; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) { + break; + } + msleep(50); + } + printk("[FTS][%s] erase app area reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + /*write bin file length to FW bootloader. */ + auc_i2c_write_buf[0] = 0xB0; + auc_i2c_write_buf[1] = (u8) ((dw_lenth >> 16) & 0xFF); + auc_i2c_write_buf[2] = (u8) ((dw_lenth >> 8) & 0xFF); + auc_i2c_write_buf[3] = (u8) (dw_lenth & 0xFF); + fts_i2c_write(client, auc_i2c_write_buf, 4); + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + bt_ecc_check = 0; + FTS_DBG("Step 5:write firmware(FW) to ctpm flash\n"); + /*dw_lenth = dw_lenth - 8; */ + temp = 0; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = 0xbf; + packet_buf[1] = 0x00; + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc_check ^= pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + printk("[FTS][%s] bt_ecc = %x \n", __func__, bt_ecc); + if (bt_ecc != bt_ecc_check) + printk + ("[FTS][%s] Host checksum error bt_ecc_check = %x \n", + __func__, bt_ecc_check); + fts_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + /*msleep(10); */ + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + if ((j + 0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + printk("[FTS][%s] reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + msleep(1); + } + } + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc_check ^= + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + fts_i2c_write(client, packet_buf, temp + 6); + printk("[FTS][%s] bt_ecc = %x \n", __func__, bt_ecc); + if (bt_ecc != bt_ecc_check) + printk + ("[FTS][%s] Host checksum error bt_ecc_check = %x \n", + __func__, bt_ecc_check); + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + printk("[FTS][%s] reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + if ((j + 0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + printk("[FTS][%s] reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + msleep(1); + } + } + msleep(50); + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DBG("Step 6: read out checksum\n"); + auc_i2c_write_buf[0] = 0x64; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + temp = 0; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8) (temp >> 16); + auc_i2c_write_buf[2] = (u8) (temp >> 8); + auc_i2c_write_buf[3] = (u8) (temp); + temp = dw_lenth; + auc_i2c_write_buf[4] = (u8) (temp >> 8); + auc_i2c_write_buf[5] = (u8) (temp); + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth / 256); + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + dev_err(&client->dev, + "[FTS]--reg_val[0]=%02x reg_val[0]=%02x\n", reg_val[0], + reg_val[1]); + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + dev_err(&client->dev, + "[FTS]--reg_val[0]=%02x reg_val[0]=%02x\n", + reg_val[0], reg_val[1]); + break; + } + msleep(1); + } + auc_i2c_write_buf[0] = 0x66; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, + "[FTS]--ecc error! fw_ecc=%02x flash_ecc=%02x\n", + reg_val[0], bt_ecc); + return -EIO; + } + printk(KERN_WARNING "checksum fw_ecc=%X flash_ecc=%X \n", reg_val[0], + bt_ecc); + /*********Step 7: reset the new FW***********************/ + FTS_DBG("Step 7: reset the new FW\n"); + auc_i2c_write_buf[0] = 0x07; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(200); /*make sure CTP startup normally */ + i_ret = HidI2c_To_StdI2c(client); /*Android to Std i2c. */ + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + return 0; +} + +/************************************************************************ +* Name: fts_5x06_ctpm_fw_upgrade +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_5x06_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[2] = { 0 }; + u32 i = 0; + u32 packet_number; + u32 j; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + int i_ret; + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register FTS_RST_CMD_REG1 */ + fts_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + + /*write 0x55 to register FTS_RST_CMD_REG1 */ + fts_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(fts_updateinfo_curr.delay_55); + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + do { + i++; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + msleep(5); + } while (i_ret <= 0 && i < 5); + + /*********Step 3:check READ-ID***********************/ + msleep(fts_updateinfo_curr.delay_readid); + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + FTS_DBG + ("[FTS] Step 3: CTPM ID OK,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: CTPM ID FAIL,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + } + } + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + /*Step 4:erase app and panel paramenter area */ + FTS_DBG("Step 4:erase app and panel paramenter area\n"); + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase app area */ + msleep(fts_updateinfo_curr.delay_earse_flash); + /*erase panel parameter area */ + auc_i2c_write_buf[0] = FTS_ERASE_PARAMS_CMD; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(100); + + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + FTS_DBG("Step 5:write firmware(FW) to ctpm flash\n"); + dw_lenth = dw_lenth - 8; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + packet_buf[1] = 0x00; + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + fts_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + msleep(FTS_PACKET_LENGTH / 6 + 1); + } + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, temp + 6); + msleep(20); + } + /*send the last six byte */ + for (i = 0; i < 6; i++) { + temp = 0x6ffa + i; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = 1; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + packet_buf[6] = pbt_buf[dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + fts_i2c_write(client, packet_buf, 7); + msleep(20); + } + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DBG("Step 6: read out checksum\n"); + auc_i2c_write_buf[0] = FTS_REG_ECC; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, + "[FTS]--ecc error! fw_ecc=%02x flash_ecc=%02x\n", + reg_val[0], bt_ecc); + return -EIO; + } + /*********Step 7: reset the new FW***********************/ + FTS_DBG("Step 7: reset the new FW\n"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); /*make sure CTP startup normally */ + return 0; +} + +/************************************************************************ +* Name: fts_5x46_ctpm_fw_upgrade +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_5x46_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[4] = { 0 }; + u8 reg_val_i2c[2] = { 0 }; + u32 i = 0; + u32 packet_number; + u32 j; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + int i_ret; + + i_ret = HidI2c_To_StdI2c(client); + if (i_ret == 0) { + FTS_DBG("[FTS] hid change to i2c fail ! \n"); + } + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register FTS_RST_CMD_REG1 */ + fts_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + + /*write 0x55 to register FTS_RST_CMD_REG1 */ + fts_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(200); + /*********Step 2:Enter upgrade mode *****/ + i_ret = HidI2c_To_StdI2c(client); + + if (i_ret == 0) { + FTS_DBG("[FTS] hid change to i2c fail ! \n"); + continue; + } + msleep(10); + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + if (i_ret < 0) { + FTS_DBG("[FTS] failed writing 0x55 and 0xaa ! \n"); + continue; + } + /*********Step 3:check READ-ID***********************/ + msleep(1); + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = + auc_i2c_write_buf[3] = 0x00; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + /* : relate on bootloader FW */ + FTS_DBG + ("[FTS] Step 3: READ OK CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, + "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + + continue; + } + } + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + /*Step 4:erase app and panel paramenter area */ + FTS_DBG("Step 4:erase app and panel paramenter area\n"); + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + fts_i2c_write(client, auc_i2c_write_buf, 1); /*erase app area */ + msleep(1350); + for (i = 0; i < 15; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) { + break; + } + msleep(50); + } + printk("[FTS][%s] erase app area reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + /*write bin file length to FW bootloader. */ + auc_i2c_write_buf[0] = 0xB0; + auc_i2c_write_buf[1] = (u8) ((dw_lenth >> 16) & 0xFF); + auc_i2c_write_buf[2] = (u8) ((dw_lenth >> 8) & 0xFF); + auc_i2c_write_buf[3] = (u8) (dw_lenth & 0xFF); + fts_i2c_write(client, auc_i2c_write_buf, 4); + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + FTS_DBG("Step 5:write firmware(FW) to ctpm flash\n"); + /*dw_lenth = dw_lenth - 8; */ + temp = 0; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + fts_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + /*msleep(10); */ + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + if ((j + 0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + printk("[FTS][%s] reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + msleep(1); + } + } + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = + pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + fts_i2c_write(client, packet_buf, temp + 6); + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + printk("[FTS][%s] reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + if ((j + 0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + printk("[FTS][%s] reg_val[0] = %x reg_val[1] = %x \n", + __func__, reg_val[0], reg_val[1]); + msleep(1); + + } + } + + msleep(50); + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DBG("Step 6: read out checksum\n"); + fts_i2c_read(client, 0xcc, 1, reg_val_i2c, 1); + auc_i2c_write_buf[0] = 0x64; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + temp = 0; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8) (temp >> 16); + auc_i2c_write_buf[2] = (u8) (temp >> 8); + auc_i2c_write_buf[3] = (u8) (temp); + temp = dw_lenth; + auc_i2c_write_buf[4] = (u8) (temp >> 8); + auc_i2c_write_buf[5] = (u8) (temp); + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth / 256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + dev_err(&client->dev, + "[FTS]--reg_val[0]=%02x reg_val[0]=%02x\n", reg_val[0], + reg_val[1]); + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + dev_err(&client->dev, + "[FTS]--reg_val[0]=%02x reg_val[0]=%02x\n", + reg_val[0], reg_val[1]); + break; + } + msleep(1); + + } + auc_i2c_write_buf[0] = 0x66; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, + "[FTS]--ecc error! fw_ecc=%02x flash_ecc=%02x i2c_ecc=%2X\n", + reg_val[0], bt_ecc, reg_val_i2c[0]); + + return -EIO; + } + printk(KERN_WARNING "checksum fw_ecc=%X flash_ecc=%X i2c_ecc=%X \n", + reg_val[0], bt_ecc, reg_val_i2c[0]); + /*********Step 7: reset the new FW***********************/ + FTS_DBG("Step 7: reset the new FW\n"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(200); /*make sure CTP startup normally */ + i_ret = HidI2c_To_StdI2c(client); /*Android to Std i2c. */ + if (i_ret == 0) { + FTS_DBG("HidI2c change to StdI2c fail ! \n"); + } + return 0; +} + +/* +*note:the firmware default path is sdcard. + if you want to change the dir, please modify by yourself. +*/ +/************************************************************************ +* Name: fts_GetFirmwareSize +* Brief: get file size +* Input: file name +* Output: no +* Return: file size +***********************************************************************/ +static int fts_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +/************************************************************************ +* Name: fts_ReadFirmware +* Brief: read firmware buf for .bin file. +* Input: file name, data buf +* Output: data buf +* Return: 0 +***********************************************************************/ +/* +note:the firmware default path is sdcard. + if you want to change the dir, please modify by yourself. +*/ +static int fts_ReadFirmware(char *firmware_name, unsigned char *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, firmware_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_file +* Brief: upgrade with *.bin file +* Input: i2c info, file name +* Output: no +* Return: success =0 +***********************************************************************/ +int fts_ctpm_fw_upgrade_with_app_file(struct i2c_client *client, + char *firmware_name) +{ + u8 *pbt_buf = NULL; + int i_ret = 0; + int fwsize = fts_GetFirmwareSize(firmware_name); + if (fwsize <= 0) { + dev_err(&client->dev, "%s ERROR:Get firmware size failed\n", + __func__); + return -EIO; + } + if (fwsize < 8 || fwsize > 54 * 1024) { + dev_err(&client->dev, "FW length error\n"); + return -EIO; + } + /*=========FW upgrade========================*/ + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_ATOMIC); + if (fts_ReadFirmware(firmware_name, pbt_buf)) { + dev_err(&client->dev, "%s() - ERROR: request_firmware failed\n", + __func__); + kfree(pbt_buf); + return -EIO; + } + /*call the upgrade function */ + if ((fts_updateinfo_curr.CHIP_ID == 0x55) + || (fts_updateinfo_curr.CHIP_ID == 0x08) + || (fts_updateinfo_curr.CHIP_ID == 0x0a)) { + i_ret = fts_5x06_ctpm_fw_upgrade(client, pbt_buf, fwsize); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x11) + || (fts_updateinfo_curr.CHIP_ID == 0x12) + || (fts_updateinfo_curr.CHIP_ID == 0x13) + || (fts_updateinfo_curr.CHIP_ID == 0x14)) { + i_ret = fts_5x36_ctpm_fw_upgrade(client, pbt_buf, fwsize); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x06)) { + i_ret = fts_6x06_ctpm_fw_upgrade(client, pbt_buf, fwsize); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x36)) { + i_ret = fts_6x36_ctpm_fw_upgrade(client, pbt_buf, fwsize); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x54)) { + i_ret = fts_5x46_ctpm_fw_upgrade(client, pbt_buf, fwsize); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x58)) { + i_ret = fts_5822_ctpm_fw_upgrade(client, pbt_buf, fwsize); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x59)) { + i_ret = fts_5x26_ctpm_fw_upgrade(client, pbt_buf, fwsize); + } + if (i_ret != 0) + dev_err(&client->dev, "%s() - ERROR:[FTS] upgrade failed..\n", + __func__); + else if (fts_updateinfo_curr.AUTO_CLB == AUTO_CLB_NEED) { + fts_ctpm_auto_clb(client); + } + + kfree(pbt_buf); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_get_i_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +int fts_ctpm_get_i_file_ver(u8 vendor_id) +{ + u16 ui_sz; + if(vendor_id==OFILM_ID) { + ui_sz = sizeof(CTPM_FW_OFILM); + if (ui_sz > 2) + return CTPM_FW_OFILM[ui_sz - 2]; + } else if(vendor_id==TPV_ID) { + ui_sz = sizeof(CTPM_FW_TPV); + if (ui_sz > 2) + return CTPM_FW_TPV[ui_sz - 2]; + } + return 0x00; /*default value */ +} + +/************************************************************************ +* Name: fts_ctpm_update_project_setting +* Brief: update project setting, only update these settings for COB project, or for some special case +* Input: i2c info +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_ctpm_update_project_setting(struct i2c_client *client) +{ + u8 uc_i2c_addr; /*I2C slave address (7 bit address) */ + u8 uc_io_voltage; /*IO Voltage 0---3.3v; 1----1.8v */ + u8 uc_panel_factory_id; /*TP panel factory ID */ + u8 buf[FTS_SETTING_BUF_LEN]; + u8 reg_val[2] = { 0 }; + u8 auc_i2c_write_buf[10] = { 0 }; + u8 packet_buf[FTS_SETTING_BUF_LEN + 6]; + u32 i = 0; + int i_ret; + + uc_i2c_addr = client->addr; + uc_io_voltage = 0x0; + uc_panel_factory_id = 0x5a; + + /*Step 1:Reset CTPM + *write 0xaa to register 0xfc + */ + if (fts_updateinfo_curr.CHIP_ID == 0x06 + || fts_updateinfo_curr.CHIP_ID == 0x36) { + fts_write_reg(client, 0xbc, 0xaa); + } else { + fts_write_reg(client, 0xfc, 0xaa); + } + msleep(50); + + /*write 0x55 to register 0xfc */ + if (fts_updateinfo_curr.CHIP_ID == 0x06 + || fts_updateinfo_curr.CHIP_ID == 0x36) { + fts_write_reg(client, 0xbc, 0x55); + } else { + fts_write_reg(client, 0xfc, 0x55); + } + msleep(30); + + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = 0x55; + auc_i2c_write_buf[1] = 0xaa; + do { + i++; + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 2); + msleep(5); + } while (i_ret <= 0 && i < 5); + + /*********Step 3:check READ-ID***********************/ + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = auc_i2c_write_buf[3] = + 0x00; + + fts_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) + dev_dbg(&client->dev, + "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + else + return -EIO; + + auc_i2c_write_buf[0] = 0xcd; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + dev_dbg(&client->dev, "bootloader version = 0x%x\n", reg_val[0]); + + /*--------- read current project setting ---------- */ + /*set read start address */ + buf[0] = 0x3; + buf[1] = 0x0; + buf[2] = 0x78; + buf[3] = 0x0; + + fts_i2c_read(client, buf, 4, buf, FTS_SETTING_BUF_LEN); + dev_dbg(&client->dev, "[FTS] old setting: uc_i2c_addr = 0x%x,\ + uc_io_voltage = %d, uc_panel_factory_id = 0x%x\n", buf[0], buf[2], buf[4]); + + /*--------- Step 4:erase project setting --------------*/ + auc_i2c_write_buf[0] = 0x63; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(100); + + /*---------- Set new settings ---------------*/ + buf[0] = uc_i2c_addr; + buf[1] = ~uc_i2c_addr; + buf[2] = uc_io_voltage; + buf[3] = ~uc_io_voltage; + buf[4] = uc_panel_factory_id; + buf[5] = ~uc_panel_factory_id; + packet_buf[0] = 0xbf; + packet_buf[1] = 0x00; + packet_buf[2] = 0x78; + packet_buf[3] = 0x0; + packet_buf[4] = 0; + packet_buf[5] = FTS_SETTING_BUF_LEN; + + for (i = 0; i < FTS_SETTING_BUF_LEN; i++) + packet_buf[6 + i] = buf[i]; + + fts_i2c_write(client, packet_buf, FTS_SETTING_BUF_LEN + 6); + msleep(100); + + /********* reset the new FW***********************/ + auc_i2c_write_buf[0] = 0x07; + fts_i2c_write(client, auc_i2c_write_buf, 1); + + msleep(200); + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_i_file +* Brief: upgrade with *.i file +* Input: i2c info +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_ctpm_fw_upgrade_with_i_file(struct i2c_client *client,u8 vendor_id) +{ + u8 *pbt_buf = NULL; + int i_ret = 0; + int fw_len = 0; + + /*judge the fw that will be upgraded + * if illegal, then stop upgrade and return. + */ + if(vendor_id==OFILM_ID) { + fw_len= sizeof(CTPM_FW_OFILM); + pbt_buf = CTPM_FW_OFILM; + } else if(vendor_id==TPV_ID) { + fw_len= sizeof(CTPM_FW_TPV); + pbt_buf = CTPM_FW_TPV; + } + + if ((fts_updateinfo_curr.CHIP_ID == 0x11) + || (fts_updateinfo_curr.CHIP_ID == 0x12) + || (fts_updateinfo_curr.CHIP_ID == 0x13) + || (fts_updateinfo_curr.CHIP_ID == 0x14) + || (fts_updateinfo_curr.CHIP_ID == 0x55) + || (fts_updateinfo_curr.CHIP_ID == 0x06) + || (fts_updateinfo_curr.CHIP_ID == 0x0a) + || (fts_updateinfo_curr.CHIP_ID == 0x08)) { + if (fw_len < 8 || fw_len > 32 * 1024) { + dev_err(&client->dev, "%s:FW length error\n", __func__); + return -EIO; + } + + if ((pbt_buf[fw_len - 8] ^ pbt_buf[fw_len - 6]) == 0xFF + && (pbt_buf[fw_len - 7] ^ pbt_buf[fw_len - 5]) == 0xFF + && (pbt_buf[fw_len - 3] ^ pbt_buf[fw_len - 4]) == 0xFF) { + /*FW upgrade */ + /*pbt_buf = CTPM_FW;*/ + /*call the upgrade function */ + if ((fts_updateinfo_curr.CHIP_ID == 0x55) + || (fts_updateinfo_curr.CHIP_ID == 0x08) + || (fts_updateinfo_curr.CHIP_ID == 0x0a)) { + i_ret = fts_5x06_ctpm_fw_upgrade(client, pbt_buf, fw_len); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x11) + || (fts_updateinfo_curr.CHIP_ID == 0x12) + || (fts_updateinfo_curr.CHIP_ID == 0x13) + || (fts_updateinfo_curr.CHIP_ID == 0x14)) { + i_ret = fts_5x36_ctpm_fw_upgrade(client, pbt_buf, fw_len); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x06)) { + i_ret = fts_6x06_ctpm_fw_upgrade(client, pbt_buf, fw_len); + } + if (i_ret != 0) + dev_err(&client->dev, + "%s:upgrade failed. err.\n", __func__); + else if (fts_updateinfo_curr.AUTO_CLB == AUTO_CLB_NEED) { + fts_ctpm_auto_clb(client); + } + } else { + dev_err(&client->dev, "%s:FW format error\n", __func__); + return -EBADFD; + } + } else if ((fts_updateinfo_curr.CHIP_ID == 0x36)) { + if (fw_len < 8 || fw_len > 32 * 1024) { + dev_err(&client->dev, "%s:FW length error\n", __func__); + return -EIO; + } + i_ret = + fts_6x36_ctpm_fw_upgrade(client, pbt_buf, fw_len); + if (i_ret != 0) + dev_err(&client->dev, "%s:upgrade failed. err.\n", + __func__); + } else if ((fts_updateinfo_curr.CHIP_ID == 0x54)) { + if (fw_len < 8 || fw_len > 54 * 1024) { + pr_err("FW length error\n"); + return -EIO; + } + /*FW upgrade */ + /*call the upgrade function */ + i_ret = + fts_5x46_ctpm_fw_upgrade(client, pbt_buf, fw_len); + if (i_ret != 0) { + dev_err(&client->dev, "[FTS] upgrade failed. err=%d.\n", + i_ret); + } else { +#ifdef AUTO_CLB + fts_ctpm_auto_clb(client); /*start auto CLB */ +#endif + } + } else if ((fts_updateinfo_curr.CHIP_ID == 0x58)) { + if (fw_len < 8 || fw_len > 54 * 1024) { + pr_err("FW length error\n"); + return -EIO; + } + + /*FW upgrade */ + /*call the upgrade function */ + i_ret = + fts_5822_ctpm_fw_upgrade(client, pbt_buf, fw_len); + if (i_ret != 0) { + dev_err(&client->dev, "[FTS] upgrade failed. err=%d.\n", + i_ret); + } else { +#ifdef AUTO_CLB + fts_ctpm_auto_clb(client); /*start auto CLB */ +#endif + } + } else if ((fts_updateinfo_curr.CHIP_ID == 0x59)) { + if (fw_len < 8 || fw_len > 54 * 1024) { + pr_err("FW length error\n"); + return -EIO; + } + + /*FW upgrade */ + /*call the upgrade function */ + i_ret = + fts_5x26_ctpm_fw_upgrade(client, pbt_buf, fw_len); + if (i_ret != 0) { + dev_err(&client->dev, "[FTS] upgrade failed. err=%d.\n", + i_ret); + } else { +#ifdef AUTO_CLB + fts_ctpm_auto_clb(client); /*start auto CLB */ +#endif + } + } + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_auto_upgrade +* Brief: auto upgrade +* Input: i2c info +* Output: no +* Return: 0 +***********************************************************************/ +int fts_ctpm_auto_upgrade(struct i2c_client *client) +{ + u8 uc_host_fm_ver = FTS_REG_FW_VER; + u8 uc_tp_fm_ver; + u8 uc_tp_vendor_id = 0; + int i_ret,i; + u8 chip_id; + fts_read_reg(client, FTS_REG_CHIP_ID, &chip_id); + fts_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + for(i = 0; i <= 10; i++) { + fts_read_reg(client, FTS_REG_VENDOR_ID, &uc_tp_vendor_id); + if((uc_tp_vendor_id == OFILM_ID) || (uc_tp_vendor_id == TPV_ID)) /*0xf2 TPV | 0x51 OFilm*/ + break; + } + + uc_host_fm_ver = fts_ctpm_get_i_file_ver(uc_tp_vendor_id); + printk("[FTS] uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x, uc_tp_vendor_id = 0x%x\n", + uc_tp_fm_ver, uc_host_fm_ver, uc_tp_vendor_id); + /*if (uc_tp_fm_ver == FTS_REG_FW_VER || //the firmware in touch panel maybe corrupted + uc_tp_fm_ver < uc_host_fm_ver //the firmware in host flash is new, need upgrade* + ) */ + if ((0x12!=chip_id) || (uc_tp_fm_ver < uc_host_fm_ver)) { + msleep(100); + printk("[FTS] uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x\n", + uc_tp_fm_ver, uc_host_fm_ver); + i_ret = fts_ctpm_fw_upgrade_with_i_file(client,uc_tp_vendor_id); + if (i_ret == 0) { + msleep(300); + uc_host_fm_ver = fts_ctpm_get_i_file_ver(uc_tp_vendor_id); + printk("[FTS] upgrade to new version 0x%x\n", uc_host_fm_ver); + } else { + printk("[FTS] upgrade failed ret=%d.\n", i_ret); + return -EIO; + } + } + return 0; +} diff --git a/arch/arm/mach-mt8127/ford/touchpanel/ft_gesture_lib.h b/arch/arm/mach-mt8127/ford/touchpanel/ft_gesture_lib.h new file mode 100644 index 00000000000..df68ab3c719 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/ft_gesture_lib.h @@ -0,0 +1,24 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_ctl.c +* +* Author: +* +* Created: 2015-01-01 +* +* Abstract: function for hand recognition +* +************************************************************************/ +#ifndef __LINUX_FT_GESTURE_LIB_H__ +#define __LINUX_FT_GESTURE_LIB_H__ + +/*int fetch_object_sample(unsigned short *datax,unsigned short *datay,unsigned char *dataxy,short pointnum,unsigned long time_stamp);*/ + +int fetch_object_sample(unsigned char *buf, short pointnum); + +void init_para(int x_pixel, int y_pixel, int time_slot, int cut_x_pixel, int cut_y_pixel); + +/*ft_gesture_lib_v1.0_20140820.a*/ + +#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/goodix_tool.c b/arch/arm/mach-mt8127/ford/touchpanel/goodix_tool.c new file mode 100644 index 00000000000..675ee245cf2 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/goodix_tool.c @@ -0,0 +1,678 @@ +/* drivers/input/touchscreen/goodix_tool.c + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: V2.5 + * Release Date: 2015/01/21 + */ + +#include "tpd.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "cust_gpio_usage.h" +#include + +#include "tpd_custom_gt9xx.h" + + +#pragma pack(1) +typedef struct +{ + u8 wr; //write read flag£¬0:R 1:W 2:PID 3: + u8 flag; //0:no need flag/int 1: need flag 2:need int + u8 flag_addr[2]; //flag address + u8 flag_val; //flag val + u8 flag_relation; //flag_val:flag 0:not equal 1:equal 2:> 3:< + u16 circle; //polling cycle + u8 times; //plling times + u8 retry; //I2C retry times + u16 delay; //delay befor read or after write + u16 data_len; //data length + u8 addr_len; //address length + u8 addr[2]; //address + u8 res[3]; //reserved + u8 *data; //data pointer +} st_cmd_head; +#pragma pack() +st_cmd_head cmd_head; + +#define UPDATE_FUNCTIONS +#define DATA_LENGTH_UINT 512 +#define CMD_HEAD_LENGTH (sizeof(st_cmd_head) - sizeof(u8*)) +static char procname[20] = {0}; +extern struct i2c_client *i2c_client_point; +static struct i2c_client *gt_client = NULL; + +#ifdef UPDATE_FUNCTIONS +extern s32 gup_enter_update_mode(struct i2c_client *client); +extern void gup_leave_update_mode(void); +extern s32 gup_update_proc(void *dir); +#endif + +static struct proc_dir_entry *goodix_proc_entry; + +static ssize_t goodix_tool_read(struct file *, char __user *, size_t, loff_t *); +static ssize_t goodix_tool_write(struct file *, const char __user *, size_t, loff_t *); +static const struct file_operations tool_ops = { + .owner = THIS_MODULE, + .read = goodix_tool_read, + .write = goodix_tool_write, +}; + +static DEFINE_MUTEX(goodix_tool_mutex); + +//static s32 goodix_tool_write(struct file *filp, const char __user *buff, unsigned long len, void *data); +//static s32 goodix_tool_read( char *page, char **start, off_t off, int count, int *eof, void *data ); +static s32(*tool_i2c_read)(u8 *, u16); +static s32(*tool_i2c_write)(u8 *, u16); + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *client, s32 on); +#endif + +s32 DATA_LENGTH = 0; +s8 IC_TYPE[16] = "GT9XX"; + +static void tool_set_proc_name(char * procname) +{ + char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + char date[20] = {0}; + char month[4] = {0}; + int i = 0, n_month = 1, n_day = 0, n_year = 0; + + sprintf(date, "%s", __DATE__); + + //GTP_DEBUG("compile date: %s", date); + + sscanf(date, "%s %d %d", month, &n_day, &n_year); + + for (i = 0; i < 12; ++i) + { + if (!memcmp(months[i], month, 3)) + { + n_month = i+1; + break; + } + } + + sprintf(procname, "gmnode%04d%02d%02d", n_year, n_month, n_day); + //memset(procname, 0, 20); + //sprintf(procname, "goodix_tool"); + //GTP_DEBUG("procname = %s", procname); +} +static s32 tool_i2c_read_no_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + + ret = gtp_i2c_read(gt_client, buf, len + GTP_ADDR_LENGTH); + return ret; +} + +static s32 tool_i2c_write_no_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + + ret = gtp_i2c_write(gt_client, buf, len); + return ret; +} + +static s32 tool_i2c_read_with_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_read_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static s32 tool_i2c_write_with_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_write_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static void register_i2c_func(void) +{ +// if (!strncmp(IC_TYPE, "GT818", 5) || !strncmp(IC_TYPE, "GT816", 5) +// || !strncmp(IC_TYPE, "GT811", 5) || !strncmp(IC_TYPE, "GT818F", 6) +// || !strncmp(IC_TYPE, "GT827", 5) || !strncmp(IC_TYPE,"GT828", 5) +// || !strncmp(IC_TYPE, "GT813", 5)) + if (strncmp(IC_TYPE, "GT8110", 6) && strncmp(IC_TYPE, "GT8105", 6) + && strncmp(IC_TYPE, "GT801", 5) && strncmp(IC_TYPE, "GT800", 5) + && strncmp(IC_TYPE, "GT801PLUS", 9) && strncmp(IC_TYPE, "GT811", 5) + && strncmp(IC_TYPE, "GTxxx", 5) && strncmp(IC_TYPE, "GT9XX", 5)) + { + tool_i2c_read = tool_i2c_read_with_extra; + tool_i2c_write = tool_i2c_write_with_extra; + GTP_DEBUG("I2C function: with pre and end cmd!"); + } + else + { + tool_i2c_read = tool_i2c_read_no_extra; + tool_i2c_write = tool_i2c_write_no_extra; + GTP_INFO("I2C function: without pre and end cmd!"); + } +} + +static void unregister_i2c_func(void) +{ + tool_i2c_read = NULL; + tool_i2c_write = NULL; + GTP_INFO("I2C function: unregister i2c transfer function!"); +} + + +s32 init_wr_node(struct i2c_client *client) +{ + s32 i; + + gt_client = i2c_client_point; + + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.data = NULL; + + i = 5; + + while ((!cmd_head.data) && i) + { + cmd_head.data = kzalloc(i * DATA_LENGTH_UINT, GFP_KERNEL); + + if (NULL != cmd_head.data) + { + break; + } + + i--; + } + + if (i) + { + DATA_LENGTH = i * DATA_LENGTH_UINT - GTP_ADDR_LENGTH; + GTP_INFO("Applied memory size:%d.", DATA_LENGTH); + } + else + { + GTP_ERROR("Apply for memory failed."); + return FAIL; + } + + cmd_head.addr_len = 2; + cmd_head.retry = 5; + + register_i2c_func(); + + tool_set_proc_name(procname); + //goodix_proc_entry = create_proc_entry(procname, 0666, NULL); + goodix_proc_entry = proc_create(procname, 0660, NULL, &tool_ops); + if (goodix_proc_entry == NULL) + { + GTP_ERROR("Couldn't create proc entry!"); + return FAIL; + } + else + { + GTP_INFO("Create proc entry success!"); + //goodix_proc_entry->write_proc = goodix_tool_write; + //goodix_proc_entry->read_proc = goodix_tool_read; + } + + return SUCCESS; +} + +void uninit_wr_node(void) +{ + kfree(cmd_head.data); + cmd_head.data = NULL; + unregister_i2c_func(); + remove_proc_entry(procname, NULL); +} + +static u8 relation(u8 src, u8 dst, u8 rlt) +{ + u8 ret = 0; + + switch (rlt) + { + case 0: + ret = (src != dst) ? true : false; + break; + + case 1: + ret = (src == dst) ? true : false; + GTP_DEBUG("equal:src:0x%02x dst:0x%02x ret:%d.", src, dst, (s32)ret); + break; + + case 2: + ret = (src > dst) ? true : false; + break; + + case 3: + ret = (src < dst) ? true : false; + break; + + case 4: + ret = (src & dst) ? true : false; + break; + + case 5: + ret = (!(src | dst)) ? true : false; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/******************************************************* +Function: + Comfirm function. +Input: + None. +Output: + Return write length. +********************************************************/ +static u8 comfirm(void) +{ + s32 i = 0; + u8 buf[32]; + +// memcpy(&buf[GTP_ADDR_LENGTH - cmd_head.addr_len], &cmd_head.flag_addr, cmd_head.addr_len); +// memcpy(buf, &cmd_head.flag_addr, cmd_head.addr_len);//Modified by Scott, 2012-02-17 + memcpy(buf, cmd_head.flag_addr, cmd_head.addr_len); + + for (i = 0; i < cmd_head.times; i++) + { + if (tool_i2c_read(buf, 1) <= 0) + { + GTP_ERROR("Read flag data failed!"); + return FAIL; + } + + if (true == relation(buf[GTP_ADDR_LENGTH], cmd_head.flag_val, cmd_head.flag_relation)) + { + GTP_DEBUG("value at flag addr:0x%02x.", buf[GTP_ADDR_LENGTH]); + GTP_DEBUG("flag value:0x%02x.", cmd_head.flag_val); + break; + } + + msleep(cmd_head.circle); + } + + if (i >= cmd_head.times) + { + GTP_ERROR("Didn't get the flag to continue!"); + return FAIL; + } + + return SUCCESS; +} + +/******************************************************* +Function: + Goodix tool write function. +Input: + standard proc write function param. +Output: + Return write length. +********************************************************/ +//static s32 goodix_tool_write(struct file *filp, const char __user *buff, unsigned long len, void *data) +ssize_t goodix_tool_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + s32 ret = 0; + u8 *dataptr = NULL; + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8 *)buff, len); + + mutex_lock(&goodix_tool_mutex); + ret = copy_from_user(&cmd_head, buff, CMD_HEAD_LENGTH); + + if (ret) + { + GTP_ERROR("copy_from_user failed."); + ret = -EPERM; + goto exit; + } + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buff[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) + { + if (cmd_head.data_len > DATA_LENGTH) + { + ret = -EPERM; + goto exit; + } + + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (ret) + { + GTP_ERROR("copy_from_user failed."); + ret = -EPERM; + goto exit; + } + + if (cmd_head.addr_len > GTP_ADDR_LENGTH) + { + ret = -EPERM; + goto exit; + } + + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8 *)&buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) + { + if (FAIL == comfirm()) + { + GTP_ERROR("[WRITE]Comfirm fail!"); + ret = -EPERM; + goto exit; + } + } + else if (2 == cmd_head.flag) + { + //Need interrupt! + } + + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) + { + GTP_ERROR("[WRITE]Write data failed!"); + ret = -EPERM; + goto exit; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.data_len + cmd_head.addr_len); + + if (cmd_head.delay) + { + msleep(cmd_head.delay); + } + } + else if (3 == cmd_head.wr) //Write ic type + { + if (cmd_head.data_len > (DATA_LENGTH + GTP_ADDR_LENGTH)) + { + ret = -EPERM; + goto exit; + } + + ret = copy_from_user(&cmd_head.data[0], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if(ret) + { + GTP_ERROR("copy_from_user failed."); + ret = -EPERM; + goto exit; + } + + if (cmd_head.data_len > sizeof(IC_TYPE)) + { + ret = -EPERM; + goto exit; + } + + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + register_i2c_func(); + } + else if (5 == cmd_head.wr) + { + //memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + } + else if (7 == cmd_head.wr)//disable irq! + { + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + #if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_OFF); + #endif + } + else if (9 == cmd_head.wr) //enable irq! + { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + #if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_ON); + #endif + } + else if (17 == cmd_head.wr) + { + if (cmd_head.data_len > DATA_LENGTH) + { + ret = -EPERM; + goto exit; + } + + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (ret) + { + GTP_DEBUG("copy_from_user failed."); + ret = -EPERM; + goto exit; + } + + if (cmd_head.data[GTP_ADDR_LENGTH]) + { + GTP_DEBUG("gtp enter rawdiff."); + gtp_rawdiff_mode = true; + } + else + { + gtp_rawdiff_mode = false; + GTP_DEBUG("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) //Enter update mode! + { + if (FAIL == gup_enter_update_mode(gt_client)) + { + ret = -EPERM; + goto exit; + } + } + else if (13 == cmd_head.wr)//Leave update mode! + { + gup_leave_update_mode(); + } + else if (15 == cmd_head.wr) //Update firmware! + { + show_len = 0; + total_len = 0; + if ((cmd_head.data_len + 1) > (DATA_LENGTH + GTP_ADDR_LENGTH)) + { + ret = -EPERM; + goto exit; + } + + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (FAIL == gup_update_proc((void *)cmd_head.data)) + { + ret = -EPERM; + goto exit; + } + } + +#endif + +exit: + dataptr = cmd_head.data; + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.wr = 0xFF; + cmd_head.data = dataptr; + + mutex_unlock(&goodix_tool_mutex); + return len; +} + +/******************************************************* +Function: + Goodix tool read function. +Input: + standard proc read function param. +Output: + Return read length. +********************************************************/ +//static s32 goodix_tool_read( char *page, char **start, off_t off, int count, int *eof, void *data ) +ssize_t goodix_tool_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (*ppos) // ADB call again + { + //GTP_DEBUG("[HEAD]wr: %d", cmd_head.wr); + //GTP_DEBUG("[PARAM]size: %d, *ppos: %d", size, (int)*ppos); + //GTP_DEBUG("[TOOL_READ]ADB call again, return it."); + *ppos = 0; + return 0; + } + + mutex_lock(&goodix_tool_mutex); + if (cmd_head.wr % 2) + { + mutex_unlock(&goodix_tool_mutex); + return -EPERM; + } + else if (!cmd_head.wr) + { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) + { + if (FAIL == comfirm()) + { + mutex_unlock(&goodix_tool_mutex); + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } + else if (2 == cmd_head.flag) + { + //Need interrupt! + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) + { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while (data_len > 0) + { + if (data_len > DATA_LENGTH) + { + len = DATA_LENGTH; + } + else + { + len = data_len; + } + + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) + { + mutex_unlock(&goodix_tool_mutex); + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + //memcpy(&page[loc], &cmd_head.data[GTP_ADDR_LENGTH], len); + ret = simple_read_from_buffer(&page[loc], size, ppos, &cmd_head.data[GTP_ADDR_LENGTH], len); + if (ret < 0) + { + mutex_unlock(&goodix_tool_mutex); + return ret; + } + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(page, len); + } + mutex_unlock(&goodix_tool_mutex); + return cmd_head.data_len; + } + else if (2 == cmd_head.wr) + { + ret = simple_read_from_buffer(page, size, ppos, IC_TYPE, sizeof(IC_TYPE)); + mutex_unlock(&goodix_tool_mutex); + return ret; + } + else if (4 == cmd_head.wr) + { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + + ret = simple_read_from_buffer(page, size, ppos, progress_buf, 4); + mutex_unlock(&goodix_tool_mutex); + return ret; + } + else if (6 == cmd_head.wr) + { + //Read error code! + } + else if (8 == cmd_head.wr) //Read driver version + { + ret = simple_read_from_buffer(page, size, ppos, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + mutex_unlock(&goodix_tool_mutex); + return ret; + } + + mutex_unlock(&goodix_tool_mutex); + return -EPERM; +} diff --git a/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_driver.c b/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_driver.c new file mode 100644 index 00000000000..cc4d8aeda09 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_driver.c @@ -0,0 +1,1509 @@ +/****************************************************************************** + + Copyright (C), 2010-2012, Silead, Inc. + + ****************************************************************************** +Filename : gsl1680-d0.c +Version : R2.0 +Aurthor : mark_huang +Creattime : 2012.6.20 +Description : Driver for Silead I2C touchscreen. + + ******************************************************************************/ +#include "tpd.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "gsl_ts_driver.h" + +extern struct tpd_device *tpd; + +static struct gsl_ts_data *ddata = NULL; + +static int boot_mode = NORMAL_BOOT; + +#define GSL_DEV_NAME "gsl1680" + +#define I2C_TRANS_SPEED 400 /*100 khz or 400 khz*/ +#define TPD_REG_BASE 0x00 + +static const struct i2c_device_id gsl_device_id[] = { {"gsl_tp", 0}, {} }; +static unsigned short force[] = { 0, 0x80, I2C_CLIENT_END, I2C_CLIENT_END }; +static const unsigned short *const forces[] = { force, NULL }; +static struct i2c_board_info __initdata i2c_tpd = { I2C_BOARD_INFO("gsl_tp", (0x80 >> 1)) }; + +static volatile int gsl_halt_flag = 0; +static struct mutex gsl_i2c_lock; + +#ifdef TPD_PROXIMITY +#include +#include +#include +#include +static u8 tpd_proximity_flag; /*flag whether start alps*/ +static u8 tpd_proximity_detect = 1; /*0-->close ; 1--> far away*/ +static struct wake_lock ps_lock; +static u8 gsl_psensor_data[8] = { 0 }; + +static int gsl_ps_enable; +#endif + +#ifdef GSL_TIMER +#define GSL_TIMER_CHECK_CIRCLE 200 +static struct delayed_work gsl_timer_check_work; +static struct workqueue_struct *gsl_timer_workqueue = NULL; +static char int_1st[4]; +static char int_2nd[4]; +#endif + +#ifdef TPD_PROC_DEBUG +#include +#include +#include +static struct proc_dir_entry *gsl_config_proc = NULL; +#define GSL_CONFIG_PROC_FILE "gsl_config" +#define CONFIG_LEN 31 +static char gsl_read[CONFIG_LEN]; +static u8 gsl_data_proc[8] = { 0 }; + +static u8 gsl_proc_flag = 0; +#endif + +static DECLARE_WAIT_QUEUE_HEAD(waiter); +static struct task_struct *thread = NULL; +static int tpd_flag = 0; + +#ifdef GSL_DEBUG +#define print_info(fmt, args...) \ + do{ \ + printk("[tp-gsl][%s]"fmt,__func__, ##args); \ + }while(0) +#else +#define print_info(fmt, args...) +#endif + +#ifdef TPD_HAVE_BUTTON +extern void tpd_button(unsigned int x, unsigned int y, unsigned int down); +static int tpd_keys_local[TPD_KEY_COUNT] = TPD_KEYS; +static int tpd_keys_dim_local[TPD_KEY_COUNT][4] = TPD_KEYS_DIM; +#endif + +static int gsl_read_interface(struct i2c_client *client, + u8 reg, u8 *buf, u32 num) +{ + int err = 0; + int i; + u8 temp = reg; + mutex_lock(&gsl_i2c_lock); + if (temp < 0x80) { + temp = (temp + 8) & 0x5c; + i2c_master_send(client, &temp, 1); + err = i2c_master_recv(client, &buf[0], 4); + temp = reg; + i2c_master_send(client, &temp, 1); + err = i2c_master_recv(client, &buf[0], 4); + } + for (i = 0; i < num;) { + temp = reg + i; + i2c_master_send(client, &temp, 1); + if ((i + 8) < num) + err = i2c_master_recv(client, (buf + i), 8); + else + err = i2c_master_recv(client, (buf + i), (num - i)); + i += 8; + } + mutex_unlock(&gsl_i2c_lock); + + return err; +} + +static int gsl_write_interface(struct i2c_client *client, + const u8 reg, u8 *buf, u32 num) +{ + struct i2c_msg xfer_msg[1] = { 0 }; + int err; + u8 tmp_buf[num + 1]; + + tmp_buf[0] = reg; + memcpy(tmp_buf + 1, buf, num); + + xfer_msg[0].addr = client->addr; + xfer_msg[0].len = num + 1; + xfer_msg[0].flags = 0; /*client->flags & I2C_M_TEN*/ + xfer_msg[0].buf = tmp_buf; + xfer_msg[0].timing = 400; /*I2C_TRANS_SPEED;*/ + mutex_lock(&gsl_i2c_lock); + + err = i2c_transfer(client->adapter, xfer_msg, 1); + mutex_unlock(&gsl_i2c_lock); + + return err; +} + +#ifdef GSL_GPIO_IDT_TP +static int gsl_read_TotalAdr(struct i2c_client *client, u32 addr, u32 *data) +{ + u8 buf[4]; + int err; + buf[3] = (u8) ((addr / 0x80) >> 24); + buf[2] = (u8) ((addr / 0x80) >> 16); + buf[1] = (u8) ((addr / 0x80) >> 8); + buf[0] = (u8) ((addr / 0x80)); + gsl_write_interface(client, 0xf0, buf, 4); + err = gsl_read_interface(client, addr % 0x80, buf, 4); + if (err > 0) { + *data = + (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + } + return err; +} + +static int gsl_write_TotalAdr(struct i2c_client *client, u32 addr, u32 *data) +{ + int err; + u8 buf[4]; + u32 value = *data; + buf[3] = (u8) ((addr / 0x80) >> 24); + buf[2] = (u8) ((addr / 0x80) >> 16); + buf[1] = (u8) ((addr / 0x80) >> 8); + buf[0] = (u8) ((addr / 0x80)); + gsl_write_interface(client, 0xf0, buf, 4); + buf[3] = (u8) ((value) >> 24); + buf[2] = (u8) ((value) >> 16); + buf[1] = (u8) ((value) >> 8); + buf[0] = (u8) ((value)); + err = gsl_write_interface(client, addr % 0x80, buf, 4); + return err; +} + +static int gsl_gpio_idt_tp(struct gsl_ts_data *ts) +{ + int i; + u32 value = 0; + u32 ru, rd, tu, td; + u8 rstate, tstate; + value = 0x1; + gsl_write_TotalAdr(ts->client, 0xff000084, &value); + for (i = 0; i < 3; i++) { + gsl_read_TotalAdr(ts->client, 0xff020004, &value); + } + ru = value & 0x1; + value = 0x00011112; + gsl_write_TotalAdr(ts->client, 0xff080058, &value); + + for (i = 0; i < 3; i++) { + gsl_read_TotalAdr(ts->client, 0xff020004, &value); + } + tu = (value & (0x1 << 1)) >> 1; + + value = 0x2; + gsl_write_TotalAdr(ts->client, 0xff000084, &value); + for (i = 0; i < 3; i++) { + gsl_read_TotalAdr(ts->client, 0xff020004, &value); + } + rd = value & 0x1; + value = 0x00011110; + gsl_write_TotalAdr(ts->client, 0xff080058, &value); + + for (i = 0; i < 3; i++) { + gsl_read_TotalAdr(ts->client, 0xff020004, &value); + } + td = (value & (0x1 << 1)) >> 1; + print_info("[tpd_gsl][%s] [ru,rd]=[%d,%d]\n", __func__, ru, rd); + print_info("[tpd_gsl][%s] [tu,td]=[%d,%d]\n", __func__, tu, td); + if (ru == 0 && rd == 0) + rstate = 0; + else if (ru == 1 && rd == 1) + rstate = 1; + else if (ru == 1 && rd == 0) + rstate = 2; + + if (tu == 0 && td == 0) + tstate = 0; + else if (tu == 1 && td == 1) + tstate = 1; + else if (tu == 1 && td == 0) + tstate = 2; + if (rstate == 1 && tstate == 0) { + gsl_cfg_index = 0; + } else if (rstate == 1 && tstate == 2) { + gsl_cfg_index = 1; + } else if (rstate == 2 && tstate == 2) { + gsl_cfg_index = 2; + } else if (rstate == 0 && tstate == 0) { + gsl_cfg_index = 3; + } + print_info("[tpd-gsl][%s] [rstate,status]=[%d,%d]\n", __func__, rstate, + tstate); + return 1; +} +#endif +static int gsl_test_i2c(struct i2c_client *client) +{ + int i, err; + u8 buf[4] = { 0 }; + for (i = 0; i < 5; i++) { + err = gsl_read_interface(client, 0xfc, buf, 4); + if (err > 0) { + printk("[tp-gsl] i2c read 0xfc = 0x%02x%02x%02x%02x\n", + buf[3], buf[2], buf[1], buf[0]); + break; + } + } + if (err < 0) + err = -1; + else + err = 0; + + return err; +} + +static void gsl_io_control(struct i2c_client *client) +{ + u8 buf[4] = { 0 }; + int i; +#if GSL9XX_VDDIO_1800 + for (i = 0; i < 5; i++) { + buf[0] = 0; + buf[1] = 0; + buf[2] = 0xfe; + buf[3] = 0x1; + gsl_write_interface(client, 0xf0, buf, 4); + buf[0] = 0x5; + buf[1] = 0; + buf[2] = 0; + buf[3] = 0x80; + gsl_write_interface(client, 0x78, buf, 4); + msleep(5); + } + msleep(50); +#endif +} + +static void gsl_start_core(struct i2c_client *client) +{ + u8 buf[4] = { 0 }; + buf[0] = 0; + gsl_write_interface(client, 0xe0, buf, 4); +#ifdef GSL_ALG_ID + gsl_DataInit(gsl_cfg_table[gsl_cfg_index].data_id); +#endif +} + +static void gsl_reset_core(struct i2c_client *client) +{ + u8 buf[4] = { 0x00 }; + + buf[0] = 0x88; + gsl_write_interface(client, 0xe0, buf, 4); + msleep(5); + + buf[0] = 0x04; + gsl_write_interface(client, 0xe4, buf, 4); + msleep(5); + + buf[0] = 0; + gsl_write_interface(client, 0xbc, buf, 4); + msleep(5); + gsl_io_control(client); +} + +static void gsl_clear_reg(struct i2c_client *client) +{ + u8 buf[4] = { 0 }; + /*clear reg*/ + buf[0] = 0x88; + gsl_write_interface(client, 0xe0, buf, 4); + msleep(20); + buf[0] = 0x3; + gsl_write_interface(client, 0x80, buf, 4); + msleep(5); + buf[0] = 0x4; + gsl_write_interface(client, 0xe4, buf, 4); + msleep(5); + buf[0] = 0x0; + gsl_write_interface(client, 0xe0, buf, 4); + msleep(20); + /*clear reg*/ +} + +#if 0 +#define DMA_TRANS_LEN 0x20 +static void gsl_load_fw(struct i2c_client *client, + const struct fw_data *GSL_DOWNLOAD_DATA, int data_len) +{ + u8 buf[DMA_TRANS_LEN * 4] = { 0 }; + u8 send_flag = 1; + u8 addr = 0; + u32 source_line = 0; + u32 source_len = data_len; + print_info("=============gsl_load_fw start==============\n"); + + for (source_line = 0; source_line < source_len; source_line++) { + /* init page trans, set the page val */ + if (0xf0 == GSL_DOWNLOAD_DATA[source_line].offset) { + memcpy(buf, &GSL_DOWNLOAD_DATA[source_line].val, 4); + gsl_write_interface(client, 0xf0, buf, 4); + send_flag = 1; + } else { + if (1 == + send_flag % (DMA_TRANS_LEN < + 0x20 ? DMA_TRANS_LEN : 0x20)) + addr = + (u8) GSL_DOWNLOAD_DATA[source_line].offset; + + memcpy((buf + send_flag * 4 - 4), + &GSL_DOWNLOAD_DATA[source_line].val, 4); + + if (0 == + send_flag % (DMA_TRANS_LEN < + 0x20 ? DMA_TRANS_LEN : 0x20)) { + gsl_write_interface(client, addr, buf, + DMA_TRANS_LEN * 4); + send_flag = 0; + } + + send_flag++; + } + } + + print_info("=============gsl_load_fw end==============\n"); + +} +#else +static void gsl_load_fw(struct i2c_client *client, + const struct fw_data *GSL_DOWNLOAD_DATA, int data_len) +{ + u8 buf[4] = { 0 }; + /*u8 send_flag = 1;*/ + u8 addr = 0; + u32 source_line = 0; + u32 source_len = data_len; /*ARRAY_SIZE(GSL_DOWNLOAD_DATA);*/ + + print_info("=============gsl_load_fw start==============\n"); + + for (source_line = 0; source_line < source_len; source_line++) { + /* init page trans, set the page val */ + addr = (u8) GSL_DOWNLOAD_DATA[source_line].offset; + memcpy(buf, &GSL_DOWNLOAD_DATA[source_line].val, 4); + gsl_write_interface(client, addr, buf, 4); + } +} +#endif + +static void gsl_sw_init(struct i2c_client *client) +{ + int temp; + static volatile int gsl_sw_flag; + if (1 == gsl_sw_flag) + return; + gsl_sw_flag = 1; + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); + msleep(20); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + msleep(20); + + temp = gsl_test_i2c(client); + if (temp < 0) { + gsl_sw_flag = 0; + return; + } + + gsl_clear_reg(client); + gsl_reset_core(client); + + gsl_io_control(client); + gsl_load_fw(client, gsl_cfg_table[gsl_cfg_index].fw, + gsl_cfg_table[gsl_cfg_index].fw_size); + gsl_io_control(client); + + gsl_start_core(client); + gsl_sw_flag = 0; +} + +static void check_mem_data(struct i2c_client *client) +{ + char read_buf[4] = { 0 }; + gsl_read_interface(client, 0xb0, read_buf, 4); + + print_info("[gsl1680][%s] addr = 0xb0; read_buf = %02x%02x%02x%02x\n", + __func__, read_buf[3], read_buf[2], read_buf[1], + read_buf[0]); + if (read_buf[3] != 0x5a || read_buf[2] != 0x5a || read_buf[1] != 0x5a + || read_buf[0] != 0x5a) { + gsl_sw_init(client); + } +} + +#ifdef TPD_PROC_DEBUG +#define GSL_APPLICATION +#ifdef GSL_APPLICATION +static int gsl_read_MorePage(struct i2c_client *client, u32 addr, u8 *buf, + u32 num) +{ + int i; + u8 tmp_buf[4] = { 0 }; + u8 tmp_addr; + for (i = 0; i < num / 8; i++) { + tmp_buf[0] = (char)((addr + i * 8) / 0x80); + tmp_buf[1] = (char)(((addr + i * 8) / 0x80) >> 8); + tmp_buf[2] = (char)(((addr + i * 8) / 0x80) >> 16); + tmp_buf[3] = (char)(((addr + i * 8) / 0x80) >> 24); + gsl_write_interface(client, 0xf0, tmp_buf, 4); + tmp_addr = (char)((addr + i * 8) % 0x80); + gsl_read_interface(client, tmp_addr, (buf + i * 8), 8); + } + if (i * 8 < num) { + tmp_buf[0] = (char)((addr + i * 8) / 0x80); + tmp_buf[1] = (char)(((addr + i * 8) / 0x80) >> 8); + tmp_buf[2] = (char)(((addr + i * 8) / 0x80) >> 16); + tmp_buf[3] = (char)(((addr + i * 8) / 0x80) >> 24); + gsl_write_interface(client, 0xf0, tmp_buf, 4); + tmp_addr = (char)((addr + i * 8) % 0x80); + gsl_read_interface(client, tmp_addr, (buf + i * 8), 4); + } +} +#endif +static int char_to_int(char ch) +{ + if (ch >= '0' && ch <= '9') { + ch = (ch - '0'); + return ch; + } else { + ch = (ch - 'a' + 10); + return ch; + } +} + +/*static int gsl_config_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data)*/ +static int gsl_config_read_proc(struct seq_file *m, void *v) +{ + char temp_data[5] = { 0 }; + + unsigned int tmp = 0; + if ('v' == gsl_read[0] && 's' == gsl_read[1]) { +#ifdef GSL_ALG_ID + tmp = gsl_version_id(); +#else + tmp = 0x20121215; +#endif + seq_printf(m, "version:%x\n", tmp); + } else if ('r' == gsl_read[0] && 'e' == gsl_read[1]) { + if ('i' == gsl_read[3]) { +#ifdef GSL_ALG_ID + tmp = (gsl_data_proc[5] << 8) | gsl_data_proc[4]; + seq_printf(m, "gsl_config_data_id[%d] = ", tmp); + if (tmp >= 0 + && tmp < gsl_cfg_table[gsl_cfg_index].data_size) + seq_printf(m, "%d\n", + gsl_cfg_table[gsl_cfg_index]. + data_id[tmp]); +#endif + } else { + gsl_write_interface(ddata->client, 0xf0, + &gsl_data_proc[4], 4); + gsl_read_interface(ddata->client, gsl_data_proc[0], + temp_data, 4); + seq_printf(m, "offset : {0x%02x,0x", gsl_data_proc[0]); + seq_printf(m, "%02x", temp_data[3]); + seq_printf(m, "%02x", temp_data[2]); + seq_printf(m, "%02x", temp_data[1]); + seq_printf(m, "%02x};\n", temp_data[0]); + } + } +#ifdef GSL_APPLICATION + else if ('a' == gsl_read[0] && 'p' == gsl_read[1]) { + char *buf; + int temp1; + tmp = + (unsigned int)(((gsl_data_proc[2] << 8) | gsl_data_proc[1]) + & 0xffff); + buf = kzalloc(tmp, GFP_KERNEL); + if (buf == NULL) + return -1; + if (3 == gsl_data_proc[0]) { + gsl_read_interface(ddata->client, gsl_data_proc[3], buf, + tmp); + if (tmp < m->size) { + memcpy(m->buf, buf, tmp); + } + } else if (4 == gsl_data_proc[0]) { + temp1 = + ((gsl_data_proc[6] << 24) | (gsl_data_proc[5] << 16) + | (gsl_data_proc[4] << 8) | gsl_data_proc[3]); + gsl_read_MorePage(ddata->client, temp1, buf, tmp); + if (tmp < m->size) { + memcpy(m->buf, buf, tmp); + } + } + kfree(buf); + } +#endif + return 0; +} + +static int gsl_config_write_proc(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + u8 buf[8] = { 0 }; + char temp_buf[CONFIG_LEN]; + char *path_buf; + int tmp = 0; + int tmp1 = 0; + print_info("[tp-gsl][%s] \n", __func__); + if (count > 512) { + print_info("size not match [%d:%ld]\n", CONFIG_LEN, count); + return -EFAULT; + } + path_buf = kzalloc(count, GFP_KERNEL); + if (!path_buf) { + printk("alloc path_buf memory error \n"); + return -1; + } + if (copy_from_user(path_buf, buffer, count)) { + print_info("copy from user fail\n"); + goto exit_write_proc_out; + } + memcpy(temp_buf, path_buf, (count < CONFIG_LEN ? count : CONFIG_LEN)); + print_info("[tp-gsl][%s][%s]\n", __func__, temp_buf); +#ifdef GSL_APPLICATION + if ('a' != temp_buf[0] || 'p' != temp_buf[1]) { +#endif + buf[3] = + char_to_int(temp_buf[14]) << 4 | char_to_int(temp_buf[15]); + buf[2] = + char_to_int(temp_buf[16]) << 4 | char_to_int(temp_buf[17]); + buf[1] = + char_to_int(temp_buf[18]) << 4 | char_to_int(temp_buf[19]); + buf[0] = + char_to_int(temp_buf[20]) << 4 | char_to_int(temp_buf[21]); + + buf[7] = + char_to_int(temp_buf[5]) << 4 | char_to_int(temp_buf[6]); + buf[6] = + char_to_int(temp_buf[7]) << 4 | char_to_int(temp_buf[8]); + buf[5] = + char_to_int(temp_buf[9]) << 4 | char_to_int(temp_buf[10]); + buf[4] = + char_to_int(temp_buf[11]) << 4 | char_to_int(temp_buf[12]); +#ifdef GSL_APPLICATION + } +#endif + if ('v' == temp_buf[0] && 's' == temp_buf[1]) /*version //vs*/ + { + memcpy(gsl_read, temp_buf, 4); + printk("gsl version\n"); + } else if ('s' == temp_buf[0] && 't' == temp_buf[1]) /*start //st*/ + { +#ifdef GSL_TIMER + cancel_delayed_work_sync(&gsl_timer_check_work); +#endif + gsl_proc_flag = 1; + gsl_reset_core(ddata->client); + } else if ('e' == temp_buf[0] && 'n' == temp_buf[1]) /*end //en*/ + { + msleep(20); + gsl_reset_core(ddata->client); + gsl_start_core(ddata->client); + gsl_proc_flag = 0; + } else if ('r' == temp_buf[0] && 'e' == temp_buf[1]) /*read buf /*/ + { + memcpy(gsl_read, temp_buf, 4); + memcpy(gsl_data_proc, buf, 8); + } else if ('w' == temp_buf[0] && 'r' == temp_buf[1]) /*write buf*/ + { + gsl_write_interface(ddata->client, buf[4], buf, 4); + } +#ifdef GSL_ALG_ID + else if ('i' == temp_buf[0] && 'd' == temp_buf[1]) /*write id config*/ + { + tmp1 = (buf[7] << 24) | (buf[6] << 16) | (buf[5] << 8) | buf[4]; + tmp = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + if (tmp1 >= 0 && tmp1 < gsl_cfg_table[gsl_cfg_index].data_size) { + gsl_cfg_table[gsl_cfg_index].data_id[tmp1] = tmp; + } + } +#endif +#ifdef GSL_APPLICATION + else if ('a' == temp_buf[0] && 'p' == temp_buf[1]) { + if (1 == path_buf[3]) { + tmp = ((path_buf[5] << 8) | path_buf[4]); + gsl_write_interface(ddata->client, path_buf[6], + &path_buf[10], tmp); + } else if (2 == path_buf[3]) { + tmp = ((path_buf[5] << 8) | path_buf[4]); + tmp1 = + ((path_buf[9] << 24) | (path_buf[8] << 16) | + (path_buf[7] << 8) + | path_buf[6]); + buf[0] = (char)((tmp1 / 0x80) & 0xff); + buf[1] = (char)(((tmp1 / 0x80) >> 8) & 0xff); + buf[2] = (char)(((tmp1 / 0x80) >> 16) & 0xff); + buf[3] = (char)(((tmp1 / 0x80) >> 24) & 0xff); + buf[4] = (char)(tmp1 % 0x80); + gsl_write_interface(ddata->client, 0xf0, buf, 4); + gsl_write_interface(ddata->client, buf[4], + &path_buf[10], tmp); + } else if (3 == path_buf[3] || 4 == path_buf[3]) { + memcpy(gsl_read, temp_buf, 4); + memcpy(gsl_data_proc, &path_buf[3], 7); + } + } +#endif + exit_write_proc_out: + kfree(path_buf); + return count; +} +#endif + +#ifdef GSL_TIMER +static void gsl_timer_check_func(struct work_struct *work) +{ + struct gsl_ts_data *ts = ddata; + struct i2c_client *gsl_client = ts->client; + static int i2c_lock_flag = 0; + char read_buf[4] = { 0 }; + char init_chip_flag = 0; + int i, flag; + print_info("----------------gsl_monitor_worker-----------------\n"); + + if (i2c_lock_flag != 0) + return; + else + i2c_lock_flag = 1; + + gsl_read_interface(gsl_client, 0xb4, read_buf, 4); + memcpy(int_2nd, int_1st, 4); + memcpy(int_1st, read_buf, 4); + + if (int_1st[3] == int_2nd[3] && int_1st[2] == int_2nd[2] && + int_1st[1] == int_2nd[1] && int_1st[0] == int_2nd[0]) { + printk + ("======int_1st: %x %x %x %x , int_2nd: %x %x %x %x ======\n", + int_1st[3], int_1st[2], int_1st[1], int_1st[0], int_2nd[3], + int_2nd[2], int_2nd[1], int_2nd[0]); + init_chip_flag = 1; + goto queue_monitor_work; + } + /*check 0xb0 register,check firmware if ok */ + for (i = 0; i < 5; i++) { + gsl_read_interface(gsl_client, 0xb0, read_buf, 4); + if (read_buf[3] != 0x5a || read_buf[2] != 0x5a || + read_buf[1] != 0x5a || read_buf[0] != 0x5a) { + printk + ("gsl_monitor_worker 0xb0 = {0x%02x%02x%02x%02x};\n", + read_buf[3], read_buf[2], read_buf[1], + read_buf[0]); + flag = 1; + } else { + flag = 0; + break; + } + + } + if (flag == 1) { + init_chip_flag = 1; + goto queue_monitor_work; + } + + /*check 0xbc register,check dac if normal */ + for (i = 0; i < 5; i++) { + gsl_read_interface(gsl_client, 0xbc, read_buf, 4); + if (read_buf[3] != 0 || read_buf[2] != 0 || + read_buf[1] != 0 || read_buf[0] != 0) { + flag = 1; + } else { + flag = 0; + break; + } + } + if (flag == 1) { + gsl_reset_core(gsl_client); + gsl_start_core(gsl_client); + init_chip_flag = 0; + } + queue_monitor_work: + if (init_chip_flag) { + gsl_sw_init(gsl_client); + memset(int_1st, 0xff, sizeof(int_1st)); + } + + if (gsl_halt_flag == 0) { + queue_delayed_work(gsl_timer_workqueue, &gsl_timer_check_work, + 200); + } + i2c_lock_flag = 0; + +} +#endif + +#ifdef TPD_PROXIMITY + +static int tpd_get_ps_value(void) +{ + return tpd_proximity_detect; +} + +static int tpd_enable_ps(int enable) +{ + u8 buf[4]; + gsl_ps_enable = enable; + printk("tpd_enable_ps:gsl_ps_enable = %d\n", gsl_ps_enable); + if (enable) { + wake_lock(&ps_lock); + buf[3] = 0x00; + buf[2] = 0x00; + buf[1] = 0x00; + buf[0] = 0x4; + gsl_write_interface(ddata->client, 0xf0, buf, 4); + buf[3] = 0x0; + buf[2] = 0x0; + buf[1] = 0x0; + buf[0] = 0x2; + gsl_write_interface(ddata->client, 0, buf, 4); + + tpd_proximity_flag = 1; + /*add alps of function8*/ + printk("tpd-ps function is on\n"); + } else { + tpd_proximity_flag = 0; + wake_unlock(&ps_lock); + buf[3] = 0x00; + buf[2] = 0x00; + buf[1] = 0x00; + buf[0] = 0x4; + gsl_write_interface(ddata->client, 0xf0, buf, 4); + buf[3] = 0x00; + buf[2] = 0x00; + buf[1] = 0x00; + buf[0] = 0x00; + gsl_write_interface(ddata->client, 0, buf, 4); + printk("tpd-ps function is off\n"); + } + return 0; +} + +static int tpd_ps_operate(void *self, uint32_t command, void *buff_in, + int size_in, void *buff_out, int size_out, + int *actualout) +{ + int err = 0; + int value; + hwm_sensor_data *sensor_data; + + switch (command) { + case SENSOR_DELAY: + if ((buff_in == NULL) || (size_in < sizeof(int))) { + printk("Set delay parameter error!\n"); + err = -EINVAL; + } + + break; + + case SENSOR_ENABLE: + if ((buff_in == NULL) || (size_in < sizeof(int))) { + printk("Enable sensor parameter error!\n"); + err = -EINVAL; + } else { + value = *(int *)buff_in; + err = tpd_enable_ps(value); + } + break; + + case SENSOR_GET_DATA: + if ((buff_out == NULL) || (size_out < sizeof(hwm_sensor_data))) { + printk("get sensor data parameter error!\n"); + err = -EINVAL; + } else { + sensor_data = (hwm_sensor_data *) buff_out; + + sensor_data->values[0] = tpd_get_ps_value(); + sensor_data->value_divide = 1; + sensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; + } + break; + + default: + printk("proxmy sensor operate function no this parameter %d!\n", + command); + err = -1; + break; + } + + return err; + +} +#endif +#define GSL_CHIP_NAME "gslx68x" +static ssize_t gsl_sysfs_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + u32 tmp; + u8 buf_tmp[4]; + char *ptr = buf; + ptr += sprintf(ptr, "sileadinc:"); + ptr += sprintf(ptr, GSL_CHIP_NAME); +#ifdef GSL_ALG_ID + tmp = gsl_version_id(); + ptr += sprintf(ptr, ":%08x:", tmp); + ptr += sprintf(ptr, "%08x:", gsl_cfg_table[gsl_cfg_index].data_id[0]); +#endif + buf_tmp[0] = 0x3; + buf_tmp[1] = 0; + buf_tmp[2] = 0; + buf_tmp[3] = 0; + gsl_write_interface(ddata->client, 0xf0, buf_tmp, 4); + gsl_read_interface(ddata->client, 0, buf_tmp, 4); + ptr += + sprintf(ptr, "%02x%02x%02x%02x\n", buf_tmp[3], buf_tmp[2], + buf_tmp[1], buf_tmp[0]); + ptr = ptr - buf; + return ptr; +} + +static DEVICE_ATTR(version, 0444, gsl_sysfs_version_show, NULL); + +static unsigned int gsl_sysfs_init(void) +{ + int ret; + struct kobject *gsl_debug_kobj; + gsl_debug_kobj = kobject_create_and_add("gsl_touchscreen", NULL); + if (gsl_debug_kobj == NULL) { + printk("%s: subsystem_register failed\n", __func__); + return -ENOMEM; + } + ret = sysfs_create_file(gsl_debug_kobj, &dev_attr_version.attr); + if (ret) { + printk("%s: sysfs_create_version_file failed\n", __func__); + return ret; + } +} + +static void gsl_report_point(struct gsl_touch_info *ti) +{ + int tmp = 0; + static int gsl_up_flag; /*prevent more up event*/ + print_info("gsl_report_point %d \n", ti->finger_num); + + if (unlikely(ti->finger_num == 0)) { + if (gsl_up_flag == 0) + return; + gsl_up_flag = 0; + input_report_key(tpd->dev, BTN_TOUCH, 0); + input_mt_sync(tpd->dev); + if (FACTORY_BOOT == get_boot_mode() || + RECOVERY_BOOT == get_boot_mode()) { + + tpd_button(ti->x[tmp], ti->y[tmp], 0); + + } + } else { + gsl_up_flag = 1; + for (tmp = 0; ti->finger_num > tmp; tmp++) { + print_info("[gsl1680](x[%d],y[%d]) = (%d,%d);\n", + ti->id[tmp], ti->id[tmp], ti->x[tmp], + ti->y[tmp]); + input_report_key(tpd->dev, BTN_TOUCH, 1); + input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 1); + + if (FACTORY_BOOT == get_boot_mode() + || RECOVERY_BOOT == get_boot_mode()) { + tpd_button(ti->x[tmp], ti->y[tmp], 1); + } + input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, + ti->id[tmp] - 1); + input_report_abs(tpd->dev, ABS_MT_POSITION_X, + ti->x[tmp]); + input_report_abs(tpd->dev, ABS_MT_POSITION_Y, + ti->y[tmp]); + + input_mt_sync(tpd->dev); + } + } + input_sync(tpd->dev); +} + +static void gsl_report_work(void) +{ + + u8 buf[4] = { 0 }; + u8 i = 0; + u16 ret = 0; + u16 tmp = 0; + struct gsl_touch_info cinfo = { 0 }; + u8 tmp_buf[44] = { 0 }; + print_info("enter gsl_report_work\n"); +#ifdef TPD_PROXIMITY + int err; + hwm_sensor_data sensor_data; + /*added by bernard */ + if (tpd_proximity_flag == 1) { + + gsl_read_interface(ddata->client, 0xac, buf, 4); + if (buf[0] == 1 && buf[1] == 0 && buf[2] == 0 && buf[3] == 0) { + tpd_proximity_detect = 0; + } else { + tpd_proximity_detect = 1; + } + /*get raw data*/ + print_info(" ps change\n"); + /*map and store data to hwm_sensor_data*/ + sensor_data.values[0] = tpd_get_ps_value(); + sensor_data.value_divide = 1; + sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM; + /*let up layer to know*/ + err = hwmsen_get_interrupt_data(ID_PROXIMITY, &sensor_data); + if (err) { + print_info("call hwmsen_get_interrupt_data fail = %d\n", err); + } + } + /*end of added */ +#endif + +#ifdef TPD_PROC_DEBUG + if (gsl_proc_flag == 1) { + return; + } +#endif + + gsl_read_interface(ddata->client, 0x80, tmp_buf, 8); + if (tmp_buf[0] >= 2 && tmp_buf[0] <= 10) + gsl_read_interface(ddata->client, 0x88, &tmp_buf[8], + (tmp_buf[0] * 4 - 4)); + cinfo.finger_num = tmp_buf[0] & 0x0f; + print_info("tp-gsl finger_num = %d\n", cinfo.finger_num); + for (tmp = 0; tmp < (cinfo.finger_num > 10 ? 10 : cinfo.finger_num); + tmp++) { + cinfo.id[tmp] = tmp_buf[tmp * 4 + 7] >> 4; + cinfo.y[tmp] = + (tmp_buf[tmp * 4 + 4] | ((tmp_buf[tmp * 4 + 5]) << 8)); + cinfo.x[tmp] = + (tmp_buf[tmp * 4 + 6] | + ((tmp_buf[tmp * 4 + 7] & 0x0f) << 8)); + print_info("tp-gsl x = %d y = %d \n", cinfo.x[tmp], + cinfo.y[tmp]); + } + +#ifdef GSL_ALG_ID + int tmp1 = 0; + cinfo.finger_num = + (tmp_buf[3] << 24) | (tmp_buf[2] << 16) | (tmp_buf[1] << 8) | + (tmp_buf[0]); + gsl_alg_id_main(&cinfo); + + tmp1 = gsl_mask_tiaoping(); + print_info("[tp-gsl] tmp1=%x\n", tmp1); + if (tmp1 > 0 && tmp1 < 0xffffffff) { + buf[0] = 0xa; + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + gsl_write_interface(ddata->client, 0xf0, buf, 4); + buf[0] = (u8) (tmp1 & 0xff); + buf[1] = (u8) ((tmp1 >> 8) & 0xff); + buf[2] = (u8) ((tmp1 >> 16) & 0xff); + buf[3] = (u8) ((tmp1 >> 24) & 0xff); + printk + ("tmp1=%08x,buf[0]=%02x,buf[1]=%02x,buf[2]=%02x,buf[3]=%02x\n", + tmp1, buf[0], buf[1], buf[2], buf[3]); + gsl_write_interface(ddata->client, 0x8, buf, 4); + } +#endif + gsl_report_point(&cinfo); +} + +static int touch_event_handler(void *unused) +{ + struct sched_param param = {.sched_priority = RTPM_PRIO_TPD }; + sched_setscheduler(current, SCHED_RR, ¶m); + do { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + set_current_state(TASK_INTERRUPTIBLE); + wait_event_interruptible(waiter, tpd_flag != 0); + tpd_flag = 0; + TPD_DEBUG_SET_TIME; + set_current_state(TASK_RUNNING); + gsl_report_work(); + } while (!kthread_should_stop()); + return 0; +} + +#ifdef GSL_DRV_WIRE_IDT_TP + +#define GSL_C 100 +#define GSL_CHIP_1 0xffffffff +#define GSL_CHIP_2 0xffffffff +#define GSL_CHIP_3 0xffffffff +#define GSL_CHIP_4 0xffffffff +static unsigned int gsl_count_one(unsigned int flag) +{ + unsigned int tmp = 0; + int i = 0; + for (i = 0; i < 32; i++) { + if (flag & (0x1 << i)) + tmp++; + } + return tmp; +} + +static int gsl_DrvWire_idt_tp(struct gsl_ts_data *ts) +{ + u8 buf[4]; + int i, err = 1; + int flag = 0; + u16 count0, count1; + unsigned int tmp, tmp0; + unsigned int tmp1, tmp2, tmp3, tmp4; + u32 num; + identify_tp_repeat: + gsl_clear_reg(ts->client); + gsl_reset_core(ts->client); + num = ARRAY_SIZE(GSL_IDT_FW); + gsl_load_fw(ts->client, GSL_IDT_FW, num); + gsl_start_core(ts->client); + msleep(200); + for (i = 0; i < 3; i++) { + gsl_read_interface(ts->client, 0xb4, buf, 4); + + print_info + ("i = %d count0 the test 0xb4 = {0x%02x%02x%02x%02x}\n", i, + buf[3], buf[2], buf[1], buf[0]); + + count0 = (buf[3] << 8) | buf[2]; + msleep(5); + gsl_read_interface(ts->client, 0xb4, buf, 4); + + print_info + ("i = %d count1 the test 0xb4 = {0x%02x%02x%02x%02x}\n", i, + buf[3], buf[2], buf[1], buf[0]); + + count1 = (buf[3] << 8) | buf[2]; + if ((count0 > 1) && (count0 != count1)) + break; + } + if ((count0 > 1) && count0 != count1) { + + print_info("[TP-GSL][%s] is start ok\n", __func__); + + gsl_read_interface(ts->client, 0xb8, buf, 4); + tmp = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + + print_info("the test 0xb8 = {0x%02x%02x%02x%02x}\n", buf[3], + buf[2], buf[1], buf[0]); + tmp1 = gsl_count_one(GSL_CHIP_1 ^ tmp); + tmp0 = gsl_count_one((tmp & GSL_CHIP_1) ^ GSL_CHIP_1); + tmp1 += tmp0 * GSL_C; + print_info("[TP-GSL] tmp1 = %d\n", tmp1); + + tmp2 = gsl_count_one(GSL_CHIP_2 ^ tmp); + tmp0 = gsl_count_one((tmp & GSL_CHIP_2) ^ GSL_CHIP_2); + tmp2 += tmp0 * GSL_C; + print_info("[TP-GSL] tmp2 = %d\n", tmp2); + + tmp3 = gsl_count_one(GSL_CHIP_3 ^ tmp); + tmp0 = gsl_count_one((tmp & GSL_CHIP_3) ^ GSL_CHIP_3); + tmp3 += tmp0 * GSL_C; + print_info("[TP-GSL] tmp3 = %d\n", tmp3); + + tmp4 = gsl_count_one(GSL_CHIP_4 ^ tmp); + tmp0 = gsl_count_one((tmp & GSL_CHIP_4) ^ GSL_CHIP_4); + tmp4 += tmp0 * GSL_C; + print_info("[TP-GSL] tmp4 = %d\n", tmp4); + + if (0xffffffff == GSL_CHIP_1) { + tmp1 = 0xffff; + } + if (0xffffffff == GSL_CHIP_2) { + tmp2 = 0xffff; + } + if (0xffffffff == GSL_CHIP_3) { + tmp3 = 0xffff; + } + if (0xffffffff == GSL_CHIP_4) { + tmp4 = 0xffff; + } + print_info("[TP-GSL] tmp1 = %d\n", tmp1); + print_info("[TP-GSL] tmp2 = %d\n", tmp2); + print_info("[TP-GSL] tmp3 = %d\n", tmp3); + print_info("[TP-GSL] tmp4 = %d\n", tmp4); + tmp = tmp1; + if (tmp1 > tmp2) { + tmp = tmp2; + } + if (tmp > tmp3) { + tmp = tmp3; + } + if (tmp > tmp4) { + tmp = tmp4; + } + + if (tmp == tmp1) { + gsl_cfg_index = 0; + } else if (tmp == tmp2) { + gsl_cfg_index = 0; + } else if (tmp == tmp3) { + gsl_cfg_index = 0; + } else if (tmp == tmp4) { + gsl_cfg_index = 0; + } + err = 1; + } else { + flag++; + if (flag < 3) + goto identify_tp_repeat; + err = 0; + } + return err; +} +#endif +static int tpd_eint_interrupt_handler(void) +{ + + print_info("[gsl1680] TPD interrupt has been triggered\n"); + tpd_flag = 1; + wake_up_interruptible(&waiter); +} + +static void gsl_hw_init(void) +{ + /*power on*/ + hwPowerOn(MT6323_POWER_LDO_VGP2, VOL_2800, "TP"); + + /* reset ctp gsl1680 */ + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); + msleep(20); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + /* set interrupt work mode */ + mt_set_gpio_mode(GPIO_CTP_EINT_PIN, GPIO_CTP_EINT_PIN_M_EINT); + mt_set_gpio_dir(GPIO_CTP_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(GPIO_CTP_EINT_PIN, GPIO_PULL_UP); + msleep(100); +} + +#ifdef TPD_PROC_DEBUG +static int gsl_server_list_open(struct inode *inode, struct file *file) +{ + return single_open(file, gsl_config_read_proc, NULL); +} + +static const struct file_operations gsl_seq_fops = { + .open = gsl_server_list_open, + .read = seq_read, + .release = single_release, + .write = gsl_config_write_proc, + .owner = THIS_MODULE, +}; +#endif + +static int gsl_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int i, err; + unsigned char tp_data[4]; +#ifdef TPD_PROXIMITY + struct hwmsen_object obj_ps; +#endif + + print_info(); + + ddata = kzalloc(sizeof(struct gsl_ts_data), GFP_KERNEL); + if (!ddata) { + print_info("alloc ddata memory error\n"); + return -ENOMEM; + } + + mutex_init(&gsl_i2c_lock); + ddata->client = client; + print_info("ddata->client->addr = 0x%x \n", ddata->client->addr); + gsl_hw_init(); + + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + + i2c_set_clientdata(ddata->client, ddata); + + err = gsl_test_i2c(ddata->client); + if (err < 0) + goto err_malloc; +#ifdef GSL_DRV_WIRE_IDT_TP + gsl_DrvWire_idt_tp(ddata); +#endif +#ifdef GSL_GPIO_IDT_TP + gsl_gpio_idt_tp(ddata); +#endif + + print_info("[tpd-gsl][%s] gsl_cfg_index=%d\n", __func__, gsl_cfg_index); + input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, 0, 10, 0, 0); + gsl_sw_init(ddata->client); + msleep(20); + check_mem_data(ddata->client); + thread = kthread_run(touch_event_handler, 0, TPD_DEVICE); + if (IS_ERR(thread)) { + /*err = PTR_ERR(thread);*/ + /*TPD_DMESG(TPD_DEVICE " failed to create kernel thread: %d\n", PTR_ERR(thread));*/ + } + + mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, EINTF_TRIGGER_RISING, + tpd_eint_interrupt_handler, 1); + +#ifdef GSL_TIMER + INIT_DELAYED_WORK(&gsl_timer_check_work, gsl_timer_check_func); + gsl_timer_workqueue = create_workqueue("gsl_timer_check"); + queue_delayed_work(gsl_timer_workqueue, &gsl_timer_check_work, + GSL_TIMER_CHECK_CIRCLE); +#endif +#ifdef TPD_PROC_DEBUG + + gsl_config_proc = + proc_create(GSL_CONFIG_PROC_FILE, 0666, NULL, &gsl_seq_fops); + if (gsl_config_proc == NULL) { + print_info("create_proc_entry %s failed\n", + GSL_CONFIG_PROC_FILE); + } + gsl_proc_flag = 0; +/* else + { + gsl_proc_fops->read = gsl_config_read_proc; + gsl_proc_fops->write = gsl_config_write_proc; + } + gsl_proc_flag = 0; + + ֮ǰ\B5\C4 + gsl_config_proc = create_proc_entry(GSL_CONFIG_PROC_FILE, 0666, NULL); + if (gsl_config_proc == NULL) + { + print_info("create_proc_entry %s failed\n", GSL_CONFIG_PROC_FILE); + } + else + { + gsl_config_proc->read_proc = gsl_config_read_proc; + gsl_config_proc->write_proc = gsl_config_write_proc; + } + gsl_proc_flag = 0;*/ +#endif + +#ifdef GSL_ALG_ID + gsl_DataInit(gsl_cfg_table[gsl_cfg_index].data_id); +#endif +#ifdef TPD_PROXIMITY + obj_ps.polling = 0; + obj_ps.sensor_operate = tpd_ps_operate; + err = hwmsen_attach(ID_PROXIMITY, &obj_ps); + if (err) { + printk("attach fail = %d\n", err); + } + + wake_lock_init(&ps_lock, WAKE_LOCK_SUSPEND, "ps wakelock"); +#endif + gsl_sysfs_init(); + + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + + tpd_load_status = 1; + + return 0; + + err_malloc: + if (ddata) + kfree(ddata); + + return err; +} + +/***************************************************************************** +Prototype : gsl_remove +Description : remove gsl1680 driver +Input : struct i2c_client *client +Output : int +Return Value : static + + *****************************************************************************/ +static int gsl_remove(struct i2c_client *client) +{ + print_info("[gsl1680] TPD removed\n"); + return 0; +} + +/***************************************************************************** +Prototype : gsl_detect +Description : gsl1680 driver local setup without board file +Input : struct i2c_client *client +int kind +struct i2c_board_info *info +Output : int +Return Value : static + + *****************************************************************************/ +static int gsl_detect(struct i2c_client *client, int kind, + struct i2c_board_info *info) +{ + print_info("%s, %d\n", __FUNCTION__, __LINE__); + strcpy(info->type, TPD_DEVICE); + return 0; +} + +static struct i2c_driver gsl_i2c_driver = { + .driver = { + .name = TPD_DEVICE, + .owner = THIS_MODULE, + }, + .probe = gsl_probe, + .remove = gsl_remove, + .id_table = gsl_device_id, + .detect = gsl_detect, +}; + +/***************************************************************************** +Prototype : gsl_local_init +Description : setup gsl1680 driver +Input : None +Output : None +Return Value : static + + *****************************************************************************/ +static int gsl_local_init(void) +{ + int ret; + print_info(); + boot_mode = get_boot_mode(); + print_info("boot_mode == %d \n", boot_mode); + + if (boot_mode == SW_REBOOT) + boot_mode = NORMAL_BOOT; +#ifdef TPD_HAVE_BUTTON + print_info("TPD_HAVE_BUTTON\n"); + tpd_button_setting(TPD_KEY_COUNT, tpd_keys_local, tpd_keys_dim_local); +#endif + + ret = i2c_add_driver(&gsl_i2c_driver); + + if (ret < 0) { + print_info("unable to i2c_add_driver\n"); + return -ENODEV; + } + + if (tpd_load_status == 0) { + print_info("tpd_load_status == 0, gsl_probe failed\n"); + i2c_del_driver(&gsl_i2c_driver); + return -ENODEV; + } + + /* define in tpd_debug.h */ + tpd_type_cap = 1; + print_info("end %s, %d\n", __FUNCTION__, __LINE__); + return 0; +} + +static void gsl_suspend(struct i2c_client *client) +{ + int tmp; + print_info(); +#ifdef TPD_PROXIMITY + if (tpd_proximity_flag == 1) { + return 0; + } +#endif + gsl_halt_flag = 1; + printk("[tp-gsl]the last time of debug:%x\n", TPD_DEBUG_TIME); +#ifdef GSL_ALG_ID + tmp = gsl_version_id(); + printk("[tp-gsl]the version of alg_id:%x\n", tmp); +#endif + + +#ifdef TPD_PROC_DEBUG + if (gsl_proc_flag == 1) { + return; + } +#endif +#ifdef GSL_TIMER + cancel_delayed_work_sync(&gsl_timer_check_work); +#endif + + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); +} + +static void gsl_resume(struct i2c_client *client) +{ + print_info(); +#ifdef TPD_PROXIMITY + if (tpd_proximity_flag == 1 && gsl_halt_flag == 0) { + tpd_enable_ps(1); + return; + } +#endif + +#ifdef TPD_PROC_DEBUG + if (gsl_proc_flag == 1) { + return; + } +#endif + + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + msleep(20); + gsl_reset_core(ddata->client); + gsl_start_core(ddata->client); + msleep(20); + check_mem_data(ddata->client); + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +#ifdef GSL_TIMER + queue_delayed_work(gsl_timer_workqueue, &gsl_timer_check_work, + GSL_TIMER_CHECK_CIRCLE); +#endif + gsl_halt_flag = 0; +#ifdef TPD_PROXIMITY + if (tpd_proximity_flag == 1) { + tpd_enable_ps(1); + return; + } +#endif + +} + +static struct tpd_driver_t gsl_driver = { + .tpd_device_name = GSL_DEV_NAME, + .tpd_local_init = gsl_local_init, + .suspend = gsl_suspend, + .resume = gsl_resume, +#ifdef TPD_HAVE_BUTTON + .tpd_have_button = 1, +#else + .tpd_have_button = 0, +#endif +}; + +static int __init gsl_driver_init(void) +{ + int ret; + + print_info(); + i2c_register_board_info(2, &i2c_tpd, 1); + ret = tpd_driver_add(&gsl_driver); + if (ret < 0) + print_info("gsl_driver init error, return num is %d \n", ret); + + return ret; +} + +static void __exit gsl_driver_exit(void) +{ + print_info(); + tpd_driver_remove(&gsl_driver); +} + +module_init(gsl_driver_init); +module_exit(gsl_driver_exit); diff --git a/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_driver.h b/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_driver.h new file mode 100644 index 00000000000..0f1e17284cc --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_driver.h @@ -0,0 +1,64 @@ +#ifndef __GSL_TS_DRIVER_H__ +#define __GSL_TS_DRIVER_H__ +/*********************************/ +#define TPD_HAVE_BUTTON //°´¼üºê +#define GSL_ALG_ID //ÓÐûÓÐidËã·¨ +#define GSL_DEBUG //µ÷ÊÔ +#define TPD_PROC_DEBUG //adbµ÷ÊÔ +#define GSL_TIMER //¶¨Ê±Æ÷ºê +//#define TPD_PROXIMITY //¾àÀë´«¸ÐÆ÷ºê + + +#define GSL9XX_VDDIO_1800 1 +#define TPD_DEBUG_TIME 0x20130424 +struct gsl_touch_info +{ + int x[10]; + int y[10]; + int id[10]; + int finger_num; +}; + +struct gsl_ts_data { + struct i2c_client *client; + struct workqueue_struct *wq; + struct work_struct work; + unsigned int irq; + struct early_suspend pm; +}; + +/*button*/ +#define TPD_KEY_COUNT 3 +#define TPD_KEYS {KEY_MENU,KEY_HOMEPAGE,KEY_BACK} +#define TPD_KEYS_DIM {{80,1030,120,80},{240,1030,120,80},{460,1030,120,80}} + + +#ifdef GSL_ALG_ID +extern unsigned int gsl_mask_tiaoping(void); +extern unsigned int gsl_version_id(void); +extern void gsl_alg_id_main(struct gsl_touch_info *cinfo); +extern void gsl_DataInit(int *ret); +#endif +/* Fixme mem Alig */ +struct fw_data +{ + u32 offset : 8; + u32 : 0; + u32 val; +}; +#include "gsl_ts_fw.h" +static unsigned char gsl_cfg_index = 0; + +struct fw_config_type +{ + const struct fw_data *fw; + unsigned int fw_size; + unsigned int *data_id; + unsigned int data_size; +}; +static struct fw_config_type gsl_cfg_table[9] = { +/*0*/{GSLX68X_FW,(sizeof(GSLX68X_FW)/sizeof(struct fw_data)), + gsl_config_data_id,(sizeof(gsl_config_data_id)/4)}, +}; + +#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_fw.h b/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_fw.h new file mode 100644 index 00000000000..01f6c032ff3 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/gsl_ts_fw.h @@ -0,0 +1,5052 @@ +#ifndef __GSL_TS_FW__ +#define __GSL_TS_FW__ + +#ifdef GSL_ALG_ID +/* +unsigned int gsl_config_versions[]= +{ + 0xa9b5f6c8,0xf6c8a8b7,0xd4cac4b5,0xd4ca, + 0xa9b5f6c8,0xe3cba8b7,0xa8b7,0, + 0xaeb0aeb0,0xaeb0,0,0, + 0x372d3434,0x3737,0,0, + 0x342e3031, + + 0x31,0xc832e1bf,0xc8,0x71760f, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, +} +*/ + +static unsigned int gsl_config_data_id[512]= +{ + 0x8049f0, + 0x200, + 0,0, + 0, + 0,0,0, + 0,0,0,0,0,0,0,0xbdfa0ace, + + + 0x100d50,0x5,0xe0018,0xe0018,0x4000258,0,0x5100,0x8e00, + 0,0x320014,0,0x12,0x40,0,0,0, + 0x2,0x4000,0x1000,0x10a70011,0x106e0014,0,0,0x3030303, + 0x1b6da200,0,0x6d003c,0x730050,0,0,0x60003c,0x6d0050, + 0,0,0xc0003c,0xa00050,0,0,0xc0003c,0xa00050, + 0,0,0x804000,0x200100,0x200010,0x10001,0,0, + 0,0,0,0x14012c,0xa003c,0xa0078,0x400,0x1081, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + + 0,//key_map + 0x3200384,0x64,0x503e8,//0 + 0,0,0,//1 + 0,0,0,//2 + 0,0,0,//3 + 0,0,0,//4 + 0,0,0,//5 + 0,0,0,//6 + 0,0,0,//7 + + 0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + + + 0x221, + 0,0,0,0,0x180,0x101c0,0x20200,0, + 0x1010000,0x6050302,0xb0a0907,0x100f0e0c,0x15141312,0x19181716,0x1e1d1b1a,0x2221201f, + 0x26252423,0x2a292827,0x2f2e2c2b,0x34333130,0x39383635,0x3d3c3b3a,0x3f3f3e3e,0x3f3f3f3f, + 0,0,0,0x1000000,0x4030201,0xa080705,0xf0e0c0b,0x14131211, + 0x1a191716,0x211f1e1c,0x2a272523,0x32302e2c,0x3c3a3835,0x3f3f3f3e,0x3f3f3f3f,0x3f3f3f3f, + + 0,0x4030100,0xe0b0907,0x15131210,0x1b1a1816,0x21201f1d,0x28262523,0x2d2c2a29, + 0x3332302e,0x38373534,0x3d3b3a39,0x3f3f3f3e,0x3f3f3f3f,0x3f3f3f3f,0x3f3f3f3f,0x3f3f3f3f, + + 0,0,0,0,0x1010000,0x5040302,0xa090807,0xf0e0d0b, + 0x14131211,0x1a191715,0x201f1d1c,0x27252321,0x2f2d2b29,0x37353331,0x3e3d3c39,0x3f3f3f3f, + + 0,0,0x2010000,0x8060503,0x100e0d0b,0x18161412,0x1f1e1c1a,0x26252321, + 0x2c2a2928,0x32312f2e,0x38373534,0x3e3d3c3a,0x3f3f3f3f,0x3f3f3f3f,0x3f3f3f3f,0x3f3f3f3f, + + 0x3020100,0x7060504,0xb0a0908,0xf0e0d0c,0x13121110,0x17161514,0x1b1a1918,0x1f1e1d1c, + 0x23222120,0x27262524,0x2b2a2928,0x2f2e2d2c,0x33323130,0x37363534,0x3b3a3938,0x3f3e3d3c, + + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0, + + + 0x3, + 0x101,0,0x100,0, + 0x20,0x10,0x8,0x4, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + + 0x4,0,0,0,0,0,0,0, + 0x3800600,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0, +}; +#endif + +static const struct fw_data GSLX68X_FW[] = { + +{0xf0,0x2}, +{0x00,0x00000000}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x00000000}, +{0x14,0x00000000}, +{0x18,0x00000000}, +{0x1c,0x00000000}, +{0x20,0x00000000}, +{0x24,0x00000000}, +{0x28,0x00000000}, +{0x2c,0x0c880604}, +{0x30,0x07070302}, +{0x34,0x00000000}, +{0x38,0x00000000}, +{0x3c,0x00000000}, +{0x40,0x00000000}, +{0x44,0x00000000}, +{0x48,0x00000000}, +{0x4c,0x00000000}, +{0x50,0x00000000}, +{0x54,0x00000000}, +{0x58,0x00000000}, +{0x5c,0x00000000}, +{0x60,0x00000030}, +{0x64,0xf8010010}, +{0x68,0x00066414}, +{0x6c,0x1001020a}, +{0x70,0x00000fff}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x0e180e18}, +{0xf0,0x3}, +{0x00,0x2169060b}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x00000000}, +{0x14,0x00000000}, +{0x18,0x00000000}, +{0x1c,0x00000000}, +{0x20,0x00000000}, +{0x24,0x00005100}, +{0x28,0x00008e00}, +{0x2c,0x0000ffce}, +{0x30,0x00000000}, +{0x34,0x00000000}, +{0x38,0x00000000}, +{0x3c,0x00000000}, +{0x40,0x00000000}, +{0x44,0x00000000}, +{0x48,0x00000000}, +{0x4c,0x00000000}, +{0x50,0x00000000}, +{0x54,0x00000000}, +{0x58,0x00000000}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x200a860a}, +{0x68,0x00000002}, +{0x6c,0x0000000f}, +{0x70,0x00000000}, +{0x74,0xffffffff}, +{0x78,0xffffffec}, +{0x7c,0x00000000}, +{0xf0,0x4}, +{0x00,0x00000000}, +{0x04,0x0001660b}, +{0x08,0x00000064}, +{0x0c,0x00000000}, +{0x10,0xfe0cff06}, +{0x14,0x00000032}, +{0x18,0x00000002}, +{0x1c,0x00000008}, +{0x20,0x00000028}, +{0x24,0x00000005}, +{0x28,0x00000005}, +{0x2c,0x00000020}, +{0x30,0x00010000}, +{0x34,0x00000fff}, +{0x38,0x0000000a}, +{0x3c,0x00000258}, +{0x40,0x00000014}, +{0x44,0x04020a00}, +{0x48,0x0014012c}, +{0x4c,0x9a000000}, +{0x50,0x00000000}, +{0x54,0x00010203}, +{0x58,0x04050607}, +{0x5c,0x08090a0b}, +{0x60,0x0c0d0e0f}, +{0x64,0x10111213}, +{0x68,0x14151617}, +{0x6c,0x18191a1b}, +{0x70,0x1c1d1e1f}, +{0x74,0x0014000a}, +{0x78,0x80808080}, +{0x7c,0xcba981f4}, +{0xf0,0x5}, +{0x00,0x00000000}, +{0x04,0x00000005}, +{0x08,0x000000b4}, +{0x0c,0x53534d6d}, +{0x10,0x0000000a}, +{0x14,0x00000000}, +{0x18,0x00000fff}, +{0x1c,0x10a70011}, +{0x20,0x106e0014}, +{0x24,0x00000000}, +{0x28,0x00000000}, +{0x2c,0x00000400}, +{0x30,0x80808080}, +{0x34,0x80808080}, +{0x38,0x80808080}, +{0x3c,0x80808080}, +{0x40,0x80808080}, +{0x44,0x80808080}, +{0x48,0x80808080}, +{0x4c,0x80808000}, +{0x50,0xffffffff}, +{0x54,0x10000000}, +{0x58,0x00000000}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000221}, +{0x78,0x00000018}, +{0x7c,0x0000000e}, +{0xf0,0x6}, +{0x00,0x00000018}, +{0x04,0x00000000}, +{0x08,0x0000000e}, +{0x0c,0x04030402}, +{0x10,0x00000032}, +{0x14,0x1414010a}, +{0x18,0x00000000}, +{0x1c,0x00000001}, +{0x20,0x00002904}, +{0x24,0x00000400}, +{0x28,0x00000258}, +{0x2c,0xf8010010}, +{0x30,0xf8010005}, +{0x34,0x00000003}, +{0x38,0x00000003}, +{0x3c,0x00000fff}, +{0x40,0x80000000}, +{0x44,0x00180018}, +{0x48,0x00000fff}, +{0x4c,0x04040402}, +{0x50,0x00020001}, +{0x54,0x00001081}, +{0x58,0x000a0078}, +{0x5c,0x1080b608}, +{0x60,0x20151404}, +{0x64,0x00000000}, +{0x68,0x000007d0}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x000000b4}, +{0x78,0x000a003c}, +{0x7c,0x00000000}, +{0xf0,0x7}, +{0x00,0x01060009}, +{0x04,0x0308020b}, +{0x08,0x050a040d}, +{0x0c,0x070c0610}, +{0x10,0x09130812}, +{0x14,0x00123456}, +{0x18,0x00000000}, +{0x1c,0x000a0078}, +{0x20,0x00001081}, +{0x24,0xff080010}, +{0x28,0xff080120}, +{0x2c,0xff080140}, +{0x30,0xff080160}, +{0x34,0x004300b4}, +{0x38,0x003b009c}, +{0x3c,0x00310084}, +{0x40,0x00000000}, +{0x44,0x00000000}, +{0x48,0x00100d50}, +{0x4c,0x320f0f03}, +{0x50,0x00000000}, +{0x54,0x00000002}, +{0x58,0x00000000}, +{0x5c,0x00170001}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00160000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00012345}, +{0x7c,0x006789ab}, +{0xf0,0x8}, +{0x00,0x01fa21f9}, +{0x04,0x21f821f7}, +{0x08,0x21f621f5}, +{0x0c,0x21f421f3}, +{0x10,0x21f221f1}, +{0x14,0x21f0238f}, +{0x18,0x236f234f}, +{0x1c,0x232f230f}, +{0x20,0x22ef22cf}, +{0x24,0x22af228f}, +{0x28,0x226f224f}, +{0x2c,0x222f320f}, +{0x30,0x01fb01fc}, +{0x34,0x00000000}, +{0x38,0x00000000}, +{0x3c,0x00000000}, +{0x40,0x01030507}, +{0x44,0x090b0d00}, +{0x48,0x00000000}, +{0x4c,0x02040608}, +{0x50,0x0a0c0e00}, +{0x54,0x00000000}, +{0x58,0x00070006}, +{0x5c,0x00000008}, +{0x60,0x00000000}, +{0x64,0x00000201}, +{0x68,0x00000804}, +{0x6c,0x006600cd}, +{0x70,0x000000cd}, +{0x74,0x0000008c}, +{0x78,0x00000000}, +{0x7c,0x0000000e}, +{0xf0,0x9}, +{0x00,0xff080094}, +{0x04,0x00070011}, +{0x08,0xff080090}, +{0x0c,0x00040000}, +{0x10,0xff080068}, +{0x14,0x00030000}, +{0x18,0xff080064}, +{0x1c,0x01002582}, +{0x20,0xff080060}, +{0x24,0x00200000}, +{0x28,0xff08004c}, +{0x2c,0x00197fff}, +{0x30,0xfffffff0}, +{0x34,0x00000000}, +{0x38,0xfffffff0}, +{0x3c,0x00000000}, +{0x40,0xfffffff0}, +{0x44,0x00000000}, +{0x48,0xfffffff0}, +{0x4c,0x00000000}, +{0x50,0xfffffff0}, +{0x54,0x00000000}, +{0x58,0xfffffff0}, +{0x5c,0x00000000}, +{0x60,0xfffffff0}, +{0x64,0x00000000}, +{0x68,0xfffffff0}, +{0x6c,0x00000000}, +{0x70,0xfffffff0}, +{0x74,0x00000000}, +{0x78,0xfffffff0}, +{0x7c,0x00000000}, +/* +{0xf0,0xe0}, +{0x00,0x00190009}, +{0x04,0x0043003b}, +{0x08,0x0088005c}, +{0x0c,0x00900087}, +{0x10,0x00870083}, +{0x14,0x007a008a}, +{0x18,0x008e007e}, +{0x1c,0x00720082}, +{0x20,0x00700084}, +{0x24,0x0064006b}, +{0x28,0x0075007f}, +{0x2c,0x007a005f}, +{0x30,0x00750065}, +{0x34,0x00730066}, +{0x38,0x00750072}, +{0x3c,0x005b0059}, +{0x40,0x006401f4}, +{0x44,0x00640064}, +{0x48,0x01900064}, +{0x4c,0x00500190}, +{0x50,0x00500050}, +{0x54,0x012c0050}, +{0x58,0x012c012c}, +{0x5c,0x003c012c}, +{0x60,0x00640028}, +{0x64,0x00640064}, +{0x68,0x00000032}, +{0x6c,0x00500000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0xe1}, +{0x00,0x00000000}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x00000000}, +{0x14,0x00000000}, +{0x18,0x00010000}, +{0x1c,0x000a000b}, +{0x20,0x00170016}, +{0x24,0x0022001e}, +{0x28,0x00280034}, +{0x2c,0x0021002c}, +{0x30,0x00270029}, +{0x34,0x0024002f}, +{0x38,0x00220025}, +{0x3c,0x00260026}, +{0x40,0x00000000}, +{0x44,0x00000000}, +{0x48,0x00000000}, +{0x4c,0x00000000}, +{0x50,0x00000002}, +{0x54,0x00000000}, +{0x58,0x00000000}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0xe2}, +{0x00,0x00640076}, +{0x04,0x006f006a}, +{0x08,0x00680071}, +{0x0c,0x006b005b}, +{0x10,0x0089006e}, +{0x14,0x00870068}, +{0x18,0x0085007c}, +{0x1c,0x00820080}, +{0x20,0x006b007a}, +{0x24,0x00700085}, +{0x28,0x006a006d}, +{0x2c,0x00630063}, +{0x30,0x00320045}, +{0x34,0x000b001a}, +{0x38,0x00040001}, +{0x3c,0x00010000}, +{0x40,0x002c0030}, +{0x44,0x00280028}, +{0x48,0x00310032}, +{0x4c,0x003c0034}, +{0x50,0x003e0037}, +{0x54,0x003d0044}, +{0x58,0x0037003e}, +{0x5c,0x004a003f}, +{0x60,0x004b0053}, +{0x64,0x002f0043}, +{0x68,0x0010002b}, +{0x6c,0x00000001}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0xe3}, +{0x00,0x00000000}, +{0x04,0x00030001}, +{0x08,0x00140008}, +{0x0c,0x0021001a}, +{0x10,0x0023002a}, +{0x14,0x00280028}, +{0x18,0x0022001f}, +{0x1c,0x0017001e}, +{0x20,0x00220015}, +{0x24,0x001d001d}, +{0x28,0x0014001a}, +{0x2c,0x00220017}, +{0x30,0x0020001b}, +{0x34,0x001b000f}, +{0x38,0x00170013}, +{0x3c,0x0010001e}, +{0x40,0x001b001b}, +{0x44,0x00170016}, +{0x48,0x00160012}, +{0x4c,0x00170014}, +{0x50,0x00120011}, +{0x54,0x001a0015}, +{0x58,0x00060014}, +{0x5c,0x00010001}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0xe4}, +{0x00,0x00000000}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x00000000}, +{0x14,0x00000000}, +{0x18,0x00000000}, +{0x1c,0x00000000}, +{0x20,0x00030001}, +{0x24,0x000d000b}, +{0x28,0x000d0012}, +{0x2c,0x00130012}, +{0x30,0x000e0015}, +{0x34,0x00120015}, +{0x38,0x00150016}, +{0x3c,0x00140015}, +{0x40,0x000d0019}, +{0x44,0x000e0016}, +{0x48,0x0017001a}, +{0x4c,0x00140025}, +{0x50,0x001e0013}, +{0x54,0x00170011}, +{0x58,0x00200020}, +{0x5c,0x0022001b}, +{0x60,0x001a001d}, +{0x64,0x001a0026}, +{0x68,0x002a0020}, +{0x6c,0x001f001f}, +{0x70,0x00280026}, +{0x74,0x000d0011}, +{0x78,0x00000003}, +{0x7c,0x00000000}, +{0xf0,0xe5}, +{0x00,0x00000000}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x000f0001}, +{0x14,0x0031001e}, +{0x18,0x00480032}, +{0x1c,0x004e0047}, +{0x20,0x004e0059}, +{0x24,0x00520041}, +{0x28,0x004b0048}, +{0x2c,0x00440043}, +{0x30,0x004e0051}, +{0x34,0x00420043}, +{0x38,0x003c004f}, +{0x3c,0x00320043}, +{0x40,0x00330045}, +{0x44,0x00390035}, +{0x48,0x003f004e}, +{0x4c,0x003f0037}, +{0x50,0x003c0035}, +{0x54,0x003e003c}, +{0x58,0x00370048}, +{0x5c,0x001d0028}, +{0x60,0x00040014}, +{0x64,0x00010003}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0xe6}, +{0x00,0x00000000}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x00000000}, +{0x14,0x00000000}, +{0x18,0x00000000}, +{0x1c,0x00000000}, +{0x20,0x00000000}, +{0x24,0x00000000}, +{0x28,0x00000000}, +{0x2c,0x00000000}, +{0x30,0x00000000}, +{0x34,0x00000000}, +{0x38,0x00000000}, +{0x3c,0x00000000}, +{0x40,0x00000000}, +{0x44,0x00000000}, +{0x48,0x00000000}, +{0x4c,0x00000000}, +{0x50,0x00000000}, +{0x54,0x00000000}, +{0x58,0x00000000}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +*/ + + + +{0xf0,0x1e}, +{0x00,0x5a5a0f00}, +{0x04,0x00002ba0}, +{0x08,0x00002c14}, +{0x0c,0x00002c94}, +{0x10,0x00002dc8}, +{0x14,0x00002e50}, +{0x18,0x00002f1c}, +{0x1c,0x00002f38}, +{0x20,0x000030e0}, +{0x24,0x000032c0}, +{0x28,0x00003508}, +{0x2c,0x00003878}, +{0x30,0x00003978}, +{0x34,0x00003be4}, +{0x38,0x00003ebc}, +{0x3c,0x00003f74}, +{0x40,0x00004294}, +{0x44,0x00004424}, +{0x48,0x0000470c}, +{0x4c,0x00004ab8}, +{0x50,0x00004ba0}, +{0x54,0x00004c04}, +{0x58,0x00004d4c}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0x1f}, +{0x00,0x00000000}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x00000000}, +{0x14,0x00000000}, +{0x18,0x00000000}, +{0x1c,0x00000000}, +{0x20,0x00000000}, +{0x24,0x00000000}, +{0x28,0x00000000}, +{0x2c,0x00000000}, +{0x30,0x00000000}, +{0x34,0x00000000}, +{0x38,0x00000000}, +{0x3c,0x00002448}, +{0x40,0x000025f8}, +{0x44,0x00000000}, +{0x48,0x00000000}, +{0x4c,0x00002678}, +{0x50,0x00002738}, +{0x54,0x00000000}, +{0x58,0x000027e8}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x0000291c}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x000029ec}, +{0x78,0x00004e04}, +{0x7c,0x5a5a0ffc}, +{0xf0,0x0}, +{0x00,0x01000000}, +{0x04,0x01000000}, +{0x08,0x01000000}, +{0x0c,0x233fc0c0}, +{0x10,0xa2146004}, +{0x14,0xa4102000}, +{0x18,0xe4244000}, +{0x1c,0x233fc0c0}, +{0x20,0xa2146010}, +{0x24,0x2500003f}, +{0x28,0xa414a3ff}, +{0x2c,0xe4244000}, +{0x30,0x01000000}, +{0x34,0x821020e0}, +{0x38,0x81880001}, +{0x3c,0x01000000}, +{0x40,0x01000000}, +{0x44,0xa410200f}, +{0x48,0xe4a00040}, +{0x4c,0x01000000}, +{0x50,0xa0100000}, +{0x54,0xa2100000}, +{0x58,0xa4100000}, +{0x5c,0xa6100000}, +{0x60,0xa8100000}, +{0x64,0xaa100000}, +{0x68,0xac100000}, +{0x6c,0xae100000}, +{0x70,0x90100000}, +{0x74,0x92100000}, +{0x78,0x94100000}, +{0x7c,0x96100000}, +{0xf0,0x1}, +{0x00,0x98100000}, +{0x04,0x9a100000}, +{0x08,0x9c100000}, +{0x0c,0x9e100000}, +{0x10,0x84100000}, +{0x14,0x01000000}, +{0x18,0x01000000}, +{0x1c,0x82100000}, +{0x20,0x81900001}, +{0x24,0x82100000}, +{0x28,0x81980001}, +{0x2c,0x81800000}, +{0x30,0x01000000}, +{0x34,0x01000000}, +{0x38,0x01000000}, +{0x3c,0xbc102cfc}, +{0x40,0x9c102cf8}, +{0x44,0x01000000}, +{0x48,0x01000000}, +{0x4c,0x27001040}, +{0x50,0xa614e00f}, +{0x54,0xe6a00040}, +{0x58,0x01000000}, +{0x5c,0x40000309}, +{0x60,0x01000000}, +{0x64,0x01000000}, +{0x68,0x10bfffff}, +{0x6c,0x01000000}, +{0x70,0x03169684}, +{0x74,0x82106053}, +{0x78,0x0329694d}, +{0x7c,0x82106270}, +{0xf0,0x1a}, +{0x00,0x9de3bf98}, +{0x04,0x40000010}, +{0x08,0x01000000}, +{0x0c,0x40000007}, +{0x10,0x01000000}, +{0x14,0x40000317}, +{0x18,0x01000000}, +{0x1c,0x40000015}, +{0x20,0x01000000}, +{0x24,0x30bffffe}, +{0x28,0x82102001}, +{0x2c,0x81904000}, +{0x30,0x01000000}, +{0x34,0x01000000}, +{0x38,0x01000000}, +{0x3c,0x81c3e008}, +{0x40,0x01000000}, +{0x44,0x03000008}, +{0x48,0x82106342}, +{0x4c,0xa3804000}, +{0x50,0x03000004}, +{0x54,0x82106000}, +{0x58,0x81984000}, +{0x5c,0x01000000}, +{0x60,0x01000000}, +{0x64,0x01000000}, +{0x68,0x81c3e008}, +{0x6c,0x01000000}, +{0x70,0x01000000}, +{0x74,0x01000000}, +{0x78,0x01000000}, +{0x7c,0xa7800000}, +{0xf0,0x1b}, +{0x00,0x01000000}, +{0x04,0x01000000}, +{0x08,0x01000000}, +{0x0c,0x81c3e008}, +{0x10,0x01000000}, +{0x14,0x80a22000}, +{0x18,0x02800006}, +{0x1c,0x01000000}, +{0x20,0x01000000}, +{0x24,0x90823fff}, +{0x28,0x12bffffe}, +{0x2c,0x01000000}, +{0x30,0x81c3e008}, +{0x34,0x01000000}, +{0x38,0x01000000}, +{0x3c,0x05001040}, +{0x40,0x8410a00f}, +{0x44,0xc4a00040}, +{0x48,0x01000000}, +{0x4c,0x81c3e008}, +{0x50,0x01000000}, +{0x54,0x9de3bec8}, +{0x58,0xb2067fff}, +{0x5c,0x96100018}, +{0x60,0xf227bf2c}, +{0x64,0xc027bf28}, +{0x68,0x98102000}, +{0x6c,0xb007bff8}, +{0x70,0xd4063f30}, +{0x74,0xda063f34}, +{0x78,0xb810000a}, +{0x7c,0x98033fff}, +{0xf0,0x1c}, +{0x00,0xb0063ff8}, +{0x04,0x80a2800d}, +{0x08,0x16800031}, +{0x0c,0xb610000d}, +{0x10,0xbb2aa002}, +{0x14,0x832b6002}, +{0x18,0xb207400b}, +{0x1c,0xb400400b}, +{0x20,0xde02c01d}, +{0x24,0x80a7001b}, +{0x28,0x1680001c}, +{0x2c,0x01000000}, +{0x30,0xc2068000}, +{0x34,0x80a0400f}, +{0x38,0x04800005}, +{0x3c,0x80a7001b}, +{0x40,0xb606ffff}, +{0x44,0x10bffff8}, +{0x48,0xb406bffc}, +{0x4c,0x16800013}, +{0x50,0x80a7001b}, +{0x54,0xc2068000}, +{0x58,0xc2264000}, +{0x5c,0xb8072001}, +{0x60,0x80a7001b}, +{0x64,0x1680000d}, +{0x68,0xb2066004}, +{0x6c,0xc2064000}, +{0x70,0x80a0400f}, +{0x74,0x26bffffb}, +{0x78,0xb8072001}, +{0x7c,0x80a7001b}, +{0xf0,0x1d}, +{0x00,0x16800006}, +{0x04,0x01000000}, +{0x08,0xc2268000}, +{0x0c,0xb606ffff}, +{0x10,0xb406bffc}, +{0x14,0x80a7001b}, +{0x18,0x12bfffe4}, +{0x1c,0x80a7001b}, +{0x20,0xb0062008}, +{0x24,0x82073fff}, +{0x28,0xc2263f34}, +{0x2c,0xd4263f30}, +{0x30,0x832f2002}, +{0x34,0xb0062008}, +{0x38,0xde22c001}, +{0x3c,0xba072001}, +{0x40,0xfa263f30}, +{0x44,0xda263f34}, +{0x48,0x98032002}, +{0x4c,0x80a33fff}, +{0x50,0x34bfffc9}, +{0x54,0xd4063f30}, +{0x58,0x81c7e008}, +{0x5c,0x81e80000}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0x20}, +{0x00,0x83580000}, +{0x04,0x82086ff0}, +{0x08,0x83306004}, +{0x0c,0x80a06005}, +{0x10,0x02800027}, +{0x14,0x01000000}, +{0x18,0x80a06006}, +{0x1c,0x0280003c}, +{0x20,0x01000000}, +{0x24,0x80a06015}, +{0x28,0x02800054}, +{0x2c,0x01000000}, +{0x30,0x80a0602a}, +{0x34,0x02800090}, +{0x38,0x01000000}, +{0x3c,0x80a06018}, +{0x40,0x02800085}, +{0x44,0x01000000}, +{0x48,0x073fc180}, +{0x4c,0x8610e03c}, +{0x50,0x05169680}, +{0x54,0x84004002}, +{0x58,0xc420c000}, +{0x5c,0x073fc000}, +{0x60,0x8610e020}, +{0x64,0x84102001}, +{0x68,0xc420c000}, +{0x6c,0x0500000c}, +{0x70,0x01000000}, +{0x74,0x01000000}, +{0x78,0x8480bfff}, +{0x7c,0x12bffffe}, +{0xf0,0x21}, +{0x00,0x01000000}, +{0x04,0x01000000}, +{0x08,0x073fc000}, +{0x0c,0x8610e020}, +{0x10,0x84102000}, +{0x14,0xc420c000}, +{0x18,0x01000000}, +{0x1c,0x01000000}, +{0x20,0x81c44000}, +{0x24,0x81cc8000}, +{0x28,0x01000000}, +{0x2c,0xa7500000}, +{0x30,0xa92ce002}, +{0x34,0xa734e001}, +{0x38,0xa614c014}, +{0x3c,0xa60ce007}, +{0x40,0x81900000}, +{0x44,0x01000000}, +{0x48,0x01000000}, +{0x4c,0x81e00000}, +{0x50,0xe03ba000}, +{0x54,0xe43ba008}, +{0x58,0xe83ba010}, +{0x5c,0xec3ba018}, +{0x60,0xf03ba020}, +{0x64,0xf43ba028}, +{0x68,0xf83ba030}, +{0x6c,0xfc3ba038}, +{0x70,0x81e80000}, +{0x74,0x8194c000}, +{0x78,0x01000000}, +{0x7c,0x01000000}, +{0xf0,0x22}, +{0x00,0x81c44000}, +{0x04,0x81cc8000}, +{0x08,0x01000000}, +{0x0c,0xa7500000}, +{0x10,0xa934e002}, +{0x14,0xa72ce001}, +{0x18,0xa614c014}, +{0x1c,0xa60ce007}, +{0x20,0x81900000}, +{0x24,0x01000000}, +{0x28,0x01000000}, +{0x2c,0x81e80000}, +{0x30,0x81e80000}, +{0x34,0xe01ba000}, +{0x38,0xe41ba008}, +{0x3c,0xe81ba010}, +{0x40,0xec1ba018}, +{0x44,0xf01ba020}, +{0x48,0xf41ba028}, +{0x4c,0xf81ba030}, +{0x50,0xfc1ba038}, +{0x54,0x81e00000}, +{0x58,0x81e00000}, +{0x5c,0x8194c000}, +{0x60,0x01000000}, +{0x64,0x01000000}, +{0x68,0x81c44000}, +{0x6c,0x81cc8000}, +{0x70,0x01000000}, +{0x74,0x01000000}, +{0x78,0x82102010}, +{0x7c,0x273fc0c0}, +{0xf0,0x23}, +{0x00,0xa614e010}, +{0x04,0xc224c000}, +{0x08,0x01000000}, +{0x0c,0x033fc0c0}, +{0x10,0x82106004}, +{0x14,0xa6102000}, +{0x18,0xe6204000}, +{0x1c,0x01000000}, +{0x20,0x01000000}, +{0x24,0x01000000}, +{0x28,0xa6102020}, +{0x2c,0x83480000}, +{0x30,0x82104013}, +{0x34,0x81884000}, +{0x38,0x01000000}, +{0x3c,0x40000433}, +{0x40,0x01000000}, +{0x44,0x01000000}, +{0x48,0x01000000}, +{0x4c,0xa7500000}, +{0x50,0xa934e002}, +{0x54,0xa72ce001}, +{0x58,0xa614c014}, +{0x5c,0xa60ce007}, +{0x60,0x81900000}, +{0x64,0x01000000}, +{0x68,0x81e80000}, +{0x6c,0xe01ba000}, +{0x70,0xe41ba008}, +{0x74,0xe81ba010}, +{0x78,0xec1ba018}, +{0x7c,0xf01ba020}, +{0xf0,0x24}, +{0x00,0xf41ba028}, +{0x04,0xf81ba030}, +{0x08,0xfc1ba038}, +{0x0c,0x81e00000}, +{0x10,0x8194c000}, +{0x14,0x01000000}, +{0x18,0xa6102020}, +{0x1c,0x83480000}, +{0x20,0x82284013}, +{0x24,0x81884000}, +{0x28,0x01000000}, +{0x2c,0x033fc0c0}, +{0x30,0x82106004}, +{0x34,0xa6103fff}, +{0x38,0xe6204000}, +{0x3c,0x01000000}, +{0x40,0x01000000}, +{0x44,0x01000000}, +{0x48,0x81c44000}, +{0x4c,0x81cc8000}, +{0x50,0x01000000}, +{0x54,0x82102080}, +{0x58,0x273fc0c0}, +{0x5c,0xa614e010}, +{0x60,0xc224c000}, +{0x64,0x01000000}, +{0x68,0x81c44000}, +{0x6c,0x81cc8000}, +{0x70,0x01000000}, +{0x74,0x81c48000}, +{0x78,0x81cca004}, +{0x7c,0x01000000}, +{0xf0,0x25}, +{0x00,0x1b3fc140}, +{0x04,0x82136048}, +{0x08,0xc2104000}, +{0x0c,0x82006003}, +{0x10,0x82086003}, +{0x14,0x83286002}, +{0x18,0x9a136080}, +{0x1c,0x81c3e008}, +{0x20,0xd000400d}, +{0x24,0x94102000}, +{0x28,0x96102000}, +{0x2c,0x832ae002}, +{0x30,0xd20063a4}, +{0x34,0x98102000}, +{0x38,0x832b2002}, +{0x3c,0x9b2aa002}, +{0x40,0xda02000d}, +{0x44,0x98032001}, +{0x48,0xda224001}, +{0x4c,0x80a32005}, +{0x50,0x04bffffa}, +{0x54,0x9402a001}, +{0x58,0x9602e001}, +{0x5c,0x80a2e003}, +{0x60,0x04bffff4}, +{0x64,0x832ae002}, +{0x68,0x81c3e008}, +{0x6c,0x01000000}, +{0x70,0x82020008}, +{0x74,0x82004008}, +{0x78,0x9b326002}, +{0x7c,0x82004001}, +{0xf0,0x26}, +{0x00,0x8200400d}, +{0x04,0x83286002}, +{0x08,0x920a6003}, +{0x0c,0x932a6003}, +{0x10,0xd00065b0}, +{0x14,0x91320009}, +{0x18,0x81c3e008}, +{0x1c,0x900a20ff}, +{0x20,0x9a020008}, +{0x24,0x9a034008}, +{0x28,0x97326002}, +{0x2c,0x9a03400d}, +{0x30,0x9a03400b}, +{0x34,0x920a6003}, +{0x38,0x9b2b6002}, +{0x3c,0x932a6003}, +{0x40,0x821020ff}, +{0x44,0xd80365b0}, +{0x48,0x83284009}, +{0x4c,0x822b0001}, +{0x50,0x952a8009}, +{0x54,0x8210400a}, +{0x58,0xc22365b0}, +{0x5c,0x912a2002}, +{0x60,0xda0223a4}, +{0x64,0x972ae002}, +{0x68,0x81c3e008}, +{0x6c,0xc223400b}, +{0x70,0x9a102005}, +{0x74,0x8210200b}, +{0x78,0x9a234008}, +{0x7c,0x82204008}, +{0xf0,0x27}, +{0x00,0x9b2b6002}, +{0x04,0x80a22005}, +{0x08,0x14800007}, +{0x0c,0x99286002}, +{0x10,0x033fc200}, +{0x14,0x8210600c}, +{0x18,0xc2004000}, +{0x1c,0x10800006}, +{0x20,0x8330400d}, +{0x24,0x033fc200}, +{0x28,0x82106008}, +{0x2c,0xc2004000}, +{0x30,0x8330400c}, +{0x34,0x81c3e008}, +{0x38,0x9008600f}, +{0x3c,0x9de3bf30}, +{0x40,0xa12e2002}, +{0x44,0xda1423da}, +{0x48,0xd61423d8}, +{0x4c,0xc200247c}, +{0x50,0xb022c00d}, +{0x54,0x825b4001}, +{0x58,0xb21e6001}, +{0x5c,0x92862001}, +{0x60,0x0280000c}, +{0x64,0x9a004019}, +{0x68,0xb0100009}, +{0x6c,0x9807bf90}, +{0x70,0x8203400d}, +{0x74,0xc2168001}, +{0x78,0xc2230000}, +{0x7c,0xc200247c}, +{0xf0,0x28}, +{0x00,0x9a034001}, +{0x04,0xb0863fff}, +{0x08,0x12bffffa}, +{0x0c,0x98032004}, +{0x10,0x7ffffe71}, +{0x14,0x9007bf90}, +{0x18,0xda1423ea}, +{0x1c,0xd61423e8}, +{0x20,0x80a3400b}, +{0x24,0x92102000}, +{0x28,0x1880000b}, +{0x2c,0xb010000d}, +{0x30,0x832b6002}, +{0x34,0x8200401e}, +{0x38,0x98007f90}, +{0x3c,0xc2030000}, +{0x40,0xb0062001}, +{0x44,0x92024001}, +{0x48,0x80a6000b}, +{0x4c,0x08bffffc}, +{0x50,0x98032004}, +{0x54,0xb022c00d}, +{0x58,0xb0062001}, +{0x5c,0x81800000}, +{0x60,0x01000000}, +{0x64,0x01000000}, +{0x68,0x01000000}, +{0x6c,0xb0724018}, +{0x70,0x81c7e008}, +{0x74,0x81e80000}, +{0x78,0x033fc200}, +{0x7c,0x961060a0}, +{0xf0,0x29}, +{0x00,0x98102000}, +{0x04,0x832b2002}, +{0x08,0x9a03000c}, +{0x0c,0xda136400}, +{0x10,0x98032001}, +{0x14,0x80a32019}, +{0x18,0x04bffffb}, +{0x1c,0xda20400b}, +{0x20,0x81c3e008}, +{0x24,0x01000000}, +{0x28,0x9de3bf98}, +{0x2c,0xc200247c}, +{0x30,0x83306001}, +{0x34,0x80a60001}, +{0x38,0x1a800006}, +{0x3c,0x90100018}, +{0x40,0x7fffffac}, +{0x44,0x01000000}, +{0x48,0x10800006}, +{0x4c,0xb0020008}, +{0x50,0x7fffffa8}, +{0x54,0x90260001}, +{0x58,0x90020008}, +{0x5c,0xb0022001}, +{0x60,0x81c7e008}, +{0x64,0x81e80000}, +{0x68,0x9de3bf98}, +{0x6c,0xa8102000}, +{0x70,0xc20023d4}, +{0x74,0x80a50001}, +{0x78,0x1a800057}, +{0x7c,0xe2002348}, +{0xf0,0x2a}, +{0x00,0xa4102000}, +{0x04,0xc200247c}, +{0x08,0x80a48001}, +{0x0c,0x3a80004e}, +{0x10,0xa8052001}, +{0x14,0x7fffffe5}, +{0x18,0x90100012}, +{0x1c,0xaa100008}, +{0x20,0x90100014}, +{0x24,0x7fffff73}, +{0x28,0x92100015}, +{0x2c,0x80a62000}, +{0x30,0x12800004}, +{0x34,0xa0100008}, +{0x38,0x10800016}, +{0x3c,0xa0102000}, +{0x40,0x80a62009}, +{0x44,0x18800011}, +{0x48,0x80a62007}, +{0x4c,0x7fffff4d}, +{0x50,0x01000000}, +{0x54,0x94100008}, +{0x58,0x90100014}, +{0x5c,0x7fffff98}, +{0x60,0x92100012}, +{0x64,0x80a20011}, +{0x68,0x04800007}, +{0x6c,0xa6100008}, +{0x70,0x9a102008}, +{0x74,0x9a234018}, +{0x78,0x82102001}, +{0x7c,0x8328400d}, +{0xf0,0x2b}, +{0x00,0xa02c0001}, +{0x04,0x80a62007}, +{0x08,0x18800008}, +{0x0c,0x80a62008}, +{0x10,0x9a102007}, +{0x14,0x9a234018}, +{0x18,0x82102001}, +{0x1c,0x8328400d}, +{0x20,0x10800023}, +{0x24,0xa0140001}, +{0x28,0x1280000a}, +{0x2c,0x821e2009}, +{0x30,0x80a420fe}, +{0x34,0x24800002}, +{0x38,0xa0042001}, +{0x3c,0x03000018}, +{0x40,0x9b2ca002}, +{0x44,0x821060e0}, +{0x48,0x10800019}, +{0x4c,0xe6234001}, +{0x50,0x80a00001}, +{0x54,0x9a603fff}, +{0x58,0x80a420fe}, +{0x5c,0x04800003}, +{0x60,0x82102001}, +{0x64,0x82102000}, +{0x68,0x808b4001}, +{0x6c,0x02800011}, +{0x70,0x92100015}, +{0x74,0x03000018}, +{0x78,0x9b2ca002}, +{0x7c,0x821060e0}, +{0xf0,0x2c}, +{0x00,0xc2034001}, +{0x04,0x80a04011}, +{0x08,0x18800003}, +{0x0c,0x9a204011}, +{0x10,0x9a244001}, +{0x14,0x80a4c011}, +{0x18,0x14800003}, +{0x1c,0x8224c011}, +{0x20,0x82244013}, +{0x24,0x80a34001}, +{0x28,0xa0642000}, +{0x2c,0x92100015}, +{0x30,0x94100010}, +{0x34,0x7fffff3b}, +{0x38,0x90100014}, +{0x3c,0x10bfffb2}, +{0x40,0xa404a001}, +{0x44,0xc20023d4}, +{0x48,0x80a50001}, +{0x4c,0x0abfffae}, +{0x50,0xa4102000}, +{0x54,0x81c7e008}, +{0x58,0x81e80000}, +{0x5c,0x98102000}, +{0x60,0x9610201e}, +{0x64,0x80a22000}, +{0x68,0x12800003}, +{0x6c,0x8210000c}, +{0x70,0x8222c00c}, +{0x74,0x83286002}, +{0x78,0xda006480}, +{0x7c,0x80a37ff0}, +{0xf0,0x2d}, +{0x00,0x02800006}, +{0x04,0x98032002}, +{0x08,0xc2006484}, +{0x0c,0x80a3201f}, +{0x10,0x04bffff5}, +{0x14,0xc2234000}, +{0x18,0x81c3e008}, +{0x1c,0x01000000}, +{0x20,0x9de3bf98}, +{0x24,0xda002508}, +{0x28,0x033fc000}, +{0x2c,0x9a0b4001}, +{0x30,0x173fc180}, +{0x34,0x03202020}, +{0x38,0x82106080}, +{0x3c,0x9812e038}, +{0x40,0xc2230000}, +{0x44,0x03168000}, +{0x48,0x80a34001}, +{0x4c,0xc022c000}, +{0x50,0xa6102000}, +{0x54,0x1280000b}, +{0x58,0xa8102000}, +{0x5c,0x0300003f}, +{0x60,0xda002548}, +{0x64,0x821063ff}, +{0x68,0x9a0b4001}, +{0x6c,0xd8002508}, +{0x70,0x033fffc0}, +{0x74,0x980b0001}, +{0x78,0x9a13400c}, +{0x7c,0xda202548}, +{0xf0,0x2e}, +{0x00,0x80a62000}, +{0x04,0x16800028}, +{0x08,0x1b296956}, +{0x0c,0x1b3fc040}, +{0x10,0xc2002548}, +{0x14,0x8208400d}, +{0x18,0x1b168040}, +{0x1c,0x80a0400d}, +{0x20,0x22800002}, +{0x24,0xa6102001}, +{0x28,0xda002654}, +{0x2c,0xc20021dc}, +{0x30,0x80a34001}, +{0x34,0x1a80001c}, +{0x38,0x1b296956}, +{0x3c,0x031696a9}, +{0x40,0xda00250c}, +{0x44,0x821061a5}, +{0x48,0x80a34001}, +{0x4c,0x02800006}, +{0x50,0x03296956}, +{0x54,0x8210625a}, +{0x58,0x80a34001}, +{0x5c,0x12800012}, +{0x60,0x1b296956}, +{0x64,0x11000016}, +{0x68,0x13000017}, +{0x6c,0x90122330}, +{0x70,0x40000167}, +{0x74,0x92126208}, +{0x78,0x03000018}, +{0x7c,0x96106260}, +{0xf0,0x2f}, +{0x00,0xa8102001}, +{0x04,0x98102000}, +{0x08,0x9b2b2002}, +{0x0c,0x98032001}, +{0x10,0xc20365b0}, +{0x14,0x80a32017}, +{0x18,0x08bffffc}, +{0x1c,0xc223400b}, +{0x20,0x1b296956}, +{0x24,0x80a00013}, +{0x28,0x82380018}, +{0x2c,0xa413625a}, +{0x30,0x90402000}, +{0x34,0x8330601f}, +{0x38,0x1b1696a9}, +{0x3c,0xa21361a5}, +{0x40,0x9e104008}, +{0x44,0xd400254c}, +{0x48,0xe0002548}, +{0x4c,0x98102500}, +{0x50,0xc200250c}, +{0x54,0x96033a50}, +{0x58,0x921b250c}, +{0x5c,0x80a04012}, +{0x60,0x02800007}, +{0x64,0x9a184011}, +{0x68,0x80a0000d}, +{0x6c,0x82603fff}, +{0x70,0x80904008}, +{0x74,0x0280000a}, +{0x78,0x80a3e000}, +{0x7c,0x80a2e0e0}, +{0xf0,0x30}, +{0x00,0x9a402000}, +{0x04,0x80a00009}, +{0x08,0x82603fff}, +{0x0c,0x80934001}, +{0x10,0x3280000a}, +{0x14,0x98032004}, +{0x18,0x80a3e000}, +{0x1c,0x02800005}, +{0x20,0x82033970}, +{0x24,0x80a0603f}, +{0x28,0x28800004}, +{0x2c,0x98032004}, +{0x30,0xc0230000}, +{0x34,0x98032004}, +{0x38,0x80a32867}, +{0x3c,0x28bfffe6}, +{0x40,0xc200250c}, +{0x44,0x80a62000}, +{0x48,0x06800006}, +{0x4c,0x0300003f}, +{0x50,0x821063ff}, +{0x54,0x820a8001}, +{0x58,0x10800005}, +{0x5c,0xc220254c}, +{0x60,0xc21022d4}, +{0x64,0x83286010}, +{0x68,0xc2202690}, +{0x6c,0xc2002548}, +{0x70,0xd6002334}, +{0x74,0xda0023c8}, +{0x78,0x9602e001}, +{0x7c,0xd800254c}, +{0xf0,0x31}, +{0x00,0x90087dff}, +{0x04,0x9b336012}, +{0x08,0x94050014}, +{0x0c,0x9a0b6200}, +{0x10,0x980b3ffd}, +{0x14,0x8332e001}, +{0x18,0x9813000a}, +{0x1c,0x9012000d}, +{0x20,0x1f3fc200}, +{0x24,0x8202c001}, +{0x28,0xda002344}, +{0x2c,0x9413e030}, +{0x30,0xd820254c}, +{0x34,0xc220258c}, +{0x38,0xda228000}, +{0x3c,0x93342018}, +{0x40,0xda20257c}, +{0x44,0x80a2605a}, +{0x48,0xd6202554}, +{0x4c,0xd6202588}, +{0x50,0xd0202548}, +{0x54,0x12800009}, +{0x58,0xda202570}, +{0x5c,0x0300003f}, +{0x60,0x821063ff}, +{0x64,0x1b3fffc0}, +{0x68,0x820a0001}, +{0x6c,0x9a0c000d}, +{0x70,0x8210400d}, +{0x74,0xc2202548}, +{0x78,0x80a4e001}, +{0x7c,0x1280000c}, +{0xf0,0x32}, +{0x00,0x03296956}, +{0x04,0xc2002548}, +{0x08,0x83306012}, +{0x0c,0x80886001}, +{0x10,0x32800010}, +{0x14,0x82102029}, +{0x18,0x9a13e074}, +{0x1c,0xc2002330}, +{0x20,0xc2234000}, +{0x24,0x1080000b}, +{0x28,0x82102029}, +{0x2c,0xda00250c}, +{0x30,0x8210625a}, +{0x34,0x80a34001}, +{0x38,0x1280000b}, +{0x3c,0x01000000}, +{0x40,0xc200254c}, +{0x44,0x80886002}, +{0x48,0x12800007}, +{0x4c,0x82102015}, +{0x50,0xc2202500}, +{0x54,0x7ffffe54}, +{0x58,0x901025b0}, +{0x5c,0x7ffffec7}, +{0x60,0x81e80000}, +{0x64,0x01000000}, +{0x68,0x81c7e008}, +{0x6c,0x81e80000}, +{0x70,0x9de3bf98}, +{0x74,0x40000229}, +{0x78,0x90102000}, +{0x7c,0x133fc200}, +{0xf0,0x33}, +{0x00,0xe80021fc}, +{0x04,0xc2002298}, +{0x08,0x98126070}, +{0x0c,0xc2230000}, +{0x10,0x033fc000}, +{0x14,0xd8002338}, +{0x18,0x82106030}, +{0x1c,0xd8204000}, +{0x20,0xc200232c}, +{0x24,0x90126074}, +{0x28,0xc2220000}, +{0x2c,0x1b3fc140}, +{0x30,0x0300003f}, +{0x34,0xa013608c}, +{0x38,0x9e136058}, +{0x3c,0xa213605c}, +{0x40,0xa4136080}, +{0x44,0xa6136084}, +{0x48,0x821063ff}, +{0x4c,0x15000015}, +{0x50,0xc223c000}, +{0x54,0x9412a180}, +{0x58,0x9a136088}, +{0x5c,0x17000016}, +{0x60,0xd4234000}, +{0x64,0x9612e058}, +{0x68,0x03200040}, +{0x6c,0xd6240000}, +{0x70,0x82106101}, +{0x74,0xc2224000}, +{0x78,0x033fc0c0}, +{0x7c,0x82106004}, +{0xf0,0x34}, +{0x00,0xc0204000}, +{0x04,0xc0244000}, +{0x08,0xd4248000}, +{0x0c,0xd624c000}, +{0x10,0x80a52000}, +{0x14,0xc2002374}, +{0x18,0xda00247c}, +{0x1c,0xd60022f8}, +{0x20,0xd40023f8}, +{0x24,0x02800006}, +{0x28,0xd00023fc}, +{0x2c,0x82584014}, +{0x30,0x82006800}, +{0x34,0x10800003}, +{0x38,0xa330600c}, +{0x3c,0xa2100001}, +{0x40,0x213fc140}, +{0x44,0x98142040}, +{0x48,0xd2030000}, +{0x4c,0x9b336001}, +{0x50,0x825b400b}, +{0x54,0x920a7800}, +{0x58,0x92124001}, +{0x5c,0xd2230000}, +{0x60,0x82142004}, +{0x64,0xd2004000}, +{0x68,0x920a7fe0}, +{0x6c,0x253fc200}, +{0x70,0x9212400d}, +{0x74,0xd2204000}, +{0x78,0x9814a080}, +{0x7c,0xd2030000}, +{0xf0,0x35}, +{0x00,0x920a7fe0}, +{0x04,0x9212400d}, +{0x08,0xd2230000}, +{0x0c,0x8214a00c}, +{0x10,0xd4204000}, +{0x14,0x9a14a008}, +{0x18,0x7ffffe78}, +{0x1c,0xd0234000}, +{0x20,0x9a14a07c}, +{0x24,0xd2034000}, +{0x28,0x033ff000}, +{0x2c,0x922a4001}, +{0x30,0xd2234000}, +{0x34,0x033fc1c0}, +{0x38,0xda002340}, +{0x3c,0x82106064}, +{0x40,0xda204000}, +{0x44,0x0300007f}, +{0x48,0x96142010}, +{0x4c,0x821063ff}, +{0x50,0x94142030}, +{0x54,0x1907ffc0}, +{0x58,0xc222c000}, +{0x5c,0xa0142014}, +{0x60,0xd8228000}, +{0x64,0x80a46000}, +{0x68,0x0280000f}, +{0x6c,0xd8240000}, +{0x70,0x932c6010}, +{0x74,0x82046001}, +{0x78,0x9b2c6004}, +{0x7c,0x83286010}, +{0xf0,0x36}, +{0x00,0x9a02400d}, +{0x04,0x9814a084}, +{0x08,0xda230000}, +{0x0c,0x82004011}, +{0x10,0x9614a088}, +{0x14,0x82006002}, +{0x18,0x9414a08c}, +{0x1c,0xd222c000}, +{0x20,0xc2228000}, +{0x24,0xc2002174}, +{0x28,0x80a06000}, +{0x2c,0x02800007}, +{0x30,0x173fc080}, +{0x34,0xc2082174}, +{0x38,0xda082177}, +{0x3c,0x9812e008}, +{0x40,0xc2230000}, +{0x44,0xda22c000}, +{0x48,0x7ffffed6}, +{0x4c,0x90103fff}, +{0x50,0x7ffffec3}, +{0x54,0x90102001}, +{0x58,0x1b3fc0c0}, +{0x5c,0x82103fff}, +{0x60,0x9a136004}, +{0x64,0xc2234000}, +{0x68,0x03200040}, +{0x6c,0xc2248000}, +{0x70,0x81c7e008}, +{0x74,0x81e80000}, +{0x78,0x9de3bf98}, +{0x7c,0xc2002508}, +{0xf0,0x37}, +{0x00,0x808860ff}, +{0x04,0x02800015}, +{0x08,0x1b3fc180}, +{0x0c,0x82102001}, +{0x10,0x9a13603c}, +{0x14,0xc2234000}, +{0x18,0xc2002508}, +{0x1c,0x820860ff}, +{0x20,0x80a04018}, +{0x24,0x1280000b}, +{0x28,0x033fc180}, +{0x2c,0x7ffffc83}, +{0x30,0x01000000}, +{0x34,0xda002508}, +{0x38,0x033fc040}, +{0x3c,0x9a0b60ff}, +{0x40,0x8210600c}, +{0x44,0xc0204000}, +{0x48,0x10bffff7}, +{0x4c,0x80a34018}, +{0x50,0x8210603c}, +{0x54,0xc0204000}, +{0x58,0x81c7e008}, +{0x5c,0x81e80000}, +{0x60,0x9a102000}, +{0x64,0x832b6002}, +{0x68,0x9a036001}, +{0x6c,0x80a360b5}, +{0x70,0x08bffffd}, +{0x74,0xc0220001}, +{0x78,0x81c3e008}, +{0x7c,0x01000000}, +{0xf0,0x38}, +{0x00,0xc20022f8}, +{0x04,0xda00247c}, +{0x08,0x8258400d}, +{0x0c,0x83306001}, +{0x10,0x96102000}, +{0x14,0x80a2c001}, +{0x18,0x1a80003b}, +{0x1c,0x0300003f}, +{0x20,0x941063ff}, +{0x24,0x98102000}, +{0x28,0x80a26001}, +{0x2c,0x0280002e}, +{0x30,0x80a26004}, +{0x34,0x12800008}, +{0x38,0x80a26008}, +{0x3c,0xc2030008}, +{0x40,0x9a08400a}, +{0x44,0x83306012}, +{0x48,0x83286010}, +{0x4c,0x10800014}, +{0x50,0x9b336002}, +{0x54,0x28800015}, +{0x58,0xda02000c}, +{0x5c,0xda030008}, +{0x60,0x83336010}, +{0x64,0x82004001}, +{0x68,0x9a0b400a}, +{0x6c,0x81800000}, +{0x70,0x01000000}, +{0x74,0x01000000}, +{0x78,0x01000000}, +{0x7c,0x82704009}, +{0xf0,0x39}, +{0x00,0x9a03400d}, +{0x04,0x83286010}, +{0x08,0x81800000}, +{0x0c,0x01000000}, +{0x10,0x01000000}, +{0x14,0x01000000}, +{0x18,0x9a734009}, +{0x1c,0x8200400d}, +{0x20,0x10800011}, +{0x24,0xc2230008}, +{0x28,0x83336010}, +{0x2c,0x81800000}, +{0x30,0x01000000}, +{0x34,0x01000000}, +{0x38,0x01000000}, +{0x3c,0x82704009}, +{0x40,0x9a0b400a}, +{0x44,0x83286010}, +{0x48,0x81800000}, +{0x4c,0x01000000}, +{0x50,0x01000000}, +{0x54,0x01000000}, +{0x58,0x9a734009}, +{0x5c,0x8200400d}, +{0x60,0xc222000c}, +{0x64,0xc20022f8}, +{0x68,0xda00247c}, +{0x6c,0x8258400d}, +{0x70,0x9602e001}, +{0x74,0x83306001}, +{0x78,0x80a2c001}, +{0x7c,0x0abfffcb}, +{0xf0,0x3a}, +{0x00,0x98032004}, +{0x04,0x81c3e008}, +{0x08,0x01000000}, +{0x0c,0x98102000}, +{0x10,0x9b2b2002}, +{0x14,0x98032001}, +{0x18,0xc202000d}, +{0x1c,0x80a320b5}, +{0x20,0x04bffffc}, +{0x24,0xc222400d}, +{0x28,0x81c3e008}, +{0x2c,0x01000000}, +{0x30,0xd6020000}, +{0x34,0xd8024000}, +{0x38,0x9132e010}, +{0x3c,0x95332010}, +{0x40,0x900a2fff}, +{0x44,0x940aafff}, +{0x48,0x03000007}, +{0x4c,0x9a22000a}, +{0x50,0x821063ff}, +{0x54,0x940b0001}, +{0x58,0x900ac001}, +{0x5c,0x9022000a}, +{0x60,0x9a5b400d}, +{0x64,0x905a0008}, +{0x68,0x81c3e008}, +{0x6c,0x90034008}, +{0x70,0x9de3bf88}, +{0x74,0x832e6004}, +{0x78,0x82004018}, +{0x7c,0x3b000018}, +{0xf0,0x3b}, +{0x00,0xba1760e0}, +{0x04,0x83286002}, +{0x08,0xf400401d}, +{0x0c,0x033fc000}, +{0x10,0x82106001}, +{0x14,0xc227bfe8}, +{0x18,0x03000040}, +{0x1c,0xc227bfec}, +{0x20,0x033fc040}, +{0x24,0x821061fe}, +{0x28,0xc227bff0}, +{0x2c,0x0300bf80}, +{0x30,0x82106101}, +{0x34,0xc227bff4}, +{0x38,0x9e10001d}, +{0x3c,0xb6102000}, +{0x40,0x9a07bff8}, +{0x44,0xba06c00d}, +{0x48,0xc24f7ff0}, +{0x4c,0xb0060001}, +{0x50,0xc24f7ff8}, +{0x54,0xb2064001}, +{0x58,0x82067fff}, +{0x5c,0x82164001}, +{0x60,0x80a62000}, +{0x64,0x0480001c}, +{0x68,0xbb30601f}, +{0x6c,0xc2002308}, +{0x70,0x80a04018}, +{0x74,0x82402000}, +{0x78,0x8090401d}, +{0x7c,0x32800017}, +{0xf0,0x3c}, +{0x00,0xb606e001}, +{0x04,0xc2002300}, +{0x08,0x80a64001}, +{0x0c,0x18800012}, +{0x10,0xbb2e6004}, +{0x14,0x82074018}, +{0x18,0x80a6e003}, +{0x1c,0x14800008}, +{0x20,0xb9286002}, +{0x24,0xc207000f}, +{0x28,0x80a0401a}, +{0x2c,0x2680000b}, +{0x30,0xb606e001}, +{0x34,0x1080000d}, +{0x38,0xb0102000}, +{0x3c,0xc207000f}, +{0x40,0x80a0401a}, +{0x44,0x24800005}, +{0x48,0xb606e001}, +{0x4c,0x10800007}, +{0x50,0xb0102000}, +{0x54,0xb606e001}, +{0x58,0x80a6e007}, +{0x5c,0x04bfffdb}, +{0x60,0xba06c00d}, +{0x64,0xb0102001}, +{0x68,0x81c7e008}, +{0x6c,0x81e80000}, +{0x70,0xc2002548}, +{0x74,0x82087fbf}, +{0x78,0xc2202548}, +{0x7c,0xc020255c}, +{0xf0,0x3d}, +{0x00,0xc0202514}, +{0x04,0x9a102000}, +{0x08,0x832b6002}, +{0x0c,0x9a036001}, +{0x10,0xc0206738}, +{0x14,0x80a36009}, +{0x18,0x04bffffc}, +{0x1c,0xc0206710}, +{0x20,0x81c3e008}, +{0x24,0x01000000}, +{0x28,0x9de3bf88}, +{0x2c,0x82063fff}, +{0x30,0xb8067fff}, +{0x34,0x82160001}, +{0x38,0xba16401c}, +{0x3c,0x80974001}, +{0x40,0xa410001a}, +{0x44,0x0680007c}, +{0x48,0xa210001b}, +{0x4c,0xc2002308}, +{0x50,0x80a60001}, +{0x54,0x38800079}, +{0x58,0xb0102000}, +{0x5c,0xc2002300}, +{0x60,0x80a64001}, +{0x64,0x38800075}, +{0x68,0xb0102000}, +{0x6c,0x96062001}, +{0x70,0x98066001}, +{0x74,0xa007bff8}, +{0x78,0x8207bfe8}, +{0x7c,0xb0102003}, +{0xf0,0x3e}, +{0x00,0xc0204000}, +{0x04,0xb0863fff}, +{0x08,0x1cbffffe}, +{0x0c,0x82006004}, +{0x10,0xc2002160}, +{0x14,0x80886004}, +{0x18,0x0280000f}, +{0x1c,0xb0102004}, +{0x20,0x80a66001}, +{0x24,0x0280000b}, +{0x28,0x821021ff}, +{0x2c,0xc2002308}, +{0x30,0x80a60001}, +{0x34,0x02800007}, +{0x38,0x821021ff}, +{0x3c,0xc2002300}, +{0x40,0x80a64001}, +{0x44,0x12800005}, +{0x48,0x80a7000c}, +{0x4c,0x821021ff}, +{0x50,0xc227bff4}, +{0x54,0x80a7000c}, +{0x58,0x14800030}, +{0x5c,0xb210001c}, +{0x60,0x8207001c}, +{0x64,0xba03000c}, +{0x68,0xba07400c}, +{0x6c,0x8200401c}, +{0x70,0x8220401d}, +{0x74,0x3b000018}, +{0x78,0x901760e0}, +{0x7c,0x9a20400b}, +{0xf0,0x3f}, +{0x00,0xb002fffe}, +{0x04,0x832e6004}, +{0x08,0x82004018}, +{0x0c,0x83286002}, +{0x10,0xba06000d}, +{0x14,0xb4004008}, +{0x18,0xb6076008}, +{0x1c,0x92102001}, +{0x20,0x952a401b}, +{0x24,0x9e102000}, +{0x28,0xb92be002}, +{0x2c,0xfa072520}, +{0x30,0xba5f4011}, +{0x34,0x833f601f}, +{0x38,0x83306018}, +{0x3c,0xba074001}, +{0x40,0xc2068000}, +{0x44,0x82204012}, +{0x48,0xbb3f6008}, +{0x4c,0x9e03e001}, +{0x50,0x80a0401d}, +{0x54,0x04800005}, +{0x58,0xb8070010}, +{0x5c,0xc2073ff0}, +{0x60,0x8210400a}, +{0x64,0xc2273ff0}, +{0x68,0x80a3e003}, +{0x6c,0x08bffff0}, +{0x70,0xb92be002}, +{0x74,0xb0062001}, +{0x78,0xb606e001}, +{0x7c,0x80a6000b}, +{0xf0,0x40}, +{0x00,0x04bfffe8}, +{0x04,0xb406a004}, +{0x08,0xb2066001}, +{0x0c,0x80a6400c}, +{0x10,0x04bfffdc}, +{0x14,0x9a036003}, +{0x18,0xc207bfe8}, +{0x1c,0x80886010}, +{0x20,0x0280000a}, +{0x24,0xfa07bfec}, +{0x28,0xc207bff4}, +{0x2c,0x80886082}, +{0x30,0x02800007}, +{0x34,0x808f6010}, +{0x38,0x80886028}, +{0x3c,0x1280001f}, +{0x40,0xb0102003}, +{0x44,0xfa07bfec}, +{0x48,0x808f6010}, +{0x4c,0x02800012}, +{0x50,0xc207bff0}, +{0x54,0x808f6082}, +{0x58,0x02800007}, +{0x5c,0x808f6028}, +{0x60,0xc207bff4}, +{0x64,0x80886028}, +{0x68,0x32800014}, +{0x6c,0xb0102002}, +{0x70,0x808f6028}, +{0x74,0x02800008}, +{0x78,0xc207bff0}, +{0x7c,0xc207bff4}, +{0xf0,0x41}, +{0x00,0x80886082}, +{0x04,0x02800004}, +{0x08,0xc207bff0}, +{0x0c,0x1080000b}, +{0x10,0xb0102002}, +{0x14,0x80886010}, +{0x18,0x02800008}, +{0x1c,0xb0102000}, +{0x20,0x80886082}, +{0x24,0x02800005}, +{0x28,0x80886028}, +{0x2c,0x12800003}, +{0x30,0xb0102001}, +{0x34,0xb0102000}, +{0x38,0x81c7e008}, +{0x3c,0x81e80000}, +{0x40,0x94102000}, +{0x44,0xc2002514}, +{0x48,0x80a28001}, +{0x4c,0x96102000}, +{0x50,0x1a80000e}, +{0x54,0x9b2ae002}, +{0x58,0xc2036710}, +{0x5c,0x9602e001}, +{0x60,0x80a06000}, +{0x64,0x02800006}, +{0x68,0x992aa002}, +{0x6c,0xc2232710}, +{0x70,0xc2036738}, +{0x74,0x9402a001}, +{0x78,0xc2232738}, +{0x7c,0xc2002514}, +{0xf0,0x42}, +{0x00,0x10bffff4}, +{0x04,0x80a2c001}, +{0x08,0x81c3e008}, +{0x0c,0xd4202514}, +{0x10,0xd4020000}, +{0x14,0x03000016}, +{0x18,0x9802800a}, +{0x1c,0x82106330}, +{0x20,0xda530001}, +{0x24,0xc2002590}, +{0x28,0xc250400c}, +{0x2c,0x96a0400d}, +{0x30,0x02800016}, +{0x34,0x03000016}, +{0x38,0x80a2e000}, +{0x3c,0x04800009}, +{0x40,0x82102001}, +{0x44,0xda022004}, +{0x48,0x8328400d}, +{0x4c,0x80a2c001}, +{0x50,0x3480000d}, +{0x54,0x973ac00d}, +{0x58,0x1080000b}, +{0x5c,0x96102001}, +{0x60,0x1680000a}, +{0x64,0x03000016}, +{0x68,0xda022008}, +{0x6c,0x82103fff}, +{0x70,0x8328400d}, +{0x74,0x80a2c001}, +{0x78,0x36800003}, +{0x7c,0x96103fff}, +{0xf0,0x43}, +{0x00,0x973ac00d}, +{0x04,0x03000016}, +{0x08,0x92106330}, +{0x0c,0x8202800a}, +{0x10,0xc2504009}, +{0x14,0x9602c001}, +{0x18,0x808aa001}, +{0x1c,0x0280000f}, +{0x20,0x9b3aa01f}, +{0x24,0x9b33601f}, +{0x28,0x9a02800d}, +{0x2c,0x9b3b6001}, +{0x30,0x9b2b6002}, +{0x34,0xd8034009}, +{0x38,0x033fffc0}, +{0x3c,0x980b0001}, +{0x40,0x0300003f}, +{0x44,0x821063ff}, +{0x48,0x820ac001}, +{0x4c,0x98030001}, +{0x50,0x1080000d}, +{0x54,0xd8234009}, +{0x58,0x9b33601f}, +{0x5c,0x9a02800d}, +{0x60,0x9b3b6001}, +{0x64,0x9b2b6002}, +{0x68,0x0300003f}, +{0x6c,0xd8034009}, +{0x70,0x821063ff}, +{0x74,0x980b0001}, +{0x78,0x832ae010}, +{0x7c,0x8200400c}, +{0xf0,0x44}, +{0x00,0xc2234009}, +{0x04,0xc2020000}, +{0x08,0xda00247c}, +{0x0c,0x8200400d}, +{0x10,0x81c3e008}, +{0x14,0xc2220000}, +{0x18,0x9de3bf98}, +{0x1c,0x833e201f}, +{0x20,0xd0002320}, +{0x24,0x82204018}, +{0x28,0x80a22000}, +{0x2c,0x02800015}, +{0x30,0x9b30601f}, +{0x34,0x033fc000}, +{0x38,0xa0106020}, +{0x3c,0xc200231c}, +{0x40,0x80a00001}, +{0x44,0x82402000}, +{0x48,0x8088400d}, +{0x4c,0xc2002318}, +{0x50,0x02800009}, +{0x54,0xb01e0001}, +{0x58,0x80a00001}, +{0x5c,0x82603fff}, +{0x60,0x7ffffacd}, +{0x64,0xc2240000}, +{0x68,0xc2002318}, +{0x6c,0x10800005}, +{0x70,0xc2240000}, +{0x74,0x033fc000}, +{0x78,0x82106020}, +{0x7c,0xf0204000}, +{0xf0,0x45}, +{0x00,0x81c7e008}, +{0x04,0x81e80000}, +{0x08,0x9de3bf98}, +{0x0c,0x7ffffacb}, +{0x10,0x01000000}, +{0x14,0xe0002500}, +{0x18,0x80a42028}, +{0x1c,0x08800013}, +{0x20,0x80a42000}, +{0x24,0xc0202584}, +{0x28,0xa2102000}, +{0x2c,0x832c6002}, +{0x30,0xc2006f04}, +{0x34,0x80a06000}, +{0x38,0x02800053}, +{0x3c,0xa2046001}, +{0x40,0x9fc04000}, +{0x44,0x01000000}, +{0x48,0xc2002584}, +{0x4c,0x80a06000}, +{0x50,0x1280004d}, +{0x54,0x80a4603b}, +{0x58,0x24bffff6}, +{0x5c,0x832c6002}, +{0x60,0x1080004a}, +{0x64,0xc2002500}, +{0x68,0x1280000b}, +{0x6c,0x80a42014}, +{0x70,0xc2002fcc}, +{0x74,0x9fc04000}, +{0x78,0x01000000}, +{0x7c,0x7ffffce9}, +{0xf0,0x46}, +{0x00,0x90102000}, +{0x04,0x7ffffcd6}, +{0x08,0x90102001}, +{0x0c,0x1080003f}, +{0x10,0xc2002500}, +{0x14,0x1880000c}, +{0x18,0x80a42015}, +{0x1c,0x808c2001}, +{0x20,0x3280003a}, +{0x24,0xc2002500}, +{0x28,0x90043ffe}, +{0x2c,0x7ffffc6f}, +{0x30,0x91322001}, +{0x34,0x7ffffc51}, +{0x38,0x01000000}, +{0x3c,0x10800033}, +{0x40,0xc2002500}, +{0x44,0x18800010}, +{0x48,0x80a42018}, +{0x4c,0x033fc180}, +{0x50,0xda0025b0}, +{0x54,0x82106038}, +{0x58,0xda204000}, +{0x5c,0x033fc200}, +{0x60,0x82106074}, +{0x64,0xda00232c}, +{0x68,0xda204000}, +{0x6c,0x7ffffcbc}, +{0x70,0x90102000}, +{0x74,0xc200265c}, +{0x78,0xc2202538}, +{0x7c,0x10800020}, +{0xf0,0x47}, +{0x00,0xc2002fcc}, +{0x04,0x1880000c}, +{0x08,0x80a42028}, +{0x0c,0x90102000}, +{0x10,0x92102000}, +{0x14,0xc2002fc0}, +{0x18,0x9fc04000}, +{0x1c,0x94102000}, +{0x20,0x11000016}, +{0x24,0x7ffffe0f}, +{0x28,0x90122330}, +{0x2c,0x10800017}, +{0x30,0xc2002500}, +{0x34,0x38800015}, +{0x38,0xc2002500}, +{0x3c,0x7ffffbb1}, +{0x40,0x23000016}, +{0x44,0x92146330}, +{0x48,0xc2002fc0}, +{0x4c,0x9fc04000}, +{0x50,0x94043fe8}, +{0x54,0x80a42028}, +{0x58,0x3280000c}, +{0x5c,0xc2002500}, +{0x60,0x90146330}, +{0x64,0x7ffffe07}, +{0x68,0x92102008}, +{0x6c,0xc2002fd8}, +{0x70,0x80a06000}, +{0x74,0x22800005}, +{0x78,0xc2002500}, +{0x7c,0x9fc04000}, +{0xf0,0x48}, +{0x00,0x01000000}, +{0x04,0xc2002500}, +{0x08,0x80a40001}, +{0x0c,0x1280000b}, +{0x10,0x031fffff}, +{0x14,0x821063f0}, +{0x18,0x80a40001}, +{0x1c,0x38800003}, +{0x20,0x21040000}, +{0x24,0xa0042001}, +{0x28,0x033fc180}, +{0x2c,0x82106034}, +{0x30,0xe0204000}, +{0x34,0xe0202500}, +{0x38,0x81c7e008}, +{0x3c,0x81e80000}, +{0x40,0x81c3e008}, +{0x44,0x01000000}, +{0x48,0x9de3bf60}, +{0x4c,0x1b00003f}, +{0x50,0xc2002350}, +{0x54,0x9a1363ff}, +{0x58,0xae08400d}, +{0x5c,0xa6102001}, +{0x60,0xda002300}, +{0x64,0x80a4c00d}, +{0x68,0x18800062}, +{0x6c,0xa3306010}, +{0x70,0xa4102010}, +{0x74,0xac102000}, +{0x78,0xaa102000}, +{0x7c,0xa8102000}, +{0xf0,0x49}, +{0x00,0x80a46000}, +{0x04,0x0280002c}, +{0x08,0xa0102000}, +{0x0c,0x03000018}, +{0x10,0x961060e0}, +{0x14,0x92102000}, +{0x18,0x9807bfc0}, +{0x1c,0x82050009}, +{0x20,0xda086440}, +{0x24,0x8204800d}, +{0x28,0x80a36000}, +{0x2c,0x02800008}, +{0x30,0x83286002}, +{0x34,0xc200400b}, +{0x38,0xc2230000}, +{0x3c,0x92026001}, +{0x40,0x80a2600b}, +{0x44,0x04bffff6}, +{0x48,0x98032004}, +{0x4c,0x7ffffa42}, +{0x50,0x9007bfc0}, +{0x54,0x80a5c011}, +{0x58,0x1480000b}, +{0x5c,0x92100017}, +{0x60,0x832de002}, +{0x64,0x8200401e}, +{0x68,0x9a007fc0}, +{0x6c,0xc2034000}, +{0x70,0x92026001}, +{0x74,0xa0040001}, +{0x78,0x80a24011}, +{0x7c,0x04bffffc}, +{0xf0,0x4a}, +{0x00,0x9a036004}, +{0x04,0x82244017}, +{0x08,0x82006001}, +{0x0c,0x9b3c201f}, +{0x10,0x81836000}, +{0x14,0x01000000}, +{0x18,0x01000000}, +{0x1c,0x01000000}, +{0x20,0xa07c0001}, +{0x24,0xc25021ae}, +{0x28,0x80a40001}, +{0x2c,0x26800002}, +{0x30,0xa0100001}, +{0x34,0x03000018}, +{0x38,0x941060e0}, +{0x3c,0x92102000}, +{0x40,0x82054009}, +{0x44,0xda086440}, +{0x48,0x8204800d}, +{0x4c,0x99286002}, +{0x50,0x80a36000}, +{0x54,0x0280001d}, +{0x58,0x9610000c}, +{0x5c,0x80a42000}, +{0x60,0x2480000c}, +{0x64,0xc202c00a}, +{0x68,0xc203000a}, +{0x6c,0x80a04010}, +{0x70,0x16800007}, +{0x74,0x98102000}, +{0x78,0x80a06000}, +{0x7c,0x24800006}, +{0xf0,0x4b}, +{0x00,0x98100001}, +{0x04,0x10800005}, +{0x08,0x8204800d}, +{0x0c,0xc202c00a}, +{0x10,0x98204010}, +{0x14,0x8204800d}, +{0x18,0x9b286002}, +{0x1c,0xc20023c8}, +{0x20,0x83306011}, +{0x24,0x80886001}, +{0x28,0x02800005}, +{0x2c,0x92026001}, +{0x30,0xc20ce2af}, +{0x34,0x825b0001}, +{0x38,0x99386007}, +{0x3c,0x80a2600b}, +{0x40,0x04bfffe0}, +{0x44,0xd823400a}, +{0x48,0xac05a001}, +{0x4c,0xa805200c}, +{0x50,0x80a5a001}, +{0x54,0x04bfffab}, +{0x58,0xaa05600c}, +{0x5c,0xa604e001}, +{0x60,0xc2002300}, +{0x64,0x80a4c001}, +{0x68,0x08bfffa3}, +{0x6c,0xa404a010}, +{0x70,0x81c7e008}, +{0x74,0x81e80000}, +{0x78,0x9de3bf98}, +{0x7c,0x9e100018}, +{0xf0,0x4c}, +{0x00,0x80a66000}, +{0x04,0x0280001b}, +{0x08,0xb010001a}, +{0x0c,0x031fffdf}, +{0x10,0xb41063ff}, +{0x14,0x82102000}, +{0x18,0xbb286002}, +{0x1c,0x80a62009}, +{0x20,0xb6006001}, +{0x24,0x12800006}, +{0x28,0xb810001d}, +{0x2c,0xc206401d}, +{0x30,0x83306001}, +{0x34,0x8208401a}, +{0x38,0xc226401d}, +{0x3c,0x80a62008}, +{0x40,0x08800006}, +{0x44,0xc206401c}, +{0x48,0xfa03c01c}, +{0x4c,0xbb376001}, +{0x50,0x10800003}, +{0x54,0xba0f401a}, +{0x58,0xfa03c01c}, +{0x5c,0x8200401d}, +{0x60,0xc226401c}, +{0x64,0x80a6e0b5}, +{0x68,0x08bfffec}, +{0x6c,0x8210001b}, +{0x70,0x81c7e008}, +{0x74,0x81e80000}, +{0x78,0x03169696}, +{0x7c,0xda002180}, +{0xf0,0x4d}, +{0x00,0x8210625a}, +{0x04,0x80a34001}, +{0x08,0x94102000}, +{0x0c,0x12800006}, +{0x10,0x96102000}, +{0x14,0x033fc180}, +{0x18,0x82106030}, +{0x1c,0x10800024}, +{0x20,0xda204000}, +{0x24,0xc202c000}, +{0x28,0x9602e004}, +{0x2c,0x80a2e4ff}, +{0x30,0x08bffffd}, +{0x34,0x94028001}, +{0x38,0x96102d00}, +{0x3c,0xd2002ff8}, +{0x40,0x03000019}, +{0x44,0x80a2c009}, +{0x48,0x1a80000b}, +{0x4c,0x901063ff}, +{0x50,0xd802c000}, +{0x54,0x9602e004}, +{0x58,0x80a2c009}, +{0x5c,0x9a402000}, +{0x60,0x80a2000b}, +{0x64,0x82603fff}, +{0x68,0x808b4001}, +{0x6c,0x12bffff9}, +{0x70,0x9402800c}, +{0x74,0xc20021fc}, +{0x78,0x94228001}, +{0x7c,0xc2002200}, +{0xf0,0x4e}, +{0x00,0x94228001}, +{0x04,0x03169696}, +{0x08,0x8210625a}, +{0x0c,0x80a28001}, +{0x10,0x033fc180}, +{0x14,0x82106030}, +{0x18,0x02800005}, +{0x1c,0xd4204000}, +{0x20,0x03000008}, +{0x24,0x81c06218}, +{0x28,0x90102001}, +{0x2c,0x01000000}, +{0x30,0x81c3e008}, +{0x34,0x01000000}, +{0x38,0x9de3bf98}, +{0x3c,0x9e100018}, +{0x40,0x03000018}, +{0x44,0xb0100019}, +{0x48,0xba1060e0}, +{0x4c,0xb6102000}, +{0x50,0x832ee002}, +{0x54,0xb606e001}, +{0x58,0x80a6e1bf}, +{0x5c,0x08bffffd}, +{0x60,0xc020401d}, +{0x64,0xb6102000}, +{0x68,0xc20022fc}, +{0x6c,0x80a6c001}, +{0x70,0x1a80001c}, +{0x74,0x03000018}, +{0x78,0xb2106124}, +{0x7c,0xb4102000}, +{0xf0,0x4f}, +{0x00,0xc20022f8}, +{0x04,0x80a68001}, +{0x08,0x1a800011}, +{0x0c,0x832ee002}, +{0x10,0xb8004019}, +{0x14,0xc200247c}, +{0x18,0xfa0ee380}, +{0x1c,0x825e8001}, +{0x20,0x8200401d}, +{0x24,0x82004001}, +{0x28,0xfa160001}, +{0x2c,0xc213c001}, +{0x30,0x8220401d}, +{0x34,0xc2270000}, +{0x38,0xb406a001}, +{0x3c,0xc20022f8}, +{0x40,0x80a68001}, +{0x44,0x0abffff4}, +{0x48,0xb8072040}, +{0x4c,0xb606e001}, +{0x50,0xc20022fc}, +{0x54,0x80a6c001}, +{0x58,0x0abfffea}, +{0x5c,0xb4102000}, +{0x60,0x81c7e008}, +{0x64,0x81e80000}, +{0x68,0x9de3bf98}, +{0x6c,0x11000016}, +{0x70,0xc2002fe4}, +{0x74,0x9fc04000}, +{0x78,0x90122330}, +{0x7c,0xc200259c}, +{0xf0,0x50}, +{0x00,0xd800254c}, +{0x04,0x808b2002}, +{0x08,0x02800034}, +{0x0c,0xc2202550}, +{0x10,0xda002654}, +{0x14,0x8203400d}, +{0x18,0x8200400d}, +{0x1c,0xda00259c}, +{0x20,0xb20362d8}, +{0x24,0x82004001}, +{0x28,0x9a102061}, +{0x2c,0x9a234001}, +{0x30,0x832e6007}, +{0x34,0x9738601f}, +{0x38,0x8182e000}, +{0x3c,0x01000000}, +{0x40,0x01000000}, +{0x44,0x01000000}, +{0x48,0xb278400d}, +{0x4c,0x980b3ffd}, +{0x50,0x11000017}, +{0x54,0xd820254c}, +{0x58,0xc2002fe4}, +{0x5c,0x9fc04000}, +{0x60,0x90122208}, +{0x64,0x11000014}, +{0x68,0xe000259c}, +{0x6c,0xc2002fe4}, +{0x70,0x9fc04000}, +{0x74,0x901222a8}, +{0x78,0x80a64010}, +{0x7c,0x9a603fff}, +{0xf0,0x51}, +{0x00,0xc200259c}, +{0x04,0x80a64001}, +{0x08,0x82603fff}, +{0x0c,0x80934001}, +{0x10,0x22800012}, +{0x14,0xc020250c}, +{0x18,0x21000018}, +{0x1c,0x7ffffa82}, +{0x20,0x90142260}, +{0x24,0xa0142260}, +{0x28,0xb2102000}, +{0x2c,0x9b2e6002}, +{0x30,0xb2066001}, +{0x34,0xc2034010}, +{0x38,0x80a66017}, +{0x3c,0x04bffffc}, +{0x40,0xc22365b0}, +{0x44,0x7ffffaed}, +{0x48,0x01000000}, +{0x4c,0x82102015}, +{0x50,0x10800010}, +{0x54,0xc2202500}, +{0x58,0xc200250c}, +{0x5c,0x80a06000}, +{0x60,0x1280000c}, +{0x64,0x031696a9}, +{0x68,0x821061a5}, +{0x6c,0x31000016}, +{0x70,0x33000014}, +{0x74,0xc220250c}, +{0x78,0xc0202658}, +{0x7c,0xc0202654}, +{0xf0,0x52}, +{0x00,0xb0162330}, +{0x04,0xb21662a8}, +{0x08,0x7ffffd01}, +{0x0c,0x81e80000}, +{0x10,0x01000000}, +{0x14,0x81c7e008}, +{0x18,0x81e80000}, +{0x1c,0x9de3bf30}, +{0x20,0x94100018}, +{0x24,0x9a102000}, +{0x28,0x96102000}, +{0x2c,0x98102000}, +{0x30,0x9e102000}, +{0x34,0x8203000f}, +{0x38,0xf6086441}, +{0x3c,0x80a6e000}, +{0x40,0x02800024}, +{0x44,0xf4086440}, +{0x48,0xc208217d}, +{0x4c,0x80807fff}, +{0x50,0xf40ea37f}, +{0x54,0xf60ee37f}, +{0x58,0x0c80001a}, +{0x5c,0xb2102000}, +{0x60,0xb007bff8}, +{0x64,0xc200247c}, +{0x68,0x82584019}, +{0x6c,0xba06c001}, +{0x70,0x82068001}, +{0x74,0x82004001}, +{0x78,0xf8528001}, +{0x7c,0xba07401d}, +{0xf0,0x53}, +{0x00,0xc252801d}, +{0x04,0xb8270001}, +{0x08,0x80a66000}, +{0x0c,0x02800007}, +{0x10,0xf8263f98}, +{0x14,0xc2063f94}, +{0x18,0x82a70001}, +{0x1c,0x2c800003}, +{0x20,0x9a234001}, +{0x24,0x9a034001}, +{0x28,0xc208217d}, +{0x2c,0xb2066001}, +{0x30,0x82007fff}, +{0x34,0x80a64001}, +{0x38,0x04bfffeb}, +{0x3c,0xb0062004}, +{0x40,0x9e03e001}, +{0x44,0x80a3e00a}, +{0x48,0x04bfffdc}, +{0x4c,0x8203000f}, +{0x50,0x9602e001}, +{0x54,0x80a2e001}, +{0x58,0x04bfffd6}, +{0x5c,0x9803200c}, +{0x60,0xda20259c}, +{0x64,0x81c7e008}, +{0x68,0x81e80000}, +{0x6c,0x9de3bf58}, +{0x70,0xc208224d}, +{0x74,0x80a06000}, +{0x78,0x12800004}, +{0x7c,0x94067ffe}, +{0xf0,0x54}, +{0x00,0xc020259c}, +{0x04,0x30800065}, +{0x08,0xa6066002}, +{0x0c,0x80a28013}, +{0x10,0x1480003f}, +{0x14,0x90102000}, +{0x18,0xa0062002}, +{0x1c,0x96063ffe}, +{0x20,0x80a2c010}, +{0x24,0x14800036}, +{0x28,0x833aa01f}, +{0x2c,0x8220400a}, +{0x30,0x9a064019}, +{0x34,0x9a23400a}, +{0x38,0x992a2002}, +{0x3c,0xab30601f}, +{0x40,0x9803001e}, +{0x44,0x03000018}, +{0x48,0xa92b6004}, +{0x4c,0xac1060e0}, +{0x50,0x98033fb8}, +{0x54,0xa4063fff}, +{0x58,0xa2062001}, +{0x5c,0x9a067fff}, +{0x60,0x82060018}, +{0x64,0x8220400b}, +{0x68,0x82050001}, +{0x6c,0x80a2c012}, +{0x70,0x0680000b}, +{0x74,0x9f286002}, +{0x78,0x80a2c011}, +{0x7c,0x14800009}, +{0xf0,0x55}, +{0x00,0x80a2e000}, +{0x04,0x80a2800d}, +{0x08,0x06800005}, +{0x0c,0x82066001}, +{0x10,0x80a28001}, +{0x14,0x24800017}, +{0x18,0x9602e001}, +{0x1c,0x80a2e000}, +{0x20,0x24800010}, +{0x24,0xc203c016}, +{0x28,0xc2002308}, +{0x2c,0x80a0400b}, +{0x30,0x82603fff}, +{0x34,0x80884015}, +{0x38,0x2280000a}, +{0x3c,0xc203c016}, +{0x40,0x832aa004}, +{0x44,0x8200400b}, +{0x48,0x93286002}, +{0x4c,0xc2002300}, +{0x50,0x80a28001}, +{0x54,0x38800003}, +{0x58,0xc203c016}, +{0x5c,0xc2024016}, +{0x60,0xc2230000}, +{0x64,0x90022001}, +{0x68,0x98032004}, +{0x6c,0x9602e001}, +{0x70,0x80a2c010}, +{0x74,0x04bfffdc}, +{0x78,0x82060018}, +{0x7c,0x9402a001}, +{0xf0,0x56}, +{0x00,0x80a28013}, +{0x04,0x04bfffc7}, +{0x08,0x96063ffe}, +{0x0c,0x9007bfb8}, +{0x10,0x7ffff8b1}, +{0x14,0x92102010}, +{0x18,0xd608224f}, +{0x1c,0xb00ae0ff}, +{0x20,0xd808224d}, +{0x24,0x80a6000c}, +{0x28,0x1480000b}, +{0x2c,0x90102000}, +{0x30,0x832e2002}, +{0x34,0x8200401e}, +{0x38,0x9a007fb8}, +{0x3c,0xc2034000}, +{0x40,0xb0062001}, +{0x44,0x90020001}, +{0x48,0x80a6000c}, +{0x4c,0x04bffffc}, +{0x50,0x9a036004}, +{0x54,0x820ae0ff}, +{0x58,0xda08224d}, +{0x5c,0x9a234001}, +{0x60,0xc208224c}, +{0x64,0x9a036001}, +{0x68,0x825a0001}, +{0x6c,0x9938601f}, +{0x70,0x81832000}, +{0x74,0x01000000}, +{0x78,0x01000000}, +{0x7c,0x01000000}, +{0xf0,0x57}, +{0x00,0x8278400d}, +{0x04,0x9b38601f}, +{0x08,0x9b336019}, +{0x0c,0x8200400d}, +{0x10,0x83386007}, +{0x14,0xc220259c}, +{0x18,0x81c7e008}, +{0x1c,0x81e80000}, +{0x20,0x9de3bf98}, +{0x24,0xc2002540}, +{0x28,0x82006001}, +{0x2c,0xc2202540}, +{0x30,0xc2002588}, +{0x34,0x80a06000}, +{0x38,0x02800014}, +{0x3c,0x11000017}, +{0x40,0xc2002594}, +{0x44,0x80a06000}, +{0x48,0x12800004}, +{0x4c,0x90122208}, +{0x50,0x7ffffc04}, +{0x54,0x01000000}, +{0x58,0xda002588}, +{0x5c,0xc2002594}, +{0x60,0x82006001}, +{0x64,0x9a037fff}, +{0x68,0xc2202594}, +{0x6c,0x7ffff9a5}, +{0x70,0xda202588}, +{0x74,0x13000017}, +{0x78,0x92126208}, +{0x7c,0xc2002fc0}, +{0xf0,0x58}, +{0x00,0x9fc04000}, +{0x04,0xd4002594}, +{0x08,0x01000000}, +{0x0c,0x81c7e008}, +{0x10,0x81e80000}, +{0x14,0xc2002588}, +{0x18,0x80a06001}, +{0x1c,0x1280001a}, +{0x20,0xda002298}, +{0x24,0xc2102548}, +{0x28,0x80886001}, +{0x2c,0x22800009}, +{0x30,0xc2002208}, +{0x34,0xc2002170}, +{0x38,0x80a06000}, +{0x3c,0x22800005}, +{0x40,0xc2002208}, +{0x44,0xc0202598}, +{0x48,0x1080000f}, +{0x4c,0x9a100001}, +{0x50,0x80a06000}, +{0x54,0x22800009}, +{0x58,0xc2002598}, +{0x5c,0xc2002558}, +{0x60,0x80a06000}, +{0x64,0x32800005}, +{0x68,0xc2002598}, +{0x6c,0xc0202598}, +{0x70,0x10800005}, +{0x74,0xda002234}, +{0x78,0x80a06000}, +{0x7c,0x22800002}, +{0xf0,0x59}, +{0x00,0xda00233c}, +{0x04,0x033fc200}, +{0x08,0x82106070}, +{0x0c,0x81c3e008}, +{0x10,0xda204000}, +{0x14,0x9de3bf98}, +{0x18,0xc2002588}, +{0x1c,0x80a06000}, +{0x20,0x02800010}, +{0x24,0x11000017}, +{0x28,0xd8002548}, +{0x2c,0x83332010}, +{0x30,0x80886001}, +{0x34,0x22800010}, +{0x38,0xc200258c}, +{0x3c,0xc2002558}, +{0x40,0x80a06000}, +{0x44,0x3280000c}, +{0x48,0xc200258c}, +{0x4c,0xc2002594}, +{0x50,0x80a06001}, +{0x54,0x32800008}, +{0x58,0xc200258c}, +{0x5c,0x11000017}, +{0x60,0x90122208}, +{0x64,0xd0202590}, +{0x68,0xc0202588}, +{0x6c,0x1080001a}, +{0x70,0xd2002594}, +{0x74,0x80a06000}, +{0x78,0x12800015}, +{0x7c,0x82102001}, +{0xf0,0x5a}, +{0x00,0xda002554}, +{0x04,0xc2002598}, +{0x08,0x80a0400d}, +{0x0c,0x1a800007}, +{0x10,0x03000014}, +{0x14,0x82102001}, +{0x18,0xda20258c}, +{0x1c,0xc2202584}, +{0x20,0x10800028}, +{0x24,0xc0202598}, +{0x28,0x808b2400}, +{0x2c,0x12800004}, +{0x30,0x821062a8}, +{0x34,0x03000013}, +{0x38,0x821063d0}, +{0x3c,0xc2202590}, +{0x40,0xd2002598}, +{0x44,0x10800004}, +{0x48,0xd0002590}, +{0x4c,0x1080001d}, +{0x50,0xc2202584}, +{0x54,0x7ffffbab}, +{0x58,0x01000000}, +{0x5c,0x13000016}, +{0x60,0xc2002fd0}, +{0x64,0x92126330}, +{0x68,0x9fc04000}, +{0x6c,0xd0002590}, +{0x70,0xc2002690}, +{0x74,0x82087dff}, +{0x78,0xc2202690}, +{0x7c,0x82102080}, +{0xf0,0x5b}, +{0x00,0xc220256c}, +{0x04,0xc2002200}, +{0x08,0x80a06000}, +{0x0c,0x32800008}, +{0x10,0xc2002548}, +{0x14,0xda002548}, +{0x18,0x83336010}, +{0x1c,0x80886001}, +{0x20,0x22800006}, +{0x24,0x03000004}, +{0x28,0xc2002548}, +{0x2c,0x1b000004}, +{0x30,0x10800003}, +{0x34,0x8210400d}, +{0x38,0x822b4001}, +{0x3c,0xc2202548}, +{0x40,0x81c7e008}, +{0x44,0x81e80000}, +{0x48,0xda002508}, +{0x4c,0x033fc000}, +{0x50,0x960b4001}, +{0x54,0x808b7f00}, +{0x58,0x0280001a}, +{0x5c,0x901020a5}, +{0x60,0x1500003f}, +{0x64,0x8212a300}, +{0x68,0x980b4001}, +{0x6c,0x03294000}, +{0x70,0x80a2c001}, +{0x74,0x02800013}, +{0x78,0x01000000}, +{0x7c,0xc200254c}, +{0xf0,0x5c}, +{0x00,0x8210400c}, +{0x04,0xc220254c}, +{0x08,0xc2002500}, +{0x0c,0x80a06028}, +{0x10,0xc0202508}, +{0x14,0x0880000b}, +{0x18,0x033fffc0}, +{0x1c,0x9a0b4001}, +{0x20,0x03168000}, +{0x24,0x80a2c001}, +{0x28,0x12800006}, +{0x2c,0x9812a3ff}, +{0x30,0xc2002548}, +{0x34,0x8208400c}, +{0x38,0x8210400d}, +{0x3c,0xc2202548}, +{0x40,0x03000006}, +{0x44,0x81c06378}, +{0x48,0x01000000}, +{0x4c,0x01000000}, +{0x50,0x9de3bf98}, +{0x54,0xc2002588}, +{0x58,0x80a06000}, +{0x5c,0x1280002e}, +{0x60,0x01000000}, +{0x64,0xc20026f4}, +{0x68,0x82006001}, +{0x6c,0xfa002310}, +{0x70,0x80a0401d}, +{0x74,0x0a800028}, +{0x78,0xc22026f4}, +{0x7c,0xf600227c}, +{0xf0,0x5d}, +{0x00,0x80a6e000}, +{0x04,0x02800024}, +{0x08,0xc02026f4}, +{0x0c,0xfa0022f8}, +{0x10,0xc200247c}, +{0x14,0xb45f4001}, +{0x18,0x03000007}, +{0x1c,0x821063ff}, +{0x20,0xbb36e00d}, +{0x24,0xb2102000}, +{0x28,0x9e0f4001}, +{0x2c,0x80a6401a}, +{0x30,0xb00ec001}, +{0x34,0x1a800011}, +{0x38,0xb8102000}, +{0x3c,0x03000017}, +{0x40,0x9a106208}, +{0x44,0xba10001a}, +{0x48,0x8207001c}, +{0x4c,0xc210400d}, +{0x50,0x80a0400f}, +{0x54,0x18800005}, +{0x58,0xb8072001}, +{0x5c,0x80a04018}, +{0x60,0x1a800004}, +{0x64,0x80a7001d}, +{0x68,0xb2066001}, +{0x6c,0x80a7001d}, +{0x70,0x0abffff7}, +{0x74,0x8207001c}, +{0x78,0xb936e01a}, +{0x7c,0x80a6401c}, +{0xf0,0x5e}, +{0x00,0x04800005}, +{0x04,0x033fc180}, +{0x08,0x3b008000}, +{0x0c,0x8210603c}, +{0x10,0xfa204000}, +{0x14,0x81c7e008}, +{0x18,0x81e80000}, +{0x1c,0x9de3bf98}, +{0x20,0xc2002fbc}, +{0x24,0x9fc04000}, +{0x28,0x01000000}, +{0x2c,0x01000000}, +{0x30,0x81c7e008}, +{0x34,0x81e80000}, +{0x38,0x9de3bf30}, +{0x3c,0xe2502458}, +{0x40,0x80a46000}, +{0x44,0x02800065}, +{0x48,0x01000000}, +{0x4c,0xc208217f}, +{0x50,0x80a44001}, +{0x54,0x16800061}, +{0x58,0xa0102001}, +{0x5c,0xc208217e}, +{0x60,0x80a40001}, +{0x64,0x1480005d}, +{0x68,0xe450245a}, +{0x6c,0x96102001}, +{0x70,0xc208217f}, +{0x74,0x80a2c001}, +{0x78,0x1480000f}, +{0x7c,0x03000018}, +{0xf0,0x5f}, +{0x00,0x9b2c2002}, +{0x04,0x821060e0}, +{0x08,0x9a034001}, +{0x0c,0x9a036040}, +{0x10,0x9807bf90}, +{0x14,0xc2034000}, +{0x18,0xc2230000}, +{0x1c,0x9602e001}, +{0x20,0xc208217f}, +{0x24,0x80a2c001}, +{0x28,0x9a036040}, +{0x2c,0x04bffffa}, +{0x30,0x98032004}, +{0x34,0x9007bf90}, +{0x38,0x7ffff787}, +{0x3c,0xd208217f}, +{0x40,0x96100012}, +{0x44,0x80a48011}, +{0x48,0x1480000b}, +{0x4c,0x94102000}, +{0x50,0x832ca002}, +{0x54,0x8200401e}, +{0x58,0x9a007f90}, +{0x5c,0xc2034000}, +{0x60,0x9602e001}, +{0x64,0x94028001}, +{0x68,0x80a2c011}, +{0x6c,0x04bffffc}, +{0x70,0x9a036004}, +{0x74,0x82244012}, +{0x78,0x82006001}, +{0x7c,0x9b3aa01f}, +{0xf0,0x60}, +{0x00,0x81836000}, +{0x04,0x01000000}, +{0x08,0x01000000}, +{0x0c,0x01000000}, +{0x10,0x947a8001}, +{0x14,0xc25021ac}, +{0x18,0x80a28001}, +{0x1c,0x26800002}, +{0x20,0x94100001}, +{0x24,0x96102001}, +{0x28,0xc208217f}, +{0x2c,0x80a2c001}, +{0x30,0x14800025}, +{0x34,0x832c2002}, +{0x38,0x11000018}, +{0x3c,0x98006040}, +{0x40,0x921220e0}, +{0x44,0x80a2a000}, +{0x48,0x0480000b}, +{0x4c,0x9a1220e0}, +{0x50,0xc203000d}, +{0x54,0x80a0400a}, +{0x58,0x36800008}, +{0x5c,0xc2030009}, +{0x60,0x80a06000}, +{0x64,0x34800007}, +{0x68,0xc023000d}, +{0x6c,0x10800006}, +{0x70,0xc20023c8}, +{0x74,0xc2030009}, +{0x78,0x8220400a}, +{0x7c,0xc2230009}, +{0xf0,0x61}, +{0x00,0xc20023c8}, +{0x04,0x83306012}, +{0x08,0x80886001}, +{0x0c,0x0280000a}, +{0x10,0x9602e001}, +{0x14,0xda0c22af}, +{0x18,0xc2030009}, +{0x1c,0x8258400d}, +{0x20,0x9b38601f}, +{0x24,0x9b336019}, +{0x28,0x8200400d}, +{0x2c,0x83386007}, +{0x30,0xc2230009}, +{0x34,0xc208217f}, +{0x38,0x80a2c001}, +{0x3c,0x04bfffe2}, +{0x40,0x98032040}, +{0x44,0xa0042001}, +{0x48,0xc208217e}, +{0x4c,0x80a40001}, +{0x50,0x04bfffa8}, +{0x54,0x96102001}, +{0x58,0x81c7e008}, +{0x5c,0x81e80000}, +{0x60,0x9de3bf98}, +{0x64,0xd0002214}, +{0x68,0x80a22000}, +{0x6c,0x02800073}, +{0x70,0x98102001}, +{0x74,0xc208217f}, +{0x78,0x80a30001}, +{0x7c,0x1480006f}, +{0xf0,0x62}, +{0x00,0x01000000}, +{0x04,0xfa08217e}, +{0x08,0x808f60ff}, +{0x0c,0x02800066}, +{0x10,0xb6102001}, +{0x14,0x17000018}, +{0x18,0x952b2004}, +{0x1c,0xa012e0e4}, +{0x20,0x8202801b}, +{0x24,0xb9286002}, +{0x28,0x8212e0e0}, +{0x2c,0xf4070001}, +{0x30,0x80a68008}, +{0x34,0x24800057}, +{0x38,0xfa08217e}, +{0x3c,0x8212e0dc}, +{0x40,0xc2070001}, +{0x44,0x80a68001}, +{0x48,0x26800052}, +{0x4c,0xfa08217e}, +{0x50,0xc2070010}, +{0x54,0x80a68001}, +{0x58,0x2480004e}, +{0x5c,0xfa08217e}, +{0x60,0xc20023c8}, +{0x64,0x80886040}, +{0x68,0x0280000b}, +{0x6c,0x9206e001}, +{0x70,0xba0f60ff}, +{0x74,0x83376001}, +{0x78,0x80a6c001}, +{0x7c,0x24800007}, +{0xf0,0x63}, +{0x00,0x9a102000}, +{0x04,0x8227401b}, +{0x08,0xb6006001}, +{0x0c,0x10800003}, +{0x10,0x9a102001}, +{0x14,0x9a102000}, +{0x18,0xfa00221c}, +{0x1c,0xc2002220}, +{0x20,0xba5f401b}, +{0x24,0xba074001}, +{0x28,0xba5e801d}, +{0x2c,0x833f601f}, +{0x30,0x83306016}, +{0x34,0xba074001}, +{0x38,0xc2002224}, +{0x3c,0x8258401b}, +{0x40,0xbb3f600a}, +{0x44,0xba074001}, +{0x48,0xc2002240}, +{0x4c,0x9e074001}, +{0x50,0xc2002218}, +{0x54,0xb806c001}, +{0x58,0xc20023c8}, +{0x5c,0x80886040}, +{0x60,0x0280000e}, +{0x64,0xb012e0e0}, +{0x68,0xfa08217e}, +{0x6c,0x82076001}, +{0x70,0x83386001}, +{0x74,0x80a70001}, +{0x78,0x14800024}, +{0x7c,0xbb376001}, +{0xf0,0x64}, +{0x00,0x80a36000}, +{0x04,0x32800006}, +{0x08,0xc208217e}, +{0x0c,0x80a7001d}, +{0x10,0x1480001f}, +{0x14,0xb6100009}, +{0x18,0xc208217e}, +{0x1c,0xba20401c}, +{0x20,0x80a70001}, +{0x24,0x14800019}, +{0x28,0xba076001}, +{0x2c,0x80a36000}, +{0x30,0x22800002}, +{0x34,0xba10001c}, +{0x38,0x8202801d}, +{0x3c,0xb7286002}, +{0x40,0xc206c018}, +{0x44,0xb220400f}, +{0x48,0xf226c018}, +{0x4c,0xfa002228}, +{0x50,0x8227001d}, +{0x54,0x80a7001d}, +{0x58,0xb45bc001}, +{0x5c,0x04bfffdf}, +{0x60,0xb8072001}, +{0x64,0xc200222c}, +{0x68,0x825e8001}, +{0x6c,0xbb38601f}, +{0x70,0xbb376018}, +{0x74,0x8200401d}, +{0x78,0x83386008}, +{0x7c,0x82264001}, +{0xf0,0x65}, +{0x00,0x10bfffd6}, +{0x04,0xc226c018}, +{0x08,0xb6100009}, +{0x0c,0xfa08217e}, +{0x10,0xb606e001}, +{0x14,0x820f60ff}, +{0x18,0x80a6c001}, +{0x1c,0x04bfffa2}, +{0x20,0x8202801b}, +{0x24,0x98032001}, +{0x28,0xc208217f}, +{0x2c,0x80a30001}, +{0x30,0x24bfff96}, +{0x34,0xfa08217e}, +{0x38,0x81c7e008}, +{0x3c,0x81e80000}, +{0x40,0x9de3bf70}, +{0x44,0x92102001}, +{0x48,0xde002300}, +{0x4c,0x80a2400f}, +{0x50,0x1880001a}, +{0x54,0x90102000}, +{0x58,0x03000018}, +{0x5c,0x821060e0}, +{0x60,0x82006040}, +{0x64,0xd4002308}, +{0x68,0x96102001}, +{0x6c,0x80a2c00a}, +{0x70,0x3880000f}, +{0x74,0x92026001}, +{0x78,0x9a006004}, +{0x7c,0xd8034000}, +{0xf0,0x66}, +{0x00,0x80a30008}, +{0x04,0x04800005}, +{0x08,0x9a036004}, +{0x0c,0x9010000c}, +{0x10,0xa0100009}, +{0x14,0xa410000b}, +{0x18,0x9602e001}, +{0x1c,0x80a2c00a}, +{0x20,0x28bffff8}, +{0x24,0xd8034000}, +{0x28,0x92026001}, +{0x2c,0x80a2400f}, +{0x30,0x08bfffee}, +{0x34,0x82006040}, +{0x38,0xa2042001}, +{0x3c,0x92043fff}, +{0x40,0x80a24011}, +{0x44,0x1480002c}, +{0x48,0x90102000}, +{0x4c,0x03000018}, +{0x50,0xa01060e0}, +{0x54,0x9e04a001}, +{0x58,0x9604bfff}, +{0x5c,0x80a2c00f}, +{0x60,0x14800021}, +{0x64,0x832a6004}, +{0x68,0x8200400b}, +{0x6c,0x9b2a2002}, +{0x70,0x83286002}, +{0x74,0x9a03401e}, +{0x78,0x94004010}, +{0x7c,0x9a037fd0}, +{0xf0,0x67}, +{0x00,0x833ae01f}, +{0x04,0x8220400b}, +{0x08,0x80a26000}, +{0x0c,0x0480000f}, +{0x10,0x9930601f}, +{0x14,0xc2002300}, +{0x18,0x80a04009}, +{0x1c,0x82603fff}, +{0x20,0x8088400c}, +{0x24,0x2280000a}, +{0x28,0xc0234000}, +{0x2c,0xc2002308}, +{0x30,0x80a2c001}, +{0x34,0x38800006}, +{0x38,0xc0234000}, +{0x3c,0xc2028000}, +{0x40,0x10800003}, +{0x44,0xc2234000}, +{0x48,0xc0234000}, +{0x4c,0x9602e001}, +{0x50,0x90022001}, +{0x54,0x9a036004}, +{0x58,0x80a2c00f}, +{0x5c,0x04bfffe9}, +{0x60,0x9402a004}, +{0x64,0x92026001}, +{0x68,0x80a24011}, +{0x6c,0x04bfffdc}, +{0x70,0x9604bfff}, +{0x74,0x9007bfd0}, +{0x78,0x7ffff677}, +{0x7c,0x92102009}, +{0xf0,0x68}, +{0x00,0xda07bfec}, +{0x04,0xc207bfe8}, +{0x08,0x8200400d}, +{0x0c,0xda07bff0}, +{0x10,0x8200400d}, +{0x14,0x9b30601f}, +{0x18,0x8200400d}, +{0x1c,0xd6082573}, +{0x20,0x9602e001}, +{0x24,0xda00256c}, +{0x28,0xd808257f}, +{0x2c,0x9a5b400b}, +{0x30,0x98032001}, +{0x34,0x81800000}, +{0x38,0x01000000}, +{0x3c,0x01000000}, +{0x40,0x01000000}, +{0x44,0x9a73400c}, +{0x48,0x83386001}, +{0x4c,0xc2202518}, +{0x50,0xda20256c}, +{0x54,0x96102000}, +{0x58,0x94102c18}, +{0x5c,0x992ae002}, +{0x60,0xda1323b4}, +{0x64,0xc2002518}, +{0x68,0x8258400d}, +{0x6c,0x9b38601f}, +{0x70,0x9b336018}, +{0x74,0x8200400d}, +{0x78,0xda1323b6}, +{0x7c,0x83386008}, +{0xf0,0x69}, +{0x00,0x8200400d}, +{0x04,0xda00256c}, +{0x08,0x8258400d}, +{0x0c,0x83306007}, +{0x10,0x9602e001}, +{0x14,0x80a06c18}, +{0x18,0x04800003}, +{0x1c,0xc2232520}, +{0x20,0xd4232520}, +{0x24,0x80a2e003}, +{0x28,0x04bfffee}, +{0x2c,0x992ae002}, +{0x30,0xc20023c0}, +{0x34,0x80a06000}, +{0x38,0x02800007}, +{0x3c,0x82103001}, +{0x40,0xc2002200}, +{0x44,0x80a06000}, +{0x48,0x22800005}, +{0x4c,0xc200255c}, +{0x50,0x82103001}, +{0x54,0xc220252c}, +{0x58,0xc200255c}, +{0x5c,0x80a06000}, +{0x60,0x02800005}, +{0x64,0xc2002288}, +{0x68,0x9b306001}, +{0x6c,0x83306002}, +{0x70,0x8200400d}, +{0x74,0x7ffffa5f}, +{0x78,0xc220251c}, +{0x7c,0x01000000}, +{0xf0,0x6a}, +{0x00,0x81c7e008}, +{0x04,0x81e80000}, +{0x08,0x9de3bf98}, +{0x0c,0xc2002548}, +{0x10,0x80886100}, +{0x14,0xaa102000}, +{0x18,0x128000cb}, +{0x1c,0xa6102000}, +{0x20,0xc20026e4}, +{0x24,0x80a06000}, +{0x28,0x02800004}, +{0x2c,0xa2102001}, +{0x30,0x82007fff}, +{0x34,0xc22026e4}, +{0x38,0xc2002300}, +{0x3c,0x80a44001}, +{0x40,0x388000a5}, +{0x44,0xda002530}, +{0x48,0xa4102001}, +{0x4c,0xc2002308}, +{0x50,0x80a48001}, +{0x54,0x1880008f}, +{0x58,0x03000050}, +{0x5c,0xa8044001}, +{0x60,0xc2002514}, +{0x64,0x80a06009}, +{0x68,0x1880009a}, +{0x6c,0x9b2c6004}, +{0x70,0x9a034012}, +{0x74,0x03000018}, +{0x78,0x821060e0}, +{0x7c,0x9b2b6002}, +{0xf0,0x6b}, +{0x00,0xda034001}, +{0x04,0xc2002474}, +{0x08,0x80a34001}, +{0x0c,0x0680007b}, +{0x10,0x03000040}, +{0x14,0x90100012}, +{0x18,0x7ffff9f6}, +{0x1c,0x92100011}, +{0x20,0x80a22000}, +{0x24,0x02800075}, +{0x28,0x03000040}, +{0x2c,0xc2002ff0}, +{0x30,0x80a06000}, +{0x34,0x2280000a}, +{0x38,0xc2002fe0}, +{0x3c,0x90100012}, +{0x40,0x9fc04000}, +{0x44,0x92100011}, +{0x48,0xc200259c}, +{0x4c,0x80a06000}, +{0x50,0x1280006a}, +{0x54,0x03000040}, +{0x58,0xc2002fe0}, +{0x5c,0x80a06000}, +{0x60,0x2280000b}, +{0x64,0xc2002ff4}, +{0x68,0x90100012}, +{0x6c,0x92100011}, +{0x70,0x9fc04000}, +{0x74,0xd4082473}, +{0x78,0xc200259c}, +{0x7c,0x80a06000}, +{0xf0,0x6c}, +{0x00,0x1280005e}, +{0x04,0x03000040}, +{0x08,0xc2002ff4}, +{0x0c,0x80a06000}, +{0x10,0x02800006}, +{0x14,0xa0102000}, +{0x18,0x90100012}, +{0x1c,0x9fc04000}, +{0x20,0x92100011}, +{0x24,0xe000259c}, +{0x28,0x90100012}, +{0x2c,0x92100011}, +{0x30,0x94100010}, +{0x34,0x7ffffa1d}, +{0x38,0xd6082473}, +{0x3c,0x80a22000}, +{0x40,0x0280004e}, +{0x44,0x03000040}, +{0x48,0xc2002fe0}, +{0x4c,0x80a06000}, +{0x50,0x02800007}, +{0x54,0x90100012}, +{0x58,0x92100011}, +{0x5c,0x9fc04000}, +{0x60,0x94102100}, +{0x64,0x10800004}, +{0x68,0x94100010}, +{0x6c,0xc020259c}, +{0x70,0x94100010}, +{0x74,0x90100012}, +{0x78,0x92100011}, +{0x7c,0x7ffffa0b}, +{0xf0,0x6d}, +{0x00,0x96102100}, +{0x04,0x80a22000}, +{0x08,0x22800011}, +{0x0c,0xc2002514}, +{0x10,0xc200259c}, +{0x14,0x80a06000}, +{0x18,0x3280000d}, +{0x1c,0xc2002514}, +{0x20,0xc2002280}, +{0x24,0xd8002514}, +{0x28,0xc22026e4}, +{0x2c,0x9b2ca010}, +{0x30,0x832b2002}, +{0x34,0x9a034011}, +{0x38,0xda206710}, +{0x3c,0x98032001}, +{0x40,0xd8202514}, +{0x44,0x10800006}, +{0x48,0xaa056001}, +{0x4c,0x9b286002}, +{0x50,0xe8236710}, +{0x54,0x82006001}, +{0x58,0xc2202514}, +{0x5c,0xc2002514}, +{0x60,0x80a0600a}, +{0x64,0x12800025}, +{0x68,0x03000040}, +{0x6c,0x03000018}, +{0x70,0x9e1060e0}, +{0x74,0xe6002710}, +{0x78,0x90102001}, +{0x7c,0x932a2002}, +{0xf0,0x6e}, +{0x00,0xd4026710}, +{0x04,0x820aafff}, +{0x08,0x9932a010}, +{0x0c,0x980b2fff}, +{0x10,0x9a0cefff}, +{0x14,0x9734e010}, +{0x18,0x83286004}, +{0x1c,0x8200400c}, +{0x20,0x960aefff}, +{0x24,0x9b2b6004}, +{0x28,0x83286002}, +{0x2c,0x9a03400b}, +{0x30,0xd800400f}, +{0x34,0x9b2b6002}, +{0x38,0xc203400f}, +{0x3c,0x80a30001}, +{0x40,0x36800004}, +{0x44,0xd422670c}, +{0x48,0xe622670c}, +{0x4c,0xa610000a}, +{0x50,0x90022001}, +{0x54,0xda002514}, +{0x58,0x80a2000d}, +{0x5c,0x2abfffe9}, +{0x60,0x932a2002}, +{0x64,0x832b6002}, +{0x68,0xc0206710}, +{0x6c,0x82037fff}, +{0x70,0xc2202514}, +{0x74,0x03000040}, +{0x78,0xa8050001}, +{0x7c,0xa404a001}, +{0xf0,0x6f}, +{0x00,0xc2002308}, +{0x04,0x80a48001}, +{0x08,0x28bfff77}, +{0x0c,0xc2002514}, +{0x10,0xa2046001}, +{0x14,0xc2002300}, +{0x18,0x80a44001}, +{0x1c,0x28bfff6c}, +{0x20,0xa4102001}, +{0x24,0x80a4e000}, +{0x28,0x2280000b}, +{0x2c,0xda002530}, +{0x30,0xda002514}, +{0x34,0x80a36009}, +{0x38,0x38800007}, +{0x3c,0xda002530}, +{0x40,0x832b6002}, +{0x44,0xe6206710}, +{0x48,0x82036001}, +{0x4c,0xc2202514}, +{0x50,0xda002530}, +{0x54,0x80a5400d}, +{0x58,0x14800006}, +{0x5c,0x82100015}, +{0x60,0xc2002514}, +{0x64,0x80a34001}, +{0x68,0x28800002}, +{0x6c,0x8210000d}, +{0x70,0x80a56000}, +{0x74,0x02800004}, +{0x78,0xc2202530}, +{0x7c,0x1080000a}, +{0xf0,0x70}, +{0x00,0xc20021f8}, +{0x04,0x80a06000}, +{0x08,0x22800009}, +{0x0c,0xc2002530}, +{0x10,0xc20026f8}, +{0x14,0x80a06000}, +{0x18,0x22800004}, +{0x1c,0xc0202530}, +{0x20,0x82006001}, +{0x24,0xc22026f8}, +{0x28,0xc2002530}, +{0x2c,0x80a06000}, +{0x30,0x02800005}, +{0x34,0x01000000}, +{0x38,0xc2002548}, +{0x3c,0x82106040}, +{0x40,0xc2202548}, +{0x44,0x81c7e008}, +{0x48,0x81e80000}, +{0x4c,0x82220009}, +{0x50,0x9a58400a}, +{0x54,0x833b601f}, +{0x58,0x80a20009}, +{0x5c,0x83306019}, +{0x60,0x04800004}, +{0x64,0x90102000}, +{0x68,0x82034001}, +{0x6c,0x91386007}, +{0x70,0x81c3e008}, +{0x74,0x01000000}, +{0x78,0x9de3bf98}, +{0x7c,0x7ffffa11}, +{0xf0,0x71}, +{0x00,0xa6102001}, +{0x04,0xc208217f}, +{0x08,0x80a07fff}, +{0x0c,0x2280001d}, +{0x10,0xa6102001}, +{0x14,0x23000018}, +{0x18,0xa12ce006}, +{0x1c,0x821460e8}, +{0x20,0xa41460e4}, +{0x24,0xd2040001}, +{0x28,0xd408228c}, +{0x2c,0x7fffffe8}, +{0x30,0xd0040012}, +{0x34,0x9a1460e0}, +{0x38,0xd024000d}, +{0x3c,0xc2002308}, +{0x40,0xa12ce004}, +{0x44,0xa0040001}, +{0x48,0xa12c2002}, +{0x4c,0xa21460dc}, +{0x50,0xd004000d}, +{0x54,0xd2040011}, +{0x58,0x7fffffdd}, +{0x5c,0xd408228d}, +{0x60,0xd0240012}, +{0x64,0xc208217f}, +{0x68,0xa604e001}, +{0x6c,0x82006001}, +{0x70,0x80a4c001}, +{0x74,0x08bfffe9}, +{0x78,0x23000018}, +{0x7c,0xa6102001}, +{0xf0,0x72}, +{0x00,0xc2002308}, +{0x04,0x80a4c001}, +{0x08,0x1880001a}, +{0x0c,0x23000018}, +{0x10,0xa12ce002}, +{0x14,0x82146160}, +{0x18,0xa4146120}, +{0x1c,0xd2040001}, +{0x20,0xd408228e}, +{0x24,0x7fffffca}, +{0x28,0xd0040012}, +{0x2c,0x821460e0}, +{0x30,0xd0240001}, +{0x34,0xe0002300}, +{0x38,0xa12c2004}, +{0x3c,0xa0040013}, +{0x40,0xa12c2002}, +{0x44,0xa21460a0}, +{0x48,0xd0040001}, +{0x4c,0xd2040011}, +{0x50,0x7fffffbf}, +{0x54,0xd408228f}, +{0x58,0xd0240012}, +{0x5c,0xa604e001}, +{0x60,0xc2002308}, +{0x64,0x80a4c001}, +{0x68,0x08bfffea}, +{0x6c,0x23000018}, +{0x70,0x81c7e008}, +{0x74,0x81e80000}, +{0x78,0x9de3bf88}, +{0x7c,0xc2002fe4}, +{0xf0,0x73}, +{0x00,0x9fc04000}, +{0x04,0xd0002590}, +{0x08,0xda002550}, +{0x0c,0x832b6004}, +{0x10,0x8220400d}, +{0x14,0xe000259c}, +{0x18,0x82040001}, +{0x1c,0x83306004}, +{0x20,0xc2202550}, +{0x24,0x11000016}, +{0x28,0xc2002fe4}, +{0x2c,0x9fc04000}, +{0x30,0x90122330}, +{0x34,0xc208217c}, +{0x38,0xda08217d}, +{0x3c,0x9a5b4001}, +{0x40,0xc200259c}, +{0x44,0x8200400d}, +{0x48,0xc220259c}, +{0x4c,0xda00259c}, +{0x50,0xc2002550}, +{0x54,0x80a34001}, +{0x58,0x28800011}, +{0x5c,0xc2002548}, +{0x60,0xc200259c}, +{0x64,0x80a04010}, +{0x68,0x0880000d}, +{0x6c,0xc2002548}, +{0x70,0x80a42000}, +{0x74,0x0280000a}, +{0x78,0x01000000}, +{0x7c,0x82087f7f}, +{0xf0,0x74}, +{0x00,0xc2202548}, +{0x04,0xc2002658}, +{0x08,0x80a06000}, +{0x0c,0x26800006}, +{0x10,0xc0202658}, +{0x14,0x10800005}, +{0x18,0xc208254e}, +{0x1c,0x82106080}, +{0x20,0xc2202548}, +{0x24,0xc208254e}, +{0x28,0x80a00001}, +{0x2c,0x82602000}, +{0x30,0xa0087ffe}, +{0x34,0xd8002548}, +{0x38,0x83332010}, +{0x3c,0x80886001}, +{0x40,0x02800012}, +{0x44,0xa0042003}, +{0x48,0x03000180}, +{0x4c,0x820b0001}, +{0x50,0x1b000080}, +{0x54,0x80a0400d}, +{0x58,0x22800061}, +{0x5c,0xc02026d4}, +{0x60,0xc2002160}, +{0x64,0x80886040}, +{0x68,0x0280002c}, +{0x6c,0xa0102000}, +{0x70,0xc2002558}, +{0x74,0x80a06000}, +{0x78,0x02800028}, +{0x7c,0xa0102002}, +{0xf0,0x75}, +{0x00,0x10800026}, +{0x04,0xa0102000}, +{0x08,0x033fc200}, +{0x0c,0x82106030}, +{0x10,0xda004000}, +{0x14,0xc2002570}, +{0x18,0x80a34001}, +{0x1c,0x32800050}, +{0x20,0xc02026d4}, +{0x24,0xc2002200}, +{0x28,0x80a06000}, +{0x2c,0x3280004c}, +{0x30,0xc02026d4}, +{0x34,0xda002690}, +{0x38,0x03000007}, +{0x3c,0x808b4001}, +{0x40,0x32800047}, +{0x44,0xc02026d4}, +{0x48,0xda002654}, +{0x4c,0xc20021dc}, +{0x50,0x80a34001}, +{0x54,0x2a800008}, +{0x58,0xc2002514}, +{0x5c,0xc200254c}, +{0x60,0x8330600e}, +{0x64,0x80886001}, +{0x68,0x1280000a}, +{0x6c,0x808b2040}, +{0x70,0xc2002514}, +{0x74,0x80a06000}, +{0x78,0x22800009}, +{0x7c,0xc20c2314}, +{0xf0,0x76}, +{0x00,0x808b2080}, +{0x04,0x22800006}, +{0x08,0xc20c2314}, +{0x0c,0x808b2040}, +{0x10,0x32800033}, +{0x14,0xc02026d4}, +{0x18,0xc20c2314}, +{0x1c,0x80a06000}, +{0x20,0x2280002f}, +{0x24,0xc02026d4}, +{0x28,0xc20026d4}, +{0x2c,0x98006001}, +{0x30,0xc2002700}, +{0x34,0xda082169}, +{0x38,0xd82026d4}, +{0x3c,0x80a0400d}, +{0x40,0x0480000a}, +{0x44,0xc20c2314}, +{0x48,0x820860ff}, +{0x4c,0xda082168}, +{0x50,0x8258400d}, +{0x54,0x80a30001}, +{0x58,0x06800021}, +{0x5c,0x01000000}, +{0x60,0x10800007}, +{0x64,0xc02026d4}, +{0x68,0x820860ff}, +{0x6c,0x80a30001}, +{0x70,0x0680001b}, +{0x74,0x01000000}, +{0x78,0xc02026d4}, +{0x7c,0xc20c234c}, +{0xf0,0x77}, +{0x00,0xc227bfec}, +{0x04,0xc20c230c}, +{0x08,0xc227bff0}, +{0x0c,0xa0102000}, +{0x10,0xc208217c}, +{0x14,0x80a40001}, +{0x18,0x1a800011}, +{0x1c,0x01000000}, +{0x20,0xc20c2380}, +{0x24,0xc227bfe8}, +{0x28,0xa2102000}, +{0x2c,0xc208217d}, +{0x30,0x80a44001}, +{0x34,0x3a800006}, +{0x38,0xa0042001}, +{0x3c,0x7ffff955}, +{0x40,0x9007bfe8}, +{0x44,0x10bffffa}, +{0x48,0xa2046001}, +{0x4c,0xc208217c}, +{0x50,0x80a40001}, +{0x54,0x2abffff4}, +{0x58,0xc20c2380}, +{0x5c,0x81c7e008}, +{0x60,0x81e80000}, +{0x64,0xd2002208}, +{0x68,0x80a26000}, +{0x6c,0x0280001a}, +{0x70,0x01000000}, +{0x74,0xc2102548}, +{0x78,0x80886001}, +{0x7c,0x12800016}, +{0xf0,0x78}, +{0x00,0x01000000}, +{0x04,0xc2002514}, +{0x08,0x80a06000}, +{0x0c,0x12800007}, +{0x10,0xc2002558}, +{0x14,0x80a06000}, +{0x18,0x0280000f}, +{0x1c,0x9a007fff}, +{0x20,0x1080000d}, +{0x24,0xda202558}, +{0x28,0x15200040}, +{0x2c,0x1b3fc200}, +{0x30,0x9812a001}, +{0x34,0x80a06000}, +{0x38,0x12800006}, +{0x3c,0x96136070}, +{0x40,0xd8234000}, +{0x44,0xc2002298}, +{0x48,0xc222c000}, +{0x4c,0xd4234000}, +{0x50,0xd2202558}, +{0x54,0x81c3e008}, +{0x58,0x01000000}, +{0x5c,0x9de3bf98}, +{0x60,0xb12e2002}, +{0x64,0xf8062710}, +{0x68,0x9e0f2fff}, +{0x6c,0xb1372010}, +{0x70,0xb00e2fff}, +{0x74,0xbb2be004}, +{0x78,0xba074018}, +{0x7c,0x03000018}, +{0xf0,0x79}, +{0x00,0x821060e0}, +{0x04,0xbb2f6002}, +{0x08,0xfa074001}, +{0x0c,0xc20821e4}, +{0x10,0xba5f4001}, +{0x14,0x833f601f}, +{0x18,0x83306019}, +{0x1c,0xba074001}, +{0x20,0xbb3f6007}, +{0x24,0xb937200c}, +{0x28,0xc20821e5}, +{0x2c,0x92100019}, +{0x30,0x9610001a}, +{0x34,0xa8074001}, +{0x38,0x808f2001}, +{0x3c,0xb006001a}, +{0x40,0x02800010}, +{0x44,0x9e03c019}, +{0x48,0xc20023c8}, +{0x4c,0x80886200}, +{0x50,0x32800002}, +{0x54,0xb006001a}, +{0x58,0xc200237c}, +{0x5c,0x80a06000}, +{0x60,0x22800071}, +{0x64,0x9e03e001}, +{0x68,0xc2002308}, +{0x6c,0x80a60001}, +{0x70,0x2880006d}, +{0x74,0x9e03e001}, +{0x78,0x1080006b}, +{0x7c,0xb0062001}, +{0xf0,0x7a}, +{0x00,0xc20023c8}, +{0x04,0x83306014}, +{0x08,0x82086001}, +{0x0c,0x80a00001}, +{0x10,0xa4603fff}, +{0x14,0x94102001}, +{0x18,0x9e03c009}, +{0x1c,0x8333e01f}, +{0x20,0x80948001}, +{0x24,0x12800060}, +{0x28,0xb006000b}, +{0x2c,0x80a62000}, +{0x30,0x0680005e}, +{0x34,0x80a2e000}, +{0x38,0xe0002300}, +{0x3c,0x82042001}, +{0x40,0x80a3c001}, +{0x44,0x18800059}, +{0x48,0x80a2e000}, +{0x4c,0xd0002308}, +{0x50,0x82022001}, +{0x54,0x80a60001}, +{0x58,0x18800053}, +{0x5c,0xb220000a}, +{0x60,0x80a6400a}, +{0x64,0x14800050}, +{0x68,0xa6102000}, +{0x6c,0x23000018}, +{0x70,0xaa1460e0}, +{0x74,0x80a2e000}, +{0x78,0xb4100018}, +{0x7c,0x12800004}, +{0xf0,0x7b}, +{0x00,0xb603c019}, +{0x04,0xb4060019}, +{0x08,0xb610000f}, +{0x0c,0x80a6a000}, +{0x10,0x0480003e}, +{0x14,0x8206ffff}, +{0x18,0x80a2001a}, +{0x1c,0x8216c001}, +{0x20,0xba402000}, +{0x24,0x8330601f}, +{0x28,0x80974001}, +{0x2c,0x32800038}, +{0x30,0xb2066001}, +{0x34,0x80a6c010}, +{0x38,0x38800035}, +{0x3c,0xb2066001}, +{0x40,0xf80821e6}, +{0x44,0x80a72000}, +{0x48,0x0280002a}, +{0x4c,0x832ee004}, +{0x50,0x8226c009}, +{0x54,0xba26800b}, +{0x58,0x83286004}, +{0x5c,0x8200401d}, +{0x60,0x9a1460e0}, +{0x64,0x83286002}, +{0x68,0xc200400d}, +{0x6c,0x8258401c}, +{0x70,0xbb38601f}, +{0x74,0xbb376019}, +{0x78,0x8200401d}, +{0x7c,0xb92ee004}, +{0xf0,0x7c}, +{0x00,0x83386007}, +{0x04,0xb807001a}, +{0x08,0xfa0821e7}, +{0x0c,0x9800401d}, +{0x10,0xb92f2002}, +{0x14,0xc207000d}, +{0x18,0x80a0400c}, +{0x1c,0x14800022}, +{0x20,0x82066001}, +{0x24,0x80a06002}, +{0x28,0x38800012}, +{0x2c,0x832ee004}, +{0x30,0x80a2e000}, +{0x34,0x32800007}, +{0x38,0x8206c019}, +{0x3c,0xbb2ee006}, +{0x40,0x82068019}, +{0x44,0xba07400d}, +{0x48,0x10800005}, +{0x4c,0x83286002}, +{0x50,0x83286006}, +{0x54,0xba00400d}, +{0x58,0x832ea002}, +{0x5c,0x82074001}, +{0x60,0xc2004000}, +{0x64,0x80a0400c}, +{0x68,0x1480000f}, +{0x6c,0x832ee004}, +{0x70,0x8200401a}, +{0x74,0x83286002}, +{0x78,0xc2004015}, +{0x7c,0x80a04014}, +{0xf0,0x7d}, +{0x00,0x36800002}, +{0x04,0xa6102001}, +{0x08,0xb2066001}, +{0x0c,0x80a6400a}, +{0x10,0x04bfffba}, +{0x14,0x80a2e000}, +{0x18,0x80a4e000}, +{0x1c,0x12bfff9f}, +{0x20,0x9402a001}, +{0x24,0x80a2e000}, +{0x28,0x12800003}, +{0x2c,0xb026000b}, +{0x30,0xb023c009}, +{0x34,0x81c7e008}, +{0x38,0x81e80000}, +{0x3c,0x9de3bf80}, +{0x40,0x03003fc0}, +{0x44,0x82106001}, +{0x48,0xc227bff4}, +{0x4c,0xc227bff0}, +{0x50,0xa4102000}, +{0x54,0xc2002514}, +{0x58,0x80a48001}, +{0x5c,0x1a800024}, +{0x60,0xa72ca002}, +{0x64,0xc204e710}, +{0x68,0x8330600c}, +{0x6c,0x80886001}, +{0x70,0x3280001b}, +{0x74,0xa404a001}, +{0x78,0xa2102000}, +{0x7c,0x8207bff8}, +{0xf0,0x7e}, +{0x00,0x9a044001}, +{0x04,0xa12c6002}, +{0x08,0xa0040001}, +{0x0c,0xd44b7ff9}, +{0x10,0x90100012}, +{0x14,0x7fffff52}, +{0x18,0xd24b7ff8}, +{0x1c,0xa2046001}, +{0x20,0x80a46003}, +{0x24,0x04bffff6}, +{0x28,0xd0243fe8}, +{0x2c,0xda07bfe4}, +{0x30,0xc207bfec}, +{0x34,0x83286010}, +{0x38,0x9b2b6018}, +{0x3c,0x9a034001}, +{0x40,0xc207bfe0}, +{0x44,0x83286008}, +{0x48,0x9a034001}, +{0x4c,0xc207bfe8}, +{0x50,0x9a034001}, +{0x54,0xda24e738}, +{0x58,0xa404a001}, +{0x5c,0xc2002514}, +{0x60,0x80a48001}, +{0x64,0x0abfffe0}, +{0x68,0xa72ca002}, +{0x6c,0x81c7e008}, +{0x70,0x81e80000}, +{0x74,0x9de3bf70}, +{0x78,0xc200270c}, +{0x7c,0x80a06000}, +{0xf0,0x7f}, +{0x00,0x02800004}, +{0x04,0x11000040}, +{0x08,0x82007fff}, +{0x0c,0xc220270c}, +{0x10,0xda08256b}, +{0x14,0xd8002514}, +{0x18,0x82102080}, +{0x1c,0x80a3000d}, +{0x20,0x18800006}, +{0x24,0xc220256c}, +{0x28,0xc200270c}, +{0x2c,0x80a06000}, +{0x30,0x22800088}, +{0x34,0xc2002160}, +{0x38,0x92102000}, +{0x3c,0x80a2400c}, +{0x40,0x1a800014}, +{0x44,0xa007bff8}, +{0x48,0x9b2a6002}, +{0x4c,0xc20b6739}, +{0x50,0xd40b6738}, +{0x54,0xd80b673b}, +{0x58,0xd60b673a}, +{0x5c,0x8220400a}, +{0x60,0x9823000b}, +{0x64,0x82006001}, +{0x68,0x98032001}, +{0x6c,0x8258400c}, +{0x70,0x9a034010}, +{0x74,0xc2237fd8}, +{0x78,0x92026001}, +{0x7c,0xc2002514}, +{0xf0,0x80}, +{0x00,0x80a24001}, +{0x04,0x0abffff2}, +{0x08,0x9b2a6002}, +{0x0c,0x92102000}, +{0x10,0xd8002514}, +{0x14,0x80a2400c}, +{0x18,0x1a800068}, +{0x1c,0xa0102000}, +{0x20,0x9a07bfd0}, +{0x24,0xc2034000}, +{0x28,0x80a04010}, +{0x2c,0x04800007}, +{0x30,0x9a036004}, +{0x34,0x80a04008}, +{0x38,0x36800005}, +{0x3c,0x92026001}, +{0x40,0xa0100001}, +{0x44,0x9e100009}, +{0x48,0x92026001}, +{0x4c,0x80a2400c}, +{0x50,0x2abffff6}, +{0x54,0xc2034000}, +{0x58,0x80a42000}, +{0x5c,0x02800057}, +{0x60,0x03000040}, +{0x64,0x80a20001}, +{0x68,0x3280001d}, +{0x6c,0x92102000}, +{0x70,0xc2082361}, +{0x74,0x80a40001}, +{0x78,0x36800011}, +{0x7c,0xc2082362}, +{0xf0,0x81}, +{0x00,0x992be002}, +{0x04,0xc20b2739}, +{0x08,0xda0b2738}, +{0x0c,0x8220400d}, +{0x10,0xd608235f}, +{0x14,0x80a0400b}, +{0x18,0x36800009}, +{0x1c,0xc2082362}, +{0x20,0xda0b273a}, +{0x24,0xc20b273b}, +{0x28,0x8220400d}, +{0x2c,0x80a0400b}, +{0x30,0x26800005}, +{0x34,0xc200270c}, +{0x38,0xc2082362}, +{0x3c,0xc220270c}, +{0x40,0xc200270c}, +{0x44,0x80a06000}, +{0x48,0x02800042}, +{0x4c,0xc2002160}, +{0x50,0x80886020}, +{0x54,0x12800051}, +{0x58,0x92102000}, +{0x5c,0xda002514}, +{0x60,0x80a2400d}, +{0x64,0x1abfffca}, +{0x68,0x90100010}, +{0x6c,0xa207bff8}, +{0x70,0x972a6002}, +{0x74,0x8202c011}, +{0x78,0xc2007fd8}, +{0x7c,0x80a04010}, +{0xf0,0x82}, +{0x00,0x32800028}, +{0x04,0x92026001}, +{0x08,0x9e102000}, +{0x0c,0x80a3c00d}, +{0x10,0x1a800023}, +{0x14,0x952be002}, +{0x18,0x80a2400f}, +{0x1c,0x0280001d}, +{0x20,0x9e03e001}, +{0x24,0xda02a710}, +{0x28,0x900b6fff}, +{0x2c,0x80a36000}, +{0x30,0x02800018}, +{0x34,0x98022001}, +{0x38,0xc20ae738}, +{0x3c,0x80a30001}, +{0x40,0x26800015}, +{0x44,0xc2002514}, +{0x48,0x83336010}, +{0x4c,0x98086fff}, +{0x50,0xc20ae739}, +{0x54,0x82006001}, +{0x58,0x80a20001}, +{0x5c,0x1480000d}, +{0x60,0x9a032001}, +{0x64,0xc20ae73a}, +{0x68,0x80a34001}, +{0x6c,0x2680000a}, +{0x70,0xc2002514}, +{0x74,0xc20ae73b}, +{0x78,0x82006001}, +{0x7c,0x80a30001}, +{0xf0,0x83}, +{0x00,0x14800004}, +{0x04,0x82028011}, +{0x08,0xc022a710}, +{0x0c,0xc0207fd8}, +{0x10,0xc2002514}, +{0x14,0x10bfffdf}, +{0x18,0x80a3c001}, +{0x1c,0x92026001}, +{0x20,0xda002514}, +{0x24,0x80a2400d}, +{0x28,0x0abfffd3}, +{0x2c,0x972a6002}, +{0x30,0x10bfff97}, +{0x34,0x90100010}, +{0x38,0x7ffff7c2}, +{0x3c,0x01000000}, +{0x40,0xc2002160}, +{0x44,0x80886010}, +{0x48,0x02800031}, +{0x4c,0x01000000}, +{0x50,0x80886080}, +{0x54,0x02800013}, +{0x58,0x92102000}, +{0x5c,0xc2002514}, +{0x60,0x80a06001}, +{0x64,0x0280000a}, +{0x68,0x80a06002}, +{0x6c,0x1280000f}, +{0x70,0x80a24001}, +{0x74,0x90102710}, +{0x78,0x7ffff6ce}, +{0x7c,0x92102714}, +{0xf0,0x84}, +{0x00,0x80a22002}, +{0x04,0x34800007}, +{0x08,0x92102000}, +{0x0c,0xc208235d}, +{0x10,0x1080001f}, +{0x14,0xc220256c}, +{0x18,0x10bfffe8}, +{0x1c,0xc0202514}, +{0x20,0xc2002514}, +{0x24,0x80a24001}, +{0x28,0x1a800019}, +{0x2c,0x912a6002}, +{0x30,0xd4022710}, +{0x34,0x820aafff}, +{0x38,0x9732a010}, +{0x3c,0x98006001}, +{0x40,0x960aefff}, +{0x44,0x82007fff}, +{0x48,0x83286018}, +{0x4c,0x992b2010}, +{0x50,0x9a02ffff}, +{0x54,0x8200400c}, +{0x58,0x9b2b6008}, +{0x5c,0x8200400d}, +{0x60,0x8200400b}, +{0x64,0x9532a00c}, +{0x68,0x92026001}, +{0x6c,0x808aa001}, +{0x70,0x12800003}, +{0x74,0x82006001}, +{0x78,0xc2222738}, +{0x7c,0xc2002514}, +{0xf0,0x85}, +{0x00,0x80a24001}, +{0x04,0x0abfffeb}, +{0x08,0x912a6002}, +{0x0c,0x81c7e008}, +{0x10,0x81e80000}, +{0x14,0x9de3bf98}, +{0x18,0x94102000}, +{0x1c,0xc2002514}, +{0x20,0x80a28001}, +{0x24,0x1a80005d}, +{0x28,0x96102000}, +{0x2c,0xbb2aa002}, +{0x30,0xf20f6738}, +{0x34,0xc20f6739}, +{0x38,0x80a64001}, +{0x3c,0x98102000}, +{0x40,0x9e102000}, +{0x44,0x14800020}, +{0x48,0x9a102000}, +{0x4c,0x03000018}, +{0x50,0x921060e0}, +{0x54,0xc20f673b}, +{0x58,0xf60f673a}, +{0x5c,0x80a6c001}, +{0x60,0x14800013}, +{0x64,0x832e6004}, +{0x68,0x8200401b}, +{0x6c,0x83286002}, +{0x70,0x82004009}, +{0x74,0xf80ae73b}, +{0x78,0xfa004000}, +{0x7c,0xb05f401b}, +{0xf0,0x86}, +{0x00,0x82006004}, +{0x04,0xb606e001}, +{0x08,0x80a76000}, +{0x0c,0x04800005}, +{0x10,0xb45f4019}, +{0x14,0x9e03c01a}, +{0x18,0x9a034018}, +{0x1c,0x9803001d}, +{0x20,0x80a6c01c}, +{0x24,0x24bffff6}, +{0x28,0xfa004000}, +{0x2c,0xbb2aa002}, +{0x30,0xb2066001}, +{0x34,0xc20f6739}, +{0x38,0x80a64001}, +{0x3c,0x24bfffe7}, +{0x40,0xc20f673b}, +{0x44,0xbb2b6006}, +{0x48,0xb92be006}, +{0x4c,0xc202e710}, +{0x50,0x9b3f201f}, +{0x54,0x81836000}, +{0x58,0x01000000}, +{0x5c,0x01000000}, +{0x60,0x01000000}, +{0x64,0xb87f000c}, +{0x68,0x9b3f601f}, +{0x6c,0x81836000}, +{0x70,0x01000000}, +{0x74,0x01000000}, +{0x78,0x01000000}, +{0x7c,0xba7f400c}, +{0xf0,0x87}, +{0x00,0x8330600c}, +{0x04,0x80886001}, +{0x08,0x9e073fe0}, +{0x0c,0x02800007}, +{0x10,0x9a077fe0}, +{0x14,0xc200237c}, +{0x18,0x80a06000}, +{0x1c,0x22800003}, +{0x20,0x9e073fa0}, +{0x24,0x9a077fa0}, +{0x28,0x80a3e000}, +{0x2c,0x24800002}, +{0x30,0x9e102001}, +{0x34,0x80a36000}, +{0x38,0x24800002}, +{0x3c,0x9a102001}, +{0x40,0xc208217f}, +{0x44,0x83286006}, +{0x48,0x80a3c001}, +{0x4c,0x36800002}, +{0x50,0x9e007fff}, +{0x54,0xc208217e}, +{0x58,0x83286006}, +{0x5c,0x80a34001}, +{0x60,0x36800002}, +{0x64,0x9a007fff}, +{0x68,0xfa02e710}, +{0x6c,0x832be010}, +{0x70,0x3900003c}, +{0x74,0x8200400d}, +{0x78,0xba0f401c}, +{0x7c,0x8200401d}, +{0xf0,0x88}, +{0x00,0xc222e710}, +{0x04,0x9402a001}, +{0x08,0xc2002514}, +{0x0c,0x80a28001}, +{0x10,0x0abfffa7}, +{0x14,0x9602e004}, +{0x18,0x7ffff5d8}, +{0x1c,0x91e8205a}, +{0x20,0x01000000}, +{0x24,0x9de3bf98}, +{0x28,0xd8002548}, +{0x2c,0x8333200c}, +{0x30,0x80886001}, +{0x34,0x12800081}, +{0x38,0x01000000}, +{0x3c,0xc208254d}, +{0x40,0x80a06000}, +{0x44,0x1280007d}, +{0x48,0x01000000}, +{0x4c,0xc208254e}, +{0x50,0x80a06000}, +{0x54,0x02800079}, +{0x58,0x01000000}, +{0x5c,0xc2002554}, +{0x60,0x825860fa}, +{0x64,0xda002500}, +{0x68,0x80a34001}, +{0x6c,0x0a800073}, +{0x70,0x01000000}, +{0x74,0xd6002658}, +{0x78,0x80a2e000}, +{0x7c,0x1480001c}, +{0xf0,0x89}, +{0x00,0x8202ffff}, +{0x04,0xc2002514}, +{0x08,0x80a06001}, +{0x0c,0x3280006b}, +{0x10,0xc0202658}, +{0x14,0xc2002710}, +{0x18,0x80a06000}, +{0x1c,0x12800004}, +{0x20,0x808b2040}, +{0x24,0x10800065}, +{0x28,0xc0202658}, +{0x2c,0x32800006}, +{0x30,0xd800239c}, +{0x34,0x80a2e000}, +{0x38,0x0680000d}, +{0x3c,0x8202e001}, +{0x40,0xd800239c}, +{0x44,0x0300003f}, +{0x48,0x9b332010}, +{0x4c,0x821063ff}, +{0x50,0x980b0001}, +{0x54,0x9a38000d}, +{0x58,0x9a23400c}, +{0x5c,0x80a2c00d}, +{0x60,0x06800005}, +{0x64,0x03296956}, +{0x68,0x8202ffff}, +{0x6c,0x10800053}, +{0x70,0xc2202658}, +{0x74,0x9a10625a}, +{0x78,0xc200250c}, +{0x7c,0x80a0400d}, +{0xf0,0x8a}, +{0x00,0x02800004}, +{0x04,0xa0102000}, +{0x08,0xda20250c}, +{0x0c,0xc0202654}, +{0x10,0x832c2002}, +{0x14,0x92006610}, +{0x18,0xc2006610}, +{0x1c,0x90102710}, +{0x20,0x80a06000}, +{0x24,0x0280000d}, +{0x28,0xa0042001}, +{0x2c,0x7ffff601}, +{0x30,0x01000000}, +{0x34,0xc2002300}, +{0x38,0xda002308}, +{0x3c,0x82584001}, +{0x40,0x9a5b400d}, +{0x44,0x8200400d}, +{0x48,0x83286006}, +{0x4c,0x80a20001}, +{0x50,0x0a80003a}, +{0x54,0x01000000}, +{0x58,0x80a4200f}, +{0x5c,0x08bfffee}, +{0x60,0x832c2002}, +{0x64,0x030041eb}, +{0x68,0xc2202658}, +{0x6c,0xa010200f}, +{0x70,0x9b2c2002}, +{0x74,0xc203660c}, +{0x78,0xa0843fff}, +{0x7c,0x12bffffd}, +{0xf0,0x8b}, +{0x00,0xc2236610}, +{0x04,0xda002654}, +{0x08,0xc2002710}, +{0x0c,0xc2202610}, +{0x10,0x80a3600f}, +{0x14,0x14800003}, +{0x18,0x9010200f}, +{0x1c,0x9010000d}, +{0x20,0x03000014}, +{0x24,0x9e1062a8}, +{0x28,0x82006800}, +{0x2c,0xa2106330}, +{0x30,0x0300003f}, +{0x34,0xa61063ff}, +{0x38,0x92022001}, +{0x3c,0xa0102000}, +{0x40,0xa410000f}, +{0x44,0x972c2002}, +{0x48,0x8203c00b}, +{0x4c,0xda106002}, +{0x50,0x9804400b}, +{0x54,0xd4132002}, +{0x58,0xc213c00b}, +{0x5c,0xd814400b}, +{0x60,0x82584008}, +{0x64,0x9a5b4008}, +{0x68,0x8200400c}, +{0x6c,0x9a03400a}, +{0x70,0x81800000}, +{0x74,0x01000000}, +{0x78,0x01000000}, +{0x7c,0x01000000}, +{0xf0,0x8c}, +{0x00,0x82704009}, +{0x04,0x81800000}, +{0x08,0x01000000}, +{0x0c,0x01000000}, +{0x10,0x01000000}, +{0x14,0x9a734009}, +{0x18,0x83286010}, +{0x1c,0x9a0b4013}, +{0x20,0x8200400d}, +{0x24,0xa0042001}, +{0x28,0x80a420b5}, +{0x2c,0x08bfffe6}, +{0x30,0xc222c012}, +{0x34,0xd2202654}, +{0x38,0x81c7e008}, +{0x3c,0x81e80000}, +{0x40,0x9de3bf98}, +{0x44,0xa2102000}, +{0x48,0xc2002514}, +{0x4c,0x80a44001}, +{0x50,0xa0102000}, +{0x54,0x1a800012}, +{0x58,0x832c2002}, +{0x5c,0x92006710}, +{0x60,0xc2006710}, +{0x64,0x80a06000}, +{0x68,0x02800009}, +{0x6c,0x90100018}, +{0x70,0x7ffff5b0}, +{0x74,0x01000000}, +{0x78,0x82102001}, +{0x7c,0x80a20019}, +{0xf0,0x8d}, +{0x00,0x1a800003}, +{0x04,0x83284010}, +{0x08,0xa2144001}, +{0x0c,0xa0042001}, +{0x10,0xc2002514}, +{0x14,0x10bffff0}, +{0x18,0x80a40001}, +{0x1c,0x81c7e008}, +{0x20,0x91e80011}, +{0x24,0x9de3bf90}, +{0x28,0x03003fc0}, +{0x2c,0x82106001}, +{0x30,0xc227bff0}, +{0x34,0xc027bff4}, +{0x38,0xa0102000}, +{0x3c,0x8207bff8}, +{0x40,0x82040001}, +{0x44,0xd2487ff9}, +{0x48,0xd0487ff8}, +{0x4c,0x90060008}, +{0x50,0x92064009}, +{0x54,0x94102000}, +{0x58,0x7ffff5f4}, +{0x5c,0x9610001a}, +{0x60,0x80a22000}, +{0x64,0x02800004}, +{0x68,0xa0042001}, +{0x6c,0x10800006}, +{0x70,0xb0102001}, +{0x74,0x80a42004}, +{0x78,0x04bffff2}, +{0x7c,0x8207bff8}, +{0xf0,0x8e}, +{0x00,0xb0102000}, +{0x04,0x81c7e008}, +{0x08,0x81e80000}, +{0x0c,0x9de3bf98}, +{0x10,0xc2102548}, +{0x14,0x80886001}, +{0x18,0xb8102000}, +{0x1c,0xba102000}, +{0x20,0x02800004}, +{0x24,0xae102000}, +{0x28,0x10800026}, +{0x2c,0xec002354}, +{0x30,0xc200254c}, +{0x34,0x80886200}, +{0x38,0x32800010}, +{0x3c,0xc2002690}, +{0x40,0x03296956}, +{0x44,0xda00250c}, +{0x48,0x8210625a}, +{0x4c,0x80a34001}, +{0x50,0x12800006}, +{0x54,0xc20023c8}, +{0x58,0x80886800}, +{0x5c,0x32800007}, +{0x60,0xc2002690}, +{0x64,0xc20023c8}, +{0x68,0x80886400}, +{0x6c,0x22800015}, +{0x70,0xec0022ac}, +{0x74,0xc2002690}, +{0x78,0x80886200}, +{0x7c,0x1280000a}, +{0xf0,0x8f}, +{0x00,0xb8102001}, +{0x04,0x13000014}, +{0x08,0xc2002fd0}, +{0x0c,0x921262a8}, +{0x10,0x9fc04000}, +{0x14,0xd0002590}, +{0x18,0xc2002690}, +{0x1c,0x82106200}, +{0x20,0xc2202690}, +{0x24,0x10800007}, +{0x28,0xec0023a0}, +{0x2c,0xc200254c}, +{0x30,0x1b000080}, +{0x34,0x8210400d}, +{0x38,0x10800084}, +{0x3c,0xc220254c}, +{0x40,0x7ffff4ee}, +{0x44,0x901020aa}, +{0x48,0xda002500}, +{0x4c,0xc20022d0}, +{0x50,0x80a34001}, +{0x54,0x3880000f}, +{0x58,0xba102001}, +{0x5c,0xc2002200}, +{0x60,0x80a00001}, +{0x64,0x9a402000}, +{0x68,0x80a00016}, +{0x6c,0x82603fff}, +{0x70,0x80934001}, +{0x74,0x32800007}, +{0x78,0xba102001}, +{0x7c,0xc2002548}, +{0xf0,0x90}, +{0x00,0x80886001}, +{0x04,0x02800004}, +{0x08,0xaa102000}, +{0x0c,0xba102001}, +{0x10,0xaa102000}, +{0x14,0xa52d6003}, +{0x18,0xc204a760}, +{0x1c,0x80a06000}, +{0x20,0x22800067}, +{0x24,0xaa056001}, +{0x28,0x80a56000}, +{0x2c,0x12800008}, +{0x30,0x80a76000}, +{0x34,0xc200255c}, +{0x38,0x80a06000}, +{0x3c,0x1280000c}, +{0x40,0x29200000}, +{0x44,0x1080000a}, +{0x48,0xa8102000}, +{0x4c,0x02800005}, +{0x50,0x9004a760}, +{0x54,0xc024a764}, +{0x58,0x10800058}, +{0x5c,0xc024a760}, +{0x60,0x7fffff78}, +{0x64,0x92100016}, +{0x68,0xa8100008}, +{0x6c,0x80a52000}, +{0x70,0x02800050}, +{0x74,0xae15c014}, +{0x78,0xc214a766}, +{0x7c,0x80a06000}, +{0xf0,0x91}, +{0x00,0x0280000a}, +{0x04,0x80a56000}, +{0x08,0xc204a764}, +{0x0c,0x82007fff}, +{0x10,0xc224a764}, +{0x14,0xc214a766}, +{0x18,0x80a06000}, +{0x1c,0x32800048}, +{0x20,0xaa056001}, +{0x24,0x80a56000}, +{0x28,0x12800006}, +{0x2c,0x1b004000}, +{0x30,0xc200254c}, +{0x34,0x8210400d}, +{0x38,0x10800040}, +{0x3c,0xc220254c}, +{0x40,0xc2102548}, +{0x44,0x80886001}, +{0x48,0x02800006}, +{0x4c,0x82103fff}, +{0x50,0xc024a764}, +{0x54,0xc024a760}, +{0x58,0x10800038}, +{0x5c,0xc2202700}, +{0x60,0x80a72000}, +{0x64,0x02bfffb2}, +{0x68,0xa6102000}, +{0x6c,0xc2002514}, +{0x70,0x80a4c001}, +{0x74,0x1a80002c}, +{0x78,0x83350013}, +{0x7c,0x80886001}, +{0xf0,0x92}, +{0x00,0x02800027}, +{0x04,0x9b2ce002}, +{0x08,0xe0036710}, +{0x0c,0xa3342016}, +{0x10,0xa00c2fff}, +{0x14,0xa13c2006}, +{0x18,0xa20c603f}, +{0x1c,0xa0042001}, +{0x20,0xa2046001}, +{0x24,0x92100011}, +{0x28,0xd410246e}, +{0x2c,0x7fffff5e}, +{0x30,0x90100010}, +{0x34,0x80a22000}, +{0x38,0x92100011}, +{0x3c,0x1280000f}, +{0x40,0x90100010}, +{0x44,0xc210246c}, +{0x48,0x94906000}, +{0x4c,0x2280000f}, +{0x50,0xc200254c}, +{0x54,0xc2002548}, +{0x58,0x80886080}, +{0x5c,0x2280000b}, +{0x60,0xc200254c}, +{0x64,0x7fffff50}, +{0x68,0x01000000}, +{0x6c,0x80a22000}, +{0x70,0x22800006}, +{0x74,0xc200254c}, +{0x78,0x82102001}, +{0x7c,0x83284013}, +{0xf0,0x93}, +{0x00,0x10800007}, +{0x04,0xa82d0001}, +{0x08,0x1b000080}, +{0x0c,0x8210400d}, +{0x10,0xc220254c}, +{0x14,0x10800004}, +{0x18,0xc02026e8}, +{0x1c,0x10bfffd4}, +{0x20,0xa604e001}, +{0x24,0x80a52000}, +{0x28,0x32800005}, +{0x2c,0xaa056001}, +{0x30,0xc024a764}, +{0x34,0xc024a760}, +{0x38,0xaa056001}, +{0x3c,0x80a56013}, +{0x40,0x04bfff96}, +{0x44,0xa52d6003}, +{0x48,0x80a5e000}, +{0x4c,0x22800002}, +{0x50,0xc02026e8}, +{0x54,0xc200255c}, +{0x58,0x80a06000}, +{0x5c,0x0280000a}, +{0x60,0x80a76000}, +{0x64,0xc2002760}, +{0x68,0x80a06000}, +{0x6c,0x12800006}, +{0x70,0x80a76000}, +{0x74,0x03000004}, +{0x78,0xc2202760}, +{0x7c,0xc2002248}, +{0xf0,0x94}, +{0x00,0xc2202764}, +{0x04,0x1280002b}, +{0x08,0xaa102000}, +{0x0c,0xc2002514}, +{0x10,0x80a54001}, +{0x14,0x1a800027}, +{0x18,0x96102001}, +{0x1c,0x992d6002}, +{0x20,0xc2032710}, +{0x24,0x8330600c}, +{0x28,0x80886001}, +{0x2c,0x3280001d}, +{0x30,0xaa056001}, +{0x34,0x832ac015}, +{0x38,0x808dc001}, +{0x3c,0x32800019}, +{0x40,0xaa056001}, +{0x44,0xa6102001}, +{0x48,0x9b2ce003}, +{0x4c,0xc2036760}, +{0x50,0x80a06000}, +{0x54,0x1280000f}, +{0x58,0xa604e001}, +{0x5c,0xc2032710}, +{0x60,0xc2236760}, +{0x64,0xc2102548}, +{0x68,0x80886001}, +{0x6c,0x02800004}, +{0x70,0x80a72000}, +{0x74,0x10800005}, +{0x78,0xc2002358}, +{0x7c,0x22800003}, +{0xf0,0x95}, +{0x00,0xc2002378}, +{0x04,0xc200239c}, +{0x08,0x10800005}, +{0x0c,0xc2236764}, +{0x10,0x80a4e013}, +{0x14,0x04bfffee}, +{0x18,0x9b2ce003}, +{0x1c,0xaa056001}, +{0x20,0xc2002514}, +{0x24,0x80a54001}, +{0x28,0x0abfffde}, +{0x2c,0x992d6002}, +{0x30,0x81c7e008}, +{0x34,0x81e80000}, +{0x38,0x9de3bf98}, +{0x3c,0x7ffff581}, +{0x40,0x01000000}, +{0x44,0xda002548}, +{0x48,0x83336010}, +{0x4c,0x80886001}, +{0x50,0x12800032}, +{0x54,0x8333600c}, +{0x58,0x80886001}, +{0x5c,0x1280002f}, +{0x60,0x01000000}, +{0x64,0xc2002538}, +{0x68,0x80a06000}, +{0x6c,0x2280000b}, +{0x70,0xc208254d}, +{0x74,0x82007fff}, +{0x78,0x80a06000}, +{0x7c,0x12800006}, +{0xf0,0x96}, +{0x00,0xc2202538}, +{0x04,0xc200254c}, +{0x08,0x1b002000}, +{0x0c,0x8210400d}, +{0x10,0xc220254c}, +{0x14,0xc208254d}, +{0x18,0x80a06000}, +{0x1c,0x0280001f}, +{0x20,0x033fc180}, +{0x24,0xc0204000}, +{0x28,0xa0102002}, +{0x2c,0x7ffff5bb}, +{0x30,0x90102001}, +{0x34,0x11000099}, +{0x38,0x7ffff097}, +{0x3c,0x9012233c}, +{0x40,0xa0843fff}, +{0x44,0x1cbffffa}, +{0x48,0x01000000}, +{0x4c,0x7ffff5b3}, +{0x50,0x90102000}, +{0x54,0xda00254c}, +{0x58,0x83336010}, +{0x5c,0x80886001}, +{0x60,0x32800002}, +{0x64,0xc020250c}, +{0x68,0x83336017}, +{0x6c,0x80886001}, +{0x70,0x32800005}, +{0x74,0xc2002538}, +{0x78,0xc2002188}, +{0x7c,0xc2202538}, +{0xf0,0x97}, +{0x00,0xc2002538}, +{0x04,0xc220265c}, +{0x08,0x7ffff2c6}, +{0x0c,0x90102015}, +{0x10,0x82102001}, +{0x14,0xc2202584}, +{0x18,0x81c7e008}, +{0x1c,0x81e80000}, +{0x20,0xc2002588}, +{0x24,0x80a06000}, +{0x28,0x32800006}, +{0x2c,0xc200258c}, +{0x30,0xc2002554}, +{0x34,0xc2202588}, +{0x38,0xc0202594}, +{0x3c,0xc200258c}, +{0x40,0x80a06000}, +{0x44,0x32800006}, +{0x48,0xc2102548}, +{0x4c,0xc2002554}, +{0x50,0xc220258c}, +{0x54,0xc0202598}, +{0x58,0xc2102548}, +{0x5c,0x80886001}, +{0x60,0x02800007}, +{0x64,0x01000000}, +{0x68,0xc2002558}, +{0x6c,0x80a06001}, +{0x70,0x18800003}, +{0x74,0x82102001}, +{0x78,0xc2202584}, +{0x7c,0x81c3e008}, +{0xf0,0x98}, +{0x00,0x01000000}, +{0x04,0xc2002548}, +{0x08,0x8330600e}, +{0x0c,0x80886001}, +{0x10,0x1280004d}, +{0x14,0x98102000}, +{0x18,0xc2002514}, +{0x1c,0x80a30001}, +{0x20,0x1a80000b}, +{0x24,0x033fc180}, +{0x28,0x96106004}, +{0x2c,0x832b2002}, +{0x30,0xda006710}, +{0x34,0xda20400b}, +{0x38,0x98032001}, +{0x3c,0xc2002514}, +{0x40,0x80a30001}, +{0x44,0x0abffffb}, +{0x48,0x832b2002}, +{0x4c,0xda00254c}, +{0x50,0x808b6001}, +{0x54,0x32800008}, +{0x58,0xc208254e}, +{0x5c,0xc2002514}, +{0x60,0x9a136001}, +{0x64,0x82106100}, +{0x68,0xda20254c}, +{0x6c,0xc2202514}, +{0x70,0xc208254e}, +{0x74,0x80a06000}, +{0x78,0x3280000b}, +{0x7c,0xc2082517}, +{0xf0,0x99}, +{0x00,0xc20023c8}, +{0x04,0x83306016}, +{0x08,0x80886001}, +{0x0c,0x22800006}, +{0x10,0xc2082517}, +{0x14,0xc2002514}, +{0x18,0x82106200}, +{0x1c,0xc2202514}, +{0x20,0xc2082517}, +{0x24,0x80a06000}, +{0x28,0x22800022}, +{0x2c,0xd8082517}, +{0x30,0xd6002548}, +{0x34,0x808ae800}, +{0x38,0x22800006}, +{0x3c,0xd80023c8}, +{0x40,0xc2002514}, +{0x44,0x82106400}, +{0x48,0xc2202514}, +{0x4c,0xd80023c8}, +{0x50,0x80a32000}, +{0x54,0x16800007}, +{0x58,0x8333200c}, +{0x5c,0xc2002514}, +{0x60,0x1b000004}, +{0x64,0x8210400d}, +{0x68,0xc2202514}, +{0x6c,0x8333200c}, +{0x70,0x80886001}, +{0x74,0x02800009}, +{0x78,0x808ae001}, +{0x7c,0xc2002540}, +{0xf0,0x9a}, +{0x00,0x1b164020}, +{0x04,0x83286010}, +{0x08,0x8200400d}, +{0x0c,0xda002514}, +{0x10,0x9a134001}, +{0x14,0xda202514}, +{0x18,0x22800006}, +{0x1c,0xd8082517}, +{0x20,0xc2002514}, +{0x24,0x82106800}, +{0x28,0xc2202514}, +{0x2c,0xd8082517}, +{0x30,0xda002514}, +{0x34,0x033fc180}, +{0x38,0xda204000}, +{0x3c,0xd8202568}, +{0x40,0xc0202540}, +{0x44,0x81c3e008}, +{0x48,0x01000000}, +{0x4c,0x9de3bf98}, +{0x50,0xd8002548}, +{0x54,0x8333200e}, +{0x58,0x80886001}, +{0x5c,0x22800006}, +{0x60,0xc2102516}, +{0x64,0x03000010}, +{0x68,0x822b0001}, +{0x6c,0x1080001e}, +{0x70,0xc2202548}, +{0x74,0x80a06000}, +{0x78,0x02800006}, +{0x7c,0x9b332003}, +{0xf0,0x9b}, +{0x00,0x808b2004}, +{0x04,0x2280000a}, +{0x08,0xc200231c}, +{0x0c,0x9b332003}, +{0x10,0x83332002}, +{0x14,0x82086001}, +{0x18,0x9a0b6001}, +{0x1c,0x80a0400d}, +{0x20,0x2280000a}, +{0x24,0xc2002560}, +{0x28,0xc200231c}, +{0x2c,0x80a06000}, +{0x30,0x22800003}, +{0x34,0xc2082360}, +{0x38,0x82102005}, +{0x3c,0xc2202560}, +{0x40,0x10800007}, +{0x44,0x90102001}, +{0x48,0x80a06000}, +{0x4c,0x02800004}, +{0x50,0x90102000}, +{0x54,0x10bffffa}, +{0x58,0x82007fff}, +{0x5c,0x7ffff50f}, +{0x60,0x01000000}, +{0x64,0xc2002548}, +{0x68,0x9a004001}, +{0x6c,0x9a0b6008}, +{0x70,0x82087ff7}, +{0x74,0x8210400d}, +{0x78,0xc2202548}, +{0x7c,0x81c7e008}, +{0xf0,0x9c}, +{0x00,0x81e80000}, +{0x04,0x00000000}, +{0x08,0x00000000}, +{0x0c,0x00000000}, +{0x10,0x00000000}, +{0x14,0x00000000}, +{0x18,0x00000000}, +{0x1c,0x00000000}, +{0x20,0x00000000}, +{0x24,0x00000000}, +{0x28,0x00000000}, +{0x2c,0x00000000}, +{0x30,0x00000000}, +{0x34,0x00000000}, +{0x38,0x00000000}, +{0x3c,0x00000000}, +{0x40,0x00000000}, +{0x44,0x00000000}, +{0x48,0x00000000}, +{0x4c,0x00000000}, +{0x50,0x00000000}, +{0x54,0x00000000}, +{0x58,0x00000000}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x00000000}, +{0x6c,0x00000000}, +{0x70,0x00000000}, +{0x74,0x00000000}, +{0x78,0x00000000}, +{0x7c,0x00000000}, +{0xf0,0x9d}, +{0x00,0x00003670}, +{0x04,0xa5010503}, +{0x08,0xa5000004}, +{0x0c,0x00000000}, +{0x10,0x4c494348}, +{0x14,0x49444449}, +{0x18,0x80cb88ec}, +{0x1c,0xbdae39cf}, +{0x20,0x864880cd}, +{0x24,0xc96f9252}, +{0x28,0x80d1c80b}, +{0x2c,0xcce0c9e5}, +{0x30,0xc400bc13}, +{0x34,0xbc12bc43}, +{0x38,0xc643bd13}, +{0x3c,0x00000000}, +{0x40,0x00000000}, +{0x44,0x00000000}, +{0x48,0x00000000}, +{0x4c,0x00000000}, +{0x50,0x00000000}, +{0x54,0x00000000}, +{0x58,0x00000000}, +{0x5c,0x00000000}, +{0x60,0x00000000}, +{0x64,0x00000000}, +{0x68,0x53657020}, +{0x6c,0x20392032}, +{0x70,0x30313500}, +{0x74,0x00000000}, +{0x78,0x31393a31}, +{0x7c,0x343a3338}, + + +}; + +#endif \ No newline at end of file diff --git a/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_driver.c b/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_driver.c new file mode 100755 index 00000000000..2e886337e31 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_driver.c @@ -0,0 +1,3431 @@ +/* drivers/input/touchscreen/gt9xx_driver.c + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: V2.5 + * Release Date: 2015/01/21 + */ + +#include "tpd.h" +#include "tpd_custom_gt9xx.h" + +#ifndef TPD_NO_GPIO +#include "cust_gpio_usage.h" +#endif +#ifdef TPD_PROXIMITY +#include +#include +#include +#endif + +#if GTP_SUPPORT_I2C_DMA + #include +#endif + +/****************add by phoenix.wu**************/ +#include +static struct kobject *tptype_ctrl_kobj= NULL; +static int tptype_sysfs_init(void); +static void tptype_sysfs_exit(void); +/************************************************/ + +#if GTP_ICS_SLOT_REPORT +#include +static unsigned long gt9xx_finger_status = 0; +static unsigned long gt9xx_finger_status_pre = 0; +#endif + +extern struct tpd_device *tpd; +extern u8 gtp_loading_fw; + +static int tpd_flag = 0; +int tpd_halt = 0; +static struct task_struct *thread = NULL; +static DECLARE_WAIT_QUEUE_HEAD(waiter); + +#ifdef TPD_HAVE_BUTTON +static int tpd_keys_local[TPD_KEY_COUNT] = TPD_KEYS; +static int tpd_keys_dim_local[TPD_KEY_COUNT][4] = TPD_KEYS_DIM; +#endif + +#if GTP_GESTURE_WAKEUP +typedef enum +{ + DOZE_DISABLED = 0, + DOZE_ENABLED = 1, + DOZE_WAKEUP = 2, +}DOZE_T; +static DOZE_T doze_status = DOZE_DISABLED; +static s8 gtp_enter_doze(struct i2c_client *client); +#endif + +#if GTP_CHARGER_SWITCH + #ifdef MT6573 + #define CHR_CON0 (0xF7000000+0x2FA00) + #else + extern kal_bool upmu_is_chr_det(void); + #endif + static void gtp_charger_switch(s32 dir_update); +#endif + +#if GTP_HAVE_TOUCH_KEY +const u16 touch_key_array[] = GTP_KEY_TAB; +#define GTP_MAX_KEY_NUM ( sizeof( touch_key_array )/sizeof( touch_key_array[0] ) ) +#endif + +#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) +static int tpd_wb_start_local[TPD_WARP_CNT] = TPD_WARP_START; +static int tpd_wb_end_local[TPD_WARP_CNT] = TPD_WARP_END; +#endif + +#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) +//static int tpd_calmat_local[8] = TPD_CALIBRATION_MATRIX; +static int tpd_def_calmat_local[8] = TPD_CALIBRATION_MATRIX; +#endif + +#if GTP_SUPPORT_I2C_DMA +s32 i2c_dma_write(struct i2c_client *client, u16 addr, u8 *txbuf, s32 len); +s32 i2c_dma_read(struct i2c_client *client, u16 addr, u8 *rxbuf, s32 len); + +static u8 *gpDMABuf_va = NULL; +static u32 gpDMABuf_pa = 0; +#endif + +s32 gtp_send_cfg(struct i2c_client *client); +void gtp_reset_guitar(struct i2c_client *client, s32 ms); +static void tpd_eint_interrupt_handler(void); +static int touch_event_handler(void *unused); +static int tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int tpd_i2c_detect(struct i2c_client *client, struct i2c_board_info *info); +static int tpd_i2c_remove(struct i2c_client *client); +s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len); +extern void mt_eint_unmask(unsigned int line); +extern void mt_eint_mask(unsigned int line); + +#ifndef MT6572 +extern void mt65xx_eint_set_hw_debounce(kal_uint8 eintno, kal_uint32 ms); +extern kal_uint32 mt65xx_eint_set_sens(kal_uint8 eintno, kal_bool sens); +extern void mt65xx_eint_registration(kal_uint8 eintno, kal_bool Dbounce_En, + kal_bool ACT_Polarity, void (EINT_FUNC_PTR)(void), + kal_bool auto_umask); +#endif + +#if GTP_CREATE_WR_NODE +extern s32 init_wr_node(struct i2c_client *); +extern void uninit_wr_node(void); +#endif + +#if (GTP_ESD_PROTECT || GTP_COMPATIBLE_MODE) +static void force_reset_guitar(void); +#endif + +#if GTP_ESD_PROTECT +static int clk_tick_cnt = 200; +static struct delayed_work gtp_esd_check_work; +static struct workqueue_struct *gtp_esd_check_workqueue = NULL; +static s32 gtp_init_ext_watchdog(struct i2c_client *client); +static void gtp_esd_check_func(struct work_struct *); +void gtp_esd_switch(struct i2c_client *client, s32 on); +u8 esd_running = 0; +spinlock_t esd_lock; +#endif + + +#ifdef TPD_PROXIMITY +#define TPD_PROXIMITY_VALID_REG 0x814E +#define TPD_PROXIMITY_ENABLE_REG 0x8042 +static u8 tpd_proximity_flag = 0; +static u8 tpd_proximity_detect = 1;//0-->close ; 1--> far away +#endif + +struct i2c_client *i2c_client_point = NULL; +static const struct i2c_device_id tpd_i2c_id[] = {{"gt9xx", 0}, {}}; +static unsigned short force[] = {0, 0xBA, I2C_CLIENT_END, I2C_CLIENT_END}; +static const unsigned short *const forces[] = { force, NULL }; +//static struct i2c_client_address_data addr_data = { .forces = forces,}; +static struct i2c_board_info __initdata i2c_tpd = { I2C_BOARD_INFO("gt9xx", (0xBA >> 1))}; +static struct i2c_driver tpd_i2c_driver = +{ + .probe = tpd_i2c_probe, + .remove = tpd_i2c_remove, + .detect = tpd_i2c_detect, + .driver.name = "gt9xx", + .id_table = tpd_i2c_id, + .address_list = (const unsigned short *) forces, +}; + + +static u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; +#if GTP_CHARGER_SWITCH +static u8 gtp_charger_config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; +#endif + +#pragma pack(1) +typedef struct +{ + u16 pid; //product id // + u16 vid; //version id // +} st_tpd_info; +#pragma pack() + +st_tpd_info tpd_info; +u8 int_type = 0; +u32 abs_x_max = 0; +u32 abs_y_max = 0; +u8 gtp_rawdiff_mode = 0; +u8 cfg_len = 0; +u8 pnl_init_error = 0; + +#if GTP_WITH_PEN +struct input_dev *pen_dev; +#endif + +#if GTP_COMPATIBLE_MODE +u8 driver_num = 0; +u8 sensor_num = 0; +u8 gtp_ref_retries = 0; +u8 gtp_clk_retries = 0; +CHIP_TYPE_T gtp_chip_type = CHIP_TYPE_GT9; +u8 rqst_processing = 0; +u8 is_950 = 0; + +extern u8 gup_check_fs_mounted(char *path_name); +extern u8 gup_clk_calibration(void); +extern s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +void gtp_get_chip_type(struct i2c_client *client); +u8 gtp_fw_startup(struct i2c_client *client); +static u8 gtp_bak_ref_proc(struct i2c_client *client, u8 mode); +static u8 gtp_main_clk_proc(struct i2c_client *client); +static void gtp_recovery_reset(struct i2c_client *client); +#endif + +#define GTP_LARGE_TOUCH 1 +/* proc file system */ +s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *rxbuf, int len); +s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *txbuf, int len); + +static ssize_t gt91xx_config_read_proc(struct file *, char __user *, size_t, loff_t *); +static ssize_t gt91xx_config_write_proc(struct file *, const char __user *, size_t, loff_t *); + +static struct proc_dir_entry *gt91xx_config_proc = NULL; +static const struct file_operations config_proc_ops = { + .owner = THIS_MODULE, + .read = gt91xx_config_read_proc, + .write = gt91xx_config_write_proc, +}; + +#define VELOCITY_CUSTOM +#ifdef VELOCITY_CUSTOM +#include +#include +#include + +#ifndef TPD_VELOCITY_CUSTOM_X +#define TPD_VELOCITY_CUSTOM_X 10 +#endif +#ifndef TPD_VELOCITY_CUSTOM_Y +#define TPD_VELOCITY_CUSTOM_Y 10 +#endif + +// for magnify velocity******************************************** +#define TOUCH_IOC_MAGIC 'A' + +#define TPD_GET_VELOCITY_CUSTOM_X _IO(TOUCH_IOC_MAGIC,0) +#define TPD_GET_VELOCITY_CUSTOM_Y _IO(TOUCH_IOC_MAGIC,1) + +int g_v_magnify_x = TPD_VELOCITY_CUSTOM_X; +int g_v_magnify_y = TPD_VELOCITY_CUSTOM_Y; +static int tpd_misc_open(struct inode *inode, struct file *file) +{ + return nonseekable_open(inode, file); +} + +static int tpd_misc_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static long tpd_unlocked_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + //char strbuf[256]; + void __user *data; + + long err = 0; + + if (_IOC_DIR(cmd) & _IOC_READ) + { + err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + } + else if (_IOC_DIR(cmd) & _IOC_WRITE) + { + err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + } + + if (err) + { + printk("tpd: access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd)); + return -EFAULT; + } + + switch (cmd) + { + case TPD_GET_VELOCITY_CUSTOM_X: + data = (void __user *) arg; + + if (data == NULL) + { + err = -EINVAL; + break; + } + + if (copy_to_user(data, &g_v_magnify_x, sizeof(g_v_magnify_x))) + { + err = -EFAULT; + break; + } + + break; + + case TPD_GET_VELOCITY_CUSTOM_Y: + data = (void __user *) arg; + + if (data == NULL) + { + err = -EINVAL; + break; + } + + if (copy_to_user(data, &g_v_magnify_y, sizeof(g_v_magnify_y))) + { + err = -EFAULT; + break; + } + + break; + + default: + printk("tpd: unknown IOCTL: 0x%08x\n", cmd); + err = -ENOIOCTLCMD; + break; + + } + + return err; +} + + +static struct file_operations tpd_fops = +{ +// .owner = THIS_MODULE, + .open = tpd_misc_open, + .release = tpd_misc_release, + .unlocked_ioctl = tpd_unlocked_ioctl, +}; +/*----------------------------------------------------------------------------*/ +static struct miscdevice tpd_misc_device = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "touch", + .fops = &tpd_fops, +}; + +//********************************************** +#endif + +static int tpd_i2c_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + strcpy(info->type, "mtk-tpd"); + return 0; +} + +#ifdef TPD_PROXIMITY +static s32 tpd_get_ps_value(void) +{ + return tpd_proximity_detect; +} + +static s32 tpd_enable_ps(s32 enable) +{ + u8 state; + s32 ret = -1; + + if (enable) + { + state = 1; + tpd_proximity_flag = 1; + GTP_INFO("TPD proximity function to be on."); + } + else + { + state = 0; + tpd_proximity_flag = 0; + GTP_INFO("TPD proximity function to be off."); + } + + ret = i2c_write_bytes(i2c_client_point, TPD_PROXIMITY_ENABLE_REG, &state, 1); + + if (ret < 0) + { + GTP_ERROR("TPD %s proximity cmd failed.", state ? "enable" : "disable"); + return ret; + } + + GTP_INFO("TPD proximity function %s success.", state ? "enable" : "disable"); + return 0; +} + +s32 tpd_ps_operate(void *self, u32 command, void *buff_in, s32 size_in, + void *buff_out, s32 size_out, s32 *actualout) +{ + s32 err = 0; + s32 value; + hwm_sensor_data *sensor_data; + + switch (command) + { + case SENSOR_DELAY: + if ((buff_in == NULL) || (size_in < sizeof(int))) + { + GTP_ERROR("Set delay parameter error!"); + err = -EINVAL; + } + + // Do nothing + break; + + case SENSOR_ENABLE: + if ((buff_in == NULL) || (size_in < sizeof(int))) + { + GTP_ERROR("Enable sensor parameter error!"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + err = tpd_enable_ps(value); + } + + break; + + case SENSOR_GET_DATA: + if ((buff_out == NULL) || (size_out < sizeof(hwm_sensor_data))) + { + GTP_ERROR("Get sensor data parameter error!"); + err = -EINVAL; + } + else + { + sensor_data = (hwm_sensor_data *)buff_out; + sensor_data->values[0] = tpd_get_ps_value(); + sensor_data->value_divide = 1; + sensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; + } + + break; + + default: + GTP_ERROR("proxmy sensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} +#endif + + +static ssize_t gt91xx_config_read_proc(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + char *ptr = page; + char temp_data[GTP_CONFIG_MAX_LENGTH + 2] = {0}; + int i; + + if (*ppos) // CMD call again + { + return 0; + } + + ptr += sprintf(ptr, "==== GT9XX config init value====\n"); + + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) + { + ptr += sprintf(ptr, "0x%02X ", config[i + 2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + + ptr += sprintf(ptr, "\n"); + + ptr += sprintf(ptr, "==== GT9XX config real value====\n"); + i2c_read_bytes(i2c_client_point, GTP_REG_CONFIG_DATA, temp_data, GTP_CONFIG_MAX_LENGTH); + + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) + { + ptr += sprintf(ptr, "0x%02X ", temp_data[i]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + /************* add by zjh **************************/ + /* Touch PID & VID */ + ptr += sprintf(ptr, "\n"); + ptr += sprintf(ptr, "==== GT9XX Version ID ====\n"); + i2c_read_bytes(i2c_client_point, GTP_REG_VERSION, temp_data, 6); + ptr += sprintf(ptr, "Chip PID: %c%c%c VID: 0x%02X%02X\n", + temp_data[0], temp_data[1], temp_data[2], temp_data[5], temp_data[4]); + i2c_read_bytes(i2c_client_point, 0x41E4, temp_data, 1); + ptr += sprintf(ptr, "Boot status 0x%X\n", temp_data[0]); + + /* sensor ID */ + i2c_read_bytes(i2c_client_point, GTP_REG_SENSOR_ID, temp_data, 1); + ptr += sprintf(ptr, "SensorID: %d\n", temp_data[0]); + + /* Touch Status and Clock Gate */ + ptr += sprintf(ptr, "\n"); + ptr += sprintf(ptr, "==== Touch Status and Clock Gate ====\n"); + ptr += sprintf(ptr, "status: 1: on, 0 :off\n"); + ptr += sprintf(ptr, "status:%d\n", (tpd_halt+1)&0x1); + + /************* add by zjh **************************/ + *ppos += ptr - page; + return (ptr - page); +} + +static ssize_t gt91xx_config_write_proc(struct file *filp, const char __user *buffer, size_t count, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG("write count %d\n", count); + + if (count > GTP_CONFIG_MAX_LENGTH) + { + GTP_ERROR("size not match [%d:%d]\n", GTP_CONFIG_MAX_LENGTH, count); + return -EFAULT; + } + + if (copy_from_user(&config[2], buffer, count)) + { + GTP_ERROR("copy from user fail\n"); + return -EFAULT; + } + + ret = gtp_send_cfg(i2c_client_point); + abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC]; + abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2]; + int_type = (config[TRIGGER_LOC]) & 0x03; + + if (ret < 0) + { + GTP_ERROR("send config failed."); + } + + return count; +} + +#if GTP_SUPPORT_I2C_DMA +s32 i2c_dma_read(struct i2c_client *client, u16 addr, u8 *rxbuf, s32 len) +{ + int ret; + s32 retry = 0; + u8 buffer[2]; + + struct i2c_msg msg[2] = + { + { + .addr = (client->addr & I2C_MASK_FLAG), + .flags = 0, + .buf = buffer, + .len = 2, + .timing = I2C_MASTER_CLOCK + }, + { + .addr = (client->addr & I2C_MASK_FLAG), + .ext_flag = (client->ext_flag | I2C_ENEXT_FLAG | I2C_DMA_FLAG), + .flags = I2C_M_RD, + .buf = (u8*)gpDMABuf_pa, + .len = len, + .timing = I2C_MASTER_CLOCK + }, + }; + + buffer[0] = (addr >> 8) & 0xFF; + buffer[1] = addr & 0xFF; + + if (rxbuf == NULL) + return -1; + + //GTP_DEBUG("dma i2c read: 0x%04X, %d bytes(s)", addr, len); + for (retry = 0; retry < 5; ++retry) + { + ret = i2c_transfer(client->adapter, &msg[0], 2); + if (ret < 0) + { + continue; + } + memcpy(rxbuf, gpDMABuf_va, len); + return 0; + } + GTP_ERROR("Dma I2C Read Error: 0x%04X, %d byte(s), err-code: %d", addr, len, ret); + return ret; +} + + +s32 i2c_dma_write(struct i2c_client *client, u16 addr, u8 *txbuf, s32 len) +{ + int ret; + s32 retry = 0; + u8 *wr_buf = gpDMABuf_va; + + struct i2c_msg msg = + { + .addr = (client->addr & I2C_MASK_FLAG), + .ext_flag = (client->ext_flag | I2C_ENEXT_FLAG | I2C_DMA_FLAG), + .flags = 0, + .buf = (u8*)gpDMABuf_pa, + .len = 2 + len, + .timing = I2C_MASTER_CLOCK + }; + + wr_buf[0] = (u8)((addr >> 8) & 0xFF); + wr_buf[1] = (u8)(addr & 0xFF); + + if (txbuf == NULL) + return -1; + + //GTP_DEBUG("dma i2c write: 0x%04X, %d bytes(s)", addr, len); + memcpy(wr_buf+2, txbuf, len); + for (retry = 0; retry < 5; ++retry) + { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret < 0) + { + continue; + } + return 0; + } + GTP_ERROR("Dma I2C Write Error: 0x%04X, %d byte(s), err-code: %d", addr, len, ret); + return ret; +} + +s32 i2c_read_bytes_dma(struct i2c_client *client, u16 addr, u8 *rxbuf, s32 len) +{ + s32 left = len; + s32 read_len = 0; + u8 *rd_buf = rxbuf; + s32 ret = 0; + + //GTP_DEBUG("Read bytes dma: 0x%04X, %d byte(s)", addr, len); + while (left > 0) + { + if (left > GTP_DMA_MAX_TRANSACTION_LENGTH) + { + read_len = GTP_DMA_MAX_TRANSACTION_LENGTH; + } + else + { + read_len = left; + } + ret = i2c_dma_read(client, addr, rd_buf, read_len); + if (ret < 0) + { + GTP_ERROR("dma read failed"); + return -1; + } + + left -= read_len; + addr += read_len; + rd_buf += read_len; + } + return 0; +} + +s32 i2c_write_bytes_dma(struct i2c_client *client, u16 addr, u8 *txbuf, s32 len) +{ + + s32 ret = 0; + s32 write_len = 0; + s32 left = len; + u8 *wr_buf = txbuf; + + //GTP_DEBUG("Write bytes dma: 0x%04X, %d byte(s)", addr, len); + while (left > 0) + { + if (left > GTP_DMA_MAX_I2C_TRANSFER_SIZE) + { + write_len = GTP_DMA_MAX_I2C_TRANSFER_SIZE; + } + else + { + write_len = left; + } + ret = i2c_dma_write(client, addr, wr_buf, write_len); + + if (ret < 0) + { + GTP_ERROR("dma i2c write failed!"); + return -1; + } + + left -= write_len; + addr += write_len; + wr_buf += write_len; + } + return 0; +} +#endif + + +int i2c_read_bytes_non_dma(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ + u8 buffer[GTP_ADDR_LENGTH]; + u8 retry; + u16 left = len; + u16 offset = 0; + + struct i2c_msg msg[2] = + { + { + .addr = ((client->addr &I2C_MASK_FLAG) | (I2C_ENEXT_FLAG)), + //.addr = ((client->addr &I2C_MASK_FLAG) | (I2C_PUSHPULL_FLAG)), + .flags = 0, + .buf = buffer, + .len = GTP_ADDR_LENGTH, + .timing = I2C_MASTER_CLOCK + }, + { + .addr = ((client->addr &I2C_MASK_FLAG) | (I2C_ENEXT_FLAG)), + //.addr = ((client->addr &I2C_MASK_FLAG) | (I2C_PUSHPULL_FLAG)), + .flags = I2C_M_RD, + .timing = I2C_MASTER_CLOCK + }, + }; + + if (rxbuf == NULL) + return -1; + + //GTP_DEBUG("i2c_read_bytes to device %02X address %04X len %d\n", client->addr, addr, len); + + while (left > 0) + { + buffer[0] = ((addr + offset) >> 8) & 0xFF; + buffer[1] = (addr + offset) & 0xFF; + + msg[1].buf = &rxbuf[offset]; + + if (left > MAX_TRANSACTION_LENGTH) + { + msg[1].len = MAX_TRANSACTION_LENGTH; + left -= MAX_TRANSACTION_LENGTH; + offset += MAX_TRANSACTION_LENGTH; + } + else + { + msg[1].len = left; + left = 0; + } + + retry = 0; + + while (i2c_transfer(client->adapter, &msg[0], 2) != 2) + { + retry++; + + //if (retry == 20) + if (retry == 5) + { + GTP_ERROR("I2C read 0x%X length=%d failed\n", addr + offset, len); + return -1; + } + } + } + + return 0; +} + + +int i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ +#if GTP_SUPPORT_I2C_DMA + return i2c_read_bytes_dma(client, addr, rxbuf, len); +#else + return i2c_read_bytes_non_dma(client, addr, rxbuf, len); +#endif +} + +s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + s32 ret = -1; + u16 addr = (buf[0] << 8) + buf[1]; + + ret = i2c_read_bytes_non_dma(client, addr, &buf[2], len - 2); + + if (!ret) + { + return 2; + } + else + { + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) + { + return ret; + } + #endif + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + gtp_recovery_reset(client); + } + else + #endif + { + gtp_reset_guitar(client, 20); + } + return ret; + } +} + + +s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ + u8 buf[16] = {0}; + u8 confirm_buf[16] = {0}; + u8 retry = 0; + + while (retry++ < 3) + { + memset(buf, 0xAA, 16); + buf[0] = (u8)(addr >> 8); + buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, buf, len + 2); + + memset(confirm_buf, 0xAB, 16); + confirm_buf[0] = (u8)(addr >> 8); + confirm_buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, confirm_buf, len + 2); + + if (!memcmp(buf, confirm_buf, len+2)) + { + memcpy(rxbuf, confirm_buf+2, len); + return SUCCESS; + } + } + GTP_ERROR("i2c read 0x%04X, %d bytes, double check failed!", addr, len); + return FAIL; +} + +int i2c_write_bytes_non_dma(struct i2c_client *client, u16 addr, u8 *txbuf, int len) +{ + u8 buffer[MAX_TRANSACTION_LENGTH]; + u16 left = len; + u16 offset = 0; + u8 retry = 0; + + struct i2c_msg msg = + { + .addr = ((client->addr &I2C_MASK_FLAG) | (I2C_ENEXT_FLAG)), + //.addr = ((client->addr &I2C_MASK_FLAG) | (I2C_PUSHPULL_FLAG)), + .flags = 0, + .buf = buffer, + .timing = I2C_MASTER_CLOCK, + }; + + + if (txbuf == NULL) + return -1; + + //GTP_DEBUG("i2c_write_bytes to device %02X address %04X len %d\n", client->addr, addr, len); + + while (left > 0) + { + retry = 0; + + buffer[0] = ((addr + offset) >> 8) & 0xFF; + buffer[1] = (addr + offset) & 0xFF; + + if (left > MAX_I2C_TRANSFER_SIZE) + { + memcpy(&buffer[GTP_ADDR_LENGTH], &txbuf[offset], MAX_I2C_TRANSFER_SIZE); + msg.len = MAX_TRANSACTION_LENGTH; + left -= MAX_I2C_TRANSFER_SIZE; + offset += MAX_I2C_TRANSFER_SIZE; + } + else + { + memcpy(&buffer[GTP_ADDR_LENGTH], &txbuf[offset], left); + msg.len = left + GTP_ADDR_LENGTH; + left = 0; + } + + //GTP_DEBUG("byte left %d offset %d\n", left, offset); + + while (i2c_transfer(client->adapter, &msg, 1) != 1) + { + retry++; + + //if (retry == 20) + if (retry == 5) + { + GTP_ERROR("I2C write 0x%X%X length=%d failed\n", buffer[0], buffer[1], len); + return -1; + } + } + } + + return 0; +} + +int i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *txbuf, int len) +{ +#if GTP_SUPPORT_I2C_DMA + return i2c_write_bytes_dma(client, addr, txbuf, len); +#else + return i2c_write_bytes_non_dma(client, addr, txbuf, len); +#endif +} + +s32 gtp_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + s32 ret = -1; + u16 addr = (buf[0] << 8) + buf[1]; + + ret = i2c_write_bytes_non_dma(client, addr, &buf[2], len - 2); + + if (!ret) + { + return 1; + } + else + { + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) + { + return ret; + } + #endif + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + gtp_recovery_reset(client); + } + else + #endif + { + gtp_reset_guitar(client, 20); + } + return ret; + } +} + + + +/******************************************************* +Function: + Send config Function. + +Input: + client: i2c client. + +Output: + Executive outcomes.0--success,non-0--fail. +*******************************************************/ +s32 gtp_send_cfg(struct i2c_client *client) +{ + s32 ret = 1; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + + if (pnl_init_error) + { + GTP_INFO("Error occurred in init_panel, no config sent!"); + return 0; + } + + GTP_INFO("Driver Send Config"); + for (retry = 0; retry < 5; retry++) + { + ret = gtp_i2c_write(client, config, GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + + if (ret > 0) + { + break; + } + } +#endif + return ret; +} +#if GTP_CHARGER_SWITCH +static int gtp_send_chr_cfg(struct i2c_client *client) +{ + s32 ret = 1; +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + + if (pnl_init_error) { + GTP_INFO("Error occurred in init_panel, no config sent!"); + return 0; + } + + GTP_INFO("Driver Send Config"); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, gtp_charger_config, GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} +#endif +/******************************************************* +Function: + Read goodix touchscreen version function. + +Input: + client: i2c client struct. + version:address to store version info + +Output: + Executive outcomes.0---succeed. +*******************************************************/ +s32 gtp_read_version(struct i2c_client *client, u16 *version) +{ + s32 ret = -1; + s32 i; + u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff}; + + GTP_DEBUG_FUNC(); + + ret = gtp_i2c_read(client, buf, sizeof(buf)); + + if (ret < 0) + { + GTP_ERROR("GTP read version failed"); + return ret; + } + + if (version) + { + *version = (buf[7] << 8) | buf[6]; + } + + tpd_info.vid = *version; + tpd_info.pid = 0x00; + + for (i = 0; i < 4; i++) + { + if (buf[i + 2] < 0x30)break; + + tpd_info.pid |= ((buf[i + 2] - 0x30) << ((3 - i) * 4)); + } + + if (buf[5] == 0x00) + { + GTP_INFO("IC VERSION: %c%c%c_%02x%02x", + buf[2], buf[3], buf[4], buf[7], buf[6]); + } + else + { + GTP_INFO("IC VERSION:%c%c%c%c_%02x%02x", + buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]); + } + return ret; +} + +/******************************************************* +Function: + GTP initialize function. + +Input: + client: i2c client private struct. + +Output: + Executive outcomes.0---succeed. +*******************************************************/ +static s32 gtp_init_panel(struct i2c_client *client) +{ + s32 ret = 0; + +#if GTP_DRIVER_SEND_CFG + s32 i; + u8 check_sum = 0; + u8 opr_buf[16]; + u8 sensor_id = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + u8 *send_cfg_buf[] = {cfg_info_group0, cfg_info_group1, cfg_info_group2, + cfg_info_group3, cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; +#if GTP_CHARGER_SWITCH + const u8 cfg_grp0_charger[] = GTP_CFG_GROUP0_CHARGER; + const u8 cfg_grp1_charger[] = GTP_CFG_GROUP1_CHARGER; + const u8 cfg_grp2_charger[] = GTP_CFG_GROUP2_CHARGER; + const u8 cfg_grp3_charger[] = GTP_CFG_GROUP3_CHARGER; + const u8 cfg_grp4_charger[] = GTP_CFG_GROUP4_CHARGER; + const u8 cfg_grp5_charger[] = GTP_CFG_GROUP5_CHARGER; + const u8 *cfgs_charger[] = { + cfg_grp0_charger, cfg_grp1_charger, cfg_grp2_charger, + cfg_grp3_charger, cfg_grp4_charger, cfg_grp5_charger + }; + u8 cfg_lens_charger[] = { + CFG_GROUP_LEN(cfg_grp0_charger), + CFG_GROUP_LEN(cfg_grp1_charger), + CFG_GROUP_LEN(cfg_grp2_charger), + CFG_GROUP_LEN(cfg_grp3_charger), + CFG_GROUP_LEN(cfg_grp4_charger), + CFG_GROUP_LEN(cfg_grp5_charger)}; +#endif + + GTP_DEBUG("Config Groups\' Lengths: %d, %d, %d, %d, %d, %d", + cfg_info_len[0], cfg_info_len[1], cfg_info_len[2], cfg_info_len[3], + cfg_info_len[4], cfg_info_len[5]); + + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) + { + sensor_id = 0; + } + else + { + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + msleep(50); + } + #endif + ret = gtp_i2c_read_dbl_check(client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) + { + if (sensor_id >= 0x06) + { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + pnl_init_error = 1; + return -1; + } + } + else + { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + pnl_init_error = 1; + return -1; + } + GTP_INFO("Sensor_ID: %d", sensor_id); + } + + cfg_len = cfg_info_len[sensor_id]; + + GTP_INFO("CTP_CONFIG_GROUP%d used, config length: %d", sensor_id, cfg_len); + + if (cfg_len < GTP_CONFIG_MIN_LENGTH) + { + GTP_ERROR("CTP_CONFIG_GROUP%d is INVALID CONFIG GROUP! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id); + pnl_init_error = 1; + return -1; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F != gtp_chip_type) +#endif + { + ret = gtp_i2c_read_dbl_check(client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) + { + GTP_DEBUG("CFG_CONFIG_GROUP%d Config Version: %d, 0x%02X; IC Config Version: %d, 0x%02X", sensor_id, + send_cfg_buf[sensor_id][0], send_cfg_buf[sensor_id][0], opr_buf[0], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = send_cfg_buf[sensor_id][0]; // backup config version + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + send_cfg_buf[sensor_id][0] = 0x00; + } + } + else + { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -1; + } + } + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], cfg_len); + +#if GTP_CUSTOM_CFG + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) //RISING + { + config[TRIGGER_LOC] &= 0xfe; + } + else if (GTP_INT_TRIGGER == 1) //FALLING + { + config[TRIGGER_LOC] |= 0x01; + } +#endif // GTP_CUSTOM_CFG + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < cfg_len; i++) + { + check_sum += config[i]; + } + config[cfg_len] = (~check_sum) + 1; + +#if GTP_CHARGER_SWITCH + GTP_DEBUG("Charger Config Groups Length: %d, %d, %d, %d, %d, %d", cfg_lens_charger[0], + cfg_lens_charger[1], cfg_lens_charger[2], cfg_lens_charger[3], cfg_lens_charger[4], cfg_lens_charger[5]); + + memset(>p_charger_config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + if (cfg_lens_charger[sensor_id] == cfg_len) + memcpy(>p_charger_config[GTP_ADDR_LENGTH], cfgs_charger[sensor_id], cfg_len); + +#if GTP_CUSTOM_CFG + gtp_charger_config[RESOLUTION_LOC] = (u8) GTP_MAX_WIDTH; + gtp_charger_config[RESOLUTION_LOC + 1] = (u8) (GTP_MAX_WIDTH >> 8); + gtp_charger_config[RESOLUTION_LOC + 2] = (u8) GTP_MAX_HEIGHT; + gtp_charger_config[RESOLUTION_LOC + 3] = (u8) (GTP_MAX_HEIGHT >> 8); + + if (GTP_INT_TRIGGER == 0) /* RISING */ + gtp_charger_config[TRIGGER_LOC] &= 0xfe; + else if (GTP_INT_TRIGGER == 1) /* FALLING */ + gtp_charger_config[TRIGGER_LOC] |= 0x01; +#endif /* END GTP_CUSTOM_CFG */ + if (cfg_lens_charger[sensor_id] != cfg_len) + memset(>p_charger_config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < cfg_len; i++) + { + check_sum += gtp_charger_config[i]; + } + gtp_charger_config[cfg_len] = (~check_sum) + 1; + +#endif /* END GTP_CHARGER_SWITCH */ + +#else // DRIVER NOT SEND CONFIG + cfg_len = GTP_CONFIG_MAX_LENGTH; + ret = gtp_i2c_read(client, config, cfg_len + GTP_ADDR_LENGTH); + if (ret < 0) + { + GTP_ERROR("Read Config Failed, Using DEFAULT Resolution & INT Trigger!"); + abs_x_max = GTP_MAX_WIDTH; + abs_y_max = GTP_MAX_HEIGHT; + int_type = GTP_INT_TRIGGER; + } +#endif // GTP_DRIVER_SEND_CFG + + GTP_DEBUG_FUNC(); + if ((abs_x_max == 0) && (abs_y_max == 0)) + { + abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC]; + abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2]; + int_type = (config[TRIGGER_LOC]) & 0x03; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + u8 have_key = 0; + if (is_950) + { + driver_num = config[GTP_REG_MATRIX_DRVNUM - GTP_REG_CONFIG_DATA + 2]; + sensor_num = config[GTP_REG_MATRIX_SENNUM - GTP_REG_CONFIG_DATA + 2]; + } + else + { + driver_num = (config[CFG_LOC_DRVA_NUM]&0x1F) + (config[CFG_LOC_DRVB_NUM]&0x1F); + sensor_num = (config[CFG_LOC_SENS_NUM]&0x0F) + ((config[CFG_LOC_SENS_NUM]>>4)&0x0F); + } + + have_key = config[GTP_REG_HAVE_KEY - GTP_REG_CONFIG_DATA + 2] & 0x01; // have key or not + if (1 == have_key) + { + driver_num--; + } + + GTP_INFO("Driver * Sensor: %d * %d(Key: %d), X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + driver_num, sensor_num, have_key, abs_x_max,abs_y_max,int_type); + } + else +#endif + { +#if GTP_DRIVER_SEND_CFG + ret = gtp_send_cfg(client); + if (ret < 0) + { + GTP_ERROR("Send config error."); + } +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F != gtp_chip_type) +#endif + { + /* for resume to send config */ + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = drv_cfg_version; + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < cfg_len; i++) + { + check_sum += config[i]; + } + config[cfg_len] = (~check_sum) + 1; + } + } +#endif + GTP_INFO("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + abs_x_max,abs_y_max,int_type); + } + + msleep(10); + return 0; +} + +static s8 gtp_i2c_test(struct i2c_client *client) +{ + + u8 retry = 0; + s8 ret = -1; + u32 hw_info = 0; + + GTP_DEBUG_FUNC(); + + while (retry++ < 5) + { + ret = i2c_read_bytes(client, GTP_REG_HW_INFO, (u8 *)&hw_info, sizeof(hw_info)); + + if ((!ret) && (hw_info == 0x00900600)) //20121212 + { + return ret; + } + + GTP_ERROR("GTP_REG_HW_INFO : %08X", hw_info); + GTP_ERROR("GTP i2c test failed time %d.", retry); + msleep(10); + } + + return -1; +} + + + +/******************************************************* +Function: + Set INT pin as input for FW sync. + +Note: + If the INT is high, It means there is pull up resistor attached on the INT pin. + Pull low the INT pin manaully for FW sync. +*******************************************************/ +void gtp_int_sync(s32 ms) +{ + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(ms); + GTP_GPIO_AS_INT(GTP_INT_PORT); +} + +void gtp_reset_guitar(struct i2c_client *client, s32 ms) +{ + GTP_INFO("GTP RESET!\n"); + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + msleep(ms); + GTP_GPIO_OUTPUT(GTP_INT_PORT, client->addr == 0x14); + + msleep(2); + GTP_GPIO_OUTPUT(GTP_RST_PORT, 1); + + msleep(6); //must >= 6ms + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + return; + } +#endif + + gtp_int_sync(50); +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(i2c_client_point); +#endif +} + +static int tpd_power_on(struct i2c_client *client) +{ + int ret = 0; + int reset_count = 0; + +reset_proc: + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(10); + +#ifdef MT6573 + // power on CTP + mt_set_gpio_mode(GPIO_CTP_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_EN_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ONE); + +#else // ( defined(MT6575) || defined(MT6577) || defined(MT6589) ) + + #ifdef TPD_POWER_SOURCE_CUSTOM + hwPowerOn(TPD_POWER_SOURCE_CUSTOM, VOL_2800, "TP"); + #else + hwPowerOn(MT65XX_POWER_LDO_VGP2, VOL_2800, "TP"); + #endif + #ifdef TPD_POWER_SOURCE_1800 + hwPowerOn(TPD_POWER_SOURCE_1800, VOL_1800, "TP"); + #endif + +#endif + + gtp_reset_guitar(client, 20); + +#if GTP_COMPATIBLE_MODE + gtp_get_chip_type(client); + + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + ret = gup_fw_download_proc(NULL, GTP_FL_FW_BURN); + + if(FAIL == ret) + { + GTP_ERROR("[tpd_power_on]Download fw failed."); + if(reset_count++ < TPD_MAX_RESET_COUNT) + { + goto reset_proc; + } + else + { + return -1; + } + } + + ret = gtp_fw_startup(client); + if(FAIL == ret) + { + GTP_ERROR("[tpd_power_on]Startup fw failed."); + if(reset_count++ < TPD_MAX_RESET_COUNT) + { + goto reset_proc; + } + else + { + return -1; + } + } + } + else +#endif + { + ret = gtp_i2c_test(client); + + if (ret < 0) + { + GTP_ERROR("I2C communication ERROR!"); + + if (reset_count < TPD_MAX_RESET_COUNT) + { + reset_count++; + goto reset_proc; + } + } + } + return ret; +} + +//**************** For GT9XXF Start ********************// +#if GTP_COMPATIBLE_MODE + + +void gtp_get_chip_type(struct i2c_client *client) +{ + u8 opr_buf[10] = {0x00}; + s32 ret = 0; + + msleep(10); + + ret = gtp_i2c_read_dbl_check(client, GTP_REG_CHIP_TYPE, opr_buf, 10); + + if (FAIL == ret) + { + GTP_ERROR("Failed to get chip-type, set chip type default: GOODIX_GT9"); + gtp_chip_type = CHIP_TYPE_GT9; + return; + } + + if (!memcmp(opr_buf, "GOODIX_GT9", 10)) + { + gtp_chip_type = CHIP_TYPE_GT9; + } + else // GT9XXF + { + gtp_chip_type = CHIP_TYPE_GT9F; + } + GTP_INFO("Chip Type: %s", (gtp_chip_type == CHIP_TYPE_GT9) ? "GOODIX_GT9" : "GOODIX_GT9F"); +} + +static u8 gtp_bak_ref_proc(struct i2c_client *client, u8 mode) +{ + s32 i = 0; + s32 j = 0; + s32 ret = 0; + struct file *flp = NULL; + u8 *refp = NULL; + u32 ref_len = 0; + u32 ref_seg_len = 0; + s32 ref_grps = 0; + s32 ref_chksum = 0; + u16 tmp = 0; + + GTP_DEBUG("[gtp_bak_ref_proc]Driver:%d,Sensor:%d.", driver_num, sensor_num); + + //check file-system mounted + GTP_DEBUG("[gtp_bak_ref_proc]Waiting for FS %d", gtp_ref_retries); + if (gup_check_fs_mounted("/data") == FAIL) + { + GTP_DEBUG("[gtp_bak_ref_proc]/data not mounted"); + if(gtp_ref_retries++ < GTP_CHK_FS_MNT_MAX) + { + return FAIL; + } + } + else + { + GTP_DEBUG("[gtp_bak_ref_proc]/data mounted !!!!"); + } + + if (is_950) + { + ref_seg_len = (driver_num * (sensor_num - 1) + 2) * 2; + ref_grps = 6; + ref_len = ref_seg_len * 6; // for GT950, backup-reference for six segments + } + else + { + ref_len = driver_num*(sensor_num-2)*2 + 4; + ref_seg_len = ref_len; + ref_grps = 1; + } + + refp = (u8 *)kzalloc(ref_len, GFP_KERNEL); + if(refp == NULL) + { + GTP_ERROR("Failed to allocate memory for reference buffer!"); + return FAIL; + } + memset(refp, 0, ref_len); + + //get ref file data + flp = filp_open(GTP_BAK_REF_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(flp)) + { + GTP_ERROR("Failed to open/create %s.", GTP_BAK_REF_PATH); + if (GTP_BAK_REF_SEND == mode) + { + goto default_bak_ref; + } + else + { + goto exit_ref_proc; + } + } + + switch (mode) + { + case GTP_BAK_REF_SEND: + { + flp->f_op->llseek(flp, 0, SEEK_SET); + ret = flp->f_op->read(flp, (char *)refp, ref_len, &flp->f_pos); + if(ret < 0) + { + GTP_ERROR("Read ref file failed, send default bak ref."); + goto default_bak_ref; + } + //checksum ref file + for (j = 0; j < ref_grps; ++j) + { + ref_chksum = 0; + for(i=0; if_op->llseek(flp, 0, SEEK_SET); + flp->f_op->write(flp, (char *)refp, ref_len, &flp->f_pos); + } + break; + + default: + GTP_ERROR("Invalid Argument(%d) for backup reference", mode); + ret = FAIL; + goto exit_ref_proc; + } + + ret = SUCCESS; + goto exit_ref_proc; + +default_bak_ref: + for (j = 0; j < ref_grps; ++j) + { + memset(&refp[j * ref_seg_len], 0, ref_seg_len); + refp[j * ref_seg_len + ref_seg_len - 1] = 0x01; // checksum = 1 + } + ret = i2c_write_bytes(client, GTP_REG_BAK_REF, refp, ref_len); + if (flp && !IS_ERR(flp)) + { + GTP_INFO("Write backup-reference data into %s", GTP_BAK_REF_PATH); + flp->f_op->llseek(flp, 0, SEEK_SET); + flp->f_op->write(flp, (char*)refp, ref_len, &flp->f_pos); + } + if (ret < 0) + { + GTP_ERROR("Failed to load the default backup reference"); + ret = FAIL; + } + else + { + ret = SUCCESS; + } +exit_ref_proc: + if (refp) + { + kfree(refp); + } + if (flp && !IS_ERR(flp)) + { + filp_close(flp, NULL); + } + return ret; +} + +u8 gtp_fw_startup(struct i2c_client *client) +{ + u8 wr_buf[4]; + s32 ret = 0; + + //init sw WDT + wr_buf[0] = 0xAA; + ret = i2c_write_bytes(client, 0x8041, wr_buf, 1); + if (ret < 0) + { + GTP_ERROR("I2C error to firmware startup."); + return FAIL; + } + //release SS51 & DSP + wr_buf[0] = 0x00; + i2c_write_bytes(client, 0x4180, wr_buf, 1); + + //int sync + gtp_int_sync(25); + + //check fw run status + i2c_read_bytes(client, 0x8041, wr_buf, 1); + if(0xAA == wr_buf[0]) + { + GTP_ERROR("IC works abnormally,startup failed."); + return FAIL; + } + else + { + GTP_DEBUG("IC works normally,Startup success."); + wr_buf[0] = 0xAA; + i2c_write_bytes(client, 0x8041, wr_buf, 1); + return SUCCESS; + } +} + + +static void gtp_recovery_reset(struct i2c_client *client) +{ +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_OFF); +#endif + force_reset_guitar(); +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif +} + +static u8 gtp_check_clk_legality(u8 *p_clk_buf) +{ + u8 i = 0; + u8 clk_chksum = p_clk_buf[5]; + + for(i = 0; i < 5; i++) + { + if((p_clk_buf[i] < 50) || (p_clk_buf[i] > 120) || + (p_clk_buf[i] != p_clk_buf[0])) + { + break; + } + clk_chksum += p_clk_buf[i]; + } + + if((i == 5) && (clk_chksum == 0)) + { + GTP_DEBUG("Valid main clock data."); + return SUCCESS; + } + GTP_ERROR("Invalid main clock data."); + return FAIL; +} + +static u8 gtp_main_clk_proc(struct i2c_client *client) +{ + s32 ret = 0; + u8 i = 0; + u8 clk_cal_result = 0; + u8 clk_chksum = 0; + u8 gtp_clk_buf[6] = {0}; + struct file *flp = NULL; + + GTP_DEBUG("[gtp_main_clk_proc]Waiting for FS %d", gtp_ref_retries); + if (gup_check_fs_mounted("/data") == FAIL) + { + GTP_DEBUG("[gtp_main_clk_proc]/data not mounted"); + if(gtp_clk_retries++ < GTP_CHK_FS_MNT_MAX) + { + return FAIL; + } + else + { + GTP_ERROR("[gtp_main_clk_proc]Wait for file system timeout,need cal clk"); + } + } + else + { + GTP_DEBUG("[gtp_main_clk_proc]/data mounted !!!!"); + flp = filp_open(GTP_MAIN_CLK_PATH, O_RDWR | O_CREAT, 0666); + if (!IS_ERR(flp)) + { + flp->f_op->llseek(flp, 0, SEEK_SET); + ret = flp->f_op->read(flp, (char *)gtp_clk_buf, 6, &flp->f_pos); + if(ret > 0) + { + ret = gtp_check_clk_legality(gtp_clk_buf); + if(SUCCESS == ret) + { + GTP_DEBUG("[gtp_main_clk_proc]Open & read & check clk file success."); + goto send_main_clk; + } + } + } + GTP_ERROR("[gtp_main_clk_proc]Check clk file failed,need cal clk"); + } + + //cal clk +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_OFF); +#endif + clk_cal_result = gup_clk_calibration(); + force_reset_guitar(); + GTP_DEBUG("&&&&&&&&&&clk cal result:%d", clk_cal_result); + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif + + if(clk_cal_result < 50 || clk_cal_result > 120) + { + GTP_ERROR("Invalid main clock: %d", clk_cal_result); + ret = FAIL; + goto exit_clk_proc; + } + + for(i = 0;i < 5; i++) + { + gtp_clk_buf[i] = clk_cal_result; + clk_chksum += gtp_clk_buf[i]; + } + gtp_clk_buf[5] = 0 - clk_chksum; + +send_main_clk: + + ret = i2c_write_bytes(client, 0x8020, gtp_clk_buf, 6); + + if (flp && !IS_ERR(flp)) + { + flp->f_op->llseek(flp, 0, SEEK_SET); + flp->f_op->write(flp, (char *)gtp_clk_buf, 6, &flp->f_pos); + } + + if(-1 == ret) + { + GTP_ERROR("[gtp_main_clk_proc]send main clk i2c error!"); + ret = FAIL; + } + else + { + ret = SUCCESS; + } + +exit_clk_proc: + if (flp && !IS_ERR(flp)) + { + filp_close(flp, NULL); + } + return ret; +} + +#endif +//************* For GT9XXF End **********************// + +#if GTP_WITH_PEN +static void gtp_pen_init(void) +{ + s32 ret = 0; + + pen_dev = input_allocate_device(); + if (pen_dev == NULL) + { + GTP_ERROR("Failed to allocate input device for pen/stylus."); + return; + } + + pen_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + pen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + set_bit(BTN_TOOL_PEN, pen_dev->keybit); + set_bit(INPUT_PROP_DIRECT, pen_dev->propbit); + //set_bit(INPUT_PROP_POINTER, pen_dev->propbit); + +#if GTP_PEN_HAVE_BUTTON + input_set_capability(pen_dev, EV_KEY, BTN_STYLUS); + input_set_capability(pen_dev, EV_KEY, BTN_STYLUS2); +#endif + + input_set_abs_params(pen_dev, ABS_MT_POSITION_X, 0, TPD_RES_X, 0, 0); + input_set_abs_params(pen_dev, ABS_MT_POSITION_Y, 0, TPD_RES_Y, 0, 0); + input_set_abs_params(pen_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + input_set_abs_params(pen_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(pen_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + pen_dev->name = "mtk-pen"; + pen_dev->phys = "input/ts"; + pen_dev->id.bustype = BUS_I2C; + + ret = input_register_device(pen_dev); + if (ret) + { + GTP_ERROR("Register %s input device failed", pen_dev->name); + return; + } +} + +static void gtp_pen_down(s32 x, s32 y, s32 size, s32 id) +{ + input_report_key(pen_dev, BTN_TOOL_PEN, 1); + input_report_key(pen_dev, BTN_TOUCH, 1); + input_report_abs(pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(pen_dev, ABS_MT_POSITION_Y, y); + if ((!size) && (!id)) + { + input_report_abs(pen_dev, ABS_MT_PRESSURE, 100); + input_report_abs(pen_dev, ABS_MT_TOUCH_MAJOR, 100); + } + else + { + input_report_abs(pen_dev, ABS_MT_PRESSURE, size); + input_report_abs(pen_dev, ABS_MT_TOUCH_MAJOR, size); + input_report_abs(pen_dev, ABS_MT_TRACKING_ID, id); + } + input_mt_sync(pen_dev); +} + +static void gtp_pen_up(void) +{ + input_report_key(pen_dev, BTN_TOOL_PEN, 0); + input_report_key(pen_dev, BTN_TOUCH, 0); +} +#endif + +static s32 tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + s32 err = 0; + s32 ret = 0; + + u16 version_info; +#if GTP_HAVE_TOUCH_KEY + s32 idx = 0; +#endif +#ifdef TPD_PROXIMITY + struct hwmsen_object obj_ps; +#endif + + i2c_client_point = client; + ret = tpd_power_on(client); + + if (ret < 0) + { + GTP_ERROR("I2C communication ERROR!"); + return 0; + } + +#ifdef VELOCITY_CUSTOM + + if ((err = misc_register(&tpd_misc_device))) + { + printk("mtk_tpd: tpd_misc_device register failed\n"); + } + +#endif + ret = gtp_read_version(client, &version_info); + + if (ret < 0) + { + GTP_ERROR("Read version failed."); + return 0; + } + + ret = gtp_init_panel(client); + + if (ret < 0) + { + GTP_ERROR("GTP init panel failed."); + return 0; + } + + // Create proc file system + gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0666, NULL, &config_proc_ops); + if (gt91xx_config_proc == NULL) + { + GTP_ERROR("create_proc_entry %s failed\n", GT91XX_CONFIG_PROC_FILE); + } + else + { + GTP_INFO("create proc entry %s success", GT91XX_CONFIG_PROC_FILE); + } + +#if GTP_CREATE_WR_NODE + init_wr_node(client); +#endif + + thread = kthread_run(touch_event_handler, 0, TPD_DEVICE); + + if (IS_ERR(thread)) + { + err = PTR_ERR(thread); + GTP_INFO(TPD_DEVICE " failed to create kernel thread: %d\n", err); + } + + +#if GTP_HAVE_TOUCH_KEY + + for (idx = 0; idx < GTP_MAX_KEY_NUM; idx++) + { + input_set_capability(tpd->dev, EV_KEY, touch_key_array[idx]); + } + +#endif +#if GTP_GESTURE_WAKEUP + input_set_capability(tpd->dev, EV_KEY, KEY_POWER); +#endif + +#if GTP_ICS_SLOT_REPORT + input_mt_init_slots(tpd->dev, GTP_MAX_TOUCH, INPUT_MT_DIRECT); +#endif + +#if GTP_WITH_PEN + gtp_pen_init(); +#endif + // set INT mode + mt_set_gpio_mode(GPIO_CTP_EINT_PIN, GPIO_CTP_EINT_PIN_M_EINT); + mt_set_gpio_dir(GPIO_CTP_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN, GPIO_PULL_DISABLE); + + msleep(50); + +//#ifdef MT6572 +#if 1 + if (!int_type) //EINTF_TRIGGER + { + mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, EINTF_TRIGGER_RISING, tpd_eint_interrupt_handler, 1); + } + else + { + mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, EINTF_TRIGGER_FALLING, tpd_eint_interrupt_handler, 1); + } + +#else + mt65xx_eint_set_sens(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_SENSITIVE); + mt65xx_eint_set_hw_debounce(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN); + + if (!int_type) + { + mt65xx_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN, CUST_EINT_POLARITY_HIGH, tpd_eint_interrupt_handler, 1); + } + else + { + mt65xx_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN, CUST_EINT_POLARITY_LOW, tpd_eint_interrupt_handler, 1); + } +#endif + + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif + +#if GTP_AUTO_UPDATE + ret = gup_init_update_proc(client); + + if (ret < 0) + { + GTP_ERROR("Create update thread error."); + } +#endif + +#ifdef TPD_PROXIMITY + //obj_ps.self = cm3623_obj; + obj_ps.polling = 0; //0--interrupt mode;1--polling mode; + obj_ps.sensor_operate = tpd_ps_operate; + + if ((err = hwmsen_attach(ID_PROXIMITY, &obj_ps))) + { + GTP_ERROR("hwmsen attach fail, return:%d.", err); + } + +#endif +/*********add by phoenix.wu*************/ + tptype_sysfs_init(); +/***************************************/ + tpd_load_status = 1; + + return 0; +} + +static void tpd_eint_interrupt_handler(void) +{ + TPD_DEBUG_PRINT_INT; + + tpd_flag = 1; + + wake_up_interruptible(&waiter); +} +static int tpd_i2c_remove(struct i2c_client *client) +{ +#if GTP_CREATE_WR_NODE + uninit_wr_node(); +#endif + +#if GTP_ESD_PROTECT + destroy_workqueue(gtp_esd_check_workqueue); +#endif +/***********add by phoenix.wu********/ + if(NULL != tptype_ctrl_kobj) + { + tptype_sysfs_exit(); + } +/************************************/ + return 0; +} +#if (GTP_ESD_PROTECT || GTP_COMPATIBLE_MODE) +static void force_reset_guitar(void) +{ + s32 i = 0; + s32 ret = 0; + + GTP_INFO("force_reset_guitar"); + + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); +#ifdef MT6573 + //Power off TP + mt_set_gpio_mode(GPIO_CTP_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_EN_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ZERO); + msleep(30); + //Power on TP + mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ONE); + msleep(30); +#else // ( defined(MT6575) || defined(MT6577) || defined(MT6589) ) + // Power off TP + #ifdef TPD_POWER_SOURCE_CUSTOM + hwPowerDown(TPD_POWER_SOURCE_CUSTOM, "TP"); + #else + hwPowerDown(MT65XX_POWER_LDO_VGP2, "TP"); + #endif + msleep(30); + + // Power on TP + #ifdef TPD_POWER_SOURCE_CUSTOM + hwPowerOn(TPD_POWER_SOURCE_CUSTOM, VOL_2800, "TP"); + #else + hwPowerOn(MT65XX_POWER_LDO_VGP2, VOL_2800, "TP"); + #endif + msleep(30); + +#endif + + for (i = 0; i < 5; i++) + { + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + ret = gup_fw_download_proc(NULL, GTP_FL_ESD_RECOVERY); + if(FAIL == ret) + { + GTP_ERROR("[force_reset_guitar]Check & repair fw failed."); + continue; + } + //startup fw + ret = gtp_fw_startup(i2c_client_point); + if(FAIL == ret) + { + GTP_ERROR("[force_reset_guitar]Startup fw failed."); + continue; + } + break; + } + else + #endif + { + //Reset Guitar + gtp_reset_guitar(i2c_client_point, 20); + msleep(50); + //Send config + ret = gtp_send_cfg(i2c_client_point); + + if (ret < 0) + { + continue; + } + } + break; + } + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + + if (i >= 5) + { + GTP_ERROR("Failed to reset guitar."); + return; + } + GTP_INFO("Esd recovery successful"); + return; +} +#endif + +#if GTP_ESD_PROTECT +static s32 gtp_init_ext_watchdog(struct i2c_client *client) +{ + u8 opr_buffer[2] = {0xAA}; + GTP_DEBUG("Init external watchdog."); + return i2c_write_bytes(client, 0x8041, opr_buffer, 1); +} + +void gtp_esd_switch(struct i2c_client *client, s32 on) +{ + spin_lock(&esd_lock); + if (SWITCH_ON == on) // switch on esd + { + if (!esd_running) + { + esd_running = 1; + spin_unlock(&esd_lock); + GTP_INFO("Esd started"); + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, clk_tick_cnt); + } + else + { + spin_unlock(&esd_lock); + } + } + else // switch off esd + { + if (esd_running) + { + esd_running = 0; + spin_unlock(&esd_lock); + GTP_INFO("Esd cancelled"); + cancel_delayed_work_sync(>p_esd_check_work); + } + else + { + spin_unlock(&esd_lock); + } + } +} + + +static void gtp_esd_check_func(struct work_struct *work) +{ + s32 i = 0; + s32 ret = -1; + u8 esd_buf[3] = {0x00}; + if ((tpd_halt) || (gtp_loading_fw)) + { + GTP_INFO("Esd suspended or IC update firmware!"); + return; + } + for (i = 0; i < 3; i++) + { + ret = i2c_read_bytes_non_dma(i2c_client_point, 0x8040, esd_buf, 2); + + GTP_DEBUG("[Esd]0x8040 = 0x%02X, 0x8041 = 0x%02X", esd_buf[0], esd_buf[1]); + if (ret < 0) + { + // IIC communication problem + continue; + } + else + { + if ((esd_buf[0] == 0xAA) || (esd_buf[1] != 0xAA)) + { + u8 chk_buf[2] = {0x00}; + i2c_read_bytes_non_dma(i2c_client_point, 0x8040, chk_buf, 2); + + GTP_DEBUG("[Check]0x8040 = 0x%02X, 0x8041 = 0x%02X", chk_buf[0], chk_buf[1]); + + if ( (chk_buf[0] == 0xAA) || (chk_buf[1] != 0xAA) ) + { + i = 3; // jump to reset guitar + break; + } + else + { + continue; + } + } + else + { + // IC works normally, Write 0x8040 0xAA, feed the watchdog + esd_buf[0] = 0xAA; + i2c_write_bytes_non_dma(i2c_client_point, 0x8040, esd_buf, 1); + + break; + } + } + } + + if (i >= 3) + { + #if GTP_COMPATIBLE_MODE + if ((CHIP_TYPE_GT9F == gtp_chip_type) && (1 == rqst_processing)) + { + GTP_INFO("Request Processing, no reset guitar."); + } + else + #endif + { + GTP_INFO("IC works abnormally! Process reset guitar."); + esd_buf[0] = 0x01; + esd_buf[1] = 0x01; + esd_buf[2] = 0x01; + i2c_write_bytes(i2c_client_point, 0x4226, esd_buf, 3); + msleep(50); + force_reset_guitar(); + } + } + + if (!tpd_halt) + { + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, clk_tick_cnt); + } + else + { + GTP_INFO("Esd suspended!"); + } + + return; +} +#endif + +static void tpd_down(s32 x, s32 y, s32 size, s32 id) +{ +#if GTP_ICS_SLOT_REPORT + input_mt_slot(tpd->dev, id); + input_mt_report_slot_state(tpd->dev, MT_TOOL_FINGER, 1); +#endif + if ((!size) && (!id)) + { + input_report_abs(tpd->dev, ABS_MT_PRESSURE, 100); + input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 100); + } + else + { + input_report_abs(tpd->dev, ABS_MT_PRESSURE, size); + input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, size); + /* track id Start 0 */ + } + //input_report_key(tpd->dev, BTN_TOUCH, 1); + set_bit(id, >9xx_finger_status); + input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); + input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y); +#ifndef GTP_ICS_SLOT_REPORT + input_report_key(tpd->dev, BTN_TOUCH, 1); + input_mt_sync(tpd->dev); +#endif + TPD_EM_PRINT(x, y, x, y, id, 1); + +#if (defined(MT6575)||defined(MT6577)) + + if (FACTORY_BOOT == get_boot_mode() || RECOVERY_BOOT == get_boot_mode()) + { + tpd_button(x, y, 1); + } + +#endif +} + +static void tpd_up(s32 x, s32 y, s32 id) +{ +#if GTP_ICS_SLOT_REPORT + input_mt_slot(tpd->dev, id); + input_mt_report_slot_state(tpd->dev, MT_TOOL_FINGER, 0); +#endif + clear_bit(id, >9xx_finger_status); +#ifndef GTP_ICS_SLOT_REPORT + input_report_key(tpd->dev, BTN_TOUCH, 0); + input_mt_sync(tpd->dev); +#endif + TPD_EM_PRINT(x, y, x, y, id, 0); + +#if (defined(MT6575) || defined(MT6577)) + + if (FACTORY_BOOT == get_boot_mode() || RECOVERY_BOOT == get_boot_mode()) + { + tpd_button(x, y, 0); + } + +#endif +} +#if GTP_ICS_SLOT_REPORT +static void gt9xx_clear_all_touch(void) +{ + int i = 0; + gt9xx_finger_status = gt9xx_finger_status_pre; + while(gt9xx_finger_status != 0) { + tpd_up(0, 0, i); + i++; + if(i > GTP_MAX_TOUCH) break; + } + input_sync(tpd->dev); + gt9xx_finger_status_pre = 0; +} +#endif +#if GTP_CHARGER_SWITCH +static void gtp_charger_switch(s32 dir_update) +{ + u32 chr_status = 0; + u8 chr_cmd[3] = {0x80, 0x40}; + static u8 chr_pluggedin = 0; + int ret = 0; + +#ifdef MT6573 + chr_status = *(volatile u32 *)CHR_CON0; + chr_status &= (1 << 13); +#else // ( defined(MT6575) || defined(MT6577) || defined(MT6589) ) + chr_status = upmu_is_chr_det(); +#endif + + if (chr_status) // charger plugged in + { + if (!chr_pluggedin || dir_update) + { + chr_cmd[2] = 6; + ret = gtp_i2c_write(i2c_client_point, chr_cmd, 3); + if (ret > 0) + { + GTP_INFO("Update status for Charger Plugin"); + if (gtp_send_chr_cfg(i2c_client_point) < 0) { + GTP_ERROR("Send charger config failed."); + } else { + GTP_DEBUG("Send charger config."); + } + } + chr_pluggedin = 1; + } + } + else // charger plugged out + { + if (chr_pluggedin || dir_update) + { + chr_cmd[2] = 7; + ret = gtp_i2c_write(i2c_client_point, chr_cmd, 3); + if (ret > 0) + { + GTP_INFO("Update status for Charger Plugout"); + if (gtp_send_cfg(i2c_client_point) < 0) { + GTP_ERROR("Send normal config failed."); + } else { + GTP_DEBUG("Send normal config."); + } + } + chr_pluggedin = 0; + } + } +} +#endif + +static int touch_event_handler(void *unused) +{ + struct sched_param param = { .sched_priority = RTPM_PRIO_TPD }; + u8 end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0}; + u8 point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF}; + u8 touch_num = 0; + u8 finger = 0; + static u8 pre_touch = 0; + static u8 pre_key = 0; +#if GTP_LARGE_TOUCH + static u8 large_touch = 0; +#endif +#if GTP_WITH_PEN + u8 pen_active = 0; + static u8 pre_pen = 0; +#endif + u8 key_value = 0; + u8 *coor_data = NULL; + s32 input_x = 0; + s32 input_y = 0; + s32 input_w = 0; + s32 id = 0; + s32 i = 0; + s32 ret = -1; + + u16 cur_fingers = 0; + static u16 pre_fingers = 0; +#if GTP_COMPATIBLE_MODE + u8 rqst_data[3] = {(u8)(GTP_REG_RQST >> 8), (u8)(GTP_REG_RQST & 0xFF), 0}; +#endif + +#ifdef TPD_PROXIMITY + s32 err = 0; + hwm_sensor_data sensor_data; + u8 proximity_status; +#endif + +#if GTP_GESTURE_WAKEUP + u8 doze_buf[3] = {0x81, 0x4B}; +#endif + + sched_setscheduler(current, SCHED_RR, ¶m); + do + { + set_current_state(TASK_INTERRUPTIBLE); + + while (tpd_halt) + { + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) + { + break; + } + #endif + tpd_flag = 0; + msleep(20); + } + + wait_event_interruptible(waiter, tpd_flag != 0); + tpd_flag = 0; + TPD_DEBUG_SET_TIME; + set_current_state(TASK_RUNNING); + + #if GTP_CHARGER_SWITCH + gtp_charger_switch(0); + #endif + + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) + { + ret = gtp_i2c_read(i2c_client_point, doze_buf, 3); + GTP_DEBUG("0x814B = 0x%02X", doze_buf[2]); + if (ret > 0) + { + if ((doze_buf[2] == 'a') || (doze_buf[2] == 'b') || (doze_buf[2] == 'c') || + (doze_buf[2] == 'd') || (doze_buf[2] == 'e') || (doze_buf[2] == 'g') || + (doze_buf[2] == 'h') || (doze_buf[2] == 'm') || (doze_buf[2] == 'o') || + (doze_buf[2] == 'q') || (doze_buf[2] == 's') || (doze_buf[2] == 'v') || + (doze_buf[2] == 'w') || (doze_buf[2] == 'y') || (doze_buf[2] == 'z') || + (doze_buf[2] == 0x5E) /* ^ */ + ) + { + if (doze_buf[2] != 0x5E) + { + GTP_INFO("Wakeup by gesture(%c), light up the screen!", doze_buf[2]); + } + else + { + GTP_INFO("Wakeup by gesture(^), light up the screen!"); + } + doze_status = DOZE_WAKEUP; + input_report_key(tpd->dev, KEY_POWER, 1); + input_sync(tpd->dev); + input_report_key(tpd->dev, KEY_POWER, 0); + input_sync(tpd->dev); + // clear 0x814B + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_client_point, doze_buf, 3); + } + else if ( (doze_buf[2] == 0xAA) || (doze_buf[2] == 0xBB) || + (doze_buf[2] == 0xAB) || (doze_buf[2] == 0xBA) ) + { + char *direction[4] = {"Right", "Down", "Up", "Left"}; + u8 type = ((doze_buf[2] & 0x0F) - 0x0A) + (((doze_buf[2] >> 4) & 0x0F) - 0x0A) * 2; + + GTP_INFO("%s slide to light up the screen!", direction[type]); + doze_status = DOZE_WAKEUP; + input_report_key(tpd->dev, KEY_POWER, 1); + input_sync(tpd->dev); + input_report_key(tpd->dev, KEY_POWER, 0); + input_sync(tpd->dev); + // clear 0x814B + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_client_point, doze_buf, 3); + } + else if (0xCC == doze_buf[2]) + { + GTP_INFO("Double click to light up the screen!"); + doze_status = DOZE_WAKEUP; + input_report_key(tpd->dev, KEY_POWER, 1); + input_sync(tpd->dev); + input_report_key(tpd->dev, KEY_POWER, 0); + input_sync(tpd->dev); + // clear 0x814B + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_client_point, doze_buf, 3); + } + else + { + // clear 0x814B + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_client_point, doze_buf, 3); + gtp_enter_doze(i2c_client_point); + } + } + continue; + } + #endif + ret = gtp_i2c_read(i2c_client_point, point_data, 12); + if (ret < 0) + { + GTP_ERROR("I2C transfer error. errno:%d\n ", ret); + continue; + } + finger = point_data[GTP_ADDR_LENGTH]; + + #if GTP_COMPATIBLE_MODE + if ((finger == 0x00) && (CHIP_TYPE_GT9F == gtp_chip_type)) + { + ret = gtp_i2c_read(i2c_client_point, rqst_data, 3); + + if(ret < 0) + { + GTP_ERROR("I2C transfer error. errno:%d\n ", ret); + continue; + } + switch (rqst_data[2]) + { + case GTP_RQST_BAK_REF: + GTP_INFO("Request Ref."); + rqst_processing = 1; + ret = gtp_bak_ref_proc(i2c_client_point, GTP_BAK_REF_SEND); + if(SUCCESS == ret) + { + GTP_INFO("Send ref success."); + rqst_data[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(i2c_client_point, rqst_data, 3); + rqst_processing = 0; + } + goto exit_work_func; + + case GTP_RQST_CONFIG: + GTP_INFO("Request Config."); + ret = gtp_send_cfg(i2c_client_point); + if (ret < 0) + { + GTP_ERROR("Send config error."); + } + else + { + GTP_INFO("Send config success."); + rqst_data[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(i2c_client_point, rqst_data, 3); + } + goto exit_work_func; + + case GTP_RQST_MAIN_CLOCK: + GTP_INFO("Request main clock."); + rqst_processing = 1; + ret = gtp_main_clk_proc(i2c_client_point); + if(SUCCESS == ret) + { + GTP_INFO("Send main clk success."); + + rqst_data[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(i2c_client_point, rqst_data, 3); + rqst_processing = 0; + } + goto exit_work_func; + + case GTP_RQST_RESET: + GTP_INFO("Request Reset."); + gtp_recovery_reset(i2c_client_point); + goto exit_work_func; + + default: + GTP_INFO("Undefined request code: 0x%02X", rqst_data[2]); + rqst_data[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(i2c_client_point, rqst_data, 3); + break; + } + } + #endif + + if (finger == 0x00) + { + continue; + } + + if ((finger & 0x80) == 0) + { + goto exit_work_func; + } + + #ifdef TPD_PROXIMITY + if (tpd_proximity_flag == 1) + { + proximity_status = point_data[GTP_ADDR_LENGTH]; + GTP_DEBUG("REG INDEX[0x814E]:0x%02X\n", proximity_status); + + if (proximity_status & 0x60) //proximity or large touch detect,enable hwm_sensor. + { + tpd_proximity_detect = 0; + //sensor_data.values[0] = 0; + } + else + { + tpd_proximity_detect = 1; + //sensor_data.values[0] = 1; + } + + //get raw data + GTP_DEBUG(" ps change\n"); + GTP_DEBUG("PROXIMITY STATUS:0x%02X\n", tpd_proximity_detect); + //map and store data to hwm_sensor_data + sensor_data.values[0] = tpd_get_ps_value(); + sensor_data.value_divide = 1; + sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM; + //report to the up-layer + ret = hwmsen_get_interrupt_data(ID_PROXIMITY, &sensor_data); + + if (ret) + { + GTP_ERROR("Call hwmsen_get_interrupt_data fail = %d\n", err); + } + } + + #endif + + touch_num = finger & 0x0f; + + if (touch_num > GTP_MAX_TOUCH) + { + goto exit_work_func; + } + +#if GTP_LARGE_TOUCH + if (finger & 0x40) + { + GTP_INFO("large touch!"); + large_touch = 1; + if (pre_touch) { + #if GTP_ICS_SLOT_REPORT + gt9xx_clear_all_touch(); + #else + tpd_up(0, 0, 0); + if (tpd != NULL && tpd->dev != NULL) { + input_sync(tpd->dev); + } + #endif + } + goto exit_work_func; + } else if (large_touch) { + if (touch_num) { + goto exit_work_func; + } else { + large_touch = 0; + } + } +#endif + + if (touch_num > 1) + { + u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff}; + + ret = gtp_i2c_read(i2c_client_point, buf, 2 + 8 * (touch_num - 1)); + memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1)); + } + + #if (GTP_HAVE_TOUCH_KEY || GTP_PEN_HAVE_BUTTON) + key_value = point_data[3 + 8 * touch_num]; + + if (key_value || pre_key) + { + #if GTP_PEN_HAVE_BUTTON + if (key_value == 0x40) + { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Down."); + input_report_key(pen_dev, BTN_STYLUS, 1); + input_report_key(pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } + else if (key_value == 0x10) + { + GTP_DEBUG("BTN_STYLUS Down, BTN_STYLUS2 Up."); + input_report_key(pen_dev, BTN_STYLUS, 1); + input_report_key(pen_dev, BTN_STYLUS2, 0); + pen_active = 1; + } + else if (key_value == 0x20) + { + GTP_DEBUG("BTN_STYLUS Up, BTN_STYLUS2 Down."); + input_report_key(pen_dev, BTN_STYLUS, 0); + input_report_key(pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } + else + { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Up."); + input_report_key(pen_dev, BTN_STYLUS, 0); + input_report_key(pen_dev, BTN_STYLUS2, 0); + if ( (pre_key == 0x40) || (pre_key == 0x20) || + (pre_key == 0x10) + ) + { + pen_active = 1; + } + } + if (pen_active) + { + touch_num = 0; // shield pen point + //pre_touch = 0; // clear last pen status + } + #endif + #if GTP_HAVE_TOUCH_KEY + if (!pre_touch) + { + for (i = 0; i < GTP_MAX_KEY_NUM; i++) + { + input_report_key(tpd->dev, touch_key_array[i], key_value & (0x01 << i)); + } + touch_num = 0; // shiled fingers + } + #endif + } + #endif + pre_key = key_value; + + GTP_DEBUG("pre_touch:%02x, finger:%02x.", pre_touch, finger); + + if (touch_num) { + input_report_key(tpd->dev, BTN_TOUCH, 1); + for (i = 0; i < touch_num; i++) + { + coor_data = &point_data[i * 8 + 3]; + if (coor_data[0] == 32) + goto exit_work_func; + + id = coor_data[0] & 0x0F; + input_x = coor_data[1] | coor_data[2] << 8; + input_y = coor_data[3] | coor_data[4] << 8; + input_w = coor_data[5] | coor_data[6] << 8; + + input_x = TPD_WARP_X(abs_x_max, input_x); + input_y = TPD_WARP_Y(abs_y_max, input_y); + cur_fingers |= 1 << id; + #if GTP_WITH_PEN + id = coor_data[0]; + if ((id & 0x80)) // pen/stylus is activated + { + GTP_DEBUG("Pen touch DOWN!"); + pre_pen = 1; + //id &= 0x7F; + id = 0; + GTP_DEBUG("(%d)(%d, %d)[%d]", id, input_x, input_y, input_w); + gtp_pen_down(input_x, input_y, input_w, id); + pen_active = 1; + } + else + #endif + GTP_DEBUG(" (%d)(%d, %d)[%d]", id, input_x, input_y, input_w); + tpd_down(input_x, input_y, input_w, id); + } + if(gt9xx_finger_status != gt9xx_finger_status_pre) { // up non-contact finger + for(i = 0; i < GTP_MAX_TOUCH; i++) + if(!test_bit(i, >9xx_finger_status) && + test_bit(i, >9xx_finger_status_pre)) + tpd_up(0, 0, i); + } + } + else + { + cur_fingers = 0; + if (pre_touch) { + #if GTP_WITH_PEN + if (pre_pen) + { + GTP_DEBUG("Pen touch UP!"); + gtp_pen_up(); + pre_pen = 0; + pen_active = 1; + } + #endif + { + GTP_DEBUG("Touch Release!"); +#if GTP_ICS_SLOT_REPORT + gt9xx_clear_all_touch(); +#else + tpd_up(0, 0, 0); +#endif + GTP_DEBUG("Touch Release: %d, finger_status: %lx\n", + pre_touch, gt9xx_finger_status_pre); + input_report_key(tpd->dev, BTN_TOUCH, 0); + } + } + } + pre_touch = touch_num; + gt9xx_finger_status_pre = gt9xx_finger_status; + gt9xx_finger_status = 0; + + pre_fingers = cur_fingers; + if (tpd != NULL && tpd->dev != NULL) + #if GTP_WITH_PEN + if (pen_active) + { + pen_active = 0; + input_sync(pen_dev); + } + else + #endif + { + input_sync(tpd->dev); + } + +exit_work_func: + + if (!gtp_rawdiff_mode) + { + ret = gtp_i2c_write(i2c_client_point, end_cmd, 3); + + if (ret < 0) + { + GTP_INFO("I2C write end_cmd error!"); + } + } + + } while (!kthread_should_stop()); + + return 0; +} + +static int tpd_local_init(void) +{ +#if GTP_ESD_PROTECT + clk_tick_cnt = 2 * HZ; // HZ: clock ticks in 1 second generated by system + GTP_DEBUG("Clock ticks for an esd cycle: %d", clk_tick_cnt); + INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); + gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); + spin_lock_init(&esd_lock); // 2.6.39 & later + // esd_lock = SPIN_LOCK_UNLOCKED; // 2.6.39 & before +#endif + +#if GTP_SUPPORT_I2C_DMA + gpDMABuf_va = (u8 *)dma_alloc_coherent(NULL, GTP_DMA_MAX_TRANSACTION_LENGTH, &gpDMABuf_pa, GFP_KERNEL); + if(!gpDMABuf_va){ + GTP_INFO("[Error] Allocate DMA I2C Buffer failed!\n"); + } + memset(gpDMABuf_va, 0, GTP_DMA_MAX_TRANSACTION_LENGTH); +#endif + if (i2c_add_driver(&tpd_i2c_driver) != 0) + { + GTP_INFO("unable to add i2c driver.\n"); + return -1; + } + + if (tpd_load_status == 0) //if(tpd_load_status == 0) // disable auto load touch driver for linux3.0 porting + { + GTP_INFO("add error touch panel driver.\n"); + i2c_del_driver(&tpd_i2c_driver); + return -1; + } + +#ifdef TPD_HAVE_BUTTON + tpd_button_setting(TPD_KEY_COUNT, tpd_keys_local, tpd_keys_dim_local);// initialize tpd button data +#endif + +#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) + TPD_DO_WARP = 1; + memcpy(tpd_wb_start, tpd_wb_start_local, TPD_WARP_CNT * 4); + memcpy(tpd_wb_end, tpd_wb_start_local, TPD_WARP_CNT * 4); +#endif + +#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) + memcpy(tpd_calmat, tpd_def_calmat_local, 8 * 4); + memcpy(tpd_def_calmat, tpd_def_calmat_local, 8 * 4); +#endif + + // set vendor string + tpd->dev->id.vendor = 0x00; + tpd->dev->id.product = tpd_info.pid; + tpd->dev->id.version = tpd_info.vid; + + GTP_INFO("end %s, %d\n", __FUNCTION__, __LINE__); + tpd_type_cap = 1; + + return 0; +} + +#if GTP_GESTURE_WAKEUP +static s8 gtp_enter_doze(struct i2c_client *client) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 8}; + + GTP_DEBUG_FUNC(); + + GTP_DEBUG("Entering gesture mode..."); + while(retry++ < 5) + { + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x46; + ret = gtp_i2c_write(client, i2c_control_buf, 3); + if (ret < 0) + { + GTP_DEBUG("Failed to set gesture flag into 0x8046, %d", retry); + continue; + } + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x40; + ret = gtp_i2c_write(client, i2c_control_buf, 3); + if (ret > 0) + { + doze_status = DOZE_ENABLED; + GTP_INFO("Gesture mode enabled."); + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send gesture cmd failed."); + return ret; +} + +#else +/******************************************************* +Function: + Eter sleep function. + +Input: + client:i2c_client. + +Output: + Executive outcomes.0--success,non-0--fail. +*******************************************************/ +static s8 gtp_enter_sleep(struct i2c_client *client) +{ +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + u8 i2c_status_buf[3] = {0x80, 0x44, 0x00}; + s32 ret = 0; + + ret = gtp_i2c_read(client, i2c_status_buf, 3); + if(ret <= 0) + { + GTP_ERROR("[gtp_enter_sleep]Read ref status reg error."); + } + + if (i2c_status_buf[2] & 0x80) + { + //Store bak ref + ret = gtp_bak_ref_proc(client, GTP_BAK_REF_STORE); + if(FAIL == ret) + { + GTP_ERROR("[gtp_enter_sleep]Store bak ref failed."); + } + } + } +#endif +#if GTP_POWER_CTRL_SLEEP + + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(10); + +#ifdef MT6573 + mt_set_gpio_mode(GPIO_CTP_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_EN_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ZERO); + msleep(30); +#else // ( defined(MT6575) || defined(MT6577) || defined(MT6589) ) + + #ifdef TPD_POWER_SOURCE_1800 + hwPowerDown(TPD_POWER_SOURCE_1800, "TP"); + #endif + + #ifdef TPD_POWER_SOURCE_CUSTOM + hwPowerDown(TPD_POWER_SOURCE_CUSTOM, "TP"); + #else + hwPowerDown(MT65XX_POWER_LDO_VGP2, "TP"); + #endif +#endif + + GTP_INFO("GTP enter sleep by poweroff!"); + return 0; + +#else + { + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5}; + + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(5); + + while (retry++ < 5) + { + ret = gtp_i2c_write(client, i2c_control_buf, 3); + + if (ret > 0) + { + GTP_INFO("GTP enter sleep!"); + + return ret; + } + + msleep(10); + } + + GTP_ERROR("GTP send sleep cmd failed."); + return ret; + } +#endif +} +#endif + +/******************************************************* +Function: + Wakeup from sleep mode Function. + +Input: + client:i2c_client. + +Output: + Executive outcomes.0--success,non-0--fail. +*******************************************************/ +static s8 gtp_wakeup_sleep(struct i2c_client *client) +{ + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG("GTP wakeup begin."); + +#if (GTP_POWER_CTRL_SLEEP) + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + force_reset_guitar(); + GTP_INFO("Esd recovery wakeup."); + return 0; + } +#endif + + while (retry++ < 5) + { + ret = tpd_power_on(client); + + if (ret < 0) + { + GTP_ERROR("I2C Power on ERROR!"); + continue; + } + GTP_INFO("Ic wakeup by poweron"); + return 0; + } +#else + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + u8 opr_buf[2] = {0}; + + while (retry++ < 10) + { + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + msleep(5); + + ret = gtp_i2c_test(client); + + if (ret >= 0) + { + // Hold ss51 & dsp + opr_buf[0] = 0x0C; + ret = i2c_write_bytes(client, 0x4180, opr_buf, 1); + if (ret < 0) + { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + // Confirm hold + opr_buf[0] = 0x00; + ret = i2c_read_bytes(client, 0x4180, opr_buf, 1); + if (ret < 0) + { + GTP_DEBUG("confirm ss51 & dsp hold, I2C error,retry:%d", retry); + continue; + } + if (0x0C != opr_buf[0]) + { + GTP_DEBUG("ss51 & dsp not hold, val: %d, retry: %d", opr_buf[0], retry); + continue; + } + GTP_DEBUG("ss51 & dsp has been hold"); + + ret = gtp_fw_startup(client); + if (FAIL == ret) + { + GTP_ERROR("[gtp_wakeup_sleep]Startup fw failed."); + continue; + } + GTP_INFO("flashless wakeup sleep success"); + return ret; + } + force_reset_guitar(); + retry = 0; + break; + } + if (retry >= 10) + { + GTP_ERROR("wakeup retry timeout, process esd reset"); + force_reset_guitar(); + } + GTP_ERROR("GTP wakeup sleep failed."); + return ret; + } +#endif + while (retry++ < 10) + { + #if GTP_GESTURE_WAKEUP + if (DOZE_WAKEUP != doze_status) + { + GTP_INFO("Powerkey wakeup."); + } + else + { + GTP_INFO("Gesture wakeup."); + } + doze_status = DOZE_DISABLED; + + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + gtp_reset_guitar(client, 20); + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + #else + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + msleep(5); + #endif + + ret = gtp_i2c_test(client); + + if (ret >= 0) + { + GTP_INFO("GTP wakeup sleep."); + #if (!GTP_GESTURE_WAKEUP) + { + gtp_int_sync(25); + #if GTP_ESD_PROTECT + gtp_init_ext_watchdog(client); + #endif + } + #endif + + return ret; + } + gtp_reset_guitar(client, 20); + } +#endif + GTP_ERROR("GTP wakeup sleep failed."); + return ret; +} + +/* Function to manage low power suspend */ +static void tpd_suspend(struct early_suspend *h) +{ + s32 ret = -1; + + GTP_INFO("System suspend."); + +#ifdef TPD_PROXIMITY + + if (tpd_proximity_flag == 1) + { + return ; + } + +#endif + + tpd_halt = 1; +#if GTP_ICS_SLOT_REPORT + gt9xx_clear_all_touch(); +#else + tpd_up(0, 0, 0); + input_sync(tpd->dev); +#endif +#if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_OFF); +#endif + +#if GTP_GESTURE_WAKEUP + ret = gtp_enter_doze(i2c_client_point); +#else + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + ret = gtp_enter_sleep(i2c_client_point); +#endif + if (ret < 0) + { + GTP_ERROR("GTP early suspend failed."); + } + // to avoid waking up while not sleeping, delay 48 + 10ms to ensure reliability + msleep(58); +} + +/* Function to manage power-on resume */ +static void tpd_resume(struct early_suspend *h) +{ + s32 ret = -1; + + GTP_INFO("System resume."); + +#ifdef TPD_PROXIMITY + + if (tpd_proximity_flag == 1) + { + return ; + } + +#endif + ret = gtp_wakeup_sleep(i2c_client_point); + + if (ret < 0) + { + GTP_ERROR("GTP later resume failed."); + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + // do nothing + } + else +#endif + { + gtp_send_cfg(i2c_client_point); + } + +#if GTP_CHARGER_SWITCH + gtp_charger_switch(1); // force update +#endif + + tpd_halt = 0; +#if GTP_GESTURE_WAKEUP + doze_status = DOZE_DISABLED; +#else + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +#endif + +#if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_ON); +#endif + +} + +/************add by phoenix.wu****************/ +static char *vendor_name = NULL; +//static struct kobject *tptype_ctrl_kobj= NULL; + +#define tptype_ctrl_attr(_name) \ +static struct kobj_attribute _name##_attr = { \ + .attr = { \ + .name = __stringify(_name), \ + .mode = 0644, \ + }, \ + .show = _name##_show, \ + .store = _name##_store, \ +} + +static ssize_t vendor_name_show(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + char *s = buf; + char gt_sensor_id= 0; + char temp_data[GTP_CONFIG_MAX_LENGTH + 2] = {0}; + + i2c_read_bytes(i2c_client_point, GTP_REG_SENSOR_ID, temp_data, 1); + gt_sensor_id=temp_data[0]; + + if(gt_sensor_id == 0) + { vendor_name="goodix_oflim"; + printk("Goodix 967 Oflim read vendor name ok \n"); + s += sprintf(s, "goodix_967_oflim \n"); + } + else if(gt_sensor_id == 1) + { + vendor_name="goodix_biel"; + printk("Goodix 967 Biel read vendor name ok \n"); + s += sprintf(s, "goodix_967_biel \n"); + } + else if(gt_sensor_id == 5) + { + vendor_name="goodix_cec"; + printk("Goodix 967 CEC read vendor name ok \n"); + s += sprintf(s, "goodix_967_cec \n"); + } + else + { + printk("TP read vendor name fail\n"); + s += sprintf(s, "default \n"); + } + return (s - buf); +} +static ssize_t vendor_name_store(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t n) +{ + return n; +} + +tptype_ctrl_attr(vendor_name); + +static struct attribute *g_attr[] = +{ + &vendor_name_attr.attr, + NULL, +}; + +static struct attribute_group tptype_attr_group = +{ + .attrs = g_attr, +}; + +static int tptype_sysfs_init(void) +{ + tptype_ctrl_kobj = kobject_create_and_add("tp_info", NULL); + if (!tptype_ctrl_kobj) + return -ENOMEM; + + return sysfs_create_group(tptype_ctrl_kobj, &tptype_attr_group); +} + +static void tptype_sysfs_exit(void) +{ + sysfs_remove_group(tptype_ctrl_kobj, &tptype_attr_group); + kobject_put(tptype_ctrl_kobj); +} +/*****************************************/ + +static struct tpd_driver_t tpd_device_driver = +{ + .tpd_device_name = "gt9xx", + .tpd_local_init = tpd_local_init, + .suspend = tpd_suspend, + .resume = tpd_resume, +#ifdef TPD_HAVE_BUTTON + .tpd_have_button = 1, +#else + .tpd_have_button = 0, +#endif +}; + +/* called when loaded into kernel */ +static int __init tpd_driver_init(void) +{ + GTP_INFO("MediaTek gt91xx touch panel driver init\n"); +#ifdef MT6572 + i2c_register_board_info(I2C_BUS_NUMBER, &i2c_tpd, 1); +#else + i2c_register_board_info(2, &i2c_tpd, 1); +#endif + if (tpd_driver_add(&tpd_device_driver) < 0) + GTP_INFO("add generic driver failed\n"); + + return 0; +} + +/* should never be called */ +static void __exit tpd_driver_exit(void) +{ + GTP_INFO("MediaTek gt91xx touch panel driver exit\n"); + tpd_driver_remove(&tpd_device_driver); +} + +module_init(tpd_driver_init); +module_exit(tpd_driver_exit); + diff --git a/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_firmware.h b/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_firmware.h new file mode 100755 index 00000000000..10013a21c22 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_firmware.h @@ -0,0 +1,4529 @@ +#ifndef _GT9XX_FIRMWARE_H_ +#define _GT9XX_FIRMWARE_H_ + +#if GTP_HEADER_FW_UPDATE +unsigned char gtp_default_FW[] = +{ +0x00,0x01,0x60,0x00,0x39,0x36,0x37,0x00,0x00,0x00,0x00,0x00,0x10,0x67,0x80,0x00,0x55,0x40,0x34,0xEA, +0xF1,0x46,0x6B,0xFE,0xF7,0xEB,0xC0,0x20,0x63,0xFC,0x4C,0xB4,0x25,0x41,0x3C,0x5E,0xD8,0x65,0xC7,0x30, +0xA0,0x0E,0x90,0x31,0xF4,0xE3,0x01,0x85,0x86,0x02,0x35,0xEF,0x71,0x44,0x21,0x7F,0xF3,0x42,0x29,0xE2, +0x12,0x62,0x09,0x05,0x85,0xC0,0xA0,0x5B,0x58,0x47,0x18,0xEE,0x32,0xE8,0x61,0x95,0x8B,0xD3,0x78,0xBF, +0x71,0x04,0xA0,0x13,0xDD,0x29,0x30,0x62,0xA2,0x49,0x33,0x24,0x12,0x7F,0xBD,0x3F,0x7F,0xFA,0xE9,0x22, +0xA8,0x8E,0xF0,0x41,0xC3,0xE5,0xF6,0xEF,0xF2,0x63,0x1E,0x54,0x84,0xC6,0x98,0xB8,0x35,0x3D,0x09,0x65, +0x47,0x34,0x73,0x91,0x9E,0x60,0xF0,0xED,0x74,0xFA,0xB1,0x45,0x73,0xD8,0x63,0xF3,0x52,0x16,0xF7,0xEF, +0xD5,0x04,0x66,0x2C,0x2E,0x48,0x2B,0xEE,0xB4,0x34,0x4A,0x73,0x23,0x63,0x52,0x89,0x57,0x93,0x9A,0xBC, +0x2F,0x49,0xA4,0x1B,0x8C,0xD7,0x44,0x33,0x49,0xE2,0x95,0x49,0x5F,0x8A,0xCA,0x07,0x2B,0x6F,0xAD,0x0B, +0x09,0x76,0x23,0xD8,0xF9,0x41,0xA1,0xD1,0x14,0x28,0x49,0x98,0x0E,0x9B,0xB6,0xC3,0x74,0x2F,0x3F,0xC6, +0xCD,0x4B,0xD4,0xBF,0x59,0xB3,0x1B,0x4D,0xDF,0x60,0x71,0xAE,0x98,0x30,0x2A,0xEA,0x83,0xDA,0xA5,0xAB, +0xD8,0xC0,0x37,0xA7,0x89,0x11,0xAA,0x16,0x5D,0x20,0x3A,0x32,0x7B,0xB1,0xF4,0xF2,0xFA,0xBB,0x87,0x17, +0x84,0x10,0x05,0x2F,0xE6,0x91,0x6B,0x96,0x66,0x43,0x36,0x0F,0x04,0x68,0x9E,0x27,0x28,0x6A,0x18,0xA7, +0x14,0x29,0x23,0x5E,0x36,0x40,0xD3,0x6D,0xE8,0xAB,0x04,0x80,0x78,0xF8,0x5B,0x29,0x36,0x8A,0xC0,0xF2, +0x23,0xA0,0x94,0x26,0xE1,0xDF,0xDE,0xB0,0x26,0xE9,0xDA,0xD2,0x4E,0x71,0x14,0xA0,0x82,0x9B,0x5C,0xA0, +0xFD,0x7B,0x4F,0x28,0x82,0x11,0xE7,0xF7,0x4F,0x70,0x1F,0x81,0x71,0x36,0xED,0x82,0x0D,0x7D,0x02,0x1D, +0x24,0xE6,0x4D,0x24,0x34,0x71,0x3D,0xB0,0xA4,0x9C,0x1D,0x73,0xA3,0x88,0x24,0x8A,0x64,0x19,0xBF,0x46, +0xA3,0xF6,0x94,0xCC,0x21,0x52,0xD6,0x0C,0xB6,0xBF,0x65,0xFC,0x82,0x95,0x1F,0x56,0xA2,0x86,0xE8,0x8F, +0xC0,0x17,0xE4,0x0B,0xDF,0x78,0xA6,0x01,0xEB,0x10,0x05,0x60,0x90,0x3E,0x7B,0x6F,0x17,0x59,0x53,0x67, +0x63,0xB4,0x35,0x39,0x2B,0x5A,0xF5,0x3B,0x1F,0x3A,0x89,0x47,0x6E,0x15,0xBD,0xBF,0x89,0x8B,0xC6,0x45, +0x3F,0x03,0xDF,0x55,0x3E,0x33,0xF9,0xDA,0xE8,0x28,0xBD,0x50,0xB8,0x3A,0x71,0x1A,0xB5,0x0F,0x4E,0x54, +0x39,0x30,0x5E,0x98,0x68,0x5D,0xFD,0xC2,0xDA,0x1C,0xF8,0xFB,0x4F,0x04,0x87,0x09,0xD5,0x79,0x13,0xAD, +0xA8,0x4A,0x06,0x7D,0x7A,0xD6,0xD0,0xF1,0xDE,0xB3,0x88,0x7D,0xA5,0xC4,0x7F,0x7C,0xFC,0xD6,0x20,0x5F, +0x76,0xFD,0x54,0xCD,0xD5,0x91,0x3B,0xFD,0x9B,0xC3,0x82,0x9F,0x69,0xFE,0xAE,0xCB,0x87,0x73,0x9A,0xE2, +0x2A,0xBE,0xCE,0x25,0x73,0x7F,0x8A,0x02,0x17,0xA2,0x21,0xDB,0xDA,0x7B,0x93,0x37,0x0B,0x5C,0x7E,0x68, +0x4D,0xA5,0x0E,0xE3,0x0F,0x1C,0xB7,0xBA,0x79,0x73,0x2F,0x93,0x40,0x12,0x4D,0x86,0x39,0x23,0x3F,0xB3, +0xAD,0x52,0xF6,0x6D,0x26,0x70,0xB0,0x02,0x04,0xC0,0x53,0x40,0x36,0x1B,0x5B,0x26,0x4C,0xE1,0x88,0xD9, +0x5A,0x82,0x28,0x12,0x05,0xC1,0xA5,0xFA,0x97,0xAB,0x02,0xB5,0xE9,0xC9,0x80,0x32,0x7C,0x5C,0xB7,0xE1, +0x84,0x82,0xA8,0xFA,0x9C,0xE0,0x0B,0xA4,0x68,0xDD,0x75,0xF7,0x8A,0xE1,0x29,0x9A,0x85,0x83,0x4F,0x75, +0xF4,0xF6,0xBD,0xC5,0x45,0xE3,0x11,0xAF,0x57,0xFF,0xDF,0xA0,0x35,0x3F,0xC9,0xFA,0xB7,0x12,0x29,0x9B, +0xE3,0xCF,0x2A,0x73,0x21,0xC0,0xBC,0xE4,0x88,0xC7,0x8B,0x96,0x41,0xA3,0x5C,0x8B,0xC6,0x61,0x34,0xF2, +0x0E,0x0C,0xD9,0xA3,0xEF,0xC4,0x81,0x0D,0xEC,0xAB,0xF1,0x02,0x3F,0x5D,0x2E,0x25,0xD0,0x85,0xBD,0x24, +0x86,0x1D,0xC0,0xC6,0x36,0x56,0xE5,0x2B,0x0F,0x4E,0x39,0x63,0x5B,0xED,0x22,0x0A,0x0C,0xC8,0xBA,0x12, +0x1A,0x50,0xCA,0x22,0x93,0x47,0xCC,0x4C,0xAB,0x8D,0x2A,0x1A,0x0D,0xC9,0xE2,0x8D,0xFC,0xA6,0x8E,0xD0, +0x0E,0x29,0x78,0x79,0xA0,0x4F,0x23,0x87,0x8C,0x8A,0xAA,0xC9,0xBE,0xAC,0x13,0x02,0x2D,0xAC,0x8B,0xD0, +0x89,0xE3,0xE5,0xC6,0x8D,0x8B,0xCB,0xDF,0x5F,0xA4,0x29,0x23,0x5C,0xA7,0x2C,0xC0,0x28,0x6D,0x02,0x1D, +0x8D,0x81,0x1D,0xCC,0x8F,0x2E,0x7D,0x87,0x9F,0x97,0xB0,0x86,0xCE,0x21,0xAE,0xA5,0x82,0x8B,0x3E,0x3A, +0xC9,0xA5,0xDC,0xFE,0x16,0x24,0x05,0xB9,0x59,0x8E,0xA7,0xB5,0x22,0x83,0xDB,0xF3,0x11,0xEC,0x51,0x96, +0x2E,0x15,0xAD,0x8D,0x9E,0x6B,0x42,0xCE,0x2E,0x79,0x62,0x34,0x99,0xCC,0xA4,0x21,0xB8,0x4B,0x67,0xEC, +0x7C,0xE7,0x1E,0x60,0x88,0x6E,0x5F,0x02,0x67,0xB1,0xEF,0xA3,0xEA,0xD9,0xB4,0xD8,0xB6,0xF0,0x89,0x18, +0x5A,0x87,0x65,0xEA,0x11,0xAA,0xEB,0x12,0x8C,0xE1,0x04,0x56,0x1B,0xF7,0x5E,0x5D,0x13,0x94,0x9F,0x78, +0x43,0xF0,0x46,0x84,0x1B,0x58,0xBD,0x1F,0xC7,0x49,0xF6,0x8B,0x44,0x9C,0x8A,0xE1,0x38,0xD1,0x77,0x2E, +0x12,0x5E,0x93,0x2D,0x54,0xAC,0x3C,0xC6,0x8A,0x99,0x26,0xA4,0xC5,0xD1,0x22,0x00,0xEB,0x96,0x40,0x99, +0xD5,0xB6,0xD4,0x50,0xEA,0x7B,0x8B,0x2D,0x82,0x23,0xFD,0x76,0x49,0xF4,0x27,0xE1,0x73,0x4D,0x3D,0xEE, +0x95,0x6D,0xDD,0x3C,0x3B,0xCB,0xA1,0x87,0x30,0xDE,0x21,0x22,0x89,0x73,0x15,0x23,0xD8,0xD8,0x96,0x10, +0x4E,0x41,0x75,0x7A,0xD4,0xE3,0x63,0x57,0xCB,0x97,0x92,0x55,0xDF,0x46,0xD8,0xB2,0xDD,0x17,0xD2,0x8D, +0x4D,0xF8,0x02,0xCC,0xC3,0x7E,0xF1,0x65,0x5A,0xB9,0x48,0xF8,0x1C,0x79,0x28,0xD8,0x4C,0xCC,0xF6,0x96, +0xFF,0xE5,0xDE,0x09,0x2C,0x92,0x30,0x7C,0x9E,0xA1,0xB4,0xF4,0xAF,0xD6,0x8E,0xC1,0x3E,0x9A,0x15,0x79, +0x01,0x65,0xF1,0xA2,0xB5,0x10,0x37,0x11,0x0C,0xBD,0x6A,0xDD,0x0A,0x9E,0x3F,0x33,0x4D,0xBC,0xDD,0x50, +0x3F,0xDE,0xCC,0x0A,0x2C,0x9E,0xA6,0xC6,0x2E,0x90,0x56,0x88,0x21,0x17,0x15,0xF9,0x9E,0x42,0x27,0xEC, +0x08,0x3D,0x69,0x18,0x6D,0xB0,0x9F,0x49,0x2E,0x46,0x87,0x85,0xF8,0xB3,0xA3,0xCA,0xED,0x5E,0xAE,0x51, +0x5B,0x58,0xE9,0xFB,0x0E,0xBD,0x03,0x5B,0x91,0xD6,0x45,0x13,0x94,0x90,0x9D,0xFF,0x58,0xE4,0x77,0x66, +0x10,0x03,0x81,0xE2,0x90,0x41,0xE8,0xC8,0xD8,0x8D,0xCA,0x26,0xE3,0xB9,0x88,0xD6,0x35,0x4F,0x70,0x16, +0x3D,0xAC,0xB4,0xD6,0x72,0x2D,0x32,0x52,0x29,0x2E,0xBF,0x81,0xA2,0x73,0xD8,0xC6,0xF3,0x62,0x09,0x31, +0x21,0x59,0xF0,0x65,0xC4,0x79,0x9C,0xF9,0x7B,0x88,0xD0,0x5F,0x36,0x33,0xA1,0xF6,0x03,0x53,0xD8,0x53, +0xA3,0x67,0x08,0xA8,0x49,0x49,0x7B,0x56,0x32,0x6A,0xFE,0x86,0x66,0x3F,0x6E,0xED,0x76,0x13,0xF2,0xAF, +0x8E,0xA8,0x96,0xB6,0x03,0xD8,0x6F,0x00,0xB3,0x2C,0xA0,0x7D,0xFE,0x57,0x19,0x0C,0xB1,0x12,0x82,0xBB, +0x6A,0x29,0x85,0x90,0xBC,0x65,0x2A,0x70,0x7F,0xC9,0x84,0xCE,0x85,0x64,0x5E,0xAA,0x6A,0x44,0x86,0x2B, +0xB4,0xC3,0x49,0x7E,0x57,0x33,0x06,0xEE,0x18,0x83,0x7A,0xE4,0x93,0x65,0x1A,0x3D,0xA9,0x07,0xD0,0x6B, +0xB9,0xCE,0xC6,0xF0,0x50,0x44,0x66,0x8E,0x11,0x21,0x8A,0x18,0x71,0x59,0xD2,0xBC,0xD4,0x72,0x10,0xEF, +0xA8,0xBB,0x95,0x30,0x3F,0x67,0x4A,0x3F,0xAF,0x6A,0x00,0xA9,0xF6,0x51,0x74,0x9D,0xA7,0x75,0xCF,0x6F, +0x3E,0x28,0x0B,0x05,0x81,0x48,0x31,0x5B,0x13,0xBA,0x9A,0x08,0x0E,0x08,0xBD,0x0C,0x56,0x3A,0x92,0xA9, +0x47,0x57,0x76,0x1E,0xD4,0xC3,0x9E,0x08,0x84,0x4F,0x32,0x78,0x96,0x3B,0x64,0xC8,0x95,0xC6,0x4A,0xD3, +0x53,0x6F,0x10,0xA1,0x43,0x4C,0x8B,0x59,0x51,0x21,0x74,0x1F,0x35,0x22,0xAB,0x9D,0xD2,0x08,0x9F,0xA4, +0x8A,0x3F,0xB4,0x40,0x50,0x20,0x7B,0x93,0xA2,0x2C,0xE5,0x7B,0xE3,0xC0,0x5D,0xD2,0x85,0x99,0x44,0x21, +0x17,0x3A,0x72,0x14,0x8B,0x93,0x0F,0x2E,0x73,0xF0,0x8C,0x76,0x33,0x5C,0x48,0x11,0x72,0xC2,0x4A,0xF7, +0x88,0x92,0xCC,0x80,0x39,0x70,0x01,0xE1,0xB4,0x99,0x9E,0x6D,0x7C,0xFF,0x2F,0x32,0x8A,0xFD,0xCC,0xA2, +0x97,0xB4,0x1B,0xAC,0x06,0x17,0x61,0x11,0x9F,0x8A,0x7B,0x7C,0x08,0x09,0x88,0xB1,0x78,0x37,0x90,0x90, +0x11,0xA0,0xEB,0x83,0xD3,0x82,0x2C,0xBF,0xB2,0x5B,0xAC,0xEC,0xD7,0x35,0x2B,0x54,0x0D,0x2E,0xEC,0xD1, +0x35,0xF5,0x24,0xC2,0x17,0x8A,0x78,0x9F,0xFD,0xDA,0xFF,0x3A,0x2F,0x9B,0xBA,0xB7,0x60,0xA9,0x67,0xC9, +0x37,0xE2,0xEB,0xE2,0xC6,0xD9,0x05,0xC4,0xA5,0x74,0xE2,0x75,0x78,0xD7,0xCD,0x4B,0xE3,0x27,0xA5,0xD2, +0x4A,0x11,0xC3,0xFA,0x1B,0x94,0xCE,0x84,0x3E,0x5B,0x0C,0xAA,0xDB,0xF5,0x3A,0x44,0xF4,0xB5,0xCA,0x70, +0xA4,0x54,0x9D,0x49,0xB4,0x22,0x56,0xAC,0xA1,0x03,0xB9,0xCA,0x86,0xC6,0xFF,0x01,0x0F,0x1E,0x86,0xCD, +0xB4,0x3B,0x41,0xD9,0x68,0x4C,0xF1,0x90,0x1F,0x61,0xF0,0x5E,0x63,0x18,0x2B,0xEB,0x73,0xCA,0x49,0xAA, +0xF6,0x98,0xC4,0xBD,0x76,0x39,0x68,0x20,0xA6,0xD7,0x6A,0xBE,0xE4,0xC3,0xA5,0xE8,0x52,0xA1,0x46,0x06, +0xC4,0x5C,0x16,0xC9,0x18,0xD9,0xE0,0x3E,0x88,0x58,0x69,0x1A,0x4F,0xD0,0xA0,0xFA,0x92,0x19,0xC6,0x21, +0x26,0xD3,0xFD,0x53,0x4D,0x7F,0x70,0x0B,0x2A,0xA1,0x93,0x9E,0x7E,0x4F,0x95,0xDD,0x8F,0x04,0xF7,0xF5, +0x18,0x93,0x74,0x13,0x80,0x50,0x0E,0x0E,0x77,0x62,0x79,0xCA,0xA1,0x1F,0x32,0x1E,0x12,0xA8,0xA2,0x26, +0xEC,0x11,0x48,0xAE,0xF1,0x66,0x2B,0xFA,0xC4,0xCC,0x0A,0xE2,0x55,0xEF,0x1D,0x44,0x66,0x3B,0x62,0xAA, +0x66,0x85,0xE1,0xA6,0x74,0x8A,0xA1,0xC7,0xD8,0xB9,0xF1,0x9F,0x72,0xD9,0xB1,0xC1,0xE7,0x86,0xC5,0x81, +0x8D,0x89,0xEB,0x33,0xB5,0x62,0x60,0xDB,0x60,0x6C,0x03,0xD7,0xCF,0xCF,0xA0,0xE7,0xCF,0x9F,0x59,0x62, +0x93,0x0A,0x11,0x46,0xF8,0xE4,0x50,0x15,0xDA,0xB7,0x7B,0x95,0xFA,0x23,0x18,0x85,0xF6,0xC9,0xDC,0x10, +0x63,0xCF,0x80,0x51,0xF6,0xA4,0xC5,0xB7,0x40,0x82,0xDA,0xE7,0x7B,0x96,0xF3,0x68,0x42,0x92,0x8F,0x60, +0x77,0x49,0xFA,0xA3,0x07,0x98,0x8E,0xAC,0x76,0x31,0xF9,0x04,0xE3,0xB0,0xB1,0x7E,0x6E,0x46,0x32,0xFA, +0x04,0x8C,0x22,0x2D,0x8D,0xAB,0x64,0x22,0xE9,0x67,0x7B,0xAA,0x72,0xA0,0xC7,0xDD,0xF4,0xCB,0xF3,0x14, +0xF8,0x56,0x20,0x38,0x8F,0xCD,0x7E,0xC5,0xD0,0x14,0x61,0x71,0x8A,0xE9,0xB6,0x0B,0x34,0xB6,0xE1,0x6C, +0x25,0x69,0xEA,0x38,0x39,0x86,0xFF,0x20,0x8C,0xB9,0x07,0x6C,0x82,0x5D,0x73,0x36,0x40,0x46,0xDC,0xCF, +0x5D,0xF4,0xF9,0xC0,0x0F,0xBC,0x99,0x30,0x3C,0x41,0x89,0x6E,0xE3,0x8D,0x52,0x84,0x9A,0xE3,0xCE,0xAE, +0x59,0x89,0x46,0xC1,0xE0,0x20,0x40,0xFD,0x6B,0x30,0x01,0x72,0xE6,0x4C,0xA3,0xEE,0x47,0x95,0xA5,0xE9, +0x55,0x23,0x56,0x6D,0x5A,0xAA,0xF2,0x19,0xFA,0x99,0x2A,0xB3,0x46,0xCD,0x08,0xA1,0x99,0x6F,0x5C,0x99, +0x2F,0xDA,0x5B,0x95,0x7A,0x40,0x2C,0x96,0xD9,0x36,0x5E,0x66,0x30,0xFE,0x98,0x4A,0xFD,0x9D,0x60,0xDB, +0x77,0x50,0x16,0x7A,0xA8,0xDE,0x6C,0x33,0x30,0xAA,0xFC,0x17,0x23,0xDB,0xB9,0x5E,0xF9,0x3C,0x75,0x65, +0x24,0x12,0x32,0x27,0xC8,0xBB,0x53,0x17,0x0D,0x71,0x75,0x02,0xE4,0xF8,0x74,0xD4,0x00,0xFD,0x83,0xF1, +0x46,0xA3,0xFB,0xC0,0x8F,0x9C,0xA5,0xA7,0x78,0x55,0x43,0xB4,0xAB,0xD6,0x9C,0x2C,0xDF,0xF0,0x75,0x9D, +0x1A,0x2B,0x8C,0x95,0xD5,0x91,0xAC,0x77,0x37,0x9F,0xAA,0xD1,0x96,0xA6,0xA8,0x08,0x92,0x63,0xC1,0xC7, +0xF3,0xE9,0xB1,0xBA,0xA5,0x54,0xA3,0xC1,0x95,0xF6,0xCE,0x46,0x11,0x4B,0x8D,0xC3,0xF5,0xC6,0x29,0x3B, +0x6A,0xDA,0x95,0xF3,0x09,0x97,0x46,0x79,0xE6,0x77,0x07,0xFF,0x13,0xF8,0x44,0x86,0x2D,0x18,0x1E,0x75, +0xB1,0x45,0x37,0xD9,0x0A,0x97,0x21,0x58,0x4F,0x9C,0x7E,0xA3,0x7B,0x82,0x55,0xA5,0x49,0x22,0x36,0xBA, +0x6E,0xC9,0x29,0x1E,0x01,0x90,0xCF,0xB2,0x4D,0xD5,0xC0,0x70,0x49,0x2C,0x67,0x9F,0xB4,0x98,0x0D,0x4F, +0xF8,0xB4,0x83,0xFD,0xC5,0x6A,0xAF,0x58,0x40,0x0D,0x05,0x53,0x7C,0x94,0xE6,0xB4,0x18,0xF0,0x70,0xF7, +0x89,0xD1,0x67,0xC5,0xBA,0xE8,0x0D,0x94,0xB4,0x03,0x66,0x41,0x89,0xCC,0x6B,0x32,0xEB,0x56,0x5A,0xBC, +0x1B,0xB7,0x44,0xA4,0x94,0x9C,0x06,0x8D,0xDC,0xED,0xCB,0x59,0xE6,0x96,0x43,0xAD,0x55,0xB1,0xF0,0x38, +0x4D,0xE3,0xCA,0xDE,0x7A,0xE2,0xEB,0xFF,0x4E,0x84,0x6D,0xC8,0x1C,0x8F,0x40,0x11,0x04,0xD0,0x07,0xDB, +0x4E,0x0B,0x78,0x32,0xD1,0x74,0xB9,0x8F,0x11,0x70,0x2A,0x7B,0xF7,0xCD,0x2B,0xD2,0x40,0x9D,0x35,0x0E, +0xA2,0x84,0x69,0xEE,0xA0,0x17,0x88,0x9A,0x41,0x6D,0x2C,0x4F,0xF2,0x04,0x79,0x33,0xF0,0x9D,0xBE,0x8A, +0x6B,0xBF,0x3A,0xCA,0x70,0x06,0x6B,0x01,0x21,0x6D,0x1A,0xEB,0x15,0x0C,0xF0,0x08,0x5A,0x2C,0x6C,0x31, +0xDA,0x14,0x22,0xD7,0x7D,0x9E,0xF8,0x32,0xE9,0x5E,0xB8,0x57,0x38,0x07,0x41,0x88,0xD2,0x89,0xF5,0x12, +0x71,0x56,0x93,0xFF,0x05,0x1E,0xCE,0x7C,0x1A,0xF6,0x8A,0x4B,0x2D,0x07,0x9A,0x9C,0x18,0x28,0x3F,0x8C, +0xFD,0x04,0xBF,0xE1,0x0A,0x45,0xAE,0x9D,0xC2,0xD3,0x88,0xF3,0x77,0x6D,0x49,0x22,0xAA,0xA6,0x90,0x4E, +0x76,0xD8,0x4E,0xC8,0xC2,0x07,0x81,0x68,0x56,0xA7,0x3D,0x3A,0x78,0x97,0x6B,0x7E,0xC1,0x57,0x12,0x11, +0xB9,0x3C,0xEA,0x08,0xE8,0x2C,0x25,0x32,0xAA,0x7D,0xA3,0xF7,0x3D,0x54,0x35,0xC2,0xA0,0x46,0x3E,0xFE, +0xDD,0x2B,0xBA,0x17,0x2B,0x8F,0xB9,0x57,0x2F,0xA7,0x6B,0x3B,0x15,0x96,0xB5,0x2A,0x7B,0x64,0x73,0x2B, +0xF1,0x97,0x6C,0xEE,0x3A,0x76,0xB6,0xD2,0xFA,0x59,0x9E,0x16,0xDF,0x5B,0x7A,0xA7,0x71,0x0E,0xBD,0x0B, +0xF3,0x56,0xBA,0x68,0x4C,0xDD,0x7A,0x6C,0xDF,0x0E,0x91,0x62,0x0D,0xE7,0xD4,0x90,0x89,0x27,0x03,0x72, +0xAE,0xE6,0xBA,0x37,0xE8,0x69,0x18,0x66,0xF5,0x0C,0xA4,0xBD,0x1A,0x31,0xED,0x86,0x7E,0x41,0x7B,0x71, +0x5F,0x3D,0x3F,0x1E,0x62,0xEC,0xC8,0x22,0x16,0x4D,0x23,0x7D,0x2B,0xB0,0xCA,0x5D,0xED,0x5E,0x57,0x7A, +0x95,0x95,0x9C,0x99,0xCD,0x5C,0x55,0xDF,0x1C,0xAF,0x34,0xEE,0x54,0xF5,0x73,0xE2,0x53,0x8E,0x77,0xEF, +0x1F,0x8E,0xC8,0x4B,0x90,0x32,0xA2,0x56,0x1B,0x15,0x12,0xDF,0xCA,0x1D,0x51,0x7A,0x45,0x51,0xAE,0x04, +0x17,0xEF,0x83,0xA3,0x1B,0x36,0x9D,0x60,0x02,0x03,0xB6,0x30,0x42,0x2D,0x66,0xFA,0xCF,0x6F,0xE3,0xB2, +0xD5,0xFE,0xE8,0x53,0x0B,0x1C,0xD7,0x73,0x34,0x85,0xBC,0xF4,0x2A,0x65,0x8D,0x35,0xD7,0x7F,0x32,0xF9, +0xCA,0x24,0xDF,0x7F,0x35,0x84,0xED,0x54,0xDB,0x36,0x4C,0x86,0xF1,0x49,0xC5,0xA0,0xF2,0x9B,0x5E,0xB6, +0x8A,0x74,0x59,0xAD,0x5E,0x75,0xD7,0x07,0x5E,0x79,0xE1,0x42,0x86,0x1D,0x17,0x15,0xE5,0x75,0x9D,0xE4, +0x96,0x15,0xA4,0x17,0x5F,0x78,0x58,0x8E,0x28,0xE5,0xFA,0xA8,0xDD,0xA7,0x56,0x7F,0x20,0x2E,0xE8,0x80, +0x13,0x5B,0xF5,0xC3,0x07,0xA5,0x34,0x62,0x29,0xF4,0x25,0x37,0x9A,0x64,0xC0,0x19,0x7B,0x62,0x90,0x76, +0x5D,0x79,0x86,0xFB,0x43,0x2A,0x2A,0x27,0xE9,0xBA,0x93,0x5C,0xDE,0x0D,0x24,0x3C,0x78,0xB7,0x70,0xB9, +0x18,0xA4,0xFE,0x52,0xB5,0x45,0xB8,0xCB,0x06,0x60,0x18,0x4C,0x5A,0xF1,0xD5,0x7B,0xCF,0x33,0x41,0xE0, +0x69,0x2E,0x88,0x0E,0x7E,0xD1,0x36,0x4B,0x49,0x15,0xB6,0xD8,0xD2,0x0C,0xA1,0x8A,0x09,0xA2,0x1E,0xC4, +0x85,0x70,0xAB,0x5A,0xC0,0xB3,0x73,0xB2,0x19,0x95,0x69,0x8D,0x8A,0xA1,0xCB,0xDF,0x9A,0xAE,0xCC,0x29, +0xCA,0xBE,0x0F,0xE5,0x49,0x92,0xA4,0x86,0x83,0x52,0x24,0xDA,0x5A,0x80,0x71,0x33,0xA7,0x3F,0x43,0x42, +0xB7,0x9D,0x8F,0x1F,0xBB,0x1D,0x85,0xA2,0x4C,0xD5,0x3B,0x49,0x6F,0x8E,0xCB,0x47,0xB6,0xE0,0x47,0x48, +0x6B,0x5E,0x64,0x44,0xDB,0x84,0x1C,0x1C,0x27,0x07,0xC6,0x43,0x37,0xBF,0xE5,0xDD,0x3D,0xA1,0x71,0x2E, +0x6C,0x6F,0x52,0x7C,0x51,0x8C,0x90,0x77,0xC9,0x3E,0x84,0x96,0x7A,0xC1,0x97,0x30,0x1C,0xEC,0x02,0x47, +0xEF,0x47,0x1F,0xC4,0x8B,0x38,0x9C,0x0D,0x98,0x69,0x43,0x5B,0xAA,0xE7,0x20,0x46,0x6C,0x46,0x90,0x24, +0xFC,0xB4,0x70,0x76,0xC0,0xA7,0x38,0x62,0xE9,0xFE,0x7B,0x41,0x44,0x82,0xDB,0xA5,0x3A,0x5B,0x09,0xE7, +0xBE,0x4E,0xAA,0x67,0xAD,0x46,0x69,0xA2,0xE9,0x77,0xD7,0x7F,0x1A,0x01,0x47,0xC6,0xA7,0xE7,0xD8,0x01, +0xAB,0x18,0x10,0xF4,0xB4,0x87,0x0E,0x8B,0xEF,0x15,0xDC,0x2F,0xD6,0xC0,0x9C,0x29,0xCD,0x44,0x85,0x49, +0xAE,0x58,0x51,0x61,0x13,0x56,0xBD,0xF0,0xA4,0x44,0x94,0x39,0x94,0xE6,0x9E,0x14,0x2F,0x0F,0x67,0xF4, +0x69,0xC8,0x31,0x44,0x56,0xB5,0x13,0x65,0x7F,0x8F,0x04,0xB2,0x7A,0x06,0xC2,0xFC,0xB9,0xB6,0x46,0xD5, +0xE9,0xD0,0x95,0x38,0x4C,0x47,0xD7,0x2B,0xEF,0x33,0xFE,0x8E,0x1B,0x01,0x8D,0x18,0x24,0x0F,0xC9,0xD2, +0xA9,0x80,0xAA,0x83,0x03,0x00,0xD4,0x77,0x92,0x0B,0x05,0x82,0x4F,0x8F,0x1D,0xFC,0xC6,0xF2,0xBC,0x3B, +0xF9,0x5B,0xF2,0x5F,0x75,0x9F,0x88,0x83,0x5E,0x03,0x93,0x24,0x65,0xE3,0x15,0x73,0x66,0x9E,0xF7,0x9F, +0xB9,0xED,0x6C,0xC2,0xCE,0x8F,0xC3,0xE1,0xDC,0xDF,0x84,0x27,0xED,0xD4,0x10,0xE4,0xCF,0xD5,0x0C,0xD0, +0xFD,0x8F,0x95,0xD0,0x08,0x5F,0x49,0xE1,0xA1,0x87,0x53,0xB2,0xD4,0xD7,0x62,0x50,0x67,0x2C,0xEE,0x34, +0xF5,0x54,0xC0,0xF8,0x32,0x0F,0x9D,0x79,0x18,0xBF,0x0F,0xF9,0x5B,0x93,0xE3,0xD5,0xDA,0x5D,0x25,0x8B, +0x4E,0xD7,0xD6,0x67,0xBD,0xD5,0xAA,0x4C,0x10,0xB0,0x85,0xE5,0xB6,0x03,0x75,0x31,0xA2,0x19,0x73,0x24, +0x9A,0x19,0x8B,0x9C,0x48,0x20,0x94,0xDC,0x74,0xF9,0x36,0xD3,0x84,0xD7,0xB4,0xD3,0xFF,0x84,0xFA,0x79, +0x61,0x64,0x50,0x89,0xAD,0x0A,0x37,0xFD,0x4D,0xF2,0xB5,0x25,0x5F,0xA7,0xD5,0x10,0x6A,0x94,0x8E,0xC0, +0x57,0x49,0x7E,0xA4,0x18,0xC2,0x7C,0xC6,0x8F,0xB3,0x7C,0xB3,0xAF,0xD4,0x46,0x6D,0x00,0x5A,0x9D,0x05, +0xDB,0x25,0xD9,0x7E,0x38,0xDE,0xCD,0xD1,0x42,0x67,0xE8,0x1A,0x7C,0x72,0x55,0x87,0xE6,0x96,0x51,0xBA, +0xCC,0x76,0xEA,0xF0,0x6F,0x37,0xF4,0xAB,0x96,0xEA,0xC6,0x70,0x5D,0xAC,0x5C,0x7F,0xB0,0xDC,0x1C,0x0E, +0x3D,0xC6,0x31,0x5C,0x92,0xF7,0xC5,0xE9,0x78,0xE4,0xAE,0xE4,0x5A,0xAB,0xB9,0x34,0x1C,0x8D,0xAF,0x8E, +0xF9,0xDF,0x1E,0x0D,0xE4,0x4D,0x48,0xDF,0x0E,0x95,0x76,0xEE,0xE9,0x0C,0xEA,0xDE,0x89,0x43,0x6F,0xD4, +0x57,0xE9,0xC8,0x6F,0x1D,0x10,0xFE,0xC8,0x07,0xBE,0x3E,0xEB,0x5B,0x81,0xDE,0x58,0xD6,0x96,0xF4,0xDC, +0xDC,0x4F,0x49,0x8F,0x85,0xD1,0xCD,0x5F,0x01,0x61,0xFC,0x33,0xC4,0x5A,0xA2,0x3F,0xE9,0xA4,0x02,0x88, +0xC9,0x7C,0x40,0xB0,0x6A,0x22,0xA9,0x72,0xEB,0xF1,0x2B,0x66,0x6D,0x29,0x3B,0xA4,0x04,0x37,0xC8,0x20, +0xD9,0xF2,0x0C,0x63,0x28,0x83,0x6C,0x72,0xEE,0x27,0x9A,0xB0,0xFC,0xE0,0x9E,0x1D,0x32,0x69,0x7F,0xA1, +0xEB,0x13,0x01,0x07,0x8C,0x39,0xD1,0x18,0x18,0x41,0x97,0x09,0x2C,0x53,0xF6,0x62,0xB1,0x6F,0x27,0x4A, +0x30,0xDA,0x21,0xCE,0x74,0x20,0x0E,0xB1,0xE9,0xDB,0xD1,0xB3,0x8E,0xA9,0x00,0x9C,0xA4,0x65,0xD7,0x40, +0x62,0x54,0x43,0x7F,0x2E,0x08,0xDB,0xB2,0x30,0x31,0xF2,0xA7,0x67,0x8A,0x1E,0x92,0xC3,0x05,0x88,0x04, +0xD3,0x7A,0x56,0xA3,0x2E,0xAB,0x66,0x7D,0x4A,0x97,0x31,0x2B,0xBC,0xCD,0xEE,0xF6,0xF8,0xCB,0xF3,0x96, +0x41,0x27,0x5E,0xA6,0xB1,0x88,0xB1,0xED,0x41,0x43,0xE2,0x05,0x53,0x71,0xE5,0x48,0x0C,0x2C,0x9A,0x1C, +0xE5,0x27,0xE9,0xAC,0x30,0xFC,0xAC,0x04,0xFB,0x2A,0x18,0x04,0x0F,0x98,0x32,0x7C,0x15,0x6B,0x3E,0x31, +0xCB,0x35,0xE2,0x4F,0x65,0x2B,0xE2,0x8D,0xF0,0x6D,0xA3,0x1C,0xAB,0xAC,0x33,0x39,0x80,0x5B,0x86,0x79, +0x31,0xFB,0xFC,0x7B,0x7E,0x6E,0x1A,0x44,0xAA,0x1F,0x30,0xBD,0xB1,0x80,0x8E,0x6C,0x24,0x64,0x4A,0x44, +0x28,0x0C,0x96,0xC8,0x5B,0x1A,0x60,0x0A,0x22,0x5D,0x9A,0x7C,0x8A,0x6F,0x72,0x78,0xA6,0x8D,0x6F,0xAF, +0x3D,0xA6,0xA5,0x3F,0xC9,0x71,0xCA,0x8C,0xE9,0x5C,0xC5,0xCB,0x0A,0xAB,0xBD,0xE8,0x6F,0xAD,0xAC,0x16, +0x89,0xB5,0xF4,0xCC,0xFA,0x8D,0x4D,0x71,0x23,0x77,0xE3,0x60,0x70,0x6B,0x09,0x1B,0x15,0x49,0xA5,0x7B, +0x3A,0xEC,0x63,0x73,0x54,0xCD,0xDE,0x81,0x97,0x9B,0x11,0x31,0x50,0xA5,0x4E,0x9B,0x00,0xA5,0x32,0xA8, +0xBF,0xBC,0x1D,0x67,0x01,0x2A,0x3C,0x57,0x67,0xC0,0xFC,0xB6,0x3E,0x7C,0x66,0x72,0xD8,0x7E,0x90,0x98, +0x51,0x9D,0x04,0x25,0xC0,0x52,0x00,0x21,0xEB,0x9F,0x98,0x1F,0xA2,0xDB,0xAA,0xF3,0x4E,0x9E,0x34,0x35, +0xB1,0x3E,0xE2,0xF2,0x0C,0xC5,0x7C,0x60,0xCF,0xB4,0x7B,0x8F,0x8B,0x5A,0x7D,0x5D,0x01,0x45,0x14,0x23, +0x8B,0xF2,0x34,0xA3,0x17,0x9D,0xF6,0x3A,0x9A,0x5B,0x75,0x4D,0xC2,0xD5,0xBE,0xF6,0x72,0xF5,0x7F,0x43, +0x6F,0xD8,0xA7,0xC0,0xB3,0xB6,0x2D,0x27,0xF4,0x50,0x2A,0x9F,0x93,0x72,0x6D,0x22,0x93,0xEA,0xEB,0x70, +0x37,0x93,0x25,0xF3,0xE9,0x56,0x04,0x0A,0x73,0x17,0xAA,0xFB,0x5C,0x6E,0x97,0xCB,0xE6,0x30,0x28,0x80, +0xE5,0xFE,0x2D,0x3E,0x78,0x72,0x59,0x1C,0x59,0xFE,0xC3,0xAD,0x09,0x26,0x0F,0x3C,0x49,0x59,0x5E,0x95, +0x1E,0x8C,0x39,0xB0,0x3E,0x12,0x07,0xCE,0x98,0xB1,0x0B,0x69,0xF0,0xAF,0x56,0x29,0xCC,0x2B,0xCF,0xA0, +0xDC,0x00,0x37,0x5A,0x7B,0x3B,0x19,0x91,0x69,0x54,0x0C,0x83,0x81,0x39,0x5E,0xCD,0x27,0x0D,0x16,0xCB, +0x3C,0xB4,0x46,0xEC,0xEF,0x0E,0x7F,0x97,0xEF,0x67,0x4E,0x98,0x27,0x75,0xF6,0x23,0xF3,0x9E,0xB2,0x6A, +0x6B,0x55,0x64,0xE2,0xF7,0x0C,0x07,0xB7,0x25,0x98,0x75,0xAF,0x4D,0x5B,0x37,0xA3,0x94,0x53,0x74,0x9B, +0x0D,0x6E,0x5E,0x99,0x29,0xF3,0x6F,0xCE,0xD9,0x5B,0xDB,0x9B,0xA9,0x50,0xA1,0xFB,0x1A,0xDC,0x18,0xFD, +0x02,0x11,0x1A,0xE6,0x0A,0xBB,0x78,0xB3,0xAD,0xC3,0x70,0x0F,0x11,0x4D,0x10,0xE9,0x88,0x77,0xA9,0x70, +0x36,0xE3,0xEB,0x75,0x4B,0x1E,0x78,0x1F,0x1C,0x1C,0xD7,0x61,0x77,0xE7,0x45,0x61,0xB7,0x60,0xA6,0xDC, +0x2D,0x33,0x22,0xC5,0x3D,0x53,0x57,0x2B,0x74,0x55,0xF0,0x3F,0x30,0xA8,0x86,0xB6,0x3A,0xC5,0xC1,0xC7, +0xCE,0x42,0x39,0xC5,0x00,0xB5,0xBA,0x45,0x60,0x51,0x5D,0xC7,0xE7,0x42,0xDE,0x95,0xDA,0xE9,0xD0,0xAC, +0x88,0x03,0xBE,0xD2,0x14,0xD5,0xBB,0x43,0xAE,0x94,0x7A,0xD9,0xAA,0xFE,0x6B,0x3C,0x25,0x96,0x41,0xB4, +0xF4,0x52,0x71,0xA3,0xF6,0xC5,0x0E,0x9B,0xD6,0xA4,0x69,0x13,0x9B,0x81,0xD3,0xB8,0xA4,0x42,0x1B,0x77, +0xC4,0x35,0xFB,0x29,0x73,0x0A,0x5C,0x27,0x0A,0x39,0x26,0x0A,0x4F,0x3E,0x9F,0x70,0xB9,0xC7,0xA3,0xC4, +0x5A,0xD9,0x39,0xA5,0xAC,0x56,0x52,0x9A,0x29,0x11,0x29,0x70,0x4B,0x59,0xAF,0x2F,0x65,0xAB,0xD7,0x3B, +0x8A,0xC8,0xFA,0x27,0x39,0x28,0x87,0x54,0x6F,0x88,0xB9,0x50,0x7F,0x4A,0x9F,0x79,0x72,0xE7,0x8B,0x0E, +0xAE,0xBA,0x87,0x48,0xFD,0xC2,0x2A,0xA3,0xDB,0xDA,0x42,0xAA,0xAF,0x33,0x5A,0xB1,0xA3,0xC0,0x12,0x20, +0x30,0xC1,0x36,0x30,0x50,0xF2,0x52,0x56,0x2D,0x8D,0xD3,0x01,0xA2,0x51,0x1A,0x79,0x1A,0xC0,0xD1,0x04, +0x7D,0x00,0x49,0x9B,0xD2,0x8F,0x04,0x0F,0x9A,0x83,0x11,0xFB,0xCF,0x7E,0x8A,0x94,0x0F,0x33,0x68,0xD9, +0x0F,0x2A,0x2B,0x06,0x30,0x93,0x31,0x39,0x6C,0xC9,0xF9,0x0D,0x68,0xEB,0x03,0xF4,0xDF,0xFC,0xEC,0x82, +0xBD,0xE0,0xDC,0x0E,0x40,0x6B,0xF9,0xD1,0xF6,0xF4,0xA9,0x16,0x5D,0xF6,0x6C,0x1F,0x98,0x65,0x70,0xB1, +0xAD,0x80,0x03,0x2D,0x80,0x77,0xE5,0xBA,0x1C,0x98,0x9F,0x7C,0x48,0xA3,0x75,0x5B,0x1C,0x90,0xFC,0xC5, +0x0F,0x9E,0x3F,0x17,0xA3,0x02,0x38,0x88,0xC5,0x08,0x2C,0x97,0x67,0xF7,0xBD,0xF7,0xEB,0xB1,0x8E,0xA0, +0xC4,0xB4,0x24,0x96,0xD2,0xB9,0x9C,0xC2,0x44,0x24,0x50,0x15,0xFA,0xA9,0x52,0xFA,0x84,0x91,0x0B,0x29, +0xC6,0x63,0x44,0x82,0x6F,0xDC,0xCD,0xCE,0x93,0x24,0x64,0x41,0x2E,0x4E,0x9E,0xE0,0x17,0xDA,0x74,0x61, +0x2B,0x18,0x8D,0xEA,0x5F,0x27,0x6B,0xA1,0x25,0xB3,0xC2,0xA8,0x6E,0x28,0xB9,0x1B,0x7F,0x1A,0xFC,0xC1, +0x8B,0xE2,0xD1,0x0E,0x54,0x41,0xA2,0xB1,0x0C,0xFA,0xBD,0xC8,0x4D,0x98,0x27,0xF7,0x7A,0xA9,0x7F,0x66, +0x2D,0x25,0x09,0xA2,0x5E,0x83,0xD4,0x58,0x5E,0xED,0x2B,0x5C,0xD1,0x54,0x77,0x8B,0x80,0x6F,0xE2,0xE8, +0x68,0x0B,0x1B,0xCD,0x6E,0x36,0x74,0x5C,0x70,0x57,0x92,0xC0,0x7C,0xC6,0xB9,0xB7,0x0E,0xF6,0x85,0x44, +0x6F,0x37,0xAC,0x5D,0xFB,0xAA,0xED,0x28,0xAC,0x98,0x0A,0xB5,0xF4,0x4D,0x2E,0x6B,0x5D,0xBA,0xE1,0xD8, +0x5C,0xEC,0x6E,0x9A,0x46,0x9E,0x97,0xA4,0x5E,0xB9,0xC6,0x1A,0x7F,0xC6,0xFD,0xEF,0xFA,0x6D,0x55,0xA9, +0x21,0x18,0xD9,0xF3,0xDF,0xBA,0xCF,0x0B,0xBE,0xCE,0x45,0x4E,0xDA,0xFD,0xAE,0xBF,0xC4,0x8E,0x8E,0x9F, +0xFF,0x2B,0x6E,0x9D,0xCE,0xBF,0x3F,0x7F,0xFF,0xBE,0x5E,0x2C,0xFF,0x06,0xA2,0xF7,0x20,0x26,0x58,0x88, +0xC2,0x1C,0x50,0xA0,0x50,0x22,0xD5,0x3C,0xE0,0xBE,0x99,0x74,0x53,0x27,0x7A,0x31,0x40,0x90,0xBF,0x56, +0xAE,0xCC,0xA8,0x8B,0x21,0xFD,0x28,0x8F,0x31,0x8B,0x44,0x43,0x80,0x4D,0xDE,0xA4,0x52,0x3E,0xC9,0x24, +0x8D,0xF7,0x20,0x97,0x30,0x8A,0x27,0x18,0xBD,0xBC,0x08,0xF2,0x0F,0x6B,0x9F,0x44,0x04,0xBE,0x92,0xBF, +0xE5,0x66,0x70,0xEA,0x43,0x14,0x0D,0xE0,0x48,0x5A,0x07,0x89,0x27,0x79,0x7C,0x36,0x9C,0xD3,0xE3,0xE3, +0x77,0x9A,0xC2,0x76,0xE0,0xC8,0xE7,0xBC,0x86,0x44,0x80,0x6D,0x33,0xB9,0xEE,0xF2,0xFE,0xB9,0xEF,0x5C, +0x0C,0xBB,0xF6,0x1E,0x16,0xBA,0xF2,0xCB,0x92,0xB7,0x79,0x61,0xB4,0x47,0xCA,0x05,0x53,0x71,0x17,0x8A, +0x9D,0x0E,0x93,0x6C,0x48,0x33,0xD2,0x79,0x9E,0x4E,0xC2,0x5E,0xB3,0x79,0x55,0x99,0x0F,0xE8,0xB4,0x34, +0xBA,0xA4,0x24,0x29,0x4F,0x0B,0x5A,0x94,0x02,0x64,0x3B,0xF6,0xB7,0x5B,0x00,0xFD,0x90,0x65,0x33,0xD0, +0x69,0x4B,0xC9,0x57,0xB0,0x7B,0x8F,0x06,0xB9,0xA6,0xD2,0x19,0x3E,0x30,0x1B,0x3B,0xDD,0x4D,0xC5,0xDF, +0x95,0xEE,0xEB,0xCA,0x8A,0x07,0x7A,0xB2,0x0A,0x61,0x8D,0x68,0x4C,0x5E,0x9A,0x00,0xD7,0xD1,0x72,0x5C, +0x22,0x60,0xB2,0x7B,0xE6,0x22,0xE5,0x9A,0x4D,0x5F,0xBC,0x44,0x68,0x89,0x7B,0x0E,0x84,0x0F,0x03,0xC5, +0xF6,0xF3,0x42,0x17,0x69,0x2B,0xB5,0x54,0x25,0xF3,0x8B,0xD1,0x2B,0x4D,0x0B,0xD5,0xA9,0x6D,0x4A,0x1B, +0x3C,0x23,0x1B,0xF4,0x47,0x65,0x3A,0xAC,0xAD,0xE6,0xBC,0x54,0x6C,0xCF,0xAC,0xB0,0xC7,0x3E,0x78,0x26, +0xE5,0x43,0x32,0xBD,0x2F,0x73,0xD5,0x88,0x94,0xB1,0x30,0xC2,0xC6,0x13,0x1F,0xD2,0x52,0xF3,0x4D,0x85, +0x7C,0x43,0xDD,0x81,0xCF,0xB2,0xF2,0x61,0xE4,0x73,0xAD,0x45,0xEA,0x69,0x47,0x2C,0x2C,0xB5,0x75,0xD2, +0x6F,0x3B,0x94,0x85,0x35,0xC2,0x5D,0x64,0x11,0x87,0x23,0x33,0x5A,0xC9,0xA5,0x84,0x26,0xC9,0x39,0x93, +0x5E,0xA2,0x8D,0xEE,0x74,0x46,0x6C,0xD3,0x82,0x99,0xAA,0xEC,0xC4,0x31,0x62,0xDC,0x02,0x51,0x1C,0x7C, +0x41,0x78,0x26,0x32,0xD2,0x10,0xA3,0xFC,0x4D,0xEB,0xEE,0x91,0x62,0x49,0x04,0x55,0x09,0xA9,0x07,0xCC, +0xE3,0xE8,0xCF,0x29,0xB3,0xCC,0x3C,0x31,0xBA,0x3B,0xA6,0xD2,0x52,0x19,0x97,0x48,0x62,0xB5,0xD0,0x0E, +0xB8,0x83,0xB1,0x91,0xA0,0xE9,0x87,0x2E,0xED,0x7E,0x34,0x3D,0xDE,0x77,0x79,0x1C,0x33,0x22,0x0B,0xCA, +0x96,0x42,0x18,0xCF,0x49,0x76,0x96,0xB9,0xEA,0xE5,0xBF,0x5D,0x9A,0xC5,0x86,0xDA,0x98,0xF5,0xAF,0xDC, +0xC8,0x73,0x31,0xB4,0x77,0xC6,0xAA,0xEB,0x9A,0x9B,0x9C,0xDF,0xC8,0x4B,0xA5,0x55,0xFD,0x34,0x9D,0xC8, +0x59,0x1C,0xC6,0x48,0x28,0x2F,0x69,0x7B,0x56,0xA3,0x31,0x96,0xAC,0x74,0xBB,0xC6,0x5F,0xE9,0xB6,0x58, +0x29,0x2E,0x78,0x7C,0x71,0x29,0x66,0x78,0x69,0x9E,0x18,0x6D,0xAC,0xDE,0x7C,0x2F,0x16,0xC3,0x6C,0x7A, +0xDE,0x45,0x41,0x8B,0x0D,0x6E,0xD8,0x5D,0xB9,0x0E,0xF7,0x23,0x36,0xE2,0x17,0xF1,0x3E,0xC2,0x64,0x1F, +0x57,0x82,0x31,0xF0,0x25,0xE0,0xB5,0x60,0x7C,0xF1,0x19,0xD1,0x27,0xE0,0x96,0xC4,0x24,0x4F,0x81,0x98, +0xA4,0x2A,0xE0,0x12,0x6A,0x5E,0x40,0xB6,0x1E,0xE3,0x3C,0x68,0xD8,0x83,0x07,0x2B,0xBC,0x84,0x5E,0x40, +0x5E,0xF3,0x49,0x04,0xA7,0x01,0xA6,0x19,0xA4,0xF9,0x51,0x0E,0x65,0x7C,0x97,0x3A,0x1A,0x55,0xF9,0xF7, +0xAB,0x4E,0x12,0xB2,0x46,0xDC,0x21,0xDF,0x00,0x96,0xA5,0xB6,0x15,0x1C,0xCB,0x12,0xC6,0x42,0xF1,0x38, +0xA7,0x38,0x50,0xA9,0x8A,0x78,0xD6,0x6A,0x76,0xA1,0x39,0x5A,0xA6,0xCA,0x7F,0xF2,0x45,0xF6,0xF7,0x21, +0x75,0xE3,0xDF,0x7E,0x5C,0x57,0xD5,0xA3,0xAD,0x84,0x5E,0x1C,0x0B,0xE2,0x0E,0xA0,0xBB,0x5A,0x90,0x24, +0xE7,0x2E,0xCD,0x91,0xEE,0x55,0xC1,0x89,0x7B,0xEA,0x42,0x44,0xCA,0x85,0xAA,0xDE,0x2F,0x78,0x6B,0xA2, +0xEB,0xCC,0x4D,0xDE,0xAD,0x49,0x9C,0x64,0xE6,0xF8,0x52,0x6C,0x2E,0xE9,0x6F,0xD8,0x7E,0x98,0x05,0xDC, +0x15,0xF8,0xB4,0xF4,0x8A,0xC0,0x1B,0xEF,0xD8,0x2A,0x35,0x59,0x4E,0x96,0xA2,0xAB,0xEE,0x50,0x72,0x9F, +0x28,0x74,0x53,0x9D,0x1D,0x8F,0x83,0xC4,0xFE,0xD9,0x85,0x17,0x3F,0x2D,0x01,0xB9,0x3A,0xCE,0xC2,0xC4, +0x1F,0x1F,0xB2,0xE3,0x7C,0x4F,0x5E,0xFD,0x26,0x13,0xBC,0x38,0xFC,0xE8,0xD4,0x66,0x7E,0xA9,0x6B,0xFE, +0x55,0x31,0x3A,0xF6,0x6D,0x30,0x22,0xC3,0x88,0x9C,0x0F,0x30,0x54,0x1F,0x8A,0x95,0xC8,0xDC,0x48,0xFC, +0xAE,0x31,0x53,0xA0,0x02,0x72,0x92,0x21,0xFE,0xAB,0x73,0xA7,0xC9,0xFD,0x83,0x58,0x22,0xE0,0x3E,0x80, +0x97,0x1B,0xFD,0x01,0x91,0xB9,0x54,0xEC,0xA6,0xDD,0xED,0xAD,0x91,0xF9,0x75,0x7B,0xC0,0x6E,0xEE,0x70, +0xB5,0xE3,0x83,0x75,0xA7,0x91,0x43,0x5E,0x71,0xBC,0x05,0x09,0xA5,0x2A,0x23,0x6F,0xE0,0xFF,0x99,0x30, +0xDC,0x2D,0xB0,0x4F,0x3A,0xBF,0x81,0x7B,0x9A,0x5E,0x97,0x7F,0xE1,0xFC,0x35,0xBA,0x18,0x55,0x2A,0x51, +0x77,0xAF,0xA4,0x4B,0x45,0x9E,0xFE,0xC4,0xF4,0xD0,0xDF,0xBD,0x9F,0x28,0x8C,0xE4,0x6C,0xB6,0xFB,0xA1, +0x53,0x1C,0x2C,0x5E,0x05,0x38,0x6D,0x90,0x90,0xB0,0x3B,0x72,0x65,0x14,0xE8,0xB0,0x9A,0x30,0xED,0xC3, +0x9F,0x29,0x55,0xFE,0xE0,0xC4,0xB4,0xC5,0xF0,0xE4,0x4D,0x39,0x4E,0xC6,0x95,0xF0,0x14,0x9E,0x45,0xB4, +0x2D,0xA6,0x3D,0x7E,0xC7,0xFD,0xC1,0x74,0x1F,0x19,0x98,0xA7,0x0F,0x83,0xCD,0x6A,0x2C,0x55,0xCB,0xCC, +0x83,0xE3,0x49,0x69,0x1D,0x34,0x4D,0x1C,0xBD,0x02,0x97,0x28,0x84,0xE8,0xB6,0xAF,0x9C,0xB6,0x9F,0x70, +0x21,0x47,0x35,0x70,0xBA,0x12,0x6E,0xB7,0x4B,0xDC,0x37,0xC9,0x71,0x0C,0x3A,0xDC,0x67,0x8A,0x97,0xBF, +0x54,0xDB,0x47,0x4A,0x4E,0x2B,0x7F,0x7B,0x93,0xBA,0x7C,0xC8,0xBC,0x94,0x9D,0x26,0xAE,0xFE,0x89,0x94, +0xA4,0x8D,0x73,0x6A,0x6C,0xEE,0xFB,0xA9,0x1B,0x14,0x15,0x5A,0x2D,0xAE,0xC5,0x18,0xC3,0x20,0xBB,0xD6, +0x7E,0x6D,0xB2,0x0C,0x53,0x38,0xA2,0x63,0xDC,0xE1,0x8C,0x6F,0xFC,0xCF,0x37,0x67,0x90,0xBC,0x4F,0x31, +0x5A,0x16,0x2F,0x56,0x62,0xB7,0x07,0x7F,0xF5,0xCC,0x50,0x90,0x22,0x44,0x04,0x84,0x0B,0xF7,0xB2,0xFB, +0x9D,0x9D,0x5A,0x62,0x1D,0xBF,0x6F,0x62,0x4C,0x7B,0x52,0xDD,0x35,0x43,0xF0,0xEA,0x22,0x93,0x97,0xCF, +0xE5,0x71,0x42,0x20,0x6A,0xAA,0x58,0x0A,0xC4,0x43,0x66,0xFA,0x61,0x84,0x2F,0x55,0xA8,0x4F,0x48,0xD1, +0xD0,0x79,0x48,0x91,0x3C,0x0C,0x31,0x38,0x6A,0xAE,0x23,0x94,0x36,0xCF,0x27,0xDD,0xBE,0xA5,0x28,0x82, +0x86,0x0A,0x23,0x04,0x02,0x89,0xFD,0x2E,0xB7,0x18,0xD6,0x5D,0xDB,0x9C,0x70,0xF4,0xDF,0x94,0x48,0x37, +0xB4,0x4B,0x98,0xF8,0x41,0x48,0x8C,0x86,0xAC,0xC8,0xE5,0x83,0x21,0x08,0x95,0x14,0xB0,0x2D,0x0B,0xE1, +0xAA,0xF7,0x81,0xC4,0xD4,0xCB,0xA1,0xF0,0x62,0xA8,0xF7,0xF0,0x51,0xA6,0xA6,0x81,0xC1,0xE6,0x89,0x87, +0x24,0x7C,0x92,0x4A,0xA9,0x04,0x56,0xF6,0x1E,0xE8,0xC6,0xF8,0xE9,0xB0,0x9A,0x55,0x6B,0xA3,0xAA,0x5A, +0x8A,0xA2,0x72,0x14,0xE4,0x66,0xAD,0x54,0x4F,0x33,0x18,0x9C,0x4D,0x00,0x7B,0x4B,0x04,0x06,0x76,0xE5, +0x88,0xF7,0x6D,0xFD,0xF7,0x6A,0x49,0x2D,0xEB,0xD1,0x63,0x99,0x0B,0x17,0xB5,0x74,0x7B,0x0B,0xB6,0xD1, +0xC5,0x06,0xC6,0xC4,0x34,0x70,0x92,0xBB,0x24,0x87,0xFC,0xE8,0xD8,0x2C,0xC1,0xEC,0x58,0x4E,0xB2,0x0A, +0x0D,0x23,0x00,0xBA,0x84,0x8B,0xC4,0xFC,0x38,0x24,0x93,0x66,0x6D,0xB9,0x4A,0xFE,0xE7,0x6F,0x5A,0x74, +0x39,0x43,0xCB,0x39,0x73,0x0D,0x6B,0x92,0xCC,0x84,0xD2,0x0B,0x85,0x21,0x0B,0x19,0x8F,0x22,0x5B,0x1A, +0xA8,0x4B,0x8F,0x0A,0xBB,0xEE,0xE3,0x8E,0xA7,0xC4,0xBC,0x7F,0x26,0x4A,0x56,0x6C,0x74,0x7D,0xAE,0x4E, +0x89,0x09,0xC1,0xD9,0x43,0xB1,0xF4,0x78,0x01,0x5C,0xF2,0x40,0x02,0x21,0xAF,0x52,0x67,0x91,0x88,0x36, +0xE4,0x55,0xC4,0x69,0xAC,0xEF,0xFB,0x54,0xA0,0x7F,0xB4,0x43,0x00,0xAD,0x2D,0xB5,0x57,0x76,0xF2,0x15, +0xBA,0x43,0x35,0x66,0xFE,0x23,0xE8,0x59,0xA5,0x8E,0xA5,0xF2,0x33,0x33,0x3A,0x61,0x41,0xC5,0x54,0x2C, +0xB6,0x79,0x57,0x27,0x51,0xBE,0xEE,0x06,0x11,0x0E,0x0C,0xB2,0xC8,0x96,0xDA,0xB6,0xCC,0xA8,0xBD,0xB0, +0x67,0x19,0x9C,0x04,0x8C,0x7A,0x53,0xF9,0xA4,0x04,0xBE,0xCD,0x17,0x89,0xED,0x6E,0xF0,0x1B,0xC3,0xD9, +0xF4,0x64,0x77,0x22,0xDB,0xBA,0x19,0x2B,0x3C,0x4A,0x09,0x82,0x81,0xDE,0x87,0xC9,0x9B,0xE6,0x5F,0x99, +0xD5,0x57,0x3E,0x7F,0x2B,0x8D,0xEE,0xA0,0x95,0x17,0xDE,0xA4,0xD9,0xF8,0xB6,0x67,0x2F,0x43,0x4E,0x49, +0xA1,0x94,0x1C,0x50,0x37,0x5D,0xBE,0x3C,0xFB,0x25,0x27,0x1D,0x9B,0x1B,0x4F,0x09,0xA5,0x5D,0x4E,0x24, +0x4D,0x51,0xEF,0x29,0xC2,0x83,0xCE,0x71,0xE1,0xE6,0x92,0x5A,0x73,0x62,0x9F,0x51,0xC9,0x16,0xBB,0x4D, +0xF5,0x74,0x14,0x58,0xD5,0xB1,0x21,0xA2,0xEC,0x34,0xD6,0x08,0x1F,0xA9,0x16,0x64,0x78,0x71,0xCE,0xBB, +0xEB,0xB0,0x9E,0x3C,0x3F,0x10,0xE1,0xBF,0xA9,0xDD,0xFE,0xB6,0x87,0x8C,0x50,0x8E,0x74,0x16,0xC6,0xBE, +0x90,0x96,0xC0,0x6D,0xFD,0x9D,0x95,0x0F,0xB2,0xCF,0x58,0xC9,0x40,0xCE,0x37,0xA6,0x6E,0xA2,0x57,0x44, +0xED,0x6D,0x1F,0x2D,0x5D,0xF4,0x61,0x70,0xA7,0x81,0xA6,0xF7,0x13,0xA0,0xCF,0xCA,0x0C,0x8D,0x6B,0xB0, +0x55,0x9A,0x1C,0xED,0x36,0x40,0xB6,0x7A,0x36,0x01,0xC5,0xDA,0x1F,0x8C,0x40,0xC7,0x38,0xE1,0x24,0x13, +0x03,0xE2,0x81,0x1B,0x7D,0x9B,0x4E,0xCB,0x96,0x8F,0xE8,0x13,0xB7,0xC2,0x91,0x73,0x81,0xA6,0xF7,0xD3, +0x99,0xA7,0x47,0xE7,0xC3,0xB9,0x79,0xFA,0x0B,0xE7,0x98,0x7D,0x76,0xC6,0x58,0xC9,0x04,0xE9,0x48,0x53, +0xE7,0x6B,0xE7,0x67,0xBF,0x55,0xB3,0x52,0xB7,0x14,0xBC,0x07,0x35,0xAE,0x1A,0x63,0x44,0x25,0xAC,0x86, +0x55,0x44,0x6A,0x8D,0xE5,0xA6,0x00,0x87,0x86,0x0B,0xE6,0xE7,0xDC,0x6E,0x5D,0xF4,0xB4,0xEC,0x68,0x51, +0xCF,0xEB,0x69,0x34,0x30,0xC9,0xB9,0xFA,0xCE,0x41,0xEE,0xF3,0xC5,0xE5,0x56,0x79,0x35,0x01,0x26,0xFF, +0x1B,0x88,0x6E,0xC2,0x16,0x85,0x39,0xAA,0x43,0x1E,0x69,0xF2,0x13,0xC4,0x1A,0x16,0xB3,0xEF,0xC7,0x07, +0xB6,0x44,0xE3,0x0A,0xF8,0x85,0x27,0x6B,0x88,0xAF,0x9D,0x66,0xDE,0x55,0xCC,0xC3,0x9E,0x87,0xEA,0xBB, +0x79,0x15,0x73,0x93,0xBE,0x79,0xFD,0x39,0x81,0xED,0xEF,0xC1,0xFE,0x00,0x5C,0xFF,0xC9,0xA9,0xB6,0x14, +0x20,0x50,0xDC,0xEB,0xDC,0x9E,0x74,0x2A,0x1A,0xA2,0xCA,0x9D,0x2A,0x53,0x0A,0x3C,0x58,0x22,0xE2,0x1A, +0xF6,0x8E,0x3B,0x1C,0xD9,0xC5,0xD4,0x8E,0x01,0x4C,0x0A,0xA0,0x71,0x95,0xDD,0xEB,0x5C,0xAE,0x2A,0xAE, +0x6B,0xB8,0x44,0x52,0xD8,0xF6,0x3B,0x53,0x2A,0x75,0xE5,0xFF,0xBC,0x3C,0x3B,0x3D,0xE5,0xCB,0x68,0xFB, +0xCD,0xED,0xDC,0x6A,0x7A,0xDD,0xEC,0x82,0x9C,0x4F,0x4A,0x63,0x57,0x3B,0xED,0x92,0x95,0xBF,0x75,0x97, +0xD8,0xDE,0x50,0x67,0x0C,0xB1,0x06,0x02,0x9A,0x0E,0xF6,0x2E,0xF7,0xAD,0xDA,0x07,0xBF,0xC2,0x9F,0x78, +0xB2,0x50,0x8F,0x93,0x1B,0x2D,0xEB,0xD2,0xFC,0xB0,0xED,0x23,0xE1,0x88,0x5D,0x9A,0x86,0xE8,0x0A,0xDF, +0x96,0xD3,0x99,0xD5,0x0A,0x7A,0x5A,0xFE,0xAB,0x32,0x4F,0x2E,0x32,0xD8,0x78,0x70,0x26,0xDC,0xF0,0x1A, +0x76,0xE1,0x4C,0x22,0x25,0x34,0x85,0x3D,0xC8,0xDB,0x87,0xFB,0xCA,0xCE,0x50,0x53,0xA2,0x96,0x37,0x83, +0xA2,0xBB,0x31,0x99,0x98,0x6A,0x24,0x0A,0x62,0xBB,0xE6,0xEF,0x76,0x56,0x7A,0x57,0xB5,0x95,0x50,0x48, +0x02,0x61,0xFD,0xB4,0xC9,0x0B,0x56,0x3D,0x4C,0xB5,0x25,0xEC,0xD7,0xDD,0x24,0x48,0x7A,0x13,0xF6,0xBE, +0xD2,0x25,0x36,0xCE,0x3C,0x05,0x0E,0x65,0x1E,0xEB,0x10,0xD9,0x0E,0x22,0xED,0x40,0xD8,0x78,0x2B,0x57, +0xFD,0x99,0x66,0xF9,0x82,0x12,0x39,0x8E,0x87,0xE1,0x21,0x6A,0x17,0x47,0xC5,0xAA,0xB4,0xB8,0x97,0xC9, +0x83,0xF8,0x4D,0x5F,0xB9,0x9E,0x07,0xA8,0xD8,0xD4,0x7F,0xFA,0xCE,0xF5,0x5E,0x35,0x4D,0x9E,0xEE,0xC2, +0x0D,0x7A,0xA2,0xB4,0xFD,0xE3,0xB3,0xEC,0x5A,0x71,0x2E,0xB8,0xD4,0xDF,0x02,0x41,0x3C,0x76,0xFA,0x7E, +0x2B,0x61,0x3E,0xB6,0xC3,0x2A,0x71,0xF7,0xA8,0x8C,0x5F,0x30,0x57,0x84,0x88,0x13,0xEE,0x65,0x0C,0x91, +0x9E,0xFE,0x62,0x18,0x32,0x62,0xE9,0xE3,0x36,0xB6,0x93,0x94,0x31,0x82,0x6A,0x08,0xDB,0xFF,0x37,0x29, +0xFC,0x11,0x10,0x66,0xEB,0x62,0xB9,0x5E,0xD5,0xCD,0x6F,0xCC,0xD2,0x2D,0x1D,0x94,0x12,0x34,0xF0,0x26, +0x35,0x8A,0x63,0xCB,0xB6,0x03,0x17,0xD2,0x75,0xBE,0xC1,0x59,0xCD,0xF7,0xCA,0xF6,0x6D,0x8D,0x6C,0xCB, +0x3C,0x61,0x1A,0xC3,0xC0,0x2F,0x53,0x8C,0xE9,0x12,0xF1,0x11,0x68,0x61,0x9F,0xCF,0x20,0x3C,0x21,0xCF, +0xC1,0x2E,0xCF,0x26,0xE9,0xE7,0xBE,0x79,0xFB,0xD5,0x58,0x75,0x21,0x7E,0x6D,0xF7,0x74,0xCB,0x28,0x52, +0x1C,0x47,0xB6,0x52,0xF2,0xA6,0xA0,0x37,0xFE,0xE3,0xA6,0xC1,0xAB,0x56,0x40,0x27,0x69,0x15,0xD7,0x27, +0xF2,0x06,0x47,0x5C,0x71,0xCB,0x80,0x0B,0x18,0x45,0x5C,0x80,0x4B,0x08,0x5D,0xD1,0xA7,0x6F,0x8B,0x1F, +0x09,0xE4,0x19,0x59,0xDD,0x93,0x7C,0x0E,0xE9,0x8B,0x87,0x4B,0xB9,0x77,0xCB,0x29,0xF3,0x57,0xED,0x6B, +0x86,0xF5,0xB3,0xE9,0xAA,0x49,0x9C,0x7E,0x3D,0x35,0x62,0x3C,0xCB,0x3C,0x5A,0xFC,0xC1,0xBD,0xB6,0xFA, +0x04,0x4B,0x37,0x6F,0x27,0xD7,0x93,0x21,0x50,0xE1,0x70,0x09,0x24,0xDB,0x6B,0x36,0x47,0x49,0xB0,0x57, +0x00,0x96,0x4C,0x3D,0xD1,0x27,0xCF,0x22,0xFF,0x2A,0x96,0xBB,0x68,0xA1,0x8A,0x59,0x52,0xDD,0x5A,0x64, +0xA3,0x8F,0x72,0x72,0xD6,0x00,0x23,0xAB,0x8F,0x80,0xF7,0x2F,0x67,0x8C,0x0C,0xC8,0xB4,0x12,0x8B,0x0F, +0x75,0x3B,0xD4,0x78,0x2B,0x8F,0xFD,0x70,0x78,0xBF,0x41,0x96,0x75,0xE3,0xED,0xDD,0x44,0xC1,0x19,0x0E, +0x8D,0x3E,0xF3,0x6D,0x64,0x80,0xF7,0x16,0x01,0x0C,0xA5,0xC8,0x23,0x3C,0xA4,0xF2,0x42,0x2C,0x14,0xF7, +0x4C,0xB1,0x02,0xC2,0x00,0xBF,0xC6,0xF3,0x9B,0x14,0x0C,0xE3,0x59,0xB0,0x5E,0xEB,0xBC,0x70,0x35,0x43, +0xED,0x10,0x09,0x2F,0x98,0x20,0x7B,0x86,0x84,0xC9,0x05,0x7A,0xB6,0x68,0x6B,0xA7,0x01,0xD1,0x05,0x5E, +0x7F,0xDF,0x9A,0x6E,0x54,0xB0,0xF3,0x93,0x50,0xB0,0x23,0x8C,0x92,0x53,0xFF,0xB5,0xD5,0x7E,0xBE,0x33, +0xA6,0x99,0xFA,0xF9,0x5A,0x39,0x29,0x0A,0x96,0xB7,0x7F,0xBB,0xCF,0x88,0x74,0x3E,0x8F,0x18,0xF6,0x64, +0x1F,0x77,0x9C,0xE5,0x94,0x88,0x82,0x54,0x71,0x73,0x17,0x96,0x49,0x72,0xD7,0xD6,0x59,0x72,0xE2,0x49, +0x11,0xE9,0x45,0x14,0x8E,0x01,0xB0,0xD9,0x06,0xB8,0x5C,0x91,0xB0,0xD7,0x75,0x93,0x1E,0x5B,0xFD,0x15, +0x52,0xFB,0x15,0x76,0x4B,0x1A,0xAF,0x7F,0xB4,0x79,0x00,0x91,0x93,0xC5,0xED,0x8B,0xD9,0xC7,0xFB,0x24, +0xC2,0x7D,0xA7,0x6F,0xB5,0x78,0x5E,0x81,0x82,0x1D,0x0E,0xCE,0xB3,0x88,0x90,0x7A,0x2C,0x91,0xF9,0x8B, +0x59,0xB9,0x41,0x91,0x1B,0xD1,0x7B,0x32,0x09,0xAC,0x9F,0xFB,0x56,0x90,0xBC,0x7F,0x52,0x34,0x45,0x16, +0x9B,0xF4,0x60,0xCF,0x33,0xAA,0x10,0xC0,0x8F,0xB3,0xC0,0xF1,0xD3,0xCD,0x6E,0xD6,0x00,0xA9,0x12,0x69, +0x39,0x1C,0x28,0x68,0xC0,0xDE,0x59,0xED,0x9A,0xBC,0xF7,0x86,0xFE,0xD0,0x80,0x5C,0x25,0x3D,0x95,0x8E, +0x43,0xDD,0xB5,0x98,0x03,0x93,0x85,0xA6,0x17,0x22,0xC7,0x8F,0xFE,0x5B,0x71,0x68,0x61,0x7C,0x6B,0x2E, +0x3F,0xB2,0x22,0x13,0x68,0x52,0xEB,0x0C,0x79,0x7B,0x25,0x45,0xA5,0x5F,0x8D,0x48,0xE1,0xFC,0x89,0xD3, +0xE7,0x80,0x07,0x1A,0x52,0xEA,0x95,0xE3,0xA6,0x41,0x90,0xEC,0xB9,0xAC,0x62,0xBB,0x79,0x6E,0xEA,0x12, +0x3E,0xEE,0x95,0x61,0xA0,0x7D,0x0C,0x78,0x09,0xE3,0x51,0x0C,0xFF,0x83,0x94,0x39,0xFA,0x16,0x1B,0x23, +0xC0,0x2C,0xD6,0x93,0x8E,0x4E,0x99,0x41,0xA7,0xDF,0x39,0xB5,0x69,0xD8,0x37,0xAD,0x93,0x59,0x40,0x34, +0x74,0xE5,0xC9,0xF1,0x6C,0xCE,0x30,0x4A,0x58,0x19,0x16,0xE3,0x17,0xC8,0xEC,0xA5,0x93,0x28,0xA8,0x35, +0xFA,0x63,0x43,0xC7,0xDB,0x4A,0xC8,0xAB,0x4E,0xCB,0x21,0x6E,0x66,0x27,0x73,0x4D,0xEC,0xB3,0xE7,0x61, +0x3D,0xA2,0x17,0xE7,0x05,0x83,0xBB,0x72,0x91,0x96,0xA9,0x9C,0x72,0x61,0x5D,0x8F,0xD7,0x5C,0x82,0x78, +0x6E,0xB4,0x4E,0x71,0xDE,0xA8,0x4C,0x2D,0x68,0x43,0x22,0x1E,0xCF,0x47,0x97,0xEB,0xAE,0x49,0xF3,0x08, +0xB8,0x28,0x00,0x8A,0xDC,0x66,0xC4,0x39,0x79,0x68,0x5D,0x0C,0xA8,0x75,0x18,0x9D,0x94,0xEB,0xA6,0x06, +0x27,0x8E,0x13,0x5D,0xBE,0x06,0x19,0x2B,0x2D,0x24,0xAB,0xE0,0x8F,0xE6,0x9F,0x1F,0xA5,0xC6,0x41,0xCC, +0x59,0x66,0x6D,0x28,0x00,0xEE,0x0B,0xCC,0x32,0xB6,0x26,0x84,0xC3,0x61,0xFA,0x51,0xDA,0x33,0x3A,0x3A, +0x19,0x20,0xF9,0xBE,0x5E,0xA9,0xA8,0x09,0x25,0x6B,0x6D,0x81,0xEA,0x3E,0xA7,0x9B,0x86,0x27,0x23,0x63, +0xD2,0x27,0xA1,0xF8,0xE8,0x61,0x33,0x7A,0xFA,0x93,0xFC,0x6A,0x2E,0x0E,0x3E,0x2D,0x74,0x5E,0x2F,0x88, +0xA5,0x42,0x00,0x5B,0x0A,0xB2,0x72,0xB3,0x1C,0x3F,0x96,0xBF,0xCB,0x1D,0x90,0x86,0x07,0x0A,0x4F,0xE1, +0x50,0x04,0x52,0x95,0x01,0x0D,0x92,0xAA,0xFD,0xF8,0x06,0x02,0xF4,0x7E,0x31,0xD0,0x9E,0x12,0x85,0xF1, +0xC6,0xAE,0xDD,0x3F,0x43,0xF3,0x23,0x8B,0x0F,0x96,0x22,0xBC,0xD6,0xE9,0x12,0xC9,0x38,0x6E,0xD5,0xA5, +0x7D,0xBC,0x99,0x97,0x0E,0xB7,0xBC,0xD1,0x1E,0xE0,0x1A,0x73,0x9B,0x15,0xB6,0xE3,0x30,0x85,0x8B,0x20, +0xC7,0x0B,0xC0,0x84,0x9D,0x25,0x97,0x95,0xDA,0x33,0x4C,0xA4,0x55,0xD4,0xC7,0xBC,0xFA,0x28,0x46,0xB1, +0x79,0x5A,0x4C,0x3C,0x47,0xC5,0xD6,0xF7,0x7E,0x19,0xB5,0xEB,0x7E,0x8A,0xAD,0xF2,0xC5,0x42,0xBD,0xAD, +0x6D,0xB4,0x2D,0xFE,0x20,0xB1,0xD0,0x71,0x67,0xDC,0x6E,0x85,0x1C,0xE6,0x8B,0xE5,0x47,0x97,0xB5,0x7D, +0x44,0xF9,0x68,0x48,0x68,0x75,0xD6,0xAC,0x2F,0xBA,0xBE,0xA4,0x19,0x6C,0x51,0xD9,0xC8,0x30,0x06,0x40, +0xC1,0xD4,0x6A,0x4D,0x1F,0x54,0xA7,0x09,0x10,0xA1,0x9F,0x71,0x10,0xB7,0x67,0x2F,0xF4,0xB6,0xA2,0x7E, +0x34,0xF5,0xBA,0xD4,0x50,0xE7,0x8F,0x0D,0x79,0xFA,0x40,0xC4,0x85,0xD6,0xEF,0xDF,0xBF,0xE0,0x6E,0x4A, +0xC7,0x5F,0xF4,0x4A,0x38,0xED,0x4E,0x15,0x60,0xBE,0x88,0xC7,0x95,0xAD,0x38,0x6B,0xD8,0xF3,0x41,0xB1, +0xE2,0x61,0x46,0xFE,0x46,0x0A,0x25,0xF1,0x79,0xAC,0x75,0x81,0x51,0x13,0x61,0x7D,0xF3,0x5E,0xB3,0x3B, +0xB0,0xDF,0x89,0xC2,0x81,0xE8,0xD2,0x44,0x1A,0x49,0x56,0x81,0x9B,0xD3,0x41,0x5B,0xCC,0x6C,0xB5,0xE1, +0x8F,0x0B,0x17,0xF8,0xBC,0xBB,0x79,0xEF,0xA3,0x62,0x72,0x20,0x43,0x71,0xA8,0xE3,0x92,0x60,0x94,0x2F, +0x23,0xD4,0x39,0xB1,0xA9,0x62,0xA1,0x95,0xB6,0xCA,0x58,0xBC,0x05,0x6C,0x41,0x2E,0xE1,0x57,0x80,0x0E, +0x2C,0xA1,0xAC,0x10,0x61,0xBD,0x99,0xE0,0xB3,0xB3,0x9E,0x95,0xA7,0x13,0xB8,0xB4,0x1C,0x61,0x59,0x0C, +0x2A,0x07,0xC1,0x78,0xB2,0x7A,0xA4,0xB0,0x33,0x35,0x78,0xBB,0x21,0xAE,0x68,0x9F,0x21,0xE7,0x84,0x96, +0x73,0x9D,0x11,0x4B,0xA6,0xFA,0x37,0x96,0xB2,0x3A,0xE7,0x92,0x20,0x5C,0x3A,0x4F,0x71,0x27,0x38,0x27, +0x69,0x57,0x79,0xBB,0x6F,0xFE,0x44,0xE5,0xD0,0x2F,0xE6,0x58,0xD4,0x54,0x74,0x16,0x5D,0x0F,0x76,0xB3, +0x13,0x17,0x4C,0x9B,0x2A,0x16,0x9C,0x57,0x5C,0xCA,0xA5,0xA0,0xDC,0xEB,0x87,0x81,0x19,0x0A,0x48,0x07, +0x4E,0x79,0x84,0x04,0xEB,0x25,0x30,0xEB,0x6B,0xA6,0x1F,0xEF,0x2D,0x86,0x65,0x4B,0x2B,0xB8,0x22,0x5E, +0xA6,0xC4,0x24,0xBD,0x58,0xA9,0xB9,0xFE,0xAC,0x85,0x40,0xD6,0x29,0xD5,0xED,0x01,0xDE,0x78,0xDF,0xEA, +0xAF,0xA4,0x1E,0x9F,0x00,0x54,0x65,0x89,0x20,0x28,0x0A,0xDD,0xCF,0x70,0x0C,0x3B,0x3E,0x86,0xC4,0x65, +0xF3,0x1D,0xAA,0x0B,0x50,0xC7,0x02,0xFE,0xF8,0xC1,0x5F,0xB0,0xD3,0x40,0xAA,0x4D,0x2B,0x08,0x62,0x8A, +0x68,0xF6,0x13,0x0F,0x39,0xEB,0x3B,0xA9,0xD7,0xA1,0x6F,0xDF,0xC6,0x26,0x9E,0xED,0xD8,0x9E,0x87,0xFF, +0xD2,0x64,0xB4,0x2A,0xB3,0x63,0xF1,0x79,0x47,0xBE,0x9B,0xF1,0x9B,0x42,0xAB,0x0E,0xF5,0xE9,0x5E,0x82, +0x93,0xC9,0x14,0x6C,0xB1,0x7D,0xC2,0xD3,0x06,0xF6,0xEA,0x88,0x8F,0xFB,0x19,0xE3,0x19,0x1A,0x34,0x24, +0x7D,0xEE,0x4A,0x23,0x4B,0xFE,0xDD,0xD1,0x90,0x7E,0x64,0xC1,0xB0,0xB2,0x97,0x47,0x4F,0x20,0xC5,0x52, +0x86,0xFF,0xC3,0x94,0xC0,0x30,0x8D,0x80,0x91,0x51,0x21,0xE6,0xC9,0xC5,0x4B,0x8E,0x83,0x86,0xC7,0xDD, +0x99,0x62,0xF3,0xE9,0x24,0xFE,0x04,0x4C,0x1F,0x39,0x2C,0x11,0xC1,0x14,0x86,0x1F,0x9B,0xD7,0x8C,0x58, +0x78,0xE8,0xD9,0x50,0x21,0x37,0x01,0x74,0x71,0xA7,0xE3,0x6B,0x82,0xA3,0x40,0x45,0xB0,0x16,0xDD,0x65, +0xD1,0xE7,0x6B,0xC9,0x60,0x23,0x83,0x40,0x01,0x18,0x35,0x21,0xC9,0x26,0xF5,0x35,0xDF,0x8B,0xA2,0x82, +0xDB,0x15,0xD5,0xEC,0x3B,0xA6,0x13,0xC7,0x2E,0x29,0xB8,0xB4,0xEE,0x32,0xC2,0x93,0x4E,0xCD,0xEF,0xDF, +0x4C,0x37,0x54,0x9A,0x9A,0xC4,0xB6,0xDB,0xFB,0x69,0xDE,0xB1,0xAD,0xAC,0xE6,0xAD,0x49,0xD4,0x54,0x4E, +0x62,0xCB,0x04,0x0F,0x21,0x45,0x43,0x2B,0x75,0xF9,0x57,0x25,0x5D,0x87,0x15,0x9B,0x3B,0x13,0xC7,0x91, +0x18,0xBB,0x4E,0x87,0x87,0xEE,0x8E,0xCD,0xA5,0x70,0x86,0x40,0x07,0x91,0xFB,0x97,0x3C,0x0E,0x17,0xC1, +0x9F,0x53,0x81,0xC3,0x06,0xC9,0x14,0x15,0x2D,0x0F,0x0E,0x55,0x9B,0x90,0x26,0xFC,0x82,0x4C,0xC9,0xFE, +0x67,0xD9,0x3F,0x21,0x32,0xDE,0x25,0x96,0x03,0x82,0xE3,0x96,0x49,0xF5,0x07,0xD7,0xD0,0x8B,0xCC,0x29, +0x54,0x10,0x9D,0xEC,0x9D,0xC0,0x9F,0x71,0xB9,0xA0,0xC8,0x44,0x47,0x7C,0x74,0xED,0xB3,0xEC,0xD8,0x84, +0x89,0x00,0xE3,0xD1,0x6A,0x7D,0xD4,0x40,0x77,0xA0,0x4E,0x77,0x04,0xC1,0xB2,0xEE,0x15,0x1A,0x03,0x83, +0x6F,0x6E,0x07,0x56,0x19,0xFA,0x9C,0x90,0xE5,0xDF,0xD9,0x39,0xB9,0x57,0x67,0x87,0x2F,0x81,0xF0,0x41, +0xF5,0x82,0x0D,0xA1,0x83,0xB2,0x2B,0x93,0xD1,0x1F,0x6D,0x3E,0x7B,0xC3,0x1A,0x51,0xD0,0xB2,0x87,0x02, +0x02,0xA9,0x20,0x1E,0x81,0xA2,0x9C,0x8A,0xD6,0x02,0xF4,0xA6,0x55,0x51,0x50,0xB2,0x69,0x0E,0xFF,0x71, +0xB6,0x0A,0x6D,0xF6,0x55,0x3F,0xB0,0x7D,0x83,0x46,0x24,0xC7,0x94,0x7C,0x54,0xC7,0x37,0x09,0x79,0x86, +0x27,0x69,0xE2,0x58,0xAE,0xA4,0xFA,0x7A,0x81,0x95,0x7A,0xA7,0x68,0x08,0x41,0x93,0xEE,0x85,0x5E,0xC3, +0x2F,0x76,0x8F,0x8E,0x34,0x1B,0x4E,0x7D,0x24,0x5E,0x36,0x26,0xC4,0xA9,0x92,0xA2,0x37,0xB9,0xD5,0x68, +0xDB,0x56,0xAB,0x6D,0x21,0x5F,0x68,0xC9,0x7F,0x64,0x7E,0x4D,0x69,0x63,0xDC,0x4C,0x6D,0x7C,0x9D,0x27, +0x4A,0xA0,0x9F,0x58,0xFE,0x6C,0xB7,0x5D,0x23,0xEE,0xC7,0x64,0x47,0x5A,0x95,0x33,0x4B,0xA3,0xED,0xA8, +0xE3,0x64,0xC3,0x5F,0x85,0x66,0x22,0x28,0x4C,0x83,0xB6,0xBD,0x38,0x03,0x33,0x6A,0x48,0xDE,0x45,0x52, +0x58,0xE6,0xAA,0xD2,0x0D,0x80,0x3C,0xAD,0x2D,0x20,0xE9,0x4B,0x77,0x8F,0x05,0x0D,0x75,0x3E,0x39,0x77, +0xE6,0xBF,0x37,0xBC,0xFC,0x01,0x3C,0x14,0x6D,0x45,0xD6,0x1C,0xF8,0x1F,0x69,0xB9,0x77,0x9E,0x96,0xAF, +0xF5,0x9E,0x3A,0xFB,0xAC,0xEF,0x00,0x0C,0xB9,0x4E,0x25,0x93,0x18,0x3D,0xDC,0x84,0x7C,0x3D,0xE6,0x98, +0x0E,0xD6,0xD5,0xD4,0x9F,0xE1,0xBD,0xE1,0x00,0x2E,0xCC,0xDD,0x8A,0xBC,0x9E,0x30,0xF0,0xDE,0xF1,0xF6, +0x71,0xDC,0xB0,0x63,0xA0,0x32,0xC5,0xCC,0x0B,0xBD,0x98,0x02,0xE2,0xE2,0x8B,0x8F,0x79,0x54,0x76,0x93, +0x78,0xEE,0xDF,0x9B,0xF1,0xB5,0x05,0x4C,0x04,0x4C,0xFA,0x33,0xE7,0x63,0x58,0x4B,0x6E,0xA5,0xDA,0x63, +0x5C,0x97,0x4A,0xCB,0x60,0xC6,0xC3,0x56,0x86,0x97,0x26,0xCF,0x06,0xF5,0xBD,0xA8,0xFD,0x56,0xC3,0x10, +0x04,0x72,0xBA,0x06,0x03,0x54,0x49,0x4A,0x4F,0xC7,0x1E,0x80,0x4B,0x10,0x20,0x9D,0x45,0xB3,0x42,0xDB, +0xF0,0xBE,0xA1,0xFF,0x04,0x6B,0xA5,0xDF,0x2F,0x46,0xBD,0x7B,0xB3,0xDA,0xEE,0x73,0xE5,0xF5,0x89,0xD4, +0x99,0x44,0x0B,0x9F,0x5F,0x8A,0x49,0x54,0xD0,0xCB,0x8E,0x4E,0x78,0xD5,0xB6,0xDD,0x23,0x66,0xBF,0x6E, +0x57,0x18,0x0F,0x0B,0x6B,0x39,0xFF,0xA2,0xDC,0xC6,0xE7,0x9F,0x75,0x37,0xDF,0xAB,0x5D,0x15,0x86,0x1E, +0x54,0x19,0xF2,0x5F,0xE3,0xB8,0x83,0xE0,0x73,0x06,0xBE,0x1B,0xAF,0xD2,0xC4,0xC9,0xD2,0xDF,0xC5,0x5F, +0xF9,0xD7,0x5B,0x95,0x28,0x86,0xC3,0x6E,0xEA,0x5F,0x89,0x1A,0xFC,0x7D,0xAC,0xEF,0xDD,0xBD,0xD9,0xF2, +0x29,0x05,0x69,0x99,0xD6,0xFE,0x24,0x92,0x07,0xEC,0xED,0x7A,0x6E,0x88,0x52,0x90,0x17,0x22,0x40,0x67, +0xA6,0x89,0x62,0x01,0x13,0x91,0xCD,0x11,0x0B,0x7F,0xE1,0x5F,0xBD,0x0F,0x95,0x3F,0xB3,0x12,0x06,0x91, +0x6E,0xD2,0x0C,0x7F,0x10,0xBE,0xA7,0xA9,0xE1,0xAF,0x40,0x10,0xAE,0x8D,0x28,0xDB,0xB3,0x02,0x9D,0x1F, +0x26,0xF5,0x5D,0x03,0x24,0x0E,0x48,0x01,0x35,0x4D,0x20,0x4F,0xC0,0x4C,0x08,0x46,0xEE,0x3E,0x56,0xF2, +0xF6,0xAF,0x8D,0x34,0x31,0x9D,0x97,0xDF,0x35,0x4E,0xC6,0xA1,0x8D,0x1E,0x3B,0x02,0x22,0xF0,0x34,0x8A, +0x6E,0x7E,0xAA,0x9C,0x3D,0xD0,0xE4,0xB1,0xA9,0x75,0x77,0xE1,0xFB,0x67,0x50,0x44,0x12,0x24,0x2E,0xD0, +0xB3,0x97,0xAD,0x83,0xF5,0xE4,0x77,0xCF,0x60,0x01,0x59,0x54,0x21,0x25,0x0C,0x4B,0x69,0xF8,0x5B,0x74, +0x01,0x65,0x27,0x23,0x71,0x6A,0x42,0x45,0xC0,0x26,0x2F,0xC4,0x0A,0xFC,0xD0,0x65,0xD2,0x66,0x30,0x29, +0x11,0x0D,0x43,0x55,0xD0,0x27,0x8D,0xE2,0x62,0xD8,0xCC,0x75,0xBD,0x67,0x7C,0x48,0x63,0x20,0x61,0xCE, +0x9C,0x26,0xBF,0x57,0xD5,0x0A,0xC9,0x2C,0x30,0xD2,0x1D,0x1E,0x6B,0x7C,0xF2,0x98,0x69,0x7F,0xE5,0xFA, +0xE8,0x96,0x35,0x0C,0xAE,0xC6,0x87,0x7A,0xB2,0x48,0x27,0xEF,0x34,0xD7,0x04,0xB6,0x4B,0x47,0x6C,0x57, +0xB2,0x65,0x75,0x1E,0x28,0xA4,0xB3,0xE3,0x35,0x26,0xDB,0x65,0x40,0xF7,0xC9,0x42,0xBB,0x94,0x16,0x3B, +0x20,0x86,0x5A,0x4C,0x39,0x2C,0xBE,0x13,0x80,0x96,0xDC,0x6C,0x55,0x6C,0x4F,0xDC,0x7B,0x72,0xAF,0x5C, +0xF7,0x2D,0x3B,0xB8,0x22,0x0F,0x81,0x7C,0xCF,0x6D,0x47,0x38,0xAC,0x05,0x18,0x4D,0x4A,0x2E,0x09,0x6B, +0x79,0xD7,0xCB,0x6D,0xAF,0x6E,0x73,0x9E,0x49,0x0F,0xBD,0x5D,0x16,0x2F,0x48,0x96,0x6A,0xC6,0xBA,0x7D, +0x33,0x6F,0x51,0x04,0x73,0xBF,0x80,0xE5,0x36,0x81,0xEB,0xD3,0x56,0x3C,0xCE,0x5B,0x1A,0x13,0x04,0x00, +0xC8,0x22,0x14,0x7B,0x06,0x31,0x06,0x81,0x5B,0xFE,0x5C,0x8D,0x20,0x33,0xBA,0x46,0x62,0xB2,0x95,0xC5, +0xB2,0x9F,0xF2,0x61,0xAE,0xD9,0xEB,0x00,0x70,0x82,0x6F,0x81,0xA0,0x63,0xD2,0x15,0xC2,0x86,0xBD,0xC3, +0x83,0x86,0x8E,0x9B,0x50,0x2C,0x64,0x6E,0x9B,0x7A,0xB0,0xC5,0xCC,0x14,0xD6,0xFA,0x75,0xE0,0xB4,0xE5, +0xA4,0x54,0x71,0x2B,0x50,0x15,0xF5,0xD5,0xD4,0x75,0x05,0x19,0xC6,0xE3,0x72,0xF5,0xB8,0x55,0x27,0xC1, +0xA3,0xE6,0xEE,0xC4,0x25,0x16,0x98,0xE3,0xAC,0x38,0x60,0xE4,0x48,0x56,0xE2,0xBE,0x7E,0xCB,0xCF,0xD1, +0xB5,0x77,0x66,0x81,0x63,0xF8,0x65,0xF4,0x50,0x57,0x38,0xE9,0x48,0x67,0x59,0x0C,0x4F,0xED,0x68,0xAF, +0xC9,0xDF,0x22,0xCE,0xC7,0x43,0xE9,0xD8,0x25,0xB2,0xD9,0xA3,0x4F,0x8C,0xA4,0x81,0x92,0xD4,0xCA,0x2D, +0x53,0x7D,0xF8,0xFA,0x92,0x74,0x07,0x4C,0x30,0xEF,0x13,0xA1,0xDB,0xEE,0x93,0xAF,0xBC,0xD8,0x03,0x88, +0x48,0xB4,0x17,0x65,0xB9,0x79,0x4C,0x43,0xEF,0xCA,0x32,0x39,0x81,0x6D,0xFF,0x96,0x2C,0xFC,0xD6,0xC8, +0x4E,0x7C,0x2E,0x60,0xCF,0xD5,0x2D,0xE8,0x2A,0x3C,0x01,0x08,0x23,0xA2,0x87,0x32,0xCC,0x4D,0x58,0x82, +0xCC,0x4D,0x88,0xF8,0x76,0x3D,0xD7,0xCB,0xBE,0xB3,0x94,0xC9,0xAF,0x7E,0x77,0x7A,0x49,0x56,0x16,0xE9, +0x96,0x3E,0xF8,0x04,0xAD,0xD5,0x4A,0xC8,0xB3,0xA0,0x60,0x1F,0xED,0xEE,0x93,0xF9,0xA4,0x3F,0xF5,0x25, +0xA5,0x2F,0x5F,0xC1,0xD6,0xA0,0x8F,0x79,0x95,0x1D,0xCE,0x83,0xBD,0x5A,0x10,0xED,0xEC,0x72,0x88,0x56, +0x1B,0xBA,0x30,0x3A,0x43,0x50,0x14,0x45,0x7F,0x68,0x72,0x70,0x85,0x23,0x1A,0x77,0x14,0x24,0x1A,0xA7, +0xBC,0xC3,0xA3,0xD9,0x3F,0xC1,0xE9,0x2B,0x56,0x2E,0x88,0x61,0x6E,0xE1,0xD8,0x51,0x36,0xA6,0x99,0xA5, +0x55,0xEB,0x68,0x4E,0x4E,0x07,0x8C,0x46,0xC9,0xA4,0x78,0x02,0x17,0x86,0x04,0x66,0xDF,0xE4,0x6E,0xF7, +0x87,0xC7,0xED,0x57,0x59,0x85,0xC9,0x10,0xB0,0xA0,0x41,0x76,0xE4,0xC5,0x5F,0xF3,0xA5,0x44,0xDE,0x47, +0x29,0x86,0x66,0x3B,0xC0,0x57,0x5E,0x67,0x0D,0xE6,0xA9,0x6A,0xD6,0xC5,0xFF,0x56,0xB9,0x87,0x41,0x34, +0x59,0x38,0x7B,0x76,0x95,0xC7,0xBA,0xE5,0x3B,0x88,0xB5,0x25,0x1F,0xF8,0x0A,0xD1,0x6E,0x18,0xA1,0xAA, +0x2C,0x97,0xEA,0xDB,0x85,0x92,0x79,0x60,0x77,0x1A,0x58,0x3E,0x4C,0x88,0xB2,0x22,0x3E,0x36,0x7C,0x8B, +0xFF,0x5F,0x1C,0x3E,0xEA,0x05,0x26,0x58,0xFA,0xA4,0x8B,0xE8,0x1E,0xEA,0x75,0x6D,0x76,0x7E,0xD5,0xA6, +0xD5,0xF8,0x05,0x5F,0xAD,0x14,0xAD,0x8F,0x36,0x68,0x71,0x64,0xAF,0x53,0xEE,0x4F,0x43,0x8C,0xC9,0xE4, +0x97,0x31,0xE6,0x6F,0x22,0xCC,0xD1,0xF6,0xB8,0xBD,0xB7,0x5F,0xD3,0x8D,0x1C,0xB7,0xA6,0x97,0xB7,0x7F, +0x3A,0xCD,0xD7,0x29,0xB2,0xF1,0xAC,0x4E,0xA3,0x8E,0x5C,0x91,0x41,0x73,0xA4,0x6E,0xC3,0xCE,0x4B,0x4B, +0xC7,0xAC,0x8D,0x5E,0x33,0x8F,0xBB,0x42,0xDD,0xC7,0xA1,0x7E,0x5B,0xCF,0xF5,0xF1,0x12,0xFC,0x22,0xA2, +0xE0,0x03,0xD5,0xE0,0xE8,0xDC,0xEF,0xA6,0x1C,0x2A,0x38,0xD6,0x23,0x00,0xBA,0xF4,0xCA,0x1C,0x04,0x5D, +0x8C,0x82,0x13,0x86,0x7D,0x5E,0x43,0xE7,0xA5,0xD2,0x02,0x3B,0x5D,0xBA,0x95,0xC1,0x53,0xB7,0x4A,0xDD, +0x9E,0xFD,0xCC,0xF1,0x52,0xF6,0x7A,0x32,0x42,0x4E,0xFD,0x8A,0x61,0x50,0xEF,0xC5,0x8B,0x5C,0xC6,0x8C, +0xD3,0xC8,0x99,0x30,0xD1,0xAB,0x7F,0x66,0x16,0x81,0xEF,0xE2,0x41,0xB4,0x8E,0xB4,0xA8,0x13,0x10,0x20, +0xC8,0xA5,0x04,0x76,0x17,0xAA,0xCE,0xF2,0xDD,0xB5,0xC8,0xBC,0x3B,0x8D,0x98,0x30,0x59,0x39,0x4E,0x01, +0x4A,0x6B,0xD4,0xE3,0x30,0xB6,0x69,0x93,0xB7,0x1C,0x68,0xCE,0xFF,0xE8,0x27,0xB3,0x44,0x5C,0x0A,0xF3, +0x2E,0xB7,0x1E,0x65,0x2A,0x29,0xB4,0x0E,0x83,0x65,0x01,0x59,0xE0,0xD5,0x62,0xDD,0x27,0x72,0x16,0x64, +0x81,0x94,0x13,0xC1,0xCA,0x12,0xC1,0xC4,0x1F,0x06,0x75,0xAE,0x96,0xDA,0xC0,0x09,0x31,0x06,0xF5,0x20, +0x0B,0x46,0xCC,0x8C,0x4D,0x6B,0xB3,0x5C,0xDA,0x57,0xD0,0xE5,0x83,0x3D,0xA6,0x9F,0x75,0xF2,0x64,0xBB, +0x96,0xBB,0xE6,0xB1,0x18,0x04,0x1F,0xE7,0x91,0x17,0x9A,0x2D,0x8D,0xFC,0xF6,0xDB,0x0C,0x73,0x1B,0xEA, +0xCF,0xBC,0x79,0x50,0xDB,0x92,0xE8,0xCF,0x2B,0x6D,0x00,0x5F,0x27,0xFE,0x3E,0xFB,0x5F,0x9D,0x98,0x67, +0x19,0xDC,0x60,0x5E,0xBC,0xEE,0x25,0x99,0x84,0xBD,0x0D,0xEA,0xBE,0x9E,0x34,0xDB,0xC7,0x25,0xAF,0xC6, +0xAF,0xFF,0x79,0x5A,0xE6,0xEB,0xE8,0xFA,0xC1,0x9F,0x0D,0x05,0x4F,0x60,0x44,0xFA,0xE9,0x42,0xF1,0x42, +0xBF,0x2C,0x6F,0xA6,0x9D,0xFC,0x28,0x15,0xD5,0x61,0xB0,0x29,0xAE,0x27,0xA7,0x01,0xE0,0xC0,0x36,0x7B, +0xF0,0xE2,0x1F,0x04,0xA7,0x62,0x7E,0x87,0x5D,0x1E,0x73,0x3C,0xC3,0x2A,0xA9,0x18,0x73,0x64,0x6A,0x14, +0x39,0x63,0x27,0x5F,0x30,0xF0,0xCC,0xC2,0x45,0xCE,0x99,0xD7,0xD7,0x52,0xD1,0x51,0x76,0x00,0xEC,0x99, +0x36,0xD0,0x2E,0x4D,0xBF,0x06,0x2B,0x8C,0x1E,0x26,0x88,0xD9,0x1D,0x47,0x98,0xA4,0x9F,0xD4,0xE7,0xB7, +0x89,0x74,0x71,0x3B,0xAE,0x19,0xFD,0xC5,0x90,0x3D,0x52,0x5E,0xEE,0x52,0x14,0x32,0xC3,0xD6,0xD4,0x5D, +0x47,0xBB,0x08,0x04,0x22,0xF8,0x09,0xFD,0x90,0x88,0x51,0x75,0x1F,0x76,0x19,0xDD,0xBB,0x3A,0xF4,0x0D, +0xC1,0x17,0x7B,0x8E,0xD5,0xA4,0x40,0x66,0x4E,0x79,0xEC,0xEB,0xDA,0x84,0x72,0xFA,0xAE,0x66,0x3E,0x7E, +0x17,0x58,0xC8,0xF8,0x01,0x94,0x34,0x73,0xF8,0xCF,0xFE,0x0D,0x37,0x65,0xBB,0x4A,0x96,0xF5,0x44,0xD6, +0xCE,0x1B,0xB8,0x4F,0x06,0x6C,0xF7,0xFE,0x62,0xA4,0x74,0x73,0xEF,0x47,0x63,0x1E,0x34,0x44,0xE3,0x7D, +0xCF,0x29,0x78,0xB2,0xF1,0xD3,0x10,0xA4,0x21,0xE1,0xE5,0x45,0xCA,0x1C,0xAA,0x4B,0xE7,0x63,0x91,0x58, +0xE2,0xBC,0x2D,0xAF,0x3D,0x86,0x74,0x38,0x47,0xE9,0x5E,0x8D,0x31,0x92,0xEF,0xCD,0x92,0x7C,0x3C,0x0A, +0x73,0xED,0x6D,0x40,0xCC,0x7C,0xAD,0xDC,0x2F,0x67,0x03,0xD5,0x8D,0x1D,0x1F,0x40,0x19,0x53,0xCE,0x50, +0x83,0xBE,0x1B,0xD5,0xC0,0x62,0x00,0x84,0x60,0x50,0xBF,0x66,0x9C,0x8D,0xA0,0xDF,0xC3,0x56,0x5F,0x4C, +0x2B,0x32,0x8C,0x91,0x25,0x51,0x4C,0xBD,0x82,0x5F,0x64,0xB2,0xCF,0x57,0xC0,0xD6,0x9A,0x52,0x85,0x91, +0xE0,0x52,0xFD,0x07,0x30,0xEF,0x3B,0x2F,0x41,0xD2,0x90,0x49,0x72,0x76,0x0F,0x95,0xA5,0x53,0xB2,0x0A, +0x40,0x95,0x33,0x3E,0x40,0x8C,0x85,0x50,0x18,0x5A,0xAF,0x28,0x29,0x59,0x9A,0x74,0xCD,0xB9,0xAF,0x64, +0x78,0x26,0x02,0x24,0x36,0xD0,0xCC,0x52,0xA3,0xEC,0x60,0x47,0x1D,0x3D,0x24,0xC2,0x9C,0x39,0x8E,0xE5, +0x59,0xD5,0x55,0xA3,0xA6,0x3B,0xBB,0x64,0x5B,0x15,0x6B,0xC8,0x2A,0x55,0x83,0x50,0x3A,0x35,0x75,0x22, +0x81,0x1C,0x4D,0xB6,0x6E,0x75,0x63,0xDC,0x3D,0xA8,0x0D,0x96,0xB6,0x35,0x86,0x98,0x6C,0xF8,0xFE,0xCC, +0x50,0xB5,0xA2,0xCA,0x97,0x5E,0xD4,0x53,0x91,0x71,0x08,0x89,0x08,0xF1,0x3A,0x7E,0xBB,0x3D,0x26,0x88, +0xA8,0xF6,0x87,0xA3,0x58,0xDD,0x81,0x81,0xBC,0x6A,0xE7,0xDA,0x25,0x35,0xB9,0xE7,0x49,0xFB,0x95,0xEA, +0x26,0x72,0x5D,0xAC,0xFB,0xB9,0x30,0xFF,0x46,0x3D,0xBF,0xCB,0x8B,0xB7,0xD0,0x80,0x10,0x8A,0xC6,0xAB, +0x2E,0xB1,0x97,0xFD,0x9B,0xE3,0x68,0xC4,0xA0,0x53,0x87,0x9D,0xDB,0x83,0xE2,0x5D,0xC0,0xCC,0x75,0x92, +0x08,0xEF,0xA5,0x86,0xEA,0x50,0xD6,0xE8,0x7D,0x6E,0x88,0xF8,0x8B,0x9E,0x73,0xAF,0x05,0x62,0xAC,0x9B, +0xEC,0xBE,0xE9,0x58,0x75,0x88,0x69,0x04,0xDF,0xB2,0x77,0x22,0x52,0x7C,0xE0,0xBB,0x4A,0x8A,0xC1,0x8E, +0x95,0x70,0xDA,0xF0,0xE3,0x4F,0x64,0xF8,0xE9,0xC2,0xED,0x23,0x73,0x9C,0xA5,0xD5,0xD6,0x0C,0xD6,0xF9, +0xBA,0xFE,0x13,0xF4,0xB9,0x5C,0xD9,0x50,0x2E,0xCE,0x0C,0x49,0xF6,0xE2,0x5B,0xE4,0x6F,0x4D,0x5E,0x85, +0x5D,0xD4,0x6C,0xFA,0x46,0x6E,0x1C,0x54,0x77,0xED,0xD4,0xFC,0x76,0xFC,0xD1,0x95,0x58,0x2F,0xB9,0x01, +0x2E,0x87,0x7E,0x3A,0x50,0x11,0xED,0x00,0x8A,0x88,0xB0,0x24,0x54,0x0D,0x50,0xA0,0xBB,0xAA,0x0F,0x15, +0x3C,0x8A,0x40,0x30,0x01,0x97,0xC5,0xB8,0xB6,0x0A,0xC7,0x83,0x7B,0xC5,0xA9,0xBF,0xBE,0x46,0xC1,0x21, +0x79,0x7B,0x72,0xA7,0xD2,0xA0,0x13,0x63,0xC7,0x0C,0x16,0x27,0x92,0xA4,0x34,0x14,0x04,0x8A,0x3D,0x10, +0xA4,0xDC,0x07,0x5F,0x0F,0x7D,0x81,0x04,0xF1,0xEE,0x5F,0xFD,0xE3,0xB7,0x99,0xEC,0xB0,0x15,0x14,0xC8, +0xC0,0x8A,0xEB,0x38,0x3B,0xD8,0xD7,0xF1,0xB2,0x16,0x92,0xE4,0xB1,0xA4,0x42,0xBE,0x79,0x0A,0xF5,0x1A, +0xA0,0xAB,0xDE,0xF1,0x7F,0x15,0xDB,0x8D,0x55,0xDC,0xB5,0xA0,0x33,0x1F,0x6C,0x2B,0xDA,0x50,0xD0,0xE5, +0x7A,0x54,0xD4,0x9D,0x50,0x67,0x73,0x2A,0x38,0xC4,0xFA,0x81,0xDB,0xDB,0x85,0x88,0x8A,0x82,0x58,0xD1, +0xE1,0xB7,0xE5,0x19,0x32,0xA2,0xB3,0x29,0x94,0xFF,0xAA,0xD2,0x12,0x00,0x55,0xC0,0x5D,0x02,0xBA,0xF2, +0x02,0xC0,0x3A,0xBA,0xB3,0x30,0xC7,0xA9,0x0E,0x2E,0xF1,0x29,0x69,0xC2,0x15,0xB7,0xCD,0x06,0xBB,0xEA, +0x22,0xAD,0x13,0x4A,0xF3,0xAA,0xBA,0xAE,0xF1,0x50,0x84,0x09,0x3C,0x70,0x85,0xCE,0x52,0x49,0xA3,0x8F, +0x34,0x50,0x0A,0xDD,0x95,0x30,0x4A,0xA5,0x91,0xDF,0x58,0x35,0x23,0xFA,0x28,0x10,0xEC,0xC7,0xE4,0x14, +0xB5,0x4C,0x92,0xFC,0xC4,0x51,0x82,0x8A,0xFA,0x57,0x23,0x86,0xA0,0xD2,0xDD,0x40,0x6A,0xBA,0x81,0xDC, +0x47,0xD4,0xFE,0xB4,0xAB,0x23,0x77,0x92,0x06,0x95,0x95,0x15,0x78,0x0F,0x45,0xF4,0x27,0xB3,0xA5,0x77, +0xB3,0xB1,0xF7,0x05,0xEC,0x9D,0x48,0x59,0x37,0xC4,0xE5,0xDD,0x5A,0xA8,0xC5,0x46,0x93,0x9A,0xAC,0x5B, +0x16,0x18,0xF9,0xB0,0x0B,0xCA,0xD5,0x80,0xDC,0xCA,0x23,0x09,0x53,0x30,0x6D,0xC7,0x0F,0xD6,0xF5,0x52, +0xA6,0xAD,0xCA,0xAC,0x73,0x0B,0x93,0x52,0xF5,0x96,0x92,0x20,0x9F,0x33,0xD7,0x7B,0x00,0x42,0x15,0x91, +0x18,0xD9,0x2B,0xC8,0x95,0xB6,0x8F,0x27,0x8D,0x67,0xDE,0xAE,0x62,0x10,0x7E,0xAE,0xC4,0xEF,0xF3,0xC6, +0x0B,0xF8,0xCB,0xC5,0x8E,0xFC,0x94,0x1C,0xF0,0x05,0x90,0xEC,0xCC,0x46,0xA8,0x93,0x96,0x88,0x93,0xE9, +0x2E,0x36,0x4F,0x12,0x3C,0xA9,0x6D,0xAF,0x4F,0xDC,0x77,0x27,0xE1,0xF7,0x90,0x79,0x2F,0x37,0xD7,0x77, +0x73,0xF6,0x8B,0xD9,0x16,0x46,0x85,0x0E,0xC9,0x54,0x29,0xF7,0xC7,0x6D,0x34,0xDF,0x58,0xFE,0x4E,0x14, +0x68,0xCC,0xDE,0x8C,0xFF,0xF2,0x7B,0x5E,0x3D,0x01,0xD4,0x35,0x8C,0x22,0xC1,0x18,0x27,0x2C,0xB1,0xE0, +0xFC,0xF3,0x8B,0x58,0xF9,0x94,0x70,0x15,0x62,0x1D,0x52,0x6F,0xFC,0x42,0xA9,0x2D,0xEE,0xBC,0x57,0x2A, +0x9B,0x9F,0x90,0x21,0xB9,0x5F,0x5F,0x5C,0xA7,0x0E,0x97,0x9D,0xD9,0xFF,0x10,0xA9,0x04,0x21,0xF2,0xE2, +0x00,0x6D,0xA8,0x40,0x13,0x02,0x86,0x09,0xBB,0x24,0x10,0x05,0x32,0x7A,0xA0,0xE4,0x19,0x2E,0xB3,0x77, +0x4F,0x9D,0xE6,0x33,0x75,0xC0,0x12,0xE9,0x0E,0x4F,0x99,0x11,0x12,0x8E,0x1B,0xF5,0xF3,0xA2,0xCB,0x8A, +0xBA,0x33,0xB1,0x41,0x85,0x4C,0xD0,0xA6,0x34,0x28,0xDD,0xFB,0x7A,0xBC,0x8E,0xC6,0xA9,0xBE,0x60,0x19, +0xA3,0x8E,0xE6,0xE8,0xB1,0xA1,0xE9,0x3E,0x7D,0x46,0x9E,0x24,0xB3,0xCB,0x36,0xF9,0xEA,0xF4,0xCD,0x13, +0xFA,0x61,0xC6,0x81,0x31,0x30,0x12,0x87,0x1C,0x7E,0xC5,0xBE,0xA6,0x60,0x9F,0xA7,0x96,0x64,0x88,0x4E, +0xC4,0xFE,0x1D,0x96,0x91,0xC9,0xFD,0xD6,0x68,0x54,0xDB,0xAB,0x78,0x63,0x07,0xC8,0xC1,0xEC,0x9B,0x13, +0x2C,0x7C,0x92,0xE0,0x37,0x45,0x47,0x8E,0xD1,0x24,0x48,0xA1,0x20,0x59,0xC4,0x14,0xB3,0xF9,0x2F,0x6E, +0x2A,0xC9,0xF2,0xF4,0xE9,0x64,0x33,0xCB,0xC5,0x44,0x0B,0xCF,0xDD,0xE4,0x49,0xF2,0x2F,0x11,0xBB,0x6D, +0xD2,0xA7,0x6D,0x2F,0x29,0xC9,0x03,0xDD,0x60,0xCB,0x6B,0x4A,0x08,0x06,0xA1,0xCD,0xC5,0x30,0x64,0xBD, +0x9A,0xE4,0xC9,0x77,0x32,0x0F,0x7C,0x75,0x2E,0xD3,0xFC,0x4B,0x78,0xD3,0x81,0x47,0x21,0xBF,0x94,0x0A, +0xAD,0x02,0x2C,0x3A,0xF8,0x4D,0x7E,0xBE,0x53,0x1E,0x64,0xD1,0x6A,0x45,0x3D,0x8F,0x48,0x69,0xF4,0xE1, +0x73,0x6D,0xBD,0x4A,0x7B,0x21,0x13,0x7A,0xF4,0x7D,0x34,0x2D,0x9E,0xB3,0xC9,0xF6,0x62,0x1E,0xEB,0x13, +0x72,0x7C,0x65,0xC4,0xAB,0xCF,0x5D,0x95,0x99,0x22,0xFC,0xF2,0xCB,0x01,0x7F,0xA3,0x91,0x71,0x5F,0x53, +0x53,0x64,0xEC,0x96,0xB8,0x7F,0x32,0xB8,0xAC,0xE7,0x8A,0xBD,0x52,0x39,0x8D,0xD0,0x23,0xFC,0xE2,0x9D, +0x55,0x0C,0x5C,0x9A,0x05,0xED,0x3D,0x7A,0x44,0x03,0xAF,0xC1,0xF2,0xFF,0x04,0x56,0xCC,0xFF,0x05,0x95, +0xA9,0x7E,0x1E,0x66,0x35,0xBE,0x08,0xF6,0x23,0x73,0x8B,0xD7,0x0E,0x2E,0xA7,0xE4,0xC9,0x70,0xDB,0xDA, +0x33,0xC0,0x2A,0x59,0x97,0xF7,0x85,0x05,0x9B,0x6E,0xA9,0xA2,0xAD,0x43,0x19,0x36,0xD3,0xB4,0xC4,0x01, +0xC0,0x15,0xDC,0x8F,0x75,0x66,0xA9,0x31,0xAA,0x70,0xC9,0xB6,0x84,0x92,0x06,0x12,0x90,0xFB,0x79,0x60, +0xF4,0x65,0xDD,0x53,0x6E,0xD9,0xCD,0x3A,0x5A,0x38,0x6F,0xCF,0x40,0xF6,0x9F,0x71,0xE6,0x0B,0x3C,0x7B, +0x1C,0x1E,0xD4,0x8F,0xD3,0x5C,0x5E,0xBC,0x95,0x34,0x42,0x52,0x91,0x7B,0xCA,0x1D,0x6A,0xEB,0xC4,0x81, +0x52,0x36,0x24,0x3A,0xA0,0x75,0x09,0x98,0x92,0x1D,0x27,0xD0,0x09,0x78,0x17,0xEF,0x43,0xB6,0x75,0xA8, +0xE9,0xBA,0x00,0x5E,0x7C,0xD7,0x5F,0xFB,0xF9,0x59,0x9F,0xAF,0x71,0x34,0x67,0xBB,0xA9,0xFB,0xA5,0x3A, +0x12,0x18,0x1C,0xC9,0x89,0x5D,0x94,0x37,0x8D,0x87,0x81,0x1B,0x14,0x81,0xB6,0xA2,0xF0,0x58,0xF5,0x96, +0xC2,0x54,0x8E,0x20,0x91,0x7F,0x18,0x51,0xEB,0xCA,0xE6,0x8C,0x77,0x76,0xEA,0xB6,0x37,0x42,0xFE,0x35, +0x58,0xC5,0x01,0x55,0x01,0x8D,0x87,0x6F,0x6F,0x5A,0x5D,0x27,0x40,0x4C,0x1F,0xD5,0x46,0x9E,0x01,0x41, +0x57,0xF4,0x92,0x8E,0xB0,0x3D,0x38,0x12,0xE5,0x9B,0xD4,0xE0,0x96,0xA4,0x97,0x0B,0x42,0x48,0x20,0xDF, +0xF9,0x3B,0x90,0x40,0x46,0x71,0xC8,0x45,0x9C,0xAE,0x61,0x27,0x90,0xAD,0x75,0x55,0xA8,0xA0,0x55,0xE5, +0xB7,0x17,0x42,0x65,0xD7,0x52,0x06,0xA7,0x85,0xEB,0x91,0xDA,0x99,0xA0,0xD6,0xFB,0x2F,0xCE,0x39,0xE9, +0x68,0x02,0xFD,0x6D,0xCB,0xDD,0xC7,0x30,0x34,0x85,0x76,0x20,0x66,0x93,0xC6,0xEB,0xB5,0x21,0x0F,0x10, +0x2C,0x17,0x5C,0xF8,0xBD,0xFE,0x41,0x76,0xEE,0x94,0x8A,0x56,0xA2,0x2C,0x5E,0xDE,0x1E,0xB0,0xE2,0x72, +0x74,0xD4,0x1F,0x45,0x67,0x05,0x1C,0x69,0x35,0xC8,0x0A,0x92,0x97,0xC6,0x91,0x29,0x5E,0xEB,0x7F,0x31, +0xE7,0x49,0xC9,0xC5,0x1B,0xAD,0x2E,0x5D,0xB5,0x32,0xC7,0xA6,0xD1,0xF4,0x8E,0x95,0x0F,0x38,0x9A,0xF1, +0xE9,0xCB,0x4F,0xD5,0x2F,0xB9,0xCC,0x8F,0x3F,0xC8,0x73,0xB9,0xA8,0x78,0xD4,0x18,0x7E,0x2D,0x00,0x8A, +0xDC,0x66,0x2D,0x0F,0xFC,0xA8,0x7A,0x9C,0x29,0x75,0x58,0xFF,0x4D,0x5B,0x25,0x03,0x27,0x8E,0x57,0xDC, +0xFA,0x47,0xD3,0x69,0xBE,0x0C,0x78,0xEC,0x11,0xA6,0x9F,0x59,0x36,0x89,0x85,0x17,0x15,0xA2,0x1C,0x4C, +0xEF,0x0F,0xE7,0xCA,0x22,0x15,0xA5,0x54,0x38,0x8E,0x76,0x1D,0x15,0xAE,0x44,0xC0,0xAE,0x7B,0xCA,0x62, +0x20,0xAD,0x24,0x98,0x4B,0x48,0x57,0xFC,0xCA,0xCB,0x4A,0x6F,0x03,0x88,0x40,0x0F,0x42,0x86,0x7C,0x1E, +0x27,0x9D,0xA2,0xFF,0xD8,0xB6,0x0B,0x08,0x11,0x82,0x32,0x5A,0x99,0xDE,0xC8,0x99,0xA7,0x7C,0x3B,0xD7, +0xB5,0xAD,0x2E,0x56,0x17,0x54,0xF0,0x75,0x12,0x0D,0x25,0xA3,0x25,0xCB,0xEE,0xA7,0xFA,0x5F,0xEC,0x90, +0x7D,0xD3,0xBC,0xA4,0x11,0x10,0x5C,0xB0,0xB3,0xDC,0xE6,0x30,0x1D,0xE0,0xE5,0xD3,0x38,0x98,0xEF,0x9A, +0xDF,0xBD,0x10,0xD5,0xC7,0x53,0xE7,0xD4,0x88,0xB3,0x27,0xA8,0xA3,0x1B,0x95,0xA6,0x14,0x32,0x77,0xAE, +0x1A,0xD5,0xC3,0xB1,0x14,0x70,0x5A,0xA3,0x64,0x3B,0xE8,0x35,0x3F,0x69,0x23,0x62,0x44,0xF6,0xA5,0xE3, +0x9F,0x5E,0x14,0xD6,0xC7,0xE4,0x5F,0x96,0xCB,0x9D,0x42,0x5F,0x07,0xF5,0xAD,0x17,0x9E,0x5F,0xB0,0xB0, +0x83,0x3D,0xB3,0x87,0x5D,0xBE,0x20,0x12,0xDC,0xF6,0x35,0xDF,0x8B,0xB4,0x12,0xA0,0x04,0xC4,0x7D,0x2E, +0x06,0x2C,0x82,0x81,0xC9,0x08,0x3D,0x5F,0xC8,0xB5,0x3A,0x62,0xBC,0xDA,0x58,0x7D,0xB8,0x35,0x18,0xE9, +0xCD,0xB4,0x07,0x5D,0xF0,0xF5,0x70,0xB6,0x25,0x12,0x96,0x64,0x91,0xB4,0xD8,0xDC,0x92,0xD4,0x86,0x4F, +0xDE,0xA9,0x2D,0x84,0xAF,0xFA,0xF5,0xC5,0x57,0xDE,0xD0,0x6B,0xA6,0xC1,0x27,0x2D,0x7C,0xF5,0x62,0xAA, +0x9D,0x84,0xD0,0xBB,0xDE,0xB9,0xA8,0x59,0x0C,0xC0,0x8D,0x40,0xD9,0xFD,0x1D,0xB9,0x10,0x38,0x94,0x33, +0x3C,0x67,0xDA,0x99,0x54,0x9E,0xA7,0xF6,0x97,0x56,0x16,0x82,0xC4,0x25,0x7E,0xAC,0xD4,0x17,0x58,0x43, +0xEB,0x79,0xAF,0x67,0x79,0xA5,0xFF,0x29,0x4E,0x3A,0x52,0x4B,0x98,0xAE,0xA3,0xD0,0xED,0x1F,0x37,0x47, +0x36,0xBC,0xC0,0xB4,0x72,0x43,0xBF,0xD7,0xB3,0x14,0x2C,0xFC,0x06,0xEC,0x52,0x7D,0x6A,0x99,0xC0,0xA8, +0x6A,0x42,0x20,0xF4,0xF2,0x83,0x99,0x6F,0xC2,0x1C,0x07,0x00,0x3B,0x6F,0x1E,0x72,0x07,0x12,0xF7,0x2E, +0xB2,0x3A,0x18,0xB4,0x05,0x36,0xE6,0x32,0xB8,0x6E,0x50,0xE0,0x69,0x18,0x55,0xF6,0x1C,0x63,0xF1,0x43, +0x3B,0xD9,0x11,0x17,0xB0,0x60,0x09,0x6A,0x87,0x92,0xA8,0x63,0xFA,0x2C,0xA2,0x63,0x72,0xC9,0x09,0x4A, +0xB9,0x60,0x41,0x26,0xF9,0x68,0xA2,0x4C,0x11,0x78,0x68,0x1F,0x2A,0x17,0x5F,0xFE,0x54,0x9C,0x00,0xDD, +0x81,0x79,0xC8,0x14,0x17,0x08,0x0D,0x83,0x79,0xE8,0x5E,0xF0,0x0E,0x02,0xFC,0xDA,0x37,0x90,0xFF,0x7D, +0x70,0x36,0x2F,0xCD,0x37,0xE5,0x20,0x22,0x0C,0x6C,0x63,0x33,0x74,0x62,0xBA,0xD7,0xEF,0x45,0x8F,0xF5, +0xED,0xD3,0x75,0xEA,0xD2,0xF6,0x9D,0x8C,0x3A,0xED,0x02,0x3E,0xE7,0x46,0x6A,0x62,0x79,0x97,0xEC,0x8C, +0xAD,0xCB,0x8E,0x2A,0x61,0xA3,0x90,0x1E,0xAA,0xB4,0x13,0x1C,0x3E,0x49,0xA4,0xE1,0x91,0x20,0x3D,0xC1, +0xE3,0x05,0xBC,0x92,0x71,0x25,0xAC,0x7B,0x8B,0xBA,0x04,0xDE,0xA4,0x2B,0x74,0x9D,0xBB,0x70,0x91,0x1F, +0x0B,0x6A,0x25,0x79,0xA1,0x18,0xE3,0x0F,0xFD,0x37,0x7A,0xB7,0x0C,0x36,0xD4,0x2E,0x35,0x01,0xA9,0x4F, +0xEB,0xED,0xD4,0x54,0xB3,0x25,0x31,0x50,0xEE,0xB2,0xC4,0x3F,0x50,0x00,0x0C,0xD5,0xA0,0x3E,0x7B,0x0F, +0x2F,0x03,0xFD,0xA1,0x0A,0xC3,0x57,0x2E,0xB0,0x03,0x00,0x9A,0xB8,0x93,0xC5,0x0F,0xDC,0x96,0xA7,0x26, +0x51,0xD2,0x56,0x3E,0xE0,0x02,0x3B,0x2E,0x4C,0x0D,0xB9,0x7D,0xDA,0xAF,0x7A,0x45,0xAD,0x72,0x68,0xEB, +0xEE,0xED,0xB4,0xD3,0xC3,0xD3,0xCB,0x00,0x76,0xB0,0xC8,0x63,0x62,0x0A,0x96,0x96,0xA3,0x70,0xAB,0x9C, +0x16,0x51,0xA4,0x5A,0xDD,0x7C,0x7B,0x44,0x49,0x98,0x9F,0x87,0x03,0x6F,0x26,0x52,0x6C,0x13,0x60,0x27, +0x6D,0xFE,0x4F,0xF7,0x5E,0xBC,0xB3,0x25,0xD9,0x3E,0x23,0xD5,0x5E,0x08,0x60,0x72,0x2F,0x2E,0x68,0x9A, +0x11,0x20,0x23,0x84,0x09,0x94,0xB8,0x93,0x54,0xA2,0xA6,0xE5,0x30,0x36,0xCA,0x38,0x68,0x58,0xC8,0x50, +0x6E,0x61,0x58,0xD4,0xEC,0x14,0xA4,0xCB,0x51,0xA0,0xFF,0x53,0xAA,0x1C,0xD6,0xB6,0x97,0xB7,0x6B,0x48, +0x34,0x5E,0x5A,0xD3,0x91,0xFF,0x57,0xD0,0x80,0x8C,0xF3,0xE9,0x3C,0xB1,0xF1,0xD5,0xD0,0xC3,0x4A,0x71, +0xAE,0xD7,0x4F,0x60,0x62,0x55,0x79,0xFF,0x16,0x79,0x16,0x53,0x1B,0x58,0x75,0xEC,0x72,0xD5,0x06,0x9C, +0xFD,0x03,0x71,0xA2,0x9A,0x94,0x08,0xDA,0x96,0x84,0xBA,0x4B,0x90,0x10,0xFC,0xF6,0x27,0xCC,0xA1,0xE9, +0x1B,0xBF,0xD7,0xBD,0x56,0xA7,0x8D,0x9C,0x59,0x41,0xCF,0x31,0xBC,0xE4,0xC0,0x71,0xB9,0xCA,0xCB,0x47, +0x14,0xDA,0x4B,0x34,0x16,0x60,0x56,0xFC,0x2E,0x72,0xC6,0x0C,0x03,0x9C,0xEE,0x2F,0xA8,0x5C,0x61,0x4C, +0x8E,0x8D,0x30,0x71,0xC0,0x4E,0x31,0x23,0xDA,0xBE,0x9E,0x35,0x8C,0x89,0xCD,0xBF,0x80,0x3C,0xD7,0xBB, +0x41,0x0D,0xD4,0xBE,0x9F,0xBF,0x1F,0xED,0x43,0x20,0x17,0x24,0x12,0xDE,0x31,0x74,0x40,0x8C,0x30,0x23, +0x46,0x9E,0xC8,0xE6,0xC9,0xF2,0x04,0xFC,0x98,0x50,0xE0,0xAA,0x54,0x3D,0x0C,0x84,0x89,0x1C,0xCF,0x5C, +0x2E,0x33,0x0B,0x68,0xE1,0x83,0x79,0x8B,0x03,0xD9,0x7D,0x66,0x95,0xBE,0xC7,0x4C,0x6B,0x1E,0x28,0x49, +0x8F,0x6A,0xE1,0xAB,0x4C,0xC0,0x99,0x94,0xE6,0x0F,0xCA,0x5C,0xAC,0xCF,0xD7,0x45,0x6F,0xFD,0x84,0x91, +0x10,0xE5,0xC9,0x58,0x44,0xAE,0x63,0xB3,0xB9,0x6C,0x99,0xDD,0x20,0x6A,0x03,0x02,0x02,0xEA,0x00,0x25, +0xA6,0xE6,0xA4,0x3D,0x75,0xE4,0x30,0x3B,0xE0,0x12,0x93,0x5A,0xA2,0x7A,0x1C,0x11,0xC9,0xAF,0xD6,0xB4, +0x41,0xF5,0xA2,0x88,0x3F,0xE6,0xF1,0xAB,0x5F,0xCB,0x6E,0xC9,0x90,0x5E,0xB1,0x6A,0xB6,0xC0,0xF9,0xF3, +0x9E,0x77,0x09,0x1C,0x46,0x8A,0x69,0x34,0x65,0x07,0xDB,0x62,0xA9,0xC3,0x87,0xD7,0xB4,0x18,0xE2,0xA2, +0x66,0xCA,0xB8,0x0C,0x8E,0xE9,0x92,0xDA,0xF2,0x1B,0x92,0xA4,0x78,0x43,0x3C,0xCA,0xE6,0x03,0xD4,0x18, +0x7E,0x2E,0x2B,0xCB,0xEE,0x89,0x88,0x1A,0xA9,0x80,0x72,0x3C,0x65,0x60,0xF9,0x65,0xF4,0x1B,0x4D,0x2C, +0xE8,0x67,0xCB,0x2B,0x35,0xFB,0x15,0xCF,0xE7,0xE1,0x3B,0x9B,0xD9,0xDC,0x09,0x0B,0xCF,0x64,0x0C,0x4F, +0xAE,0xEB,0x19,0x6D,0xAF,0x33,0xF1,0x3D,0x3B,0x2D,0x06,0x82,0xDE,0x01,0x32,0x33,0xD7,0xE4,0xD5,0xC8, +0x9E,0x50,0x15,0xDA,0x42,0x19,0x6C,0xC2,0xB0,0x60,0x98,0x7E,0x5E,0x9F,0xA3,0x82,0x63,0xE2,0x1C,0xB0, +0x7F,0x2D,0x55,0xC3,0x6D,0x4B,0x63,0x1C,0xAA,0x80,0x09,0x5B,0x8E,0xCF,0x2B,0x02,0x29,0xC3,0xAE,0xCA, +0x6C,0x10,0x3B,0x22,0x3B,0xE2,0x88,0xF1,0x37,0x66,0x34,0x76,0x85,0x11,0x74,0x5D,0x91,0x53,0x9F,0x56, +0x15,0xBF,0xE0,0x81,0x66,0x9E,0xDE,0x27,0x45,0x1E,0x68,0x9C,0x43,0xE4,0x78,0xC5,0x14,0x24,0xE5,0x2B, +0x9C,0x3F,0xB2,0x74,0x30,0x39,0xC0,0x5D,0xC0,0xA7,0xEC,0xFD,0x51,0xF9,0xAD,0x86,0xB6,0x32,0x09,0xB3, +0x14,0x1C,0xE9,0x42,0x46,0x93,0x21,0x5F,0xF1,0x9F,0x1A,0x77,0xCF,0x77,0xB4,0x35,0x14,0x69,0xEC,0x0D, +0x51,0xD4,0x67,0x15,0xF2,0x79,0x65,0x50,0xEA,0xDB,0x20,0xC7,0x47,0xF7,0xFE,0xA9,0xBB,0x04,0xC4,0x0D, +0x8A,0x99,0xC9,0x50,0x8F,0x9C,0x25,0x9A,0x3F,0xBC,0x0A,0x1B,0xE6,0x94,0xA7,0xA9,0x1D,0x92,0xD9,0xF4, +0x0B,0x9A,0x62,0x59,0x5E,0x06,0xCE,0xCE,0x1B,0xD4,0x9A,0xB7,0xB7,0x27,0x1E,0xBA,0x2D,0x37,0x31,0xA9, +0x9D,0x17,0x08,0x83,0x8C,0x77,0x62,0xF0,0x52,0x24,0x50,0x9D,0x8C,0x06,0x1A,0xFC,0xC2,0xD5,0xBE,0xAF, +0xF7,0x52,0x40,0xC0,0x67,0x16,0x87,0xF9,0xCE,0xAF,0xF7,0xAB,0x1D,0x65,0x97,0xB8,0x4F,0xBE,0xDE,0x44, +0xC7,0xDE,0x9B,0xF9,0x56,0xD9,0xC9,0x3F,0x48,0x1D,0x06,0x8A,0x8F,0x74,0xE6,0x00,0x58,0x64,0x2C,0xCB, +0xD1,0x11,0x0A,0x5C,0x3E,0xB4,0x59,0x85,0xB7,0x47,0x05,0xFA,0xC3,0x77,0x76,0xFE,0x67,0x8E,0x09,0x9E, +0x36,0x1D,0x59,0xC3,0x8E,0x72,0xC4,0x4E,0xE2,0x52,0x9C,0x30,0x5D,0x63,0x65,0x4B,0xE3,0xD9,0x77,0x6F, +0xAA,0x62,0xA4,0xD3,0x15,0xBA,0xD8,0x6E,0xA9,0x0C,0xFC,0x2F,0xBB,0xFD,0x6C,0x88,0x9F,0xB3,0x5B,0x9D, +0x00,0xBE,0x59,0xF9,0xA5,0x0B,0xBA,0xE6,0x58,0x31,0x06,0xFC,0xCD,0xE6,0x28,0x34,0x91,0xEA,0x30,0x95, +0x87,0xA0,0xDC,0xFC,0x5F,0x6C,0x0D,0x0F,0x75,0x03,0xF8,0x7B,0x67,0x6C,0xC5,0x83,0x00,0x09,0x85,0x21, +0xB4,0x6E,0x5E,0xD2,0xFC,0xF7,0xE9,0xCD,0x93,0x2D,0x69,0x13,0xD8,0x0E,0xD1,0x70,0xA2,0x01,0x52,0x80, +0x18,0xBE,0x62,0x4A,0xF2,0xE3,0x50,0x5D,0x42,0x89,0xF7,0x15,0xE1,0x2A,0x2E,0xF2,0xBE,0x00,0xB7,0x1E, +0x33,0x60,0xA4,0xD0,0xFF,0x25,0x64,0x26,0xCD,0xDA,0xFF,0xEF,0xA8,0xF3,0xB9,0x50,0xBA,0x86,0x18,0x41, +0x25,0x47,0xA9,0xC3,0x6E,0x67,0xE2,0x66,0x16,0x90,0xA8,0x1B,0xB3,0x62,0xE5,0x13,0x00,0xD3,0xF3,0xC7, +0x93,0xF8,0x07,0xEB,0xC7,0x93,0xCF,0x17,0xB3,0xF0,0xC6,0x8D,0x4B,0xFB,0x3A,0x6C,0x03,0x33,0x3D,0x72, +0xBD,0xD4,0xCB,0xA0,0xFD,0xB7,0x53,0x17,0xEC,0x02,0xDA,0x1D,0x12,0x28,0x25,0x09,0xE8,0xB6,0xE2,0x0E, +0xA6,0x72,0xC7,0x8F,0x96,0x4B,0xC9,0xFD,0x9A,0x65,0x2D,0x00,0xE9,0xBA,0xCA,0xB8,0x7D,0xBE,0x8B,0x38, +0xCD,0x86,0xDF,0x41,0x1E,0x08,0x20,0x9C,0x3E,0xC0,0x9F,0xDB,0xEA,0xEB,0xCA,0x57,0x07,0xB8,0x6E,0xA4, +0x21,0x61,0xE0,0x77,0xA6,0xE3,0xAC,0x6A,0xBB,0xEF,0x34,0xCE,0xE0,0xEB,0xB4,0xBE,0x09,0x60,0xF2,0xF2, +0xDF,0xD9,0x4A,0x8D,0xF8,0x2D,0xE3,0x53,0x06,0x83,0x24,0x33,0xFB,0x2A,0x65,0x98,0x2A,0x0E,0x62,0x9E, +0x56,0x63,0x15,0xCA,0x9B,0xA0,0xD1,0x5F,0x51,0x20,0xFE,0x62,0xA0,0x3B,0xE4,0xF9,0xC3,0x03,0x22,0xAD, +0x7B,0xBD,0x8B,0xF1,0x47,0x47,0x97,0xE7,0x99,0xF6,0xCD,0x33,0xD7,0x32,0x44,0xB8,0xD9,0xAB,0x8C,0x10, +0x3C,0x08,0x1C,0x34,0x59,0xE0,0xCC,0x84,0x7B,0xFC,0x4A,0x46,0x6A,0xC8,0x5A,0x05,0xB6,0x29,0x8D,0x5E, +0x11,0xD4,0x19,0xCC,0xF3,0x12,0xBA,0x4C,0xA7,0x89,0xC5,0xB0,0x93,0x00,0xDD,0x98,0x7D,0xFE,0xC4,0xB5, +0x56,0x68,0x00,0x06,0xB0,0x17,0x27,0xE0,0x01,0x2F,0xE7,0xE7,0xB6,0x82,0xEC,0x54,0x7E,0xAB,0xAE,0xC3, +0x2E,0xF3,0x33,0x93,0xDA,0x4F,0xDC,0x01,0xB1,0x15,0x15,0x12,0x63,0xD8,0xA6,0x3A,0x6A,0x5E,0x7D,0x3B, +0xA2,0x7B,0xF2,0x7E,0x89,0xE0,0x45,0x0D,0x3B,0xDB,0x77,0x22,0x69,0xBC,0x2A,0x2A,0x5A,0x6D,0xFE,0xC7, +0x3F,0xB2,0x10,0x13,0xD7,0x7A,0x50,0x0C,0x10,0xC9,0x43,0x71,0x08,0x83,0x0A,0x38,0x01,0x09,0x49,0xDA, +0x83,0x83,0xE9,0xE6,0x48,0x1D,0xD7,0xB6,0x9C,0xC6,0x09,0x47,0x88,0xCA,0xA4,0x43,0xF9,0x58,0xF8,0xCE, +0x41,0xAB,0x16,0x09,0xE4,0xBA,0x0F,0xB1,0x01,0x13,0x93,0x29,0xE1,0x21,0x76,0xEA,0xD9,0x92,0x63,0xEE, +0x81,0xCD,0xDF,0x90,0x91,0x19,0xC6,0x3C,0x5C,0x70,0x24,0xCC,0xD6,0x58,0x25,0x32,0x1E,0x98,0x08,0xDB, +0x6E,0xF7,0xAD,0xCB,0xDB,0xC3,0xE9,0x47,0x40,0xAB,0xC1,0x31,0xEA,0x66,0xFF,0xE2,0xF7,0xE9,0xE6,0x03, +0x5F,0xD6,0xF4,0xCE,0x7E,0xC8,0x5B,0x95,0x72,0xB7,0x65,0xED,0x6F,0x48,0x63,0x8F,0x0D,0x1B,0xCF,0x28, +0x79,0x5F,0xED,0x24,0x29,0xA4,0x01,0xF6,0xAD,0x11,0xA7,0xEC,0x1B,0xFE,0x5E,0x2A,0xED,0x91,0x60,0x47, +0xD2,0xE2,0x99,0xA6,0x7C,0x23,0x08,0x1B,0xF3,0x6D,0x20,0x16,0x2D,0x41,0x68,0x53,0xA4,0xEF,0xA0,0xA2, +0x2C,0xF0,0xBA,0x50,0xDA,0x67,0x8D,0xEB,0x18,0x44,0xA9,0x1D,0x13,0xE0,0xF1,0x0A,0x58,0x6F,0xE8,0xB2, +0x73,0xF9,0x9E,0x3B,0x83,0x19,0x29,0xEB,0x1D,0x58,0x21,0x2E,0x3C,0x62,0xA3,0x77,0xD7,0xAE,0x02,0x5C, +0xD0,0x70,0x70,0xAE,0x86,0x69,0xF4,0xA4,0xD4,0xC7,0xC8,0x88,0xFA,0xE9,0x0B,0x56,0xFB,0xC1,0x17,0xD4, +0x86,0x07,0xF6,0x61,0xB1,0x0D,0x07,0x08,0xC1,0xA4,0x86,0xB0,0x5C,0x2D,0xBF,0xA5,0xD4,0x23,0x92,0x98, +0x0E,0x31,0x0C,0x20,0x2B,0x90,0xDA,0x54,0x53,0x42,0xD1,0xD5,0x06,0x25,0x5F,0xC8,0x8E,0x63,0x15,0xE8, +0x22,0x6E,0x0F,0x19,0x57,0xF9,0x8A,0xE2,0xA2,0xD3,0x0A,0xD5,0xBD,0xAB,0xA0,0xB4,0xFB,0xF3,0x3D,0x69, +0x52,0xE7,0x8C,0x6E,0x44,0x12,0x2F,0x8F,0x4B,0xF8,0xE3,0x3E,0xF8,0x69,0x19,0xF8,0xFC,0x25,0xE3,0x1C, +0xB1,0x32,0xC8,0xDB,0x19,0x88,0x55,0xDF,0xD4,0xA5,0x4D,0x7B,0x8E,0x48,0xCA,0xE7,0x01,0xE9,0x9E,0x48, +0xF9,0xC2,0x43,0x3D,0x9D,0x66,0xC5,0x7D,0x65,0x29,0x75,0xB1,0xBF,0x0F,0x01,0x3A,0x86,0x84,0xD2,0x84, +0x3D,0xE8,0xC2,0xD0,0x9B,0x19,0xC3,0xE2,0xBE,0x5B,0x40,0x89,0x85,0x66,0xA9,0x1C,0xDD,0xF1,0xE3,0xBA, +0x6E,0xCE,0x9B,0xB1,0x11,0xA8,0x91,0x78,0xC3,0x28,0x92,0x4B,0x5C,0xF2,0xCE,0x40,0xE4,0xFB,0x8B,0x15, +0xE5,0xA2,0x19,0x7F,0x33,0x8B,0x2E,0x4F,0x6E,0x10,0x04,0x08,0x27,0xC0,0xFE,0x84,0x87,0x19,0x21,0xAD, +0x57,0x64,0x73,0x24,0xF4,0x5A,0x0A,0x4B,0x1D,0x35,0x44,0xA6,0xB5,0x11,0x2B,0x2D,0x06,0xD5,0xC4,0xBA, +0x95,0x0E,0x86,0xBB,0x78,0x23,0xB4,0x0D,0xB5,0x32,0x8F,0x5C,0x69,0x7F,0x8D,0x77,0xA8,0x59,0xE2,0xBF, +0xED,0x29,0x6D,0x4F,0xE6,0xB7,0x44,0xC2,0x95,0xC5,0xE4,0xB7,0x50,0x9D,0xC7,0xF4,0xFA,0x71,0x41,0xE2, +0xC1,0xB2,0x15,0x42,0xB0,0x6B,0xF2,0x19,0x97,0x57,0x5E,0xD6,0xA2,0x83,0x8C,0x81,0xB4,0xB8,0x02,0xA7, +0x8E,0x1D,0xD2,0x6D,0xD6,0x03,0x3B,0xF0,0xA2,0x3D,0x4B,0x04,0x17,0x40,0x4B,0xB6,0x8E,0x21,0x8D,0x19, +0xD2,0xF0,0xCC,0xC9,0x3B,0x23,0x7D,0x28,0x4C,0x1A,0x2B,0x4D,0x0C,0x1F,0x9D,0xA4,0x25,0xFA,0x06,0x49, +0x64,0x62,0xC7,0x66,0x36,0xF5,0x7E,0x2A,0x85,0xA9,0x51,0xDD,0xDF,0x71,0xEE,0x42,0xB4,0xF5,0xE4,0x6E, +0x3F,0xF6,0x3B,0x4A,0xD5,0x78,0xDF,0xFE,0x35,0x02,0x07,0xCC,0x50,0x8B,0x58,0xEF,0xF0,0xA1,0x9B,0x39, +0xA4,0xD0,0x97,0x45,0x9F,0xFE,0x11,0xFB,0x67,0x61,0x8F,0x93,0x8E,0x9F,0x2E,0x3F,0xD5,0xED,0xBB,0x3B, +0xBE,0xDF,0x38,0xC5,0x60,0xD2,0x2B,0x55,0x5D,0xB8,0x48,0xBB,0x04,0x6B,0x15,0xCA,0x81,0x92,0x54,0x29, +0xE9,0x32,0x7E,0x25,0xDE,0x3B,0x28,0x40,0x84,0x55,0x87,0x92,0xED,0xBC,0x06,0x6B,0x78,0x21,0x9E,0xBE, +0xA9,0xA8,0x09,0xBA,0x07,0x56,0x4A,0x70,0x9D,0xFA,0x89,0x2A,0x65,0x8F,0xEF,0x25,0x32,0x42,0xC8,0xAE, +0x1B,0x17,0xA1,0x1D,0xFB,0x7A,0xFF,0x82,0x91,0xE2,0x5F,0x8E,0x67,0x54,0xA8,0x0D,0x20,0xCB,0xEF,0xC8, +0xEC,0x1B,0xB0,0xEB,0xEA,0x6B,0x3D,0xE9,0x13,0x5A,0x60,0x5B,0x21,0x61,0xBE,0x44,0x6B,0x9A,0x39,0x25, +0xB3,0x90,0x41,0x5C,0xFD,0xF9,0xD1,0x69,0x42,0x9F,0xD1,0x36,0xFD,0x71,0x50,0x88,0x24,0x9C,0x1E,0xE4, +0xEF,0x00,0x66,0x43,0xEF,0xDC,0xF8,0xC9,0x4D,0x21,0x60,0x5D,0xEB,0x07,0x47,0x41,0x14,0x7E,0x30,0xA0, +0x88,0xE9,0x8A,0x3E,0x2E,0xCB,0x1C,0x80,0x07,0xAA,0xB3,0x7B,0x72,0x70,0x3A,0x92,0xC1,0x4D,0xA6,0x73, +0xF2,0xBA,0x57,0x23,0x7D,0xAF,0x3B,0xB9,0x6C,0xDD,0x05,0x83,0x40,0x4C,0x71,0x95,0x12,0xB5,0x99,0x22, +0xA9,0x8D,0x55,0x27,0x68,0x65,0x50,0x81,0xCB,0x48,0x6D,0x17,0x6C,0x3B,0x3D,0x4F,0xDA,0x02,0xB5,0x7C, +0xE8,0x41,0x2C,0x4C,0xA3,0x0C,0x9D,0x17,0x2F,0xDE,0x4C,0xF0,0x71,0x44,0xB4,0xBD,0x78,0x2D,0x40,0x3A, +0xFA,0xD0,0x47,0xBC,0x91,0x00,0x83,0x13,0x87,0x44,0x43,0xCC,0x95,0x46,0xBF,0x52,0x02,0x0E,0x4C,0xCD, +0xEF,0x1F,0x74,0x39,0x28,0x4B,0xE9,0x1F,0x9A,0x5B,0x7A,0xF9,0x9F,0xC0,0xCA,0x2E,0xB8,0x58,0x46,0x15, +0xE1,0x2F,0x88,0x2B,0x6D,0x30,0xC2,0x48,0x4C,0x8C,0x69,0x22,0x69,0xD8,0x13,0xA5,0xEE,0xB2,0xF0,0xA7, +0x1D,0x97,0x52,0x62,0xCE,0x0F,0x25,0x80,0x5B,0x10,0x7D,0xED,0xAB,0x15,0x1C,0x66,0xA5,0xDE,0x93,0x28, +0x0C,0x0C,0x69,0x2A,0xD4,0x51,0x94,0x58,0x8D,0x37,0x4F,0xD9,0xAA,0x2F,0x4B,0x7D,0xC7,0x0D,0x4C,0x03, +0xED,0x6C,0xC4,0xC8,0xEC,0xAD,0xBA,0x20,0xFA,0x33,0x4D,0x99,0xC5,0x3C,0xC5,0x80,0xAC,0x73,0xA0,0x15, +0xA3,0x44,0xF5,0xE7,0x1B,0xB8,0x64,0x5D,0x69,0x4A,0xEE,0x9A,0x65,0x77,0x7D,0x69,0xD4,0x5F,0xBB,0xB8, +0xD1,0x36,0xD1,0x23,0x54,0xD9,0xF5,0x65,0x3E,0x7F,0x57,0x73,0xE0,0x17,0xAD,0x1F,0xB0,0xF3,0x5E,0xD7, +0x1E,0x2E,0xD5,0x27,0x50,0x8C,0x49,0xE0,0xDF,0xCC,0x04,0x38,0x88,0x76,0x0B,0x6A,0x11,0x20,0xB4,0xAE, +0x34,0x79,0x72,0x74,0xAE,0x93,0xC5,0x74,0x1B,0x85,0x58,0x74,0x09,0x19,0xE4,0xD9,0xD0,0x73,0x5D,0xC8, +0xEA,0x55,0xD4,0xC5,0xB4,0x0C,0x95,0xB8,0x8F,0xAD,0x61,0xC5,0x1F,0x46,0xC9,0x91,0x68,0x11,0x94,0x29, +0x16,0xB5,0x82,0xF4,0xE5,0xF4,0xF4,0x61,0x52,0x24,0x7E,0x0A,0x9C,0x93,0xA0,0x2D,0x44,0x9C,0xBA,0x37, +0x6B,0xEA,0x22,0xCE,0x05,0x71,0xD3,0x99,0x94,0x75,0x39,0x3C,0x4A,0x39,0xA6,0x47,0x0A,0xE8,0xA6,0x6C, +0x82,0x76,0x3F,0xD9,0xA9,0x15,0x57,0x2D,0x4C,0xCB,0x4D,0x91,0xD4,0x45,0x14,0x2F,0xF1,0x1C,0x69,0x5C, +0xA8,0x5B,0xD0,0x14,0xBF,0xDB,0x8A,0x53,0x4C,0x37,0xFF,0xFC,0x75,0x76,0x0E,0x5A,0xC3,0x1F,0x3E,0xAA, +0x19,0x9C,0xFE,0x6C,0x1F,0x68,0xAE,0x04,0xA2,0xB1,0x74,0x3A,0xA9,0x15,0x5D,0x58,0x28,0x29,0xDE,0x7C, +0x60,0xFD,0xDF,0xED,0x49,0xD0,0x3F,0x4B,0xAB,0xF9,0x6F,0xEC,0xBC,0xF4,0x97,0x14,0xF8,0xA5,0x17,0x48, +0x5D,0x76,0xBA,0x3B,0x29,0x17,0x5F,0xAF,0x50,0xDC,0x0F,0xE4,0xE7,0x1D,0x8E,0x1D,0xFF,0xDF,0x88,0x93, +0x37,0x1B,0x0C,0x74,0xDE,0xE3,0x23,0x0B,0xF7,0x8D,0x87,0x1A,0x52,0x58,0x60,0x16,0x8D,0x8D,0xFC,0xE5, +0x3F,0xCD,0x31,0x9D,0x67,0x63,0xF8,0x19,0x34,0xB4,0x9B,0xC4,0x46,0xA2,0xDF,0xA3,0x75,0x04,0xCE,0xD3, +0xB0,0x80,0xA5,0xDB,0x68,0x19,0x39,0x82,0xD9,0x3E,0x97,0x2A,0xF4,0xA7,0x3F,0xC3,0xA6,0xB2,0x25,0xCE, +0x99,0xA1,0xB9,0x30,0xED,0xC7,0x80,0x09,0x5E,0xA9,0xFC,0x08,0xC3,0x84,0x4E,0xEE,0xD4,0x08,0x10,0xD6, +0x10,0xCF,0xB1,0x59,0xF2,0xAC,0x7E,0xF6,0x4E,0x87,0xC0,0x89,0xA2,0xE4,0x01,0x03,0x97,0x0B,0xF9,0x4A, +0xD4,0xA9,0xAE,0x62,0xC0,0xEC,0x99,0x05,0x21,0x83,0xB4,0x5B,0x7C,0x1C,0xEB,0xBF,0x53,0x6C,0x69,0x46, +0xCB,0x87,0x47,0x52,0xD1,0x84,0xE6,0x88,0xB8,0x03,0xC0,0x0C,0x1F,0xD8,0x12,0x3E,0x7F,0x5A,0xFC,0xBE, +0x2B,0x9D,0x23,0x0D,0xF4,0x86,0xD4,0xBE,0xFC,0x0F,0xFA,0x72,0xCF,0x14,0x0B,0x5B,0x26,0xFF,0x5B,0xE3, +0xF8,0xC8,0x0F,0x7D,0x56,0xA9,0x8B,0x06,0xAC,0x41,0x6C,0xAF,0x60,0x63,0x0B,0x9E,0xBE,0x3A,0x3C,0xEC, +0xE1,0xC5,0x43,0x36,0x4D,0x9D,0xE0,0x30,0xDB,0x33,0x4A,0xB5,0x79,0x1A,0x64,0xCA,0x3C,0xAC,0x3F,0x7C, +0x39,0xE8,0xC4,0xEC,0x93,0xE2,0x6B,0xA2,0x0F,0x76,0x71,0xCA,0x19,0xF6,0xA7,0xFA,0x87,0xA4,0xDA,0xEB, +0xE6,0xAF,0xA3,0x13,0x04,0x35,0x23,0x1B,0x8A,0xEC,0xAC,0x29,0xF9,0xB9,0x8B,0x48,0x23,0xE1,0x6B,0xA7, +0x0E,0xCD,0x0D,0xDB,0xF4,0x82,0x70,0x68,0xAE,0x77,0x2F,0x99,0xDE,0xCD,0x00,0x61,0x99,0x31,0x34,0x98, +0x48,0x44,0xD3,0x5C,0xC0,0x3D,0xBE,0xA7,0xD7,0xF6,0xB4,0x52,0x73,0x1A,0xCE,0x8B,0xDC,0x40,0xA9,0x36, +0x74,0xD7,0xE8,0xC5,0x57,0x9D,0x1D,0x68,0x29,0x34,0xF5,0xC0,0x5D,0xB1,0xF1,0x5C,0x87,0x59,0xFD,0x35, +0x55,0x5D,0xB8,0xBA,0x16,0xDE,0xB7,0x95,0x77,0xB7,0x82,0x51,0xF9,0xD7,0x79,0xD7,0xFB,0x5E,0xA0,0xA0, +0x65,0x6A,0x9A,0x6E,0xB4,0xA8,0x39,0xF4,0x60,0xA6,0x22,0xFF,0x8C,0xF4,0x14,0x50,0x2E,0xF1,0x8C,0x81, +0xB4,0xBA,0xBC,0x26,0xC1,0x97,0x9C,0xF4,0x7C,0xF8,0x1D,0xA1,0xE5,0x61,0x27,0x25,0x1A,0xB9,0x5B,0x67, +0xFE,0x2A,0xF1,0xFF,0x5F,0xFD,0x55,0x03,0x48,0x98,0x59,0x35,0x4C,0x28,0x36,0xDC,0x94,0xA0,0x02,0x30, +0x1E,0xE4,0xD9,0x7A,0x54,0xDA,0xEE,0xD3,0xC1,0xBE,0xDF,0x8E,0x1F,0x6E,0xE2,0xDF,0x5E,0x72,0x28,0x6A, +0x4E,0xE8,0x3D,0xFE,0x78,0xD5,0xE3,0x3A,0xA5,0xB0,0xEE,0x6E,0x75,0x06,0x2E,0x24,0x8C,0x38,0xB5,0x43, +0x32,0x15,0x68,0x4B,0xDB,0xAF,0xB3,0x5C,0xDA,0x57,0x0F,0x8F,0x9E,0x09,0xF5,0x9D,0x77,0x6A,0x34,0xA8, +0x8C,0x63,0x81,0x1E,0xBE,0x24,0x5C,0x35,0x45,0x78,0x4A,0xB5,0xF4,0x35,0x29,0x6A,0xB3,0x61,0x11,0x9D, +0x10,0x7A,0x0C,0xB8,0xCD,0x62,0x71,0xA5,0x57,0xB0,0xCB,0x8A,0xDB,0xB4,0x3D,0xFC,0x7B,0xB1,0x63,0xD6, +0x2C,0x94,0xDC,0x5C,0x93,0xB4,0xD8,0xB5,0x1F,0x02,0xF7,0xAF,0xBE,0xB0,0x11,0x5F,0xF2,0x87,0x10,0xA5, +0x91,0x60,0xBF,0x3B,0xFA,0xDE,0x3C,0xDB,0xFF,0xFF,0x16,0xD1,0xFB,0xA1,0xD2,0x4E,0xFB,0x44,0xB0,0x52, +0x22,0x75,0xF0,0x6A,0xD8,0x6D,0xA8,0x62,0x63,0x34,0x0C,0xEB,0xA8,0x4F,0x38,0xC3,0xC5,0xCC,0x58,0x9C, +0x8D,0xE1,0x39,0x31,0xA0,0xAD,0xB9,0xEB,0x61,0xA3,0x81,0x10,0x61,0xC3,0x6E,0x97,0xD8,0xF2,0x77,0x16, +0x20,0xDC,0x6E,0x55,0x89,0x7E,0x4B,0x1A,0xE5,0x45,0x35,0xB0,0x53,0x60,0xFB,0x5F,0xA1,0x80,0x9A,0xBB, +0xB1,0xAF,0x70,0x3C,0x44,0x3C,0xC5,0x8E,0xAF,0x2B,0x5E,0x32,0x63,0xBA,0x89,0xD4,0xB2,0xA7,0x62,0x8F, +0x45,0xE6,0x48,0x06,0xB8,0xF4,0x7F,0xA3,0xEA,0x0B,0x52,0x74,0xAA,0x64,0x2E,0xE5,0x87,0x8D,0x41,0x69, +0xFB,0x24,0x37,0x57,0x62,0x84,0xB1,0x59,0x13,0x19,0xF1,0x8C,0xC7,0x05,0xA7,0x5D,0x3A,0x76,0xB6,0x6A, +0xF7,0x49,0x90,0x09,0xEF,0xB5,0x42,0x20,0x2B,0x68,0x97,0xCE,0xD8,0x49,0x74,0x1E,0xE8,0x8A,0xB7,0x2C, +0x15,0xF6,0x62,0x46,0x6D,0xE2,0x5A,0x94,0x85,0xC8,0x15,0x6B,0xE8,0x02,0x6F,0x93,0x9B,0xFA,0x6B,0xAB, +0xEA,0x9A,0x2C,0x9F,0xDC,0x68,0x3E,0xEA,0x05,0x06,0xB0,0xDA,0x4F,0x23,0x63,0x3D,0x20,0x21,0xA3,0xBF, +0xFB,0x5B,0x6F,0xCC,0x38,0xBE,0xF8,0xA2,0xAF,0x40,0x04,0x2E,0x31,0x4C,0x7E,0xFF,0x73,0x66,0x72,0xA7, +0x89,0x4E,0x90,0xDC,0x2F,0x6F,0xDA,0x9D,0x6B,0x03,0xC2,0x58,0x5D,0x5C,0xF7,0x2B,0x7D,0x6B,0xA5,0x61, +0x99,0x25,0x08,0x09,0xB5,0x6E,0x46,0xE9,0xE2,0x73,0x41,0xDD,0x93,0xCB,0x8A,0xDD,0x3A,0x84,0x9D,0xBF, +0x83,0x49,0xA8,0x0E,0xE3,0x03,0x7C,0xCA,0x11,0xCF,0xD0,0x99,0x10,0xFD,0xA5,0x24,0x72,0xA2,0x14,0x26, +0x52,0x02,0x05,0xB4,0xA3,0x4D,0x23,0x96,0x25,0xCD,0xD8,0xEE,0x6F,0x4F,0xA4,0xA4,0xD2,0x7C,0xBA,0xD3, +0xE3,0xE2,0x07,0xDA,0xF1,0x3A,0x4C,0xB4,0x35,0x3E,0xED,0x27,0x65,0x2D,0x6C,0xF3,0xC1,0x77,0x87,0x85, +0x6C,0x37,0x60,0x5A,0x82,0x61,0x62,0x4B,0x73,0x2F,0x7E,0x42,0xA2,0xDC,0xCE,0x34,0x03,0x95,0xD4,0x64, +0x08,0x18,0xB4,0xAB,0x7F,0x79,0x74,0x62,0x3B,0x15,0xB4,0x2B,0x00,0xBF,0x14,0x67,0x00,0x45,0xA4,0x76, +0xEE,0x1D,0x3D,0x43,0x22,0x1E,0xD0,0x2F,0x17,0xBC,0x95,0x09,0xE2,0x50,0x8D,0xE0,0x1B,0xE7,0x45,0xD5, +0xAA,0xB9,0x75,0xE5,0x10,0xCE,0x25,0x75,0x84,0xB1,0xE5,0x0E,0x0F,0xE6,0x78,0x8E,0xC9,0x9B,0x84,0xD3, +0x7B,0xCF,0x01,0x2C,0x7A,0x2D,0x31,0xCE,0x83,0xF7,0x9E,0x68,0xD8,0xB8,0x31,0xD6,0xCC,0x25,0x09,0x4B, +0xED,0xD4,0xCB,0xDE,0x8A,0xD4,0xAE,0x7A,0x24,0x17,0x28,0xD3,0x05,0xE6,0x2F,0x53,0x8B,0x52,0x8F,0x88, +0x7A,0x06,0xDF,0x6A,0x2D,0x96,0x8E,0x9F,0xBD,0x57,0x4D,0xF3,0x69,0x1A,0x07,0xA7,0x5A,0xFF,0x26,0x64, +0x6D,0xBD,0x9E,0x69,0x3C,0x2E,0x89,0xED,0x6C,0xFF,0x16,0x34,0x91,0x7A,0x42,0xB5,0x22,0x64,0x31,0xAF, +0x03,0x7F,0x04,0xC4,0x17,0x1F,0x61,0x3B,0xAD,0x75,0x7F,0x2C,0xA3,0x07,0x9B,0x49,0xA8,0xCC,0xFF,0xCD, +0x36,0x6F,0x7E,0xF3,0x5B,0xA1,0x43,0xA5,0xA2,0x04,0x8E,0xF4,0x4E,0x30,0x1E,0x79,0x4A,0xF0,0x9C,0x7F, +0x66,0x17,0x5B,0x25,0xA5,0x3F,0xA5,0x68,0x9B,0x56,0x02,0xD1,0xC0,0x64,0xC8,0x58,0x3F,0xEF,0x7C,0x23, +0xA4,0x00,0x88,0x12,0x90,0x82,0xF6,0xC1,0x0A,0x1C,0x78,0x9E,0x40,0xE7,0xB1,0x70,0xF8,0x23,0xA9,0x17, +0x13,0x81,0x49,0x24,0xE0,0x63,0x35,0x15,0x54,0x52,0xFC,0xE0,0x01,0x0E,0xF3,0xCB,0xED,0xE1,0x6F,0xE7, +0x2E,0x09,0xE9,0x3E,0x76,0xE5,0xE0,0x9A,0x71,0x82,0x98,0x42,0x94,0xD1,0x50,0x5E,0xE7,0x4C,0x96,0x02, +0x55,0xF6,0x72,0x5A,0x26,0xF5,0x17,0xA7,0xB4,0xE5,0xF8,0x70,0x17,0x89,0x07,0xB1,0x9D,0x74,0x41,0x03, +0x27,0x79,0xB6,0xC3,0x84,0x54,0x75,0x81,0x67,0x4E,0x31,0x4E,0xA1,0xEB,0xD6,0x94,0x45,0x75,0x54,0xD3, +0x85,0xF1,0xBF,0xF1,0x47,0x16,0xF1,0x73,0x0B,0x76,0x70,0x44,0xE7,0xEC,0xE3,0x78,0xBD,0x57,0xA2,0x35, +0xC8,0x1C,0x1B,0xAC,0x5A,0xFB,0x2A,0x9E,0x49,0xFE,0x8A,0x1A,0x90,0xCB,0x9D,0x9B,0xF0,0xC2,0xC2,0xBC, +0xDD,0x50,0xB3,0x69,0x77,0x11,0x8A,0x60,0x0D,0xBA,0x97,0x0C,0x60,0x8B,0xBC,0xAD,0xFE,0x1A,0x90,0x49, +0x3E,0x01,0xC2,0xE5,0x62,0xA8,0xAF,0x44,0xCB,0xF9,0x83,0xEF,0x81,0x6A,0x6A,0x56,0xF3,0x0A,0xDA,0xB4, +0xB2,0xA1,0x4A,0xBA,0xB9,0xC3,0xF4,0x43,0xB7,0x9D,0x4A,0x0E,0xAE,0x74,0x46,0x21,0xDD,0xBC,0x42,0x88, +0xCD,0xC9,0xFC,0x57,0xDF,0xC0,0x33,0x8B,0x96,0x88,0x9C,0xCB,0x85,0x43,0x4B,0xBB,0x35,0xC1,0xAB,0x6B, +0x96,0xBF,0x73,0x5F,0x86,0x21,0x50,0xCD,0x9F,0xA5,0xEC,0x99,0xEB,0x34,0xFD,0x57,0x5F,0x33,0x76,0xD4, +0xCF,0xF4,0x70,0x4C,0xC7,0x4F,0x6A,0x40,0x60,0x7D,0x4F,0xD5,0x51,0x64,0xBF,0x61,0xA1,0x1C,0xED,0xE0, +0xC8,0xBE,0x65,0xA7,0xB0,0xBD,0xA4,0xB7,0x21,0x4C,0xB5,0x73,0x1B,0x33,0xFF,0x5B,0xCC,0xF0,0x61,0x27, +0xF6,0x40,0xCD,0xB5,0x1D,0xFD,0x7F,0xDD,0x4E,0xF7,0x1D,0x36,0x91,0xA8,0xF9,0xED,0xEB,0xCD,0x1E,0x55, +0x35,0x2C,0x68,0xC4,0x2F,0xE2,0x50,0xB9,0x95,0x1F,0xE5,0x66,0x37,0x8A,0xCC,0x19,0x9F,0x65,0x84,0xCF, +0x03,0xD9,0xAD,0x4E,0xC8,0x18,0x85,0x9C,0xEA,0x73,0xC2,0xCE,0xA1,0x5A,0x69,0xEC,0xAF,0x61,0x9D,0xC3, +0x0B,0xF4,0xD8,0x9C,0x7B,0x5B,0x19,0x78,0xF7,0x16,0xEA,0xF7,0x46,0x68,0xF8,0x53,0xA5,0x84,0xEC,0x33, +0xCF,0x5C,0xEA,0xF5,0xAF,0xF1,0xB6,0xBB,0x6F,0x37,0xE4,0xE8,0xC3,0x67,0x4B,0x41,0x0F,0xA9,0x09,0x7E, +0x74,0x07,0x50,0x5F,0x09,0x38,0x11,0x59,0xE7,0xB1,0x06,0x40,0x0E,0x21,0x45,0x3C,0xE0,0xCA,0x6D,0xF5, +0xC6,0xF0,0xFE,0x1E,0x19,0x05,0x20,0x2F,0xFE,0x1D,0x0C,0x9E,0x5D,0x0B,0x17,0xAB,0x8C,0x34,0x2B,0xC1, +0x44,0x67,0x28,0x48,0x69,0x56,0x87,0x8E,0x5C,0x04,0xA6,0x13,0xE2,0x11,0x5D,0x2C,0x92,0x41,0x36,0xC6, +0x68,0xCE,0x5F,0xF0,0xDF,0x5D,0xB1,0xDE,0x29,0x3E,0x2E,0x56,0x3D,0xB0,0x66,0x7F,0x0C,0xA7,0x7A,0xED, +0x0F,0x4C,0x98,0xCF,0xF5,0x24,0x9F,0x3F,0x54,0xCF,0x37,0x89,0x11,0xA7,0xE4,0x1C,0x86,0xFA,0xC7,0x5F, +0x9C,0xD3,0x10,0x2F,0x2D,0x1E,0xE8,0x7F,0xFD,0xDD,0xC5,0x0C,0xCF,0x52,0x11,0x47,0xCA,0x29,0x37,0x45, +0xE4,0x28,0x70,0x64,0x07,0xCB,0x6B,0x03,0xF1,0x9F,0x31,0x70,0x61,0x43,0xF7,0xFC,0x85,0xEC,0xD1,0xD2, +0xC3,0x09,0x4E,0x46,0xAE,0xDC,0x49,0x38,0x86,0x33,0x41,0xC1,0x47,0xAF,0x95,0xC3,0x42,0x0A,0x01,0x3B, +0xB6,0x96,0x1C,0xAB,0x68,0x32,0x9B,0xEB,0x6E,0x9E,0x01,0xC1,0xBE,0x4C,0x75,0xA7,0x91,0x6B,0xA1,0xBE, +0xFF,0x1F,0x95,0xBF,0xE3,0x37,0x0A,0x9F,0xE1,0xB1,0xF0,0x03,0xA3,0xC0,0xE3,0xD5,0x90,0x3A,0x48,0x5D, +0xD7,0xA8,0x66,0x4C,0x2A,0xF4,0xA0,0x98,0x53,0xC4,0xC5,0x1F,0x0F,0x64,0xBA,0xC7,0x0F,0x3A,0xC2,0xE5, +0x81,0x01,0x49,0x87,0x32,0xB3,0x6E,0xB3,0x63,0xF8,0x14,0xD5,0x24,0x18,0x41,0x65,0x2A,0xB6,0x12,0x86, +0xAB,0x3A,0xAE,0x9B,0x2D,0x02,0x2E,0x93,0x1B,0x31,0xA6,0xD8,0xB7,0x47,0x12,0xD5,0x18,0xC5,0x32,0x69, +0x79,0x02,0xB0,0xB9,0xEE,0xD4,0x10,0x39,0xEA,0x4F,0x2F,0x89,0xD6,0x14,0xC2,0x8D,0xB0,0xD1,0xBC,0x3D, +0x9C,0xD5,0x73,0x6D,0xC7,0x47,0x41,0xFD,0xD0,0x35,0x89,0x9D,0xB1,0xD0,0x9D,0x7F,0x66,0xF6,0x17,0x3E, +0x68,0xC3,0xF9,0x3D,0x6C,0xED,0x99,0x48,0xE3,0xEF,0xBB,0xCE,0x87,0x30,0x4C,0x51,0x69,0x2E,0x01,0x9F, +0x2A,0x99,0x1C,0xEC,0xE0,0x1E,0xCB,0x57,0x99,0x51,0x6B,0x40,0x5B,0x49,0x95,0x3C,0x15,0x2F,0xD4,0xBA, +0xB0,0xD3,0x03,0xE8,0x47,0x6C,0x09,0x68,0xBD,0x4E,0x18,0x12,0x55,0xC8,0xF8,0xF1,0x77,0x3C,0xE1,0x23, +0x38,0x70,0x5D,0x3E,0xE5,0x93,0xCC,0xCD,0xB1,0xFE,0x5D,0xB4,0x85,0x19,0x20,0x00,0x1E,0x06,0x1E,0xA2, +0xC3,0x4B,0x75,0x5A,0x8D,0x6B,0xCE,0x11,0xA3,0xED,0xF4,0xB3,0xCC,0x3E,0x9E,0xC2,0x9A,0xAE,0x37,0x31, +0xE2,0x4E,0x85,0x82,0x7F,0x11,0x7E,0x07,0x79,0x37,0x51,0xC7,0x02,0x72,0x11,0xFB,0x7D,0x10,0x75,0xF3, +0x43,0x73,0x36,0x35,0x5C,0x91,0xDD,0xF8,0xD6,0x1F,0xBA,0x57,0x11,0x8C,0x7A,0xFC,0x62,0xBB,0xFC,0x3B, +0x9E,0x39,0x2B,0x1D,0x60,0x8F,0x6D,0x55,0xD1,0xAB,0x2A,0x19,0x20,0x2C,0x34,0x50,0x4B,0x62,0x05,0xB3, +0x96,0x1A,0x08,0x67,0xD2,0xEA,0xD2,0xB2,0xDE,0x7A,0x6A,0x23,0xA2,0xCB,0xE0,0x65,0xD6,0xDC,0xFA,0x8E, +0x2B,0xCB,0x17,0x1C,0xCB,0xE6,0x85,0xC5,0x80,0xF3,0x5C,0x8E,0x44,0x51,0x62,0xCC,0x18,0xC6,0x82,0x4F, +0xA8,0x38,0xE6,0xDF,0x98,0x35,0x53,0x8C,0x81,0x61,0x3A,0xDF,0x16,0x8E,0xE1,0xDE,0x6F,0x22,0x22,0xEE, +0xE7,0xC6,0x5D,0x3C,0x26,0x6D,0xFC,0xBC,0x92,0x6A,0xAB,0xC9,0xAC,0x3E,0x7C,0xAA,0x19,0xC5,0x4F,0xAC, +0xEE,0x22,0xE9,0x04,0x11,0xB9,0x50,0xEE,0x24,0x00,0xB5,0x03,0x3B,0x97,0x25,0x4A,0x84,0x1A,0xBF,0x01, +0x76,0x06,0x86,0x40,0x28,0x11,0x1C,0xD8,0x1E,0xA0,0xFB,0xBE,0xCB,0x30,0x6D,0x54,0x91,0xED,0x79,0xE5, +0xD7,0xCC,0xE3,0xA6,0x3D,0x8C,0x66,0xE8,0xC8,0x5B,0x0D,0x0F,0xF7,0x70,0x59,0xF1,0x89,0x24,0x78,0x97, +0x23,0x83,0x35,0x69,0xE9,0x3D,0x2C,0x69,0x82,0xFD,0x8F,0x90,0x20,0x71,0x85,0x2E,0xC3,0x62,0xF2,0xB3, +0x4A,0x40,0xC5,0xFC,0xDA,0x4F,0x1E,0x3B,0xA7,0x20,0x74,0xF8,0xFD,0x88,0x70,0xC0,0xC6,0xC8,0xB4,0xE6, +0x6A,0x9D,0xA8,0x03,0x31,0x21,0xA0,0xAA,0xFE,0xC5,0x40,0x50,0x04,0x41,0xB8,0xF6,0x09,0x9C,0xB4,0x70, +0xB8,0x89,0x36,0xF4,0x10,0x0F,0xF5,0x41,0x85,0x82,0xD3,0x25,0x61,0x64,0x3C,0x11,0x5A,0x23,0x91,0xE9, +0x39,0xAE,0x41,0x51,0x84,0xC2,0x12,0x59,0x00,0xF8,0xF0,0x5D,0x76,0x30,0x54,0x39,0xB5,0xDB,0xA4,0x3C, +0xD5,0xFB,0x8E,0x61,0xF7,0x6D,0x56,0x9B,0x45,0x7A,0xED,0xD0,0x17,0xA5,0xEB,0x43,0x37,0x87,0xEF,0xE7, +0x2F,0xEE,0x76,0x31,0x6D,0x57,0x81,0x08,0x07,0xE4,0xB1,0xEA,0x46,0x4D,0xEB,0x07,0xCA,0x4B,0x57,0x6F, +0x0A,0x71,0xE9,0x57,0x76,0xA1,0x38,0xF3,0x66,0x45,0x79,0xE6,0xA7,0x15,0x33,0x08,0xDD,0x8E,0x5D,0x1D, +0x15,0xEC,0x4A,0x48,0x0D,0xC0,0x36,0x70,0xD1,0x8A,0x52,0x3E,0xE4,0x60,0x7E,0x95,0xEA,0x0D,0x02,0x6A, +0x45,0xC6,0x9A,0xBA,0xD0,0x64,0x8E,0x4E,0x65,0x3B,0x85,0x4F,0x10,0xE8,0x4B,0xA9,0xC9,0xEE,0x18,0xAA, +0x4F,0xD5,0x73,0x1F,0x05,0x75,0x7C,0x19,0x55,0x78,0x5B,0x7F,0x4D,0xC6,0x5E,0xC0,0xBE,0xCB,0x6A,0x4E, +0x87,0xBB,0x4F,0x18,0xBD,0xC2,0x0A,0x7B,0x32,0xE0,0xD2,0x09,0xA7,0x1D,0xAA,0xD2,0x0D,0x80,0xAB,0x38, +0x89,0xA5,0x6B,0x5E,0x30,0xCF,0xFA,0x04,0x97,0xA4,0x39,0x86,0xE6,0x5F,0xBA,0x11,0x3B,0xD8,0x7D,0x7A, +0xBA,0xE2,0x5F,0xEA,0x61,0xB5,0x75,0x63,0xAC,0x24,0xE8,0xDD,0x02,0x23,0xA0,0x54,0xC9,0xF5,0x83,0x4D, +0xE3,0x10,0xFF,0x14,0x25,0x49,0x94,0x64,0x98,0x4D,0x93,0x1B,0x85,0xD6,0xD6,0xA4,0xC1,0x76,0x2C,0x0E, +0x16,0x13,0x94,0x68,0x99,0xBC,0x44,0x43,0x13,0xA4,0x29,0x49,0xC0,0x72,0x75,0x8F,0xAE,0xD0,0xDD,0x05, +0x7D,0xB7,0x1B,0x3D,0x47,0xB7,0xB1,0x67,0xFA,0x7F,0x95,0x11,0x87,0xA3,0x52,0x15,0x7C,0x45,0x63,0x0E, +0xE7,0x78,0x42,0x49,0x08,0xE8,0x3D,0xC5,0x83,0x62,0x37,0x35,0x46,0x01,0xC0,0x80,0xDD,0xB1,0x34,0xDF, +0x14,0x27,0x65,0xE9,0x5B,0x60,0x27,0x16,0x79,0xF7,0x81,0x98,0xE6,0xD8,0x84,0xD2,0xF5,0xF6,0x24,0xA5, +0x70,0x9E,0xAA,0xBC,0x3B,0x10,0x4D,0x0D,0x4A,0xDB,0x8B,0xE0,0x95,0x7F,0xFE,0x57,0xB6,0x3B,0xFA,0x67, +0xDD,0x26,0x24,0xB0,0x42,0x08,0xBC,0x57,0xE7,0xE7,0x5E,0x62,0x66,0xD5,0x9E,0xB3,0x9F,0xBE,0x3E,0x90, +0x07,0xF0,0x32,0xF0,0xF1,0x9A,0xC6,0x9B,0xCC,0x36,0xD6,0x87,0x95,0x89,0xE9,0x81,0x17,0x9B,0x9E,0x3A, +0xF0,0x74,0x47,0x2B,0xF0,0x95,0x89,0x11,0x1D,0x69,0x77,0x95,0x9A,0x2F,0x1C,0x2A,0x6F,0xC5,0xB1,0x73, +0xF1,0xD4,0xCF,0xCC,0x6B,0xB6,0x76,0xCF,0x15,0x68,0x5A,0x40,0x9E,0xBB,0x3C,0x57,0x46,0x6D,0x98,0xC9, +0x9F,0x35,0x77,0x8C,0x91,0x51,0xAC,0xC5,0xDD,0x99,0x16,0x2A,0x30,0x3C,0xF9,0xAD,0x47,0xB6,0x07,0x95, +0x13,0x22,0xA4,0xD5,0xDC,0x98,0xA7,0x43,0xAC,0x13,0xFD,0xAF,0xA2,0x1E,0x0C,0x10,0x6D,0xD3,0xAD,0xCD, +0x5D,0xBF,0xF8,0x5F,0xBD,0x9D,0x6F,0xCE,0xCF,0x0F,0xC6,0x47,0x18,0x62,0xA5,0xDF,0x5C,0xBE,0xA8,0xA5, +0x33,0x74,0x40,0x41,0x43,0xBD,0xA8,0xBF,0x52,0x0D,0x08,0x15,0xF1,0x1F,0xF7,0xF6,0xE8,0xE2,0xC1,0x05, +0x69,0x25,0xF4,0x14,0xCC,0x00,0x68,0x52,0xB3,0x71,0xB9,0xF2,0xEE,0x89,0xA6,0xE7,0x96,0xC2,0xF2,0x61, +0xC8,0x03,0x51,0xF0,0x7A,0x79,0xA5,0x82,0xA8,0x0B,0x38,0x04,0xE1,0x03,0x3F,0x50,0xB5,0x40,0x1D,0xF3, +0xE3,0x22,0x16,0xE0,0xE9,0xD5,0x0B,0xB9,0x1A,0x65,0x67,0xD8,0x44,0xEC,0x52,0x94,0x53,0xC5,0xC4,0x40, +0xEA,0x94,0x5B,0xA7,0x31,0x88,0xBE,0x0E,0xE0,0x20,0x92,0xF0,0x61,0x05,0x7F,0x7C,0xFE,0x44,0xBF,0xE4, +0x67,0x85,0x05,0x0A,0xC4,0x54,0x9B,0x96,0x91,0xCB,0x31,0x76,0x6A,0xB6,0x5E,0x64,0x32,0xD8,0xE6,0x93, +0xE7,0x5C,0xE7,0xA5,0xD5,0x74,0x06,0x2C,0xF4,0xEB,0xE5,0x28,0x38,0x1B,0x47,0x20,0x68,0x6A,0xCB,0x8A, +0xFD,0xE8,0xB5,0x43,0xD8,0xD4,0xDB,0xF1,0x3B,0x0B,0x64,0x04,0xA8,0xE6,0x22,0x4C,0x51,0x62,0xC3,0xB1, +0x29,0xB6,0x03,0x2C,0x52,0x2B,0x15,0x5A,0xE1,0xCA,0x6B,0x09,0xEB,0x40,0x20,0x9D,0xA7,0x5F,0x01,0x6F, +0x26,0x56,0x08,0x4A,0xB9,0x27,0x45,0x9D,0xE3,0xBB,0x3A,0x51,0x22,0x70,0xFC,0x70,0x34,0xF3,0x0D,0x0E, +0x69,0xF5,0x90,0xE8,0x4F,0x10,0xF5,0x13,0x60,0x02,0x6A,0xAC,0x87,0xFE,0x95,0x3F,0x89,0x2D,0xCF,0x1E, +0xA8,0x08,0xD3,0x46,0xF8,0x32,0x99,0xC7,0xE6,0x81,0xFF,0x1A,0xEB,0xE8,0xED,0xA8,0xDC,0x7D,0xCB,0x2A, +0xF1,0x09,0xB5,0x5A,0x3A,0x80,0x13,0x2C,0x22,0xB5,0xE3,0x3A,0x05,0xF2,0xBE,0x7F,0xAF,0xAD,0x39,0x78, +0x30,0x91,0xCF,0xA0,0x98,0xC1,0x2B,0x94,0x78,0xDF,0x17,0x1A,0x20,0x23,0x10,0x6A,0xCC,0x90,0xE9,0xCF, +0x09,0xE0,0x4C,0xC6,0x8A,0xDC,0xE2,0x71,0x20,0x0D,0x9F,0x7A,0x45,0x91,0x4E,0xA1,0xE6,0x92,0x41,0xD7, +0x86,0xDD,0xCD,0x34,0x35,0xCC,0xB5,0x6A,0x44,0x50,0x63,0x10,0x10,0x80,0x05,0xF2,0xFF,0x8C,0x26,0x82, +0xD7,0x92,0xFC,0x3B,0xDB,0xE5,0x9B,0x93,0x4B,0xD6,0x09,0xE5,0x45,0x28,0x81,0xE1,0x59,0x57,0x5B,0x27, +0xB7,0xBE,0xBB,0x30,0x75,0xDE,0x39,0x70,0x3F,0x43,0x45,0x01,0xE8,0x9D,0x11,0x3B,0xD1,0x20,0xAA,0x92, +0xC3,0x3A,0x88,0x3C,0xF4,0x65,0x0C,0x51,0xC0,0xE8,0x68,0x69,0x58,0x53,0xB9,0xC0,0xC2,0xF8,0xA2,0x32, +0x0E,0xC1,0xB2,0xEA,0x1B,0x78,0x7D,0x7C,0xB9,0xC9,0x68,0x08,0x81,0x7B,0xA9,0xEB,0xA6,0x72,0xCA,0x52, +0x92,0xE6,0x5D,0x6F,0xB5,0xA4,0x4E,0x3C,0x64,0xC3,0x61,0xCE,0x57,0xA6,0xAC,0xCE,0xA6,0xC6,0xF9,0x8B, +0xDB,0x1E,0x01,0xCB,0x17,0xF7,0x40,0xD6,0x90,0x77,0xE3,0xE2,0x77,0x86,0xF7,0xBA,0x40,0x34,0x27,0x47, +0x45,0x56,0xA1,0x18,0x85,0xD4,0x3E,0xBB,0x50,0x5E,0x7F,0x2E,0x96,0x41,0xF6,0x9A,0x08,0x09,0x6D,0x7F, +0xD9,0x74,0x36,0xFF,0x88,0x5C,0xF6,0x23,0xD2,0x3E,0x3C,0xF8,0x6A,0x6D,0x65,0xE3,0xD8,0x3F,0x06,0x5E, +0xC9,0xE1,0xBF,0xBE,0x90,0x9F,0x29,0xEE,0x4B,0x30,0xD2,0x69,0xC8,0x08,0x15,0x14,0x93,0x5D,0x1B,0x23, +0xD8,0x29,0x68,0x9D,0x17,0x56,0x59,0x3E,0xB3,0x15,0xD9,0x25,0xA5,0xFF,0x0C,0x95,0x3D,0xAA,0x56,0x1E, +0x47,0x79,0xA0,0xA7,0x48,0xE3,0x95,0x97,0xFA,0xED,0xD6,0x3F,0xE0,0x22,0x46,0x34,0xA4,0x42,0x14,0xB3, +0x35,0x1E,0x98,0x44,0x8A,0x5D,0x39,0x83,0xD5,0xBB,0x6B,0xDC,0xAC,0x53,0x67,0x2F,0x3D,0xCB,0x16,0x8C, +0x74,0x55,0x56,0xE4,0xA5,0x0E,0x19,0xC0,0x49,0xCE,0x99,0x23,0x3C,0xCA,0xD5,0xFB,0x00,0x96,0xF3,0x61, +0xB7,0x0B,0x12,0x62,0x47,0x76,0x13,0xA6,0x42,0x49,0xD3,0xC0,0x07,0x8D,0xD0,0xA9,0xFE,0xA6,0x06,0x74, +0xA6,0x46,0x43,0x94,0xFB,0x18,0xA6,0x04,0x44,0x80,0xF6,0x34,0xBC,0x07,0x2B,0xE0,0xAE,0x3C,0x3D,0xE3, +0xE4,0xD7,0xFE,0x28,0x45,0x81,0x3D,0xA9,0xF4,0xB1,0xC8,0x80,0x4B,0xCA,0x81,0x04,0x94,0xA5,0x6A,0x0E, +0x8B,0xEB,0xB7,0x3F,0xBD,0x57,0x4C,0x17,0x6D,0xF2,0x1E,0xAB,0x3C,0x37,0x93,0x80,0xD4,0x74,0xDF,0xED, +0x91,0xA4,0x2D,0x7D,0x87,0x80,0x41,0x05,0x78,0x72,0x8F,0x64,0x56,0x75,0x9D,0x27,0x9A,0x22,0x09,0xD8, +0xB4,0x67,0x4C,0x5D,0xBE,0x15,0x04,0xE1,0xBE,0x3F,0xD0,0x38,0x3C,0x14,0x73,0x66,0x31,0x82,0xBB,0xBB, +0x99,0x9C,0x59,0xD8,0x0E,0x84,0x75,0xBD,0x9A,0x27,0x9E,0xF8,0x4E,0xC4,0xA3,0x83,0x58,0xFF,0x57,0xD8, +0xB3,0x3E,0xD2,0xB0,0xB3,0xA0,0x78,0x81,0xB3,0x37,0xAB,0x6D,0x59,0xFE,0xF5,0xBA,0x2D,0xCE,0x46,0xF3, +0x75,0xCA,0x70,0x18,0xEB,0x41,0xF0,0x1C,0x9D,0xAC,0xAB,0xD3,0xD1,0xE1,0x16,0x2C,0xE3,0x0E,0xBB,0xC6, +0xC0,0x6D,0xBC,0xFB,0xCA,0x93,0xC7,0xC2,0x20,0xDE,0x21,0x84,0xC6,0x1D,0xC9,0xEC,0x91,0x8C,0x23,0xD5, +0x52,0x23,0x4C,0x90,0x06,0x9C,0x92,0xF3,0x1B,0x2E,0xAB,0x49,0x92,0x93,0x82,0x8B,0x1D,0xB8,0xF1,0x23, +0x8A,0xD3,0xBF,0xB6,0x15,0x0D,0x0F,0x48,0x57,0x27,0xCB,0x9B,0x83,0xF2,0x07,0x16,0xE6,0x73,0xF7,0xD5, +0xCD,0x1C,0xBB,0x4D,0xD6,0xC3,0x7D,0xF2,0xB5,0x5E,0x25,0x42,0xCF,0x07,0x73,0x35,0xB2,0x3F,0xB4,0x5F, +0x69,0x74,0xCA,0x23,0xFB,0x72,0x2D,0x52,0x44,0xB5,0x7C,0x3E,0xEF,0x78,0x33,0x12,0x21,0x78,0xAC,0xFA, +0x7E,0xF3,0x1D,0xF3,0xD2,0xD4,0x40,0x7B,0x5D,0xD2,0x6D,0x90,0xB1,0x7F,0x72,0xA7,0x34,0xB7,0x15,0x3B, +0x3B,0x5A,0x12,0x10,0x5E,0xCD,0x32,0x34,0x25,0xD7,0x54,0xF1,0x56,0x48,0x36,0xE8,0x66,0x99,0x06,0x7E, +0xB4,0x2B,0xF6,0xA3,0x1C,0x64,0xA5,0x4C,0xD0,0x55,0x96,0x64,0x3D,0xD4,0xBC,0x14,0xC6,0x24,0x15,0xC9, +0x47,0x78,0x65,0xBE,0x94,0xDA,0x34,0x0F,0x9F,0x6D,0x10,0x89,0x4B,0x07,0x88,0xF0,0x3D,0x07,0xA0,0x4D, +0x00,0xB3,0xD0,0x5C,0x9E,0xD7,0xFD,0x90,0x4E,0x16,0x07,0x44,0x04,0xD8,0x28,0x4C,0x81,0x26,0x14,0xCE, +0x3A,0x60,0x01,0x3E,0xBE,0xA3,0x7E,0xEE,0x24,0x66,0xEE,0x42,0x4D,0x9E,0xAE,0x1A,0xB7,0x99,0xD4,0x2D, +0x30,0x19,0x81,0x89,0x38,0xB1,0x59,0x1C,0x9F,0x59,0x5A,0x94,0x56,0x0D,0xF9,0x03,0x2C,0xFF,0x2E,0xE5, +0x0B,0x5C,0x4F,0x10,0x17,0xB7,0x6E,0x84,0x16,0x63,0x23,0x0F,0x9D,0xAF,0x98,0x3B,0xEB,0x7F,0x87,0xC7, +0x14,0x4E,0xD9,0x2F,0x3F,0x02,0x24,0x66,0xAF,0x4C,0xA7,0x26,0xB7,0x5B,0xBF,0x5B,0x89,0xFC,0x5D,0xED, +0x93,0xDA,0xF4,0x2D,0xFA,0x65,0xA2,0xCB,0x65,0xC0,0x6D,0xB0,0x4B,0x40,0x27,0x39,0xB2,0xAD,0xBA,0x8A, +0x63,0xA9,0xB2,0x57,0x33,0x52,0x2A,0x7F,0xD6,0xA2,0xAC,0x95,0xD8,0xB6,0xB3,0xA5,0x04,0x8C,0x19,0xCE, +0x34,0xC0,0xAA,0x89,0x29,0x90,0x8E,0xF0,0x04,0x9E,0xFD,0xBF,0xCE,0x60,0x17,0x88,0x3D,0x89,0x78,0xEE, +0xDF,0xC9,0x5B,0x74,0x30,0x71,0x35,0xB8,0x13,0x94,0x55,0x9C,0xC1,0x39,0xFF,0x07,0x56,0xE3,0xC4,0x81, +0x86,0x4A,0x62,0x42,0x3E,0x2B,0x2E,0x9C,0xCA,0x04,0x5D,0xF6,0x97,0xC9,0xF3,0xAE,0x01,0x7B,0xB7,0xE9, +0x26,0x44,0x88,0x13,0xA8,0x48,0xD9,0x86,0x03,0xCC,0xD9,0x27,0x77,0x0A,0x26,0x76,0xBB,0x98,0x10,0xD6, +0xC7,0x05,0x21,0x90,0xA4,0x9B,0x55,0x0D,0x0F,0xA3,0xB0,0xA0,0xEE,0x2D,0x8A,0x4B,0x28,0xE8,0x0F,0xC3, +0xAC,0x3A,0xB6,0x30,0x3C,0x9B,0xD9,0x08,0xE4,0xD5,0xF4,0xA1,0x6D,0x9C,0x53,0x39,0x66,0x97,0x49,0xE5, +0x35,0xF0,0x7A,0xF5,0xA6,0xE6,0x23,0xC6,0x20,0x22,0x60,0x19,0x05,0xBA,0xE9,0xAA,0x39,0x8A,0xBC,0xF5, +0x1C,0x3F,0x85,0x5A,0xB5,0x99,0x77,0x69,0xDD,0x7A,0x42,0x4D,0xAE,0x8F,0x66,0xC7,0x18,0x8F,0x3A,0x38, +0xA5,0xC6,0x67,0x36,0xBF,0xEA,0xFB,0x8E,0x48,0x0E,0xB7,0x2F,0x61,0x13,0x2B,0xED,0xDD,0x42,0x83,0xF3, +0x21,0x72,0xB3,0x26,0xA8,0x2F,0x76,0x64,0x70,0xFC,0x5F,0x9B,0x49,0x07,0xDA,0x4B,0x31,0x7A,0x82,0x40, +0x2C,0x52,0x28,0x01,0xE5,0x52,0x4E,0xAF,0x16,0x11,0xCD,0x34,0x99,0xA1,0x53,0x70,0x9D,0x98,0x84,0xB9, +0x37,0x03,0x7C,0xFF,0x13,0xDA,0xE4,0x5C,0x3B,0xDC,0x57,0x67,0xD3,0xA4,0xEC,0x6E,0x4F,0xB9,0xCE,0xA3, +0x9F,0x16,0x6D,0x27,0xD2,0x42,0xBC,0xF4,0xDE,0x05,0x86,0xF7,0xC2,0x33,0x3D,0x53,0xD2,0x68,0x0A,0x53, +0x73,0x70,0xE8,0xB3,0x75,0xB2,0x1B,0x3B,0x16,0xC1,0x6C,0x30,0x95,0x5B,0x84,0x7C,0xD1,0x72,0x72,0xB0, +0xE9,0xEF,0x7B,0xD5,0xBE,0x39,0x16,0x4F,0xC0,0x58,0xA4,0xEF,0xF7,0xE1,0x0A,0xD1,0x5D,0x7A,0x16,0xE1, +0x3D,0x34,0x35,0xA1,0xEC,0x5B,0x5D,0x24,0x91,0x16,0x4F,0x2A,0x5E,0x7B,0xA5,0xCB,0xB2,0xC3,0x17,0x2E, +0x40,0x5A,0x79,0x97,0x0C,0xFB,0xDD,0x87,0x2E,0x32,0x11,0x73,0xC9,0xEB,0xAC,0x2A,0xFD,0x77,0x11,0x4E, +0x4B,0x28,0x18,0xFA,0x49,0x07,0x4E,0x55,0x98,0xED,0xB2,0x2A,0x25,0x53,0x61,0x38,0x6A,0x25,0x23,0xAD, +0x41,0x0B,0x7C,0x09,0xAA,0x2F,0x6F,0x50,0xE0,0xE7,0x2F,0x53,0xE8,0x37,0x71,0x9F,0x48,0x98,0x5C,0x82, +0xC7,0x79,0x17,0xA6,0x6D,0x8F,0xA5,0x42,0xFF,0xD8,0x24,0xC0,0x29,0x0E,0xCA,0xD6,0x3F,0x88,0x1C,0x07, +0xC9,0x51,0x12,0x69,0x74,0xF6,0x06,0x5C,0x5C,0x1D,0xB6,0xD8,0xDB,0x9C,0x52,0xFF,0xCA,0xD7,0xA6,0x5C, +0x25,0x3F,0x78,0x8E,0x68,0x0E,0x4B,0xBE,0xFF,0x95,0x1D,0x12,0x49,0x58,0xD3,0x6F,0xFF,0xE4,0x14,0xD9, +0xAD,0xDF,0xC3,0x22,0x52,0x30,0xE0,0x1B,0xCF,0x84,0xBF,0xFF,0x46,0x72,0x60,0x2D,0x7C,0xD5,0xC0,0x48, +0xFB,0xAF,0xE4,0xDC,0xB9,0x41,0x70,0x1B,0x87,0xE6,0x8D,0x96,0x50,0x92,0x68,0x2B,0xC6,0xA7,0xB8,0x5D, +0x41,0xF1,0xE8,0x2F,0x53,0xFA,0x32,0xFA,0x16,0x19,0xF8,0xEF,0x71,0x5D,0x50,0x07,0xAF,0xCD,0x18,0x21, +0x29,0xED,0x49,0x11,0xA6,0x8E,0x00,0x11,0x68,0xAC,0x95,0x40,0xF5,0x62,0xAF,0x51,0xBD,0x32,0x98,0xAA, +0x4D,0xC9,0x59,0x44,0x0A,0x50,0xBC,0x00,0x05,0x1B,0xFE,0x50,0xA6,0xF4,0x79,0x21,0x37,0xE9,0xD0,0x67, +0xB6,0x0A,0x00,0xF0,0x42,0xCC,0x90,0xB4,0xD1,0x10,0x79,0x1E,0x67,0x29,0x41,0x59,0x1A,0xC3,0x09,0x01, +0x85,0x79,0x43,0x5C,0xA9,0xE6,0x30,0x5C,0x41,0x8D,0x3A,0x25,0xB9,0x08,0x43,0x91,0x6B,0xC8,0x69,0x68, +0x53,0x33,0xDD,0x8F,0x02,0x02,0x32,0x41,0xE5,0xD4,0x0A,0x1A,0xAB,0x67,0xCC,0x13,0x7E,0x68,0x7A,0x2F, +0x11,0x92,0xEB,0x3C,0x1B,0xBB,0xAA,0x9F,0xBA,0x42,0x29,0x21,0x21,0xED,0xF4,0xAB,0x2D,0x38,0x0A,0x70, +0x09,0xE8,0x93,0x59,0xAE,0x26,0x36,0x10,0xA8,0x45,0x89,0x6D,0x00,0x0D,0x6C,0xF7,0xD1,0x77,0x5A,0x06, +0x26,0x8F,0x3F,0x2C,0xA9,0x1A,0x68,0xBA,0xB6,0x2D,0xB5,0x3D,0x64,0xC0,0x12,0x2E,0x59,0xC3,0x56,0x0C, +0xE1,0x8E,0x52,0x3A,0x69,0x78,0x39,0xDB,0xF4,0x7E,0x1A,0x3E,0xCF,0xC0,0x9A,0x3A,0x40,0xE2,0x72,0xCF, +0xB6,0xB8,0x27,0xBC,0xE4,0x03,0x13,0x2F,0x89,0xC1,0x37,0xEA,0x9D,0x8E,0x7A,0xDF,0xDC,0xB3,0xD5,0xE6, +0xBE,0xCF,0x31,0x86,0x6C,0xAA,0x46,0xAF,0x93,0xE9,0x8A,0x71,0xA8,0x9D,0xE5,0x0E,0x07,0x50,0x90,0x85, +0xC5,0x4F,0x1C,0x22,0x45,0xF0,0x91,0xA2,0x2D,0x6E,0x68,0x5C,0x8E,0x4E,0x9C,0xC0,0x07,0xAD,0x14,0x5E, +0x61,0xBC,0xDE,0xA4,0x05,0xD3,0x0E,0xC0,0xBA,0x6E,0x6F,0x1B,0x9C,0x7D,0x6A,0xA6,0xF2,0x51,0x17,0x36, +0x52,0x26,0xF7,0xCA,0x89,0xF1,0x43,0xB4,0x14,0xDC,0x42,0xBF,0x50,0xF5,0x91,0x2A,0x59,0xD9,0xB2,0x86, +0xDD,0x72,0x74,0x12,0xDB,0x25,0xBE,0xFB,0xF4,0xBC,0xD7,0x48,0x26,0x35,0x8A,0x27,0xF5,0xF5,0x87,0xED, +0xE3,0x7A,0x45,0x94,0x34,0x05,0x1A,0x84,0x5B,0x20,0x42,0x50,0x57,0x19,0x8A,0x9D,0x84,0x1A,0xBA,0x05, +0x74,0xF2,0xDA,0xFB,0xA1,0x8F,0xCB,0x97,0x61,0x13,0xD9,0x91,0x5C,0xB2,0xDD,0xEF,0x0A,0x7B,0xBE,0x72, +0x2C,0xDA,0xE3,0x5E,0x9D,0x23,0xF6,0x02,0xC6,0xD5,0x96,0x0E,0xA1,0xF7,0xD1,0xBE,0xC6,0xDD,0x7D,0x60, +0x3B,0xAB,0x46,0x83,0x86,0x9D,0x80,0x82,0xDE,0x9C,0xA5,0x24,0x51,0x1B,0xA7,0xB2,0x43,0x27,0x21,0xC9, +0x1F,0x51,0x03,0xD0,0x5F,0x9F,0x75,0x34,0xC7,0xF2,0x5B,0x1B,0xA6,0xB6,0x05,0x0B,0x78,0x74,0x81,0x82, +0x5E,0xB9,0x66,0xDB,0x1E,0x98,0xEA,0x51,0xD5,0x0A,0x4E,0x11,0xE1,0xEA,0x32,0x3E,0x72,0xFA,0x70,0x1C, +0x35,0x86,0x5C,0x2D,0xD3,0x16,0x0A,0x98,0x9C,0x60,0xB4,0xEB,0xFD,0xB5,0x15,0xEF,0x8E,0xAC,0xB9,0x55, +0xBA,0x11,0x7F,0xE7,0xE8,0xCD,0x7F,0x36,0x5D,0x03,0x2B,0xBD,0x4D,0xBF,0xD9,0xD7,0x54,0x3A,0x93,0x61, +0xEC,0xBE,0x67,0x1D,0xDB,0xFF,0xA7,0x29,0xC8,0x31,0xC1,0x56,0xB1,0x4E,0x37,0x26,0xAB,0x24,0xD0,0x34, +0x73,0xF8,0x51,0x1F,0xC7,0x0B,0x8C,0x16,0x15,0x5A,0xB4,0xB5,0xBA,0x5A,0xE0,0xB6,0x50,0x04,0x90,0x72, +0xB4,0x6E,0xE2,0x45,0xD0,0x59,0x2B,0xC3,0xE4,0x0F,0xF1,0x65,0xFE,0xEF,0xC7,0x62,0xB9,0x41,0x89,0x6B, +0xD2,0x03,0x5A,0x57,0xA1,0xC8,0xE1,0xC8,0x85,0x67,0xC6,0x1E,0x8F,0x66,0x86,0xB5,0xAD,0xF4,0x56,0x88, +0x25,0x89,0x67,0x8C,0x4C,0x29,0xB5,0xA1,0xA0,0x45,0x35,0xCC,0x78,0x5A,0xE2,0x37,0x70,0x8E,0x38,0xC5, +0x57,0x3D,0xEA,0xC4,0x11,0x39,0x91,0xAF,0x69,0x8D,0x71,0x69,0xF1,0xAD,0xCB,0x64,0xB2,0x99,0x72,0xD5, +0x91,0x95,0x4D,0xA4,0x2C,0x24,0xBB,0xE1,0x0B,0x1E,0x00,0x9D,0x8D,0x2A,0x17,0x65,0xA4,0x05,0x1F,0x6C, +0x08,0xA3,0x6C,0x2E,0xA9,0xCB,0x40,0xAE,0x5D,0x02,0x53,0x35,0x0F,0x39,0xA0,0x66,0xBA,0xD9,0x7A,0x7C, +0x32,0xC2,0xFA,0x78,0x76,0xE2,0xF8,0x2E,0x29,0xF5,0x7D,0x30,0x9E,0x38,0xA2,0xDA,0x44,0x0B,0xAB,0xFD, +0x07,0x65,0xD2,0x9D,0xB1,0xAD,0x8C,0xC3,0x52,0x6A,0x9B,0xDB,0x4B,0x03,0x9F,0xDF,0x5B,0x23,0x1B,0x5D, +0xDF,0x60,0x92,0xA6,0xE1,0xF9,0x2A,0x5A,0xB1,0xB9,0x2D,0x1F,0x63,0x00,0x37,0xA3,0xD6,0x70,0xA2,0xDA, +0xE7,0x6C,0x64,0xA9,0x6A,0x9C,0x73,0x81,0xC1,0x2F,0x87,0x17,0x84,0x10,0x38,0x72,0x65,0x20,0x4E,0x7A, +0xFF,0xE4,0x34,0xAD,0x96,0xB5,0xE4,0xDD,0x91,0x6F,0x23,0x54,0x19,0x67,0x65,0xA9,0xB3,0xE0,0x91,0x20, +0xF9,0xDF,0x62,0xE0,0x23,0x82,0xB2,0x88,0xDB,0xB5,0xA4,0xD7,0x6E,0x8F,0xF4,0xE4,0xDC,0xFD,0xC3,0xD0, +0x6B,0xE4,0xB7,0xCA,0x02,0xF1,0x24,0x20,0xC2,0xDA,0xD3,0x26,0xF3,0x79,0x3B,0xBD,0x2D,0xB4,0x2D,0x0F, +0x49,0xEE,0x85,0x23,0x7D,0x8E,0xED,0x58,0xCE,0x30,0x9C,0x15,0xBE,0x22,0x21,0x30,0x64,0x50,0xDA,0x88, +0xE7,0x41,0x29,0x45,0xF9,0x7C,0xD3,0x60,0x7A,0x44,0x9D,0x54,0x97,0x32,0x2A,0xE7,0x97,0x5B,0x7B,0x0B, +0x8F,0x7B,0xE0,0xA3,0x5F,0xE3,0x9C,0xCD,0x11,0x85,0x7C,0xAE,0x47,0x3B,0xF6,0x51,0x5D,0xFF,0x1C,0xF1, +0x07,0xE9,0x95,0xCC,0x11,0x30,0x13,0x30,0xBA,0xA6,0x65,0x54,0x13,0x15,0x33,0xEC,0xC8,0xC6,0xCF,0xA7, +0x10,0x33,0x1D,0xCE,0xEB,0x3B,0xF5,0xAC,0x0C,0x32,0x31,0xA4,0xD4,0x29,0x2D,0x46,0x83,0x97,0x56,0xCA, +0x9F,0xD3,0x06,0x28,0x6A,0x01,0x1B,0x0B,0xC8,0x16,0x2B,0x98,0xBE,0x2F,0x5E,0xDA,0xE4,0x8F,0x18,0xE2, +0xF4,0x1B,0xC7,0xC1,0x61,0x58,0xA0,0x93,0x68,0x91,0xD0,0x94,0xEE,0x48,0x57,0x25,0xA6,0x61,0x71,0xB5, +0x29,0xBE,0xDF,0x03,0x42,0x96,0x57,0xB1,0x8A,0xA9,0x34,0x38,0x6A,0x44,0x42,0xBB,0x5E,0x70,0x42,0x3C, +0x32,0x33,0x7E,0x2A,0xBE,0x83,0x04,0x9E,0x54,0xF0,0xF9,0xE4,0x2D,0x57,0xEE,0x21,0x06,0xA6,0x0B,0x58, +0x9C,0x3D,0xBE,0xA3,0xCC,0x72,0x21,0xF4,0xA9,0x2C,0x07,0x14,0xD7,0xE5,0xF0,0x16,0x81,0x21,0x03,0x3D, +0x5B,0x86,0xF9,0x9E,0x56,0xB9,0xEF,0x24,0xCA,0x7D,0x01,0x16,0xAB,0xF4,0xE1,0x2C,0xFD,0x45,0x18,0xE2, +0x44,0x20,0x4C,0x86,0xE8,0x80,0x90,0x50,0xE7,0xC6,0xAB,0x54,0xF7,0xE6,0xB9,0x96,0x56,0xBD,0x4A,0x09, +0xDB,0x0A,0x40,0x15,0x61,0x7E,0xC0,0xB4,0x50,0x8B,0xB0,0x01,0x53,0x77,0x0D,0x45,0x17,0x76,0xE1,0x67, +0x67,0xA7,0x39,0x4E,0x77,0x87,0xE9,0xC7,0x52,0x2E,0xCF,0x13,0xFE,0x25,0x03,0x83,0xE3,0x5C,0x81,0xE7, +0x22,0xEC,0x1F,0x29,0x00,0xB6,0x2F,0xB6,0x1A,0xAB,0xD0,0x10,0x2C,0xAE,0xB4,0x8E,0x76,0xA9,0x6C,0xA2, +0xF8,0x2A,0xC8,0x3D,0x97,0xC5,0x02,0x12,0x19,0x4E,0x1F,0xB6,0x1B,0x3E,0x2A,0x67,0xED,0x85,0xB1,0xDA, +0xDE,0xA0,0x0F,0x64,0x67,0xF9,0x0E,0x14,0xEF,0x8A,0x3D,0xA0,0xA1,0x81,0x89,0x55,0xEE,0xAA,0xFB,0x4E, +0x2C,0x83,0x50,0x8A,0x2B,0xA5,0xB7,0xCD,0xC6,0x52,0x22,0x7C,0xF7,0x7E,0x0D,0x5A,0x40,0x67,0x8A,0xFE, +0xA7,0xE7,0x86,0x89,0x56,0x81,0xAB,0xED,0xCF,0x06,0x42,0x26,0x69,0xF8,0x31,0xC7,0xDF,0xE1,0x6B,0x27, +0x65,0x1B,0xDD,0x90,0xF7,0x1C,0x93,0x31,0x40,0x37,0x1C,0x51,0x01,0xA8,0xBF,0x68,0xF5,0xE5,0x19,0xEC, +0x71,0x00,0x42,0x5D,0x40,0x3D,0x6F,0xCF,0xD5,0xE4,0xCF,0xEA,0xAF,0x27,0xA8,0x53,0x9C,0xAF,0x48,0xDA, +0xD3,0x63,0xB8,0x33,0x7A,0xEA,0x0A,0x11,0xB8,0x80,0x52,0xA0,0x0F,0xE0,0x68,0x7A,0xF0,0x40,0x82,0xFC, +0x82,0x62,0x1B,0x56,0x6E,0x71,0x26,0xAD,0xAD,0xFE,0xD7,0x09,0x39,0xF3,0x5C,0x8D,0xBD,0xCE,0xFC,0x6B, +0x2C,0x20,0x14,0xDB,0x8C,0xF3,0x29,0xDF,0x53,0x8B,0xA1,0xA5,0x7C,0xE9,0x22,0xAE,0xA4,0xB5,0xD2,0xD7, +0xD6,0xBB,0xA3,0x26,0x76,0xD2,0x4D,0xDC,0x72,0xE2,0x16,0x22,0xDA,0x0E,0x51,0x94,0x75,0xE4,0x04,0x83, +0xC4,0x2E,0xE5,0xA3,0xA0,0x9D,0xB5,0xB3,0x5B,0x2D,0x27,0x77,0x65,0xED,0x8E,0x41,0x19,0x73,0x81,0x23, +0xE6,0x00,0x92,0xAA,0x4E,0xD7,0x5E,0xB8,0x4B,0x4F,0x02,0x82,0x44,0x72,0x79,0xE9,0xFB,0xED,0xB4,0xBC, +0xEC,0xB7,0x6A,0xFD,0xB4,0xFC,0x89,0x66,0x0D,0xAB,0xA5,0x95,0x31,0xFB,0xCB,0x76,0xEF,0x44,0x7C,0x76, +0x25,0x94,0x2C,0x18,0x9C,0x7E,0x32,0x14,0xDB,0x58,0x2D,0xD6,0x72,0xB5,0x41,0x37,0xF6,0xB9,0x33,0x12, +0x59,0x46,0x95,0xB8,0x11,0x5B,0x3D,0xC2,0xD3,0x93,0x36,0x99,0xC8,0x81,0x80,0x7F,0x37,0x08,0xB4,0x73, +0xEC,0xFF,0x9D,0x32,0xC7,0xFC,0x1B,0xD1,0xE9,0xE5,0x0E,0x51,0x1B,0x58,0xCB,0x55,0xA1,0xA5,0x16,0x60, +0xCC,0x28,0x19,0xBA,0xE8,0x04,0x7F,0xE8,0xCC,0x46,0x93,0xC1,0xE4,0x84,0x1F,0x70,0x82,0x3C,0x0C,0x4D, +0x3F,0xFC,0x6D,0x5C,0x94,0x98,0x18,0x2B,0xAF,0x55,0x50,0xE1,0xCF,0xD8,0x04,0xE0,0xFF,0xB2,0x65,0x4C, +0x91,0x99,0x7F,0x37,0xE7,0xE0,0x5E,0xB9,0x0C,0x03,0xBF,0x43,0x9B,0x3D,0x51,0x15,0x05,0xA3,0xA6,0x11, +0x85,0xFA,0x95,0xFE,0xFB,0xF7,0x67,0x32,0x1D,0x0D,0x20,0x15,0x2F,0x76,0xC6,0x15,0x00,0xFD,0x59,0x6A, +0x51,0x03,0x18,0x49,0xD4,0xFC,0x22,0x4B,0x19,0xBE,0xFF,0x10,0x5F,0xFF,0xC8,0x0B,0x8F,0x3C,0xB9,0x23, +0x2A,0x44,0x82,0x7F,0x84,0xA0,0x6F,0x7B,0xFC,0x13,0x08,0x50,0x33,0x50,0xC0,0x7E,0xB3,0x62,0xAD,0x11, +0xE1,0xE1,0x37,0xBB,0xBB,0xD6,0x68,0x12,0x23,0xFD,0x3C,0x76,0xAE,0x4D,0xB8,0x42,0x23,0x5D,0x21,0x6A, +0x8C,0x1C,0xB9,0xFE,0x90,0x4F,0xC0,0x92,0x31,0x7D,0x29,0x11,0xB9,0xED,0xCF,0xBF,0xD4,0xBE,0x71,0x36, +0x7C,0x0C,0x6E,0x7B,0x47,0x29,0x67,0x36,0xC5,0x73,0x36,0x2B,0x35,0x97,0x3F,0x20,0x7A,0x68,0xBF,0x36, +0xC0,0xBB,0x6F,0xB0,0x4E,0xEF,0x9A,0x93,0xF1,0x62,0x13,0x50,0x83,0x85,0x61,0x2A,0x86,0x88,0x38,0x34, +0xC3,0x48,0xA0,0x50,0xAC,0xE8,0x23,0x51,0x81,0x86,0x51,0x0A,0x6F,0x5A,0x29,0xE1,0x22,0xB9,0x99,0xF2, +0xB1,0x33,0x76,0x61,0x70,0x98,0x51,0xAE,0xE0,0x27,0xA0,0x56,0x62,0xCD,0x0D,0x8B,0x5E,0xCA,0x62,0x0A, +0x61,0x05,0x87,0x52,0xAD,0xF4,0xB0,0x36,0x4D,0xBC,0x24,0xDF,0xB0,0xC3,0x6A,0x1A,0x6C,0x04,0xB1,0x47, +0x49,0x2D,0x14,0xFE,0xA3,0x05,0xBC,0x64,0x89,0xCD,0x63,0x0B,0xAE,0x05,0x2C,0x62,0x45,0x96,0x9F,0x33, +0x89,0xFE,0xA1,0x29,0x5D,0x7C,0x6B,0x1B,0xA7,0x04,0x22,0x42,0x60,0xD7,0xEB,0x7F,0x63,0xB0,0x94,0x26, +0xB2,0x1F,0x79,0xCD,0x04,0x6E,0x02,0x58,0xC3,0xD1,0xFD,0x87,0xFF,0xE4,0x82,0xF3,0xB1,0x6F,0x9C,0xDC, +0x4B,0x92,0xC8,0x43,0x3A,0x29,0xA5,0xFA,0x4E,0x49,0x4D,0x58,0xB2,0x24,0x09,0xD4,0x71,0x0D,0x2F,0xDE, +0xBB,0x26,0x2B,0x97,0x77,0xB6,0xED,0x50,0x0C,0xC1,0x74,0x39,0x83,0xBD,0xCA,0x22,0x16,0x89,0xE0,0x9B, +0x67,0xB2,0xCD,0xDD,0x30,0x6C,0x24,0xBD,0x83,0x52,0x2F,0xEA,0xE5,0xCC,0xCB,0xB0,0xE7,0x57,0x3B,0x55, +0xA6,0x70,0x33,0xDF,0xF8,0xEC,0x2B,0xA3,0x5A,0x94,0xEA,0x15,0xE4,0x56,0x19,0xC6,0x9A,0xE7,0xCB,0x31, +0x84,0x6E,0x38,0xDA,0x64,0xF7,0xA5,0x13,0xCE,0x17,0x32,0x3A,0x9B,0xC4,0x22,0xEA,0xA7,0x21,0xAD,0x64, +0x51,0xB3,0xF2,0x43,0xE7,0x53,0x36,0xDB,0x24,0x8F,0x56,0xC4,0xC9,0xF2,0x68,0x57,0x69,0x3E,0xC4,0xA6, +0xA9,0x49,0x44,0x55,0x0E,0xDB,0x12,0x43,0x27,0xBE,0xF6,0x27,0x1D,0x77,0x32,0x82,0xEE,0x23,0xBE,0xF4, +0x57,0x1B,0x7F,0x7D,0x49,0xD0,0x45,0xDA,0xE9,0x77,0x05,0x96,0xBE,0x11,0x42,0x96,0x8A,0x18,0x2F,0xC1, +0x42,0xB8,0x04,0x11,0x8C,0x36,0xA0,0x83,0x75,0x08,0x9D,0xCA,0xFB,0x1B,0xB7,0x0C,0x3A,0xEA,0x2E,0x06, +0xF0,0x2B,0xD4,0x76,0x91,0x26,0x2B,0xF3,0xAC,0xBD,0xCA,0xC6,0x27,0x07,0xD0,0x93,0x75,0x77,0x6A,0x9C, +0xF0,0xA4,0xBE,0x4D,0x99,0xF9,0x5E,0x9C,0x7D,0x76,0xA4,0x9E,0x82,0x8E,0x2A,0xEF,0x4A,0x14,0x30,0x9A, +0x93,0xDF,0x72,0x66,0xAF,0x09,0xEE,0x3D,0x6F,0x84,0x32,0x49,0x16,0xA4,0x37,0x37,0x31,0x68,0xA5,0x3B, +0xF4,0xB7,0xB9,0x34,0xBB,0xC3,0x6C,0x63,0xD1,0xD1,0xFE,0x2E,0xAE,0xBA,0xE5,0xA2,0xFE,0xE1,0xAA,0x25, +0x1B,0xA6,0xE0,0x6D,0xCD,0xF3,0xB8,0x0D,0xB9,0x3D,0x20,0xC1,0x41,0x88,0x1C,0xCF,0xBC,0xA6,0x36,0x03, +0x1B,0x5D,0x70,0x7A,0x1B,0xD1,0x70,0x86,0x7F,0xDA,0xCF,0x20,0xBB,0xE4,0x9F,0xA5,0x04,0x1D,0xFC,0x63, +0x23,0x89,0x90,0x97,0xE5,0xE3,0x30,0xC1,0x16,0x55,0xE5,0xA6,0x5F,0x1C,0x34,0xE0,0xC6,0xE3,0x08,0x2E, +0xA4,0x0B,0x0B,0x80,0xC9,0x47,0xD4,0x0D,0x48,0x83,0xD0,0xF4,0xD3,0x14,0x6B,0x02,0x7B,0x84,0xA5,0x40, +0x15,0xAC,0x86,0x67,0xC2,0xF8,0x52,0xDC,0xAB,0xE2,0xD2,0x4E,0x26,0xC6,0xF7,0x84,0x91,0x08,0x74,0xF4, +0xBA,0xD3,0x29,0xF0,0xD7,0x16,0xDF,0x05,0xDC,0x8C,0x2F,0x86,0x12,0x50,0x08,0x19,0x48,0xA6,0xCA,0xD7, +0x2A,0x4B,0x20,0x46,0x87,0x95,0xB3,0x56,0xC2,0xF8,0xE5,0x90,0xC5,0xC1,0xEE,0xD6,0xBC,0xA1,0xE4,0x3C, +0x09,0x10,0x2E,0x34,0xB3,0x19,0x3B,0xDE,0x44,0x8E,0x66,0x43,0xB5,0xFB,0xD6,0x2A,0xA6,0x07,0x42,0x08, +0x2A,0x5B,0x5F,0x11,0x38,0xAB,0xA3,0xC5,0xBD,0x16,0x24,0x78,0x22,0x02,0xC0,0x0A,0xC1,0x15,0xDA,0x88, +0xC9,0xCF,0xB6,0x69,0xDD,0xE6,0x12,0xCA,0xF6,0x71,0x0D,0x81,0x76,0x1F,0x1C,0x6B,0xC9,0x6D,0xE4,0xAD, +0x59,0x42,0x27,0x3A,0x2D,0x75,0x0C,0xFE,0x4A,0xAA,0xDC,0xC5,0x49,0x6D,0x10,0xB9,0x00,0x0C,0x53,0x79, +0x6E,0x8D,0x2A,0x6D,0x76,0x3D,0x31,0x3C,0xBA,0xCF,0xD9,0x3B,0x00,0x56,0xE1,0xF4,0x4E,0xA0,0x22,0x5A, +0xC7,0x50,0x10,0x63,0x4F,0x0C,0x8C,0x69,0x7A,0x41,0x86,0xDA,0xF3,0xAD,0x8C,0x82,0x1E,0xCD,0x72,0x6E, +0xCD,0x85,0x69,0x5A,0xB6,0xA4,0xCC,0x35,0x53,0xCF,0xDC,0x10,0x63,0xC0,0xCC,0xAC,0x0C,0xD1,0xEF,0xFF, +0x21,0x43,0xC7,0x19,0x0C,0x72,0x4C,0x83,0xBB,0x52,0xE6,0x19,0xB3,0xC0,0xB9,0x80,0x36,0x5E,0x15,0xFD, +0x87,0x3B,0x7B,0x86,0xB7,0xBE,0xCF,0x99,0x7F,0x5D,0x97,0xB5,0x4E,0x44,0x6D,0x0A,0x16,0x71,0xEC,0xA9, +0x3D,0xDD,0x90,0x21,0x7E,0xDB,0xDD,0x16,0xA3,0x4E,0x5D,0x87,0x5D,0xD0,0x45,0xB8,0x90,0xDC,0x4E,0x50, +0xDE,0x4F,0xEB,0xA8,0xB0,0xBC,0x86,0xD4,0xAB,0x4F,0x85,0x55,0x61,0x75,0x6D,0x43,0xFA,0x42,0x62,0xB7, +0x76,0xFD,0xC3,0xF5,0x4D,0x31,0xCC,0x42,0x2F,0xB5,0x75,0xE9,0x87,0xB8,0xAA,0x7D,0x66,0x5B,0xC4,0x58, +0xB3,0x01,0xEA,0x73,0xDE,0xD6,0x85,0x80,0xFD,0xEA,0x53,0x99,0xAA,0x21,0xE5,0x32,0x46,0xD6,0x5A,0x9B, +0x97,0x94,0x90,0x0C,0x07,0x80,0x96,0xB9,0x43,0x2A,0xC8,0xC8,0xCC,0xE3,0x41,0x45,0xBB,0xBF,0x47,0x79, +0x54,0xD3,0x4F,0xE8,0x1B,0x58,0xE2,0x40,0x97,0x67,0x01,0x19,0xDD,0x17,0xF6,0x22,0x6E,0xD5,0x56,0x91, +0x58,0x75,0x56,0xE1,0x2B,0x8B,0x05,0xE4,0xE8,0x45,0x6B,0xAB,0x57,0x52,0xC0,0xB8,0x9C,0x7A,0xE7,0x03, +0x02,0x67,0xC1,0x7E,0x7E,0xFA,0x2A,0x4B,0xC0,0xAF,0x4C,0x5F,0x0E,0x2B,0xDC,0x1F,0xB5,0x41,0x90,0xC0, +0x69,0x6D,0x7F,0x96,0xEB,0xC9,0x91,0x4C,0x71,0xF6,0xE6,0x0C,0xBC,0x9F,0x0F,0x4C,0x37,0x51,0xF2,0x6E, +0x7E,0xE8,0xC0,0x1F,0x9E,0xBC,0x06,0x18,0xA9,0x68,0x15,0x5A,0x20,0xE7,0xD2,0x65,0x90,0x50,0xDD,0xED, +0x66,0x49,0x84,0x30,0xD1,0x9E,0xBD,0x35,0x1D,0xBA,0x27,0x38,0xB6,0x53,0x5F,0x65,0x36,0xE6,0xFF,0x80, +0x52,0x23,0x8F,0x9E,0x33,0xB2,0x9C,0x05,0x0E,0x69,0xA1,0xF0,0xF3,0xB1,0x61,0xA0,0xD6,0xBF,0x00,0x43, +0x34,0x4E,0xF3,0xDB,0x3F,0x40,0x00,0xE3,0x52,0x95,0xE8,0x2F,0x25,0x43,0x09,0x84,0x30,0x91,0x88,0xB4, +0x53,0x38,0x3B,0xA2,0x8D,0x87,0xDE,0x01,0x03,0x0C,0x11,0x7A,0xD2,0x2B,0x79,0xE3,0x46,0xB7,0x95,0x62, +0x51,0x6C,0x03,0x9A,0x6A,0xE0,0x9B,0x11,0xB2,0x60,0xD9,0xB9,0x9F,0x58,0xA3,0xC6,0x1B,0xC8,0xEC,0x02, +0x81,0xF0,0x77,0x42,0xE5,0x8F,0x68,0x9B,0x44,0xDE,0x1F,0x1F,0xDD,0xC2,0xEC,0xC6,0xCB,0x41,0xC7,0x7B, +0x1E,0x70,0x02,0x2D,0x37,0x07,0x18,0x4D,0x10,0xCA,0xE1,0x5F,0x0E,0xA2,0xCA,0x45,0x5A,0x6F,0x2F,0x3B, +0x3F,0xDA,0xC9,0xA5,0xA2,0xDB,0xAF,0x2A,0x42,0x8D,0x41,0x6E,0xDA,0xB2,0x1C,0xA1,0x62,0xB8,0xCE,0x1B, +0xA5,0xC8,0xB9,0xB8,0x94,0xA7,0x02,0xF9,0xFC,0x29,0x94,0x76,0xC5,0x2A,0xF0,0x28,0xB3,0xBE,0x30,0xF7, +0xB4,0x65,0xBF,0xBC,0x75,0xE8,0xE5,0xC8,0x53,0xD8,0x9B,0xCF,0x8B,0xB5,0xD1,0xA9,0x82,0x29,0x15,0x35, +0x9C,0x31,0xB8,0xAC,0x5B,0x75,0xED,0xB2,0xB3,0xDC,0x6D,0x78,0x8A,0x3A,0x4B,0x1C,0xA4,0x30,0xDB,0xB1, +0x75,0x46,0xA0,0x63,0x04,0xD6,0x3A,0x18,0x0E,0xA3,0xC8,0x48,0x43,0xC5,0x08,0x45,0x3E,0x0E,0xC1,0x53, +0x01,0x91,0xE9,0x6E,0xD7,0xE8,0x66,0x1E,0x98,0xF9,0x5E,0x97,0xFF,0x42,0x1C,0xF8,0x23,0x44,0x25,0xB8, +0x48,0x4E,0x2F,0xCD,0x66,0x0E,0x12,0xDF,0xCC,0x7C,0x3F,0xFE,0x8D,0x64,0x15,0x6A,0x8F,0xA4,0x29,0x42, +0x55,0x84,0x60,0x8A,0x68,0xCA,0xE3,0x9D,0x9F,0x2D,0xB6,0xFE,0x83,0x75,0xD2,0xC2,0x14,0x5E,0x10,0x5B, +0xD5,0x12,0xC4,0xDB,0x1B,0x7F,0x60,0xB4,0xAE,0x13,0xA4,0x56,0xE5,0xF7,0x3C,0x00,0xC0,0xD8,0xE2,0xB2, +0x90,0xF2,0xBA,0x63,0xBC,0x16,0xC5,0xBA,0xB8,0x5E,0x50,0x79,0xC4,0x54,0x17,0x97,0x90,0xFA,0xBA,0x90, +0x2C,0x1F,0x2A,0x02,0x50,0x9C,0xAC,0xD1,0xE5,0x3F,0xB0,0x31,0xE3,0xAE,0xBB,0x87,0x2C,0x1B,0x37,0xFF, +0xC8,0xA1,0x7B,0x9F,0xBB,0xF9,0x6B,0x02,0x41,0xC8,0x76,0x2B,0x40,0x88,0x7B,0xF0,0xBA,0x23,0x59,0x83, +0x11,0xFA,0x24,0x1C,0x8D,0xA8,0x42,0x7A,0xB6,0x39,0xB6,0x07,0x31,0x70,0x06,0x26,0x38,0x5E,0x6E,0x03, +0xE2,0x8B,0x5A,0x55,0x91,0xAD,0xE1,0xDD,0x3A,0x47,0x8C,0x8A,0x08,0x24,0x25,0xFD,0x0E,0x38,0x6E,0x96, +0xEE,0xEC,0xE0,0x7D,0xFA,0x78,0x86,0x55,0x78,0xAA,0x56,0x25,0xD2,0xE5,0x50,0x0A,0x2D,0xB6,0xD0,0xAF, +0x29,0x96,0xBE,0xCA,0x0B,0x5D,0x21,0x4D,0xDA,0xB9,0xE1,0xFB,0x43,0xBC,0xF9,0xBB,0x53,0xDF,0x4D,0x01, +0x94,0xF5,0xEF,0x8A,0x01,0x75,0xEC,0x6A,0x77,0xB0,0xBD,0xDB,0x2B,0xAF,0x61,0xBE,0x48,0x84,0xAD,0x8D, +0x2F,0xD4,0x7E,0x32,0x41,0x13,0xEA,0xD3,0xB3,0xDC,0x76,0xFD,0x93,0xF3,0xB6,0xA3,0xBB,0xA1,0x17,0xDD, +0xFE,0x71,0xCE,0xDD,0x56,0x3D,0x8B,0xC6,0x5D,0xA8,0xBE,0xB3,0xEA,0x3F,0xC1,0xFB,0x5E,0x11,0xEB,0xC8, +0x32,0xCE,0x86,0x9A,0x98,0xF1,0xAF,0xCA,0x07,0x71,0x8B,0x87,0xA5,0x01,0xE3,0xC9,0x32,0xEF,0x8A,0xDD, +0x3F,0x17,0xDA,0x7B,0xFB,0x7F,0xE0,0x52,0x35,0x2F,0x02,0x70,0x35,0x72,0x4F,0xA6,0x17,0x6F,0x1F,0x38, +0xB0,0x14,0x56,0xBA,0xEC,0xB2,0xAB,0x94,0x84,0x0E,0x40,0x36,0xF8,0x83,0x8A,0x32,0xD0,0xF7,0x74,0x7D, +0xE6,0x7D,0x4D,0x95,0xD8,0xAA,0x98,0x5C,0x51,0x69,0x07,0xD4,0x3C,0x49,0x3F,0x71,0x7A,0x2E,0xF3,0x16, +0x36,0xC6,0x78,0xAB,0xF6,0x23,0x18,0x2D,0x49,0x57,0x52,0x46,0x83,0x92,0x86,0x42,0x7D,0x22,0xE5,0x9D, +0xAF,0xCB,0xE7,0x07,0x35,0x6D,0x36,0x5D,0x15,0xCB,0x96,0x61,0x7C,0x00,0x2D,0xF6,0x02,0x3B,0xEF,0x96, +0x53,0x45,0xC0,0x59,0x1A,0x32,0x61,0x35,0x7D,0x63,0xA0,0x9D,0xE2,0x32,0x89,0x76,0xAE,0x4B,0x08,0xF3, +0x51,0x38,0x68,0xA4,0x77,0xEB,0xDE,0xCB,0x3A,0x6C,0xEA,0x6A,0x57,0x8A,0x73,0x8E,0x4D,0xBF,0xF8,0x32, +0xBF,0x6A,0x99,0x6D,0x42,0x14,0xEC,0x21,0x58,0xA6,0x0C,0xAF,0x89,0x2D,0xFC,0x58,0x1B,0x62,0x60,0x17, +0x3D,0x8B,0x65,0x3E,0xDE,0xE7,0xE3,0x5B,0xA5,0x75,0x33,0xF2,0x98,0xE8,0xF7,0xE1,0x77,0x35,0xD2,0x8F, +0x0A,0x55,0xF9,0x1C,0x8B,0x03,0xD6,0xE2,0x91,0xE9,0x7A,0x8D,0xCB,0xF9,0x5B,0x00,0xF9,0x5F,0xBD,0x4A, +0x8D,0x82,0x83,0x54,0xCE,0x18,0xA7,0x6A,0xA5,0x9F,0xF5,0x6C,0x8B,0xAD,0x15,0xAA,0xB0,0x3C,0x02,0xD4, +0x3D,0x7B,0x68,0x1C,0x27,0xFE,0x3A,0x52,0x1C,0xF6,0x83,0x74,0xAA,0x03,0xC4,0xBE,0x02,0xBC,0x23,0x72, +0xEA,0xD5,0x28,0x6C,0xA1,0xE2,0xAB,0xF3,0xB6,0x82,0x94,0x60,0x61,0x7A,0x84,0xFF,0x8A,0x31,0xD7,0x01, +0x78,0xFF,0x43,0x8A,0xCF,0x06,0x87,0x9D,0xEC,0x1B,0x6E,0x02,0x18,0x7F,0x14,0xD4,0x16,0xCC,0x13,0xCD, +0xF1,0x54,0xFC,0x08,0xCE,0xAD,0x42,0xB5,0xC4,0x08,0xF9,0x19,0x84,0xFE,0x8E,0xF9,0x71,0x6E,0x00,0x0F, +0x33,0xA4,0x95,0xD1,0x86,0xD6,0x75,0x2F,0x01,0xB0,0x8A,0xA4,0xCE,0x36,0x10,0xDD,0x51,0x34,0x25,0xB7, +0x68,0x92,0x09,0xCC,0x56,0x78,0x19,0x3D,0x45,0x09,0xC8,0xC6,0xBF,0xD6,0xD3,0xA7,0x8F,0x9D,0xF4,0xE6, +0x97,0xF2,0xD3,0x30,0x7F,0x22,0xA2,0xD6,0x3F,0x1C,0x44,0x0D,0x8E,0xDA,0x10,0x76,0x8B,0xD5,0x72,0x47, +0x94,0x2C,0xC1,0x2A,0xB6,0x92,0x52,0x01,0x06,0x77,0x58,0xB1,0x55,0xB7,0x8F,0x09,0x83,0x4B,0xEC,0x94, +0x9F,0x9F,0xA9,0x0D,0x1A,0x56,0x51,0xB5,0x74,0x23,0xA2,0x7B,0xCC,0xB8,0xA7,0xB8,0xD6,0xAD,0x89,0x4A, +0xCD,0x03,0xD7,0x93,0xCF,0xB5,0x8B,0x81,0x46,0xED,0x1C,0xA5,0x42,0xB9,0x3C,0x40,0x6B,0xB3,0xC7,0xC0, +0xDA,0xB8,0x8F,0x01,0x38,0x0E,0x70,0xB9,0x4C,0xAA,0x17,0x56,0xCE,0x61,0x4C,0x5F,0xE7,0x0B,0xAF,0x5D, +0x3F,0x98,0xC7,0x5D,0x3B,0x4E,0x7D,0xC4,0xB8,0xD2,0x53,0x3F,0x01,0xDB,0xD9,0x94,0x4D,0x94,0x48,0x80, +0x3E,0xF4,0x36,0x19,0x27,0x01,0x14,0xF1,0xB0,0x71,0x56,0x25,0x4C,0xAF,0xE2,0x89,0xE6,0xBD,0x24,0xB8, +0x13,0x72,0xFC,0x0D,0x9B,0x52,0xF4,0x4F,0xB4,0x06,0x49,0x80,0xBE,0xBE,0x25,0x44,0x05,0x56,0x89,0x7C, +0x95,0x78,0xFC,0x5F,0xBD,0xEA,0xC3,0x73,0xBF,0x0A,0xDF,0x0B,0x67,0x0C,0x49,0x0E,0x17,0xEF,0x7E,0x32, +0x85,0x16,0xE1,0x0A,0xC0,0x54,0x80,0x3F,0x30,0x5B,0x94,0xC6,0xD2,0x63,0x2B,0x0F,0xD9,0xAA,0x60,0x9E, +0x33,0xF7,0x00,0x05,0xA8,0xD0,0xE0,0xB6,0x73,0xB3,0xAE,0x7A,0x5D,0xAD,0xA6,0xF4,0x0C,0x30,0x55,0x47, +0xA9,0xD3,0x56,0x47,0x91,0x42,0xAC,0x99,0x06,0x15,0xF6,0xE8,0x91,0x2D,0x41,0x20,0xF2,0x11,0xA3,0xD7, +0x53,0x2B,0x9E,0x5E,0x6C,0xF0,0xFE,0x24,0x9F,0xD2,0x15,0x65,0xBD,0x91,0xB8,0x62,0xD1,0x00,0x99,0xD4, +0x18,0x69,0x58,0xD6,0xAF,0x1E,0x66,0xC1,0x8B,0x0C,0x08,0x07,0x6A,0x09,0x10,0x5B,0xB8,0xB2,0x89,0x41, +0xDA,0x2F,0x29,0x45,0x1E,0xE5,0xB9,0x87,0x51,0x6B,0xFE,0xF8,0x85,0x3D,0x09,0xDC,0x8F,0x65,0x21,0x43, +0x3C,0xFA,0xBF,0x19,0xD0,0xB5,0x52,0x96,0xF3,0xDD,0xEA,0x8A,0xE4,0x69,0xAA,0x2A,0x50,0xE5,0x58,0xDC, +0x54,0x67,0x62,0x9E,0xF5,0x48,0x26,0x5E,0x9A,0x94,0x7A,0x77,0x7F,0x44,0x66,0xC1,0x18,0x6F,0xF0,0x36, +0x76,0x04,0x6F,0x8D,0x64,0x0A,0x00,0x9B,0xC0,0xC8,0xA9,0xD2,0xDE,0x88,0x6B,0xB9,0xD7,0x06,0xA1,0xCD, +0x3A,0xA3,0x45,0xDB,0xB7,0xCE,0x32,0x90,0x38,0x64,0xAE,0x77,0x3C,0x4E,0x87,0xEF,0xAF,0x23,0x8B,0x68, +0x36,0xB3,0x12,0xD1,0xEF,0x6F,0xEA,0x4B,0x65,0x69,0x7F,0xCB,0x1D,0x1F,0x03,0x76,0xAE,0xCD,0xDC,0x7E, +0x4B,0x6E,0x0E,0x8E,0x42,0x1D,0x77,0x22,0x39,0x28,0xEA,0xD8,0x69,0x91,0x56,0x7C,0xF8,0xCC,0x73,0x7E, +0x74,0x4D,0x4E,0xD9,0x81,0x58,0xF7,0xE2,0x46,0x2D,0x9D,0x6C,0xDD,0xD5,0x5B,0x70,0x24,0x1F,0xEC,0x46, +0xB6,0xC5,0x0F,0x42,0xCC,0xFD,0xAC,0x5E,0xFD,0x86,0x09,0x16,0x6B,0xBB,0xB4,0x66,0x10,0xE1,0x9C,0xC3, +0x0B,0x57,0x33,0xEA,0x88,0xAD,0x65,0x25,0xE1,0x50,0x15,0x07,0x30,0x3A,0x0A,0x43,0x8B,0x5D,0xDD,0xB1, +0x2D,0xEF,0x43,0x40,0x85,0xBE,0x4D,0x39,0x9D,0x35,0xA8,0x26,0xE7,0x63,0x9A,0xB7,0x66,0x8F,0xCA,0x2D, +0x8F,0x56,0x9F,0xC4,0x34,0x5E,0x91,0xF8,0x64,0x7F,0xAA,0xE2,0x93,0xD7,0x97,0xB2,0x25,0xBF,0x33,0xA6, +0xE5,0x33,0x9C,0x15,0x16,0x15,0x23,0x87,0x45,0x04,0x8B,0x62,0xDD,0x16,0x87,0x82,0x53,0xC0,0xB2,0x65, +0x91,0x91,0x00,0x16,0x7E,0x7B,0xA1,0x2D,0x1F,0xEC,0xED,0x61,0x10,0x52,0x02,0xB9,0xC2,0x07,0xA3,0xF3, +0x12,0xD4,0x1B,0x68,0x78,0x03,0xA6,0xCC,0x99,0xB1,0xBA,0xDB,0x1D,0x57,0x2D,0xF3,0x5C,0xAC,0x10,0x87, +0xAD,0xCD,0x71,0x7E,0xBB,0x1D,0x44,0x0B,0x01,0xFA,0xE8,0xFA,0xDF,0x3B,0xC0,0xEF,0xAE,0x02,0x36,0xED, +0xB4,0xB1,0xA3,0xDA,0x95,0x55,0x41,0xB2,0xCA,0x34,0xAB,0x9B,0xFD,0xB6,0x1E,0xFF,0x5B,0x1B,0xDF,0x31, +0xEB,0xF6,0xD0,0xC0,0x7C,0x5C,0x06,0x25,0xCB,0xA7,0x79,0x2E,0x4D,0x38,0x0E,0xE0,0xD5,0x03,0x83,0x1F, +0xF6,0x81,0x84,0xD9,0x40,0x12,0x91,0x7C,0x04,0x2D,0x12,0x02,0x6D,0xA6,0xBE,0xFF,0x2E,0x70,0x47,0x31, +0x0B,0x5E,0x18,0x65,0xC9,0x3A,0x28,0x16,0x1D,0x1C,0xAF,0xEF,0x5F,0x3F,0xCF,0xA6,0xAD,0x0D,0x4F,0x08, +0x11,0x33,0xF3,0xDD,0x02,0xE5,0xD5,0xFF,0x58,0x3D,0x6A,0xFC,0xA7,0x86,0xA1,0xF5,0xDE,0x0B,0xCF,0x1C, +0xE7,0x82,0x04,0xF9,0xA7,0xA1,0x48,0xB2,0x5B,0x8C,0x0F,0x21,0x7E,0x04,0xCE,0xC2,0x4D,0xCE,0xC7,0xB4, +0xC8,0xE2,0xA9,0xD7,0x65,0x8D,0xC6,0x0F,0x40,0x67,0xF8,0x61,0x46,0xCA,0x6E,0xD8,0x35,0x3D,0x63,0xE8, +0x26,0x85,0x09,0xE6,0x75,0x23,0x60,0xB2,0x2C,0x52,0x81,0xCD,0x2C,0x8F,0x2D,0x85,0x99,0x9B,0x59,0xA4, +0xBA,0xD9,0x0E,0xD3,0x40,0x55,0xE1,0x64,0x5A,0xA6,0xA8,0x9E,0x98,0xC5,0x28,0xDE,0x15,0xA8,0xB4,0x18, +0xBF,0x66,0xE5,0xF2,0x04,0x3E,0xC9,0xE1,0x01,0xA1,0x99,0xB7,0x7C,0x17,0x9F,0x58,0xAC,0x84,0xBE,0xFE, +0xD0,0x9E,0x26,0xA6,0xFC,0xCA,0x12,0xA7,0x8C,0x56,0x22,0x73,0xC1,0x27,0x09,0x7F,0x9F,0xDE,0x72,0x93, +0xED,0x87,0x0A,0x84,0x88,0x3C,0xCA,0x0E,0x90,0x6B,0xD1,0xEE,0x0E,0xEE,0x60,0x07,0x8F,0x8A,0xE9,0xD8, +0x8F,0xAA,0x6C,0xBE,0x5F,0x82,0xA2,0xBA,0x3E,0x96,0x43,0x09,0xF5,0x87,0x06,0x14,0xF7,0xDE,0xF3,0x5A, +0xC2,0x67,0x1A,0xA5,0x7D,0x53,0xEE,0xF9,0x0F,0xC3,0x48,0xE4,0xE2,0xAB,0xFB,0x32,0x40,0x66,0xAC,0xBB, +0xEF,0xD2,0xA2,0x63,0xA2,0x03,0x9B,0x30,0xB9,0xED,0xE2,0x4E,0x48,0xB6,0x62,0x70,0x64,0x18,0x12,0xA6, +0xB3,0x76,0x5B,0xBC,0x68,0xA9,0x8F,0xFE,0x7C,0xCD,0xA9,0x11,0x7E,0x9F,0x61,0xC9,0x06,0xBF,0x83,0x4D, +0xFC,0x25,0x52,0x96,0xCC,0x15,0x22,0x75,0xE0,0x5A,0x2B,0xA3,0x0F,0x34,0x34,0xFF,0xE4,0xCF,0xBB,0x83, +0xA7,0xCC,0x3E,0x0C,0xAD,0x9E,0x39,0x06,0x35,0x39,0x60,0xF4,0x97,0xF2,0xA9,0x40,0x40,0xBE,0x6B,0x86, +0x72,0xCA,0x8C,0xE0,0x53,0x3E,0x53,0x12,0x5F,0xFD,0x14,0x70,0x0E,0x17,0xF1,0x71,0x89,0xE2,0x9A,0xB2, +0x9D,0x3D,0xB0,0xA4,0x97,0x22,0x75,0x9C,0xEC,0xBE,0x1E,0x98,0x9A,0xB0,0x89,0xF1,0x5A,0xF0,0x72,0x93, +0xB3,0x10,0x3D,0xA8,0x2B,0x78,0x7D,0x6E,0x8A,0xB1,0x27,0x2A,0x6A,0x48,0xDC,0x84,0x95,0xB8,0x98,0x70, +0x66,0xDC,0xBF,0x48,0xF4,0xD0,0x05,0x39,0xD4,0x3E,0x84,0x27,0xB4,0xA7,0xE4,0x62,0x98,0x78,0xFC,0xB6, +0x2F,0xEE,0xC9,0x46,0x73,0xF4,0x41,0x85,0x32,0xBA,0xF5,0x72,0xBD,0x7B,0x7E,0x85,0x79,0x70,0x15,0xD7, +0x5E,0xD5,0x2D,0xD7,0xA3,0xF5,0xB6,0xB4,0x39,0xDD,0x3B,0x91,0x78,0x71,0x40,0xE8,0xDB,0x15,0x0E,0x0A, +0x45,0xE0,0x50,0xA7,0x8D,0x77,0x7F,0x61,0x0F,0x7A,0xFE,0x85,0xA9,0x36,0x96,0xCE,0x39,0xB6,0x88,0x4B, +0x85,0xB9,0x51,0x3A,0x6E,0xB8,0xB0,0x74,0x59,0x19,0x37,0x0D,0x9E,0x48,0x55,0xB5,0x08,0x2E,0x8D,0x54, +0x03,0x21,0x8B,0x6B,0xA9,0x94,0xCF,0x3F,0xE7,0x30,0x61,0x89,0xE5,0x97,0xD4,0x49,0xF9,0x41,0x27,0x52, +0x1D,0x7C,0xA9,0x87,0xBC,0xB4,0xF6,0xFB,0x39,0x71,0xEC,0x2E,0x36,0xBE,0xAA,0x10,0x94,0x22,0xE2,0xD9, +0x9E,0x35,0x76,0xFE,0x25,0x27,0x7E,0x37,0xBB,0xFD,0xCC,0x8C,0xA0,0x42,0x13,0xBD,0x1D,0xB8,0xB8,0x2C, +0x2C,0xDE,0xB8,0xA6,0x7E,0xA3,0xC0,0xA1,0x72,0xDD,0xEB,0x3D,0x3C,0xB1,0x41,0x9A,0xAD,0x20,0xFF,0xFF, +0xFF,0xFF,0xC0,0x7C,0x26,0x01,0x40,0xD1,0x08,0x3B,0x42,0xC2,0xB7,0x3B,0x3C,0xB6,0x0C,0x68,0x43,0xF8, +0x4F,0x4C,0x34,0x30,0x9C,0x1A,0xD8,0x19,0xE9,0x48,0x42,0x46,0xBA,0x58,0x05,0x0C,0x86,0x98,0xA4,0x11, +0xC0,0x26,0x15,0x25,0x91,0x64,0xAF,0x01,0xD6,0xAA,0xA5,0x83,0x95,0x0B,0x57,0x62,0xA2,0xE8,0xDF,0xD9, +0x0F,0x0E,0xC0,0xD9,0x36,0x2F,0xE9,0x3E,0x97,0xAF,0x00,0x14,0x25,0x51,0xAB,0x3F,0x01,0xDB,0x2F,0x06, +0x72,0x69,0x60,0xA9,0x01,0x9E,0xC2,0xB8,0xAF,0x6C,0xEF,0x54,0xC2,0x48,0x86,0xB8,0xD3,0xCE,0x97,0x42, +0xE9,0x15,0xDD,0x47,0xDA,0x64,0xFE,0xA3,0x41,0x00,0xAC,0x98,0xD2,0x27,0xBC,0x42,0xAE,0x9F,0x09,0x80, +0x39,0x66,0x71,0x93,0x42,0x23,0x14,0x75,0xE0,0x7C,0xFA,0x8C,0x53,0x30,0x60,0x9C,0xD0,0x71,0xED,0xC0, +0xCE,0x05,0x17,0xC4,0x3F,0xA7,0x8D,0xEF,0x0F,0x09,0x82,0x19,0xE5,0x70,0x78,0xA8,0x48,0xD9,0xC3,0xC5, +0xBE,0x6F,0xC3,0xD1,0x65,0x48,0xFB,0x89,0xCB,0x12,0x84,0xCF,0x6D,0x24,0x3B,0x25,0x5D,0xA8,0x88,0x9D, +0xA3,0xEB,0x1B,0x62,0x14,0xFD,0x7B,0x78,0x45,0x46,0x32,0x3E,0x7A,0x27,0x64,0x38,0x53,0xF9,0xA2,0x0C, +0xA4,0xA1,0x7A,0x6E,0xCB,0x42,0x88,0x91,0xFD,0x7C,0x45,0x2D,0x38,0xC6,0xF2,0x8C,0xEC,0x22,0x09,0xD4, +0xC8,0x43,0x83,0xB4,0xFC,0x76,0x12,0x77,0xE4,0x4E,0xBB,0xCF,0x9B,0x79,0x0D,0xAB,0xC8,0x0C,0x89,0x92, +0x7D,0xE3,0xF1,0xA7,0x62,0x56,0xF3,0x8D,0xC7,0x20,0x33,0x7F,0x48,0x2B,0xD4,0x9B,0xFF,0x2D,0xE9,0x84, +0x7B,0xFB,0xFC,0x06,0x31,0x4D,0xEF,0x50,0x3D,0xA1,0x2B,0x46,0x54,0x3E,0x8B,0x2F,0x21,0x31,0x4C,0x8C, +0xC4,0x30,0x64,0x94,0x80,0xCE,0xD3,0xC9,0xF4,0x56,0xBA,0xDD,0x83,0xB2,0xDF,0x84,0x13,0x73,0xD5,0x28, +0xA3,0x8F,0xE3,0xE3,0x56,0x30,0x8E,0xEA,0xF0,0x18,0x0A,0x1D,0x82,0x47,0x62,0x5C,0xE3,0x08,0x42,0xB1, +0xF7,0x49,0x7C,0x3E,0x41,0xCD,0xC1,0xD2,0xB0,0x1C,0x34,0xA0,0x8C,0xD9,0x78,0x7B,0x73,0x14,0x1E,0x9A, +0xC8,0x71,0xB4,0xF3,0x92,0xBF,0x64,0x20,0x94,0x5A,0x94,0x16,0x57,0xF8,0xD2,0x32,0x26,0x9B,0xFA,0xA7, +0xF1,0xE9,0x2D,0x63,0xE3,0x91,0x39,0xE7,0xFA,0x1A,0x75,0x96,0x75,0x97,0x36,0x37,0x1F,0xBC,0x65,0x21, +0xBF,0xDF,0x1D,0x3C,0xCB,0xDA,0x00,0x91,0xD2,0x18,0x3C,0xEC,0x24,0x3E,0x80,0x43,0xDB,0x1A,0x7A,0xDE, +0x87,0x85,0x21,0x5F,0xD4,0x9F,0x88,0x18,0x07,0x0D,0xC7,0x17,0x52,0x49,0x6C,0x7A,0xDB,0x35,0x03,0x91, +0xAE,0xDA,0x2E,0x93,0x19,0x33,0x91,0x57,0xD7,0xEB,0x48,0xA5,0xD6,0x3C,0xF0,0xE7,0x6B,0x1B,0xAF,0x8C, +0x58,0x3D,0x46,0xB9,0xEF,0x4B,0xEF,0x62,0x16,0x3A,0xB9,0xEC,0xA8,0x34,0x41,0x2E,0xB8,0x14,0x5E,0x0A, +0xE8,0x54,0x1C,0x68,0x61,0x74,0x36,0x5A,0x2A,0x65,0xB6,0xF8,0xB4,0x3F,0xE1,0x1A,0x4F,0x11,0xD6,0x03, +0xDA,0x7C,0xE3,0xAB,0xEB,0x0E,0x7C,0xAF,0xFB,0x7E,0x25,0x97,0x49,0x3B,0x87,0x12,0x01,0x78,0x15,0xDD, +0x08,0x19,0x78,0xDC,0x36,0x33,0x2B,0x04,0xA3,0x1D,0xE7,0x16,0x84,0x7F,0x00,0x61,0xD0,0xB3,0xA8,0x16, +0xE9,0x76,0x3A,0x23,0xE7,0x81,0xB4,0xD7,0x39,0xC0,0x84,0x2D,0x3F,0xC3,0x38,0x94,0xC8,0x2E,0xA8,0xC2, +0x5F,0x30,0x14,0xA4,0x03,0xEB,0x86,0xAF,0x82,0xB8,0x5E,0x23,0xEB,0xA2,0x0B,0xCB,0x42,0x8D,0x21,0xCF, +0x04,0xAF,0x64,0xD4,0x79,0xD0,0xD1,0x95,0x48,0xDC,0xF9,0xBB,0x79,0xCE,0xFF,0xDF,0x05,0xAE,0xC3,0xA0, +0x00,0x1E,0x80,0x06,0xA4,0x79,0x18,0x80,0xC5,0xC9,0x27,0x08,0xF0,0xF4,0xF1,0x76,0xFA,0xE9,0x78,0x19, +0xEA,0xD9,0x42,0x90,0xC5,0xCD,0xA6,0x1F,0xA8,0xA7,0x6C,0x03,0x8A,0x73,0x99,0x60,0x6B,0xA9,0xA1,0xE1, +0xC7,0xA1,0xCF,0x0E,0xF5,0x76,0x8A,0x13,0xC7,0x7A,0xB0,0x8E,0x91,0x97,0x89,0x11,0x86,0xE7,0xB7,0x86, +0xD1,0x5D,0xE2,0xC3,0x83,0x05,0x1D,0xEC,0x9E,0x54,0xC9,0xDA,0x4D,0x39,0xCD,0x3E,0xFB,0x43,0x45,0xF1, +0x88,0x8E,0xCA,0x41,0xA6,0xA6,0x42,0xCA,0x71,0x38,0x4B,0x16,0x5B,0xD9,0xDC,0x8F,0x97,0xE4,0x5A,0x74, +0x3F,0xD7,0xF3,0xA2,0x9D,0x17,0xCB,0x2B,0x25,0xEC,0xC3,0xB8,0x8B,0xD1,0xCB,0x40,0x2E,0xEA,0xFB,0xB3, +0x2B,0xC6,0x17,0x41,0x7E,0x8E,0x81,0xB5,0x2A,0x77,0x2A,0x21,0x76,0xA1,0x0A,0x08,0x0D,0x3C,0xB5,0xEA, +0x64,0x15,0xFD,0xA9,0x8B,0x00,0x94,0x58,0xFE,0x2E,0x72,0xD8,0xBA,0xC2,0xC2,0x80,0xDD,0xE5,0x63,0x6F, +0xED,0x37,0xF5,0x2D,0xFE,0x41,0x79,0x49,0x6D,0xC8,0x63,0xED,0xDF,0x0B,0x39,0x11,0x64,0xEB,0xC2,0xAC, +0x13,0xEF,0xCF,0x04,0x6C,0x8E,0x4D,0x1D,0x52,0x39,0x2C,0x87,0x5B,0x6F,0x09,0xC3,0x97,0xF2,0x11,0x20, +0x46,0x12,0x8C,0x97,0xD5,0x4F,0x81,0xC9,0xD8,0x2D,0xD2,0xBE,0x56,0x60,0x44,0x96,0x84,0x4E,0x03,0x2D, +0x80,0x67,0xB5,0xA7,0x39,0x2F,0x6B,0x4D,0x90,0x3F,0x8E,0x41,0x48,0x2F,0x8F,0x02,0x07,0x9C,0x06,0xED, +0x74,0x3E,0xBB,0xBF,0xB3,0xA1,0x06,0xF4,0x2F,0xE9,0xB5,0xA2,0x08,0x45,0x6C,0x8E,0x64,0x9B,0x8C,0x44, +0x37,0xCC,0x39,0x25,0x19,0x34,0x64,0x94,0x85,0x46,0x0C,0x96,0x53,0x18,0xE4,0x9A,0xD6,0xBA,0x93,0x1C, +0xE0,0xD2,0xC6,0x4A,0x9C,0x91,0x05,0x87,0xDA,0x99,0xBF,0xC2,0x15,0xB0,0x9D,0x41,0x63,0xD1,0x4A,0xDE, +0x1D,0xB2,0x15,0xF7,0x28,0x95,0x85,0x15,0x31,0x42,0xCD,0x41,0x61,0xB4,0xC5,0xCF,0x04,0x4A,0xBE,0xBA, +0xDB,0x39,0xE6,0xEC,0xB3,0x3E,0x7E,0x3F,0x0F,0xA2,0x49,0xD0,0xAE,0x27,0x8D,0x78,0xCD,0x18,0xBF,0x1A, +0x0B,0x77,0x06,0x45,0x8E,0xD0,0x41,0xC4,0xAB,0x26,0x1F,0xD5,0x11,0x46,0xA3,0xCF,0xF4,0x4F,0x24,0x2F, +0xFE,0xD8,0x27,0xE8,0x05,0x0C,0x2F,0x64,0x44,0x94,0xA9,0xB7,0x54,0xAA,0x3A,0xE0,0x1C,0x67,0x2F,0xF0, +0x00,0x87,0xD1,0xCB,0xA3,0x90,0x76,0x3E,0x36,0xFE,0xDE,0x48,0x4E,0xBF,0xAE,0x0D,0xA3,0x61,0x76,0xD7, +0x4C,0xFD,0x2E,0x17,0x3E,0xBE,0xBC,0x0A,0x6D,0x7C,0x46,0x6E,0xD8,0xB0,0x0F,0xB4,0xED,0xFE,0xAA,0xE6, +0x57,0x74,0xCD,0xCF,0xCC,0xED,0x58,0xCB,0xCD,0x6A,0xF8,0x24,0x4E,0x4C,0x10,0x24,0x3D,0xB7,0x65,0x5B, +0xE5,0x3F,0xA1,0x1D,0xFB,0xF9,0xF1,0x28,0x06,0x30,0x67,0xFB,0x34,0xD4,0x94,0x52,0xE3,0x43,0xDD,0xE3, +0xD5,0x67,0x30,0xEF,0x25,0x00,0x90,0x00,0x0F,0x9C,0x9C,0xC0,0x49,0x4E,0x8A,0x21,0x62,0xA5,0xAD,0x63, +0x77,0x67,0x21,0x1B,0x1C,0x5F,0xEE,0xDA,0x42,0x41,0x79,0x86,0xF4,0x9F,0x9C,0x91,0x0E,0x18,0xF1,0x32, +0x11,0xCC,0x89,0xB3,0xC8,0x9E,0x63,0x11,0xE2,0x81,0x40,0x40,0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60, +0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50,0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74, +0x53,0x65,0x41,0x41,0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, +0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xF1,0x6E,0xCA,0x99,0x12,0x7E, +0x2B,0xF8,0x2A,0xF8,0xB3,0x47,0x2A,0x3C,0xFF,0x29,0x68,0x1B,0x08,0x49,0xF2,0xF4,0x0B,0x66,0x10,0x39, +0xEA,0x08,0xE2,0x18,0x59,0x69,0x42,0x6F,0xE9,0x0E,0x7B,0x8F,0x0D,0x19,0x73,0x68,0x31,0x47,0xF3,0x6D, +0x75,0x97,0xE7,0x3D,0x04,0x4A,0x1B,0x99,0x88,0x3D,0xDB,0x10,0x36,0x42,0x9B,0x3D,0xD9,0x6B,0x42,0x48, +0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58,0x0B,0x0D,0xCA,0x5C, +0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49,0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69, +0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59,0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D, +0xDB,0x6F,0x86,0x2F,0xDD,0x61,0x5B,0x24,0x0F,0x20,0x90,0xA5,0x64,0xCA,0x94,0xA4,0x70,0x70,0x9C,0xA2, +0xD6,0xB0,0x08,0x16,0x30,0x56,0x8C,0xCF,0x67,0x60,0x9C,0xB4,0x71,0x71,0xFA,0xFB,0xD6,0xCD,0xDA,0x54, +0xB4,0x88,0x32,0x25,0xFF,0x1A,0x95,0xA5,0xF0,0x72,0x94,0x6A,0x40,0x70,0xB5,0x6A,0x50,0x3C,0x80,0x96, +0x40,0x8C,0x9D,0xB5,0xF1,0x73,0x44,0xC0,0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4, +0x72,0x74,0x4C,0xD0,0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, +0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1,0xA3,0x17,0xCD,0xD5, +0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x7D,0xF7,0xA5,0xAE,0x39,0x6E,0x1C,0x3E,0xA2,0xCA, +0x97,0x43,0x96,0xAC,0x78,0x78,0x54,0x9A,0xBB,0x58,0x3A,0x6C,0xC6,0x36,0x45,0xBB,0x12,0x55,0x9E,0xBC, +0x79,0x79,0x3C,0xF9,0x28,0x05,0x51,0xBD,0x59,0x35,0x58,0xAD,0xF0,0x01,0x97,0xAD,0xF8,0x7A,0xE3,0x19, +0x55,0x3B,0x1F,0xDB,0x8B,0x57,0xAA,0xC9,0x5D,0x32,0x9F,0xBD,0xF9,0x7B,0x46,0xC8,0x2A,0x1C,0xC6,0xCC, +0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8,0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8, +0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9,0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED, +0xFA,0x7E,0x4F,0xD9,0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0xCC,0x82, +0xF8,0xA0,0x60,0x0F,0x92,0x02,0xB4,0x9D,0x48,0xA0,0xB0,0x26,0x54,0xE0,0x78,0x70,0x4D,0x71,0x68,0x5E, +0x87,0xE3,0x73,0x29,0x61,0x83,0xB8,0x36,0x55,0xE1,0x8D,0x41,0x07,0x7F,0xEF,0xD6,0xDF,0xE3,0xB1,0xEE, +0xC1,0x80,0xB1,0x27,0xD4,0xE2,0xDE,0x13,0x8D,0x53,0xAC,0x91,0xA1,0xF6,0x2C,0xCC,0xE6,0xA3,0xB9,0x37, +0xD5,0xE3,0x60,0x42,0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, +0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43,0x86,0x86,0xE1,0x47, +0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53,0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73, +0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x4A,0xC8,0x8A,0x7D,0x13,0x20,0x38,0xAE,0xB2,0xE7,0x49,0x3F,0xB2,0x2E, +0x5C,0xE8,0x14,0x7E,0xF6,0x12,0xD2,0x39,0x7E,0x56,0x1D,0x1E,0x4B,0xF8,0xBA,0x3E,0x5D,0xE9,0xB3,0x44, +0x75,0xF6,0x75,0x3B,0xFF,0x4A,0x37,0x2E,0xCA,0x50,0xB3,0x2F,0xDC,0xEA,0x2B,0xE7,0x8D,0xC9,0xD3,0x3B, +0xEA,0xAF,0xC4,0x5B,0xC1,0x3C,0xBB,0x3F,0xDD,0xEB,0x62,0x4A,0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A, +0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A,0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E, +0x5F,0xED,0x63,0x4B,0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, +0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x88,0xC0,0xA7,0x90,0xFE,0x8E, +0xEA,0xAB,0xEB,0x28,0x13,0xA4,0xB4,0xA6,0x74,0xF0,0x44,0x50,0xA3,0x64,0x53,0x12,0x7B,0xDE,0x72,0xE3, +0xE7,0xD5,0xBC,0xB6,0x75,0xF1,0x7B,0x94,0xAC,0x92,0x55,0x61,0x90,0x3F,0xB5,0x62,0x6C,0x90,0xB5,0xA7, +0xF4,0xF2,0xBD,0x55,0xA7,0x1E,0x2D,0x0A,0x56,0xFF,0x35,0xD1,0x07,0x86,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, +0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2,0x27,0x95,0xEC,0xD6, +0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3,0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3, +0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3,0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7, +0xF7,0xF7,0x58,0xE3,0x1F,0x53,0xD2,0x73,0x78,0xFA,0xB2,0x5A,0x93,0xD7,0xB6,0xAE,0x7C,0xF8,0x56,0x8A, +0x8E,0xD7,0xDA,0x63,0x7D,0xFB,0x36,0xAA,0x90,0x6F,0xBE,0xBE,0x7D,0xF9,0xDD,0x09,0xAD,0xED,0xE8,0x72, +0x98,0xF6,0xA7,0xD4,0x63,0x6C,0xB7,0xAF,0xFC,0xFA,0x9E,0xBF,0x2F,0x98,0xE0,0x62,0x99,0xF9,0xC0,0x9F, +0x60,0x66,0xBF,0xBF,0xFD,0xFB,0x66,0xCA,0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE, +0x7E,0xFC,0x6E,0xDA,0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, +0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB,0xAF,0x9F,0xEF,0xDF, +0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8C,0xB6,0xA8,0xA1,0x85,0x43,0x40,0xDD,0x1C,0xFB,0x73,0x66, +0xBC,0x0C,0xCE,0xC6,0x30,0xE5,0x51,0x97,0xA6,0x4D,0x0F,0x66,0xEA,0x63,0x22,0xD8,0x0F,0x0E,0x7F,0xD2, +0xD3,0x65,0x3B,0xE9,0x51,0x4D,0x2A,0xF8,0xA1,0x59,0x54,0xA5,0x85,0x89,0x6E,0x62,0xB3,0xB9,0x4B,0x57, +0xE1,0x4D,0xC6,0x10,0xA2,0x07,0x40,0x21,0x66,0x58,0xD6,0x57,0x92,0x93,0x7A,0xE5,0x18,0x6B,0xD0,0x22, +0x66,0x8B,0x54,0x88,0x18,0x09,0xA9,0x16,0x69,0x70,0x49,0x36,0xFC,0x69,0x91,0xCD,0xB6,0xDA,0x03,0x64, +0x63,0xF5,0x9D,0x93,0xD1,0x61,0x18,0x47,0x27,0xD9,0xDD,0xAD,0x9C,0x69,0xAE,0x01,0xCE,0x5D,0x2D,0x0F, +0xBA,0x6B,0x10,0x84,0x26,0xF1,0x90,0xCD,0x36,0xD6,0x5E,0x99,0xE3,0x0A,0xD4,0x17,0x24,0x61,0x85,0xCE, +0x44,0x13,0x3A,0xF3,0x3B,0xA8,0xF4,0xCE,0xCA,0x4C,0xCB,0xBF,0xFF,0x25,0x6A,0x53,0x27,0x06,0x35,0xDB, +0xDB,0xE9,0x08,0x29,0x7A,0x1B,0x1E,0xCC,0x19,0x26,0xE3,0xEF,0x0D,0xF8,0x81,0xEB,0x18,0x5A,0xD9,0x4B, +0x8B,0xBA,0x3F,0xBF,0x98,0x60,0xBF,0xE9,0xC3,0x04,0x83,0x0C,0xAA,0x0F,0xE3,0x5F,0x36,0x50,0xFB,0x3F, +0xD2,0x66,0x03,0x2E,0xDC,0x06,0xBC,0x28,0x1C,0x55,0xA9,0x80,0x14,0x01,0xF2,0x24,0xFB,0xD3,0x4B,0xBE, +0xEA,0xDE,0x52,0xBE,0xFB,0x89,0x4A,0x9E,0xC9,0x49,0xE5,0x74,0xFC,0x6B,0x46,0x36,0xEA,0x0C,0xFC,0x3E, +0xB3,0x8A,0xC0,0x8F,0x2B,0x55,0x68,0x85,0xC7,0x21,0x0A,0xBF,0xB8,0xC5,0xB3,0x38,0x70,0xA6,0xC0,0x1B, +0xC5,0x2D,0xFB,0x30,0x7A,0xB0,0x7A,0x49,0x13,0xD6,0xBB,0x43,0xEE,0x38,0xF4,0x2D,0xE2,0x54,0x6C,0xAC, +0x13,0x78,0x55,0x90,0x86,0x0A,0x74,0x7C,0xE5,0x7C,0x0A,0x32,0xE1,0xC9,0xA4,0x64,0x2D,0x78,0xFD,0x69, +0x38,0xDD,0x87,0x6D,0x64,0xEF,0x4D,0xC3,0xEE,0x14,0x6D,0x27,0x70,0x15,0x1C,0x61,0xAD,0x5C,0xD4,0x79, +0x16,0x28,0x25,0x59,0x39,0x1C,0x9B,0x5C,0x7D,0x31,0x99,0xEC,0x24,0xFE,0xDC,0xC0,0x3A,0x3E,0x15,0x71, +0x51,0x55,0x65,0x66,0x50,0x14,0x5B,0x28,0xA3,0xAE,0x0C,0x15,0x7B,0x36,0xE4,0x0E,0xEC,0xA3,0xE4,0x24, +0x2F,0x73,0x31,0x3D,0x77,0xED,0xE5,0x33,0x53,0xC9,0xED,0x1E,0xD1,0xA4,0xAD,0x67,0x72,0xB1,0xBB,0x3C, +0xF5,0x55,0x89,0xDD,0x5A,0x7E,0x55,0xE0,0x3E,0x8A,0x74,0x76,0x50,0x71,0x66,0x8A,0x39,0x15,0xCC,0xEA, +0x0B,0x3C,0xAE,0x6F,0xAA,0xF8,0x8D,0x43,0x4B,0xB2,0x6E,0x9A,0x30,0x14,0xB6,0xAD,0x98,0x98,0xE6,0x3A, +0xE9,0xA1,0xC6,0x5A,0xFB,0x7D,0x67,0x8A,0xED,0x15,0x7F,0x0F,0x38,0x30,0x1F,0xAC,0x8B,0xFA,0xAD,0x4B, +0xE8,0xF1,0x6F,0x9A,0xE4,0x14,0xB7,0x6E,0xD0,0x55,0x27,0x69,0xB5,0x40,0xED,0xDF,0xBA,0x8B,0x88,0x6B, +0xA8,0x18,0x84,0x24,0xAE,0xF3,0xF9,0xEA,0x6A,0xA8,0xF6,0x5F,0xDB,0xF6,0x17,0x45,0x8C,0x78,0x7C,0xB8, +0x08,0x69,0xC7,0x3F,0xA9,0xBD,0xA6,0x7E,0xFB,0xDA,0xDF,0xAB,0xE9,0xEC,0xE7,0xDD,0x89,0x6A,0xCE,0xEB, +0xFE,0xF3,0x50,0x6F,0x6F,0x38,0x77,0x09,0xF5,0x04,0x75,0x37,0x5A,0x04,0x57,0xFC,0x80,0x06,0xE7,0x02, +0x3A,0xF5,0x1A,0x80,0x95,0x73,0xFA,0x12,0xB3,0xBB,0x34,0xC4,0xA5,0xDB,0xE9,0xDB,0xF3,0xE6,0x2E,0x54, +0x01,0x5A,0x53,0x44,0x56,0xAE,0x40,0x8F,0xA5,0x3E,0x9F,0xC0,0xD7,0xE5,0x59,0x45,0xCA,0xCE,0x85,0x61, +0x6B,0x22,0x75,0xC5,0x39,0x69,0x91,0xF7,0x75,0xF9,0x04,0xEE,0xC4,0xF8,0xF0,0xC7,0x32,0xA5,0x8A,0xD1, +0xC3,0x99,0x75,0x55,0xE6,0xF7,0xD8,0xBC,0x16,0xC9,0xDE,0x27,0x7E,0xED,0x3A,0xFF,0xAD,0x9D,0x90,0x64, +0x43,0xE9,0xD0,0xCD,0x15,0xC8,0x3C,0xDE,0xB0,0x08,0xA3,0x84,0x74,0x57,0x00,0x0D,0x47,0xAA,0x9E,0x04, +0xB5,0xEC,0xB8,0x49,0x31,0x2B,0x49,0xB3,0xCA,0xDD,0x8E,0x19,0xE5,0x1E,0x8A,0x93,0xCF,0x5A,0xF3,0x06, +0xBA,0xAE,0xC1,0x8D,0x48,0x31,0x99,0x75,0x77,0xEA,0xEB,0xF3,0xF3,0xCA,0x82,0x53,0xBD,0x24,0x1A,0xA8, +0x4D,0x2F,0x48,0xC6,0x84,0x25,0x87,0x4D,0xAE,0x92,0x09,0xF8,0xB8,0x16,0x1A,0x63,0xEC,0xAB,0x9B,0x48, +0x6E,0x72,0x6C,0x0E,0x6D,0x8C,0xE9,0x12,0xDC,0xB1,0x69,0x2A,0x6F,0xCC,0xEA,0xDA,0x7B,0xF1,0x4B,0xFD, +0x9D,0xC4,0xB1,0x1E,0xBC,0x0B,0xFF,0xEB,0xB3,0xA9,0x43,0xD7,0x59,0x66,0x9A,0x42,0xF3,0xC3,0x67,0x89, +0xF7,0x25,0x7A,0x7B,0x93,0x11,0x92,0x21,0x68,0xE3,0xB1,0x15,0x70,0x8B,0x88,0x4E,0x1E,0xFD,0x3D,0x1C, +0xB0,0xD6,0xEB,0x9C,0xDD,0xE5,0x59,0xA3,0x4C,0xC1,0x81,0x35,0x77,0xC7,0xDC,0x69,0x8E,0xD5,0xCB,0x8F, +0xD2,0x65,0x30,0x59,0xF4,0x21,0x8B,0x5C,0xAB,0xA2,0x78,0x04,0x68,0xCE,0x0E,0x0D,0x7C,0xA3,0x44,0x80, +0x31,0x9D,0xC6,0xC6,0x35,0xD0,0x10,0x44,0x13,0xCC,0xAC,0xB7,0x4F,0x1A,0x4C,0x90,0x38,0x9C,0x0B,0xE5, +0x5C,0xFE,0x63,0x4D,0x63,0x6B,0x74,0xC4,0xD2,0xE1,0x45,0x80,0xB5,0x9D,0xFB,0xF6,0xB5,0xA9,0xEA,0x54, +0xDB,0x41,0x75,0xDF,0x4B,0xE9,0x4D,0x90,0xBC,0x9C,0xCD,0x95,0xB6,0xBE,0xB9,0x4F,0x74,0x28,0xE7,0xF5, +0x52,0xF5,0x74,0x24,0x8A,0x99,0x46,0x21,0x87,0x15,0xF2,0x0A,0x46,0x99,0x73,0x64,0xE3,0x92,0x94,0xB0, +0xE6,0x1F,0xCC,0x8A,0x96,0x39,0xBB,0x94,0x90,0xB9,0xC4,0x53,0xF1,0xA5,0x2F,0xDE,0x95,0x04,0xDD,0x4E, +0x19,0xB0,0x8A,0x10,0x9E,0xCD,0x8D,0x65,0x76,0x4D,0xEA,0x3B,0xFD,0xD8,0x29,0x52,0xF4,0xD7,0x9A,0xB3, +0xE3,0x03,0xAD,0xFB,0xF8,0xF1,0xFD,0x89,0x53,0x00,0xEC,0xCC,0xFD,0xDA,0x29,0x47,0x1E,0x63,0x96,0x1C, +0xDD,0x74,0xEE,0x43,0x21,0xDB,0xB9,0xD9,0xFF,0xD9,0xE5,0xF1,0x12,0x7A,0x86,0x6E,0xDE,0x58,0xFA,0x7B, +0x4D,0x25,0x63,0x5F,0xB0,0x15,0xC8,0x2F,0xB7,0xBA,0xFD,0xB2,0xDD,0x6A,0x30,0xD0,0xAB,0x01,0xE7,0x87, +0x54,0x0A,0xE2,0xA6,0x0C,0x64,0x87,0x56,0xF2,0x94,0x06,0xC8,0x0B,0x91,0xBF,0x0F,0x99,0xBF,0x61,0x99, +0x16,0x7D,0xD6,0xD3,0xDF,0x73,0x56,0xFC,0xC6,0xDB,0xFC,0x21,0xC0,0x40,0x58,0x96,0xCC,0x59,0xC6,0x83, +0x5C,0x4D,0xB3,0x4D,0xBC,0xFB,0xDF,0xC7,0x57,0x97,0xEE,0x7B,0x05,0x6F,0x08,0x6D,0x7E,0x2F,0x68,0x33, +0xDC,0x54,0xCF,0xDB,0x56,0x96,0x26,0x0E,0x08,0xC4,0xC7,0x7A,0x79,0x1D,0x50,0x95,0x44,0x0D,0x19,0x3B, +0x25,0x62,0x59,0x6E,0xC2,0x43,0x11,0xE4,0x5C,0xEB,0x0E,0x92,0x81,0x42,0x0C,0xE4,0x19,0x2E,0x48,0x29, +0x19,0x47,0x99,0xB0,0x3C,0x3D,0xAD,0x84,0x8E,0x44,0x4C,0xE4,0x12,0x21,0x14,0x52,0xFC,0x4D,0x6E,0xC7, +0xD6,0xDB,0x31,0xE2,0xBD,0x66,0x49,0xCD,0xE8,0x22,0x49,0x2C,0x28,0xD2,0x59,0x5D,0xD1,0x21,0x78,0xA8, +0xB4,0x4B,0xD5,0xA4,0x5E,0x22,0x2F,0x02,0x01,0xFB,0xDC,0x74,0xF1,0x25,0xB0,0x77,0xA2,0x1E,0x48,0xB6, +0xFA,0x74,0x20,0x81,0x73,0x15,0xF8,0x34,0x30,0x9A,0xF5,0x23,0xB1,0x71,0xCD,0xAE,0x33,0xAE,0x29,0x03, +0x83,0x66,0xEB,0x96,0xE2,0x60,0x3A,0xB7,0x62,0x01,0xB3,0x35,0xDF,0x21,0x99,0x04,0xA3,0x44,0xA1,0xF1, +0xAA,0xC5,0x3A,0xFB,0x78,0x4A,0x03,0x08,0xB0,0xCD,0x6A,0xAA,0x6A,0xF8,0xDD,0xAD,0x5E,0xE0,0xB0,0xE7, +0xE0,0x78,0xA0,0x99,0x17,0xA3,0x3C,0x15,0x39,0x4F,0x65,0xDA,0xDB,0x35,0x1C,0x01,0xBB,0x31,0xE3,0x0F, +0xEB,0x27,0x29,0xCB,0x48,0x7A,0xB9,0xC5,0x8E,0xE1,0xA7,0x86,0x88,0x89,0x0F,0xF5,0xDF,0x64,0x4B,0x20, +0xAA,0x6B,0x61,0x5F,0x54,0x70,0x6F,0xA7,0xA9,0x0A,0xCE,0xB7,0xBB,0xA4,0x6A,0x6C,0x02,0xFD,0x09,0x0E, +0x5C,0xF4,0x6A,0x52,0xAA,0x0B,0xB8,0xA3,0x17,0xD6,0xDC,0xD8,0xEA,0x0D,0x6F,0x81,0x59,0xD6,0xEE,0x58, +0x29,0x08,0x43,0xAF,0x73,0x1F,0xEC,0x3B,0xC4,0xC4,0xB7,0x2B,0x96,0xB5,0xE2,0xBB,0x28,0x82,0x34,0x79, +0x72,0x7E,0x5D,0x45,0x00,0x5E,0x67,0xF9,0xC4,0x42,0xEC,0x24,0xA2,0x14,0x82,0x96,0xB2,0x6C,0x17,0xC6, +0x9B,0x15,0x08,0x59,0x90,0xAB,0x2C,0xE5,0x80,0xAE,0x33,0x72,0xB3,0x35,0x3C,0x4F,0x52,0x23,0xB3,0xCB, +0xA8,0xED,0x1C,0xE3,0x57,0x14,0xF8,0x67,0x83,0x30,0x54,0xD3,0xCE,0xDA,0x33,0x21,0xFF,0xF0,0xB6,0x62, +0x99,0xAE,0xD2,0xF7,0xF2,0xC3,0xA5,0xE3,0xCF,0x30,0x26,0xEF,0x08,0xC1,0x48,0x2E,0x83,0x9E,0x09,0x08, +0x34,0xCD,0x91,0x93,0x5E,0x38,0x94,0x09,0xDF,0x36,0x31,0xB2,0x62,0x55,0x8D,0x56,0x30,0xD1,0x66,0x03, +0x5B,0x51,0xDC,0xD0,0x40,0x4E,0x3A,0x23,0x20,0x3E,0x86,0xDA,0xD7,0x78,0x37,0xE9,0xE3,0xF6,0x1B,0x46, +0xF4,0x7F,0x35,0x53,0xAA,0xC8,0x97,0xC5,0x10,0x31,0xDA,0x82,0x9B,0x3B,0x67,0x0A,0x12,0xA8,0x78,0xA4, +0x08,0x3B,0xDF,0xB9,0x9F,0x5D,0x5C,0xEA,0x35,0xA7,0xCE,0xAD,0x2A,0x3A,0x6E,0x9A,0x40,0x14,0x09,0x74, +0x3F,0x76,0x91,0x47,0xCD,0x69,0x2A,0xDE,0x00,0x72,0x00,0x0D,0xF3,0xC9,0xBF,0x72,0x79,0xB0,0x29,0xDD, +0x80,0x57,0x8C,0x7A,0x59,0xA5,0x71,0xB4,0x05,0x16,0x37,0xDA,0x7B,0x9B,0x25,0x1C,0x1E,0xD7,0x1F,0xC3, +0x88,0x70,0x7E,0x18,0xD1,0x13,0x8E,0xDA,0x99,0x3A,0x34,0xE0,0x6B,0xFC,0x8C,0xEB,0x0E,0xD3,0x44,0xDC, +0x88,0xB6,0x7A,0xCC,0x98,0x7F,0xDA,0x09,0x53,0xA2,0xA0,0xFB,0x86,0x72,0x27,0x88,0x51,0x13,0x4F,0x61, +0x5B,0x31,0x09,0xC0,0xE2,0x5A,0x77,0x9F,0x98,0x22,0x5E,0xD5,0xAD,0xF6,0x50,0x5D,0xD0,0x28,0x61,0xC1, +0x66,0xD9,0x85,0x12,0x8F,0xD0,0x1E,0x3A,0xDA,0x88,0xF9,0xFE,0xF1,0xCE,0x48,0xCA,0x06,0x6D,0xED,0xB0, +0x6F,0x32,0xD7,0x61,0x39,0xEF,0xF1,0x82,0xB0,0x5E,0x06,0x0A,0xE2,0x1A,0x68,0x44,0xAA,0xA3,0xA6,0xEB, +0xBB,0x4F,0xC3,0x06,0x95,0x42,0xA4,0xC5,0xF7,0x60,0x4D,0x25,0xD0,0xAC,0xCE,0xD3,0xCD,0x2E,0x11,0x2A, +0x32,0xA5,0x19,0xCE,0xF8,0x58,0x7F,0xD0,0x50,0x51,0x00,0x0D,0x0B,0x8B,0xF6,0x6F,0xE9,0xE5,0xCD,0xE0, +0x4F,0xFB,0x4F,0x06,0x10,0xE5,0x08,0x1C,0xD3,0x8A,0x9E,0xD4,0x12,0x47,0x18,0x33,0xBC,0xC8,0xF5,0x05, +0x67,0x89,0x01,0x41,0x24,0x8B,0x3E,0x37,0x90,0xDC,0x49,0xB3,0x31,0xC9,0x77,0x42,0xD0,0x5C,0x81,0x6C, +0xA3,0x0A,0xD1,0xA8,0x56,0x2D,0x33,0x8D,0x64,0x6A,0x9B,0x73,0xD4,0x67,0x31,0x95,0x0D,0x28,0x82,0xF6, +0xBD,0x22,0x12,0xD3,0x3D,0x8A,0x88,0xAC,0xCD,0xB9,0x2F,0x9E,0x0E,0x65,0x12,0xE1,0x76,0xA6,0xF9,0xBE, +0x2F,0x09,0xC2,0x19,0xFE,0xA5,0xE3,0xD2,0xFA,0x8E,0x74,0xE7,0xA8,0xE5,0xBD,0x10,0xCA,0x93,0xCB,0xAD, +0x4D,0x45,0x63,0x0B,0x0A,0xA8,0x2F,0x2D,0xF6,0xA4,0xFB,0x47,0x01,0xD0,0xF8,0x04,0xBC,0x7E,0x1C,0x67, +0xE5,0x1D,0x65,0x6A,0xFF,0xAA,0xE7,0x2D,0x8C,0xDC,0xF4,0x46,0xDE,0xD2,0x0A,0x1E,0x02,0x80,0xCE,0x12, +0x7C,0x52,0x18,0x72,0x4E,0x6D,0x43,0x82,0xDF,0x16,0x1D,0x72,0x65,0x5F,0xC7,0x63,0x3D,0xA8,0x7B,0x66, +0x27,0x7F,0x33,0xBE,0x97,0xEA,0x21,0xA5,0x2C,0x89,0x93,0x19,0x63,0xED,0x25,0x52,0xCB,0xCB,0x75,0x87, +0x63,0x54,0x5A,0xBA,0x5B,0x19,0xEC,0x83,0x57,0x10,0xE0,0x72,0xC5,0x28,0x72,0x06,0x52,0x72,0x6C,0x10, +0xA5,0x28,0x94,0x46,0x69,0x10,0x8B,0xDE,0x63,0xAB,0xC7,0x4F,0x79,0xB3,0xFE,0x83,0xA2,0xE8,0x5D,0x05, +0x34,0x69,0x4B,0x77,0xDB,0xF2,0x06,0xC2,0x08,0x7B,0x15,0x43,0xF9,0x95,0x95,0xA6,0x14,0xA8,0x90,0x5B, +0xB7,0x9E,0x3F,0x18,0x77,0xEF,0x76,0xE2,0x87,0xD4,0xE7,0x00,0x86,0xB2,0x75,0xA2,0x64,0x79,0x54,0x94, +0x14,0xA8,0xA8,0x02,0x6B,0x94,0x94,0x90,0xC3,0xFB,0x7A,0x03,0x53,0xB5,0xA6,0xEB,0x0B,0x0A,0x63,0xEE, +0x5B,0x1A,0xED,0x21,0xD5,0x96,0xE6,0x71,0xF6,0xDE,0x8B,0xE0,0x17,0xF9,0x55,0xD7,0xEF,0x06,0x58,0x11, +0x47,0xB1,0x5D,0xFE,0x06,0x78,0x7E,0x49,0xE3,0xFA,0x76,0x07,0x8F,0x83,0xB3,0x68,0x90,0xB5,0xCB,0x42, +0x36,0x95,0x63,0xD0,0xDF,0x9D,0x2F,0xE9,0x19,0xD6,0x96,0x1C,0xA8,0x0D,0xF4,0xC8,0x96,0xDD,0xDE,0xBC, +0x2A,0xF4,0xA6,0xF8,0x94,0xD5,0xFE,0x06,0x1B,0xDF,0x27,0xB2,0xA8,0x75,0x08,0x4D,0x7B,0x48,0xD0,0xA5, +0x95,0xD9,0xD7,0xFD,0x30,0x3D,0x3D,0x48,0xAA,0x6E,0xE6,0x14,0x5A,0x9E,0x08,0xE2,0x93,0x9A,0xEA,0xDB, +0x5D,0x7C,0xE7,0xE8,0x2A,0x77,0x2D,0xB8,0x01,0x61,0x11,0x38,0x8E,0x15,0x96,0x5C,0x36,0x1D,0x81,0x89, +0x57,0x54,0xC4,0x05,0x7B,0x77,0x6B,0x20,0x0F,0x14,0x9F,0x4D,0xB7,0x7E,0xE6,0x14,0x85,0xEF,0x2A,0x79, +0xC9,0xFE,0x6B,0x39,0x2D,0xB7,0xB5,0xC2,0x1C,0xB9,0xFF,0x9B,0xAF,0x72,0x43,0xFF,0xFF,0xFF,0xDB,0x53, +0x7F,0x56,0x40,0xD5,0xF0,0x26,0xE8,0x52,0xC2,0x1C,0x1F,0xD7,0x3A,0xCD,0xD5,0x8C,0x07,0xEB,0xB2,0x96, +0x84,0x7E,0xE0,0xB4,0x12,0xF8,0xA6,0x91,0x08,0xCE,0x5A,0x03,0xFB,0xE5,0x28,0x87,0x6D,0x2D,0x44,0xC3, +0xF3,0x50,0xC3,0x79,0x3B,0xE1,0x7D,0x63,0xB2,0xC2,0xF1,0x97,0x11,0x67,0x40,0xD8,0x24,0xBC,0x4D,0x46, +0xF7,0xFB,0x1A,0x41,0xA1,0x02,0x64,0x3B,0xB1,0x84,0x90,0x19,0x24,0xB1,0xC8,0x59,0xF3,0xEE,0xEC,0xA3, +0x87,0x88,0xA8,0x14,0x1D,0x28,0xCF,0x4A,0x37,0x5E,0xE0,0xA4,0xE0,0x6A,0xE8,0xCB,0x23,0x87,0x11,0x47, +0x23,0x67,0x05,0x5F,0xE0,0xF3,0x7F,0x35,0xC2,0x69,0x1B,0x1F,0x68,0x63,0x83,0xAE,0x30,0x2A,0x5D,0xF5, +0xDB,0xD6,0xB9,0xC0,0xFD,0x6A,0xFA,0x4F,0x33,0x73,0xBA,0x4B,0x16,0x57,0x4B,0xC0,0xAD,0x26,0xEC,0x88, +0x44,0x38,0x74,0xB8,0x8B,0x75,0xB4,0x78,0x85,0x26,0x18,0xCE,0x7A,0xC8,0xD0,0xED,0xA6,0xC4,0xBD,0xE1, +0xB3,0xCC,0xDB,0x09,0xA7,0x0A,0xF4,0xE9,0xC4,0xB7,0xB3,0x63,0x31,0xC9,0x5B,0x9D,0xF0,0x5A,0xA9,0xEE, +0xB3,0x86,0xA3,0xC6,0x44,0x50,0xC9,0xED,0x92,0xB4,0x7A,0xB7,0x88,0x50,0x88,0xA3,0xB9,0x2A,0xF5,0xC9, +0x9E,0x4F,0x98,0xB3,0xF9,0x6A,0xD9,0xDA,0xCE,0x70,0xC8,0xBE,0xBA,0xA7,0x5C,0xDC,0xCB,0x51,0x6E,0x9E, +0xD9,0x25,0xA1,0x2B,0x7D,0xF3,0x93,0x62,0x3B,0xA6,0x74,0x54,0x1A,0x9F,0x5B,0x0D,0x3B,0x61,0x33,0x7D, +0x6A,0x14,0x36,0xBF,0x19,0x2C,0x61,0x8A,0xE5,0xE0,0x10,0x6D,0x78,0x0A,0x64,0xCB,0x97,0x9B,0xBA,0x24, +0xBD,0xC6,0x93,0x42,0x42,0xD0,0x6B,0xD7,0x12,0xFA,0x0D,0x60,0x29,0x1E,0x20,0xE7,0x14,0x97,0xE7,0x32, +0x43,0x61,0xD6,0x9A,0x8A,0xDC,0x82,0x63,0x22,0x11,0x8D,0x81,0x98,0xFF,0x96,0x49,0xD3,0x9F,0x24,0x5B, +0x19,0x11,0x6D,0x31,0xF5,0x1C,0xD9,0x6A,0x0C,0x5D,0xA2,0x53,0x63,0x50,0x4D,0x65,0xC5,0xEC,0x45,0xB3, +0x17,0x95,0x4C,0x19,0x93,0xBC,0xF8,0x72,0x28,0x5E,0x02,0x41,0xD3,0xFE,0x4E,0xE1,0x82,0xB4,0x79,0xB6, +0x72,0x3D,0xE1,0xF2,0x79,0x17,0xD8,0x16,0xD2,0xFD,0x3A,0x3E,0x2F,0x74,0xC1,0x27,0x30,0x35,0xD7,0x9E, +0xE4,0xCF,0x28,0x07,0x53,0xFE,0x75,0xE1,0x28,0xB8,0xB5,0x57,0x91,0x97,0x46,0xBF,0x1C,0x3B,0x5D,0x17, +0x8C,0x28,0x66,0x28,0x30,0x15,0x61,0xCC,0x34,0x44,0x91,0xD6,0xCB,0x5E,0xA8,0x0C,0x13,0x77,0x0C,0xEA, +0x1A,0x98,0xD8,0x6F,0x5B,0x96,0x5C,0x5E,0xEB,0x5A,0xE0,0xBA,0x98,0xFA,0x5E,0x61,0x4F,0x56,0x38,0xC2, +0x59,0x95,0x47,0xA0,0x49,0x41,0x96,0x9F,0x98,0x5A,0xF7,0x39,0xF1,0x3A,0x5B,0x6E,0x9F,0x64,0x98,0xDB, +0xDA,0xF9,0x36,0x4E,0x75,0x39,0xE6,0xBA,0x48,0xC5,0xFE,0x9C,0x2A,0x33,0x34,0xC5,0x69,0xDE,0x16,0x21, +0x90,0x3E,0xD7,0xC7,0x01,0xC9,0xAE,0x7C,0x27,0x30,0xED,0x48,0x23,0xDE,0x0A,0x7E,0x59,0x3C,0x39,0xCE, +0xAC,0x2E,0x73,0x3D,0xE6,0x31,0xE8,0x99,0xE6,0xA1,0x98,0x28,0xFC,0xC4,0x1F,0xC2,0xD7,0x8B,0x85,0x3F, +0x18,0x39,0x05,0xC6,0x9F,0xF0,0xE5,0x1F,0x79,0x77,0x06,0xE0,0x2E,0x86,0x38,0x09,0xB7,0x24,0xED,0x54, +0x9A,0x3F,0x8E,0x83,0x17,0x4A,0x50,0x61,0x2F,0x88,0xAE,0xB7,0xFC,0xE8,0x82,0x75,0x93,0xC9,0xFE,0xCC, +0xBC,0xE2,0x0C,0xED,0xE7,0x72,0x9F,0xE5,0xB5,0xE2,0x73,0xDD,0xF7,0xD9,0xCE,0x54,0xF2,0x68,0xAF,0xF1, +0x07,0xFF,0xBF,0xB6,0xD7,0x07,0x3B,0x4C,0xA5,0x1C,0xE7,0xD5,0xC5,0x66,0xA5,0xA4,0x24,0x34,0xA0,0xB6, +0x4A,0xAB,0x22,0x9E,0xD3,0x3F,0xC8,0x36,0x52,0xEB,0x50,0x15,0xC5,0x27,0xA2,0xB4,0x56,0x45,0x87,0xF6, +0x1C,0xA5,0xFC,0x94,0xD5,0xAD,0x62,0xC1,0x1B,0x80,0x81,0xE7,0x22,0xAB,0x14,0x8E,0xB6,0x7D,0x91,0x23, +0xE1,0x6D,0x61,0x56,0xE4,0xA7,0x91,0xD5,0xB5,0x05,0x29,0x6A,0xBD,0x4A,0xA4,0x95,0x55,0xAF,0x72,0x68, +0x4C,0x87,0xF6,0xEC,0xDC,0xAE,0xC8,0xC2,0x7F,0x05,0xA0,0xD5,0xB7,0xAC,0xC6,0x88,0x19,0x81,0x57,0xED, +0x3F,0xAF,0x42,0xD2,0x25,0x84,0x1E,0xBA,0x45,0x2D,0x43,0x44,0xAE,0x87,0x0E,0xA6,0x3F,0x27,0xCC,0xA9, +0xEE,0xFA,0x89,0x9F,0x45,0x45,0x2E,0xEB,0x99,0x84,0x06,0xB6,0x3C,0x54,0xAC,0xC4,0x4F,0xC8,0x85,0x8E, +0x9E,0xBE,0x9A,0xEA,0x1C,0x95,0xB8,0x4F,0xBD,0xAA,0x0C,0xCE,0x7D,0xAE,0x2D,0x1C,0xFD,0xEA,0x68,0x9A, +0x4B,0x20,0x92,0xDC,0x3D,0x3D,0xD6,0xE5,0x4C,0xB5,0x9A,0x3A,0xDF,0xE0,0x5D,0x27,0x01,0x08,0xB3,0xCA, +0xFD,0x4E,0xCB,0x94,0x27,0x8D,0x7B,0x93,0x9E,0xE1,0xF2,0x6B,0x74,0x8B,0xB1,0x5A,0x3C,0xA9,0xBB,0x03, +0x5A,0x30,0xB1,0xA0,0x7C,0xE9,0x44,0x22,0x78,0x9D,0x1D,0xC1,0xFE,0x93,0xCC,0xE5,0x5F,0xCB,0xB1,0xB0, +0x3C,0xF3,0x71,0xA3,0x8A,0x8A,0x39,0x65,0xB1,0x3C,0xC3,0x30,0x47,0xC1,0x06,0x34,0xB0,0x3C,0x89,0x6B, +0x97,0x54,0xED,0x27,0xD7,0x55,0x8B,0x4B,0xDF,0x14,0xA1,0x0A,0xC7,0xC9,0x3B,0xF5,0x5A,0x90,0xFF,0x95, +0x5E,0xD7,0x05,0x4D,0x18,0x07,0xC5,0x5F,0xCA,0x3E,0xF7,0xB0,0xCD,0xD7,0xB4,0x47,0x55,0x06,0xD4,0x90, +0x04,0x88,0xFD,0xF6,0xD5,0x79,0xF5,0x12,0x0D,0x38,0xD4,0x06,0xC0,0xBA,0x7A,0x56,0xE7,0x19,0xC6,0x09, +0x73,0x07,0x5B,0x67,0x2B,0x30,0x9D,0x45,0xB3,0xDC,0x0B,0xE4,0x1B,0xD9,0x0A,0x63,0xB8,0x99,0x39,0x03, +0xAF,0x68,0xD5,0x07,0x4C,0xB8,0x47,0x00,0xC1,0xCC,0x87,0x0B,0x22,0x0C,0x98,0x83,0xCF,0x18,0x9E,0x65, +0xDD,0x43,0x4E,0xB8,0x87,0xDB,0x02,0x4C,0x4F,0xA8,0xD4,0x5C,0x6D,0x82,0x87,0xF5,0xAC,0xFB,0x21,0x96, +0xEF,0x85,0xC1,0xC4,0xD1,0xF6,0xDF,0xE9,0x9F,0x81,0xA3,0x71,0x47,0x25,0x57,0xE5,0x7E,0x98,0x0F,0x55, +0xEC,0xB7,0x39,0xFD,0x9E,0x1A,0xAA,0x22,0x54,0x18,0xDD,0xC8,0x4E,0xD4,0x0B,0xC4,0x5E,0x9E,0xD9,0xDA, +0x91,0x17,0x86,0x8A,0x79,0x31,0xB2,0x8C,0x91,0x71,0xC1,0x03,0x62,0x71,0x71,0x6E,0xC6,0xDE,0x96,0x5C, +0x3A,0x56,0xFD,0x7E,0x1E,0x81,0x56,0x56,0xFA,0x1E,0xE5,0xFA,0x88,0xDC,0x9F,0x4D,0xBB,0xE4,0xA7,0xAC, +0x30,0xD4,0x88,0x6B,0xA5,0x9E,0x79,0xB7,0xCF,0x5F,0xB5,0xF2,0x1C,0xB9,0xBF,0x83,0x52,0x70,0x57,0x7E, +0x7D,0xFB,0x8B,0x62,0x0E,0x46,0x90,0x36,0xBF,0x8D,0x63,0x1D,0xAB,0x04,0xEE,0x23,0xF1,0xBF,0x2C,0xB2, +0x83,0x05,0xE8,0x16,0x26,0x2C,0xBC,0x43,0x35,0x4E,0x38,0x46,0x33,0x65,0x54,0x21,0xBA,0x42,0xF9,0x8C, +0x3F,0x63,0x2B,0x91,0x09,0xED,0xCB,0x70,0xAC,0xCD,0x68,0x73,0xB2,0x56,0xD0,0xFC,0x76,0x46,0x9E,0x8E, +0x81,0x2D,0xE7,0x32,0x70,0xBA,0x90,0xA0,0x76,0xA9,0xC4,0xBB,0xED,0x24,0x28,0x9D,0x64,0x06,0xD0,0x64, +0x52,0x64,0x59,0x23,0x7F,0xAC,0x53,0xA7,0x66,0x3A,0xC1,0xB7,0x81,0xC5,0xD8,0x74,0x53,0x65,0xD6,0x31, +0x8F,0x0D,0xC1,0xBA,0x92,0xD9,0x9C,0xD2,0xE6,0xEB,0xD1,0x65,0xD2,0x66,0x1D,0x20,0xAD,0x0C,0x52,0xAF, +0xEE,0x07,0x67,0x1D,0xC0,0xE7,0xD9,0x75,0xD3,0x67,0xFA,0x2F,0xA9,0x13,0xBA,0xE4,0x27,0xE7,0x02,0x9D, +0x08,0xC5,0xCA,0x3C,0x04,0x9F,0xEC,0x7A,0x4A,0xF9,0x3F,0xE5,0x1B,0xD2,0x3A,0xA3,0xE8,0x2B,0x9D,0xC0, +0xD9,0x92,0x32,0xEF,0x0A,0x0E,0x13,0xE0,0x9C,0xB1,0x4A,0x02,0x6F,0x4C,0x2B,0x4B,0x26,0x27,0x52,0x32, +0x2E,0x06,0x8B,0x39,0x60,0xDA,0xFB,0xB8,0xEB,0x69,0x15,0xD0,0x74,0xD0,0x52,0xA0,0x75,0xC9,0x2A,0x45, +0x1C,0x55,0x40,0x93,0xB5,0x48,0xD2,0x6C,0x5A,0x6C,0x4E,0xDC,0x12,0x56,0x4A,0x58,0x04,0x2F,0x9E,0x68, +0xB4,0xB0,0xDA,0x7C,0x5B,0x6D,0x17,0x72,0xA0,0xF5,0xC2,0xB0,0xFD,0xF5,0xD1,0x59,0x31,0x22,0xD3,0x6D, +0xDA,0x6E,0x75,0xF1,0x69,0x3C,0x14,0x55,0x19,0x07,0x4D,0x1B,0xAB,0x5F,0xDB,0x7D,0xDB,0x6F,0x24,0x0E, +0x81,0x9A,0xFA,0x82,0xD1,0xB3,0xB4,0x48,0xB4,0x9F,0xAE,0x26,0xF0,0xA1,0x79,0x72,0xA3,0x15,0xF4,0xB0, +0x37,0x88,0xAA,0x94,0x02,0x57,0x0C,0x45,0x03,0xA1,0x82,0x91,0x22,0xBE,0x34,0x76,0x3C,0xEF,0x14,0xDE, +0x07,0x49,0xED,0x21,0xD1,0x72,0xE8,0xF3,0x60,0x99,0xCB,0x69,0x10,0x71,0x0B,0x15,0x0A,0x17,0x40,0xB4, +0xF7,0xCA,0x47,0x86,0x2A,0x56,0xC4,0xC4,0x32,0x34,0x4B,0xA0,0x64,0xED,0xD4,0xE4,0x72,0x74,0x90,0x54, +0x78,0x2D,0xCC,0xD4,0x33,0x35,0x4E,0xD0,0x65,0xEC,0xDC,0xF4,0x73,0x75,0xDE,0x24,0xA4,0xCF,0xC5,0xC5, +0xB2,0x36,0x96,0x92,0xD7,0xA7,0xD5,0xE5,0xF2,0x76,0x2D,0x95,0xED,0x1A,0xCD,0xD5,0xB3,0x37,0x55,0xEC, +0x63,0x3A,0xDD,0xF5,0xF3,0x77,0x81,0x98,0xAA,0xB4,0x8D,0x0F,0x43,0x55,0x2C,0x18,0xF5,0xF7,0x50,0x50, +0xFB,0x3A,0xEB,0xFA,0x6A,0xE9,0x4E,0x51,0x90,0xC4,0x04,0x89,0xC8,0xA6,0xC4,0x3C,0x11,0xEA,0xF6,0x6B, +0x2A,0x1E,0x58,0x0D,0xCF,0x4F,0xB3,0xCB,0xCC,0xF7,0x9C,0x2E,0xB2,0xE9,0x0D,0x1B,0x60,0x6C,0xD7,0xD5, +0x3B,0x3F,0x21,0xDC,0xC7,0x84,0xE1,0xBB,0x18,0xF8,0xB9,0x8F,0x24,0x1D,0xC6,0xCC,0x3A,0x3C,0xC6,0xE8, +0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x71,0xBA,0x68,0xA2,0xCE,0xDC,0x3B,0x3D,0xD8,0xF8,0x6B,0x5D,0xDE,0xFC, +0x7B,0x7D,0x7F,0x2B,0x28,0x36,0xC7,0xCD,0xBA,0x3E,0x51,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x37,0x5D, +0xCE,0xEE,0xCF,0xDD,0xBB,0x3F,0x19,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x0A,0xD2,0x58,0x2B,0xDE,0x00, +0xF5,0x33,0xB6,0xA6,0x35,0xE7,0xF0,0xDE,0xE8,0xA0,0xA9,0xFA,0xB9,0xCE,0x53,0x32,0x7E,0xAE,0x7E,0x53, +0x43,0x58,0xE1,0xCA,0x36,0x63,0x59,0x0F,0x64,0x03,0xDF,0x00,0x75,0xC4,0x0F,0x42,0x63,0x83,0x7F,0x84, +0x53,0xC3,0x49,0x11,0x57,0x8E,0x2E,0x05,0x36,0x0E,0x4D,0x40,0xE0,0x8C,0x41,0x45,0xE6,0x58,0xE3,0x31, +0x3C,0x03,0x5C,0x24,0x57,0xE4,0x0E,0x64,0xA7,0x47,0xF0,0x66,0x56,0xE4,0x1A,0xE7,0x47,0x28,0xE8,0x56, +0x17,0xA5,0x9C,0x8C,0x24,0xE5,0xF8,0x76,0x57,0xE5,0xB3,0x4A,0x6F,0xD5,0x99,0x63,0x96,0xA6,0xEE,0x90, +0x4A,0x4B,0xF1,0x67,0xD6,0xE6,0xBC,0x33,0x83,0x83,0xE9,0x57,0x97,0xA7,0x9D,0x88,0x16,0x1A,0xF9,0x77, +0xD7,0xE7,0x7B,0x30,0xAB,0x8E,0xF2,0xFF,0xBF,0x58,0xA2,0x59,0x65,0x6C,0x4A,0x68,0x06,0xAA,0x60,0x07, +0x4D,0x8F,0x90,0xAE,0x80,0x06,0x41,0xC9,0xC9,0x42,0xC2,0x3F,0x5B,0x09,0x03,0x85,0x2D,0x06,0x81,0x2B, +0x77,0xEE,0xAB,0xC9,0x2C,0x4B,0xA8,0xF8,0x3D,0x41,0x05,0xB1,0x2E,0x8D,0x0F,0x70,0x3E,0xEA,0xCC,0x8A, +0x6E,0x3E,0xF2,0xBB,0x86,0x38,0x99,0x6E,0x71,0x8C,0xE2,0x4E,0x1E,0xAC,0x59,0x18,0xB1,0x31,0xF2,0x6E, +0x5E,0xEC,0x5C,0xD8,0x0E,0xEA,0xEA,0x5E,0x1F,0xAD,0xBC,0xFE,0x36,0x1F,0xFA,0x7E,0x5F,0xED,0xB8,0x5B, +0x88,0xD4,0xE3,0x4F,0x9E,0xAE,0xDF,0xF8,0xFB,0xC4,0xF3,0x6F,0xDE,0xEE,0x31,0x5A,0x2C,0xC3,0xEB,0x5F, +0x9F,0xAF,0x21,0x5B,0xB3,0x8D,0xFB,0x7F,0xDF,0xEF,0x5C,0xF0,0xDB,0x6D,0x2A,0xE4,0x17,0x10,0x6E,0x94, +0x18,0x7F,0x01,0x55,0xF8,0xFD,0x3E,0x15,0x9E,0x0C,0xAB,0x14,0x89,0xB3,0x42,0xB5,0x41,0x58,0xEF,0x5C, +0xB0,0x0C,0x7E,0x83,0x9B,0xB2,0xFF,0xC6,0x17,0xB6,0x95,0x53,0x28,0x01,0x4A,0x57,0x80,0x53,0x7F,0x91, +0x12,0xD1,0x95,0x68,0x37,0xB7,0xB9,0x4C,0x11,0xB0,0x17,0xC4,0x87,0xF8,0x04,0x88,0xC5,0x69,0xE4,0xC6, +0x36,0xB4,0x67,0xE2,0x66,0xF4,0xF4,0xE6,0x76,0xF4,0x54,0x50,0xAF,0xCD,0xEC,0xD6,0x37,0xB5,0x18,0xF2, +0x67,0x87,0xFC,0xF6,0x77,0xF5,0x1D,0x31,0x87,0x39,0xE5,0xC7,0xB6,0xB6,0x6C,0xE3,0xE6,0x16,0xF5,0xE7, +0xF6,0xF6,0x15,0x57,0xCA,0x13,0xED,0xD7,0xB7,0xB7,0x0D,0xF3,0xE7,0x55,0xFD,0xF7,0xF7,0xF7,0xA4,0xAC, +0xC7,0x49,0x28,0xEC,0xB1,0x4E,0x30,0x0F,0x0F,0xEE,0x88,0x46,0x03,0x33,0x10,0xA6,0xCE,0x90,0xF4,0x1E, +0x41,0x16,0x6C,0xF4,0x49,0xD4,0x34,0x5E,0x1B,0x54,0x6D,0x9E,0x8D,0x7A,0xAF,0xAA,0x5D,0x45,0xA4,0x58, +0x68,0x57,0xBE,0xDC,0x88,0x73,0xAF,0x5D,0xC3,0x10,0x0F,0xED,0xDF,0xCE,0x75,0xA6,0x86,0xD4,0x2C,0xCE, +0xDF,0x52,0xE6,0x03,0xEA,0x9A,0xE6,0xCE,0x3E,0xBC,0x1D,0xEA,0x6E,0x46,0xF6,0xEE,0x7E,0xFC,0x11,0x38, +0xAD,0xB5,0xEE,0xDE,0x3F,0xBD,0x7A,0xFB,0x67,0x22,0xFE,0xFE,0x7F,0xFD,0x6B,0xB5,0x0F,0x14,0xE7,0xCF, +0xBE,0xBE,0x4E,0xEA,0xEE,0xFE,0xF7,0xEF,0xFE,0xFE,0x50,0xB9,0xEE,0xDF,0xEF,0xDF,0xBF,0xBF,0x7B,0xFB, +0xEF,0xDF,0xFF,0xFF,0x77,0xE0,0x60,0x44,0x71,0x8D,0x22,0x7B,0xD1,0x42,0xA5,0x42,0x01,0xC0,0xAA,0xC6, +0xFC,0x6F,0x70,0x92,0x04,0x6B,0xD8,0x76,0x55,0x27,0x60,0x52,0x02,0x3E,0xA2,0xC7,0x25,0xCC,0x79,0x83, +0x85,0x3B,0x45,0x80,0xD3,0x02,0x69,0x43,0x81,0x4A,0x97,0x19,0x50,0xDC,0xC9,0xE0,0xB8,0x05,0x01,0x04, +0x97,0x88,0x61,0xB3,0xC4,0xA7,0x0A,0x72,0x1B,0x4A,0x8C,0xD0,0xDE,0xE7,0x99,0x42,0xF7,0x2D,0x70,0xEA, +0x43,0xA4,0xE8,0x34,0x72,0x6B,0x6B,0xE0,0x21,0x27,0x3D,0xA9,0x11,0x5E,0x4D,0x72,0x45,0xB8,0xB8,0x34, +0x55,0x68,0xE2,0xF5,0x5A,0xA5,0x41,0x83,0xA2,0xFD,0x01,0x55,0x84,0x08,0xE9,0x35,0xD3,0x69,0x8F,0x16, +0x6A,0x8E,0xA0,0xB9,0x8B,0xAA,0xF5,0xF4,0x3C,0x29,0xD3,0x71,0x70,0x6A,0x8A,0x0B,0xA9,0x82,0x20,0x8E, +0x1D,0xEA,0x48,0x29,0xEB,0x4E,0xDA,0x5D,0xB1,0x4B,0xBF,0x7A,0x4A,0xFE,0x08,0x9E,0x1C,0x19,0x7A,0x98, +0x73,0x46,0xCA,0x99,0xAE,0x94,0x7C,0xEB,0x0A,0x09,0xBB,0xF2,0xBA,0x27,0x43,0x38,0x29,0x45,0x85,0x4F, +0x27,0xC7,0x73,0x9B,0x8C,0x02,0x4B,0xEC,0x5D,0xD6,0x7B,0x99,0x93,0x44,0x89,0x57,0x26,0xB6,0x24,0x29, +0xF5,0xA1,0xBD,0xC8,0x59,0x41,0xEF,0xF7,0x29,0x48,0xD8,0x7C,0xF9,0x6A,0xF5,0x17,0xBC,0x80,0xDF,0x4D, +0x1D,0xC6,0xDA,0xBE,0x3F,0x03,0xA2,0xFE,0x5A,0x00,0xDF,0xDB,0x8A,0x72,0x93,0x79,0x8A,0x2F,0x2A,0x05, +0x58,0x46,0x5B,0x5D,0xB9,0x4E,0x36,0xB3,0x77,0xEC,0x82,0x9B,0xC1,0x6E,0xC9,0xFD,0xA0,0x88,0xA3,0xFF, +0xDA,0x0A,0x4E,0x6F,0x83,0x1D,0x38,0x6C,0xB7,0x7D,0x5E,0x5B,0xC3,0x56,0xEC,0xD7,0x0C,0xCF,0x34,0x40, +0xDF,0x1E,0xF2,0xCD,0x0E,0x2C,0x63,0x52,0xE3,0x19,0xC2,0x09,0x43,0x8A,0x4F,0x7A,0x03,0x77,0xFB,0xDD, +0xA0,0x7F,0x9D,0xAD,0x41,0xD8,0xCE,0xA5,0xCF,0x31,0x35,0x41,0x7E,0x1C,0x54,0x27,0xCA,0x31,0x9E,0xD3, +0xA2,0xEC,0xB5,0x49,0x07,0x31,0xEC,0xFC,0x24,0xBF,0xBC,0x46,0x3B,0x89,0x5C,0xE4,0xE2,0x37,0xDE,0xE5, +0xD1,0x72,0x8C,0x31,0x53,0x0E,0xC0,0x37,0x35,0x9E,0x3E,0xF4,0x60,0xA4,0xFC,0x16,0xF1,0x3D,0xE8,0x45, +0xC5,0x55,0x05,0x34,0x93,0x30,0x0C,0xE7,0x07,0x3A,0x5D,0xE7,0x53,0xFE,0xEF,0xA7,0x2E,0x91,0xD0,0x57, +0xBA,0x98,0x87,0xF5,0x63,0x26,0x17,0x05,0xFF,0x78,0x66,0xC8,0x2E,0x15,0xDD,0xA3,0x47,0x25,0x6E,0x2A, +0x6D,0x78,0xDA,0xE9,0xF5,0x63,0x36,0x48,0x96,0x16,0x10,0xEF,0x1C,0xB8,0x96,0xA9,0x6F,0xF2,0xA0,0x18, +0x18,0x7D,0x4D,0x77,0x0B,0x7F,0x5C,0x3F,0xBE,0x82,0xD7,0x58,0xC9,0x5C,0xFF,0xCB,0x32,0x19,0x37,0x49, +0x52,0x14,0x74,0x6E,0xC5,0x38,0x07,0x3B,0xEC,0x6B,0x5F,0x4C,0xB6,0x71,0xC2,0x08,0x7A,0x1F,0x06,0x3D, +0x03,0x3A,0x0F,0xFF,0x8F,0xA3,0xB6,0xA8,0x6D,0x73,0xCC,0xF8,0x63,0x7D,0xD3,0x5E,0x32,0x79,0x9E,0x09, +0x60,0x57,0x01,0x1E,0xD7,0xF6,0xD6,0xC0,0x8A,0x8F,0xCB,0x36,0xBC,0x95,0xFB,0x6C,0x11,0x32,0xB7,0xA9, +0xDB,0xF5,0x8F,0x29,0x59,0x71,0xF7,0x8D,0xBF,0x30,0x9C,0x86,0xE5,0x3D,0x20,0x1F,0x79,0x7C,0x7A,0x42, +0xA7,0xE5,0x0C,0x83,0x36,0xAD,0x50,0x82,0x58,0xCF,0xE2,0x94,0xA3,0x4D,0xA0,0xDE,0xE4,0x8E,0x68,0xE7, +0xD1,0xE0,0x58,0x73,0xF0,0xCC,0xE7,0x74,0x26,0x36,0x7B,0x06,0x27,0x84,0x23,0x85,0x91,0x12,0x51,0x83, +0xA8,0xCD,0x26,0xC8,0xE3,0xE2,0x49,0x57,0xC2,0x8C,0x93,0xE4,0xB7,0x0C,0x73,0xC8,0x66,0xC5,0x79,0x93, +0xC5,0x4E,0xD3,0xF6,0x86,0xF4,0x80,0x02,0xDA,0x29,0x78,0xB3,0x66,0x55,0xCA,0x84,0xD4,0xEC,0xBE,0x6C, +0x61,0x30,0xD0,0x86,0xEC,0xAA,0x21,0x65,0xA2,0x6E,0x08,0x14,0x14,0x15,0xA1,0xB2,0x40,0x73,0x99,0xC5, +0x9F,0x7B,0xBB,0xC3,0xFA,0xD7,0x05,0x85,0x54,0xEE,0x3F,0x69,0xE5,0xC5,0x89,0x16,0x30,0xAA,0x01,0x76, +0x27,0x38,0xF3,0x57,0x74,0xE1,0x42,0x4E,0x8C,0x85,0xF6,0xE6,0xC1,0xE7,0x3E,0x41,0x4A,0x63,0x21,0x1F, +0xFD,0x69,0x12,0xCA,0xFA,0x86,0x75,0xA4,0x22,0x23,0x02,0xEA,0xB6,0xC6,0xE8,0x10,0xB6,0x8D,0x69,0xF6, +0x2F,0xEF,0xA2,0xE9,0xEB,0xFF,0x2E,0xA9,0xC9,0x8A,0xC0,0xDC,0x58,0x67,0x4B,0x5B,0x8B,0x86,0x52,0xE4, +0x9B,0x21,0x5B,0x7F,0x89,0xC6,0x00,0xDD,0x71,0x16,0x63,0x41,0x3D,0xD0,0xA8,0xB5,0xBD,0xAA,0x4C,0x88, +0xC3,0xAE,0xFA,0xCC,0xAF,0xE3,0x92,0x7E,0x8A,0x4C,0x95,0xBC,0x9D,0x85,0x96,0x92,0xCC,0x80,0xF2,0xEB, +0xA2,0xE2,0xD8,0xAD,0x9E,0x73,0xEF,0xB9,0x3F,0x24,0x88,0x14,0xC0,0x31,0x47,0x14,0x7D,0xE8,0xC3,0x72, +0x0A,0x9E,0x10,0x3D,0xDC,0x10,0x9C,0xF3,0x6A,0x19,0x9B,0x3B,0x57,0xE2,0x44,0xC6,0x44,0x1D,0xE0,0xB2, +0x5F,0x61,0xF4,0x53,0x45,0xD6,0x32,0xD5,0x52,0xBF,0x2E,0x70,0xA7,0xD9,0xCA,0xF7,0x36,0x23,0x24,0x4F, +0x04,0x93,0x82,0x8B,0x1D,0xD2,0x5D,0x01,0xA5,0xF7,0xA1,0xF4,0xC0,0xDE,0xBD,0xBA,0xE2,0x79,0xB4,0xD4, +0xDA,0xBD,0xB4,0xE1,0x06,0x95,0x93,0xAB,0x7D,0x42,0xF0,0x00,0x67,0x9B,0xC3,0x16,0x14,0x50,0x3D,0xD1, +0xC3,0x12,0xDE,0x42,0x5D,0x01,0x3E,0x5F,0x99,0xB8,0x41,0x84,0x35,0x03,0x6C,0x12,0x23,0xBD,0x64,0xBA, +0x54,0x95,0xBC,0x03,0x7C,0xDF,0xC4,0xA6,0x73,0xFA,0x61,0x4B,0x43,0x10,0xAF,0x3C,0x15,0xB0,0x2C,0xAC, +0x43,0x20,0x8D,0x65,0xF3,0x9C,0x90,0x3B,0x6B,0x5A,0x95,0x55,0xB6,0xD5,0xFE,0x77,0x8C,0x23,0xC5,0xA7, +0xFF,0xF8,0x2A,0x8C,0x8D,0x10,0xDE,0xBC,0x57,0xB7,0xF0,0xC8,0x93,0x54,0xE6,0x5D,0x5E,0x58,0xEE,0x6B, +0xD5,0x13,0xD0,0x98,0xD4,0xB6,0x6E,0xD8,0x29,0xDF,0x0F,0x43,0x8F,0x4C,0xA7,0x69,0xCF,0xBA,0x27,0xBD, +0xDC,0x77,0xF3,0x2E,0xAF,0xBA,0x24,0xAD,0x3E,0x21,0x50,0x79,0x2F,0x98,0xFD,0x2D,0x56,0xDF,0xB7,0xBA, +0xEB,0x70,0xA3,0x47,0xFD,0xB9,0x99,0x31,0x1D,0x60,0xDE,0x9E,0x3A,0xB3,0x7E,0xE3,0x68,0x77,0x96,0xAA, +0x47,0x77,0x93,0x1D,0xF5,0x16,0x8E,0x9E,0x39,0xB0,0xDE,0x0E,0x67,0x9F,0xE5,0x1C,0xFD,0xD5,0xDF,0x25, +0xBE,0xD3,0xDF,0x9F,0xFE,0xB1,0x45,0xE9,0xAE,0xC5,0xF3,0x0D,0x7C,0xB6,0x4F,0x31,0x1A,0x16,0xE5,0xDE, +0x1C,0xDA,0x21,0xE4,0xEE,0x7F,0x19,0xEF,0x5C,0xF9,0x88,0x2D,0x42,0x0F,0xBB,0x80,0x7B,0xA8,0x68,0xA4, +0x0B,0x2E,0x2B,0xC6,0xFC,0x9D,0x76,0xA1,0x11,0x4C,0x0E,0xDC,0xE8,0xB9,0xC8,0xB0,0x2A,0x22,0xE7,0xD6, +0xF0,0xE9,0x91,0xE9,0x07,0x4F,0x38,0x0A,0x33,0x60,0x4F,0x80,0x7C,0xE9,0xE9,0x01,0x71,0xE8,0x77,0xA5, +0x0E,0x18,0xD1,0x4A,0x97,0x88,0x61,0xC0,0xA3,0x43,0x9D,0xD7,0xF5,0x0F,0x1E,0x10,0xA3,0xFB,0x9F,0x22, +0xF0,0x04,0x80,0x13,0x67,0xEF,0x31,0x06,0x30,0x9B,0xE7,0xA6,0x13,0xF8,0xCA,0x94,0x17,0x21,0x20,0x41, +0x69,0xEA,0xE0,0x8F,0xBA,0xEC,0xF5,0x23,0xB1,0x82,0xC0,0x3A,0x1F,0xA0,0x29,0x65,0x22,0x93,0xA9,0x07, +0x21,0x03,0xB3,0x22,0xFF,0x86,0x47,0xA9,0x1B,0xDC,0x0D,0x0F,0xA9,0x44,0xCF,0x17,0x2C,0xCA,0x24,0x7E, +0xCA,0x09,0x70,0x4C,0x6C,0x33,0x2C,0x88,0x69,0xA9,0xCB,0x3E,0xBD,0xEE,0x02,0x1C,0x81,0x7E,0x4A,0xED, +0x12,0x23,0x29,0x9D,0xB5,0x0A,0x2D,0x4C,0xC4,0x94,0x42,0x7F,0x4A,0xD2,0x25,0x7B,0x67,0x95,0x29,0xC6, +0x30,0xC9,0x97,0x09,0x2C,0x03,0x6B,0x56,0x44,0x06,0x99,0x62,0x14,0x49,0xA8,0x98,0xCF,0x81,0x36,0x73, +0x2C,0x37,0xC2,0xB3,0xEB,0xAF,0xEA,0xC8,0x01,0x93,0x2C,0xC8,0x02,0xCF,0x4E,0xC9,0xAD,0xE7,0x91,0x77, +0x0D,0x67,0xAA,0x16,0xFC,0x20,0xED,0xFA,0x42,0x29,0x80,0x6B,0x2D,0xC2,0xD0,0xB3,0xF5,0x0C,0x93,0xD4, +0xC4,0x40,0x73,0x46,0xEE,0x02,0x61,0x50,0x31,0x2A,0x09,0x26,0xDE,0x04,0xA9,0x65,0x19,0x33,0x63,0x29, +0xDB,0x40,0x7F,0x07,0x78,0x0A,0xFB,0xF3,0x4A,0x52,0xA8,0x80,0x53,0x90,0x83,0xCA,0xE5,0x01,0x04,0xAC, +0x91,0xB1,0xB8,0xEB,0x82,0xBC,0x1B,0x67,0xB5,0xBA,0x96,0x50,0x71,0x13,0x4E,0x42,0x55,0x6A,0x5B,0xD1, +0x51,0x1D,0x51,0x7B,0xD3,0x30,0x4C,0xB2,0x05,0x40,0x6F,0x2D,0x93,0x52,0xDF,0xA1,0xA9,0xAC,0x38,0x29, +0x5A,0x57,0xC7,0x15,0xE7,0xB8,0x75,0xD3,0x1A,0xA2,0x16,0xB3,0x40,0x78,0x04,0xE8,0x71,0x2F,0x0F,0xA2, +0x9D,0x8F,0x8E,0x2C,0xD5,0xF9,0x72,0x71,0x43,0x95,0x73,0x32,0x00,0xC2,0x03,0xF8,0x10,0x55,0xFB,0x82, +0x40,0x91,0x23,0xA0,0xA1,0xCE,0xE9,0xBB,0x15,0x26,0x34,0x65,0xB3,0x70,0x8C,0xE3,0x15,0x6D,0xB2,0xA3, +0xC9,0x14,0x76,0x33,0xA3,0xCA,0x82,0xF1,0x94,0x5B,0x27,0xB2,0x31,0x34,0x3C,0x39,0x42,0x87,0x16,0x64, +0xBB,0x75,0xAB,0x8B,0x61,0x43,0x97,0xCA,0x93,0x89,0xCE,0x5D,0x6B,0x75,0xF6,0x14,0x9C,0xB0,0xA6,0x43, +0xB8,0x84,0x0D,0x19,0x8E,0x84,0xD8,0x09,0xDF,0x6F,0xE0,0x7D,0x38,0x95,0xFF,0xCF,0x1F,0x4A,0x81,0xCF, +0x07,0xD7,0x35,0x06,0x52,0x96,0xAF,0x0E,0x1A,0x7A,0x34,0xC2,0xB3,0x50,0x8D,0xBA,0x06,0xF6,0xBD,0xBB, +0x0F,0x9D,0x3E,0x48,0x1D,0x6F,0x96,0xA1,0x4A,0xA1,0x9E,0xE8,0x1D,0x3F,0x1C,0x27,0xC0,0x85,0x15,0xDF, +0x44,0x31,0x52,0x8F,0x08,0xC2,0x46,0xCC,0x8C,0x82,0xBC,0x3A,0xF3,0x93,0x07,0x25,0x6E,0x7F,0xDC,0x89, +0xFA,0x58,0x17,0x1C,0xDD,0xD3,0xFA,0x7C,0x1F,0x5C,0x7A,0xAD,0x0F,0x56,0x27,0xFB,0x1C,0x1D,0xE1,0x9C, +0x27,0x70,0xCC,0x90,0x48,0x88,0x5F,0x41,0x27,0xDC,0x34,0x50,0x2C,0x83,0x8A,0xCD,0xE7,0xA1,0x85,0x45, +0xA4,0x01,0xE5,0xD6,0x53,0xBA,0x6E,0x93,0xAE,0xE2,0x82,0xDE,0xD1,0x2E,0xA1,0x00,0x3A,0x84,0x19,0x98, +0x92,0x09,0x4F,0x87,0xA7,0xE2,0x59,0x13,0x53,0x73,0x51,0xFB,0x4D,0x43,0x09,0x61,0x18,0x25,0x03,0x02, +0xA7,0x6C,0x29,0xB5,0xD4,0x80,0x61,0xC6,0x6D,0x70,0x9E,0x24,0x77,0xA0,0x10,0x22,0x57,0x49,0xCF,0x84, +0x50,0x4F,0xF8,0x20,0x34,0x01,0xB2,0x57,0xB4,0xC0,0x00,0xF0,0x46,0xBD,0x5B,0x30,0x3B,0xA9,0x69,0x4E, +0x01,0x47,0x83,0x44,0x97,0x76,0x09,0xE1,0xC7,0xA1,0x29,0x43,0xD0,0xFD,0x93,0x5B,0x60,0xCB,0xB3,0x6F, +0x34,0x2A,0x23,0x77,0x64,0xC1,0xEA,0x31,0xEB,0xAB,0x98,0x82,0x2F,0xA8,0x26,0xCE,0x10,0x68,0x60,0xDA, +0x44,0x6B,0xCA,0xAC,0x55,0xAC,0x51,0x12,0xE8,0x36,0x98,0x9A,0x76,0x5D,0x6A,0x38,0x86,0x88,0x9C,0x48, +0x9F,0x49,0xA1,0xE3,0x4C,0x47,0x83,0x02,0x9A,0x01,0xE7,0xD8,0xE2,0x68,0x8B,0x0B,0x51,0xF1,0x15,0xAF, +0xE5,0x86,0xE3,0x1A,0x9B,0x00,0x65,0x07,0x2F,0x60,0xFA,0x49,0x1F,0xEB,0xF0,0x6E,0x65,0x8F,0xBB,0xB7, +0xB9,0xEE,0x7A,0x26,0x0C,0xC3,0x63,0x1C,0x6D,0xF0,0x34,0xFE,0xED,0x26,0x6E,0xDA,0x70,0xB7,0x1A,0x3E, +0x3B,0x40,0x90,0x98,0x6C,0x5A,0x47,0xBA,0xA4,0x82,0x3D,0x87,0xBC,0x3C,0x13,0x2F,0xB2,0xC1,0x0B,0x67, +0x79,0xF5,0xBF,0x31,0x6E,0x20,0x30,0x5C,0xE0,0xA3,0x03,0x96,0xDF,0x70,0xA1,0x7B,0x78,0xFF,0xC7,0x78, +0xCD,0x53,0x9C,0x56,0xC3,0xBF,0x30,0x3A,0x9D,0x71,0x67,0x58,0x89,0xEB,0x7A,0x37,0xD2,0x1A,0x3C,0xF4, +0x76,0x6E,0xC7,0xC1,0x19,0x20,0x17,0x33,0xE6,0xCE,0x33,0xE1,0x5B,0x3F,0x9D,0xD7,0xB0,0xBD,0x0D,0x5C, +0x15,0xB1,0x33,0xF9,0x79,0x90,0xED,0x17,0xCE,0x8B,0xD5,0xF5,0xF6,0x0C,0x43,0xB5,0x0C,0x02,0x40,0x4E, +0xF7,0x68,0x53,0x63,0xD6,0x97,0xBB,0xF4,0x45,0x50,0xB9,0x2E,0xE4,0xDC,0xC6,0x19,0x45,0xBA,0xF4,0xE2, +0xD0,0x6A,0xC8,0x2B,0xB6,0x00,0x04,0x90,0x24,0x2B,0x43,0x10,0x53,0xEE,0xA5,0x9A,0xCB,0x3B,0x25,0x06, +0x3E,0x6D,0xB1,0x81,0xA5,0x21,0xCB,0x05,0x51,0xE6,0x57,0x63,0x58,0x48,0xF7,0xED,0x9A,0xF5,0x05,0x71, +0xEE,0xB3,0x15,0x91,0x40,0xE7,0x1D,0x68,0x80,0x25,0xDE,0xAA,0xC8,0xD1,0xE5,0x59,0xE0,0xD5,0x03,0x53, +0x7C,0x23,0x95,0x2A,0x25,0x36,0xF1,0x9B,0x3B,0x79,0x8A,0xD8,0x63,0xA6,0x80,0x83,0x15,0xF4,0x5F,0xF4, +0xCC,0xFA,0x10,0xFF,0xCF,0xBA,0x87,0xDC,0xE2,0x85,0xCF,0x2B,0xAD,0xDC,0x7F,0x66,0xAD,0x40,0x5A,0x1D, +0x2C,0xC8,0x00,0x8A,0x4C,0x24,0x40,0xCC,0x89,0xB9,0xD9,0xFB,0x8F,0x63,0x2A,0x5E,0xBC,0x10,0x4E,0x3A, +0x81,0xD3,0x4E,0x01,0x05,0xFE,0x78,0x7F,0xC4,0xFE,0x51,0x3C,0x9E,0x3C,0xEE,0x12,0xAB,0x10,0x25,0x4C, +0x7B,0xD7,0xDC,0x6E,0x59,0x63,0x06,0xB1,0x1D,0xDB,0x4F,0xBB,0xAE,0xD1,0xAC,0xC0,0x81,0xE3,0xD4,0x6A, +0x89,0x30,0x10,0x3D,0x3D,0x13,0x80,0x9B,0xFC,0xC4,0xDB,0xFF,0xFF,0xFF,0x3A,0xF3,0x70,0xAF,0x80,0x04, +0x10,0x20,0x87,0xD3,0xC4,0xCD,0x90,0x24,0x50,0x60,0x1D,0xEC,0x89,0xFA,0x88,0x14,0x11,0x21,0xA3,0xD2, +0xBC,0x4A,0x98,0x34,0x51,0x61,0x94,0xF2,0xB4,0xAD,0x81,0x05,0x90,0x22,0x43,0x23,0x2B,0x26,0x91,0x25, +0xD0,0x62,0x21,0x2A,0xE0,0x96,0x89,0x15,0x91,0x23,0xA0,0x15,0x20,0x58,0x99,0x35,0xD1,0x63,0x40,0x40, +0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50,0x03,0x05,0xC8,0x54, +0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41,0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61, +0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51,0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75, +0xD3,0x67,0x9E,0x8C,0x07,0x8A,0x82,0x0C,0x18,0x28,0xB0,0xDE,0x7B,0x24,0x92,0x2C,0x58,0x68,0x2D,0x34, +0xD9,0x38,0x8A,0x1C,0x19,0x29,0x30,0xDE,0x7A,0xE5,0x9A,0x3C,0x59,0x69,0xA4,0x31,0x5C,0x7B,0x83,0x0D, +0x98,0x2A,0xEB,0x6F,0xB0,0x51,0x93,0x2D,0xD8,0x6A,0xB0,0x5B,0x28,0xF6,0x8B,0x1D,0x99,0x2B,0xE3,0x31, +0x6E,0x50,0x9B,0x3D,0xD9,0x6B,0x42,0x48,0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C, +0x5A,0x6C,0x4A,0x58,0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, +0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59,0x8B,0x0F,0xCB,0x5D, +0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0xB0,0xFE,0x83,0x75,0x84,0x84,0x30,0x30,0x82,0x84, +0x66,0xFB,0x94,0xA4,0x70,0x70,0x74,0xB7,0xDC,0x1E,0x8C,0x94,0x31,0x31,0x42,0xF3,0xE4,0x60,0x9C,0xB4, +0x71,0x71,0xBA,0x63,0x0C,0xCF,0x85,0x85,0xB0,0x32,0xB2,0x61,0xEC,0x10,0x95,0xA5,0xF0,0x72,0x52,0x85, +0xDE,0x12,0x8D,0x95,0xB1,0x33,0xB5,0x99,0xE7,0xF8,0x9D,0xB5,0xF1,0x73,0x44,0xC0,0x22,0x14,0xC4,0xC4, +0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0,0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0, +0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1,0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5, +0xF2,0x76,0x4D,0xD1,0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xDD,0x8A, +0x2E,0x62,0x86,0x8C,0x38,0x38,0x24,0x2C,0x0F,0x1B,0x96,0xAC,0x78,0x78,0x6E,0x9A,0x4D,0x16,0x8E,0x9C, +0x39,0x39,0x44,0xA9,0x24,0xA1,0x9E,0xBC,0x79,0x79,0x3B,0xF6,0x4B,0x9A,0x87,0x8D,0xB8,0x3A,0xD7,0x5C, +0x55,0x1A,0x97,0xAD,0xF8,0x7A,0x9F,0x1B,0x21,0x13,0x8F,0x9D,0xB9,0x3B,0x90,0xE9,0xF0,0x41,0x9F,0xBD, +0xF9,0x7B,0x46,0xC8,0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, +0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9,0xAA,0x1E,0xC7,0xCD, +0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9,0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9, +0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x08,0x60,0x02,0x2B,0xA0,0x06,0x14,0xA0,0x9E,0xC4,0xC1,0x31,0xB0,0x26, +0x54,0xE0,0x40,0x70,0xF2,0xC3,0xA8,0x16,0x15,0xA1,0xA8,0xDA,0x86,0x8C,0xB8,0x36,0x55,0xE1,0xC3,0xC1, +0x25,0x7D,0xA1,0x07,0x94,0xA2,0x68,0x24,0xA3,0x04,0xB1,0x27,0xD4,0xE2,0x28,0x18,0x59,0x12,0xA9,0x17, +0x95,0xA3,0x3B,0xD5,0xC3,0x59,0xB9,0x37,0xD5,0xE3,0x60,0x42,0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62, +0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52,0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76, +0x57,0xE5,0x61,0x43,0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, +0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x81,0x27,0xD4,0xD9,0xA2,0x0E, +0x1C,0xA8,0x5B,0xC2,0x8F,0x85,0xB2,0x2E,0x5C,0xE8,0x3A,0xEA,0xB9,0x86,0xAA,0x1E,0x1D,0xA9,0x3B,0xBE, +0x6A,0x9A,0xBA,0x3E,0x5D,0xE9,0x00,0x22,0x0E,0x8E,0xA3,0x0F,0x9C,0xAA,0xDF,0xB9,0xDC,0xC2,0xB3,0x2F, +0xDC,0xEA,0x9F,0xEB,0xC6,0x84,0xAB,0x1F,0x9D,0xAB,0xFB,0xFE,0x2F,0x85,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, +0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A,0x0F,0x8D,0xEA,0x5E, +0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B,0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B, +0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B,0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F, +0xDF,0xEF,0x7E,0x2B,0x87,0xF5,0xA4,0x86,0x34,0xB0,0xFB,0xF7,0x27,0xE3,0xB4,0xA6,0x74,0xF0,0x2E,0x70, +0xC4,0xF4,0xAC,0x96,0x35,0xB1,0x6C,0x06,0x03,0xD0,0xBC,0xB6,0x75,0xF1,0x7F,0x37,0x07,0xF7,0xA5,0x87, +0xB4,0xB2,0xE7,0x16,0xBB,0xF1,0xB5,0xA7,0xF4,0xF2,0x55,0xB4,0xC6,0x7A,0xAD,0x97,0xB5,0xB3,0x3D,0xB3, +0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2,0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6, +0x76,0xF4,0x6C,0xD2,0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, +0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3,0xA7,0x97,0xED,0xD7, +0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x5E,0xAD,0x4F,0x9A,0xA6,0x8E,0x3C,0xB8,0x36,0xAA, +0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x91,0x18,0x1E,0xC7,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE, +0x7D,0xF9,0x5F,0x76,0xA2,0x68,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0xCB,0x65, +0xCE,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA,0x2E,0x9C,0xE6,0xCE, +0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA,0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA, +0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB,0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF, +0xFE,0xFE,0x6F,0xDB,0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10,0x01,0x01,0x88,0x14, +0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01,0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21, +0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11,0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35, +0xD1,0x63,0x40,0x40,0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41,0x82,0x06,0xC1,0x45, +0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51,0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71, +0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08,0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C, +0x58,0x68,0x0A,0x18,0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, +0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19,0x89,0x0B,0x8B,0x1D, +0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48,0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68, +0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58,0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C, +0x5B,0x6D,0x43,0x49,0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, +0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80,0x20,0x10,0x84,0x84, +0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90,0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0, +0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81,0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5, +0xF0,0x72,0x0D,0x91,0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, +0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0,0x23,0x15,0xCC,0xD4, +0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1,0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1, +0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1,0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5, +0xF3,0x77,0x06,0x88,0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, +0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89,0xA8,0x1A,0x87,0x8D, +0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99,0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9, +0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8,0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC, +0x7A,0x7C,0x4E,0xD8,0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, +0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9,0xAB,0x1F,0xCF,0xDD, +0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02,0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22, +0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12,0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36, +0x55,0xE1,0x21,0x03,0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, +0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42,0x06,0x84,0xE0,0x46, +0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52,0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72, +0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43,0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67, +0xD6,0xE6,0x69,0x53,0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, +0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A,0x0D,0x89,0xAA,0x1E, +0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B,0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B, +0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B,0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F, +0xDD,0xEB,0x62,0x4A,0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, +0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B,0x8E,0x8E,0xE3,0x4F, +0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B,0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B, +0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82,0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6, +0x74,0xF0,0x2C,0x92,0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, +0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93,0xA5,0x93,0xAD,0x97, +0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2,0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2, +0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2,0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6, +0x77,0xF5,0x65,0xC3,0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, +0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A,0x2C,0x98,0xA6,0x8E, +0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A,0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA, +0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B,0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF, +0xFC,0xFA,0x2F,0x9B,0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, +0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA,0x2F,0x9D,0xEE,0xDE, +0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB,0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB, +0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB,0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF, +0x64,0xDB,0x80,0x0C,0xE4,0x40,0x3B,0xA1,0xE7,0xDD,0x4E,0xB6,0x8A,0xEB,0xA8,0xDB,0xA5,0x03,0xBF,0x11, +0x8C,0x0D,0x33,0xA5,0x02,0x8E,0x7E,0xC1,0x83,0xC1,0xE6,0xFD,0xA4,0xC2,0x87,0xB5,0x0F,0x00,0x97,0xCC, +0x7B,0x18,0xF7,0xC5,0x21,0xED,0x6A,0x5A,0xB8,0x58,0x61,0x6E,0xC2,0x63,0xC0,0x17,0x9F,0x8E,0x67,0xAF, +0x2A,0xB5,0xD0,0xC6,0xC2,0x67,0xE8,0xCA,0xE9,0x90,0xE8,0x86,0xCE,0x8E,0x76,0x5C,0x11,0xE9,0x10,0x69, +0x5D,0x99,0xED,0x44,0x84,0x13,0xC8,0x56,0x17,0xDE,0x6A,0x4E,0xE0,0xE4,0x0C,0x8A,0xAE,0xE4,0x1F,0x5A, +0x86,0xAD,0x91,0x4D,0xD2,0xDD,0x40,0x90,0x61,0x06,0xC7,0x07,0x2D,0xBB,0x19,0xCF,0x78,0xA3,0xCD,0x4A, +0x80,0x24,0x14,0x82,0xD8,0x9A,0xB8,0x86,0xF2,0xBA,0x1A,0x05,0x6B,0x68,0xD7,0x3D,0xB9,0xD7,0x4C,0xB3, +0x58,0xE7,0x56,0x5F,0x62,0xC9,0xF1,0x47,0x4A,0x96,0x35,0x2D,0x02,0x86,0x44,0x0F,0x6A,0xE6,0x4E,0xC2, +0xA4,0xC8,0x94,0xF6,0x69,0xD9,0xBD,0xA5,0xB6,0xF5,0x70,0xD8,0x2C,0xEC,0xAB,0xD2,0x31,0x79,0xA4,0xDB, +0x0A,0x4D,0xC6,0x63,0xF3,0x31,0x2D,0xC8,0x29,0x0B,0xD6,0xCE,0xC2,0xB6,0xB5,0xB7,0xC2,0xDB,0x43,0x5C, +0x65,0x6C,0x04,0xA0,0xA1,0x56,0x80,0x63,0xB1,0x96,0x6C,0xE2,0xF8,0x38,0x6D,0x95,0x70,0xC7,0x3C,0x1A, +0xBC,0xB0,0x01,0x7C,0xA3,0x7C,0xB8,0x5A,0x70,0xB1,0xE3,0x49,0xE5,0x0E,0xE4,0xB4,0x37,0x2D,0xF3,0xF5, +0x26,0xC4,0x04,0x32,0xA8,0x6F,0x4B,0x2E,0xD4,0x41,0x4D,0x1B,0x34,0x92,0x80,0x7D,0xDD,0x1F,0x11,0x78, +0x20,0x52,0x84,0xBF,0x08,0xAB,0xCB,0xA1,0xBC,0xFA,0xCC,0xA1,0x74,0x30,0x34,0x6F,0xD4,0x72,0x33,0x7C, +0x35,0x5D,0x7A,0x6C,0x62,0x31,0x48,0x27,0xD0,0xAE,0x80,0x44,0x5D,0xB3,0x85,0x01,0xAC,0x58,0xC8,0xA5, +0x5D,0x3C,0x6D,0x9A,0xAF,0x8F,0x22,0xEE,0x78,0x8C,0x59,0xCB,0x9F,0xEF,0x9D,0xB5,0x06,0xFE,0x22,0x84, +0x50,0x8C,0xD9,0xB3,0x71,0x7A,0x10,0x84,0x3E,0x74,0x0A,0x0F,0x70,0x06,0x6B,0xD5,0x53,0xDB,0x1C,0xC9, +0x21,0xB1,0x9C,0xB6,0x39,0x9E,0xDC,0xF4,0x39,0xF8,0xA2,0x29,0x77,0xF5,0x27,0xC1,0xA3,0x75,0xC3,0x85, +0x5B,0x95,0xD5,0xE5,0x8A,0x64,0xCD,0x9B,0x98,0x8C,0x83,0xD7,0x6B,0xDD,0x04,0xFE,0xD8,0x4D,0x16,0x36, +0x21,0x57,0x94,0x86,0xB8,0x1B,0x56,0x80,0x64,0xA5,0xEF,0x67,0x50,0x42,0xC4,0x08,0xC9,0xF8,0x2D,0x09, +0x8F,0x85,0xDA,0x62,0xC0,0x3A,0x47,0x6F,0x2E,0x9D,0x9A,0xCA,0x82,0xA3,0x25,0x0D,0x3E,0xD6,0x11,0xEB, +0x53,0x87,0xF9,0x40,0x4D,0x99,0x49,0x74,0xE0,0x5E,0x81,0x78,0x13,0x90,0x25,0x49,0x0A,0x93,0xDD,0x44, +0x9B,0x4B,0xA2,0xC9,0xED,0x50,0x55,0xAE,0x8D,0xE1,0xE2,0xBB,0xDF,0xB8,0xF6,0x3D,0x69,0x1C,0x5E,0xC8, +0x48,0xEC,0xB0,0x5C,0x7B,0x1C,0x50,0xDA,0x73,0xB9,0x05,0x9E,0xBB,0xCD,0x78,0x2C,0xE7,0xF0,0x88,0x5C, +0xDA,0x5F,0xF8,0x2B,0xAC,0x6E,0x99,0x14,0x02,0x95,0x17,0xFA,0xA5,0x1A,0x57,0xFC,0xB3,0xD3,0x81,0xDF, +0x63,0xD5,0x91,0x11,0x03,0x94,0xE4,0xEA,0x16,0x50,0x81,0x31,0x43,0xD4,0x97,0x26,0x22,0xC0,0xDE,0xCE, +0xFD,0xD3,0x98,0xA8,0x94,0x54,0xE6,0xEE,0xBF,0xFA,0x9F,0x13,0x88,0x8D,0x79,0xB3,0xE2,0x5C,0xB8,0xF4, +0xD7,0xC2,0x47,0x45,0x63,0x82,0x21,0x27,0x0B,0x80,0xB7,0x65,0x6B,0x0F,0x16,0x38,0xAF,0xB6,0x8F,0x8A, +0xBC,0xEF,0x41,0xE2,0xC2,0xF7,0xBF,0xDE,0x7E,0x99,0xDA,0xC8,0xE7,0xD3,0x42,0x48,0xBD,0xD9,0xE0,0x46, +0x9B,0xD1,0x86,0x8E,0x15,0xC4,0xA4,0x9C,0xBB,0x65,0x3C,0x19,0x3E,0xE9,0xE8,0x56,0xCA,0x2E,0x3A,0x36, +0x5F,0x0E,0x2E,0xBA,0xAC,0x0F,0x47,0x46,0xC5,0x4A,0x74,0x2D,0xA5,0xE6,0x61,0x56,0xDF,0x0B,0x3C,0x90, +0x89,0x1B,0x0E,0x19,0xF8,0x39,0x94,0x56,0xEC,0xF8,0xF5,0x56,0x17,0xC7,0x91,0xF3,0xE5,0x11,0xE1,0x09, +0xB5,0x93,0x7C,0xDF,0x9E,0x23,0x19,0xBF,0x0F,0x07,0x30,0xD7,0x4C,0xCC,0xCC,0xE7,0xA9,0x4B,0x4B,0x5C, +0x0F,0x7C,0xE7,0xCB,0x19,0x89,0xF1,0x9A,0x59,0x49,0x70,0x2D,0x46,0x03,0x6A,0x04,0xE7,0xB0,0xEA,0xFC, +0xDB,0x0E,0xB3,0xD6,0xC4,0x3E,0xFA,0xDC,0xCF,0x45,0xBE,0xE7,0x8D,0x3E,0x58,0x20,0xA1,0x70,0xE4,0x3F, +0x4D,0x8B,0x13,0xBF,0x34,0x51,0x32,0x0C,0x9C,0x27,0xD8,0xBD,0x37,0x01,0x0D,0xCA,0xFD,0x73,0x8C,0xB3, +0xA2,0xC5,0xEA,0xAB,0x93,0x4D,0x6E,0x5A,0x13,0x11,0x89,0x04,0x87,0x7A,0x01,0x01,0x37,0xE0,0x40,0x4B, +0xE5,0x3A,0x2D,0x3F,0x9A,0xA7,0x55,0xD4,0x33,0x6A,0x4C,0xCA,0x14,0xE3,0x83,0xD1,0xAD,0x8D,0xD5,0x8E, +0x12,0x09,0x44,0x68,0x3D,0x52,0x04,0x01,0xF1,0x30,0x25,0x71,0xEE,0x3B,0xA5,0x77,0x27,0xC4,0x7F,0x53, +0x73,0x76,0x07,0x6A,0x88,0x8A,0x4A,0x63,0xC9,0x9A,0x79,0x67,0x26,0xC5,0xE8,0x6B,0x47,0xA1,0x86,0x45, +0xBF,0x5A,0x42,0x8B,0xCF,0x57,0xFB,0x4E,0x26,0xB6,0x6B,0x6E,0xC7,0x76,0x16,0x31,0x28,0x14,0x73,0xA0, +0x25,0x38,0xF3,0x5E,0x27,0x1E,0x6B,0xC0,0xDF,0x7B,0xDF,0xB3,0x21,0x25,0xC0,0xB1,0xD3,0x9B,0x29,0xE6, +0x5D,0x2E,0xB4,0xEF,0x0F,0xD0,0x39,0x84,0x1D,0x6E,0x2A,0x0A,0xCE,0x3F,0xB2,0x0A,0x36,0xB6,0x5A,0x26, +0xEB,0x78,0xA2,0x2A,0x77,0xF1,0xD1,0xB0,0x5B,0x99,0xE1,0x36,0xED,0x83,0x72,0xF0,0xA9,0x92,0xF1,0x16, +0xAD,0xA3,0x33,0x31,0xA3,0x12,0xEA,0xD2,0xB3,0x37,0xC6,0x11,0x4B,0x7A,0x7A,0x06,0xE0,0xC2,0x14,0x9A, +0xA9,0x8E,0xF3,0xDF,0x0E,0xB3,0x67,0x4A,0x3E,0x2D,0x11,0x31,0x97,0x4E,0x70,0x95,0x7F,0xD7,0x99,0x3B, +0xCE,0xFB,0x45,0x3E,0x71,0xB3,0x0C,0x4D,0x91,0x52,0x04,0x91,0x74,0x2E,0xE4,0xB0,0x8C,0x65,0x26,0x55, +0x14,0x59,0xE9,0x35,0xF8,0x55,0x4E,0x3B,0x7B,0x24,0x2A,0x5A,0x40,0x1A,0x80,0x8A,0x4C,0x24,0x89,0xB7, +0x16,0x7E,0xD5,0x28,0x46,0x76,0xAF,0x6E,0x22,0xFD,0xC9,0x08,0x70,0x9C,0xA8,0x23,0x5F,0x57,0xA4,0x29, +0x68,0xC0,0x11,0xAC,0x11,0x62,0x9E,0xC5,0x4B,0xB3,0xCB,0x0F,0x28,0xF9,0x19,0x1E,0x5B,0x3D,0xD9,0x1E, +0xD6,0x3D,0x77,0xBD,0x6D,0xD0,0xBC,0xEE,0x95,0x44,0x71,0xF2,0x8C,0x0E,0xD8,0xF7,0xCC,0xBF,0x3F,0xC4, +0xE7,0xB3,0xEF,0xE6,0xE4,0xFC,0x85,0x9C,0xFC,0xAA,0x1C,0xF7,0x3D,0x55,0xD7,0x80,0x10,0x42,0xAF,0xE3, +0x9A,0x9A,0x53,0x10,0x07,0x71,0x48,0x19,0x27,0xDE,0xE7,0x42,0x23,0x14,0xCC,0x8F,0x11,0x13,0xDA,0x01, +0x78,0x13,0x19,0xEB,0x28,0xAB,0x2F,0x1C,0xA0,0xC9,0xD9,0x20,0xD4,0x82,0xC5,0x6E,0xE9,0x0E,0x5D,0x86, +0x30,0xFC,0xE0,0x7A,0x3C,0x7F,0xA7,0x84,0xF3,0x6E,0x9F,0x42,0xD6,0x3E,0x3F,0x3A,0x3C,0xFB,0x76,0xAC, +0xC6,0xEB,0x54,0xA3,0xD2,0x44,0xFB,0x30,0x30,0x45,0x01,0x2A,0x79,0x1F,0xEC,0x12,0xA8,0x5F,0x88,0x02, +0x5F,0x0B,0xE6,0x8D,0x6B,0x2F,0x7E,0x74,0x85,0x89,0xF5,0x03,0x29,0xAC,0x7D,0xE3,0xC2,0x9B,0xE5,0xF4, +0x56,0x64,0xB7,0x9C,0xF0,0x37,0x6A,0x58,0x32,0x29,0xF9,0x74,0x5E,0x21,0xFD,0x76,0x26,0xD7,0x3D,0x3D, +0xB9,0xD7,0xCF,0x29,0xC8,0x88,0x10,0xD0,0xE0,0x93,0x12,0x66,0x6B,0x7D,0x9C,0xD1,0xF2,0x53,0x47,0xC8, +0xD5,0x00,0xAF,0xC1,0x79,0xBD,0xBC,0x39,0x1A,0xA5,0x38,0xA8,0x6F,0xD7,0xCE,0x28,0xFF,0x1F,0xA3,0x2F, +0x98,0xB1,0x75,0xC4,0x09,0x0A,0x30,0xAC,0x8E,0x84,0xBA,0x5C,0x51,0xC2,0xD6,0x22,0xCE,0xC0,0xE9,0x82, +0xB1,0x8D,0xD4,0x94,0xF1,0xB6,0x30,0x68,0x49,0x2C,0x57,0x84,0xE9,0x21,0x18,0xCB,0xE0,0x77,0x07,0x4F, +0x0C,0x69,0x15,0xEE,0x83,0x97,0x36,0x7E,0x53,0x01,0x19,0xBA,0xD9,0xD3,0xF9,0xFC,0x85,0x81,0xD3,0x7C, +0xB2,0xEA,0x2C,0xCD,0x33,0x0E,0x75,0xED,0xA9,0x02,0xED,0x94,0x17,0x22,0xBD,0x88,0x01,0x6F,0x3B,0x74, +0x26,0xE5,0xB3,0xE1,0xDD,0x73,0xC2,0x51,0x34,0x50,0x02,0x7C,0x8B,0x8A,0xCA,0x7C,0x13,0x74,0x1A,0xF2, +0xDE,0xCC,0x3B,0xB0,0xBE,0x33,0x53,0xA3,0x15,0x9B,0xA2,0x05,0x53,0x7C,0x63,0xE3,0x57,0xEF,0xC2,0x47, +0x33,0x74,0xAE,0x10,0xBB,0xFD,0x5B,0x1E,0xF4,0x03,0xD9,0x6F,0x5C,0xB2,0x3A,0x94,0x3C,0x3F,0x23,0x65, +0x6E,0xD5,0x1F,0x49,0x49,0x88,0x64,0x5D,0x00,0x84,0x9A,0x06,0x22,0x32,0x6A,0x31,0x41,0xD6,0x65,0x14, +0xD3,0xFE,0x16,0x2F,0xC2,0x96,0xF4,0xD1,0x37,0x25,0xDB,0xB6,0xF1,0xFE,0x07,0xE0,0x08,0x73,0x05,0xB2, +0xDE,0x97,0xCD,0x3A,0x13,0x37,0x6B,0x35,0xC2,0x5B,0x02,0x07,0x8D,0x76,0xFC,0x3F,0x3A,0xEA,0xBE,0x3D, +0x50,0x7A,0x7E,0xF1,0x2B,0x26,0x86,0xF5,0x71,0x3F,0x1E,0x7B,0x09,0xC5,0xEE,0x93,0x73,0x8C,0x16,0xE8, +0x11,0xFC,0xAE,0xAE,0x38,0xA3,0x1E,0x81,0x5C,0xB4,0xF0,0x40,0xD8,0xBA,0xBA,0xDA,0x9E,0x3C,0xD3,0xA3, +0x6E,0xD4,0x51,0x54,0x43,0xE0,0x4D,0xF2,0xD8,0x3B,0xDA,0xAF,0x20,0x00,0xA2,0x50,0xD9,0xAE,0xDD,0x39, +0x08,0x3A,0x3E,0x6E,0xE2,0x38,0x27,0x46,0x55,0xC1,0x83,0x83,0xD8,0x60,0x6B,0x25,0x22,0x18,0x84,0x2C, +0x36,0x7C,0x71,0x19,0xF6,0x9C,0xC6,0x8E,0xC9,0x19,0xFF,0x31,0x48,0x69,0x4A,0xD8,0x2B,0x58,0xF6,0x72, +0x00,0xC9,0x27,0xDB,0xDA,0x02,0xC5,0x24,0xA2,0x45,0xC6,0xD8,0xF8,0x35,0xBF,0x63,0x6A,0xEE,0xEF,0x06, +0x56,0x73,0xD7,0xD7,0x86,0x2B,0xDD,0xE9,0x98,0x5F,0x5F,0xEA,0xD7,0xEB,0x73,0x79,0xE7,0xBA,0x1E,0xD3, +0x6C,0xE3,0x69,0x79,0x7C,0x7A,0x85,0x46,0xF0,0xA9,0x7D,0xB5,0x3F,0x7A,0x1F,0x3A,0x76,0x81,0xE7,0xE5, +0x4E,0x0C,0xE9,0xCD,0x6B,0x67,0x3C,0xBB,0xBC,0x42,0xDE,0x71,0xAA,0x5D,0xDF,0xDB,0x61,0x01,0x04,0x53, +0xC2,0xB2,0xE9,0x25,0xBF,0x55,0xE9,0x1E,0x8A,0x7E,0xE4,0xE6,0x36,0xE3,0x01,0xCD,0x38,0x62,0xE9,0x55, +0x91,0x38,0x74,0xE2,0x56,0x94,0x9E,0x93,0xBA,0xA9,0x2E,0xF0,0x4E,0x60,0x33,0x21,0x58,0x4B,0x35,0xA2, +0x87,0x55,0x97,0xCE,0x13,0x65,0x9F,0x83,0x9D,0xD5,0xC0,0xD6,0xBA,0x65,0xBC,0x42,0xB1,0xD3,0x9F,0x8F, +0xB4,0x70,0xBF,0xFD,0x0E,0xDC,0x67,0xE5,0x62,0x6D,0x57,0x6E,0xE7,0x0C,0x4A,0xCE,0x93,0x07,0x43,0x80, +0x15,0x63,0x11,0x6F,0x57,0xA7,0x34,0x68,0xF3,0x55,0x90,0x30,0xBF,0x09,0x0A,0xD5,0xB9,0xAB,0x87,0xD3, +0xDD,0xEC,0x4B,0xE9,0x2C,0x54,0xFC,0xC3,0xF6,0x53,0x44,0xF7,0xB8,0x6A,0xB2,0x20,0x46,0x1D,0xF7,0xF5, +0x71,0x0B,0xBB,0xFC,0xBD,0x77,0xC8,0x54,0xA4,0xB0,0xB1,0xD3,0x64,0x11,0x79,0x14,0x66,0x71,0xED,0xCB, +0x1D,0x3F,0xF2,0xC8,0xDA,0x36,0x72,0xCE,0xC2,0x4D,0x9D,0x38,0x6C,0xD9,0xC2,0x8C,0x9D,0xEA,0xBF,0x5C, +0x86,0x56,0x5A,0x76,0xDC,0xB9,0xB7,0x5B,0x93,0xC4,0xC2,0xBC,0x9E,0xC9,0x44,0x53,0x24,0xC2,0xF8,0xB8, +0x4B,0xE9,0x9A,0x00,0x73,0xB2,0x54,0x6B,0x1F,0xA3,0xC5,0x9A,0x26,0xCA,0xA9,0x0D,0xFC,0x23,0xCA,0x3E, +0x17,0x06,0xC3,0x59,0x1E,0xA1,0x7A,0x49,0x24,0x4A,0x7B,0x39,0xCB,0xE9,0x74,0x9A,0x34,0xEB,0xA5,0x96, +0x4B,0xB0,0x85,0x7B,0xDC,0x0A,0x34,0xE1,0x5A,0x2C,0x76,0x90,0x71,0x3C,0x0B,0x4B,0xC9,0xC0,0x0F,0x50, +0x63,0x61,0xAE,0x56,0x9E,0x6B,0x21,0x6F,0x10,0xA9,0x85,0x83,0xCB,0xF2,0xF5,0xAE,0xDB,0x6D,0x61,0xF9, +0x67,0xCD,0xBA,0xA3,0xC6,0x6C,0x76,0x97,0x4D,0x82,0xF3,0xA0,0xC4,0x97,0x06,0x07,0x3F,0x5C,0x7E,0xED, +0x03,0xC1,0x64,0xCE,0x0C,0x35,0x2A,0xED,0x2A,0x9A,0xAC,0xF6,0x9D,0x45,0xE9,0x7E,0xD8,0xF6,0xED,0x71, +0x04,0xCA,0x66,0x01,0x06,0x58,0x27,0xE2,0x0C,0xF3,0xF9,0xE8,0xC7,0xD4,0x8E,0xA7,0xBA,0xF6,0x14,0x13, +0xEE,0x77,0xD5,0xBE,0x89,0xD6,0x0B,0xB1,0x50,0x6A,0x55,0x24,0xC7,0xA5,0x2B,0x96,0x0C,0xBE,0xA6,0xF7, +0x75,0xBF,0x1C,0x3A,0x98,0xC7,0xFD,0x8E,0x3A,0xC8,0x10,0x77,0xE0,0x05,0x7B,0xAC,0x44,0x55,0x2A,0x95, +0x08,0xCD,0xD0,0xFF,0xC8,0xDA,0x64,0xBB,0x05,0x50,0x65,0x90,0x02,0xF9,0x0A,0xF4,0x35,0xE1,0x6B,0xF0, +0xD4,0xB7,0x4F,0x8C,0x11,0xD5,0xE1,0x0F,0x5D,0x3A,0xB3,0x90,0xCC,0x9F,0xD1,0xFF,0xC6,0x3B,0x41,0xCB, +0x0C,0x78,0x9F,0xAF,0x8A,0xCE,0x70,0xA8,0xD1,0x41,0x5E,0x3D,0x06,0xAE,0xC3,0x8E,0xD9,0xE9,0xE6,0x8C, +0xCD,0x99,0xA7,0x29,0x38,0x40,0x56,0x21,0x31,0xFB,0x81,0x5F,0xA5,0xD0,0x07,0xD9,0xDE,0x82,0xB3,0x35, +0x53,0x3F,0x5F,0x3C,0x94,0xAC,0x6D,0x6F,0xF2,0x8D,0xCF,0x04,0x52,0xF3,0x39,0x12,0x44,0xA5,0x6C,0xA0, +0x9D,0x52,0x84,0x84,0x87,0xD2,0x53,0x7B,0xE3,0x3A,0x58,0xA1,0x6B,0xB1,0x55,0xF7,0xB3,0x8F,0xC2,0x80, +0xE1,0x50,0xA3,0x3C,0x73,0xF0,0xF5,0x76,0xEA,0x62,0x4A,0xE6,0x9A,0xAE,0x1B,0x38,0xC1,0x43,0x6C,0x39, +0x7A,0x11,0x05,0x03,0xF0,0x19,0x33,0xF6,0xCB,0x8D,0x37,0x91,0xE6,0x41,0x45,0x28,0x33,0x12,0x48,0x77, +0x6A,0x80,0xAE,0xE7,0x84,0xAC,0x3F,0x94,0xE7,0x40,0x8E,0x39,0x3C,0x33,0x1A,0xC0,0xDC,0xAB,0x8A,0xF9, +0x30,0x89,0xE2,0x3F,0x29,0xA1,0x71,0x63,0xF3,0xCB,0x36,0xCE,0x68,0xB3,0xF2,0xD3,0xBF,0x2C,0x06,0x42, +0x03,0x09,0x90,0x60,0x9F,0x6A,0xA6,0x33,0x40,0x06,0xC4,0x95,0xCC,0xF9,0x69,0x90,0x2A,0x42,0xA9,0x42, +0x73,0x27,0x48,0x23,0x68,0x91,0xCD,0x49,0x4E,0xAD,0x38,0x80,0x13,0x47,0xDC,0x02,0xC9,0x26,0x43,0x6E, +0xE3,0xF9,0x03,0xEB,0x85,0x47,0x11,0x39,0x80,0x4B,0xA2,0x20,0x4B,0x38,0x34,0xBD,0x61,0x8A,0xCB,0xFA, +0xB8,0x66,0x9E,0x2B,0x67,0x0A,0xC4,0x35,0x35,0x79,0x42,0x6F,0x63,0x09,0x20,0xEA,0x9F,0x45,0x80,0x2B, +0xD8,0x4E,0x10,0x24,0x5D,0x5A,0x75,0x35,0x60,0xFA,0x3A,0xFB,0xFE,0x64,0x3D,0x04,0xBD,0x05,0xF2,0x35, +0x15,0x7B,0x1C,0x7E,0xD7,0xA7,0xEA,0x7D,0xBB,0x25,0x0C,0x73,0x42,0xE7,0x27,0x92,0x16,0x01,0x6A,0xA9, +0xEB,0x8D,0x2E,0x7B,0xAC,0xA0,0x0A,0xE6,0xB0,0x4B,0x9F,0x58,0xC3,0x29,0xF5,0x2B,0xE1,0xAB,0xF2,0x0D, +0x28,0xA3,0xF6,0xF1,0x4D,0x58,0xAD,0x8F,0xC2,0x03,0xE3,0xD3,0x60,0x9B,0x2F,0x7A,0x28,0xA2,0xF4,0x1B, +0x67,0x2A,0x7A,0x7A,0x3A,0x09,0xFB,0x20,0xCD,0x70,0x52,0x66,0x00,0x3F,0x7C,0xA7,0xE3,0x5F,0x75,0xA0, +0x4E,0x50,0xEC,0x89,0xDC,0x12,0x8C,0x89,0xCE,0xC1,0x1C,0x4F,0xC1,0xAE,0xDC,0xAB,0x7B,0x0C,0xE9,0x83, +0xA8,0x7E,0xC6,0x67,0xB6,0x30,0x7D,0xC3,0xC6,0x52,0xFE,0xA4,0x83,0xA6,0xB7,0x81,0xDE,0x33,0x70,0x88, +0x56,0xC3,0x15,0x4F,0x40,0x8C,0xC5,0x30,0x2D,0x37,0x97,0x33,0xAE,0x99,0x60,0xA6,0x16,0x3E,0x2D,0x92, +0xEC,0x31,0xAA,0xE3,0x56,0xDF,0x48,0x57,0xC8,0xF3,0x37,0xD0,0x9E,0x74,0x58,0x16,0x73,0xAB,0x0C,0xB2, +0x77,0xD8,0xA1,0x32,0x64,0x9D,0x45,0xB2,0x96,0x41,0x5D,0xE4,0x05,0x52,0x9B,0xE5,0x99,0xBC,0x13,0x42, +0xB3,0x9A,0xE8,0xD3,0x27,0x53,0x27,0xF3,0xDB,0xDA,0x17,0x64,0xB4,0x7C,0x26,0x8C,0x57,0x18,0x3D,0x91, +0xD9,0xC8,0x36,0x56,0x40,0xE7,0x35,0xAB,0x13,0x77,0xB6,0x67,0x0B,0xB4,0xFF,0x81,0xD1,0xC9,0x1C,0x42, +0x8D,0xC6,0x68,0xCE,0xF7,0xA6,0xA0,0x38,0x9B,0x45,0x69,0x90,0x21,0xCA,0x3B,0x52,0xCD,0xE5,0x17,0xD6, +0xFE,0x0A,0x0D,0x65,0xA1,0x1F,0xEF,0x80,0x8A,0xCB,0x16,0x56,0x54,0x24,0xC5,0xBC,0x77,0x84,0x38,0x5A, +0xF7,0x61,0xFC,0x4B,0x1E,0xC1,0xB2,0xCF,0xD9,0xD6,0x56,0x7D,0x31,0xD1,0xA9,0x29,0xF1,0x0D,0xB6,0x83, +0xEB,0x32,0xF2,0x5D,0xAA,0xD7,0x26,0x7E,0x7A,0x1F,0xE8,0x3A,0x7C,0xEA,0xE0,0x2F,0x5A,0x2B,0xD1,0xD9, +0xBA,0x42,0x1D,0xBC,0xB1,0x75,0x31,0x43,0xC0,0xDA,0xFD,0xF5,0x6E,0x8B,0xD8,0xA9,0xCB,0x43,0xE7,0xAD, +0xEB,0x70,0x36,0xA2,0xEF,0x91,0xAA,0xE0,0x56,0x8F,0x30,0x20,0x46,0xFB,0xE6,0x33,0xF1,0x00,0x7A,0x52, +0x45,0x74,0x0F,0xF5,0x70,0x8E,0xCD,0xD2,0x05,0xF3,0x04,0x22,0xC9,0x21,0x1F,0xA6,0x0B,0x24,0x9F,0xE4, +0x2E,0x8D,0xCB,0x2A,0x69,0x4B,0x12,0x32,0xEE,0x22,0xFD,0x11,0x81,0x76,0xA1,0xF4,0xC7,0xAC,0x85,0x43, +0x71,0xC8,0x6D,0x26,0x42,0x43,0x3E,0x59,0x0E,0x2F,0x04,0x61,0x87,0x08,0x48,0x9C,0xEA,0xC9,0x8E,0x84, +0x35,0xC4,0x38,0xCC,0xFC,0x38,0x4C,0x18,0xB4,0xC0,0x21,0x8D,0xA6,0x0A,0x86,0x94,0xE2,0x33,0xC4,0x57, +0x01,0x90,0x41,0x0D,0x03,0x0A,0x8E,0x47,0x43,0x33,0x15,0x43,0x6B,0x10,0x7B,0x52,0x78,0x0A,0xC0,0x04, +0x13,0xBB,0x10,0x88,0xAC,0xC2,0x71,0x95,0x6E,0x51,0x70,0x15,0x30,0x93,0x5B,0xEC,0x8B,0xA7,0xB2,0xEC, +0x48,0xCE,0x92,0x3F,0x38,0x68,0xF3,0xF2,0xB2,0xC4,0x0C,0xFC,0x60,0xA6,0x42,0x9A,0xB2,0x76,0x7A,0x3B, +0xB7,0x89,0x5B,0x79,0x2B,0x8E,0xD0,0xED,0x3C,0xA5,0x3B,0x45,0xAF,0xEA,0x1E,0x3F,0xA1,0x6A,0x55,0xAE, +0x9F,0xC6,0x62,0xFD,0xD0,0xA4,0x53,0xF9,0x4E,0x8F,0x75,0x3B,0x66,0xAB,0xB6,0xB4,0xF3,0x2D,0x4B,0x1D, +0x92,0xF0,0xDD,0x9B,0xD6,0xCC,0x7A,0x8C,0xEF,0x7A,0x91,0x29,0x05,0x7C,0xCA,0xE0,0xA1,0x8D,0xFB,0x89, +0x4B,0x5D,0xEC,0x78,0xB4,0xA9,0x5B,0xB4,0x7B,0xED,0x0C,0x24,0x49,0x43,0x2D,0x68,0x31,0x8E,0xFD,0x8D, +0xFA,0x6B,0x15,0x5D,0x66,0x8D,0x69,0x54,0x1B,0xFB,0xCB,0x09,0x41,0xAA,0xC5,0x9D,0xB5,0x8B,0xA4,0x7E, +0x24,0x44,0x6B,0x9B,0x39,0x40,0x97,0x4D,0x42,0x8F,0x24,0xB5,0x7E,0xB4,0x52,0x2A,0x16,0xAE,0x10,0x8A, +0xCB,0x61,0xA8,0x59,0xF0,0xEE,0xC4,0xB2,0x8C,0xB3,0xF7,0xFC,0xE7,0x60,0xB3,0x9A,0xFC,0x62,0xDB,0x4D, +0x97,0x8D,0x93,0x27,0x78,0x59,0x95,0x60,0x93,0x81,0xCC,0x8B,0x96,0x63,0x61,0x58,0xF3,0xCC,0x38,0x00, +0x14,0x95,0xCB,0x33,0xCA,0x99,0x9C,0xF4,0x42,0x6B,0xD0,0xA2,0x26,0x5B,0xCC,0xB6,0x74,0xFB,0x5E,0xC2, +0xA2,0x83,0x58,0xB4,0x07,0xBA,0x86,0x2D,0x86,0xD1,0x84,0x74,0x76,0xAD,0x3B,0xF0,0x26,0x3D,0x75,0x94, +0x15,0xA9,0xBF,0xE1,0xEE,0x1E,0x95,0xA7,0xEB,0x7B,0x13,0xC9,0xCC,0x23,0xC3,0x35,0x04,0x1A,0xF8,0xF2, +0xE3,0x57,0xFF,0x15,0x8C,0xF3,0x9E,0x79,0x12,0x83,0xA8,0x92,0x26,0x08,0x1C,0x40,0x11,0xC7,0xC8,0x38, +0x1F,0xD8,0x2F,0xFC,0xC6,0xAA,0x8F,0x87,0x7E,0x09,0xE4,0x4D,0x05,0x16,0xD8,0xB6,0x9C,0x56,0xDD,0xED, +0x47,0x89,0x1A,0x96,0x0A,0x0A,0xF2,0x5C,0x7D,0x35,0x53,0x5C,0x32,0x51,0x7F,0x93,0xBB,0x36,0x6C,0x87, +0x58,0x2B,0xD5,0x4D,0x7D,0x14,0xDD,0xD0,0x02,0x97,0x62,0x3B,0xB2,0x7C,0x46,0x5F,0xBA,0xB7,0x77,0x6A, +0x4E,0xD4,0xAD,0xEE,0x01,0xFC,0x11,0x2B,0xE5,0x85,0xBF,0x3C,0x1B,0xCA,0x44,0x06,0x67,0xBB,0x81,0x81, +0x17,0x37,0x8F,0x41,0x8C,0x48,0x67,0x5E,0x32,0xB3,0x57,0x69,0xBA,0x19,0x2C,0xAD,0xF8,0x6E,0x31,0x40, +0xBF,0x34,0xEB,0xD3,0x27,0xFB,0x67,0x41,0x43,0x20,0x81,0x2B,0x0A,0x5C,0x4E,0xF3,0x4B,0x06,0x84,0x43, +0x91,0x2E,0x4E,0x12,0x00,0x0C,0xC5,0x84,0xA7,0x00,0x70,0x92,0x00,0x59,0xD6,0x87,0x15,0x8A,0x46,0x2B, +0x49,0xEA,0x65,0xB0,0x3A,0x1E,0x09,0x4C,0xE3,0x62,0x22,0x93,0x4C,0xC4,0x70,0xD0,0x10,0x42,0xCF,0xCA, +0x90,0xC9,0x33,0xF3,0x68,0xC9,0xEB,0x11,0x70,0x8C,0xBC,0xA9,0x46,0x55,0xDF,0xC4,0x6E,0xB3,0x46,0x7F, +0x6C,0x46,0xC0,0x44,0x12,0x24,0x38,0x13,0x62,0x4F,0xD0,0x64,0x52,0x64,0x12,0x55,0xA4,0x44,0xC8,0x54, +0x13,0x25,0x5C,0x70,0xC0,0x4B,0xD8,0x74,0x53,0x65,0xC1,0xAE,0xB1,0x09,0xC1,0x45,0x92,0x26,0x57,0x61, +0xA9,0xA2,0xD1,0x65,0xD2,0x66,0xA5,0xD1,0x7F,0x27,0xC9,0x55,0x93,0x27,0xB9,0x4E,0xE7,0x29,0xD9,0x75, +0xD3,0x67,0x0C,0xD9,0x3B,0x95,0x61,0xFF,0xC6,0x83,0x42,0xB6,0xB3,0x4E,0xC2,0xC6,0xA3,0xC3,0x2A,0x1C, +0x6A,0xCF,0xF4,0x2A,0xF2,0xCC,0x22,0xC6,0xE5,0x44,0x1E,0xCD,0xE6,0x6A,0x5B,0x19,0xEB,0x7F,0xE4,0x05, +0x73,0xBC,0xBC,0x4B,0x64,0x2F,0x6E,0xB5,0xB3,0x15,0xF3,0x11,0x2E,0x0D,0xD5,0x2E,0x8D,0x84,0xE4,0xFB, +0x4A,0x0D,0xCB,0xD7,0x22,0xBE,0xEE,0xCA,0x0B,0x19,0xC2,0x4C,0x1A,0x2C,0x12,0x57,0x42,0x20,0xD2,0x6C, +0x5A,0x6C,0x25,0x89,0xC3,0xD3,0xCA,0x5C,0x1B,0x2D,0x62,0x69,0x17,0xBA,0xDA,0x7C,0x5B,0x6D,0x7B,0xBA, +0xC9,0xAA,0xC3,0x4D,0x9A,0x2E,0x7B,0xAB,0x37,0x4D,0xD3,0x6D,0xDA,0x6E,0x81,0x4A,0x54,0xE5,0xCB,0x5D, +0x9B,0x2F,0x5B,0x78,0x9F,0x41,0xDB,0x7D,0xDB,0x6F,0x5A,0x13,0x30,0x9D,0xDC,0x90,0x53,0xAC,0xEF,0x42, +0xE2,0x18,0xCC,0xA1,0xFF,0x74,0x2B,0x0F,0x4A,0xA7,0x3D,0x2A,0x8D,0xC6,0x7C,0xF4,0x25,0x5C,0xCC,0xA9, +0x69,0xD5,0x7B,0x13,0x70,0xC4,0x7C,0x6A,0x30,0xB2,0x93,0x51,0xBC,0x5D,0x91,0xE2,0x76,0x82,0x0C,0x62, +0x73,0xB8,0x22,0xFA,0x6C,0xEF,0x17,0xB5,0x42,0x5E,0x59,0xB3,0x39,0x31,0x40,0xC2,0x26,0xEF,0xC4,0xC4, +0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0xFB,0xF4,0xC2,0xBA,0xCC,0xD4,0x33,0x35,0x5C,0xF0, +0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0x03,0x21,0x50,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5, +0xF2,0x76,0x5D,0xC0,0xE0,0x55,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xB4,0xD7, +0x43,0xFD,0x3F,0xD2,0xBB,0x36,0x5C,0x56,0xCB,0x1A,0x32,0x5C,0x70,0x77,0x50,0xAA,0x69,0x55,0xCE,0xA3, +0x31,0x55,0x46,0x9C,0x6F,0x89,0x19,0xCE,0x57,0x86,0x3F,0x78,0x40,0x1E,0x67,0xB2,0x9C,0x54,0x94,0xE5, +0xC9,0xDB,0x57,0xB1,0x5A,0x3F,0x6E,0x6A,0x79,0xB0,0xA7,0x5F,0x6D,0xE4,0x1C,0x44,0xFD,0x19,0xF7,0x7F, +0x7F,0x8E,0xC5,0x24,0x28,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x49,0xBB, +0x29,0x5D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0xC7,0xCB,0xA6,0x5C,0xC7,0xCD, +0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0xCF,0xDB,0x5E,0x5D,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9, +0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x28,0x87,0xA5,0x0A,0x92,0x40,0x86,0x1D,0x87,0x06,0xC1,0x35,0x4B,0x19, +0xAB,0xEE,0x97,0xF0,0x87,0x89,0x2A,0x51,0x3B,0x7D,0x30,0xD5,0x26,0xE1,0x54,0xB6,0xA9,0xC1,0xDF,0xE1, +0x25,0x08,0x0A,0x7D,0x41,0xB9,0x6F,0x89,0xCC,0xC4,0xD9,0xA1,0x28,0xA3,0xDF,0xE3,0x8D,0x8C,0x7D,0x49, +0x06,0x9C,0x41,0xF5,0x75,0x8D,0x15,0x75,0x56,0x37,0x80,0x7D,0xFA,0x6E,0xE0,0x46,0x16,0xA4,0x18,0xE4, +0xBA,0x85,0xF0,0x66,0x56,0xE4,0x5B,0x82,0x23,0xEB,0xE8,0x56,0x17,0xA5,0xD4,0x30,0xC4,0xCB,0xF8,0x76, +0x57,0xE5,0xD2,0x97,0x7E,0x2C,0xE1,0x47,0x96,0xA6,0x9D,0xE3,0x3A,0xE6,0xF1,0x67,0xD6,0xE6,0x29,0x6C, +0x8F,0xEB,0xE9,0x57,0x97,0xA7,0x11,0xF5,0x3B,0x86,0xF9,0x77,0xD7,0xE7,0x42,0x4A,0xB2,0x87,0xDC,0x15, +0xC8,0x3C,0x85,0xA8,0x49,0xA8,0x72,0x31,0x52,0xAA,0x2E,0x5D,0x8C,0x87,0xCB,0xBE,0xCB,0x16,0xB2,0x3E, +0xEC,0x41,0x43,0x2D,0x53,0xAD,0xB3,0xCC,0x8E,0x7F,0xFD,0x00,0x98,0xE4,0x69,0x36,0x6F,0xCC,0x30,0x02, +0x21,0xE3,0x88,0x8D,0x51,0x6D,0x95,0xAC,0xD4,0x2C,0xBB,0xD9,0x6C,0x41,0x9D,0xBB,0x51,0xE6,0x4A,0x88, +0x8C,0x84,0xE2,0x4E,0x1E,0xAC,0x12,0x2A,0x91,0x41,0xF2,0x6E,0x5E,0xEC,0x0A,0x1A,0xF4,0x80,0xEA,0x5E, +0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x8C,0xBB,0xD6,0x81,0xE3,0x4F,0x9E,0xAE,0x0B,0x4F, +0xC6,0xCF,0xF3,0x6F,0xDE,0xEE,0x19,0x42,0xCF,0x74,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F, +0xDF,0xEF,0x03,0x83,0x4F,0xE4,0x03,0x79,0x5F,0xCF,0xB7,0xD2,0x85,0xAF,0x24,0x06,0x6C,0xB1,0xCF,0x69, +0x98,0x98,0xF2,0x79,0x75,0x1A,0xBF,0x80,0x84,0x2E,0xEF,0x89,0x1B,0xB3,0xA7,0x45,0x36,0x91,0xF0,0x27, +0x43,0xD2,0x4A,0x5C,0x13,0x90,0xE5,0xBB,0xE2,0x47,0xBF,0xC1,0xE6,0x9C,0x50,0x13,0xDE,0xCC,0xC6,0x37, +0xBD,0xC6,0xBB,0xFB,0x1C,0x62,0xE1,0x85,0xA6,0xA9,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6, +0x76,0xF4,0x97,0x50,0x26,0x70,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x05,0x83, +0x4A,0x9B,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x55,0x94,0x71,0xFB,0xED,0xD7, +0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x2C,0x82,0xC7,0x3E,0xE0,0x7F,0x83,0x28,0x0C,0x55, +0x9B,0x9A,0xF4,0xDF,0x12,0xF3,0x9C,0xC5,0x46,0x7C,0x53,0x12,0xED,0x66,0xC5,0x3E,0x6D,0x19,0xDC,0xBA, +0x7C,0xA9,0x79,0x10,0xBC,0x31,0xF7,0x65,0x47,0x11,0xB4,0xB4,0x0D,0x25,0xF3,0xDC,0x8E,0x96,0x17,0x6A, +0x45,0x9F,0x88,0x60,0xD6,0xC4,0xAF,0x7C,0xEF,0x2E,0x7F,0xBF,0x99,0xFF,0x81,0x8A,0x22,0xF2,0xE6,0xCE, +0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x16,0xFE,0xA0,0x9F,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA, +0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x47,0xCA,0x23,0x94,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF, +0xFE,0xFE,0xD8,0xDA,0x22,0x93,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x75,0xE9,0x80,0x00, +0x0C,0x4C,0xDD,0x23,0xB1,0xA9,0x6F,0xD8,0xC1,0xBF,0x98,0x68,0xF3,0x66,0x51,0xEF,0xE0,0xCE,0x80,0x59, +0x72,0x41,0x47,0x32,0x32,0x41,0x1E,0x54,0xE2,0x67,0xB6,0x85,0xC0,0xE2,0xC8,0xE5,0xBF,0x24,0xEA,0xA5, +0xC4,0x0A,0xD9,0xB2,0x71,0xEB,0x60,0xEA,0xEA,0x06,0xF1,0xF8,0x93,0x98,0xC6,0x31,0xB6,0x4F,0x95,0xB2, +0x70,0xEB,0x41,0xB3,0xD0,0xAB,0xC0,0x7C,0x8D,0x3B,0xF8,0xC2,0x9D,0xCB,0x54,0x1B,0xD7,0x43,0x7E,0x5C, +0xE8,0x80,0x08,0x51,0xBF,0x67,0x67,0xBF,0xFA,0x09,0xCB,0x06,0xAC,0x27,0xF3,0xB2,0x6E,0xAD,0x69,0xE7, +0x15,0x01,0x91,0x61,0xB8,0x98,0x0E,0x45,0xD4,0x66,0xE1,0xDB,0x7A,0xDB,0x4D,0xBA,0xB7,0xFB,0x29,0xB7, +0x69,0x06,0xD9,0x4D,0x2F,0x77,0xA9,0xE0,0x08,0xF3,0x82,0xF4,0x9A,0xD3,0xD2,0x29,0xF9,0x53,0x12,0xCE, +0xDA,0x40,0xE5,0xE2,0x62,0x99,0x0A,0x58,0x62,0x2B,0xA5,0xCE,0xCB,0x43,0xFA,0xFC,0x97,0x64,0x03,0x7B, +0x2F,0x1A,0x83,0xF1,0x0A,0x68,0xD3,0x57,0x2F,0x5A,0x35,0xDD,0xD0,0x65,0x24,0xE8,0xD1,0x0E,0xD0,0x1D, +0xE6,0x2B,0xFD,0xC9,0x8D,0x44,0x81,0x35,0xF8,0x74,0x79,0x16,0x39,0xCC,0xFD,0x12,0xE7,0xAE,0xF1,0x60, +0x96,0x7C,0x12,0x6C,0x2A,0x99,0xE1,0x92,0xB0,0xA2,0x5D,0xDE,0x1A,0x4E,0xB2,0xCB,0xCE,0x0A,0x72,0xDE, +0xDC,0x4A,0xEF,0xEC,0x5F,0x6D,0xDB,0x44,0xDA,0x25,0x70,0x65,0x12,0x3E,0xD6,0xE9,0xDA,0xFF,0x6C,0x47, +0x5B,0xA4,0xF1,0xBF,0xBF,0x29,0xF3,0xDA,0xB4,0x2F,0x1B,0x78,0x77,0x2D,0x04,0x80,0x78,0xF8,0xB4,0x00, +0x34,0x78,0xAB,0x94,0x87,0x42,0x06,0x44,0x10,0x32,0xDE,0xB0,0x26,0xE9,0x53,0x94,0x46,0x37,0xA6,0x38, +0x24,0x58,0xE3,0x4E,0x8E,0xAE,0x4F,0x28,0x82,0x11,0xDA,0xE5,0xC3,0x32,0xAE,0x15,0x07,0x42,0x11,0xDA, +0x11,0x0D,0x02,0x1D,0xDA,0x02,0x4D,0x94,0x00,0x28,0x1C,0x33,0xE8,0xBE,0x5D,0xB1,0x73,0xFE,0xF3,0xE4, +0xF6,0x04,0x40,0x8D,0xB0,0x3C,0x80,0xA6,0xC0,0x8A,0x7C,0x42,0x74,0x14,0x6B,0xDD,0xA4,0xB2,0x5C,0x8F, +0xCE,0x89,0xB3,0x12,0xFC,0xC8,0xC4,0x70,0x73,0xE4,0xE2,0xC8,0x72,0x46,0x11,0x35,0xBA,0x39,0xAB,0x65, +0xE2,0xE5,0x6A,0xA3,0x58,0x8D,0xE5,0x77,0x26,0x30,0xF2,0x05,0xBF,0x9C,0xF5,0x53,0x64,0x70,0x75,0x57, +0x74,0x50,0xD9,0x89,0x2E,0x78,0x46,0xF2,0xDF,0x28,0x4C,0x47,0xCB,0x5C,0x6B,0x57,0x8B,0x87,0x6E,0x58, +0xE7,0x92,0x8F,0x1E,0x30,0xD4,0x26,0xC8,0x24,0x50,0xA4,0x43,0x8E,0x3B,0x80,0xFB,0x43,0x18,0x38,0x7B, +0xED,0x33,0xEC,0x2B,0x68,0x9B,0x6C,0x29,0xFC,0x54,0x0D,0x7B,0x2B,0x33,0xD5,0x72,0x1A,0x3F,0x9B,0xBD, +0xE1,0x00,0x1B,0x48,0xFF,0x1B,0x99,0x65,0x2C,0x1C,0xBE,0x4C,0xDA,0xC3,0xC6,0xF6,0x7A,0xA8,0x16,0xE9, +0xD6,0x3E,0x4E,0xE0,0xD7,0x0D,0x37,0xFB,0x9A,0xB7,0xDB,0x3E,0x81,0x11,0xAA,0x01,0x33,0x3F,0x54,0xF6, +0xA8,0x5C,0xA7,0x89,0x3A,0x33,0x52,0xF3,0xFE,0xEA,0x53,0x02,0xDE,0x32,0x8F,0xD9,0xDB,0xEA,0x60,0x32, +0x0E,0x97,0xAF,0x7D,0xE7,0xA2,0xDF,0xC5,0x84,0x6F,0x7E,0x1F,0x54,0x2B,0x7B,0x84,0x12,0x80,0x50,0x62, +0x59,0x4B,0xD0,0x67,0xD8,0xED,0xD7,0x16,0x05,0x59,0x52,0x1E,0xE8,0x6E,0x67,0x32,0x36,0xCD,0xB2,0x3E, +0xF6,0xE7,0x04,0x03,0xEF,0xA6,0x98,0xEF,0x92,0x7F,0x35,0xC1,0xFB,0xC6,0xFB,0xC8,0x77,0xEF,0x96,0xEE, +0x95,0xE0,0x22,0x77,0x85,0xA5,0xE6,0x33,0xB2,0xCB,0xF1,0xA0,0x74,0x6A,0xC5,0x46,0x81,0x92,0x68,0x83, +0xB7,0x2E,0xB0,0x62,0x36,0x49,0x74,0x89,0x72,0xA8,0x1E,0x03,0xE5,0x8E,0xF3,0x24,0xB4,0xA3,0xCF,0x7A, +0x41,0xC5,0xF8,0x4E,0x28,0x05,0x31,0xDD,0x7D,0x2B,0x0E,0xA5,0x14,0xEE,0x8E,0xE7,0xC6,0x57,0x85,0x9A, +0x9E,0xA4,0xEB,0xA3,0x56,0xD8,0x61,0x3E,0x34,0xC2,0x6A,0x4C,0xDF,0x85,0x11,0xD5,0x52,0xE0,0xC2,0xBC, +0x8B,0x8F,0xAE,0x79,0x7F,0xD7,0xF2,0x2E,0x49,0x73,0xB7,0x4E,0xEF,0xF3,0xBA,0x1E,0x10,0x0B,0xB2,0xE7, +0x1D,0x32,0x3A,0xC6,0xCC,0x8B,0xFE,0x48,0x7E,0x96,0x8B,0xA9,0x53,0x65,0xDB,0x0D,0x6B,0xD1,0x13,0xD3, +0xCC,0x31,0xF7,0xDB,0xD4,0xF1,0xBB,0xF9,0x21,0xCA,0xCB,0xE2,0x9D,0x70,0x3F,0x51,0xFE,0xA9,0x7B,0x3F, +0xE7,0xE2,0x9F,0x48,0x4E,0xD9,0x9A,0xCC,0x1B,0xC6,0x72,0x52,0x86,0xBC,0x1D,0x80,0xD9,0xEB,0xD7,0x05, +0xDA,0xD0,0xD2,0x8E,0xE4,0xA2,0xA5,0x78,0x38,0xDD,0x52,0xDC,0x7F,0xED,0x90,0x64,0x70,0x72,0xDB,0x9F, +0x69,0xA1,0xD3,0x78,0xDA,0xAA,0x43,0xDD,0x58,0xEE,0xC0,0x99,0x0C,0xC9,0x44,0x21,0x42,0xED,0x93,0xD9, +0x6B,0x48,0x41,0x5B,0x58,0x48,0x80,0xE0,0x65,0x10,0x5F,0x04,0xB4,0x71,0x80,0xC0,0x05,0x28,0x47,0x22, +0x78,0x1E,0x76,0x93,0x86,0x97,0xF6,0xCE,0x96,0xD4,0xE5,0x95,0xC4,0x58,0x50,0x36,0x89,0xD1,0x5D,0x01, +0xA1,0x63,0xFF,0xD3,0x17,0xD7,0x2D,0xA6,0xE0,0xF2,0x75,0xA7,0x8E,0xB3,0xA5,0xAF,0x06,0x95,0xF7,0xD6, +0x16,0xD6,0xB2,0xD3,0xE9,0x93,0x11,0xF5,0x76,0x27,0x61,0x46,0x26,0x05,0x9C,0x38,0x8B,0x4C,0xDC,0x41, +0x19,0x94,0x1C,0x44,0xD2,0x73,0xC4,0x70,0xF8,0xCA,0x57,0x34,0x9B,0x48,0x83,0x76,0x67,0x44,0x02,0xB0, +0xD5,0xBB,0xBA,0xCB,0x21,0x91,0x1A,0x45,0xB3,0xB2,0xB5,0xE3,0x96,0x5B,0x21,0xA1,0x54,0x08,0xC5,0x60, +0x6F,0xE7,0x95,0xAC,0xB9,0xD5,0xCA,0xFF,0xE1,0xD7,0x89,0x08,0xD3,0xBB,0x6E,0x1D,0x4F,0x38,0xFC,0x4B, +0x9F,0xDD,0x32,0x46,0xC0,0xD5,0x54,0xB1,0xB2,0x53,0x74,0x9B,0x8E,0xFC,0x94,0x7C,0xBF,0xF1,0xBE,0xBB, +0x5A,0xBC,0x3E,0xCC,0x96,0x2F,0x5F,0x09,0xAD,0xC2,0xFD,0xC7,0x1F,0xDF,0x2D,0xFB,0xCD,0xBA,0xD1,0xAB, +0x97,0x7C,0x15,0x79,0x92,0x9F,0x3C,0xED,0x1E,0xBD,0x07,0xCB,0xF4,0xD0,0xC1,0x20,0x96,0x4D,0xC6,0xD9, +0x3A,0xF8,0xAC,0x73,0xBC,0xF4,0x65,0xD5,0x72,0x9E,0x82,0x13,0x3A,0xBE,0x86,0x78,0x8B,0x1A,0xEF,0xC1, +0x27,0xF3,0xDE,0xE9,0x7F,0xB9,0x16,0x5D,0x5B,0xB1,0xBC,0xC9,0xD1,0x1E,0x7A,0x2D,0x9A,0x6A,0x77,0xD3, +0x26,0xEE,0xF7,0xD7,0x7B,0xF9,0xBB,0xFD,0x41,0xFC,0x99,0x99,0x19,0xFD,0x47,0xDC,0x10,0x9D,0x8B,0x02, +0xBF,0xBD,0x00,0x38,0x85,0x07,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0xE9,0xA2,0xA4,0x43,0x81,0x05, +0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11,0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31, +0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40,0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64, +0x52,0x64,0x48,0x50,0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51,0x83,0x07,0xC9,0x55, +0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08,0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28, +0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18,0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C, +0x59,0x69,0x03,0x09,0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, +0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48,0x0A,0x0C,0xC2,0x4C, +0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58,0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78, +0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49,0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D, +0xDA,0x6E,0x4B,0x59,0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90,0x21,0x11,0x8C,0x94, +0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81,0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1, +0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91,0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5, +0xF1,0x73,0x44,0xC0,0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, +0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1,0xA2,0x16,0xC5,0xC5, +0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1,0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1, +0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88,0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC, +0x78,0x78,0x0E,0x98,0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, +0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99,0xA9,0x1B,0x8F,0x9D, +0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8,0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8, +0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8,0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC, +0x7B,0x7D,0x47,0xC9,0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, +0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02,0x04,0x80,0xA0,0x06, +0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12,0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32, +0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03,0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27, +0xD4,0xE2,0x29,0x13,0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, +0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52,0x07,0x85,0xE8,0x56, +0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43,0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63, +0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53,0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77, +0xD7,0xE7,0x22,0x0A,0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, +0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B,0x8C,0x8A,0xA3,0x0F, +0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B,0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B, +0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A,0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E, +0x5E,0xEC,0x6A,0x5A,0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, +0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B,0x8F,0x8F,0xEB,0x5F, +0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82,0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2, +0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92,0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6, +0x75,0xF1,0x25,0x83,0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, +0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2,0x26,0x94,0xE4,0xC6, +0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2,0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2, +0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3,0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7, +0xF6,0xF6,0x6D,0xD3,0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, +0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A,0x2D,0x99,0xAE,0x9E, +0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B,0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB, +0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B,0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF, +0xFD,0xFB,0x66,0xCA,0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, +0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB,0xAE,0x9E,0xE7,0xCF, +0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB,0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB, +0xEF,0xDF,0xFF,0xFF,0x1F,0x95,0x80,0x00,0x0C,0x4C,0xF8,0x86,0x19,0x44,0x0A,0x28,0x63,0xD8,0x78,0x97, +0xD5,0x27,0x51,0xEF,0xE0,0xCE,0xB0,0x44,0x01,0x2E,0x38,0xCB,0x32,0x4D,0x58,0x34,0x21,0x94,0xB6,0x85, +0x84,0xD3,0xB9,0xD5,0x2F,0x2D,0x4F,0xA1,0xC8,0x39,0x39,0x86,0xAF,0x11,0x60,0xEA,0xEA,0x06,0xE9,0xD5, +0x5F,0xA8,0xE6,0xCF,0xC7,0x63,0xD9,0xB1,0xD1,0xF2,0x6F,0x3F,0xDB,0xB9,0xC0,0x44,0x12,0x24,0x50,0x60, +0x42,0x44,0xD0,0x64,0x52,0x64,0x08,0x62,0xFC,0x03,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74, +0x53,0x65,0x0B,0x44,0xE9,0x09,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0xC1,0x53, +0x22,0x58,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xA9,0xE0,0x08,0xF3,0xFF,0xEE, +0x2B,0x0A,0x4B,0xD1,0xC8,0xD3,0x25,0x24,0x5E,0x68,0xE5,0xE2,0x62,0x99,0x30,0xFC,0xA6,0x69,0x32,0xBC, +0x41,0x9B,0x9A,0x04,0x26,0x79,0x03,0x7B,0x2F,0x1A,0x59,0x0C,0xAB,0x08,0x13,0xD4,0xC8,0x91,0x80,0x12, +0xC0,0x28,0x24,0xE8,0xD1,0x0E,0x8B,0xB4,0x16,0x29,0x42,0xBD,0x3C,0x84,0x73,0x9F,0x5C,0x6C,0xF6,0x2A, +0x49,0xF0,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0xB1,0x37,0x56,0xF2,0xCA,0x5C, +0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0xBE,0x27,0xC3,0x01,0xC3,0x4D,0x9A,0x2E,0x53,0x69, +0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x2B,0x1D,0x0B,0xD2,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D, +0xDB,0x6F,0x04,0x80,0x78,0xF8,0xFA,0xB6,0xB5,0x26,0xCB,0xA0,0x17,0x5C,0xA9,0xE2,0xD2,0x3E,0xDE,0xB0, +0x26,0xE9,0xD5,0x80,0xBC,0x52,0xD8,0xCF,0x05,0x9E,0x37,0xCB,0x33,0x78,0x4F,0x28,0x82,0x11,0xBA,0xDB, +0x41,0xEE,0xD5,0xA0,0xB6,0x49,0xE1,0x81,0x25,0xCF,0x02,0x1D,0xDA,0x02,0x26,0x30,0x64,0x2D,0x5C,0xCF, +0x87,0x9C,0x98,0xA5,0xD2,0x82,0x44,0xC0,0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4, +0x72,0x74,0x4C,0xD0,0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, +0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1,0xA3,0x17,0xCD,0xD5, +0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xD9,0x89,0x2E,0x38,0xFB,0x7F,0xE0,0xEC,0x4F,0x2D, +0x8D,0x4A,0xF6,0xEC,0x56,0xF5,0x36,0x70,0x6B,0xD6,0x66,0x16,0x1B,0xEF,0x12,0xCF,0x0A,0x26,0x52,0xDE, +0x3A,0x87,0xAD,0x0B,0xAB,0xFC,0xA4,0x7C,0x24,0x7A,0x9D,0xC9,0xF8,0x5C,0xEF,0x89,0x7A,0x32,0x55,0x6B, +0x0A,0x1D,0xF0,0xEE,0x53,0x93,0x67,0xBB,0x1E,0x5D,0xE7,0x3F,0xFC,0xE2,0x46,0xC8,0x2A,0x1C,0xC6,0xCC, +0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8,0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8, +0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9,0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED, +0xFA,0x7E,0x4F,0xD9,0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x7E,0x1F, +0x54,0x2B,0x17,0x07,0x99,0xAC,0x31,0x5D,0xA3,0xC6,0x5F,0xC8,0xD1,0x47,0xD7,0x16,0x05,0x59,0x4E,0xE7, +0xDF,0xE1,0x40,0xB0,0x44,0xB9,0x39,0x31,0x22,0xE5,0x04,0x03,0xEF,0xA6,0xC9,0x19,0x52,0x56,0x79,0xB4, +0xA7,0x0D,0x97,0x2A,0x50,0x46,0x96,0xEE,0x95,0xE0,0xF7,0x85,0x91,0x2E,0x63,0x32,0x66,0xB8,0x66,0x27, +0x52,0xE4,0x18,0x65,0xFB,0x8B,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0xBF,0xD0, +0x02,0xFC,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x5E,0xC6,0x88,0x0C,0xE1,0x47, +0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x11,0x77,0xA3,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73, +0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xC2,0xBC,0x8B,0x8F,0xDC,0x90,0xF7,0x5E,0x12,0xD3,0x4C,0x53,0x02,0x9C, +0x72,0xAD,0xBA,0x1E,0x10,0x0B,0xC9,0xED,0xF9,0x06,0x32,0xBE,0x45,0xD2,0x55,0xCC,0x5B,0xE9,0x8B,0xA9, +0x53,0x65,0xFD,0x94,0x8C,0x05,0x1B,0xD6,0xCC,0x11,0x45,0x8A,0x59,0xED,0xBB,0xF9,0x21,0xCA,0x1D,0xEE, +0x75,0xFB,0x64,0x39,0xBE,0xCB,0xEC,0xE1,0x24,0x95,0x62,0x4A,0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A, +0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A,0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E, +0x5F,0xED,0x63,0x4B,0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, +0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x28,0x85,0x85,0x18,0xD6,0x66, +0x70,0x3B,0x7C,0x35,0x07,0x3F,0x8E,0x44,0xF6,0xB8,0xBB,0x62,0x2D,0x9E,0xAE,0xB8,0xC3,0xC4,0x06,0x50, +0xE7,0xD9,0xDC,0xF2,0x7A,0xFC,0x27,0x61,0x26,0xDA,0x8E,0x69,0x0B,0xB6,0x4D,0x21,0xE1,0x03,0xA8,0x45, +0x58,0xFD,0x4D,0xD7,0xD1,0x9C,0x5A,0xC8,0x08,0x4F,0xB4,0x51,0x67,0xFB,0xF7,0x49,0x56,0xFE,0x64,0xC2, +0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2,0x27,0x95,0xEC,0xD6, +0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3,0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3, +0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3,0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7, +0xF7,0xF7,0x46,0x4A,0xE2,0x13,0x0D,0xE0,0xE9,0xB6,0xD2,0xC8,0x2D,0x98,0xFC,0x55,0xDF,0x04,0xA7,0x6A, +0x25,0x96,0x0D,0x96,0xE1,0x89,0x64,0xBB,0xCE,0xDF,0xBE,0x3C,0x7C,0x9A,0x59,0x69,0x2E,0x92,0xCF,0x09, +0x40,0xFB,0x4F,0x29,0xE5,0x3E,0x0C,0xF0,0xFA,0xBA,0x9B,0xE9,0x0E,0x56,0x8C,0x93,0x65,0xCB,0x77,0x2C, +0x8E,0xC4,0xE5,0xBE,0x5E,0xBA,0x66,0xCA,0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE, +0x7E,0xFC,0x6E,0xDA,0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, +0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB,0xAF,0x9F,0xEF,0xDF, +0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8B,0xCC,0x80,0x00,0x0C,0x4C,0x04,0x44,0xCA,0x26,0x11,0xD4, +0x40,0xBD,0xA2,0x62,0xC2,0xDD,0x51,0xEF,0xE0,0xCE,0xE8,0x54,0x0C,0xAA,0x41,0xB1,0xA0,0x80,0x1A,0x73, +0x7F,0xBD,0xB6,0x85,0x8C,0x80,0x09,0x39,0x71,0x2D,0xBD,0xA4,0xE1,0xC0,0x3A,0x5F,0x05,0x79,0x60,0xEA, +0xEA,0x06,0x0D,0xF7,0x13,0x2B,0xE3,0xB9,0xA2,0x41,0x4D,0x6B,0x42,0x5C,0xE8,0xE2,0x85,0x23,0x00,0x44, +0x62,0x68,0x90,0x65,0x52,0x05,0xD0,0x64,0x52,0x64,0x4D,0x4A,0x17,0xB1,0x60,0xF7,0x6C,0xA5,0xB0,0xC3, +0xC6,0x02,0xD8,0x74,0x53,0x65,0xD1,0x5F,0x92,0xF2,0xB1,0x83,0x38,0x67,0xF2,0x69,0x1E,0x76,0xD1,0x65, +0xD2,0x66,0xCC,0x97,0x69,0x4B,0x09,0x55,0xE3,0x6B,0x99,0x75,0x30,0x0B,0xD9,0x75,0xD3,0x67,0xA9,0xE0, +0x08,0xF3,0x0B,0x7E,0xBB,0x2E,0xC0,0xDE,0x7B,0x2A,0xEC,0x37,0x8C,0xFC,0xE5,0xE2,0x62,0x99,0xF2,0x9E, +0x18,0x4B,0x40,0xB8,0x2F,0x86,0xFB,0x9C,0x8F,0xD6,0x03,0x7B,0x2F,0x1A,0xCB,0x9F,0xFB,0xD5,0x29,0x1D, +0x2F,0x58,0xCD,0x22,0xDC,0x24,0x24,0xE8,0xD1,0x0E,0xB3,0xCD,0x76,0x24,0x21,0xD1,0x8F,0x84,0xA5,0x8E, +0x90,0xEC,0xB2,0x0E,0xA0,0xF7,0xB2,0x8A,0xB0,0x6D,0x26,0x95,0x6A,0x0E,0xD2,0x6C,0x5A,0x6C,0x70,0xA7, +0x0D,0x0D,0xCA,0x5C,0x1B,0x2D,0x9A,0x78,0x3B,0xB8,0xDA,0x7C,0x5B,0x6D,0xC7,0xCD,0x8A,0x9F,0x53,0x4D, +0x9A,0x2E,0x53,0x51,0x2B,0xB1,0xD3,0x6D,0xDA,0x6E,0x58,0x66,0x9B,0x4D,0xCB,0x5D,0x9B,0x2F,0x5A,0xFD, +0xCB,0xDE,0xDB,0x7D,0xDB,0x6F,0x04,0x80,0x78,0xF8,0x44,0x80,0x78,0xBD,0xC9,0x80,0x66,0x70,0xE2,0xE2, +0xD6,0x3C,0xDE,0xB0,0x26,0xE9,0x77,0x10,0x35,0xF9,0x26,0x52,0x1A,0x55,0x9C,0x8C,0x90,0x8E,0x4F,0x28, +0x82,0x11,0x78,0x7E,0x43,0xCD,0xE3,0x23,0xE1,0x2A,0xE1,0x58,0xCE,0x30,0x02,0x1D,0x92,0xD1,0xB7,0x6A, +0x46,0x71,0x66,0x4E,0x96,0x5F,0x5D,0xB5,0x81,0x86,0x7F,0x86,0x80,0x5A,0xC4,0xC4,0x32,0x34,0x24,0xC6, +0x80,0x12,0xD4,0xE4,0x72,0x74,0xEB,0xD9,0xF3,0x45,0xCC,0xD4,0x33,0x35,0x5C,0x86,0x47,0x1B,0xDC,0xF4, +0x73,0x75,0x31,0xE5,0x76,0x06,0xC5,0xC5,0xB2,0x36,0x55,0xA7,0x40,0x57,0xD5,0xE5,0xF2,0x76,0x6A,0xDC, +0x24,0xB0,0xCD,0xD5,0xB3,0x37,0x2B,0xB7,0x45,0x15,0xDD,0xF5,0xF3,0x77,0xDC,0x84,0x1B,0xDA,0x06,0x9E, +0x3E,0x78,0xD6,0xA9,0x33,0x43,0x97,0x28,0x78,0xE9,0x6E,0xD8,0x27,0x14,0x4E,0x9C,0x43,0x3D,0xA1,0x4E, +0xEB,0x51,0x8D,0x41,0x69,0x37,0xC5,0xFF,0x8B,0x45,0x2A,0x09,0xBC,0xB7,0x55,0xD7,0x0F,0x4A,0x20,0xA4, +0xFE,0x7A,0x05,0x91,0x0A,0x16,0xE3,0x5A,0xBB,0xCE,0x92,0x49,0xE1,0x54,0xEF,0xFB,0x5B,0x85,0xEE,0x6E, +0x2C,0x5C,0xC6,0xCC,0x3A,0x3C,0xD6,0x12,0xEF,0x7B,0xD6,0xEC,0x7A,0x7C,0xCE,0x5C,0x2B,0x8C,0xCE,0xDC, +0x3B,0x3D,0x4D,0xBE,0xC9,0x13,0xDE,0xFC,0x7B,0x7D,0x3C,0x8F,0x00,0xE5,0xC7,0xCD,0xBA,0x3E,0x88,0x89, +0xEC,0x5E,0xD7,0xED,0xFA,0x7E,0x75,0x26,0xAD,0x1F,0xCF,0xDD,0xBB,0x3F,0x2B,0x7D,0xEF,0x58,0xDF,0xFD, +0xFB,0x7F,0x7E,0x1F,0x54,0x2B,0x98,0xD6,0xE9,0xAF,0x50,0x66,0x38,0x4B,0xE8,0x32,0x37,0x7C,0xD7,0x16, +0x05,0x59,0xAC,0xF4,0x97,0xA9,0xAB,0xD0,0xC7,0xC9,0x09,0x88,0xE9,0x16,0x04,0x03,0xEF,0xA6,0xC1,0x47, +0x7A,0x29,0x35,0xC1,0x46,0x8A,0x48,0xC8,0x54,0x62,0x96,0xEE,0x95,0xE0,0x5C,0xF5,0x95,0x08,0xB4,0xD1, +0x47,0xCB,0x16,0x58,0x08,0x3F,0x60,0x7A,0xFA,0xB4,0xE0,0x46,0x16,0xA4,0xC7,0x6B,0x40,0xC4,0xF0,0x66, +0x56,0xE4,0xED,0x54,0xCF,0xD5,0xE8,0x56,0x17,0xA5,0x0C,0xF6,0x43,0xC2,0xF8,0x76,0x57,0xE5,0xA1,0x43, +0xF6,0x22,0xE1,0x47,0x96,0xA6,0x62,0x25,0x64,0x88,0xF1,0x67,0xD6,0xE6,0xCD,0xAE,0x07,0x5C,0xE9,0x57, +0x97,0xA7,0xB9,0x76,0xD7,0x86,0xF9,0x77,0xD7,0xE7,0xC2,0xBC,0x8B,0x8F,0x04,0x0F,0x1C,0xA1,0xBB,0xC8, +0x7F,0x8A,0x0B,0x70,0xDF,0xE6,0xBA,0x1E,0x10,0x0B,0x2A,0xE4,0xFC,0xD6,0xC5,0xD2,0x4F,0x04,0xBB,0x21, +0x45,0x7D,0x8B,0xA9,0x53,0x65,0xDE,0xEF,0x73,0xE8,0x89,0xD5,0xDC,0x07,0x53,0x10,0xF8,0x3E,0xBB,0xF9, +0x21,0xCA,0xD4,0xE5,0x62,0x74,0x40,0x33,0x28,0x74,0x3A,0x24,0xC1,0xA5,0x63,0x8C,0xAC,0xC9,0xE2,0x4E, +0x1E,0xAC,0xDA,0xC9,0x31,0x6C,0xF2,0x6E,0x5E,0xEC,0x81,0xAD,0x09,0x8D,0xEA,0x5E,0x1F,0xAD,0xFC,0xBC, +0xED,0x81,0xFA,0x7E,0x5F,0xED,0x11,0xEE,0x0B,0x89,0xE3,0x4F,0x9E,0xAE,0xB3,0x6B,0xBE,0x35,0xF3,0x6F, +0xDE,0xEE,0x3C,0x84,0x2C,0xF1,0xEB,0x5F,0x9F,0xAF,0x0B,0xA4,0x78,0x81,0xFB,0x7F,0xDF,0xEF,0x2E,0x02, +0x87,0x96,0xA0,0xC1,0xB5,0xBE,0x6B,0xA0,0x17,0xD0,0x4D,0xE0,0x9E,0x54,0xEA,0x64,0x16,0x93,0xF2,0x05, +0x31,0x1A,0xFC,0xB3,0x3E,0xCA,0x18,0x4A,0xF5,0x0A,0x6D,0x11,0x05,0x89,0x06,0x11,0x68,0x54,0xEA,0xA3, +0x93,0xDE,0x30,0xA1,0x3C,0xA2,0xF7,0xF1,0xB5,0x58,0xCF,0x93,0x54,0x1C,0x7B,0xCC,0x81,0x1C,0xBF,0x71, +0x57,0xB6,0x77,0xFD,0x32,0xD6,0xE4,0xC6,0x36,0xB4,0xB4,0xE7,0x76,0x95,0xF4,0xE6,0x76,0xF4,0xAC,0xD2, +0x57,0x31,0xEC,0xD6,0x37,0xB5,0xBC,0xF2,0x17,0x2E,0xFC,0xF6,0x77,0xF5,0x65,0xFB,0x5A,0xE6,0xE5,0xC7, +0xB6,0xB6,0xDD,0x40,0x99,0x76,0xF5,0xE7,0xF6,0xF6,0x68,0xD5,0x6F,0x87,0xED,0xD7,0xB7,0xB7,0x7C,0x35, +0x45,0x92,0xFD,0xF7,0xF7,0xF7,0x26,0x62,0x62,0x55,0x45,0x7D,0xE2,0x13,0x77,0xD4,0x0A,0x17,0xC4,0x0B, +0xD8,0x1F,0x16,0x8A,0x4A,0x9C,0xD0,0xA8,0xD6,0x5C,0x26,0xB3,0x5E,0x1B,0xC4,0x3A,0x7D,0x4A,0xD8,0x63, +0xAA,0x99,0xC0,0x87,0x57,0x2C,0x36,0xDD,0xFE,0x12,0x63,0xE9,0x5E,0x04,0x0F,0x9F,0xCA,0x92,0xF1,0xAC, +0xA9,0x14,0x85,0xAF,0x60,0x5D,0x54,0xC4,0x62,0xC6,0xC2,0xA8,0x82,0x63,0xE6,0xCE,0x3E,0xBC,0x04,0x4F, +0xEB,0xDB,0xF6,0xEE,0x7E,0xFC,0x17,0x9C,0x8D,0xD3,0xEE,0xDE,0x3F,0xBD,0x96,0x59,0x90,0x9C,0xFE,0xFE, +0x7F,0xFD,0xA7,0xCB,0xDE,0xE0,0xE7,0xCF,0xBE,0xBE,0x98,0x1C,0x6B,0xD9,0xF7,0xEF,0xFE,0xFE,0x1B,0x5F, +0xAB,0x98,0xEF,0xDF,0xBF,0xBF,0xD7,0x58,0x90,0x1F,0xFF,0xFF,0x57,0x3D,0xAD,0x7F,0x9D,0x5C,0x94,0xDC, +0x38,0x84,0x88,0xCF,0xBB,0xDB,0x46,0x65,0x2D,0xC0,0x2B,0x17,0xE0,0xAE,0x84,0x85,0x18,0x52,0xBF,0x95, +0xB5,0xE2,0x67,0xCB,0xB0,0xE2,0xBA,0x4F,0x58,0x46,0x95,0x2F,0xB8,0x8F,0x11,0xA5,0x8C,0x03,0xC1,0x56, +0xF5,0xE3,0x01,0xE2,0x88,0x6F,0x8F,0xB8,0x97,0x7A,0xAE,0x85,0x18,0x3E,0x66,0xCB,0xD7,0x3A,0x80,0xC4, +0x37,0xDE,0x2C,0xD7,0x6A,0x2C,0x47,0x20,0x1E,0x5F,0xC1,0x17,0x62,0x08,0xD0,0xA3,0x35,0xA8,0x37,0x27, +0x39,0x4B,0x0C,0xB7,0x9D,0x4D,0xFC,0x9A,0xBA,0x74,0xED,0x32,0xE4,0xA0,0x02,0xAD,0x52,0x6B,0x73,0x07, +0x3D,0xEB,0xB7,0xAC,0xD3,0x26,0x1F,0xC3,0x83,0xA8,0x2E,0x15,0x9F,0x8A,0xDD,0x02,0xE9,0x08,0xCF,0x17, +0xBB,0x6A,0x64,0x0E,0xF7,0x83,0x0D,0x7F,0x31,0xAA,0x3D,0xD0,0x48,0x0A,0x5E,0x5F,0x7E,0x06,0xE6,0x77, +0xD7,0x54,0xED,0xDC,0x53,0x84,0x24,0x88,0xF6,0xD2,0xA4,0x98,0xD6,0xEF,0x87,0x9A,0x04,0xD5,0xFC,0x7E, +0xB6,0x46,0x95,0x0D,0x10,0x09,0xF1,0x2D,0xD9,0xBA,0xE8,0x59,0xD5,0x10,0x97,0x2D,0x6E,0x94,0x1B,0xC0, +0x85,0xB4,0x9F,0xFD,0xDD,0x43,0x17,0x09,0xAC,0xAC,0x96,0xAA,0x52,0xB6,0x4E,0xEC,0xA3,0x6F,0xAC,0x40, +0xB3,0x9D,0x11,0x58,0x63,0x00,0x56,0xED,0xE7,0xEE,0xDA,0x19,0x69,0xE0,0x05,0x1E,0xB8,0x64,0x13,0x3A, +0xAF,0xB1,0x03,0x21,0x8A,0x6C,0xBF,0xFA,0xB6,0x44,0xC5,0x45,0xDC,0x57,0xB4,0x23,0x8D,0x56,0x78,0xEC, +0x9D,0x15,0x0A,0x8B,0xE8,0x2F,0x5B,0x7E,0xB7,0xC2,0x19,0x0A,0x26,0x49,0x28,0x1B,0x33,0xF2,0xAC,0x67, +0xA2,0x50,0x44,0x63,0xB2,0x70,0xEF,0x7E,0x12,0x26,0x73,0xE7,0x17,0x5D,0xA4,0x4F,0x88,0xCB,0xDE,0x4F, +0x98,0x12,0xE5,0x6E,0xC3,0x72,0xBB,0xE1,0xD0,0xED,0x5D,0xA8,0xD3,0xA9,0x9D,0x3C,0x19,0x5B,0xB5,0x6E, +0xD6,0x13,0x6A,0xD5,0xB5,0x1B,0xFA,0xF1,0xA5,0xFE,0xFA,0x75,0xB3,0x31,0x96,0x30,0xDD,0xB7,0x9A,0xF8, +0xCC,0x9F,0x85,0x13,0xE6,0xDF,0x45,0x60,0x4B,0x80,0x9C,0x17,0xE1,0x15,0x93,0x2B,0xCF,0xC4,0xF8,0x92, +0x94,0xF8,0x4D,0x70,0x46,0x66,0x13,0x32,0xC8,0xBB,0x52,0x3F,0x8D,0xC6,0xA0,0x50,0xD8,0xF9,0xAA,0x15, +0x41,0xD7,0x05,0xD5,0x8A,0x14,0x7E,0xE9,0xB5,0x8D,0x0F,0x36,0x3D,0x5F,0xC2,0x95,0xF5,0xFC,0x2D,0xE6, +0xF9,0xA4,0x19,0x08,0x0D,0xCE,0x85,0xEF,0x66,0xF7,0x0F,0x33,0x12,0xDB,0xFB,0x70,0xDB,0x54,0x82,0xE1, +0x71,0x3A,0xDA,0x68,0x17,0xF6,0x4C,0x23,0x92,0x2A,0xBA,0xD2,0xAE,0xDA,0xD1,0x3C,0x53,0xD9,0x84,0xDA, +0x90,0x38,0xE9,0x18,0x75,0xD7,0x70,0x61,0xA9,0x59,0xB1,0xF9,0xD9,0x1B,0x88,0xCB,0x02,0x58,0xA1,0x0C, +0x2F,0xD4,0x78,0x6D,0xA5,0x9A,0x42,0xBE,0xD1,0x2D,0x99,0x9B,0x08,0x32,0x28,0xDD,0x46,0x3E,0x1E,0x5C, +0x1E,0xEB,0x05,0xED,0x0B,0x7F,0x9A,0x06,0x96,0x31,0xA7,0xCD,0x47,0x3F,0x47,0x09,0xAE,0x37,0xD7,0xE8, +0xE6,0xB5,0xB4,0xA9,0xF1,0x83,0xCA,0xF2,0x05,0xF5,0x19,0x68,0x40,0xFC,0x56,0x7F,0x1A,0xB5,0x9B,0xC5, +0x00,0x7C,0x46,0x55,0x86,0x74,0xD5,0x86,0x3D,0x96,0x9E,0xA3,0x99,0x16,0xEB,0x22,0x42,0x00,0x2F,0xA2, +0x61,0x3A,0xD5,0xE2,0x09,0x27,0x96,0xA2,0x69,0x0E,0xA8,0x2D,0x3D,0x5A,0x86,0x0F,0xD8,0x83,0x8D,0x71, +0x4E,0xC6,0xA9,0x03,0x9D,0x5B,0xC4,0x3A,0xC2,0x22,0xBD,0x5A,0x9C,0xE1,0x8D,0xFD,0x83,0xDA,0xF8,0x69, +0x15,0x22,0x39,0xCA,0x8D,0x3F,0xC7,0x0A,0x3C,0x52,0x6C,0x31,0x28,0xEA,0xD6,0x44,0x4E,0x09,0x4E,0xD7, +0xA5,0xCD,0xE1,0x76,0xBD,0xD5,0xA8,0x3E,0xB5,0x73,0xE0,0x42,0x11,0xFC,0x46,0xD3,0xC8,0x33,0xB5,0xB6, +0x24,0x48,0x03,0x43,0x87,0xA4,0xB5,0x80,0x5C,0x57,0xF4,0xE7,0xF3,0xBF,0xCF,0x4E,0x5B,0x40,0x21,0x5E, +0x81,0xDE,0xE8,0xD3,0xBA,0x04,0x31,0x77,0xEE,0xC4,0xEC,0x46,0x76,0x46,0xC2,0xF5,0x6F,0xE8,0xA4,0xAE, +0xF5,0xE1,0x8F,0x75,0x3B,0xC8,0x76,0xAB,0x52,0x62,0xCD,0x74,0xDB,0x81,0xF8,0xE1,0x1B,0xF0,0x3B,0xBE, +0x01,0x88,0xAD,0xA1,0xB6,0x58,0xC0,0xF5,0x03,0xF7,0xB1,0xF0,0x63,0x27,0xF3,0x3F,0x72,0x71,0x74,0xD0, +0x51,0x47,0x2C,0xF3,0x3B,0xC9,0x23,0x9B,0xA8,0xBC,0x9C,0x07,0xFE,0x4D,0x7B,0x53,0x80,0x46,0xA9,0x39, +0x68,0x3D,0xE4,0xEE,0x16,0xA1,0x6E,0x46,0x48,0x95,0xCA,0x9D,0x62,0xAE,0x3A,0x4B,0x2D,0x06,0x5D,0xEA, +0xEB,0x0E,0x62,0x8E,0x49,0x94,0xA2,0x17,0x59,0x64,0x1D,0xE7,0x7F,0x8A,0x73,0xBF,0x96,0xA1,0x72,0x09, +0xAF,0xEE,0xEE,0x82,0x7F,0x61,0x90,0x6A,0xE9,0x20,0x2B,0x02,0xD7,0xEE,0xE6,0x8B,0xCD,0x6E,0x06,0x8F, +0x30,0x4E,0x39,0xA9,0xD3,0x65,0x5B,0xF4,0x32,0xE9,0x0A,0x02,0xE9,0x56,0xE1,0xE7,0xD2,0x50,0xF9,0x7A, +0xF5,0xDC,0xCE,0x96,0x34,0x53,0xC3,0x41,0x0B,0x7E,0x6E,0x45,0x13,0x7C,0x29,0xA7,0x45,0x3D,0xA9,0xF4, +0x9A,0xDC,0x34,0x63,0x60,0x59,0xE5,0x57,0xF0,0x53,0xC1,0x01,0xA5,0x99,0x93,0x32,0x3A,0x35,0x6C,0xC0, +0xC7,0x54,0xEB,0x06,0x1E,0x50,0xBF,0xC2,0xCF,0x57,0xE7,0xA6,0x3A,0xB5,0x98,0x71,0x12,0xDE,0x33,0x16, +0x99,0x55,0xD7,0x63,0x4D,0x3A,0xE9,0x76,0x13,0x75,0x83,0x81,0x4D,0xB9,0x03,0x72,0x24,0x5A,0x73,0xA7, +0x4D,0xC5,0x75,0xD3,0x94,0xD7,0xF4,0x67,0xDF,0x8A,0x60,0x63,0xCF,0x02,0x38,0xD1,0xAA,0xD5,0x05,0xF2, +0x32,0xF6,0x9A,0x33,0xEE,0x95,0x0A,0xF3,0xFD,0x99,0xA6,0xEB,0x4E,0xDA,0xA2,0x4E,0x38,0x90,0x37,0xAA, +0x6D,0x98,0x76,0xC2,0xCE,0x94,0x89,0x2E,0x2B,0xC0,0x36,0x6D,0x0F,0x14,0x45,0x8B,0xCC,0xB2,0xA2,0x2E, +0x82,0x54,0xEA,0x7D,0x78,0x39,0x38,0xFC,0xDA,0x1C,0x3B,0xD6,0x6E,0xD3,0x50,0x6F,0xAE,0x57,0x69,0x68, +0xCF,0x36,0xF9,0x0D,0xBD,0x14,0x2B,0xA3,0xC5,0x98,0x6B,0xF8,0x23,0xF1,0xFF,0xC2,0x8F,0x15,0xC6,0xDB, +0x76,0xAD,0x6B,0xA4,0x91,0x71,0xC8,0xD7,0xBC,0x7D,0x3E,0x5E,0x16,0xC1,0x03,0x7E,0x13,0xFD,0xFE,0xF8, +0x13,0x9F,0xB6,0xEA,0x1C,0x02,0x63,0x2B,0xAA,0xB7,0xD9,0xE7,0x5C,0x4E,0x23,0xAC,0x30,0xD4,0xC9,0xD7, +0x3C,0xFE,0x11,0x7A,0x20,0x39,0xCB,0xF2,0x5E,0x10,0x62,0xB5,0x04,0xFC,0x81,0xC7,0x14,0x4E,0x3E,0x39, +0xE3,0x0B,0x8D,0xC7,0xC4,0xB1,0x0D,0xDD,0xE1,0xBF,0x93,0x37,0x71,0x0B,0x50,0x99,0x07,0xA8,0x9D,0x2B, +0x21,0x63,0x8F,0x01,0x71,0x03,0x2F,0x50,0x57,0x98,0x85,0x72,0xF0,0x8D,0x26,0x3C,0xB4,0x97,0x63,0xDE, +0xCA,0xEF,0xAB,0xCA,0xAB,0x42,0x8F,0x95,0xB8,0x48,0x80,0x46,0xF2,0xD1,0x04,0xCC,0x28,0x52,0x3B,0x24, +0xB2,0x67,0x65,0x5E,0x77,0xF0,0xC9,0x17,0x14,0x1D,0x18,0x71,0xB7,0x4B,0xCD,0x73,0xAD,0xC9,0x18,0x32, +0x3F,0x69,0xDD,0xD0,0x50,0x62,0xE7,0xE2,0xE2,0x98,0x74,0xEB,0x52,0xA7,0xDE,0xA9,0x89,0x4B,0x5A,0x37, +0x31,0xD3,0xE5,0x1E,0x61,0x2A,0xC4,0xE1,0xE7,0x25,0x77,0x2C,0x41,0x03,0x93,0x98,0xFB,0x16,0x3B,0x6C, +0xC2,0xC7,0x83,0xB8,0xBB,0x56,0x38,0xEA,0xE1,0xF9,0x94,0x25,0x3C,0x6A,0xD2,0x41,0x7F,0xE5,0xBD,0x3F, +0x07,0x03,0xD5,0xE8,0x01,0x4B,0xF9,0x98,0x01,0x6F,0xDA,0x51,0x76,0xB4,0x82,0xFC,0x61,0xC4,0x15,0x21, +0x8E,0x33,0xC8,0x46,0x1A,0x56,0x02,0xCB,0x48,0xEA,0xAD,0xC8,0x57,0xCC,0x16,0xF5,0xEA,0x2B,0x8B,0x1D, +0x99,0x2B,0x63,0x28,0xF1,0x6F,0xD4,0x5D,0xC5,0xC4,0x7C,0x34,0xC8,0x0C,0x02,0x25,0x3D,0x21,0x0C,0x05, +0xB5,0x0D,0x12,0x05,0x7D,0x61,0x4A,0xA9,0x76,0x09,0x90,0x5D,0x6C,0x2D,0x22,0x32,0xB6,0xC1,0xC7,0x00, +0xBA,0x62,0x0B,0x5D,0xE1,0xD7,0x3C,0xBF,0xBB,0x5C,0xE8,0x3B,0x79,0xC4,0xA9,0x0D,0xC6,0x2C,0x12,0x53, +0x2E,0x8E,0xE2,0x22,0x0A,0x3F,0x11,0x64,0xDA,0xE0,0xBB,0x32,0x0E,0x62,0xE6,0x40,0x77,0x52,0x68,0x17, +0x67,0x3A,0xCB,0xC2,0x83,0x59,0x92,0x41,0xF0,0x7E,0x54,0x55,0x27,0x98,0x50,0x10,0x62,0x92,0x62,0x99, +0x88,0x60,0x81,0x0A,0x42,0x41,0x18,0x6C,0x01,0x9D,0x45,0xBE,0xD3,0xC7,0x41,0xD2,0xD0,0xD2,0xF5,0xEA, +0x02,0x30,0xF0,0x79,0x67,0x5E,0x4D,0xF9,0xFB,0xCC,0xB1,0x59,0x7D,0x95,0x5D,0xBC,0x8F,0x75,0xDF,0x42, +0xA2,0x5F,0xD8,0x46,0xB2,0x3F,0xD4,0x83,0x86,0xFB,0x8D,0x4A,0x11,0x46,0x33,0xEF,0x5A,0xC0,0x08,0x04, +0x3B,0x34,0x3A,0x39,0x62,0x15,0x9F,0x12,0x40,0xE2,0x7D,0x93,0xE1,0xE6,0xFD,0x97,0xBC,0x54,0x40,0x92, +0xDA,0x3A,0x2D,0x0D,0x4C,0xFD,0x56,0x55,0xD9,0xB3,0xF5,0x05,0xB5,0x0E,0x61,0xC7,0x0A,0x46,0x87,0x65, +0x54,0x6C,0x74,0x89,0x70,0x76,0x46,0xF1,0x4A,0x98,0x5E,0x98,0x6E,0x61,0x3B,0x16,0x7E,0x21,0x30,0xA0, +0xEB,0x39,0x52,0x9E,0xA2,0x9D,0x89,0x89,0x59,0x1B,0x5E,0xD5,0x97,0x3B,0x39,0xB0,0x6A,0x12,0xDD,0x8F, +0x55,0x9A,0xCA,0xCB,0x17,0xF7,0x4E,0x2F,0x65,0xED,0x47,0x1C,0x29,0x6B,0xC0,0x6D,0x50,0xB0,0x02,0x44, +0x48,0xA2,0x9E,0xB6,0x18,0x8A,0xE5,0xB0,0xF6,0xA5,0x60,0x37,0xD3,0x2D,0x48,0xC1,0x49,0x1C,0xF0,0x68, +0x4F,0x8B,0x04,0xC5,0xD0,0xE8,0xA9,0x9B,0xF9,0x7D,0x48,0xD1,0x6D,0x64,0xC5,0xE3,0x02,0x66,0x27,0xCB, +0x8D,0x13,0x07,0xA1,0x9C,0x52,0x6B,0xCF,0x89,0xAC,0x17,0x94,0x64,0xAA,0xD0,0xE7,0xDE,0x5D,0x87,0x8D, +0x46,0x94,0x87,0x9B,0xC8,0x1F,0x93,0x9B,0xC8,0x9B,0x58,0x00,0x44,0x20,0xC0,0x49,0x95,0xE2,0xE5,0x33, +0x74,0xE4,0xEA,0xCB,0xAB,0x6D,0x39,0x73,0x8D,0x0C,0xA8,0x16,0xF4,0xA7,0x06,0x1A,0xC8,0xDA,0x27,0x20, +0xBC,0xA8,0x34,0x62,0x64,0x22,0xA4,0x81,0x94,0xA2,0xA2,0x51,0x2F,0xD3,0xCE,0xDA,0x2B,0xA0,0x57,0x3B, +0x6C,0x92,0x04,0xB9,0x36,0xC6,0x9C,0xA5,0xC6,0x9B,0xFB,0xC8,0x3C,0x39,0x40,0xBD,0x14,0xC9,0xC0,0x57, +0x9B,0xC7,0xED,0x73,0x7B,0x85,0xB2,0x84,0x1E,0xD5,0x56,0x2F,0xD9,0x28,0x95,0xA9,0x24,0xA3,0x69,0x35, +0x8D,0xFF,0xD4,0x41,0x73,0x71,0x33,0xBC,0x71,0xE8,0x4A,0xE2,0x43,0xB8,0x4B,0x90,0xF6,0x6B,0xDD,0x34, +0x9E,0xF7,0xF2,0xCD,0x86,0xA5,0x51,0x0B,0x30,0xB7,0x71,0x77,0x6E,0x92,0x2B,0x6C,0xB9,0xE1,0x8E,0xE2, +0x90,0x4E,0xDA,0x1D,0x43,0xC3,0x68,0xB7,0x24,0xD9,0x1E,0xB1,0x5F,0x78,0x28,0xE9,0x35,0x24,0xB2,0xDE, +0x3D,0x0D,0x22,0x82,0xA4,0x38,0xBE,0x4C,0xA6,0x12,0x6B,0x76,0x65,0x9B,0x9D,0xEA,0x13,0x0C,0xF3,0x42, +0xEB,0xC7,0x95,0xF3,0xBF,0x91,0x3E,0x5C,0xBE,0xFF,0xE4,0xEF,0x74,0x20,0x2D,0x13,0xCB,0xF2,0xBF,0xBB, +0xA0,0x2F,0xC1,0x36,0xD2,0x75,0x5A,0x13,0xB9,0xB7,0xB2,0x03,0x3B,0xC1,0xD2,0x37,0xFF,0x60,0xF5,0xA9, +0x72,0x06,0xB2,0x36,0x19,0x94,0x20,0xB7,0x49,0xF4,0x7A,0xBE,0x1D,0xF6,0x43,0x46,0x6F,0x2F,0xAF,0x29, +0xFF,0x8E,0x2B,0x6F,0x67,0x0B,0xB9,0x6A,0x51,0x68,0x6F,0xEA,0xFA,0x20,0x70,0x3D,0x60,0xA6,0x23,0x19, +0x2C,0xC6,0x8E,0x8F,0x91,0xA0,0xC8,0xF1,0x5C,0x16,0x48,0x15,0x63,0xBA,0x6C,0x22,0x8D,0xE1,0xCA,0xDF, +0x81,0x73,0x2C,0x52,0x61,0x1A,0x2F,0x65,0x1A,0x1C,0x42,0x9F,0x63,0x78,0x11,0xF4,0x73,0xC8,0x75,0xF0, +0xD4,0x14,0xB6,0xF4,0xEB,0xBB,0x23,0xC1,0x8C,0xDF,0xB1,0x54,0x85,0xF4,0xD2,0x60,0xD5,0x3C,0x35,0x65, +0xF5,0x4C,0xBB,0x37,0xDC,0x98,0x4E,0x5F,0xED,0xB1,0x33,0xD1,0xF2,0x4D,0x9C,0xC2,0xD6,0xCB,0x48,0xC4, +0x9E,0xE5,0xA4,0x84,0x6A,0xB9,0x5F,0xAE,0xDB,0x2C,0x56,0x27,0x94,0xD5,0x10,0x1A,0xEB,0x98,0x21,0xF4, +0x40,0xF5,0xC2,0xBE,0x5E,0x6F,0x54,0x25,0x85,0xA2,0xC2,0xCB,0xE0,0xEE,0x8E,0xEF,0x53,0x49,0xDE,0xAB, +0xA1,0x7E,0xDF,0x28,0x3A,0xCA,0x6F,0x72,0x1C,0xC5,0xDD,0xF2,0xF1,0xAE,0x31,0xF9,0x54,0x17,0x9C,0x61, +0x47,0x47,0x0C,0x48,0x24,0xE9,0xB3,0x13,0xFE,0x84,0x54,0x7A,0x09,0x34,0xB2,0x0E,0xC2,0x14,0x1E,0x84, +0x49,0x6C,0xDE,0xF1,0xFC,0xBB,0x7F,0x8E,0x45,0x0B,0x67,0xF2,0x78,0x17,0x17,0x79,0xA4,0xCB,0x9F,0x2B, +0xC9,0xA1,0xB8,0xAA,0x9D,0xD9,0xB7,0xD8,0x63,0xB1,0x2A,0x84,0xDD,0x99,0xA2,0x08,0xFB,0xEB,0xD3,0x4E, +0x1B,0x27,0x01,0xA0,0xF4,0xB3,0xCE,0x5A,0x6E,0x43,0x01,0xD1,0x10,0x29,0x13,0xB8,0xF1,0x9B,0x2E,0xB7, +0xA7,0xD3,0x1D,0x3A,0x5D,0x68,0x5D,0x82,0xA3,0x04,0x98,0x8C,0x2C,0xA2,0xAF,0xF7,0x57,0x8F,0xDB,0x94, +0x34,0x03,0x25,0x6B,0x87,0x88,0x42,0x31,0x0E,0x49,0x88,0x1F,0x93,0xFD,0x6E,0xC4,0xD7,0x9D,0x6F,0xFF, +0xFF,0xFF,0x3A,0xF3,0x34,0x1B,0x4F,0x64,0x03,0x4C,0x03,0xDB,0xB1,0xE3,0x30,0x56,0x3A,0xB1,0xF0,0xE3, +0x31,0xAC,0x77,0x66,0xD3,0x21,0x50,0x34,0x69,0x3B,0x89,0x05,0xF0,0xC0,0xA4,0xF7,0xB3,0xA8,0xBF,0x65, +0x5A,0xD8,0x84,0xA5,0xF5,0x63,0xEF,0x22,0xF4,0xCF,0x18,0x56,0x4B,0x2A,0x26,0x25,0x99,0x9C,0x27,0x18, +0xE0,0x61,0xA1,0x05,0x3E,0xCC,0xE0,0x33,0xA1,0x87,0xF8,0xB7,0x30,0x91,0x68,0x9E,0xEE,0x49,0x81,0xA3, +0xBB,0xF5,0x12,0xAA,0x6B,0xC6,0x80,0x5F,0xC7,0x54,0x4B,0x83,0xC7,0xCE,0xBE,0x4D,0x52,0x35,0xF4,0xB2, +0x0E,0x47,0x50,0x7A,0xA2,0x64,0xC1,0x91,0x31,0xE7,0xB7,0x59,0x3B,0x17,0x37,0x57,0xE0,0xF0,0x6E,0x6D, +0x1E,0x8A,0xAE,0xC0,0xFF,0xE8,0xEE,0x49,0x23,0xD6,0x0A,0x0C,0x20,0xB1,0xB8,0xB1,0xEB,0x44,0x48,0x35, +0x20,0xD9,0x32,0x5E,0x3A,0x74,0x74,0x1E,0xE8,0x8A,0x75,0x6E,0xDB,0x29,0x4C,0x15,0x4F,0x10,0x27,0xA3, +0xA6,0x34,0x59,0x8F,0xE0,0x1B,0xBD,0xD1,0x52,0x90,0x6D,0x2F,0xAB,0x3D,0xED,0x2A,0x79,0x2B,0xBA,0xEA, +0x05,0x06,0x24,0x2D,0x91,0xD7,0x8A,0xF9,0xCD,0x6A,0x78,0xC3,0x7C,0xD4,0x14,0xF9,0xE1,0x68,0xD1,0xDE, +0x1B,0x81,0xF6,0x4C,0xA3,0x08,0x65,0x54,0xAE,0x1D,0x34,0x5E,0x68,0x7A,0x4A,0x3D,0xC6,0xD8,0xFE,0xDD, +0xBC,0x21,0xE9,0x51,0xA7,0xBC,0xD3,0xB9,0x88,0xFF,0x56,0xDF,0x9A,0x24,0x45,0x0B,0x35,0xE3,0xF3,0x65, +0x22,0xFF,0x98,0xAA,0x07,0x02,0x5A,0xD9,0x9C,0xD6,0x61,0xE6,0xEF,0xE2,0x68,0x44,0xDD,0x75,0x84,0xA1, +0x3F,0x9B,0xDD,0x8B,0xD5,0xCF,0x5B,0xB3,0x58,0x8A,0x20,0xC6,0x8B,0x15,0xAC,0x60,0x9F,0xB2,0xB6,0x24, +0xA0,0x9E,0x0D,0xD0,0x8A,0xCB,0x63,0x90,0x12,0x73,0x45,0xB0,0xD0,0xBD,0x97,0xAE,0x5B,0x76,0x33,0x89, +0xBF,0xF6,0xAD,0x5B,0x5C,0x7F,0x98,0x62,0x2D,0x1E,0x29,0xEB,0x12,0x71,0x44,0xA3,0x1C,0x1C,0x8B,0x01, +0x1A,0x37,0xD4,0x65,0xD5,0x78,0xDC,0x49,0x01,0xBE,0x2F,0xE8,0xC7,0xEB,0xEC,0x74,0xD1,0xFF,0x9E,0xA3, +0x49,0xC3,0x73,0x93,0xE5,0x3D,0xCC,0x1D,0x3F,0xEE,0xC1,0x10,0x10,0x8A,0x7B,0x75,0x7C,0xB9,0x7D,0xF5, +0x13,0xE9,0x88,0xE1,0xD5,0x76,0x18,0xD4,0xC2,0x34,0x33,0x60,0x87,0xE2,0x8D,0xA6,0xC7,0xB1,0xCE,0x09, +0x5F,0xAC,0xA5,0xF7,0xE9,0xDA,0xF9,0x60,0xF0,0xD5,0x4B,0xA5,0x0B,0x4C,0x2C,0x40,0xB8,0x17,0xCC,0x03, +0x12,0xDB,0x46,0x9C,0x01,0x63,0x09,0x5C,0x3F,0x99,0xDE,0x71,0x81,0x1B,0xA6,0x56,0xD5,0x74,0xFC,0xF6, +0x25,0xCC,0x05,0xFB,0x35,0xBC,0xA0,0x91,0x1C,0x2B,0xE9,0xAA,0x59,0x3B,0x31,0xFD,0xEB,0xB2,0x9A,0x8C, +0xC9,0x96,0x07,0xCD,0xDA,0xDF,0xE2,0x9A,0x58,0x24,0xDE,0x34,0x2A,0xE1,0x85,0xBF,0x42,0xBA,0x7C,0x14, +0xD6,0x1E,0x86,0x3C,0x2A,0x77,0xF5,0x69,0x41,0xB2,0xD9,0xDC,0x50,0xEC,0x4F,0x8B,0x5B,0x31,0x69,0xD4, +0x7D,0x6E,0x51,0x7D,0x41,0xDD,0xC7,0x0D,0xFE,0x95,0x99,0x4A,0x0B,0xF1,0x13,0x02,0x02,0x2F,0x19,0xFD, +0x42,0xDC,0x8C,0x1A,0x52,0xAE,0x39,0x30,0xEA,0x1F,0xAE,0xBD,0xE3,0x04,0x78,0x06,0x2C,0xB9,0xF2,0x06, +0xE3,0xE2,0xFD,0x51,0x74,0xC9,0xEB,0x26,0x52,0x20,0x50,0x20,0xCD,0x8E,0x10,0xED,0x98,0x5C,0x94,0x41, +0x35,0x77,0xC7,0xB2,0x11,0x5D,0x1F,0x2B,0x4C,0xCB,0x23,0xA8,0xA7,0x59,0xF5,0x50,0xE1,0x7D,0x44,0xCF, +0x26,0xAF,0xBC,0xE0,0xF5,0x0E,0xCE,0x69,0x57,0xA3,0x46,0x40,0xF9,0x45,0x06,0x06,0xDC,0x4C,0xF0,0xB8, +0x65,0x86,0x43,0x7F,0xCA,0x75,0xA2,0x52,0x4E,0x6B,0xFA,0x79,0x2A,0x49,0x9D,0xEA,0xEC,0xE1,0x90,0x25, +0x2B,0x23,0xEB,0x9F,0x1B,0x48,0xFD,0x05,0x2B,0x8B,0x76,0xB0,0x02,0x0D,0x0D,0x34,0xE6,0x20,0x20,0x11, +0xE2,0x3D,0xA1,0xB7,0x86,0xED,0x51,0xAD,0x7A,0xEB,0xE9,0x97,0x83,0x0A,0x06,0x8F,0x7B,0x86,0x9B,0x47, +0xD6,0x15,0x5C,0x23,0xE5,0xB9,0xAA,0x02,0x2F,0x02,0x32,0xAE,0x79,0xE9,0xBE,0x50,0x36,0xE0,0xAA,0x3B, +0x34,0xCB,0xC8,0xEE,0x5F,0xE6,0xFA,0x56,0x85,0x42,0x13,0x40,0xC8,0x64,0x8F,0x98,0xA9,0x82,0xF9,0x0E, +0x3B,0xB1,0x7B,0x2F,0xE4,0xB0,0xCD,0x6F,0xF8,0x95,0xB2,0x08,0x2C,0x82,0xF2,0x0D,0x38,0x74,0x3F,0xD9, +0x05,0xFA,0xC6,0xD5,0x7C,0x74,0x81,0x6E,0x66,0x81,0x71,0xDC,0xBD,0x01,0x0C,0x6C,0xAF,0x4F,0xD2,0x7B, +0xB7,0x1D,0x14,0x5C,0xEE,0x0E,0x6A,0x98,0x3B,0x00,0x44,0x1E,0x0D,0x32,0x38,0x8E,0x2B,0x4C,0x75,0x29, +0xEE,0x91,0xF4,0xDD,0x9E,0xA6,0x5A,0x98,0x42,0x8F,0x1F,0xFD,0x5C,0xE6,0x42,0xA8,0x03,0x82,0xFE,0x8F, +0x3C,0x50,0x45,0xDF,0xEB,0x82,0x6A,0xFB,0xE6,0xA4,0x31,0xE2,0x2E,0x1B,0xB7,0xE6,0x30,0x90,0x8C,0xC2, +0x57,0x7D,0x00,0xC4,0xCB,0x5D,0x8C,0x62,0x9B,0x32,0x7C,0x87,0x05,0x91,0xBD,0xF5,0x8C,0xD8,0xC7,0x4D, +0xC8,0x00,0x61,0xB2,0xD4,0x3D,0x75,0x96,0x88,0x92,0xFE,0xD2,0xBF,0xD9,0xE0,0x95,0x0B,0x7F,0xB8,0x17, +0x90,0xC2,0x28,0xB3,0xD6,0x41,0x5B,0x6E,0x6A,0x55,0x42,0xD9,0x9F,0xFC,0x76,0x3D,0xCD,0x87,0x86,0xA6, +0xDF,0xC5,0x68,0x98,0x05,0xAE,0xF0,0xDD,0x42,0x01,0x12,0x67,0x03,0x1E,0xCC,0x8B,0xBA,0x18,0xA4,0x90, +0x8C,0x84,0xFA,0xDE,0x7E,0xCB,0x5B,0x72,0xC4,0x69,0x87,0xCE,0xB7,0xF6,0x63,0xCB,0xE0,0xEF,0xE4,0x63, +0xC4,0xE1,0x2D,0xE2,0x95,0x38,0x7E,0x45,0x17,0x1A,0x07,0x13,0xE3,0xFE,0x6D,0x85,0x1C,0xE6,0x6E,0x8E, +0x04,0xE2,0xB0,0xA6,0xD7,0xFC,0xB2,0x6A,0x5D,0xB4,0x4D,0xD5,0x46,0x47,0x3F,0xFA,0x27,0x34,0x0A,0xBA, +0x9E,0x14,0xD2,0x28,0x2D,0xD1,0x01,0x4F,0xDE,0xB9,0x19,0xEA,0xEE,0x33,0x9D,0x3F,0x00,0x15,0x09,0x77, +0x26,0x60,0x8C,0x07,0x0F,0xBB,0xB7,0x63,0xAD,0x3A,0x38,0xAE,0x85,0x14,0xBD,0xC8,0xCC,0x72,0x8D,0x8F, +0x87,0x54,0xC6,0x3A,0x90,0x3F,0xF1,0x5C,0x3E,0xB6,0x4F,0x1A,0x5F,0x7D,0xAC,0xD2,0x16,0xED,0x91,0xFE, +0x29,0xAD,0xFE,0xAD,0x03,0x3B,0x6B,0x0A,0x38,0x7C,0x12,0x6C,0x77,0xF5,0xB1,0x38,0x22,0x93,0xE4,0xBC, +0xCE,0x38,0xE6,0x01,0x4B,0x71,0x37,0x86,0xD9,0xF3,0xCD,0x59,0x32,0xC8,0x6B,0x9F,0xBB,0xBB,0xEE,0x7F, +0xDA,0xD8,0xA0,0xC0,0xCF,0xBD,0x0B,0xCE,0xDC,0x31,0x9D,0xE0,0xF9,0x71,0x97,0xE0,0x44,0x69,0xDA,0xC6, +0x73,0xC0,0x76,0x3C,0xAD,0x0C,0x95,0xF0,0xB0,0xA1,0xAE,0xB4,0x1A,0x21,0x1D,0xC4,0x60,0xC0,0xC1,0x68, +0x33,0x0F,0xF9,0x35,0xE4,0x60,0x69,0x05,0xC6,0x1B,0x26,0x0D,0xD6,0x20,0x77,0x3C,0x79,0x32,0xF1,0x66, +0xA1,0x61,0xC4,0x2C,0xBA,0xBC,0x88,0xDF,0x38,0x52,0x93,0xBE,0x8F,0xF9,0xF8,0x24,0x70,0x3F,0xE9,0xE2, +0xDF,0x98,0x21,0x06,0x30,0x64,0x99,0x10,0x17,0xA8,0x7F,0x7C,0x15,0xBF,0xC8,0xF2,0xC3,0x6A,0xFF,0xC1, +0xCF,0x76,0x27,0xEC,0x77,0xA0,0x9E,0x23,0xB1,0x96,0x69,0x89,0x04,0x09,0xA9,0x41,0x0E,0xA5,0x9C,0x61, +0x7C,0xF8,0xE4,0xD1,0xD4,0xF9,0x61,0xD1,0x2E,0xAD,0xEE,0x85,0x2F,0x0C,0xB5,0x20,0x0E,0xDB,0x9F,0xE7, +0xF1,0x99,0xCD,0xE5,0x3F,0x3D,0x6A,0x3D,0x68,0xC5,0xA6,0x8B,0x12,0x03,0xF2,0x0D,0x29,0x0D,0x64,0x10, +0xA0,0x58,0x92,0x2B,0x7D,0xBD,0x17,0x7B,0x77,0xF7,0xFB,0x2A,0x71,0xFB,0xD3,0xF0,0xC4,0xC7,0x82,0x6A, +0x1A,0x9A,0xDE,0xE9,0x96,0xFA,0x6A,0x39,0x78,0x84,0xB7,0xAA,0xD2,0x41,0xCA,0x22,0xE3,0xFF,0x7C,0xE4, +0x68,0xF3,0x75,0x64,0x1C,0x56,0x92,0x58,0x73,0x4F,0x12,0xB4,0x30,0x2E,0xF0,0xAB,0x10,0xD6,0x80,0xFA, +0xE7,0x3C,0x61,0x1A,0x08,0xBE,0xA5,0x0F,0x3D,0x12,0xB8,0x6D,0xB9,0x7A,0xD6,0x72,0xAA,0x6C,0x94,0xCC, +0x48,0x4A,0x4A,0xFC,0x57,0x0C,0xE0,0xA4,0x90,0x74,0x0B,0x6C,0x2D,0xDA,0x02,0x55,0x6C,0x49,0x0F,0xEE, +0x7A,0x30,0x0C,0x05,0x43,0x6A,0x8D,0x74,0x5A,0x91,0xB0,0xC2,0x41,0x61,0xF2,0x0C,0x87,0xC5,0x56,0x6F, +0x82,0x9A,0xDE,0xDF,0xDA,0x55,0xAB,0x98,0x83,0x11,0x84,0xB4,0xFC,0xFC,0x92,0x05,0x99,0x59,0x94,0x76, +0x34,0xBF,0x2B,0x68,0x18,0x63,0xC2,0x9F,0x82,0x30,0x9E,0xA0,0x91,0x51,0xB7,0x77,0xD2,0xE9,0x1B,0x35, +0xE2,0x67,0x7A,0x4A,0x92,0xF3,0xBC,0x86,0x0E,0x99,0x0C,0xA6,0xCD,0x99,0x1E,0x06,0xC3,0xD8,0xC2,0x14, +0x99,0xFF,0x01,0xB0,0x4F,0x8E,0xCA,0xA6,0xD8,0x06,0x99,0x18,0x61,0x18,0xAA,0x70,0x46,0x40,0x1C,0xCA, +0x45,0xBB,0x90,0x82,0x6C,0x3C,0x1F,0xFC,0xA2,0x52,0x55,0x98,0x80,0x8D,0x64,0x28,0x1B,0x6C,0xED,0xD8, +0x31,0x33,0x04,0xDD,0x44,0x4C,0x1D,0x2C,0xFF,0xFA,0x1B,0x6C,0x89,0x9A,0x90,0xA4,0x3E,0x61,0x36,0xAD, +0x6E,0xF0,0x75,0x52,0xF5,0xF1,0x54,0xA4,0x41,0x08,0xDE,0xEF,0x01,0xB3,0x0D,0xFF,0x80,0xC8,0xCD,0xCE, +0x8E,0x86,0x7F,0x94,0x28,0xED,0xF7,0xFF,0x1B,0x3E,0x43,0xB7,0xD4,0xAE,0xB7,0x3F,0x78,0x70,0xCF,0xF0, +0x8E,0x16,0xF7,0xFD,0x8D,0xCE,0x79,0x85,0x00,0x2A,0xBF,0x08,0x76,0xD6,0xC1,0x35,0x74,0xC7,0x0E,0xAE, +0xC5,0x50,0x88,0x8E,0x59,0xE8,0xA8,0xC4,0x93,0x6D,0x8E,0xA5,0xE6,0x5F,0x9B,0x5E,0xA6,0xAA,0x07,0xF2, +0x8C,0x46,0x96,0x79,0x18,0x8F,0xF2,0x4D,0xE5,0x39,0xF9,0x64,0x64,0x91,0xAD,0x01,0x99,0x13,0x7B,0x05, +0x66,0xB8,0xD3,0x99,0xAD,0x86,0xE9,0x2D,0x18,0x7D,0x7F,0x9F,0xD8,0xD5,0xC9,0xD5,0xFD,0x46,0xE0,0x6B, +0x23,0x8D,0xB1,0xF6,0x25,0x01,0x6B,0xD2,0x1A,0x61,0x61,0x3D,0x6A,0xB4,0xE8,0x7B,0xB6,0x8C,0xBD,0xC6, +0x49,0xA8,0x00,0x52,0x30,0x4A,0xAE,0x9B,0xBE,0x12,0x3F,0x2B,0xA7,0x33,0xB0,0xED,0x31,0x0D,0x20,0xA7, +0xFD,0x89,0xE2,0x28,0xAE,0x6F,0x52,0x34,0x24,0x3C,0xBA,0x86,0xAD,0x0E,0xC6,0xC0,0xBD,0x6C,0x87,0x9B, +0xB7,0x7C,0xE7,0x30,0xFD,0xC6,0xF1,0xC2,0x7F,0xC6,0x50,0x84,0xE7,0x65,0x4D,0x5B,0xA9,0xB9,0xD0,0xAD, +0x6E,0xBF,0xF9,0x64,0x77,0x43,0x5F,0x84,0xC5,0xC1,0xBE,0x89,0xDA,0x53,0x2E,0x46,0xB5,0x40,0xBF,0xA5, +0x92,0x0B,0x49,0x52,0x67,0xDD,0x22,0x99,0xD0,0xBF,0x71,0x57,0x02,0x47,0x29,0x3E,0x68,0x0A,0x46,0x11, +0xAF,0xCA,0x52,0xB7,0x97,0x1A,0x7B,0xCF,0xA9,0x29,0xB7,0xDE,0x40,0xA1,0xA1,0xD9,0x78,0x45,0xCC,0x92, +0xD1,0x45,0x7C,0x36,0xBA,0xE7,0xBB,0x9A,0x16,0x5E,0x2C,0x13,0xA6,0x8D,0xAC,0x79,0xBC,0x4F,0xB6,0xE4, +0x9E,0xC7,0xA0,0x7D,0x67,0x5F,0x4D,0x02,0xAF,0x69,0xE2,0xBD,0x9C,0xE0,0x14,0x94,0x7C,0xDD,0xF2,0x14, +0xD9,0xAF,0x01,0x8B,0x54,0x64,0xEE,0xC0,0xBE,0x6B,0x5C,0x83,0x2D,0x7C,0x79,0xAC,0xB2,0x01,0x64,0x08, +0x7D,0xD8,0x59,0x6C,0x5A,0x51,0xEB,0x25,0x2C,0x6D,0xFB,0x5C,0xF1,0xEC,0x42,0xAA,0x13,0x4D,0xC4,0xCB, +0x37,0x86,0x3A,0x40,0x6B,0x85,0x7C,0xAD,0xBA,0x0E,0x89,0xE9,0x4E,0xA1,0x58,0x30,0x2B,0x12,0x32,0xD9, +0x28,0x9F,0x4C,0xF6,0x1D,0xAB,0x51,0xAB,0x6C,0xD4,0x85,0x9A,0x36,0xFC,0xC8,0x10,0x2C,0x98,0xB5,0x02, +0x65,0xEE,0x52,0x9B,0x67,0xE0,0xE1,0x35,0x0A,0x5D,0xEE,0x9E,0x46,0x40,0x61,0xAF,0x33,0x88,0x2F,0x8E, +0xAD,0xE0,0xAF,0xC5,0x4F,0x57,0x23,0xBC,0x94,0xD0,0x8A,0xF8,0x6D,0x39,0x13,0x8E,0x9C,0x76,0xE4,0x34, +0x82,0xFA,0x3B,0xBB,0xA3,0xAA,0x75,0x67,0x4A,0xBC,0xAC,0xA2,0xDD,0x7E,0x6A,0x48,0x1C,0xE0,0xC6,0x46, +0x1B,0x29,0xF9,0x0C,0xB4,0xC8,0x8C,0x0A,0x51,0x99,0x2C,0x84,0x57,0x54,0xF5,0x99,0x21,0xAF,0x8C,0x99, +0xB6,0x11,0x1C,0xBD,0xB2,0xD8,0x0C,0xE7,0x47,0xF1,0xA5,0xBF,0x17,0xD4,0x96,0x43,0xAE,0x72,0x2C,0xFD, +0x41,0x97,0x42,0xCF,0xF0,0x7C,0xF3,0x57,0xC2,0x12,0x31,0x35,0xB1,0x8E,0x67,0xF2,0xC4,0xAF,0xC3,0x75, +0x62,0x03,0xFE,0xE8,0xCE,0xD8,0x98,0xA7,0x7F,0xB7,0x23,0xED,0xAE,0x28,0xD0,0x12,0x8B,0x4D,0xE9,0x06, +0x65,0x88,0xF4,0x7C,0x55,0x88,0x44,0xDA,0x49,0x52,0xA6,0xBE,0x94,0x0A,0x21,0xB4,0x9C,0xD8,0xBD,0x6D, +0x9D,0x7A,0x3F,0xE9,0x05,0x8B,0xE0,0x95,0x8E,0xB8,0x11,0xB3,0x20,0x1D,0xD1,0xB6,0x54,0x8A,0xF2,0x8A, +0xDD,0x99,0x28,0x40,0x14,0x28,0x46,0xDE,0x28,0xC5,0x8F,0x4C,0xA3,0xB0,0x08,0xC2,0x87,0xCD,0xAC,0x11, +0xDD,0xE7,0xAE,0x43,0x48,0xDF,0x43,0x71,0x9E,0x1C,0xF6,0x0A,0x31,0x7C,0xC0,0x86,0xF2,0x9F,0xD1,0x4F, +0xF5,0xFE,0x27,0xC6,0x7A,0xB8,0xDB,0x78,0xF5,0xD4,0x52,0x99,0xDF,0x5E,0x70,0x47,0xA9,0x85,0xBA,0x3D, +0x3D,0xC3,0x6E,0x7F,0xD6,0x94,0x87,0xDB,0x79,0x64,0x3E,0xA1,0x68,0x0D,0x20,0x76,0x72,0x5C,0x4A,0xA0, +0x3C,0xEF,0x00,0xDC,0x50,0xCF,0xF3,0xE0,0x03,0xF0,0x28,0x66,0x73,0x74,0x4C,0x36,0x89,0x42,0xC8,0xCA, +0x75,0x67,0xFE,0x72,0xA2,0x61,0xFF,0x02,0xB4,0x8D,0xB1,0x05,0x3F,0xE6,0xC5,0x5F,0xA6,0xCD,0x77,0x17, +0xE2,0x74,0xF7,0x12,0xB5,0x57,0xBD,0x15,0x28,0x72,0xB9,0x69,0x70,0x9C,0x3E,0x19,0xE3,0x87,0x90,0xDE, +0xE5,0xAF,0xBC,0xF3,0x7E,0xE9,0x19,0x8C,0x61,0x2B,0x70,0xAF,0x80,0x08,0x1D,0xA4,0x1B,0x2A,0x50,0xE4, +0x45,0x4E,0xA6,0xB8,0xB8,0x1F,0xBE,0xB2,0xD3,0x08,0xF8,0x78,0x94,0x2D,0xC0,0xE5,0xE1,0xBF,0xD0,0x3B, +0x75,0xEB,0xB2,0xD5,0xDA,0xEE,0x93,0x3E,0xEF,0x65,0xF3,0x81,0xCB,0x48,0x49,0x07,0x38,0x76,0xD1,0xFB, +0x84,0x05,0x22,0x02,0x94,0x4D,0x04,0x4A,0x28,0x22,0xB8,0xA9,0x1B,0x88,0x50,0x6C,0x61,0x18,0xB2,0x38, +0x2A,0x3D,0xB7,0xCB,0xC5,0x08,0xE4,0x3B,0xB8,0x66,0xF8,0x2E,0x29,0x4B,0x37,0x6F,0x6F,0x4F,0x6D,0x2F, +0x29,0xC9,0x03,0xDD,0x66,0xB9,0x75,0x1F,0x68,0x88,0x31,0xE2,0x70,0xF8,0x25,0x10,0xA1,0x46,0x2F,0xDF, +0xFD,0x1E,0x1B,0x53,0xEF,0xF3,0x9A,0xE1,0x79,0x0C,0x92,0x88,0x4A,0x20,0x8B,0xC6,0xFF,0x93,0xDF,0x1F, +0xEA,0xFB,0x66,0xCF,0x23,0xD2,0xC9,0xFC,0x68,0x81,0xD2,0x78,0xF3,0x5E,0x1D,0x65,0x8A,0xA1,0xBB,0xA5, +0x0E,0xE3,0x93,0x89,0xB3,0x44,0xED,0x45,0x57,0x98,0x35,0x60,0x6A,0x89,0xF1,0xCF,0x9B,0xD3,0x61,0x9B, +0x4B,0xAE,0xBB,0x7F,0x3B,0x62,0x7A,0x87,0x04,0xBF,0xDE,0x36,0x5A,0x61,0x59,0x91,0x58,0x4F,0xCC,0xA0, +0x59,0x49,0xB9,0x63,0xAD,0x1C,0xF3,0x31,0xFB,0x3C,0x0A,0x11,0x8A,0x15,0xE4,0x84,0x75,0xDE,0xA5,0xF2, +0x03,0x91,0xFB,0x82,0x94,0x4F,0xAD,0x85,0x83,0x4F,0x55,0x44,0xDE,0xA7,0x76,0xB6,0x00,0x52,0xF6,0xEA, +0xC9,0x8C,0x47,0x03,0x8B,0x50,0xC9,0xC7,0x87,0xDC,0xEB,0x70,0xDD,0xA8,0xC4,0x40,0x11,0xAD,0xEE,0x64, +0x41,0x48,0x8E,0x94,0x74,0x7F,0x73,0x42,0x75,0x88,0x18,0x2B,0xC7,0x3A,0xDC,0x74,0x48,0xBE,0xE2,0x28, +0x1A,0x3C,0xFA,0x9A,0x51,0x7A,0xCD,0x48,0xB4,0x1D,0x0F,0xE0,0x41,0xDD,0x14,0x75,0x19,0xCC,0x57,0xD3, +0x61,0x13,0x94,0xDB,0x56,0xC6,0xD8,0xFC,0xEA,0xAE,0xC5,0xFD,0x90,0xDE,0x38,0xA1,0x43,0x17,0xBC,0x34, +0x1C,0x97,0x68,0xAF,0x4C,0xF5,0xC6,0xDF,0x52,0xD9,0x70,0x9E,0xC8,0x9A,0x31,0x7E,0x1D,0x5C,0x77,0x4B, +0xED,0xD4,0x4A,0x46,0x80,0xF8,0x85,0xBB,0xC8,0x92,0x23,0xF3,0x1B,0x5F,0x06,0x98,0x49,0xDB,0xAF,0x56, +0x11,0x79,0x22,0xBD,0x40,0x2A,0x3B,0xFF,0x4A,0x5E,0x4D,0xEE,0xCD,0xF6,0xDF,0x42,0x08,0xF8,0x0E,0xD8, +0x59,0x1C,0x06,0x2D,0xB2,0xB7,0x96,0x09,0x44,0x89,0x16,0x0C,0x6C,0xFC,0x9A,0x34,0x2B,0xBC,0x94,0xDD, +0x98,0x7F,0x9E,0x19,0xE3,0xD6,0x49,0x0F,0x59,0xD6,0x18,0x55,0xAC,0x35,0x79,0x49,0x99,0x0D,0x2F,0xD2, +0xD2,0xEF,0xA9,0x31,0x1B,0xD1,0x5A,0x26,0x1E,0xBC,0x97,0x68,0xD8,0x1F,0xE6,0x7D,0xC8,0x6C,0x4E,0xFC, +0x76,0xD2,0xD1,0xF1,0x88,0x8D,0x47,0xF6,0x94,0xBF,0x22,0xC3,0xAF,0x84,0xAA,0x08,0x79,0x6D,0xD3,0x1A, +0xE0,0x55,0xBF,0xE9,0xF4,0x32,0x9C,0x16,0x0F,0xF0,0xCA,0xB2,0x16,0x8C,0xB1,0xEB,0x50,0x4F,0xBF,0xBE, +0x06,0xE3,0x0B,0x93,0x59,0x6D,0xCE,0xDA,0x65,0x39,0x8D,0x3F,0x6E,0xC7,0x52,0x68,0xFD,0xAE,0x1E,0x35, +0x15,0xA7,0x83,0xC4,0xE5,0x4E,0x60,0xB1,0x76,0x09,0xF2,0xB9,0xCB,0x59,0xB0,0x82,0x29,0x4F,0xA8,0x62, +0xDE,0xBB,0xDF,0x7A,0x01,0x4F,0x36,0xA8,0x11,0xAE,0xD4,0xE1,0x3F,0x68,0x38,0x96,0x45,0x67,0x1F,0x6A, +0x7E,0xB7,0xAB,0xB9,0x90,0x8D,0xC4,0xE7,0xE5,0xC4,0xCF,0xBA,0xF7,0x26,0xCB,0x4D,0xF3,0x73,0x3F,0x35, +0xF6,0x87,0x6A,0xF7,0xE4,0x3E,0x87,0xAA,0x3E,0xEE,0x18,0xBB,0x80,0x27,0x5D,0x70,0x38,0x05,0x6C,0xC8, +0x48,0x65,0xA3,0x69,0x96,0xC1,0x90,0x2B,0x27,0x26,0x98,0x3A,0x7E,0xB4,0x60,0xF3,0x25,0xF8,0xE0,0xB8, +0x35,0xF8,0x87,0x69,0xA8,0x01,0x3B,0x1C,0xAC,0xA5,0x26,0x2F,0xD4,0xA6,0xBB,0x2B,0xF5,0x53,0x8B,0xEB, +0x6F,0x58,0xBD,0x32,0x76,0xEF,0x42,0x44,0x6A,0x40,0x7B,0xDE,0x91,0xE6,0xF5,0xA2,0xD6,0x41,0xBA,0x73, +0x2D,0x18,0x3A,0xFB,0x48,0xE7,0xEC,0x0F,0x7F,0xFC,0xFD,0x05,0xFA,0x2E,0x7D,0xA5,0xEA,0x0E,0x22,0x77, +0x49,0xC6,0x3B,0x6E,0xB4,0xE4,0x9C,0xB7,0x8E,0x2F,0x59,0xB3,0x9E,0x0F,0x6C,0x9B,0x9E,0x8C,0xA9,0x1A, +0xD8,0xE5,0xF8,0x04,0xEF,0x90,0x78,0xA5,0x99,0xA4,0x60,0x3B,0xDF,0x44,0xC5,0xA6,0xFE,0xFF,0x7A,0x60, +0x60,0x15,0x9C,0x7D,0x10,0xAB,0x25,0x93,0xC5,0x51,0x41,0x58,0x81,0xFC,0x16,0x22,0xBC,0xD0,0x16,0x8C, +0xB9,0x40,0x6E,0xE5,0x41,0x4E,0x83,0x86,0x25,0x4E,0x37,0x1D,0x4F,0xD6,0x06,0xF1,0x47,0xA2,0xCF,0x50, +0x60,0x5F,0x8D,0xD8,0x75,0xFF,0xC1,0x08,0x54,0x1A,0x3D,0xE4,0x9F,0x12,0x87,0x40,0x69,0xC3,0x86,0x07, +0x4B,0x6C,0x1C,0x9D,0x46,0xD4,0x9C,0xB5,0x0E,0xBF,0x4C,0x50,0x6E,0xF7,0xEC,0x75,0x29,0x74,0x12,0x72, +0xCE,0xA4,0x7E,0xC7,0x07,0x94,0x7C,0xC3,0x1B,0xAA,0x37,0x65,0x2C,0x75,0x1B,0x62,0x47,0x65,0xE7,0xD6, +0x8E,0x9E,0x2C,0xF8,0x03,0x0D,0x8B,0xCA,0x7B,0x5B,0x7F,0xD7,0x18,0x8C,0x5A,0xF3,0x56,0xB1,0xC6,0x42, +0x93,0x88,0x83,0xCF,0x1E,0x0D,0x06,0x60,0xD9,0x11,0x9E,0x71,0xD5,0xBB,0x8C,0x93,0x87,0x9C,0x76,0x4F, +0x05,0x05,0x7A,0xAB,0x8C,0x66,0xFA,0x6D,0x17,0x34,0x9A,0xD8,0x49,0x52,0xEC,0x91,0xCA,0xE2,0x07,0x01, +0x88,0x37,0x73,0x71,0x98,0x1B,0x09,0xAC,0x9E,0x75,0xA5,0x2F,0x43,0x27,0x11,0x3B,0x83,0x44,0xF9,0x3F, +0x56,0xB8,0x35,0x8A,0xD5,0x74,0x1E,0xC9,0x9D,0x24,0xC7,0xBC,0xD1,0xE1,0xCB,0x6B,0x9D,0xD9,0xB6,0x0A, +0x6E,0xB2,0xD0,0x8A,0xDD,0x79,0xAE,0x3A,0x40,0x16,0xB6,0x5B,0xB2,0x1B,0xE1,0xBA,0x79,0x70,0x01,0x84, +0x15,0xF2,0xCB,0x54,0xAD,0x84,0x9F,0x27,0x0C,0xF3,0x92,0x85,0xE8,0xD5,0xAC,0xEF,0x96,0x44,0xDA,0x5F, +0x8C,0x9D,0x22,0x21,0x5E,0x19,0x2B,0x60,0x10,0x72,0xD0,0x80,0x26,0x60,0x3E,0x2D,0x42,0x3F,0x1E,0x80, +0x33,0x72,0x10,0x21,0x10,0x64,0xB0,0x34,0xDD,0x9D,0xEF,0x57,0xE8,0x90,0x64,0x87,0x30,0x2B,0x89,0xCF, +0xA0,0x22,0x20,0xDB,0xA8,0x0F,0x3C,0xE1,0x84,0x26,0xFF,0x65,0x79,0xD8,0x51,0x52,0xE5,0xE3,0x74,0xDE, +0xE3,0x57,0x6F,0x3D,0x6A,0x32,0x9B,0xE5,0xF0,0x61,0xE2,0x76,0x3C,0xE5,0x7C,0xF5,0x99,0xFE,0xF7,0x31, +0x04,0x0F,0xB8,0xC0,0x31,0xB2,0xF4,0xEE,0x41,0x74,0xB1,0xA4,0x1E,0x19,0x11,0x4F,0xA6,0xFA,0xF6,0x6D, +0xB0,0xAE,0x0B,0x8A,0x4E,0x54,0x66,0xF0,0x60,0x83,0xBC,0x23,0xA1,0x24,0xFF,0x7D,0x31,0x43,0xEE,0x58, +0x39,0xCB,0xC6,0x0B,0xA0,0x65,0x29,0x1E,0x5F,0x0A,0xA8,0x64,0xAB,0x38,0x5D,0x0F,0xA2,0x67,0x61,0x9A, +0xE0,0x80,0x3C,0x21,0x29,0x23,0xDA,0x80,0xF3,0x92,0x01,0xD7,0xBD,0xCE,0x90,0xD2,0xD8,0xE8,0x30,0xA0, +0xFE,0x52,0x4B,0xEF,0x4E,0x6B,0x65,0x46,0x3B,0xD6,0x21,0x5C,0x11,0x07,0x3D,0x6D,0xF0,0xF5,0xD9,0x7C, +0x9E,0x21,0x13,0xD7,0x35,0xFB,0x90,0x97,0x98,0x04,0x0B,0x66,0xE1,0x5A,0x9F,0x16,0x14,0x86,0x5E,0x3A, +0x89,0xE6,0xF9,0x2D,0xD8,0x7B,0xEE,0xDA,0x39,0x06,0x7A,0x0B,0x14,0xD3,0x4A,0x53,0x4C,0x47,0x6A,0x41, +0xFD,0x21,0xB5,0xDC,0x28,0xD9,0x0E,0x61,0xE4,0x6F,0x22,0x62,0x3B,0xF9,0xCA,0x3A,0x69,0x2C,0x41,0xB9, +0xFB,0xFF,0x03,0xAD,0x64,0x42,0xAE,0x0B,0x83,0x5F,0x3F,0xFF,0x8C,0x66,0x73,0xAA,0xFF,0x6A,0x93,0xF7, +0x64,0xF4,0x4C,0x0A,0xFB,0x44,0x77,0x02,0x01,0x90,0xBD,0x1E,0x97,0xBD,0x3C,0xBC,0x97,0x2B,0xEB,0x5A, +0x66,0x90,0x8C,0xAC,0x91,0x62,0xCC,0x70,0x6D,0xEE,0x78,0xF2,0xBC,0xA7,0x37,0xCE,0xB0,0xAD,0x64,0x90, +0x42,0xF6,0x94,0x05,0x8B,0x03,0x30,0xE3,0x43,0x29,0xE0,0xFA,0x1D,0xEE,0x6D,0xAD,0x93,0xB2,0xA1,0xFE, +0x7F,0x6C,0x85,0x9D,0x50,0x7C,0xA0,0xEE,0x34,0x0E,0x25,0x95,0x1C,0x13,0x55,0xF1,0x83,0xBB,0x44,0xE7, +0xDD,0x75,0x94,0x1D,0x75,0x80,0xD5,0x02,0x62,0x3B,0xD9,0x54,0x00,0xCF,0x9D,0x92,0x71,0x74,0x4D,0xD0, +0xCA,0x37,0x27,0x8B,0xFE,0xA3,0x54,0xDB,0x96,0xA2,0x95,0x55,0xFA,0x7A,0x46,0xFE,0x9A,0xFB,0x2A,0x0D, +0x1E,0x3B,0x8D,0x31,0xBA,0xA8,0x94,0x66,0x16,0x3C,0x04,0x62,0x46,0x28,0x95,0xC9,0xF5,0x5C,0xBF,0x16, +0x9F,0xA5,0x87,0x6A,0x28,0x77,0xBD,0x2C,0x2C,0xE4,0x2E,0xBC,0xDF,0x63,0xCE,0x78,0x65,0x68,0x08,0xEE, +0xCE,0x22,0xB2,0x3A,0xF0,0xDA,0xFC,0xB8,0x78,0xF9,0x11,0xEB,0x57,0x87,0x2F,0x25,0x46,0xC5,0xB4,0x94, +0x34,0x59,0xE5,0xCB,0x07,0x14,0x71,0xA5,0x5C,0x48,0x7B,0x7B,0x39,0x28,0x27,0x2A,0xCB,0x5D,0x20,0xED, +0x79,0x34,0xF7,0x68,0x96,0x3F,0xDF,0x24,0x8A,0x71,0x61,0xD5,0x9A,0x8D,0x4A,0x68,0x59,0xAD,0x30,0xDE, +0xCA,0x4E,0x62,0xAC,0xBB,0xBB,0x9E,0x05,0x7C,0x89,0xA1,0x82,0xF4,0xCB,0x7D,0x37,0x57,0x6F,0xBA,0xF4, +0x5B,0xAD,0xE0,0xC4,0x1E,0x0F,0x2C,0x05,0x02,0x33,0x31,0xDE,0x24,0xA2,0xEF,0x1D,0xBD,0x24,0xCE,0xE6, +0xD7,0x1D,0xD7,0xE4,0xC8,0x8A,0xDF,0x6C,0x72,0xC2,0x6B,0x95,0x4F,0xCE,0xA5,0x52,0x4C,0xC9,0x8A,0xCE, +0xB6,0xAF,0xF3,0xE2,0xBB,0x52,0xAE,0xCF,0x13,0x80,0xA9,0x52,0x3D,0x94,0xE1,0x85,0xF0,0x1E,0x7D,0x3B, +0x82,0x89,0xC3,0x07,0x95,0x02,0xE5,0x50,0xB4,0x6B,0xB0,0x59,0x73,0xA3,0x57,0x14,0x24,0xDC,0x8C,0x06, +0xCA,0xA7,0xAE,0x1C,0xE7,0xAF,0x55,0xA5,0x95,0xEB,0x58,0xB1,0x7A,0xC6,0xE0,0xB6,0x84,0x05,0xF3,0x71, +0x32,0x95,0x4B,0xFC,0xA1,0xFF,0x38,0x75,0xA6,0x2A,0xB3,0x56,0xFE,0x0C,0x28,0x4A,0x8F,0xE6,0x87,0x31, +0xAA,0x53,0x39,0xD9,0x27,0x29,0xF4,0xAD,0x33,0x19,0x57,0x5E,0xFA,0x62,0xC0,0x01,0x5B,0x84,0x3D,0x21, +0x6C,0x96,0x45,0xD2,0x28,0xE5,0x6E,0x71,0xE5,0x6A,0xA3,0x75,0x64,0x3E,0x96,0x68,0xB3,0x25,0xCC,0xFE, +0x5C,0x09,0x0C,0x12,0x86,0x99,0xB0,0x5C,0x4E,0xA7,0xEA,0xFA,0x41,0x76,0xCA,0x3A,0x2E,0x4F,0xC1,0x49, +0x71,0x48,0xE3,0x8D,0xA8,0xA6,0xBB,0x8F,0xA7,0x9B,0xB2,0xFC,0xAC,0x83,0xCC,0x59,0x0E,0xCA,0x23,0x50, +0xFF,0x6A,0x87,0x74,0x53,0xF4,0x13,0xE5,0xAE,0xCC,0xC4,0xC0,0x2C,0x48,0xE2,0x8C,0x78,0x32,0xA2,0xAA, +0x0D,0xCE,0x3D,0x82,0x18,0xA7,0x63,0x4A,0xEF,0xAE,0x93,0xAE,0x1A,0x61,0xFD,0x74,0x7B,0x56,0xFC,0x77, +0xAC,0x50,0x4D,0xDB,0xBF,0xCE,0x02,0x5A,0xBE,0xF6,0x3B,0x02,0x75,0xFB,0x92,0xB0,0xFD,0xB8,0x2A,0xF8, +0x6B,0xB1,0xAA,0xD9,0x79,0xFE,0x6F,0x59,0xC1,0x22,0x13,0x2C,0xA7,0xA6,0xCC,0x42,0x3B,0x5E,0xCC,0x99, +0xCF,0xA0,0x5A,0xBB,0x06,0x7D,0x53,0x78,0x74,0x6B,0x19,0x07,0xC5,0x76,0x24,0x4E,0xEC,0x3D,0xBF,0x61, +0x51,0x1C,0x2E,0xE4,0xC6,0x3A,0xAB,0x50,0xC9,0x7C,0x1B,0xD4,0x15,0xA1,0xA0,0xC4,0x45,0x34,0xA3,0x85, +0x9E,0x69,0xA2,0x63,0xA8,0x7F,0xAD,0xAE,0x76,0x8E,0x4B,0xAA,0x4E,0x22,0xDE,0xAF,0x5E,0xF7,0x6D,0x51, +0xD6,0x68,0xC5,0xB5,0xBD,0x7E,0x02,0xC4,0xD7,0x32,0x02,0xA0,0x89,0xAF,0x2C,0x22,0x8D,0xB0,0xCB,0x00, +0x64,0xB9,0x12,0xD4,0xDE,0x33,0x54,0x11,0xF5,0x15,0x42,0xDF,0xC4,0x97,0xCB,0xF4,0x6F,0xEE,0xC1,0x83, +0xF6,0x6B,0x17,0xA1,0x8A,0xF9,0x4B,0xCF,0x45,0xB3,0xAC,0x45,0x51,0xED,0xCD,0x28,0x56,0x11,0xE5,0x9A, +0x32,0xA4,0x25,0x2F,0x0C,0xB3,0x4A,0x91,0x0C,0x2A,0x18,0xB6,0x44,0x9B,0x9C,0x3E,0xF5,0x17,0x8E,0x18, +0x64,0x18,0xD6,0xE1,0xA0,0xF7,0x78,0xA7,0xC6,0x68,0x6B,0x59,0xE3,0xB1,0x06,0x0F,0x6B,0xD2,0xAB,0x3A, +0x5E,0x0E,0x59,0x2B,0x45,0x2B,0x03,0xED,0x03,0xB3,0xF7,0x4A,0x70,0xD9,0xE9,0x86,0xA0,0x58,0x69,0xB2, +0xF5,0x2C,0xA9,0xF0,0x63,0x04,0x7E,0x48,0xB2,0x50,0xE7,0xBB,0x54,0x48,0x66,0xC8,0x68,0x61,0x76,0xA5, +0x30,0xDE,0x48,0xD2,0xCD,0xB9,0x1A,0x75,0x7F,0x5C,0x3D,0x29,0xA3,0xF1,0xEE,0x19,0xC2,0xCB,0x26,0xE4, +0x86,0x8C,0x06,0xE3,0xFF,0xC1,0x70,0x38,0x2A,0x13,0xAD,0x72,0x01,0xE5,0x49,0xD2,0x4D,0x9C,0x4C,0x09, +0xEE,0x03,0x51,0xDD,0x31,0x32,0xB5,0xDD,0x0C,0x66,0x07,0xDC,0x06,0xAE,0x6F,0xFF,0xFF,0xFF,0xA3,0xA9, +0xDC,0x53,0xBD,0x46,0xB1,0xAD,0x4E,0xC2,0x44,0x02,0xA7,0x42,0xA7,0x9D,0x0D,0x96,0x01,0x01,0xF3,0x3F, +0x6F,0x3D,0xAC,0x52,0xBE,0xE5,0xA6,0xD6,0x90,0x7E,0x61,0x56,0x07,0x40,0x5E,0x04,0x67,0x9D,0x14,0x66, +0x61,0x9D,0x32,0xC7,0x30,0x9D,0x09,0x11,0x60,0xAC,0xB4,0x5F,0x97,0x13,0xC8,0x37,0x09,0x70,0xD3,0xD7, +0x40,0x9E,0xA5,0x00,0x0C,0x46,0x79,0xB6,0x31,0xEE,0xEB,0x2E,0xA3,0x7B,0x2B,0x43,0xF3,0x9B,0xF9,0x36, +0xF4,0xF8,0x90,0x7A,0xE6,0x2A,0x30,0x12,0xB4,0x07,0xBE,0x48,0x52,0xB5,0x19,0x70,0x7D,0x1D,0x9F,0x6C, +0x9E,0x64,0x28,0xA3,0x63,0xB9,0x3D,0xF6,0xAE,0xBB,0xE5,0xCF,0x82,0x67,0x7D,0x2A,0x30,0x83,0x58,0x7A, +0x1F,0xC4,0xFE,0x73,0x03,0x03,0xD5,0x7B,0x76,0x64,0x55,0xCE,0xB9,0x17,0xB6,0x4A,0xBB,0x2D,0xB8,0xFC, +0x04,0x70,0x1E,0xC9,0x3A,0x5D,0x05,0xE3,0xAC,0xF1,0x21,0x84,0xA2,0x3A,0x22,0xC3,0xD6,0xCF,0x65,0x68, +0x89,0x4A,0xEB,0x6F,0x2B,0x57,0x2B,0x14,0x23,0xD9,0xED,0x15,0xEB,0x9F,0xB1,0xE2,0xFA,0x0B,0x70,0x76, +0xC0,0x94,0x42,0x22,0x2C,0xB4,0x88,0xFD,0x91,0x96,0x9D,0xB6,0x2E,0x5E,0xD5,0x4A,0xD2,0xBD,0xF1,0xCD, +0x92,0x0F,0x12,0x8D,0x45,0x02,0xDD,0xAB,0x29,0xA2,0xF4,0x70,0xB8,0x48,0x24,0x50,0xA2,0x5C,0x92,0xE5, +0x5D,0x66,0x63,0x23,0x6B,0xA1,0x67,0xC9,0xB9,0x29,0x70,0xC8,0xEE,0xC3,0x6C,0xF6,0x2F,0xF8,0x19,0xAA, +0xA5,0xA0,0xF5,0x70,0x38,0x82,0x9B,0x99,0xCC,0xFA,0x7D,0x1F,0x2C,0x0A,0x53,0x73,0x5A,0x7C,0xBA,0xE0, +0x5B,0x3F,0x6D,0xD3,0x5E,0xD9,0x3B,0xBB,0x04,0x6B,0x6E,0x92,0x22,0x50,0x9A,0x38,0xDA,0x62,0x45,0xE9, +0xC4,0xD1,0x8B,0x24,0x8A,0x0A,0x3B,0x2C,0xC1,0x16,0x05,0xB7,0x44,0x3D,0x35,0x2B,0xE3,0xF2,0x26,0xC3, +0x0F,0xDF,0xA1,0xE3,0x6B,0x80,0x36,0x24,0x8B,0x9C,0xE5,0x76,0x08,0x80,0x99,0x31,0x8A,0x8F,0xBB,0xFE, +0x81,0x99,0xFE,0x26,0xDB,0x25,0xEF,0x12,0x41,0x14,0x82,0x44,0x74,0x7F,0xDB,0x23,0x41,0xB8,0xB4,0xF3, +0xCE,0x3A,0xD8,0x74,0x40,0x00,0x1C,0x15,0x6C,0x19,0x3E,0x3A,0x4B,0x95,0x05,0x25,0x30,0xEB,0x49,0x89, +0x89,0x67,0x91,0x61,0xD1,0xB2,0x99,0x6D,0x48,0x74,0xF3,0xFD,0xB5,0x3C,0x07,0x0E,0x40,0x32,0x3A,0x0A, +0x02,0xA1,0x78,0x30,0xC9,0xBE,0xD3,0x9D,0x46,0x18,0x70,0x65,0x81,0x02,0x3B,0xD3,0xE5,0x14,0x30,0x20, +0xE3,0xCA,0x36,0x63,0x0A,0x8C,0x49,0xC8,0xE9,0x4F,0xFC,0xB9,0x78,0x19,0xD2,0x7A,0x96,0x74,0xC3,0xA9, +0x8B,0x2F,0x0D,0xAB,0x5B,0xF7,0x2A,0x3E,0x8C,0x14,0x31,0x20,0xC8,0x1F,0x37,0x63,0x34,0xCD,0x17,0xB4, +0x21,0xE8,0x40,0x43,0xDD,0xF6,0x79,0x79,0x0C,0xB3,0x25,0xBF,0x0E,0x33,0x2E,0x9B,0x52,0x57,0x7B,0x93, +0xE7,0x23,0x30,0x79,0x3F,0x19,0xEE,0xC0,0x3D,0x46,0x4F,0x12,0x8A,0x12,0x0F,0x02,0x86,0x0C,0x97,0xB3, +0xC0,0x3D,0x73,0xBE,0x86,0x31,0x2D,0x19,0x78,0xFF,0xE8,0xC0,0x05,0xE3,0x66,0xE6,0xC9,0xCA,0x95,0xE6, +0xC3,0xAA,0x43,0x91,0x02,0x4E,0xA1,0x58,0x0E,0x2C,0xFD,0xBB,0x6F,0x28,0x99,0x5E,0xE7,0xA6,0x4F,0xE5, +0xAD,0x53,0x1C,0xBD,0x55,0x80,0x9F,0xBE,0xF1,0xB2,0x0A,0xE7,0xB6,0xE1,0x26,0x9F,0xD7,0xC9,0x0B,0x50, +0x15,0x4A,0xF4,0xF2,0xC1,0xC2,0x0F,0xC1,0x92,0x92,0x56,0xD3,0x44,0xDD,0x6E,0xD9,0xF0,0xF9,0xE9,0x46, +0xC0,0xEF,0x97,0xAA,0x75,0x22,0x3B,0xDB,0xD6,0xC7,0xC1,0x3F,0x35,0x1C,0xB0,0xB1,0x2C,0xD1,0xF5,0xA6, +0xF7,0x2F,0xD0,0x98,0xAF,0xD5,0xC8,0x99,0xDB,0x42,0x20,0xF7,0x01,0x8E,0x50,0xB9,0x74,0xB3,0xD8,0x81, +0x37,0x31,0xB0,0x6B,0x51,0xEE,0xF2,0x2D,0x09,0xF0,0xAC,0x76,0xA6,0xB9,0xB1,0x83,0xE7,0x33,0x66,0x19, +0x1C,0x37,0x7F,0xA0,0xF7,0x26,0xFF,0x7F,0x24,0xDA,0x6E,0x83,0xDC,0x66,0x5F,0xF3,0xFC,0x9D,0x1C,0xB3, +0x6D,0x8C,0xE2,0xFD,0x98,0x05,0x77,0x6D,0xAD,0x3E,0x22,0xC6,0xB0,0xA5,0x86,0x68,0xC7,0x5A,0x0E,0x6D, +0x67,0xA6,0xC1,0x7D,0xA4,0x5A,0x02,0xC1,0x62,0x16,0x41,0x09,0x8F,0xFA,0xDB,0xBF,0x20,0x05,0xCC,0x59, +0x0E,0xCA,0xCD,0x16,0xEF,0x3F,0x55,0xA7,0x6C,0x2D,0x1F,0x6C,0xEB,0xA4,0xDC,0x45,0xAC,0xCF,0x81,0xC4, +0xDB,0x50,0x32,0xB9,0x2C,0x01,0x1A,0x3D,0x2E,0xA7,0x63,0x80,0xEB,0xC7,0x5E,0x11,0x84,0x31,0xD3,0x4A, +0xB4,0x20,0x2B,0xAE,0x5E,0x0C,0xDE,0x18,0xB8,0xA8,0x32,0x0D,0x75,0x6C,0x35,0x76,0x65,0x7F,0xE1,0x09, +0xBE,0xE0,0x66,0x70,0x4A,0x5A,0x90,0xAF,0xDA,0xEA,0x78,0x50,0x2C,0x0A,0xFA,0xDB,0xBC,0x50,0x43,0x89, +0xEC,0x8F,0xF9,0x8C,0x5B,0x62,0x5D,0xF1,0x1A,0x19,0xEC,0x83,0x4B,0x4F,0xFD,0xB1,0x12,0xAA,0x4D,0xC8, +0xF9,0x56,0x0A,0x3F,0x5F,0x35,0xD3,0xE8,0xB8,0x07,0xC4,0x75,0x63,0xFA,0xE4,0x87,0x8A,0xEA,0x05,0x09, +0xA5,0x52,0x35,0x6F,0x00,0xFF,0x6C,0xAC,0x0D,0x21,0x26,0x67,0xFA,0xB0,0x7E,0x2F,0x28,0xD1,0xE5,0x9F, +0x86,0x14,0xFC,0xF3,0xD3,0xD5,0x0C,0xD1,0x02,0x0E,0xB0,0xF9,0x00,0x01,0xF7,0xF9,0x0A,0x61,0xB4,0x02, +0xAD,0x96,0x8A,0x42,0x70,0xFF,0x69,0x6F,0xFB,0x16,0xEA,0xFE,0xDE,0xA4,0x6D,0x76,0x44,0xF8,0xC4,0x0D, +0x71,0x0E,0x31,0x2B,0xAA,0xD4,0x74,0x43,0x89,0x3D,0x2D,0x62,0x19,0x7B,0x53,0x85,0x05,0x93,0xCE,0x76, +0x7F,0xD4,0x41,0x45,0xEB,0xBD,0x03,0xF4,0x46,0x78,0x47,0x89,0x76,0xFA,0x7A,0x06,0x2F,0xA2,0x1E,0x6E, +0x30,0x43,0x98,0x6C,0xCD,0xC7,0x1A,0x30,0x7D,0x98,0x7B,0x9D,0x1E,0xCD,0xFF,0x76,0xCD,0xF4,0x06,0x54, +0xC1,0xD4,0x9E,0xC9,0x94,0x48,0x01,0x27,0x28,0x3E,0x58,0xAB,0x9C,0x59,0x83,0xC9,0x57,0xBF,0x68,0x51, +0xD8,0xAA,0x95,0x0B,0xEE,0x44,0xE5,0x82,0x42,0xA0,0xC2,0xD1,0x6C,0xD6,0xFD,0x51,0x48,0x95,0x45,0x6B, +0xDB,0x90,0x66,0x8F,0xA8,0xFD,0xE7,0xCD,0xCF,0x73,0x49,0xAC,0xDF,0x69,0xDD,0xE7,0xD3,0x9E,0xCD,0x7E, +0xE7,0x9E,0xDA,0x98,0xD8,0xB8,0x2A,0xC0,0x59,0xBF,0x5F,0xB4,0x2F,0x93,0x44,0xF3,0x62,0x4F,0xE2,0xF0, +0x6A,0x4A,0x64,0xD4,0x82,0x0B,0xC2,0xA4,0x32,0xC3,0x2F,0x3F,0x73,0xB2,0x47,0x09,0xCC,0x9F,0x20,0x89, +0x7C,0xF2,0x7F,0xC2,0xA1,0x9F,0xA6,0x2D,0x31,0x62,0x2A,0x90,0xF4,0xEF,0xD0,0xDB,0xA5,0xE3,0xEB,0x50, +0x1B,0x43,0xF0,0x90,0x65,0xFD,0x26,0x51,0x03,0x9E,0x58,0xE4,0xFC,0xCC,0xAD,0x7A,0x5E,0x9F,0xDD,0xA9, +0xF3,0xAB,0xB5,0xD1,0xC8,0x4D,0x64,0xDB,0x31,0xDD,0x51,0x06,0x87,0x28,0x49,0x51,0x4D,0xD4,0xA6,0x76, +0x17,0x49,0x01,0x04,0xE5,0xCC,0x3D,0x07,0xC8,0xE7,0xD1,0xAE,0xB7,0x48,0xD4,0xE4,0x06,0xF8,0x2B,0x23, +0xAF,0xD2,0xCA,0x2F,0x8E,0x83,0x85,0x65,0x23,0x3A,0x98,0x91,0x1F,0xBA,0x48,0x2A,0xA2,0xB9,0x09,0x14, +0xA0,0x25,0x05,0x78,0x6D,0xAD,0xF2,0x4C,0x1E,0xD7,0x6A,0xFF,0xD1,0x46,0xC9,0x91,0xDB,0x06,0x76,0xB3, +0xDB,0x36,0xE4,0x41,0x83,0xE8,0x76,0x0E,0x0E,0x26,0xC6,0x39,0x74,0xF7,0x86,0x3D,0x2B,0x92,0x06,0xD9, +0xEB,0x08,0x03,0x5E,0x32,0x59,0xCE,0xE6,0xF4,0x6B,0xFB,0x7A,0x79,0xA0,0xDA,0xD8,0x44,0x27,0xA0,0xC7, +0xA0,0x05,0x3D,0x35,0xFE,0x66,0x43,0x04,0x9F,0x31,0xAC,0x1B,0xA8,0x08,0xED,0x04,0x58,0x9B,0xCB,0xF9, +0x4D,0xD6,0xF5,0x1B,0x78,0xA8,0x79,0x31,0x38,0xC2,0xFD,0x59,0xDA,0x8A,0x16,0xE8,0xE3,0xCF,0xFC,0x64, +0x97,0xAA,0xF2,0x1A,0x7C,0x0E,0x82,0xED,0x26,0xE1,0xA6,0xC6,0x08,0xCC,0x9A,0xF5,0x6D,0xD6,0xFB,0x7F, +0xEA,0xB2,0xC6,0xBC,0x37,0x10,0x51,0xB2,0x7D,0xF3,0x44,0x0D,0x72,0x6F,0x0F,0xAC,0x56,0x0A,0x2E,0x02, +0x57,0xC8,0x76,0x9E,0x41,0x1C,0xDA,0xA4,0xAF,0x6D,0xEF,0x1B,0x57,0x0B,0xC9,0x7C,0x24,0xE2,0x16,0x00, +0x26,0x1B,0x95,0x86,0xA6,0x90,0x08,0xE0,0x64,0x75,0xCC,0xA0,0x38,0x41,0xB6,0xD7,0x2F,0x6E,0xD5,0x6D, +0x94,0xB6,0x09,0x34,0x4A,0xB1,0x8D,0xB6,0xF3,0x33,0x89,0x7A,0x93,0xA6,0x90,0x86,0x42,0x73,0x9B,0x51, +0x66,0xF3,0x92,0xA7,0x7F,0xD2,0xE1,0xEA,0x3F,0x98,0x89,0x81,0xB7,0x18,0x25,0xD1,0x82,0xFE,0x42,0x37, +0xD5,0xC7,0x64,0xD4,0x9B,0x7A,0x24,0xF4,0xCF,0x37,0x2D,0x86,0x43,0x0C,0xF4,0x23,0x56,0x36,0xF1,0xED, +0xDC,0x11,0x8E,0x2B,0x50,0x15,0x04,0x71,0x9C,0xF8,0x03,0x74,0x4C,0x64,0x23,0x69,0xA3,0x46,0x7B,0x40, +0xA2,0x7B,0x95,0x01,0x6D,0x14,0x0A,0x67,0x85,0x01,0x4B,0xBE,0xDF,0xE8,0xE4,0xAA,0x22,0x27,0x4C,0x75, +0xC0,0x1D,0x83,0x48,0xC7,0xC2,0x26,0x62,0xD9,0x91,0x23,0x2C,0x99,0x63,0x8E,0xBB,0x50,0x57,0xC0,0xC3, +0x56,0x3E,0x54,0x1E,0x55,0x5B,0x1F,0x6F,0x09,0x94,0x60,0x95,0x88,0xF6,0xE0,0x08,0x84,0xD0,0x27,0x03, +0xA9,0x40,0xBD,0x7E,0x80,0x95,0x25,0xBA,0x4B,0x0B,0xC3,0x45,0x14,0x37,0x53,0x8C,0xCA,0x3B,0x9E,0xDA, +0x73,0x12,0x0E,0xCA,0xD9,0x37,0xC9,0xDD,0xD6,0x39,0x72,0x06,0x0E,0xC8,0xE6,0xC8,0xB7,0x5F,0x61,0xEE, +0x99,0x1E,0xCC,0xD6,0x57,0x3E,0x71,0x97,0xBE,0x80,0x36,0xF8,0xE7,0x79,0xB2,0x7C,0x40,0x37,0x17,0xEF, +0x43,0x07,0x52,0xD6,0x9E,0x62,0xAE,0x37,0x89,0x58,0x8C,0x2C,0xEC,0x55,0x9B,0xA8,0x32,0x6F,0xE6,0x5D, +0x80,0xEF,0x6C,0xDA,0x06,0x8E,0x9F,0x19,0x34,0x1D,0x86,0x15,0x12,0x2E,0x58,0x25,0xF9,0x8F,0x51,0xF5, +0x98,0xE2,0x10,0xB0,0xC4,0xC8,0xEA,0x4C,0x3C,0xB1,0xC8,0x61,0x2C,0xFE,0x10,0x26,0x55,0xEE,0x46,0x34, +0xA4,0x42,0xEE,0x1F,0xBE,0x85,0xB1,0xFF,0x30,0x79,0xA4,0x11,0xA7,0xB5,0x36,0xD3,0x4A,0x33,0xCF,0x21, +0xB7,0x65,0xF0,0x13,0x64,0x3C,0x69,0xD2,0xEA,0xB8,0x88,0xC0,0x49,0x48,0x81,0xD7,0x8D,0x4E,0x68,0xE2, +0x00,0xAF,0x67,0x56,0xEE,0xD5,0xD1,0x65,0xEA,0xA1,0x24,0x98,0xAE,0xAD,0xC8,0xF7,0xCD,0x88,0x5B,0x7E, +0x11,0x4E,0x00,0x7D,0xC3,0x91,0x0D,0x09,0x37,0x1A,0xEF,0xB9,0x3B,0x29,0xD2,0x6B,0x6A,0x97,0xDE,0x81, +0x6A,0x3B,0xAA,0x67,0xD0,0x26,0x17,0x54,0x7E,0x26,0xE3,0xD3,0xF8,0xF0,0xDD,0x00,0xFF,0xC8,0x06,0x09, +0xB5,0x18,0xE2,0xDA,0xA1,0x05,0xD3,0x68,0x91,0x2E,0x36,0xC8,0x10,0xEC,0x23,0x1F,0xFD,0x17,0x36,0xDA, +0x3A,0x22,0x3F,0x6D,0x21,0xA2,0x4B,0xDC,0xA6,0xF8,0x61,0xBA,0x76,0x4F,0xDC,0x74,0x01,0x2C,0x93,0xCF, +0x9E,0x0A,0x65,0x0F,0x2D,0xD1,0x8D,0x06,0xDA,0xE1,0x53,0x1F,0x70,0x0E,0x2B,0x0E,0xA9,0x0B,0x05,0x12, +0x40,0x6D,0xBD,0x13,0x34,0xBA,0xC2,0xB1,0xFF,0x2F,0x22,0xA7,0x59,0xEE,0xC6,0x19,0x7A,0xC3,0xDD,0x11, +0x87,0x73,0x32,0x35,0xF8,0xB0,0x0E,0xB8,0x2C,0x2A,0xEA,0x08,0xA4,0xDC,0xC1,0xFA,0x7C,0x36,0xC7,0xA3, +0x5A,0xCC,0xBD,0xE3,0x7F,0xB5,0xC0,0x46,0x32,0x5F,0xCC,0x5E,0x7F,0x11,0x87,0xC5,0x8E,0xCD,0x53,0xA0, +0xFF,0x50,0x21,0xB2,0xA7,0xDE,0x3B,0x9E,0x15,0x9F,0x5C,0xFD,0xAB,0x16,0xEC,0xEF,0x57,0xF6,0x6D,0xAC, +0xA2,0xDA,0xE8,0xC3,0x72,0xFB,0x54,0x96,0xD8,0x14,0x2A,0xF4,0x16,0x20,0x04,0xC2,0x6D,0xDA,0x78,0x66, +0x2B,0x5E,0x25,0xC3,0x8C,0x39,0xB3,0xAF,0xB2,0x99,0xFE,0x27,0xCF,0x81,0x26,0x4C,0xFA,0x90,0x3F,0x8F, +0xA3,0x98,0x93,0xF3,0xDE,0xBC,0xB4,0x5B,0x35,0x9C,0x6B,0xF0,0x4C,0x55,0x9B,0xCD,0xA2,0xC0,0x1B,0xB4, +0x44,0x6B,0x2C,0x63,0x99,0x79,0x0C,0xEE,0x9F,0x85,0x54,0xEF,0xD8,0x08,0xD2,0xD1,0xE1,0xBD,0x4B,0xF4, +0x94,0x97,0x9B,0x09,0x82,0x63,0xC1,0xA1,0x55,0xF3,0x09,0xB4,0x32,0x40,0x64,0x67,0xC5,0xDF,0x0D,0xC3, +0x7B,0x0B,0xBE,0x2D,0x1A,0x16,0xEE,0xB8,0x48,0x1A,0xA6,0x36,0xE1,0xDC,0x06,0xB0,0x96,0xF3,0xAA,0x4D, +0xEE,0x88,0x26,0xBC,0x83,0xED,0x81,0x87,0x98,0x89,0x60,0x5D,0x12,0x9A,0x0E,0xDA,0x75,0x12,0x96,0x61, +0xD4,0x88,0x2F,0x63,0xA5,0xC8,0xEF,0x3A,0x56,0x11,0x1C,0xFB,0x2C,0x1C,0xDF,0xFC,0x88,0x1B,0xF7,0x62, +0x04,0x7E,0x73,0x7F,0x82,0x55,0x4B,0xA6,0x46,0xDF,0x7B,0x61,0x40,0x3A,0xF4,0xA8,0xD5,0x21,0xFE,0x3B, +0xDE,0x86,0x64,0x39,0xAA,0x11,0x46,0x51,0xC1,0x11,0x99,0x6E,0x45,0xB6,0x94,0xEC,0x7D,0xEC,0xF9,0x25, +0xDE,0x4E,0x7E,0xB1,0x57,0xF9,0x07,0x9C,0xE2,0xBF,0xC4,0x60,0x88,0xBC,0xB6,0x4F,0x8D,0xA6,0x43,0x5D, +0xBE,0x61,0x2D,0x61,0x86,0xCF,0x5B,0x9D,0x20,0x01,0x94,0x23,0xAF,0x24,0x10,0xAD,0xD5,0xDB,0x80,0x0B, +0xF4,0x7E,0x6F,0xFF,0x8A,0x47,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x07,0xFF,0x80,0x00,0x55,0x40,0xA9,0x57,0x94,0x3C,0x4B,0x02,0x2B,0x8B,0xF0,0xE4,0x9E,0xEB,0x88,0x35, +0x26,0x41,0x67,0x7F,0xC6,0xCC,0x46,0x33,0xBE,0x01,0xA2,0xB6,0x98,0xB6,0x01,0x8D,0x05,0x22,0x28,0x56, +0x1C,0x7E,0xCC,0xD0,0x58,0x42,0x20,0xC7,0x57,0x13,0x09,0x0D,0x87,0x03,0xA9,0xAB,0x14,0x52,0x19,0x7A, +0xC5,0x63,0xE1,0xB1,0x90,0x61,0x80,0x3D,0x19,0x89,0x9A,0x0A,0x64,0x66,0x90,0xEC,0x96,0xBB,0x10,0xE8, +0x10,0x9B,0xB3,0xD4,0x28,0x42,0x48,0x3B,0x15,0x17,0x60,0x8F,0x23,0xBA,0xA3,0x53,0xF2,0xDA,0xBC,0xAF, +0x79,0xF9,0x80,0x3B,0xF9,0x29,0xC1,0xE3,0x07,0xA3,0xB1,0x33,0x95,0x6B,0x73,0xAA,0x7C,0xD8,0x6A,0xD1, +0x8D,0xE9,0x27,0x5D,0x22,0xC4,0x35,0xEA,0x22,0xB1,0x47,0xAC,0x2C,0x48,0xDD,0x44,0x67,0x08,0x91,0x5A, +0xC6,0x2D,0x3A,0x13,0x5E,0x13,0x9A,0x3C,0x2F,0x49,0x86,0x62,0xB8,0xA3,0x12,0x3D,0xAE,0x4D,0xA2,0xEC, +0xAE,0x66,0x5A,0x12,0x2B,0x6F,0x43,0x61,0x89,0x2C,0x6A,0x5B,0x46,0x2F,0x48,0xAF,0xDD,0x02,0x5B,0x19, +0x0E,0x7B,0x70,0xFF,0x35,0xA0,0x1F,0xDF,0xD9,0xB5,0xFB,0x7C,0x74,0x66,0x82,0xAC,0x87,0x4E,0xA2,0x1A, +0x13,0x6E,0xAD,0x9B,0x72,0xB1,0xDA,0x64,0x8F,0xF1,0x37,0x7C,0xDF,0xFE,0xC2,0x3E,0xC5,0xD2,0x53,0x06, +0xC4,0xCB,0xFA,0x7C,0x8F,0x5C,0x9D,0x14,0x8C,0xFC,0x02,0xE1,0x18,0xE2,0xBF,0xFB,0xCB,0x46,0x78,0x32, +0x23,0x92,0xEC,0x19,0x5B,0x27,0xAB,0x0B,0xE5,0x22,0x7B,0xB9,0xCE,0x42,0x7C,0x51,0x3A,0x69,0x04,0x80, +0x78,0xF8,0x0D,0x14,0x93,0x36,0x91,0xA1,0x64,0xD0,0xCE,0xA5,0xD3,0x3C,0xDE,0xB0,0x26,0xE9,0x04,0xA8, +0xD0,0x3E,0x3C,0x32,0x46,0x6B,0xAF,0x36,0x78,0x91,0x4F,0x28,0x82,0x11,0x0D,0xB8,0x13,0x34,0x14,0x21, +0xC0,0x5A,0x26,0x63,0x4C,0x3C,0x02,0x1D,0x24,0xE6,0x50,0xB5,0x4A,0xA8,0x27,0x4D,0xE9,0x35,0xC7,0xA1, +0x52,0x75,0xEC,0x62,0xFD,0x4B,0xDC,0xCC,0xCF,0xBD,0xD7,0x64,0x70,0x89,0x14,0x7C,0x15,0xEF,0xEC,0xC3, +0x2A,0x71,0x94,0xDC,0xB1,0xF9,0xDF,0x74,0x7D,0x9B,0x9A,0x4E,0x75,0x27,0xED,0x72,0x6A,0x5E,0xC1,0xA5, +0xBE,0xCB,0x6B,0xCC,0xE4,0x64,0xD5,0x1C,0xBA,0x34,0x96,0xD3,0xDC,0x97,0xFC,0x25,0xBB,0x38,0x63,0xDC, +0x8B,0x5A,0x5E,0x1D,0xF7,0x1B,0xC6,0x65,0x5F,0x1E,0xAE,0x73,0x4F,0x3C,0x0E,0x12,0xC4,0xA7,0x9A,0xB8, +0xDB,0x7E,0x8E,0x12,0x08,0xAB,0x9E,0x64,0x39,0xC2,0x1B,0x68,0x37,0x86,0xE6,0x3E,0x70,0xF9,0x29,0x37, +0x09,0x01,0x47,0x89,0xAE,0x81,0x5D,0x14,0xCA,0xF7,0x9B,0xBC,0x9B,0x8A,0x56,0x66,0x48,0xD4,0x8F,0x61, +0x38,0x79,0x25,0x3E,0x45,0x52,0xE7,0x39,0xD4,0xF5,0xAE,0x6A,0x8E,0x9B,0xE6,0xDD,0xDB,0x3A,0x96,0x60, +0x83,0xF1,0x02,0xB2,0x54,0xA0,0xE6,0x7A,0xF4,0x92,0x0B,0xB9,0xC4,0x53,0xE5,0x1A,0xC7,0xA0,0x65,0x66, +0x78,0xDE,0x93,0xEF,0x44,0x7D,0x6D,0xE7,0x19,0x7C,0xC2,0x6D,0xFC,0x1E,0xBE,0x06,0x77,0xC8,0x8F,0xD9, +0xED,0xC1,0xD5,0xDF,0x79,0x7B,0x27,0xE8,0xD7,0x5B,0xFF,0xC4,0x79,0xB3,0xB0,0xA6,0x22,0xC0,0x27,0xE4, +0x96,0x88,0x4A,0x20,0x7C,0x4D,0xBA,0x22,0xF7,0xE6,0x28,0x12,0x05,0xC1,0xD0,0x94,0x16,0x47,0xBE,0x02, +0x15,0xDD,0x0C,0x26,0xF6,0xA3,0x7C,0xE2,0x84,0x82,0x1A,0x65,0xD5,0xE2,0xD5,0x04,0x77,0x48,0x39,0x8B, +0x35,0xED,0x29,0x32,0x85,0x83,0x91,0x67,0x21,0xAA,0x95,0x96,0x04,0x49,0xE2,0x36,0x09,0x68,0x47,0x06, +0x81,0x23,0x03,0xC4,0xD3,0x6E,0xDC,0xE7,0xE5,0x49,0x5A,0xB4,0xF5,0xE2,0xB7,0xFF,0x01,0xC5,0x42,0x80, +0xB6,0x53,0xAD,0xB2,0x21,0x68,0x29,0xF2,0x05,0xDC,0xC9,0xE5,0x03,0xA1,0x21,0xCB,0xB8,0xA0,0x0F,0x4E, +0xC0,0xB4,0x5B,0x54,0xD0,0xB4,0x70,0x21,0x78,0xC5,0x16,0xD5,0x52,0x09,0xEC,0x42,0x66,0x46,0x99,0x21, +0x90,0xEA,0x22,0x0A,0x0C,0xC8,0xE9,0x8C,0x15,0xCC,0xB5,0x7A,0x6C,0xD4,0x72,0xC3,0xC7,0x13,0x2A,0x1A, +0x0D,0xC9,0xCA,0x5E,0x00,0x22,0xF0,0x38,0x45,0x01,0xE4,0x94,0x0D,0xA7,0x23,0x2F,0x8C,0x8A,0x9B,0x5F, +0x8C,0xA5,0x97,0x6B,0x8C,0x45,0x66,0xAB,0x90,0xD5,0x75,0x9D,0x8D,0x8B,0x2B,0xFD,0x1F,0xA3,0xC1,0xE4, +0x2C,0xCF,0x8A,0xBD,0xDC,0xA4,0xE2,0x22,0xF2,0x7F,0xDA,0xD0,0x9C,0x60,0x8E,0xEE,0x54,0xD6,0x0B,0x49, +0xFF,0x93,0x62,0xDE,0x0B,0x94,0x92,0xDC,0xD2,0xC2,0xC5,0x98,0xA6,0xBC,0xB2,0x4E,0xDD,0x21,0xA3,0x4F, +0xBF,0x7B,0x0D,0xAD,0x32,0x53,0x8C,0xEF,0xD0,0x9E,0x1F,0xF0,0x6B,0x38,0xB4,0x53,0x08,0x88,0xD3,0xA0, +0xFE,0x4F,0x6D,0x19,0xC9,0xFD,0xD4,0xFB,0xC9,0xBC,0x4D,0x79,0xA6,0x94,0x3A,0xEF,0xC9,0x68,0x30,0xBE, +0xB9,0x5A,0xAC,0x13,0x57,0x53,0xA3,0xE0,0x86,0xF4,0x12,0x66,0xC6,0xBE,0x0D,0xF2,0xD7,0x5C,0x43,0x49, +0x82,0xB3,0x2D,0x7E,0x25,0x49,0xBD,0x8F,0x36,0x9A,0x1D,0x92,0x45,0xDB,0x75,0x5F,0xFC,0x79,0xC2,0x69, +0x72,0xCC,0x8D,0x69,0x37,0xBB,0xD9,0x94,0x52,0x5E,0x64,0xD3,0x96,0x0C,0x5B,0x0D,0x9F,0xD8,0xEC,0xDA, +0xCB,0x3D,0x5A,0x66,0x3C,0x56,0xDB,0x62,0x60,0xA7,0xD3,0x2F,0x37,0xF6,0x6A,0xA4,0xB5,0x79,0xDC,0x02, +0xFE,0x06,0xBF,0x74,0x74,0x54,0x15,0x05,0x0C,0xD7,0xC5,0x55,0x72,0xBC,0x2F,0xCE,0x9A,0x79,0x35,0x7F, +0x91,0xB4,0x8D,0x65,0x20,0x90,0xDE,0x35,0x37,0x77,0xBD,0x7A,0xEB,0x68,0x9D,0xA1,0x1F,0xB5,0x7F,0x8A, +0x53,0x98,0x2B,0x7E,0x30,0xB7,0xD2,0x8D,0xDF,0x55,0x49,0x50,0x7A,0xE3,0x55,0x6B,0x8D,0x45,0xD6,0x1C, +0x34,0xDD,0x9E,0xF0,0xF8,0x75,0xC0,0x03,0xC2,0xA6,0x1D,0x6D,0xBC,0x64,0xC7,0xCF,0xA9,0x37,0xD3,0x8C, +0x7D,0x76,0xEB,0xDD,0x17,0x29,0x71,0x76,0x74,0x30,0x97,0x4F,0x52,0xB4,0x9B,0xF5,0x4E,0xBE,0xC0,0x45, +0x02,0x24,0xCE,0x68,0xF1,0x73,0x86,0x98,0xCE,0x37,0x16,0xBC,0x82,0xD1,0x37,0x42,0x78,0x6E,0x56,0x24, +0xA2,0x1B,0x5E,0xBC,0x5E,0x9D,0xBE,0x77,0xAA,0x56,0x43,0xA0,0xCA,0x21,0xF7,0x49,0x6B,0x7B,0xE3,0x2D, +0x3C,0x72,0x8A,0x6F,0xF4,0x77,0xEA,0x6B,0xE0,0x4F,0xEF,0x1B,0xEB,0xFA,0xF7,0xDB,0x37,0xB9,0xEA,0xC6, +0x04,0x9B,0xA6,0xFB,0x72,0x9C,0xAB,0xA5,0xD5,0x1E,0x97,0xF7,0x68,0xBD,0xD0,0xA9,0x4C,0x02,0xD8,0x2C, +0xD2,0xAC,0x6B,0xD0,0x45,0x07,0x8E,0x39,0x91,0xD6,0x92,0x70,0x09,0xCC,0xB8,0x25,0xB0,0x67,0x7C,0x46, +0x5A,0xDF,0xD7,0x3D,0x7B,0xB3,0xD0,0x48,0xC6,0xA2,0x1D,0xD5,0xD8,0x6D,0xA3,0xC3,0xE2,0x23,0x3E,0xB0, +0x65,0x60,0x79,0x67,0x02,0x4C,0x33,0x70,0x72,0x65,0xCC,0xC4,0x1C,0x4F,0xB8,0xC0,0x04,0x0C,0xF3,0x13, +0x2E,0x28,0x94,0xE0,0x52,0xB6,0xC1,0xD4,0x1D,0x4E,0x8B,0x70,0xE4,0x40,0x64,0x55,0xAA,0xA4,0x88,0x7D, +0xF0,0x7E,0x53,0xA0,0x84,0x34,0xA1,0x0E,0xDC,0x64,0x33,0x61,0xC1,0x06,0x88,0xF0,0x77,0x60,0x5B,0xB5, +0x85,0x35,0xF1,0xAA,0x11,0xEB,0x3B,0x41,0xC2,0x07,0x98,0x13,0x51,0x64,0x7A,0x7A,0xE3,0x19,0xB5,0xAD, +0xE8,0x2B,0x28,0xAA,0x8D,0x6F,0x38,0x1B,0xF9,0x97,0xF5,0xDF,0xCB,0x69,0xA2,0x7E,0x1F,0x5B,0x62,0xBA, +0x8C,0xC1,0x1A,0x7F,0x3F,0x94,0x63,0x5F,0x64,0x07,0x38,0x4F,0x39,0xD7,0x6B,0xAB,0x0D,0x24,0x3F,0xBF, +0xDC,0x60,0x03,0xAD,0xE2,0x04,0xEC,0xDF,0x38,0xD4,0x41,0xC6,0x6A,0x4D,0xF9,0xBD,0xD8,0x2B,0xCB,0xCC, +0x14,0x47,0x77,0x2E,0x98,0xE0,0x6E,0x4D,0xC8,0x80,0x55,0x8E,0xDD,0x4C,0xC3,0xDC,0x15,0x46,0xAA,0x17, +0x01,0xF0,0x62,0xFA,0x25,0x7D,0x98,0x9A,0xD9,0x25,0x51,0xAC,0x8C,0x3C,0x72,0xC9,0x8C,0x24,0x3E,0x1A, +0xA6,0x41,0xE9,0x9E,0xB1,0x75,0x59,0xA9,0x8D,0x3D,0xB3,0x7A,0x66,0x20,0xBF,0xFB,0x52,0x7F,0x11,0x8D, +0xD7,0x60,0x7A,0x86,0xC9,0x1F,0xBC,0x7B,0xB3,0x3D,0x2E,0xBF,0x1C,0x84,0x86,0x45,0x76,0x42,0x88,0x12, +0xB4,0x60,0x2B,0xA9,0xE5,0xE0,0x0F,0x43,0x5D,0x13,0x18,0xC7,0x4D,0xF4,0x57,0xCF,0xA6,0x20,0x7E,0x01, +0xFE,0xC8,0x86,0x52,0x98,0xFD,0x1C,0x5B,0x9B,0x7D,0xCD,0x84,0x91,0x19,0xAA,0xAC,0x61,0xA2,0xD8,0x1C, +0xE2,0xC0,0x8F,0x51,0xF7,0xE1,0xFB,0x52,0x23,0x1E,0x68,0xBF,0xEC,0xA9,0x34,0xB6,0x8E,0x59,0xDE,0xE0, +0xD1,0x79,0x30,0xA2,0xC8,0x64,0xB5,0x13,0xCE,0x93,0x9C,0x68,0x6D,0xFE,0xD6,0xD4,0xD0,0x78,0x11,0xB3, +0xA4,0x64,0x26,0xE1,0xB4,0x0D,0xAA,0x65,0xF8,0xFF,0xDF,0xF5,0x51,0x7B,0x2D,0x87,0x4F,0x1A,0x5C,0xAB, +0x79,0x06,0x25,0xF5,0x1E,0x15,0xD7,0xB5,0x50,0x71,0x82,0x79,0x18,0x38,0xE6,0xDA,0x7B,0xE5,0x28,0x85, +0x6E,0x6A,0x32,0xAE,0xEB,0x85,0x30,0xB1,0xA4,0x7B,0xEE,0xCA,0x60,0x94,0x24,0x42,0x92,0xF4,0x5B,0xC7, +0x7F,0xCB,0x39,0xA1,0x8B,0xAA,0xFF,0xAA,0x45,0x35,0x94,0x2D,0xFA,0x87,0xC9,0x4F,0xF4,0x38,0x71,0xB0, +0x40,0x4A,0x5F,0x7F,0x15,0x96,0xCB,0x84,0x02,0x38,0x5C,0x3F,0x3C,0x9E,0x39,0xBB,0x16,0x70,0x56,0xBF, +0x51,0x37,0x13,0xF6,0x81,0x38,0x5E,0xEF,0xDB,0xF4,0x0B,0x08,0xD4,0x96,0x5F,0xBA,0x1A,0x7D,0x3E,0xB3, +0x61,0xA1,0xFE,0x9E,0x3A,0x79,0x20,0x09,0xE0,0x5C,0x47,0xAE,0x09,0x25,0x6F,0x16,0x46,0x53,0xD3,0x0F, +0x78,0x36,0x17,0xE8,0x97,0xB0,0xF3,0x37,0x99,0xBD,0x27,0xDE,0x16,0x50,0xA7,0x3B,0x93,0x7E,0xA0,0x7D, +0xE4,0x01,0xC8,0x64,0xE3,0xE2,0x9A,0x68,0xE7,0xC6,0x9C,0x92,0xA9,0x8C,0x50,0xA2,0x9C,0xC3,0x0B,0xB2, +0xCD,0x82,0x92,0x19,0xE6,0x83,0x82,0xC5,0x69,0xA3,0xB7,0xF0,0x00,0x2F,0x67,0xDA,0x48,0xC1,0x9B,0x9F, +0x67,0xC4,0xD3,0x2F,0xD5,0x31,0x6C,0x16,0x07,0xBF,0x8A,0xB7,0x69,0x52,0x6C,0xB8,0xC3,0xB1,0x7C,0x9A, +0xD6,0x82,0xE9,0xC6,0x18,0xCF,0x57,0x73,0x32,0xE6,0x08,0x45,0xA7,0xCB,0x90,0x22,0x41,0xEB,0xCC,0x71, +0xA8,0xC7,0x97,0x34,0xE0,0xC0,0xEF,0x14,0xB8,0xD5,0x27,0x94,0xFB,0x6E,0x73,0xB2,0x80,0x14,0xA6,0x5E, +0x69,0xE7,0xB1,0x23,0xC6,0xDD,0x91,0x23,0xF7,0x6D,0x2E,0xCF,0x7A,0x2C,0xD1,0xA8,0x91,0x9C,0xC1,0xF1, +0x5E,0xB7,0x06,0x95,0x55,0xAF,0xB7,0x8E,0x40,0x99,0x11,0x32,0xE4,0x19,0xB8,0x58,0x90,0xAB,0x72,0xA3, +0x48,0x43,0x9C,0x78,0x66,0x86,0x92,0x61,0x9C,0xA4,0x44,0x9A,0x5D,0x84,0x36,0xC0,0x36,0xE6,0x6B,0x97, +0x0E,0x46,0x90,0x37,0x69,0xA6,0x90,0x8F,0x27,0xE9,0xCB,0x2A,0xDA,0xD8,0xAB,0x29,0xED,0x6A,0x6B,0x92, +0x47,0xA5,0xC0,0x33,0x68,0x34,0x3F,0x4C,0xE1,0x6E,0x1A,0x5E,0xEE,0x33,0x9B,0x14,0xEB,0x30,0xDD,0x88, +0xE2,0x31,0x3E,0x0C,0x1F,0xCC,0xDC,0x38,0xF0,0xE1,0xFF,0x19,0x11,0x72,0x7B,0x1C,0xE3,0x31,0xC2,0x2E, +0x5D,0xE2,0x43,0xE2,0x0C,0x42,0xCC,0x30,0x47,0x03,0x0B,0x63,0x6B,0x31,0x8B,0xED,0xD7,0x8A,0x09,0xDB, +0x8E,0x4C,0xD5,0x73,0x91,0x50,0x03,0x5C,0x32,0xC0,0x9B,0x3F,0xD1,0xE2,0xE0,0x71,0x10,0x94,0x70,0x64, +0x32,0x82,0x0A,0x06,0x12,0x7F,0x8C,0x57,0xD7,0x90,0xEC,0x1E,0xA8,0x45,0x6C,0x1B,0xE2,0xBB,0x42,0x13, +0x94,0x72,0x0A,0xD4,0x1E,0xFE,0xA4,0x07,0xFE,0x10,0x03,0x03,0xA6,0x6F,0xE5,0xD8,0x8E,0xF1,0x99,0x03, +0x76,0x3E,0x38,0x8C,0x91,0xD1,0xAC,0x15,0x70,0x1B,0x6D,0x40,0xC7,0x7E,0x3F,0x33,0xEB,0x4E,0xC4,0xB0, +0x44,0x13,0xA0,0x44,0xEB,0xBB,0xB4,0x93,0x28,0xD2,0xE6,0xF2,0x97,0x4B,0x6A,0xFF,0xA7,0x98,0x00,0xD4, +0x3F,0xD9,0xC8,0x90,0xE5,0xE9,0x54,0x63,0x53,0x58,0x1B,0xC4,0x5B,0x99,0xDD,0x75,0xBA,0xD6,0xDF,0x37, +0x47,0x29,0x0A,0x63,0xC3,0xEE,0xAD,0x4A,0xF1,0xD5,0xE5,0xD3,0x1E,0xA8,0xB9,0xAC,0x44,0xB2,0x23,0x17, +0xFB,0xB5,0x63,0xEB,0x2A,0xAA,0xFC,0x8F,0x9F,0xBC,0xA3,0x2E,0x7E,0x75,0x8C,0x5D,0x40,0xBA,0xEE,0x8F, +0x68,0x93,0xA0,0x7C,0x3B,0xEB,0xA9,0xC9,0x19,0x0A,0x7E,0x33,0x69,0x52,0xA3,0x0F,0xB2,0x32,0xA1,0xFD, +0x3E,0x76,0x09,0x96,0x90,0x75,0x72,0x02,0xFF,0x99,0xAC,0x1F,0xB7,0x7F,0x36,0x1B,0xA3,0x65,0x41,0x87, +0x14,0x78,0xC7,0xAB,0xFB,0xC9,0x32,0xA8,0xF2,0x7D,0x4E,0x5E,0x05,0xD8,0xC9,0x08,0xEC,0x10,0xAC,0x3F, +0x78,0x05,0x69,0x29,0x43,0x9B,0x0C,0x9E,0x1C,0xBE,0x46,0x78,0xF6,0x7F,0x6E,0x7C,0x7E,0x90,0x47,0xDA, +0xA8,0x2C,0x59,0x88,0x8D,0x3A,0x99,0x89,0x11,0xBB,0x9E,0x9D,0x15,0x55,0xC5,0xF1,0xA9,0xCD,0xEA,0x4F, +0x9D,0xBF,0xD0,0x19,0x43,0x22,0x40,0x1D,0xDB,0xFF,0xA8,0x38,0xE1,0x1B,0x7F,0xE4,0x50,0xA0,0xB8,0x24, +0x37,0x5C,0xB0,0xE5,0xF1,0x7B,0x68,0x5A,0xD9,0x0E,0x64,0x86,0x55,0x29,0x47,0xCF,0x47,0x3A,0xD2,0x56, +0x62,0xD5,0x18,0xE7,0xE3,0xFD,0x79,0x07,0x8C,0xDF,0xCE,0x7A,0xFF,0x90,0xCB,0xC3,0x52,0x66,0xBD,0xF3, +0x2D,0x0C,0x8F,0xFD,0xFA,0xA8,0x03,0x43,0x2A,0xF9,0x63,0xB7,0x51,0x09,0xF8,0xDF,0x10,0x49,0x3F,0xAC, +0x3A,0x69,0x57,0x79,0x71,0xA5,0xB0,0x66,0x4B,0x69,0x5A,0xD0,0x13,0x4A,0x82,0xBC,0xF2,0xDA,0xE0,0x4C, +0xE4,0xC8,0x81,0xB1,0x55,0x1D,0xA2,0x81,0x9A,0xFB,0x56,0xB6,0xF7,0x64,0xE9,0x9F,0xF1,0xE7,0x2A,0xE7, +0x52,0x7E,0x73,0xED,0x91,0x48,0x09,0xA0,0x02,0x8A,0x00,0x44,0x64,0x41,0x28,0xF7,0x53,0x1F,0xB6,0xEA, +0x8D,0xC9,0x00,0xEA,0x2B,0x83,0x4B,0x3F,0xAF,0x53,0xAA,0xC4,0x9C,0xA7,0xA4,0x6E,0xAA,0x45,0xA0,0xCC, +0xBA,0x32,0x20,0xCB,0x1A,0x92,0x82,0x38,0xF8,0xA6,0xAB,0x20,0x69,0x0C,0x3B,0xF2,0xD8,0xF5,0x00,0xD9, +0xC4,0x05,0xF3,0x2F,0xB7,0x67,0x19,0x5F,0xE1,0x10,0xC4,0xFB,0x1B,0x2F,0x3F,0xC4,0x8C,0xD0,0xC2,0x2B, +0x3C,0x70,0x1B,0x95,0xAF,0xD3,0xDC,0x5F,0x7F,0x23,0x72,0x14,0xEB,0x2E,0xEA,0x92,0xD8,0x68,0x13,0x80, +0xAE,0xFB,0xB4,0x34,0xE3,0x84,0x03,0x1A,0x08,0x2D,0x83,0xB4,0xFC,0xD0,0x42,0x2F,0x75,0x62,0xF1,0x5E, +0x39,0xC7,0x97,0xB9,0x94,0xE1,0x5A,0x0F,0x21,0xB3,0x0A,0x3F,0x5D,0x05,0x90,0x5D,0x62,0x8E,0x02,0x6B, +0x2C,0x54,0xDA,0x9B,0x5E,0xFF,0x4E,0x9D,0x60,0x16,0xFA,0xED,0xBF,0xB6,0x74,0xA2,0x39,0x5D,0xAE,0x42, +0x60,0xFB,0x2C,0x60,0x80,0xCE,0x91,0xD4,0x02,0x17,0xD8,0x36,0x45,0x57,0xEE,0xD6,0x32,0x81,0x2B,0x73, +0x03,0x14,0x8D,0xC5,0xBC,0x99,0xD1,0x24,0xA3,0xA1,0xCD,0x43,0x72,0x76,0x6D,0x93,0x8E,0x08,0xB3,0xFC, +0x16,0x35,0x3D,0x51,0x40,0x31,0x85,0xB8,0x50,0x31,0x1B,0x77,0x1D,0xC6,0x21,0xC6,0xD5,0x37,0xB3,0xA0, +0x2A,0xA8,0x8E,0xF9,0xD5,0x72,0x6C,0xB4,0x82,0x9F,0x8E,0x3C,0xA3,0xFA,0xFB,0x18,0xE3,0x05,0xDA,0x1C, +0x2D,0x3A,0x85,0x35,0xB5,0x10,0x85,0xCD,0x5B,0xFF,0xEE,0xBE,0x62,0x56,0xF5,0x11,0x53,0xF7,0x8A,0x39, +0xCB,0x58,0xED,0xC5,0x80,0x23,0x63,0x19,0x6C,0xD1,0x65,0x1D,0xB7,0x38,0xA4,0x0C,0x35,0x4F,0xA6,0x4C, +0x99,0xB2,0xF6,0x84,0xEA,0x5C,0x1B,0xD4,0x43,0x71,0xB6,0x78,0x31,0x02,0xC4,0x99,0xD2,0xC8,0xE6,0xDE, +0xE6,0xDF,0x62,0x54,0x66,0xF4,0xBF,0x69,0xAC,0x08,0xAF,0xDF,0xB6,0x58,0x1C,0xCB,0xDB,0x8E,0x6B,0xDE, +0x5B,0x48,0xAD,0x69,0xA5,0x54,0x23,0x0F,0xB5,0x31,0x19,0xF9,0xE5,0xD0,0x67,0xB5,0x9A,0x77,0xF2,0xAA, +0x69,0xEE,0x74,0xB8,0x09,0x28,0xD0,0xA8,0x66,0xF7,0x88,0x0E,0x04,0xF9,0x76,0x08,0x77,0x06,0x17,0x3B, +0x8A,0x9C,0xE6,0x07,0x80,0xAC,0x87,0xBB,0x7D,0xE5,0x1E,0xFC,0x0D,0x7B,0x7D,0x27,0x5B,0x05,0x0E,0xFC, +0xD9,0xBF,0x28,0xD3,0x59,0x3C,0x5B,0x3F,0x0A,0x93,0xF7,0x54,0x14,0x39,0x06,0xC8,0x4E,0x80,0xDB,0x7F, +0xFA,0x08,0x03,0xE4,0x37,0xAC,0x2F,0x64,0xD5,0x2A,0x10,0xDB,0x55,0xBB,0x97,0xD0,0x67,0x2B,0x80,0x96, +0x80,0x90,0x50,0x70,0xEE,0x28,0xE3,0x31,0x3A,0x59,0xB0,0xD0,0xD7,0xE5,0xD9,0xEB,0x0A,0xCD,0x26,0x17, +0xA7,0xA4,0x33,0xA7,0xA3,0x98,0x8B,0xC1,0xC4,0x69,0xC1,0x0F,0x02,0x23,0xAD,0x77,0xDD,0x1E,0xE4,0xC3, +0x24,0x7C,0x4D,0x55,0x14,0x69,0x66,0x3C,0xA1,0x94,0x7A,0xAE,0x8E,0xEB,0x64,0x04,0xB1,0xAA,0xCA,0x8E, +0x5E,0xAB,0x37,0xB2,0x03,0xAC,0xD6,0x3E,0x5E,0x4C,0xC3,0x2D,0xC7,0x45,0xA1,0xFA,0xF0,0xFE,0xDE,0xA5, +0x80,0xFE,0xDA,0xE2,0x84,0xE9,0x96,0x23,0x8E,0x3A,0x31,0x1A,0xC4,0x6B,0x8A,0xAF,0x1A,0x7C,0xF1,0x5A, +0x18,0x0A,0x20,0x57,0x62,0x38,0xFC,0x91,0xE4,0x21,0x63,0xEC,0x3F,0x7C,0x4E,0x91,0x1D,0x28,0xF2,0xC7, +0x2D,0x8A,0x35,0x4E,0x40,0xE5,0x70,0xE5,0xAE,0x8F,0xCA,0x1C,0x1E,0xA4,0x2F,0x7C,0xB1,0x85,0x64,0xD9, +0xB4,0xE6,0xDB,0x89,0x49,0xB4,0xFA,0x8D,0x69,0xE5,0x29,0x6B,0xCA,0xB1,0x73,0x62,0xE1,0xD1,0x0B,0xCF, +0x2C,0x07,0xBD,0x7D,0xF5,0xA6,0xFD,0xBF,0xB0,0xD9,0xFE,0xD8,0xEE,0x11,0xF7,0xB2,0x8E,0x37,0xFB,0xDC, +0xEF,0x01,0x2B,0xEB,0xB3,0x83,0x0A,0xEC,0xDE,0x47,0xB0,0x96,0x78,0x51,0x6B,0xDC,0x97,0xFC,0xEC,0x1C, +0xB0,0xD6,0xB0,0xE3,0x6C,0xC4,0x0D,0xA6,0xBA,0xCC,0x7D,0xDD,0xDE,0xA6,0x63,0xFF,0x84,0xD5,0xCB,0xEA, +0xD0,0x8C,0xB4,0xEA,0xFC,0x8B,0xD3,0x3F,0x9B,0x8F,0x6D,0x1D,0x38,0xA1,0x03,0x19,0xFC,0x8F,0x25,0x72, +0xDB,0xDF,0xA7,0xF5,0x48,0x1B,0x32,0x44,0xE6,0xD4,0x4C,0x24,0xF4,0x77,0x4C,0x90,0x1E,0x9C,0x00,0x66, +0x42,0x47,0x65,0x43,0xC2,0x0A,0xA4,0xAE,0xD4,0x7B,0x1F,0x6B,0x8F,0xDD,0xDD,0xB7,0x54,0x4D,0xBA,0xC1, +0xA7,0x22,0x8D,0xF5,0xB7,0x02,0x4D,0xC4,0x5C,0x9C,0x55,0x15,0x35,0x09,0x14,0x4E,0x07,0xA8,0xC5,0x86, +0x54,0xC8,0x2E,0xDF,0x15,0xD5,0xC4,0x9A,0x97,0x38,0xD8,0x7D,0x67,0x94,0xCE,0x04,0xF3,0xA1,0x54,0x77, +0xA1,0x57,0x13,0x3E,0x20,0xFA,0x6A,0x1A,0x25,0x7A,0x3C,0xBB,0x0C,0xFC,0x9D,0x41,0x26,0xDF,0x21,0x42, +0xF5,0xD6,0xD6,0xDE,0x0F,0x27,0x95,0x47,0xFA,0xF9,0xD9,0xB1,0x03,0x3A,0xD2,0x68,0xBF,0x77,0xEA,0xE0, +0xD4,0xD8,0x25,0x75,0x77,0x4C,0xFD,0xC0,0x53,0x1F,0x9E,0x5E,0x60,0xA3,0x74,0x53,0x93,0x9A,0xFD,0x49, +0x9D,0x9B,0xA3,0x63,0x0C,0x6B,0xCC,0x8E,0x3E,0xD9,0xE1,0x53,0x6B,0x09,0x06,0x40,0x6D,0xB4,0xE7,0x97, +0xF4,0xD8,0xC5,0x69,0x19,0xD6,0xEA,0xDB,0x9B,0xC6,0xF2,0x48,0xCF,0x31,0x87,0x0A,0x28,0x1B,0xF5,0x8F, +0x1A,0xBD,0x38,0x53,0x86,0x96,0x40,0xF8,0xCE,0xF2,0x86,0xD3,0x1D,0xD8,0xF4,0x31,0xC1,0x41,0x54,0x02, +0x11,0x13,0xCE,0x4B,0xF8,0xCC,0xD6,0x25,0x0E,0xFD,0xB3,0x26,0x90,0xA0,0x00,0x8B,0x5C,0x1F,0xDE,0xC3, +0xDE,0x72,0xBD,0xCA,0x9D,0xDF,0xC7,0xCF,0x0D,0x33,0x2E,0xDE,0x4B,0x0F,0xA7,0xE6,0xE7,0xF8,0x36,0xDD, +0xEB,0x9E,0xF9,0xBD,0xA5,0xD0,0x87,0x13,0xCB,0x92,0x00,0x7D,0x7F,0x2E,0x38,0x7D,0x23,0xD0,0xD9,0x85, +0xB5,0x9F,0xD0,0x6D,0x99,0x0D,0xCE,0xC6,0x18,0xE4,0x58,0x81,0x4D,0x0C,0x82,0x16,0xEE,0x3A,0x40,0x3C, +0xC3,0x45,0xF8,0x36,0x2A,0x6C,0x39,0x84,0x06,0xA0,0x31,0x91,0x71,0x41,0x49,0x25,0xD2,0x0F,0xF1,0x76, +0x23,0x6D,0xF6,0x56,0x8F,0x61,0x99,0x73,0x50,0x40,0x00,0x53,0x43,0x47,0xD3,0x28,0xE2,0x12,0x30,0xA2, +0x80,0x00,0x10,0x6F,0x38,0x31,0x48,0x64,0xEB,0xD9,0x68,0x97,0x24,0x1F,0x3C,0xB2,0x84,0xF0,0x73,0x16, +0xB2,0xD8,0x60,0xE2,0x4B,0x4D,0x98,0x88,0xEF,0x27,0x5D,0x23,0x00,0xDA,0x91,0xC1,0xD4,0xA8,0xFD,0xE3, +0x5F,0x82,0xB0,0x89,0x12,0x9D,0xD9,0xBC,0xC1,0xBC,0xE1,0x37,0x11,0x23,0xD9,0xB7,0xD1,0x9C,0xC6,0xD9, +0xE0,0x8B,0xE2,0x18,0x8A,0x0C,0x56,0xDC,0x99,0xD0,0x8C,0xAC,0x55,0xF4,0x6A,0x0B,0xF9,0x97,0xBE,0x7A, +0xE2,0xD8,0xB2,0x41,0xE6,0x6C,0x25,0x67,0x4F,0x31,0xDC,0xDA,0xFC,0x05,0xD3,0x6B,0x63,0xBB,0x7C,0x7E, +0xFB,0x8B,0xB8,0x53,0x1D,0xB6,0xB9,0xFD,0x84,0x71,0xCB,0x54,0x0C,0xA6,0x8A,0x6F,0xB7,0xF4,0xC7,0x06, +0xB1,0xD4,0xF9,0x2C,0xDA,0x0B,0xBD,0xCC,0x35,0x85,0x52,0xC8,0x5F,0xAF,0x76,0x95,0xCB,0xF9,0x6A,0x82, +0x4A,0x21,0x97,0x49,0xEA,0xB2,0xA2,0x3E,0xE4,0x23,0x82,0x5D,0x97,0x2E,0xBB,0x80,0x9B,0x2F,0x98,0x03, +0xF5,0x12,0x6A,0x3F,0x21,0x31,0x4A,0x53,0xA7,0x0C,0x2E,0x94,0x96,0x95,0x8B,0xB4,0xEA,0xD4,0xF3,0xA3, +0x9D,0xCD,0xF8,0xDD,0x13,0x6C,0x07,0x8F,0xE8,0x83,0xB4,0x11,0xA6,0x10,0xDD,0x00,0x03,0xEE,0x34,0xD1, +0xC1,0x8F,0x10,0x54,0x8F,0x7F,0x26,0x40,0x7D,0x10,0x88,0x76,0x37,0x6A,0x8B,0x58,0x73,0x1E,0x11,0x4D, +0x50,0x11,0x65,0x83,0xF5,0x1F,0xE5,0x25,0xBC,0xB9,0xA1,0xC3,0x6D,0x84,0x55,0xE8,0x75,0x30,0x35,0x81, +0x05,0x23,0xB4,0xB5,0xA9,0x73,0xDD,0xFC,0xAC,0xAC,0x5D,0x41,0xDF,0x31,0x90,0x3E,0xDF,0x95,0x96,0x04, +0x36,0x19,0x74,0xC0,0xC3,0x8B,0xFF,0x60,0x3B,0xCB,0xB7,0xAF,0x10,0xF5,0x0C,0x80,0x51,0xE0,0x04,0xF5, +0x96,0xDC,0x1C,0x89,0x68,0x73,0xE1,0x3E,0x43,0xC5,0x68,0x41,0xFB,0x1F,0xE1,0x83,0x83,0xFC,0x0A,0x65, +0x85,0x03,0xE6,0x96,0xAD,0xCB,0x1F,0xEA,0xDD,0x75,0xEC,0x91,0xE7,0x7A,0x70,0x01,0x90,0x22,0xE6,0x88, +0x08,0x89,0xB2,0xFF,0x18,0x38,0xD6,0x5D,0x6A,0x43,0x81,0x2E,0x7E,0x90,0x36,0x6B,0x51,0x7C,0xAE,0x64, +0x98,0xB5,0x4E,0xB1,0xCA,0x42,0xC7,0x8C,0x1A,0x86,0x86,0x0B,0x28,0xB3,0x07,0xAE,0x51,0x3C,0xD1,0xCF, +0x17,0x5C,0x6E,0x29,0x84,0x3C,0x37,0x6A,0xDD,0xE0,0x4B,0x18,0xFA,0x5B,0x5E,0x19,0xB1,0xCB,0x67,0x3F, +0x30,0x24,0x82,0x02,0x91,0x63,0xC8,0x3D,0xE3,0xC1,0x6D,0x6A,0xEA,0xDD,0xAE,0xCB,0x19,0xD6,0x91,0xD8, +0x5C,0x12,0x0E,0x8D,0x12,0xA0,0xA1,0x7A,0xEB,0x1C,0x84,0xD2,0xD8,0x18,0x18,0x49,0xD9,0x6B,0xE8,0x97, +0x4F,0xA2,0x6F,0x17,0x46,0x53,0xAF,0xCA,0x59,0x1B,0x8F,0xDD,0xBD,0x5D,0xB7,0xFA,0x42,0x30,0x67,0x03, +0x47,0x52,0xE1,0x49,0x58,0x1A,0x37,0x45,0xCE,0xBB,0x8A,0xA3,0x57,0xAD,0x4F,0xDC,0x42,0x02,0xEA,0x37, +0xF3,0xE6,0x4E,0xFB,0x04,0x03,0x68,0xFF,0x2D,0xBA,0x87,0x70,0xE4,0x83,0x3F,0x07,0xF4,0x40,0x29,0x8F, +0x6D,0x53,0x2E,0xE8,0x68,0xB9,0x5B,0x5D,0x45,0xCF,0x91,0xDB,0x75,0x68,0x17,0x2A,0x0A,0x25,0xBD,0x71, +0x2A,0xB8,0xB4,0xF7,0x7A,0x81,0x81,0xDF,0xAD,0xAC,0xCB,0xBF,0x3F,0xFF,0x2F,0x58,0x70,0x50,0x53,0xC2, +0xB3,0xC8,0x48,0x88,0x46,0xA9,0xB5,0x22,0x23,0x9E,0x8A,0xA9,0xFE,0x66,0xB8,0x23,0xB5,0x48,0x4D,0x8B, +0xC5,0x3E,0x67,0x31,0x7D,0xC4,0x37,0x80,0x7F,0x45,0x49,0x1C,0x47,0xCB,0x0C,0x9E,0xD4,0x7D,0xC7,0x35, +0x6C,0x04,0xF3,0x55,0x55,0xA3,0x04,0x99,0x44,0xCA,0xDB,0xF3,0xAE,0x4B,0xFB,0xCA,0x54,0x25,0x32,0x68, +0x3C,0x18,0xBF,0xDE,0xCF,0xC5,0x06,0x4C,0x6F,0x3A,0xAC,0x9E,0x2E,0x3E,0xD5,0x1C,0x5D,0x06,0xFA,0xAF, +0x12,0xD2,0x94,0x85,0xFE,0xE4,0xB0,0x98,0xBB,0x80,0x21,0xFC,0x87,0x27,0xCC,0xE9,0x6D,0x15,0x4B,0x08, +0x7D,0xEC,0x63,0x1F,0x0A,0x1A,0xE6,0x24,0xAE,0x5E,0xFD,0x44,0x6A,0xCD,0x17,0xAD,0xC9,0xE1,0x63,0x2C, +0xE5,0x2F,0xEA,0xE6,0xFF,0x03,0x8D,0xA8,0xEF,0x13,0xCC,0xDB,0xAA,0x2F,0xBC,0x29,0x65,0x2C,0xB3,0x14, +0xBA,0x0B,0xAE,0x64,0x69,0x79,0x51,0xDB,0x8A,0xF3,0x59,0xB8,0xE8,0x21,0xB1,0xBC,0xF4,0xC0,0xB3,0xFE, +0x91,0x3A,0xAA,0x7A,0x53,0x8D,0x53,0xA4,0x66,0x0C,0xBD,0xD7,0x3A,0x09,0x2F,0x61,0xED,0xC9,0x86,0x84, +0x0E,0x32,0x3E,0x7E,0x24,0xD2,0xFD,0x0F,0x93,0xAB,0x8C,0x20,0x46,0x20,0x8C,0xE1,0xBE,0xCB,0x73,0xF2, +0x0C,0x97,0xA8,0xD6,0x79,0xAA,0x06,0x50,0xE5,0xC1,0x61,0xB8,0xF7,0xF5,0xFB,0xF5,0xA2,0xEA,0x05,0xF1, +0x3B,0x34,0x4D,0x21,0xC6,0x62,0x4D,0xD5,0x0B,0xB0,0x0D,0xFB,0x04,0x4C,0xE8,0xF1,0x4A,0xFE,0x82,0x55, +0x67,0xD0,0x76,0xD5,0x77,0x2F,0x6A,0xA3,0x87,0x6B,0xE2,0x77,0xDF,0x17,0xEB,0x02,0x62,0x49,0xCA,0x53, +0xD5,0x91,0xCE,0x8D,0x84,0xF0,0xCC,0x8D,0x31,0x1D,0x47,0x0B,0x2B,0x2E,0xC2,0x43,0xD4,0xB4,0xD1,0xA1, +0x24,0xEA,0xBD,0xC3,0xFE,0x35,0xEE,0x83,0xE2,0xFB,0xCB,0x53,0x55,0x93,0xD2,0x31,0x4E,0x34,0x92,0x2E, +0xB7,0x2C,0x6D,0x0F,0x67,0x95,0xC7,0x75,0x6A,0x3C,0x46,0x88,0x41,0x95,0x31,0x68,0xBE,0xBC,0x31,0x5A, +0x64,0xD7,0x05,0x4C,0xFE,0xFC,0x05,0x18,0xAD,0xC0,0xF7,0xA2,0x9A,0xF4,0x31,0x49,0x6B,0xD3,0x09,0x5C, +0xFF,0xFD,0x58,0xF0,0x7D,0x47,0xFC,0xED,0xFF,0x49,0xF7,0xD3,0x43,0x98,0x78,0xCD,0x7E,0x26,0x17,0x19, +0x2D,0xA2,0xF1,0x7D,0xB1,0x3E,0x3F,0x3F,0xD0,0xA7,0xA7,0xDD,0x7F,0x27,0x74,0xCE,0xD5,0x11,0xCE,0x33, +0x3C,0x67,0xAF,0xCF,0x93,0xD5,0x8E,0xC9,0xDD,0x99,0x2E,0x26,0x93,0xDF,0xD9,0x6B,0x0C,0x51,0xA1,0xF8, +0x98,0x62,0x53,0xE8,0xDC,0x98,0x31,0x7B,0x5D,0x65,0x52,0x4B,0xC3,0x84,0xF7,0x88,0x1F,0x53,0x8F,0xC8, +0x5D,0xF8,0xB7,0xFE,0x52,0x47,0x57,0x2C,0xC5,0xAF,0x04,0xD4,0xC1,0x8A,0x87,0xB9,0xED,0xBE,0x3A,0xF3, +0x7E,0xAF,0x26,0x62,0x30,0x0D,0xCD,0x30,0x46,0x12,0x50,0xA8,0x77,0x6A,0xFD,0x91,0x0A,0xD2,0x5C,0xB3, +0xCD,0xD2,0x78,0x66,0x8E,0x03,0x58,0xBD,0x5D,0x0F,0x09,0x7E,0x86,0x10,0x01,0x06,0xA9,0x60,0x67,0xA5, +0xDA,0x3C,0x92,0xA1,0xCA,0x4B,0x4D,0x56,0xD6,0x01,0xAD,0xF0,0xA2,0xC7,0x5C,0x9D,0x4C,0x01,0x7E,0x4F, +0x07,0x6B,0x97,0x41,0x80,0xC8,0x9E,0xF9,0x1A,0x66,0x11,0x06,0x94,0x4C,0xF4,0x81,0xDA,0x5D,0x80,0xE7, +0x8E,0x8E,0xC8,0xAD,0x07,0x67,0x62,0x83,0x35,0x07,0x62,0x70,0xDB,0x5C,0x4B,0x23,0x7D,0x44,0x00,0xD5, +0x6D,0xBD,0xD5,0x90,0xBC,0x66,0x88,0x72,0x77,0x67,0x4D,0xCE,0x86,0xF4,0x8F,0x0B,0x95,0xB5,0x98,0x76, +0xC0,0xAD,0x87,0xC9,0xDB,0x25,0xD4,0x6D,0x0A,0xF7,0x3A,0x2C,0xBD,0x68,0x53,0x3D,0x4B,0x28,0x16,0xDD, +0x26,0x48,0x4E,0x81,0x74,0x4B,0xDA,0x03,0x67,0x0D,0xB0,0x0F,0xE8,0x36,0x1A,0x62,0xD4,0x0B,0x1D,0x88, +0xDC,0xB3,0xA7,0x64,0x9E,0x59,0x4D,0x94,0xC0,0x4C,0x53,0xA1,0x9A,0x71,0x42,0xFC,0x8F,0x49,0x57,0xF5, +0x55,0x66,0xDB,0xB0,0xA0,0x09,0x30,0xB8,0x4A,0x54,0x66,0xAD,0x39,0xC8,0xA1,0x0C,0x1E,0x08,0x08,0x8F, +0x22,0x9F,0x13,0x6B,0x59,0xCE,0x6E,0x31,0x89,0xC1,0x68,0x3A,0x3B,0x20,0xDC,0x98,0x5A,0xE6,0x1A,0xF5, +0x48,0x01,0xFB,0x69,0x2F,0x4E,0x1F,0x4E,0xA3,0x35,0x93,0xE0,0xD9,0xC7,0x89,0x8A,0xB2,0xBD,0xFC,0x3B, +0x74,0x88,0x4B,0x5E,0xA2,0x84,0x23,0x7D,0x22,0x9C,0xC1,0x7F,0x19,0xCB,0xAE,0x3D,0x26,0x42,0xA0,0xED, +0x03,0xD4,0x66,0xA4,0x62,0x56,0x9D,0xA6,0x75,0x6B,0xB3,0x78,0x25,0xCD,0xA8,0xFD,0x37,0xFB,0x7C,0xE6, +0x20,0x5C,0x1C,0xB7,0x48,0x77,0x6A,0x05,0x9B,0x0D,0x3D,0xA5,0x51,0x72,0xBF,0x1D,0x41,0xAD,0x37,0xC3, +0xD0,0xFF,0xA1,0x14,0x74,0x71,0x30,0x8A,0xCF,0x17,0xF1,0x2E,0xE0,0x33,0x37,0x8A,0x50,0x8C,0x1A,0x7D, +0x2A,0x56,0xC0,0xD5,0x44,0x30,0x94,0x69,0x53,0x16,0xF0,0x8D,0x41,0x90,0x12,0x6D,0x2B,0x13,0x60,0x4F, +0xC6,0xA3,0x9C,0x79,0x37,0x17,0xF8,0x9D,0x18,0xA6,0x84,0x25,0xA3,0x76,0xAA,0x41,0xA8,0x20,0x14,0x9F, +0x0B,0x85,0x6D,0xC5,0x1B,0x36,0xE7,0x6D,0x02,0xE8,0xC5,0xD0,0xD8,0xC4,0x18,0xF4,0xE5,0xD5,0xD9,0x71, +0xE5,0x13,0x6F,0x63,0xD3,0x84,0x5A,0x64,0xFC,0x75,0x48,0x15,0x60,0x1A,0xE4,0xA8,0x3C,0x1D,0x36,0xE3, +0xA8,0x14,0x93,0x1E,0xFC,0xCC,0x1E,0x41,0x2D,0x1B,0x1B,0xC3,0xF6,0xFF,0xBC,0xD3,0x59,0x16,0x97,0xEA, +0xBC,0x1E,0xD6,0x39,0x17,0xC1,0xAF,0xDD,0xFC,0x73,0xCF,0x14,0xEC,0x1D,0xB7,0x62,0x5B,0x7B,0x59,0xE7, +0xDA,0x18,0x1F,0x7D,0xB1,0x39,0x86,0x0C,0xC4,0xE1,0xC2,0x4E,0xFF,0xC9,0x8C,0x2A,0xCB,0xE3,0x9E,0x75, +0x19,0x13,0x17,0xCE,0x8E,0x0D,0x0D,0x5E,0xFE,0x25,0x61,0x7C,0x75,0x09,0x97,0x03,0xF4,0xF4,0xCF,0x74, +0x22,0x75,0xFF,0xBD,0xBE,0x35,0x3F,0x8B,0x19,0x32,0xC1,0x51,0xFC,0x4C,0x5F,0xAA,0xAF,0x3B,0x0F,0x54, +0xE3,0x7D,0x57,0xE8,0x80,0xAC,0xFF,0x6F,0x73,0x77,0xFA,0x83,0x01,0x6B,0xB0,0x61,0x10,0x84,0x71,0x5C, +0x42,0x92,0x4F,0xA2,0x06,0x76,0x80,0x3C,0x0B,0x63,0x04,0x69,0xD7,0xC1,0xEF,0x33,0xC7,0x0D,0xBC,0xB4, +0x90,0xE6,0x63,0x66,0xB3,0xE0,0xBC,0x83,0xC6,0x22,0xFC,0xE3,0xC8,0x69,0xF9,0x22,0xBF,0x11,0x9C,0x96, +0x45,0xD4,0x12,0x67,0x15,0x25,0x8E,0x51,0x4A,0x45,0x81,0x85,0xD1,0x33,0xE0,0x56,0xAA,0x89,0x33,0x47, +0x10,0xF6,0xB0,0xEB,0x92,0x86,0xB8,0x63,0x3D,0x17,0xD7,0x95,0xC5,0xC5,0x14,0x67,0x61,0xE7,0xB8,0xFA, +0xF0,0x87,0x42,0xF2,0x4D,0xF3,0x7B,0x47,0xA7,0xF6,0x45,0x87,0xC0,0x2D,0x30,0x1D,0x2F,0x15,0xF5,0x76, +0xA0,0xE2,0x21,0x42,0x81,0x15,0xAC,0x9F,0x68,0xCB,0x3B,0x87,0x3A,0x66,0x55,0xEC,0x22,0x71,0x60,0x8E, +0xB2,0x88,0x82,0xCE,0x10,0x03,0x36,0xEA,0x08,0xAD,0xD2,0x78,0x01,0xE5,0x8C,0x7C,0x2D,0x84,0xD7,0x61, +0x7C,0x89,0xBE,0xCB,0x33,0xE9,0x4D,0x3F,0x51,0x42,0x23,0x9B,0xA3,0x91,0x74,0x0E,0x9A,0x93,0x0B,0xB9, +0xC8,0xC2,0x4C,0xAB,0xF3,0xBB,0xAB,0x18,0xB4,0x8D,0xB3,0x1B,0x15,0xC0,0x5B,0x6D,0x6F,0xC6,0x6C,0x3E, +0x5F,0x27,0x19,0x0A,0x02,0x27,0xF8,0x4C,0xDC,0x88,0x4A,0x91,0xBB,0xAF,0xFA,0x6B,0x35,0x1F,0xDD,0x38, +0x2C,0x6D,0xF0,0x5C,0xDD,0xC9,0x45,0x38,0xEE,0x66,0xC2,0xB9,0x9D,0xED,0xB4,0x4A,0x0C,0x42,0xEB,0x47, +0x11,0x53,0x08,0x11,0x4F,0xC3,0xF7,0xED,0x1B,0xE9,0xDF,0x39,0xAC,0xEF,0xE3,0x5A,0xF4,0x5C,0x03,0x7F, +0x26,0x1C,0xB3,0x7B,0x57,0x84,0x8E,0xC3,0x85,0x0F,0x26,0xA1,0x95,0x39,0x8C,0x9F,0x9B,0xC2,0xF7,0x5C, +0x75,0x90,0x71,0x78,0xA6,0x9C,0x40,0x04,0x31,0xBB,0x44,0xB6,0xD8,0x93,0x16,0x89,0xD4,0xFA,0x91,0xE1, +0x5F,0xD0,0x25,0xE7,0xA8,0x4F,0x8D,0x1F,0x13,0x79,0xEB,0x1A,0xFC,0xF4,0x52,0x51,0x04,0x0C,0xAB,0x13, +0xE7,0x2C,0x78,0xAD,0xE3,0xE1,0x3B,0x90,0x54,0xF8,0x79,0x40,0xE3,0x71,0xA5,0xB8,0x30,0x86,0x70,0xE0, +0x26,0x74,0x75,0x99,0x17,0xF0,0x72,0x56,0x3D,0xF5,0x93,0x52,0x0C,0xAA,0xD6,0xCD,0xC6,0x5C,0xA2,0x4B, +0x7F,0x55,0x5D,0x3C,0xA0,0xA4,0x64,0x43,0xAC,0xD6,0xA6,0xA2,0x7A,0xD0,0x97,0xF0,0xF5,0x96,0xAD,0x4B, +0x1A,0x9F,0x2D,0x5E,0x5B,0xF5,0xFD,0x93,0xEB,0x7C,0x2E,0xF5,0x20,0xF1,0x8A,0xF5,0xF6,0x45,0xAE,0x8B, +0x57,0x4B,0xB2,0xED,0xB2,0x45,0x32,0x5F,0x02,0xD8,0xF9,0x9B,0xAF,0x55,0x96,0xEE,0x35,0xB0,0xE9,0xBB, +0xEF,0x15,0xFF,0xC0,0x7B,0xAB,0x44,0x4B,0xA0,0x31,0xA3,0x0D,0x79,0x4F,0xD4,0x6B,0xE0,0x71,0x77,0x26, +0xD5,0xB8,0xE5,0x1F,0xB7,0xC8,0x2B,0x6E,0xC3,0x9B,0x36,0xFA,0xB8,0xC0,0x72,0x7F,0xF1,0x50,0x24,0x3B, +0x8D,0xDC,0x23,0xC8,0x3F,0xDC,0xA1,0xEB,0x68,0xEE,0x5C,0x3A,0x78,0xCE,0xAE,0x52,0xDA,0xF1,0x44,0x7C, +0x9E,0xD3,0x1E,0xAC,0x36,0x9F,0x9E,0xA8,0xB0,0xBF,0xD8,0x4F,0xB4,0x4A,0xB9,0x72,0xB6,0xB8,0x6B,0x6F, +0xFC,0x03,0x26,0x6B,0xE4,0xA2,0x36,0x7F,0x0A,0x69,0x8D,0xDF,0xBC,0xFF,0x3C,0x5C,0xEE,0xBF,0xBA,0x53, +0x70,0xBD,0x41,0x15,0x03,0x60,0xAB,0xE6,0xBC,0x3C,0xAE,0x29,0xA7,0x50,0x10,0x53,0x74,0x17,0xA2,0x2F, +0xA0,0x6F,0xA6,0x13,0xC0,0xDF,0xA6,0x39,0xE6,0x51,0xBD,0x32,0xC5,0x05,0x5F,0xBC,0x88,0x04,0xAF,0x03, +0x01,0xBE,0xFE,0xCF,0x40,0x8A,0x6A,0x21,0x7D,0x23,0x6B,0x11,0x80,0x6A,0xB4,0xCB,0x7C,0x27,0xF6,0xDF, +0x41,0x90,0xA3,0xB2,0xF5,0x14,0x38,0x3E,0xC2,0x05,0x96,0xA6,0xE1,0x59,0x68,0x44,0x41,0x74,0x04,0x9E, +0xEF,0x07,0x30,0xA1,0xA0,0x15,0xFD,0xB6,0xAE,0xD1,0xFA,0x92,0x53,0x88,0xBD,0x34,0x13,0x18,0xA9,0xD9, +0x75,0xB3,0x62,0xA7,0x72,0xF9,0x6C,0x50,0x46,0x59,0x2C,0xE5,0x1D,0x06,0xF6,0x6C,0x7C,0xBA,0xB1,0x67, +0x4E,0x8B,0xC9,0xDE,0x34,0x17,0xBC,0x9A,0x8F,0x79,0x26,0x61,0x3B,0xEC,0x85,0x07,0x9C,0x7C,0x33,0x2E, +0x98,0x2C,0x96,0x34,0xB1,0x2C,0x2A,0x45,0x62,0xDA,0x70,0x14,0xC6,0x16,0xF5,0xD6,0xC9,0x0A,0x3E,0x90, +0xB2,0x0D,0xBB,0x29,0x65,0x4A,0x27,0x7F,0x16,0x4F,0xAD,0x20,0x6B,0x2F,0x86,0xDE,0x5C,0xC7,0x0F,0x9D, +0x9F,0x6F,0xB0,0xF3,0x21,0x24,0xA7,0x30,0x2E,0x5B,0xA3,0x19,0xDA,0xAB,0x96,0xB3,0x0B,0xEC,0xBA,0x70, +0xC3,0x1F,0x6F,0x59,0xCE,0x53,0xEC,0x1E,0xE1,0x33,0x32,0xBE,0x2F,0x61,0x73,0x6E,0x63,0xF1,0xE2,0x5C, +0xA2,0x29,0x4D,0x83,0xAE,0x0E,0x22,0x89,0xCE,0xA0,0x38,0x3F,0xE8,0xB1,0xEB,0x9A,0x69,0x5E,0x43,0x85, +0xC8,0x93,0x2A,0xA2,0xD7,0xA1,0x9D,0xBF,0x60,0xA2,0xCA,0x8A,0x47,0x72,0x20,0x06,0xF5,0xD0,0x64,0xD6, +0x67,0x52,0xBD,0x86,0xAF,0x04,0xFB,0x4E,0xE0,0x4A,0xA5,0x46,0xAD,0xE4,0xA5,0x12,0xE4,0xFF,0x68,0xB3, +0x96,0x21,0x24,0x97,0xC6,0x41,0xBB,0x56,0x91,0xA0,0x40,0x2D,0xA6,0x20,0x25,0x8B,0x3C,0xBF,0x30,0xA7, +0x74,0x36,0xED,0x97,0xC0,0xAE,0xCD,0x18,0x97,0x7D,0x62,0x7E,0x31,0xAF,0xF2,0x5F,0x61,0xCB,0x66,0x91, +0x03,0x73,0x02,0x9E,0xAF,0x99,0x64,0x4E,0x33,0xA4,0xF4,0xAA,0x85,0x44,0x94,0x9B,0x0E,0x8B,0x37,0xD2, +0x2F,0x57,0x37,0xAF,0xA5,0x8A,0xA7,0xF9,0xDA,0xF4,0x08,0x0F,0xA2,0x16,0x22,0x3A,0x43,0x80,0xBB,0xC3, +0x47,0x40,0xE7,0x03,0xC6,0x21,0x6E,0x40,0x05,0xCB,0x0B,0x8F,0x81,0xB9,0xF6,0x5E,0x40,0xC7,0xFD,0xBB, +0x44,0xFA,0xF6,0xBF,0xDD,0x6B,0xC6,0x00,0x64,0x12,0xA7,0x6E,0xC5,0x31,0x36,0x6E,0xE8,0x07,0x13,0x12, +0x78,0x49,0x6E,0xCE,0xD5,0x14,0x22,0x96,0x9A,0x84,0x3E,0xD1,0xE9,0x16,0x61,0x87,0xDA,0x38,0x83,0x78, +0xD6,0x3A,0x83,0x91,0xED,0x33,0x37,0xFF,0x68,0xD4,0x28,0xB6,0x5B,0xFE,0xE3,0x0B,0xA9,0x13,0x9D,0x99, +0x5B,0xBB,0x3F,0x1C,0x69,0x59,0xA5,0xE7,0x4A,0xD0,0xC0,0x8F,0xCB,0xEA,0xA8,0x2E,0xFD,0xB1,0x2E,0xE0, +0xCD,0x1D,0x96,0x3B,0x36,0x0A,0xDE,0x8B,0x88,0x02,0x37,0xAE,0xEA,0x02,0x75,0xF7,0xC8,0xD8,0xD6,0xF0, +0x82,0x0B,0xB8,0xBB,0x7C,0xC1,0x6C,0x22,0x5B,0x82,0x6E,0xF6,0x49,0xDB,0xEC,0x63,0x4B,0x48,0xFB,0xBB, +0x9B,0x10,0xFE,0xDB,0x9F,0x28,0x4C,0x03,0x52,0x8B,0xA0,0x87,0x6D,0xE0,0x68,0x9E,0x67,0xEF,0x9F,0xE9, +0x30,0x94,0xDF,0xCC,0xC4,0xDB,0x8D,0x17,0xD0,0xFF,0x61,0xED,0x8A,0x08,0x51,0x74,0xB9,0xBD,0xD7,0xDC, +0xC5,0xCA,0x3A,0x5D,0x3D,0xA5,0x37,0xBF,0x82,0xB0,0x01,0x09,0x18,0x3F,0x8D,0x2A,0x63,0xD2,0x0B,0x03, +0x6A,0x3D,0x09,0x81,0x4D,0x89,0x87,0x11,0x04,0x3F,0x18,0x35,0x15,0xA7,0xC0,0x51,0xF1,0x4E,0x18,0x2C, +0x22,0xC8,0xB3,0xBC,0x32,0x0F,0x94,0x91,0xE5,0xA1,0xCB,0xC3,0xA5,0xD8,0x6D,0xF4,0xCC,0x08,0xE8,0x29, +0x6B,0x5A,0x8D,0x73,0x4D,0x68,0xFE,0xF9,0xEE,0xB3,0x0F,0x39,0xA4,0x6B,0x99,0x4F,0xFD,0xE2,0x4C,0xE4, +0xE2,0xD9,0x25,0x2C,0xD4,0x08,0xC5,0xC8,0x7C,0x0A,0x52,0xF2,0x60,0x1B,0xD9,0x5A,0x2C,0x83,0xF1,0x62, +0x26,0x91,0x23,0x4D,0xF1,0x01,0x8C,0x09,0xCD,0xA7,0x8E,0x23,0xEF,0xAD,0x12,0x07,0xB7,0xAC,0xAE,0xEB, +0x73,0xA9,0x83,0x44,0xD4,0xCD,0x1F,0x3C,0xD9,0xAD,0x1E,0x4C,0xD3,0xA8,0x03,0x99,0x08,0x80,0x17,0x45, +0x55,0xEE,0xDC,0xC5,0x4C,0x43,0x8D,0x28,0xEA,0x45,0x2D,0xA7,0x0D,0x35,0x80,0xC0,0x28,0x75,0x03,0x1C, +0x2A,0xDB,0x04,0x24,0x7E,0x6E,0x01,0xB0,0xFB,0x8F,0x36,0x15,0xCF,0xCF,0x4C,0x6D,0x78,0x63,0x89,0x05, +0xC8,0xD3,0x50,0x1D,0xD1,0x72,0xC4,0x58,0x81,0x10,0x02,0x5D,0xEC,0x8C,0xD7,0x90,0xBE,0x71,0xDD,0xDA, +0x28,0x20,0xC8,0x1C,0x1A,0xCD,0xD7,0x01,0x6D,0x63,0x74,0xA5,0x7F,0x63,0x51,0xC5,0x78,0xCD,0x0A,0x25, +0x05,0x02,0x33,0x72,0x76,0x6E,0x06,0x5B,0xB4,0xE0,0xE4,0x80,0x60,0x8B,0xA4,0x46,0x8E,0x1F,0x14,0x94, +0xE4,0x8D,0xCC,0xAE,0x89,0x01,0x2A,0x63,0x5B,0xB1,0xDE,0x86,0x35,0xBB,0x1C,0x7C,0xE5,0x9C,0x87,0x13, +0x86,0x2C,0x87,0xE5,0x84,0x5F,0x05,0xE8,0xD4,0xF2,0x15,0x2D,0x64,0xC7,0x4A,0xD9,0xDA,0x2D,0x0D,0x82, +0xA3,0x2B,0x1A,0xB2,0x99,0x1B,0x1D,0xFD,0x65,0xB0,0xDA,0xCD,0x67,0xFB,0x4A,0x20,0x95,0x39,0xE4,0x85, +0x8C,0xB4,0x0C,0xD0,0x16,0x4B,0xCD,0x6D,0xC5,0x04,0xEC,0x43,0xAB,0x98,0xD7,0xD9,0x94,0x31,0x6F,0x08, +0xD2,0x01,0xD3,0x19,0x96,0x69,0xC5,0x52,0x22,0x9D,0xA8,0x69,0xB6,0x07,0xD4,0x01,0x1F,0x53,0x9B,0x05, +0x61,0x7B,0x3C,0x31,0x83,0xE0,0x42,0x89,0x6E,0x28,0x05,0xC1,0x3E,0xC2,0x04,0x85,0x66,0xC8,0xA6,0x95, +0x52,0x6D,0x06,0xAB,0xBE,0x3A,0x13,0xAC,0xF8,0xBC,0xB0,0x54,0x89,0x4E,0xD1,0xE0,0xFB,0x46,0x2C,0x95, +0xB9,0xED,0x8A,0xF0,0xA4,0x9D,0x83,0xCC,0xA8,0x46,0xF0,0xAF,0x21,0x6C,0xCF,0x6A,0x02,0x9A,0x0C,0x45, +0x0D,0xBC,0x4C,0xB2,0x37,0xF5,0xEF,0x77,0x64,0xDA,0x0B,0xFD,0x99,0xB1,0x16,0xE1,0x24,0xBF,0x2F,0xC4, +0x4E,0x54,0x62,0x4A,0xC7,0xD8,0xD8,0x2C,0xA3,0x83,0x0E,0xE5,0xCD,0x59,0x66,0x81,0xA0,0x53,0xCA,0x76, +0xC4,0xF9,0x11,0xA0,0x11,0x62,0x06,0x01,0xD6,0x29,0x86,0x95,0xA5,0xB5,0x72,0x38,0x2A,0x33,0xBE,0x47, +0x43,0x4F,0x60,0xB1,0xDC,0x7F,0x8F,0x81,0x28,0xB6,0x57,0x28,0x0C,0xFA,0xD0,0x7A,0x44,0x22,0x07,0xC9, +0x9F,0x63,0x87,0x85,0x9E,0xFB,0x29,0x70,0x80,0x16,0xBA,0xB4,0x85,0x8F,0x36,0x27,0xE3,0x4E,0x07,0xD7, +0xD4,0xEB,0xEF,0xE3,0xA2,0x5C,0xB0,0x30,0x93,0xED,0x59,0xA3,0x47,0x53,0x32,0x03,0xF0,0xCA,0x0F,0xE3, +0xA4,0x7F,0x25,0x67,0x63,0x47,0xB5,0xE3,0x44,0x00,0x24,0x99,0xF4,0x64,0xEA,0x55,0x22,0x3E,0x84,0x77, +0xF9,0x2E,0x7F,0xB5,0xD3,0xE5,0xE1,0x31,0x31,0xE2,0x38,0x3F,0x6A,0x09,0xD6,0x26,0x72,0x95,0xE8,0xFE, +0x66,0x42,0xF0,0x40,0xAD,0x0A,0x72,0xE0,0x96,0xAA,0x61,0x70,0x70,0x4A,0xA7,0x03,0x35,0x29,0x48,0x33, +0x8D,0xB8,0x53,0x6C,0x69,0x42,0xBF,0x43,0x73,0xA5,0xFB,0x56,0x63,0xC4,0xEE,0xFA,0x23,0xB0,0xED,0x75, +0x52,0xDA,0xDF,0x78,0x78,0x63,0xBE,0x55,0xA0,0x27,0xC3,0x77,0x60,0xFA,0x65,0x4C,0xAB,0x15,0x90,0x21, +0xF3,0x6C,0xD2,0xA0,0x82,0xC5,0x87,0xDF,0xDC,0xC5,0x33,0x78,0x55,0x94,0x57,0x08,0x9B,0xE5,0x34,0x3F, +0x80,0x46,0xFA,0x6A,0x96,0x64,0x60,0x58,0x2B,0x4B,0xB9,0xBD,0x01,0x6B,0xCF,0x5B,0x46,0x2F,0xEB,0x9D, +0x4D,0x2B,0xA7,0x9C,0x7A,0xB6,0x65,0x7F,0x6E,0x4E,0x35,0x3E,0x58,0xE7,0x60,0x1A,0x78,0x94,0x69,0x13, +0xF7,0xB0,0xF8,0xFC,0xD7,0x83,0x2A,0xEA,0x8F,0x09,0xC8,0x6E,0xC8,0x2D,0xB1,0x7F,0xAA,0x4C,0xFD,0x1C, +0x68,0x2D,0x22,0xFA,0x8E,0xE5,0x6E,0x1E,0xD6,0xDB,0x23,0x1F,0x45,0x03,0x67,0x69,0xED,0x2E,0x2B,0xEB, +0x0F,0xDB,0xAD,0x6A,0x7B,0x31,0x10,0x59,0xF0,0x6F,0x0B,0xCC,0x69,0xF2,0x23,0x0B,0x49,0x83,0x4B,0xFF, +0x1E,0x8A,0x05,0xF6,0xDB,0x00,0xFF,0x7F,0x14,0x3D,0x2E,0x27,0x43,0x12,0x6F,0x54,0x67,0x81,0xF3,0xB4, +0x80,0x8E,0x9E,0x74,0xDA,0x75,0x1B,0x97,0xCD,0x37,0x4F,0x90,0x4E,0x31,0xBF,0x7F,0xB0,0xDF,0x7E,0xF6, +0x8C,0xB7,0x4F,0xA0,0x6E,0x59,0xEB,0xA3,0x93,0xBE,0xB9,0xF3,0x5A,0x76,0xB3,0x77,0xD3,0xB4,0x64,0x41, +0xE9,0x35,0x64,0x5E,0x42,0x31,0xD4,0x42,0xE7,0xE7,0xFA,0xE9,0xBF,0xC2,0xE0,0x82,0x9D,0xCF,0x10,0x61, +0x7C,0xFE,0xB3,0x52,0xE6,0x5D,0x74,0x2A,0x23,0x78,0x1A,0xAE,0x9C,0xF8,0xE7,0x16,0xDF,0xC8,0x7D,0x3F, +0x0E,0x1B,0x55,0x3E,0x81,0xC7,0x55,0x18,0xEE,0x16,0x12,0xC1,0x19,0x12,0x75,0x53,0x66,0x3F,0x32,0xF1, +0x16,0xB6,0x11,0xC0,0xB2,0xF8,0xA5,0xD1,0xC0,0x54,0x3E,0x76,0x84,0x15,0xF8,0x8B,0xCD,0x37,0x68,0xAE, +0xF8,0x3C,0x54,0x7E,0x47,0xD8,0x75,0x68,0x21,0x7F,0xF0,0x9A,0xD8,0xBA,0xFA,0xD0,0x48,0xA4,0x5E,0x29, +0x26,0x65,0xF8,0xAD,0x49,0x7C,0xDD,0x6A,0xD0,0x4B,0x2D,0x4C,0x8B,0x1A,0xAD,0x43,0x43,0x65,0x70,0x69, +0xAD,0x7D,0x21,0x6E,0x35,0x36,0xAB,0x9E,0x45,0x5F,0xA4,0xF7,0x60,0xC6,0xD1,0x37,0x8B,0xCF,0xC6,0x37, +0x28,0x71,0xF6,0x9A,0x00,0x56,0x6E,0x16,0x6A,0x31,0x8A,0x27,0x0F,0x1B,0xAE,0x8A,0x87,0x30,0x9E,0x1C, +0x84,0xA0,0x65,0x1E,0xD7,0x80,0xEB,0x4C,0x5D,0xE3,0x95,0x36,0x49,0x52,0x29,0xEE,0x4B,0xE1,0xA8,0xC9, +0x11,0x1A,0xE5,0x80,0x0A,0x80,0xA8,0x5F,0x7E,0x6A,0xCF,0x9B,0x1C,0x3A,0xA7,0xD9,0x1A,0xE0,0xE4,0xF9, +0xF1,0xE2,0x98,0xF9,0xF5,0x3F,0x90,0x68,0xE7,0xA5,0xEB,0x26,0x2F,0x40,0x41,0xF1,0x21,0x9C,0x68,0x82, +0xD6,0xA7,0x16,0x35,0xD4,0x6D,0x12,0xE2,0x84,0x3C,0xDA,0x7C,0x8A,0x7D,0xDE,0xE9,0x2F,0xBD,0x1F,0x24, +0x0D,0xCD,0x71,0xB6,0x01,0xE4,0x31,0x0E,0x78,0xEF,0x03,0xC3,0x04,0x3E,0x99,0x79,0xE1,0x46,0x92,0x6C, +0x28,0x5F,0xA0,0xD3,0xF4,0x36,0xCA,0xAC,0x55,0xAB,0x80,0x80,0xC4,0x08,0xC8,0x56,0x5E,0x1B,0xB9,0x63, +0xA6,0x04,0x6F,0x1E,0xFC,0xAD,0x42,0xF0,0x82,0x4B,0x55,0x98,0xB6,0xDA,0xA1,0xD7,0xAA,0x2B,0xC8,0x38, +0x57,0x2C,0xC1,0x93,0xCA,0xC9,0xCB,0xC2,0x4B,0x1B,0xA0,0xA0,0x03,0x0A,0x79,0xAF,0x97,0x1C,0x01,0x57, +0x33,0xAF,0x80,0x53,0x3C,0x83,0xF6,0xF5,0xF9,0xEB,0x8B,0x45,0xE5,0x94,0x24,0x2C,0xA7,0x8C,0x8A,0x69, +0x52,0x37,0x11,0xBF,0xFE,0x97,0x15,0x51,0xBC,0x76,0x44,0x3D,0x69,0xC7,0x84,0x97,0x35,0xE4,0xD8,0x70, +0xA2,0x35,0x0A,0x71,0x09,0xD6,0x0D,0xC9,0xA6,0xAE,0x07,0x4D,0xD2,0xAB,0x57,0x3F,0x68,0x14,0x1F,0x7D, +0x62,0x26,0x9F,0xF9,0x49,0xD4,0x44,0x4C,0xEF,0x88,0x30,0x1C,0x2A,0x83,0xE4,0xCA,0x54,0x3B,0xC5,0x3A, +0xAF,0x53,0xC8,0x8C,0xF2,0xE3,0xC0,0x74,0xAE,0x52,0x55,0x05,0x3B,0xAB,0xFA,0xEE,0x8C,0xCB,0x01,0x59, +0xFE,0xAC,0xD7,0x34,0x2D,0x88,0xC8,0x31,0x4F,0x12,0x0C,0x85,0x75,0xD1,0x63,0x9C,0x52,0xE3,0xDF,0x39, +0x70,0xE3,0x41,0x68,0x3E,0x50,0xD1,0xAF,0x6E,0x10,0x9B,0x7D,0x86,0xE2,0xDF,0x72,0x28,0xF6,0x34,0x04, +0xF1,0x55,0xDB,0x20,0xA1,0x28,0x99,0xE8,0x81,0xAC,0x2D,0xE9,0xC2,0x81,0x9E,0xA6,0x0D,0x1E,0xA9,0x41, +0xE1,0x5C,0xDC,0xE0,0xE2,0xFE,0xDA,0xA7,0x55,0x5D,0x9D,0x76,0x17,0xF2,0x0D,0x92,0x45,0x53,0x18,0xD8, +0x69,0xB3,0x96,0x65,0xB5,0x6E,0x0D,0xE4,0x16,0x30,0x6F,0xFD,0x0E,0xB7,0xDD,0xE1,0x28,0x5E,0xD0,0x85, +0x87,0x2B,0xDC,0x5C,0x12,0xB2,0x4C,0x1D,0x55,0x25,0x8B,0xC9,0x0A,0xA1,0xFC,0x29,0x14,0xB6,0x14,0x25, +0xB3,0x38,0x03,0xD6,0xEA,0x78,0xEF,0x31,0x73,0xE7,0xDA,0x58,0x53,0x00,0x4F,0xF0,0x17,0x37,0xCD,0x19, +0xF6,0x9B,0x66,0xCC,0x8E,0xE3,0xD5,0x2D,0xB7,0xDA,0xBF,0x80,0x5C,0xD3,0xE8,0x83,0x67,0x51,0x7B,0xC5, +0x08,0x5A,0xDC,0xAE,0xDD,0x97,0x8B,0xAA,0xDD,0x47,0x0E,0x54,0xC0,0xD5,0x25,0x4C,0xD0,0x55,0x95,0x78, +0x81,0x64,0xB8,0xFC,0xC2,0x64,0x76,0xD8,0x05,0xD4,0xEE,0x5C,0xD1,0x54,0x93,0xF0,0x0F,0xFF,0x67,0x63, +0x1A,0x47,0xC8,0x8F,0x6E,0x16,0x20,0x4D,0x50,0x57,0x57,0xBF,0x1D,0xDF,0x7B,0x61,0xDE,0xB9,0x2D,0x96, +0x06,0x9F,0xEB,0x5D,0xD9,0x9E,0x99,0xEE,0xAC,0x50,0xDE,0xEA,0xC9,0x17,0x56,0xCE,0x87,0x7F,0x8E,0x6C, +0xBB,0x49,0x56,0x25,0x1C,0x9E,0xDC,0xFA,0xB0,0x10,0x00,0xFC,0x8E,0x5E,0x6E,0x0E,0x22,0x0C,0x68,0xA9, +0x59,0xFB,0x9F,0xDB,0x57,0xCF,0x61,0x89,0x8E,0x6F,0x8F,0xC8,0x03,0xF1,0x83,0xBD,0x71,0x8D,0xFC,0xAF, +0x3F,0x39,0x52,0xDF,0x06,0x7C,0x81,0xF9,0x1E,0x7C,0xAA,0xF3,0x8C,0x41,0xE2,0x00,0x34,0xBB,0xF3,0xDE, +0x64,0xEF,0xCA,0x25,0xF7,0x70,0xF7,0x92,0xC4,0xF4,0xCE,0xAE,0x9E,0xDC,0x6A,0xC3,0xCD,0x9C,0x5F,0xF4, +0x62,0xCB,0x61,0x57,0x22,0x0F,0x81,0xFC,0x84,0x60,0xB1,0x52,0x63,0xC1,0xCB,0x1D,0x77,0x63,0x31,0x2C, +0x7E,0x8E,0x19,0x97,0x54,0x1D,0x61,0x20,0xFD,0x02,0x21,0xDE,0xD7,0xAB,0x7A,0xA6,0x80,0x78,0x88,0xC0, +0x9F,0x3F,0x58,0xE5,0xA3,0x0B,0x10,0x35,0x55,0x0A,0x58,0xDD,0x13,0x04,0x30,0xDC,0xB6,0xA3,0x8B,0x24, +0x40,0x75,0xD9,0xF0,0x1A,0x58,0x62,0x51,0x21,0x47,0x34,0x23,0x58,0x25,0x01,0xE9,0x96,0x04,0x11,0x34, +0x10,0x6E,0x59,0x40,0xA1,0x15,0xC9,0xB3,0x11,0x5B,0x39,0x3E,0x13,0xCC,0x19,0x21,0xCF,0x63,0xD6,0xF6, +0x2C,0xA7,0xD8,0xF3,0xBB,0x69,0xFE,0xAA,0x8D,0x56,0x55,0xC4,0x7D,0x25,0x32,0x9A,0x90,0xF9,0x75,0x6F, +0x21,0x4A,0xF4,0x5A,0x9F,0x08,0x92,0x24,0x6A,0x5E,0xA7,0x6B,0x73,0x6F,0xBD,0x21,0xF0,0x27,0x2B,0xB6, +0x4A,0x86,0xE8,0xA9,0x91,0x05,0x24,0xFB,0x25,0xB6,0x70,0x39,0xA6,0x0B,0xB7,0xBB,0x0C,0xA1,0x23,0xFA, +0x1B,0x4B,0xC2,0x0B,0xC0,0x4E,0xE4,0xBC,0x4C,0x23,0x50,0x8A,0xCD,0x0E,0x82,0xAB,0xA7,0xCA,0xF0,0xB8, +0x18,0x16,0x92,0xD5,0xB2,0xC1,0x66,0xDD,0x69,0x3F,0x41,0xF6,0x5A,0x1D,0x8A,0x58,0xB9,0xEA,0xA3,0x02, +0x52,0x23,0xC3,0x49,0xD8,0x0E,0x83,0x9D,0x5A,0x71,0xD4,0x3F,0x60,0x4C,0x0B,0x0C,0x98,0x29,0xDB,0x1A, +0xE5,0x0D,0x1B,0x2C,0x62,0x69,0x3C,0xB1,0x81,0x91,0x80,0x14,0xD1,0x2B,0x2F,0x2E,0x93,0x3E,0xD1,0xD6, +0x43,0x47,0x5E,0xDB,0x05,0xBC,0x09,0xE6,0x02,0xA6,0x8C,0xD2,0xEC,0x33,0xD8,0x5C,0xC3,0x3C,0xC0,0x72, +0x24,0x9F,0xF4,0x63,0xB6,0xFA,0x2A,0x3E,0x11,0x84,0x6D,0x2D,0x57,0x76,0x5F,0xA0,0x00,0xB2,0x75,0x17, +0x20,0x28,0xF1,0x22,0xE0,0xDE,0x62,0x72,0x2B,0x7B,0x5E,0xC2,0xB0,0x1E,0xA2,0x65,0x91,0x2F,0x99,0x62, +0xFF,0xF0,0xAC,0x66,0xEF,0xD0,0x6A,0x0D,0x0D,0x79,0x97,0xD4,0xBC,0x98,0x24,0x10,0x67,0x1B,0x71,0xEE, +0x10,0x35,0xC7,0xD2,0xF5,0x55,0xE2,0xB3,0x4D,0x89,0x6D,0xA6,0x28,0x75,0xED,0x05,0xBE,0x70,0x14,0x6F, +0x06,0xB1,0x02,0x4E,0xB5,0x9F,0x49,0x51,0xCB,0x3E,0xA5,0xD1,0xC0,0xC3,0x3E,0xB8,0x72,0xB7,0xFE,0x7D, +0x12,0xFE,0x74,0xA8,0x4C,0xF5,0x90,0xD3,0xA2,0x37,0x9E,0x8B,0x78,0x5D,0x36,0xFC,0x35,0x74,0xFA,0x9C, +0x82,0x3D,0xEF,0x5A,0x4A,0x6E,0xA7,0xFB,0xCA,0x26,0xD8,0x1B,0x8B,0x16,0x42,0x2B,0x86,0x6A,0xB7,0xBD, +0x19,0x61,0x51,0x9E,0xA9,0x5B,0xCD,0x7B,0x9B,0x89,0x27,0x4A,0x9B,0x3E,0x27,0x7A,0x3B,0x2B,0x92,0xBB, +0x0C,0x5E,0xB0,0x0C,0x72,0x7E,0x96,0xB9,0x69,0x47,0x6C,0x13,0x81,0x10,0x70,0x7C,0x8C,0x0D,0xAE,0x93, +0xF3,0x30,0xE6,0x03,0xE6,0xA0,0xD0,0x4F,0x78,0x6F,0x49,0x98,0xA9,0x9C,0xC9,0x78,0xB9,0x6E,0xA6,0x8F, +0x19,0x4E,0xE9,0x30,0x20,0x3C,0x71,0x7C,0x0C,0x1C,0xD7,0xCD,0x36,0x99,0x38,0x06,0x1E,0xC9,0x1F,0xAC, +0x95,0x75,0x58,0x26,0xF1,0x8F,0x79,0xB4,0x2F,0xAB,0x08,0xBD,0xC6,0x0C,0xF8,0xBB,0x37,0xC0,0x82,0xC1, +0xA4,0xC0,0x57,0x51,0x1B,0x0E,0x06,0x9F,0xC7,0x22,0x32,0xAB,0xEC,0xA3,0x95,0x7C,0x27,0x84,0x31,0xEF, +0x4C,0x6F,0xFB,0x41,0x12,0x83,0x91,0xA2,0x25,0xA0,0x70,0x2E,0x20,0xDC,0xF9,0x65,0x7E,0x80,0x3C,0xB4, +0x3A,0x6E,0xB7,0xD0,0xD4,0xD1,0x61,0x24,0xED,0xE7,0x4D,0x5D,0xB7,0xC8,0x7E,0x59,0x45,0xDF,0x5D,0x75, +0x35,0x36,0xED,0x15,0xE6,0x23,0x8F,0xA6,0x97,0xBA,0xBC,0xF7,0x04,0x36,0x09,0xF2,0x1E,0xAF,0x5F,0xE7, +0xA4,0x6B,0x25,0xBC,0x1B,0x5B,0x11,0x2C,0x1E,0xCB,0x89,0x65,0xC0,0xFD,0xBD,0xA0,0xA9,0x0A,0x72,0xDD, +0x94,0xC7,0x86,0x88,0x48,0x6A,0xA0,0x6C,0x32,0x58,0x23,0x6C,0xB3,0xC9,0xDD,0xE6,0xDA,0xE5,0xE3,0xAD, +0x68,0xC5,0xEB,0x85,0xF9,0x61,0x4A,0xAF,0x15,0xEF,0xAE,0xE7,0x19,0xAF,0xD6,0x45,0x97,0x14,0x3A,0xD8, +0x4F,0xA4,0x43,0x5D,0x17,0x87,0xBB,0x1E,0xF7,0x89,0x48,0x0C,0x6D,0x75,0xB7,0x4F,0xC8,0x61,0xBB,0x68, +0xEF,0x2A,0x82,0xF7,0x3C,0x2C,0x58,0x1F,0x53,0x74,0xAD,0x9E,0x7A,0xEF,0x04,0xEE,0xE5,0xCF,0x22,0x1A, +0x02,0xAF,0xBD,0xF1,0x2D,0xC8,0x5E,0x1C,0x84,0xAE,0xA5,0x29,0x58,0x04,0x6A,0x3D,0xAC,0xAB,0x7B,0xFE, +0x06,0x2E,0x3A,0x2F,0xE6,0xEB,0xCF,0x38,0xA0,0x28,0xA2,0x5E,0xBE,0xDC,0x6D,0xB7,0x5C,0xC4,0xFD,0x71, +0xDD,0xDE,0x4B,0xB1,0x66,0xCC,0x46,0x4C,0x3E,0xC3,0x73,0x7E,0xEF,0x1D,0x56,0x6C,0xBC,0xBF,0x62,0x9D, +0x98,0x43,0x20,0x26,0x22,0x20,0x0C,0x51,0x1E,0x91,0xBC,0xB6,0xF3,0x02,0xBC,0x10,0xE0,0xAB,0xCA,0x37, +0x92,0xA3,0x43,0x48,0x41,0x6E,0x7B,0x5E,0xC7,0xBC,0x94,0x3E,0x1C,0x9A,0x09,0x6F,0x1A,0xFF,0x8E,0x06, +0x2E,0xDF,0x8F,0x41,0xD6,0x00,0x15,0x0C,0x5A,0x95,0x15,0x05,0xB5,0xFC,0xD1,0x5B,0xC7,0x9E,0xAB,0x16, +0x52,0xE8,0x25,0xCE,0x20,0x47,0xB0,0x24,0xB4,0xC8,0x8F,0xD9,0x44,0x4F,0x30,0x0E,0x84,0xB9,0xE6,0x87, +0xA7,0x94,0x04,0xF7,0x15,0x94,0x26,0xF0,0xD4,0x0C,0x50,0x64,0x3F,0xFD,0xEF,0x03,0xEE,0xD4,0xC3,0xA5, +0x95,0xF6,0x75,0x24,0x1B,0x60,0xE3,0x46,0x51,0xBB,0x34,0x85,0xC4,0xD7,0xF1,0x3F,0x7B,0x7A,0x1C,0xB3, +0xF3,0xCC,0x78,0x75,0x6A,0x63,0x8C,0x42,0x8D,0x4E,0xFF,0x28,0x99,0xA8,0x51,0x22,0xC9,0x4E,0x10,0xD8, +0x5D,0x78,0xA0,0xF8,0xF3,0x66,0xE9,0x9A,0xBA,0x2B,0xDB,0xC0,0xFB,0x98,0xE7,0x14,0xD8,0x97,0xDC,0xAF, +0x2E,0x56,0xF7,0xF8,0xBE,0xB9,0xA7,0x44,0x63,0x67,0x8D,0x47,0x4E,0xB5,0x4F,0xCD,0xE8,0x96,0x47,0x06, +0x8E,0xFC,0x5F,0xED,0x4F,0xD6,0xDD,0xB7,0xFC,0xEB,0x9E,0xC8,0x0A,0xDE,0xBE,0xC2,0x0D,0x66,0x83,0x8C, +0x16,0x93,0xAC,0xEB,0xDD,0xBD,0xD6,0xEB,0x05,0xD2,0xE0,0xE5,0x3E,0xFD,0x3C,0xBD,0x8E,0x7B,0x6E,0x7C, +0x7E,0x03,0xED,0x9E,0x9D,0x52,0x5F,0x2F,0xF6,0xFC,0x36,0x8D,0x9C,0xDA,0xCD,0x07,0x0C,0xB1,0xD7,0x1C, +0x6D,0xBF,0xCF,0x66,0x8C,0xE8,0x2F,0x7F,0xA6,0x0B,0xC5,0x1D,0xDB,0xFF,0x3A,0xF3,0x78,0xD4,0xE6,0x39, +0xE5,0x86,0xCF,0xC7,0x7F,0x44,0x77,0x57,0x3C,0xB6,0x58,0x0B,0x2B,0x07,0x8A,0x2A,0x65,0xD4,0x14,0xF5, +0x63,0xE3,0x58,0xB8,0x3F,0x67,0x92,0x1E,0xFC,0x96,0x12,0x45,0x94,0x26,0x6E,0xA5,0xFF,0xCB,0x99,0x21, +0xD9,0x10,0xA3,0xB7,0x20,0x8A,0x1E,0x97,0x54,0xD0,0x9D,0x11,0xD9,0xDB,0x33,0xE3,0x70,0x95,0x20,0x16, +0xB6,0x09,0x9E,0x7D,0x56,0x20,0x36,0xC1,0xB7,0xE2,0x0F,0x02,0xDD,0x92,0xE2,0x0B,0xDE,0x47,0x75,0x14, +0x03,0x67,0x4B,0x71,0xC3,0x67,0x7F,0x92,0x73,0x47,0xBE,0x66,0x23,0x00,0x42,0x82,0x94,0x74,0x01,0xA1, +0x8A,0xED,0xD9,0x75,0x33,0x7D,0x0A,0x74,0x7C,0x62,0x0C,0xB8,0x90,0x47,0xE6,0x00,0xE9,0x4C,0x5B,0xF1, +0xFA,0x87,0x06,0x68,0x67,0x13,0x39,0x88,0x0E,0x4B,0x72,0x7E,0xDF,0x45,0x6F,0xAE,0x9D,0xC6,0x0B,0x6B, +0x75,0x46,0xDA,0xDC,0x1D,0x2D,0x9C,0xD0,0x8F,0x04,0x31,0x52,0x8C,0x72,0x94,0x7A,0xFC,0x45,0xE5,0xAC, +0x6D,0x8C,0xBF,0xBB,0x37,0x40,0xAB,0xB3,0x6F,0x17,0x0A,0x6A,0xAB,0x44,0x89,0x23,0xBB,0xDE,0xE4,0x5B, +0xB5,0x44,0x1B,0x63,0x54,0x09,0x7A,0xCA,0xCF,0xC4,0x9C,0x75,0x56,0x6E,0xD6,0x16,0x23,0x4F,0x12,0xB0, +0xE4,0x20,0x32,0x5A,0x57,0x0B,0xAA,0x0A,0xEB,0xA6,0x7A,0x7D,0x20,0xDC,0xE0,0x83,0x5D,0x74,0xEC,0xAB, +0x26,0xF3,0x02,0x23,0x9B,0x3E,0x0B,0x79,0x21,0xDF,0x97,0x4D,0xDE,0xCE,0xE1,0x7F,0x2A,0x88,0xCF,0xBF, +0x1B,0x8F,0xA4,0xBE,0xCD,0x1D,0xDB,0x3B,0xDF,0x94,0xB5,0x04,0x3A,0xFF,0xFC,0x00,0x26,0x7D,0x01,0x32, +0x6C,0x58,0xAB,0x36,0x64,0xED,0x49,0x67,0xA3,0xDD,0x4C,0x7D,0x82,0xE5,0x25,0xB2,0x6B,0x57,0x70,0xDB, +0xB3,0x21,0x65,0xD7,0x6B,0x50,0x32,0xB8,0x44,0xE3,0x97,0xD3,0xE6,0x60,0xF7,0xA5,0xF1,0x3B,0xFD,0x61, +0xA9,0x1C,0x1B,0x8A,0x81,0x71,0xB3,0xCA,0x40,0xAC,0x24,0x27,0xF1,0x7B,0x41,0x87,0xCB,0x25,0x04,0x4D, +0xDD,0x32,0x91,0x0C,0x63,0xF4,0x54,0x60,0x1D,0x68,0x6C,0xD9,0xA1,0xD9,0x73,0x56,0xF6,0xD0,0xD5,0x74, +0x75,0x08,0x29,0x0D,0x71,0x89,0x27,0xC5,0xA1,0x56,0x6F,0x8E,0xB4,0x04,0x0B,0xD8,0xE6,0x52,0x15,0x08, +0xE6,0xED,0xFB,0xB3,0x2E,0x91,0xF5,0xC5,0x10,0xEC,0x15,0xFD,0xE5,0x25,0xE2,0xAA,0x26,0xEA,0x3C,0x0A, +0xED,0xFD,0x43,0xD2,0xC4,0x1B,0x0E,0xA4,0xEA,0x94,0xDB,0x2E,0xBD,0x3D,0xD5,0xD3,0x56,0x68,0xF7,0x82, +0x01,0xCD,0x16,0xBC,0xEE,0x98,0x8C,0xBD,0x8E,0xF4,0x7F,0x0D,0xB2,0x07,0x34,0x2D,0xBE,0x01,0xFE,0xCB, +0x65,0xAC,0xCD,0xAC,0x5B,0x87,0xD2,0x66,0xD2,0xE4,0x1E,0x1F,0x7C,0x13,0x7F,0xEF,0xE0,0x19,0x4B,0x9A, +0x5A,0x1E,0x66,0x88,0x6A,0x91,0xC6,0x31,0x32,0x7D,0x8B,0xA8,0x22,0xF7,0x7D,0xC3,0x4B,0x29,0xE4,0x93, +0x2D,0x4F,0xB1,0xE3,0x47,0xE8,0x9E,0x74,0xDE,0x57,0x05,0x43,0x04,0xE2,0xBC,0x36,0x8E,0x18,0xFF,0x37, +0x16,0x33,0x40,0xEC,0x6A,0x2D,0x49,0x69,0xD9,0xA5,0x9E,0x4A,0xD7,0xC2,0x5C,0x59,0x80,0x20,0x5A,0x8A, +0x9B,0x54,0x6A,0x95,0x4F,0x96,0x21,0x71,0x2E,0xCF,0xF4,0x84,0xD1,0xF5,0x50,0x74,0x99,0x82,0x1B,0xA3, +0xC7,0xDF,0x6D,0x6D,0x87,0x4D,0x1C,0x74,0xEA,0xCF,0x9F,0x1A,0xC7,0x0D,0x5F,0x45,0x6D,0x37,0x41,0x55, +0x1D,0xC0,0x61,0x9F,0xB0,0x7D,0xA5,0xF3,0x10,0x23,0x4E,0xE0,0x3D,0xB3,0x25,0x60,0xF1,0x8C,0xCF,0xB6, +0x60,0x05,0x55,0xB7,0xE9,0xEA,0xF1,0x4E,0x57,0x2F,0xE4,0x4A,0xE7,0x8B,0xDA,0xC4,0xD3,0x31,0xCD,0x22, +0x56,0x69,0xF4,0xE2,0x39,0xF8,0x97,0xB0,0x85,0x49,0xD0,0xA9,0x77,0xCA,0x6F,0x13,0x49,0xAB,0xDC,0x8B, +0xD6,0xBE,0xD5,0xA1,0x2A,0x0D,0x99,0xC5,0x53,0x43,0x62,0x83,0x86,0x69,0x31,0x8E,0xDF,0x3D,0x44,0xD7, +0xAB,0x0D,0x29,0xDA,0xC3,0x0A,0xB9,0xFF,0x7A,0xCF,0x0C,0x9A,0xD5,0x43,0x96,0x79,0x70,0x87,0xF2,0x4E, +0x18,0xAC,0xDE,0x59,0x7C,0x4E,0x02,0x4C,0x3D,0xC8,0xB9,0xF8,0xA1,0x24,0xFE,0x9C,0xD8,0x07,0xBE,0xFA, +0x59,0x64,0x0C,0x5C,0xA2,0x6F,0x43,0x5D,0xF2,0x27,0xA1,0x31,0xBE,0x5F,0x33,0x58,0xA0,0x4C,0xAB,0x5E, +0x5E,0x26,0xBC,0xF9,0x0F,0x47,0x10,0xFD,0x31,0x56,0xAA,0xA9,0xCD,0x66,0x3F,0x7F,0x8E,0x85,0xC1,0x7F, +0xD2,0x9D,0xF5,0xAC,0xE3,0xEE,0xF3,0xEE,0x50,0x97,0x6C,0x26,0x96,0xF5,0xFE,0x3B,0x82,0x20,0xD4,0x62, +0xBC,0x00,0x7E,0x78,0x5C,0x60,0x5F,0xFA,0x21,0xBA,0x03,0x1D,0x13,0xCC,0xA6,0x53,0x75,0xCA,0x7B,0x7A, +0xA5,0x7F,0xFE,0x96,0x4C,0x75,0xFD,0xC9,0x8B,0x85,0x7C,0xDB,0x85,0x50,0xEE,0x9B,0xDB,0x8D,0x3B,0x8B, +0x57,0x14,0xE4,0x6F,0x45,0x96,0x64,0x0A,0x02,0xB6,0xF5,0x0E,0xAE,0x21,0x1F,0x44,0xF6,0x3C,0x98,0x62, +0xDA,0x9E,0xD3,0x14,0xF0,0x42,0xBC,0xB0,0x25,0x04,0x84,0x34,0xB0,0x54,0x88,0xAA,0x45,0x9D,0x0F,0xC7, +0x15,0x44,0x8E,0x30,0x90,0xD8,0xB9,0xC5,0x0B,0x97,0xF6,0xDD,0xDA,0xE2,0x95,0x09,0x46,0x0E,0xAE,0x8C, +0x99,0xD5,0x12,0x55,0x59,0x0E,0x02,0xFE,0x25,0x34,0x74,0xA4,0xC5,0xD1,0x72,0x13,0x1E,0x54,0xCE,0x1D, +0x70,0x0C,0x28,0xAD,0x4E,0x64,0x5F,0x76,0x31,0x8E,0xC5,0x32,0x7B,0xB9,0x98,0x1B,0x3F,0x78,0x3B,0xEE, +0xAE,0x92,0xDD,0x3C,0x4A,0x95,0x55,0xDA,0xE0,0x84,0x5A,0x1B,0x67,0x0D,0x35,0xD6,0x52,0x3E,0x94,0xC9, +0x8F,0x43,0xBD,0x7E,0xD8,0xDD,0x82,0x73,0xC8,0x7E,0xDB,0x71,0x2A,0xE3,0x0D,0xF4,0xE9,0xA3,0x9C,0xEB, +0x99,0xD7,0xCE,0x2C,0xB9,0x0B,0x14,0x78,0x81,0x12,0x05,0x1B,0xAE,0x86,0x94,0x07,0xCC,0x06,0xDE,0xE8, +0x6E,0x05,0x3D,0x09,0x7D,0xAB,0x27,0xD1,0x31,0xD8,0x83,0xD4,0x4F,0xDC,0x8F,0x50,0x50,0xF7,0xD0,0x79, +0xDA,0x77,0x50,0x58,0x54,0xAA,0x8B,0xD9,0x12,0xB5,0xC7,0x98,0x00,0xF4,0xF5,0x2A,0x6E,0x33,0x77,0xEA, +0x0D,0x7A,0x70,0x1B,0x16,0x7C,0x36,0xAF,0x03,0xE7,0xFB,0x25,0xAD,0x51,0x56,0xE3,0x98,0xA6,0x26,0xF7, +0xE2,0x9F,0xE6,0x7E,0x4C,0xE4,0xF2,0xC9,0xA2,0x35,0x5F,0x30,0x8D,0x45,0x57,0x72,0x07,0xAF,0x52,0x99, +0x9F,0xDE,0xC2,0x5F,0xB9,0xCC,0xF3,0xB9,0x40,0xA4,0xBA,0x16,0xEC,0x7F,0x47,0xEF,0x58,0xB2,0xEC,0x92, +0x61,0x08,0x2A,0x33,0xB1,0xDF,0xA8,0x10,0x40,0x9F,0xAA,0xC6,0x63,0x24,0x28,0x00,0xE0,0x1A,0x08,0x57, +0x56,0xDC,0xAC,0xD2,0xED,0x9D,0x67,0x13,0xA4,0x6E,0x04,0xF1,0xE1,0x4D,0x2D,0x97,0x90,0x28,0x50,0x47, +0xA2,0x02,0x29,0xDB,0xC0,0x2F,0x10,0xF7,0xB2,0x1A,0x65,0x87,0x11,0x2B,0x61,0xB5,0xAC,0xB3,0x2D,0x4A, +0x72,0x73,0x7A,0xC2,0xCF,0xC9,0xC4,0xC0,0x7E,0xEB,0x84,0x12,0xC0,0x88,0x7E,0x13,0xF3,0x9B,0x40,0xE7, +0xA0,0x47,0xD0,0x45,0xF2,0x8A,0xF0,0x65,0xC1,0xE9,0x90,0xA8,0x55,0x1D,0x39,0x87,0xE2,0x00,0xA1,0x12, +0x77,0x2B,0xA1,0x83,0x45,0x27,0xEF,0x50,0x5F,0x90,0xC9,0xA0,0x85,0x9F,0xDC,0xA6,0xA7,0x65,0xF1,0x81, +0xC7,0x48,0x9A,0x17,0x38,0x56,0xBA,0xF7,0x87,0x8E,0x02,0x4F,0x5F,0x2E,0xD2,0xF9,0x0B,0x0A,0x2A,0xD6, +0x48,0x25,0xE6,0x8A,0x05,0x03,0x0A,0x5F,0x5E,0x6B,0x43,0xAE,0xEC,0xB6,0x2E,0x47,0xFA,0x0C,0x03,0x49, +0x98,0xF7,0x29,0xAB,0x39,0x21,0x9E,0x4E,0xCB,0x7A,0xEC,0x0A,0x29,0x65,0x8B,0x5A,0x10,0x49,0x41,0x39, +0x64,0xA2,0x42,0x36,0x6C,0xBA,0x20,0xDF,0x75,0x96,0x46,0xE8,0x62,0xCC,0x4F,0x55,0xF3,0x7D,0x32,0x3B, +0xBC,0x43,0x66,0x0E,0xB1,0x3D,0xD3,0x10,0x8E,0x8C,0x47,0x44,0xE6,0x22,0x60,0xFA,0x82,0x61,0x69,0x55, +0x5D,0x8E,0x79,0xB2,0x75,0x4C,0xBB,0x3E,0xA2,0x6C,0x33,0x3F,0xA8,0x41,0xE9,0x96,0x26,0x3F,0x2B,0x0F, +0x67,0x02,0xCD,0x68,0x72,0xCE,0x23,0x91,0x07,0x82,0x8F,0x63,0xE3,0x9B,0x11,0x0C,0x13,0x64,0xBC,0xB4, +0xB1,0x36,0xE4,0x42,0x42,0x91,0xDC,0x9D,0x43,0x34,0x55,0x17,0x86,0x5D,0xB3,0x26,0x35,0xD3,0xAA,0x52, +0xE3,0x9D,0x5A,0x47,0xF5,0xFC,0xBF,0xE1,0xEA,0x9F,0x2F,0x4E,0x30,0x30,0xD3,0xD3,0x62,0x9E,0x55,0xE8, +0x63,0xF3,0x18,0x13,0x64,0x54,0xD4,0x83,0x14,0xB9,0xED,0x53,0x82,0xAC,0xCF,0xFE,0x1A,0x17,0x1E,0x3F, +0xA0,0xD8,0xBA,0xF1,0xB0,0xD8,0xEC,0x80,0x6E,0x59,0x6F,0xBE,0x8D,0xCF,0x2C,0x86,0xBE,0x1A,0xF2,0xE1, +0xBE,0xC3,0x66,0xD4,0x08,0x44,0xF7,0x8A,0xA2,0xC9,0x68,0x23,0x0E,0x19,0x7B,0xA7,0xF0,0xC9,0x57,0x03, +0xE4,0xFD,0xD1,0x61,0x9C,0x55,0xF9,0x33,0x21,0xFB,0x85,0xE9,0x5A,0xD6,0xD8,0x73,0x7A,0x67,0x62,0xAE, +0x0E,0x28,0x7E,0x0A,0xE5,0xD5,0x26,0xEC,0x3A,0x3E,0x4F,0x95,0xCF,0x48,0xAD,0x4E,0xD4,0xC5,0x76,0x70, +0xF5,0x56,0xF6,0x1E,0xA0,0x09,0x1F,0x5E,0xE0,0x23,0xF7,0x8C,0x63,0xD6,0x7F,0x0B,0x6D,0xFF,0x2D,0x46, +0xDB,0xA6,0xEF,0x41,0xC2,0x15,0xEF,0xA5,0xFE,0x02,0x56,0x96,0x4C,0x10,0xF7,0xBA,0x58,0x34,0x7F,0xF3, +0x4B,0x56,0x3F,0xCF,0x9B,0x47,0xF8,0xAA,0x09,0x5C,0x06,0x81,0xC3,0x7E,0x96,0xA5,0x76,0xA1,0xED,0xDC, +0x7A,0x83,0xE4,0xEF,0x88,0x1E,0x3A,0xEC,0x5B,0x7F,0x9E,0xB5,0x77,0xA0,0x53,0x5B,0x1B,0x3C,0x45,0x2B, +0x4B,0x18,0x4A,0xA9,0xBC,0x46,0x2F,0x6B,0x73,0x0E,0xED,0x41,0x0D,0x3C,0x09,0xDC,0x8B,0x2F,0x42,0xED, +0x4E,0x30,0x27,0x8B,0x00,0xBE,0x1F,0xB0,0x9B,0xA2,0xBD,0xFE,0x37,0xE6,0xA4,0x66,0x10,0x8C,0xC8,0xCA, +0x88,0x0D,0xC8,0x01,0xA5,0xEF,0x8D,0x64,0x26,0xC1,0xF1,0x09,0xB0,0x1E,0x80,0x52,0x04,0xC2,0x82,0xD4, +0xF9,0x61,0x99,0xE3,0xC8,0x99,0xA1,0xA7,0xAC,0x51,0x69,0x32,0xF7,0xA4,0x05,0x5C,0x77,0x87,0x81,0x36, +0x6C,0x19,0xDB,0x16,0x8F,0xB8,0xAD,0x37,0x42,0x02,0xC1,0x10,0x34,0xEC,0x62,0xC0,0xCB,0x69,0x4C,0xD4, +0x14,0xAC,0x9C,0xF0,0x4E,0xCC,0x61,0x19,0xA5,0x49,0x60,0x57,0x64,0x8D,0x17,0x5E,0xB2,0xA3,0x58,0x77, +0xA6,0x6A,0xC2,0xCE,0xA0,0xA7,0x19,0x84,0x44,0x8E,0x14,0xAF,0xEA,0xEB,0x77,0x92,0x95,0xE6,0xE4,0x57, +0xD6,0x19,0x11,0xD1,0x1E,0xD7,0x8B,0x77,0x4A,0xA8,0x32,0x8E,0xC7,0x1C,0x74,0xEF,0x22,0xE8,0x3A,0x13, +0x3F,0xFC,0x00,0x68,0x5F,0xEC,0x08,0xC2,0x33,0x87,0x06,0x3E,0xFF,0x65,0x62,0x0B,0x88,0xE8,0x11,0x6E, +0x9D,0xA2,0x62,0x32,0xCF,0x05,0xDA,0x69,0xB0,0xE4,0x99,0x4C,0x4E,0xCA,0x58,0x7D,0xBF,0xCA,0x53,0x61, +0x30,0xC7,0xD3,0x78,0x31,0xE5,0x11,0xE8,0xDE,0x88,0x2E,0x9D,0x50,0x66,0x8D,0xD9,0x4F,0x07,0x44,0x78, +0x1F,0x4B,0x58,0xA8,0x8C,0x60,0x56,0x31,0xBD,0xB7,0xB2,0xEE,0x1B,0xA1,0x46,0x11,0xFD,0xAE,0x47,0x53, +0xAE,0x82,0x52,0x79,0xC2,0xA2,0xDC,0x0C,0xCD,0xD1,0x3A,0x33,0x3F,0xE0,0xDD,0x29,0x71,0x88,0xB7,0x29, +0x61,0xBE,0xB3,0x82,0x5E,0xD5,0x7E,0xC8,0xBE,0xAF,0xDF,0x39,0xD2,0x80,0x5F,0x20,0x3C,0x22,0xCC,0x99, +0xFC,0xA9,0x00,0x58,0x7E,0x73,0x37,0x6A,0xAA,0xDD,0xFD,0x99,0x93,0xFC,0xCF,0x85,0xC5,0x2F,0xCA,0xA1, +0x85,0xFF,0x39,0x10,0xE8,0x5C,0x0B,0xF0,0x54,0xF1,0x04,0x49,0x63,0xD0,0x12,0xC1,0xD4,0x71,0xDA,0xE3, +0xC0,0xDC,0xB0,0xC4,0xB5,0xA9,0x81,0xC1,0x17,0xB7,0x01,0xDC,0x57,0xF4,0x55,0x6F,0xA5,0x08,0xB5,0x93, +0x3C,0xBB,0x3D,0xF0,0xFA,0xD0,0xC5,0xB5,0x6C,0x7E,0xA8,0x62,0x42,0xE4,0x50,0xB9,0x95,0x19,0x4A,0xD7, +0x46,0xD9,0x8C,0xC1,0x8B,0xFB,0x35,0x33,0x82,0x64,0x2C,0x9B,0x12,0xF7,0x46,0x09,0x61,0x34,0x9C,0xA0, +0xEC,0x7E,0x3C,0x55,0x03,0x69,0x73,0x43,0xAB,0x59,0x33,0x67,0xFB,0xEC,0xF3,0xD2,0x5F,0x0D,0x95,0xD1, +0xE7,0x1A,0x60,0x70,0xD7,0x76,0x87,0x71,0x2A,0x1A,0x02,0x15,0x16,0xF1,0xA2,0x73,0x0C,0xDA,0xFF,0x98, +0x99,0x32,0xA4,0xB3,0xE9,0x19,0xD6,0xF9,0x99,0xF7,0x5E,0xE4,0x8E,0xFC,0xA6,0x1C,0xA4,0x89,0x46,0x52, +0xB1,0x96,0x95,0x5C,0x9C,0xE2,0x61,0x31,0x2E,0x86,0x07,0x6F,0xB8,0x96,0x0D,0x29,0x29,0x3F,0xD7,0xF9, +0x67,0x71,0x90,0x79,0x9E,0x00,0xF5,0xC5,0x1E,0xDE,0x66,0xA1,0x4A,0xDD,0x18,0x59,0x7D,0xF3,0x3F,0x2B, +0x89,0x9A,0x26,0x83,0x5E,0x61,0x4E,0x8A,0x3C,0x77,0x58,0x98,0xDD,0xBC,0xBB,0x32,0x04,0xD0,0xE8,0xEB, +0xBF,0x71,0x5E,0x6B,0x86,0x3C,0xAA,0xE0,0x47,0x09,0xC9,0xB0,0x0F,0x97,0x9F,0xE8,0x43,0xB1,0x62,0xEB, +0x05,0x8F,0x2B,0x36,0xF8,0x1D,0xC3,0x49,0xE7,0x97,0xD5,0x2C,0xD3,0xB9,0xBF,0xB6,0xF4,0x64,0x6E,0xDB, +0xFF,0xFF,0xA5,0xBC,0x94,0xF3,0x7F,0xC3,0xD2,0x00,0x9C,0x0B,0x01,0x46,0x34,0xE6,0xF1,0x6F,0x32,0xEB, +0xF2,0xBC,0x04,0x76,0xE6,0xDC,0xBF,0xB2,0x84,0xAD,0x9E,0x6C,0xD1,0x16,0x24,0x41,0x58,0x2A,0xC9,0x1C, +0x12,0xEE,0x11,0x2D,0xC6,0xE0,0x25,0xE7,0x71,0x6D,0x1F,0x73,0x7E,0x9E,0x12,0x75,0xD1,0xAE,0x61,0xB3, +0x04,0xC4,0xC7,0x6D,0xD9,0xCE,0xCF,0xB3,0x57,0xA9,0xFE,0x30,0xAD,0x9B,0x12,0x9F,0xBA,0xDC,0x47,0x23, +0x88,0x6E,0x72,0xF5,0xF0,0xA8,0x5C,0x4B,0x6F,0xF0,0x9D,0xC3,0x2B,0x1D,0x23,0x8F,0xBA,0x94,0xCE,0x71, +0x8A,0xB9,0x9A,0x45,0x94,0xE4,0x91,0xE8,0xA1,0x04,0x97,0x16,0xBB,0xE7,0x46,0x16,0x59,0x9A,0x9D,0x6A, +0xB5,0x9B,0xA6,0x02,0xDA,0x94,0x75,0xEE,0xD2,0x27,0xC2,0x81,0x7B,0x4A,0x79,0xF3,0x3C,0x83,0x2A,0xD7, +0xC7,0xCE,0x99,0x6B,0x92,0x40,0x0A,0x19,0x59,0xB4,0xFF,0xED,0x04,0xD9,0xB0,0x1E,0xE8,0x96,0xD8,0xC3, +0xB8,0xD6,0xC6,0x37,0xD0,0xBD,0xCB,0x5B,0xF3,0x00,0x17,0xE9,0xD4,0x4C,0xDB,0x64,0x31,0xF2,0x53,0x1C, +0x78,0x82,0x4B,0x85,0xBC,0x69,0xA4,0x45,0xE8,0x0B,0x5B,0xB4,0xBA,0x29,0x58,0x4A,0xB9,0x87,0x7F,0x17, +0x69,0x2C,0xA9,0x2F,0xA3,0x54,0xF6,0xD3,0xB3,0x2F,0x95,0x59,0xE2,0xD5,0x59,0x2F,0x39,0x52,0x40,0x7A, +0xF8,0xE0,0xFA,0x58,0x13,0xFC,0x63,0xC3,0x89,0x4E,0x03,0xD9,0xB6,0x9A,0x35,0x3D,0x23,0xE6,0x44,0x9E, +0xB8,0xB3,0xE7,0xCA,0x96,0x07,0x90,0x5D,0xE0,0xCF,0xD5,0x09,0x4B,0x59,0xE5,0x09,0xBB,0x90,0x09,0x80, +0xCB,0x48,0x30,0x46,0x91,0x3F,0x96,0xC0,0x64,0x54,0x6B,0x66,0xD1,0xE3,0xA7,0xB6,0xCC,0x73,0x87,0xD3, +0xFB,0x49,0x24,0x4F,0xEE,0xD7,0x27,0xF6,0xD0,0xFC,0xB6,0xC8,0x93,0x92,0xDB,0xDD,0xB8,0x9F,0x9C,0x23, +0x25,0xF5,0x6E,0xDA,0x71,0x7F,0xA6,0x14,0x32,0x0C,0xC5,0x29,0x58,0xAB,0x19,0x71,0xF3,0x55,0xE2,0x8A, +0xA0,0x31,0x3A,0x89,0xFE,0x4C,0xD1,0x41,0x3C,0xBE,0x11,0x10,0x89,0x30,0xF0,0x5B,0x3A,0xE5,0x72,0x88, +0x61,0xAA,0xB2,0xEC,0xDA,0xA4,0x62,0xB8,0xC0,0xF5,0x23,0x86,0x75,0xBC,0x7B,0x98,0xE0,0xE9,0x12,0x36, +0x8E,0xBB,0x6B,0xB4,0x41,0x33,0xEB,0x91,0x92,0x56,0x8D,0x58,0xC0,0xB8,0x61,0x47,0xA3,0x3D,0x56,0xB0, +0xD3,0xF7,0xC3,0x86,0x8F,0x7E,0x4C,0x95,0xD7,0xB5,0xC4,0x77,0x3E,0x0A,0xBC,0x92,0xC9,0x87,0xD3,0x5C, +0x93,0x1C,0xFA,0x6B,0xAD,0x94,0x35,0xDE,0x98,0xC4,0xDE,0x35,0x44,0xA6,0xF6,0xDE,0xDA,0xD9,0x0C,0xB8, +0x09,0x9B,0x5F,0x09,0xAA,0xE7,0xA8,0xD5,0xC9,0xAA,0xFF,0xCF,0x5B,0x1F,0x5D,0xCF,0x42,0x7F,0xA7,0xFF, +0xBF,0xA9,0x05,0xBD,0xC8,0xBB,0x94,0xBF,0x5B,0xCE,0xE2,0xAA,0x9D,0x79,0xA4,0x3C,0xC5,0x93,0x59,0xC9, +0x9F,0xF1,0x90,0x2B,0xB8,0x5C,0xF9,0x94,0x58,0x1D,0xDD,0x6E,0x2B,0x3D,0xD3,0x68,0x90,0x1F,0xE0,0x58, +0xB1,0xB4,0x7F,0x26,0x5E,0x26,0x13,0x3E,0xD8,0x93,0x5B,0x79,0x15,0xF3,0x9F,0xE9,0x72,0x89,0x10,0xDC, +0xAD,0xBD,0xC7,0xD9,0x33,0xC8,0x1A,0x09,0xED,0x4D,0xA1,0x4D,0x12,0x5C,0x22,0xE2,0xB5,0x0D,0xE6,0xF2, +0xEB,0x04,0x10,0x5B,0xC6,0x0C,0xF1,0x58,0xA1,0xEC,0x82,0xB5,0xE4,0x8E,0x0C,0x92,0x03,0x6F,0x5A,0x33, +0x46,0xF3,0x78,0xAE,0x70,0xA3,0x5E,0xFB,0xCE,0x84,0xED,0x01,0x5C,0xA8,0xC5,0x41,0x3B,0xAC,0x89,0x58, +0x55,0xEF,0x9D,0xC9,0x76,0x18,0x7D,0x84,0x34,0x7C,0x59,0x65,0x75,0xCE,0xFA,0xFE,0x2A,0x47,0x66,0x31, +0x1B,0x06,0x1F,0xBA,0x16,0xE6,0x38,0x76,0x8E,0x6C,0x0F,0x14,0x34,0x1B,0x56,0x0A,0x88,0x23,0x2A,0x73, +0xCB,0x94,0x94,0x0D,0x8D,0xDD,0x62,0xE8,0x54,0x27,0x1F,0x1F,0x5A,0x1E,0xA7,0xFD,0xCE,0xE4,0xFF,0x70, +0x83,0xDE,0x31,0x13,0xB3,0xA4,0xE2,0x13,0x83,0xAF,0xB2,0x57,0xEC,0x07,0x47,0x26,0xA6,0xC3,0xC7,0x03, +0xB7,0x38,0x22,0xF3,0x46,0x05,0x1D,0x4C,0xBD,0x75,0xC9,0x55,0x39,0xC1,0xFE,0x28,0x94,0xE2,0x9B,0x5F, +0xB5,0x01,0x6A,0x97,0x32,0x06,0x02,0xC5,0x2C,0x89,0xC5,0x9B,0x97,0xE4,0x5D,0x53,0x30,0xC2,0x8B,0x6D, +0x7D,0x15,0x73,0xA9,0x01,0xA5,0x17,0xAB,0xCA,0x24,0xEB,0x83,0x96,0x20,0x0F,0xDD,0x3C,0xA4,0x23,0x2E, +0x30,0x42,0xC0,0xFD,0x7C,0x5A,0xCD,0xCE,0x5C,0xC5,0x4D,0x21,0xC3,0x77,0x0B,0x14,0x2F,0xC8,0x0D,0x1D, +0x2A,0x80,0x29,0x82,0x09,0xDF,0xB5,0x56,0x19,0x6F,0xF4,0x65,0x5E,0x78,0x0D,0xFA,0x3A,0x08,0x45,0x12, +0x0A,0xCC,0xE3,0xCB,0xD4,0x39,0x12,0x2B,0x8E,0x1A,0x14,0x2F,0xDA,0xCA,0xC2,0xFE,0x45,0x82,0x7F,0x40, +0xAB,0x02,0x70,0x44,0x96,0x8D,0xAD,0xDE,0x34,0x8C,0x9B,0x60,0xCD,0xC8,0x3C,0x02,0x7E,0x7B,0x8B,0xD2, +0x20,0xD9,0x39,0x99,0x7D,0xB2,0x27,0xA3,0x84,0x10,0x78,0x05,0x94,0x2E,0x96,0x04,0xC4,0x2E,0x3C,0x45, +0x28,0x5A,0x6F,0x9E,0x5B,0x3F,0x65,0x0B,0x21,0x0D,0xB5,0xA1,0xD4,0xD4,0x68,0x73,0x09,0x73,0x5F,0x60, +0x21,0x1E,0xC5,0xF5,0xCD,0x4C,0xD1,0x21,0xED,0xD9,0xB2,0xB6,0x1C,0x4B,0x17,0xAD,0x5A,0x3B,0x84,0xEB, +0x53,0x15,0xCF,0xC6,0x87,0x7B,0x96,0xE6,0x9D,0x97,0x62,0xA1,0x76,0x17,0xF0,0x4C,0x1E,0x39,0x24,0xF6, +0xCF,0x51,0xC2,0x82,0x17,0x0A,0xEF,0xAD,0xD0,0x39,0xDD,0x22,0x9F,0x7D,0xA3,0x0B,0x3E,0x9B,0xD1,0x58, +0xBE,0x67,0x12,0xEC,0xFE,0xD5,0xF1,0xBD,0x3F,0x77,0xBD,0x1F,0xD5,0x03,0x02,0x85,0x95,0x08,0x74,0xDC, +0xC7,0xFC,0xCE,0xEC,0x4E,0x67,0xB3,0x28,0xA9,0x70,0x1A,0x3D,0x75,0xF0,0x10,0xC2,0xCF,0xC9,0x86,0xFC, +0xC5,0x21,0x26,0xBE,0xED,0xBB,0x80,0xE7,0xB7,0x01,0x98,0x69,0xE4,0x02,0x18,0xCD,0x1D,0x67,0x0F,0x55, +0x11,0x03,0x37,0xEE,0x73,0x96,0x5A,0xB4,0xA8,0xCE,0x6F,0x16,0x9A,0x14,0x5F,0xED,0x03,0xD6,0x40,0xCC, +0xA4,0x5A,0x23,0x3A,0x28,0xEE,0xC2,0x8F,0xB6,0x45,0x22,0xF5,0x48,0x57,0x0D,0x6A,0x1B,0x17,0x67,0xA9, +0x36,0x4E,0x2E,0xAA,0x10,0x10,0x24,0x55,0x19,0x72,0x12,0x6C,0x77,0xF7,0x11,0xFA,0xBB,0x31,0xC3,0x4C, +0xF6,0x5D,0x37,0xD6,0x05,0x9A,0xC9,0xD3,0xDF,0x6E,0x11,0x8E,0x46,0x27,0xF1,0x4F,0x44,0x12,0xDB,0x99, +0x04,0xDC,0x7F,0xFC,0x01,0xBD,0x9A,0x06,0x88,0xF7,0xB4,0xE8,0x16,0xE9,0x8A,0xBE,0x43,0x30,0x96,0x1C, +0x79,0x38,0xA4,0x95,0xEA,0x70,0x90,0xE0,0x17,0xE8,0xC8,0x09,0xAA,0x82,0x2F,0x90,0xA5,0x42,0x07,0x39, +0x69,0x33,0xC8,0x67,0xF1,0x02,0xD1,0x55,0x44,0xEF,0x01,0xD5,0xD8,0x6D,0x37,0x38,0x8F,0x61,0x2E,0xE5, +0x93,0x82,0x22,0x33,0xF5,0xE3,0x59,0x49,0x57,0x22,0x45,0xB2,0x42,0x4B,0x55,0x37,0x78,0xDC,0x6E,0x82, +0xE1,0x06,0xA8,0xE0,0x77,0xC6,0xA0,0x55,0x30,0x34,0x43,0xA7,0x71,0x88,0x70,0x0F,0xE0,0xC8,0xF2,0x16, +0xA4,0x98,0x79,0xA9,0x02,0xC9,0xBF,0xF4,0x7B,0xA5,0x0B,0xD3,0x40,0xEA,0xE9,0x9A,0x50,0xCA,0xF1,0xB9, +0xB3,0x48,0x1D,0x0C,0x78,0x44,0x39,0x22,0x38,0x48,0x4A,0xF7,0x16,0x1A,0xC6,0xD8,0x56,0xF7,0x50,0xFF, +0x9C,0xA3,0x01,0xD8,0xBF,0xE9,0x49,0x63,0x27,0xC2,0x74,0x31,0x0F,0xC0,0x2E,0x7E,0xEE,0x84,0xE5,0x89, +0x63,0xE6,0x47,0xA0,0x5F,0xA2,0xAF,0x7A,0xB0,0xFC,0x76,0xBC,0xF2,0x85,0xC3,0xDA,0xEE,0xC1,0xC8,0x2F, +0xA3,0x8D,0xD7,0x6A,0xFD,0x02,0xDB,0xDA,0x47,0x23,0x4F,0x4A,0xBD,0x40,0x52,0x4F,0xEA,0x3A,0x82,0xA4, +0xBB,0x17,0xFC,0xE8,0x4B,0x83,0x32,0x6A,0xCE,0x41,0xAA,0x48,0x2D,0x68,0x17,0x98,0x4B,0xA0,0x63,0x2F, +0x71,0xA7,0xDA,0x95,0x43,0xE0,0x8C,0x8C,0xDB,0x62,0x63,0x3F,0x05,0xA8,0x13,0x40,0x8E,0x2A,0xFF,0xEC, +0x75,0x45,0x0C,0x6B,0x58,0xA2,0x16,0x49,0x6C,0x14,0x85,0xA2,0x72,0xAC,0xC1,0x76,0x68,0xCB,0xBB,0x2E, +0x30,0xC2,0x17,0x70,0x24,0xB1,0x1E,0xC8,0xCF,0x9D,0x8E,0x68,0xC1,0xD9,0x96,0x46,0xF2,0xBC,0x5A,0x31, +0xCA,0x32,0x0C,0x96,0x4D,0x73,0x3C,0x34,0x04,0x09,0x1D,0xF4,0x69,0xFA,0xD5,0x72,0x86,0x9F,0x92,0xC2, +0x6E,0x38,0x11,0x41,0xE4,0x77,0x45,0xC7,0x7F,0xF4,0xCD,0xE5,0x77,0x19,0x17,0xD9,0x5A,0x82,0x63,0x88, +0x6E,0xF5,0x1C,0x57,0x73,0xDF,0xD3,0x3F,0xA0,0x17,0x92,0x14,0x86,0xCB,0x80,0x82,0x9D,0xF9,0x70,0xC3, +0xDE,0x79,0xCF,0x38,0xA3,0xD8,0x37,0xA7,0x1D,0xBF,0xDC,0x93,0x5A,0x39,0xA6,0xCD,0x98,0x31,0xC2,0x23, +0x80,0x76,0xFB,0x75,0xF1,0x63,0x05,0xA6,0x3C,0x5E,0xC3,0x87,0x01,0xFD,0xB6,0x53,0x81,0x27,0x7C,0x2E, +0x5A,0x74,0x63,0x85,0x29,0x74,0xE7,0x45,0x3A,0xD8,0x45,0xFB,0x41,0x9A,0x6A,0x1F,0x00,0x30,0x03,0xE8, +0x34,0x43,0xC6,0x5C,0x24,0x77,0xE9,0x58,0x2F,0x5B,0x71,0xEF,0x41,0x57,0x09,0x7F,0xB7,0x51,0x9A,0x5E, +0xFB,0x7A,0xF8,0xFA,0xD4,0x76,0x44,0x65,0x8B,0x77,0x4E,0xCF,0x17,0xF7,0xF7,0x0D,0xE8,0xF1,0x95,0x9F, +0x24,0xB6,0x68,0xDD,0xB5,0x96,0x9B,0xCA,0x91,0x14,0x1C,0x5F,0x7B,0x78,0xF9,0x2A,0xA8,0x1F,0x8C,0xE0, +0xC9,0x91,0xA9,0x87,0xE5,0xAA,0x72,0x8E,0xC5,0x10,0x1E,0xD1,0x8A,0x06,0xFC,0xEC,0x51,0x92,0xF3,0x8A, +0x80,0xFE,0xA0,0xC5,0x90,0x39,0xC0,0xB7,0x09,0x18,0x97,0x3C,0x19,0x2E,0x5F,0xEC,0x77,0xA3,0xEC,0x62, +0x09,0xF5,0x89,0x3F,0x29,0x1C,0x6F,0xAF,0xD9,0x93,0x21,0x49,0x00,0x3C,0xE5,0x4D,0x32,0xD0,0xE3,0x71, +0x6D,0x02,0x6F,0x75,0x36,0xCE,0xB0,0x01,0xC4,0x6D,0x48,0x61,0xBD,0xBB,0x4F,0xD2,0x47,0xC3,0x6C,0xE8, +0xE8,0xCD,0x18,0xB6,0x20,0x24,0xD8,0x60,0x73,0xA3,0x5E,0x70,0xF8,0xEE,0x42,0x47,0x8F,0x7F,0xA6,0xC3, +0xC0,0xE7,0xD7,0xCE,0x3F,0xE1,0xB3,0x24,0xEF,0xA0,0x6D,0x2B,0x7E,0x12,0x6F,0x92,0x2E,0xA0,0x21,0xF7, +0x1D,0xEC,0x71,0x24,0xF9,0xE8,0xAA,0x97,0xE1,0x09,0x0E,0xC3,0xAF,0x0D,0xAD,0x84,0x2D,0xC4,0x2A,0xAC, +0x34,0x81,0xD6,0xF2,0x54,0x07,0x00,0x12,0x43,0x65,0xB0,0x33,0x8B,0xA1,0x5F,0xAF,0x58,0x79,0x35,0x97, +0xDD,0x19,0xD4,0x81,0x06,0x6B,0xCE,0x20,0x14,0x06,0xD3,0x14,0x51,0x8F,0x92,0x24,0xB5,0x0C,0x2D,0x00, +0xA2,0x66,0x5A,0x70,0x7B,0xEA,0x5C,0xAF,0x81,0x25,0x4E,0x9D,0x28,0xA2,0xE9,0x2A,0xA5,0x8B,0xE6,0xAC, +0x95,0xEB,0x14,0xBB,0xDB,0x26,0x55,0x6D,0x65,0xC5,0x81,0x8B,0x67,0x66,0xEE,0x5E,0x11,0xE6,0xF3,0x94, +0x67,0x49,0x22,0x8B,0xF9,0xF2,0x25,0x5F,0x27,0x09,0xE9,0x32,0x7F,0x47,0x7D,0x38,0x89,0x2B,0x4C,0xDF, +0x94,0xE9,0x6D,0x39,0xC0,0x89,0xDB,0x69,0xFB,0xE6,0x60,0x35,0x6E,0x53,0x9A,0x46,0xFE,0x2D,0x26,0xFA, +0x86,0xEF,0x89,0x9E,0x34,0x5D,0x95,0xD8,0x2D,0xBD,0xB8,0x0D,0xF4,0xC9,0xAE,0x98,0xAE,0xB2,0x50,0x8D, +0xD3,0x70,0x99,0xA3,0x0E,0x43,0xB7,0xBC,0x1A,0x23,0x0B,0x79,0x4C,0x02,0x8D,0x69,0x3F,0x6D,0x13,0xB3, +0xB7,0xC2,0x2B,0xD7,0xB8,0x02,0x05,0xDB,0x4D,0x03,0x83,0x60,0x5B,0x3B,0xF4,0x11,0x41,0x3F,0xB3,0x60, +0x7C,0xB9,0x00,0xC6,0x8D,0x61,0xB1,0xC4,0x47,0xF4,0x2C,0x61,0x4F,0xB4,0xBB,0x85,0xC9,0xF2,0xBC,0x91, +0xE5,0x7C,0xAD,0x32,0x50,0x7A,0xF7,0xF0,0x8E,0x14,0x65,0xF3,0xA7,0xF0,0xD9,0x30,0xD8,0xD8,0x4F,0xE1, +0xF8,0xE9,0xAD,0x82,0xD5,0x3E,0x1E,0x36,0xB3,0x58,0x6F,0x41,0xC6,0xB3,0xED,0xAE,0xDD,0xF5,0xE3,0xA0, +0x15,0x86,0x9A,0xC1,0x30,0xA6,0x0A,0x46,0xD1,0x89,0x50,0x9C,0xD5,0x44,0xD6,0x41,0x1C,0x6A,0x1F,0x54, +0xF2,0x78,0x2C,0x02,0x89,0xA4,0xC6,0x4A,0x80,0xF1,0x9D,0x84,0x95,0x92,0x3D,0xD6,0x94,0x9A,0xD9,0x70, +0xCC,0xDC,0xAF,0xE2,0x8A,0x09,0x0D,0x73,0xB7,0x9A,0xD3,0x3E,0x14,0xD2,0x03,0xF5,0x06,0x54,0x0B,0x75, +0x3E,0x88,0xBC,0x71,0x5F,0x98,0x17,0x8C,0x64,0x15,0x08,0x0F,0x8F,0xD1,0xE6,0xB3,0xDD,0x94,0xEE,0xEE, +0x44,0x34,0xA6,0x8A,0x3B,0x70,0x00,0x83,0xE2,0x2F,0xAB,0x59,0x4E,0xC8,0x31,0xE9,0x53,0x07,0xB0,0x48, +0x76,0xCB,0xB2,0x2F,0x89,0x2E,0xEE,0xAD,0x3A,0xC1,0xB8,0xFB,0xAF,0xD9,0xE6,0x1B,0xC5,0x1F,0x77,0xBF, +0x45,0xDF,0x07,0x40,0xDF,0x16,0x9D,0xB5,0xFA,0x93,0xD8,0x22,0x9D,0x87,0x56,0x19,0xE2,0xD1,0xC8,0x02, +0xDD,0xE7,0x40,0x89,0x29,0xD4,0xB7,0x5E,0x9A,0xD8,0x85,0x01,0x9C,0xC1,0x24,0xC9,0xFD,0x51,0x45,0x38, +0x8C,0x98,0x60,0xA8,0x12,0xB1,0x0A,0x99,0x91,0xFE,0xD7,0x99,0x01,0xBC,0x27,0x59,0x66,0x13,0x97,0xF8, +0xDC,0x9F,0x42,0xB1,0xE9,0xCD,0x0F,0x80,0x5C,0xBE,0x28,0x62,0x81,0x0F,0x67,0xFB,0xE1,0x86,0xC4,0x85, +0x03,0x4C,0xB4,0xD0,0x50,0x7B,0x20,0xD2,0x6A,0x0F,0x30,0xEF,0x22,0x00,0x0E,0x52,0x1C,0xBE,0x26,0xDC, +0x2E,0xA7,0x29,0x06,0x01,0x46,0xF9,0xFB,0xA3,0x63,0x9E,0xDE,0x29,0xC9,0x4A,0x31,0xEB,0xB9,0x49,0xB1, +0xD1,0xD1,0x31,0x2C,0x6A,0xAE,0xA9,0x39,0x20,0x20,0x91,0x60,0xE2,0xB8,0x46,0xE8,0x63,0x85,0xA0,0xF1, +0x0A,0x42,0xD6,0x7E,0x30,0xB0,0xF5,0xA4,0x46,0xD1,0x72,0xA3,0x31,0xAA,0xF6,0xF9,0x9D,0xAC,0x5E,0xD9, +0xAA,0x76,0xD5,0x60,0x8F,0x36,0x4F,0xE9,0xA1,0x9B,0x3E,0xF7,0xBF,0xC6,0x06,0x72,0xF8,0x15,0x04,0x5A, +0xE4,0x24,0x1C,0xD3,0x46,0x89,0x13,0x35,0xCB,0xDA,0x01,0x75,0x8B,0x54,0x49,0x4A,0xE5,0x26,0xB2,0x1C, +0xA6,0x4E,0x56,0xF6,0x1E,0x8A,0xE9,0x7A,0x66,0xC2,0x48,0x2C,0x6B,0x0C,0xEA,0xB8,0x62,0x13,0x72,0x14, +0xE4,0x66,0x43,0xBC,0x72,0x78,0xCA,0x3C,0x6F,0x52,0x94,0x2F,0x9C,0x6D,0xF0,0xE5,0xC0,0xF7,0x2B,0x74, +0x77,0xBF,0x11,0x8D,0xC0,0xD9,0x0B,0xE8,0x92,0x0B,0xB5,0xE8,0x7B,0x0B,0x42,0x31,0x6C,0xB4,0x3F,0x4A, +0xEA,0xEF,0x7A,0xB3,0xE8,0x2C,0xB0,0xB8,0x10,0x81,0xFE,0xFA,0x2A,0xE1,0x3E,0x1F,0x20,0xEA,0x50,0x25, +0x2A,0x4D,0x2E,0xEE,0x36,0x3D,0xDA,0x39,0x13,0xE9,0xFA,0xEE,0xDB,0x65,0x46,0xCD,0xD8,0x60,0x16,0xCF, +0xF4,0x1E,0x02,0xFB,0xCA,0x44,0xF0,0x1E,0xA8,0xE7,0x6B,0x50,0x72,0x04,0xF5,0xF0,0x9D,0x7D,0x8A,0xD4, +0x2A,0xE0,0x1F,0xF9,0x89,0x7A,0xFB,0x04,0x13,0xA2,0xD4,0x6C,0x2C,0x7D,0x2A,0x48,0xFC,0x5F,0x4F,0x4C, +0x44,0x3D,0x55,0xA1,0x84,0xEE,0xF2,0x5D,0x02,0x81,0xDC,0x21,0x93,0x4A,0xC5,0x98,0x90,0x3E,0x5C,0x8D, +0x5D,0x5D,0xFB,0x4D,0xA0,0x7F,0x27,0x5E,0x14,0x5D,0x97,0x43,0x70,0x22,0xCD,0x64,0x83,0x08,0x35,0x66, +0xA6,0x23,0x98,0xCF,0x46,0x43,0xC3,0x44,0xF9,0x31,0x97,0x31,0x27,0xEB,0x5F,0xA4,0x3C,0x99,0xD4,0x93, +0x50,0x5D,0xD0,0x84,0x6E,0x72,0xF9,0x60,0x97,0xB6,0x0C,0x5C,0xC6,0x77,0x64,0x0A,0xCF,0x3B,0x1C,0x30, +0x9D,0x82,0x3B,0x84,0x3A,0x9E,0x10,0x41,0xA4,0x07,0x13,0x63,0x27,0xC5,0x7F,0xAC,0x53,0x89,0x78,0x65, +0x5B,0xF4,0x0C,0x4D,0xB5,0x05,0x9D,0x7D,0xC6,0x5F,0xD9,0xF0,0x8C,0x57,0x07,0xF7,0x8F,0x03,0x3E,0x7F, +0x27,0x8D,0xA9,0x4E,0x5B,0xB9,0x4E,0xB2,0x7E,0x90,0x57,0xA9,0x8C,0xE6,0x4E,0xE1,0xAA,0x94,0xA6,0x58, +0x29,0x42,0x3E,0x7E,0xF5,0x77,0x17,0xEF,0x8B,0xD8,0xC9,0x09,0x8D,0xFC,0xAF,0x47,0xDB,0x5B,0x4F,0x6F, +0x7B,0x74,0xCF,0x71,0xF3,0x00,0x51,0x5A,0x73,0x20,0x09,0xDF,0x5E,0x40,0xE7,0x7F,0x58,0x38,0x86,0xE0, +0x2A,0x5E,0x42,0x48,0x24,0x08,0x53,0x6C,0x70,0x4B,0x46,0x6E,0xBF,0x54,0x3F,0x5C,0x35,0xD1,0x3F,0xBC, +0x0B,0x40,0x0B,0x55,0x23,0x6E,0x8F,0x9A,0x88,0x6D,0x82,0x79,0xAC,0x2C,0xCF,0x5D,0x07,0xB7,0x97,0x71, +0x7D,0xFA,0x17,0x61,0x91,0x76,0x8F,0x41,0x24,0xE0,0xD5,0xF2,0x9A,0x5E,0x61,0x50,0xC8,0x1F,0x67,0x06, +0x79,0xB3,0x7E,0xCE,0x04,0x2B,0xA6,0xF7,0x5F,0xA0,0x69,0x2E,0xE1,0x7F,0x52,0x66,0x72,0xFB,0xD7,0x96, +0x30,0x47,0xB6,0xFE,0x36,0x01,0x61,0x16,0xE0,0x6E,0xE6,0xC7,0x55,0xA3,0xEC,0x03,0x65,0x3D,0x81,0x1B, +0x7D,0x49,0x68,0x02,0x61,0xBD,0x20,0xD7,0xDC,0xAD,0x3D,0xC0,0xB6,0xD2,0xF7,0xC6,0x99,0xA7,0x74,0xB7, +0xF6,0x1D,0xE4,0x6D,0x55,0x42,0xE3,0xC6,0x54,0xEA,0xF5,0xC2,0x08,0x71,0x23,0x91,0x3C,0x6B,0x0B,0x1B, +0x75,0x74,0x2D,0xF8,0x01,0xF7,0xD0,0xC5,0x6D,0xA3,0x3D,0xD8,0x41,0xD7,0xFA,0x08,0xB5,0x1C,0x13,0x3E, +0x96,0xC4,0x4D,0xC5,0x53,0x15,0x20,0x90,0xFC,0x84,0x4A,0x17,0xAF,0xEF,0xDA,0x51,0xFF,0x52,0x43,0xEF, +0x36,0x01,0xC2,0xB4,0x0D,0x74,0x7D,0x48,0xE1,0xA6,0x9A,0x6A,0x08,0xA9,0x26,0xFF,0x57,0x88,0x6B,0x0E, +0xE9,0x37,0x72,0xC7,0x8D,0xF3,0x2E,0x7A,0x09,0xA8,0x1A,0x0A,0xB3,0xEF,0x45,0x48,0x63,0x56,0x2B,0x58, +0xD0,0x1F,0x53,0x78,0xE3,0x03,0x9D,0xFA,0xDE,0x55,0x6A,0x0A,0x69,0x3B,0xF6,0x49,0x23,0xF1,0x68,0xF3, +0xE1,0xC6,0x3C,0x39,0x89,0xED,0x62,0xC7,0x28,0xB4,0xF3,0x33,0xDB,0xA2,0x33,0x75,0x34,0x17,0xB1,0x8E, +0x45,0x01,0x4C,0xD2,0x2F,0xC8,0x2D,0x91,0x7A,0xEA,0x2C,0xE0,0x6C,0x36,0x0E,0xA1,0xA0,0x00,0x1B,0x3A, +0x11,0x60,0x80,0x1E,0x4F,0xAF,0x63,0xB2,0x92,0xCC,0x32,0xCD,0xF0,0x9E,0x0A,0x15,0xAF,0xCA,0x59,0x27, +0x7F,0x11,0xFC,0xB0,0xEC,0x2C,0x3E,0xD8,0x68,0x52,0xAA,0x0A,0xF5,0xC4,0x33,0xC8,0x22,0x66,0x25,0xFD, +0x83,0x8B,0xAC,0x63,0xD5,0x4F,0xEB,0xD4,0x04,0x2F,0x11,0x16,0xE0,0x53,0xF2,0x32,0x16,0xC1,0x72,0x96, +0x93,0xE1,0xC7,0x89,0x56,0x4A,0x86,0x45,0x07,0x5E,0xB3,0xE5,0x5B,0xD0,0x65,0x6A,0x20,0x19,0xCA,0xD1, +0x86,0x2D,0x90,0x13,0x2C,0x11,0x92,0x75,0xA3,0x99,0xF4,0x94,0xF1,0xFD,0x3D,0x37,0xAF,0x44,0xEA,0x46, +0xC3,0x0C,0xA4,0x42,0x26,0x63,0x59,0xB6,0x82,0xBD,0x72,0x4A,0x07,0x55,0xFC,0x84,0xAC,0x8B,0x1D,0x56, +0x39,0x40,0xCC,0x5F,0x31,0x27,0xBC,0x7E,0x0B,0x97,0x9F,0x18,0xF5,0x39,0x61,0xD7,0xA0,0xA4,0x26,0x68, +0x08,0xF6,0x7B,0x4B,0xC5,0x21,0x95,0xB1,0x88,0xFB,0xAD,0x5A,0x15,0xD5,0xDC,0xAA,0x96,0x05,0x3E,0x3D, +0x0E,0x84,0x37,0x95,0x00,0x92,0x26,0x62,0x26,0xD5,0xE4,0x7F,0x57,0x98,0x89,0x86,0x97,0x45,0xC8,0x06, +0x97,0xCB,0xFA,0xCA,0xAD,0x66,0xF7,0x98,0xFB,0xB1,0x06,0xA9,0x5E,0xD6,0x7B,0x80,0x35,0xCA,0x58,0xAD, +0xEA,0x17,0xFA,0x8C,0x51,0xD6,0xE4,0x51,0x51,0x7B,0x77,0x26,0x4E,0xB8,0x76,0xBB,0x08,0x17,0xE6,0xD9, +0xA9,0xA0,0x0D,0x44,0x60,0x66,0x81,0x16,0xDE,0xBB,0x27,0xB4,0xA3,0x31,0xD8,0x63,0x38,0xEE,0xDA,0x78, +0x0E,0xD4,0xCE,0x06,0x7A,0x20,0x4E,0x30,0xC6,0x0E,0x2E,0x52,0x6D,0xFF,0x7E,0x3A,0x63,0x26,0x97,0x15, +0x43,0x02,0x30,0x54,0x5B,0x17,0xF2,0x4B,0xAC,0x63,0x72,0x98,0xD8,0x58,0x5B,0x6A,0x2B,0x9C,0x75,0xD9, +0x3D,0x95,0xAA,0xDA,0xB9,0xCD,0x80,0xDF,0x06,0x8C,0x46,0x43,0x08,0xF9,0xAA,0x41,0xA1,0x5F,0x10,0x80, +0x02,0x0D,0x83,0xA4,0x5E,0x79,0x1C,0x81,0x76,0x41,0x37,0x94,0x53,0xD6,0x6B,0x54,0x17,0x27,0xD8,0xB9, +0x68,0x03,0x98,0xB1,0x5D,0xE9,0xB5,0x63,0x3F,0x6E,0x2D,0x6A,0x4E,0x7F,0x0B,0x34,0xE1,0x92,0xD5,0x30, +0xBF,0xA2,0x01,0x14,0xFE,0x23,0x23,0xD5,0x97,0x31,0x58,0x4F,0xC7,0x11,0x4D,0x90,0xFF,0x40,0xC0,0xE5, +0x28,0x64,0x14,0xB1,0x7D,0x4F,0x84,0xC5,0x6C,0x27,0x89,0x89,0xD2,0x74,0xDE,0xB0,0x05,0xE5,0x4E,0x31, +0x3E,0x4C,0x1C,0xF1,0x49,0x67,0xCB,0x48,0x60,0x5E,0x85,0x95,0xA1,0x44,0x15,0xE0,0x90,0x26,0xD5,0xC1, +0xE8,0x26,0xF7,0x48,0xAA,0xC2,0x9D,0xF0,0x8D,0xEC,0xD7,0x24,0xFA,0xCC,0x1D,0xF0,0xC9,0x67,0x61,0x86, +0xAF,0x77,0x92,0xE5,0x04,0x4A,0xB8,0x8E,0xDD,0x02,0xDF,0xE8,0x44,0xB3,0xD6,0xAD,0x50,0x68,0x4B,0x0D, +0x0A,0x69,0x6D,0x66,0xCF,0x23,0x6A,0x5A,0x28,0x09,0x4E,0x18,0x53,0x49,0x46,0x85,0x05,0x48,0x43,0x85, +0x23,0x46,0x17,0x0D,0x4A,0x86,0x57,0x28,0x93,0x02,0xD4,0x18,0xAD,0x0D,0x0F,0xE0,0x91,0x6A,0x43,0x94, +0xCF,0x59,0x5D,0x28,0xD3,0x09,0x9C,0xC9,0x00,0xEF,0x1C,0xB9,0x75,0x95,0x52,0xC9,0x4A,0xE6,0x6A,0x9F, +0x78,0x00,0x1E,0xDD,0x64,0xE6,0x55,0x21,0x66,0xD4,0x8E,0xC9,0x03,0x4D,0x8A,0x0F,0x27,0xBB,0x9D,0xC8, +0x82,0x6D,0xDC,0x34,0xE3,0x97,0xDF,0xCC,0xE2,0x6C,0xED,0xCD,0x04,0xC1,0x9F,0xFC,0xE5,0xE4,0x3A,0xF3, +0x2D,0x5A,0x0F,0x7C,0xA0,0x27,0xA5,0x40,0x56,0xC2,0xC5,0x9C,0x13,0x50,0x80,0xA0,0x36,0x02,0x55,0xC3, +0xEF,0xE6,0xC4,0xA1,0x7A,0x32,0xC8,0x5A,0x9A,0x53,0xEC,0xC2,0x6C,0x3C,0xDC,0x39,0xAD,0x13,0x42,0xB5, +0x53,0x72,0xAE,0xC6,0xAE,0xCE,0x04,0x01,0xA2,0xEF,0xAE,0x3B,0xE1,0x48,0x4B,0x50,0xFA,0x90,0xC8,0x97, +0xA0,0x73,0xF2,0x11,0xAB,0xE3,0x58,0xB4,0x1A,0x3F,0x19,0x11,0xFB,0x98,0x90,0x41,0x6E,0x37,0x14,0x46, +0xB2,0xAE,0x5E,0xB0,0x23,0xDC,0xF3,0xD8,0xFF,0xD9,0x92,0x25,0x29,0x37,0xFF,0x36,0x92,0x77,0x0C,0xF0, +0x47,0x16,0xE2,0xCD,0xA1,0xDA,0x91,0x64,0xE9,0xBC,0x05,0x88,0x87,0x89,0x5F,0xB1,0xA2,0x55,0x46,0x7E, +0x19,0xA7,0x99,0xC0,0x8D,0x74,0x40,0xAD,0x4C,0xE2,0x49,0x04,0x8C,0x9E,0xCA,0xB2,0x1A,0x74,0xD9,0x89, +0x0C,0x1E,0xF8,0x8B,0x99,0x67,0xA9,0x33,0x9D,0xCE,0xCE,0x08,0x36,0x93,0xCE,0x11,0x40,0x5B,0x37,0x02, +0x3A,0xEB,0x8E,0x3A,0xAC,0x5E,0x4E,0x9D,0x37,0x92,0xAD,0xBE,0x09,0xC5,0x33,0xEF,0x35,0xCC,0x1F,0xE5, +0x97,0x7A,0x15,0x0D,0xDA,0x1A,0x4A,0x9C,0xAF,0x89,0xB0,0x19,0xAB,0x64,0x27,0xC9,0xE5,0x50,0xDB,0x28, +0x9E,0x5B,0x92,0xBC,0x47,0xD7,0xBE,0xA7,0x1B,0x0E,0xCC,0xFD,0x68,0x3C,0xB1,0x1F,0x58,0xD1,0xCC,0x7D, +0x05,0x7E,0x9A,0xD4,0x9E,0x92,0x1A,0x5D,0x45,0x3E,0x6D,0xC5,0x87,0xAC,0x59,0x1C,0xCF,0xD7,0x9E,0x05, +0x1F,0x91,0x83,0xE9,0xE0,0x7C,0x40,0x77,0x11,0x8F,0x91,0xAD,0xC6,0xB4,0x1F,0x5F,0x3B,0x45,0x5D,0x59, +0xC1,0x7D,0x1F,0xB0,0xD4,0xAA,0x8A,0xC5,0xA5,0xEE,0x60,0x8F,0x00,0xE2,0xCA,0xA6,0x52,0xF9,0x64,0x26, +0x1C,0x8A,0xF7,0x13,0x21,0x87,0xBB,0xD1,0xE8,0xD7,0xDB,0xF2,0x07,0xC7,0xB8,0xB7,0x5B,0x82,0x43,0x02, +0x85,0xE2,0xE0,0x79,0x92,0x30,0x9D,0x58,0x1A,0x5F,0x65,0x06,0xDE,0xC0,0x83,0xB0,0x24,0x0A,0x12,0x99, +0x94,0xE1,0x93,0x6E,0x64,0x81,0x67,0xC2,0x9E,0x80,0xB4,0x47,0x2C,0xE7,0x55,0x69,0x39,0xCF,0xA4,0xE3, +0x29,0xA6,0x63,0xF5,0x74,0x49,0x2C,0xA7,0x68,0x2F,0x3B,0x8A,0x20,0xFE,0xAC,0x72,0x47,0xC5,0xFB,0x05, +0x75,0x64,0xB5,0xE6,0xA8,0xA5,0x50,0xE8,0x28,0x6D,0xA5,0x72,0xE8,0xA5,0xE6,0xF4,0xAA,0xEE,0x6F,0xF2, +0xA9,0xE4,0x30,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0x06,0x84,0xA3,0x4A,0xA2,0xEA,0x2C,0x8E,0x62,0x82, +0xA2,0xEA,0xF3,0x2E,0xED,0x97,0xA6,0xAF,0x12,0x08,0x10,0x9E,0x13,0x55,0x2E,0x59,0x1B,0x3B,0x83,0xA4, +0x4E,0xA9,0x64,0xEF,0x52,0xC8,0x89,0xB7,0x8A,0x98,0xE6,0x03,0x9A,0x98,0x87,0x49,0x41,0x3C,0x77,0xAA, +0xF2,0xC8,0xEB,0xF2,0x3E,0xC9,0x58,0x5F,0x91,0x50,0xE4,0x3A,0xE9,0x89,0xFF,0xAA,0x91,0xE8,0x26,0xCB, +0x20,0xEF,0xE2,0x50,0x22,0x58,0x72,0xCF,0x60,0xAF,0x65,0xDE,0xA1,0x43,0x3E,0xFF,0x21,0x66,0xB3,0x9B, +0xBA,0x02,0x70,0x2A,0x0E,0x4D,0x9D,0x0D,0x27,0x7B,0x2D,0x9A,0xE1,0xAE,0xF0,0x04,0x67,0x92,0xA7,0x3B, +0x8F,0x46,0xE4,0x28,0x37,0x3F,0xB5,0x8A,0xC4,0xEC,0xBF,0x57,0x3A,0x00,0xAF,0xDE,0xE1,0x65,0xB3,0x6F, +0x0F,0x5E,0x99,0xC2,0x28,0x6B,0x64,0x0A,0x0D,0xF2,0xE3,0x26,0x76,0xFD,0xE4,0x06,0x78,0xD2,0x9B,0xF0, +0xC7,0xD1,0x2F,0x7E,0x31,0x6D,0xD0,0x2D,0x94,0x07,0x7A,0x43,0x39,0xF2,0x21,0xA7,0x26,0x5E,0xF8,0x6D, +0xB2,0xE0,0xF5,0x2B,0x03,0x6D,0x71,0x52,0xDF,0xD0,0xAE,0xB4,0x04,0x6C,0x01,0x12,0x60,0xD1,0x75,0x33, +0x67,0x1F,0xE9,0xB3,0xF3,0x32,0xAE,0xB7,0x43,0x74,0x24,0x8B,0x03,0x21,0xAA,0x17,0x09,0x3F,0xA0,0xD9, +0x50,0x6B,0xA6,0xA6,0x4E,0x5F,0x61,0xAE,0xC8,0x60,0x3C,0x77,0x49,0xF7,0x47,0xB4,0xD6,0x08,0xB1,0x66, +0x88,0x3C,0x9D,0x3C,0x17,0xF4,0xA5,0xC7,0xC0,0xF6,0x8A,0x63,0xB0,0x78,0xB3,0xA7,0xEF,0x94,0x95,0x55, +0x37,0x0F,0xB9,0x56,0xC9,0xB4,0xD5,0x95,0x03,0x06,0xCA,0x18,0x20,0x92,0xCF,0x65,0x3A,0xCA,0x7A,0xC8, +0x6A,0x8A,0xEE,0x2A,0x10,0xF3,0x2A,0x5A,0x21,0x62,0xAA,0xBA,0x42,0xB9,0x06,0x3E,0x3F,0x76,0x3E,0x3F, +0x3A,0xF2,0xA5,0xF4,0x21,0x1C,0x07,0xCF,0xB0,0x41,0xB7,0xC9,0x5B,0xBF,0x77,0xAB,0xD2,0xD9,0x2B,0xBF, +0xCE,0xD4,0x3F,0x9F,0xB3,0xDB,0x37,0xBE,0x92,0xFB,0x7F,0x8A,0xDE,0xB9,0x32,0xCF,0x0A,0xDD,0xDE,0x21, +0x30,0xDE,0x36,0xEA,0x22,0xDE,0x41,0x4E,0x78,0x84,0xFE,0xDE,0x0D,0xBE,0xF6,0xD2,0xF7,0xCC,0xFA,0x5F, +0x41,0xDF,0x96,0x9C,0x88,0xBF,0xF7,0xEF,0x8A,0xDF,0x23,0x1F,0xB6,0x87,0xB3,0x4E,0xEE,0x35,0x2B,0x2D, +0x5F,0x01,0xEB,0x7E,0x81,0xFC,0xF8,0xCC,0xCF,0x6E,0x7F,0xEE,0xED,0xBD,0x39,0x22,0xDB,0xFF,0x5E,0x29, +0xFF,0x06,0x44,0x62,0x50,0x6F,0x3E,0x59,0xE3,0x5B,0x00,0x57,0x60,0xC1,0xD5,0x39,0xE0,0xBE,0x1D,0x96, +0x91,0x9A,0xDD,0x56,0x01,0x0E,0xB8,0xB6,0xD1,0xDA,0x2F,0x52,0x21,0xFD,0x2D,0x97,0xD0,0x2A,0x82,0x47, +0x3F,0x59,0xCC,0xDA,0xD6,0xDB,0xC9,0xD4,0x13,0xF7,0xB1,0xC5,0xB3,0xDC,0xF5,0xAE,0xC2,0x03,0xA1,0x11, +0xAE,0x23,0x16,0xC4,0x18,0xD4,0xA0,0x12,0xB0,0x29,0x52,0x82,0xAB,0xE7,0x5E,0x97,0xD6,0xE9,0x88,0xB9, +0xB0,0xD1,0x64,0xC6,0x5B,0x2F,0x99,0x8E,0x45,0x77,0xE0,0x8B,0xD1,0xA9,0x81,0xC8,0x8E,0xB9,0xC3,0xA7, +0x7B,0xA5,0x91,0xE9,0x2B,0x04,0x83,0x33,0x39,0x02,0x18,0x4E,0xB9,0x45,0x48,0x6A,0xF1,0x87,0xDD,0x8A, +0x4C,0xB1,0xF0,0x17,0x24,0x9A,0x13,0x8A,0xC1,0x04,0x75,0x8C,0x12,0x33,0x06,0x6C,0xA9,0x07,0x52,0xD4, +0x3C,0x93,0x55,0x99,0x0F,0x63,0xD3,0x9B,0xBC,0x20,0x0F,0x26,0x79,0xC4,0x0A,0x4E,0xDB,0xA5,0x3B,0xF6, +0xB7,0x3B,0x25,0x7B,0xBB,0x8A,0xD3,0x40,0x87,0xBE,0x13,0xA9,0xAB,0x1A,0x6A,0x06,0xE5,0xA6,0x0D,0xF5, +0x97,0x66,0xE4,0xD1,0xC7,0x06,0x2C,0xDF,0x75,0x64,0x83,0xB6,0x0C,0x1E,0x90,0xC8,0x04,0x13,0x69,0xF6, +0x4B,0xCC,0x3E,0xF2,0x5B,0x4D,0x0B,0xB6,0xF0,0x4F,0x9C,0x7D,0xA6,0x2B,0x85,0x78,0xD6,0xB0,0x1A,0xF4, +0xAE,0x2F,0xF8,0x3A,0xE0,0x4C,0xFD,0xFC,0x39,0x8E,0x8C,0x68,0x4A,0x0E,0x6C,0xE9,0xC0,0xBE,0x16,0xB3, +0x5F,0x5C,0x61,0x62,0x3A,0x41,0xF6,0x0A,0xA1,0x0D,0x9E,0x1C,0xDD,0x5D,0x3A,0xA9,0xAD,0xE6,0xDD,0x73, +0xB2,0x9C,0x6C,0xBD,0xA0,0xFF,0x73,0x26,0xE5,0x01,0x32,0xBC,0x2F,0x73,0xD5,0x11,0x94,0x3A,0x24,0xC1, +0x0D,0x58,0x43,0xB5,0xF1,0x31,0x4D,0x85,0x7C,0x23,0x9A,0xE7,0x93,0x00,0x83,0x23,0x29,0xFE,0xAD,0x3B, +0xF1,0xF2,0x47,0x2C,0x2E,0xB5,0xCF,0x11,0xD2,0xB4,0x5F,0x33,0x28,0x5F,0x42,0xB5,0x2D,0x90,0x7A,0x71, +0x24,0x26,0x97,0xFB,0x34,0x46,0x5C,0x31,0x8B,0xB7,0x50,0x9B,0x53,0x14,0x53,0x30,0x27,0x88,0x0C,0x5D, +0x91,0xCA,0xB0,0x92,0x23,0x5A,0x99,0x7C,0xFE,0x37,0xC6,0x45,0xBC,0xB1,0x97,0x47,0x77,0xD8,0x0D,0x68, +0x60,0x9A,0x0A,0xE4,0xD6,0x34,0xD6,0x31,0xA7,0x62,0x61,0xAE,0x6D,0xAA,0x65,0x0E,0x01,0x77,0x9C,0xE0, +0xF0,0x17,0x13,0xC8,0x14,0x5A,0x21,0xB9,0xBA,0x94,0x2E,0xD9,0x04,0x51,0x4D,0xFA,0x07,0x80,0x30,0xB0, +0xA4,0xBF,0x96,0x89,0xD0,0xD8,0x1A,0x5E,0x80,0xB8,0x5E,0x51,0x18,0xA2,0x9F,0x24,0x43,0xFB,0xAF,0xEF, +0xD1,0xDB,0x14,0x41,0xE6,0xD1,0x4A,0xBC,0x83,0x85,0x99,0x59,0xC9,0x1D,0xF7,0xEF,0x8A,0xDB,0x67,0xCB, +0xDA,0xBB,0x35,0x40,0xE8,0x00,0x94,0xBB,0x4C,0x65,0x25,0x0C,0x36,0xC7,0x50,0x6A,0xAF,0xD4,0x09,0xED, +0x5E,0x7A,0xF9,0x71,0x2D,0xAF,0x41,0xBE,0xC4,0x3B,0xDE,0xC8,0xE9,0x91,0x32,0x6E,0x73,0x75,0x5F,0xF1, +0x5E,0x0D,0xC3,0xE9,0x38,0xF2,0x77,0xD8,0x17,0xD9,0x7D,0x2A,0x5B,0x81,0xCB,0x4A,0x95,0xC2,0x65,0x61, +0x1A,0xC6,0x76,0xFB,0xB9,0xF2,0x5D,0x82,0x74,0xF9,0xB6,0xF0,0x25,0xE0,0xE2,0xE0,0x94,0xA2,0x28,0x2A, +0xC6,0x6C,0x70,0xAB,0x11,0x8E,0x06,0x41,0xA4,0x2A,0x68,0xBF,0x9D,0xA0,0x29,0xCD,0xB8,0xAF,0x5F,0xB4, +0xCC,0x90,0x07,0x36,0xB4,0x84,0x9B,0xEF,0x9A,0xED,0x9D,0x41,0x49,0x64,0xD1,0x6C,0xA4,0xEF,0x51,0x0E, +0x65,0x7C,0x97,0x12,0x93,0x90,0x5B,0x37,0xC4,0xF3,0x81,0xA9,0xD4,0x63,0xC7,0xEF,0xEF,0x27,0x82,0x43, +0x15,0x64,0xB1,0x66,0xE7,0x1B,0x74,0x9D,0x50,0xDF,0x29,0x2C,0x01,0xD7,0xE0,0x47,0xF6,0xA3,0xF8,0x08, +0x32,0xCE,0x38,0xFA,0xE9,0x8B,0xA1,0xCA,0xD2,0xC4,0x55,0x25,0x54,0xC6,0xC5,0x01,0xBF,0xCD,0x88,0xE3, +0xCC,0xCB,0x91,0xD7,0x9D,0xE7,0x43,0x85,0x34,0xE6,0xF9,0x5C,0xA9,0x6A,0x44,0xE8,0x62,0x31,0x42,0x59, +0xCD,0x85,0x01,0x8A,0x51,0xF7,0x8D,0xB8,0xBB,0xC2,0x6D,0x2F,0xDC,0xA8,0x3C,0x64,0xE6,0xD8,0x55,0x6D, +0x25,0xC7,0xC2,0xB8,0x84,0xA5,0x7A,0xB2,0x68,0x87,0xB4,0xF4,0x8A,0x01,0xC3,0x5C,0x66,0xA7,0x31,0x59, +0xFF,0xA8,0x6C,0x2F,0x00,0x29,0x72,0x8A,0x28,0x74,0x4C,0x5F,0x91,0xE9,0x05,0x13,0x6E,0x60,0xDB,0x71, +0xAD,0xE6,0x1D,0x8D,0xD0,0x11,0x82,0x18,0x43,0xA1,0xA4,0x07,0x6F,0xA5,0xFA,0x6B,0x21,0xCC,0x6E,0x58, +0x0B,0x76,0xD2,0x23,0x3C,0xFF,0xBA,0xE3,0x43,0x6B,0xC2,0x0E,0x5B,0xE6,0x80,0x0B,0xCE,0x75,0x1C,0xCD, +0x5B,0x26,0xC0,0xC7,0x32,0xBD,0x63,0xED,0x1B,0x80,0x6B,0x14,0x72,0xF3,0x2B,0xD3,0xAA,0xED,0x2E,0x05, +0x05,0xDC,0x39,0x80,0xD9,0xD6,0x0A,0xFB,0x85,0x10,0x5C,0x6E,0xF8,0x7D,0xCC,0x4A,0x1C,0x9D,0xB2,0x5F, +0x8B,0xB2,0xED,0x16,0x1F,0xB5,0x14,0x69,0x06,0x51,0x5A,0x9B,0x66,0x91,0xEE,0x45,0x1F,0xF7,0x5D,0x11, +0xAC,0x9A,0xBD,0x8E,0x87,0x74,0x23,0x8A,0x1B,0xBE,0x68,0xD7,0x15,0x5D,0x3D,0xE0,0xA9,0xD1,0x15,0xAA, +0x12,0xB5,0xE2,0x4C,0x0C,0x82,0x17,0x80,0x54,0x71,0x02,0x6E,0x27,0x46,0xBC,0x53,0x30,0xE6,0xA2,0x50, +0x6E,0x86,0x74,0xA6,0x7A,0x0F,0xDB,0xB0,0xD8,0x13,0x2C,0x5B,0x55,0xB3,0x7E,0x10,0xC6,0x2A,0x4B,0x94, +0xF8,0x73,0xC0,0x77,0x24,0x5A,0x7C,0x43,0xC4,0x43,0x15,0xB5,0x4C,0xDB,0xF1,0xC3,0x74,0x3A,0x6B,0x13, +0xFF,0x1C,0x47,0x00,0xB1,0x85,0x0F,0xF2,0xAF,0xD1,0x7F,0x37,0xAF,0x92,0x73,0x94,0x2A,0x70,0x88,0x74, +0x9D,0x47,0xDA,0x35,0x6D,0xD0,0x49,0xDD,0x16,0x94,0x14,0x72,0x33,0xD6,0x49,0xDE,0x75,0x34,0xBC,0xAA, +0xCA,0x54,0x7B,0x3A,0x6B,0xB6,0xDE,0x0F,0x9B,0x71,0xFE,0x9A,0x19,0xD6,0x6E,0x2E,0x49,0xD1,0x50,0xEF, +0xF8,0xD3,0x0F,0x8A,0x4C,0x9D,0x57,0x1B,0x8A,0x50,0x66,0xAE,0x4A,0xC0,0x7F,0x37,0x08,0x56,0x6F,0xF7, +0xC5,0xD8,0x96,0x4A,0x20,0xF8,0xDC,0x56,0xEE,0x3C,0xCE,0x11,0xBC,0x5C,0xCA,0xA9,0x45,0x92,0x7E,0x5C, +0xFA,0x48,0x1E,0xAC,0xD7,0x70,0x9C,0xFB,0x7C,0x9D,0x5D,0x7B,0x6B,0x31,0xEF,0xCA,0xC1,0x9E,0xC8,0x59, +0xEA,0x1E,0xBF,0xFB,0x03,0x92,0x0F,0x8D,0x53,0x92,0xD7,0xBF,0xD9,0x3E,0x29,0x19,0x73,0x3C,0x20,0xFE, +0xDB,0xF9,0xAA,0x59,0x06,0x52,0x3D,0x39,0xEF,0xBD,0xFE,0xA4,0x5A,0x47,0x3D,0x3A,0xF1,0xE0,0xEB,0xD0, +0x4F,0x07,0x1F,0xE7,0x95,0xAA,0xFF,0x43,0x48,0x97,0x07,0x0A,0x24,0xD4,0x6E,0xC6,0x5E,0x9F,0x52,0xFB, +0xF3,0x20,0xEE,0xE6,0x29,0x0A,0xE9,0x26,0x4B,0x97,0xA3,0xB3,0x20,0x84,0x7C,0xA9,0x7A,0x47,0x11,0x34, +0xBE,0x63,0x86,0x0F,0xA0,0x78,0x22,0x22,0xDC,0x02,0x13,0xB7,0x9E,0x29,0xD0,0x1A,0x37,0x4F,0x7B,0x23, +0x5C,0xB8,0x40,0xC1,0xF6,0x0A,0xEE,0xED,0x97,0x81,0x0D,0x72,0x07,0x09,0x34,0x07,0x69,0x93,0xEC,0xC6, +0x23,0xD0,0x3A,0x62,0x33,0xD9,0xD3,0x7B,0xF0,0xF2,0x15,0xAF,0x69,0x99,0xFD,0x2E,0x20,0x03,0x9A,0x52, +0x95,0x8F,0x18,0x37,0xE3,0x2B,0xE7,0xDD,0x05,0x6F,0x86,0x8D,0x8A,0xC4,0xBA,0xF3,0x1E,0xC2,0x82,0xAA, +0x8D,0xC0,0x97,0xA8,0x4A,0x19,0xCA,0x90,0xFC,0x67,0xB2,0x6D,0x78,0x22,0x5B,0x46,0xCB,0x85,0xBD,0x45, +0x89,0xF0,0x4B,0x8D,0x92,0xBA,0x37,0x8F,0x05,0xFE,0xD3,0xA0,0x90,0x08,0x34,0x50,0x0C,0xB3,0x34,0x86, +0x78,0xDD,0xDB,0x6E,0xB4,0x22,0x32,0xBD,0xD3,0xFB,0x5B,0xDC,0x4F,0x9E,0xC1,0xCA,0x97,0x8A,0xAB,0xB3, +0xEF,0xBA,0xC2,0x1A,0xA1,0x8F,0x52,0xAA,0x22,0x6F,0x2A,0x17,0x85,0x00,0xEC,0xF0,0x97,0x6F,0xEF,0x89, +0x75,0x4F,0x82,0x1E,0x9A,0x0F,0x7B,0x79,0x8A,0x01,0x38,0x5E,0xA4,0x6A,0x2D,0xDC,0xA1,0x1D,0xC4,0x49, +0x58,0x6A,0x19,0x58,0x28,0x63,0xC5,0x97,0x70,0x1C,0x05,0xC1,0x3B,0xE4,0x91,0x68,0xFB,0x62,0x8C,0xF2, +0xDF,0x16,0xDB,0x85,0xCC,0xF9,0x8B,0x53,0x15,0xFF,0x33,0x41,0xA4,0x3B,0xB3,0xD7,0xF7,0x1B,0x21,0x8A, +0xD8,0xB8,0xC0,0x43,0x46,0xFE,0x5C,0x55,0xE7,0x84,0xAF,0x23,0x01,0xCD,0x45,0xE0,0xD1,0x34,0x0A,0x52, +0x91,0xFD,0xB2,0x44,0x20,0x79,0x59,0x15,0xBF,0x2C,0xF5,0x17,0x2C,0xC7,0x41,0x42,0xC2,0xFC,0x41,0x8B, +0xD6,0x31,0x24,0x22,0x83,0x94,0xE4,0x5E,0x34,0x9C,0x05,0xDF,0x58,0x16,0xBC,0xFA,0xB4,0x80,0x15,0xDE, +0x86,0xBA,0xF4,0x2F,0xC2,0x59,0xF2,0x8E,0xC0,0x30,0x82,0x66,0x77,0xA9,0x3D,0xE5,0x27,0xA7,0x22,0xA7, +0x41,0x53,0x5B,0x10,0xE4,0xFE,0x33,0x97,0x19,0xD0,0x1B,0x21,0x5C,0x58,0x09,0x2B,0x4A,0x55,0xE2,0x13, +0xAB,0xD4,0xE6,0xAB,0x2E,0xCA,0xC6,0x00,0x93,0xA7,0xBE,0x9C,0x9B,0x3C,0x8F,0x5B,0x55,0x5E,0x50,0x71, +0xFA,0x04,0x0F,0xFE,0x2F,0x8B,0x89,0x1E,0xA4,0xCD,0x66,0x3A,0xF4,0x8D,0x21,0x5E,0x4A,0x23,0x5E,0x28, +0x0D,0x45,0x63,0xFE,0x91,0x33,0xBA,0xB7,0x01,0x33,0x73,0xD3,0x5B,0x1F,0x71,0xD9,0xE3,0xA6,0xF7,0x70, +0x46,0xB6,0x27,0x7E,0x23,0xD2,0x27,0x0F,0xF1,0x58,0x78,0x79,0xA7,0xBA,0x39,0x8B,0xD3,0xDF,0x76,0x32, +0x92,0xFF,0x79,0xF2,0xAC,0x88,0x2E,0x97,0x4C,0x10,0x86,0xD8,0xBC,0x8C,0x9E,0x19,0x92,0xD0,0xBD,0xF8, +0xAE,0x20,0x59,0x89,0xA2,0x5F,0x20,0xBE,0xDC,0xE8,0xE0,0x50,0x1E,0xCD,0x30,0x1E,0x20,0xD5,0x3D,0xF7, +0xDB,0x7A,0x63,0xA6,0x71,0xDC,0x21,0x49,0xD8,0x4B,0x74,0xA2,0x46,0x83,0x28,0x07,0x7B,0xA0,0xA7,0xE4, +0xFD,0x69,0xF0,0xAB,0x48,0xAE,0x2F,0x18,0x21,0xA2,0xE8,0x9B,0x2C,0xC3,0x55,0xEF,0xEA,0xE3,0xBC,0xCF, +0x4D,0x80,0x47,0x48,0x37,0xC1,0xB1,0x87,0x92,0xAA,0xDB,0x17,0x6B,0x2F,0xD6,0x59,0x12,0xC8,0x77,0xFA, +0x35,0x13,0x6C,0x16,0x08,0x75,0x35,0x67,0x7C,0x0A,0xE6,0x33,0xE1,0xC5,0xD9,0x78,0x5F,0xEC,0x5E,0x2F, +0xC4,0x89,0x5B,0xDC,0xFD,0xB7,0x27,0xE2,0xB2,0x97,0xB6,0x46,0x00,0xA6,0x60,0x47,0x85,0xF9,0xD2,0xC5, +0x2D,0x0A,0xB8,0x86,0xB2,0x48,0xF9,0x10,0xA8,0x8B,0x5F,0x2F,0x44,0x76,0xB1,0x30,0x8A,0xCA,0xC6,0xCE, +0x3E,0x65,0xA8,0xD5,0x73,0x39,0x09,0xA3,0x78,0x88,0xBC,0x25,0x5D,0xB4,0x07,0xC3,0x2E,0x0E,0xA0,0xC0, +0x72,0x11,0x19,0x94,0x0F,0xE8,0xE0,0xF1,0xF5,0x21,0x98,0x04,0xED,0x57,0x06,0x51,0xFF,0x1D,0x80,0xCD, +0xAC,0x26,0xCA,0x51,0xC9,0x04,0x67,0xD0,0x69,0x8B,0xE6,0x04,0x7E,0xF2,0xFC,0x0A,0xA8,0x8C,0x0F,0x90, +0x9F,0x5A,0x87,0x49,0x37,0x88,0x6F,0x11,0xFB,0x5F,0x27,0x3C,0x2C,0x24,0xB1,0xFD,0x7C,0xD4,0xE2,0x34, +0x2C,0x64,0xBE,0xBB,0xCF,0x9A,0xF2,0x39,0x3B,0x00,0x9C,0xE6,0xF7,0x9F,0x60,0x94,0xB1,0x61,0xB3,0x08, +0x88,0xE4,0x54,0x37,0xCE,0x07,0xD4,0xF6,0x75,0x6E,0x3F,0xFE,0x06,0x21,0x56,0x5A,0xD0,0xEF,0x1A,0x9B, +0x2D,0x92,0xF5,0xFA,0x75,0x4D,0x21,0x2C,0x10,0xC4,0xF7,0x4B,0x51,0xAF,0xEC,0x13,0x0D,0xF3,0x95,0xEB, +0xD7,0x2C,0xBB,0x2F,0xAD,0x1A,0x4C,0x7E,0x52,0xE3,0xC1,0x79,0xD5,0xC6,0xDB,0x7B,0xCB,0xF2,0x3C,0xA6, +0xCC,0x34,0x18,0xC4,0xB6,0xF4,0xA4,0xE8,0xEF,0xB9,0xEE,0x69,0xDC,0xF8,0x5C,0xFD,0xB9,0xDC,0xDE,0xB6, +0x76,0x31,0x5E,0xC4,0x5D,0x34,0x39,0xF7,0x5D,0x7B,0x81,0xD0,0xCD,0xDD,0xD5,0xE8,0x7A,0xFF,0x65,0x8A, +0x75,0xBB,0x01,0x08,0xB6,0x43,0xC0,0x74,0x2F,0x9A,0x87,0x55,0x59,0x78,0x5C,0x70,0x6D,0x75,0x9A,0x6F, +0xC7,0x12,0xCE,0xD2,0x91,0x2B,0x57,0xD0,0xAA,0x11,0xFC,0xF5,0x86,0x12,0xCB,0xA0,0xC8,0xDB,0x34,0x3A, +0x8E,0x56,0x7C,0xB0,0xE5,0x51,0xD1,0xA1,0x44,0x3C,0x37,0x34,0x84,0xAD,0x4B,0x53,0x6B,0x20,0x8B,0xD4, +0x9D,0x73,0xDC,0x4A,0x25,0xEB,0xD3,0x7E,0x69,0x3C,0x6F,0xF7,0x18,0x5A,0xF4,0xED,0x3F,0xCF,0x01,0xCE, +0xAC,0x78,0xC6,0xC1,0xE0,0x15,0x7E,0xCF,0xEE,0xA4,0x96,0x4C,0x4F,0x63,0xA6,0x98,0x21,0x69,0x94,0x65, +0x42,0x99,0x3E,0x81,0x08,0x42,0xFF,0xD8,0x1F,0x06,0x1D,0x78,0xA5,0x35,0x3F,0x6D,0x83,0x9A,0x94,0xC9, +0x13,0x01,0x0F,0x9F,0x7C,0x05,0x0F,0xC8,0x2F,0x57,0x6F,0xFA,0xDC,0xBD,0x3F,0x3F,0xA7,0x4C,0x44,0x78, +0x7F,0x87,0x3D,0xA8,0xD9,0xF9,0xC6,0x24,0x57,0xAF,0xA2,0x14,0x93,0x7D,0xD1,0x1F,0xE2,0x9C,0xB7,0xB8, +0xDC,0xF8,0xE0,0x41,0x9E,0x62,0x85,0x89,0x15,0x2C,0x81,0x03,0x7F,0xF3,0x5F,0x34,0x2C,0xE2,0x86,0x8F, +0xEC,0xFC,0x4F,0x14,0x1B,0xBD,0x1F,0x65,0xDC,0x28,0x57,0x20,0xD2,0x94,0x5B,0xBD,0x8C,0xDF,0x01,0xFD, +0x06,0x4C,0x97,0x79,0x03,0xBE,0x59,0xAD,0x73,0x00,0xD2,0xEE,0xF5,0x9F,0xD0,0xB9,0x18,0x61,0x8E,0x64, +0x54,0x48,0xD1,0xA5,0x3A,0xB0,0xD2,0xB9,0x6D,0x3E,0x78,0x66,0xAD,0x4C,0x0E,0xC7,0xD5,0xEC,0x5E,0x01, +0xBF,0xFD,0x6D,0x9B,0x91,0xD2,0x05,0x53,0x2B,0xC1,0xF8,0xD5,0x56,0xC3,0xD2,0x11,0xFE,0x83,0x23,0x6E, +0x54,0xA8,0x66,0x42,0xA3,0x2F,0xCB,0x1B,0x3A,0x07,0x08,0x44,0x0B,0x08,0x47,0xBB,0x02,0x69,0xD2,0x13, +0x23,0xED,0x10,0xA9,0x81,0x26,0x28,0x1F,0x4C,0x08,0xFA,0xAB,0xFA,0x2A,0x5A,0x8F,0xB6,0xC5,0x07,0x8A, +0x77,0x37,0x7F,0x69,0xA3,0xE4,0x3A,0x3A,0x46,0x29,0xCD,0x01,0xF8,0xBB,0x9A,0x09,0xD3,0x06,0xB2,0x76, +0x22,0x86,0xE3,0xBF,0xD0,0x28,0xFE,0x93,0x23,0xB8,0xF9,0x0E,0x32,0xC8,0xC2,0x99,0x0B,0x13,0x57,0x3D, +0x7A,0x37,0x75,0xE8,0x53,0xE5,0xAA,0xCC,0x5C,0x40,0xB2,0x06,0x63,0xA6,0xAA,0xCB,0x51,0xAA,0xDA,0xB1, +0x45,0xF6,0x00,0xDE,0xB9,0x96,0x94,0x6F,0x7F,0x1A,0x29,0x73,0x5D,0xDA,0x41,0xAD,0xD2,0x9A,0xF9,0x5E, +0xB4,0xCE,0xD9,0x07,0xE7,0xA4,0xB5,0xAD,0x7B,0xAB,0xB7,0xAA,0xAF,0xD6,0xFB,0x72,0x96,0xC6,0xC5,0xBB, +0x8E,0x87,0xEB,0x33,0xDB,0xA6,0x0B,0x98,0xEF,0xF3,0x43,0x9F,0x66,0xC3,0x72,0x1F,0xD5,0x07,0x93,0x6E, +0xBE,0xD2,0x38,0x78,0x4A,0xED,0xCD,0x8F,0x2B,0x38,0xB6,0xCD,0xA1,0xF5,0x44,0x05,0x71,0xCF,0xFF,0x16, +0x10,0xC3,0x44,0x9E,0xAE,0xC1,0xCB,0x18,0x0A,0xA2,0x27,0xCE,0xF7,0x25,0x02,0xA5,0xA8,0x6F,0xCE,0x13, +0x54,0x19,0x5C,0xC5,0xC1,0xBF,0x41,0xD2,0xB0,0x71,0x46,0x24,0x72,0x0F,0x6F,0xDB,0xFD,0xA6,0xA6,0xA7, +0x80,0xBE,0xF5,0x65,0x92,0x71,0x27,0x23,0x5B,0x5B,0xA2,0xC0,0x33,0xD8,0xD0,0x72,0xD2,0x14,0xDF,0x28, +0xD8,0xB1,0x6A,0xE6,0x2A,0x01,0xDD,0xA1,0xF9,0x7E,0x5A,0x62,0xD7,0x08,0x32,0x11,0xAB,0x2A,0x18,0xAB, +0xDB,0xE7,0x8C,0xD5,0xBF,0x75,0x3C,0xD3,0x12,0x3D,0x04,0x0C,0x9C,0xC0,0x52,0xC8,0xE0,0x28,0x43,0xD9, +0x99,0x85,0xDA,0xB5,0xEB,0xF4,0x33,0xA7,0x03,0xB7,0x44,0xF4,0x4B,0x40,0x4F,0x8F,0x19,0xC4,0x63,0xE9, +0x87,0xB2,0xD0,0x2D,0x1E,0x7B,0x1C,0x83,0xA2,0x59,0xEB,0xD9,0x84,0xD9,0x57,0x22,0x82,0x11,0xB2,0x38, +0xBB,0x75,0x3D,0xBE,0xAC,0x5A,0xA3,0xCC,0x02,0xD4,0xA4,0xEE,0x08,0xF5,0x46,0x04,0xCD,0x7A,0xC7,0xDB, +0x0A,0xD8,0x3B,0x79,0xD9,0xA7,0x4D,0x28,0xD2,0x90,0x64,0xEA,0x3F,0x0B,0xF9,0xC2,0xBF,0x51,0xE0,0xBA, +0x1A,0x0E,0x87,0xA8,0x80,0x58,0xC4,0x34,0xBE,0x48,0x69,0x10,0x67,0xE7,0x23,0xCF,0x98,0x58,0xBE,0xF9, +0xE5,0xA6,0x2A,0x19,0xAB,0xE6,0x9A,0xE7,0x18,0x87,0x5F,0x5C,0x86,0x76,0xEB,0x19,0x8B,0x07,0x8F,0x6B, +0xA7,0xC1,0x54,0x0A,0x42,0x49,0xC5,0x1F,0x0A,0x2C,0x69,0x3E,0x2D,0xF6,0xDB,0x1B,0xF9,0x5D,0xCE,0x10, +0xB1,0x10,0x6D,0xC0,0x83,0xCC,0x1E,0x2F,0x4B,0x05,0x6A,0x8A,0x07,0x98,0x51,0xDC,0xC2,0xC5,0xF7,0xBA, +0x06,0x8F,0xFE,0x5D,0x9F,0x52,0xC7,0xD8,0xC4,0xE0,0xA0,0x11,0x4F,0x12,0xEC,0xC5,0xC8,0x1F,0x71,0x0A, +0xA1,0x5F,0x0B,0x74,0xFF,0x23,0x56,0x93,0x47,0xF0,0xC8,0xC4,0xF8,0x1D,0x7D,0xE1,0x33,0xC3,0xD1,0x60, +0xEA,0xAA,0x06,0x82,0x05,0x6E,0x86,0x1E,0xD8,0x47,0x20,0x65,0x7B,0x56,0xFB,0xAA,0xFC,0x21,0x12,0x92, +0x1C,0x01,0xC9,0x55,0x3F,0xF3,0x6A,0xA3,0x7E,0x0A,0x6F,0x93,0x83,0xEE,0xEC,0xF4,0x3C,0x65,0x23,0x77, +0xD1,0xCB,0xF6,0x22,0x14,0xE8,0xE6,0x39,0x9B,0x12,0x88,0x8A,0x75,0x89,0xB8,0xD6,0x50,0x9E,0x0E,0x26, +0xF8,0x83,0x78,0xBE,0xBB,0xE8,0x87,0x42,0xCD,0x6A,0xEE,0x5B,0xBC,0x94,0x01,0x0C,0x95,0x8B,0xE9,0x42, +0xE9,0x79,0x8A,0x8B,0x5A,0x0B,0x9A,0x05,0x3D,0x07,0xC4,0x86,0x26,0x01,0xEB,0xA6,0x34,0xB7,0xD9,0x01, +0xA5,0xDB,0xC3,0xC6,0xE3,0x48,0x93,0x6A,0x50,0x35,0x62,0x96,0x66,0xEA,0x63,0x50,0x86,0x2B,0xD8,0xAA, +0x77,0xFC,0x15,0x6A,0xB1,0x80,0xD1,0x16,0xB8,0x16,0x1D,0x92,0xA4,0x4A,0x92,0xBA,0x76,0xF2,0x39,0xA4, +0xAD,0xDA,0x66,0x59,0x8C,0xE7,0x3B,0x22,0x1C,0x29,0x8B,0x4F,0xD8,0xC2,0x2D,0x60,0xEC,0xDC,0x6B,0x87, +0x80,0xE9,0x39,0xC8,0xBF,0x66,0xC3,0xD7,0x05,0x26,0x62,0xCE,0x25,0x67,0xD0,0xB1,0x3A,0xB7,0x0C,0x6D, +0xBB,0xC3,0x63,0x00,0x1E,0xD3,0xEA,0x1B,0x8E,0xCF,0xB3,0x79,0xBA,0x52,0xDF,0x6E,0xAA,0xA1,0xC8,0x81, +0xAB,0xE2,0x5B,0x0C,0x50,0x84,0x80,0x29,0x75,0xBF,0xB3,0x86,0x83,0xD5,0xCD,0x5A,0x46,0xE1,0x37,0x51, +0xEC,0xAF,0x36,0xA0,0x7E,0x10,0x19,0x6A,0xCC,0xDD,0xC1,0x85,0x24,0x42,0x3E,0x2D,0x05,0xD0,0x64,0x1E, +0x29,0xF2,0x9B,0xD9,0xB9,0x7D,0x18,0x39,0x77,0xB0,0x5F,0x32,0x84,0xE1,0x92,0x26,0x54,0x31,0x3A,0x02, +0xE5,0x47,0xFE,0xC7,0x19,0xF8,0x31,0xA2,0xA2,0xE0,0x60,0x51,0xFC,0x31,0x67,0xB3,0x0F,0x01,0xB9,0xE5, +0x1D,0x5B,0x74,0x7F,0xA3,0xE1,0xF5,0x21,0x91,0x3E,0x07,0x40,0x87,0x26,0x7B,0x35,0x68,0xE9,0x3D,0x2A, +0x83,0x9D,0x74,0xB4,0x81,0xE9,0x8F,0xA5,0xB8,0xDE,0x34,0x6E,0x4A,0x00,0x0A,0xB7,0xD8,0xFB,0x6F,0x52, +0x28,0x2B,0x25,0x6D,0xC2,0x6A,0xEB,0xEC,0x07,0x28,0xA8,0x84,0x4F,0x1F,0x49,0x54,0x8E,0xBC,0xF1,0x1E, +0x19,0x97,0x62,0xF9,0x82,0x42,0x0F,0xD6,0xA6,0x57,0x2D,0x0F,0x82,0xBF,0xC6,0xB4,0x3D,0xDD,0xD5,0x95, +0x0A,0xFB,0xAD,0xCA,0x28,0xB9,0xC6,0xC1,0x7B,0xB7,0x64,0xD5,0xE1,0x5E,0x8E,0x9F,0x19,0x07,0x75,0x1E, +0x33,0x41,0x65,0x78,0xD6,0x58,0xEB,0x87,0xDE,0x14,0xEC,0xBE,0x7B,0xD2,0x33,0x89,0xB4,0x81,0xFE,0x80, +0x5B,0xA1,0x35,0x6B,0xC0,0x51,0xD7,0xE0,0xB3,0xF7,0x27,0x9F,0x85,0xBA,0x91,0xAA,0x30,0x1D,0xC4,0x4B, +0xD3,0x7A,0x61,0xDD,0x70,0x0D,0x58,0xAE,0x47,0xB5,0x62,0x33,0xC9,0xFD,0x77,0x02,0xDA,0x91,0xCE,0xD0, +0x4A,0x09,0xF6,0x49,0x06,0x42,0xFF,0x4E,0x88,0xE0,0xEE,0xDA,0x45,0x3E,0x57,0x80,0xEA,0x70,0x7F,0x87, +0x23,0x33,0x66,0xCD,0x4F,0x13,0x2F,0xEE,0x91,0x21,0x62,0xA0,0x03,0x82,0x83,0x49,0xEF,0x97,0x03,0x50, +0xBE,0x6F,0x26,0xD8,0x4A,0x55,0x82,0x15,0x7C,0xF2,0xFF,0xC2,0xA1,0xDF,0x44,0xD4,0x1C,0x23,0x28,0x70, +0x44,0x4F,0xEF,0xDE,0x56,0xA2,0x9F,0x0E,0x75,0xB5,0x8C,0x90,0x7A,0x73,0x48,0xB2,0x63,0x34,0x61,0xDF, +0xE2,0x21,0xC1,0x94,0xDF,0xF6,0xB9,0x11,0x12,0x6A,0x4B,0x20,0xC6,0xE9,0xFB,0x57,0xEF,0x66,0x1E,0x0B, +0xF1,0x42,0x36,0x47,0x9F,0x41,0x21,0x61,0x81,0x4C,0x02,0x69,0x2A,0xEE,0x3E,0xFC,0x12,0x49,0x00,0xCC, +0xEE,0x89,0xFB,0x0E,0x97,0x3F,0x1E,0x17,0x1D,0xC5,0x91,0x7F,0x27,0x03,0x68,0x27,0x9F,0xA6,0x8F,0xDE, +0x28,0xA6,0x78,0x06,0x31,0x50,0x3F,0xFC,0xBD,0x04,0x61,0x75,0x65,0x89,0x11,0x8D,0x7E,0x04,0xE9,0x55, +0xF2,0xC9,0xE4,0x42,0xE0,0xC1,0x36,0xA6,0x1F,0xAA,0xEC,0x80,0xF1,0x45,0x19,0x11,0x80,0xE6,0x62,0x4C, +0x79,0x85,0x46,0xDC,0x10,0x2B,0x2A,0x78,0x49,0x47,0xF0,0x2C,0xAB,0x04,0xCA,0xE9,0x25,0x0F,0x8C,0x98, +0x72,0x7B,0x7A,0x7C,0x85,0xC2,0xBA,0xD6,0xAC,0xE0,0x7B,0x8B,0x8D,0x33,0xBB,0x19,0x1A,0x62,0x2B,0xF9, +0x77,0x45,0x2C,0xB6,0x29,0xE3,0x83,0x1A,0x28,0x81,0xEB,0x59,0xDF,0x26,0x1F,0xDB,0x4B,0x48,0xBB,0xB7, +0xFD,0xC6,0x3A,0x6C,0xFF,0x43,0xBA,0x6B,0xB9,0x8C,0x0C,0xC1,0xF6,0xE7,0xDA,0x9F,0xDE,0xE1,0x38,0x26, +0xAC,0x1D,0x9C,0x4F,0x7D,0x22,0x08,0x0B,0x29,0x44,0xD3,0xF8,0x62,0x78,0x42,0x36,0x2D,0x15,0x91,0x4F, +0x0F,0x83,0x82,0xE9,0x02,0x8D,0x81,0x46,0xDC,0x27,0xF4,0xBF,0xAF,0xA4,0xF9,0xB2,0x2F,0x20,0x0A,0x0A, +0xFD,0xCE,0xE5,0xA9,0xDD,0x26,0x4E,0x7D,0x83,0x75,0xDD,0x64,0x95,0xC6,0x74,0xE4,0x64,0x5D,0x39,0xDB, +0xED,0x2C,0x6C,0xD0,0x27,0x1C,0xF4,0x1C,0x94,0xB8,0x94,0xA4,0xC0,0xDB,0xE4,0xB0,0x98,0xF2,0x3D,0x51, +0x57,0x1D,0x3E,0xF5,0x30,0x9D,0x5F,0x5A,0x43,0x54,0x2E,0xEB,0xD4,0xD9,0x47,0x7E,0x02,0x1E,0xAD,0x06, +0x12,0x72,0x62,0x53,0x63,0x1B,0xAF,0x85,0xF3,0xDC,0x99,0x0A,0x15,0x24,0xE2,0x70,0x91,0xB1,0xEF,0x51, +0x0C,0xFB,0x14,0x80,0x21,0xF5,0x15,0x6B,0x84,0x05,0xB4,0x64,0xC8,0x6A,0x4A,0x5C,0x88,0x06,0x8E,0xDF, +0x75,0x3C,0x7F,0x3A,0x86,0x9B,0xD7,0xC5,0x0D,0x9B,0x83,0x65,0xA7,0x27,0xF5,0x16,0x76,0xFB,0xB5,0xF5, +0x90,0xD5,0x92,0xBF,0xC0,0xB0,0xE6,0x40,0xD9,0xF8,0xD4,0x71,0xCA,0x62,0x4C,0x73,0x8B,0x7D,0xDF,0xF1, +0x9D,0xE7,0x97,0xCA,0x2B,0xE7,0x36,0xDF,0xDB,0xFB,0x36,0x48,0xF6,0x16,0xB0,0x41,0xE7,0xC6,0x26,0x68, +0x92,0x56,0xC0,0x5E,0x7D,0xD4,0x3F,0x59,0x56,0x15,0x86,0xEB,0x47,0x56,0x6F,0x2B,0xED,0x8A,0x22,0x5E, +0x74,0x3B,0x6F,0xD9,0xAF,0x16,0xB1,0x41,0x6F,0xE4,0x7F,0xFD,0xE1,0x19,0xCD,0x39,0xEB,0x8E,0xFE,0x37, +0xC3,0xD5,0x19,0x4C,0x4D,0x1B,0x03,0x79,0x08,0x58,0x0B,0xED,0x4D,0xD0,0x8E,0x89,0xAA,0xB0,0xD8,0x64, +0xD0,0xAE,0x00,0x50,0x69,0x5E,0xC7,0x78,0x3D,0x84,0xE0,0x2B,0x4A,0x5F,0x07,0x81,0xA6,0xC3,0x7D,0x18, +0x84,0x2B,0x8A,0x6F,0xFC,0x37,0xD5,0xE9,0x5C,0xB0,0x74,0x6C,0x85,0x90,0x1F,0x50,0x80,0xDC,0xA0,0x3A, +0x06,0xC9,0x5F,0xE0,0x86,0x83,0x5F,0xA6,0xB5,0x60,0x36,0x50,0xE7,0xC6,0xE6,0x17,0xF5,0x61,0x50,0x90, +0x00,0x88,0xF6,0x9A,0xE8,0xCD,0x68,0xAB,0xE6,0xC7,0xEA,0x18,0xBE,0x85,0x94,0x61,0xC7,0x75,0xC1,0x43, +0x8C,0xE0,0x61,0x8A,0x67,0xC4,0xC2,0xD4,0x50,0x6F,0x73,0x53,0x26,0xE6,0x6D,0xB7,0x34,0x63,0x69,0x3E, +0x66,0xC5,0x29,0xDF,0x11,0x2E,0x18,0x53,0xE6,0x05,0x0C,0xD4,0x16,0xF9,0x72,0x99,0xA7,0x67,0xF5,0x04, +0xA5,0x81,0x10,0xAC,0x23,0x28,0xA0,0x5F,0x11,0x4D,0x78,0x61,0x2D,0xFD,0x1B,0xB6,0x43,0x48,0x67,0xBC, +0x67,0x25,0xFB,0x45,0x54,0xC2,0x24,0x99,0xAD,0xDE,0xC9,0x20,0x08,0x7B,0xF3,0xA2,0x24,0xC7,0x73,0x49, +0xA9,0x53,0xCC,0xDB,0x73,0x24,0x33,0xF3,0xF2,0xD7,0x78,0x0F,0xAF,0x8E,0xC2,0x4A,0x44,0xEA,0x62,0x1F, +0xEF,0xCE,0x4D,0x69,0xB5,0x12,0x4A,0x5E,0x4A,0x86,0x90,0x81,0xE2,0x24,0x45,0xD8,0xCF,0xE1,0xA4,0xE2, +0xCF,0xA8,0xAB,0xC7,0x6D,0x85,0xFD,0x83,0xB8,0xC6,0x3F,0x45,0x6D,0x40,0x54,0xDF,0x5C,0xF5,0x4B,0x5F, +0x0D,0x86,0xC9,0x1F,0x6A,0xC7,0x06,0xBF,0xA6,0x2A,0x08,0x4A,0x21,0xF2,0x50,0x74,0xAD,0xCD,0xB1,0x4C, +0x6A,0xD7,0xC5,0xC6,0xBA,0xFF,0x49,0x8C,0xF2,0x11,0x97,0x14,0xFA,0xCC,0x64,0x2A,0xCB,0xDE,0x2C,0xFE, +0x0A,0x7C,0xC2,0x4E,0x7E,0x42,0x5B,0xB5,0x22,0x83,0xE3,0xA3,0x92,0xEC,0xB3,0xD6,0x78,0x63,0x8B,0x1C, +0x91,0x4F,0xB0,0xF4,0xF0,0x8D,0x4C,0xE7,0x76,0x0C,0x6D,0xD3,0x24,0xDC,0x5B,0x0D,0xBD,0xDA,0x6E,0x7C, +0x87,0xF5,0x34,0xF5,0x5E,0x11,0x6A,0x23,0xE6,0x98,0x8C,0x5C,0xD8,0xFD,0x14,0x42,0xDE,0x9E,0x78,0x68, +0x56,0xB3,0x5C,0xF6,0x7D,0x93,0x2C,0x5E,0xC3,0x5C,0x1D,0x53,0x1B,0x9D,0x9D,0x78,0x5D,0x31,0x33,0x27, +0x8F,0xF0,0xCA,0xE0,0x09,0x44,0x4D,0xD7,0xC5,0x1E,0x3A,0x64,0x31,0x38,0x63,0x32,0x67,0x9B,0x76,0x51, +0xE5,0x5E,0x32,0xB1,0x4F,0x16,0x31,0xF8,0x08,0x41,0x70,0x91,0x00,0x55,0x4F,0x75,0xD5,0xFC,0x32,0x30, +0x23,0x10,0xB7,0x64,0x48,0xB7,0x87,0xB5,0x8E,0x56,0x47,0xE9,0xD4,0xB7,0x1B,0x77,0x4F,0x5F,0xB6,0xE3, +0xCD,0xAB,0x71,0x1C,0x07,0xB5,0xF0,0x63,0xD3,0xEF,0xF8,0x28,0x4E,0x98,0x36,0xF8,0xB1,0xEF,0xBD,0xA2, +0x04,0xDD,0x3F,0xC0,0xBF,0x3D,0x5E,0xAD,0x8F,0x9E,0x13,0x32,0xD7,0xDC,0x31,0x2E,0x07,0xFA,0x79,0x48, +0x58,0x96,0x4E,0xDE,0x18,0x14,0xC8,0xFC,0x86,0xA6,0x86,0x38,0x68,0x3B,0xC7,0x4E,0xFD,0xEF,0x2F,0xAC, +0xEC,0x95,0x37,0xC1,0x09,0xD9,0xE8,0xDB,0xEA,0xE1,0x50,0xD1,0x9D,0xFE,0x57,0x19,0xA4,0xDF,0x14,0x3A, +0x77,0xB6,0x07,0x44,0x2C,0xB9,0x2F,0x57,0x30,0xB6,0xB7,0x30,0xC7,0x5F,0x63,0xEA,0xDF,0x13,0xE4,0xF9, +0x5C,0x98,0xC8,0x3A,0xF3,0x7A,0x48,0x38,0x3E,0x32,0xBE,0xCA,0x7B,0x36,0x2C,0xE9,0x05,0xD2,0xA0,0xDA, +0x4C,0x9F,0x41,0xBF,0x0D,0x1B,0x2D,0xDC,0xF9,0x54,0x51,0x5E,0x62,0x73,0x70,0x2F,0xFA,0xD3,0x62,0x84, +0x12,0x63,0xE7,0xEE,0xF0,0x10,0x4D,0x0A,0x4C,0x9F,0x3F,0x9B,0x9C,0xBE,0x3A,0xF3,0x26,0xAF,0x3B,0xE2, +0x00,0xDD,0x99,0x2D,0xA9,0x43,0x17,0xD7,0x51,0x6B,0x09,0xF6,0x76,0x54,0x5E,0x1D,0x9F,0x8E,0x60,0x17, +0xBC,0x4E,0x58,0xB9,0xA3,0x62,0xD5,0xE9,0x41,0x4D,0x79,0x21,0x6D,0x24,0xD1,0x70,0x68,0x9F,0x15,0xD4, +0xD1,0x72,0xD6,0xAB,0xBE,0x89,0x5E,0x6E,0x1F,0xFC,0x27,0x90,0x3A,0xD8,0xA1,0x25,0x2D,0xAA,0x93,0x64, +0x7D,0xFB,0x48,0x7A,0x1B,0x91,0x0E,0xF3,0x52,0xEB,0xE8,0x14,0x56,0x25,0x97,0xAF,0x27,0x6B,0x28,0x6B, +0x37,0x28,0xFC,0x6E,0x95,0xB1,0xCA,0xC6,0xB8,0x21,0xD1,0xBC,0x7D,0x47,0xC9,0xBF,0x11,0x28,0x33,0x5E, +0x46,0x93,0xC7,0x07,0xBA,0x6B,0x09,0x6E,0x8B,0x6B,0x36,0x6B,0xA3,0x87,0xBE,0x82,0x19,0xEC,0xE3,0xC5, +0x42,0xC8,0x7D,0x8C,0x37,0x81,0xBC,0xB1,0x79,0x7F,0x12,0xC5,0x2A,0xE3,0xB2,0x28,0xA4,0xC1,0x03,0x10, +0xAC,0xA6,0x90,0x33,0x38,0x59,0xC1,0x86,0x4F,0x42,0x30,0xEB,0x5F,0xFB,0x5A,0x5E,0x2D,0xA5,0x9B,0x8C, +0x71,0xD9,0x1F,0x85,0xB7,0x46,0x53,0xA0,0x9E,0x6C,0x06,0xF4,0x38,0x50,0xB5,0xA0,0xF8,0x5C,0xE6,0x7E, +0xFA,0xE7,0xB6,0x7D,0xD5,0x9E,0x6A,0x8A,0xDE,0xBF,0xD3,0xBC,0x1B,0xFD,0x31,0x6C,0x9E,0x89,0x76,0x48, +0x80,0xF1,0x69,0x5F,0xEA,0xA2,0xEE,0xAF,0x97,0x6C,0x04,0x4A,0x4F,0x01,0xFA,0xF6,0x7F,0x0F,0xE4,0xF5, +0x52,0x4A,0xBD,0x4B,0x7B,0xAD,0xF4,0x5E,0x21,0xEB,0xC9,0x6F,0x69,0xE5,0xA9,0xAA,0x45,0xA4,0x95,0xBF, +0xDB,0x82,0x3A,0x77,0x1B,0x3B,0x1F,0xAD,0xA5,0xEE,0x54,0x93,0x0A,0x1F,0x00,0x79,0xCF,0x71,0xCF,0x8E, +0x1F,0xC7,0xF7,0xE4,0x39,0xFD,0x3E,0xA0,0xC4,0xBE,0x89,0x13,0xDA,0xC2,0xDC,0x54,0x4D,0xA5,0x6B,0xB5, +0x7D,0x8A,0x37,0x70,0x03,0x52,0xBB,0x39,0x32,0xD1,0x22,0xD0,0x93,0x52,0x6A,0x21,0xAB,0x02,0xAD,0xE2, +0x02,0x90,0xED,0xC3,0xF6,0x3E,0x48,0xAF,0xD3,0xE7,0x62,0x91,0x18,0x80,0x63,0x31,0xBE,0x36,0xDE,0xC1, +0xD9,0x70,0xD4,0xDF,0xE6,0x81,0x2C,0xC0,0xF0,0x70,0x33,0xC3,0x59,0xD3,0xEC,0xAD,0x92,0xB9,0xBB,0x01, +0xB9,0x15,0x68,0x96,0x98,0x2E,0xAD,0x4B,0x80,0xC0,0xE6,0xC2,0x96,0x30,0xF1,0xFF,0x34,0xA2,0x0C,0x87, +0x19,0x4D,0x6B,0x6D,0x6D,0x9A,0x87,0xC8,0x31,0x34,0x03,0x6B,0xE7,0x83,0x4D,0x0B,0x52,0x08,0x74,0x7B, +0xA4,0x95,0x7D,0xAB,0x99,0xC7,0xC0,0xB2,0x0E,0x5B,0x8C,0x82,0x59,0xB8,0x5E,0x9A,0xF2,0x94,0x4E,0x0D, +0xCB,0xE4,0x07,0x2B,0x00,0xA6,0xC6,0x91,0xFB,0x7D,0x7F,0xAE,0x0B,0xBA,0xDC,0x8D,0xC3,0x9A,0x57,0x3C, +0x65,0xF7,0xA9,0x10,0x99,0x0D,0x71,0x39,0x40,0x18,0x4F,0x11,0xFA,0x79,0x21,0xCC,0x2B,0x5B,0x6F,0xDF, +0x38,0xF1,0x38,0x5B,0x41,0x9A,0x03,0x2E,0x09,0xCC,0xE4,0xF7,0x86,0xF7,0x6D,0x04,0x26,0x33,0xEA,0xC6, +0xFD,0xE9,0x5E,0xED,0x9A,0xBC,0xDE,0xBE,0xF9,0x09,0x66,0x06,0x6B,0x30,0xC7,0xF6,0x2E,0xCB,0x7F,0x33, +0xAA,0x73,0x61,0xED,0x81,0xDB,0x6A,0xE5,0x5D,0x3F,0xA8,0x28,0x71,0x5F,0x4A,0x2E,0x3F,0xB2,0x7C,0xF6, +0x33,0xF4,0xA0,0x82,0x93,0x72,0x52,0xFB,0x06,0x1B,0xB8,0x17,0xFD,0x53,0x88,0xB1,0x2E,0x6D,0x63,0x02, +0x2B,0x1F,0x5A,0x96,0x7B,0xD6,0x7B,0x14,0x0F,0x7C,0x70,0x27,0xAC,0x42,0x78,0xBA,0x17,0x1E,0x94,0xFE, +0x35,0x59,0xD3,0x29,0xD4,0x56,0x63,0xA7,0x8D,0x6A,0x21,0xDA,0x2B,0xA3,0x17,0x67,0xE5,0x5C,0xB3,0xB9, +0xB4,0x13,0xC1,0x3B,0x2C,0x60,0x79,0xBA,0xAD,0xE5,0x06,0x4A,0xED,0x02,0x76,0x74,0x76,0xA5,0x57,0x93, +0xDA,0xA4,0xF4,0x9D,0xB7,0x87,0x16,0xC9,0x6C,0x13,0xBA,0xC4,0xFC,0xC1,0x07,0x61,0xB9,0x8D,0xA2,0x6B, +0xF4,0xE3,0xC2,0xDD,0x5A,0x70,0x9F,0x41,0x7F,0xA9,0x99,0xE9,0xE4,0x10,0x8A,0x43,0x75,0x83,0xE9,0x6C, +0x03,0x52,0x79,0xA7,0xAB,0x76,0x5F,0xCD,0xCE,0x63,0xF5,0x09,0x76,0x6F,0x5C,0xAB,0x2E,0x8A,0x19,0x7E, +0xA0,0xA1,0xCA,0x59,0x66,0x69,0x18,0xFB,0xFD,0x49,0x14,0xBA,0x80,0x2F,0xB2,0x1B,0xEB,0xFC,0x6C,0x9E, +0xA6,0x8A,0x70,0x5C,0x73,0x36,0xB1,0xFA,0xAE,0xAA,0xA2,0x71,0xFD,0xDD,0xE7,0xD8,0xE2,0x47,0x8B,0xD0, +0x5E,0x26,0x35,0xDB,0xDF,0x26,0xA9,0x04,0xEB,0xAF,0x3D,0x9B,0x4D,0x1D,0x17,0x40,0x07,0x36,0xC6,0x54, +0xEA,0x78,0x9C,0x48,0xFF,0x2F,0x05,0x2A,0x86,0x5B,0x72,0x8C,0x7A,0x47,0x34,0x68,0x0B,0xC1,0xF8,0x5E, +0xE4,0x20,0x5C,0xC6,0x81,0x40,0xC8,0x5A,0xFE,0x52,0xD5,0xBA,0x66,0xCE,0x4E,0xBC,0x12,0xA3,0xA4,0x78, +0xB4,0x08,0x8B,0x7F,0x37,0x0F,0x0A,0x55,0x5F,0xFB,0xB9,0xFB,0x6C,0x12,0x05,0xE8,0xA4,0x49,0x40,0x99, +0x26,0xFF,0x88,0x11,0x4D,0x9A,0xE7,0x04,0x35,0x38,0x99,0xDD,0xF9,0x8F,0x33,0x55,0x75,0xFB,0x14,0x6D, +0xCC,0xD2,0xB4,0x82,0xDC,0x42,0x69,0x8C,0x57,0xD5,0x7C,0x3B,0x87,0xF2,0xE8,0xF0,0x8A,0x33,0x9B,0x3A, +0xD5,0xE5,0x0F,0x48,0x57,0x27,0x31,0x56,0xF5,0x52,0xF9,0x6D,0x58,0x12,0xB7,0xB8,0x96,0x10,0xBE,0x37, +0xAC,0x44,0x85,0xA7,0x09,0x5A,0x3A,0x58,0x22,0x40,0xB6,0x8D,0xDD,0xD0,0xD1,0x76,0xE1,0xC2,0xE2,0x84, +0x52,0xEF,0x5A,0xD6,0x4C,0x10,0x13,0xF2,0x96,0x39,0xF4,0xC3,0x99,0x7A,0x59,0x90,0xF8,0x03,0xD7,0xDC, +0x4A,0x3D,0xDD,0x39,0x1A,0xBB,0x25,0x7D,0x1D,0x7B,0xE9,0x81,0x09,0xED,0xED,0x95,0x35,0xC3,0xA7,0xCA, +0xDC,0xB8,0xF5,0x80,0xEE,0x74,0x6D,0xC6,0x56,0x76,0x1F,0x75,0xD9,0x1B,0x79,0x8F,0x3A,0x02,0x0C,0x41, +0xDF,0x2D,0x96,0xAA,0x80,0x31,0xD3,0x76,0x2D,0x22,0x71,0x61,0x19,0xBF,0xE8,0x80,0x0B,0x9B,0x14,0x6A, +0x7B,0x6B,0x55,0x75,0x45,0xB9,0x22,0x30,0xB4,0xDA,0x62,0x95,0xDE,0x6F,0x77,0x22,0xBA,0xFC,0x07,0x63, +0x5B,0xD9,0x8F,0x39,0x1C,0x31,0xF9,0x66,0xDE,0x2C,0x92,0xFF,0xF1,0x0E,0x45,0xC5,0xF6,0x37,0xF6,0xFC, +0x1A,0xC0,0x85,0x19,0x67,0x71,0x63,0x1D,0xFA,0x71,0x3E,0x44,0xD4,0x10,0x47,0xAC,0x84,0xA2,0x76,0x89, +0x11,0x7E,0xC6,0xCE,0x43,0x52,0xC2,0x5E,0x29,0x88,0x58,0x80,0x2B,0x63,0x7F,0x5A,0x14,0x71,0xA5,0xA4, +0xDA,0x5F,0x11,0x4D,0x44,0x79,0x7F,0x5D,0x76,0x68,0x0C,0x08,0x91,0x2A,0x5F,0x8D,0x9D,0xA3,0x90,0x82, +0x01,0xE7,0x07,0x20,0x92,0xEC,0xAA,0xB0,0x03,0x9F,0x3A,0x6C,0xF1,0x9F,0xAB,0x25,0xDD,0x10,0x8C,0x54, +0x43,0x27,0x59,0x0F,0xE0,0x9E,0x50,0x83,0xAC,0x68,0x5B,0x00,0x23,0x43,0xF5,0x67,0x1F,0xA4,0x4F,0xC3, +0xC4,0x00,0xEB,0x45,0x94,0x20,0x33,0xE2,0xF9,0xAE,0x23,0x45,0x97,0x31,0xAD,0x53,0x3E,0xE7,0x1A,0xB7, +0x14,0x5B,0xEC,0xD2,0x48,0x0C,0xF8,0x14,0x16,0x2B,0x8D,0x58,0x39,0xBB,0xA8,0xE6,0x53,0x86,0x18,0xC4, +0x72,0xA8,0xA8,0x14,0x55,0xA8,0x5F,0xC9,0xA2,0xEA,0xFC,0x16,0x12,0x45,0xC5,0xB1,0x8A,0x49,0xF9,0x15, +0x9A,0x29,0x91,0x8C,0xA3,0x45,0xD3,0x87,0x50,0x2E,0x10,0x96,0x41,0x87,0xB1,0xD7,0x92,0xA0,0x0B,0x99, +0x85,0x0A,0xA1,0xF7,0xD6,0x63,0x15,0x4F,0xC2,0xA1,0xB8,0x8E,0xDD,0xA2,0x03,0x2E,0x80,0xA9,0xAA,0xD3, +0xBB,0x61,0x53,0x12,0xEC,0xB6,0x0F,0x9E,0xDC,0xFA,0x22,0x05,0xA2,0x18,0x6D,0x3D,0x55,0x92,0x0B,0x0D, +0x20,0x2A,0x43,0x95,0x36,0x20,0xB7,0x4B,0x3B,0x2F,0x96,0xA9,0xDF,0x8D,0x50,0x19,0xB6,0x7A,0xB3,0xE2, +0x9F,0x40,0x20,0x85,0x22,0x7A,0x9F,0x19,0x5B,0xA7,0x0A,0x5C,0xE3,0x17,0x79,0xAE,0xB6,0xD1,0xAD,0x1B, +0x28,0x20,0xEA,0x3C,0xDA,0x63,0x74,0xB0,0x6B,0xB2,0xF2,0x0C,0x1F,0x22,0x97,0x88,0xB4,0x21,0x5E,0x9E, +0xD9,0x25,0x51,0xB2,0x0A,0x1E,0xBB,0xCF,0x93,0x6A,0xB4,0xA9,0xD7,0x0C,0xB3,0x29,0x9D,0xE5,0xB4,0x1E, +0x85,0x8F,0xF1,0xD9,0xF0,0x2C,0x39,0xE8,0xC8,0x8F,0x12,0x9F,0x59,0x27,0x91,0xF3,0x18,0x13,0xFD,0x00, +0x2A,0x1D,0x5A,0xC6,0x20,0x1F,0xF7,0x5E,0x76,0x4B,0x6A,0xBC,0xCA,0x40,0x4D,0xD2,0xBE,0x4C,0xD3,0xC3, +0x36,0xD8,0x5C,0x39,0xF5,0x79,0xBB,0xA5,0x2D,0x9F,0x45,0x09,0xF2,0x70,0xF9,0xD2,0x90,0xF4,0xEC,0x21, +0xEA,0x97,0x37,0x02,0x99,0xBC,0x6A,0xFB,0x67,0x3B,0x3D,0x5B,0x08,0x22,0x19,0x48,0xF9,0x32,0x0C,0x71, +0xCB,0x77,0xBC,0x46,0x33,0x76,0xF0,0x9F,0xC1,0xF4,0xB4,0xA0,0x03,0x7B,0x4E,0x3F,0x40,0x05,0xF4,0x84, +0x73,0x3A,0x22,0x40,0x50,0x97,0xA4,0x76,0x76,0x04,0x0F,0xC0,0x5D,0xEB,0xFD,0x15,0x49,0x39,0x07,0xE3, +0x27,0xDB,0xB5,0xA4,0x3C,0xF6,0x5B,0x61,0xA5,0x6D,0xAD,0x91,0xD3,0xBC,0xE5,0x0E,0x0A,0xD4,0x9F,0x17, +0xD7,0x19,0x13,0x4F,0xC1,0x49,0x02,0x71,0x30,0x79,0x0C,0xAA,0xFA,0x50,0xF6,0xFA,0x61,0x3A,0x14,0x9A, +0x9A,0xB4,0xCB,0x30,0x06,0xB9,0x38,0x80,0x36,0x42,0x5E,0x30,0x0A,0x73,0x61,0xB1,0x41,0x6B,0xE7,0xDB, +0xFF,0x78,0x92,0xBA,0xD4,0x80,0xD6,0xDF,0xCB,0x39,0x1A,0xE9,0x29,0x0D,0x4F,0x11,0x53,0x3D,0xBE,0xCA, +0x91,0x14,0x5F,0x39,0xE3,0x9F,0x6E,0xA7,0x89,0xB1,0xC2,0x2E,0xB8,0x34,0xFA,0x77,0x69,0x8C,0x96,0xD3, +0x72,0x10,0x4F,0x5C,0x34,0x11,0x7A,0x3E,0xB9,0x35,0x93,0x6A,0x80,0x39,0xDE,0xE7,0xB5,0xD6,0x15,0xF8, +0x99,0x9F,0x7B,0x2F,0x38,0x36,0x97,0x24,0x89,0x1C,0xFF,0x2F,0x91,0xB8,0xF2,0x3B,0x57,0x7C,0x3B,0xAF, +0x18,0x39,0xE0,0x1B,0xA3,0xDC,0xB9,0xF0,0x1A,0xD0,0x7E,0xBA,0x3C,0x2B,0x31,0xB9,0x1C,0xC0,0x69,0x39, +0xA1,0x3F,0xB9,0xA2,0x4E,0x50,0x9B,0x27,0x03,0x28,0x02,0xD1,0xB4,0xCF,0xA9,0xAD,0x26,0xC5,0x79,0x50, +0xD8,0x1C,0x76,0x07,0x78,0x93,0x7E,0x06,0xB0,0xA4,0xEA,0x23,0x4B,0x6F,0x71,0xAF,0x21,0xA0,0xF2,0x54, +0x6C,0xF2,0xCB,0x16,0x94,0x22,0x40,0x42,0xFD,0xD5,0xDE,0xC8,0x20,0x75,0x76,0x20,0x6E,0x89,0x80,0x02, +0x23,0x2F,0xCF,0xE6,0x59,0x42,0xE8,0x96,0x29,0xEB,0x52,0xE2,0x7A,0x2A,0x2C,0x34,0x56,0xE5,0x22,0x8D, +0xCA,0x43,0x98,0xD6,0xEB,0xE8,0x73,0xF1,0x6D,0xC2,0xE5,0xA5,0x14,0xAE,0x51,0xEA,0xC0,0xBC,0x45,0x97, +0x29,0xE9,0xCD,0xD7,0x95,0x4D,0x91,0x35,0xD6,0x27,0xEC,0xB3,0x85,0x3A,0xB3,0xC8,0x74,0xE1,0x38,0x08, +0xCE,0x8C,0xC2,0x58,0x8D,0xEA,0x3A,0x3A,0x7F,0x81,0x49,0xAA,0x46,0xB8,0x4C,0x22,0xE6,0x18,0xC4,0x7C, +0xEE,0xCC,0xAD,0x49,0x75,0x1A,0x7A,0xB7,0x74,0xAB,0x6B,0x06,0x01,0x07,0xE2,0x7D,0x1E,0x66,0x13,0x26, +0x25,0x9B,0x73,0xA6,0xD0,0x55,0x11,0x88,0xB1,0x24,0x93,0xE4,0x9B,0x90,0x6B,0x4C,0x85,0xD0,0x7E,0xAD, +0x26,0xB6,0xC5,0xEF,0xDA,0xCF,0x9A,0xCC,0x1F,0xEE,0x68,0x6F,0xB1,0x19,0x7A,0xAB,0xFF,0x64,0x50,0xA9, +0x6D,0x20,0x5E,0x3C,0x5E,0xAC,0x11,0x46,0xA4,0x89,0xFE,0x9C,0xDD,0xA5,0x44,0xEA,0x5E,0x8D,0xDB,0x1F, +0x96,0xA1,0xA1,0x7A,0xA8,0x45,0x73,0x8D,0x7F,0x66,0x39,0x1C,0x45,0x94,0x93,0x3D,0xDE,0xA7,0x41,0xCB, +0x06,0x60,0xE6,0x8F,0xD7,0xE0,0x2C,0x96,0xEC,0xA1,0x0E,0x51,0x32,0x82,0x0A,0x9B,0x62,0xCB,0x74,0x2E, +0x81,0xF6,0x75,0x84,0xC0,0x6E,0x2A,0x56,0x39,0x4A,0x88,0xC1,0x15,0xDE,0xC1,0x71,0xAB,0x6C,0xB0,0x90, +0x90,0x03,0x36,0xC0,0xB2,0xA0,0x60,0xD0,0xD8,0xDD,0x1F,0xEF,0xF2,0xE0,0x81,0xE0,0xD5,0x65,0xA9,0xB3, +0x37,0x7F,0x03,0xC7,0x8E,0xDC,0x5E,0xF7,0xF9,0x08,0xD7,0x66,0xDE,0xB7,0xEC,0x31,0x97,0x3C,0x54,0x88, +0x42,0xD2,0x96,0xF8,0x92,0x00,0xAC,0x5A,0x35,0x61,0x1E,0xB4,0x74,0x45,0x1C,0xB6,0x59,0xDA,0xA2,0xC4, +0x7F,0xB9,0x56,0x63,0x95,0xB6,0xE1,0x25,0x34,0xBE,0xFD,0xF4,0x07,0xD9,0x43,0x16,0x1E,0x96,0xB9,0xCD, +0x81,0x23,0xE7,0xB7,0x14,0xB1,0x1D,0xB2,0xA3,0x5C,0x9C,0xF9,0x27,0x83,0x7C,0x88,0x9F,0x31,0x11,0xEC, +0xDE,0xF8,0xB6,0x98,0x98,0xD7,0xB2,0x8A,0x03,0xF8,0x08,0xB2,0xA9,0x3D,0xCC,0x8E,0x3C,0xD9,0x85,0x0B, +0x01,0x76,0x46,0x1E,0x25,0x69,0xB2,0x01,0xAF,0x02,0x21,0xA8,0x1D,0xD4,0x21,0x83,0x07,0xCB,0x27,0xDD, +0xCF,0xFB,0xB9,0x9C,0x9E,0x8F,0x70,0x9E,0x99,0xBD,0xA9,0xAA,0x95,0xFF,0xDF,0xF0,0xC1,0xF6,0x32,0xD0, +0x0C,0x3C,0xEE,0x68,0x9F,0x36,0xF6,0x08,0xEC,0xF4,0xD1,0x1F,0xE2,0xEE,0x10,0x6B,0xC4,0x5E,0x8E,0x9E, +0x9D,0x36,0x72,0x85,0x0C,0x7D,0x81,0x03,0x7F,0xF3,0x35,0xC9,0x6F,0x13,0x60,0x9F,0xBC,0xB1,0x75,0xFB, +0x4D,0xD8,0x1F,0x65,0xDC,0x28,0xB4,0x88,0xD0,0x53,0x68,0x3D,0x13,0x32,0x07,0x79,0xE6,0x02,0x97,0x79, +0x03,0xBE,0x59,0x21,0xA5,0xBF,0xA8,0x39,0xFB,0x64,0x0B,0x5E,0xE3,0x7D,0xC2,0x72,0xBB,0x04,0xB0,0xEA, +0xF8,0x6D,0x28,0xE7,0x65,0xD5,0xCC,0xCA,0xA8,0x88,0x58,0xA5,0xA3,0x9C,0x7F,0xD5,0xB3,0x43,0xDB,0x06, +0xE6,0xD7,0x03,0x20,0x3B,0xCF,0xA9,0xDA,0xA7,0x62,0x6A,0xD1,0x85,0x97,0x1E,0x91,0xB2,0xD0,0x67,0x37, +0x4C,0xFE,0xC0,0x25,0x04,0x26,0x1A,0x55,0xA1,0x02,0x4E,0x3E,0x84,0x8B,0x52,0x82,0xC0,0x0C,0xB8,0x06, +0xAD,0x6A,0x30,0xD2,0x06,0xFF,0x31,0xAF,0x03,0x68,0x20,0xF2,0x2D,0x26,0xA7,0xB6,0xF2,0xFA,0x11,0x59, +0xE1,0x66,0x4B,0x3A,0x94,0x34,0x71,0x03,0x81,0xB8,0xE9,0x9B,0x51,0x6B,0x71,0x01,0x8B,0x08,0x30,0x5D, +0x36,0x58,0x61,0xA1,0x7C,0x48,0x35,0xF1,0x9D,0x48,0xC8,0xCE,0x06,0x13,0xB8,0xE3,0x2B,0xBE,0x74,0x2E, +0x2B,0x4C,0x2C,0xA9,0x8D,0x0A,0x32,0x1C,0x8C,0x6B,0x6D,0x5C,0x1D,0x08,0xD9,0xC8,0x2B,0x78,0x21,0x66, +0xA8,0x6A,0x55,0x6F,0x73,0x0B,0x3B,0xF2,0x25,0x46,0x6A,0x51,0x5A,0x40,0xFA,0xC7,0x23,0xF6,0x52,0x1F, +0x6C,0x65,0x7C,0x42,0x24,0xD7,0x62,0x5F,0x36,0xC0,0x25,0x2C,0x38,0xC4,0x22,0xE8,0xB6,0x01,0x6E,0x37, +0x84,0x83,0x6A,0x38,0x42,0x43,0xDA,0x69,0x25,0x4C,0x1A,0x49,0xAA,0x85,0xC3,0x23,0x1D,0x1F,0x85,0x96, +0x4D,0x76,0x7D,0x51,0x83,0xFC,0x49,0x09,0x29,0x08,0xCE,0x37,0x0C,0x81,0x6B,0x39,0xCE,0x41,0x43,0x90, +0xDA,0x2F,0x4A,0xBB,0x27,0x84,0x48,0xD9,0x81,0x4F,0xE3,0xFD,0xF4,0xA0,0x7E,0x44,0xB8,0x08,0xD6,0xE6, +0xAD,0x72,0xCF,0x4D,0x91,0x2F,0xA5,0x50,0xC3,0x2B,0xB4,0xD7,0x40,0x3F,0x06,0x92,0x82,0x17,0xAD,0x93, +0xBC,0x87,0xE3,0xDF,0xEC,0xA7,0xC5,0x4D,0x98,0x20,0x65,0xAF,0xC3,0x1D,0x31,0xE7,0x5B,0x76,0x11,0x49, +0xC8,0x1F,0x94,0xD6,0xC8,0x3D,0xBC,0x61,0x00,0x9B,0xF2,0xE6,0x3D,0xA5,0x55,0x28,0x82,0xD0,0x65,0xBD, +0x18,0x02,0xCC,0x0C,0x81,0x12,0x64,0x37,0xBE,0xE1,0xEB,0x64,0x78,0x4D,0x4C,0x49,0x30,0xDB,0x34,0x52, +0x02,0xE4,0x73,0x9B,0xA6,0xE8,0xE3,0x74,0x79,0x85,0x82,0x55,0x8C,0xF8,0xCD,0x34,0xC1,0x67,0x4C,0xFA, +0xAF,0x4A,0x95,0x68,0xEE,0xE9,0x83,0x14,0x90,0x89,0x75,0x01,0x6E,0x9F,0x64,0xBB,0x9D,0x91,0x9D,0x7C, +0x21,0xF8,0xA3,0xC9,0x1A,0xA6,0x0E,0x6A,0x17,0x38,0xFD,0x4B,0xC1,0x9E,0x83,0x42,0xCD,0xA7,0x6E,0x88, +0xFA,0x70,0x06,0x9C,0x21,0x64,0xAE,0x76,0xC8,0xB0,0xA6,0xFF,0xB7,0x86,0xE6,0xDE,0x3A,0x06,0xBA,0xCE, +0x62,0xD0,0x92,0xFE,0x88,0xB3,0x4D,0x18,0xD4,0x45,0x53,0xCF,0xBB,0xC5,0xB2,0xA8,0x08,0x24,0xAF,0x17, +0xB8,0xBB,0xAF,0xCE,0xE7,0xA4,0xE7,0x3F,0xDB,0x0E,0x47,0x2A,0x8B,0x96,0xFE,0x27,0x89,0xE9,0xD8,0x86, +0xB8,0xF3,0x7A,0x7F,0x58,0x74,0x9A,0xBA,0x68,0xE3,0x8D,0xAE,0x3D,0xFF,0xE1,0x7C,0x71,0x89,0x46,0xED, +0xDA,0xA2,0x3E,0x2B,0x28,0xFD,0xCE,0xF2,0xA3,0x7C,0xDD,0x18,0x49,0x1E,0x57,0xEE,0xB5,0x3C,0x37,0x5B, +0xAE,0x16,0xA5,0xA7,0x3A,0x32,0x9F,0x70,0xE7,0xE0,0x6B,0x9F,0x44,0x23,0x42,0x03,0x07,0xC0,0x60,0xE6, +0x14,0x5D,0xE2,0xA6,0x5B,0x8E,0x26,0x24,0x40,0x7D,0xAF,0x69,0x0B,0x87,0x28,0x14,0x3A,0x05,0x62,0x1F, +0xC5,0x01,0x47,0x34,0x51,0x55,0x25,0xAD,0xA4,0xE0,0x4D,0x95,0x98,0xAA,0x61,0xA6,0x8C,0x49,0xA9,0x36, +0xBF,0x03,0x98,0xE3,0x26,0x98,0xBE,0x11,0x5D,0x32,0x60,0x12,0x60,0xB2,0x2F,0xDF,0x01,0x2E,0xE7,0xA0, +0x84,0x87,0x9F,0x39,0x10,0xF6,0xB0,0x8F,0xF4,0xC2,0x67,0xE2,0x73,0x96,0x10,0xD0,0x25,0xA7,0x96,0x1B, +0xA2,0x33,0x18,0x32,0x56,0x45,0x9E,0x9F,0xBC,0x14,0xE4,0x21,0xC5,0x89,0x9B,0xC3,0x88,0x20,0x21,0x47, +0x27,0xC9,0xC9,0x94,0xF8,0x8A,0x33,0xCA,0x24,0x81,0x97,0x1B,0x6A,0xE5,0x01,0x01,0x38,0x85,0xA7,0xD7, +0x8B,0xE1,0xF0,0x8E,0x13,0xE1,0x06,0x8A,0x4F,0x92,0x20,0xDA,0x4A,0xB2,0x49,0x26,0xB9,0x3C,0x73,0xAB, +0x0B,0xF3,0xD5,0x0D,0x69,0xCD,0x1A,0xB4,0x7E,0x6A,0x84,0x4D,0x31,0xE6,0x1C,0xE9,0x0C,0xE8,0x9B,0xF5, +0x30,0xA7,0x28,0x55,0x6F,0xBA,0x17,0x02,0xDA,0x90,0xB7,0x60,0x2E,0x90,0x8D,0x22,0x19,0xE9,0x83,0x7C, +0xC3,0xCD,0x3E,0x1E,0xDB,0xF0,0xEA,0x8F,0xAF,0x06,0xA3,0xA0,0xE5,0x51,0xAF,0x64,0xAF,0x33,0x58,0xCA, +0xFF,0x6E,0x15,0xB8,0x8D,0xC5,0x2F,0xED,0x92,0x1B,0x96,0xE8,0x4F,0xC5,0x9A,0x2D,0x7D,0xE0,0x98,0xA9, +0x2F,0x04,0x23,0xC2,0x9E,0xEC,0xF3,0x86,0x08,0x33,0xED,0x42,0xFD,0x2E,0xA1,0x29,0x2C,0x89,0x14,0x21, +0x4D,0x5B,0x2F,0x8A,0x6C,0x8F,0x85,0xDF,0x52,0xAD,0x88,0x11,0x41,0x9A,0x87,0xAE,0xEC,0x81,0x6E,0x52, +0x58,0x92,0x8C,0xF6,0x34,0xFF,0x55,0xF4,0xDA,0x1A,0x92,0xBA,0x54,0xB5,0xB9,0xB0,0xF2,0x90,0xDC,0x16, +0x77,0x7A,0xE6,0x73,0x8A,0xA3,0x09,0xFC,0x7E,0xC3,0xF8,0xDB,0x19,0xDD,0x8D,0x77,0x4B,0xFD,0x7B,0x17, +0xBA,0xDD,0xD4,0xED,0xD4,0xB7,0x07,0x40,0xD5,0x7C,0x3A,0x55,0x77,0xF0,0x5E,0x20,0x8A,0x9B,0xDB,0x84, +0x97,0x69,0xB4,0x6E,0x6E,0x96,0x4F,0xA8,0x45,0x75,0x14,0xF5,0x86,0x1D,0xD4,0xE8,0x72,0x40,0xC5,0x68, +0x8C,0xCD,0x50,0x69,0x76,0x85,0x05,0x87,0xF1,0x16,0xCD,0xA5,0x4B,0xBA,0xB0,0x75,0x0D,0xEE,0x4D,0x18, +0x1F,0x07,0xED,0x31,0x25,0xDF,0x63,0x53,0xE5,0x3A,0x5D,0xDE,0x1A,0xDC,0xED,0x66,0xE7,0xEC,0x36,0x0F, +0x64,0x13,0xC7,0x4E,0x7C,0x2C,0x23,0x59,0x58,0x77,0x07,0xCC,0x3F,0xF7,0x77,0xBB,0x88,0xE8,0xFA,0xBE, +0x5E,0xC7,0x40,0x83,0x98,0x5A,0xEE,0x2F,0x1E,0xD9,0x7D,0xA6,0x2C,0x5A,0x36,0x94,0x80,0xBB,0xA2,0x2F, +0xBF,0xC9,0xBD,0xBA,0x5F,0xFC,0x3D,0x6B,0xAB,0xE1,0x38,0x6C,0x39,0x36,0x9A,0x48,0x9D,0x50,0xC7,0x3D, +0xDF,0x99,0xBF,0x3A,0x26,0x93,0x26,0x47,0xA1,0x69,0x67,0x95,0x68,0xEE,0xE1,0x88,0x42,0x83,0x0E,0x9E, +0x50,0x10,0xAD,0xAC,0x39,0x7F,0x01,0x7E,0x3D,0x4C,0x2A,0xEF,0x51,0xBF,0x07,0x8F,0x95,0x91,0x43,0xF0, +0x3A,0xFC,0xF4,0x6F,0xF4,0xBE,0xCD,0x43,0x49,0x0B,0x17,0x59,0xAA,0x44,0x85,0x5B,0xA5,0xC1,0xD3,0x80, +0x71,0x70,0x25,0xC8,0x23,0xBC,0x3A,0xEB,0xB3,0x9F,0xB8,0xD4,0x4C,0xA0,0xD0,0xCD,0x21,0x0C,0xAB,0xD6, +0x71,0x0B,0x62,0xF8,0x4D,0x43,0xB2,0xEB,0xEC,0xBA,0x38,0x6C,0xE0,0x23,0x34,0xB1,0x84,0x03,0x7E,0xFF, +0x86,0xC0,0xE1,0x53,0x47,0x2D,0xC1,0x67,0xEA,0x44,0x2E,0xCD,0xD4,0xBE,0x48,0x99,0x14,0xDE,0x89,0xF8, +0x99,0xA2,0xF9,0x94,0xE1,0x20,0xF0,0xDE,0x6E,0x3F,0x80,0xAD,0xD7,0x02,0x9E,0x05,0x1A,0x66,0xEF,0x86, +0x71,0x67,0xD7,0xE0,0x48,0x04,0xFC,0x32,0x81,0x19,0x89,0x41,0x10,0x45,0x01,0x62,0x9E,0x0A,0x5B,0xF0, +0x4D,0xC2,0x68,0xE3,0x23,0xF9,0x84,0xCD,0x1F,0x64,0xE9,0x9E,0xD2,0x0B,0xAE,0x1A,0xD4,0x54,0x6E,0x0E, +0x20,0x62,0x97,0x14,0x9B,0x65,0x58,0x0E,0x64,0xCA,0x75,0xEE,0x26,0xF1,0xAB,0x47,0xF5,0x74,0x66,0xE7, +0xE9,0xAB,0x92,0x0B,0x47,0x4E,0x29,0x62,0xDA,0x74,0x72,0x3F,0xB4,0x06,0x50,0xEF,0x3B,0xA3,0xFD,0xDE, +0xE8,0x52,0x61,0x1B,0xF8,0x0B,0xC3,0x6D,0xC0,0x57,0xA3,0xE3,0x9E,0x88,0x33,0xA3,0x69,0x51,0xE3,0x4F, +0x55,0x08,0x75,0xBD,0x7C,0x02,0x0D,0x7D,0xD5,0x86,0x7C,0xDF,0x4B,0x4F,0x0E,0xD2,0x2C,0x38,0xFD,0xAA, +0x88,0x10,0x87,0x5B,0x1C,0x3E,0x2C,0x5D,0xC8,0x80,0xDA,0x69,0x31,0x44,0x72,0xDA,0x9A,0xCB,0x0A,0xB5, +0xA8,0xA0,0xCC,0x3F,0x95,0x47,0xC7,0x79,0xA6,0x64,0xB3,0x2B,0x75,0x6B,0x78,0xC9,0x84,0xF2,0xE5,0x0B, +0x35,0xE3,0xD7,0x90,0xD2,0x2C,0xE4,0xBB,0x27,0xF2,0xB0,0xA6,0x6A,0x23,0xC9,0x0A,0xA7,0x0D,0x5F,0x8C, +0xD2,0x4F,0xC4,0x70,0x48,0xCD,0xC4,0x24,0x32,0xD0,0x93,0x48,0xB6,0x1F,0xCD,0xA0,0xA5,0x1C,0x5E,0x50, +0x65,0xB5,0x92,0x72,0x15,0x93,0x45,0x93,0xC6,0x57,0xE1,0x4F,0xA0,0xAC,0x7B,0x25,0x2D,0xB4,0x45,0x48, +0x49,0x9F,0x75,0xA3,0x32,0x5F,0x51,0xFB,0xFE,0x6C,0xDD,0x21,0x69,0xE2,0x93,0x11,0xAE,0x8E,0x3D,0x26, +0x40,0xDF,0xB6,0x37,0x60,0x34,0x7E,0x28,0xFE,0x5B,0xFC,0x3F,0xB1,0x39,0xC2,0xE2,0xBF,0x4F,0x14,0x05, +0xC2,0xF9,0xDC,0x54,0x3E,0x78,0x4A,0x14,0x3F,0x9E,0x83,0xF1,0x47,0x58,0x4B,0x07,0x0E,0xD8,0x1C,0xDB, +0x05,0xE9,0xBE,0x82,0xB4,0x24,0xF2,0x87,0xA2,0x19,0xAE,0x1E,0x1B,0x8F,0x45,0xD5,0x2A,0x20,0xC1,0xD4, +0x31,0xFB,0xA6,0xD6,0x42,0xA8,0x46,0x49,0x18,0xAE,0x52,0x99,0x5C,0xB8,0xB8,0xF8,0x9F,0x79,0x5C,0xB5, +0x03,0x57,0xAE,0xEB,0x76,0xA7,0x96,0xBD,0x88,0xE6,0x89,0x6C,0xC6,0x3F,0x5F,0x5E,0xEB,0x5D,0xE1,0xC2, +0x0B,0xE6,0x90,0xE8,0x7D,0x58,0xDE,0x82,0x5D,0x31,0x96,0x9B,0x88,0x0A,0x23,0xCF,0xF6,0xCB,0x31,0x29, +0x26,0xED,0xA6,0x86,0x1A,0x5E,0xFE,0xDB,0x28,0xD1,0xFF,0xF7,0x6B,0x76,0x1F,0xD7,0x8F,0x17,0x15,0xAE, +0xC5,0x7E,0xEE,0x12,0x7A,0x11,0xE9,0x5D,0x03,0xD3,0xD9,0xBE,0xDC,0x0D,0x64,0x0C,0x9A,0x62,0xF2,0x86, +0xA9,0x3D,0xA0,0x84,0xF9,0x01,0xC7,0xCB,0xFC,0x05,0x86,0x23,0x41,0x38,0x28,0x6D,0xD1,0x41,0xC8,0x97, +0x90,0xE7,0xF7,0x31,0x2F,0x5D,0x7B,0xBF,0x04,0x53,0xCF,0x06,0x4E,0xC0,0x7C,0x79,0xD0,0x6A,0xA4,0xF3, +0x22,0x7F,0xF0,0xF4,0x35,0xE0,0xEE,0x40,0x65,0x22,0x49,0x5D,0x81,0x7D,0xD7,0x61,0x23,0xEF,0x3F,0x92, +0x46,0x09,0x00,0xC9,0x36,0xC1,0x14,0xB3,0x80,0x83,0xE1,0x67,0xF8,0x8F,0x49,0xA6,0xF7,0x5C,0x89,0xDC, +0xB3,0xC2,0x1A,0xCF,0xD0,0x3E,0xCE,0x53,0xC1,0xC1,0x97,0xB7,0x36,0x53,0xF9,0xA2,0x37,0xC5,0xD0,0xDC, +0xE9,0x1C,0x18,0x66,0x35,0x40,0xD8,0x3D,0x97,0xA9,0xFD,0x19,0xAD,0xA0,0x47,0x27,0x72,0x98,0xE8,0xAD, +0x23,0x83,0xC0,0x34,0x11,0xF7,0xD5,0xB2,0x13,0x68,0x30,0x14,0xA8,0x98,0xD9,0x93,0x02,0x8D,0x5A,0x05, +0x37,0x5B,0x28,0x65,0xC0,0x0C,0x4E,0x28,0x54,0xE2,0xC3,0xF5,0x26,0x0E,0xAB,0xA8,0x76,0xDC,0xEF,0xF7, +0xDA,0x28,0x55,0xE8,0xD4,0x67,0xBA,0x37,0xE5,0xCB,0x55,0x1E,0xD3,0xA9,0x12,0xEF,0xED,0x77,0x0B,0x92, +0xDE,0xF4,0x6B,0x5D,0xC7,0x2A,0x49,0xF8,0x9F,0xAD,0x5D,0x45,0xEA,0xCF,0xC2,0xBC,0xCC,0x2F,0x5B,0x78, +0xF0,0x83,0xF7,0x1F,0x7D,0xB1,0xF3,0xBA,0x19,0xD1,0xC3,0xCD,0x70,0x17,0x63,0x9E,0x71,0x7A,0xCC,0x7D, +0x93,0xED,0x1B,0xAC,0x6C,0x41,0x83,0xC1,0x71,0xE6,0x66,0x2A,0x02,0x77,0x62,0xCA,0x08,0x0B,0x0C,0x6D, +0x7D,0x48,0xC8,0x81,0xDE,0xDC,0xC0,0xFC,0xAC,0x96,0x80,0x9C,0xBE,0x52,0xF8,0x08,0x7C,0x39,0x05,0x39, +0xE2,0x1B,0x63,0x6F,0x6F,0x88,0x3E,0x4A,0x98,0x9C,0xB3,0xBF,0x53,0xC6,0x93,0x6D,0xD9,0xE3,0x48,0x3D, +0xAE,0xBF,0x83,0x3D,0x68,0xA1,0x83,0x84,0xEB,0x6F,0x06,0xFD,0x42,0x1B,0x2C,0x96,0x22,0xD9,0xDC,0xA1, +0x97,0xD5,0xB3,0xB2,0xE6,0x1C,0x4F,0x81,0xD5,0xEB,0x1D,0xAB,0xC0,0xFF,0x8B,0xF4,0xC2,0xD4,0xDD,0xD0, +0x26,0x21,0x17,0x33,0xE6,0xCE,0xB1,0xF0,0xC6,0x9D,0xDD,0xA3,0x36,0xAE,0xD8,0x41,0x66,0xD6,0x35,0xF9, +0x79,0x90,0x4B,0x23,0xA6,0xF3,0x95,0x68,0x56,0xB8,0x3F,0x31,0x20,0x4D,0xAA,0x48,0x04,0x20,0xAE,0x19, +0x25,0x24,0xDB,0x49,0xC7,0xE2,0x75,0x84,0x9D,0x96,0xCA,0x03,0x0A,0x5B,0x6D,0xB4,0x14,0x11,0xE8,0x54, +0xF2,0x40,0x1E,0xF7,0x43,0x58,0x82,0x12,0x8E,0x56,0x3C,0x62,0x03,0x49,0xAD,0xC2,0xDD,0x9E,0x28,0x09, +0x6B,0x0B,0x29,0x94,0xD1,0x25,0xAD,0x07,0x7C,0x9F,0xD5,0x10,0x75,0x37,0x03,0xB2,0x65,0x1B,0xA1,0x04, +0xDC,0x6A,0xF9,0x75,0x08,0x5D,0x26,0xF0,0xDF,0xB3,0x4E,0x28,0xEC,0xAE,0xD6,0xE4,0xDA,0xF7,0xF5,0xC4, +0x52,0xDC,0x96,0x64,0x91,0xB4,0x3C,0x38,0xA8,0x67,0x97,0xA5,0x7B,0x82,0x75,0xB4,0x86,0xDB,0x27,0xAC, +0x53,0xDF,0x0F,0xF9,0xAF,0x2A,0x03,0xD0,0x5F,0xFC,0xF2,0x96,0x4C,0x24,0xD0,0x6D,0x9E,0xFB,0x47,0x39, +0x6D,0xAD,0x14,0x3D,0x6C,0x3D,0xA5,0xB8,0x1D,0x68,0xAE,0xDA,0x92,0xB1,0x02,0x88,0x8C,0x9C,0xA0,0x0E, +0x95,0xF7,0x91,0xD2,0x8A,0x86,0xB0,0x9F,0x37,0xBB,0xBE,0x72,0x9A,0x9F,0x63,0x8C,0x15,0xA4,0x9F,0x23, +0xD2,0xD3,0xFD,0xCA,0x9F,0xDE,0xF2,0x6F,0xF4,0xF7,0x4A,0xDE,0xC3,0x51,0xCF,0x84,0x08,0x8F,0x45,0xF4, +0xB9,0x8D,0xBE,0x17,0xEE,0xBF,0x81,0x93,0xDB,0xFF,0x59,0x8C,0xA5,0xFF,0x23,0xB4,0x16,0xBA,0x70,0x73, +0xC5,0x4D,0x55,0xCC,0x96,0x2D,0xE6,0x12,0xEA,0x1A,0xD6,0xB4,0x11,0x8E,0xA0,0x00,0x49,0xBE,0x0F,0xD2, +0xF4,0x0F,0x59,0x10,0x86,0x59,0x8E,0x81,0xC3,0x30,0x49,0x05,0xF3,0x6B,0x6E,0xCD,0x6C,0x2F,0xCE,0x77, +0x76,0xFE,0xDD,0x52,0x5B,0x40,0x23,0x94,0x36,0x58,0xFB,0x24,0xD0,0xE8,0xF5,0xA6,0x12,0x4B,0xC6,0x3E, +0x52,0xFB,0x72,0x82,0xCD,0x5F,0x40,0xE6,0x57,0xDF,0xFD,0xD4,0x30,0xAF,0xCA,0x83,0xE6,0x4B,0xE0,0xFE, +0x42,0xD5,0x50,0x72,0xB2,0x6A,0xD1,0xBC,0x80,0xDD,0xE1,0x55,0xC2,0xB1,0xFD,0x07,0x5C,0x54,0x8B,0x61, +0x71,0x60,0x96,0xD1,0xF4,0x72,0xAB,0x45,0x92,0x37,0x39,0x3E,0xEC,0x4A,0xB9,0xD1,0xD6,0x68,0xA1,0xEA, +0xE8,0xF7,0xBC,0xAC,0xD2,0x6B,0x16,0x4E,0xC7,0xBE,0xCB,0x23,0xBD,0x63,0x0F,0x7E,0x75,0x46,0x08,0x67, +0x94,0xAF,0x40,0x3A,0xDB,0x41,0xC2,0x50,0xD9,0xBA,0x5A,0x1D,0x2F,0x11,0xCB,0x5D,0xBA,0xBB,0xA8,0x59, +0x48,0x55,0x0C,0xC5,0x8F,0x27,0x31,0xF1,0x9F,0x44,0x0B,0xDD,0x81,0x2A,0x9E,0xBB,0x41,0x33,0xC2,0xA6, +0x7C,0x09,0x82,0x1C,0x19,0x17,0x2A,0x78,0x29,0x4A,0xAD,0x4F,0xEB,0xB0,0x66,0x8E,0xF6,0x2D,0xF5,0xBE, +0x89,0x71,0x71,0x3C,0x33,0xAF,0x9A,0xA0,0x28,0x47,0x8C,0x6D,0x31,0xE6,0xB1,0x37,0x2D,0x1E,0x99,0x4C, +0x3D,0x6F,0xAB,0x61,0x37,0x01,0xC9,0x68,0x25,0xBB,0x69,0x3B,0x06,0x89,0x34,0xAD,0x93,0x33,0xD9,0xFB, +0x56,0xDB,0x71,0x41,0x30,0x2B,0x06,0xF2,0x13,0xD6,0x44,0x5C,0x22,0xCF,0x94,0x81,0x3F,0x4B,0xD7,0x4C, +0xB6,0x3D,0x34,0x22,0x25,0x21,0xB2,0x34,0xF3,0x31,0xA6,0xAE,0xED,0xE0,0x0B,0x52,0xD4,0x1F,0xFD,0x03, +0x69,0xC5,0x69,0xF6,0x9A,0xC4,0xB6,0xD7,0x17,0x42,0x6A,0x4D,0x00,0x3F,0x37,0x13,0x68,0x5F,0x85,0x14, +0x31,0x93,0xDD,0x7C,0x08,0x5E,0xFF,0x29,0xF0,0xF0,0x3B,0x02,0x83,0x0B,0x54,0xF4,0xCD,0x8B,0xA3,0x1F, +0x2E,0xD9,0xAA,0xE2,0x93,0xF7,0x9F,0x2E,0xDA,0x26,0x73,0xED,0xD8,0x71,0x7C,0xB0,0x9D,0x8A,0xA2,0xF2, +0x92,0xF6,0xF8,0xFC,0x5D,0x4B,0xFF,0x75,0x4D,0xA9,0xAE,0x09,0x52,0x19,0x7F,0x16,0x7E,0x37,0x32,0xAB, +0x91,0x88,0x76,0x6D,0x58,0x53,0x1D,0x0D,0xAB,0x4C,0x6C,0x06,0x7F,0xAA,0x7E,0x0A,0xE1,0xCF,0x46,0x54, +0x19,0x30,0x48,0x08,0x68,0xF7,0xCF,0xA3,0x9D,0x73,0xF1,0x5F,0xC0,0xE3,0xAE,0x8D,0x84,0x88,0x9A,0xE6, +0xE4,0x3B,0xC6,0x90,0x7D,0xF0,0x7F,0x61,0x70,0xD7,0x06,0xE2,0xC0,0x85,0x43,0x97,0xCA,0x41,0x00,0x45, +0xAF,0x37,0xE8,0x69,0x29,0x04,0xF0,0x9C,0x43,0xC7,0xB4,0x3C,0x7A,0x64,0xAC,0x55,0x82,0x36,0x26,0x87, +0xBA,0x5C,0xFE,0x37,0x14,0x9A,0x67,0x8E,0xE7,0xDA,0xAE,0xC8,0x42,0x63,0x6F,0xBA,0xD8,0x78,0xB1,0xA6, +0x59,0x7E,0xA6,0xBE,0x4D,0x59,0x60,0x79,0x8C,0x3C,0x06,0x2D,0x28,0x62,0xFF,0x37,0x5B,0x8F,0x53,0xA9, +0xC4,0xD3,0x6F,0xAA,0x24,0x3B,0x77,0x22,0x07,0x12,0xE8,0xDB,0x50,0x5B,0x48,0x05,0xAF,0xD2,0x86,0xE3, +0x1E,0xA0,0x79,0x0B,0xA1,0xEE,0xB3,0x3A,0xED,0xCE,0x08,0xC2,0x0C,0x3B,0x74,0xF6,0x2A,0x1F,0x90,0x22, +0xD7,0xCE,0x68,0xCE,0x34,0xA9,0x68,0xA3,0x09,0xC2,0x9C,0x50,0x8B,0x6A,0x43,0x73,0x85,0xB0,0xC3,0x8A, +0x97,0xB3,0xB1,0xA7,0xAF,0x55,0x6A,0x27,0x5B,0xF9,0x70,0x85,0xE6,0xA3,0x79,0x93,0xC6,0x1B,0x3C,0x23, +0x24,0xD8,0x99,0xC4,0x76,0xF1,0x20,0x82,0x28,0x89,0x5F,0x0C,0x06,0xA0,0x2A,0x76,0xE5,0x85,0xCA,0xD6, +0x9F,0xA5,0x49,0x30,0xB4,0xE0,0x93,0xBE,0x99,0xEA,0x21,0x58,0xE2,0x54,0x83,0x0D,0x36,0x85,0x63,0xA1, +0x04,0xFA,0x61,0x00,0xB8,0xB8,0x28,0xF5,0x63,0x59,0x8E,0x15,0xB4,0xA5,0x51,0xB8,0x2B,0x8A,0xB0,0x79, +0x32,0xAC,0x81,0x9B,0x67,0x8A,0x87,0x71,0x07,0x83,0xDA,0xE2,0x04,0xC5,0x59,0x61,0xF7,0xEC,0x36,0xCC, +0x68,0xF4,0x0A,0x5E,0xDC,0x4E,0x48,0x50,0x0C,0xB9,0x0E,0x61,0x75,0xED,0xDA,0x02,0x94,0x34,0x61,0x58, +0x21,0xFB,0x21,0xED,0x29,0xE4,0x77,0x9C,0x3D,0x05,0x0C,0x60,0x71,0xA9,0xCB,0xEF,0xC8,0xF1,0x71,0x51, +0x2A,0x8F,0x54,0x61,0xF7,0xCF,0x14,0x40,0xF4,0xC0,0x03,0x83,0xFF,0x06,0x9B,0x6D,0xAF,0xF3,0x65,0xA6, +0x90,0xE1,0x09,0x82,0xFE,0x81,0x4D,0x8C,0x0A,0xAD,0x98,0x3C,0xF8,0x9D,0xB3,0x51,0xB8,0xEC,0x40,0x9C, +0x5F,0x82,0xC0,0xC6,0xB4,0x89,0x5A,0x09,0x2F,0x95,0xBA,0x61,0x39,0x23,0xDF,0xF1,0xCF,0xDE,0xCC,0x52, +0x35,0xAA,0xD3,0xA4,0x6E,0x10,0xD1,0xB7,0x2B,0xE0,0x7A,0x9D,0x4A,0x8C,0xC1,0xF8,0x28,0xAE,0x3A,0x5E, +0xB6,0x9A,0x9B,0xD9,0x10,0xB3,0x4A,0x07,0xB0,0x93,0x4F,0xAE,0xD1,0x0F,0xD3,0x7A,0xAD,0xDC,0x04,0x12, +0x11,0xAA,0xE8,0x41,0x4B,0x7C,0x5B,0x49,0x67,0xBC,0x67,0x6B,0x7E,0xDF,0x65,0x96,0x31,0xF1,0x99,0xD0, +0xCE,0x74,0x19,0x4F,0x7C,0xBF,0xCA,0x63,0x25,0x3C,0x1C,0xF1,0x94,0xF3,0x6D,0x20,0xC3,0x7C,0x5E,0x49, +0xC6,0x45,0x9F,0xE5,0x87,0x6B,0xDE,0x24,0x12,0xF9,0x0F,0x12,0xB9,0x45,0xF5,0x90,0xA2,0x90,0x2D,0x50, +0xBA,0xFE,0xF8,0xB0,0x57,0x3E,0x81,0x92,0x79,0xBB,0xAA,0xF1,0x9C,0x91,0x3C,0xD3,0xA0,0x84,0x49,0x42, +0x4D,0xAD,0xB5,0x3B,0xAF,0xDB,0x64,0x14,0x72,0x7B,0xD6,0x31,0x10,0xF2,0x93,0xD1,0x56,0x34,0x9A,0xB3, +0xAF,0xAA,0x6D,0x84,0x9E,0x53,0x5E,0x02,0x89,0x11,0xAA,0x9E,0x0F,0x0E,0xE6,0xD9,0x42,0x0D,0x0E,0xE9, +0x72,0x47,0xA8,0xE8,0x1E,0xB9,0x16,0xA3,0x2F,0xF4,0x92,0x3F,0xB8,0xBB,0x9E,0x54,0x08,0xEF,0x07,0x18, +0x0F,0x92,0x1F,0x70,0x8F,0x61,0xE7,0x43,0xE8,0x06,0x1B,0xD0,0x26,0x71,0xD7,0x64,0x2D,0x3A,0xFD,0x9F, +0x9F,0x56,0x56,0x50,0x06,0x78,0xF7,0xAB,0x1C,0xE0,0xD9,0x28,0x91,0x9A,0x57,0x3D,0xB2,0xFD,0x91,0x11, +0xEE,0x5C,0x6C,0x0C,0x9E,0x7D,0xB5,0xDA,0x2F,0x9D,0x90,0xD8,0xDE,0x3E,0x27,0x64,0xCA,0xA2,0x09,0x4F, +0xDC,0x08,0xCA,0xC1,0xA8,0x8C,0xBD,0xE2,0xD6,0x3D,0xDB,0x94,0x70,0x61,0x8C,0x1C,0x7A,0x75,0x6F,0xA9, +0x2D,0xE3,0x42,0x2C,0x33,0xB2,0x40,0x3C,0x71,0xD5,0x5F,0x17,0x2B,0x30,0x01,0x7F,0xE7,0x1B,0x02,0xEC, +0x47,0x6D,0xBD,0xC5,0xE1,0x1F,0x4D,0x20,0x56,0x32,0x0C,0xEF,0xE0,0x62,0x18,0x53,0x35,0xD5,0xFF,0x5E, +0x97,0x49,0x3C,0x46,0xEA,0x7E,0x62,0x25,0x3D,0x83,0xF3,0x04,0x94,0x4C,0xA5,0x43,0x7F,0x2C,0x22,0x0A, +0x54,0x37,0xF2,0x2A,0xE4,0x98,0x85,0x67,0x7A,0x6B,0x5D,0x42,0xF0,0xE2,0x35,0xB1,0xC3,0x83,0x18,0x54, +0x80,0xA8,0x55,0x37,0x62,0x85,0x92,0xA9,0x1E,0x40,0xE8,0x9B,0x61,0x65,0x28,0x03,0xA4,0x08,0x08,0x20, +0x69,0x28,0x0A,0x4B,0x26,0xDE,0x0C,0xA4,0xD2,0x9D,0xB9,0x23,0xC2,0x09,0xF9,0xBA,0x7B,0x57,0xB9,0x5F, +0xEC,0xB3,0x69,0x9B,0x13,0x05,0x3B,0x50,0xDB,0x62,0x32,0x72,0x32,0x58,0x59,0x62,0xA5,0xD4,0xD3,0x55, +0x6C,0x9C,0x02,0x8C,0x42,0x9F,0xE2,0x5A,0xF4,0x25,0x2A,0xC1,0xC2,0xA7,0xDA,0x24,0xB1,0x40,0xF1,0xF0, +0xDD,0xC4,0x26,0x83,0x18,0x69,0xE4,0xD0,0xC0,0xC2,0x9E,0x18,0x11,0x21,0xBC,0x39,0x77,0x4B,0xC1,0xF2, +0x71,0x62,0x2D,0x5C,0xE6,0x78,0xE1,0x2C,0xD4,0x91,0x75,0x1E,0x99,0xC6,0xBF,0x83,0x70,0x63,0x01,0xDF, +0xFA,0x67,0xAF,0xBD,0xA6,0x6B,0x7A,0xFA,0x65,0x1C,0x6B,0x32,0x8F,0xA1,0x0C,0xD1,0x42,0x39,0xD6,0xE8, +0x61,0x5D,0x4E,0xBA,0x8B,0x9D,0xB5,0xA2,0x1D,0xEF,0x7A,0xF9,0x74,0x56,0x83,0x58,0xFE,0xC2,0x23,0x03, +0xB9,0x85,0xBE,0xA7,0x66,0x7F,0x05,0xED,0xA3,0x95,0x8A,0xEC,0x7F,0x11,0x94,0x59,0xFC,0x4D,0xA1,0xB5, +0x8B,0x6D,0x61,0x82,0x37,0xCC,0x96,0x0F,0x20,0x94,0xFF,0xFF,0x40,0x06,0x44,0x0D,0x3C,0x8F,0xAD,0x3A, +0x63,0x22,0xCB,0x8D,0x76,0x59,0x5E,0xC6,0xCA,0x75,0x2C,0x8A,0xBD,0xBC,0xE7,0x97,0xC0,0xAE,0xFA,0x8C, +0x98,0x90,0x95,0x72,0x24,0x9F,0x45,0x6C,0x03,0xC6,0x75,0xEE,0xCF,0x5F,0x37,0xE2,0x19,0x63,0x9D,0xFE, +0x5E,0x70,0xF6,0x6E,0x8E,0x93,0xDD,0x58,0x52,0x48,0xFB,0x98,0xF2,0x19,0xEE,0x70,0x83,0x1F,0x54,0x2C, +0xFA,0xF9,0x55,0xC0,0x60,0xF4,0xAC,0x22,0x22,0x3A,0xD6,0x99,0x9F,0x56,0x55,0x9C,0x35,0xCC,0x49,0x82, +0x88,0xB4,0x91,0xB2,0x69,0x39,0x0B,0x32,0xB3,0xB2,0xBA,0x38,0xBA,0x74,0x6B,0x90,0xA2,0xF9,0x62,0xC1, +0xF4,0x4D,0xFC,0x70,0xD8,0x01,0x8C,0x3D,0xED,0x7A,0x63,0xC4,0x6E,0xF1,0x1E,0xB3,0xA9,0x3B,0x60,0xEA, +0xDF,0xA5,0x46,0x00,0xD2,0xA5,0x76,0xDE,0x9B,0x48,0x3A,0xDE,0xB2,0x29,0x9E,0x69,0x8A,0x59,0xB6,0xE2, +0xB8,0x34,0x79,0xC6,0xBB,0x51,0x65,0xFB,0x84,0xDF,0x90,0x76,0x49,0xC9,0xAF,0xEF,0x41,0x36,0xAD,0x52, +0x67,0xA7,0x68,0xDF,0x32,0x4B,0xB2,0x9D,0xBB,0xEE,0x30,0xDF,0x18,0x40,0x9F,0x7E,0xCD,0x40,0x8C,0xC3, +0x33,0x0A,0x1D,0xC7,0x2C,0xEF,0x98,0x2E,0x44,0xB9,0x43,0x28,0x13,0xD7,0x95,0x68,0x3F,0x94,0xE2,0x4B, +0x4E,0x17,0x97,0x9B,0x3D,0xA5,0xFE,0x8A,0x09,0x59,0x2E,0x0C,0x7F,0x32,0xB6,0xBB,0x55,0xE3,0x38,0xF3, +0x19,0x7C,0xA8,0xD8,0x86,0xF1,0x8E,0xA6,0x5D,0x65,0x5E,0xCA,0x8D,0x5B,0xCB,0x5F,0x3B,0x94,0x21,0xFE, +0x4A,0xF0,0xDE,0x0D,0xE8,0x30,0xB7,0xF1,0x80,0x2D,0x60,0x8F,0x40,0xE2,0x88,0xC2,0x4A,0x6D,0x20,0xCE, +0x8C,0x2D,0x10,0x36,0x2B,0x5E,0x68,0x9A,0xF6,0xE3,0xB8,0x75,0x6B,0x1D,0xAB,0xB4,0xD5,0xFA,0x85,0xBF, +0x6F,0xE6,0xE0,0x79,0x7D,0xEA,0x28,0x1D,0xA9,0xD9,0xEF,0x0A,0xD4,0x4D,0x73,0x99,0xF9,0x2C,0xEC,0x12, +0x6E,0xE1,0xED,0x6D,0x56,0xFC,0x81,0x57,0x91,0xEE,0xE0,0x1E,0xAB,0x09,0xA1,0xCE,0xCF,0x59,0xC3,0xC7, +0x40,0xBF,0xF4,0xE2,0x65,0x3A,0x52,0xD0,0xCE,0xCA,0xD6,0x6E,0x7F,0xA8,0x40,0xE2,0xE4,0x68,0xA8,0x7F, +0x51,0x9D,0x01,0x09,0xB5,0x89,0xCE,0x1D,0x63,0x3A,0x6B,0xE1,0x03,0x45,0xA8,0xF2,0x73,0xE0,0x11,0x74, +0x24,0xC5,0x16,0x24,0xAB,0xE5,0xE3,0x9C,0xF0,0xC7,0xB5,0x88,0xD1,0x0C,0x82,0xFA,0x90,0x5B,0xFF,0xE4, +0xC8,0xC0,0x6F,0xA9,0xA3,0x15,0xEC,0x03,0x5C,0x47,0x14,0x72,0x65,0x84,0x6A,0x96,0xF4,0x04,0x82,0xC0, +0x5D,0x84,0xC4,0x16,0xB6,0xD8,0x5D,0x0C,0x2D,0xCB,0x04,0x5F,0x75,0xE2,0x76,0xDC,0xFF,0x4D,0xA0,0x5D, +0x37,0x0B,0xD4,0x68,0xE0,0xE8,0x23,0x9B,0x83,0xAB,0x44,0x7C,0x70,0x7D,0xC5,0x13,0xA2,0x0A,0x63,0x4A, +0x2A,0x58,0x78,0xF7,0xEF,0x18,0x45,0xCA,0xBE,0x3D,0xB2,0x28,0x4A,0xA0,0x3E,0x41,0x29,0xD9,0xEC,0x76, +0x9F,0xF8,0xFA,0x9B,0x75,0x69,0xAA,0x67,0x3C,0xCD,0xF4,0x54,0xAC,0x1A,0x9B,0xCB,0xD8,0x94,0xAC,0xE1, +0xB9,0xBA,0x71,0x29,0x6A,0xE8,0xBF,0x54,0xED,0x89,0xED,0x6A,0x16,0x33,0x65,0x52,0xED,0xAC,0x83,0xFD, +0xFD,0x8F,0xC8,0xF1,0x0E,0x36,0x20,0x02,0x22,0x65,0x9C,0xC4,0x93,0xC0,0xFC,0xE7,0x54,0x10,0x7E,0xB6, +0x84,0x6E,0x94,0x69,0xB6,0xBC,0xE0,0xD0,0x96,0xB4,0x84,0x71,0xB7,0x89,0x73,0xF0,0x86,0x34,0x65,0x0E, +0x2B,0xBC,0x8D,0x5C,0x66,0xAE,0xDD,0x25,0x3D,0xDE,0x74,0x0C,0x00,0x4C,0x56,0x55,0x14,0x0C,0x05,0x48, +0xE3,0xE8,0xB5,0xAF,0x14,0xFC,0x42,0x63,0xAA,0x3F,0xDC,0x16,0x7A,0xB2,0xE5,0x82,0x7D,0x59,0xCE,0x64, +0xEB,0x5F,0x2D,0xED,0x86,0x0A,0xCC,0xAF,0x96,0x39,0xD0,0x61,0x02,0xDF,0x9C,0xB9,0xAF,0xFA,0x1D,0xC7, +0x5B,0xD4,0x6D,0xA3,0x15,0xB0,0x0B,0xCB,0x0F,0xC7,0x8D,0x0F,0x2E,0x3B,0xD9,0xB1,0x5C,0x33,0xA7,0xCA, +0x35,0xB4,0xF2,0xCC,0x82,0x0C,0xC3,0x83,0x97,0x28,0x99,0xCD,0xFA,0xD9,0xCE,0xEC,0xCF,0xD4,0x4F,0xED, +0x91,0x5E,0x6B,0x46,0x87,0x03,0x75,0x9A,0x56,0xDA,0x28,0xED,0x34,0xB2,0x76,0xA7,0x5E,0x3D,0x63,0xCE, +0xFF,0x55,0x94,0xFE,0x50,0x83,0x67,0x07,0xF0,0xB0,0x1E,0xD5,0x2E,0xDA,0xAF,0x53,0x20,0xB8,0xEF,0x0A, +0x5F,0x9D,0x2B,0x62,0xB5,0xFA,0x85,0x29,0xE5,0xD1,0x43,0xDD,0xBD,0xF4,0x34,0xCC,0xE6,0xFF,0x23,0x2C, +0xBC,0xE9,0x76,0xD1,0x02,0x47,0x09,0x9D,0x17,0x08,0xD1,0x5E,0x3D,0x68,0x96,0x36,0x35,0xF0,0xC1,0xCB, +0x5F,0x72,0x50,0x8D,0xDC,0xB2,0xC3,0x3A,0x0D,0xDE,0xBD,0xAD,0xFF,0xB6,0x77,0x6F,0xA4,0x49,0x8F,0xDD, +0x01,0xE5,0x54,0xC0,0x0C,0xDD,0x90,0xAC,0xDC,0x1E,0x6C,0x81,0x99,0x70,0xFE,0x80,0x58,0xBE,0xDB,0x2E, +0x7F,0x46,0x3B,0xE6,0xF1,0x3B,0x68,0x3D,0x48,0x42,0x81,0xC6,0x08,0x41,0x08,0x62,0xFA,0x43,0x41,0x72, +0x70,0x01,0x20,0xCE,0x60,0xC3,0xBF,0x08,0x57,0x9B,0x3F,0x70,0x3F,0x59,0x24,0xE3,0xB4,0x39,0x81,0xA3, +0x51,0x5E,0xC2,0x01,0x0C,0xD3,0x86,0x4E,0x60,0xFC,0xD1,0xE0,0xB3,0x40,0x27,0xE8,0xE2,0x41,0x95,0xB1, +0xEC,0x40,0x8B,0xE5,0x87,0xE4,0x75,0xE1,0x14,0xCF,0x16,0x02,0xC0,0x47,0x7D,0xB5,0xF1,0x01,0xDB,0x61, +0xA2,0x84,0xF0,0xAA,0xBF,0x28,0x70,0xF4,0x66,0x57,0x96,0x16,0xA4,0x00,0xD1,0x32,0xF2,0xA7,0xE2,0xC7, +0x0F,0x40,0x54,0x83,0x40,0xEA,0x6E,0x87,0x50,0x1A,0xD2,0xA2,0x07,0x8A,0xA9,0x7A,0xE9,0x65,0x61,0xF3, +0xE1,0xB7,0xE1,0x45,0xD1,0xC8,0xBD,0x4F,0xC2,0xA1,0x01,0x2C,0x1A,0x58,0x4B,0x41,0xED,0xB7,0x52,0xC5, +0xBE,0x2F,0x53,0xB1,0xA8,0x96,0x94,0x5B,0x17,0xA8,0xA2,0x67,0x14,0xB5,0x5A,0xD1,0xA1,0x6D,0x4B,0x75, +0x75,0x48,0xD3,0xAC,0x88,0x87,0x4B,0x3D,0xFB,0x4C,0x11,0x8D,0xCC,0xCA,0xBF,0x7B,0x72,0x10,0x74,0x1F, +0xDD,0x86,0x42,0x50,0x34,0x04,0x1F,0xB9,0xE6,0x2E,0x10,0x1B,0xE1,0x68,0x1C,0x56,0x98,0x50,0x2A,0xEA, +0xCA,0xF5,0x72,0x9C,0xE4,0xBF,0x72,0x68,0xA5,0xA2,0x44,0x6D,0x2B,0x82,0x48,0x7C,0xC9,0x4E,0x1E,0x82, +0xE2,0xD2,0xD3,0xCB,0x43,0xA2,0xA3,0x2F,0x61,0xA5,0x6B,0x3B,0x89,0xBE,0xAD,0x6A,0x7B,0x02,0xEB,0x2B, +0xE9,0xA3,0x6B,0x2F,0xF9,0x5A,0x9E,0x9B,0x49,0xE3,0x0F,0xEE,0x7A,0xF0,0xC1,0x71,0x83,0x50,0x7B,0xFF, +0xBD,0xC6,0xA0,0xC2,0x9B,0xD6,0x9C,0xA9,0x76,0x0B,0x55,0x2D,0x27,0x0A,0xB4,0x6B,0xD0,0x52,0x14,0xA5, +0x52,0xCA,0x70,0x26,0x65,0x79,0x37,0xB1,0xF4,0x50,0xCD,0x38,0x49,0x93,0x15,0xDB,0x22,0x12,0xAA,0x4D, +0xE6,0x3F,0x04,0xD1,0xF9,0x98,0x76,0xE6,0xC5,0xC2,0xDD,0x44,0x7F,0x5B,0xA4,0x48,0xF9,0x31,0x1D,0xE8, +0x87,0xCB,0xA4,0xC6,0x6B,0x39,0xEB,0x30,0x6A,0xAB,0x6B,0xBA,0xF2,0x74,0x32,0xD7,0x82,0x8A,0x0B,0x74, +0x92,0xD7,0xA7,0x72,0xA6,0x36,0x71,0xEA,0xD2,0x24,0xE9,0xBE,0x74,0x57,0x01,0x40,0xBC,0xBC,0xEE,0xD0, +0x43,0xA7,0x7A,0x9B,0x2F,0x70,0xF9,0xB3,0x58,0x56,0xAD,0x9A,0x3D,0x3A,0x65,0xC0,0x42,0xA8,0xA5,0xD2, +0x52,0x06,0x62,0xB5,0xC3,0x5C,0xF8,0xA0,0xD1,0x89,0x10,0x40,0xB8,0xD3,0x8F,0xAC,0x58,0x98,0xAA,0x68, +0x21,0x16,0x8E,0xEF,0x0D,0x98,0x5B,0x50,0x50,0x14,0xB8,0x80,0x1F,0x02,0x3D,0x39,0x1C,0xB5,0x54,0x7E, +0x80,0xE1,0x13,0x4F,0x1D,0x53,0xD6,0xBE,0x80,0xD9,0x31,0xE8,0xEB,0xC4,0x15,0x19,0xD0,0x96,0xE0,0x69, +0xB5,0x52,0x87,0x51,0x25,0xC0,0x18,0x2A,0x76,0x98,0x39,0xEB,0x9B,0x3A,0xED,0xF7,0xC9,0xD8,0xAE,0xE8, +0x35,0x19,0x36,0xC5,0xEB,0x5C,0x7A,0xA3,0x98,0x3B,0x48,0x9A,0x0B,0x7E,0x1E,0x14,0xCB,0x7B,0x3F,0xBA, +0x88,0xB5,0xEE,0x6F,0x67,0x31,0x69,0x0B,0x82,0x53,0x08,0xED,0x8D,0xFE,0x31,0xDE,0x0A,0xC0,0xE6,0x7B, +0x4A,0x30,0x21,0xFF,0x0A,0xDC,0xD7,0x5A,0x98,0x5F,0x07,0x74,0x89,0xE2,0xBE,0x41,0x1A,0x21,0x0E,0xFB, +0x65,0x89,0xD0,0x66,0x9B,0x6B,0x72,0x10,0xB6,0x1C,0x57,0xE8,0xED,0x68,0x43,0x15,0xE4,0x7E,0x79,0x90, +0x41,0xA3,0xDC,0xC4,0x7D,0xF4,0x5A,0xF8,0x75,0x21,0x51,0x0C,0xEA,0xCF,0xB0,0xC5,0xD2,0x99,0x33,0x11, +0x17,0x8B,0xF2,0x17,0x93,0x01,0xD5,0xA1,0xC5,0x5E,0x60,0xE0,0xF5,0xB3,0x1E,0x45,0x22,0x0F,0x9E,0x41, +0xEF,0xAB,0x0F,0x00,0x06,0xCB,0x90,0x29,0x11,0xE9,0xC8,0x20,0x65,0x29,0x88,0x19,0x9D,0xA8,0x56,0xCD, +0xE6,0x7A,0xB6,0x14,0x25,0xEA,0x9A,0x72,0xBA,0x29,0xDF,0x6F,0xB5,0xD5,0x49,0x9C,0x31,0xC0,0xE6,0x85, +0x54,0x9A,0x17,0x54,0xA3,0x0C,0x92,0x70,0x36,0x18,0x03,0x13,0xD1,0xC1,0xC1,0x8D,0x7B,0xEA,0x6A,0xFA, +0x8A,0x79,0xD1,0x71,0x7C,0x88,0x50,0x2E,0x4D,0x7A,0x5D,0x5C,0x6F,0xBA,0x9B,0xE9,0x81,0x02,0xD4,0x27, +0xFC,0x16,0xDF,0xFA,0x0B,0xCF,0x82,0x8C,0x51,0x89,0x5D,0x0D,0x6D,0x09,0xDD,0x33,0x7D,0x79,0x6A,0xC7, +0xCA,0x21,0x4B,0xAD,0x01,0xE5,0x2F,0xF9,0x70,0x82,0x95,0x6B,0x10,0xC9,0x8E,0x82,0x6C,0x54,0x57,0x3D, +0xD5,0x87,0x59,0x7B,0x72,0x23,0x82,0x04,0xBC,0x31,0xD8,0xCF,0xEF,0x13,0xE0,0xEE,0xB5,0xA8,0x14,0x5D, +0x2B,0x20,0x8A,0x14,0xB9,0x70,0x02,0x68,0xB8,0x70,0x5E,0x1C,0xA0,0x81,0xC3,0x39,0xEC,0x42,0x9B,0x68, +0x67,0xA1,0x65,0x1F,0x8C,0x1A,0xA9,0xC0,0xAC,0x41,0xB2,0xC8,0xB4,0x70,0x93,0x78,0x62,0xA0,0xD8,0x99, +0x0F,0x10,0x18,0xBF,0x97,0x33,0x9B,0xC5,0xF2,0x9A,0x9A,0xB3,0x97,0xD5,0x36,0xFD,0x27,0xDF,0x87,0x5E, +0xA0,0x0B,0x93,0xA0,0x45,0xD3,0x36,0x6A,0x35,0x1C,0x04,0x30,0xF4,0xCD,0x77,0x13,0xF2,0x11,0x66,0x72, +0x07,0xD2,0x9B,0xAF,0x17,0x47,0x9A,0x21,0x75,0xF4,0xED,0x5B,0x20,0xB0,0xED,0x7B,0xDB,0xD1,0xBE,0xAA, +0x5E,0xE2,0x45,0x5B,0xDC,0x2E,0x2D,0xA4,0x8D,0x50,0xD0,0xA0,0xD9,0x39,0x50,0xBD,0x95,0xF5,0x5A,0x66, +0x43,0xCC,0x8C,0x64,0xBF,0x23,0x32,0x30,0x23,0x38,0xD3,0x98,0xDE,0x7C,0x44,0x0D,0xE5,0x96,0xEF,0x74, +0xFF,0xFD,0xAB,0xF2,0x07,0xD7,0xC8,0xB8,0x2F,0xEA,0xC1,0x81,0x11,0xB3,0xCD,0x97,0xF2,0xFF,0xA7,0xE1, +0x4C,0xD3,0x92,0x2F,0xB7,0xB1,0x77,0x77,0xF5,0x9C,0xA7,0xA2,0x54,0x92,0x7F,0xC2,0x2D,0x28,0x1D,0x3F, +0x00,0x17,0xCE,0x8E,0xEE,0xC4,0x90,0x92,0x1A,0x83,0x8E,0xE8,0x4F,0xCC,0x6E,0xEF,0xD4,0x14,0x67,0xAC, +0xAB,0xD1,0xAC,0x46,0xA1,0x02,0x7D,0x0C,0xD0,0x35,0xB2,0xFC,0x88,0x4B,0x53,0xC9,0x1B,0xB4,0xD4,0x43, +0x20,0x41,0x51,0x9C,0xCE,0xBB,0x39,0x7D,0x11,0x16,0x3A,0x39,0x7C,0xC7,0x86,0x43,0x29,0xB9,0x40,0x28, +0xA2,0xDD,0x4B,0xD0,0x9F,0x43,0xF6,0x07,0x78,0x28,0xAC,0xBF,0xDD,0x99,0x71,0x38,0x1C,0xEF,0x9D,0xF9, +0x9E,0x4C,0x1E,0xB5,0xE5,0xD0,0xFC,0x1C,0xD3,0x76,0x5D,0x2D,0x2C,0x32,0x3C,0xCF,0xB8,0x1C,0x66,0x6F, +0x9C,0xA9,0xAD,0x2A,0x5D,0x9B,0x97,0xFF,0xA9,0xD6,0x10,0xA5,0xC9,0xB9,0x84,0xDC,0x4E,0xD9,0xEF,0x1D, +0x53,0x74,0x40,0xE2,0x82,0x48,0xDA,0x07,0x62,0xD5,0x9C,0xC0,0x70,0xED,0x27,0x25,0xDD,0x6C,0x70,0x92, +0x08,0xBC,0xE9,0xEF,0xE0,0xA2,0x4E,0xD0,0x61,0x5A,0xC9,0x2E,0x6B,0xD5,0x8D,0x63,0xC3,0xDD,0x21,0xFB, +0x69,0xA3,0x45,0x50,0xEE,0xEB,0xF9,0x3B,0xBE,0x96,0x31,0xC1,0x7A,0x0C,0x2C,0xEF,0x78,0xEA,0x3F,0x07, +0xEF,0xF6,0x48,0x46,0xAB,0xC8,0x3E,0x75,0xAE,0x09,0x55,0x75,0x38,0x8B,0x04,0x44,0xAB,0x07,0xB7,0x6C, +0xB9,0xF2,0x5E,0x32,0xFC,0xA8,0xB6,0xF4,0x5B,0xA6,0x66,0xD1,0x21,0xBA,0x86,0x47,0x47,0xCA,0x3F,0x69, +0x6B,0x97,0x95,0x3B,0xF8,0x25,0x43,0x9E,0x29,0xC5,0xAF,0x53,0x39,0x83,0xDC,0xF4,0x74,0x8C,0xE9,0xF7, +0xB7,0x3C,0x27,0xD4,0xE7,0xCC,0xEB,0x33,0x41,0xDA,0xC2,0x70,0x57,0x0C,0x94,0x6E,0xA7,0x6A,0xC6,0xD5, +0x40,0x0A,0xEA,0x28,0xB8,0xC9,0xE2,0x8D,0x8C,0x79,0xC9,0xAC,0x78,0x90,0x68,0x91,0x1D,0xE4,0xCC,0x89, +0xB2,0xAF,0x87,0x8D,0xD3,0x2F,0x59,0xC1,0xBC,0x68,0x8A,0x61,0x21,0x19,0xC2,0xD2,0x31,0x65,0xA3,0x18, +0x8F,0xC0,0xD3,0xC0,0x1B,0xE7,0xCE,0x8B,0xAF,0x7B,0x3C,0xAA,0x38,0xC4,0x23,0x75,0xE1,0x48,0x67,0x3A, +0xF1,0x96,0x12,0x59,0x28,0xE3,0x79,0x16,0x8F,0x77,0xEE,0x3A,0xBC,0x68,0xF4,0x85,0x3A,0x5E,0x8E,0x8B, +0xC7,0x40,0x0E,0x22,0xC8,0x52,0x19,0x46,0xFC,0xA1,0xF9,0xA5,0x56,0xE1,0xF3,0x99,0x74,0xED,0x51,0x2A, +0xF4,0xB2,0x73,0xB6,0x62,0x5E,0x90,0x17,0xE0,0x09,0xA4,0x5D,0x22,0x86,0xA5,0x66,0x0F,0xFB,0x5A,0x3C, +0x74,0x8B,0x30,0xE6,0xB2,0x0C,0x82,0xD3,0x50,0xF1,0xB3,0xD7,0x4A,0xF6,0x08,0x6D,0x21,0xCA,0x33,0x76, +0xB3,0xFD,0xDC,0x68,0x55,0xCE,0x39,0xB1,0xF6,0x67,0xB0,0x78,0xA2,0x69,0x82,0xDA,0x13,0x57,0x2D,0x5E, +0x09,0xB3,0x95,0x56,0x20,0xD9,0x65,0x15,0xA5,0x41,0xFD,0xF7,0x0A,0xB2,0xA9,0xD3,0x1A,0x2E,0xCD,0x2B, +0x0A,0x6F,0x25,0xFD,0xC9,0x50,0xE4,0xC8,0x01,0x40,0xF8,0x73,0x0B,0x5E,0x34,0xDB,0x56,0x77,0xE8,0xF4, +0x40,0x17,0xC4,0xC1,0xB4,0xF4,0x5E,0x0F,0x82,0xF6,0x61,0xB3,0xB9,0xDC,0x1F,0xCE,0xD4,0xB9,0x7F,0x02, +0x70,0x16,0x58,0x92,0xC8,0xD7,0x95,0x4C,0x13,0x09,0x5B,0x75,0x48,0x53,0x94,0xC2,0xD4,0x77,0x0D,0x0F, +0x0A,0x9E,0x95,0x54,0x4E,0xF6,0x40,0x34,0x4B,0x1A,0x0D,0x7F,0xBC,0xB5,0xCD,0xA8,0x00,0x41,0x2B,0xE6, +0x9C,0xFF,0x34,0x28,0x95,0xB6,0x4E,0x14,0xD8,0x7B,0xE5,0xC7,0x01,0x54,0xCD,0x8A,0x89,0x69,0x11,0x35, +0x43,0x5E,0xD5,0xDB,0x53,0x5E,0xE8,0xD7,0x82,0xB3,0x96,0x9B,0x12,0x6F,0xAB,0xFB,0x56,0x90,0xCA,0x8A, +0xBF,0x09,0xE0,0xC7,0xC7,0x84,0x2D,0x86,0x86,0x7B,0x1C,0x67,0x40,0x3F,0x56,0x24,0xF6,0xF7,0x44,0x16, +0x81,0x64,0xD2,0x13,0x9B,0x1F,0x14,0x22,0x43,0x5E,0xC8,0xAE,0xC0,0xC6,0x57,0xD7,0x45,0x08,0xDE,0x78, +0x31,0xEA,0x39,0xCE,0x0B,0x5F,0xC3,0xCF,0xA6,0x45,0x6D,0x59,0x15,0xF1,0x2C,0xD6,0x9F,0xE5,0x31,0xDF, +0xC8,0xE8,0x0E,0x21,0x07,0x7D,0x8F,0xC2,0xC1,0xCA,0x60,0xCD,0x04,0x80,0x04,0x22,0x0C,0xF0,0x73,0x64, +0xEB,0xA6,0x0E,0x9A,0xA6,0x23,0xD6,0xD7,0x96,0xA0,0xE9,0x74,0x88,0x07,0xF0,0x36,0xB4,0x5E,0xB8,0x30, +0xB2,0x80,0xE9,0xA9,0xBE,0x57,0xE1,0xEF,0x4B,0x99,0x0B,0x5A,0x35,0x5B,0x33,0x50,0xBE,0xCB,0x97,0x92, +0x02,0x46,0xA8,0x53,0x22,0xC1,0x69,0x9E,0xC1,0x0C,0x69,0xB3,0xC8,0x4E,0xE7,0xAD,0xD1,0x4C,0x76,0x20, +0xF9,0x29,0x3D,0x57,0x69,0x06,0x32,0x9D,0xAF,0x15,0xAE,0x69,0x52,0xAA,0x09,0x6F,0xEC,0xC1,0x21,0xD2, +0x62,0x0B,0xA8,0x42,0x4F,0x6A,0xC6,0xC5,0x1E,0x62,0x74,0xE6,0x71,0x0D,0x3A,0x68,0x90,0x6D,0xDD,0xFC, +0xE2,0x6B,0x90,0xC7,0x00,0x59,0x33,0x5C,0xF1,0x28,0xD3,0xB8,0x2A,0xCB,0x2B,0x01,0xE3,0x6C,0xA1,0x63, +0xB4,0x7B,0xFF,0x71,0x2E,0x88,0x06,0x6C,0xE7,0xCD,0xCF,0x45,0xC1,0x6E,0x00,0xDD,0xB0,0x43,0xEA,0x1A, +0x49,0xCB,0x85,0xFC,0xE4,0xEB,0x71,0x2E,0xA6,0xD8,0x12,0xB4,0xD0,0x44,0xA7,0x8F,0xFF,0x28,0x9B,0x8D, +0x05,0xDA,0x2D,0xEB,0x93,0x88,0x85,0x27,0x37,0x6F,0x62,0x1B,0x0D,0xA6,0xEE,0xE0,0x3C,0x54,0x80,0x8B, +0x32,0x64,0x6A,0xAC,0xA7,0x44,0xC6,0x24,0xAD,0xE9,0x84,0x97,0x1D,0x9C,0x22,0x69,0x25,0xEF,0x0B,0x81, +0xDE,0x6C,0x7C,0x38,0xF0,0x20,0xF3,0x60,0x03,0xA9,0x24,0xDF,0xFE,0x40,0x55,0x11,0x82,0x31,0xDE,0xA9, +0x67,0x1F,0x4C,0x20,0x43,0xEC,0x5B,0x9A,0xE8,0x49,0x42,0xD1,0x62,0x19,0xFE,0xFE,0x78,0x04,0x97,0xFF, +0xFB,0xEF,0x05,0xCB,0x26,0x4C,0x42,0x21,0x5C,0xE1,0x74,0xB3,0x52,0x8F,0x20,0xC1,0xEA,0x2D,0x6E,0xE0, +0x18,0x7F,0xDC,0x64,0xF2,0x05,0xFF,0x72,0xCC,0x8A,0x27,0xBF,0xDE,0xF5,0x42,0xB5,0x94,0xDE,0xEA,0x9F, +0x9E,0x80,0x8F,0xFC,0x61,0x3F,0x46,0x47,0xF2,0x39,0x95,0x53,0x6C,0x01,0x25,0x54,0x84,0x2F,0x0B,0x67, +0xB4,0x3E,0x97,0x27,0x70,0x1C,0x89,0xC8,0x46,0xA3,0x83,0x9B,0x9D,0xFE,0x32,0x63,0xCD,0xF0,0x39,0xB6, +0x30,0xBD,0x24,0x66,0x18,0x83,0x4F,0x56,0x89,0x48,0x52,0x76,0xF9,0x3A,0x7C,0x11,0x35,0x40,0x83,0x80, +0x05,0x2A,0xEA,0x94,0x88,0x68,0xF5,0x66,0x51,0xFA,0xC3,0x43,0xD9,0x6F,0x4B,0x97,0x86,0x09,0x4A,0xBC, +0x05,0x4B,0xBD,0xA0,0x8D,0x41,0xE9,0x90,0x36,0xB9,0x86,0x8C,0x8F,0xDA,0x29,0x09,0x94,0xF5,0x76,0xFA, +0x69,0x93,0x02,0x0A,0x26,0x08,0x16,0x15,0x85,0xC1,0x49,0xDD,0x44,0x9B,0xFE,0xEB,0x4F,0x92,0x15,0x7C, +0x91,0x44,0xA0,0x1F,0x9E,0x52,0xC0,0xB8,0x1E,0x8D,0xF5,0xF8,0x8E,0x33,0x67,0x17,0xB2,0xDF,0x21,0xC9, +0x17,0x77,0x4C,0x5F,0x6E,0x0B,0xBC,0xE8,0x87,0x12,0xD7,0xBB,0x32,0xB9,0x17,0x82,0x06,0x9F,0x6C,0x4C, +0x71,0xF6,0x18,0x6B,0x0A,0x69,0x45,0x58,0xE2,0x5A,0x89,0x94,0x40,0x03,0x61,0x1D,0xFA,0x77,0x78,0x7E, +0xC4,0xDE,0x8C,0xDA,0xDE,0x12,0xAA,0x84,0x05,0x9E,0xC4,0x1C,0xD3,0xF2,0xFD,0x37,0xAE,0x63,0xB9,0x5C, +0xBA,0x15,0xC8,0xDA,0xC0,0x71,0x02,0x53,0x15,0x9A,0xD4,0x6A,0x85,0x30,0x0C,0x2C,0x61,0x14,0x01,0x5F, +0xE9,0x17,0x7A,0xFD,0x66,0xBE,0x2B,0x7F,0xD1,0x94,0x68,0x30,0x34,0xD4,0xE9,0x28,0xE5,0x3F,0x94,0x4F, +0xDD,0xC6,0x58,0x10,0x1C,0x07,0x8C,0x19,0x93,0xED,0x61,0x5E,0x20,0x45,0xA5,0x6B,0x57,0xEA,0x55,0xA1, +0x98,0xDA,0x0D,0x76,0x9D,0xA5,0xFD,0xBA,0xA3,0x46,0x04,0xE5,0xC2,0x9E,0x27,0xB7,0x20,0xBC,0x5A,0x77, +0x7A,0xAB,0x78,0x71,0x8D,0x40,0x8F,0x72,0x2C,0xC5,0x56,0x01,0xE9,0x40,0x99,0x8C,0xFB,0x3E,0x58,0xC5, +0x21,0x64,0xDD,0xE0,0x51,0xF9,0xEC,0x32,0xFC,0x8A,0xDF,0xA7,0x97,0xA8,0x62,0x92,0x3C,0x36,0x3C,0x12, +0xAC,0x63,0x7B,0xF1,0x47,0xA9,0xD9,0x69,0x7B,0xCC,0x29,0xE3,0xC3,0x23,0x11,0xAC,0xFF,0x7D,0x51,0x59, +0x85,0x4D,0x9F,0x81,0x78,0x43,0x99,0x64,0x78,0x41,0x7C,0xF3,0x70,0x7C,0x1A,0x58,0x3B,0xCA,0xE2,0x5A, +0xA0,0x2C,0x53,0xBC,0xCF,0x3A,0x01,0x52,0x92,0xD9,0xAD,0xFA,0xE9,0xAD,0xB2,0xEF,0x58,0x2F,0xDE,0xC7, +0xC6,0x34,0x3D,0x00,0xC1,0xF8,0xBB,0xF6,0x61,0xC3,0x86,0x8F,0x5D,0xA2,0x33,0xAD,0x35,0x26,0xDB,0x39, +0x0C,0xDB,0x73,0x24,0x62,0x08,0x21,0x57,0x38,0x84,0xFC,0xC9,0x49,0x54,0x9E,0x3F,0x7C,0xC6,0xB4,0x37, +0x62,0x44,0xFA,0xA7,0xF9,0x25,0x5A,0x4F,0x29,0x6C,0x60,0x0A,0xF6,0x63,0x5C,0x19,0x0D,0x7F,0x0A,0x91, +0x9A,0x20,0x22,0x88,0x43,0x42,0x7F,0x0A,0x78,0xCD,0x3D,0x0D,0xE9,0xF6,0x06,0xBD,0x8A,0xDF,0x2B,0x4D, +0x48,0xB2,0x6C,0x8D,0xBE,0x75,0x30,0x3B,0x74,0x80,0x30,0x36,0xFB,0x2F,0x3B,0x26,0x28,0xC4,0x82,0x6A, +0x3E,0x66,0xB5,0xBD,0x5B,0xF0,0x4C,0x33,0xCD,0x99,0x18,0xDF,0x08,0x5D,0x69,0x35,0x1B,0x0F,0xB9,0x6D, +0x23,0x64,0x82,0x10,0x36,0xD6,0x62,0xB6,0x80,0xD2,0xC2,0x5B,0x67,0xE5,0xC5,0x64,0x43,0xC9,0x09,0xE5, +0xA4,0xC7,0x03,0xC3,0x80,0xD5,0x96,0x05,0x43,0xCD,0x5D,0xBF,0xDD,0xA8,0x32,0xE4,0xBC,0x38,0x34,0x42, +0x6D,0x11,0x66,0xAE,0x0E,0xD8,0x1C,0xC5,0x5D,0x14,0xC6,0x83,0x3C,0x76,0xFB,0x0B,0x8B,0x4E,0x2C,0x60, +0x03,0x41,0xE7,0xAB,0xF6,0xE8,0x0C,0x99,0xB5,0x3D,0x62,0x39,0xC0,0x53,0x15,0xC6,0x57,0xD8,0xD5,0x3C, +0xAA,0x57,0x48,0x5A,0x47,0x5A,0x2D,0x63,0x3F,0x49,0x15,0xA1,0x69,0x34,0x0F,0xB1,0xA1,0x97,0x0A,0x75, +0xFF,0xB6,0xF2,0x07,0x0A,0x0D,0x84,0x32,0x31,0xF7,0x67,0x70,0xB4,0x5A,0x02,0x71,0x30,0x79,0x57,0xE4, +0x5B,0x71,0x6B,0x05,0x5A,0xA7,0x4F,0xDE,0x37,0x55,0x9D,0x9D,0x5A,0xC6,0x20,0xDC,0xA3,0x70,0xC0,0x53, +0x7F,0xD2,0x18,0xDA,0x8C,0x56,0x58,0x8D,0x9C,0x91,0xD7,0x21,0x8D,0x36,0x13,0x5C,0x47,0xFA,0xCE,0xDF, +0x89,0x59,0xF1,0xA4,0x52,0xEA,0x1D,0x46,0x64,0xF6,0x62,0x2C,0x92,0x04,0x1E,0x8D,0xA8,0x14,0x79,0xDC, +0x3C,0x44,0x2E,0xCF,0x83,0x26,0xE8,0x04,0x79,0xDC,0x46,0xFF,0x88,0xE6,0x0E,0x91,0xBD,0x35,0xA1,0x03, +0xE9,0x55,0x5C,0xCC,0x80,0x11,0x93,0xBB,0x09,0x18,0x22,0xB3,0x05,0x50,0x97,0x01,0xA0,0x5D,0xC5,0x16, +0x05,0x7A,0xCC,0xDB,0xD3,0x19,0x48,0xA2,0xD0,0x30,0xA0,0x9B,0xCB,0x52,0x1B,0xED,0x04,0x82,0x1B,0x62, +0x40,0x2B,0xAE,0x75,0x55,0xE2,0xA9,0xA8,0x45,0x80,0xA3,0xDC,0xBD,0x51,0x78,0xFE,0xB9,0xFA,0x68,0x9E, +0xA2,0x1E,0xF8,0x66,0x37,0x81,0x54,0xB6,0xA9,0xC1,0xB6,0x03,0x4C,0x4B,0xE0,0x74,0x7D,0x0A,0xD9,0x03, +0x43,0xD0,0x4E,0x5D,0x23,0xA3,0x69,0x00,0xF9,0x30,0x69,0xFE,0x26,0xA5,0xB6,0x6C,0x47,0xC7,0x15,0x75, +0x56,0x37,0x78,0x4A,0x00,0xCE,0x1D,0x34,0x74,0xE7,0x1B,0x80,0xC4,0x38,0xF2,0x14,0x65,0x21,0x16,0x16, +0x4F,0xAD,0x53,0xB4,0x5D,0xBF,0xEF,0x00,0x69,0x49,0xD2,0xA6,0x0B,0x1A,0x97,0x3C,0xEE,0xCE,0x44,0x41, +0x7D,0xC2,0x8C,0x1C,0x65,0x83,0x09,0x8F,0x7E,0xAB,0x57,0x12,0x0A,0x01,0xEE,0x4A,0x17,0xE9,0xAD,0xD6, +0x84,0xCB,0xA0,0x41,0x72,0x8B,0x04,0xAA,0x7A,0x73,0x08,0xD9,0x1A,0x9A,0x46,0x48,0x6D,0x10,0x49,0x31, +0xA3,0x43,0x35,0xB6,0x7A,0xFC,0xA2,0x1B,0x62,0x89,0x9A,0x48,0x2F,0xD5,0x3E,0xCF,0xE2,0x69,0x42,0xF7, +0x10,0xC8,0x12,0x8B,0x82,0xEE,0x69,0xA8,0xB0,0x65,0x4E,0x86,0xFE,0x35,0xF4,0x9B,0x31,0x88,0x3B,0x20, +0xDC,0xE9,0x45,0x3C,0x6C,0xC2,0xE5,0xD0,0xDB,0x40,0x64,0x0A,0x93,0x21,0x72,0xA6,0x58,0xE1,0x7D,0x95, +0xEA,0xCF,0x15,0xAE,0x4A,0xF7,0x29,0x4A,0xE6,0xC5,0x46,0xC1,0x1C,0x85,0x30,0x18,0x12,0xCB,0x48,0x18, +0x23,0xA2,0xEB,0x2B,0x92,0xCC,0x1C,0x3D,0x69,0x73,0x49,0xCE,0x0F,0xAD,0x11,0x09,0x21,0xF5,0xF4,0xBB, +0x87,0x52,0xFB,0x4A,0xCB,0x52,0xD4,0x95,0x6C,0xC9,0x6B,0x0D,0xEC,0x89,0xA7,0xAF,0x22,0x59,0xC4,0xD0, +0x12,0xBD,0x2E,0x31,0x49,0x50,0x37,0x06,0xC7,0x4F,0xC0,0x10,0xB8,0x75,0x53,0x14,0xFC,0xB2,0x3D,0x72, +0x2F,0x0C,0x41,0xB3,0x1E,0x8E,0x92,0x07,0xB5,0x92,0xFB,0x65,0xE8,0x37,0xCE,0xDC,0x69,0x54,0xEB,0x48, +0xA6,0x59,0x15,0x01,0xAD,0x95,0x95,0xAA,0xD5,0xBC,0x91,0x21,0xF5,0xD9,0xED,0x17,0x46,0x4C,0xEC,0x07, +0x87,0x1E,0x60,0xF4,0x30,0xCC,0x09,0x1F,0x66,0x95,0xE2,0x84,0x16,0x61,0xB0,0x22,0x2F,0x9A,0x61,0x50, +0x36,0xA5,0x6C,0xCF,0x2F,0xCE,0x63,0x05,0xFB,0x78,0x8A,0x21,0x24,0xDE,0x00,0x80,0x0B,0xF4,0xD6,0x37, +0x3A,0x3C,0x8B,0xE1,0x17,0x75,0x0D,0x97,0xD6,0x1A,0x2D,0x9A,0xCF,0x3C,0xA6,0x85,0x67,0xC7,0x19,0x09, +0x94,0xD7,0x8B,0x9C,0x8D,0x1E,0xD8,0xA3,0x1E,0x08,0xB1,0xD5,0xB8,0xD7,0x05,0x50,0x80,0x07,0x83,0x81, +0x8C,0x66,0x51,0xD9,0xD4,0xC8,0x4A,0xD8,0x9A,0x24,0x2E,0xCC,0x96,0xB1,0x27,0xCB,0x86,0x9C,0x26,0x67, +0x8C,0xF7,0x05,0x54,0x6E,0xDE,0xDF,0x6D,0x7A,0x0F,0x50,0x73,0x6C,0xD6,0x48,0x6C,0x81,0x80,0x93,0x25, +0xEC,0x9B,0xC1,0xFE,0x9E,0xE3,0x1E,0x48,0x2B,0xA5,0x66,0x2C,0xBE,0x7C,0x2F,0x17,0x8B,0xB0,0x12,0x15, +0xAF,0x21,0xFA,0x85,0xDA,0x61,0xEA,0x3C,0x6B,0x94,0x58,0x12,0xCC,0x58,0x52,0x6D,0x4C,0xF7,0x1F,0xEC, +0xA8,0x35,0x27,0x82,0xC6,0x35,0x2E,0x17,0x28,0x5C,0xDC,0x9D,0x01,0x03,0xAF,0xA7,0xBB,0x99,0x39,0xFB, +0x9D,0xDC,0x00,0xC4,0x80,0x7B,0x39,0x7B,0xE0,0x78,0x5A,0x20,0x7C,0x42,0x7D,0x81,0x1E,0x42,0xAC,0xA4, +0x77,0x21,0xBB,0x5B,0x81,0x22,0x7A,0x63,0x32,0xF0,0x45,0xF6,0xAC,0xAB,0x1E,0xAC,0x47,0x3A,0x68,0x4B, +0xF2,0x9D,0xCC,0x4B,0x86,0x78,0xCB,0x00,0x12,0x6A,0xAE,0x41,0xCA,0x43,0x4B,0x12,0x52,0xCE,0x1B,0x31, +0x87,0x79,0x0F,0x97,0xB3,0xB1,0x26,0x42,0xAD,0x2F,0xA2,0x6A,0xF3,0xD3,0x10,0xDE,0xF9,0xFF,0xE0,0x27, +0x90,0x88,0x9F,0xC0,0x89,0xF4,0xE2,0x60,0xD7,0x72,0xFF,0x74,0xDA,0xF8,0x91,0x5B,0xF6,0x2C,0x62,0xEE, +0xB4,0xC8,0x0F,0x6F,0x38,0x11,0x41,0x83,0x01,0x40,0x36,0xB5,0x6D,0x29,0x6B,0x26,0x1C,0xB9,0xF7,0xD9, +0x02,0xC2,0x66,0x2A,0xC0,0x67,0x48,0xD7,0x0E,0x01,0x3E,0x8A,0x22,0xD1,0x5D,0xB3,0x41,0x64,0x2B,0x15, +0x88,0x65,0xFA,0x8E,0x1D,0x02,0x70,0x2C,0x4B,0x27,0x15,0xC4,0x60,0x25,0xD1,0x4B,0x76,0xC5,0x2A,0x06, +0x95,0x24,0xC1,0x3A,0x36,0xA1,0x1C,0x62,0xA8,0xB5,0x93,0xA9,0xCE,0x2B,0xD9,0x08,0x3B,0x9E,0x15,0x1C, +0x48,0xC4,0x80,0xD2,0xFA,0x0A,0x52,0x39,0x2C,0x8A,0x74,0x4F,0x97,0x49,0x40,0x16,0xB2,0x49,0xE0,0x62, +0x2C,0x97,0x1C,0xAA,0x08,0x89,0xFA,0x0B,0x14,0x2A,0x29,0x4C,0xD7,0xB1,0x31,0x97,0x25,0x6C,0x72,0xB6, +0xA7,0x00,0xAA,0x18,0x14,0x20,0x64,0x0C,0xB0,0xD6,0x4A,0x7D,0x5B,0x4D,0xBC,0xCB,0x8F,0x0A,0xED,0xF2, +0x39,0x6F,0xFE,0x27,0x3F,0x12,0xBB,0xAF,0x5C,0x9B,0x01,0x06,0x34,0x52,0x81,0xA3,0x38,0x22,0x5B,0xFD, +0x81,0x93,0xDF,0x7C,0xD3,0x90,0xE3,0x40,0x6C,0xCB,0xEC,0x9A,0xF6,0xC4,0x6F,0xA8,0x85,0xC4,0xDC,0xA0, +0xF5,0xA2,0xD0,0x12,0x03,0xA1,0xD2,0x06,0x35,0xCD,0x22,0xD2,0x96,0x4A,0x98,0xF3,0xF0,0x7F,0x2B,0x7C, +0x65,0x50,0x63,0x74,0x7A,0x72,0xB1,0x9C,0xE6,0x28,0x05,0x62,0xF2,0x87,0x49,0x79,0xCD,0x5E,0xB2,0xCA, +0xDA,0xE5,0xAD,0xD7,0x1A,0x8E,0x22,0x85,0xF5,0xDC,0xC6,0xBF,0xAD,0x92,0x00,0xA6,0x71,0xC3,0xFB,0x9B, +0xBF,0xA9,0xD4,0xE4,0x72,0xE5,0xC4,0xBD,0x82,0xE4,0xB4,0xB6,0x70,0x4A,0xD8,0xEF,0x46,0x14,0xDC,0xF4, +0x37,0x53,0x3C,0x81,0xE6,0x10,0xBD,0xA7,0xF1,0xC8,0xB9,0x72,0xC7,0x5E,0xD5,0xE5,0xFA,0x6F,0x35,0xF5, +0x26,0xB9,0xB5,0xB7,0xF0,0x88,0xE2,0xB6,0x29,0x7E,0xDD,0xF5,0xE5,0x70,0xF9,0xFB,0x47,0x74,0x86,0x93, +0xE6,0x93,0xFA,0x33,0x69,0xE8,0x70,0xDE,0x0E,0xD7,0x20,0x65,0xFA,0x5B,0xED,0xC2,0x8C,0xE5,0x5F,0xDE, +0x5A,0xFC,0xC0,0x2E,0x39,0xF4,0xE0,0x49,0xE4,0xC1,0xE0,0x80,0x59,0x95,0x4E,0x9B,0x11,0x15,0x75,0x5C, +0x32,0x3A,0xD3,0x1B,0x8D,0x96,0x20,0xF2,0x64,0xEF,0xE7,0x51,0x4D,0x5F,0xE1,0x23,0x12,0x8D,0x7F,0x68, +0xC7,0xEC,0xBE,0x4E,0x33,0x58,0x1E,0xEC,0xB6,0x75,0xD6,0xEC,0x38,0xE2,0xAB,0x37,0xCA,0x4B,0x5E,0x1B, +0x39,0xC8,0x21,0x05,0x26,0x86,0xE0,0x09,0xF6,0xDB,0xB7,0x1A,0x4B,0x72,0xFF,0x1D,0x47,0x31,0xC7,0x04, +0xA2,0xD3,0xD7,0xED,0xA9,0x63,0xB6,0xAB,0x31,0x20,0xCB,0x9A,0x3A,0x31,0xEA,0x7D,0xD4,0xD6,0x86,0x3D, +0xAD,0x3D,0xDF,0x84,0x78,0xC2,0x64,0xD6,0x1C,0xA6,0xED,0x45,0x42,0x0B,0xE9,0xB3,0xA5,0xAF,0x7E,0xEE, +0xCC,0x7A,0x82,0x93,0x56,0xC1,0xA8,0x40,0x76,0x84,0xE1,0xBE,0xA8,0xAE,0xB8,0x71,0xA6,0x32,0x29,0xDF, +0x37,0x5F,0xF8,0xA7,0xD4,0xC2,0xD1,0x87,0xCC,0xED,0x42,0xFB,0xA5,0xCE,0x1D,0xF5,0x4D,0xE7,0xC1,0x3B, +0x62,0xD3,0xD9,0x97,0x89,0xEC,0x6E,0xA0,0xF1,0xF9,0xAA,0xBD,0xB5,0xA2,0xCF,0xA5,0x8C,0x4D,0xF4,0x66, +0x56,0xE4,0x48,0x2C,0xA4,0xE0,0x5C,0xB4,0x95,0xED,0x58,0x7A,0xBA,0xA9,0xF8,0x89,0x57,0x1A,0xEE,0xBC, +0x04,0xCE,0x69,0x27,0x77,0xA9,0x79,0x73,0x1A,0x4F,0xF5,0x98,0x29,0xE6,0xD6,0xB1,0x7E,0xE5,0x20,0xB5, +0x15,0xEF,0x1F,0x16,0xC4,0x87,0x66,0xFC,0xAA,0x71,0x38,0x0B,0x6C,0x77,0x81,0x09,0xBD,0x22,0xCA,0x22, +0xEB,0x37,0xEB,0x33,0xF9,0x37,0x10,0xF2,0x65,0xC4,0xD2,0x3A,0x92,0xAB,0x85,0x7D,0x9B,0xC3,0x64,0xBE, +0x5B,0x58,0xC3,0x36,0x88,0xD3,0x25,0x8D,0x99,0xE3,0x6A,0xB1,0x69,0x15,0xB2,0x49,0x23,0xA8,0xD4,0x68, +0xE2,0xE7,0x1C,0x1E,0x10,0xA7,0x6D,0xD3,0x19,0x06,0xDB,0xBB,0xEA,0x53,0xA6,0x9A,0x70,0x8A,0x28,0xAC, +0x9C,0xE4,0xD5,0x0F,0xA7,0x05,0x6D,0x4C,0x23,0x49,0x4A,0x49,0xAE,0x72,0x92,0x79,0xBE,0x27,0xC3,0x24, +0x92,0xB0,0xFA,0x7E,0x5F,0x0D,0xEB,0x26,0x2D,0x88,0xC3,0x2D,0xDD,0x55,0x0C,0x93,0xCE,0x12,0xF3,0x6F, +0xDE,0x4E,0xC7,0xC9,0x97,0x87,0x10,0xBD,0x1D,0xA7,0xD4,0xFF,0x85,0x13,0xFB,0x7F,0xDF,0x4D,0x5A,0xB7, +0xA6,0xB4,0x16,0x99,0xD8,0x1B,0x31,0x4A,0x84,0x9D,0xEA,0x3D,0x64,0x5F,0x24,0x62,0xDA,0x9E,0xAE,0xD0, +0xA7,0x15,0x34,0xA3,0x90,0x9E,0x13,0xCD,0xA8,0x25,0xB4,0x61,0x26,0x96,0x93,0x85,0xDF,0x37,0x4A,0xDD, +0x6B,0x64,0xD6,0xF9,0x05,0x2E,0x76,0xBC,0xDE,0x91,0xFA,0x8D,0x7D,0x60,0x3C,0xCC,0x42,0x23,0x0F,0xA8, +0x19,0x58,0x5E,0x48,0x95,0x09,0x47,0x50,0xEA,0x52,0x4E,0x11,0x0A,0x79,0xA9,0x50,0x54,0xA4,0x02,0x56, +0x52,0x11,0x8E,0xD2,0xE7,0x63,0x9E,0x32,0x29,0x5E,0xDC,0xFE,0x55,0x97,0x35,0xB4,0xE8,0xD1,0xDF,0x34, +0x7C,0x1D,0xE3,0xA4,0xD5,0xA2,0xF3,0x47,0xF8,0x56,0xAD,0x46,0xF8,0x1A,0xCA,0x48,0xDC,0x01,0x3B,0xC2, +0x8B,0x78,0xFB,0x73,0xC8,0x42,0xFB,0x8E,0x53,0x98,0x81,0x7F,0xA0,0x78,0x16,0xEC,0x48,0x03,0x80,0xAA, +0x17,0x7D,0xEF,0xDC,0x65,0x42,0xD1,0x63,0x3D,0xB7,0x1E,0x43,0x1C,0x2D,0x9D,0xB1,0xA5,0x52,0xFC,0xE9, +0xAA,0xDA,0x4F,0x05,0x9E,0x6C,0x17,0x56,0xD1,0x41,0x37,0xE9,0x6E,0xAE,0x9A,0x66,0xAF,0x20,0xC7,0x19, +0x41,0xFA,0x9F,0xA5,0x61,0xD6,0x1A,0xBB,0x7A,0xED,0xCA,0x45,0x91,0x11,0xE7,0x3D,0xEC,0x60,0xD6,0x98, +0x0C,0xA9,0xD6,0xEB,0x78,0x87,0x13,0xA8,0xBD,0x82,0x41,0xC0,0xDB,0x49,0x78,0xC5,0x03,0x9F,0x3E,0x13, +0x69,0xBA,0x86,0x25,0x4F,0xA8,0x5E,0x91,0x63,0xC3,0x09,0xEC,0x4F,0xD7,0x47,0x6B,0x8F,0x5C,0x4F,0xDE, +0xA9,0x7D,0x59,0x2C,0x57,0x14,0xE7,0x1C,0xA7,0x3E,0x7D,0xEE,0x90,0xBE,0x3A,0xFE,0x63,0xFE,0xA8,0xC6, +0xC4,0xE6,0xA7,0x21,0xCD,0x4C,0xEE,0x23,0xF1,0x9F,0x30,0xEB,0x20,0x70,0xEE,0xE5,0xD3,0x61,0xFE,0x42, +0xAA,0xE7,0xF8,0x7B,0x1E,0x6C,0x92,0x85,0xD3,0xAA,0x26,0x92,0x71,0x8D,0x79,0x3F,0x06,0xB6,0xF1,0x6A, +0x9B,0x23,0x1B,0xEB,0x72,0xBE,0xF7,0x23,0x7A,0xC6,0x47,0xA3,0xC5,0xEC,0x62,0x12,0x70,0x9C,0x3E,0x01, +0xF7,0x87,0xC8,0x55,0xEF,0x92,0xA0,0x60,0xCA,0x0F,0xFE,0x96,0xF3,0xE3,0x60,0x6D,0xE8,0x41,0xF7,0xCB, +0xE4,0xF8,0x5C,0x19,0x53,0x69,0x55,0x16,0x70,0x05,0xB4,0xB2,0x83,0x8D,0x3A,0x47,0xD2,0x4A,0x51,0x62, +0x95,0x46,0x91,0x71,0x50,0x42,0x13,0x52,0xF5,0xF2,0x91,0x45,0xE0,0x77,0xCF,0x71,0x41,0x44,0x19,0x98, +0xEB,0x26,0xAE,0x9A,0x48,0x02,0xDC,0x3F,0x08,0x87,0xF1,0xDB,0x96,0xE3,0x80,0xD6,0xB3,0x2C,0xCE,0x9D, +0x07,0x83,0xA9,0x07,0xC1,0x82,0xB1,0x42,0x9C,0xB5,0x3E,0x18,0xAD,0x30,0x83,0x7B,0x7B,0x97,0xB1,0x4B, +0x0A,0xBE,0x74,0x21,0x23,0xDC,0xC9,0x92,0xAE,0xC5,0xCC,0xE2,0xAB,0x28,0x2E,0x95,0x1E,0x3D,0x24,0x66, +0x1D,0x8E,0x2C,0x50,0x44,0x96,0xE2,0xB6,0x61,0x14,0xE2,0xDC,0xEF,0xA5,0x95,0x0A,0x09,0x93,0xEC,0x99, +0x79,0xFC,0xFF,0xE5,0xBF,0xDE,0x4C,0x4C,0x68,0xED,0x60,0x9A,0xC9,0x4E,0x17,0x3D,0x87,0x29,0x43,0x5A, +0xEF,0x36,0xC7,0x2D,0x96,0xF9,0x2B,0xEB,0xCF,0x84,0x8A,0x5C,0x7F,0x2C,0x7C,0x18,0x7B,0x07,0xEB,0x55, +0x6E,0x84,0x9C,0x1B,0x88,0xF0,0x78,0x7A,0x5B,0xBF,0x4F,0x28,0xCB,0x33,0x27,0x12,0xEC,0xD6,0x2C,0xD0, +0xD4,0x59,0xB2,0xA2,0xBE,0xCD,0x5C,0x30,0x23,0x32,0xEE,0x90,0xDA,0xE7,0x1D,0x2D,0x02,0x42,0x1C,0x47, +0xBB,0xDA,0xBE,0x31,0x3C,0xBD,0xBF,0x76,0x7A,0x99,0x95,0xE6,0xC4,0xA9,0xBF,0x75,0x53,0xFA,0x37,0x7E, +0x1C,0x7F,0xF3,0x0A,0xDA,0x85,0x8A,0x42,0x65,0xDE,0xFF,0xB1,0x25,0xB6,0x67,0xDA,0xFA,0xA0,0xC8,0x40, +0x20,0x99,0x1A,0x31,0x46,0x3A,0xAC,0xC0,0xF0,0x08,0x2D,0x70,0xF5,0xAA,0x91,0x3E,0xB0,0x38,0x74,0x32, +0xB7,0x93,0x30,0x66,0x3F,0x7D,0x1B,0xCE,0xB0,0x58,0x05,0x48,0x67,0x74,0x15,0xDE,0xEA,0x3A,0xF6,0x87, +0xD3,0x07,0xFA,0x6E,0x57,0xC0,0xB2,0x17,0x12,0xA8,0xFA,0x66,0x02,0xF8,0xDA,0x71,0xB6,0xE4,0x60,0xF9, +0x2B,0x29,0x87,0x7F,0xEA,0xE4,0x44,0xAA,0x83,0x3C,0x31,0x9B,0x13,0xDD,0xDA,0xE6,0x4B,0xE6,0x21,0x82, +0xDD,0xCD,0x89,0x4B,0xED,0xD4,0x36,0x36,0xED,0xED,0xC7,0x51,0xEC,0xB5,0xBC,0xD3,0x65,0x87,0x2F,0x57, +0x8B,0x59,0x17,0x5C,0x18,0x3A,0x71,0x3D,0x40,0x78,0x39,0x6E,0x51,0x90,0x4D,0xBB,0x02,0x3F,0x3A,0xA6, +0x92,0x0F,0x71,0x73,0xDA,0x8B,0x2A,0xB3,0xE0,0xE1,0x30,0x19,0xA8,0xDC,0x16,0xB1,0xA7,0x7A,0xDE,0x9B, +0xED,0x31,0xCA,0xF8,0x44,0x3D,0x00,0xCB,0x7B,0xF2,0xA6,0xD8,0x0C,0x59,0x2F,0x0B,0x2C,0xEB,0xA4,0x8D, +0xB6,0xC5,0x29,0xDF,0x01,0xBB,0x7A,0xF7,0x5B,0xFC,0xCD,0x9A,0xBF,0x33,0x5F,0x5F,0xB2,0xE2,0x6D,0xBF, +0x79,0xA3,0x00,0xBF,0xFD,0x64,0xE0,0x12,0xF7,0x3D,0xF0,0x98,0xEF,0xBC,0x97,0x15,0x2F,0x65,0x1D,0x68, +0xA1,0xBC,0x84,0x89,0x04,0xF1,0xA9,0x20,0xFF,0xB4,0x90,0xB8,0xD1,0x55,0x80,0xC9,0xE8,0x15,0x39,0x02, +0xDE,0x7F,0x1C,0x4D,0x70,0x25,0xB5,0xD2,0x24,0xE2,0x8B,0xCC,0x67,0xA3,0x96,0xD4,0x57,0x89,0xA5,0x21, +0x65,0xB3,0x9C,0x28,0xAE,0xB7,0xC1,0x05,0x2A,0x36,0xE0,0xFF,0xB0,0xEA,0x98,0x4A,0xF6,0x2B,0x08,0xE0, +0x64,0x76,0xCE,0x93,0x50,0x9E,0x40,0x90,0xD3,0x43,0x47,0x72,0xCB,0x8D,0x67,0x10,0xB8,0x49,0x86,0x70, +0xB6,0x36,0x21,0x7C,0x8E,0xEA,0xE3,0xBD,0x4B,0x3B,0x4B,0x81,0x44,0xC2,0xFD,0x18,0xBE,0x0D,0xCE,0xC4, +0xEC,0x21,0x56,0xD3,0x8D,0x77,0x33,0x6E,0x45,0xC4,0x87,0x70,0x76,0x18,0xA0,0x08,0x1C,0x75,0x10,0x35, +0x63,0xA8,0xB2,0xEC,0xDE,0xCB,0xCA,0x0A,0xD3,0xEA,0xD9,0x0A,0xC0,0x75,0x3A,0xD9,0x1F,0x5C,0x52,0xF8, +0xCB,0x3C,0xD2,0x21,0xD9,0x3D,0x3C,0x6B,0xCC,0x5A,0xCB,0xCD,0x1A,0x5F,0xD0,0xD0,0xB3,0xCA,0x04,0x2E, +0x51,0xE6,0x90,0x44,0xA9,0xC9,0xAF,0x58,0x1C,0xA5,0xAB,0xB9,0x4D,0x48,0x1F,0x2C,0x51,0x2D,0xE2,0xBB, +0xCC,0xCC,0x22,0xC7,0x12,0xEE,0xB7,0x88,0xCC,0x84,0x26,0xFD,0xFF,0x33,0xDC,0xAB,0xE7,0xDD,0x93,0x20, +0x9E,0xA0,0x1A,0xDE,0x0E,0x8F,0xA8,0xDA,0x83,0xA9,0x59,0xB8,0x6A,0x21,0x26,0x1E,0x98,0x95,0x2C,0x9B, +0xCA,0xC1,0xC9,0x52,0x21,0x33,0x15,0x69,0x0A,0x99,0x54,0x1D,0x3E,0x02,0x3A,0x87,0x85,0x65,0x85,0x78, +0xBC,0xAF,0x32,0xE0,0xDB,0x3D,0x96,0x82,0xB1,0xA6,0x0C,0xDE,0x45,0x90,0xF5,0x60,0xE6,0xF3,0xD7,0xB5, +0x84,0x6E,0xF2,0x99,0x31,0xFF,0x04,0x4E,0xE5,0x2A,0xD4,0x74,0xF3,0x04,0xF5,0x07,0xF7,0xC3,0x04,0x9D, +0x28,0x06,0x99,0x87,0x19,0xD9,0x56,0x5C,0x8B,0xF2,0x0B,0x32,0x21,0x37,0xCC,0x37,0x63,0x0C,0x6D,0x4A, +0xA5,0x4C,0x2D,0xA9,0x83,0x07,0xC7,0x81,0x6E,0xB0,0xDC,0x96,0x3E,0xF6,0x4B,0xBD,0x8D,0x40,0xBA,0x1A, +0xFE,0x0F,0x6C,0xD4,0x75,0xC8,0x79,0x54,0xFE,0x3A,0x3D,0x34,0xF5,0xD6,0xA5,0x40,0x71,0x3D,0x27,0xC3, +0xAE,0x3D,0x68,0xF1,0x57,0x19,0xD2,0xF8,0x8D,0xA2,0xDD,0x63,0xB3,0xEC,0x75,0x97,0x62,0x04,0xD5,0x28, +0x5E,0xC6,0x9E,0x08,0x13,0x00,0x3D,0x73,0xC6,0x1D,0x76,0x8D,0x2A,0x02,0x79,0x8E,0xBF,0xB6,0xF6,0x4E, +0x40,0x25,0x61,0xDD,0x19,0x4C,0x91,0x78,0x31,0x9D,0xF4,0x1E,0x41,0x16,0xAE,0x7D,0x49,0xB7,0x41,0xCD, +0xDE,0x9A,0x6A,0xF5,0x0F,0xFF,0x47,0xB0,0x98,0x65,0xBC,0xCB,0xE8,0xB6,0xCF,0x9D,0x94,0xF7,0x43,0xBF, +0x22,0x99,0x0F,0x6F,0x03,0x68,0x7F,0x84,0xE5,0xB7,0x44,0xC0,0x9D,0xF9,0x66,0x80,0x27,0x50,0x4A,0x51, +0x3D,0xCC,0xC1,0x55,0xED,0xD2,0x36,0x07,0x65,0xBD,0x60,0xDF,0x26,0x51,0x2E,0x2A,0x6F,0x1D,0x41,0x8A, +0xEF,0xC2,0x52,0xBC,0xFC,0x40,0xD1,0xCB,0xA7,0x52,0x38,0x21,0xC9,0xBE,0x97,0xD4,0xCA,0xB0,0x1B,0x6F, +0x02,0xDE,0xE3,0xDE,0xA6,0x53,0x7A,0xDD,0x0A,0xB9,0xC0,0x8B,0x6F,0xC9,0xD5,0x2F,0x5C,0x77,0x01,0xF3, +0xCA,0xAB,0x34,0x23,0xB1,0x4C,0xB4,0xD0,0x00,0x4F,0x2F,0xC6,0xD2,0x1C,0xAF,0x27,0x6A,0xA4,0x77,0x6A, +0x63,0x4D,0x20,0x60,0x45,0x4E,0x98,0x34,0x51,0x61,0x66,0x09,0x54,0xC7,0x45,0xF9,0x90,0x93,0x81,0xA3, +0xE2,0xB0,0xB0,0xA1,0xC2,0xB9,0xA9,0xE0,0x61,0x83,0x4D,0x6A,0x9F,0xDC,0x79,0x91,0x9B,0xC8,0xA3,0xB7, +0x4C,0xE7,0x4C,0x47,0xA3,0x8C,0x63,0xA6,0xF2,0xA5,0xC0,0x26,0x2A,0x5F,0xF0,0x75,0xB3,0x62,0x11,0xD6, +0xA4,0x44,0x9A,0xB6,0xE4,0x5E,0x5C,0xF4,0x76,0x5D,0xC5,0x0B,0xF4,0x24,0x45,0xA3,0xA6,0x8B,0xC1,0xBA, +0x7B,0x29,0x77,0x17,0x39,0xBD,0xF8,0x2F,0x71,0x7D,0x66,0x2E,0x5A,0x9B,0xCD,0x51,0x97,0x75,0x99,0x0C, +0xD1,0xCA,0x26,0x84,0x70,0x27,0xAA,0x82,0x9C,0x9C,0x12,0x6E,0x5B,0xF7,0x16,0xCA,0xCA,0x4B,0xEA,0x08, +0xD9,0x65,0x49,0xDE,0x9B,0x0A,0xF2,0x38,0xB8,0xA3,0x62,0xBA,0x6B,0x9B,0xB2,0x3A,0xD8,0x67,0xA6,0x12, +0xE3,0x7E,0xFB,0x6F,0xD9,0x6A,0xD4,0x4B,0x89,0x6A,0xBB,0xCF,0x59,0x0E,0xE8,0xE2,0xF6,0x0B,0xF4,0xFF, +0x38,0xA3,0x21,0xDB,0x4B,0x03,0xC5,0xFF,0xCB,0x29,0xF9,0x12,0x0C,0x57,0xF8,0xB6,0xE1,0x57,0x2C,0x9D, +0x79,0x68,0xEC,0x44,0x5C,0x7E,0xE3,0x26,0x9E,0x4F,0xB3,0xD8,0x5D,0xA3,0x81,0x8E,0xCE,0x8D,0x65,0x9E, +0x7F,0x20,0xC0,0x06,0x77,0x72,0x83,0xA1,0xF6,0x11,0xA9,0x2F,0xDE,0x55,0x64,0x13,0x79,0x0B,0x92,0x45, +0x06,0xF2,0x16,0x64,0xAC,0x58,0xF3,0xE9,0xF8,0x2B,0xC9,0x7D,0x64,0x7D,0x3B,0x7E,0x95,0xBF,0x35,0x66, +0x47,0x34,0x77,0x60,0x32,0x56,0x0B,0xC4,0x50,0x8D,0x32,0x96,0xDE,0x7F,0xD7,0x94,0x37,0x7A,0x04,0x34, +0x02,0x8E,0x20,0x90,0x8F,0x31,0xA5,0x70,0x2C,0x12,0x5A,0x25,0xCB,0x52,0x3B,0xF2,0x41,0xEB,0xCD,0xB5, +0xF6,0x09,0x6A,0xD1,0xE9,0xBE,0x19,0xD2,0x50,0xC5,0x0A,0x35,0xC4,0xB2,0x5F,0xF3,0xBD,0x31,0xBF,0xFC, +0x24,0x5D,0x73,0x2C,0x16,0xC9,0xC7,0x13,0xE6,0xD9,0x95,0xDB,0x87,0x7B,0xCB,0xED,0xDC,0xC5,0x73,0x4A, +0xCC,0x74,0x64,0x0F,0x47,0x17,0x63,0x64,0x52,0x25,0xD3,0xB3,0x01,0x9D,0x69,0x5B,0xB3,0xB6,0x07,0xB7, +0x09,0x32,0x61,0x9A,0x51,0x37,0xBE,0xDD,0x12,0xCC,0x12,0xD5,0x97,0x59,0xC3,0xB6,0x94,0x20,0x9F,0x95, +0xAB,0xF6,0xA6,0x76,0xD1,0xE7,0x79,0xFE,0xEE,0x3E,0x2E,0x52,0xE5,0xAE,0x4B,0xCB,0xFA,0xB4,0x86,0x45, +0x4A,0x79,0x31,0x7E,0x4E,0x3D,0xB1,0xE6,0x90,0x85,0xA4,0x3E,0xB0,0x55,0x97,0x4F,0xB8,0x1C,0xA7,0x39, +0x1B,0x5F,0x5F,0xBD,0x35,0xC7,0xC5,0x5D,0xFC,0x75,0x77,0x1D,0xB4,0xF3,0x50,0x35,0xCA,0x3F,0x18,0xBB, +0x7E,0xA7,0xE7,0x42,0x8E,0x39,0xEC,0x35,0xDB,0x67,0x86,0xF3,0x32,0x50,0x89,0x68,0x55,0xBD,0x56,0x0C, +0x7C,0x3C,0x93,0xA8,0xFF,0xDE,0x21,0x2C,0x6B,0x32,0x47,0xC2,0x06,0x1F,0xDD,0xF8,0x40,0x7F,0xA5,0xBB, +0x51,0x5E,0xEF,0x0F,0x38,0x36,0x09,0xA8,0xD2,0xEB,0x18,0xBB,0xDA,0x4C,0xE8,0x6C,0x7B,0x0C,0xAF,0x9D, +0x40,0x32,0x07,0x16,0x23,0xBE,0x8F,0x74,0xBF,0x3D,0x48,0xC0,0x82,0x75,0xA4,0xE4,0x30,0xAF,0xFA,0xD2, +0x48,0xCF,0xB0,0xA2,0x52,0x9B,0xE8,0xE2,0xA8,0xDD,0xE2,0xE8,0xB6,0xAC,0x99,0xCF,0x04,0xC7,0x82,0xD4, +0xD7,0xC9,0xB1,0x4C,0x79,0xFE,0xC1,0x43,0x9B,0xAF,0x0B,0xDC,0xC2,0xB9,0x8E,0xA5,0xD5,0x85,0x96,0x5D, +0x30,0x78,0xE3,0xEC,0x36,0xE2,0x17,0x4F,0x24,0xCC,0x1D,0x55,0x94,0xC3,0x85,0xBD,0xF3,0xD2,0xBD,0x4E, +0x25,0xA4,0x8A,0x24,0x4E,0x6F,0x48,0xD6,0xA1,0xBB,0xD3,0xC8,0x06,0xE5,0xB8,0xC2,0xE2,0xAA,0x7C,0x82, +0xAC,0x14,0x19,0x52,0x64,0x51,0x9A,0x04,0x7B,0x30,0x21,0xD2,0xC9,0xA0,0x2F,0x62,0xE2,0x1D,0x5D,0x1C, +0x48,0x7B,0x85,0x51,0x8F,0xEB,0x5D,0x28,0x34,0xE6,0x07,0x75,0x26,0x44,0x41,0x30,0x15,0x35,0x22,0xF4, +0x2E,0x38,0xC2,0x4E,0x32,0xA7,0x86,0xF5,0xBF,0x89,0xCA,0xEC,0xDF,0xE6,0xBF,0xE5,0x0B,0x02,0xE0,0xE5, +0xBE,0xE8,0x45,0xB8,0x88,0x8A,0xC2,0xFC,0xFC,0xAA,0xE4,0xE3,0xBC,0xC7,0xC3,0x4E,0x18,0xA7,0xEC,0xD4, +0x2D,0x15,0x13,0xED,0x50,0xE4,0x97,0x40,0x70,0x37,0xCB,0x1D,0xFF,0x20,0x03,0xC1,0x34,0xA7,0xDB,0x6C, +0x58,0xE6,0x2A,0x21,0x2A,0x79,0x4E,0xA7,0x61,0x41,0x5C,0x99,0xC2,0xC1,0xBA,0xFF,0x6D,0x58,0x9E,0x66, +0x09,0xC4,0xCC,0xB6,0xBC,0xEF,0x72,0x6A,0x1B,0x1A,0xA4,0x9C,0x5B,0x50,0x3E,0x39,0x79,0x05,0xBA,0xB3, +0x58,0x2C,0x0C,0x14,0x43,0x78,0x4B,0x94,0x9E,0xA1,0xAE,0x24,0x2C,0x04,0x32,0xC0,0x9E,0xCF,0xF9,0x14, +0xAC,0x6C,0x9B,0xD1,0xEF,0xAD,0xDB,0x06,0x4B,0x92,0xFB,0x26,0x0B,0xA0,0x8F,0xFD,0x40,0x0B,0x74,0xFA, +0xD9,0xB1,0x7C,0x9B,0x86,0x97,0x88,0x6B,0xB4,0xF3,0xC3,0xCC,0x07,0x1D,0xE3,0xD1,0x73,0xAA,0x7C,0x16, +0x01,0x94,0x25,0x73,0xA3,0x69,0x35,0x53,0x59,0x23,0x6E,0xA5,0x8B,0x1A,0x7D,0x8A,0x87,0x23,0x27,0x5F, +0x86,0x74,0xC6,0xAC,0x61,0x7C,0x29,0xC8,0xD4,0x11,0x43,0x6B,0x9B,0x9D,0x96,0xDE,0x76,0x4F,0xBF,0xF1, +0x56,0x2E,0xB3,0xD7,0x70,0x9F,0xF9,0x21,0xA3,0x18,0xEC,0x14,0xB4,0xF3,0x84,0xFA,0x8E,0x84,0x09,0x84, +0xD4,0xF3,0xA0,0x4E,0x4F,0xA5,0xE1,0xC5,0xB2,0x4D,0x2C,0x9E,0x0F,0xE7,0x5D,0xC3,0x74,0xFE,0x3B,0x7B, +0x4C,0xF3,0x5A,0xF3,0x84,0x8E,0x85,0xD7,0x7A,0x6A,0xF5,0x59,0x56,0x7D,0x24,0xF8,0x8F,0x9C,0x1D,0x68, +0x2C,0x45,0x92,0xC8,0xE1,0xBA,0xEF,0x38,0xD9,0x07,0xEE,0x62,0x7B,0xDB,0x24,0x1A,0xBF,0xC5,0x41,0xC8, +0x43,0x46,0x46,0xD8,0xF2,0x7F,0xA3,0x7B,0xA4,0x95,0x5F,0x67,0x39,0xF8,0x48,0x8C,0x4D,0x6B,0xEE,0x29, +0x59,0x0B,0x34,0x7C,0x2F,0xD3,0x73,0xE1,0x1E,0xDE,0x98,0xBD,0x39,0xBF,0xFD,0xFF,0xAD,0xFD,0x5E,0x35, +0xC7,0x7F,0x5E,0x31,0x7D,0x4C,0xDB,0xB1,0x93,0x60,0x0D,0x0C,0xDF,0x76,0x38,0x6E,0xC4,0xF9,0xA4,0xC3, +0x1E,0x7D,0xE4,0xCA,0x98,0x7C,0x8F,0x80,0xDC,0x98,0xF2,0x38,0x2A,0x13,0xFF,0x4E,0xE0,0x43,0x5C,0x95, +0x3F,0x73,0x70,0x0D,0x7C,0xF6,0xD0,0x39,0x2F,0xD2,0xB6,0xC8,0xD8,0x9F,0x47,0xA5,0x52,0x03,0x40,0x1D, +0xDB,0xFF,0x60,0x5F,0xE3,0x0F,0x7B,0x81,0x1E,0x42,0xEF,0x52,0x36,0x9F,0xF8,0xE6,0xD4,0x6E,0x70,0x92, +0xDC,0x5E,0x33,0x8F,0xB2,0xD1,0x70,0xF2,0xC7,0xB4,0xF8,0x37,0x4C,0x6C,0x61,0x5E,0x3F,0xFF,0xCB,0x98, +0x6B,0x4E,0xBE,0xF1,0x33,0xBE,0x35,0xE7,0x71,0x21,0x36,0xF3,0x03,0xFF,0x7E,0x83,0x24,0x62,0x89,0x73, +0x60,0x4F,0x81,0x30,0xD5,0x08,0x27,0xBF,0xF7,0x92,0xE4,0xBD,0x93,0xDF,0xAB,0x27,0x4C,0x4B,0x5D,0x94, +0x5E,0x6B,0xAF,0xAF,0xF2,0xD3,0x94,0xFD,0x15,0x1E,0xD8,0x98,0xAC,0xB8,0xA0,0x50,0xB2,0xBA,0xBA,0x65, +0x0F,0xBB,0xA0,0xB9,0x0E,0x66,0xD6,0xDE,0xD6,0x69,0xB1,0x25,0xC7,0xEB,0xB2,0x75,0x0C,0x05,0x2E,0xA8, +0x91,0xFC,0x99,0x3C,0x03,0x4A,0x62,0x45,0xD3,0x25,0x7F,0x2C,0x8A,0xF4,0xDB,0x47,0xBD,0xA8,0x6A,0x6A, +0xC4,0x44,0xDD,0xAE,0x9D,0x56,0xB7,0xE8,0x01,0x06,0xD3,0x57,0xBC,0x47,0x72,0xB8,0x4F,0xA9,0x1A,0x08, +0xCC,0x2B,0x7A,0xEB,0x0A,0x02,0x7B,0x89,0xAF,0x15,0xB3,0x6B,0x4B,0xE1,0xAB,0xDF,0xF9,0x0A,0x9B,0xF1, +0xFE,0xC6,0xE9,0x15,0x98,0x3B,0x57,0xFB,0x4A,0x45,0x46,0x14,0xFD,0xC0,0xF5,0x49,0x87,0x0A,0x37,0xC8, +0x4B,0x3C,0x29,0x4F,0xEB,0xF3,0x1F,0x5E,0xAC,0x1D,0x59,0x4B,0xD4,0xBC,0x10,0x13,0x99,0x2E,0x62,0x87, +0x78,0x64,0x61,0x4C,0x2B,0x2F,0x4B,0x7F,0x2B,0xA1,0x03,0x2D,0x9A,0x6E,0xE7,0x0B,0x3D,0x2B,0x2D,0x49, +0x3B,0xB1,0xAB,0x66,0x7F,0x9E,0x4F,0x2F,0x38,0x2C,0xDB,0xF1,0xAE,0xCA,0x16,0x4F,0x2D,0x6D,0xA4,0xF3, +0x83,0x93,0x14,0x24,0x1E,0xB2,0xAB,0x42,0x44,0x56,0xCE,0x86,0xD3,0x31,0x34,0x6A,0x8D,0x1C,0x96,0xAE, +0x02,0xD4,0x7C,0xF0,0x87,0x5C,0xC6,0x94,0xD2,0x30,0xB0,0x72,0x2C,0x53,0x95,0x21,0xBA,0x70,0x1D,0x16, +0x01,0x5D,0xCF,0x8E,0x53,0x17,0xE1,0x03,0xB1,0x8E,0x35,0x27,0xA1,0x53,0x57,0x4F,0x42,0x5E,0x5D,0x5C, +0x17,0x34,0xC4,0x42,0x94,0x05,0xC8,0xBF,0x93,0xBC,0xAB,0x9A,0x14,0x8B,0x2B,0x06,0x56,0xAF,0xB7,0xF7, +0x82,0xEA,0x73,0x9B,0x00,0x1C,0x7C,0x62,0xE3,0x5D,0xDD,0x0D,0x38,0x35,0x85,0x49,0x5E,0x1B,0xC1,0x27, +0x96,0x4A,0xC5,0xA6,0x17,0xDF,0xF5,0x18,0xD0,0x0D,0xDD,0xF1,0xF9,0x15,0x0D,0x5D,0xC5,0x4A,0xDD,0xF3, +0xAF,0x3B,0x00,0x85,0x52,0x88,0x1C,0x8A,0xEA,0x1C,0x6E,0x28,0x1C,0x23,0x5C,0xB5,0x29,0x50,0x14,0xDF, +0x17,0x73,0x50,0x28,0xA1,0xB2,0x1E,0xEE,0xBB,0x45,0xA5,0x5A,0xC5,0xA4,0x5E,0x4C,0xB1,0x3B,0x97,0x0D, +0xE1,0x16,0x31,0xEB,0xF8,0x75,0x6F,0x2B,0xE9,0xDD,0x94,0x5C,0x97,0x85,0x59,0xDB,0xD2,0x19,0xAC,0x7F, +0x8A,0x2C,0x67,0x9D,0x8A,0x7B,0x42,0x9B,0xFF,0x32,0xAA,0x20,0x84,0x51,0x06,0x81,0xFA,0x7C,0x6C,0x77, +0x95,0xD1,0x62,0x8E,0xD6,0x80,0x54,0xDA,0xE9,0x39,0xA9,0x9C,0x7B,0xC0,0x1E,0xC7,0x63,0x31,0x4E,0x78, +0x70,0x33,0x25,0xF1,0xB8,0x53,0x86,0x29,0x47,0x50,0xB4,0x17,0xCE,0x30,0xAF,0xCA,0x07,0x71,0x47,0xDD, +0x24,0x5E,0xA8,0x22,0x9F,0x53,0x77,0x3B,0xEB,0xF4,0x00,0x09,0x8C,0x3F,0xDB,0x71,0x37,0x54,0x60,0x6E, +0x5B,0xE2,0x90,0xE0,0xC8,0xCE,0x7B,0x24,0x3F,0x1A,0x20,0x17,0xF9,0x9A,0x38,0x64,0x13,0xBA,0x58,0x72, +0xEB,0x4C,0x67,0xD0,0x45,0x6A,0x59,0x87,0xB3,0x74,0xFF,0x72,0x13,0x90,0x49,0xE1,0x65,0x81,0xB1,0xCF, +0xA9,0x69,0xB9,0x6C,0x08,0x55,0xA9,0xE7,0x9D,0xAC,0x41,0xB1,0xC4,0x84,0x46,0xD1,0x34,0xF8,0xD7,0x7B, +0x22,0x09,0x1F,0xBD,0x94,0xA7,0x8B,0x53,0x75,0x7B,0x0E,0x42,0x50,0x9E,0x16,0x54,0xE6,0x56,0x78,0xD4, +0x1E,0x18,0xD4,0xE9,0xB6,0x4C,0xBE,0xA7,0x1C,0x4F,0x1A,0xDA,0x7B,0x37,0x65,0xB7,0x9E,0xA9,0x4B,0xC6, +0x35,0x3B,0xD5,0xE3,0xC4,0x3D,0x17,0x54,0x26,0x16,0xD1,0x87,0x60,0xA8,0x59,0x99,0xA4,0xC3,0x69,0xF3, +0xC8,0xC3,0x2A,0x1A,0xF1,0x5E,0x1F,0x8A,0x2F,0xEA,0x0A,0x7A,0x44,0xC7,0x2A,0xC8,0x6F,0x42,0xBA,0xEB, +0xAE,0xC9,0xA2,0xE1,0xBC,0xA8,0x0A,0xD8,0xCF,0xC1,0xFB,0x9E,0x19,0xF9,0xDC,0x2F,0xF3,0x8A,0xF3,0xF0, +0x67,0xAC,0x0B,0xFB,0x90,0x42,0x4B,0x0B,0x5E,0xE9,0x19,0x2B,0x8F,0x24,0x93,0xF4,0xE2,0xAB,0x4B,0x45, +0x6E,0xAE,0xE1,0x14,0x7E,0x8E,0x19,0x31,0x2D,0xA3,0x56,0x2C,0x5D,0x73,0x13,0x4E,0xD3,0x71,0x32,0xE6, +0x29,0xBD,0x33,0x41,0xAA,0x0F,0x8A,0x1F,0xEA,0xA0,0x7A,0x83,0x13,0x8F,0x9A,0xCB,0x3B,0x66,0xCC,0x31, +0x53,0xCF,0x23,0x02,0x7A,0xEF,0xDE,0x97,0xCE,0x55,0x42,0x41,0x6A,0xAF,0x93,0x3D,0xE4,0x80,0xA1,0xA4, +0x3C,0xA9,0x3D,0xC1,0x32,0xBE,0x7D,0x9D,0x73,0x64,0x7F,0x2D,0x22,0x58,0x5C,0xC0,0x6A,0xA0,0xF4,0x4A, +0x64,0xAD,0x6F,0x82,0xF6,0xF8,0x52,0xDB,0xD9,0x32,0x54,0x9E,0x92,0xFD,0x65,0x36,0x47,0x2E,0xB4,0x81, +0xD4,0x9D,0xAE,0x90,0x07,0x8A,0x5D,0x8F,0x13,0xA2,0x4D,0xD0,0xFF,0x90,0x03,0xC5,0x03,0xF4,0x9E,0x23, +0xA1,0x60,0xB9,0x13,0xF0,0xC3,0x42,0x31,0xE4,0x2C,0x5E,0xF0,0x2B,0xFB,0xC8,0xE6,0xA9,0x96,0xDB,0x59, +0xC9,0xF5,0xD2,0xE3,0x66,0xDA,0x74,0x13,0x93,0xF2,0x04,0xAD,0x05,0x98,0x51,0xB6,0x73,0xC7,0x94,0xEF, +0x86,0x7A,0x9C,0xA5,0x81,0xFA,0xD2,0xC2,0x2B,0x9A,0x42,0xC1,0x62,0xD2,0x1D,0x65,0x1A,0x97,0xDB,0xA1, +0x0B,0xF9,0x6B,0xCE,0x59,0x97,0xD2,0x35,0x1B,0xB3,0xA3,0x1B,0x90,0x18,0x6D,0x75,0xF6,0x90,0xD7,0x4D, +0x2E,0x6D,0x36,0xCC,0x9D,0xB4,0x0E,0x8A,0xCD,0xE7,0x32,0x69,0xFC,0xD8,0x91,0x4A,0x21,0x90,0xC6,0x6F, +0xBE,0xA9,0xC1,0x4A,0x9C,0x28,0x52,0xC1,0xA7,0x24,0x23,0xCC,0x2D,0x94,0x03,0xCD,0x38,0xB6,0xE8,0xAB, +0xC8,0x57,0x1B,0x6F,0x5F,0xBB,0xAA,0x6B,0xA1,0x6A,0x6F,0x72,0x9A,0xB5,0xFF,0xDF,0xC3,0xD6,0xDC,0xFF, +0xB1,0x06,0x62,0xD6,0xAD,0x92,0x18,0xEA,0xBC,0x10,0x16,0xAA,0xD0,0xD3,0xCE,0x11,0x9F,0xF3,0x91,0x2A, +0xD8,0x6C,0xB7,0x52,0x9A,0x3D,0xEE,0x7E,0x2A,0x05,0x28,0xCE,0x9E,0xF2,0x87,0xF4,0x8A,0x13,0xCB,0xAD, +0xFE,0xB1,0x75,0x09,0x69,0x8B,0x48,0x0D,0xDA,0xF8,0xAF,0xBF,0xC3,0x92,0x17,0xFB,0x3D,0xB7,0x82,0xD5, +0x4C,0x44,0x4B,0x0F,0x00,0xF0,0x90,0xFD,0x10,0x06,0x7F,0xFB,0xEF,0xDF,0xEF,0xDF,0xBF,0xBF,0x6F,0xDB, +0xAF,0x9F,0x88,0xF2,0x25,0x4D,0x77,0xEB,0xEE,0xDE,0xE7,0xCF,0xBE,0xBE,0x67,0xCB,0xAE,0x9E,0x0D,0x66, +0x21,0x8A,0x7E,0xFA,0x6F,0xDD,0xEE,0xDE,0x3F,0xBD,0x6E,0xDA,0x2F,0x9D,0xD9,0x56,0xE2,0x13,0x76,0xEA, +0x6E,0xDC,0xE6,0xCE,0x3E,0xBC,0x66,0xCA,0x2E,0x9C,0xBF,0xBF,0xFD,0xFB,0x3F,0xBB,0xED,0xDB,0xAF,0x9F, +0xBD,0xBB,0x2F,0x9B,0xAD,0x9B,0xB7,0xAF,0xFC,0xFA,0x37,0xAB,0xEC,0xDA,0xA7,0x8F,0xBC,0xBA,0x27,0x8B, +0xAC,0x9A,0xBE,0xBE,0x7D,0xF9,0x3E,0xBA,0x6D,0xD9,0xAE,0x9E,0x3D,0xB9,0x2E,0x9A,0x2D,0x99,0xB6,0xAE, +0x7C,0xF8,0x36,0xAA,0x6C,0xD8,0xA6,0x8E,0x3C,0xB8,0x26,0x8A,0x2C,0x98,0xE5,0xE0,0xE4,0x47,0x7D,0xF3, +0xE7,0xD7,0xED,0xD7,0xB7,0xB7,0x6D,0xD3,0xA7,0x97,0xA2,0x15,0x0F,0x1A,0x75,0xE3,0xE6,0xD6,0xE5,0xC7, +0xB6,0xB6,0x65,0xC3,0xA6,0x96,0x93,0xA9,0x94,0xAA,0x7C,0xF2,0x67,0xD5,0xEC,0xD6,0x37,0xB5,0x6C,0xD2, +0x27,0x95,0x0B,0x3D,0x68,0xF4,0x74,0xE2,0x66,0xD4,0xE4,0xC6,0x36,0xB4,0x64,0xC2,0x26,0x94,0xBD,0xB7, +0xF5,0xF3,0x3D,0xB3,0xE5,0xD3,0xAD,0x97,0xB5,0xB3,0x2D,0x93,0xA5,0x93,0xB5,0xA7,0xF4,0xF2,0x35,0xA3, +0xE4,0xD2,0xA5,0x87,0xB4,0xB2,0x25,0x83,0xA4,0x92,0xBC,0xB6,0x75,0xF1,0x3C,0xB2,0x65,0xD1,0xAC,0x96, +0x35,0xB1,0x2C,0x92,0x25,0x91,0xB4,0xA6,0x74,0xF0,0x34,0xA2,0x64,0xD0,0xA4,0x86,0x34,0xB0,0x24,0x82, +0x24,0x90,0xFB,0x7F,0xDF,0xEF,0x7B,0x7B,0xCF,0xCF,0xEB,0x5F,0x9F,0xAF,0x6B,0x5B,0x8F,0x8F,0xF3,0x6F, +0xDE,0xEE,0x73,0x6B,0xCE,0xCE,0xE3,0x4F,0x9E,0xAE,0x63,0x4B,0x8E,0x8E,0xFA,0x7E,0x5F,0xED,0x7A,0x7A, +0x4F,0xCD,0xEA,0x5E,0x1F,0xAD,0x6A,0x5A,0x0F,0x8D,0xF2,0x6E,0x5E,0xEC,0x72,0x6A,0x4E,0xCC,0xE2,0x4E, +0x1E,0xAC,0x62,0x4A,0x0E,0x8C,0xBB,0x3F,0xDD,0xEB,0x3B,0x3B,0xCD,0xCB,0xAB,0x1F,0x9D,0xAB,0x2B,0x1B, +0x8D,0x8B,0xB3,0x2F,0xDC,0xEA,0x33,0x2B,0xCC,0xCA,0xA3,0x0F,0x9C,0xAA,0x23,0x0B,0x8C,0x8A,0xBA,0x3E, +0x5D,0xE9,0x3A,0x3A,0x4D,0xC9,0xAA,0x1E,0x1D,0xA9,0x2A,0x1A,0x0D,0x89,0xB2,0x2E,0x5C,0xE8,0x32,0x2A, +0x4C,0xC8,0xA2,0x0E,0x1C,0xA8,0x22,0x0A,0x0C,0x88,0xF9,0x77,0xD7,0xE7,0x79,0x73,0xC7,0xC7,0xE9,0x57, +0x97,0xA7,0x69,0x53,0x87,0x87,0xF1,0x67,0xD6,0xE6,0x71,0x63,0xC6,0xC6,0xE1,0x47,0x96,0xA6,0x61,0x43, +0x86,0x86,0xF8,0x76,0x57,0xE5,0x78,0x72,0x47,0xC5,0xE8,0x56,0x17,0xA5,0x68,0x52,0x07,0x85,0xF0,0x66, +0x56,0xE4,0x70,0x62,0x46,0xC4,0xE0,0x46,0x16,0xA4,0x60,0x42,0x06,0x84,0xB9,0x37,0xD5,0xE3,0x39,0x33, +0xC5,0xC3,0xA9,0x17,0x95,0xA3,0x29,0x13,0x85,0x83,0xB1,0x27,0xD4,0xE2,0x31,0x23,0xC4,0xC2,0xA1,0x07, +0x94,0xA2,0x21,0x03,0x84,0x82,0xB8,0x36,0x55,0xE1,0x38,0x32,0x45,0xC1,0xA8,0x16,0x15,0xA1,0x28,0x12, +0x05,0x81,0xB0,0x26,0x54,0xE0,0x30,0x22,0x44,0xC0,0xA0,0x06,0x14,0xA0,0x20,0x02,0x04,0x80,0xE0,0xEF, +0x90,0xC0,0x5F,0xF9,0xEB,0x5F,0xCF,0xDD,0xBB,0x3F,0x4F,0xD9,0xAB,0x1F,0xAE,0x90,0x98,0x15,0x57,0xE9, +0xEA,0x5E,0xC7,0xCD,0xBA,0x3E,0x47,0xC9,0xAA,0x1E,0xFC,0x95,0x79,0x03,0x5E,0xF8,0x6B,0x5D,0xCE,0xDC, +0x3B,0x3D,0x4E,0xD8,0x2B,0x1D,0x51,0x37,0x7A,0x7C,0x56,0xE8,0x6A,0x5C,0xC6,0xCC,0x3A,0x3C,0x46,0xC8, +0x2A,0x1C,0x9F,0xBD,0xF9,0x7B,0x1F,0xB9,0xE9,0x5B,0x8F,0x9D,0xB9,0x3B,0x0F,0x99,0xA9,0x1B,0x97,0xAD, +0xF8,0x7A,0x17,0xA9,0xE8,0x5A,0x87,0x8D,0xB8,0x3A,0x07,0x89,0xA8,0x1A,0x9E,0xBC,0x79,0x79,0x1E,0xB8, +0x69,0x59,0x8E,0x9C,0x39,0x39,0x0E,0x98,0x29,0x19,0x96,0xAC,0x78,0x78,0x16,0xA8,0x68,0x58,0x86,0x8C, +0x38,0x38,0x06,0x88,0x28,0x18,0xDD,0xF5,0xF3,0x77,0x5D,0xF1,0xE3,0x57,0xCD,0xD5,0xB3,0x37,0x4D,0xD1, +0xA3,0x17,0xD5,0xE5,0xF2,0x76,0x55,0xE1,0xE2,0x56,0xC5,0xC5,0xB2,0x36,0x45,0xC1,0xA2,0x16,0xDC,0xF4, +0x73,0x75,0x5C,0xF0,0x63,0x55,0xCC,0xD4,0x33,0x35,0x4C,0xD0,0x23,0x15,0xD4,0xE4,0x72,0x74,0x54,0xE0, +0x62,0x54,0xC4,0xC4,0x32,0x34,0x44,0xC0,0x22,0x14,0x9D,0xB5,0xF1,0x73,0x1D,0xB1,0xE1,0x53,0x8D,0x95, +0xB1,0x33,0x0D,0x91,0xA1,0x13,0x95,0xA5,0xF0,0x72,0x15,0xA1,0xE0,0x52,0x85,0x85,0xB0,0x32,0x05,0x81, +0xA0,0x12,0x9C,0xB4,0x71,0x71,0x1C,0xB0,0x61,0x51,0x8C,0x94,0x31,0x31,0x0C,0x90,0x21,0x11,0x94,0xA4, +0x70,0x70,0x14,0xA0,0x60,0x50,0x84,0x84,0x30,0x30,0x04,0x80,0x20,0x10,0xDB,0x7D,0xDB,0x6F,0x5B,0x79, +0xCB,0x4F,0xCB,0x5D,0x9B,0x2F,0x4B,0x59,0x8B,0x0F,0xD3,0x6D,0xDA,0x6E,0x53,0x69,0xCA,0x4E,0xC3,0x4D, +0x9A,0x2E,0x43,0x49,0x8A,0x0E,0xDA,0x7C,0x5B,0x6D,0x5A,0x78,0x4B,0x4D,0xCA,0x5C,0x1B,0x2D,0x4A,0x58, +0x0B,0x0D,0xD2,0x6C,0x5A,0x6C,0x52,0x68,0x4A,0x4C,0xC2,0x4C,0x1A,0x2C,0x42,0x48,0x0A,0x0C,0x9B,0x3D, +0xD9,0x6B,0x1B,0x39,0xC9,0x4B,0x8B,0x1D,0x99,0x2B,0x0B,0x19,0x89,0x0B,0x93,0x2D,0xD8,0x6A,0x13,0x29, +0xC8,0x4A,0x83,0x0D,0x98,0x2A,0x03,0x09,0x88,0x0A,0x9A,0x3C,0x59,0x69,0x1A,0x38,0x49,0x49,0x8A,0x1C, +0x19,0x29,0x0A,0x18,0x09,0x09,0x92,0x2C,0x58,0x68,0x12,0x28,0x48,0x48,0x82,0x0C,0x18,0x28,0x02,0x08, +0x08,0x08,0xD9,0x75,0xD3,0x67,0x59,0x71,0xC3,0x47,0xC9,0x55,0x93,0x27,0x49,0x51,0x83,0x07,0xD1,0x65, +0xD2,0x66,0x51,0x61,0xC2,0x46,0xC1,0x45,0x92,0x26,0x41,0x41,0x82,0x06,0xD8,0x74,0x53,0x65,0x58,0x70, +0x43,0x45,0xC8,0x54,0x13,0x25,0x48,0x50,0x03,0x05,0xD0,0x64,0x52,0x64,0x50,0x60,0x42,0x44,0xC0,0x44, +0x12,0x24,0x40,0x40,0x02,0x04,0x99,0x35,0xD1,0x63,0x19,0x31,0xC1,0x43,0x89,0x15,0x91,0x23,0x09,0x11, +0x81,0x03,0x91,0x25,0xD0,0x62,0x11,0x21,0xC0,0x42,0x81,0x05,0x90,0x22,0x01,0x01,0x80,0x02,0x98,0x34, +0x51,0x61,0x18,0x30,0x41,0x41,0x88,0x14,0x11,0x21,0x08,0x10,0x01,0x01,0x90,0x24,0x50,0x60,0x10,0x20, +0x40,0x40,0x80,0x04,0x10,0x20,0x00,0x00,0xA4,0x53,0x80,0x05,0x76,0x8D,0xDE,0x85,0xB1,0x8B,0x52,0x92, +0x14,0x40,0xCE,0xA1,0x58,0xCB,0xAC,0x72,0x40,0x81,0x90,0xE5,0x5B,0x21,0x24,0xB2,0x41,0xA7,0xC6,0xB5, +0xD3,0xCA,0x7F,0x19,0x02,0x2A,0x41,0x05,0xFB,0xA0,0x19,0x24,0xC4,0x62,0x90,0x05,0x50,0x48,0x71,0xEC, +0xC1,0x41,0xD7,0x1D,0xB1,0x88,0x47,0xD3,0xCD,0xC6,0x59,0x35,0xBA,0xE1,0x7E,0x48,0xC0,0x06,0x3F,0xBA, +0x14,0xE4,0x46,0xF1,0xA9,0xE6,0xF9,0x23,0x7C,0xE8,0xFB,0xC0,0x05,0xA5,0x08,0x40,0x82,0xA8,0x1A,0x03, +0x5F,0x4C,0xF1,0x73,0x52,0xE5,0x49,0xC5,0x7E,0xA4,0xD4,0xC1,0xD6,0xBB,0xEA,0xD0,0x80,0xE9,0x9B,0x78, +0x93,0x67,0x05,0x23,0xEB,0xA5,0x36,0xD1,0xD7,0xD2,0x2F,0xF3,0xCA,0x3A,0xA3,0xA1,0x53,0x47,0x80,0x6A, +0x73,0xDA,0x87,0x0C,0x9A,0x20,0x3C,0x2F,0x20,0x47,0x82,0xDD,0x12,0x68,0x7A,0x5E,0xF5,0x4B,0xEA,0x5C, +0x0C,0x26,0x1A,0x7B,0x4D,0x49,0x9B,0x1C,0xD9,0xA8,0xDC,0x08,0x8E,0x8A,0x0E,0xFD,0x90,0x25,0x3D,0x2E, +0xE7,0x0A,0xCD,0xA8,0xD0,0xC1,0x89,0x63,0x0B,0x23,0x0B,0x1C,0x30,0x80,0xF1,0x3D,0xC9,0xE4,0xC5,0xBC, +0x5B,0xC0,0xBD,0x3B,0x48,0x8F,0x02,0x5D,0x8D,0x6E,0x08,0x75,0xE9,0x4A,0x58,0x9A,0x85,0xE1,0x74,0x54, +0x6A,0xED,0xB5,0xA6,0xE4,0xF2,0xDA,0x9A,0xEA,0xB2,0xD8,0x74,0x59,0x6C,0x03,0xB7,0x0A,0x5E,0x41,0xF7, +0x7B,0x51,0x5F,0x07,0x6B,0xC6,0xF3,0x60,0xD2,0x2E,0x53,0x4C,0x77,0xAD,0x0B,0x4D,0xB1,0xA2,0x11,0x78, +0x28,0xC5,0xD3,0x7F,0x59,0x8F,0xBF,0xE2,0x61,0x50,0x03,0x75,0x3A,0x36,0xBA,0x51,0x6A,0x5C,0x95,0x84, +0x1B,0x40,0x74,0xE3,0x71,0x18,0xCE,0x1E,0x5A,0x93,0x62,0x20,0x8A,0xF3,0xD8,0x36,0x1A,0x33,0x7D,0xE3, +0xE3,0xCD,0xDB,0x01,0xB0,0x99,0x4B,0x25,0xE0,0xDF,0x95,0xA7,0xB2,0xD9,0x4C,0x6C,0xC7,0x51,0x8D,0x64, +0xA1,0x23,0x43,0xB9,0xC1,0xFC,0x9D,0x44,0xB3,0x7D,0x3A,0xCD,0xAD,0xB9,0x04,0xD0,0xC3,0x2F,0x6C,0xB0, +0x66,0x5B,0xEE,0x63,0xDE,0x2B,0x4D,0x42,0x23,0x1D,0xB3,0x56,0xB3,0x35,0x26,0x20,0x6B,0x8A,0xE6,0x73, +0xDF,0x69,0x40,0x53,0x22,0xBB,0x3A,0xB7,0x55,0x28,0x6D,0x1E,0xA1,0x76,0xEF,0x62,0x5E,0x69,0x09,0x20, +0xB7,0x13,0x12,0xD5,0xC4,0x3D,0xE2,0x21,0x14,0x8F,0xF3,0xF3,0x62,0x2B,0x84,0x62,0x57,0x10,0xD8,0x85, +0x38,0x78,0x13,0x2A,0x69,0x20,0xC8,0x3D,0x78,0xF5,0x70,0x1A,0x28,0xFE,0xEE,0x6D,0x3F,0x39,0x26,0x49, +0x6F,0x59,0xDE,0x4F,0x61,0x7F,0xDC,0x8D,0xAE,0xBA,0x83,0xEE,0xD3,0x18,0x37,0x3D,0x83,0x78,0xE9,0x28, +0x93,0x6A,0x55,0x98,0x0A,0xB4,0xD1,0x0D,0x19,0x90,0x41,0x29,0xC9,0xF0,0x97,0xF0,0x9A,0x1B,0x1C,0xCA, +0x42,0x2C,0xFC,0x2E,0x96,0xC2,0x2E,0x19,0x3A,0x7C,0xF8,0xEB,0xEF,0x73,0x18,0xD0,0xC0,0x0D,0xFE,0x62, +0x50,0x09,0x26,0x8B,0x3B,0x56,0xF7,0xB2,0xB2,0x19,0x39,0xC0,0xC9,0xE1,0xBC,0x13,0x0D,0x95,0x37,0x29, +0x24,0xD3,0x63,0xA7,0x33,0x3A,0x6F,0xCD,0x63,0x2F,0xCF,0x2C,0x33,0xC0,0x24,0x99,0xBC,0x54,0x76,0x22, +0x42,0xA1,0x9D,0xF2,0x58,0x8F,0xE4,0x84,0x7F,0xE2,0xB0,0x23,0x44,0x80,0x70,0x26,0x3F,0x62,0x22,0x16, +0xA6,0x8C,0xF6,0x87,0x15,0x0A,0x68,0x36,0x4D,0xE9,0xE6,0xB3,0x5D,0x4A,0x41,0x42,0x31,0x8F,0xA1,0xF6, +0xD6,0xA6,0x35,0xBE,0xC0,0xE2,0xB9,0xD6,0x9E,0xE2,0xD6,0xC3,0x8D,0x0C,0xA8,0x97,0x15,0xA2,0xB9,0x32, +0x82,0x83,0xB8,0x17,0x55,0xA1,0xD3,0xD2,0x00,0x24,0x1D,0xBD,0xE5,0x5B,0x74,0x9C,0xBB,0x4E,0xF2,0x14, +0x21,0xC4,0x32,0x4F,0xA4,0x83,0xD2,0xB9,0xEC,0x3A,0xF0,0x4E,0xA6,0xCA,0x07,0xA6,0x29,0xE6,0x2D,0xC1, +0x8F,0xFB,0x1A,0xC3,0x9A,0xCB,0x8A,0x3F,0x65,0xC0,0x15,0x07,0x24,0x83,0x65,0x3D,0x26,0x0F,0x16,0xA9, +0x91,0x27,0x19,0x33,0xDA,0x4C,0xC7,0x7E,0x94,0x15,0x68,0x0B,0xFB,0x75,0xFC,0x8F,0x9E,0x03,0x36,0x5A, +0x48,0xE8,0xEC,0xAF,0xDE,0x43,0x4A,0x5B,0xF0,0x02,0xCA,0xEF,0x57,0xA9,0xBA,0x3B,0x9F,0x89,0xA2,0xCF, +0x17,0xE9,0x69,0xF5,0xD9,0x85,0x63,0x0F,0xF7,0x28,0x6D,0x2F,0xC4,0xDE,0x73,0x2F,0xB7,0x68,0xAC,0xF9, +0x0F,0xA3,0xF5,0x17,0x8D,0xAF,0x3F,0x99,0xC9,0xEB,0xE5,0xBA,0xD5,0x40,0xE2,0xA8,0xAF,0x73,0x3A,0x3C, +0xE1,0x73,0xF6,0x88,0xCC,0xC4,0x09,0x1C,0xD0,0x89,0x6E,0xA4,0xF2,0x07,0x68,0xDE,0x19,0x6D,0x76,0x05, +0x2C,0x3D,0xB0,0x3C,0x37,0xE0,0x29,0x4A,0x6D,0x04,0x23,0x5E,0x95,0xEC,0xFA,0x19,0x6D,0xC8,0xEB,0x6E, +0x8A,0x12,0x90,0x07,0x2C,0x02,0x63,0x7B,0x1A,0x5A,0x03,0xF9,0xC6,0x12,0xE3,0x55,0xDE,0xF8,0x55,0x44, +0xD4,0xDE,0xE2,0x86,0xB4,0xD3,0x72,0xA2,0x0F,0xC0,0xCC,0x24,0x7D,0x8D,0x76,0x93,0x86,0x97,0x6C,0x96, +0x5E,0x33,0x5C,0xF2,0x78,0x5C,0xB0,0xD8,0xD4,0x79,0x92,0x01,0xA1,0x63,0xFB,0x06,0x36,0x19,0x25,0x52, +0xFC,0xD2,0xEF,0xBA,0x57,0xF4,0xA5,0xAF,0x06,0x95,0x85,0x66,0xFF,0xB3,0x45,0x31,0xE4,0x8B,0x3D,0x55, +0x54,0x0C,0xE5,0x33,0x3A,0xB4,0x64,0xC3,0xE0,0xF4,0x3F,0x0D,0x9D,0x2B,0x4A,0xE4,0x80,0x20,0x5F,0x42, +0xDB,0xD7,0x58,0x3C,0xD6,0xD3,0xBC,0xE6,0x44,0x97,0x7B,0xED,0x75,0xBB,0xD0,0xCF,0x5E,0x34,0xE5,0xC2, +0x57,0xD0,0x8E,0x67,0xA2,0x58,0xF2,0xF8,0xA2,0x62,0xDE,0x52,0xA1,0x17,0x59,0x97,0xBB,0x78,0x7B,0x0A, +0x98,0x87,0x8B,0xB1,0x51,0xBB,0x6E,0x1D,0x8D,0x91,0xF8,0x86,0x3E,0xBC,0x34,0x48,0x68,0xF8,0xFC,0xAF, +0x9F,0x72,0x16,0x69,0x39,0x14,0xF0,0x1A,0x3D,0x34,0x60,0x3E,0x6D,0x72,0x45,0xE2,0xDE,0x97,0xDE,0x09, +0xAF,0x7C,0xA8,0x7E,0xB6,0xBC,0x0B,0x5A,0xE6,0xD6,0xB3,0x51,0x01,0x70,0x51,0x1E,0x44,0xCB,0xD1,0x0F, +0x56,0x19,0x7D,0xFB,0x6D,0xEB,0x81,0xB6,0x3F,0xFB,0xBE,0xF5,0x3A,0x47,0xC6,0xCF,0x99,0xAC,0xB6,0xFE, +0x79,0x9E,0x82,0x13,0x40,0xBE,0x10,0x5E,0xDA,0x3E,0xD4,0x59,0x93,0xA2,0x7E,0x7E,0x2B,0x79,0x3E,0xEA, +0x83,0x08,0x67,0xB4,0xC6,0xDC,0x08,0x3D,0x3E,0x8F,0xF5,0x65,0xE8,0xDE,0x75,0xD0,0x02,0x9C,0x2B,0x28, +0xA5,0x62,0xA5,0xCA,0xDF,0x2F,0xBF,0xEA,0x3D,0x52,0xF8,0x7B,0xBB,0x0A,0xB7,0x1C,0x06,0xC0,0x24,0x66, +0x33,0x40,0x63,0x66,0xEA,0xBB,0x94,0x63,0xD2,0x68,0x78,0x56,0xA3,0xFF,0x68,0x1C,0x33,0x31,0xAF,0xB5, +0x47,0x81,0xBE,0xEF,0x05,0xC5,0xB6,0xFC,0x90,0x4C,0x6D,0x07,0x98,0x4E,0x91,0xA5,0x84,0xB7,0xA0,0x47, +0x3B,0xD2,0xF0,0x57,0x6B,0xA7,0x8C,0x06,0xDF,0x67,0xAE,0x0E,0x9D,0x01,0x72,0x28,0x19,0x9D,0x38,0x22, +0x41,0xF4,0x2F,0x36,0xB1,0x65,0xE3,0x79,0xBE,0x94,0xD0,0x64,0x52,0x64,0x40,0xE2,0xF6,0x0A,0xB0,0x73, +0x37,0x25,0x5C,0x37,0xC1,0x4D,0xD8,0x74,0x53,0x65,0x4B,0x01,0x21,0x00,0xC5,0x65,0x92,0x26,0xC1,0xA6, +0xC0,0xB3,0xD1,0x65,0xD2,0x66,0xFD,0x2E,0x20,0x46,0xC9,0x55,0x93,0x27,0xEB,0x13,0x28,0xF7,0xD9,0x75, +0xD3,0x67,0x42,0x0E,0xC0,0xF8,0xA4,0x98,0x94,0xA3,0x90,0x17,0xB4,0x4A,0xD2,0xAA,0xA4,0x9D,0x08,0xDE, +0xAB,0x4C,0x71,0x3A,0x09,0xA4,0x99,0x3E,0x81,0xF9,0x19,0x06,0x01,0x28,0xA7,0xF5,0x08,0xF1,0x87,0xEF, +0x9E,0xEA,0xD3,0x3D,0x34,0xEE,0xD3,0x13,0x84,0xDF,0x79,0xBC,0x2D,0xEC,0x5F,0xE2,0x1A,0x25,0xBF,0x5B, +0x65,0xB4,0x77,0xBD,0x25,0x4B,0xAA,0xFB,0x8F,0x4B,0xC2,0x4C,0x1A,0x2C,0x74,0xB7,0x1E,0x0A,0xD2,0x6C, +0x5A,0x6C,0x3E,0xA5,0x2A,0x4F,0xCA,0x5C,0x1B,0x2D,0xD9,0x5C,0xC4,0x4F,0xDA,0x7C,0x5B,0x6D,0x83,0x5D, +0x78,0x42,0xC3,0x4D,0x9A,0x2E,0xE4,0x57,0x92,0xBB,0xD3,0x6D,0xDA,0x6E,0xC9,0x66,0x0E,0x08,0xCB,0x5D, +0x9B,0x2F,0xEC,0x78,0x46,0x49,0xDB,0x7D,0xDB,0x6F,0x80,0x04,0x64,0xE5,0x0C,0x86,0xC5,0x3F,0x74,0xE4, +0x6F,0x5D,0xBC,0x66,0xF2,0x78,0xBB,0xAF,0x79,0x53,0x48,0x11,0x72,0xC2,0x94,0xC8,0x80,0x5E,0xFC,0xF4, +0x8A,0x7C,0x3F,0x7E,0xA6,0xD2,0x31,0xFA,0x13,0x8F,0x5F,0x7E,0x43,0x54,0x7A,0x55,0xA8,0x7D,0x8F,0xAE, +0x5D,0xC3,0xED,0xD1,0x8C,0x3C,0x7D,0xF5,0xD8,0x5C,0xEF,0xAC,0xB1,0x88,0x3C,0xE4,0xA7,0x33,0xC4,0xC4, +0x32,0x34,0x94,0xF4,0x9E,0x18,0xD4,0xE4,0x72,0x74,0xFB,0x2D,0x33,0x5B,0xCC,0xD4,0x33,0x35,0xF4,0x53, +0x1C,0xD5,0xDC,0xF4,0x73,0x75,0x9A,0xD0,0xA4,0xD6,0xC5,0xC5,0xB2,0x36,0x25,0x27,0x48,0x17,0xD5,0xE5, +0xF2,0x76,0x3D,0xF7,0x41,0x74,0xCD,0xD5,0xB3,0x37,0x9D,0xE5,0x1F,0x1B,0xDD,0xF5,0xF3,0x77,0xC6,0x9C, +0xD4,0xBC,0x16,0x92,0x60,0xCC,0xA2,0x4A,0xEA,0x10,0x92,0xAE,0x7C,0x83,0xAA,0x65,0xA9,0xC2,0x7E,0x18, +0x7D,0xAE,0x66,0xDA,0x2A,0xE6,0x29,0x98,0xFC,0x5E,0x47,0x8F,0x60,0xEA,0x04,0x4B,0x52,0x76,0xDB,0xCB, +0xAB,0x85,0x97,0x6F,0x7B,0x3C,0x0E,0x5F,0x0B,0x5E,0x27,0x3E,0xC6,0x3A,0x67,0xE6,0x1C,0xA7,0x40,0xAC, +0xFF,0xBB,0xEE,0x6A,0xF5,0xF3,0xC6,0xCC,0x3A,0x3C,0x26,0x2E,0xC0,0x1D,0xD6,0xEC,0x7A,0x7C,0xB1,0xFC, +0xA9,0x15,0xCE,0xDC,0x3B,0x3D,0xF2,0xBA,0xE8,0x53,0xDE,0xFC,0x7B,0x7D,0xEF,0x6B,0x2D,0x39,0xC7,0xCD, +0xBA,0x3E,0xBB,0x69,0x16,0x7E,0xD7,0xED,0xFA,0x7E,0xF9,0xBB,0x5C,0x19,0xCF,0xDD,0xBB,0x3F,0x37,0x7F, +0x17,0x1E,0xDF,0xFD,0xFB,0x7F,0xF4,0x44,0xA6,0x7E,0x40,0x39,0x30,0x1C,0xF0,0x36,0xB8,0xBE,0x1C,0xA4, +0x55,0x65,0xC3,0x69,0x9A,0xBC,0x2C,0xE7,0xB6,0xA3,0x4C,0xB6,0x0D,0x9F,0xD7,0x2A,0x9D,0x3F,0x5B,0x87, +0xC8,0x92,0x1E,0x5C,0x6D,0x28,0x48,0x65,0x66,0x8C,0x89,0xD4,0x8C,0x46,0x81,0xB1,0x02,0xA4,0x9B,0xE8, +0x17,0xEB,0xF9,0x27,0x54,0x82,0x3E,0x24,0x0A,0xE1,0x88,0xE1,0x00,0x24,0xE0,0x46,0x16,0xA4,0x78,0x50, +0xE7,0x6B,0xF0,0x66,0x56,0xE4,0xF8,0xD0,0x06,0xF2,0xE8,0x56,0x17,0xA5,0x98,0x4D,0xB3,0x75,0xF8,0x76, +0x57,0xE5,0x88,0xC7,0xC2,0x9A,0xE1,0x47,0x96,0xA6,0x76,0x70,0x1D,0x16,0xF1,0x67,0xD6,0xE6,0x53,0xB1, +0x05,0x8F,0xE9,0x57,0x97,0xA7,0xCE,0x6F,0xE3,0x3A,0xF9,0x77,0xD7,0xE7,0xB2,0x14,0x54,0x7C,0x82,0x6C, +0xAB,0xCD,0x99,0x51,0x99,0x35,0x52,0x11,0xA0,0xEA,0x6A,0xDC,0xE7,0xC5,0x13,0x4F,0xBE,0x76,0x62,0x07, +0xCF,0xC1,0x89,0x27,0x79,0x87,0xA0,0x11,0xD0,0x3E,0x9B,0xDF,0x41,0xD5,0x71,0x4B,0xD4,0x4A,0x00,0x32, +0x24,0x3A,0xDB,0x5D,0x27,0x70,0x16,0x42,0x62,0xAD,0xEF,0x49,0x6E,0x8A,0xFB,0x00,0xD5,0x87,0x93,0x28, +0x4D,0x53,0xE2,0x4E,0x1E,0xAC,0xAD,0x62,0x60,0x8A,0xF2,0x6E,0x5E,0xEC,0x12,0xD8,0x0E,0x9A,0xEA,0x5E, +0x1F,0xAD,0x0A,0xA5,0xA0,0x8C,0xFA,0x7E,0x5F,0xED,0x1B,0x29,0xCD,0x7E,0xE3,0x4F,0x9E,0xAE,0x81,0xAD, +0x6C,0x82,0xF3,0x6F,0xDE,0xEE,0xD0,0xB9,0x23,0x72,0xEB,0x5F,0x9F,0xAF,0xD3,0xD8,0xB0,0x0F,0xFB,0x7F, +0xDF,0xEF,0x56,0x27,0xA1,0x97,0x64,0x92,0xC8,0x45,0xF4,0xB3,0x48,0xD6,0x03,0x5B,0x38,0xBE,0x2D,0x4D, +0x86,0xEF,0x1B,0x8F,0x33,0x71,0x44,0x96,0xEA,0xD3,0x45,0x70,0xD7,0xB4,0xCE,0x74,0xA2,0x72,0x61,0x03, +0xF0,0x47,0x3D,0x06,0x87,0xF2,0xC5,0xE1,0x56,0x0C,0x16,0xD5,0x07,0xDD,0x1A,0xA8,0xE1,0xF1,0x8A,0xB2, +0x68,0xDF,0xCF,0x31,0xED,0xBF,0x6C,0xF5,0x87,0xF8,0xE4,0xC6,0x36,0xB4,0x14,0xA2,0x6A,0x29,0xF4,0xE6, +0x76,0xF4,0xE8,0x15,0xA7,0xB5,0xEC,0xD6,0x37,0xB5,0x26,0xF3,0xC4,0x94,0xFC,0xF6,0x77,0xF5,0x86,0x84, +0x78,0x9E,0xE5,0xC7,0xB6,0xB6,0x0D,0x61,0xE7,0x96,0xF5,0xE7,0xF6,0xF6,0xC1,0x13,0x04,0xD6,0xED,0xD7, +0xB7,0xB7,0x1D,0xB3,0xFA,0x5C,0xFD,0xF7,0xF7,0xF7,0x52,0xAE,0xF8,0x28,0x24,0xB1,0xB9,0xBF,0x5E,0xB4, +0x2A,0x2C,0xC6,0x8E,0x64,0x35,0x09,0x1A,0xAA,0x3E,0x47,0x1A,0x79,0xA5,0x81,0xDA,0xDA,0x7D,0x84,0x5C, +0xFF,0xF1,0x80,0x97,0x7C,0x6A,0x4F,0x2C,0xBA,0x1A,0xF1,0x2F,0xA4,0xAD,0x27,0x2D,0xFD,0x1D,0x87,0x3D, +0xAB,0x5B,0x3F,0x58,0xBF,0x4E,0xF9,0xBD,0x25,0x19,0x4D,0xDD,0xBE,0x24,0x8A,0x4A,0xD2,0xBC,0xE6,0xCE, +0x3E,0xBC,0xF2,0x08,0xEC,0xD4,0xF6,0xEE,0x7E,0xFC,0x56,0x29,0x77,0x39,0xEE,0xDE,0x3F,0xBD,0x1E,0xBA, +0xC2,0x20,0xFE,0xFE,0x7F,0xFD,0xCB,0x49,0xAF,0xCB,0xE7,0xCF,0xBE,0xBE,0xFE,0x99,0x4D,0x9F,0xF7,0xEF, +0xFE,0xFE,0x80,0xC7,0x29,0x6A,0xEF,0xDF,0xBF,0xBF,0x07,0xDF,0x6D,0xD7,0xFF,0xFF,0xFF,0xFF,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10,0x01,0x01,0x88,0x14, +0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01,0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21, +0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11,0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35, +0xD1,0x63,0x40,0x40,0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41,0x82,0x06,0xC1,0x45, +0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51,0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71, +0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08,0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C, +0x58,0x68,0x0A,0x18,0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, +0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19,0x89,0x0B,0x8B,0x1D, +0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48,0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68, +0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58,0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C, +0x5B,0x6D,0x43,0x49,0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, +0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80,0x20,0x10,0x84,0x84, +0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90,0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0, +0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81,0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5, +0xF0,0x72,0x0D,0x91,0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, +0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0,0x23,0x15,0xCC,0xD4, +0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1,0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1, +0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1,0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5, +0xF3,0x77,0x06,0x88,0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, +0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89,0xA8,0x1A,0x87,0x8D, +0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99,0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9, +0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8,0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC, +0x7A,0x7C,0x4E,0xD8,0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, +0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9,0xAB,0x1F,0xCF,0xDD, +0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02,0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22, +0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12,0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36, +0x55,0xE1,0x21,0x03,0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, +0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42,0x06,0x84,0xE0,0x46, +0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52,0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72, +0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43,0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67, +0xD6,0xE6,0x69,0x53,0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, +0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A,0x0D,0x89,0xAA,0x1E, +0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B,0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B, +0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B,0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F, +0xDD,0xEB,0x62,0x4A,0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, +0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B,0x8E,0x8E,0xE3,0x4F, +0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B,0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B, +0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82,0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6, +0x74,0xF0,0x2C,0x92,0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, +0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93,0xA5,0x93,0xAD,0x97, +0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2,0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2, +0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2,0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6, +0x77,0xF5,0x65,0xC3,0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, +0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A,0x2C,0x98,0xA6,0x8E, +0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A,0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA, +0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B,0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF, +0xFC,0xFA,0x2F,0x9B,0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, +0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA,0x2F,0x9D,0xEE,0xDE, +0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB,0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB, +0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB,0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF, +0xFF,0xFF,0x00,0x00,0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01,0x80,0x02,0x81,0x05, +0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11,0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31, +0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40,0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64, +0x52,0x64,0x48,0x50,0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51,0x83,0x07,0xC9,0x55, +0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08,0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28, +0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18,0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C, +0x59,0x69,0x03,0x09,0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, +0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48,0x0A,0x0C,0xC2,0x4C, +0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58,0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78, +0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49,0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D, +0xDA,0x6E,0x4B,0x59,0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90,0x21,0x11,0x8C,0x94, +0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81,0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1, +0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91,0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5, +0xF1,0x73,0x44,0xC0,0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, +0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1,0xA2,0x16,0xC5,0xC5, +0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1,0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1, +0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88,0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC, +0x78,0x78,0x0E,0x98,0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, +0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99,0xA9,0x1B,0x8F,0x9D, +0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8,0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8, +0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8,0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC, +0x7B,0x7D,0x47,0xC9,0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, +0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02,0x04,0x80,0xA0,0x06, +0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12,0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32, +0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03,0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27, +0xD4,0xE2,0x29,0x13,0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, +0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52,0x07,0x85,0xE8,0x56, +0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43,0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63, +0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53,0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77, +0xD7,0xE7,0x22,0x0A,0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, +0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B,0x8C,0x8A,0xA3,0x0F, +0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B,0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B, +0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A,0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E, +0x5E,0xEC,0x6A,0x5A,0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, +0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B,0x8F,0x8F,0xEB,0x5F, +0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82,0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2, +0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92,0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6, +0x75,0xF1,0x25,0x83,0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, +0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2,0x26,0x94,0xE4,0xC6, +0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2,0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2, +0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3,0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7, +0xF6,0xF6,0x6D,0xD3,0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, +0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A,0x2D,0x99,0xAE,0x9E, +0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B,0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB, +0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B,0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF, +0xFD,0xFB,0x66,0xCA,0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, +0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB,0xAE,0x9E,0xE7,0xCF, +0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB,0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB, +0xEF,0xDF,0xFF,0xFF,0x90,0xAF +}; +#endif + +/* +*[HW INFO]00900600 +*[PID]910 +*[VID]1010 +*[GENERATED]2013/08/27 20:59:13 +*/ +#if GTP_COMPATIBLE_MODE +unsigned char gtp_default_FW_fl[] = { + +}; +#endif + +#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_update.c b/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_update.c new file mode 100644 index 00000000000..321ad4a4810 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/gt9xx_update.c @@ -0,0 +1,3452 @@ +/* drivers/input/touchscreen/gt9xx_update.c + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: V2.5 + * Release Date: 2015/01/21 + */ +#include "tpd.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "cust_gpio_usage.h" +#include + +#include "tpd_custom_gt9xx.h" + +#if ( (GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) || GTP_COMPATIBLE_MODE ) + #include "gt9xx_firmware.h" +#endif + +#define GUP_REG_HW_INFO 0x4220 +#define GUP_REG_FW_MSG 0x41E4 +#define GUP_REG_PID_VID 0x8140 + +#define GUP_SEARCH_FILE_TIMES 50 +#define UPDATE_FILE_PATH_1 "/data/_goodix_update_.bin" +#define UPDATE_FILE_PATH_2 "/sdcard/_goodix_update_.bin" + +#define CONFIG_FILE_PATH_1 "/data/_goodix_config_.cfg" +#define CONFIG_FILE_PATH_2 "/sdcard/_goodix_config_.cfg" + +#define FW_HEAD_LENGTH 14 +#define FW_DOWNLOAD_LENGTH 0x4000 +#define FW_SECTION_LENGTH 0x2000 +#define FW_DSP_ISP_LENGTH 0x1000 +#define FW_DSP_LENGTH 0x1000 +#define FW_BOOT_LENGTH 0x800 +#define FW_SS51_LENGTH (4 * FW_SECTION_LENGTH) +#define FW_BOOT_ISP_LENGTH 0x800 // 2k +#define FW_GLINK_LENGTH 0x3000 // 12k +#define FW_GWAKE_LENGTH (4 * FW_SECTION_LENGTH) // 32k + +#define PACK_SIZE 256 +#define MAX_FRAME_CHECK_TIME 5 + + +#define _bRW_MISCTL__SRAM_BANK 0x4048 +#define _bRW_MISCTL__MEM_CD_EN 0x4049 +#define _bRW_MISCTL__CACHE_EN 0x404B +#define _bRW_MISCTL__TMR0_EN 0x40B0 +#define _rRW_MISCTL__SWRST_B0_ 0x4180 +#define _bWO_MISCTL__CPU_SWRST_PULSE 0x4184 +#define _rRW_MISCTL__BOOTCTL_B0_ 0x4190 +#define _rRW_MISCTL__BOOT_OPT_B0_ 0x4218 +#define _rRW_MISCTL__BOOT_CTL_ 0x5094 + +#define AUTO_SEARCH_BIN 0x01 +#define AUTO_SEARCH_CFG 0x02 +#define BIN_FILE_READY 0x80 +#define CFG_FILE_READY 0x08 +#define HEADER_FW_READY 0x01 + +#pragma pack(1) +typedef struct +{ + u8 hw_info[4]; //hardware info// + u8 pid[8]; //product id // + u16 vid; //version id // +} st_fw_head; +#pragma pack() + +typedef struct +{ + u8 force_update; + u8 fw_flag; + struct file *file; + struct file *cfg_file; + st_fw_head ic_fw_msg; + mm_segment_t old_fs; + u32 fw_total_len; + u32 fw_burned_len; +} st_update_msg; + +st_update_msg update_msg; +u8 gtp_loading_fw; +extern struct i2c_client *i2c_client_point; +u16 show_len; +u16 total_len; +extern u8 cfg_len; +u8 searching_file = 0; +u8 got_file_flag = 0; + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *client, s32 on); +#endif + +#if GTP_COMPATIBLE_MODE +extern CHIP_TYPE_T gtp_chip_type; +extern u8 rqst_processing; +extern u8 is_950; +extern u8 gtp_fw_startup(struct i2c_client *client); +static u8 gup_check_and_repair(struct i2c_client *, s32 , u8 *, u32 ); +s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +#endif + +#define _CLOSE_FILE(p_file) if (p_file && !IS_ERR(p_file)) \ + { \ + filp_close(p_file, NULL); \ + } + + +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd ); + +static s32 gup_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + s32 ret = -1; + u16 addr = (buf[0] << 8) + buf[1]; + + ret = i2c_read_bytes(client, addr, &buf[2], len - 2); + + if (!ret) + { + return 2; + } + else + { + return ret; + } +} + +static s32 gup_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + s32 ret = -1; + u16 addr = (buf[0] << 8) + buf[1]; + + ret = i2c_write_bytes(client, addr, &buf[2], len - 2); + + if (!ret) + { + return 1; + } + else + { + return ret; + } +} + +static u8 gup_get_ic_msg(struct i2c_client *client, u16 addr, u8 *msg, s32 len) +{ + s32 i = 0; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + + for (i = 0; i < 5; i++) + { + if (gup_i2c_read(client, msg, GTP_ADDR_LENGTH + len) > 0) + { + break; + } + } + + if (i >= 5) + { + GTP_ERROR("Read data from 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_set_ic_msg(struct i2c_client *client, u16 addr, u8 val) +{ + s32 i = 0; + u8 msg[3]; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + msg[2] = val; + + for (i = 0; i < 5; i++) + { + if (gup_i2c_write(client, msg, GTP_ADDR_LENGTH + 1) > 0) + { + break; + } + } + + if (i >= 5) + { + GTP_ERROR("Set data to 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_get_ic_fw_msg(struct i2c_client *client) +{ + s32 ret = -1; + u8 retry = 0; + u8 buf[16]; + u8 i; + + //step1:get hardware info + ret = gtp_i2c_read_dbl_check(client, GUP_REG_HW_INFO, &buf[GTP_ADDR_LENGTH], 4); + if (FAIL == ret) + { + GTP_ERROR("[get_ic_fw_msg]get hw_info failed,exit"); + return FAIL; + } + + // buf[2~5]: 00 06 90 00 + // hw_info: 00 90 06 00 + for (i = 0; i < 4; i++) + { + update_msg.ic_fw_msg.hw_info[i] = buf[GTP_ADDR_LENGTH + 3 - i]; + } + + GTP_INFO("IC Hardware info:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + + //step2:get firmware message + for (retry = 0; retry < 2; retry++) + { + ret = gup_get_ic_msg(client, GUP_REG_FW_MSG, buf, 1); + + if (FAIL == ret) + { + GTP_ERROR("Read firmware message fail."); + return ret; + } + + update_msg.force_update = buf[GTP_ADDR_LENGTH]; + + if ((0xBE != update_msg.force_update) && (!retry)) + { + GTP_INFO("The check sum in ic is error."); + GTP_INFO("The IC will be updated by force."); + continue; + } + break; + } + + GTP_INFO("IC force update flag:0x%x", update_msg.force_update); + + //step3:get pid & vid + ret = gtp_i2c_read_dbl_check(client, GUP_REG_PID_VID, &buf[GTP_ADDR_LENGTH], 6); + if (FAIL == ret) + { + GTP_ERROR("[get_ic_fw_msg]get pid & vid failed,exit"); + return FAIL; + } + + memset(update_msg.ic_fw_msg.pid, 0, sizeof(update_msg.ic_fw_msg.pid)); + memcpy(update_msg.ic_fw_msg.pid, &buf[GTP_ADDR_LENGTH], 4); + + + //GT9XX PID MAPPING + /*|-----FLASH-----RAM-----| + |------918------918-----| + |------968------968-----| + |------913------913-----| + |------913P-----913P----| + |------927------927-----| + |------927P-----927P----| + |------9110-----9110----| + |------9110P----9111----|*/ + if(update_msg.ic_fw_msg.pid[0] != 0) + { + if (!memcmp(update_msg.ic_fw_msg.pid, "9111", 4)) + { + GTP_INFO("IC Mapping Product id:%s", update_msg.ic_fw_msg.pid); + memcpy(update_msg.ic_fw_msg.pid, "9110P", 5); + } + } + + update_msg.ic_fw_msg.vid = buf[GTP_ADDR_LENGTH + 4] + (buf[GTP_ADDR_LENGTH + 5] << 8); + return SUCCESS; +} + +s32 gup_enter_update_mode(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + //step1:RST output low last at least 2ms + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + msleep(2); + + //step2:select I2C slave addr,INT:0--0xBA;1--0x28. + GTP_GPIO_OUTPUT(GTP_INT_PORT, (client->addr == 0x14)); + msleep(2); + + //step3:RST output high reset guitar + GTP_GPIO_OUTPUT(GTP_RST_PORT, 1); + + //20121211 modify start + msleep(5); + while(retry++ < 200) + { + //step4:Hold ss51 & dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) + { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + //step5:Confirm hold + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if(ret <= 0) + { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if(0x0C == rd_buf[GTP_ADDR_LENGTH]) + { + GTP_DEBUG("Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if(retry >= 200) + { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + //step6:DSP_CK and DSP_ALU_CK PowerOn + ret = gup_set_ic_msg(client, 0x4010, 0x00); + + //20121211 modify end + return ret; +} + +void gup_leave_update_mode(void) +{ + GTP_GPIO_AS_INT(GTP_INT_PORT); + + GTP_DEBUG("[leave_update_mode]reset chip."); + gtp_reset_guitar(i2c_client_point, 20); +} + +static u8 gup_enter_update_judge(st_fw_head *fw_head) +{ + u16 u16_tmp; + s32 i = 0; + u32 fw_len = 0; + s32 pid_cmp_len = 0; + //Get the correct nvram data + //The correct conditions: + //1. the hardware info is the same + //2. the product id is the same + //3. the firmware version in update file is greater than the firmware version in ic + //or the check sum in ic is wrong + + u16_tmp = fw_head->vid; + fw_head->vid = (u16)(u16_tmp >> 8) + (u16)(u16_tmp << 8); + + GTP_INFO("FILE HARDWARE INFO:%02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID:%s", fw_head->pid); + GTP_INFO("FILE VID:%04x", fw_head->vid); + GTP_INFO("IC HARDWARE INFO:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + GTP_INFO("IC PID:%s", update_msg.ic_fw_msg.pid); + GTP_INFO("IC VID:%04x", update_msg.ic_fw_msg.vid); + + if (!memcmp(fw_head->pid, "9158", 4) && !memcmp(update_msg.ic_fw_msg.pid, "915S", 4)) + { + GTP_INFO("Update GT915S to GT9158 directly!"); + return SUCCESS; + } + + if (!memcmp(fw_head->hw_info, update_msg.ic_fw_msg.hw_info, sizeof(update_msg.ic_fw_msg.hw_info))) + { + fw_len = 42 * 1024; + } + else + { + fw_len = fw_head->hw_info[3]; + fw_len += (((u32)fw_head->hw_info[2]) << 8); + fw_len += (((u32)fw_head->hw_info[1]) << 16); + fw_len += (((u32)fw_head->hw_info[0]) << 24); + } + if (update_msg.fw_total_len != fw_len) + { + GTP_ERROR("Inconsistent firmware size, Update aborted! Default size: %d(%dK), actual size: %d(%dK)", fw_len, fw_len/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + return FAIL; + } + GTP_INFO("Firmware length:%d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + if (update_msg.force_update != 0xBE) + { + GTP_INFO("FW chksum error,need enter update."); + return SUCCESS; + } + // 20130523 start + if (strlen(update_msg.ic_fw_msg.pid) < 3) + { + GTP_INFO("Illegal IC pid, need enter update"); + return SUCCESS; + } + else + { + for (i = 0; i < 3; i++) + { + if ((update_msg.ic_fw_msg.pid[i] < 0x30) || (update_msg.ic_fw_msg.pid[i] > 0x39)) + { + GTP_INFO("Illegal IC pid, out of bound, need enter update"); + return SUCCESS; + } + } + } + // 20130523 end + + pid_cmp_len = strlen(fw_head->pid); + if (pid_cmp_len < strlen(update_msg.ic_fw_msg.pid)) + { + pid_cmp_len = strlen(update_msg.ic_fw_msg.pid); + } + + if ((!memcmp(fw_head->pid, update_msg.ic_fw_msg.pid, pid_cmp_len)) || + (!memcmp(update_msg.ic_fw_msg.pid, "91XX", 4))|| + (!memcmp(fw_head->pid, "91XX", 4))) + { + if(!memcmp(fw_head->pid, "91XX", 4)) + { + GTP_DEBUG("Force none same pid update mode."); + } + else + { + GTP_DEBUG("Get the same pid."); + } + + //The third condition + if (fw_head->vid > update_msg.ic_fw_msg.vid) + { + + GTP_INFO("Need enter update."); + return SUCCESS; + } + + GTP_INFO("Don't meet the third condition."); + GTP_ERROR("File VID <= IC VID, update aborted!"); + } + else + { + GTP_ERROR("File PID != IC PID, update aborted!"); + } + + return FAIL; +} + +#if GTP_AUTO_UPDATE_CFG +static u8 ascii2hex(u8 a) +{ + s8 value = 0; + + if(a >= '0' && a <= '9') + { + value = a - '0'; + } + else if(a >= 'A' && a <= 'F') + { + value = a - 'A' + 0x0A; + } + else if(a >= 'a' && a <= 'f') + { + value = a - 'a' + 0x0A; + } + else + { + value = 0xff; + } + + return value; +} + +static s8 gup_update_config(struct i2c_client *client) +{ + s32 file_len = 0; + s32 ret = 0; + s32 i = 0; + s32 file_cfg_len = 0; + s32 chip_cfg_len = 0; + s32 count = 0; + u8 *buf; + u8 *pre_buf; + u8 *file_config; + //u8 checksum = 0; + + if(NULL == update_msg.cfg_file) + { + GTP_ERROR("[update_cfg]No need to upgrade config!"); + return FAIL; + } + file_len = update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_END); + + chip_cfg_len = cfg_len; + if (chip_cfg_len == 0) { + chip_cfg_len = GTP_CONFIG_MAX_LENGTH; + } + + GTP_DEBUG("[update_cfg]config file len:%d", file_len); + GTP_DEBUG("[update_cfg]need config len:%d",chip_cfg_len); + if((file_len+5) < chip_cfg_len*5) + { + GTP_ERROR("Config length error"); + return -1; + } + + buf = (u8*)kzalloc(file_len, GFP_KERNEL); + pre_buf = (u8*)kzalloc(file_len, GFP_KERNEL); + file_config = (u8*)kzalloc(chip_cfg_len + GTP_ADDR_LENGTH, GFP_KERNEL); + update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_SET); + + GTP_DEBUG("[update_cfg]Read config from file."); + ret = update_msg.cfg_file->f_op->read(update_msg.cfg_file, (char*)pre_buf, file_len, &update_msg.cfg_file->f_pos); + if(ret<0) + { + GTP_ERROR("[update_cfg]Read config file failed."); + goto update_cfg_file_failed; + } + + GTP_DEBUG("[update_cfg]Delete illgal charactor."); + for(i=0,count=0; i> 8; + file_config[1] = GTP_REG_CONFIG_DATA & 0xff; + for(i=0,file_cfg_len=GTP_ADDR_LENGTH; i 0) + { + GTP_INFO("[update_cfg]Send config SUCCESS."); + break; + } + GTP_ERROR("[update_cfg]Send config i2c error."); + } + +update_cfg_file_failed: + kfree(pre_buf); + kfree(buf); + kfree(file_config); + return ret; +} + +#endif + +#if (GTP_AUTO_UPDATE && (!GTP_HEADER_FW_UPDATE || GTP_AUTO_UPDATE_CFG)) +static void gup_search_file(s32 search_type) +{ + s32 i = 0; + struct file *pfile = NULL; + + got_file_flag = 0x00; + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) + { + if (0 == searching_file) + { + GTP_INFO("Force exiting file searching"); + got_file_flag = 0x00; + return; + } + + if (search_type & AUTO_SEARCH_BIN) + { + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", UPDATE_FILE_PATH_1, UPDATE_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(UPDATE_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) + { + pfile = filp_open(UPDATE_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) + { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_2); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + } + else + { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_1); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + if (got_file_flag & BIN_FILE_READY) + { + #if GTP_AUTO_UPDATE_CFG + if (search_type & AUTO_SEARCH_CFG) + { + i = GUP_SEARCH_FILE_TIMES; // Bin & Cfg File required to be in the same directory + } + else + #endif + { + searching_file = 0; + return; + } + } + } + + #if GTP_AUTO_UPDATE_CFG + if ( (search_type & AUTO_SEARCH_CFG) && !(got_file_flag & CFG_FILE_READY) ) + { + GTP_DEBUG("Search for %s, %s for config update.(%d/%d)", CONFIG_FILE_PATH_1, CONFIG_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(CONFIG_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) + { + pfile = filp_open(CONFIG_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) + { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_2); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + } + else + { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_1); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + if (got_file_flag & CFG_FILE_READY) + { + searching_file = 0; + return; + } + } + #endif + msleep(3000); + } + searching_file = 0; +} +#endif + +static u8 gup_check_update_file(struct i2c_client *client, st_fw_head *fw_head, u8 *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + u8 buf[FW_HEAD_LENGTH]; + + got_file_flag = 0x00; + if (path) + { + GTP_DEBUG("Update File path:%s, %d", path, strlen(path)); + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) + { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + got_file_flag = BIN_FILE_READY; + } + else + { +#if GTP_AUTO_UPDATE + #if GTP_HEADER_FW_UPDATE + GTP_INFO("Update by default firmware array"); + update_msg.fw_total_len = sizeof(gtp_default_FW) - FW_HEAD_LENGTH; + if (sizeof(gtp_default_FW) < (FW_HEAD_LENGTH + FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) + { + GTP_ERROR("INVALID gtp_default_FW, check your gt9xx_firmware.h file!"); + return FAIL; + } + GTP_DEBUG("Firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + memcpy(fw_head, >p_default_FW[0], FW_HEAD_LENGTH); + + //check firmware legality + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) + { + fw_checksum += (gtp_default_FW[FW_HEAD_LENGTH + i] << 8) + gtp_default_FW[FW_HEAD_LENGTH + i + 1]; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if(fw_checksum&0xFFFF) + { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + got_file_flag = HEADER_FW_READY; + return SUCCESS; + + #else + #if GTP_AUTO_UPDATE_CFG + gup_search_file(AUTO_SEARCH_BIN | AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) + { + ret = gup_update_config(client); + if(ret <= 0) + { + GTP_ERROR("Update config failed!"); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); //waiting config to be stored in FLASH. + } + #else + gup_search_file(AUTO_SEARCH_BIN); + #endif + + if (!(got_file_flag & BIN_FILE_READY)) + { + GTP_ERROR("No bin file for fw Update"); + return FAIL; + } + #endif +#else + { + GTP_ERROR("NULL file for fw update!"); + return FAIL; + } +#endif + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + + if (update_msg.fw_total_len < (FW_HEAD_LENGTH + FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) + { + GTP_ERROR("INVALID bin file(size: %d), update aborted.", update_msg.fw_total_len); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + + GTP_DEBUG("Bin firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, FW_HEAD_LENGTH, &update_msg.file->f_pos); + if (ret < 0) + { + GTP_ERROR("Read firmware head in update file error."); + return FAIL; + } + + memcpy(fw_head, buf, FW_HEAD_LENGTH); + + //check firmware legality + fw_checksum = 0; + for(i=0; i < update_msg.fw_total_len; i+=2) + { + u16 temp; + ret = update_msg.file->f_op->read(update_msg.file, (char*)buf, 2, &update_msg.file->f_pos); + if (ret < 0) + { + GTP_ERROR("Read firmware file error."); + return FAIL; + } + //GTP_DEBUG("BUF[0]:%x", buf[0]); + temp = (buf[0]<<8) + buf[1]; + fw_checksum += temp; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if(fw_checksum&0xFFFF) + { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_proc(struct i2c_client *client, u8 *burn_buf, u16 start_addr, u16 total_length) +{ + s32 ret = 0; + u16 burn_addr = start_addr; + u16 frame_length = 0; + u16 burn_length = 0; + u8 wr_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 retry = 0; + + GTP_DEBUG("Begin burn %dk data to addr 0x%x", (total_length / 1024), start_addr); + + while (burn_length < total_length) + { + GTP_DEBUG("B/T:%04d/%04d", burn_length, total_length); + frame_length = ((total_length - burn_length) > PACK_SIZE) ? PACK_SIZE : (total_length - burn_length); + wr_buf[0] = (u8)(burn_addr >> 8); + rd_buf[0] = wr_buf[0]; + wr_buf[1] = (u8)burn_addr; + rd_buf[1] = wr_buf[1]; + memcpy(&wr_buf[GTP_ADDR_LENGTH], &burn_buf[burn_length], frame_length); + + for (retry = 0; retry < MAX_FRAME_CHECK_TIME; retry++) + { + ret = gup_i2c_write(client, wr_buf, GTP_ADDR_LENGTH + frame_length); + + if (ret <= 0) + { + GTP_ERROR("Write frame data i2c error."); + continue; + } + + ret = gup_i2c_read(client, rd_buf, GTP_ADDR_LENGTH + frame_length); + + if (ret <= 0) + { + GTP_ERROR("Read back frame data i2c error."); + continue; + } + + if (memcmp(&wr_buf[GTP_ADDR_LENGTH], &rd_buf[GTP_ADDR_LENGTH], frame_length)) + { + GTP_ERROR("Check frame data fail,not equal."); + GTP_DEBUG("write array:"); + GTP_DEBUG_ARRAY(&wr_buf[GTP_ADDR_LENGTH], frame_length); + GTP_DEBUG("read array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + continue; + } + else + { + //GTP_DEBUG("Check frame data success."); + break; + } + } + if(retry >= MAX_FRAME_CHECK_TIME) + { + GTP_ERROR("Burn frame data time out,exit."); + return FAIL; + } + burn_length += frame_length; + burn_addr += frame_length; + } + return SUCCESS; +} + +static u8 gup_load_section_file(u8 *buf, u32 offset, u16 length, u8 set_or_end) +{ +#if (GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) + if (HEADER_FW_READY == got_file_flag) + { + if(SEEK_SET == set_or_end) + { + memcpy(buf, >p_default_FW[FW_HEAD_LENGTH + offset], length); + } + else //seek end + { + memcpy(buf, >p_default_FW[update_msg.fw_total_len + FW_HEAD_LENGTH - offset], length); + } + return SUCCESS; + } +#endif + { + s32 ret = 0; + + if ( (update_msg.file == NULL) || IS_ERR(update_msg.file)) + { + GTP_ERROR("cannot find update file,load section file fail."); + return FAIL; + } + + if(SEEK_SET == set_or_end) + { + update_msg.file->f_pos = FW_HEAD_LENGTH + offset; + } + else //seek end + { + update_msg.file->f_pos = update_msg.fw_total_len + FW_HEAD_LENGTH - offset; + } + + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, length, &update_msg.file->f_pos); + + if (ret < 0) + { + GTP_ERROR("Read update file fail."); + return FAIL; + } + + return SUCCESS; + } +} + +static u8 gup_recall_check(struct i2c_client *client, u8 *chk_src, u16 start_rd_addr, u16 chk_length) +{ + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + s32 ret = 0; + u16 recall_addr = start_rd_addr; + u16 recall_length = 0; + u16 frame_length = 0; + + while (recall_length < chk_length) + { + frame_length = ((chk_length - recall_length) > PACK_SIZE) ? PACK_SIZE : (chk_length - recall_length); + ret = gup_get_ic_msg(client, recall_addr, rd_buf, frame_length); + + if (ret <= 0) + { + GTP_ERROR("recall i2c error,exit"); + return FAIL; + } + + if (memcmp(&rd_buf[GTP_ADDR_LENGTH], &chk_src[recall_length], frame_length)) + { + GTP_ERROR("Recall frame data fail,not equal."); + GTP_DEBUG("chk_src array:"); + GTP_DEBUG_ARRAY(&chk_src[recall_length], frame_length); + GTP_DEBUG("recall array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + return FAIL; + } + + recall_length += frame_length; + recall_addr += frame_length; + } + + GTP_DEBUG("Recall check %dk firmware success.", (chk_length / 1024)); + + return SUCCESS; +} + +static u8 gup_burn_fw_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + //step1:hold ss51 & dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]hold ss51 & dsp fail."); + return FAIL; + } + + //step2:set scramble + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]set scramble fail."); + return FAIL; + } + + //step3:select bank + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4) & 0x0F); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4) & 0x0F); + return FAIL; + } + + //step4:enable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + //step5:burn 8k fw section + ret = gup_burn_proc(client, fw_section, start_addr, FW_SECTION_LENGTH); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_section]burn fw_section fail."); + return FAIL; + } + + //step6:hold ss51 & release dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]hold ss51 & release dsp fail."); + return FAIL; + } + + //must delay + msleep(1); + + //step7:send burn cmd to move data to flash from sram + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd & 0x0f); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]send burn cmd fail."); + return FAIL; + } + + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + + do + { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]Get burn state fail"); + return FAIL; + } + + msleep(10); + //GTP_DEBUG("[burn_fw_section]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + } + while (rd_buf[GTP_ADDR_LENGTH]); + + //step8:select bank + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4) & 0x0F); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4) & 0x0F); + return FAIL; + } + + //step9:enable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + //step10:recall 8k fw section + ret = gup_recall_check(client, fw_section, start_addr, FW_SECTION_LENGTH); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_section]recall check %dk firmware fail.", FW_SECTION_LENGTH/1024); + return FAIL; + } + + //step11:disable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_section]disable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_dsp_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp_isp = NULL; + u8 retry = 0; + //u32 offset; + + GTP_INFO("[burn_dsp_isp]Begin burn dsp isp---->>"); + + //step1:alloc memory + GTP_DEBUG("[burn_dsp_isp]step1:alloc memory"); + + while (retry++ < 5) + { + fw_dsp_isp = (u8 *)kzalloc(FW_DSP_ISP_LENGTH, GFP_KERNEL); + + if (fw_dsp_isp == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_dsp_isp]Alloc %dk byte memory success.", (FW_DSP_ISP_LENGTH / 1024)); + break; + } + } + + if (retry >= 5) + { + GTP_ERROR("[burn_dsp_isp]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load dsp isp file data + GTP_DEBUG("[burn_dsp_isp]step2:load dsp isp file data"); + ret = gup_load_section_file(fw_dsp_isp, FW_DSP_ISP_LENGTH, FW_DSP_ISP_LENGTH, SEEK_END); + + if (FAIL == ret) + { + GTP_ERROR("[burn_dsp_isp]load firmware dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + //step3:disable wdt,clear cache enable + GTP_DEBUG("[burn_dsp_isp]step3:disable wdt,clear cache enable"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]disable wdt fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]clear cache enable fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step4:hold ss51 & dsp + GTP_DEBUG("[burn_dsp_isp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step5:set boot from sram + GTP_DEBUG("[burn_dsp_isp]step5:set boot from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]set boot from sram fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step6:software reboot + GTP_DEBUG("[burn_dsp_isp]step6:software reboot"); + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]software reboot fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step7:select bank2 + GTP_DEBUG("[burn_dsp_isp]step7:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]select bank2 fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step8:enable accessing code + GTP_DEBUG("[burn_dsp_isp]step8:enable accessing code"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]enable accessing code fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step9:burn 4k dsp_isp + GTP_DEBUG("[burn_dsp_isp]step9:burn 4k dsp_isp"); + ret = gup_burn_proc(client, fw_dsp_isp, 0xC000, FW_DSP_ISP_LENGTH); + + if (FAIL == ret) + { + GTP_ERROR("[burn_dsp_isp]burn dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + //step10:set scramble + GTP_DEBUG("[burn_dsp_isp]step10:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[burn_dsp_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + update_msg.fw_burned_len += FW_DSP_ISP_LENGTH; + GTP_DEBUG("[burn_dsp_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_dsp_isp: + kfree(fw_dsp_isp); + return ret; +} + +static u8 gup_burn_fw_ss51(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_ss51]Begin burn ss51 firmware---->>"); + + //step1:alloc memory + GTP_DEBUG("[burn_fw_ss51]step1:alloc memory"); + + while (retry++ < 5) + { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + + if (fw_ss51 == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_fw_ss51]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + + if (retry >= 5) + { + GTP_ERROR("[burn_fw_ss51]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load ss51 firmware section 1 file data + //GTP_DEBUG("[burn_fw_ss51]step2:load ss51 firmware section 1 file data"); + //ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH, SEEK_SET); +// +// if (FAIL == ret) +// { +// GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 1 fail."); +// goto exit_burn_fw_ss51; +// } + GTP_INFO("[burn_fw_ss51]Reset first 8K of ss51 to 0xFF."); + GTP_DEBUG("[burn_fw_ss51]step2: reset bank0 0xC000~0xD000"); + memset(fw_ss51, 0xFF, FW_SECTION_LENGTH); + + //step3:clear control flag + GTP_DEBUG("[burn_fw_ss51]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_ss51]clear control flag fail."); + ret = FAIL; + goto exit_burn_fw_ss51; + } + + //step4:burn ss51 firmware section 1 + GTP_DEBUG("[burn_fw_ss51]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_ss51; + } + + //step5:load ss51 firmware section 2 file data + GTP_DEBUG("[burn_fw_ss51]step5:load ss51 firmware section 2 file data"); + ret = gup_load_section_file(fw_ss51, FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + //step6:burn ss51 firmware section 2 + GTP_DEBUG("[burn_fw_ss51]step6:burn ss51 firmware section 2"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x02); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + //step7:load ss51 firmware section 3 file data + GTP_DEBUG("[burn_fw_ss51]step7:load ss51 firmware section 3 file data"); + ret = gup_load_section_file(fw_ss51, 2 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + //step8:burn ss51 firmware section 3 + GTP_DEBUG("[burn_fw_ss51]step8:burn ss51 firmware section 3"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x13); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + //step9:load ss51 firmware section 4 file data + GTP_DEBUG("[burn_fw_ss51]step9:load ss51 firmware section 4 file data"); + ret = gup_load_section_file(fw_ss51, 3 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + //step10:burn ss51 firmware section 4 + GTP_DEBUG("[burn_fw_ss51]step10:burn ss51 firmware section 4"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x14); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + update_msg.fw_burned_len += (FW_SECTION_LENGTH*4); + GTP_DEBUG("[burn_fw_ss51]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_ss51: + kfree(fw_ss51); + return ret; +} + +static u8 gup_burn_fw_dsp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_dsp]Begin burn dsp firmware---->>"); + //step1:alloc memory + GTP_DEBUG("[burn_fw_dsp]step1:alloc memory"); + + while (retry++ < 5) + { + fw_dsp = (u8 *)kzalloc(FW_DSP_LENGTH, GFP_KERNEL); + + if (fw_dsp == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_fw_dsp]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + + if (retry >= 5) + { + GTP_ERROR("[burn_fw_dsp]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load firmware dsp + GTP_DEBUG("[burn_fw_dsp]step2:load firmware dsp"); + ret = gup_load_section_file(fw_dsp, 4 * FW_SECTION_LENGTH, FW_DSP_LENGTH, SEEK_SET); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_dsp]load firmware dsp fail."); + goto exit_burn_fw_dsp; + } + + //step3:select bank3 + GTP_DEBUG("[burn_fw_dsp]step3:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_dsp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + //step4:hold ss51 & dsp + GTP_DEBUG("[burn_fw_dsp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_dsp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + //step5:set scramble + GTP_DEBUG("[burn_fw_dsp]step5:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_dsp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + //step6:release ss51 & dsp + GTP_DEBUG("[burn_fw_dsp]step6:release ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); //20121212 + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_dsp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + //must delay + msleep(1); + + //step7:burn 4k dsp firmware + GTP_DEBUG("[burn_fw_dsp]step7:burn 4k dsp firmware"); + ret = gup_burn_proc(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_dsp]burn fw_section fail."); + goto exit_burn_fw_dsp; + } + + //step8:send burn cmd to move data to flash from sram + GTP_DEBUG("[burn_fw_dsp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x05); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_dsp]send burn cmd fail."); + goto exit_burn_fw_dsp; + } + + GTP_DEBUG("[burn_fw_dsp]Wait for the burn is complete......"); + + do + { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + + if (ret <= 0) + { + GTP_ERROR("[burn_fw_dsp]Get burn state fail"); + goto exit_burn_fw_dsp; + } + + msleep(10); + //GTP_DEBUG("[burn_fw_dsp]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + } + while (rd_buf[GTP_ADDR_LENGTH]); + + //step9:recall check 4k dsp firmware + GTP_DEBUG("[burn_fw_dsp]step9:recall check 4k dsp firmware"); + ret = gup_recall_check(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_dsp]recall check 4k dsp firmware fail."); + goto exit_burn_fw_dsp; + } + + update_msg.fw_burned_len += FW_DSP_LENGTH; + GTP_DEBUG("[burn_fw_dsp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_dsp: + kfree(fw_dsp); + return ret; +} + +static u8 gup_burn_fw_boot(struct i2c_client *client) +{ + s32 ret = 0; + u8* fw_boot = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_boot]Begin burn bootloader firmware---->>"); + + //step1:Alloc memory + GTP_DEBUG("[burn_fw_boot]step1:Alloc memory"); + + while(retry++ < 5) + { + fw_boot = (u8*)kzalloc(FW_BOOT_LENGTH, GFP_KERNEL); + + if(fw_boot == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_fw_boot]Alloc %dk byte memory success.", (FW_BOOT_LENGTH/1024)); + break; + } + } + + if(retry >= 5) + { + GTP_ERROR("[burn_fw_boot]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load firmware bootloader + GTP_DEBUG("[burn_fw_boot]step2:load firmware bootloader"); + ret = gup_load_section_file(fw_boot, (4 * FW_SECTION_LENGTH + FW_DSP_LENGTH), FW_BOOT_LENGTH, SEEK_SET); + + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_boot]load firmware bootcode fail."); + goto exit_burn_fw_boot; + } + + //step3:hold ss51 & dsp + GTP_DEBUG("[burn_fw_boot]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + //step4:set scramble + GTP_DEBUG("[burn_fw_boot]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + //step5:hold ss51 & release dsp + GTP_DEBUG("[burn_fw_boot]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); //20121211 + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + //must delay + msleep(1); + + //step6:select bank3 + GTP_DEBUG("[burn_fw_boot]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + //step7:burn 2k bootloader firmware + GTP_DEBUG("[burn_fw_boot]step7:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_boot]burn fw_boot fail."); + goto exit_burn_fw_boot; + } + + //step7:send burn cmd to move data to flash from sram + GTP_DEBUG("[burn_fw_boot]step7:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x06); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot]send burn cmd fail."); + goto exit_burn_fw_boot; + } + GTP_DEBUG("[burn_fw_boot]Wait for the burn is complete......"); + do{ + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot]Get burn state fail"); + goto exit_burn_fw_boot; + } + msleep(10); + //GTP_DEBUG("[burn_fw_boot]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + }while(rd_buf[GTP_ADDR_LENGTH]); + + //step8:recall check 2k bootloader firmware + GTP_DEBUG("[burn_fw_boot]step8:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_boot]recall check 2k bootcode firmware fail."); + goto exit_burn_fw_boot; + } + + update_msg.fw_burned_len += FW_BOOT_LENGTH; + GTP_DEBUG("[burn_fw_boot]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot: + kfree(fw_boot); + return ret; +} + + +static u8 gup_burn_fw_boot_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8* fw_boot_isp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + if(update_msg.fw_burned_len >= update_msg.fw_total_len) + { + GTP_DEBUG("No need to upgrade the boot_isp code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_boot_isp]Begin burn boot_isp firmware---->>"); + + //step1:Alloc memory + GTP_DEBUG("[burn_fw_boot_isp]step1:Alloc memory"); + while(retry++ < 5) + { + fw_boot_isp = (u8*)kzalloc(FW_BOOT_ISP_LENGTH, GFP_KERNEL); + if(fw_boot_isp == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_fw_boot_isp]Alloc %dk byte memory success.", (FW_BOOT_ISP_LENGTH/1024)); + break; + } + } + if(retry >= 5) + { + GTP_ERROR("[burn_fw_boot_isp]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load firmware bootloader + GTP_DEBUG("[burn_fw_boot_isp]step2:load firmware bootloader isp"); + //ret = gup_load_section_file(fw_boot_isp, (4*FW_SECTION_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH+FW_DSP_ISP_LENGTH), FW_BOOT_ISP_LENGTH, SEEK_SET); + ret = gup_load_section_file(fw_boot_isp, (update_msg.fw_burned_len - FW_DSP_ISP_LENGTH), FW_BOOT_ISP_LENGTH, SEEK_SET); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_boot_isp]load firmware boot_isp fail."); + goto exit_burn_fw_boot_isp; + } + + //step3:hold ss51 & dsp + GTP_DEBUG("[burn_fw_boot_isp]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + //step4:set scramble + GTP_DEBUG("[burn_fw_boot_isp]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + //step5:hold ss51 & release dsp + GTP_DEBUG("[burn_fw_boot_isp]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); //20121211 + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot_isp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + //must delay + msleep(1); + + //step6:select bank3 + GTP_DEBUG("[burn_fw_boot_isp]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot_isp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + //step7:burn 2k bootload_isp firmware + GTP_DEBUG("[burn_fw_boot_isp]step7:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_boot_isp]burn fw_section fail."); + goto exit_burn_fw_boot_isp; + } + + //step7:send burn cmd to move data to flash from sram + GTP_DEBUG("[burn_fw_boot_isp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x07); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot_isp]send burn cmd fail."); + goto exit_burn_fw_boot_isp; + } + GTP_DEBUG("[burn_fw_boot_isp]Wait for the burn is complete......"); + do{ + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_boot_isp]Get burn state fail"); + goto exit_burn_fw_boot_isp; + } + msleep(10); + //GTP_DEBUG("[burn_fw_boot_isp]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + }while(rd_buf[GTP_ADDR_LENGTH]); + + //step8:recall check 2k bootload_isp firmware + GTP_DEBUG("[burn_fw_boot_isp]step9:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_boot_isp]recall check 2k bootcode_isp firmware fail."); + goto exit_burn_fw_boot_isp; + } + + update_msg.fw_burned_len += FW_BOOT_ISP_LENGTH; + GTP_DEBUG("[burn_fw_boot_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot_isp: + kfree(fw_boot_isp); + return ret; +} + +static u8 gup_burn_fw_link(struct i2c_client *client) +{ + s32 ret = 0; + u8* fw_link = NULL; + u8 retry = 0; + u32 offset; + + if(update_msg.fw_burned_len >= update_msg.fw_total_len) + { + GTP_DEBUG("No need to upgrade the link code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_link]Begin burn link firmware---->>"); + + //step1:Alloc memory + GTP_DEBUG("[burn_fw_link]step1:Alloc memory"); + while(retry++ < 5) + { + fw_link = (u8*)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if(fw_link == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_fw_link]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if(retry >= 5) + { + GTP_ERROR("[burn_fw_link]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load firmware link section 1 + GTP_DEBUG("[burn_fw_link]step2:load firmware link section 1"); + offset = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_SECTION_LENGTH, SEEK_SET); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_link]load firmware link section 1 fail."); + goto exit_burn_fw_link; + } + + //step3:burn link firmware section 1 + GTP_DEBUG("[burn_fw_link]step3:burn link firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_SECTION_LENGTH, 0x38); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_link]burn link firmware section 1 fail."); + goto exit_burn_fw_link; + } + + //step4:load link firmware section 2 file data + GTP_DEBUG("[burn_fw_link]step4:load link firmware section 2 file data"); + offset += FW_SECTION_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_GLINK_LENGTH - FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_link]load link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + //step5:burn link firmware section 2 + GTP_DEBUG("[burn_fw_link]step4:burn link firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_GLINK_LENGTH - FW_SECTION_LENGTH, 0x39); + + if (FAIL == ret) + { + GTP_ERROR("[burn_fw_link]burn link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + update_msg.fw_burned_len += FW_GLINK_LENGTH; + GTP_DEBUG("[burn_fw_link]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_link: + kfree(fw_link); + return ret; +} + +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd ) +{ + s32 ret = 0; + u8 rd_buf[5]; + + //step1:hold ss51 & dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_app_section]hold ss51 & dsp fail."); + return FAIL; + } + + //step2:set scramble + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_app_section]set scramble fail."); + return FAIL; + } + + //step3:hold ss51 & release dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_app_section]hold ss51 & release dsp fail."); + return FAIL; + } + //must delay + msleep(1); + + //step4:select bank + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + //step5:burn fw section + ret = gup_burn_proc(client, fw_section, start_addr, len); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_app_section]burn fw_section fail."); + return FAIL; + } + + //step6:send burn cmd to move data to flash from sram + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0F); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_app_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do{ + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_app_section]Get burn state fail"); + return FAIL; + } + msleep(10); + //GTP_DEBUG("[burn_fw_app_section]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + }while(rd_buf[GTP_ADDR_LENGTH]); + + //step7:recall fw section + ret = gup_recall_check(client, fw_section, start_addr, len); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_app_section]recall check %dk firmware fail.", len/1024); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_fw_gwake(struct i2c_client *client) +{ + u8* fw_gwake = NULL; + u8 retry = 0; + s32 ret = 0; + u16 start_index = 4*FW_SECTION_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH+FW_BOOT_ISP_LENGTH+FW_GLINK_LENGTH; // 32 + 4 + 2 + 4 = 42K + //u16 start_index; + + if(update_msg.fw_burned_len >= update_msg.fw_total_len) + { + GTP_DEBUG("No need to upgrade the gwake code!"); + return SUCCESS; + } + //start_index = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH; + GTP_INFO("[burn_fw_gwake]Begin burn gwake firmware---->>"); + + //step1:alloc memory + GTP_DEBUG("[burn_fw_gwake]step1:alloc memory"); + while(retry++ < 5) + { + fw_gwake = (u8*)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if(fw_gwake == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_fw_gwake]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if(retry >= 5) + { + GTP_ERROR("[burn_fw_gwake]Alloc memory fail,exit."); + return FAIL; + } + + //clear control flag + ret = gup_set_ic_msg(client,_rRW_MISCTL__BOOT_CTL_, 0x00); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_gwake; + } + + //step2:load app_code firmware section 1 file data + GTP_DEBUG("[burn_fw_gwake]step2:load app_code firmware section 1 file data"); + ret = gup_load_section_file(fw_gwake, start_index, FW_SECTION_LENGTH, SEEK_SET); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + //step3:burn app_code firmware section 1 + GTP_DEBUG("[burn_fw_gwake]step3:burn app_code firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3A); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + //step5:load app_code firmware section 2 file data + GTP_DEBUG("[burn_fw_gwake]step5:load app_code firmware section 2 file data"); + ret = gup_load_section_file(fw_gwake, start_index+FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + //step6:burn app_code firmware section 2 + GTP_DEBUG("[burn_fw_gwake]step6:burn app_code firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3B); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + //step7:load app_code firmware section 3 file data + GTP_DEBUG("[burn_fw_gwake]step7:load app_code firmware section 3 file data"); + ret = gup_load_section_file(fw_gwake, start_index+2*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + //step8:burn app_code firmware section 3 + GTP_DEBUG("[burn_fw_gwake]step8:burn app_code firmware section 3"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3C); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + //step9:load app_code firmware section 4 file data + GTP_DEBUG("[burn_fw_gwake]step9:load app_code firmware section 4 file data"); + ret = gup_load_section_file(fw_gwake, start_index + 3*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + //step10:burn app_code firmware section 4 + GTP_DEBUG("[burn_fw_gwake]step10:burn app_code firmware section 4"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3D); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + //update_msg.fw_burned_len += FW_GWAKE_LENGTH; + GTP_DEBUG("[burn_fw_gwake]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_gwake: + kfree(fw_gwake); + return ret; +} + +static u8 gup_burn_fw_finish(struct i2c_client *client) +{ + u8* fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_finish]burn first 8K of ss51 and finish update."); + //step1:alloc memory + GTP_DEBUG("[burn_fw_finish]step1:alloc memory"); + while(retry++ < 5) + { + fw_ss51 = (u8*)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if(fw_ss51 == NULL) + { + continue; + } + else + { + GTP_DEBUG("[burn_fw_finish]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if(retry >= 5) + { + GTP_ERROR("[burn_fw_finish]Alloc memory fail,exit."); + return FAIL; + } + + GTP_DEBUG("[burn_fw_finish]step2: burn ss51 first 8K."); + ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH, SEEK_SET); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_finish]load ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if(FAIL == ret) + { + GTP_ERROR("[burn_fw_finish]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + //step11:enable download DSP code + GTP_DEBUG("[burn_fw_finish]step5:enable download DSP code "); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x99); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_finish]enable download DSP code fail."); + goto exit_burn_fw_finish; + } + + //step12:release ss51 & hold dsp + GTP_DEBUG("[burn_fw_finish]step6:release ss51 & hold dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x08); + if(ret <= 0) + { + GTP_ERROR("[burn_fw_finish]release ss51 & hold dsp fail."); + goto exit_burn_fw_finish; + } + + if (fw_ss51) + { + kfree(fw_ss51); + } + return SUCCESS; + +exit_burn_fw_finish: + if (fw_ss51) + { + kfree(fw_ss51); + } + return FAIL; +} + +s32 gup_update_proc(void *dir) +{ + s32 ret = 0; + u8 retry = 0; + s32 update_ret = FAIL; + st_fw_head fw_head; + + GTP_INFO("[update_proc]Begin update ......"); + +#if GTP_AUTO_UPDATE + if (1 == searching_file) + { + u8 timeout = 0; + searching_file = 0; // exit .bin update file searching + GTP_INFO("Exiting searching file for auto update."); + while ((show_len != 200) && (show_len != 100) && (timeout++ < 150)) // wait for auto update quitted completely + { + msleep(100); + } + } +#endif + + show_len = 1; + total_len = 100; + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + return gup_fw_download_proc(dir, GTP_FL_FW_BURN); + } +#endif + + update_msg.file = NULL; + ret = gup_check_update_file(i2c_client_point, &fw_head, (u8*)dir); //20121211 + if (FAIL == ret) + { + GTP_ERROR("[update_proc]check update file fail."); + goto file_fail; + } + + //gtp_reset_guitar(i2c_client_point, 20); + ret = gup_get_ic_fw_msg(i2c_client_point); + + if (FAIL == ret) + { + GTP_ERROR("[update_proc]get ic message fail."); + goto file_fail; + } + + ret = gup_enter_update_judge(&fw_head); //20121212 + + if (FAIL == ret) + { + GTP_ERROR("[update_proc]Check *.bin file fail."); + goto file_fail; + } + + gtp_loading_fw = 1; + + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); +#if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_OFF); +#endif + ret = gup_enter_update_mode(i2c_client_point); + + if (FAIL == ret) + { + GTP_ERROR("[update_proc]enter update mode fail."); + goto update_fail; + } + + while (retry++ < 5) + { + show_len = 10; + total_len = 100; + update_msg.fw_burned_len = 0; + ret = gup_burn_dsp_isp(i2c_client_point); + if(FAIL == ret) + { + GTP_ERROR("[update_proc]burn dsp isp fail."); + continue; + } + /* burn gwake fw first */ + show_len = 20; + ret = gup_burn_fw_gwake(i2c_client_point); + if (FAIL == ret) + { + GTP_ERROR("[update_proc]burn app_code firmware fail."); + continue; + } + + show_len = 30; + ret = gup_burn_fw_ss51(i2c_client_point); + if(FAIL == ret) + { + GTP_ERROR("[update_proc]burn ss51 firmware fail."); + continue; + } + + show_len = 40; + ret = gup_burn_fw_dsp(i2c_client_point); + if(FAIL == ret) + { + GTP_ERROR("[update_proc]burn dsp firmware fail."); + continue; + } + + show_len = 50; + ret = gup_burn_fw_boot(i2c_client_point); + if(FAIL == ret) + { + GTP_ERROR("[update_proc]burn bootloader firmware fail."); + continue; + } + show_len = 60; + + ret = gup_burn_fw_boot_isp(i2c_client_point); + if (FAIL == ret) + { + GTP_ERROR("[update_proc]burn boot_isp firmware fail."); + continue; + } + + show_len = 70; + ret = gup_burn_fw_link(i2c_client_point); + if (FAIL == ret) + { + GTP_ERROR("[update_proc]burn link firmware fail."); + continue; + } + + show_len = 80; + + ret = gup_burn_fw_finish(i2c_client_point); + if (FAIL == ret) + { + GTP_ERROR("[update_proc]burn finish fail."); + continue; + } + show_len = 90; + GTP_INFO("[update_proc]UPDATE SUCCESS."); + retry = 0; + break; + } + + if (retry >= 5) + { + GTP_ERROR("[update_proc]retry timeout,UPDATE FAIL."); + update_ret = FAIL; + } + else + { + update_ret = SUCCESS; + } + +update_fail: + GTP_DEBUG("[update_proc]leave update mode."); + gup_leave_update_mode(); + + msleep(100); + + if (SUCCESS == update_ret) + { + GTP_DEBUG("[update_proc]send config."); + ret = gtp_send_cfg(i2c_client_point); + if (ret < 0) + { + GTP_ERROR("[update_proc]send config fail."); + } + } + gtp_loading_fw = 0; + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +#if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_ON); +#endif + +file_fail: + + if (update_msg.file && !IS_ERR(update_msg.file)) + { + if (update_msg.old_fs) + { + set_fs(update_msg.old_fs); + } + filp_close(update_msg.file, NULL); + } +#if (GTP_AUTO_UPDATE && GTP_AUTO_UPDATE_CFG && GTP_HEADER_FW_UPDATE) + if (NULL == dir) + { + gup_search_file(AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) + { + ret = gup_update_config(i2c_client_point); + if(ret <= 0) + { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); //waiting config to be stored in FLASH. + } + } +#endif + + total_len = 100; + if (SUCCESS == update_ret) + { + show_len = 100; + return SUCCESS; + } + else + { + show_len = 200; + return FAIL; + } +} + +#if GTP_AUTO_UPDATE +u8 gup_init_update_proc(struct i2c_client *client) +{ + struct task_struct *thread = NULL; + + GTP_INFO("Ready to run auto update thread"); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == gtp_chip_type) + { + thread = kthread_run(gup_update_proc, "update", "fl_auto_update"); + } + else +#endif + { + thread = kthread_run(gup_update_proc, (void *)NULL, "guitar_update"); + } + if (IS_ERR(thread)) + { + GTP_ERROR("Failed to create update thread.\n"); + return -1; + } + + return 0; +} +#endif + + +//******************* For GT9XXF Start ********************// + +#define FL_UPDATE_PATH "/data/_fl_update_.bin" +#define FL_UPDATE_PATH_SD "/sdcard/_fl_update_.bin" + +#define GUP_FW_CHK_SIZE 256 +#define MAX_CHECK_TIMES 128 // max: 2 * (16 * 1024) / 256 = 128 + +//for clk cal +#define PULSE_LENGTH (200) +#define INIT_CLK_DAC (50) +#define MAX_CLK_DAC (120) +#define CLK_AVG_TIME (1) +#define MILLION 1000000 + +#define _wRW_MISCTL__RG_DMY 0x4282 +#define _bRW_MISCTL__RG_OSC_CALIB 0x4268 +#define _fRW_MISCTL__GIO0 0x41e9 +#define _fRW_MISCTL__GIO1 0x41ed +#define _fRW_MISCTL__GIO2 0x41f1 +#define _fRW_MISCTL__GIO3 0x41f5 +#define _fRW_MISCTL__GIO4 0x41f9 +#define _fRW_MISCTL__GIO5 0x41fd +#define _fRW_MISCTL__GIO6 0x4201 +#define _fRW_MISCTL__GIO7 0x4205 +#define _fRW_MISCTL__GIO8 0x4209 +#define _fRW_MISCTL__GIO9 0x420d +#define _fRW_MISCTL__MEA 0x41a0 +#define _bRW_MISCTL__MEA_MODE 0x41a1 +#define _wRW_MISCTL__MEA_MAX_NUM 0x41a4 +#define _dRO_MISCTL__MEA_VAL 0x41b0 +#define _bRW_MISCTL__MEA_SRCSEL 0x41a3 +#define _bRO_MISCTL__MEA_RDY 0x41a8 +#define _rRW_MISCTL__ANA_RXADC_B0_ 0x4250 +#define _bRW_MISCTL__RG_LDO_A18_PWD 0x426f +#define _bRW_MISCTL__RG_BG_PWD 0x426a +#define _bRW_MISCTL__RG_CLKGEN_PWD 0x4269 +#define _fRW_MISCTL__RG_RXADC_PWD 0x426a +#define _bRW_MISCTL__OSC_CK_SEL 0x4030 +#define _rRW_MISCTL_RG_DMY83 0x4283 +#define _rRW_MISCTL__GIO1CTL_B2_ 0x41ee +#define _rRW_MISCTL__GIO1CTL_B1_ 0x41ed + +#if GTP_COMPATIBLE_MODE + +u8 gup_check_fs_mounted(char *path_name) +{ + struct path root_path; + struct path path; + int err; + err = kern_path("/", LOOKUP_FOLLOW, &root_path); + + if (err) + return FAIL; + + err = kern_path(path_name, LOOKUP_FOLLOW, &path); + + if (err) { + err = FAIL; + goto exit_chk; + } + + if (path.mnt->mnt_sb == root_path.mnt->mnt_sb) { + err = FAIL; + } else { + err = SUCCESS; + } + + path_put(&path); +exit_chk: + path_put(&root_path); + return err; +} + +s32 gup_hold_ss51_dsp(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + while(retry++ < 200) + { + // step4:Hold ss51 & dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) + { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + // step5:Confirm hold + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) + { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) + { + GTP_DEBUG("[enter_update_mode]Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if(retry >= 200) + { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + //DSP_CK and DSP_ALU_CK PowerOn + ret = gup_set_ic_msg(client, 0x4010, 0x00); + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]DSP_CK and DSP_ALU_CK PowerOn fail."); + return FAIL; + } + + //disable wdt + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]disable wdt fail."); + return FAIL; + } + + //clear cache enable + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]clear cache enable fail."); + return FAIL; + } + + //set boot from sram + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]set boot from sram fail."); + return FAIL; + } + + //software reboot + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]software reboot fail."); + return FAIL; + } + + return SUCCESS; +} + +s32 gup_enter_update_mode_fl(struct i2c_client *client) +{ + s32 ret = -1; + //s32 retry = 0; + //u8 rd_buf[3]; + + //step1:RST output low last at least 2ms + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + msleep(2); + + //step2:select I2C slave addr,INT:0--0xBA;1--0x28. + GTP_GPIO_OUTPUT(GTP_INT_PORT, (client->addr == 0x14)); + msleep(2); + + //step3:RST output high reset guitar + GTP_GPIO_OUTPUT(GTP_RST_PORT, 1); + + msleep(5); + + //select addr & hold ss51_dsp + ret = gup_hold_ss51_dsp(client); + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]hold ss51 & dsp failed."); + return FAIL; + } + + //clear control flag + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]clear control flag fail."); + return FAIL; + } + + //set scramble + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]set scramble fail."); + return FAIL; + } + + //enable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) + { + GTP_ERROR("[enter_update_mode]enable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + + +static s32 gup_prepare_fl_fw(char *path, st_fw_head *fw_head) +{ + s32 i = 0; + s32 ret = 0; + s32 timeout = 0; + + if (!memcmp(path, "update", 6)) + { + GTP_INFO("Search for Flashless firmware file to update"); + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) + { + if (0 == searching_file) + { + GTP_INFO("Force terminate searching file auto update."); + return FAIL; + } + update_msg.file = filp_open(FL_UPDATE_PATH, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) + { + update_msg.file = filp_open(FL_UPDATE_PATH_SD, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) + { + msleep(2000); + continue; + } + else + { + path = FL_UPDATE_PATH_SD; + break; + } + } + else + { + path = FL_UPDATE_PATH; + break; + } + } + searching_file = 0; + if (i >= 50) + { + GTP_ERROR("Search timeout, update aborted"); + return FAIL; + } + else + { + _CLOSE_FILE(update_msg.file); + } + while (rqst_processing && (timeout++ < 15)) + { + GTP_INFO("wait for request process completed!"); + msleep(1000); + } + } + + GTP_INFO("Firmware update file path: %s", path); + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) + { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + if (sizeof(gtp_default_FW_fl) != update_msg.fw_total_len) + { + GTP_ERROR("Inconsistent firmware size. File size: %d, default fw size: %d", update_msg.fw_total_len, sizeof(gtp_default_FW_fl)); + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + return FAIL; + } + + GTP_DEBUG("Firmware size: %d", update_msg.fw_total_len); + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.file->f_op->read(update_msg.file, (char*)fw_head, FW_HEAD_LENGTH, &update_msg.file->f_pos); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + //copy fw file to gtp_default_FW_fl array + ret = update_msg.file->f_op->read(update_msg.file, + (char*)gtp_default_FW_fl, + update_msg.fw_total_len, + &update_msg.file->f_pos); + if (ret < 0) + { + GTP_ERROR("Failed to read firmware data from %s, err-code: %d", path, ret); + ret = FAIL; + } + else + { + ret = SUCCESS; + } + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + return ret; +} + +static u8 gup_check_update_file_fl(struct i2c_client *client, st_fw_head *fw_head, char *path) +{ + s32 i = 0; + s32 fw_checksum = 0; + s32 ret = 0; + + if (NULL != path) + { + ret = gup_prepare_fl_fw(path, fw_head); + if (ret == FAIL) + { + return FAIL; + } + } else { + update_msg.fw_total_len = sizeof(gtp_default_FW_fl); + } + + memcpy(fw_head, gtp_default_FW_fl, FW_HEAD_LENGTH); + GTP_INFO("FILE HARDWARE INFO:%02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID:%s", fw_head->pid); + fw_head->vid = ((fw_head->vid & 0xFF00) >> 8) + ((fw_head->vid & 0x00FF) << 8); + GTP_INFO("FILE VID:%04x", fw_head->vid); + + //check firmware legality + fw_checksum = 0; + for (i = FW_HEAD_LENGTH; i < update_msg.fw_total_len; i += 2) + { + fw_checksum += (gtp_default_FW_fl[i]<<8) + gtp_default_FW_fl[i+1]; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if(fw_checksum&0xFFFF) + { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_download_fw_ss51(struct i2c_client *client, u8 dwn_mode) +{ + s32 ret = 0; + + if (GTP_FL_FW_BURN == dwn_mode) + { + GTP_INFO("[download_fw_ss51]Begin download ss51 firmware---->>"); + } + else + { + GTP_INFO("[download_fw_ss51]Begin check ss51 firmware----->>"); + } + //step1:download FW section 1 + GTP_DEBUG("[download_fw_ss51]step1:download FW section 1"); + ret = gup_set_ic_msg(i2c_client_point, _bRW_MISCTL__SRAM_BANK, 0x00); + + if (ret <= 0) + { + GTP_ERROR("[download_fw_ss51]select bank0 fail."); + ret = FAIL; + goto exit_download_fw_ss51; + } + + + ret = i2c_write_bytes(client, 0xC000, + >p_default_FW_fl[FW_HEAD_LENGTH], FW_DOWNLOAD_LENGTH); // write the first bank + + if (ret == -1) + { + GTP_ERROR("[download_fw_ss51]download FW section 1 fail."); + ret = FAIL; + goto exit_download_fw_ss51; + } + + + if (GTP_FL_FW_BURN == dwn_mode) + { + ret = gup_check_and_repair(i2c_client_point, + 0xC000, + >p_default_FW_fl[FW_HEAD_LENGTH], + FW_DOWNLOAD_LENGTH); + if(FAIL == ret) + { + GTP_ERROR("[download_fw_ss51]Checked FW section 1 fail."); + goto exit_download_fw_ss51; + } + } + + //step2:download FW section 2 + GTP_DEBUG("[download_fw_ss51]step2:download FW section 2"); + ret = gup_set_ic_msg(i2c_client_point, _bRW_MISCTL__SRAM_BANK, 0x01); + + if (ret <= 0) + { + GTP_ERROR("[download_fw_ss51]select bank1 fail."); + ret = FAIL; + goto exit_download_fw_ss51; + } + + ret = i2c_write_bytes(client, 0xC000, >p_default_FW_fl[FW_HEAD_LENGTH+FW_DOWNLOAD_LENGTH],FW_DOWNLOAD_LENGTH); // write the second bank + + if (ret == -1) + { + GTP_ERROR("[download_fw_ss51]download FW section 2 fail."); + ret = FAIL; + goto exit_download_fw_ss51; + } + + if (GTP_FL_FW_BURN == dwn_mode) + { + ret = gup_check_and_repair(i2c_client_point, + 0xC000, + >p_default_FW_fl[FW_HEAD_LENGTH+FW_DOWNLOAD_LENGTH], + FW_DOWNLOAD_LENGTH); + + if(FAIL == ret) + { + GTP_ERROR("[download_fw_ss51]Checked FW section 2 fail."); + goto exit_download_fw_ss51; + } + } + ret = SUCCESS; + +exit_download_fw_ss51: + + return ret; +} +#if (!GTP_SUPPORT_I2C_DMA) +static s32 i2c_auto_read(struct i2c_client *client,u8 *rxbuf, int len) +{ + u8 retry; + u16 left = len; + u16 offset = 0; + + struct i2c_msg msg = + { + .addr = ((client->addr &I2C_MASK_FLAG) | (I2C_ENEXT_FLAG)), + //.addr = ((client->addr &I2C_MASK_FLAG) | (I2C_PUSHPULL_FLAG)), + .flags = I2C_M_RD, + .timing = I2C_MASTER_CLOCK + }; + + if(NULL == rxbuf) + { + return -1; + } + + while (left > 0) + { + msg.buf = &rxbuf[offset]; + + if (left > MAX_TRANSACTION_LENGTH) + { + msg.len = MAX_TRANSACTION_LENGTH; + left -= MAX_TRANSACTION_LENGTH; + offset += MAX_TRANSACTION_LENGTH; + } + else + { + msg.len = left; + left = 0; + } + + retry = 0; + + while (i2c_transfer(client->adapter, &msg, 1) != 1) + { + retry++; + + if (retry == 20) + { + GTP_ERROR("I2C read 0x%X length=%d failed\n", offset, len); + return -1; + } + } + } + + return 0; +} +#endif + +static u8 gup_check_and_repair(struct i2c_client *client, s32 chk_start_addr, u8 *target_fw, u32 chk_total_length) +{ + s32 ret = 0; + u32 chked_len = 0; + u8 chked_times = 0; + u32 chk_addr = 0; + u8 chk_buf[GUP_FW_CHK_SIZE]; + u32 rd_size = 0; + u8 flag_err = 0; + s32 i = 0; + + chk_addr = chk_start_addr; + while((chked_times < MAX_CHECK_TIMES) && (chked_len < chk_total_length)) + { + rd_size = chk_total_length - chked_len; + if(rd_size >= GUP_FW_CHK_SIZE) + { + rd_size = GUP_FW_CHK_SIZE; + } + #if GTP_SUPPORT_I2C_DMA + ret = i2c_read_bytes(client, chk_addr, chk_buf, rd_size); + #else + if (!i) + { + ret = i2c_read_bytes(client, chk_addr, chk_buf, rd_size); + } + else + { + ret = i2c_auto_read(client, chk_buf, rd_size); + } + #endif + + if(-1 == ret) + { + GTP_ERROR("Read chk ram fw i2c error"); + chked_times++; + continue; + } + + for(i=0; i= MAX_CHECK_TIMES) + { + GTP_ERROR("Ram data check failed."); + return FAIL; + } + return SUCCESS; +} + +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode) +{ + s32 ret = 0; + + if(GTP_FL_FW_BURN == dwn_mode) + { + GTP_INFO("[download_fw_dsp]Begin download dsp fw---->>"); + } + else + { + GTP_INFO("[download_fw_dsp]Begin check dsp fw---->>"); + } + + //step1:select bank2 + GTP_DEBUG("[download_fw_dsp]step1:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + + if (ret <= 0) + { + GTP_ERROR("[download_fw_dsp]select bank2 fail."); + ret = FAIL; + goto exit_download_fw_dsp; + } + + ret = i2c_write_bytes(client, + 0xC000, + >p_default_FW_fl[FW_HEAD_LENGTH+2*FW_DOWNLOAD_LENGTH], + FW_DSP_LENGTH); // write the second bank + if (ret == -1) + { + GTP_ERROR("[download_fw_dsp]download FW dsp fail."); + ret = FAIL; + goto exit_download_fw_dsp; + } + + if (GTP_FL_FW_BURN == dwn_mode) + { + ret = gup_check_and_repair(client, + 0xC000, + >p_default_FW_fl[FW_HEAD_LENGTH+2*FW_DOWNLOAD_LENGTH], + FW_DSP_LENGTH); + + if(FAIL == ret) + { + GTP_ERROR("[download_fw_dsp]Checked FW dsp fail."); + goto exit_download_fw_dsp; + } + + } + ret = SUCCESS; + +exit_download_fw_dsp: + + return ret; +} + + + +s32 gup_fw_download_proc(void *dir, u8 dwn_mode) +{ + s32 ret = 0; + u8 retry = 0; + st_fw_head fw_head; + + if(GTP_FL_FW_BURN == dwn_mode) + { + GTP_INFO("[fw_download_proc]Begin fw download ......"); + } + else + { + GTP_INFO("[fw_download_proc]Begin fw check ......"); + } + + show_len = 0; + total_len = 100; + + ret = gup_check_update_file_fl(i2c_client_point, &fw_head, (char *)dir); + + show_len = 10; + + if (FAIL == ret) + { + GTP_ERROR("[fw_download_proc]check update file fail."); + goto file_fail; + } + + if (!memcmp(fw_head.pid, "950", 3)) + { + is_950 = 1; + GTP_DEBUG("GT9XXF IC Type: gt950"); + } + else + { + is_950 = 0; + } + + if (NULL != dir) + { + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + #if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_OFF); + #endif + } + + ret = gup_enter_update_mode_fl(i2c_client_point); + show_len = 20; + + if (FAIL == ret) + { + GTP_ERROR("[fw_download_proc]enter update mode fail."); + goto download_fail; + } + + while (retry++ < 5) + { + ret = gup_download_fw_ss51(i2c_client_point, dwn_mode); + show_len = 60; + if (FAIL == ret) + { + GTP_ERROR("[fw_download_proc]burn ss51 firmware fail."); + continue; + } + + ret = gup_download_fw_dsp(i2c_client_point, dwn_mode); + show_len = 80; + if (FAIL == ret) + { + GTP_ERROR("[fw_download_proc]burn dsp firmware fail."); + continue; + } + GTP_INFO("[fw_download_proc]UPDATE SUCCESS."); + retry = 0; + break; + } + + if (retry >= 5) + { + GTP_ERROR("[fw_download_proc]retry timeout,UPDATE FAIL."); + goto download_fail; + } + + if (NULL != dir) + { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + gtp_fw_startup(i2c_client_point); + #if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_ON); + #endif + } + show_len = 100; + return SUCCESS; + +download_fail: + if (NULL != dir) + { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + gtp_fw_startup(i2c_client_point); + #if GTP_ESD_PROTECT + gtp_esd_switch(i2c_client_point, SWITCH_ON); + #endif + } + +file_fail: + show_len = 200; + return FAIL; +} + + +static void gup_bit_write(s32 addr, s32 bit, s32 val) +{ + u8 buf; + i2c_read_bytes(i2c_client_point, addr, &buf, 1); + + buf = (buf & (~((u8)1 << bit))) | ((u8)val << bit); + + i2c_write_bytes(i2c_client_point, addr, &buf, 1); +} + +static void gup_clk_count_init(s32 bCh, s32 bCNT) +{ + u8 buf; + + //_fRW_MISCTL__MEA_EN = 0; //Frequency measure enable + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + //_fRW_MISCTL__MEA_CLR = 1; //Frequency measure clear + gup_bit_write(_fRW_MISCTL__MEA, 1, 1); + //_bRW_MISCTL__MEA_MODE = 0; //Pulse mode + buf = 0; + i2c_write_bytes(i2c_client_point, _bRW_MISCTL__MEA_MODE, &buf, 1); + //_bRW_MISCTL__MEA_SRCSEL = 8 + bCh; //From GIO1 + buf = 8 + bCh; + i2c_write_bytes(i2c_client_point, _bRW_MISCTL__MEA_SRCSEL, &buf, 1); + //_wRW_MISCTL__MEA_MAX_NUM = bCNT; //Set the Measure Counts = 1 + buf = bCNT; + i2c_write_bytes(i2c_client_point, _wRW_MISCTL__MEA_MAX_NUM, &buf, 1); + //_fRW_MISCTL__MEA_CLR = 0; //Frequency measure not clear + gup_bit_write(_fRW_MISCTL__MEA, 1, 0); + //_fRW_MISCTL__MEA_EN = 1; + gup_bit_write(_fRW_MISCTL__MEA, 0, 1); +} + +static u32 gup_clk_count_get(void) +{ + s32 ready = 0; + s32 temp; + s8 buf[4]; + + while ((ready == 0)) //Wait for measurement complete + { + i2c_read_bytes(i2c_client_point, _bRO_MISCTL__MEA_RDY, buf, 1); + ready = buf[0]; + } + + udelay(50); + + //_fRW_MISCTL__MEA_EN = 0; + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + i2c_read_bytes(i2c_client_point, _dRO_MISCTL__MEA_VAL, buf, 4); + GTP_INFO("Clk_count 0: %2X", buf[0]); + GTP_INFO("Clk_count 1: %2X", buf[1]); + GTP_INFO("Clk_count 2: %2X", buf[2]); + GTP_INFO("Clk_count 3: %2X", buf[3]); + + temp = (s32)buf[0] + ((s32)buf[1] << 8) + ((s32)buf[2] << 16) + ((s32)buf[3] << 24); + GTP_INFO("Clk_count : %d", temp); + return temp; +} +u8 gup_clk_dac_setting(int dac) +{ + s8 buf1, buf2; + + i2c_read_bytes(i2c_client_point, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_read_bytes(i2c_client_point, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + buf1 = (buf1 & 0xFFCF) | ((dac & 0x03) << 4); + buf2 = (dac >> 2) & 0x3f; + + i2c_write_bytes(i2c_client_point, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_write_bytes(i2c_client_point, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + return 0; +} + +static u8 gup_clk_calibration_pin_select(s32 bCh) +{ + s32 i2c_addr; + + switch (bCh) + { + case 0: + i2c_addr = _fRW_MISCTL__GIO0; + break; + + case 1: + i2c_addr = _fRW_MISCTL__GIO1; + break; + + case 2: + i2c_addr = _fRW_MISCTL__GIO2; + break; + + case 3: + i2c_addr = _fRW_MISCTL__GIO3; + break; + + case 4: + i2c_addr = _fRW_MISCTL__GIO4; + break; + + case 5: + i2c_addr = _fRW_MISCTL__GIO5; + break; + + case 6: + i2c_addr = _fRW_MISCTL__GIO6; + break; + + case 7: + i2c_addr = _fRW_MISCTL__GIO7; + break; + + case 8: + i2c_addr = _fRW_MISCTL__GIO8; + break; + + case 9: + i2c_addr = _fRW_MISCTL__GIO9; + break; + } + + gup_bit_write(i2c_addr, 1, 0); + + return 0; +} + +void gup_output_pulse(int t) +{ + unsigned long flags; + //s32 i; + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + udelay(10); + + local_irq_save(flags); + + mt_set_gpio_out(GTP_INT_PORT, 1); + udelay(50); + mt_set_gpio_out(GTP_INT_PORT, 0); + udelay(t - 50); + mt_set_gpio_out(GTP_INT_PORT, 1); + + local_irq_restore(flags); + + udelay(20); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); +} + +static void gup_sys_clk_init(void) +{ + u8 buf; + + //_fRW_MISCTL__RG_RXADC_CKMUX = 0; + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 5, 0); + //_bRW_MISCTL__RG_LDO_A18_PWD = 0; //DrvMISCTL_A18_PowerON + buf = 0; + i2c_write_bytes(i2c_client_point, _bRW_MISCTL__RG_LDO_A18_PWD, &buf, 1); + //_bRW_MISCTL__RG_BG_PWD = 0; //DrvMISCTL_BG_PowerON + buf = 0; + i2c_write_bytes(i2c_client_point, _bRW_MISCTL__RG_BG_PWD, &buf, 1); + //_bRW_MISCTL__RG_CLKGEN_PWD = 0; //DrvMISCTL_CLKGEN_PowerON + buf = 0; + i2c_write_bytes(i2c_client_point, _bRW_MISCTL__RG_CLKGEN_PWD, &buf, 1); + //_fRW_MISCTL__RG_RXADC_PWD = 0; //DrvMISCTL_RX_ADC_PowerON + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 0, 0); + //_fRW_MISCTL__RG_RXADC_REF_PWD = 0; //DrvMISCTL_RX_ADCREF_PowerON + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 1, 0); + //gup_clk_dac_setting(60); + //_bRW_MISCTL__OSC_CK_SEL = 1;; + buf = 1; + i2c_write_bytes(i2c_client_point, _bRW_MISCTL__OSC_CK_SEL, &buf, 1); +} + +u8 gup_clk_calibration(void) +{ + //u8 buf; + //u8 trigger; + s32 i; + struct timeval start, end; + s32 count; + s32 count_ref; + s32 sec; + s32 usec; + s32 ret = 0; + //unsigned long flags; + + //buf = 0x0C; // hold ss51 and dsp + //i2c_write_bytes(i2c_client_point, _rRW_MISCTL__SWRST_B0_, &buf, 1); + ret = gup_hold_ss51_dsp(i2c_client_point); + if (ret <= 0) + { + GTP_ERROR("[gup_clk_calibration]hold ss51 & dsp failed."); + return FAIL; + } + + //_fRW_MISCTL__CLK_BIAS = 0; //disable clock bias + gup_bit_write(_rRW_MISCTL_RG_DMY83, 7, 0); + + //_fRW_MISCTL__GIO1_PU = 0; //set TOUCH INT PIN MODE as input + gup_bit_write(_rRW_MISCTL__GIO1CTL_B2_, 0, 0); + + //_fRW_MISCTL__GIO1_OE = 0; //set TOUCH INT PIN MODE as input + gup_bit_write(_rRW_MISCTL__GIO1CTL_B1_, 1, 0); + + //buf = 0x00; + //i2c_write_bytes(i2c_client_point, _rRW_MISCTL__SWRST_B0_, &buf, 1); + //msleep(1000); + + GTP_INFO("CLK calibration GO"); + gup_sys_clk_init(); + gup_clk_calibration_pin_select(1);//use GIO1 to do the calibration + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + + for (i = INIT_CLK_DAC; i < MAX_CLK_DAC; i++) + { + if (tpd_halt) + { + i = 72; //80; // if sleeping while calibrating main clock, set it default 80 + break; + } + GTP_INFO("CLK calibration DAC %d", i); + + gup_clk_dac_setting(i); + gup_clk_count_init(1, CLK_AVG_TIME); + + #if 0 + gup_output_pulse(PULSE_LENGTH); + count = gup_clk_count_get(); + + if (count > PULSE_LENGTH * 60)//60= 60Mhz * 1us + { + break; + } + + #else + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + + //local_irq_save(flags); + do_gettimeofday(&start); + mt_set_gpio_out(GTP_INT_PORT, 1); + //local_irq_restore(flags); + + msleep(1); + mt_set_gpio_out(GTP_INT_PORT, 0); + msleep(1); + + //local_irq_save(flags); + do_gettimeofday(&end); + mt_set_gpio_out(GTP_INT_PORT, 1); + //local_irq_restore(flags); + + count = gup_clk_count_get(); + udelay(20); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + + usec = end.tv_usec - start.tv_usec; + sec = end.tv_sec - start.tv_sec; + count_ref = 60 * (usec+ sec * MILLION);//60= 60Mhz * 1us + + GTP_DEBUG("== time %d, %d, %d", sec, usec, count_ref); + + if (count > count_ref) + { + GTP_DEBUG("== count_diff %d", count - count_ref); + break; + } + + #endif + } + + //clk_dac = i; + + //gtp_reset_guitar(i2c_client_point, 20); + +#if 0//for debug + //-- ouput clk to GPIO 4 + buf = 0x00; + i2c_write_bytes(i2c_client_point, 0x41FA, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_client_point, 0x4104, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_client_point, 0x4105, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_client_point, 0x4106, &buf, 1); + buf = 0x01; + i2c_write_bytes(i2c_client_point, 0x4107, &buf, 1); + buf = 0x06; + i2c_write_bytes(i2c_client_point, 0x41F8, &buf, 1); + buf = 0x02; + i2c_write_bytes(i2c_client_point, 0x41F9, &buf, 1); +#endif + + GTP_GPIO_AS_INT(GTP_INT_PORT); + return i; +} + +#endif +//*************** For GT9XXF End ***********************// diff --git a/arch/arm/mach-mt8127/ford/touchpanel/mtk_tpd.c b/arch/arm/mach-mt8127/ford/touchpanel/mtk_tpd.c new file mode 100644 index 00000000000..df407bf02b6 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/mtk_tpd.c @@ -0,0 +1,486 @@ +/****************************************************************************** + * mtk_tpd.c - MTK Android Linux Touch Panel Device Driver * + * * + * Copyright 2008-2009 MediaTek Co.,Ltd. * + * * + * DESCRIPTION: * + * this file provide basic touch panel event to input sub system * + * * + * AUTHOR: * + * Kirby.Wu (mtk02247) * + * * + * NOTE: * + * 1. Sensitivity for touch screen should be set to edge-sensitive. * + * But in this driver it is assumed to be done by interrupt core, * + * though not done yet. Interrupt core may provide interface to * + * let drivers set the sensitivity in the future. In this case, * + * this driver should set the sensitivity of the corresponding IRQ * + * line itself. * + ******************************************************************************/ + +#include "tpd.h" + +//#ifdef VELOCITY_CUSTOM +#include +#include +#include +#include +#include +#include + +// for magnify velocity******************************************** +#define TOUCH_IOC_MAGIC 'A' + +#define TPD_GET_VELOCITY_CUSTOM_X _IO(TOUCH_IOC_MAGIC,0) +#define TPD_GET_VELOCITY_CUSTOM_Y _IO(TOUCH_IOC_MAGIC,1) + +#define SHOW_TOUCH_VENDOR 1 +#ifdef SHOW_TOUCH_VENDOR +#ifndef CONFIG_AUSTIN_PROJECT +#define FT_TPV_ID 0xf2 +#define FT_OFILM_ID 0x51 +extern unsigned char ft_vendor_id; +#endif +static char *vendor_name = NULL; +#endif + +extern int tpd_v_magnify_x; +extern int tpd_v_magnify_y; +extern UINT32 DISP_GetScreenHeight(void); +extern UINT32 DISP_GetScreenWidth(void); + +static int tpd_misc_open(struct inode *inode, struct file *file) +{ + return nonseekable_open(inode, file); +} + +static int tpd_misc_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static long tpd_unlocked_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + //char strbuf[256]; + void __user *data; + + long err = 0; + + if (_IOC_DIR(cmd) & _IOC_READ) + { + err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + } + else if (_IOC_DIR(cmd) & _IOC_WRITE) + { + err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + } + + if (err) + { + printk("tpd: access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd)); + return -EFAULT; + } + + switch (cmd) + { + case TPD_GET_VELOCITY_CUSTOM_X: + data = (void __user *) arg; + + if (data == NULL) + { + err = -EINVAL; + break; + } + + if (copy_to_user(data, &tpd_v_magnify_x, sizeof(tpd_v_magnify_x))) + { + err = -EFAULT; + break; + } + + break; + + case TPD_GET_VELOCITY_CUSTOM_Y: + data = (void __user *) arg; + + if (data == NULL) + { + err = -EINVAL; + break; + } + + if (copy_to_user(data, &tpd_v_magnify_y, sizeof(tpd_v_magnify_y))) + { + err = -EFAULT; + break; + } + + break; + + default: + printk("tpd: unknown IOCTL: 0x%08x\n", cmd); + err = -ENOIOCTLCMD; + break; + + } + + return err; +} + + +static struct file_operations tpd_fops = +{ +// .owner = THIS_MODULE, + .open = tpd_misc_open, + .release = tpd_misc_release, + .unlocked_ioctl = tpd_unlocked_ioctl, +}; +/*----------------------------------------------------------------------------*/ +static struct miscdevice tpd_misc_device = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "touch", + .fops = &tpd_fops, +}; + +//********************************************** +//#endif + + +/* function definitions */ +static int __init tpd_device_init(void); +static void __exit tpd_device_exit(void); +static int tpd_probe(struct platform_device *pdev); +static int tpd_remove(struct platform_device *pdev); + +extern void tpd_suspend(struct early_suspend *h); +extern void tpd_resume(struct early_suspend *h); +extern void tpd_button_init(void); + +//int tpd_load_status = 0; //0: failed, 1: sucess +int tpd_register_flag=0; +/* global variable definitions */ +struct tpd_device *tpd = 0; +static struct tpd_driver_t tpd_driver_list[TP_DRV_MAX_COUNT] ;//= {0}; + +static struct platform_driver tpd_driver = { + .remove = tpd_remove, + .shutdown = NULL, + .probe = tpd_probe, + #ifndef CONFIG_HAS_EARLYSUSPEND + .suspend = NULL, + .resume = NULL, + #endif + .driver = { + .name = TPD_DEVICE, + }, +}; + +/*20091105, Kelvin, re-locate touch screen driver to earlysuspend*/ +#ifdef CONFIG_HAS_EARLYSUSPEND +static struct early_suspend MTK_TS_early_suspend_handler = +{ + .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING-1, + .suspend = NULL, + .resume = NULL, +}; +#endif + +struct tpd_driver_t *g_tpd_drv = NULL; +/* Add driver: if find TPD_TYPE_CAPACITIVE driver sucessfully, loading it */ +int tpd_driver_add(struct tpd_driver_t *tpd_drv) +{ + int i; + + if(g_tpd_drv != NULL) + { + TPD_DMESG("touch driver exist \n"); + return -1; + } + /* check parameter */ + if(tpd_drv == NULL) + { + return -1; + } + /* R-touch */ + if(strcmp(tpd_drv->tpd_device_name, "generic") == 0) + { + tpd_driver_list[0].tpd_device_name = tpd_drv->tpd_device_name; + tpd_driver_list[0].tpd_local_init = tpd_drv->tpd_local_init; + tpd_driver_list[0].suspend = tpd_drv->suspend; + tpd_driver_list[0].resume = tpd_drv->resume; + tpd_driver_list[0].tpd_have_button = tpd_drv->tpd_have_button; + return 0; + } + for(i = 1; i < TP_DRV_MAX_COUNT; i++) + { + /* add tpd driver into list */ + if(tpd_driver_list[i].tpd_device_name == NULL) + { + tpd_driver_list[i].tpd_device_name = tpd_drv->tpd_device_name; + tpd_driver_list[i].tpd_local_init = tpd_drv->tpd_local_init; + tpd_driver_list[i].suspend = tpd_drv->suspend; + tpd_driver_list[i].resume = tpd_drv->resume; + tpd_driver_list[i].tpd_have_button = tpd_drv->tpd_have_button; + tpd_driver_list[i].attrs = tpd_drv->attrs; + #if 0 + if(tpd_drv->tpd_local_init()==0) + { + TPD_DMESG("load %s sucessfully\n", tpd_driver_list[i].tpd_device_name); + g_tpd_drv = &tpd_driver_list[i]; + } + #endif + break; + } + if(strcmp(tpd_driver_list[i].tpd_device_name, tpd_drv->tpd_device_name) == 0) + { + return 1; // driver exist + } + } + + return 0; +} + +int tpd_driver_remove(struct tpd_driver_t *tpd_drv) +{ + int i = 0; + /* check parameter */ + if(tpd_drv == NULL) + { + return -1; + } + for(i = 0; i < TP_DRV_MAX_COUNT; i++) + { + /* find it */ + if (strcmp(tpd_driver_list[i].tpd_device_name, tpd_drv->tpd_device_name) == 0) + { + memset(&tpd_driver_list[i], 0, sizeof(struct tpd_driver_t)); + break; + } + } + return 0; +} + +static void tpd_create_attributes(struct device *dev, struct tpd_attrs *attrs) +{ + int num = attrs->num; + + for (; num>0;) + device_create_file(dev, attrs->attr[--num]); +} + +#ifdef SHOW_TOUCH_VENDOR +static ssize_t show_vendor_name(struct device *dev, struct device_attribute *attr, + char *buf) +{ + TPD_DMESG("[mtk-tpd]vendor name: %s\n", vendor_name); + return sprintf(buf, "%s\n", vendor_name); +} +static DEVICE_ATTR(Vendor_Name, 0440, show_vendor_name, NULL); +#endif + +/* touch panel probe */ +static int tpd_probe(struct platform_device *pdev) { + int touch_type = 1; // 0:R-touch, 1: Cap-touch + int i=0; + TPD_DMESG("enter %s, %d\n", __FUNCTION__, __LINE__); + /* Select R-Touch */ + // if(g_tpd_drv == NULL||tpd_load_status == 0) +#if 0 + if(g_tpd_drv == NULL) + { + g_tpd_drv = &tpd_driver_list[0]; + /* touch_type:0: r-touch, 1: C-touch */ + touch_type = 0; + TPD_DMESG("Generic touch panel driver\n"); + } + + #ifdef CONFIG_HAS_EARLYSUSPEND + MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; + MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; + register_early_suspend(&MTK_TS_early_suspend_handler); + #endif + #endif + + if (misc_register(&tpd_misc_device)) + { + printk("mtk_tpd: tpd_misc_device register failed\n"); + } + + if((tpd=(struct tpd_device*)kmalloc(sizeof(struct tpd_device), GFP_KERNEL))==NULL) return -ENOMEM; + memset(tpd, 0, sizeof(struct tpd_device)); + + /* allocate input device */ + if((tpd->dev=input_allocate_device())==NULL) { kfree(tpd); return -ENOMEM; } + + //TPD_RES_X = simple_strtoul(LCM_WIDTH, NULL, 0); + //TPD_RES_Y = simple_strtoul(LCM_HEIGHT, NULL, 0); + TPD_RES_X = DISP_GetScreenWidth(); + TPD_RES_Y = DISP_GetScreenHeight(); + + + printk("mtk_tpd: TPD_RES_X = %d, TPD_RES_Y = %d\n", TPD_RES_X, TPD_RES_Y); + + tpd_mode = TPD_MODE_NORMAL; + tpd_mode_axis = 0; + tpd_mode_min = TPD_RES_Y/2; + tpd_mode_max = TPD_RES_Y; + tpd_mode_keypad_tolerance = TPD_RES_X*TPD_RES_X/1600; + /* struct input_dev dev initialization and registration */ + tpd->dev->name = TPD_DEVICE; + set_bit(EV_ABS, tpd->dev->evbit); + set_bit(EV_KEY, tpd->dev->evbit); + set_bit(ABS_X, tpd->dev->absbit); + set_bit(ABS_Y, tpd->dev->absbit); + set_bit(ABS_PRESSURE, tpd->dev->absbit); + set_bit(BTN_TOUCH, tpd->dev->keybit); + set_bit(INPUT_PROP_DIRECT, tpd->dev->propbit); +#if 1 + for(i = 1; i < TP_DRV_MAX_COUNT; i++) + { + /* add tpd driver into list */ + if(tpd_driver_list[i].tpd_device_name != NULL) + { + tpd_driver_list[i].tpd_local_init(); + //msleep(1); + if(tpd_load_status ==1) { + TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s\n", tpd_driver_list[i].tpd_device_name); + g_tpd_drv = &tpd_driver_list[i]; + break; + } + } + } + if(g_tpd_drv == NULL) { + if(tpd_driver_list[0].tpd_device_name != NULL) { + g_tpd_drv = &tpd_driver_list[0]; + /* touch_type:0: r-touch, 1: C-touch */ + touch_type = 0; + g_tpd_drv->tpd_local_init(); + TPD_DMESG("[mtk-tpd]Generic touch panel driver\n"); + } else { + TPD_DMESG("[mtk-tpd]cap touch and Generic touch both are not loaded!!\n"); + return 0; + } + } + #ifdef CONFIG_HAS_EARLYSUSPEND + MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; + MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; + register_early_suspend(&MTK_TS_early_suspend_handler); + #endif +#endif +//#ifdef TPD_TYPE_CAPACITIVE + /* TPD_TYPE_CAPACITIVE handle */ + if(touch_type == 1){ + + set_bit(ABS_MT_TRACKING_ID, tpd->dev->absbit); + set_bit(ABS_MT_TOUCH_MAJOR, tpd->dev->absbit); + set_bit(ABS_MT_TOUCH_MINOR, tpd->dev->absbit); + set_bit(ABS_MT_POSITION_X, tpd->dev->absbit); + set_bit(ABS_MT_POSITION_Y, tpd->dev->absbit); + #if 0 // linux kernel update from 2.6.35 --> 3.0 + tpd->dev->absmax[ABS_MT_POSITION_X] = TPD_RES_X; + tpd->dev->absmin[ABS_MT_POSITION_X] = 0; + tpd->dev->absmax[ABS_MT_POSITION_Y] = TPD_RES_Y; + tpd->dev->absmin[ABS_MT_POSITION_Y] = 0; + tpd->dev->absmax[ABS_MT_TOUCH_MAJOR] = 100; + tpd->dev->absmin[ABS_MT_TOUCH_MINOR] = 0; +#else + input_set_abs_params(tpd->dev, ABS_MT_POSITION_X, 0, TPD_RES_X, 0, 0); + input_set_abs_params(tpd->dev, ABS_MT_POSITION_Y, 0, TPD_RES_Y, 0, 0); + input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MAJOR, 0, 100, 0, 0); + input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MINOR, 0, 100, 0, 0); +#endif + TPD_DMESG("Cap touch panel driver\n"); + } +//#endif + #if 0 //linux kernel update from 2.6.35 --> 3.0 + tpd->dev->absmax[ABS_X] = TPD_RES_X; + tpd->dev->absmin[ABS_X] = 0; + tpd->dev->absmax[ABS_Y] = TPD_RES_Y; + tpd->dev->absmin[ABS_Y] = 0; + + tpd->dev->absmax[ABS_PRESSURE] = 255; + tpd->dev->absmin[ABS_PRESSURE] = 0; + #else + input_set_abs_params(tpd->dev, ABS_X, 0, TPD_RES_X, 0, 0); + input_set_abs_params(tpd->dev, ABS_Y, 0, TPD_RES_Y, 0, 0); + input_abs_set_res(tpd->dev, ABS_X, TPD_RES_X); + input_abs_set_res(tpd->dev, ABS_Y, TPD_RES_Y); + input_set_abs_params(tpd->dev, ABS_PRESSURE, 0, 255, 0, 0); + + #endif + if(input_register_device(tpd->dev)) + TPD_DMESG("input_register_device failed.(tpd)\n"); + else + tpd_register_flag = 1; + /* init R-Touch */ + #if 0 + if(touch_type == 0) + { + g_tpd_drv->tpd_local_init(); + } + #endif + if(g_tpd_drv->tpd_have_button) + { + tpd_button_init(); + } + + if (g_tpd_drv->attrs.num) + tpd_create_attributes(&pdev->dev, &g_tpd_drv->attrs); + + #ifdef SHOW_TOUCH_VENDOR + device_create_file(&pdev->dev, &dev_attr_Vendor_Name); + vendor_name = g_tpd_drv->tpd_device_name; + #ifndef CONFIG_AUSTIN_PROJECT + if(strcmp(vendor_name, "fts") == 0) { + if(ft_vendor_id == FT_TPV_ID) + vendor_name = "fts_tpv"; + if(ft_vendor_id == FT_OFILM_ID) + vendor_name = "fts_ofilm"; + } + #endif + if(NULL == vendor_name) { + vendor_name = "no vendor name"; + } + #endif SHOW_TOUCH_VENDOR + + return 0; +} + +static int tpd_remove(struct platform_device *pdev) +{ + input_unregister_device(tpd->dev); + #ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&MTK_TS_early_suspend_handler); + #endif + return 0; +} + +/* called when loaded into kernel */ +static int __init tpd_device_init(void) { + printk("MediaTek touch panel driver init\n"); + if(platform_driver_register(&tpd_driver)!=0) { + TPD_DMESG("unable to register touch panel driver.\n"); + return -1; + } + return 0; +} + +/* should never be called */ +static void __exit tpd_device_exit(void) { + TPD_DMESG("MediaTek touch panel driver exit\n"); + //input_unregister_device(tpd->dev); + platform_driver_unregister(&tpd_driver); + #ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&MTK_TS_early_suspend_handler); + #endif +} + +module_init(tpd_device_init); +module_exit(tpd_device_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("MediaTek touch panel driver"); +MODULE_AUTHOR("Kirby Wu"); + diff --git a/arch/arm/mach-mt8127/ford/touchpanel/ssd60xx_tp.c b/arch/arm/mach-mt8127/ford/touchpanel/ssd60xx_tp.c new file mode 100644 index 00000000000..84954324c5f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/ssd60xx_tp.c @@ -0,0 +1,1793 @@ +/* + * Copyright 2015 Solomon Systech Ltd. All rights reserved. + * + * Date: 2015.8.28 testing build from Vincent + */ + +#include "ssd60xx_tp.h" + +static int ssd60xx_probe(struct i2c_client *client, const struct i2c_device_id *id); + +static int ssd60xx_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); + +static void ssd60xx_resume(struct early_suspend *h); + +static void ssd60xx_suspend(struct early_suspend *h); + +static int ssd60xx_remove(struct i2c_client *client); + +static const struct i2c_device_id ssd60xx_tpd_id[] = { {SSD60XX_I2C_NAME, 0}, {} }; +static struct i2c_board_info __initdata ssd60xx_i2c_tpd = { I2C_BOARD_INFO(SSD60XX_I2C_NAME, (SSD60XX_I2C_ADDR)) }; +static unsigned short force[] = { 0, SSD60XX_I2C_ADDR << 1, I2C_CLIENT_END, I2C_CLIENT_END }; +static const unsigned short *const forces[] = { force, NULL }; + +#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) +static int tpd_wb_start_local[TPD_WARP_CNT] = TPD_WARP_START; +static int tpd_wb_end_local[TPD_WARP_CNT] = TPD_WARP_END; +#endif +#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) +static int tpd_calmat_local[8] = TPD_CALIBRATION_MATRIX; +static int tpd_def_calmat_local[8] = TPD_CALIBRATION_MATRIX; +#endif + +static struct i2c_driver tpd_i2c_driver = { + .driver = { + .name = SSD60XX_I2C_NAME, + }, + .probe = ssd60xx_probe, + .remove = ssd60xx_remove, + .id_table = ssd60xx_tpd_id, + .detect = ssd60xx_detect, + .address_list = (const unsigned short *)forces, +}; + +extern struct tpd_device *tpd; + +static int tpd_flag; +struct task_struct *ssd60xx_thread = NULL; +static DECLARE_WAIT_QUEUE_HEAD(waiter); + +static void ssd60xx_interrupt_handler(void); + +static int ssd60xx_event_handler(void *unused); + +/* ############################################################################### */ +#define DRIVER_VERSION "20150828_1.1" + +#define FINGERNO 5 + +#define ENABLE_INT 1 +#define ENABLE_TIMER 2 +#define DEFAULT_USED ENABLE_INT + +#define MICRO_TIMER_FREQ 50 +#define MICRO_TIME_INTERUPT (1000000000 / MICRO_TIMER_FREQ) + +#define FACE_TIMER_FREQ 20 +#define FACE_TIME_INTERUPT (1000000000 / FACE_TIMER_FREQ) +/* ############################################################################### */ + +/* + * ############################################################################### + * #define CONFIG_TOUCHSCREEN_SSL_TOUCH_KEY //no virtual key + */ + +#ifdef CONFIG_TOUCHSCREEN_SSL_TOUCH_KEY +#define TPD_HAVE_BUTTON + +#define KEY_W_H 80, 50 + +#define KEY_0 40, 880 +#define KEY_1 240, 880 +#define KEY_2 430, 880 +#define KEY_3 430, 880 + +#define TPD_KEY_COUNT 3 +#define TPD_KEYS { KEY_MENU, KEY_HOMEPAGE, KEY_BACK } +#define TPD_KEYS_DIM { { KEY_0, KEY_W_H }, { KEY_1, KEY_W_H }, { KEY_2, KEY_W_H } } + +static int tpd_keys_local[TPD_KEY_COUNT] = TPD_KEYS; +static int tpd_keys_dim_local[TPD_KEY_COUNT][4] = TPD_KEYS_DIM; +#endif +/* ############################################################################### */ + +/* + * ############################################################################### + * #define CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER //no usr jiter fillter + */ +static int ForceTouch_threshold;//ForceTouch 20150729 +static int ForceTouch_upperbound; +static int ForceTouch_lowerbound; +static int ForceTouch_state = 0; +static int ForceTouch_hysteresis = 0; +static int Reg_C4,Reg_C5,Reg_C6,Reg_C7,Reg_C8; // 20150730 +//static int ForceTouch_alive = 0; + +/* +Usage of FB (Edge Filter): + - Edge X2 Offset (D15 - D08) + - Edge X1 Offset (D7 - D0) +*/ +#define FORCE_EDGE_FILTER +#ifdef FORCE_EDGE_FILTER +#define EDGE_FILTER_REG 0xFB +static unsigned short edge_filter_x1_offset, edge_filter_x2_offset, edge_filter_y1_offset, edge_filter_y2_offset, edge_filter_scale, edge_filter_enable; //20150806, for edge tuning +static unsigned short edge_filter_switch[FINGERNO] = {0}; +static int edge_filter_x[FINGERNO] = {0xFFF}; +static int edge_filter_y[FINGERNO] = {0xFFF}; +#endif + + + +/* +brand new filter aims at removing hard press ghost finger for A+ + +ghost finger after palm detected is removed by the palm detection hack in index filter +this aims at removing the ghost points just before palm rejection takes place + +For now, it reuse the value of 0xFC as a correlation. +The threshold of this hack shall be less than 0xFC because if pressure reaches the value in 0xFC, +the points shall be removed already. + +Refer to ForceTouch_threshold, now set to 3/4 of it + +*/ +//#define CONFIG_HARD_PRESS_HACK_A + +#define CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER + +#ifdef CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER + +#define PALM_STATUS_REG 0x5B + +/* +Usage of E5 (index filter register): + - enable:1/disable:0 (D15) + - penalty enable:1/disable:0 (D14) + - penalty pressure scale (D13 - D12) + - 1st frame penalty enable:1/disable:0 (D11) + - no. of fingers to turn on (D10 - D08) + - min. frames to confirm finger (D7 - D0) +*/ +#define INDEX_FILTER_REG 0xE5 +static unsigned int jitter_filter_on =0; +static unsigned int jitter_filter_penalty_on =0; +static unsigned int ssd_jitter_count = 0; +static unsigned int jitter_finger_num = 0; +static unsigned int jitter_finger_num_backup = 0; +static unsigned int jitter_max_pressure = 0; +static unsigned int jitter_penalty[FINGERNO] = { 0 }; +static unsigned int jitter_filter_count[FINGERNO] = { 0 }; +static unsigned int jitter_filter_penalty_pressure_scale = 0; +static unsigned int jitter_filter_penalty_1st_frame = 0; + +#endif + +/* +Usage of E6 (special small finger register): + - enable:1/disable:0 (D15) + - M (ratio of average weight) (D14 – D0) +*/ +#define SPECIAL_FINGER_SIZE_FILTER +#ifdef SPECIAL_FINGER_SIZE_FILTER +extern kal_bool upmu_is_chr_det(void); +#define FINGER_SIZE_FILTER 0xE6 +#define BUTTON_REGION 560 +static unsigned int finger_size_filter_on = 0; +static unsigned int finger_size_filter_ratio = 0; +static unsigned int finger_weight[FINGERNO] = {0}; +static int confidence[FINGERNO] = {0}; +#endif +/* ############################################################################### */ + +#define DEVICE_ID_REG 0x02 +#define VERSION_ID_REG 0x03 +#define EVENT_STATUS 0x79 +#define EVENT_MASK 0x7B +#define FINGER01_REG 0x7C +#define KEY_STATUS 0xB0 +#define FINGER_COUNT_REG 0x8A + +#define PRESS_MAX 100 + +struct ssl_ts_priv { + struct i2c_client *client; + struct input_dev *input; + struct hrtimer timer; + + struct work_struct ssl_work; + struct workqueue_struct *ssl_workqueue; + +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + + int device_id; + int version_id; + int finger_count; + int use_irq; + int irq; + + int FingerX[FINGERNO]; + int FingerY[FINGERNO]; + int FingerP[FINGERNO]; + +#ifdef CONFIG_TOUCHSCREEN_SSL_TOUCH_KEY + int keys[TPD_KEY_COUNT]; +#endif +}; +static int ssl_ts_suspend_flag; +static struct ssl_ts_priv *ssl_priv; + +int ssd60xx_read_regs(struct i2c_client *client, uint8_t reg, char *buf, int len); + +int ssd60xx_write_regs(struct i2c_client *client, uint8_t reg, char *buf, int len); + +int ssd60xx_read_reg(struct i2c_client *client, uint8_t reg, int ByteNo); + +int ssd60xx_write_reg(struct i2c_client *client, uint8_t Reg, unsigned char Data1, unsigned char Data2, int ByteNo); + +void ssd60xx_device_reset(void); + +void ssd60xx_device_patch(struct i2c_client *client); + +void ssd60xx_device_init(struct i2c_client *client); + +static int ssd60xx_work(void); + +/* ############################################################################### */ +#define CONFIG_TOUCHSCREEN_SSL_DEBUG + +#ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG +static int debug_show; +#define SSL_DEBUG(fmt, arg ...) do { if (debug_show) { printk("ssd60xx: " fmt "\n", ## arg); } } while (0) +#else +#define SSL_DEBUG(fmt, arg ...) +#endif +/* ############################################################################### */ + +/* ############################################################################### */ +#define MISC_TP_CHR /* for apk debug don't remark */ + +#include + +#ifdef MISC_TP_CHR +#define TP_CHR "tp_chr" + +static ssize_t ssd_misc_read(struct file *file, char __user *buf, size_t count, loff_t *offset); + +static ssize_t ssd_misc_write(struct file *file, const char __user *buf, size_t count, loff_t *offset); + +#endif +/* ############################################################################### */ + +/* ############################################################################### */ +#define TPD_PROC_DEBUG /* for debug don't remark */ + +#ifdef TPD_PROC_DEBUG +#include +#include + +static struct ChipSetting ssd_config_patch[5120] = { {0} }; +static struct ChipSetting ssd_config_table[1024] = { {0} }; + +int ssd_config_patch_count = 0; +int ssd_config_table_count = 0; + +static char ssd_return_str[25600] = { 0 }; + +static ssize_t ssdtouch_initcode_set(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count); + +static ssize_t ssdtouch_initcode_get(struct kobject *kobj, struct kobj_attribute *attr, char *buf); + +static struct kobj_attribute ssdtouch_attr = { + .attr = { + .name = "ssdtouch", + .mode = S_IRUGO, + }, + .show = &ssdtouch_initcode_get, + .store = &ssdtouch_initcode_set, +}; + +static struct attribute *ssdtouch_attributes[] = { + &ssdtouch_attr.attr, + NULL +}; + +static struct attribute_group ssdtouch_attr_group = { + .attrs = ssdtouch_attributes, +}; +#endif +/* ############################################################################### */ + +/* ############################################################################### */ +/*#define SSL_AUTO_UPGRADE //for auto upgrade don't remark */ + +#ifdef SSL_AUTO_UPGRADE +#define FILE_READ_TRY 50 +#define ssl_initcode_file1 "/sdcard/ssd_tp.h" +#define ssl_initcode_file2 "/data/ssd_tp.h" +#endif +/* ############################################################################### */ + +/* =============================================================================== */ +#ifdef TPD_PROC_DEBUG +void ssd_config_run_patch(void) +{ + int i; + + for (i = 0; i < ssd_config_patch_count; i++) { + ssd60xx_write_reg(ssl_priv->client, ssd_config_patch[i].Reg, ssd_config_patch[i].Data1, ssd_config_patch[i].Data2, ssd_config_patch[i].No); + } + printk("%s ok\n", __func__); +} + +void ssd_config_run_init(void) +{ + int i; + + for (i = 0; i < ssd_config_table_count; i++) { + ssd60xx_write_reg(ssl_priv->client, ssd_config_table[i].Reg, ssd_config_table[i].Data1, ssd_config_table[i].Data2, ssd_config_table[i].No); + } + printk("%s ok\n", __func__); + + /* read patch checksum */ + mdelay(50); + ssd60xx_write_reg(ssl_priv->client, 0x96, 0x00, 0x01, 2); + mdelay(50); + i = ssd60xx_read_reg(ssl_priv->client, 0x97, 2); + + printk("patch checksum : 0x%04X\n", i); +} + +#define SSDTOUCH_WRITE "write" +#define SSDTOUCH_READ "read" +#define SSDTOUCH_READS "reads" + +#define SSDTOUCH_PATCHCLEAR "patchclear" +#define SSDTOUCH_PATCHADDS "patchadds" +#define SSDTOUCH_PATCHADD "patchadd" +#define SSDTOUCH_PATCH "patch" + +#define SSDTOUCH_INITCLEAR "initclear" +#define SSDTOUCH_INITADDS "initadds" +#define SSDTOUCH_INITADD "initadd" +#define SSDTOUCH_INIT "init" + +#define SSDTOUCH_DEBUGSHOW "debugshow" +#define SSDTOUCH_RESET "reset" +#define SSDTOUCH_JITTERCOUNT "jittercount" + +static ssize_t ssdtouch_initcode_set(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) +{ + char *value = NULL; + unsigned int Reg = 0; + unsigned int Data1 = 0; + unsigned int Data2 = 0; + unsigned int Count = 0; + unsigned int ret = 0; + int i = 0; + char tmp_str[256] = { 0 }; + + const char *ssd_receive_buf = buf; + + if ((strstr(ssd_receive_buf, SSDTOUCH_WRITE)) != NULL) { /* write register */ + value = strstr(ssd_receive_buf, SSDTOUCH_WRITE); + value += strlen(SSDTOUCH_WRITE); + if (strlen(value) < 14) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_WRITE); + return -EFAULT; + } + value += strlen(" "); + sscanf(value, "0x%x 0x%x 0x%x", &Reg, &Data1, &Data2); + + ssd60xx_write_reg(ssl_priv->client, Reg, Data1, Data2, 2); + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "write [0x%02X]=0x%02X%02X\n", Reg, Data1, Data2); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_READS)) != NULL) { /* reads register */ + value = strstr(ssd_receive_buf, SSDTOUCH_READS); + value += strlen(SSDTOUCH_READS); + if (strlen(value) < 4) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_READS); + return -EFAULT; + } + + value += strlen(" "); + sscanf(value, "0x%x", &Reg); + + value += 5; + sscanf(value, "0x%x", &Count); + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + for (i = 0; i < Count; i++) { + ret = ssd60xx_read_reg(ssl_priv->client, Reg + i, 2); + memset(tmp_str, 0, sizeof(tmp_str)); + sprintf(tmp_str, " 0x%04X", ret); + strcat(ssd_return_str, tmp_str); + } + strcat(ssd_return_str, "\n"); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_READ)) != NULL) { /* read register */ + value = strstr(ssd_receive_buf, SSDTOUCH_READ); + value += strlen(SSDTOUCH_READ); + if (strlen(value) < 4) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_READ); + return -EFAULT; + } + + value += strlen(" "); + sscanf(value, "0x%x", &Reg); + + ret = ssd60xx_read_reg(ssl_priv->client, Reg, 2); + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "0x%04X\n", ret); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_PATCHCLEAR)) != NULL) { /* patch clear */ + value = strstr(ssd_receive_buf, SSDTOUCH_PATCHCLEAR); + ssd_config_patch_count = 0; + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s ok!\n", SSDTOUCH_PATCHCLEAR); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_PATCHADDS)) != NULL) { /* patch add */ + value = strstr(ssd_receive_buf, SSDTOUCH_PATCHADDS); + value += strlen(SSDTOUCH_PATCHADDS); + if (strlen(value) < 14) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_PATCHADDS); + return -EFAULT; + } + value += strlen(" "); + sscanf(value, "0x%x", &Count); + + value += 5; + if (strlen(value) != Count * 15) { + sprintf(ssd_return_str, "%s Count=%d strlen(value)=%d count error!\n", SSDTOUCH_PATCHADDS, Count, strlen(value)); + return -EFAULT; + } + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + for (i = 0; i < Count; i++) { + sscanf(value, " 0x%x 0x%x 0x%x", &Reg, &Data1, &Data2); + value += 15; + + ssd_config_patch[ssd_config_patch_count].No = 2; + ssd_config_patch[ssd_config_patch_count].Reg = Reg; + ssd_config_patch[ssd_config_patch_count].Data1 = Data1; + ssd_config_patch[ssd_config_patch_count].Data2 = Data2; + ssd_config_patch_count++; + + memset(tmp_str, 0, sizeof(tmp_str)); + sprintf(tmp_str, "%s Patch[%04d]= {%d,0x%02X,0x%02X,0x%02X} ok!\n", SSDTOUCH_PATCHADDS, ssd_config_patch_count - 1, 2, Reg, Data1, Data2); + strcat(ssd_return_str, tmp_str); + } + } else if ((strstr(ssd_receive_buf, SSDTOUCH_PATCHADD)) != NULL) { /* patch add */ + value = strstr(ssd_receive_buf, SSDTOUCH_PATCHADD); + value += strlen(SSDTOUCH_PATCHADD); + if (strlen(value) < 14) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_PATCHADD); + return -EFAULT; + } + value += strlen(" "); + + sscanf(value, "0x%x 0x%x 0x%x", &Reg, &Data1, &Data2); + + ssd_config_patch[ssd_config_patch_count].No = 2; + ssd_config_patch[ssd_config_patch_count].Reg = Reg; + ssd_config_patch[ssd_config_patch_count].Data1 = Data1; + ssd_config_patch[ssd_config_patch_count].Data2 = Data2; + ssd_config_patch_count++; + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s Patch[%04d]= {%d,0x%02X,0x%02X,0x%02X} ok!\n", SSDTOUCH_PATCHADD, ssd_config_patch_count - 1, 2, Reg, Data1, Data2); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_PATCH)) != NULL) { + value = strstr(ssd_receive_buf, SSDTOUCH_PATCH); + ssd_config_run_patch(); + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s ok!\n", SSDTOUCH_PATCH); + + } else if ((strstr(ssd_receive_buf, SSDTOUCH_INITCLEAR)) != NULL) { + value = strstr(ssd_receive_buf, SSDTOUCH_INITCLEAR); + ssd_config_table_count = 0; + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s ok!\n", SSDTOUCH_INITCLEAR); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_INITADDS)) != NULL) { + value = strstr(ssd_receive_buf, SSDTOUCH_INITADDS); + value += strlen(SSDTOUCH_INITADDS); + if (strlen(value) < 14) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_INITADDS); + return -EFAULT; + } + value += strlen(" "); + sscanf(value, "0x%x", &Count); + + value += 5; + if (strlen(value) != Count * 15) { + sprintf(ssd_return_str, "%s Count=%d strlen(value)=%d count error!\n", SSDTOUCH_PATCHADDS, Count, strlen(value)); + return -EFAULT; + } + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + for (i = 0; i < Count; i++) { + sscanf(value, " 0x%x 0x%x 0x%x", &Reg, &Data1, &Data2); + value += 15; + + ssd_config_table[ssd_config_table_count].No = 2; + ssd_config_table[ssd_config_table_count].Reg = Reg; + ssd_config_table[ssd_config_table_count].Data1 = Data1; + ssd_config_table[ssd_config_table_count].Data2 = Data2; + ssd_config_table_count++; + + memset(tmp_str, 0, sizeof(tmp_str)); + sprintf(tmp_str, "%s Init[%04d]= {%d,0x%02X,0x%02X,0x%02X} ok!\n", SSDTOUCH_INITADDS, ssd_config_table_count - 1, 2, Reg, Data1, Data2); + strcat(ssd_return_str, tmp_str); + } + } else if ((strstr(ssd_receive_buf, SSDTOUCH_INITADD)) != NULL) { + value = strstr(ssd_receive_buf, SSDTOUCH_INITADD); + value += strlen(SSDTOUCH_INITADD); + if (strlen(value) < 14) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_INITADD); + return -EFAULT; + } + value += strlen(" "); + sscanf(value, "0x%x 0x%x 0x%x", &Reg, &Data1, &Data2); + + ssd_config_table[ssd_config_table_count].No = 2; + ssd_config_table[ssd_config_table_count].Reg = Reg; + ssd_config_table[ssd_config_table_count].Data1 = Data1; + ssd_config_table[ssd_config_table_count].Data2 = Data2; + ssd_config_table_count++; + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s Init[%04d]= {%d,0x%02X,0x%02X,0x%02X} ok!\n", SSDTOUCH_INITADD, ssd_config_table_count - 1, 2, Reg, Data1, Data2); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_INIT)) != NULL) { + value = strstr(ssd_receive_buf, SSDTOUCH_INIT); + ssd_config_run_init(); + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s ok!\n", SSDTOUCH_INIT); + } else if ((strstr(ssd_receive_buf, SSDTOUCH_DEBUGSHOW)) != NULL) { + value = strstr(ssd_receive_buf, SSDTOUCH_DEBUGSHOW); +#ifdef CONFIG_TOUCHSCREEN_SSL_DEBUG + value += strlen(SSDTOUCH_DEBUGSHOW); + if (strlen(value) < 4) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_DEBUGSHOW); + return -EFAULT; + } + value += strlen(" "); + sscanf(value, "0x%x", &Reg); + debug_show = Reg; + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s debug_show=%d ok!\n", SSDTOUCH_DEBUGSHOW, debug_show); +#endif + } else if ((strstr(ssd_receive_buf, SSDTOUCH_JITTERCOUNT)) + != NULL) { + value = strstr(ssd_receive_buf, SSDTOUCH_JITTERCOUNT); +#ifdef CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER + value += strlen(SSDTOUCH_JITTERCOUNT); + if (strlen(value) < 4) { + sprintf(ssd_return_str, "%s error!\n", SSDTOUCH_JITTERCOUNT); + return -EFAULT; + } + value += strlen(" "); + sscanf(value, "0x%x", &Reg); + ssd_jitter_count = Reg; + + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s SSDTOUCH_JITTERCOUNT=%d ok!\n", SSDTOUCH_JITTERCOUNT, ssd_jitter_count); +#endif + } else if ((strstr(ssd_receive_buf, SSDTOUCH_RESET)) != NULL) { /* reset */ + value = strstr(ssd_receive_buf, SSDTOUCH_RESET); + ssd60xx_device_reset(); + msleep(20); + ssd60xx_device_patch(ssl_priv->client); + ssd60xx_device_init(ssl_priv->client); + memset(ssd_return_str, 0, sizeof(ssd_return_str)); + sprintf(ssd_return_str, "%s ok!\n", SSDTOUCH_RESET); + } + return 1; +} + +static ssize_t ssdtouch_initcode_get(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%s\n", ssd_return_str); +} + +#endif + +/* ******************************************************************************* */ + +/* =============================================================================== */ +#ifdef MISC_TP_CHR +static const struct file_operations ssd_misc_fops = { + /* .owner = THIS_MODULE, */ + .read = ssd_misc_read, + .write = ssd_misc_write, +}; + +static struct miscdevice ssd_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = TP_CHR, + .fops = &ssd_misc_fops, +}; + +static ssize_t ssd_misc_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + char *kbuf; + uint8_t reg; + int ByteNo; + int readValue; + int i; + + kbuf = kmalloc(count, GFP_KERNEL); + + if (copy_from_user(kbuf, buf, 1)) { + printk("no enough memory!\n"); + return -1; + } + + reg = (uint8_t) kbuf[0]; + ByteNo = count; + + if (ByteNo <= 4) { + readValue = ssd60xx_read_reg(ssl_priv->client, reg, ByteNo); + for (i = 0; i < ByteNo; i++) { + kbuf[i] = (readValue >> (8 * i)) & 0xff; + } + } else { + ssd60xx_read_regs(ssl_priv->client, reg, kbuf, ByteNo); + } + + if (copy_to_user(buf, kbuf, count)) { + printk("no enough memory!\n"); + kfree(kbuf); + return -1; + } + + kfree(kbuf); + + return count; +} + +static ssize_t ssd_misc_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +{ + char *kbuf; + + kbuf = kmalloc(count, GFP_KERNEL); + + if (copy_from_user(kbuf, buf, count)) { + printk("no enough memory!\n"); + return -1; + } + + ssd60xx_write_reg(ssl_priv->client, kbuf[1], kbuf[2], kbuf[3], kbuf[0]); + + kfree(kbuf); + + return count; +} + +#endif +/* =============================================================================== */ + +/* ############################################################################### */ +#ifdef SSL_AUTO_UPGRADE + +int ssd_get_line(char *line, int *reg, int *data1, int *data2) +{ + char *buff = NULL, *tmpbuff = NULL; + int ret = -1; + buff = line; + + /* printf("line:%s \n", line); */ + while (buff[0] == ' ') { + buff++; + } + + while (buff[0] == '\t') { + buff++; + } + + if (buff[0] == '/') { + return -1; + } + + if (strlen(buff) > 0) { + if ((strstr(buff, "0x")) != NULL) { + tmpbuff = strstr(buff, "0x"); + sscanf(tmpbuff, "0x%x", reg); + buff = tmpbuff + 3; + ret = -1; + } + if ((strstr(buff, "0x")) != NULL) { + tmpbuff = strstr(buff, "0x"); + sscanf(tmpbuff, "0x%x", data1); + buff = tmpbuff + 3; + ret = -1; + } + if ((strstr(buff, "0x")) != NULL) { + tmpbuff = strstr(buff, "0x"); + sscanf(tmpbuff, "0x%x", data2); + buff = tmpbuff + 3; + ret = 0; + } + } + return ret; +} + +void ssd_do_fw_upgrade(char *buffer, int size) +{ + char *buf; + int i, j; + char line_buffer[128]; + int reg, data1, data2; + + buf = buffer; + memset(line_buffer, 0, sizeof(line_buffer)); + j = 0; + /* printf("buffer:%s \n", buffer); */ + for (i = 0; i < size; i++) { + if (buf[i] == '\r') { + continue; + } + if (j < sizeof(line_buffer)) { + line_buffer[j] = buf[i]; + j++; + } + if (buf[i] == '\n') { + if (ssd_get_line(line_buffer, ®, &data1, &data2) + == 0) { + /* printf("0x%02X 0x%02X 0x%02X \n", reg, data1, data2); */ + ssd60xx_write_reg(ssl_priv->client, reg, data1, data2, 2); + } + memset(line_buffer, 0, sizeof(line_buffer)); + j = 0; + } + } +} + +int ssd_update_proc(void *dir) +{ + struct file *fp; + int i; + mm_segment_t fs; + char *buf = NULL; + int buf_size = 0; + + for (i = 0; i < FILE_READ_TRY; i++) { + fs = get_fs(); + set_fs(KERNEL_DS); + + fp = filp_open(ssl_initcode_file1, O_RDONLY, 0); + if (IS_ERR(fp)) { + fp = filp_open(ssl_initcode_file2, O_RDONLY, 0); + if (IS_ERR(fp)) { + printk("-------------------read fw file error---------------\n"); + msleep(3000); + } + } + + if (!IS_ERR(fp)) { + printk("---------------open fw file ok-----------------------\n"); + fp->f_op->llseek(fp, 0, SEEK_SET); + buf_size = fp->f_op->llseek(fp, 0, SEEK_END); + fp->f_op->llseek(fp, 0, SEEK_SET); + + buf = (char *)kzalloc(buf_size, GFP_KERNEL); + if (buf == NULL) { + printk("upgrade buffer kzalloc OK\n"); + filp_close(fp, NULL); + break; + } + + fp->f_op->read(fp, buf, buf_size, &fp->f_pos); + printk("the upgrade file len is %d\n", buf_size); + filp_close(fp, NULL); + + ssd_do_fw_upgrade(buf, buf_size); + + kfree(buf); + break; + } + set_fs(fs); + } + + return 0; +} + +int ssd_auto_update_init(void) +{ + struct task_struct *thread = NULL; + + thread = kthread_run(ssd_update_proc, (void *)NULL, "ssd_update"); + if (IS_ERR(thread)) { + printk("Failed to create update thread.\n"); + return -1; + } + return 0; +} + +#endif +/* ############################################################################### */ + +int ssd60xx_read_regs(struct i2c_client *client, uint8_t reg, char *buf, int len) +{ + int ret; + + client->addr = client->addr & I2C_MASK_FLAG | I2C_WR_FLAG | I2C_RS_FLAG; + buf[0] = reg; + ret = i2c_master_send(client, (const char *)buf, len << 8 | 1); + client->addr = client->addr & I2C_MASK_FLAG; + + /* SSL_DEBUG("%s\n", (ret < 0)? "i2c_transfer Error !":"i2c_transfer OK !"); */ + + return ret; +} + +int ssd60xx_write_regs(struct i2c_client *client, uint8_t reg, char *buf, int len) +{ + int ret; + + ret = i2c_smbus_write_i2c_block_data(client, reg, len, buf); + /* SSL_DEBUG("%s\n", (ret < 0)? "i2c_master_send Error!":"i2c_master_send OK!"); */ + + return ret; +} + +int ssd60xx_read_reg(struct i2c_client *client, uint8_t reg, int data_count) +{ + unsigned char buf[4]; + int ret; + + if (data_count > 4) { + data_count = 4; + } + ret = ssd60xx_read_regs(client, reg, buf, data_count); + + if (data_count == 1) { + return (int)((unsigned int)buf[0] << 0); + } else if (data_count == 2) { + return (int)((unsigned int)buf[1] << 0) | ((unsigned int) + buf[0] + << 8); + } else if (data_count == 3) { + return (int)((unsigned int)buf[2] << 0) | ((unsigned int) + buf[1] + << 8) | ((unsigned int)buf[0] + << 16); + } else if (data_count == 4) { + return (int)((unsigned int)buf[3] << 0) | ((unsigned int) + buf[2] + << 8) | ((unsigned int)buf[1] + << 16) | (buf[0] << 24); + } + return 0; +} + +int ssd60xx_write_reg(struct i2c_client *client, uint8_t reg, unsigned char data1, unsigned char data2, int data_count) +{ + unsigned char buf[4]; + int ret; + + if (reg == 0x00) { + mdelay(data1 * 256 + data2); + return 0; + } + + buf[0] = data1; + buf[1] = data2; + buf[2] = 0; + ret = ssd60xx_write_regs(client, reg, buf, data_count); + + return ret; +} + +void ssd60xx_device_reset(void) +{ + SSL_DEBUG("enter %s\n", __func__); + + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + mdelay(5); + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); + mdelay(2); + mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); + mdelay(5); +} + +void ssd60xx_device_patch(struct i2c_client *client) +{ + int i; + + if (ssl_priv->device_id == SSD60XX_DEVICE_ID) { + for (i = 0; i < sizeof(ssd60xxcfgPatch) / sizeof(ssd60xxcfgPatch[0]); i++) { + ssd60xx_write_reg(client, ssd60xxcfgPatch[i].Reg, ssd60xxcfgPatch[i].Data1, ssd60xxcfgPatch[i].Data2, ssd60xxcfgPatch[i].No); + } + } + printk("%s ok\n", __func__); +} + +void ssd60xx_device_init(struct i2c_client *client) +{ + int i; + + if (ssl_priv->device_id == SSD60XX_DEVICE_ID) { + for (i = 0; i < sizeof(ssd60xxcfgTable) / sizeof(ssd60xxcfgTable[0]); i++) { + ssd60xx_write_reg(client, ssd60xxcfgTable[i].Reg, ssd60xxcfgTable[i].Data1, ssd60xxcfgTable[i].Data2, ssd60xxcfgTable[i].No); + } + } + mdelay(50); + + ssd60xx_write_reg(ssl_priv->client, 0x96, 0x00, 0x01, 2); + mdelay(50); + i = ssd60xx_read_reg(ssl_priv->client, 0x97, 2); + + printk("ssd60xx Patch CheckSum : 0x%04X\n", i); +} + +static void ssd60xx_touch_down_up(int i, int xpos, int ypos, int press, int isdown) +{ + if (isdown) { + if (i <= 4) { + SSL_DEBUG("pos[%d]: X = %d , Y = %d, W = %d\n", i, xpos, ypos, press); + } + input_report_key(ssl_priv->input, BTN_TOUCH, 1); + input_report_abs(ssl_priv->input, ABS_MT_TRACKING_ID, i); + input_report_abs(ssl_priv->input, ABS_MT_TOUCH_MAJOR, press); + input_report_abs(ssl_priv->input, ABS_MT_PRESSURE, press); + input_report_abs(ssl_priv->input, ABS_MT_POSITION_X, xpos); + input_report_abs(ssl_priv->input, ABS_MT_POSITION_Y, ypos); + input_mt_sync(ssl_priv->input); + +#ifdef TPD_HAVE_BUTTON + if (FACTORY_BOOT == get_boot_mode() + || RECOVERY_BOOT == get_boot_mode()) { + tpd_button(xpos, ypos, 1); + } +#endif + } else { + input_report_key(ssl_priv->input, BTN_TOUCH, 0); + input_mt_sync(ssl_priv->input); + +#ifdef TPD_HAVE_BUTTON + if (FACTORY_BOOT == get_boot_mode() + || RECOVERY_BOOT == get_boot_mode()) { + tpd_button(0, 0, 0); + } +#endif + } +} + +void filter_reg_update(void) +{ +int reg_value; + + ForceTouch_threshold = ssd60xx_read_reg(ssl_priv->client, 0xFC, 2);//ForceTouch 20150729 + ForceTouch_upperbound = ((ForceTouch_threshold>>6)&0x3F); + ForceTouch_lowerbound = (ForceTouch_threshold&0x3F); + ForceTouch_hysteresis = ((ForceTouch_threshold>>12)&0xF); + + Reg_C4 = ssd60xx_read_reg(ssl_priv->client, 0xC4, 2);// 20150730 + Reg_C5 = ssd60xx_read_reg(ssl_priv->client, 0xC5, 2);// 20150730 + Reg_C6 = ssd60xx_read_reg(ssl_priv->client, 0xC6, 2);// 20150730 + Reg_C7 = ssd60xx_read_reg(ssl_priv->client, 0xC7, 2);// 20150730 + Reg_C8 = ssd60xx_read_reg(ssl_priv->client, 0xC8, 2);// 20150730 + +/* 20150806 +Usage of FB (Edge Filter): + - Edge X2 offset (D15 - D08) + - Edge X1 offset (D7 - D0) +*/ +#ifdef FORCE_EDGE_FILTER + reg_value = ssd60xx_read_reg(ssl_priv->client, EDGE_FILTER_REG, 2); + edge_filter_x1_offset = (reg_value>>11)&0x7; + edge_filter_x2_offset = (reg_value>>7)&0xf; + edge_filter_y1_offset = (reg_value>>4)&0x7; + edge_filter_y2_offset = reg_value&0xf; + edge_filter_enable = (reg_value>>15)&0x1; + edge_filter_scale = (reg_value&0x4000) == 0? 1 : 4; +#endif + +#ifdef CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER +/* +Usage of E5 (index filter register): + - enable:1/disable:0 (D15) + - penalty enable:1/disable:0 (D14) + - penalty pressure scale (D13 - D12) + - 1st frame penalty enable:1/disable:0 (D11) + - no. of fingers to turn on (D10 - D08) + - min. frames to confirm finger (D7 - D0) +*/ + reg_value = ssd60xx_read_reg(ssl_priv->client, INDEX_FILTER_REG, 2); + jitter_filter_on = reg_value>>15; + jitter_filter_penalty_on = (reg_value>>14)&0x1; + jitter_filter_penalty_pressure_scale = (reg_value>>12)&0x3 + 1; + jitter_filter_penalty_1st_frame = (reg_value>>11)&0x1; + ssd_jitter_count = reg_value&0xff; + jitter_finger_num = (reg_value>>8)&0x07; + jitter_finger_num_backup = jitter_finger_num; +#endif + + +#ifdef SPECIAL_FINGER_SIZE_FILTER + reg_value = ssd60xx_read_reg(ssl_priv->client, FINGER_SIZE_FILTER, 2); + finger_size_filter_on = reg_value>>15; + finger_size_filter_ratio = reg_value&0x7fff; +#endif +} + +#ifdef CONFIG_HARD_PRESS_HACK_A +/* +find the bounding rectangle +remove the middle point if it is a potential ghost finger +*/ +int ssd_hard_press_hack(int *arrayX, int *arrayY, int *arrayP, int finger_num) +{ + if (finger_num < 3) return finger_num; // no need to do filtering when less than 3 fingers + int fin_cnt = 0; + int i = 0; + int max_p = 0; + int max_p_2 = 0; + int max_p_index = 0; + int max_p_2_index = 0; + int threshold = ForceTouch_threshold>0 ? ((ForceTouch_threshold * 3) << 2) : 0; + if (threshold == 0) return; // error checking + for (i = 0; i < FINGERNO; i++) { + if (arrayX[i] != 0xFFF) { + fin_cnt++; + if (arrayP[i] > max_p) { + max_p_2 = max_p; + max_p_2_index = max_p_index; + + max_p = arrayP[i]; + max_p_index = i; + } + else if (arrayP[i] > max_p_2) { + max_p_2 = arrayP[i]; + max_p_2_index = i; + } + } + } + + if (fin_cnt < 3 || arrayX[max_p_2_index] == arrayX[max_p_index] || arrayY[max_p_2_index] == arrayY[max_p_index]) return finger_num; // no need to do filtering when less than 3 fingers + + if (max_p < threshold) return finger_num; // the maximum pressure less than threshold, no need filtering + + for (i = 0; i < FINGERNO; i++) { + if (arrayX[i] != 0xFFF) { + if (i != max_p_index && i != max_p_2_index) { + int max_x, max_y, min_x, min_y; + if (arrayX[max_p_2_index] < arrayX[max_p_index]) max_x = arrayX[max_p_index]; + else max_x = arrayX[max_p_2_index]; + if (arrayY[max_p_2_index] < arrayY[max_p_index]) max_y = arrayY[max_p_index]; + else max_y = arrayY[max_p_2_index]; + if (min_x < arrayX[i] && arrayX[i] < max_x && min_y < arrayY[i] && arrayY[i] < max_y) { + fin_cnt -= 1; + arrayX[i] = 0xFFF; + arrayY[i] = 0xFFF; + arrayP[i] = 0; + } + } + } + } + + return fin_cnt; +} +#endif + +#ifdef CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER +void find_max_pressure(/*unsigned int *x_pos, unsigned int *y_pos, */unsigned int *pressure) { + int i, max = 0; + for (i = 0; i < FINGERNO; i++) { + if (pressure[i] > max) { + max = pressure[i]; + } + } + jitter_max_pressure = max; +} + +void ssd_jitter_filter(unsigned short i, unsigned int *x_pos, unsigned int *y_pos, unsigned int *pressure, int finger_num) +{ + int reg_value = ssd60xx_read_reg(ssl_priv->client, PALM_STATUS_REG, 2); + unsigned short palm_status = (reg_value & 0x1); + + if (jitter_filter_on == 0) { + return; + } + + if (*x_pos == 0xFFF) { + jitter_filter_count[i] = 0; + jitter_penalty[i] = 0; + return; + } + if (jitter_filter_penalty_on == 0 || upmu_is_chr_det() == KAL_FALSE) { + jitter_penalty[i] = 0; + } + + else { + if (ssl_priv->FingerX[i] == 0xFFF || jitter_filter_penalty_1st_frame == 0 ) { + if (*pressure == 0) { + // don't touch it + } + else if (jitter_max_pressure == 0) { + jitter_penalty[i] = 0; // prevent error + } + else { + jitter_penalty[i] = jitter_max_pressure / (*pressure * jitter_filter_penalty_pressure_scale); + } + if (jitter_penalty[i] > 5) { + jitter_penalty[i] = 5; + } + } + } + + if (upmu_is_chr_det()) { + // just to make it safe, charger raised noise floor which increase the chance of ghost finger, even though the noise seems small + if (jitter_finger_num_backup > 1) jitter_finger_num = (jitter_finger_num_backup-1); + } + else { + jitter_finger_num = jitter_finger_num_backup; + } + + // see whether condition fulfilled to start counting + if (jitter_filter_count[i] == 0) { + // if finger num exceed defined value && this is a new finger + if (ssl_priv->FingerX[i] == 0xFFF) { // new finger + if (finger_num > jitter_finger_num) { // finger num exceed defined value + *x_pos = *y_pos = 0xFFF; + *pressure = 0; + SSL_DEBUG("=======ssl_jittr_filter finger %d (started), count %d, finger number= %d \n", i, jitter_filter_count[i], finger_num); + jitter_filter_count[i]++; + } + else { + // palm case: when palm rejection happens, the palm is blocked by fw. + // however, there will be a situation such that the hard press might introduce ghost finger within the palm area. + // in this situation, this ghost finger by hard press is the only finger reported, that means finger_num == 1 (or less than jitter_finger_num) + // this will obviously escape from the conditions + if (palm_status) { // palm rejected and a new finger comes in, to be safe, kill it + *x_pos = *y_pos = 0xFFF; + *pressure = 0; + SSL_DEBUG("=======ssl_jittr_filter finger %d (started bcoz of palm), count %d, finger number= %d \n", i, jitter_filter_count[i], finger_num); + jitter_filter_count[i]++; + } + } + } + } + // else, if counter already started and not yet finished counting and finger is still reported (finger is reported if you get to here!), keep rejecting + else if (jitter_filter_count[i] < (ssd_jitter_count+jitter_penalty[i])) { + *x_pos = *y_pos = 0xFFF; + *pressure = 0; + SSL_DEBUG("=======ssl_jittr_filter finger %d, count %d, finger number= %d (penalty=%d)\n", i, jitter_filter_count[i], finger_num, jitter_penalty[i]); + jitter_filter_count[i]++; + } + // otherwise, this finger shall be reported (note, that might be a real finger or prolonged noise) +} +#endif + +static int ssd60xx_work(void) +{ + int i; + unsigned short xpos = 0, ypos = 0, press = 0; + int FingerInfo; + int EventStatus; + int FingerStatus; + int FingerX[FINGERNO]; + int FingerY[FINGERNO]; + int FingerP[FINGERNO]; + int FingerCount; + int KeyStatus; + int Touch_status; + //unsigned short ForceTouch_status; //ForceTouch 20150729 + int max_pressure = 0; + + if (ssl_ts_suspend_flag) { + return -1; + } + + SSL_DEBUG("enter %s\n", __func__); + /*---------------------------------------------------------- + + EventStatus = ssd60xx_read_reg(ssl_priv->client, 0x31, 2); + SSL_DEBUG("Register 0x31=0x%04X!\n", EventStatus); + + EventStatus = ssd60xx_read_reg(ssl_priv->client, 0x32, 2); + SSL_DEBUG("Register 0x32=0x%04X!\n", EventStatus); + + EventStatus = ssd60xx_read_reg(ssl_priv->client, 0x77, 2); + SSL_DEBUG("Register 0x77=0x%04X!\n", EventStatus); + ----------------------------------------------------------*/ + + Touch_status = ssd60xx_read_reg(ssl_priv->client, 0x78, 2); + SSL_DEBUG("Register 0x78=0x%04X!\n", Touch_status); + + + + EventStatus = ssd60xx_read_reg(ssl_priv->client, EVENT_STATUS, 2); + FingerStatus = EventStatus >> 4; + SSL_DEBUG("EventStatus=0x%04X!\n", EventStatus); + FingerCount = 0; + //ForceTouch_status = 0; //ForceTouch 20150729 + + for (i = 0; i < FINGERNO; i++) { + if ((FingerStatus >> i) & 0x1) { + FingerInfo = ssd60xx_read_reg(ssl_priv->client, (FINGER01_REG + i), 4); + xpos = ((FingerInfo >> 4) & 0xF00) | ((FingerInfo >> 24) & 0xFF); + ypos = ((FingerInfo >> 0) & 0xF00) | ((FingerInfo >> 16) & 0xFF); + press = ((FingerInfo >> 0) & 0x0FF) * PRESS_MAX / 255; + FingerCount++; + + if (press > max_pressure) { + max_pressure = press; + } + + + xpos = xpos * 600 / 1024; //For MTK Scaling + ypos = ypos * 1024 / 600; //For MTK Scaling + if (xpos > 600 || ypos > 1024) { + xpos = ypos = 0xFFF; + press = 0; + FingerCount = FingerCount-1; + } + + FingerY[i] = xpos; //For MTK Remapping + FingerX[i] = ypos; //For MTK Remapping + FingerP[i] = press; + SSL_DEBUG("start: %i, %i, %i (%i,%i) \n", i, edge_filter_x[i],edge_filter_y[i],FingerX[i],FingerY[i]); +#ifdef FORCE_EDGE_FILTER + if (edge_filter_enable) { + if (ssl_priv->FingerX[i] == 0xFFF || edge_filter_switch[i] == 1) { + unsigned short x_state = 1, y_state = 1; + unsigned short smoothing = 0; + edge_filter_switch[i] = 1; + if(FingerX[i]<= (edge_filter_x1_offset*edge_filter_scale)) {FingerX[i] = 0;} + else if(FingerX[i]>= (1024 - edge_filter_x2_offset*edge_filter_scale)) {FingerX[i] = 1023;} + else {x_state = 0;} + if(FingerY[i]<= (edge_filter_y1_offset*edge_filter_scale)) {FingerY[i] = 0;} + else if(FingerY[i]>= (600 - edge_filter_y2_offset*edge_filter_scale)) {FingerY[i] = 599;} + else {y_state = 0;} + if (x_state == 0 && y_state == 0) {edge_filter_switch[i] = 0; + if (ssl_priv->FingerX[i] != 0xFFF) { + smoothing = 1; + } + } + if (x_state == 1 && y_state == 1) {edge_filter_switch[i] = 0;} // to avoid this fix hurts linearity + if (ssl_priv->FingerX[i] == 0xFFF) { + edge_filter_x[i] = FingerX[i]; + edge_filter_y[i] = FingerY[i]; + SSL_DEBUG("edge: %i, %i, %i (%i,%i) (1)\n", i, edge_filter_x[i],edge_filter_y[i],FingerX[i],FingerY[i]); + } + else if (edge_filter_switch[i] == 1) { + if (x_state == 0) { + if (abs(FingerX[i]-edge_filter_x[i])>5) { + edge_filter_x[i] = FingerX[i]; + SSL_DEBUG("edge: %i, %i, %i (%i,%i) (2)\n", i, edge_filter_x[i],edge_filter_y[i],FingerX[i],FingerY[i]); + } + } + if (y_state == 0) { + if (abs(FingerY[i]-edge_filter_y[i])>5) { + edge_filter_y[i] = FingerY[i]; + SSL_DEBUG("edge: %i, %i, %i (%i,%i) (3)\n", i, edge_filter_x[i],edge_filter_y[i],FingerX[i],FingerY[i]); + } + } + FingerX[i] = edge_filter_x[i]; + FingerY[i] = edge_filter_y[i]; + } + else if (edge_filter_switch[i] == 0) { + if (smoothing == 1) { + FingerX[i] += edge_filter_x[i]; + FingerX[i] >>= 1; + FingerY[i] += edge_filter_y[i]; + FingerY[i] >>= 1; + } + } + SSL_DEBUG("edge: %i, %i, %i (%i,%i) (4)\n", i, edge_filter_x[i],edge_filter_y[i],FingerX[i],FingerY[i]); + } + SSL_DEBUG("edge: %i, %i, %i (%i,%i) \n", i, edge_filter_x[i],edge_filter_y[i],FingerX[i],FingerY[i]); + } +#endif + + } else { + xpos = ypos = 0xFFF; + press = 0; + FingerX[i] = xpos; + FingerY[i] = ypos; + FingerP[i] = press; +#ifdef FORCE_EDGE_FILTER + edge_filter_switch[i] = 0; +#endif + } + } + + //if ((max_pressure > ForceTouch_upperbound && ForceTouch_state == 0) || (max_pressure > ForceTouch_lowerbound && ForceTouch_state == 1)) { + if ((max_pressure > ForceTouch_upperbound && ForceTouch_state == 0) || (max_pressure > ForceTouch_lowerbound && ForceTouch_state > 0)) { + //ForceTouch_status=1; + //ForceTouch_alive = 1; + ForceTouch_state = ForceTouch_hysteresis; + SSL_DEBUG("pressure: status on = %i\n", max_pressure); + } + else { + if (ForceTouch_state > 0) { + ForceTouch_state--; + } + SSL_DEBUG("pressure: status off = %i\n", max_pressure); + } + +// if (ForceTouch_state == 1 /*ForceTouch_status==1*/) { //return 0; //ForceTouch 20150729 + if (ForceTouch_state > 0 /*ForceTouch_status==1*/) { //return 0; //ForceTouch 20150729 + for (i = 0; i < FINGERNO; i++) { + FingerX[i] = 0xFFF; + FingerY[i] = 0xFFF; + FingerP[i] = 0; + } + //FingerCount = 0; + SSL_DEBUG("pressure: status count = %i\n", ForceTouch_state); + } + +#ifdef SPECIAL_FINGER_SIZE_FILTER + int sum_weight=0; + int need_finger_sz_filter=0; + + if(finger_size_filter_on){ + if(upmu_is_chr_det()){ + if(FingerCount>1) + need_finger_sz_filter=1; + } + else{ + if(FingerCount>2) + need_finger_sz_filter=1; + } + for (i = 0; i < FINGERNO; i++) { + if(FingerX[i] != 0xFFF) + sum_weight +=FingerP[i]; + } + for (i = 0; i < FINGERNO; i++) { + if(need_finger_sz_filter && FingerY[i] > BUTTON_REGION){ + if(FingerP[i]*finger_size_filter_ratio*FingerCount FingerP[i]) ? (finger_weight[i] - FingerP[i]) : (FingerP[i] - finger_weight[i]); + unsigned int min = (finger_weight[i] > FingerP[i]) ? (FingerP[i]>>1) : (finger_weight[i]>>1); + if (confidence[i] < 10) { + if (delta > min || FingerP[i] == 0) { + SSL_DEBUG("finger_size_filter, finger[%i] weight=%d filtered\n", i,FingerP[i]); + FingerY[i] = 0xFFF; + FingerX[i] = 0xFFF; + FingerP[i] = 0; + if (FingerP[i] == 0) { + confidence[i] >>= 1; + } + else { + if (confidence[i] > 0) { + confidence[i]--; + } + } + } + else { + confidence[i]++; + } + } + else { + if (delta > min) { + if (confidence[i] > 0) { + confidence[i]--; + } + if (FingerP[i] == 0) { + confidence[i] >>= 1; + } + } + else if (FingerP[i] == 0) { + confidence[i] = 0; + } + else { + confidence[i]++; + } + } + } + else { + confidence[i]++; + } + } + finger_weight[i] = FingerP[i]; + if (FingerP[i] == 0 || FingerX[i] == 0xFFF) confidence[i] = 0; + //SSL_DEBUG("pos[5]: %i, %i (%i)\n", i, confidence[i],finger_weight[i]); + } + } +#endif + + if((FingerCount == 0 && Touch_status > Reg_C4)||(FingerCount == 1 && Touch_status > Reg_C5)|| + (FingerCount == 2 && Touch_status > Reg_C6) || (FingerCount == 3 && Touch_status > Reg_C7)|| + (FingerCount >= 4 && Touch_status > Reg_C8)) { + //if (ForceTouch_state == 0/* && ForceTouch_alive == 0*/) { + if (!(ForceTouch_state != 0 && (EventStatus&0x0008) == 0)) { + SSL_DEBUG("ssd60xx 0x78 = %x , FingerCount = %d (%i) \n",Touch_status , FingerCount, ForceTouch_state); + ssd60xx_write_reg(ssl_priv->client, 0xA2, 0x00, 0x01, 2); + mdelay(300); + //return 0; + FingerCount = 0; + for (i = 0; i < FINGERNO; i++) { + FingerX[i] = 0xFFF; + FingerY[i] = 0xFFF; + FingerP[i] = 0; + } + } + } + +#ifdef CONFIG_TOUCHSCREEN_SSL_TOUCH_KEY + KeyStatus = ssd60xx_read_reg(ssl_priv->client, KEY_STATUS, 2); + SSL_DEBUG("KeyStatus=0x%x\n", KeyStatus); + + for (i = 0; i < 4; i++) { + if ((KeyStatus >> i) & 0x1) { + FingerX[0] = tpd_keys_dim_local[i][0]; + FingerY[0] = tpd_keys_dim_local[i][1]; + FingerP[0] = 20; + if (FingerCount == 0) { + FingerCount++; + } + } + } +#endif + if (FingerCount == 0) { + for (i = 0; i < FINGERNO; i++) { + ssl_priv->FingerX[i] = 0xFFF; + ssl_priv->FingerY[i] = 0xFFF; + ssl_priv->FingerP[i] = 0xFFF; + jitter_penalty[i] = 0; + } + ssd60xx_touch_down_up(0, 0, 0, 0, 0); + //ForceTouch_alive = 0; + ForceTouch_state = 0; + SSL_DEBUG("pressure: status reset = %i\n", max_pressure); + } else { + if (ForceTouch_state > 0) { + ssd60xx_touch_down_up(0, 0, 0, 0, 0); + } + else { +#ifdef CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER + find_max_pressure(/*FingerX, FingerY, */FingerP); +#endif + for (i = 0; i < FINGERNO; i++) { +#ifdef CONFIG_TOUCHSCREEN_SSL_JITTER_FILTER + ssd_jitter_filter(i, &FingerX[i], &FingerY[i], &FingerP[i], FingerCount); +#endif + xpos = FingerX[i]; + ypos = FingerY[i]; + press = FingerP[i]; + if (xpos != 0xFFF) { + ssd60xx_touch_down_up(i, xpos, ypos, press, 1); + } + ssl_priv->FingerX[i] = xpos; + ssl_priv->FingerY[i] = ypos; + ssl_priv->FingerP[i] = press; + } + } + } +#ifdef CONFIG_HARD_PRESS_HACK_A + FingerCount = ssd_hard_press_hack(FingerX,FingerY,FingerP,FingerCount); +#endif + input_sync(ssl_priv->input); + return 0; +} + +static int ssd60xx_event_handler(void *unused) +{ + struct sched_param param = { + .sched_priority = RTPM_PRIO_TPD + }; + sched_setscheduler(current, SCHED_RR, ¶m); + + SSL_DEBUG("enter ssd60xx_event_handler!\n"); + + do { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + set_current_state(TASK_INTERRUPTIBLE); + wait_event_interruptible(waiter, tpd_flag != 0); + + tpd_flag = 0; + + set_current_state(TASK_RUNNING); + ssd60xx_work(); + } while (!kthread_should_stop()); + + return 0; +} + +static void ssd60xx_interrupt_handler(void) +{ + SSL_DEBUG("enter ssd60xx_interrupt_handler!\n"); + + tpd_flag = 1; + wake_up_interruptible(&waiter); +} + +static enum hrtimer_restart ssd60xx_timer_handler(struct hrtimer *timer) +{ + if (ssl_priv->use_irq == ENABLE_TIMER) { + SSL_DEBUG("enter ssd60xx_interrupt_handler!\n"); + + tpd_flag = 1; + wake_up_interruptible(&waiter); + hrtimer_start(&ssl_priv->timer, ktime_set(0, MICRO_TIME_INTERUPT), HRTIMER_MODE_REL); + } + return HRTIMER_NORESTART; +} + +static int ssd60xx_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct input_dev *input_dev; + int ret; + int err = 0; + + SSL_DEBUG("enter %s\n", __func__); + + /* /1. kmalloc priv data */ + ssl_priv = kzalloc(sizeof(*ssl_priv), GFP_KERNEL); + if (!ssl_priv) { + printk("%s: kzalloc error!\n", __func__); + return -1; + } + + /* /2. set other info */ +#ifdef TPD_POWER_SOURCE_CUSTOM + hwPowerOn(TPD_POWER_SOURCE_CUSTOM, VOL_2800, "TP"); +#else + hwPowerOn(MT6323_POWER_LDO_VGP1, VOL_2800, "TP"); +#endif + +#ifdef TPD_POWER_SOURCE_1800 + hwPowerOn(TPD_POWER_SOURCE_1800, VOL_1800, "TP"); +#endif + +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerDown(TPD_POWER_SOURCE, "TP"); + hwPowerOn(TPD_POWER_SOURCE, VOL_3300, "TP"); + msleep(100); +#endif + + mt_set_gpio_mode(GPIO_CTP_EINT_PIN, GPIO_CTP_EINT_PIN_M_EINT); + mt_set_gpio_dir(GPIO_CTP_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN, GPIO_PULL_ENABLE); + /* mt_set_gpio_pull_select(GPIO_CTP_EINT_PIN, GPIO_PULL_UP); */ + mt_set_gpio_pull_select(GPIO_CTP_EINT_PIN, GPIO_PULL_DOWN); + + msleep(100); + + ssl_priv->client = client; + ssl_priv->input = tpd->dev; + ssl_priv->use_irq = DEFAULT_USED; + + /*3. init chip inifo*/ + ssd60xx_device_reset(); + msleep(50); + + /*###############################################################################*/ + /*4 use can set here retu*/ + ret = ssd60xx_read_reg(ssl_priv->client, DEVICE_ID_REG, 2); + if (ret != SSD60XX_DEVICE_ID) { + ssd60xx_device_reset(); + msleep(50); + ret = ssd60xx_read_reg(ssl_priv->client, DEVICE_ID_REG, 2); + if (ret != SSD60XX_DEVICE_ID) { + printk(KERN_ERR "i2c_smbus_read_byte error!!\n"); + return -1; + } + } +/*###############################################################################*/ + + /* read chip ID */ + ssl_priv->device_id = ssd60xx_read_reg(ssl_priv->client, DEVICE_ID_REG, 2); + ssl_priv->version_id = ssd60xx_read_reg(ssl_priv->client, VERSION_ID_REG, 2); + ssl_priv->finger_count = ssd60xx_read_reg(ssl_priv->client, FINGER_COUNT_REG, 2); + printk("ssd60xx Device ID : 0x%04X\n", ssl_priv->device_id); + printk("ssd60xx Version ID : 0x%04X\n", ssl_priv->version_id); + printk("ssd60xx Finger Count : 0x%04X\n", ssl_priv->finger_count); + + msleep(20); + ssd60xx_device_patch(ssl_priv->client); + ssd60xx_device_init(ssl_priv->client); + + /* + * ############################################################################### + * 5. set work queue + */ + ssd60xx_thread = kthread_run(ssd60xx_event_handler, 0, TPD_DEVICE); + if (IS_ERR(ssd60xx_thread)) { + ret = PTR_ERR(ssd60xx_thread); + TPD_DMESG(TPD_DEVICE "failed to create kernel thread: %d\n", ret); + } + + /* + * ############################################################################### + * 6. set irq or timer for read pointer + */ + if (ssl_priv->use_irq == ENABLE_INT) { + mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_TYPE, ssd60xx_interrupt_handler, 0); + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + } else if (ssl_priv->use_irq == ENABLE_TIMER) { + hrtimer_init(&ssl_priv->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ssl_priv->timer.function = ssd60xx_timer_handler; + hrtimer_start(&ssl_priv->timer, ktime_set(0, MICRO_TIME_INTERUPT), HRTIMER_MODE_REL); + SSL_DEBUG("timer_init OK!\n"); + } + input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, 0, (FINGERNO - 1), 0, 0); + + tpd_load_status = 1; + +/* =============================================================================== */ +#ifdef MISC_TP_CHR + err = misc_register(&ssd_misc); + if (err < 0) { + printk("%s: could not register ssd_misc device\n", __func__); + } +#endif +/* =============================================================================== */ + +/* ******************************************************************************* */ +#ifdef TPD_PROC_DEBUG + err = sysfs_create_group(&ssl_priv->client->dev.kobj, &ssdtouch_attr_group); + if (err) { + printk("%s: sysfs_create_group error!\n", __func__); + } +#endif + filter_reg_update(); +/* ******************************************************************************* */ + +/* ############################################################################### */ +#ifdef SSL_AUTO_UPGRADE + if (ssd_auto_update_init() < 0) { + printk("update thread error........"); + } +#endif +/* ############################################################################### */ + + SSL_DEBUG("%s ok\n", __func__); + + return 0; +} + +static void ssd60xx_resume(struct early_suspend *h) +{ + int i = 0; + + SSL_DEBUG("enter %s\n", __func__); + + for (i = 0; i < sizeof(Resume) / sizeof(Resume[0]); i++) { + ssd60xx_write_reg(ssl_priv->client, Resume[i].Reg, Resume[i].Data1, Resume[i].Data2, Resume[i].No); + } + + /* ssd60xx_device_init(ssl_priv->client); */ + + ssl_ts_suspend_flag = 0; +#ifdef TPD_HAVE_BUTTON + if (FACTORY_BOOT == get_boot_mode() + || RECOVERY_BOOT == get_boot_mode()) { + tpd_button(0, 0, 0); + } +#endif + msleep(10); + filter_reg_update(); + +} + +static void ssd60xx_suspend(struct early_suspend *h) +{ + int i = 0; + + SSL_DEBUG("enter %s\n", __func__); + + for (i = 0; i < sizeof(Suspend) / sizeof(Suspend[0]); i++) { + ssd60xx_write_reg(ssl_priv->client, Suspend[i].Reg, Suspend[i].Data1, Suspend[i].Data2, Suspend[i].No); + } + + ssl_ts_suspend_flag = 1; +} + +static int ssd60xx_remove(struct i2c_client *client) +{ + SSL_DEBUG("enter %s\n", __func__); + +/* ******************************************************************************* */ +#ifdef TPD_PROC_DEBUG + printk("%s: remove_proc_entry!\n", __func__); + sysfs_remove_group(&ssl_priv->client->dev.kobj, &ssdtouch_attr_group); +#endif +/* ******************************************************************************* */ + +/* =============================================================================== */ +#ifdef MISC_TP_CHR + printk("%s: misc_deregister!\n", __func__); + misc_deregister(&ssd_misc); +#endif +/* =============================================================================== */ + + kfree(ssl_priv); + + return 0; +} + +static int ssd60xx_detect(struct i2c_client *client, int kind, struct i2c_board_info *info) +{ + strcpy(info->type, TPD_DEVICE); + return 0; +} + +static int tpd_local_init(void) +{ + if (i2c_add_driver(&tpd_i2c_driver) != 0) { + TPD_DMESG("ssd60xx unable to add i2c driver.\n"); + return -1; + } + + if (tpd_load_status == 0) { + TPD_DMESG("ssd60xx add error touch panel driver.\n"); + i2c_del_driver(&tpd_i2c_driver); + return -1; + } + + input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, 0, (FINGERNO - 1), 0, 0); + +#ifdef TPD_HAVE_BUTTON + tpd_button_setting(TPD_KEY_COUNT, tpd_keys_local, tpd_keys_dim_local); /* initialize tpd button data */ +#endif + +#if 0 /* (defined(TPD_WARP_START) && defined(TPD_WARP_END)) */ + TPD_DO_WARP = 1; + memcpy(tpd_wb_start, tpd_wb_start_local, TPD_WARP_CNT * 4); + memcpy(tpd_wb_end, tpd_wb_start_local, TPD_WARP_CNT * 4); +#endif + +#if 0 /* (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) */ + memcpy(tpd_calmat, tpd_def_calmat_local, 8 * 4); + memcpy(tpd_def_calmat, tpd_def_calmat_local, 8 * 4); +#endif + + TPD_DMESG("end %s, %d\n", __FUNCTION__, __LINE__); + tpd_type_cap = 1; + return 0; +} + +static struct tpd_driver_t tpd_device_driver = { + .tpd_device_name = SSD60XX_I2C_NAME, + .tpd_local_init = tpd_local_init, + .suspend = ssd60xx_suspend, + .resume = ssd60xx_resume, +#ifdef TPD_HAVE_BUTTON + .tpd_have_button = 1, +#else + .tpd_have_button = 0, +#endif +}; + +/* called when loaded into kernel */ +static int __init ssd60xx_driver_init(void) +{ + int ret; + SSL_DEBUG("enter %s\n", __func__); + + i2c_register_board_info(2, &ssd60xx_i2c_tpd, 1); + if (tpd_driver_add(&tpd_device_driver) < 0) { + TPD_DMESG("add ssd60xx driver failed\n"); + } + SSL_DEBUG("Solomon SSD60XX I2C Touchscreen Driver (Built %s @ %s)\n", __DATE__, __TIME__); + SSL_DEBUG("Solomon SSD60XX I2C Touchscreen Driver Version %s\n", DRIVER_VERSION); + + return ret; +} + +/* should never be called */ +static void __exit ssd60xx_driver_exit(void) +{ + SSL_DEBUG("enter %s\n", __func__); + tpd_driver_remove(&tpd_device_driver); +} + +module_init(ssd60xx_driver_init); +module_exit(ssd60xx_driver_exit); + +MODULE_AUTHOR("Solomon Systech (ShenZhen) Limited - binkazhang@solomon-systech.com"); +MODULE_DESCRIPTION("ssd60xx Touchscreen Driver 1.6"); +MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-mt8127/ford/touchpanel/ssd60xx_tp.h b/arch/arm/mach-mt8127/ford/touchpanel/ssd60xx_tp.h new file mode 100644 index 00000000000..5ef0936ff0f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/ssd60xx_tp.h @@ -0,0 +1,2176 @@ +/* + * Copyright 2015 Solomon Systech Ltd. All rights reserved. + * + * Date: 2015.9.10 testing build from Vincent/Joe YK Chan + */ + +#ifndef TPD_CUSTOM_SSD60XX_H__ +#define TPD_CUSTOM_SSD60XX_H__ +/* ############################################### */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* misc */ +#include +#include +#include + +#ifdef MT6575 +#include +#include +#include +#endif +#ifdef MT6577 +#include +#include +#include +#endif + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#include + +#ifdef TPD_PROXIMITY +#include +#include +#include +#endif +#include + +#include +#include + +/* misc */ +#include +#include +#include + +/* autograde */ +#include + +#include "tpd.h" +#include "cust_gpio_usage.h" + +/* ############################################### */ +#define SSD60XX_I2C_NAME "multi_tp" +#define SSD60XX_I2C_ADDR 0x48 +#define SSD60XX_DEVICE_ID 0x6270 + +#define SCREEN_MAX_X 1024 +#define SCREEN_MAX_Y 600 + +/* #define TPD_POWER_SOURCE_1800 MT6323_POWER_LDO_VIO18 */ +#define TPD_POWER_SOURCE_CUSTOM MT6323_POWER_LDO_VGP2 + +/* ############################################### */ + +struct ChipSetting { + char No; + char Reg; + char Data1; + char Data2; +}; + +struct ChipSetting Resume[] = { + {2, 0x04, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, +}; + +struct ChipSetting Suspend[] = { + {2, 0x05, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, + {2, 0x00, 0x00, 0x01}, +}; + +/* 20150813 Change Compared to 20150610*/ +/* R58h, 0xFFFA => 0xFFF9 */ +/* R59h, 0x1FF8 */ +/* R5Ah, 0x0040 => 0x0010 */ +/* R40h, 0x1064 => 0x0032 */ +/* R34h, 0xB610 => 0xD610 */ +/* R43h, 0x0010 => 0x0020 */ +/* R3Eh, 0x3205 => 0x0303 */ +/* RFCh, POR => 0x0022 */ +/* RC4h, POR => 0x0100*/ +/* RC5h, POR => 0x00A0*/ +/* RC6h, POR => 0x00E0*/ +/* RC7h, POR => 0x0100*/ +/* RC8h, POR => 0x0100*/ +/* R2Ah, 0x7531 => 0x7631*/ +/* R2Bh, 0x0407 => 0x040F*/ +/* R38h, 0x0001 => 0x0002*/ +/* RDDh, 0x3030 => 0x2020*/ +/* R72h, 0x0080 => 0x0100*/ +/* RE5h, POR => 0x8102*/ +/* RE6h, POR => 0x8002*/ +/* R87h, POR => 0x1F01*/ +/* RFBh, POR => 0xE222*/ +/* R36h, POR => 0x0100*/ +/* R3Ch, POR => 0x0010*/ +/* R46h, 0x101F => 0x081B*/ +/* RFCh, POR => 0x2515*/ +/* Page 1 */ +/* R76h, POR => 0x0402*/ +/* R77h, POR => 0xFFFF*/ + +// 20150828 +/* RE5h, 0x8102 => 0xC103*/ +/* R33h, POR => 0x0002*/ + +// 20150830 + +/* R0Bh, 0x00FA => 0x20FA*/ +/* R0Ch, 0x00FC => 0x20FC*/ +/* R0Dh, 0x00FB => 0x20FB*/ +/* R0Eh, 0x01F0 => 0x21F0*/ +/* R2Dh, POR => 0x1620*/ +/* R2Eh, 0x1810 => 0x1620*/ +/* R8Bh, 0x0010 => 0x0018*/ +/* R8Ch, 0x0020 => 0x0028*/ +/* RDDh, 0x2828 => 0x2020*/ + +// 20150907 + +/* R8Ch, 0x0020 => 0x0028*/ +/* R3Dh, 0x0064 => 0x0046*/ +/* R3Eh, 0x0303 => 0x0404*/ + + +static struct ChipSetting ssd60xxcfgTable[] = { + {2, 0x01, 0x00, 0x01}, /* Reset Touch IC before download init code */ + {2, 0x00, 0x00, 0x20}, /* delay 32ms */ + + {2, 0x29, 0x00, 0x01}, + {2, 0x2A, 0x76, 0x31}, + {2, 0x2B, 0x04, 0x0F}, + {2, 0x38, 0x00, 0x02}, + + {2, 0x2E, 0x18, 0x10}, + {2, 0x2F, 0x24, 0x10}, + {2, 0x30, 0x16, 0x17}, + + {2, 0xD5, 0x00, 0x05}, + {2, 0xD7, 0x00, 0x02}, + {2, 0xD8, 0x00, 0x07}, + {2, 0xDB, 0x00, 0x06}, + {2, 0xDD, 0x28, 0x28}, + + {2, 0x28, 0x00, 0x0D}, + {2, 0x06, 0x0D, 0x16}, + + {2, 0x07, 0x10, 0xF6}, //D0 + {2, 0x08, 0x00, 0xF8}, //D1 + {2, 0x09, 0x00, 0xF7}, //D2 + {2, 0x0A, 0x00, 0xF9}, //D3 + {2, 0x0B, 0x00, 0xFA}, //D4 + {2, 0x0C, 0x00, 0xFC}, //D5 + {2, 0x0D, 0x00, 0xFB}, //D6 + + {2, 0x0E, 0x01, 0xF0}, //D7 + {2, 0x0F, 0x01, 0xEF}, //D8 + {2, 0x10, 0x01, 0xF1}, //D9 + {2, 0x11, 0x01, 0xF2}, //D10 + {2, 0x12, 0x01, 0xF4}, //D11 + {2, 0x13, 0x01, 0xF3}, //D12 + {2, 0x14, 0x11, 0xF5}, //D13 + + {2, 0x40, 0x00, 0x32}, + {2, 0x41, 0x00, 0x20}, + {2, 0x42, 0x00, 0xA1}, + {2, 0x43, 0x00, 0x20}, + {2, 0x44, 0x00, 0xA1}, + {2, 0x45, 0x00, 0xA1}, + {2, 0x46, 0x08, 0x1B}, + + {2, 0x34, 0xD6, 0x10}, + {2, 0x8B, 0x00, 0x10}, + {2, 0x8C, 0x00, 0x20}, + + {2, 0x3B, 0x00, 0x14}, + {2, 0x72, 0x01, 0x00}, + {2, 0x37, 0x00, 0x05}, + + {2, 0x65, 0x00, 0x01}, + {2, 0x66, 0x2D, 0x38}, + {2, 0x67, 0x2F, 0x6E}, + {2, 0x68, 0xFF, 0xF8}, + {2, 0x69, 0xFF, 0xE0}, + {2, 0x6A, 0x00, 0x04}, + {2, 0x6B, 0x00, 0x04}, + {2, 0x6C, 0x03, 0xFC}, + {2, 0x6D, 0x02, 0x54}, + + {2, 0x3C, 0x00, 0x18}, + + {2, 0xED, 0xBE, 0x80}, + + {2, 0x47, 0x00, 0x02}, + + {2, 0x48, 0x07, 0x06}, + {2, 0x49, 0x01, 0x02}, + {2, 0x4A, 0x00, 0x00}, + + {2, 0x4B, 0x06, 0x07}, + {2, 0x4C, 0x01, 0x00}, + {2, 0x4D, 0x00, 0x00}, + {2, 0x4E, 0x44, 0x44}, + + {2, 0xAC, 0x60, 0x60}, + {2, 0xAD, 0x70, 0x70}, + {2, 0xAE, 0x38, 0x38}, + {2, 0xAF, 0x38, 0x38}, + + {2, 0xFD, 0x60, 0x60}, + {2, 0xFE, 0x50, 0x54}, + {2, 0xFF, 0x3C, 0x40}, + + {2, 0x3E, 0x03, 0x03}, + {2, 0x3D, 0x00, 0x64}, + + {2, 0x58, 0xFF, 0xF9}, + {2, 0x59, 0x1F, 0xF8}, + {2, 0x5A, 0x00, 0x10}, + + {2, 0x86, 0x01, 0x08}, + {2, 0x71, 0x80, 0x09}, + + {2, 0x90, 0x00, 0x01}, + {2, 0x6B, 0x05, 0x05}, + {2, 0x6C, 0x7F, 0x7F}, + {2, 0x74, 0xFF, 0x08}, + {2, 0x76, 0x04, 0x02}, + {2, 0x77, 0xFF, 0xFF}, + + {2, 0x89, 0x00, 0x08}, + + {2, 0x8A, 0x86, 0x00}, + {2, 0x8B, 0x00, 0x0F}, + {2, 0x8C, 0x00, 0x18}, + + {2, 0x8D, 0xD6, 0x10}, + {2, 0x8E, 0x00, 0x10}, + {2, 0x8F, 0x00, 0x20}, + +// {2, 0x34, 0xD6, 0x10}, +// {2, 0x8B, 0x00, 0x10}, +// {2, 0x8C, 0x00, 0x20}, + + {2, 0x90, 0x00, 0x00}, + + {2, 0x9B, 0x0D, 0xBF}, + {2, 0x9C, 0x00, 0x00}, + {2, 0x9D, 0x00, 0x08}, + {2, 0x9D, 0x00, 0x08}, + {2, 0x9D, 0x00, 0x10}, + {2, 0x9D, 0x00, 0x10}, + {2, 0x9D, 0x00, 0x20}, + {2, 0x9D, 0x00, 0x18}, + {2, 0x9D, 0x00, 0x40}, + {2, 0x9D, 0x00, 0x28}, + {2, 0x9D, 0x00, 0x80}, + {2, 0x9D, 0x00, 0x40}, + {2, 0x9D, 0x01, 0x00}, + {2, 0x9D, 0x00, 0x60}, + + {2, 0x8A, 0x00, 0x05}, + {2, 0x87, 0x1F, 0x01}, + + {2, 0xFC, 0xA9, 0x55}, + {2, 0xC4, 0x01, 0x00}, + {2, 0xC5, 0x00, 0xA0}, + {2, 0xC6, 0x00, 0xE0}, + {2, 0xC7, 0x01, 0x00}, + {2, 0xC8, 0x01, 0x00}, + {2, 0xE5, 0x81, 0x02}, + {2, 0xE6, 0x80, 0x02}, + {2, 0xFB, 0xE2, 0x22}, + + {2, 0x36, 0x01, 0x00}, + {2, 0x3C, 0x00, 0x10}, + + {2, 0x25, 0x00, 0x0A}, + +}; + +/* ssd60xx Setting */ + +static struct ChipSetting ssd60xxcfgPatch[] = { + {2, 0x01, 0x00, 0x00}, /* Reset Touch IC before download patch */ + {2, 0x00, 0x00, 0x20}, /* delay 32ms */ + + /* Touch Panel v2.15.21 checksum 0xC4B9 */ +{2, 0x9E, 0x00, 0x01}, +{2, 0x9C, 0x00, 0x01}, +{2, 0x9B, 0x17, 0x00}, +{2, 0x9D, 0x00, 0x55}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0x62, 0x70}, +{2, 0x9D, 0x00, 0x99}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9B, 0x00, 0xDC}, +{2, 0x9D, 0x10, 0x10}, +{2, 0x9B, 0x17, 0x08}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x40}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9B, 0x00, 0xDD}, +{2, 0x9D, 0x10, 0x23}, +{2, 0x9B, 0x17, 0x10}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0xC6, 0x00}, +{2, 0x9B, 0x00, 0xDE}, +{2, 0x9D, 0x10, 0x41}, +{2, 0x9B, 0x17, 0x18}, +{2, 0x9D, 0x00, 0x10}, +{2, 0x9D, 0x00, 0x30}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9B, 0x00, 0xDF}, +{2, 0x9D, 0x10, 0x42}, +{2, 0x9B, 0x17, 0x20}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9B, 0x00, 0xE0}, +{2, 0x9D, 0x10, 0x5E}, +{2, 0x9B, 0x17, 0x28}, +{2, 0x9D, 0x01, 0x17}, +{2, 0x9D, 0x01, 0x18}, +{2, 0x9D, 0x01, 0x19}, +{2, 0x9D, 0x01, 0x09}, +{2, 0x9D, 0x01, 0x1A}, +{2, 0x9D, 0x01, 0x1B}, +{2, 0x9D, 0x01, 0x1C}, +{2, 0x9D, 0x01, 0x0B}, +{2, 0x9B, 0x00, 0xE1}, +{2, 0x9D, 0x10, 0x6B}, +{2, 0x9B, 0x17, 0x30}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x10, 0x5B}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x00}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x1A, 0x71}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x09, 0x70}, +{2, 0x9B, 0x00, 0xE2}, +{2, 0x9D, 0x11, 0x5D}, +{2, 0x9B, 0x17, 0x38}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x10, 0x80}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x12, 0xE8}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x08}, +{2, 0x9B, 0x00, 0xE3}, +{2, 0x9D, 0x11, 0x63}, +{2, 0x9B, 0x17, 0x40}, +{2, 0x9D, 0xB0, 0x20}, +{2, 0x9D, 0x0B, 0x23}, +{2, 0x9D, 0x88, 0x20}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x6A, 0x2C}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x56}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9B, 0x00, 0xE4}, +{2, 0x9D, 0x11, 0x6F}, +{2, 0x9B, 0x17, 0x48}, +{2, 0x9D, 0x6F, 0xFD}, +{2, 0x9D, 0x3D, 0xC7}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x34}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x13, 0x91}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x8E}, +{2, 0x9B, 0x00, 0xE5}, +{2, 0x9D, 0x11, 0x76}, +{2, 0x9B, 0x17, 0x50}, +{2, 0x9D, 0x48, 0x00}, +{2, 0x9D, 0x02, 0x4A}, +{2, 0x9D, 0x02, 0x6A}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x82, 0x44}, +{2, 0x9D, 0x64, 0x06}, +{2, 0x9D, 0x01, 0x58}, +{2, 0x9B, 0x00, 0xE6}, +{2, 0x9D, 0x11, 0xA4}, +{2, 0x9B, 0x17, 0x58}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x00, 0x1E}, +{2, 0x9D, 0x07, 0x03}, +{2, 0x9D, 0x91, 0x70}, +{2, 0x9D, 0x8C, 0x28}, +{2, 0x9D, 0x20, 0x00}, +{2, 0x9D, 0x12, 0x27}, +{2, 0x9D, 0x12, 0x26}, +{2, 0x9B, 0x00, 0xE7}, +{2, 0x9D, 0x11, 0xAA}, +{2, 0x9B, 0x17, 0x60}, +{2, 0x9D, 0x6E, 0x02}, +{2, 0x9D, 0x3C, 0x03}, +{2, 0x9D, 0xA8, 0x00}, +{2, 0x9D, 0x01, 0x3C}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x66}, +{2, 0x9B, 0x00, 0xE8}, +{2, 0x9D, 0x12, 0x13}, +{2, 0x9B, 0x17, 0x68}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x38}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2B, 0x33}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x10, 0xAA}, +{2, 0x9B, 0x00, 0xE9}, +{2, 0x9D, 0x12, 0x14}, +{2, 0x9B, 0x17, 0x70}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0xB0, 0x10}, +{2, 0x9D, 0x0B, 0x27}, +{2, 0x9D, 0x02, 0x12}, +{2, 0x9D, 0x00, 0x1C}, +{2, 0x9D, 0x52, 0x0A}, +{2, 0x9D, 0xA8, 0x10}, +{2, 0x9B, 0x00, 0xEA}, +{2, 0x9D, 0x12, 0x15}, +{2, 0x9B, 0x17, 0x78}, +{2, 0x9D, 0x01, 0xC0}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x3B, 0xC5}, +{2, 0x9D, 0x6F, 0xFD}, +{2, 0x9D, 0x3D, 0xC5}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x6A}, +{2, 0x9B, 0x00, 0xEB}, +{2, 0x9D, 0x12, 0x16}, +{2, 0x9B, 0x17, 0x80}, +{2, 0x9D, 0xB8, 0x00}, +{2, 0x9D, 0x0B, 0x3B}, +{2, 0x9D, 0x6C, 0x09}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x0B, 0x3C}, +{2, 0x9D, 0x88, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x02, 0x0A}, +{2, 0x9B, 0x00, 0xEC}, +{2, 0x9D, 0x12, 0x3C}, +{2, 0x9B, 0x17, 0x88}, +{2, 0x9D, 0x00, 0x03}, +{2, 0x9D, 0xA8, 0x00}, +{2, 0x9D, 0x00, 0xA3}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0xA8, 0x00}, +{2, 0x9D, 0x00, 0xA0}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9B, 0x00, 0xED}, +{2, 0x9D, 0x12, 0x51}, +{2, 0x9B, 0x17, 0x90}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0xA0, 0x00}, +{2, 0x9D, 0x00, 0xA0}, +{2, 0x9D, 0x3A, 0x00}, +{2, 0x9D, 0x6F, 0xFD}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0xA8, 0x00}, +{2, 0x9B, 0x00, 0xEE}, +{2, 0x9D, 0x12, 0x52}, +{2, 0x9B, 0x17, 0x98}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x0B, 0x3C}, +{2, 0x9D, 0x88, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x6C, 0x06}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x00, 0x89}, +{2, 0x9B, 0x00, 0xEF}, +{2, 0x9D, 0x12, 0x57}, +{2, 0x9B, 0x17, 0xA0}, +{2, 0x9D, 0x02, 0x59}, +{2, 0x9D, 0x6D, 0xBB}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xB0, 0x50}, +{2, 0x9D, 0x0B, 0x1F}, +{2, 0x9D, 0x8D, 0x18}, +{2, 0x9B, 0x00, 0xF0}, +{2, 0x9D, 0x13, 0x22}, +{2, 0x9B, 0x17, 0xA8}, +{2, 0x9D, 0x1A, 0x65}, +{2, 0x9D, 0x91, 0x46}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0B, 0x30}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x90, 0x68}, +{2, 0x9D, 0x02, 0x60}, +{2, 0x9B, 0x00, 0xF1}, +{2, 0x9D, 0x14, 0x8D}, +{2, 0x9B, 0x17, 0xB0}, +{2, 0x9D, 0xFF, 0xFD}, +{2, 0x9D, 0x81, 0x56}, +{2, 0x9D, 0x6A, 0x0A}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0B, 0x30}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x90, 0x68}, +{2, 0x9B, 0x00, 0xF2}, +{2, 0x9D, 0x14, 0x8E}, +{2, 0x9B, 0x17, 0xB8}, +{2, 0x9D, 0x91, 0x46}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0B, 0x2F}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x90, 0x68}, +{2, 0x9D, 0x02, 0x60}, +{2, 0x9D, 0xFF, 0xFD}, +{2, 0x9B, 0x00, 0xF3}, +{2, 0x9D, 0x14, 0x94}, +{2, 0x9B, 0x17, 0xC0}, +{2, 0x9D, 0x81, 0x56}, +{2, 0x9D, 0x6A, 0x0A}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0B, 0x2F}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x90, 0x68}, +{2, 0x9D, 0x02, 0x60}, +{2, 0x9B, 0x00, 0xF4}, +{2, 0x9D, 0x14, 0x95}, +{2, 0x9B, 0x17, 0xC8}, +{2, 0x9D, 0x8C, 0x78}, +{2, 0x9D, 0x00, 0x1E}, +{2, 0x9D, 0x06, 0x47}, +{2, 0x9D, 0x10, 0x42}, +{2, 0x9D, 0x18, 0x43}, +{2, 0x9D, 0x12, 0x46}, +{2, 0x9D, 0x90, 0x56}, +{2, 0x9D, 0x92, 0x71}, +{2, 0x9B, 0x00, 0xF5}, +{2, 0x9D, 0x14, 0x9D}, +{2, 0x9B, 0x17, 0xD0}, +{2, 0x9D, 0x0E, 0xB6}, +{2, 0x9D, 0x8C, 0x68}, +{2, 0x9D, 0xFE, 0x00}, +{2, 0x9D, 0x0C, 0xB6}, +{2, 0x9D, 0xA9, 0xAB}, +{2, 0x9D, 0x03, 0x09}, +{2, 0x9D, 0x6D, 0xED}, +{2, 0x9D, 0x11, 0x55}, +{2, 0x9B, 0x00, 0xF6}, +{2, 0x9D, 0x15, 0x65}, +{2, 0x9B, 0x17, 0xD8}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xA0, 0x30}, +{2, 0x9D, 0x01, 0x81}, +{2, 0x9D, 0x02, 0x32}, +{2, 0x9D, 0x01, 0xFF}, +{2, 0x9D, 0x91, 0x03}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x1E}, +{2, 0x9B, 0x00, 0xF7}, +{2, 0x9D, 0x15, 0x91}, +{2, 0x9B, 0x17, 0xE0}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x2C}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x8C, 0x78}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x8D, 0x18}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9B, 0x00, 0xF8}, +{2, 0x9D, 0x15, 0x92}, +{2, 0x9B, 0x17, 0xE8}, +{2, 0x9D, 0x00, 0x1E}, +{2, 0x9D, 0x07, 0x36}, +{2, 0x9D, 0x10, 0x32}, +{2, 0x9D, 0x90, 0x73}, +{2, 0x9D, 0x10, 0x30}, +{2, 0x9D, 0xA1, 0x63}, +{2, 0x9D, 0x90, 0x36}, +{2, 0x9D, 0x44, 0x66}, +{2, 0x9B, 0x00, 0xF9}, +{2, 0x9D, 0x15, 0x9D}, +{2, 0x9B, 0x17, 0xF0}, +{2, 0x9D, 0x8C, 0x28}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x02, 0x49}, +{2, 0x9D, 0x6D, 0xDF}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x5D}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9B, 0x00, 0xFA}, +{2, 0x9D, 0x15, 0xA0}, +{2, 0x9B, 0x17, 0xF8}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x41, 0x78}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x89}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0x90, 0x38}, +{2, 0x9D, 0x02, 0x32}, +{2, 0x9B, 0x00, 0xFB}, +{2, 0x9D, 0x15, 0xFF}, +{2, 0x9B, 0x10, 0x00}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9D, 0x07, 0x82}, +{2, 0x9D, 0x07, 0x10}, +{2, 0x9D, 0x80, 0x81}, +{2, 0x9D, 0x56, 0x0B}, +{2, 0x9D, 0xB0, 0x50}, +{2, 0x9D, 0x0C, 0x0E}, +{2, 0x9D, 0x88, 0x50}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x6A, 0x06}, +{2, 0x9D, 0x02, 0x58}, +{2, 0x9D, 0xB8, 0x50}, +{2, 0x9D, 0x0C, 0x0E}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x12, 0xB9}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x0C, 0x0A}, +{2, 0x9D, 0x02, 0x09}, +{2, 0x9D, 0x88, 0x00}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x6A, 0x02}, +{2, 0x9D, 0x02, 0x0A}, +{2, 0x9D, 0xB8, 0x00}, +{2, 0x9D, 0x0C, 0x0A}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x8A}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0x91, 0x98}, +{2, 0x9D, 0x03, 0xAA}, +{2, 0x9D, 0x8C, 0x38}, +{2, 0x9D, 0x02, 0xAE}, +{2, 0x9D, 0x8C, 0x48}, +{2, 0x9D, 0x02, 0xBD}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x07, 0x10}, +{2, 0x9D, 0x90, 0x21}, +{2, 0x9D, 0x02, 0x10}, +{2, 0x9D, 0x0B, 0xCE}, +{2, 0x9D, 0x02, 0x20}, +{2, 0x9D, 0x0B, 0xEC}, +{2, 0x9D, 0x89, 0xA0}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x64, 0x0D}, +{2, 0x9D, 0x83, 0xA9}, +{2, 0x9D, 0x64, 0x04}, +{2, 0x9D, 0xB2, 0x83}, +{2, 0x9D, 0xB2, 0x94}, +{2, 0x9D, 0x6C, 0x04}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x90, 0x98}, +{2, 0x9D, 0xBA, 0x18}, +{2, 0x9D, 0xBA, 0x29}, +{2, 0x9D, 0x03, 0xA9}, +{2, 0x9D, 0x6D, 0xF2}, +{2, 0x9D, 0x03, 0x6A}, +{2, 0x9D, 0xB0, 0x50}, +{2, 0x9D, 0x00, 0x87}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x42, 0x7E}, +{2, 0x9D, 0x81, 0x65}, +{2, 0x9B, 0x00, 0xC0}, +{2, 0x9D, 0x02, 0xC1}, +{2, 0x9B, 0x10, 0x40}, +{2, 0x9D, 0x64, 0x25}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x92, 0x96}, +{2, 0x9D, 0x07, 0x89}, +{2, 0x9D, 0x91, 0x18}, +{2, 0x9D, 0x03, 0x10}, +{2, 0x9D, 0x02, 0xF9}, +{2, 0x9D, 0x91, 0x28}, +{2, 0x9D, 0x03, 0x20}, +{2, 0x9D, 0x03, 0x21}, +{2, 0x9D, 0x8C, 0x54}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x31, 0x4B}, +{2, 0x9D, 0x8D, 0x64}, +{2, 0x9D, 0x8D, 0x14}, +{2, 0x9D, 0x8D, 0x24}, +{2, 0x9D, 0x8D, 0x28}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x92, 0x06}, +{2, 0x9D, 0x03, 0x1A}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x20, 0xEE}, +{2, 0x9D, 0x8D, 0x25}, +{2, 0x9D, 0x8D, 0x15}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x42, 0x84}, +{2, 0x9D, 0x8D, 0x65}, +{2, 0x9D, 0x8D, 0x64}, +{2, 0x9D, 0x89, 0x60}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x72, 0x00}, +{2, 0x9D, 0x10, 0xBF}, +{2, 0x9D, 0x8D, 0x65}, +{2, 0x9D, 0x8C, 0x55}, +{2, 0x9D, 0x03, 0x69}, +{2, 0x9D, 0x6D, 0xDB}, +{2, 0x9D, 0x03, 0xAA}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x07, 0x85}, +{2, 0x9D, 0x12, 0x8A}, +{2, 0x9D, 0x90, 0x18}, +{2, 0x9D, 0x90, 0x28}, +{2, 0x9D, 0x02, 0x10}, +{2, 0x9D, 0x02, 0xF9}, +{2, 0x9D, 0x02, 0x20}, +{2, 0x9D, 0x03, 0x21}, +{2, 0x9D, 0x02, 0x58}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x07, 0x85}, +{2, 0x9D, 0x12, 0x8A}, +{2, 0x9D, 0x90, 0x38}, +{2, 0x9D, 0x90, 0x48}, +{2, 0x9D, 0x02, 0x30}, +{2, 0x9D, 0x02, 0xF9}, +{2, 0x9D, 0x02, 0x40}, +{2, 0x9D, 0x03, 0x21}, +{2, 0x9D, 0x89, 0xA0}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x64, 0x07}, +{2, 0x9D, 0xB2, 0x83}, +{2, 0x9D, 0xBA, 0x18}, +{2, 0x9B, 0x00, 0xC1}, +{2, 0x9D, 0x02, 0xC2}, +{2, 0x9B, 0x10, 0x80}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x15, 0x2C}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2D, 0x05}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x43, 0x2E}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x0A, 0xEC}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2D, 0x27}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x15, 0x4B}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x45, 0x37}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x14, 0x10}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x14, 0x73}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x00, 0x04}, +{2, 0x9D, 0x03, 0x1A}, +{2, 0x9D, 0x8D, 0x28}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x20, 0xEE}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x14, 0xAD}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x44, 0xD2}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x43, 0xC0}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x44, 0xFE}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x00, 0x04}, +{2, 0x9D, 0x03, 0x1A}, +{2, 0x9D, 0x8D, 0x28}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x20, 0xEE}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x44, 0xA6}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x30, 0x50}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x0B, 0x55}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x12, 0x6A}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x0B, 0xB4}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x3C}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x0D, 0xE0}, +{2, 0x9D, 0x3C, 0x00}, +{2, 0x9D, 0x3A, 0x86}, +{2, 0x9B, 0x00, 0xC2}, +{2, 0x9D, 0x03, 0x04}, +{2, 0x9B, 0x10, 0xC0}, +{2, 0x9D, 0x6E, 0x02}, +{2, 0x9D, 0x3E, 0x00}, +{2, 0x9D, 0xB8, 0x00}, +{2, 0x9D, 0x0D, 0xE0}, +{2, 0x9D, 0x3A, 0x00}, +{2, 0x9D, 0x6E, 0x0B}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x13, 0x01}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2B, 0x33}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2C, 0x3D}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2D, 0xBC}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x10, 0xAA}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x13, 0x01}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2B, 0x33}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x10, 0xA6}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x11, 0xEE}, +{2, 0x9D, 0x7D, 0x30}, +{2, 0x9D, 0x30, 0x1E}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x05, 0x01}, +{2, 0x9D, 0x8D, 0x08}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x08, 0x00}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x13, 0xFB}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x41, 0xA4}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x0B, 0x89}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x42, 0x45}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x10, 0xA0}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x12, 0x1B}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x0D, 0xE0}, +{2, 0x9D, 0x3A, 0x00}, +{2, 0x9D, 0x6E, 0x03}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x10, 0xB8}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2C, 0x3D}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x2D, 0xBC}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x10, 0xB8}, +{2, 0x9D, 0x02, 0x8A}, +{2, 0x9D, 0xB8, 0x80}, +{2, 0x9D, 0x0C, 0x0C}, +{2, 0x9D, 0x38, 0x00}, +{2, 0x9D, 0x6E, 0x07}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0B, 0x3C}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9B, 0x00, 0xC3}, +{2, 0x9D, 0x03, 0x05}, +{2, 0x9B, 0x11, 0x00}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x50, 0x02}, +{2, 0x9D, 0x6C, 0x03}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x2F, 0xFA}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x30, 0x1B}, +{2, 0x9D, 0x03, 0xAA}, +{2, 0x9D, 0x03, 0x9A}, +{2, 0x9D, 0x3B, 0x0F}, +{2, 0x9D, 0x6E, 0x06}, +{2, 0x9D, 0x03, 0x06}, +{2, 0x9D, 0x02, 0x06}, +{2, 0x9D, 0x02, 0x09}, +{2, 0x9D, 0x17, 0x0A}, +{2, 0x9D, 0x03, 0x99}, +{2, 0x9D, 0x3B, 0x1F}, +{2, 0x9D, 0x6E, 0x06}, +{2, 0x9D, 0x03, 0x16}, +{2, 0x9D, 0x02, 0x16}, +{2, 0x9D, 0x02, 0x19}, +{2, 0x9D, 0x17, 0x1A}, +{2, 0x9D, 0x03, 0x99}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x0D, 0xD9}, +{2, 0x9D, 0x3B, 0x90}, +{2, 0x9D, 0x6E, 0x02}, +{2, 0x9D, 0x02, 0x07}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x02, 0x8A}, +{2, 0x9D, 0x82, 0x80}, +{2, 0x9D, 0x64, 0x04}, +{2, 0x9D, 0xBA, 0x01}, +{2, 0x9D, 0x02, 0x89}, +{2, 0x9D, 0x6D, 0xFC}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x01, 0x76}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x52, 0x63}, +{2, 0x9D, 0x90, 0x08}, +{2, 0x9D, 0x02, 0x02}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9D, 0x47, 0x88}, +{2, 0x9D, 0x90, 0x18}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x01, 0x77}, +{2, 0x9D, 0x91, 0x18}, +{2, 0x9D, 0x03, 0x12}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9D, 0x47, 0x88}, +{2, 0x9D, 0x91, 0x28}, +{2, 0x9D, 0x3B, 0xC8}, +{2, 0x9D, 0x6E, 0x06}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x01, 0x00}, +{2, 0x9D, 0x90, 0x10}, +{2, 0x9D, 0x91, 0x10}, +{2, 0x9D, 0x91, 0x20}, +{2, 0x9D, 0x03, 0x0A}, +{2, 0x9D, 0x8C, 0x38}, +{2, 0x9D, 0x02, 0xEA}, +{2, 0x9D, 0x8C, 0x58}, +{2, 0x9B, 0x00, 0xC4}, +{2, 0x9D, 0x03, 0x06}, +{2, 0x9B, 0x11, 0x40}, +{2, 0x9D, 0x02, 0xDB}, +{2, 0x9D, 0x8C, 0x78}, +{2, 0x9D, 0x02, 0xCC}, +{2, 0x9D, 0x89, 0x00}, +{2, 0x9D, 0x00, 0x0F}, +{2, 0x9D, 0x54, 0x46}, +{2, 0x9D, 0xB1, 0x83}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0x52, 0x3D}, +{2, 0x9D, 0x03, 0x3A}, +{2, 0x9D, 0x8C, 0x48}, +{2, 0x9D, 0x02, 0xEA}, +{2, 0x9D, 0x8C, 0x68}, +{2, 0x9D, 0x02, 0xDB}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x02, 0xCC}, +{2, 0x9D, 0x89, 0x30}, +{2, 0x9D, 0x00, 0x0F}, +{2, 0x9D, 0x54, 0x33}, +{2, 0x9D, 0x83, 0x03}, +{2, 0x9D, 0x52, 0x2C}, +{2, 0x9D, 0xB1, 0x84}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0x52, 0x28}, +{2, 0x9D, 0xB1, 0x85}, +{2, 0x9D, 0x06, 0x80}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x08}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9D, 0xB1, 0x96}, +{2, 0x9D, 0x80, 0x98}, +{2, 0x9D, 0x66, 0x0B}, +{2, 0x9D, 0xB1, 0x87}, +{2, 0x9D, 0x06, 0x81}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x08}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9D, 0xB1, 0x9A}, +{2, 0x9D, 0x80, 0x98}, +{2, 0x9D, 0x66, 0x02}, +{2, 0x9D, 0x6C, 0x15}, +{2, 0x9D, 0xB1, 0x83}, +{2, 0x9D, 0x02, 0x82}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9D, 0xB1, 0x94}, +{2, 0x9D, 0x02, 0x92}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9D, 0x0A, 0x89}, +{2, 0x9D, 0x82, 0x81}, +{2, 0x9D, 0x56, 0x09}, +{2, 0x9D, 0xB1, 0x83}, +{2, 0x9D, 0x47, 0x88}, +{2, 0x9D, 0xB1, 0x94}, +{2, 0x9D, 0x47, 0x98}, +{2, 0x9D, 0x0A, 0x89}, +{2, 0x9D, 0x82, 0x82}, +{2, 0x9D, 0x56, 0x02}, +{2, 0x9D, 0x6C, 0x04}, +{2, 0x9D, 0x92, 0x83}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9B, 0x00, 0xC5}, +{2, 0x9D, 0x03, 0x07}, +{2, 0x9B, 0x11, 0x80}, +{2, 0x9D, 0x42, 0x0C}, +{2, 0x9D, 0x03, 0x39}, +{2, 0x9D, 0x02, 0x49}, +{2, 0x9D, 0x02, 0x69}, +{2, 0x9D, 0x02, 0xA9}, +{2, 0x9D, 0x6D, 0xCC}, +{2, 0x9D, 0x03, 0x09}, +{2, 0x9D, 0x02, 0x39}, +{2, 0x9D, 0x02, 0x59}, +{2, 0x9D, 0x02, 0x79}, +{2, 0x9D, 0x6D, 0xB9}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x02, 0xAA}, +{2, 0x9D, 0x02, 0xBB}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x02, 0xEA}, +{2, 0x9D, 0x10, 0x84}, +{2, 0x9D, 0xB9, 0x8B}, +{2, 0x9D, 0x02, 0x80}, +{2, 0x9D, 0xFF, 0xE2}, +{2, 0x9D, 0xB9, 0x8A}, +{2, 0x9D, 0x02, 0x80}, +{2, 0x9D, 0x00, 0x0F}, +{2, 0x9D, 0xB9, 0x8A}, +{2, 0x9D, 0x02, 0x80}, +{2, 0x9D, 0x0B, 0x40}, +{2, 0x9D, 0xB9, 0x8A}, +{2, 0x9D, 0x02, 0x80}, +{2, 0x9D, 0xF4, 0x93}, +{2, 0x9D, 0xB9, 0x89}, +{2, 0x9D, 0x02, 0x80}, +{2, 0x9D, 0x00, 0x0F}, +{2, 0x9D, 0xB9, 0x89}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x0E, 0x1B}, +{2, 0x9D, 0x02, 0x8A}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x0E, 0x2A}, +{2, 0x9D, 0x54, 0x03}, +{2, 0x9D, 0xBA, 0xA8}, +{2, 0x9D, 0x6D, 0xFC}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x05, 0x01}, +{2, 0x9D, 0x02, 0x3A}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x0B, 0x30}, +{2, 0x9D, 0xB0, 0x10}, +{2, 0x9D, 0x0B, 0x2F}, +{2, 0x9D, 0x07, 0x01}, +{2, 0x9D, 0x80, 0x30}, +{2, 0x9D, 0x54, 0x0F}, +{2, 0x9D, 0xB2, 0x2A}, +{2, 0x9D, 0x47, 0x2C}, +{2, 0x9D, 0x88, 0x20}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x52, 0x08}, +{2, 0x9D, 0x02, 0x28}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x0E, 0x1B}, +{2, 0x9D, 0x10, 0x82}, +{2, 0x9D, 0xB1, 0x98}, +{2, 0x9B, 0x00, 0xC6}, +{2, 0x9D, 0x03, 0x08}, +{2, 0x9B, 0x11, 0xC0}, +{2, 0x9D, 0x02, 0x99}, +{2, 0x9D, 0xB9, 0x89}, +{2, 0x9D, 0x02, 0x39}, +{2, 0x9D, 0x6D, 0xF1}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xB0, 0x30}, +{2, 0x9D, 0x01, 0x6E}, +{2, 0x9D, 0x3A, 0x3F}, +{2, 0x9D, 0x6E, 0x35}, +{2, 0x9D, 0x02, 0x32}, +{2, 0x9D, 0x00, 0x0F}, +{2, 0x9D, 0x8C, 0xB8}, +{2, 0x9D, 0x00, 0x2C}, +{2, 0x9D, 0x8C, 0x68}, +{2, 0x9D, 0x0E, 0x40}, +{2, 0x9D, 0x8C, 0x48}, +{2, 0x9D, 0xFE, 0x00}, +{2, 0x9D, 0x8C, 0x58}, +{2, 0x9D, 0x01, 0xFF}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x0B, 0x2F}, +{2, 0x9D, 0xB0, 0x10}, +{2, 0x9D, 0x0B, 0x30}, +{2, 0x9D, 0x02, 0x7A}, +{2, 0x9D, 0x02, 0x0A}, +{2, 0x9D, 0x80, 0x0A}, +{2, 0x9D, 0x64, 0x23}, +{2, 0x9D, 0x03, 0x2A}, +{2, 0x9D, 0x81, 0x21}, +{2, 0x9D, 0x54, 0x1E}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x2C}, +{2, 0x9D, 0x06, 0x80}, +{2, 0x9D, 0x12, 0x82}, +{2, 0x9D, 0x02, 0x80}, +{2, 0x9D, 0x08, 0x00}, +{2, 0x9D, 0xA1, 0x98}, +{2, 0x9D, 0x44, 0x96}, +{2, 0x9D, 0x45, 0x96}, +{2, 0x9D, 0xB1, 0x26}, +{2, 0x9D, 0x4F, 0x27}, +{2, 0x9D, 0x02, 0x22}, +{2, 0x9D, 0x00, 0x0F}, +{2, 0x9D, 0x06, 0x92}, +{2, 0x9D, 0x4D, 0x93}, +{2, 0x9D, 0x0C, 0x94}, +{2, 0x9D, 0x0E, 0x95}, +{2, 0x9D, 0x02, 0x92}, +{2, 0x9D, 0x03, 0xFF}, +{2, 0x9D, 0xA9, 0x89}, +{2, 0x9D, 0x02, 0x70}, +{2, 0x9D, 0x00, 0x04}, +{2, 0x9D, 0x88, 0x70}, +{2, 0x9D, 0x00, 0x0C}, +{2, 0x9D, 0x6A, 0x03}, +{2, 0x9D, 0x02, 0x7A}, +{2, 0x9D, 0x02, 0x69}, +{2, 0x9D, 0x03, 0x29}, +{2, 0x9D, 0x6D, 0xE2}, +{2, 0x9D, 0x02, 0x09}, +{2, 0x9D, 0x6D, 0xDD}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x02, 0x52}, +{2, 0x9D, 0x00, 0x03}, +{2, 0x9B, 0x00, 0xC7}, +{2, 0x9D, 0x03, 0x09}, +{2, 0x9B, 0x12, 0x00}, +{2, 0x9D, 0xB8, 0x50}, +{2, 0x9D, 0x0C, 0x0C}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x30, 0x7F}, +{2, 0x9D, 0xB0, 0x70}, +{2, 0x9D, 0x0B, 0xB9}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x86}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0x34, 0x88}, +{2, 0x9D, 0x56, 0x06}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0xB8, 0x80}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x6C, 0x8F}, +{2, 0x9D, 0x3C, 0x88}, +{2, 0x9D, 0x91, 0x08}, +{2, 0x9D, 0xB0, 0x70}, +{2, 0x9D, 0x0B, 0xB9}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x0B, 0xBA}, +{2, 0x9D, 0x8C, 0x28}, +{2, 0x9D, 0x0B, 0xC4}, +{2, 0x9D, 0x8C, 0xC8}, +{2, 0x9D, 0x0F, 0x8C}, +{2, 0x9D, 0x8C, 0xD8}, +{2, 0x9D, 0x0F, 0x96}, +{2, 0x9D, 0x92, 0x51}, +{2, 0x9D, 0x92, 0x62}, +{2, 0x9D, 0x02, 0x0A}, +{2, 0x9D, 0x88, 0x00}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x54, 0x7D}, +{2, 0x9D, 0xB1, 0x85}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x52, 0x6D}, +{2, 0x9D, 0xB1, 0x81}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x52, 0x5C}, +{2, 0x9D, 0x90, 0x87}, +{2, 0x9D, 0x4F, 0x80}, +{2, 0x9D, 0x3A, 0x80}, +{2, 0x9D, 0x6E, 0x03}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x42, 0xDF}, +{2, 0x9D, 0xB1, 0x35}, +{2, 0x9D, 0xB1, 0x8C}, +{2, 0x9D, 0x0A, 0x38}, +{2, 0x9D, 0xB1, 0x46}, +{2, 0x9D, 0xB1, 0x8D}, +{2, 0x9D, 0x0A, 0x48}, +{2, 0x9D, 0x0C, 0x34}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x0F, 0x82}, +{2, 0x9D, 0x10, 0xA0}, +{2, 0x9D, 0xB1, 0xBA}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x01, 0x74}, +{2, 0x9D, 0x02, 0x82}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9B, 0x00, 0xC8}, +{2, 0x9D, 0x03, 0x0A}, +{2, 0x9B, 0x12, 0x40}, +{2, 0x9D, 0x80, 0x38}, +{2, 0x9D, 0x64, 0x16}, +{2, 0x9D, 0x02, 0xB9}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x01, 0x74}, +{2, 0x9D, 0x47, 0x88}, +{2, 0x9D, 0x80, 0xB8}, +{2, 0x9D, 0x6A, 0x0F}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x4C, 0x80}, +{2, 0x9D, 0x24, 0x78}, +{2, 0x9D, 0xB0, 0x90}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x24, 0x98}, +{2, 0x9D, 0xB8, 0x90}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x02, 0xBA}, +{2, 0x9D, 0xB1, 0x95}, +{2, 0x9D, 0xB9, 0xC9}, +{2, 0x9D, 0xB1, 0x96}, +{2, 0x9D, 0xB9, 0xD9}, +{2, 0x9D, 0x6C, 0x06}, +{2, 0x9D, 0x02, 0xBA}, +{2, 0x9D, 0xB1, 0x95}, +{2, 0x9D, 0xB9, 0xC9}, +{2, 0x9D, 0xB1, 0x96}, +{2, 0x9D, 0xB9, 0xD9}, +{2, 0x9D, 0xB9, 0xAB}, +{2, 0x9D, 0x6C, 0x00}, +{2, 0x9D, 0x43, 0x13}, +{2, 0x9D, 0xB1, 0x35}, +{2, 0x9D, 0xB1, 0x81}, +{2, 0x9D, 0x18, 0x38}, +{2, 0x9D, 0x54, 0x02}, +{2, 0x9D, 0x02, 0x37}, +{2, 0x9D, 0xB1, 0x46}, +{2, 0x9D, 0xB1, 0x82}, +{2, 0x9D, 0x18, 0x48}, +{2, 0x9D, 0x54, 0x02}, +{2, 0x9D, 0x02, 0x47}, +{2, 0x9D, 0x82, 0x30}, +{2, 0x9D, 0x54, 0x04}, +{2, 0x9D, 0x82, 0x40}, +{2, 0x9D, 0x54, 0x02}, +{2, 0x9D, 0x6C, 0x0A}, +{2, 0x9D, 0xB1, 0x95}, +{2, 0x9D, 0xB9, 0xC9}, +{2, 0x9D, 0xB1, 0x96}, +{2, 0x9D, 0xB9, 0xD9}, +{2, 0x9D, 0xB1, 0x81}, +{2, 0x9D, 0xB9, 0x58}, +{2, 0x9D, 0xB1, 0x82}, +{2, 0x9D, 0xB9, 0x68}, +{2, 0x9D, 0x6C, 0x06}, +{2, 0x9D, 0xB1, 0x81}, +{2, 0x9D, 0xB9, 0x58}, +{2, 0x9D, 0xB1, 0x82}, +{2, 0x9D, 0xB9, 0x68}, +{2, 0x9D, 0x6C, 0x0A}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x4C, 0x80}, +{2, 0x9D, 0x28, 0x78}, +{2, 0x9B, 0x00, 0xC9}, +{2, 0x9D, 0x03, 0x0B}, +{2, 0x9B, 0x12, 0x80}, +{2, 0x9D, 0xB0, 0x90}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x24, 0x98}, +{2, 0x9D, 0xB8, 0x90}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x6C, 0x0E}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x4C, 0x80}, +{2, 0x9D, 0x24, 0x78}, +{2, 0x9D, 0xB0, 0x90}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x24, 0x98}, +{2, 0x9D, 0xB8, 0x90}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0xB1, 0x95}, +{2, 0x9D, 0xB9, 0xC9}, +{2, 0x9D, 0xB1, 0x96}, +{2, 0x9D, 0xB9, 0xD9}, +{2, 0x9D, 0xB1, 0x85}, +{2, 0x9D, 0xB9, 0x18}, +{2, 0x9D, 0xB1, 0x86}, +{2, 0x9D, 0xB9, 0x28}, +{2, 0x9D, 0x02, 0x09}, +{2, 0x9D, 0x02, 0x19}, +{2, 0x9D, 0x02, 0x29}, +{2, 0x9D, 0x02, 0xC9}, +{2, 0x9D, 0x02, 0xD9}, +{2, 0x9D, 0x02, 0x59}, +{2, 0x9D, 0x02, 0x69}, +{2, 0x9D, 0x6D, 0x82}, +{2, 0x9D, 0xB8, 0x70}, +{2, 0x9D, 0x0B, 0xB9}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x00, 0x04}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x00, 0x10}, +{2, 0x9D, 0x00, 0x10}, +{2, 0x9D, 0x00, 0x20}, +{2, 0x9D, 0x00, 0x20}, +{2, 0x9D, 0x00, 0x40}, +{2, 0x9D, 0x00, 0x40}, +{2, 0x9D, 0x00, 0x80}, +{2, 0x9D, 0x00, 0x60}, +{2, 0x9D, 0x02, 0x00}, +{2, 0x9D, 0x00, 0x80}, +{2, 0x9D, 0x02, 0x4A}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x8C, 0xB8}, +{2, 0x9D, 0xFF, 0x80}, +{2, 0x9D, 0x8C, 0x58}, +{2, 0x9D, 0x0D, 0xA1}, +{2, 0x9D, 0x8C, 0x68}, +{2, 0x9D, 0x0D, 0x8D}, +{2, 0x9D, 0x8C, 0x78}, +{2, 0x9D, 0x0D, 0xB5}, +{2, 0x9D, 0x02, 0x3A}, +{2, 0x9D, 0x88, 0x30}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x54, 0x0A}, +{2, 0x9D, 0xBA, 0x6A}, +{2, 0x9D, 0xBA, 0x6B}, +{2, 0x9D, 0xBA, 0x5A}, +{2, 0x9B, 0x00, 0xCA}, +{2, 0x9D, 0x03, 0x0C}, +{2, 0x9B, 0x12, 0xC0}, +{2, 0x9D, 0xBA, 0x5B}, +{2, 0x9D, 0xBA, 0x74}, +{2, 0x9D, 0xB8, 0x40}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x02, 0x39}, +{2, 0x9D, 0x6D, 0xF5}, +{2, 0x9D, 0x02, 0x3A}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x0D, 0xBF}, +{2, 0x9D, 0x8C, 0x28}, +{2, 0x9D, 0x43, 0x22}, +{2, 0x9D, 0x88, 0x30}, +{2, 0x9D, 0x00, 0x0C}, +{2, 0x9D, 0x54, 0x06}, +{2, 0x9D, 0x01, 0x82}, +{2, 0x9D, 0x02, 0x29}, +{2, 0x9D, 0xBA, 0x18}, +{2, 0x9D, 0x02, 0x39}, +{2, 0x9D, 0x6D, 0xF9}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x03, 0x5A}, +{2, 0x9D, 0x92, 0x75}, +{2, 0x9D, 0x44, 0x71}, +{2, 0x9D, 0x02, 0x70}, +{2, 0x9D, 0x0D, 0xBF}, +{2, 0x9D, 0xB1, 0x87}, +{2, 0x9D, 0x80, 0x08}, +{2, 0x9D, 0x6A, 0x06}, +{2, 0x9D, 0x03, 0x59}, +{2, 0x9D, 0x89, 0x50}, +{2, 0x9D, 0x00, 0x06}, +{2, 0x9D, 0x64, 0x02}, +{2, 0x9D, 0x6D, 0xF5}, +{2, 0x9D, 0x92, 0x75}, +{2, 0x9D, 0x44, 0x71}, +{2, 0x9D, 0x02, 0x70}, +{2, 0x9D, 0x0D, 0xBF}, +{2, 0x9D, 0x89, 0x50}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x52, 0x05}, +{2, 0x9D, 0x89, 0x50}, +{2, 0x9D, 0x00, 0x06}, +{2, 0x9D, 0x52, 0x05}, +{2, 0x9D, 0x6C, 0x07}, +{2, 0x9D, 0x02, 0x79}, +{2, 0x9D, 0xB1, 0x67}, +{2, 0x9D, 0x6C, 0x19}, +{2, 0x9D, 0x02, 0x78}, +{2, 0x9D, 0xB1, 0x67}, +{2, 0x9D, 0x6C, 0x16}, +{2, 0x9D, 0xB2, 0xA7}, +{2, 0x9D, 0xB3, 0xB7}, +{2, 0x9D, 0x03, 0x58}, +{2, 0x9D, 0x02, 0x70}, +{2, 0x9D, 0xFF, 0xFE}, +{2, 0x9D, 0xB2, 0x87}, +{2, 0x9D, 0x18, 0xA8}, +{2, 0x9D, 0xB1, 0x97}, +{2, 0x9D, 0x18, 0xB9}, +{2, 0x9D, 0x18, 0x08}, +{2, 0x9D, 0x90, 0x80}, +{2, 0x9D, 0x06, 0x8B}, +{2, 0x9D, 0x90, 0x9A}, +{2, 0x9D, 0x91, 0x9A}, +{2, 0x9B, 0x00, 0xCB}, +{2, 0x9D, 0x03, 0x0D}, +{2, 0x9B, 0x13, 0x00}, +{2, 0x9D, 0x45, 0x9F}, +{2, 0x9D, 0x96, 0x99}, +{2, 0x9D, 0x7D, 0x20}, +{2, 0x9D, 0x41, 0x87}, +{2, 0x9D, 0x90, 0x68}, +{2, 0x9D, 0xB1, 0x87}, +{2, 0x9D, 0x10, 0x68}, +{2, 0x9D, 0x90, 0x06}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x03, 0xBA}, +{2, 0x9D, 0xB2, 0xA5}, +{2, 0x9D, 0xB3, 0xB5}, +{2, 0x9D, 0x90, 0x8A}, +{2, 0x9D, 0x91, 0x8B}, +{2, 0x9D, 0x8D, 0x98}, +{2, 0x9D, 0x00, 0x80}, +{2, 0x9D, 0x1B, 0x94}, +{2, 0x9D, 0x92, 0x99}, +{2, 0x9D, 0x45, 0x9F}, +{2, 0x9D, 0x7D, 0x20}, +{2, 0x9D, 0x0E, 0x78}, +{2, 0x9D, 0x90, 0xA9}, +{2, 0x9D, 0x92, 0xB9}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x43, 0xB4}, +{2, 0x9D, 0x90, 0x8B}, +{2, 0x9D, 0x91, 0x8A}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9D, 0x92, 0xA8}, +{2, 0x9D, 0x90, 0xB8}, +{2, 0x9D, 0x12, 0xBA}, +{2, 0x9D, 0x16, 0xAB}, +{2, 0x9D, 0x92, 0x84}, +{2, 0x9D, 0x06, 0x84}, +{2, 0x9D, 0x10, 0xB8}, +{2, 0x9D, 0x16, 0xA8}, +{2, 0x9D, 0xBA, 0x5A}, +{2, 0x9D, 0xBB, 0x5B}, +{2, 0x9D, 0x7D, 0x00}, +{2, 0x9D, 0x43, 0xB4}, +{2, 0x9D, 0x90, 0x8B}, +{2, 0x9D, 0x91, 0x8A}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9D, 0x90, 0x48}, +{2, 0x9D, 0x12, 0x4A}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x03, 0xAA}, +{2, 0x9D, 0x38, 0xAF}, +{2, 0x9D, 0x6E, 0x09}, +{2, 0x9D, 0x82, 0xAB}, +{2, 0x9D, 0x50, 0x04}, +{2, 0x9D, 0x82, 0xBB}, +{2, 0x9D, 0x50, 0x02}, +{2, 0x9D, 0x6C, 0x04}, +{2, 0x9D, 0x8D, 0xA8}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x6C, 0x01}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9B, 0x00, 0xCC}, +{2, 0x9D, 0x03, 0x0E}, +{2, 0x9B, 0x13, 0x40}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x00, 0xED}, +{2, 0x9D, 0x3A, 0x8A}, +{2, 0x9D, 0x7F, 0x80}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x01, 0x6B}, +{2, 0x9D, 0x91, 0x28}, +{2, 0x9D, 0x03, 0x22}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9D, 0x47, 0x88}, +{2, 0x9D, 0x91, 0x38}, +{2, 0x9D, 0x03, 0x32}, +{2, 0x9D, 0x00, 0xFF}, +{2, 0x9D, 0x8D, 0x18}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x03, 0x0A}, +{2, 0x9D, 0x8C, 0x78}, +{2, 0x9D, 0x0D, 0x8D}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x0D, 0xA1}, +{2, 0x9D, 0x8C, 0xB8}, +{2, 0x9D, 0x02, 0xAE}, +{2, 0x9D, 0x8C, 0xC8}, +{2, 0x9D, 0x02, 0xBD}, +{2, 0x9D, 0x8C, 0xD8}, +{2, 0x9D, 0x0D, 0xB5}, +{2, 0x9D, 0x8C, 0xE8}, +{2, 0x9D, 0x0D, 0x79}, +{2, 0x9D, 0x8C, 0xF8}, +{2, 0x9D, 0x0D, 0x83}, +{2, 0x9D, 0x89, 0x00}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x54, 0xC5}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x92, 0x90}, +{2, 0x9D, 0x4F, 0x89}, +{2, 0x9D, 0x3A, 0x80}, +{2, 0x9D, 0x6E, 0x38}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0B, 0xB9}, +{2, 0x9D, 0x4F, 0x89}, +{2, 0x9D, 0x38, 0x80}, +{2, 0x9D, 0x6E, 0x33}, +{2, 0x9D, 0x92, 0x80}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x0D, 0xCB}, +{2, 0x9D, 0x10, 0x98}, +{2, 0x9D, 0xB1, 0x89}, +{2, 0x9D, 0x90, 0x48}, +{2, 0x9D, 0x47, 0x89}, +{2, 0x9D, 0x44, 0x47}, +{2, 0x9D, 0xBA, 0x78}, +{2, 0x9D, 0xBB, 0x74}, +{2, 0x9D, 0x92, 0x80}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x0D, 0xD5}, +{2, 0x9D, 0x10, 0x98}, +{2, 0x9D, 0xB1, 0x89}, +{2, 0x9D, 0x90, 0x58}, +{2, 0x9D, 0x47, 0x89}, +{2, 0x9D, 0x44, 0x57}, +{2, 0x9D, 0xBA, 0xA8}, +{2, 0x9D, 0xBB, 0xA5}, +{2, 0x9B, 0x00, 0xCD}, +{2, 0x9D, 0x03, 0x0F}, +{2, 0x9B, 0x13, 0x80}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x0B, 0xCE}, +{2, 0x9D, 0x12, 0x80}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x0B, 0xEC}, +{2, 0x9D, 0x12, 0x90}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x88, 0x10}, +{2, 0x9D, 0x00, 0x03}, +{2, 0x9D, 0x64, 0x09}, +{2, 0x9D, 0xB9, 0x80}, +{2, 0x9D, 0xB9, 0x90}, +{2, 0x9D, 0x02, 0x80}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x02, 0x90}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x02, 0x19}, +{2, 0x9D, 0x6D, 0xF6}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x92, 0x80}, +{2, 0x9D, 0x4C, 0x98}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x28, 0x89}, +{2, 0x9D, 0xB8, 0x80}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0xB2, 0x87}, +{2, 0x9D, 0x91, 0x88}, +{2, 0x9D, 0xB3, 0x87}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9D, 0x92, 0x08}, +{2, 0x9D, 0x90, 0x18}, +{2, 0x9D, 0xB2, 0x8A}, +{2, 0x9D, 0x91, 0x88}, +{2, 0x9D, 0xB3, 0x8A}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9D, 0x92, 0x28}, +{2, 0x9D, 0x90, 0x38}, +{2, 0x9D, 0xB1, 0x4B}, +{2, 0x9D, 0xB1, 0x5C}, +{2, 0x9D, 0x88, 0x40}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x52, 0x2E}, +{2, 0x9D, 0x88, 0x10}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x52, 0x2B}, +{2, 0x9D, 0x90, 0x84}, +{2, 0x9D, 0x18, 0x81}, +{2, 0x9D, 0xB9, 0xE8}, +{2, 0x9D, 0x90, 0x95}, +{2, 0x9D, 0x18, 0x93}, +{2, 0x9D, 0xB9, 0xF9}, +{2, 0x9D, 0x7D, 0x20}, +{2, 0x9D, 0x0D, 0xF5}, +{2, 0x9B, 0x00, 0xCE}, +{2, 0x9D, 0x03, 0x10}, +{2, 0x9B, 0x13, 0xC0}, +{2, 0x9D, 0x90, 0x68}, +{2, 0x9D, 0xB1, 0x9D}, +{2, 0x9D, 0x18, 0x96}, +{2, 0x9D, 0x88, 0x90}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x6A, 0x07}, +{2, 0x9D, 0x92, 0x82}, +{2, 0x9D, 0x4D, 0x98}, +{2, 0x9D, 0xB1, 0x8D}, +{2, 0x9D, 0x18, 0x89}, +{2, 0x9D, 0xB9, 0xD8}, +{2, 0x9D, 0x6C, 0x05}, +{2, 0x9D, 0x92, 0x83}, +{2, 0x9D, 0x4D, 0x98}, +{2, 0x9D, 0x10, 0x96}, +{2, 0x9D, 0xB9, 0xD9}, +{2, 0x9D, 0xB1, 0x8D}, +{2, 0x9D, 0x7D, 0x20}, +{2, 0x9D, 0x43, 0x54}, +{2, 0x9D, 0x91, 0xA8}, +{2, 0x9D, 0xB9, 0xD6}, +{2, 0x9D, 0x90, 0x97}, +{2, 0x9D, 0x93, 0x8A}, +{2, 0x9D, 0x90, 0x84}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x43, 0x89}, +{2, 0x9D, 0xB9, 0xB8}, +{2, 0x9D, 0x90, 0x9A}, +{2, 0x9D, 0x93, 0x8A}, +{2, 0x9D, 0x90, 0x85}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x43, 0x89}, +{2, 0x9D, 0xB9, 0xC8}, +{2, 0x9D, 0x6C, 0x0D}, +{2, 0x9D, 0x02, 0x8A}, +{2, 0x9D, 0xB9, 0xD8}, +{2, 0x9D, 0x90, 0x84}, +{2, 0x9D, 0x47, 0x89}, +{2, 0x9D, 0x44, 0x47}, +{2, 0x9D, 0xBA, 0x78}, +{2, 0x9D, 0xBB, 0x74}, +{2, 0x9D, 0x90, 0x85}, +{2, 0x9D, 0x47, 0x89}, +{2, 0x9D, 0x44, 0x57}, +{2, 0x9D, 0xBA, 0xA8}, +{2, 0x9D, 0xBB, 0xA5}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x92, 0x90}, +{2, 0x9D, 0x4F, 0x89}, +{2, 0x9D, 0x3A, 0x80}, +{2, 0x9D, 0x6E, 0x29}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0B, 0xB9}, +{2, 0x9D, 0x4F, 0x89}, +{2, 0x9D, 0x3A, 0x80}, +{2, 0x9D, 0x6E, 0x24}, +{2, 0x9D, 0xB2, 0x87}, +{2, 0x9D, 0x91, 0x88}, +{2, 0x9D, 0xB3, 0x87}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9B, 0x00, 0xCF}, +{2, 0x9D, 0x03, 0x11}, +{2, 0x9B, 0x14, 0x00}, +{2, 0x9D, 0x90, 0x18}, +{2, 0x9D, 0x92, 0x90}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x0D, 0xCB}, +{2, 0x9D, 0x10, 0x89}, +{2, 0x9D, 0xB9, 0x81}, +{2, 0x9D, 0xB2, 0x8A}, +{2, 0x9D, 0x91, 0x88}, +{2, 0x9D, 0xB3, 0x8A}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x0E, 0x20}, +{2, 0x9D, 0x90, 0x38}, +{2, 0x9D, 0x92, 0x90}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x0D, 0xD5}, +{2, 0x9D, 0x10, 0x89}, +{2, 0x9D, 0xB9, 0x83}, +{2, 0x9D, 0x8C, 0x98}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x92, 0x80}, +{2, 0x9D, 0x4C, 0x98}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x28, 0x89}, +{2, 0x9D, 0xB8, 0x80}, +{2, 0x9D, 0x0D, 0xDF}, +{2, 0x9D, 0x03, 0x09}, +{2, 0x9D, 0x12, 0x71}, +{2, 0x9D, 0x12, 0xA1}, +{2, 0x9D, 0x02, 0xB9}, +{2, 0x9D, 0x02, 0xC9}, +{2, 0x9D, 0x02, 0xD9}, +{2, 0x9D, 0x02, 0xE9}, +{2, 0x9D, 0x02, 0xF9}, +{2, 0x9D, 0x6D, 0x3A}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xB0, 0x10}, +{2, 0x9D, 0x00, 0x89}, +{2, 0x9D, 0x02, 0x12}, +{2, 0x9D, 0x00, 0x03}, +{2, 0x9D, 0x88, 0x10}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x52, 0x05}, +{2, 0x9D, 0x88, 0x10}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x52, 0x02}, +{2, 0x9D, 0x6C, 0x21}, +{2, 0x9D, 0x03, 0x0A}, +{2, 0x9D, 0x8C, 0x08}, +{2, 0x9D, 0x02, 0xAE}, +{2, 0x9D, 0x03, 0x1A}, +{2, 0x9D, 0x89, 0x00}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x64, 0x08}, +{2, 0x9D, 0xB2, 0x80}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x52, 0x02}, +{2, 0x9D, 0x03, 0x19}, +{2, 0x9D, 0x03, 0x09}, +{2, 0x9D, 0x6D, 0xF7}, +{2, 0x9D, 0x89, 0x10}, +{2, 0x9B, 0x00, 0xD0}, +{2, 0x9D, 0x03, 0x12}, +{2, 0x9B, 0x14, 0x40}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x50, 0x09}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x00, 0x89}, +{2, 0x9D, 0x02, 0x82}, +{2, 0x9D, 0xFF, 0xFC}, +{2, 0x9D, 0x02, 0x83}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x90, 0x18}, +{2, 0x9D, 0x6C, 0x06}, +{2, 0x9D, 0xB0, 0x80}, +{2, 0x9D, 0x00, 0x89}, +{2, 0x9D, 0x02, 0x82}, +{2, 0x9D, 0xFF, 0xFC}, +{2, 0x9D, 0x90, 0x18}, +{2, 0x9D, 0xB8, 0x10}, +{2, 0x9D, 0x00, 0x89}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x0D, 0xE1}, +{2, 0x9D, 0x8C, 0x28}, +{2, 0x9D, 0x0D, 0xEB}, +{2, 0x9D, 0x8C, 0x38}, +{2, 0x9D, 0x02, 0xAE}, +{2, 0x9D, 0x8C, 0x48}, +{2, 0x9D, 0x02, 0xBD}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x0D, 0xF5}, +{2, 0x9D, 0x90, 0x60}, +{2, 0x9D, 0x02, 0x5A}, +{2, 0x9D, 0x88, 0x50}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x54, 0x1B}, +{2, 0x9D, 0xB2, 0x83}, +{2, 0x9D, 0xB2, 0x94}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x52, 0x12}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x4C, 0xA5}, +{2, 0x9D, 0x24, 0x0A}, +{2, 0x9D, 0xB9, 0x18}, +{2, 0x9D, 0xB9, 0x29}, +{2, 0x9D, 0x90, 0xA6}, +{2, 0x9D, 0x4F, 0xA5}, +{2, 0x9D, 0x38, 0xA0}, +{2, 0x9D, 0x6E, 0x08}, +{2, 0x9D, 0x8C, 0x78}, +{2, 0x9D, 0x0D, 0xF6}, +{2, 0x9D, 0x10, 0x75}, +{2, 0x9D, 0xB9, 0x78}, +{2, 0x9D, 0x02, 0x70}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0xB9, 0x79}, +{2, 0x9D, 0x02, 0x19}, +{2, 0x9D, 0x02, 0x29}, +{2, 0x9D, 0x02, 0x59}, +{2, 0x9D, 0x6D, 0xE4}, +{2, 0x9D, 0xB8, 0x00}, +{2, 0x9D, 0x0D, 0xF5}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0x8C, 0x18}, +{2, 0x9D, 0x0D, 0xE1}, +{2, 0x9B, 0x00, 0xD1}, +{2, 0x9D, 0x03, 0x13}, +{2, 0x9B, 0x14, 0x80}, +{2, 0x9D, 0x8C, 0x28}, +{2, 0x9D, 0x0D, 0xEB}, +{2, 0x9D, 0x8C, 0x38}, +{2, 0x9D, 0x02, 0xAE}, +{2, 0x9D, 0x8C, 0x48}, +{2, 0x9D, 0x02, 0xBD}, +{2, 0x9D, 0x8C, 0x58}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0xB0, 0xC0}, +{2, 0x9D, 0x0D, 0xF5}, +{2, 0x9D, 0x02, 0x9A}, +{2, 0x9D, 0x88, 0x90}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x54, 0x27}, +{2, 0x9D, 0xB1, 0x83}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x50, 0x1D}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x4C, 0x89}, +{2, 0x9D, 0x20, 0x8C}, +{2, 0x9D, 0x52, 0x18}, +{2, 0x9D, 0x02, 0x86}, +{2, 0x9D, 0x20, 0xC8}, +{2, 0x9D, 0xB1, 0xA1}, +{2, 0x9D, 0xB1, 0xB2}, +{2, 0x9D, 0x8C, 0xD8}, +{2, 0x9D, 0x0D, 0xF6}, +{2, 0x9D, 0x10, 0xD9}, +{2, 0x9D, 0xB1, 0x8D}, +{2, 0x9D, 0x0A, 0x8A}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x00, 0x20}, +{2, 0x9D, 0x68, 0x0A}, +{2, 0x9D, 0x8C, 0xD8}, +{2, 0x9D, 0x0E, 0x00}, +{2, 0x9D, 0x10, 0xD9}, +{2, 0x9D, 0xB1, 0x8D}, +{2, 0x9D, 0x0A, 0x8B}, +{2, 0x9D, 0x88, 0x80}, +{2, 0x9D, 0x00, 0x20}, +{2, 0x9D, 0x68, 0x02}, +{2, 0x9D, 0x6C, 0x03}, +{2, 0x9D, 0xB9, 0x3A}, +{2, 0x9D, 0xB9, 0x4B}, +{2, 0x9D, 0x02, 0x39}, +{2, 0x9D, 0x02, 0x49}, +{2, 0x9D, 0x02, 0x19}, +{2, 0x9D, 0x02, 0x29}, +{2, 0x9D, 0x02, 0x99}, +{2, 0x9D, 0x6D, 0xD8}, +{2, 0x9D, 0xB8, 0xC0}, +{2, 0x9D, 0x0D, 0xF5}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xB0, 0x00}, +{2, 0x9D, 0x00, 0xAA}, +{2, 0x9D, 0x3A, 0x0F}, +{2, 0x9D, 0x6E, 0x01}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x01, 0x75}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0x90, 0x48}, +{2, 0x9B, 0x00, 0xD2}, +{2, 0x9D, 0x03, 0x14}, +{2, 0x9B, 0x14, 0xC0}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x01, 0x77}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0x90, 0x58}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x01, 0x76}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0x90, 0xC8}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x01, 0x78}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xC0}, +{2, 0x9D, 0x90, 0xD8}, +{2, 0x9D, 0xB0, 0xF0}, +{2, 0x9D, 0x0E, 0x1A}, +{2, 0x9D, 0x8C, 0xE8}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x8C, 0x38}, +{2, 0x9D, 0x02, 0xAE}, +{2, 0x9D, 0x8C, 0x28}, +{2, 0x9D, 0x02, 0xBD}, +{2, 0x9D, 0x02, 0x7A}, +{2, 0x9D, 0x02, 0x1A}, +{2, 0x9D, 0x88, 0x70}, +{2, 0x9D, 0x00, 0x0A}, +{2, 0x9D, 0x54, 0x17}, +{2, 0x9D, 0xB1, 0xA3}, +{2, 0x9D, 0xB1, 0xB2}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x0F, 0xFF}, +{2, 0x9D, 0x52, 0x0E}, +{2, 0x9D, 0x0E, 0xE7}, +{2, 0x9D, 0x02, 0x19}, +{2, 0x9D, 0x80, 0xA4}, +{2, 0x9D, 0x66, 0x08}, +{2, 0x9D, 0x80, 0xAC}, +{2, 0x9D, 0x68, 0x06}, +{2, 0x9D, 0x80, 0xB5}, +{2, 0x9D, 0x66, 0x04}, +{2, 0x9D, 0x80, 0xBD}, +{2, 0x9D, 0x68, 0x02}, +{2, 0x9D, 0x6C, 0x03}, +{2, 0x9D, 0x02, 0xFA}, +{2, 0x9D, 0x6C, 0x60}, +{2, 0x9D, 0x02, 0x39}, +{2, 0x9D, 0x02, 0x29}, +{2, 0x9D, 0x02, 0x79}, +{2, 0x9D, 0x6D, 0xE8}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x0E, 0x0C}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x50, 0x0F}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x34}, +{2, 0x9D, 0xB0, 0x90}, +{2, 0x9D, 0x01, 0x8D}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xD4}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x8E}, +{2, 0x9D, 0xA8, 0xA0}, +{2, 0x9B, 0x00, 0xD3}, +{2, 0x9D, 0x03, 0x15}, +{2, 0x9B, 0x15, 0x00}, +{2, 0x9D, 0x01, 0x85}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x8F}, +{2, 0x9D, 0xA8, 0xA0}, +{2, 0x9D, 0x01, 0x86}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x89}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x52, 0x35}, +{2, 0x9D, 0x88, 0x10}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x9D, 0x50, 0x32}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x02, 0xCC}, +{2, 0x9D, 0x10, 0xAE}, +{2, 0x9D, 0xB1, 0xBA}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x00, 0x37}, +{2, 0x9D, 0x02, 0xA2}, +{2, 0x9D, 0x00, 0x07}, +{2, 0x9D, 0x4D, 0xBA}, +{2, 0x9D, 0xB8, 0xB0}, +{2, 0x9D, 0x00, 0xAB}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x89}, +{2, 0x9D, 0x80, 0xBA}, +{2, 0x9D, 0x68, 0x23}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x0E, 0x0C}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x52, 0x0B}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x0E, 0x0C}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x52, 0x3B}, +{2, 0x9D, 0x02, 0xF9}, +{2, 0x9D, 0x88, 0xF0}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x6A, 0x38}, +{2, 0x9D, 0x02, 0xFA}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0xB8, 0xA0}, +{2, 0x9D, 0x0E, 0x0C}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x34}, +{2, 0x9D, 0xB0, 0x90}, +{2, 0x9D, 0x01, 0x8A}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xD4}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x8B}, +{2, 0x9D, 0xA8, 0xA0}, +{2, 0x9D, 0x01, 0x85}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x8C}, +{2, 0x9D, 0xA8, 0xA0}, +{2, 0x9D, 0x01, 0x86}, +{2, 0x9D, 0x6C, 0x24}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x0E, 0x0C}, +{2, 0x9B, 0x00, 0xD4}, +{2, 0x9D, 0x03, 0x16}, +{2, 0x9B, 0x15, 0x40}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x00, 0x00}, +{2, 0x9D, 0x52, 0x0B}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x0E, 0x0C}, +{2, 0x9D, 0x88, 0xA0}, +{2, 0x9D, 0x00, 0x03}, +{2, 0x9D, 0x52, 0x19}, +{2, 0x9D, 0x02, 0xF9}, +{2, 0x9D, 0x88, 0xF0}, +{2, 0x9D, 0x00, 0x02}, +{2, 0x9D, 0x6A, 0x16}, +{2, 0x9D, 0x02, 0xFA}, +{2, 0x9D, 0x8C, 0xA8}, +{2, 0x9D, 0x00, 0x03}, +{2, 0x9D, 0xB8, 0xA0}, +{2, 0x9D, 0x0E, 0x0C}, +{2, 0x9D, 0x8C, 0x88}, +{2, 0x9D, 0x00, 0x34}, +{2, 0x9D, 0xB0, 0x90}, +{2, 0x9D, 0x01, 0x8D}, +{2, 0x9D, 0x7D, 0x10}, +{2, 0x9D, 0x04, 0xD4}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x8E}, +{2, 0x9D, 0xA8, 0xA0}, +{2, 0x9D, 0x01, 0x85}, +{2, 0x9D, 0xB0, 0xA0}, +{2, 0x9D, 0x01, 0x8F}, +{2, 0x9D, 0xA8, 0xA0}, +{2, 0x9D, 0x01, 0x86}, +{2, 0x9D, 0x6C, 0x02}, +{2, 0x9D, 0x02, 0xFA}, +{2, 0x9D, 0xB8, 0xF0}, +{2, 0x9D, 0x0E, 0x1A}, +{2, 0x9D, 0x7D, 0x80}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9D, 0xFF, 0xFF}, +{2, 0x9B, 0x00, 0xD5}, +{2, 0x9D, 0x03, 0x17}, +{2, 0x9B, 0x00, 0xFC}, +{2, 0x9D, 0x00, 0x01}, +{2, 0x01, 0x00, 0x01}, +}; + +#endif /* TPD_CUSTOM_SSD60XX_H__ */ diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd.h b/arch/arm/mach-mt8127/ford/touchpanel/tpd.h new file mode 100644 index 00000000000..fff68e4664f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd.h @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +//#include "tpd_custom.h" + +/* debug macros */ +////#define TPD_DEBUG +#define TPD_DEBUG_CODE +//#define TPD_DEBUG_TRACK +#define TPD_DMESG(a,arg...) printk(TPD_DEVICE ": " a,##arg) +#if defined(TPD_DEBUG) +#undef TPD_DEBUG +#define TPD_DEBUG(a,arg...) printk(TPD_DEVICE ": " a,##arg) +#else +#define TPD_DEBUG(arg...) +#endif + +/* register, address, configurations */ +#define TPD_DEVICE "mtk-tpd" +#define TPD_X 0 +#define TPD_Y 1 +#define TPD_Z1 2 +#define TPD_Z2 3 +#define TP_DELAY (2*HZ/100) +#define TP_DRV_MAX_COUNT (20) +#define TPD_WARP_CNT (4) +#define TPD_VIRTUAL_KEY_MAX (10) + +/* various mode */ +#define TPD_MODE_NORMAL 0 +#define TPD_MODE_KEYPAD 1 +#define TPD_MODE_SW 2 +#define TPD_MODE_FAV_SW 3 +#define TPD_MODE_FAV_HW 4 +#define TPD_MODE_RAW_DATA 5 +#undef TPD_RES_X +#undef TPD_RES_Y +extern int TPD_RES_X; +extern int TPD_RES_Y; +extern int tpd_load_status ; //0: failed, 1: sucess +extern int tpd_mode; +extern int tpd_mode_axis; +extern int tpd_mode_min; +extern int tpd_mode_max; +extern int tpd_mode_keypad_tolerance; +extern int tpd_em_debounce_time; +extern int tpd_em_debounce_time0; +extern int tpd_em_debounce_time1; +extern int tpd_em_asamp; +extern int tpd_em_auto_time_interval; +extern int tpd_em_sample_cnt; +extern int tpd_calmat[]; +extern int tpd_def_calmat[]; +extern int tpd_calmat[]; +extern int tpd_def_calmat[]; +extern int TPD_DO_WARP; +extern int tpd_wb_start[]; +extern int tpd_wb_end[]; + +struct tpd_device +{ + struct input_dev *dev; + struct input_dev *kpd; + struct timer_list timer; + struct tasklet_struct tasklet; + int btn_state; + char *hq_ctp_module_name; + int hq_ctp_module_id; + char *hq_ctp_firmware_version; +}; + +struct tpd_attrs +{ + struct device_attribute **attr; + int num; +}; +struct tpd_driver_t +{ + char *tpd_device_name; + int (*tpd_local_init)(void); + void (*suspend)(struct early_suspend *h); + void (*resume)(struct early_suspend *h); + int tpd_have_button; + struct tpd_attrs attrs; +}; + +#if 1 //#ifdef TPD_HAVE_BUTTON +void tpd_button(unsigned int x, unsigned int y, unsigned int down); +void tpd_button_init(void); +ssize_t tpd_virtual_key(char *buf); +//#ifndef TPD_BUTTON_HEIGHT +//#define TPD_BUTTON_HEIGHT TPD_RES_Y +//#endif +#endif + +#if 0 +void tpd_adc_init(void); +void tpd_set_debounce_time(int debounce_time); +void tpd_set_spl_number(int spl_num); +u16 tpd_read(int position); +u16 tpd_read_adc(u16 pos); +u16 tpd_read_status(void); +#endif + +extern int tpd_driver_add(struct tpd_driver_t *tpd_drv); +extern int tpd_driver_remove(struct tpd_driver_t *tpd_drv); +void tpd_button_setting(int keycnt, void *keys, void *keys_dim); +extern int tpd_em_spl_num; +extern int tpd_em_pressure_threshold; + +#ifdef TPD_DEBUG_CODE +#include "tpd_debug.h" +#endif + +#ifdef TPD_HAVE_CALIBRATION +#include "tpd_calibrate.h" +#endif + +#include "tpd_default.h" + +/* switch touch panel into different mode */ +void _tpd_switch_single_mode(void); +void _tpd_switch_multiple_mode(void); +void _tpd_switch_sleep_mode(void); +void _tpd_switch_normal_mode(void); diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_button.c b/arch/arm/mach-mt8127/ford/touchpanel/tpd_button.c new file mode 100644 index 00000000000..cc8ad4c73aa --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_button.c @@ -0,0 +1,114 @@ +#include "tpd.h" + +extern struct tpd_device *tpd; + +//#ifdef TPD_HAVE_BUTTON +//static int tpd_keys[TPD_KEY_COUNT] = TPD_KEYS; +//static int tpd_keys_dim[TPD_KEY_COUNT][4] = TPD_KEYS_DIM; +static unsigned int tpd_keycnt = 0; +static int tpd_keys[TPD_VIRTUAL_KEY_MAX]={0}; +static int tpd_keys_dim[TPD_VIRTUAL_KEY_MAX][4];// = {0}; +static ssize_t mtk_virtual_keys_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) { + int i, j; + for(i=0, j=0;ikpd=input_allocate_device())==NULL) return -ENOMEM; + tpd->kpd=input_allocate_device(); + /* struct input_dev kpd initialization and registration */ + tpd->kpd->name = TPD_DEVICE "-kpd"; + set_bit(EV_KEY, tpd->kpd->evbit); + //set_bit(EV_REL, tpd->kpd->evbit); + //set_bit(EV_ABS, tpd->kpd->evbit); + for(i=0;ikpd->keybit); + tpd->kpd->id.bustype = BUS_HOST; + tpd->kpd->id.vendor = 0x0001; + tpd->kpd->id.product = 0x0001; + tpd->kpd->id.version = 0x0100; + if(input_register_device(tpd->kpd)) + TPD_DMESG("input_register_device failed.(kpd)\n"); + set_bit(EV_KEY, tpd->dev->evbit); + for(i=0;idev->keybit); + properties_kobj = kobject_create_and_add("board_properties", NULL); + if(properties_kobj) + ret = sysfs_create_group(properties_kobj,&mtk_properties_attr_group); + if(!properties_kobj || ret) + printk("failed to create board_properties\n"); +} + +void tpd_button(unsigned int x, unsigned int y, unsigned int down) { + int i; + if(down) { + for(i=0;i=tpd_keys_dim[i][0]-(tpd_keys_dim[i][2]/2) && + x<=tpd_keys_dim[i][0]+(tpd_keys_dim[i][2]/2) && + y>=tpd_keys_dim[i][1]-(tpd_keys_dim[i][3]/2) && + y<=tpd_keys_dim[i][1]+(tpd_keys_dim[i][3]/2) && + !(tpd->btn_state&(1<kpd, tpd_keys[i], 1); + input_sync(tpd->kpd); + tpd->btn_state|=(1<btn_state&(1<kpd, tpd_keys[i], 0); + input_sync(tpd->kpd); + TPD_DEBUG("[mtk-tpd] release key %d (%d)\n",i, tpd_keys[i]); + printk("[mtk-tpd] release key %d (%d)\n",i, tpd_keys[i]); + } + } + tpd->btn_state=0; + } +} +void tpd_button_setting(int keycnt, void *keys, void *keys_dim) +{ + tpd_keycnt = keycnt; + memcpy(tpd_keys, keys, keycnt*4); + memcpy(tpd_keys_dim, keys_dim, keycnt*4*4); +} +//#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_calibrate.c b/arch/arm/mach-mt8127/ford/touchpanel/tpd_calibrate.c new file mode 100644 index 00000000000..d537c00b895 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_calibrate.c @@ -0,0 +1,50 @@ +#include "tpd.h" +//#ifdef TPD_HAVE_CALIBRATION + +//#ifndef TPD_CUSTOM_CALIBRATION + +//#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) +//#define TPD_DO_WARP +int TPD_DO_WARP = 0; +int tpd_wb_start[TPD_WARP_CNT] = {0}; +int tpd_wb_end[TPD_WARP_CNT] = {0}; + +void tpd_warp_calibrate(int *x, int *y) { + int wx = *x, wy = *y; + if(wx0) { + wx = tpd_wb_start[0]-((tpd_wb_start[0]-wx)*(tpd_wb_start[0]-tpd_wb_end[0])/(tpd_wb_start[0])); + //wx = wx*(tpd_wb_start[0]-tpd_wb_end[0])/tpd_wb_start[0]+tpd_wb_end[0]; + } + else if(wx>tpd_wb_start[2]) + wx = (wx-tpd_wb_start[2])*(tpd_wb_end[2]-tpd_wb_start[2])/(TPD_RES_X-tpd_wb_start[2])+tpd_wb_start[2]; + + if(wy0) + wy = tpd_wb_start[1]-((tpd_wb_start[1]-wy)*(tpd_wb_start[1]-tpd_wb_end[1])/(tpd_wb_start[1])); + //wy = wy*(tpd_wb_start[1]-tpd_wb_end[1])/tpd_wb_start[1]+tpd_wb_end[1]; + else if(wy>tpd_wb_start[3] && wy<=TPD_RES_Y) + wy = (wy-tpd_wb_start[3])*(tpd_wb_end[3]-tpd_wb_start[3])/(TPD_RES_Y-tpd_wb_start[3])+tpd_wb_start[3]; + if(wy<0) wy=0; + if(wx<0) wx=0; + *x = wx, *y = wy; +} +//#else +//#define tpd_warp_calibrate(x,y) +//#endif + +void tpd_calibrate(int *x, int *y) { + int tx, i; + if(tpd_calmat[0]==0) for(i=0;i<6;i++) tpd_calmat[i]=tpd_def_calmat[i]; + /* ================ calibrating ================*/ + tx = ((tpd_calmat[0]*(*x))+(tpd_calmat[1]*(*y))+(tpd_calmat[2]))>>12; + *y = ((tpd_calmat[3]*(*x))+(tpd_calmat[4]*(*y))+(tpd_calmat[5]))>>12; + *x = tx; + + if(TPD_DO_WARP == 1) tpd_warp_calibrate(x, y); + *x = (*x) + ((*y)*(*x)*tpd_calmat[6]/TPD_RES_X)/TPD_RES_Y; + *y = (*y) + ((*y)*(*x)*tpd_calmat[7]/TPD_RES_X)/TPD_RES_Y; +} + +//#endif + +//#endif + diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_calibrate.h b/arch/arm/mach-mt8127/ford/touchpanel/tpd_calibrate.h new file mode 100644 index 00000000000..913dfa46f9e --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_calibrate.h @@ -0,0 +1,19 @@ +#ifndef TPD_CALIBRATE_H +#define TPD_CALIBRATE_H +#ifdef TPD_HAVE_CALIBRATION + +#ifndef TPD_CUSTOM_CALIBRATION + +extern int tpd_calmat[8]; +extern int tpd_def_calmat[8]; + +#endif + +void tpd_calibrate(int *x, int *y); +#else + +#define tpd_calibrate(x,y) + +#endif + +#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_custom_gt9xx.h b/arch/arm/mach-mt8127/ford/touchpanel/tpd_custom_gt9xx.h new file mode 100755 index 00000000000..c2f30d39f66 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_custom_gt9xx.h @@ -0,0 +1,502 @@ +/* drivers/input/touchscreen/tpd_custom_gt9xx.h + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: V2.5 + * Release Date: 2015/01/21 + */ + +#ifndef TPD_CUSTOM_GT9XX_H__ +#define TPD_CUSTOM_GT9XX_H__ + +#include +#include +#include +//#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#include +#include +#include + +#include +#include +#ifdef MT6575 +#include +#include +#include +#endif +#ifdef MT6577 +#include +#include +#include +#endif +#include +#include +#include + +#include +#include + +/* Pre-defined definition */ + +#define TPD_KEY_COUNT 4 +#define key_1 60,850 //auto define +#define key_2 180,850 +#define key_3 300,850 +#define key_4 420,850 + +#define TPD_KEYS {KEY_BACK, KEY_HOME, KEY_MENU, KEY_SEARCH} +#define TPD_KEYS_DIM {{key_1,50,30},{key_2,50,30},{key_3,50,30},{key_4,50,30}} + +extern u16 show_len; +extern u16 total_len; +extern u8 gtp_rawdiff_mode; + +extern int tpd_halt; +extern s32 gtp_send_cfg(struct i2c_client *client); +extern void gtp_reset_guitar(struct i2c_client *client, s32 ms); +extern void gtp_int_sync(s32 ms); +extern u8 gup_init_update_proc(struct i2c_client *client); +extern u8 gup_init_fw_proc(struct i2c_client *client); +extern void mt_eint_unmask(unsigned int line); +extern void mt_eint_mask(unsigned int line); +extern s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len); +extern s32 gtp_i2c_write(struct i2c_client *client,u8 *buf,s32 len); +extern int i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *txbuf, int len); +extern int i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *rxbuf, int len); +extern s32 i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len); +extern s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len); + +//***************************PART1:ON/OFF define******************************* +#define GTP_CUSTOM_CFG 0 +#define GTP_DRIVER_SEND_CFG 1 //driver send config to TP on intilization (for no config built in TP flash) +#define GTP_HAVE_TOUCH_KEY 0 +#define GTP_POWER_CTRL_SLEEP 0 //turn off power on suspend +#define GTP_ICS_SLOT_REPORT 1 +#define GTP_AUTO_UPDATE 1 // auto updated fw by .bin file +#define GTP_HEADER_FW_UPDATE 1 // auto updated fw by gtp_default_FW in gt9xx_firmware.h, function together with GTP_AUTO_UDPATE +#define GTP_AUTO_UPDATE_CFG 0 // auto update config by .cfg file, function together with GTP_AUTO_UPDATE + +#define GTP_SUPPORT_I2C_DMA 0 // if gt9xxf, better enable it if hardware platform supported +#define GTP_COMPATIBLE_MODE 0 // compatible with GT9XXF + +#define GTP_CREATE_WR_NODE 1 +#define GTP_ESD_PROTECT 1 // esd protection with a cycle of 2 seconds +#define GTP_CHARGER_SWITCH 0 // charger plugin & plugout detect + +#define GTP_WITH_PEN 0 +#define GTP_PEN_HAVE_BUTTON 0 // active pen has buttons, functions together with GTP_WITH_PEN + +#define GTP_GESTURE_WAKEUP 0 + +//#define TPD_PROXIMITY +//#define TPD_HAVE_BUTTON // report key as coordinate,Vibration feedback +//#define TPD_WARP_X // mirrored x coordinate +//#define TPD_WARP_Y // mirrored y coordinate +#define GTP_DEBUG_ON 0 +#define GTP_DEBUG_ARRAY_ON 0 +#define GTP_DEBUG_FUNC_ON 0 + +//***************************PART2:TODO define********************************** +//STEP_1(REQUIRED):Change config table. +// Sensor_ID Map: +/* sensor_opt1 sensor_opt2 Sensor_ID + GND GND 0 + VDDIO GND 1 + NC GND 2 + GND NC/300K 3 + VDDIO NC/300K 4 + NC NC/300K 5 +*/ +// TODO: define your own default or for Sensor_ID == 0 config here. +// The predefined one is just a sample config, which is not suitable for your tp in most cases. +#define CTP_CFG_GROUP0 {\ + 0x54,0x58,0x02,0x00,0x04,0x05,0x3D,0x48,\ + 0x02,0x08,0x23,0x08,0x3C,0x32,0x03,0x05,\ + 0x00,0x00,0x00,0x00,0x13,0x33,0x0F,0x15,\ + 0x15,0x19,0x14,0x87,0x27,0xDD,0x60,0x62,\ + 0x2A,0x09,0x00,0x00,0x00,0x9A,0x02,0x1D,\ + 0x3C,0x6C,0x00,0x00,0x00,0x00,0x00,0x32,\ + 0x00,0x00,0x00,0x55,0x6E,0x94,0xE2,0x02,\ + 0x14,0x0A,0x03,0x04,0x88,0x57,0x00,0x84,\ + 0x5B,0x00,0x80,0x60,0x00,0x7B,0x65,0x00,\ + 0x77,0x6B,0x00,0x77,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x0A,0x00,0x00,0x00,0x00,0x11,0x04,\ + 0x0F,0x10,0x11,0x12,0x13,0x16,0x17,0x18,\ + 0x19,0x1A,0x1B,0x1C,0x1D,0x00,0x01,0x02,\ + 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,\ + 0x0D,0x0E,0x00,0x00,0x00,0x00,0x24,0x2A,\ + 0x25,0x29,0x26,0x27,0x28,0x0A,0x0B,0x0C,\ + 0x09,0x0D,0x08,0x0E,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,\ + 0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x59,0x01\ +} + +#define GTP_CFG_GROUP0_CHARGER {\ + 0x47,0xD0,0x02,0x00,0x05,0x05,0x34,0x00,0x01,0x8C,\ + 0x1E,0x0C,0x50,0x3C,0x03,0x07,0x01,0x01,0x00,0x00,\ + 0x00,0x00,0x00,0x18,0x1A,0x1E,0x14,0x8B,0x2B,0x0C,\ + 0x50,0x52,0xD6,0x09,0x00,0x00,0x00,0x9C,0x32,0x1D,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0xF4,0x4A,0x64,0x9E,0xE5,0x01,0x14,0x00,0x00,0x04,\ + 0x74,0x4C,0x00,0x70,0x50,0x00,0x69,0x55,0x00,0x63,\ + 0x5B,0x00,0x5E,0x61,0x00,0x5E,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x01,0x1B,0x14,0x0D,0x14,0x03,0x0F,0x0A,0x03,\ + 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,\ + 0x12,0x14,0x16,0x18,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\ + 0xFF,0xFF,0x00,0x01,0x02,0x04,0x06,0x07,0x08,0x09,\ + 0x0A,0x0C,0x0E,0x1D,0x1E,0x1F,0x20,0x22,0x24,0x25,\ + 0x26,0x28,0x29,0x2A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\ + 0xFF,0xFF,0xFF,0xFF,0xB5,0x01\ +} + +// TODO: define your config for Sensor_ID == 1 here, if needed +#define CTP_CFG_GROUP1 {\ + 0x54,0x58,0x02,0x00,0x04,0x05,0x3D,0x48,\ + 0x02,0x08,0x23,0x08,0x3C,0x32,0x03,0x05,\ + 0x00,0x00,0x00,0x00,0x13,0x33,0x0F,0x15,\ + 0x15,0x19,0x14,0x87,0x27,0xDD,0x60,0x62,\ + 0x2A,0x09,0x00,0x00,0x00,0x9A,0x02,0x1D,\ + 0x3C,0x6C,0x00,0x00,0x00,0x00,0x00,0x32,\ + 0x00,0x00,0x00,0x55,0x6E,0x94,0xE2,0x02,\ + 0x14,0x0A,0x03,0x04,0x88,0x57,0x00,0x84,\ + 0x5B,0x00,0x80,0x60,0x00,0x7B,0x65,0x00,\ + 0x77,0x6B,0x00,0x77,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x0A,0x00,0x00,0x00,0x00,0x11,0x04,\ + 0x0F,0x10,0x11,0x12,0x13,0x16,0x17,0x18,\ + 0x19,0x1A,0x1B,0x1C,0x1D,0x00,0x01,0x02,\ + 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,\ + 0x0D,0x0E,0x00,0x00,0x00,0x00,0x24,0x2A,\ + 0x25,0x29,0x26,0x27,0x28,0x0A,0x0B,0x0C,\ + 0x09,0x0D,0x08,0x0E,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,\ + 0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x59,0x01\ +} + +#define GTP_CFG_GROUP1_CHARGER {\ +} + +// TODO: define your config for Sensor_ID == 2 here, if needed +#define CTP_CFG_GROUP2 {\ + 0x54,0x58,0x02,0x00,0x04,0x05,0x3D,0x48,\ + 0x02,0x08,0x23,0x08,0x3C,0x32,0x03,0x05,\ + 0x00,0x00,0x00,0x00,0x13,0x33,0x0F,0x15,\ + 0x15,0x19,0x14,0x87,0x27,0xDD,0x60,0x62,\ + 0x2A,0x09,0x00,0x00,0x00,0x9A,0x02,0x1D,\ + 0x3C,0x6C,0x00,0x00,0x00,0x00,0x00,0x32,\ + 0x00,0x00,0x00,0x55,0x6E,0x94,0xE2,0x02,\ + 0x14,0x0A,0x03,0x04,0x88,0x57,0x00,0x84,\ + 0x5B,0x00,0x80,0x60,0x00,0x7B,0x65,0x00,\ + 0x77,0x6B,0x00,0x77,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x0A,0x00,0x00,0x00,0x00,0x11,0x04,\ + 0x0F,0x10,0x11,0x12,0x13,0x16,0x17,0x18,\ + 0x19,0x1A,0x1B,0x1C,0x1D,0x00,0x01,0x02,\ + 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,\ + 0x0D,0x0E,0x00,0x00,0x00,0x00,0x24,0x2A,\ + 0x25,0x29,0x26,0x27,0x28,0x0A,0x0B,0x0C,\ + 0x09,0x0D,0x08,0x0E,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,\ + 0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x59,0x01\ +} + +#define GTP_CFG_GROUP2_CHARGER {\ +} + + +// TODO: define your config for Sensor_ID == 3 here, if needed +#define CTP_CFG_GROUP3 {\ + } + +#define GTP_CFG_GROUP3_CHARGER {\ +} + + +// TODO: define your config for Sensor_ID == 4 here, if needed +#define CTP_CFG_GROUP4 {\ + } + +#define GTP_CFG_GROUP4_CHARGER {\ +} + +// TODO: define your config for Sensor_ID == 5 here, if needed +#define CTP_CFG_GROUP5 {\ + 0x54,0x58,0x02,0x00,0x04,0x05,0x3D,0x48,\ + 0x02,0x08,0x23,0x08,0x3C,0x32,0x03,0x05,\ + 0x00,0x00,0x00,0x00,0x13,0x33,0x0F,0x15,\ + 0x15,0x19,0x14,0x87,0x27,0xDD,0x60,0x62,\ + 0x2A,0x09,0x00,0x00,0x00,0x9A,0x02,0x1D,\ + 0x3C,0x6C,0x00,0x00,0x00,0x00,0x00,0x32,\ + 0x00,0x00,0x00,0x55,0x6E,0x94,0xE2,0x02,\ + 0x14,0x0A,0x03,0x04,0x88,0x57,0x00,0x84,\ + 0x5B,0x00,0x80,0x60,0x00,0x7B,0x65,0x00,\ + 0x77,0x6B,0x00,0x77,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x0A,0x00,0x00,0x00,0x00,0x11,0x04,\ + 0x0F,0x10,0x11,0x12,0x13,0x16,0x17,0x18,\ + 0x19,0x1A,0x1B,0x1C,0x1D,0x00,0x01,0x02,\ + 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,\ + 0x0D,0x0E,0x00,0x00,0x00,0x00,0x24,0x2A,\ + 0x25,0x29,0x26,0x27,0x28,0x0A,0x0B,0x0C,\ + 0x09,0x0D,0x08,0x0E,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,\ + 0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x59,0x01\ +} + +#define GTP_CFG_GROUP5_CHARGER {\ +} + + +// STEP_2(REQUIRED): Customize your I/O ports & I/O operations here +#define TPD_POWER_SOURCE_CUSTOM MT6323_POWER_LDO_VGP2 // define your power source for tp if needed +#define GTP_RST_PORT GPIO_CTP_RST_PIN +#define GTP_INT_PORT GPIO_CTP_EINT_PIN + +#define GTP_GPIO_AS_INPUT(pin) do{\ + if(pin == GPIO_CTP_EINT_PIN)\ + mt_set_gpio_mode(pin, GPIO_CTP_EINT_PIN_M_GPIO);\ + else\ + mt_set_gpio_mode(pin, GPIO_CTP_RST_PIN_M_GPIO);\ + mt_set_gpio_dir(pin, GPIO_DIR_IN);\ + mt_set_gpio_pull_enable(pin, GPIO_PULL_DISABLE);\ + }while(0) +#define GTP_GPIO_AS_INT(pin) do{\ + mt_set_gpio_mode(pin, GPIO_CTP_EINT_PIN_M_EINT);\ + mt_set_gpio_dir(pin, GPIO_DIR_IN);\ + mt_set_gpio_pull_enable(pin, GPIO_PULL_DISABLE);\ + }while(0) +#define GTP_GPIO_GET_VALUE(pin) mt_get_gpio_in(pin) +#define GTP_GPIO_OUTPUT(pin,level) do{\ + if(pin == GPIO_CTP_EINT_PIN)\ + mt_set_gpio_mode(pin, GPIO_CTP_EINT_PIN_M_GPIO);\ + else\ + mt_set_gpio_mode(pin, GPIO_CTP_RST_PIN_M_GPIO);\ + mt_set_gpio_dir(pin, GPIO_DIR_OUT);\ + mt_set_gpio_out(pin, level);\ + }while(0) +#define GTP_GPIO_REQUEST(pin, label) gpio_request(pin, label) +#define GTP_GPIO_FREE(pin) gpio_free(pin) +#define GTP_IRQ_TAB {IRQ_TYPE_EDGE_RISING, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_LOW, IRQ_TYPE_LEVEL_HIGH} + +// STEP_3(optional):Custom set some config by themself,if need. +#if GTP_CUSTOM_CFG + #define GTP_MAX_HEIGHT 800 + #define GTP_MAX_WIDTH 480 + #define GTP_INT_TRIGGER 0 //0:Rising 1:Falling +#else + #define GTP_MAX_HEIGHT 1024 + #define GTP_MAX_WIDTH 600 + #define GTP_INT_TRIGGER 1 +#endif +#define GTP_MAX_TOUCH 5 +#define VELOCITY_CUSTOM +#define TPD_VELOCITY_CUSTOM_X 15 +#define TPD_VELOCITY_CUSTOM_Y 15 + +//STEP_4(optional):If this project have touch key,Set touch key config. +#if GTP_HAVE_TOUCH_KEY + #define GTP_KEY_TAB {KEY_MENU, KEY_HOME, KEY_BACK, KEY_SEND} +#endif + +//***************************PART3:OTHER define********************************* +#define GTP_DRIVER_VERSION "V2.5<2015/01/21>" +#define GTP_I2C_NAME "Goodix-TS" +#define GT91XX_CONFIG_PROC_FILE "gt9xx_config" +#define GTP_POLL_TIME 10 +#define GTP_ADDR_LENGTH 2 +#define GTP_CONFIG_MIN_LENGTH 186 +#define GTP_CONFIG_MAX_LENGTH 240 +#define FAIL 0 +#define SUCCESS 1 +#define SWITCH_OFF 0 +#define SWITCH_ON 1 + +#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0])) + +//******************** For GT9XXF Start **********************// +#if GTP_COMPATIBLE_MODE +typedef enum +{ + CHIP_TYPE_GT9 = 0, + CHIP_TYPE_GT9F = 1, +} CHIP_TYPE_T; +#endif + +#define GTP_REG_MATRIX_DRVNUM 0x8069 +#define GTP_REG_MATRIX_SENNUM 0x806A +#define GTP_REG_RQST 0x8043 +#define GTP_REG_BAK_REF 0x99D0 +#define GTP_REG_MAIN_CLK 0x8020 +#define GTP_REG_CHIP_TYPE 0x8000 +#define GTP_REG_HAVE_KEY 0x804E + +#define GTP_FL_FW_BURN 0x00 +#define GTP_FL_ESD_RECOVERY 0x01 +#define GTP_FL_READ_REPAIR 0x02 + +#define GTP_BAK_REF_SEND 0 +#define GTP_BAK_REF_STORE 1 +#define CFG_LOC_DRVA_NUM 29 +#define CFG_LOC_DRVB_NUM 30 +#define CFG_LOC_SENS_NUM 31 + +#define GTP_CHK_FW_MAX 1000 +#define GTP_CHK_FS_MNT_MAX 300 +#define GTP_BAK_REF_PATH "/data/gtp_ref.bin" +#define GTP_MAIN_CLK_PATH "/data/gtp_clk.bin" +#define GTP_RQST_CONFIG 0x01 +#define GTP_RQST_BAK_REF 0x02 +#define GTP_RQST_RESET 0x03 +#define GTP_RQST_MAIN_CLOCK 0x04 +#define GTP_RQST_RESPONDED 0x00 +#define GTP_RQST_IDLE 0xFF + +//******************** For GT9XXF End **********************// + +//Register define +#define GTP_READ_COOR_ADDR 0x814E +#define GTP_REG_SLEEP 0x8040 +#define GTP_REG_SENSOR_ID 0x814A +#define GTP_REG_CONFIG_DATA 0x8047 +#define GTP_REG_VERSION 0x8140 +#define GTP_REG_HW_INFO 0x4220 + +#define RESOLUTION_LOC 3 +#define TRIGGER_LOC 8 + +#define I2C_MASTER_CLOCK 300 +#define I2C_BUS_NUMBER 1 // I2C Bus for TP, mt6572 +#define GTP_DMA_MAX_TRANSACTION_LENGTH 255 // for DMA mode +#define GTP_DMA_MAX_I2C_TRANSFER_SIZE (GTP_DMA_MAX_TRANSACTION_LENGTH - GTP_ADDR_LENGTH) +#define MAX_TRANSACTION_LENGTH 8 +#define MAX_I2C_TRANSFER_SIZE (MAX_TRANSACTION_LENGTH - GTP_ADDR_LENGTH) +#define TPD_MAX_RESET_COUNT 3 +#define TPD_CALIBRATION_MATRIX {962,0,0,0,1600,0,0,0}; + + +#define TPD_RESET_ISSUE_WORKAROUND +#define TPD_HAVE_CALIBRATION +#define TPD_NO_GPIO +#define TPD_RESET_ISSUE_WORKAROUND + +#ifdef TPD_WARP_X +#undef TPD_WARP_X +#define TPD_WARP_X(x_max, x) ( x_max - 1 - x ) +#else +#define TPD_WARP_X(x_max, x) x +#endif + +#ifdef TPD_WARP_Y +#undef TPD_WARP_Y +#define TPD_WARP_Y(y_max, y) ( y_max - 1 - y ) +#else +#define TPD_WARP_Y(y_max, y) y +#endif + +//Log define +#define GTP_INFO(fmt,arg...) printk("<<-GTP-INFO->> "fmt"\n",##arg) +#define GTP_ERROR(fmt,arg...) printk("<<-GTP-ERROR->> "fmt"\n",##arg) +#define GTP_DEBUG(fmt,arg...) do{\ + if(GTP_DEBUG_ON)\ + printk("<<-GTP-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\ + }while(0) +#define GTP_DEBUG_ARRAY(array, num) do{\ + s32 i;\ + u8* a = array;\ + if(GTP_DEBUG_ARRAY_ON)\ + {\ + printk("<<-GTP-DEBUG-ARRAY->>\n");\ + for (i = 0; i < (num); i++)\ + {\ + printk("%02x ", (a)[i]);\ + if ((i + 1 ) %10 == 0)\ + {\ + printk("\n");\ + }\ + }\ + printk("\n");\ + }\ + }while(0) +#define GTP_DEBUG_FUNC() do{\ + if(GTP_DEBUG_FUNC_ON)\ + printk("<<-GTP-FUNC->> Func:%s@Line:%d\n",__func__,__LINE__);\ + }while(0) +#define GTP_SWAP(x, y) do{\ + typeof(x) z = x;\ + x = y;\ + y = z;\ + }while (0) + + +//*****************************End of Part III******************************** + +#endif /* TPD_CUSTOM_GT9XX_H__ */ diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_debug.c b/arch/arm/mach-mt8127/ford/touchpanel/tpd_debug.c new file mode 100644 index 00000000000..aa1515d977e --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_debug.c @@ -0,0 +1,453 @@ +#include +#include +#include +#include +#include +#include +#include + +#ifdef TPD_DEBUG_CODE +int tpd_fail_count = 0; +int tpd_trial_count = 0; + +void tpd_debug_no_response(struct i2c_client *i2c_client) { + char sleep[2] = {0x07,0x01}; + char wakeup[2] = {0x07,0x02}; + char threshold[2] = {0x09, 0x04}; + char gesture[2] = {0x08, 0x11}; + char sleeptime[2] = {0x0d, 0x01}; + char idletime[2] = {0x0c, 0xff}; + static int trial_index = 0; + static int delay_index = 0; + int trial[] = {1,9,2,8,3,7,4,6,5}; + int delay[] = {1,100,2,50,3,25,4,12,5,6,6,1,1,500,500}; + int trial_max = 9; + int delay_max = 15; + int i,j; + + int wakeup_count = 200; + + for(i=0;i=31?0:1); + *buf = (0xffe0+tpd_debug_track_color); +} + +void tpd_down_debug_track(int x, int y) { + if(tpd_debug_touch_up == 1) { + DAL_Clean(); + tpd_debug_touch_up = 0; + } + LCD_LayerEnable(5, TRUE); + tpd_draw(x-1, y-1); tpd_draw(x, y-1); tpd_draw(x+1, y-1); + tpd_draw(x-1, y ); tpd_draw(x+1, y ); + tpd_draw(x-1, y+1); tpd_draw(x, y+1); tpd_draw(x+1, y+1); +} + +void tpd_up_debug_track(int x, int y) { + if(x==0 && y==0) { tpd_debug_track_color = 0; DAL_Clean(); } + tpd_debug_touch_up = 1; + +} +#endif // TPD_DEBUG_TRACK + + +#define BUFFER_SIZE 128 + +int tpd_em_log = 0; +module_param(tpd_em_log, int, 00664); + +void tpd_enable_em_log(int enable) +{ + if(enable) { + tpd_em_log=1; + } else { + tpd_em_log=0; + } +} +EXPORT_SYMBOL(tpd_enable_em_log); + + +int tpd_em_log_to_fs = 0; +module_param(tpd_em_log_to_fs, int, 00664); + +int tpd_em_log_first = 1; + +struct tpd_em_log_struct +{ + struct list_head list; + char data[BUFFER_SIZE]; +}; +static LIST_HEAD(tpd_em_log_list); +#if 0 + +static void *tpd_em_log_seq_start(struct seq_file *seq, loff_t *pos) +{ + struct tpd_em_log_struct *p; + loff_t off = 0; + + list_for_each_entry(p, &tpd_em_log_list, list) { + if (*pos == off++) return p; + } + return NULL; +} + +static void *tpd_em_log_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ + struct list_head *n = ((struct tpd_em_log_struct *) v)->list.next; + + ++*pos; + + return (n != &tpd_em_log_list) ? list_entry(n, struct tpd_em_log_struct, list) : NULL; +} + +static void tpd_em_log_seq_stop(struct seq_file *s, void *v) +{ + struct tpd_em_log_struct *p, *p_tmp; + list_for_each_entry_safe(p, p_tmp, &tpd_em_log_list, list) { + list_del(&p->list); + kfree(p); + } +} + +static int tpd_em_log_seq_show(struct seq_file *seq, void *v) +{ + const struct tpd_em_log_struct *p = v; + seq_printf(seq, p->data); + return 0; +} + + + +static struct seq_operations tpd_em_log_seq_ops = { + .start = tpd_em_log_seq_start, + .next = tpd_em_log_seq_next, + .stop = tpd_em_log_seq_stop, + .show = tpd_em_log_seq_show +}; + + +static int tpd_em_log_open(struct inode *inode, struct file *file) { + return seq_open(file, &tpd_em_log_seq_ops); +}; + +static struct file_operations tpd_em_log_file_ops = { + .owner = THIS_MODULE, + .open = tpd_em_log_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +}; +#endif +int tpd_log_line_buffer = 128; // per line 128 bytes +int tpd_log_line_cnt = 1024*10; +module_param(tpd_log_line_buffer, int, 00664); +module_param(tpd_log_line_cnt, int, 00664); + + +struct tpd_debug_log_buf +{ + unsigned int head; + unsigned int tail; + spinlock_t buffer_lock; + unsigned int cnt; + unsigned char *buffer; + +}; +struct tpd_debug_log_buf tpd_buf; + +static int tpd_debug_log_open(struct inode *inode, struct file *file) +{ + memset(&tpd_buf, 0, sizeof(struct tpd_debug_log_buf)); + tpd_buf.buffer= vmalloc(tpd_log_line_cnt*tpd_log_line_buffer); + if(tpd_buf.buffer == NULL) + { + printk("tpd_log: nomem for tpd_buf->buffer\n"); + return -ENOMEM; + } + tpd_buf.head = tpd_buf.tail = 0; + spin_lock_init(&tpd_buf.buffer_lock); + + file->private_data = &tpd_buf; + printk("[tpd_em_log]: open log file\n"); + return 0; +} + +static int tpd_debug_log_release(struct inode *inode, struct file *file) +{ + //struct tpd_debug_log_buf *tpd_buf = (tpd_debug_log_buf *)file->private_data; + printk("[tpd_em_log]: close log file\n"); + vfree(tpd_buf.buffer); + //free(tpd_buf); + return 0; +} + +static ssize_t tpd_debug_log_write(struct file *file, const char __user *buffer, + size_t count, loff_t *ppos) +{ + return 0; +} + +static ssize_t tpd_debug_log_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + struct tpd_debug_log_buf *tpd_buf = (struct tpd_debug_log_buf *)file->private_data; + unsigned int retval = 0, unit = tpd_log_line_buffer; + unsigned char *tmp_buf = NULL; + + + if (tpd_buf->head == tpd_buf->tail && + (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + + while ((count - retval) >= unit) { + spin_lock_irq(&tpd_buf->buffer_lock); + if(tpd_buf->head != tpd_buf->tail) + { + tmp_buf = &tpd_buf->buffer[tpd_buf->tail++*unit]; + tpd_buf->tail &= tpd_log_line_cnt - 1; + } + else + { + //printk("*******************tpd_debug_log is empty **************************************\n"); + spin_unlock_irq(&tpd_buf->buffer_lock); + break; + } + spin_unlock_irq(&tpd_buf->buffer_lock); + //printk("%s, tmp_buf:0x%x\n", tmp_buf, tmp_buf); + if (copy_to_user(buffer+retval, tmp_buf, unit)) + return -EFAULT; + + retval += unit; + + } + + return retval; + + +} + +static unsigned char* tpd_log_find_buffer(void) +{ + unsigned char *buffer = NULL; + unsigned unit = tpd_log_line_buffer; + if(tpd_buf.buffer == NULL) + { + printk( "[tpd_em_log] :tpd_buf.buffer is NULL \n"); + return NULL; + } + spin_lock(&tpd_buf.buffer_lock); + buffer = &tpd_buf.buffer[tpd_buf.head++*unit]; + tpd_buf.head &= tpd_log_line_cnt - 1; + spin_unlock(&tpd_buf.buffer_lock); + if(tpd_buf.head == tpd_buf.tail) + { + snprintf(buffer, unit, "[tpd_em_log] overlay !!!!!\n"); + return NULL; + } + memset(buffer, 0, unit); + return buffer; +} + +static struct file_operations tpd_debug_log_fops = { + .owner = THIS_MODULE, + .read = tpd_debug_log_read, + .write = tpd_debug_log_write, + .open = tpd_debug_log_open, + .release = tpd_debug_log_release, +}; + +static struct miscdevice tpd_debug_log_dev = { + .minor = MISC_DYNAMIC_MINOR, + .name = "tpd_em_log", + .fops = &tpd_debug_log_fops, +}; +void tpd_em_log_output(int raw_x, int raw_y, int cal_x, int cal_y, int p, int down) { + if (down == TPD_TYPE_INT_DOWN) { + printk("[tpd_em_log] int trigger down\n"); + } else if (down == TPD_TYPE_INT_UP) { + printk("[tpd_em_log] int trigger up\n"); + } else if (down == TPD_TYPE_TIMER) { + printk("[tpd_em_log] timer trigger\n"); + } else if (down == TPD_TYPE_RAW_DATA) { + if (tpd_em_log == TPD_TYPE_RAW_DATA) { + printk("[tpd_em_log] rx=%d,ry=%d,rz1=%d,rz2=%d,p=%d,r\n", + raw_x, raw_y, cal_x, cal_y, p); + } + } else if(down == TPD_TYPE_REJECT1){ + printk("[tpd_em_log] the first or last point is rejected\n"); + }else if(down == TPD_TYPE_REJECT2){ + printk("[tpd_em_log] pressure(%d) > NICE_PRESSURE(%d), debounce debt0:%d ms, debt1:%d ms, spl_num:%d\n", raw_x, raw_y, cal_x, cal_y, p); + } else if(down == TPD_TYPE_FIST_LATENCY) { + printk("[tpd_em_log] The first touch latency is %d ms\n", raw_x/1000); + } else if (down && tpd_down_status == 0) { + printk("[tpd_em_log] rx=%d,ry=%d,cx=%d,cy=%d,p=%d,d(+%ld ms)\n", + raw_x, raw_y, cal_x, cal_y, p, (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); + } else if (down && tpd_down_status != 0) { + printk("[tpd_em_log] rx=%d,ry=%d,cx=%d,cy=%d,p=%d,m(+%ld ms)\n", + raw_x, raw_y, cal_x, cal_y, p, (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); + } else { + printk("[tpd_em_log] rx=%d,ry=%d,cx=%d,cy=%d,p=%d,u(+%ld ms)\n", + raw_x, raw_y, cal_x, cal_y, p, (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); + } +} + +void tpd_em_log_store(int raw_x, int raw_y, int cal_x, int cal_y, int p, int down) { + //static struct proc_dir_entry *entry = NULL; + //struct tpd_em_log_struct *tpd_em_log_struct_new; + struct timeval t; + +#if 0 + if (tpd_em_log_first) { + entry = create_proc_entry("tpd_em_log", 0, NULL); + if (entry) { + entry->proc_fops = &tpd_em_log_file_ops; + } + tpd_em_log_first = 0; + return; + } + tpd_em_log_struct_new = kmalloc(sizeof(struct tpd_em_log_struct), GFP_ATOMIC); + + memset(tpd_em_log_struct_new, 0, sizeof(struct tpd_em_log_struct)); +#else + unsigned char *buffer = NULL; + //unsigned int unit = tpd_log_line_buffer; + + //printk("[tpd_em_log]: start register log file"); + +#endif + buffer = tpd_log_find_buffer(); + if(buffer == NULL) + { + printk("not buffer \n"); + return; + } + do_gettimeofday(&t); + + if (down == TPD_TYPE_INT_DOWN) { + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] int trigger down\n", (t.tv_sec & 0xFFF), t.tv_usec); + } else if (down == TPD_TYPE_INT_UP) { + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] int trigger up\n", (t.tv_sec & 0xFFF), t.tv_usec); + } else if (down == TPD_TYPE_TIMER) { + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] timer trigger\n", (t.tv_sec & 0xFFF), t.tv_usec); + } else if (down == TPD_TYPE_RAW_DATA) { + if (tpd_em_log == TPD_TYPE_RAW_DATA) { + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] rx=%d,ry=%d,rz1=%d,rz2=%d,p=%d,r\n", + (t.tv_sec & 0xFFF), t.tv_usec, raw_x, raw_y, cal_x, cal_y, p); + } + } else if(down == TPD_TYPE_REJECT1){ + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] the first or last point is rejected\n", (t.tv_sec & 0xFFF), t.tv_usec); + }else if(down == TPD_TYPE_REJECT2){ + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] pressure(%d) > NICE_PRESSURE(%d), debounce debt0:%d, debt1:%d, spl_num:%d\n", + (t.tv_sec & 0xFFF), t.tv_usec, raw_x, raw_y, cal_x, cal_y, p); + } else if(down == TPD_TYPE_FIST_LATENCY) { + snprintf(buffer, tpd_log_line_buffer,"[%5lu.%06lu][tpd_em_log] The first touch latency is %d ms\n", (t.tv_sec & 0xFFF), t.tv_usec, raw_x/1000); + } else if (down && tpd_down_status == 0) { + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] rx=%d,ry=%d,cx=%d,cy=%d,p=%d,d(+%ld ms)\n", + (t.tv_sec & 0xFFF), t.tv_usec, raw_x, raw_y, cal_x, cal_y, p, (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); + } else if (down && tpd_down_status != 0) { + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] rx=%d,ry=%d,cx=%d,cy=%d,p=%d,d(+%ld ms)\n", + (t.tv_sec & 0xFFF), t.tv_usec, raw_x, raw_y, cal_x, cal_y, p, (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); + } else { + snprintf(buffer, tpd_log_line_buffer, "[%5lu.%06lu][tpd_em_log] rx=%d,ry=%d,cx=%d,cy=%d,p=%d,u(+%ld ms)\n", + (t.tv_sec & 0xFFF), t.tv_usec, raw_x, raw_y, cal_x, cal_y, p, (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); + } + + //list_add_tail(&tpd_em_log_struct_new->list, &tpd_em_log_list); +} + +void tpd_em_log_release(void) { + struct tpd_em_log_struct *p, *p_tmp; + if (!tpd_em_log_first) { + remove_proc_entry("tpd_em_log", NULL); + + list_for_each_entry_safe(p, p_tmp, &tpd_em_log_list, list) { + list_del(&p->list); + kfree(p); + } + + tpd_em_log_first = 1; + tpd_em_log_to_fs = 0; + } +} + +static int __init tpd_log_init(void) +{ + if (misc_register(&tpd_debug_log_dev) < 0) + { + printk( "[tpd_em_log] :register device failed \n"); + return -1; + } + printk( "[tpd_em_log] :register device successfully \n"); + return 0; +} + +int tpd_debuglog = 0; +module_param(tpd_debuglog, int, 00664); + +module_init(tpd_log_init); +#endif // TPD_DEBUG_CODE diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_debug.h b/arch/arm/mach-mt8127/ford/touchpanel/tpd_debug.h new file mode 100644 index 00000000000..6e116d0ccb3 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_debug.h @@ -0,0 +1,131 @@ +#ifndef TPD_DEBUG_H +#define TPD_DEBUG_H +#ifdef TPD_DEBUG_CODE +#include + +void tpd_debug_no_response(struct i2c_client *); +extern int tpd_debug_nr; + +#define TPD_DEBUG_CHECK_NO_RESPONSE \ + if(tpd_debug_nr) { \ + wait_event_interruptible_timeout(waiter,tpd_flag!=0,HZ/10); \ + if(tpd_flag==0) { \ + tpd_debug_no_response(i2c_client); \ + continue; \ + } \ + } else + + +void tpd_debug_set_time(void); +extern int tpd_debug_time; +extern long tpd_last_2_int_time[2]; +extern long tpd_last_down_time; +extern int tpd_start_profiling; +extern int tpd_down_status; + +#define TPD_DEBUG_PRINT_INT \ + do { \ + if(tpd_debug_time) { \ + printk("tp_int\n"); \ + } \ + } while(0) + +#define TPD_DEBUG_PRINT_UP \ + do { \ + if(pending==0 && tpd_debug_time) { \ + tpd_down_status=0; \ + printk("up on %ld ms (+%ld ms)\n", \ + (tpd_last_2_int_time[1] - tpd_last_down_time) / 1000, \ + (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); \ + } \ + } while(0) + +#define TPD_DEBUG_PRINT_DOWN \ + do { \ + if(tpd_debug_time) { \ + if(tpd_down_status==0) printk("down on 0 ms\n"); \ + else printk("move on %ld ms (+%ld ms)\n", \ + (tpd_last_2_int_time[1] - tpd_last_down_time) / 1000, \ + (tpd_last_2_int_time[1] - tpd_last_2_int_time[0]) / 1000); \ + tpd_down_status=1; \ + } \ + } while(0) + +#define TPD_DEBUG_SET_TIME do { tpd_debug_set_time(); } while(0); + +extern int tpd_em_log; +extern int tpd_em_log_to_fs; +extern int tpd_type_cap; + +void tpd_em_log_output(int raw_x, int raw_y, int cal_x, int cal_y, int p, int down); +void tpd_em_log_store(int raw_x, int raw_y, int cal_x, int cal_y, int p, int down); +void tpd_em_log_release(void); + +#define TPD_TYPE_RAW_DATA 2 +#define TPD_TYPE_INT_DOWN 3 +#define TPD_TYPE_INT_UP 4 +#define TPD_TYPE_TIMER 5 +#define TPD_TYPE_REJECT1 6 +#define TPD_TYPE_REJECT2 7 +#define TPD_TYPE_FIST_LATENCY 8 + +#define TPD_EM_PRINT(raw_x, raw_y, cal_x, cal_y, p, down) \ + do { \ + if (tpd_em_log) { \ + if (!tpd_em_log_to_fs) { \ + tpd_em_log_output(raw_x, raw_y, cal_x, cal_y, p, down); \ + } else { \ + tpd_em_log_store(raw_x, raw_y, cal_x, cal_y, p, down); \ + tpd_em_log_output(raw_x, raw_y, cal_x, cal_y, p, down); \ + } \ + if (down == 1) \ + tpd_down_status = 1; \ + else if (down == 0) \ + tpd_down_status = 0; \ + } \ + else { \ + if (tpd_em_log_to_fs) { \ + tpd_em_log_release(); \ + } \ + } \ + } while(0) + +#ifdef TPD_DEBUG_TRACK +extern void *dal_fb_addr; +extern int tpd_debug_track; +void tpd_up_debug_track(int x, int y); +void tpd_down_debug_track(int x, int y); +#define TPD_UP_DEBUG_TRACK(x,y) do { if(tpd_debug_track) tpd_up_debug_track(x,y); }while(0) +#define TPD_DOWN_DEBUG_TRACK(x,y) do { if(tpd_debug_track) tpd_down_debug_track(x,y); }while(0) + +#endif // TPD_DEBUG_TRACK +#endif // TPD_DEBUG_CODE + +// Macros that will be embedded in code + +#ifndef TPD_DEBUG_CHECK_NO_RESPONSE +#define TPD_DEBUG_CHECK_NO_RESPONSE +#endif + +#ifndef TPD_DEBUG_SET_TIME +#define TPD_DEBUG_SET_TIME +#endif + +#ifndef TPD_DEBUG_PRINT_UP +#define TPD_DEBUG_PRINT_UP +#endif + +#ifndef TPD_DEBUG_PRINT_DOWN +#define TPD_DEBUG_PRINT_DOWN +#endif + +#ifndef TPD_UP_DEBUG_TRACK +#define TPD_UP_DEBUG_TRACK(x,y) +#endif + +#ifndef TPD_DOWN_DEBUG_TRACK +#define TPD_DOWN_DEBUG_TRACK(x,y) +#endif + + +#endif // TPD_DEBUG_H diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_default.c b/arch/arm/mach-mt8127/ford/touchpanel/tpd_default.c new file mode 100644 index 00000000000..dae7d60055f --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_default.c @@ -0,0 +1,10 @@ +#include "tpd.h" + +//#ifndef TPD_CUSTOM_TREMBLE_TOLERANCE +int tpd_trembling_tolerance(int t, int p) { + if(t>5 || p>120) return 200; + if(p>90) return 64; + if(p>80) return 36; + return 26; +} +//#endif diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_default.h b/arch/arm/mach-mt8127/ford/touchpanel/tpd_default.h new file mode 100644 index 00000000000..011c8cbd73b --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_default.h @@ -0,0 +1,5 @@ +#ifndef TPD_FAT_TOUCH +#define TPD_FAT_TOUCH 120 +#endif + +int tpd_trembling_tolerance(int t, int p); diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_init.c b/arch/arm/mach-mt8127/ford/touchpanel/tpd_init.c new file mode 100644 index 00000000000..cc5b3795e67 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_init.c @@ -0,0 +1 @@ +// dummy file, temporarily for remake diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_misc.c b/arch/arm/mach-mt8127/ford/touchpanel/tpd_misc.c new file mode 100644 index 00000000000..5e95a26e04d --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_misc.c @@ -0,0 +1,39 @@ +#include "tpd.h" + +int tpd_calibrate_en = 0; +module_param(tpd_calibrate_en, int, 00664); + +int tpd_show_version = 0; +module_param(tpd_show_version, int, 00664); + +/* switch touch panel into single scan mode for decreasing interference */ +void tpd_switch_single_mode(void) { + #ifdef HAVE_SINGLE_MULTIPLE_SCAN_MODE + _tpd_switch_single_mode(); + #endif +} +EXPORT_SYMBOL(tpd_switch_single_mode); + +/* switch touch panel into multiple scan mode for better performance */ +void tpd_switch_multiple_mode(void) { + #ifdef HAVE_SINGLE_MULTIPLE_SCAN_MODE + _tpd_switch_multiple_mode(); + #endif +} +EXPORT_SYMBOL(tpd_switch_multiple_mode); + +/* switch touch panel into deep sleep mode */ +void tpd_switch_sleep_mode(void) { + #ifdef HAVE_SLEEP_NORMAL_MODE + _tpd_switch_sleep_mode(); + #endif +} +EXPORT_SYMBOL(tpd_switch_sleep_mode); + +/* switch touch panel back to normal mode */ +void tpd_switch_normal_mode(void) { + #ifdef HAVE_SLEEP_NORMAL_MODE + _tpd_switch_normal_mode(); + #endif +} +EXPORT_SYMBOL(tpd_switch_normal_mode); diff --git a/arch/arm/mach-mt8127/ford/touchpanel/tpd_setting.c b/arch/arm/mach-mt8127/ford/touchpanel/tpd_setting.c new file mode 100644 index 00000000000..87d514bb39a --- /dev/null +++ b/arch/arm/mach-mt8127/ford/touchpanel/tpd_setting.c @@ -0,0 +1,62 @@ +#include "tpd.h" + +int TPD_RES_X = 480; +int TPD_RES_Y = 800; + +//#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) +int tpd_calmat[8] = {0}; +int tpd_def_calmat[8] = {0}; +int tpd_calmat_size = 8; +int tpd_def_calmat_size = 8; +module_param_array(tpd_calmat, int, &tpd_calmat_size, 00664); +module_param_array(tpd_def_calmat, int, &tpd_def_calmat_size, 00444); +//#endif +//#ifdef TPD_TYPE_CAPACITIVE +int tpd_type_cap = 0; + +int tpd_v_magnify_x = 10; +int tpd_v_magnify_y = 10; +module_param(tpd_v_magnify_x, int, 00664); +module_param(tpd_v_magnify_y, int, 00664); + +module_param(tpd_type_cap, int, 00444); +int tpd_firmware_version[2] = {0,0}; +int tpd_firmware_version_size = 2; +module_param_array(tpd_firmware_version, int, &tpd_firmware_version_size, 00444); + +int tpd_mode = TPD_MODE_NORMAL; +int tpd_mode_axis = 0; +int tpd_mode_min = 400; //TPD_RES_Y/2; +int tpd_mode_max = 800; //TPD_RES_Y; +int tpd_mode_keypad_tolerance = 480*480/1600; //TPD_RES_X*TPD_RES_X/1600; +module_param(tpd_mode, int, 00664); +module_param(tpd_mode_axis, int, 00664); +module_param(tpd_mode_min, int, 00664); +module_param(tpd_mode_max, int, 00664); +module_param(tpd_mode_keypad_tolerance, int, 00664); + +/* ATTENTION! all the default values should sync with tpd_adc_init()@tpd_adc.c */ +int tpd_em_debounce_time0 = 1; +int tpd_em_debounce_time = 0; +int tpd_em_debounce_time1 = 4; +module_param(tpd_em_debounce_time0, int, 00664); +module_param(tpd_em_debounce_time1, int, 00664); +module_param(tpd_em_debounce_time, int, 00664); + +int tpd_em_spl_num = 1; +module_param(tpd_em_spl_num, int, 00664); + +int tpd_em_pressure_threshold = 0; +module_param(tpd_em_pressure_threshold, int, 00664); + +int tpd_em_auto_time_interval = 10; +module_param(tpd_em_auto_time_interval, int, 00664); + +int tpd_em_sample_cnt = 16; +module_param(tpd_em_sample_cnt, int, 00664); + +int tpd_load_status = 0; +module_param(tpd_load_status, int, 00664); + +int tpd_em_asamp = 1; +module_param(tpd_em_asamp, int, 00664); diff --git a/arch/arm/mach-mt8127/ford/vibrator/Makefile b/arch/arm/mach-mt8127/ford/vibrator/Makefile new file mode 100755 index 00000000000..4cad03c06dd --- /dev/null +++ b/arch/arm/mach-mt8127/ford/vibrator/Makefile @@ -0,0 +1,4 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y := cust_vibrator.o + diff --git a/arch/arm/mach-mt8127/ford/vibrator/cust_vibrator.c b/arch/arm/mach-mt8127/ford/vibrator/cust_vibrator.c new file mode 100644 index 00000000000..20663f546d9 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/vibrator/cust_vibrator.c @@ -0,0 +1,18 @@ +#include +#include + +static struct vibrator_hw cust_vibrator_hw = { + .vib_timer = 25, + #ifdef CUST_VIBR_LIMIT + .vib_limit = 9, + #endif + #ifdef CUST_VIBR_VOL + .vib_vol = 0x5,//2.8V for vibr + #endif +}; + +struct vibrator_hw *get_cust_vibrator_hw(void) +{ + return &cust_vibrator_hw; +} + diff --git a/arch/arm/mach-mt8127/ford/vibrator/cust_vibrator.h b/arch/arm/mach-mt8127/ford/vibrator/cust_vibrator.h new file mode 100644 index 00000000000..f6965a2bfa6 --- /dev/null +++ b/arch/arm/mach-mt8127/ford/vibrator/cust_vibrator.h @@ -0,0 +1,24 @@ +#ifndef __CUST_VIBRATOR_H__ +#define __CUST_VIBRATOR_H__ + +#include +#include +#include +#include + +#define CUST_VIBR_LIMIT +#define CUST_VIBR_VOL +/*----------------------------------------------------------------------------*/ +struct vibrator_hw { + int vib_timer; +#ifdef CUST_VIBR_LIMIT + int vib_limit; +#endif +#ifdef CUST_VIBR_VOL + int vib_vol; +#endif +}; +/*----------------------------------------------------------------------------*/ +extern struct vibrator_hw *get_cust_vibrator_hw(void); +/*----------------------------------------------------------------------------*/ +#endif diff --git a/arch/arm/mach-mt8127/include/mach/hal_pub_kpd.h b/arch/arm/mach-mt8127/include/mach/hal_pub_kpd.h old mode 100644 new mode 100755 index 0d5bb447894..22c42796aee --- a/arch/arm/mach-mt8127/include/mach/hal_pub_kpd.h +++ b/arch/arm/mach-mt8127/include/mach/hal_pub_kpd.h @@ -12,7 +12,7 @@ #include /*function define*/ -void kpd_slide_qwerty_init(void); +void kpd_slide_qwerty_init(struct input_dev *dev); void kpd_ldvt_test_init(void); void long_press_reboot_function_setting(void); void kpd_auto_test_for_factorymode(void); diff --git a/arch/arm/mach-mt8127/include/mach/mt_cpufreq.h b/arch/arm/mach-mt8127/include/mach/mt_cpufreq.h index e35fba27c29..380af827e25 100644 --- a/arch/arm/mach-mt8127/include/mach/mt_cpufreq.h +++ b/arch/arm/mach-mt8127/include/mach/mt_cpufreq.h @@ -40,7 +40,10 @@ unsigned int mt_cpufreq_disable_by_ptpod(void); extern unsigned int mt_cpufreq_max_frequency_by_DVS(unsigned int num); void mt_cpufreq_return_default_DVS_by_ptpod(void); extern bool mt_cpufreq_earlysuspend_status_get(void); - +extern void mt_cpufreq_enable_boost(void); +extern void mt_cpufreq_disable_boost(void); +extern bool mt_cpufreq_get_boost(void); +extern void hp_based_cpu_num(int num); /***************** * dummy type define for kernel 3.10 @@ -58,4 +61,4 @@ enum mt_cpu_dvfs_id { NR_MT_CPU_DVFS, }; -#endif \ No newline at end of file +#endif diff --git a/arch/arm/mach-mt8127/include/mach/mt_freqhopping.h b/arch/arm/mach-mt8127/include/mach/mt_freqhopping.h index a8621c697a7..54a8c102bd4 100644 --- a/arch/arm/mach-mt8127/include/mach/mt_freqhopping.h +++ b/arch/arm/mach-mt8127/include/mach/mt_freqhopping.h @@ -31,11 +31,7 @@ #define VERBOSE_DEBUG 0 #if 1//VERBOSE_DEBUG -#define FH_MSG(fmt, args...) \ -do { \ - printk( FHTAG""fmt" <- %s(): L<%d> PID<%s><%d>\n", \ - ##args ,__FUNCTION__,__LINE__,current->comm,current->pid); \ -} while(0); +#define FH_MSG(fmt, args...) #else #if 1 //log level is 6 xlog diff --git a/arch/arm/mach-mt8127/include/mach/mt_rtc_hw.h b/arch/arm/mach-mt8127/include/mach/mt_rtc_hw.h index d67f694a6a0..e03313548da 100644 --- a/arch/arm/mach-mt8127/include/mach/mt_rtc_hw.h +++ b/arch/arm/mach-mt8127/include/mach/mt_rtc_hw.h @@ -197,6 +197,17 @@ #define RTC_SPAR0_PWRON_SEC_SHIFT 0 #define RTC_SPAR0_32K_LESS (1U << 6) #define RTC_SPAR0_LP_DET (1U << 7) +#define RTC_SPAR0_ENTER_KPOC (1U << 8) +#define RTC_SPAR0_RPMB_PROGRAM_FLAG (1U << 9) +#define RTC_SPAR0_LONG_PRESS_RST (1U << 10) /* mask for long press reset metrics */ +#define RTC_SPAR0_SW_LONG_PRESS_RST (1U << 11) /* mask for sw long press reset */ + +#define RTC_SPAR0_REBOOT_REASON_BIT0 (1U << 14) +#define RTC_SPAR0_REBOOT_REASON_BIT1 (1U << 15) +#define RTC_SPAR0_REBOOT_REASON_MASK (0x3) +#define RTC_SPAR0_REBOOT_REASON_SHIFT (14) +#define RTC_SPAR0_CLEAR_REBOOT_REASON \ + (~(RTC_SPAR0_REBOOT_REASON_MASK << RTC_SPAR0_REBOOT_REASON_SHIFT)) /* * RTC_SPAR1: diff --git a/arch/arm/mach-mt8127/include/mach/mt_spm_sleep.h b/arch/arm/mach-mt8127/include/mach/mt_spm_sleep.h index f4c30fae504..546602b943f 100644 --- a/arch/arm/mach-mt8127/include/mach/mt_spm_sleep.h +++ b/arch/arm/mach-mt8127/include/mach/mt_spm_sleep.h @@ -2,6 +2,7 @@ #define _MT_SPM_SLEEP_ #include +#include typedef enum { WR_NONE = 0, @@ -10,9 +11,29 @@ typedef enum { WR_PCM_TIMER = 3, WR_PCM_WDT = 4, WR_WAKE_SRC = 5, - WR_UNKNOWN = 6, + WR_PCM_ABORT = 6, + WR_UNKNOWN = 7, } wake_reason_t; +/* Added by haitaoy@amazon.com for AUSTINPLAT-1413. */ +struct mt_wake_event { + char *domain; + struct mt_wake_event *parent; + int code; +}; + +struct mt_wake_event_map { + char *domain; + int code; + int irq; + wakeup_event_t we; +}; + +void spm_report_wakeup_event(struct mt_wake_event *we, int code); +struct mt_wake_event *spm_get_wakeup_event(void); +void spm_set_wakeup_event_map(struct mt_wake_event_map *tbl); +wakeup_event_t spm_read_wakeup_event_and_irq(int *pirq); + /* * for suspend */ @@ -27,7 +48,7 @@ extern wake_reason_t spm_go_to_sleep_dpidle(bool cpu_pdn, u16 pwrlevel, int pwak extern void spm_dpidle_before_wfi(void); /* can be redefined */ extern void spm_dpidle_after_wfi(void); /* can be redefined */ extern wake_reason_t spm_go_to_dpidle(bool cpu_pdn, u16 pwrlevel); - +extern void aee_rr_rec_deepidle_val(u32 val); extern bool spm_is_md_sleep(void); extern bool spm_is_conn_sleep(void); diff --git a/arch/arm/mach-mt8127/include/mach/mt_thermal.h b/arch/arm/mach-mt8127/include/mach/mt_thermal.h index 2d790722dc6..a7f72e9ddb9 100644 --- a/arch/arm/mach-mt8127/include/mach/mt_thermal.h +++ b/arch/arm/mach-mt8127/include/mach/mt_thermal.h @@ -1,4 +1,3 @@ - #ifndef _MT6589_THERMAL_H #define _MT6589_THERMAL_H @@ -188,6 +187,27 @@ struct TS_PTPOD extern void get_thermal_slope_intercept(struct TS_PTPOD *ts_info); extern void set_taklking_flag(bool flag); extern int mtktscpu_get_cpu_temp(void); +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int *rawdata); +extern int IMM_IsAdcInitReady(void); +extern int get_immediate_temp2_wrap(void); +extern void mt_cpufreq_thermal_protect(unsigned int limited_power); +extern u32 get_devinfo_with_index(u32 index); +extern int PMIC_IMM_GetOneChannelValue(int dwChannel, int deCount, int trimd); +extern int read_tbat_value(void); +/* This API function is implemented in mediatek/kernel/drivers/leds/leds.c */ +extern int setMaxbrightness(int max_level, int enable); +/** + * return value means charging current in mA + * -1 means error + * Implementation in mt_battery.c and mt_battery_fan5405.c + */ +extern int get_bat_charging_current_level(void); +/** + * current_limit means limit of charging current in mA + * -1 means no limit + * Implementation in mt_battery.c and mt_battery_fan5405.c + */ +extern int set_bat_charging_current_limit(int current_limit); //#define THERMAL_WRAP_RD32(addr) __raw_readl((void *)addr) #define THERMAL_WRAP_WR32(val,addr) mt65xx_reg_sync_writel((val), ((void *)addr)) @@ -197,4 +217,3 @@ extern int mtktscpu_get_cpu_temp(void); #endif - diff --git a/arch/arm/mach-mt8127/include/mach/mtk_rtc_hal.h b/arch/arm/mach-mt8127/include/mach/mtk_rtc_hal.h index c9b8942e435..57c39ebca3a 100644 --- a/arch/arm/mach-mt8127/include/mach/mtk_rtc_hal.h +++ b/arch/arm/mach-mt8127/include/mach/mtk_rtc_hal.h @@ -21,7 +21,6 @@ #include #define RTC_GPIO_USER_MASK (((1U << 13) - 1) & 0xff00) - /* RTC registers */ #ifdef CONFIG_MTK_PMIC_MT6397 #define RTC_BASE (0xe000) @@ -46,7 +45,7 @@ extern void hal_rtc_set_tick_time(struct rtc_time *tm); extern bool hal_rtc_check_pwron_alarm_rg(struct rtc_time *nowtm, struct rtc_time *tm); extern void hal_rtc_get_alarm_time(struct rtc_time *tm, struct rtc_wkalrm *alm); extern void hal_rtc_set_alarm_time(struct rtc_time *tm); -extern void hal_rtc_clear_alarm(void); +extern void hal_rtc_clear_alarm(struct rtc_time *tm); extern void hal_rtc_set_lp_irq(void); extern void hal_rtc_read_rg(void); extern void hal_rtc_save_pwron_time(bool enable, struct rtc_time *tm, bool logo); diff --git a/arch/arm/mach-mt8127/include/mach/nand_device_define.h b/arch/arm/mach-mt8127/include/mach/nand_device_define.h index c038a631b58..a7bd294bc01 100644 --- a/arch/arm/mach-mt8127/include/mach/nand_device_define.h +++ b/arch/arm/mach-mt8127/include/mach/nand_device_define.h @@ -114,8 +114,8 @@ typedef struct u32 advancedmode; struct MLC_feature_set feature_set; }flashdev_info_t,*pflashdev_info; - -static const flashdev_info_t gen_FlashTable_p[]={ +#if 0 +static const flashdev_info gen_FlashTable[]={ {{0x45,0xDE,0x94,0x93,0x76,0x57}, 6,5,IO_8BIT,8192,4096,16384,1280,0x10804222, 0xC03222,0x101,80,VEND_SANDISK,1024, "SDTNQGAMA008G ",0 , {SANDISK_16K, {0xEF,0xEE,0xFF,16,0x11,0,1,RTYPE_SANDISK_19NM,{0x80, 0x00},{0x80, 0x01}}, {RAND_TYPE_SAMSUNG,{0x2D2D,1,1,1,1,1}}}}, @@ -147,6 +147,5 @@ static const flashdev_info_t gen_FlashTable_p[]={ {SANDISK_16K, {0xEF,0xEE,0xFF,7,0xFF,7,0,RTYPE_TOSHIBA,{0x80, 0x00},{0x80, 0x01}}, {RAND_TYPE_SAMSUNG,{0x2D2D,1,1,1,1,1}}}}, }; - -static unsigned int flash_number = sizeof(gen_FlashTable_p) / sizeof(flashdev_info_t); +#endif #endif diff --git a/arch/arm/mach-mt8127/include/mach/pmic_mt6323_sw.h b/arch/arm/mach-mt8127/include/mach/pmic_mt6323_sw.h index 5df32ba244d..748addeb297 100644 --- a/arch/arm/mach-mt8127/include/mach/pmic_mt6323_sw.h +++ b/arch/arm/mach-mt8127/include/mach/pmic_mt6323_sw.h @@ -29,6 +29,8 @@ #define PMIC6323_E1_CID_CODE 0x1023 #define PMIC6323_E2_CID_CODE 0x2023 +extern struct workqueue_struct *system_highpri_wq; + //============================================================================== // The CHIP SPEC of each block //============================================================================== diff --git a/arch/arm/mach-mt8127/include/mach/upmu_hw_mt6323.h b/arch/arm/mach-mt8127/include/mach/upmu_hw_mt6323.h index ca64a636340..9df09e29f26 100644 --- a/arch/arm/mach-mt8127/include/mach/upmu_hw_mt6323.h +++ b/arch/arm/mach-mt8127/include/mach/upmu_hw_mt6323.h @@ -400,6 +400,10 @@ #define ACCDET_CON14 ((UINT32)(PMIC_REG_BASE+0x0796)) #define ACCDET_CON15 ((UINT32)(PMIC_REG_BASE+0x0798)) #define ACCDET_CON16 ((UINT32)(PMIC_REG_BASE+0x079A)) + +/* The valid range of audio analog hardware in PMIC */ +#define AUDTOP_MAX_ADDR_OFFSET (0x079A) + //mask is HEX; shift is Integer #define PMIC_RG_VCDT_HV_EN_MASK 0x1 #define PMIC_RG_VCDT_HV_EN_SHIFT 0 diff --git a/arch/arm/mach-mt8127/mt_clkmgr.c b/arch/arm/mach-mt8127/mt_clkmgr.c index cf6abdd4ae4..db55ea811e3 100644 --- a/arch/arm/mach-mt8127/mt_clkmgr.c +++ b/arch/arm/mach-mt8127/mt_clkmgr.c @@ -41,15 +41,15 @@ /* #define CLK_LOG */ /* #define SYS_LOG */ /* #define MUX_LOG_TOP */ -#define MUX_LOG +/* #define MUX_LOG */ /* #define PLL_LOG_TOP */ -#define PLL_LOG +/* #define PLL_LOG */ /************************************************ ********** log debug ********** ************************************************/ -#define USING_XLOG +//#define USING_XLOG #ifdef USING_XLOG #include @@ -78,7 +78,7 @@ #define clk_info(fmt, args...) \ pr_notice(TAG fmt, ##args) #define clk_dbg(fmt, args...) \ - pr_info(TAG fmt, ##args) + pr_debug(TAG fmt, ##args) #define clk_ver(fmt, args...) \ pr_debug(TAG fmt, ##args) diff --git a/arch/arm/mach-mt8127/mt_cpufreq.c b/arch/arm/mach-mt8127/mt_cpufreq.c index 8c8d197d9d3..7c6a40078fc 100644 --- a/arch/arm/mach-mt8127/mt_cpufreq.c +++ b/arch/arm/mach-mt8127/mt_cpufreq.c @@ -115,18 +115,18 @@ static struct early_suspend mt_cpufreq_early_suspend_handler = #define DVFS_F4 ( 598000) // KHz #if defined(HQA_LV_1_09V) - #define DVFS_V0 (1250) // mV + #define DVFS_V0 (1200) // mV #define DVFS_V1 (1150) // mV #define DVFS_V2 (1090) // mV #define DVFS_V3 (1090) // mV #elif defined(HQA_NV_1_15V) #define DVFS_V0 (1260) // mV - #define DVFS_V1 (1250) // mV + #define DVFS_V1 (1200) // mV #define DVFS_V2 (1150) // mV #define DVFS_V3 (1050) // mV /*Not used */ #elif defined(HQA_HV_1_21V) #define DVFS_V0 (1320) // mV - #define DVFS_V1 (1250) // mV + #define DVFS_V1 (1210) // mV #define DVFS_V2 (1150) // mV /*Not used */ #define DVFS_V3 (1050) // mV /*Not used */ #else /* Normal case */ @@ -186,6 +186,7 @@ static unsigned int g_cpu_power_table_num = 0; static int g_ramp_down_count = 0; +static bool mt_cpufreq_boost = false; static bool mt_cpufreq_debug = false; static bool mt_cpufreq_ready = false; static bool mt_cpufreq_pause = false; @@ -386,7 +387,6 @@ static void mt_cpufreq_volt_set(unsigned int target_volt); * Extern Function Declaration *******************************/ extern int spm_dvfs_ctrl_volt(u32 value); -extern int mtk_cpufreq_register(struct mt_cpu_power_info *freqs, int num); extern void hp_limited_cpu_num(int num); extern u32 PTP_get_ptp_level(void); @@ -825,10 +825,6 @@ static void mt_setup_power_table(int num) dprintk("mt_cpu_power[%d].cpufreq_ncpu = %d, ", i, mt_cpu_power[i].cpufreq_ncpu); dprintk("mt_cpu_power[%d].cpufreq_power = %d\n", i, mt_cpu_power[i].cpufreq_power); } - - #ifdef CONFIG_THERMAL - mtk_cpufreq_register(mt_cpu_power, g_cpu_power_table_num); - #endif } /*********************************************** @@ -1207,7 +1203,7 @@ static void mt_cpufreq_set(unsigned int freq_old, unsigned int freq_new, unsigne #ifdef MT_CPUFREQ_FHCTL if(((freq_new > FHCTL_CHANGE_FREQ) && (freq_old > FHCTL_CHANGE_FREQ)) || ((freq_new < FHCTL_CHANGE_FREQ) && (freq_old < FHCTL_CHANGE_FREQ))) { - dprintk("Before === FHCTL: freq_new = %d < freq_old = %d ===\n", freq_new, freq_old); + dprintk("Before === FHCTL: freq_new = %d < freq_old = %d ===\n", freq_new, freq_old); mt_dfs_armpll(freq_old, freq_new); dprintk("=== FHCTL: freq_new = %d > freq_old = %d ===\n", freq_new, freq_old); @@ -1451,7 +1447,15 @@ static int mt_cpufreq_target(struct cpufreq_policy *policy, unsigned int target_ freqs.new = DVFS_F2; dprintk("mt_cpufreq_limit_max_freq_early_suspend, freqs.new = %d\n", freqs.new); } - + + /************************************************ + * DVFS keep max freq when boost is enable. + *************************************************/ + if(mt_cpufreq_boost == true) + { + freqs.new = g_max_freq_by_ptp; + dprintk("set max freq for boost, freqs.new = %d\n", freqs.new); + } freqs.new = mt_thermal_limited_verify(freqs.new); @@ -1551,7 +1555,7 @@ static int mt_cpufreq_target(struct cpufreq_policy *policy, unsigned int target_ *******************************/ /* Get current frequency */ freqs.old = g_cur_freq; - + if (freqs.old != freqs.new) mt_cpufreq_set(freqs.old, freqs.new, next.cpufreq_volt); else @@ -2526,6 +2530,91 @@ static int mt_cpufreq_ptpod_freq_volt_open(struct inode *inode, struct file *fil } +void mt_cpufreq_enable_boost(void) +{ + struct cpufreq_policy *policy; + + mt_cpufreq_boost = true; + dprintk("enable freq boost, mt_cpufreq_boost:%d\n", mt_cpufreq_boost); + + policy = cpufreq_cpu_get(0); + + if (!policy) { + dprintk("no available policy\n"); + goto no_policy; + } + cpufreq_driver_target(policy, g_max_freq_by_ptp, CPUFREQ_RELATION_L); + + cpufreq_cpu_put(policy); + +no_policy: + return; +} + +void mt_cpufreq_disable_boost(void) +{ + mt_cpufreq_boost = false; + dprintk("disable freq boost: mt_cpufreq_boost:%d\n", mt_cpufreq_boost); +} + +bool mt_cpufreq_get_boost(void) +{ + return mt_cpufreq_boost; +} + + +/*************************** +* show current debug status +****************************/ +static int mt_cpufreq_boost_show(struct seq_file* s, void* v) +{ + if (mt_cpufreq_get_boost()) + seq_printf(s, "cpufreq boost enabled\n"); + else + seq_printf(s, "cpufreq boost disabled\n"); + + return 0; +} + +static int mt_cpufreq_boost_open(struct inode *inode, struct file *file) +{ + return single_open(file, mt_cpufreq_boost_show, NULL); +} + + +/*********************** +* enable debug message +************************/ +static ssize_t mt_cpufreq_boost_write(struct file *file, const char *buffer, size_t count, loff_t *data) +{ + int boost = 0; + + if (sscanf(buffer, "%d", &boost) == 1) + { + if (boost == 0) + { + mt_cpufreq_disable_boost(); + return count; + } + else if (boost == 1) + { + mt_cpufreq_enable_boost(); + return count; + } + else + { + xlog_printk(ANDROID_LOG_INFO, "Power/DVFS", "bad argument!! should be 0 or 1 [0: disable, 1: enable]\n"); + } + } + else + { + xlog_printk(ANDROID_LOG_INFO, "Power/DVFS", "bad argument!! should be 0 or 1 [0: disable, 1: enable]\n"); + } + + return -EINVAL; +} + + /******************************************* * cpufrqe platform driver callback function ********************************************/ @@ -3164,6 +3253,15 @@ static const struct file_operations mt_cpufreq_ptpod_freq_volt_fops = { .release = single_release, }; +static const struct file_operations mt_cpufreq_boost_fops = { + .owner = THIS_MODULE, + .write = mt_cpufreq_boost_write, + .open = mt_cpufreq_boost_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + /*********************************************************** * cpufreq initialization to register cpufreq platform driver ************************************************************/ @@ -3234,6 +3332,12 @@ static int __init mt_cpufreq_pdrv_init(void) pr_err("[%s]: mkdir /proc/cpufreq/cpufreq_sdio_info failed\n", __FUNCTION__); } #endif + + mt_entry = proc_create("cpufreq_boost", S_IRUGO | S_IWUSR | S_IWGRP, mt_cpufreq_dir, &mt_cpufreq_boost_fops); + if (!mt_entry) + { + pr_err("[%s]: mkdir /proc/cpufreq/cpufreq_boost failed\n", __FUNCTION__); + } } ret = platform_driver_register(&mt_cpufreq_pdrv); diff --git a/arch/arm/mach-mt8127/mt_devs.c b/arch/arm/mach-mt8127/mt_devs.c index 672e22c5e6c..ae233164c87 100644 --- a/arch/arm/mach-mt8127/mt_devs.c +++ b/arch/arm/mach-mt8127/mt_devs.c @@ -29,11 +29,14 @@ #include #include #include -#if 0//#ifdef CONFIG_MTK_MTD_NAND +#ifdef CONFIG_MTK_MTD_NAND #include #include #endif #define SERIALNO_LEN 32 + +#include + static char serial_number[SERIALNO_LEN]; extern BOOTMODE get_boot_mode(void); @@ -44,7 +47,7 @@ extern void adjust_kernel_cmd_line_setting_for_console(char*, char*); unsigned int mtk_get_max_DRAM_size(void); resource_size_t get_actual_DRAM_size(void); -#if 0//#ifdef CONFIG_MTK_MTD_NAND +#ifdef CONFIG_MTK_MTD_NAND struct tag_pt_info otp_info; struct tag_pt_info bmt_info; unsigned int flash_number; @@ -289,14 +292,6 @@ static struct kobject sn_kobj; static ssize_t sn_show(char *buf){ return snprintf(buf, 4096, "%s\n", serial_number); } -//[FEATURE]-Add-BEGIN by SCDTABLET.(meiqin),04/14/2015,modify SN -static ssize_t sn_store(char *buf, size_t count){ - memset(serial_number, 0,sizeof(serial_number)); - memcpy(serial_number,buf,count); - return count; -} -//[FEATURE]-Add-END by SCDTABLET.(meiqin) - struct sysinfo_attribute sn_attr = { #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)) @@ -305,9 +300,7 @@ struct sysinfo_attribute sn_attr = { .attr = {"serial_number", 0644}, #endif .show = sn_show, -//[FEATURE]-Mod-BEGIN by SCDTABLET.(meiqin),04/14/2015,modify SN - .store = sn_store, -//[FEATURE]-Mod-END by SCDTABLET.(meiqin) + .store = NULL }; static ssize_t sysinfo_show(struct kobject *kobj, struct attribute *attr, char *buf) @@ -748,9 +741,100 @@ static struct platform_device cpufreq_pdev = { /*=======================================================================*/ /* MT6575 Thermal Controller module */ /*=======================================================================*/ +static struct mtk_thermal_platform_data mtktscpu_thermal_data = { + .num_trips = 5, + .mode = THERMAL_DEVICE_DISABLED, + .polling_delay = 100, + .trips[0] = {.temp = 95000, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-0", .upper = 1, .lower = 0}, + }, + .trips[1] = {.temp = 100000, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-0", .upper = 2, .lower = 1}, + }, + .trips[2] = {.temp = 105000, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-0", .upper = 3, .lower = 2}, + }, + .trips[3] = {.temp = 110000, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-0", .upper = 4, .lower = 3}, + }, + .trips[4] = {.temp = 117000, .type = THERMAL_TRIP_CRITICAL, .hyst = 0}, +}; + +static struct mtk_thermal_platform_data virtual_sensor_thermal_data = { + .num_trips = 5, + .mode = THERMAL_DEVICE_DISABLED, + .polling_delay = 1000, + .trips[0] = {.temp = 50250, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-1", .upper = 1, .lower = 0}, + .cdev[1] = { + .type = "backlight", .upper = 1, .lower = 0}, + .cdev[2] = { + .type = "charger", .upper = 1, .lower = 0}, + .cdev[3] = { + .type = "cpuhotplug", .upper = 1, .lower = 0}, + }, + .trips[1] = {.temp = 50500, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-1", .upper = 2, .lower = 1}, + .cdev[1] = { + .type = "backlight", .upper = 2, .lower = 1}, + .cdev[2] = { + .type = "charger", .upper = 2, .lower = 1}, + .cdev[3] = { + .type = "cpuhotplug", .upper = 2, .lower = 1}, + }, + .trips[2] = {.temp = 50750, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-1", .upper = 3, .lower = 2}, + .cdev[1] = { + .type = "backlight", .upper = 3, .lower = 2}, + .cdev[2] = { + .type = "charger", .upper = 3, .lower = 2}, + .cdev[3] = { + .type = "cpuhotplug", .upper = 3, .lower = 2}, + }, + .trips[3] = {.temp = 51000, .type = THERMAL_TRIP_ACTIVE, .hyst = 0, + .cdev[0] = { + .type = "thermal-cpufreq-1", .upper = 4, .lower = 3}, + .cdev[1] = { + .type = "backlight", .upper = 4, .lower = 3}, + .cdev[2] = { + .type = "charger", .upper = 4, .lower = 3}, + .cdev[3] = { + .type = "cpuhotplug", .upper = 4, .lower = 3}, + }, + .trips[4] = {.temp = 60000, .type = THERMAL_TRIP_CRITICAL, .hyst = 0}, +}; + struct platform_device thermal_pdev = { - .name = "mtk-thermal", - .id = -1, + .name = "mtk-thermal", + .id = -1, + .dev = { + .platform_data = &mtktscpu_thermal_data, + }, +}; + +struct platform_device virtual_sensor_thermal_pdev = { + .name = "virtual_sensor-thermal", + .id = -1, + .dev = { + .platform_data = &virtual_sensor_thermal_data, + }, +}; + +struct platform_device mtk_cpufreq_cooling_driver = { + .name = "mtk-cpufreq-cooling", + .id = -1, +}; + +struct platform_device virtual_sensor_cpufreq_cooling_driver = { + .name = "virtual_sensor-cpufreq-cooling", + .id = -1, }; #if 1 @@ -1170,7 +1254,7 @@ static int __init parse_tag_devinfo_data_fixup(const struct tag *tags) return 0; } -#if 0//#ifdef CONFIG_MTK_MTD_NAND +#ifdef CONFIG_MTK_MTD_NAND int __init parse_tag_partition_fixup(const struct tag *tags) { @@ -1278,7 +1362,7 @@ void mt_fixup(struct tag *tags, char **cmdline, struct meminfo *mi) g_meta_com_type = tags->u.meta_com.meta_com_type; g_meta_com_id = tags->u.meta_com.meta_com_id; } //FIXME_8127 -#if 0//#ifdef CONFIG_MTK_MTD_NAND +#ifdef CONFIG_MTK_MTD_NAND else if(tags->hdr.tag == ATAG_OTP_INFO) { parse_tag_partition_fixup(tags); @@ -1694,6 +1778,14 @@ struct platform_device battery_device = { .id = -1, }; +struct platform_device battery_meter_device = { + .name = "battery_meter", + .id = -1, +}; + +extern unsigned int system_serial_high; +extern unsigned int system_serial_low; + /*=======================================================================*/ /* MT6589 Board Device Initialization */ /*=======================================================================*/ @@ -1736,6 +1828,9 @@ __init int mt_board_init(void) printk("[%s] fail to add kobject\n", "sys_info"); } + system_serial_high = get_devinfo_with_index(13); + system_serial_low = get_devinfo_with_index(12); + #if defined(CONFIG_MTK_MTD_NAND) retval = platform_device_register(&mtk_nand_dev); if (retval != 0) { @@ -2019,6 +2114,13 @@ if (retval != 0) { } #endif +#if defined(CONFIG_MTK_TOUCHPANEL) + retval = platform_device_register(&mtk_tpd_dev); + if (retval != 0) { + return retval; + } +#endif + #if defined(CONFIG_MTK_SENSOR_SUPPORT) retval = platform_device_register(&hwmon_sensor); @@ -2130,6 +2232,13 @@ if (retval != 0) { #endif #if 1 // init after USB driver + + retval = platform_device_register(&battery_meter_device); + if (retval) { + printk("[battery_meter] Unable to device register\n"); + return retval; + } + retval = platform_device_register(&battery_device); if (retval) { printk("[battery_driver] Unable to device register\n"); @@ -2137,12 +2246,6 @@ if (retval != 0) { } #endif -#if defined(CONFIG_MTK_TOUCHPANEL) - retval = platform_device_register(&mtk_tpd_dev); - if (retval != 0) { - return retval; - } -#endif #if defined(CUSTOM_KERNEL_OFN) retval = platform_device_register(&ofn_driver); if (retval != 0){ @@ -2189,10 +2292,21 @@ retval = platform_device_register(&dummychar_device); #endif #if 1 - retval = platform_device_register(&thermal_pdev); - if (retval != 0) { - return retval; - } + retval = platform_device_register(&thermal_pdev); + if (retval != 0) + return retval; + + retval = platform_device_register(&virtual_sensor_thermal_pdev); + if (retval != 0) + return retval; + + retval = platform_device_register(&mtk_cpufreq_cooling_driver); + if (retval != 0) + return retval; + + retval = platform_device_register(&virtual_sensor_cpufreq_cooling_driver); + if (retval != 0) + return retval; #endif #if 1 @@ -2287,7 +2401,7 @@ retval = platform_device_register(&dummychar_device); } -#if defined(CONFIG_MTK_NFC) //NFC +#if 1//defined(CONFIG_MTK_NFC) //NFC retval = platform_device_register(&mtk_nfc_6605_dev); printk("mtk_nfc_6605_dev register ret %d", retval); if (retval != 0){ diff --git a/arch/arm/mach-mt8127/mt_idle.c b/arch/arm/mach-mt8127/mt_idle.c index 0a9872983ec..e7555769ae8 100644 --- a/arch/arm/mach-mt8127/mt_idle.c +++ b/arch/arm/mach-mt8127/mt_idle.c @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -626,7 +627,7 @@ static int dpidle_cpu_pdn = 1; static inline int dpidle_handler(int cpu) { int ret = 0; - if (idle_switch[IDLE_TYPE_DP]) { + if (idle_switch[IDLE_TYPE_DP] && !BMT_status.charger_exist) { if (dpidle_can_enter()) { spm_go_to_dpidle(dpidle_cpu_pdn, 0); ret = 1; @@ -734,7 +735,7 @@ static ssize_t soidle_state_store(struct kobject *kobj, char cmd[32]; int param; - if (sscanf(buf, "%s %d", cmd, ¶m) == 2) { + if (sscanf(buf, "%31s %d", cmd, ¶m) == 2) { if (!strcmp(cmd, "soidle")) idle_switch[IDLE_TYPE_SO] = param; else if (!strcmp(cmd, "enable")) @@ -798,7 +799,7 @@ static ssize_t dpidle_state_store(struct kobject *kobj, char cmd[32]; int param; - if (sscanf(buf, "%s %d", cmd, ¶m) == 2) { + if (sscanf(buf, "%31s %d", cmd, ¶m) == 2) { if (!strcmp(cmd, "dpidle")) idle_switch[IDLE_TYPE_DP] = param; else if (!strcmp(cmd, "enable")) @@ -857,7 +858,7 @@ static ssize_t slidle_state_store(struct kobject *kobj, char cmd[32]; int param; - if (sscanf(buf, "%s %d", cmd, ¶m) == 2) { + if (sscanf(buf, "%31s %d", cmd, ¶m) == 2) { if (!strcmp(cmd, "slidle")) idle_switch[IDLE_TYPE_SL] = param; else if (!strcmp(cmd, "enable")) @@ -896,14 +897,16 @@ static ssize_t rgidle_state_store(struct kobject *kobj, char cmd[32]; int param; - if (sscanf(buf, "%s %d", cmd, ¶m) == 2) { - if (!strcmp(cmd, "rgidle")) - idle_switch[IDLE_TYPE_RG] = param; + if (n <= 32) { + if (sscanf(buf, "%31s %d", cmd, ¶m) == 2) { + if (!strcmp(cmd, "rgidle")) + idle_switch[IDLE_TYPE_RG] = param; - return n; - } else if (sscanf(buf, "%d", ¶m) == 1) { - idle_switch[IDLE_TYPE_RG] = param; - return n; + return n; + } else if (sscanf(buf, "%d", ¶m) == 1) { + idle_switch[IDLE_TYPE_RG] = param; + return n; + } } return -EINVAL; @@ -961,7 +964,7 @@ static ssize_t idle_state_store(struct kobject *kobj, int idx; int param; - if (sscanf(buf, "%s %x", cmd, ¶m) == 2) { + if (sscanf(buf, "%31s %x", cmd, ¶m) == 2) { if (!strcmp(cmd, "switch")) { for (idx = 0; idx < NR_TYPES; idx++) { #ifndef SPM_SODI_ENABLED diff --git a/arch/arm/mach-mt8127/mt_pm_ldo.c b/arch/arm/mach-mt8127/mt_pm_ldo.c index c2a3c39ef5a..82d535428a1 100644 --- a/arch/arm/mach-mt8127/mt_pm_ldo.c +++ b/arch/arm/mach-mt8127/mt_pm_ldo.c @@ -66,22 +66,22 @@ bool hwPowerOn(MT65XX_POWER powerId, MT65XX_POWER_VOLTAGE powerVolt, char *mode_ g_MT_PMIC_BusHW.Power[j].dwPowerCount=0; } first_power_on_flag = 0; - xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] init done.\r\n"); + xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] init done.\n"); } #if 1 if(powerId >= MT65XX_POWER_COUNT_END) { - MSG(PMIC,"[MT65XX PMU] Error!! powerId is wrong\r\n"); + MSG(PMIC,"[MT65XX PMU] Error!! powerId is wrong\n"); return FALSE; } for (i = 0; i< MAX_DEVICE; i++) { - xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] %d,%s,%d\r\n", i, g_MT_PMIC_BusHW.Power[powerId].mod_name[i], g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); + xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] %d,%s,%d\n", i, g_MT_PMIC_BusHW.Power[powerId].mod_name[i], g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); if (!strcmp(g_MT_PMIC_BusHW.Power[powerId].mod_name[i], NON_OP)) { - MSG(PMIC,"[%s] acquire powerId:%d index:%d mod_name: %s powerVolt:%d\r\n", + MSG(PMIC,"[%s] acquire powerId:%d index:%d mod_name: %s powerVolt:%d\n", __FUNCTION__,powerId, i, mode_name,powerVolt); sprintf(g_MT_PMIC_BusHW.Power[powerId].mod_name[i] , "%s", mode_name); break ; @@ -90,7 +90,7 @@ bool hwPowerOn(MT65XX_POWER powerId, MT65XX_POWER_VOLTAGE powerVolt, char *mode_ #if 0 else if (!strcmp(g_MT_PMIC_BusHW.Power[powerId].mod_name[i], mode_name)) { - MSG(CG,"[%d] Power already register\r\n",powerId ); + MSG(CG,"[%d] Power already register\n",powerId ); } #endif } @@ -98,13 +98,13 @@ bool hwPowerOn(MT65XX_POWER powerId, MT65XX_POWER_VOLTAGE powerVolt, char *mode_ /* We've already enable this LDO before */ if(g_MT_PMIC_BusHW.Power[powerId].dwPowerCount > 1) { - xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] g_MT_PMIC_BusHW.Power[powerId].dwPowerCount (%d) > 1\r\n", g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); + xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] g_MT_PMIC_BusHW.Power[powerId].dwPowerCount (%d) > 1\n", g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); return TRUE; } #endif /* Turn on PMU LDO*/ - MSG(CG,"[%d] PMU LDO Enable\r\n",powerId ); - xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] enable %d by %s \r\n", powerId, mode_name); + MSG(CG,"[%d] PMU LDO Enable\n",powerId ); + xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] enable %d by %s \n", powerId, mode_name); if ((powerId == MT65XX_POWER_LDO_VMC) ||(powerId == MT65XX_POWER_LDO_VMCH) ||(powerId == MT65XX_POWER_LDO_VEMC_3V3) @@ -151,23 +151,23 @@ bool hwPowerDown(MT65XX_POWER powerId, char *mode_name) BOOL bFind = FALSE; if(powerId >= MT65XX_POWER_COUNT_END) { - MSG(PMIC,"%s:%s:%d powerId:%d is wrong\r\n",__FILE__,__FUNCTION__, + MSG(PMIC,"%s:%s:%d powerId:%d is wrong\n",__FILE__,__FUNCTION__, __LINE__ , powerId); return FALSE; } if(g_MT_PMIC_BusHW.Power[powerId].dwPowerCount == 0) { - MSG(PMIC,"%s:%s:%d powerId:%d (g_MT_PMIC_BusHW.dwPowerCount[powerId] = 0)\r\n", + MSG(PMIC,"%s:%s:%d powerId:%d (g_MT_PMIC_BusHW.dwPowerCount[powerId] = 0)\n", __FILE__,__FUNCTION__,__LINE__ ,powerId); return FALSE; } for (i = 0; i< MAX_DEVICE; i++) { - xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerDown] %d,%s,%d\r\n", i, g_MT_PMIC_BusHW.Power[powerId].mod_name[i], g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); + xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerDown] %d,%s,%d\n", i, g_MT_PMIC_BusHW.Power[powerId].mod_name[i], g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); if (!strcmp(g_MT_PMIC_BusHW.Power[powerId].mod_name[i], mode_name)) { - MSG(PMIC,"[%s] powerId:%d index:%d mod_name: %s\r\n", + MSG(PMIC,"[%s] powerId:%d index:%d mod_name: %s\n", __FUNCTION__,powerId, i, mode_name); sprintf(g_MT_PMIC_BusHW.Power[powerId].mod_name[i] , "%s", NON_OP); bFind = TRUE; @@ -176,19 +176,19 @@ bool hwPowerDown(MT65XX_POWER powerId, char *mode_name) } if(!bFind) { - MSG(PMIC,"[%s] Cannot find [%d] master is [%s]\r\n",__FUNCTION__,powerId, mode_name); + MSG(PMIC,"[%s] Cannot find [%d] master is [%s]\n",__FUNCTION__,powerId, mode_name); return TRUE; } g_MT_PMIC_BusHW.Power[powerId].dwPowerCount--; if(g_MT_PMIC_BusHW.Power[powerId].dwPowerCount > 0) { - xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerDown] g_MT_PMIC_BusHW.Power[powerId].dwPowerCount (%d) > 0\r\n", g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); + xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerDown] g_MT_PMIC_BusHW.Power[powerId].dwPowerCount (%d) > 0\n", g_MT_PMIC_BusHW.Power[powerId].dwPowerCount); return TRUE; } #endif /* Turn off PMU LDO*/ - MSG(CG,"[%d] PMU LDO Disable\r\n",powerId ); - xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerDown] disable %d by %s \r\n", powerId, mode_name); + MSG(CG,"[%d] PMU LDO Disable\n",powerId ); + xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerDown] disable %d by %s \n", powerId, mode_name); pmic_ldo_enable(powerId, KAL_FALSE); diff --git a/arch/arm/mach-mt8127/mt_sleep.c b/arch/arm/mach-mt8127/mt_sleep.c index ed1f584ed77..06d674c9694 100644 --- a/arch/arm/mach-mt8127/mt_sleep.c +++ b/arch/arm/mach-mt8127/mt_sleep.c @@ -153,6 +153,8 @@ static int slp_suspend_ops_prepare(void) static int slp_suspend_ops_enter(suspend_state_t state) { + int ret = 0; + /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_enter\n"); @@ -166,12 +168,12 @@ static int slp_suspend_ops_enter(suspend_state_t state) if (!spm_cpusys_can_power_down()) { slp_error("CANNOT SLEEP DUE TO CPU1/2/3 PON\n"); - return -EPERM; + ret = -EPERM; } if (slp_infra_pdn && !slp_cpu_pdn) { slp_error("CANNOT SLEEP DUE TO INFRA PDN BUT CPU PON\n"); - return -EPERM; + ret = -EPERM; } #if SLP_SLEEP_DPIDLE_EN @@ -181,7 +183,7 @@ static int slp_suspend_ops_enter(suspend_state_t state) #endif slp_wake_reason = spm_go_to_sleep(slp_cpu_pdn, slp_infra_pdn, slp_pwake_time); - return 0; + return ret; } static void slp_suspend_ops_finish(void) diff --git a/arch/arm/mach-mt8127/mt_spm_sleep.c b/arch/arm/mach-mt8127/mt_spm_sleep.c index 9cf916dda11..bbdb8d8b195 100644 --- a/arch/arm/mach-mt8127/mt_spm_sleep.c +++ b/arch/arm/mach-mt8127/mt_spm_sleep.c @@ -15,6 +15,7 @@ #include #include #include +#include /************************************** * only for internal debug @@ -29,6 +30,14 @@ #define SPM_BYPASS_SYSPWREQ 0 #endif +/* Added by haitaoy@amazon.com for AUSTINPLAT-1413. */ +static struct mt_wake_event spm_wake_event = { + .domain = "SPM", +}; + +static struct mt_wake_event *mt_wake_event_comm; +static struct mt_wake_event_map *mt_wake_event_tbl; + #ifndef MTK_ALPS_BOX_SUPPORT /********************************************************** * PCM code for suspend (v34rc10 @ 2013-07-11) @@ -832,11 +841,6 @@ static wake_reason_t spm_output_wake_reason(const wake_status_t *wakesta, bool d if (dpidle) /* bypass wakeup event check */ return WR_WAKE_SRC; - if((wakesta->event_reg & 0x100000) == 0) - { - spm_crit2("Sleep Abort!\n"); - } - if (wakesta->r12 & (1U << 0)) { if (!(wakesta->isr & ISR_TWAM) && !wakesta->cpu_wake) { strcat(str, "PCM_TIMER "); @@ -948,6 +952,11 @@ static wake_reason_t spm_output_wake_reason(const wake_status_t *wakesta, bool d strcat(str, "CPU3_IRQ "); wr = WR_WAKE_SRC; } + if ((wakesta->event_reg & 0x100000) == 0) + { + spm_crit2("Sleep Abort!\n"); + wr = WR_PCM_ABORT; + } if (wr == WR_NONE) { strcat(str, "UNKNOWN "); wr = WR_UNKNOWN; @@ -1024,6 +1033,121 @@ int spm_set_sleep_wakesrc(u32 wakesrc, bool enable, bool replace) return 0; } +/* Added by haitaoy@amazon.com for AUSTINPLAT-1413. */ +/**********************************************************************************/ +void spm_set_wakeup_event_map(struct mt_wake_event_map *tbl) +{ + mt_wake_event_tbl = tbl; +} + +static struct mt_wake_event_map *spm_map_wakeup_event(struct mt_wake_event *mt_we) +{ + /* map proprietary mt_wake_event to wake_source_t */ + struct mt_wake_event_map *tbl = mt_wake_event_tbl; + if (!tbl || !mt_we) + return NULL; + for (; tbl->domain; tbl++) { + if (!strcmp(tbl->domain, mt_we->domain) && tbl->code == mt_we->code) + return tbl; + } + return NULL; +} + +wakeup_event_t spm_read_wakeup_event_and_irq(int *pirq) +{ + struct mt_wake_event_map *tbl = + spm_map_wakeup_event(spm_get_wakeup_event()); + + if (!tbl) + return WEV_NONE; + + if (pirq) + *pirq = tbl->irq; + return tbl->we; +} +EXPORT_SYMBOL(spm_read_wakeup_event_and_irq); + +void spm_report_wakeup_event(struct mt_wake_event *we, int code) +{ + unsigned long flags; + struct mt_wake_event *head; + struct mt_wake_event_map *evt; + + static char *ev_desc[] = { + "RTC", "WIFI", "WAN", "USB", + "PWR", "HALL", "BT", "CHARGER", + }; + + spin_lock_irqsave(&spm_lock, flags); + head = mt_wake_event_comm; + mt_wake_event_comm = we; + we->parent = head; + we->code = code; + mt_wake_event_comm = we; + spin_unlock_irqrestore(&spm_lock, flags); + pr_err("%s: WAKE EVT: %s#%d (parent %s#%d)\n", + __func__, we->domain, we->code, + head ? head->domain : "NONE", + head ? head->code : -1); + evt = spm_map_wakeup_event(we); + if (evt && evt->we != WEV_NONE) { + char *name = (evt->we >= 0 && evt->we < ARRAY_SIZE(ev_desc)) + ? ev_desc[evt->we] : "UNKNOWN"; + pm_report_resume_irq(evt->irq); + pr_err("%s: WAKEUP from source %d [%s]\n", + __func__, evt->we, name); + } +} +EXPORT_SYMBOL(spm_report_wakeup_event); + +void spm_clear_wakeup_event(void) +{ + mt_wake_event_comm = NULL; +} +EXPORT_SYMBOL(spm_clear_wakeup_event); + +wakeup_event_t irq_to_wakeup_ev(int irq) +{ + struct mt_wake_event_map *tbl = mt_wake_event_tbl; + + if (!tbl) + return WEV_NONE; + + for (; tbl->domain; tbl++) { + if (tbl->irq == irq) + return tbl->we; + } + + return WEV_MAX; +} +EXPORT_SYMBOL(irq_to_wakeup_ev); + +struct mt_wake_event *spm_get_wakeup_event(void) +{ + return mt_wake_event_comm; +} +EXPORT_SYMBOL(spm_get_wakeup_event); + +static void spm_report_wake_source(u32 event_mask) +{ + int event = -1; + u32 mask = event_mask; + int event_count = 0; + while (mask && !event_count) { + event = __ffs(mask); + event_count++; + mask &= ~(1 << event); + } + + if (mask) + pr_err("%s: multiple wakeup events detected: %08X\n", + __func__, event_mask); + + if (event >= 0) + spm_report_wakeup_event(&spm_wake_event, event); +} +/**********************************************************************************/ + /* * cpu_pdn: * true = CPU shutdown @@ -1077,6 +1201,8 @@ wake_reason_t spm_go_to_sleep(bool cpu_pdn, bool infra_pdn, int pwake_time) goto RESTORE_IRQ; } + mt_wake_event_comm = NULL; + spm_init_pcm_register(); spm_init_event_vector(pcmdesc); @@ -1101,6 +1227,9 @@ RESTORE_IRQ: mt_irq_mask_restore(&mask); spin_unlock_irqrestore(&spm_lock, flags); + if ((last_wr == WR_WAKE_SRC) || (last_wr == WR_PCM_ABORT)) + spm_report_wake_source(wakesta.r12); + //spm_go_to_normal(); /* included in pcm_suspend */ if (!wd_ret) @@ -1216,6 +1345,8 @@ wake_reason_t spm_go_to_dpidle(bool cpu_pdn, u16 pwrlevel) const pcm_desc_t *pcmdesc = &pcm_dpidle; const bool pcmwdt_en = false; + aee_rr_rec_deepidle_val(0x1); + spin_lock_irqsave(&spm_lock, flags); mt_irq_mask_all(&mask); mt_irq_unmask_for_sleep(MT_SPM_IRQ_ID); @@ -1226,6 +1357,8 @@ wake_reason_t spm_go_to_dpidle(bool cpu_pdn, u16 pwrlevel) spm_kick_im_to_fetch(pcmdesc); + aee_rr_rec_deepidle_val(0x3); + if (spm_request_uart_to_sleep()) { wr = WR_UART_BUSY; goto RESTORE_IRQ; @@ -1243,8 +1376,12 @@ wake_reason_t spm_go_to_dpidle(bool cpu_pdn, u16 pwrlevel) spm_dpidle_before_wfi(); + aee_rr_rec_deepidle_val(0x7); + spm_trigger_wfi_for_dpidle(cpu_pdn); + aee_rr_rec_deepidle_val(0xF); + spm_dpidle_after_wfi(); spm_get_wakeup_status(&wakesta); @@ -1259,6 +1396,8 @@ RESTORE_IRQ: mt_irq_mask_restore(&mask); spin_unlock_irqrestore(&spm_lock, flags); + aee_rr_rec_deepidle_val(0x0); + return wr; } diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c index 3a9d608385c..d1800499571 100644 --- a/drivers/base/power/wakeup.c +++ b/drivers/base/power/wakeup.c @@ -15,11 +15,16 @@ #include #include #include +#include +#include +#include +#include +#include #include "power.h" -//#ifndef CONFIG_ARM64 -#if 1 + int wakeup_debug = 0; +module_param(wakeup_debug, int, 0644); #define _TAG_WAKEUP "WAKEUP" #define wakeup_log(fmt, ...) do { if (wakeup_debug) pr_info("[%s][%s]" fmt, _TAG_WAKEUP, __func__, ##__VA_ARGS__); } while (0) #define wakeup_warn(fmt, ...) do { if (wakeup_debug) pr_warn("[%s][%s]" fmt, _TAG_WAKEUP, __func__, ##__VA_ARGS__); } while (0) @@ -60,6 +65,13 @@ static LIST_HEAD(wakeup_sources); static DECLARE_WAIT_QUEUE_HEAD(wakeup_count_wait_queue); +static struct wakeup_event *wakeup_events; +static struct wakeup_event *last_wakeup_ev; +static unsigned total_wakeup_events = WEV_MAX; + +#define WAKE_ON_WIFI_TIMEOUT (1000) +static struct wakeup_source *wifi_ws; + /** * wakeup_source_prepare - Prepare a new wakeup source for initialization. * @ws: Wakeup source to prepare. @@ -685,6 +697,22 @@ void pm_wakeup_event(struct device *dev, unsigned int msec) } EXPORT_SYMBOL_GPL(pm_wakeup_event); +void pm_get_active_wakeup_sources(char *pending_wakeup_source, size_t max) +{ + struct wakeup_source *ws; + int len = 0; + rcu_read_lock(); + len += snprintf(pending_wakeup_source, max, "Pending Wakeup Sources: "); + list_for_each_entry_rcu(ws, &wakeup_sources, entry) { + if (ws->active) { + len += snprintf(pending_wakeup_source + len, max, + "%s ", ws->name); + } + } + rcu_read_unlock(); +} +EXPORT_SYMBOL_GPL(pm_get_active_wakeup_sources); + static void print_active_wakeup_sources(void) { struct wakeup_source *ws; @@ -694,7 +722,7 @@ static void print_active_wakeup_sources(void) rcu_read_lock(); list_for_each_entry_rcu(ws, &wakeup_sources, entry) { if (ws->active) { - pr_info("active wakeup source: %s\n", ws->name); + pr_warn("active wakeup source: %s\n", ws->name); active = 1; } else if (!active && (!last_activity_ws || @@ -705,7 +733,7 @@ static void print_active_wakeup_sources(void) } if (!active && last_activity_ws) - pr_info("last active wakeup source: %s\n", + pr_warn("last active wakeup source: %s\n", last_activity_ws->name); rcu_read_unlock(); } @@ -808,6 +836,132 @@ bool pm_save_wakeup_count(unsigned int count) return events_check_enabled; } +/** + * weak function for BSPs to map irq to wakeup_event_t + */ +__weak wakeup_event_t irq_to_wakeup_ev(int irq) +{ + return WEV_MAX; +} + +/** + * pm_rport_resume_ev - report a 'resume from suspend' event with it's + * corresponding irq. + * + * @ev : wakeup_event_t value corresponding to the event + * @irq : Interrupt number for the event + * + * Events can be of type {WEV_RTC, WEV_WIFI etc}. They can also be *not* listed + * in the wakeup_event_t enum. This function can record as much as 19 *unique* + * wakeup events and it will consolidate all other events into a single one at + * the end. If ev is >= EV_MAX, the mapping of irq to event depends on + * irq_to_wakeup_ev() function defined by the each arch. In future this may + * change and the function will be using the data extracted from a device tree + * node instead. For now, we allocate a new slot for every unique event, so we + * are not architecture dependant. We find the event name from its 'irq' for + * each unknown event. + * + * Absence of any locks is because this is exclusively supposed to be called + * from syscore_ops->resume() where all non-boot cpus are shutdown and local + * irqs are disabled. + * + */ +void pm_report_resume_ev(wakeup_event_t ev, int irq) +{ + struct wakeup_event *we = NULL; + int slot; + + if (unlikely(!wakeup_events)) + return; + + if (ev >= WEV_MAX) { + for (slot = ev; slot < WEV_TOTAL; slot++) { + if (wakeup_events[slot].irq == irq) { + we = &wakeup_events[slot]; + break; + } + } + } else { + we = &wakeup_events[ev]; + } + + /* This is a new event */ + if (!we) { + we = &wakeup_events[total_wakeup_events]; + total_wakeup_events = (total_wakeup_events < (WEV_TOTAL - 1)) ? + total_wakeup_events + 1 : + total_wakeup_events; + we->event = ev; + if (ev >= WEV_MAX) { + struct irq_desc *desc; + we->name = "null"; + + desc = irq_to_desc(irq); + if (desc == NULL) + we->name = "spurious"; + else if (desc->action && desc->action->name) + we->name = desc->action->name; + } + } + + BUG_ON(!we); + + we->event = ev; + we->last_time = ns_to_ktime(sched_clock()); + if (unlikely(!we->irq)) + we->irq = irq; + + if (!last_wakeup_ev || + (last_wakeup_ev && (last_wakeup_ev != we))) + we->count++; + + last_wakeup_ev = we; + +} +EXPORT_SYMBOL(pm_report_resume_ev); + +/** + * pm_rport_resume_irq - report a 'resume from suspend' irq. + * + * @irq : Interrupt number that caused the SoC to come out of power collapse + * + * This is a wrapper to pm_report_resume_ev(). The purpose is to allow + * architectures to start reporting resume irqs w/o having to define their own + * irq_to_wakeup_ev() + */ + +void pm_report_resume_irq(int irq) +{ + wakeup_event_t ev; + + if (unlikely(!wakeup_events)) + return; + + /* if arch doesn't know about this wakeup irq + * create a new entry and pickup the name from + * irq_desc->action->name + */ + ev = irq_to_wakeup_ev(irq); + if (ev == WEV_NONE) + ev = WEV_MAX; + + pm_report_resume_ev(ev, irq); +} +EXPORT_SYMBOL(pm_report_resume_irq); + +wakeup_event_t pm_get_resume_ev(ktime_t *ts) +{ + if (unlikely(!wakeup_events || !ts)) + return WEV_NONE; + + if (!last_wakeup_ev) + return WEV_NONE; + + *ts = last_wakeup_ev->last_time; + return last_wakeup_ev->event; +} +EXPORT_SYMBOL(pm_get_resume_ev); + #ifdef CONFIG_PM_AUTOSLEEP /** * pm_wakep_autosleep_enabled - Modify autosleep_enabled for all wakeup sources. @@ -837,6 +991,7 @@ void pm_wakep_autosleep_enabled(bool set) #endif /* CONFIG_PM_AUTOSLEEP */ static struct dentry *wakeup_sources_stats_dentry; +static struct dentry *wakeup_events_stats_dentry; /** * print_wakeup_source_stats - Print wakeup source statistics information. @@ -887,11 +1042,7 @@ static int print_wakeup_source_stats(struct seq_file *m, return ret; } -#endif -//#ifdef CONFIG_ARM64 -#if 1 -static struct dentry *wakeup_sources_stats_dentry; -#endif + /** * wakeup_sources_stats_show - Print wakeup sources statistics information. * @m: seq_file to print the statistics into. @@ -928,11 +1079,173 @@ static const struct file_operations wakeup_sources_stats_fops = { .release = single_release, }; +/** + * print_wakeup_events_stats - Print wakeup events statistics information. + * @m: seq_file to print the statistics into. + * @we: Wakeup event object to print the statistics for. + */ +static int print_wakeup_events_stats(struct seq_file *m, + struct wakeup_event *we) +{ + ktime_t now; + ktime_t awake_time, total_time; + + /* print only if there are actually wakeup events */ + if (we->count) { + now = ns_to_ktime(sched_clock()); + if (we != last_wakeup_ev) { + total_time = we->total_time; + } else { + awake_time = ktime_sub(now, we->last_time); + total_time = ktime_add(awake_time, we->total_time); + } + + return seq_printf(m, "%-12s\t%d\t%lu\t\t%lld\n", + we->name, we->irq, we->count, + ktime_to_ms(total_time)); + } + + return 0; +} + +/** + * wakeup_events_stats_show - Print wakeup events statistics information. + * @m: seq_file to print the statistics into. + */ +static int wakeup_events_stats_show(struct seq_file *m, void *unused) +{ + int i; + + seq_puts(m, "name\t\tirq\tevent_count\tawake_time\t\n"); + + for (i = 0; i <= total_wakeup_events; i++) + print_wakeup_events_stats(m, &wakeup_events[i]); + + return 0; +} + +static int wakeup_events_stats_open(struct inode *inode, struct file *file) +{ + return single_open(file, wakeup_events_stats_show, NULL); +} + + +static const struct file_operations wakeup_events_stats_fops = { + .owner = THIS_MODULE, + .open = wakeup_events_stats_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int wakeup_event_suspend(void) +{ + ktime_t now; + ktime_t awake_time; + + + if (likely(last_wakeup_ev)) { + now = ns_to_ktime(sched_clock()); + awake_time = ktime_sub(now, last_wakeup_ev->last_time); + last_wakeup_ev->total_time = + ktime_add(last_wakeup_ev->total_time, awake_time); + } + + last_wakeup_ev = NULL; + + return 0; +} + +static void wakeup_event_resume(void) +{ + /* Best Effort Wake-on-Wireless packet delivery to application in a + * single resume cycle. + * + * When the device gets woken up from suspend due to a packet delivery, + * there is still a chance that it may go back into suspend before the + * application got scheduled to receive this packet on it's socket. + * + * We cannot *guarantee* the delivery in a single resume cycle (the nw + * stack doesn't), so we are depending on the WiFi driver's rx wakelock + * to keep us out of suspend every time. + * + * Instead of relying on the WiFi driver, here we add a generic wakelock + * with 1s timeout to make sure we stay up atleast for a second before + * we go back into suspend, but *only* if the wakeup was due to a packet + * delivery. + * + * Needless to say, this still doesn't guarantee the packet delivery to + * the application, but this is the best we can do with a very + * slight/limited standby power impact. + * + * FIXME: ssp + */ + + if (last_wakeup_ev && WEV_WIFI == last_wakeup_ev->event) + __pm_wakeup_event(wifi_ws, WAKE_ON_WIFI_TIMEOUT); +} + + +static struct syscore_ops we_syscore_ops = { + .suspend = wakeup_event_suspend, + .resume = wakeup_event_resume, +}; + +static int __init wakeup_events_init(void) +{ + int i; + + wakeup_events = kzalloc(WEV_TOTAL * sizeof(*wakeup_events), + GFP_KERNEL); + if (!wakeup_events) { + pr_warn("%s: failed to allocated wakeup events\n", + __func__); + return -ENOMEM; + } + + /* Init known wakeup events */ + wakeup_events[WEV_RTC].name = "Rtc"; + wakeup_events[WEV_WIFI].name = "WiFi"; + wakeup_events[WEV_WAN].name = "Wan"; + wakeup_events[WEV_USB].name = "USB plug"; + wakeup_events[WEV_PWR].name = "Pon Key"; + wakeup_events[WEV_HALL].name = "Hall Sens"; + wakeup_events[WEV_BT].name = "BT"; + wakeup_events[WEV_CHARGER].name = "Charger"; + wakeup_events[WEV_TOTAL - 1].name = "Unknown (grp)"; + + for (i = WEV_RTC; i < WEV_MAX; i++) + wakeup_events[i].event = i; + + wifi_ws = wakeup_source_register("wake-on-wifi"); + + return 0; +} + static int __init wakeup_sources_debugfs_init(void) { wakeup_sources_stats_dentry = debugfs_create_file("wakeup_sources", S_IRUGO, NULL, NULL, &wakeup_sources_stats_fops); + + if (wakeup_events_init()) + goto out; + + wakeup_events_stats_dentry = debugfs_create_file("wakeup_events", + S_IRUGO, NULL, NULL, &wakeup_events_stats_fops); +out: + return 0; +} + +/* This is purposely done in late_initcall to ensure wakeup_event_resume gets + * called *after* timekeeping has resumed and we can safely kick a wakeup + * event without going into slowpath with irqs disabled + */ +static int __init wakeup_sources_syscore_init(void) +{ + register_syscore_ops(&we_syscore_ops); + return 0; } postcore_initcall(wakeup_sources_debugfs_init); +late_initcall(wakeup_sources_syscore_init); diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 4abf046e30b..16a9b93d605 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -653,4 +653,9 @@ config INPUT_XEN_KBDDEV_FRONTEND To compile this driver as a module, choose M here: the module will be called xen-kbdfront. +config INPUT_TEMPERATURE_TMP103 + bool "TMP103 temperature sensor support" + help + Support for TI Digital Temperature Sensor TMP103 + endif diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index 6b0e8a67772..0ae0e9bc686 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -62,3 +62,4 @@ obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o obj-$(CONFIG_INPUT_WM831X_ON) += wm831x-on.o obj-$(CONFIG_INPUT_XEN_KBDDEV_FRONTEND) += xen-kbdfront.o obj-$(CONFIG_INPUT_YEALINK) += yealink.o +obj-$(CONFIG_INPUT_TEMPERATURE_TMP103) += temperature/ diff --git a/drivers/input/misc/temperature/Makefile b/drivers/input/misc/temperature/Makefile new file mode 100644 index 00000000000..b1c47f84eb5 --- /dev/null +++ b/drivers/input/misc/temperature/Makefile @@ -0,0 +1,2 @@ + +obj-$(CONFIG_INPUT_TEMPERATURE_TMP103) += tmp103_temp_sensor.o diff --git a/drivers/input/misc/temperature/tmp103_temp_sensor.c b/drivers/input/misc/temperature/tmp103_temp_sensor.c new file mode 100755 index 00000000000..f73b2fa06df --- /dev/null +++ b/drivers/input/misc/temperature/tmp103_temp_sensor.c @@ -0,0 +1,479 @@ +/* + * tmp103 Temperature sensor driver file + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Steven King + * Author: Sabatier, Sebastien" + * Author: Mandrenko, Ievgen" + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define TMP103_TEMP_REG 0x00 +#define TMP103_CONF_REG 0x01 + +#define TMP103_CONF_M0 0x0001 +#define TMP103_CONF_M1 0x0002 +#define TMP103_CONF_LC 0x0004 +#define TMP103_CONF_FL 0x0008 +#define TMP103_CONF_FH 0x0010 +#define TMP103_CONF_CR0 0x0020 +#define TMP103_CONF_CR1 0x0040 +#define TMP103_CONF_ID 0x0080 + +#define TMP103_TLOW_REG 0x02 +#define TMP103_THIGH_REG 0x03 + +#define TMP103_SHUTDOWN 0x01 +#define TMP103_MAX_TEMP 127000 + +/* I2C device info */ +#define TMP103_I2C_DEV_BUS 2 +#define TMP103A_I2C_DEV_ADDRESS 0x70 +#define TMP103_I2C_BUS_CLK 400 + +/* + * omap_temp_sensor structure + * @iclient - I2c client pointer + * @dev - device pointer + * @sensor_mutex - Mutex for sysfs, irq and PM + * @therm_fw - thermal device + */ +struct tmp103_temp_sensor { + struct i2c_client *iclient; + struct device *dev; + struct mutex sensor_mutex; + struct thermal_dev *therm_fw; + u16 config_orig; + u16 config_current; + unsigned long last_update; + int temp[3]; + int debug_temp; +}; + +static inline int tmp103_read_reg(struct i2c_client *client, u8 reg) +{ + return i2c_smbus_read_byte_data(client, reg); +} + +static inline int tmp103_write_reg(struct i2c_client *client, u8 reg, u16 val) +{ + return i2c_smbus_write_byte_data(client, reg, val); +} + +static inline int tmp103_reg_to_mC(u8 val) +{ + /*Negative numbers */ + if (val & 0x80) { + val = ~val + 1; + return -(val * 1000); + } + return val * 1000; +} + +/* convert milliCelsius to 8-bit TMP103 register value */ +static inline u8 tmp103_mC_to_reg(int val) +{ + return (val / 1000); +} + +static const u8 tmp103_reg[] = { + TMP103_TEMP_REG, + TMP103_TLOW_REG, + TMP103_THIGH_REG, +}; + +static int tmp103_read_current_temp(struct device *dev) +{ + int index = 0; + struct i2c_client *client = to_i2c_client(dev); + struct tmp103_temp_sensor *tmp103 = i2c_get_clientdata(client); + + tmp103 = i2c_get_clientdata(client); + + mutex_lock(&tmp103->sensor_mutex); + if (time_after(jiffies, tmp103->last_update + HZ / 3)) { + int status = tmp103_read_reg(client, tmp103_reg[index]); + if (status > -1) + tmp103->temp[index] = tmp103_reg_to_mC(status); + tmp103->last_update = jiffies; + } + mutex_unlock(&tmp103->sensor_mutex); + + return tmp103->temp[index]; +} + +#define MAX_RETRY 5 /* retry count when PCB temp reading is 127 which could be a faulty read */ + +/* + * if tmp103_get_temp returns saved value stgraight 50 times, + * then return faulty one so system can thermal shutdown. + */ +#define MAX_FAULTY_RETURN_COUNT 50 +static int tmp103_get_temp(struct thermal_dev *tdev) +{ + struct platform_device *pdev = to_platform_device(tdev->dev); + struct tmp103_temp_sensor *tmp103 = platform_get_drvdata(pdev); + int current_temp; + static int saved_temp; + int count = 1; + struct i2c_client *client = tmp103->iclient; + static int fail_count; + + current_temp = tmp103_read_current_temp(tdev->dev); + + if (unlikely(current_temp >= TMP103_MAX_TEMP)) { + pr_info("TMP103 reads abnormal temperature %d", current_temp); + + /* switch to shutdown mode, then swtich back to previous mode ( contious conversion mode) */ + tmp103_write_reg(client, TMP103_CONF_REG, 0); /* shutdown mode: TMP103_CONF_M1=0, TMP103_CONF_M0=0 */ + tmp103_write_reg(client, TMP103_CONF_REG, tmp103->config_current); /* start conversion */ + + /* retry */ + do { + current_temp = tmp103_read_current_temp(tdev->dev); + pr_info("TMP103 reads temperature %d, retrying... %d ", current_temp, + count); + } while ((count++ < MAX_RETRY) + && (!current_temp || (current_temp >= TMP103_MAX_TEMP))); + } + + if (unlikely(current_temp >= TMP103_MAX_TEMP)) { + if (++fail_count > MAX_FAULTY_RETURN_COUNT) { + pr_info("FATAL: TMP103 locked down, return faulty temperature %d," + " system will shutdown....", current_temp); + tmp103->therm_fw->current_temp = current_temp; + return tmp103->therm_fw->current_temp; + } + current_temp = saved_temp; + pr_info("WARNING: TMP103 retry failed, return last saved temperature %d", + saved_temp); + } else { /* less than TMP103_MAX_TEMP read */ + fail_count = 0; + saved_temp = current_temp; + } + tmp103->therm_fw->current_temp = current_temp; + + saved_temp = current_temp; + return tmp103->therm_fw->current_temp; +} + +/* + * sysfs hook functions + */ +static ssize_t tmp103_show_temp_user_space(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tmp103_temp_sensor *tmp103 = i2c_get_clientdata(client); + + return sprintf(buf, "%d\n", tmp103->debug_temp); +} + +static ssize_t tmp103_set_temp_user_space(struct device *dev, + struct device_attribute *devattr, const char *buf, + size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tmp103_temp_sensor *tmp103 = i2c_get_clientdata(client); + long val; + + if (strict_strtol(buf, 10, &val)) { + count = -EINVAL; + goto out; + } + + /* Set new temperature */ + tmp103->debug_temp = val; + + tmp103->therm_fw->current_temp = val; + /* Send a kobj_change */ + kobject_uevent(&tmp103->dev->kobj, KOBJ_CHANGE); + + out: + return count; +} + +static int tmp103_temp_sensor_read_temp(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int temp = tmp103_read_current_temp(dev); + + return sprintf(buf, "%d\n", temp); +} + +static int tmp103_temp_sensor_show_params(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tmp103_temp_sensor *tmp103 = i2c_get_clientdata(client); + + return sprintf(buf, "offset=%d alpha=%d weight=%d\n", + tmp103->therm_fw->tdp->offset, + tmp103->therm_fw->tdp->alpha, + tmp103->therm_fw->tdp->weight); +} + +static ssize_t tmp103_temp_sensor_set_params(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tmp103_temp_sensor *tmp103 = i2c_get_clientdata(client); + + char param[20]; + int value = 0; + + if (sscanf(buf, "%s %d", param, &value) == 2) { + if (!strcmp(param, "offset")) + tmp103->therm_fw->tdp->offset = value; + if (!strcmp(param, "alpha")) + tmp103->therm_fw->tdp->alpha = value; + if (!strcmp(param, "weight")) + tmp103->therm_fw->tdp->weight = value; + return count; + } + return -EINVAL; +} + +static DEVICE_ATTR(debug_user, S_IWUSR | S_IRUGO, tmp103_show_temp_user_space, + tmp103_set_temp_user_space); +static DEVICE_ATTR(temp1_input, S_IRUGO, tmp103_temp_sensor_read_temp, NULL); +static DEVICE_ATTR(params, S_IRUGO | S_IWUSR, tmp103_temp_sensor_show_params, + tmp103_temp_sensor_set_params); + +static struct attribute *tmp103_temp_sensor_attributes[] = { + &dev_attr_temp1_input.attr, + &dev_attr_debug_user.attr, + &dev_attr_params.attr, + NULL +}; + +static const struct attribute_group tmp103_temp_sensor_attr_group = { + .attrs = tmp103_temp_sensor_attributes, +}; + +static struct thermal_dev_ops tmp103_temp_sensor_ops = { + .get_temp = tmp103_get_temp, +}; + +struct thermal_dev_params tmp103_tdp = { + .offset = 0, + .alpha = 1000, + .weight = 250 +}; + +static int tmp103_temp_sensor_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct tmp103_temp_sensor *tmp103; + int ret = 0; + int new; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA)) { + dev_err(&client->dev, "adapter doesn't support SMBus word " "transactions\n"); + + return -ENODEV; + } + + tmp103 = kzalloc(sizeof(struct tmp103_temp_sensor), GFP_KERNEL); + if (!tmp103) + return -ENOMEM; + + mutex_init(&tmp103->sensor_mutex); + + tmp103->iclient = client; + tmp103->dev = &client->dev; + + kobject_uevent(&client->dev.kobj, KOBJ_ADD); + i2c_set_clientdata(client, tmp103); + + ret = tmp103_read_reg(client, TMP103_CONF_REG); + if (ret < 0) { + dev_err(&client->dev, "error reading config register\n"); + goto free_err; + } + tmp103->config_orig = ret; + + /* continuous conversions, M1=1, so no need to clear */ + /* Conversion rate settings */ + /* By default, it is set to 4s. Align it to 250ms as used on TI mainline. */ + new = ret & ~0x62; + new |= 0x42; + + if (ret != new) { + ret = tmp103_write_reg(client, TMP103_CONF_REG, new); + if (ret < 0) { + dev_err(&client->dev, "error writing config register\n"); + goto restore_config_err; + } + } + + tmp103->config_current = new; + tmp103->last_update = jiffies - HZ; + mutex_init(&tmp103->sensor_mutex); + + ret = sysfs_create_group(&client->dev.kobj, &tmp103_temp_sensor_attr_group); + if (ret) + goto sysfs_create_err; + + tmp103->therm_fw = kzalloc(sizeof(struct thermal_dev), GFP_KERNEL); + if (tmp103->therm_fw) { + tmp103->therm_fw->name = TMP103_SENSOR_NAME; + tmp103->therm_fw->dev = tmp103->dev; + tmp103->therm_fw->dev_ops = &tmp103_temp_sensor_ops; + tmp103->therm_fw->tdp = &tmp103_tdp; +#ifdef CONFIG_VS_THERMAL + ret = thermal_dev_register(tmp103->therm_fw); + if (ret) { + dev_err(&client->dev, "error registering therml device\n"); + goto sysfs_create_err; + } +#endif + } else { + ret = -ENOMEM; + goto therm_fw_alloc_err; + } + + dev_info(&client->dev, "initialized\n"); + + return 0; + + sysfs_create_err: + kfree(tmp103->therm_fw); + restore_config_err: + tmp103_write_reg(client, TMP103_CONF_REG, tmp103->config_orig); + therm_fw_alloc_err: + free_err: + mutex_destroy(&tmp103->sensor_mutex); + kfree(tmp103); + + return ret; +} + +static int tmp103_temp_sensor_remove(struct i2c_client *client) +{ + struct tmp103_temp_sensor *tmp103 = i2c_get_clientdata(client); + + sysfs_remove_group(&client->dev.kobj, &tmp103_temp_sensor_attr_group); + + tmp103_write_reg(client, TMP103_CONF_REG, tmp103->config_orig); + kfree(tmp103); + + return 0; +} + +static void tmp103_shutdown(struct i2c_client *client) +{ + /* Nothing to do, since the voltage regulator is on by HW */ +} + +#if 0 /* TTX-3425: temporarily disable TMP103 suspend/resume functions */ +/* #ifdef CONFIG_PM */ +static int tmp103_temp_sensor_suspend(struct i2c_client *client, pm_message_t mesg) +{ + int conf = tmp103_read_reg(client, TMP103_CONF_REG); + + if (conf < 0) + return conf; + conf |= TMP103_SHUTDOWN; + + return tmp103_write_reg(client, TMP103_CONF_REG, conf); +} + +static int tmp103_temp_sensor_resume(struct i2c_client *client) +{ + int conf = tmp103_read_reg(client, TMP103_CONF_REG); + + if (conf < 0) + return conf; + conf &= ~TMP103_SHUTDOWN; + + return tmp103_write_reg(client, TMP103_CONF_REG, conf); +} + +#else + +#define tmp103_temp_sensor_suspend NULL +#define tmp103_temp_sensor_resume NULL + +#endif /* CONFIG_PM */ + +static const struct i2c_device_id tmp103_id[] = { + {"tmp103_temp_sensor", 0}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, tmp103_id); + +static struct i2c_driver tmp103_driver = { + .class = I2C_CLASS_HWMON, + .probe = tmp103_temp_sensor_probe, + .remove = tmp103_temp_sensor_remove, + .suspend = tmp103_temp_sensor_suspend, + .resume = tmp103_temp_sensor_resume, + .driver = { + .name = "tmp103_temp_sensor", + }, + .id_table = tmp103_id, + .shutdown = tmp103_shutdown, +}; + +static struct i2c_board_info tmp103a_board_info __initdata = { + I2C_BOARD_INFO("tmp103_temp_sensor", TMP103A_I2C_DEV_ADDRESS), +}; + +static int __init tmp103_init(void) +{ + i2c_register_board_info(TMP103_I2C_DEV_BUS, &tmp103a_board_info, 1); + return i2c_add_driver(&tmp103_driver); +} +module_init(tmp103_init); + +static void __exit tmp103_exit(void) +{ + i2c_del_driver(&tmp103_driver); +} +module_exit(tmp103_exit); + +MODULE_DESCRIPTION("OMAP44XX tmp103 Temperature Sensor Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRIVER_NAME); +MODULE_AUTHOR("Texas Instruments Inc"); diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index f633b9834df..8318ec024d6 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -73,3 +73,6 @@ obj-$(CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE) += mainstone-wm97xx.o obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE) += zylonite-wm97xx.o obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o +obj-y += gsl_point_id.o +$(obj)/gsl_point_id.o: $(srctree)/$(obj)/gsl_point_id + cp $(srctree)/$(obj)/gsl_point_id $(obj)/gsl_point_id.o diff --git a/drivers/input/touchscreen/gsl_point_id b/drivers/input/touchscreen/gsl_point_id new file mode 100644 index 00000000000..18338146811 Binary files /dev/null and b/drivers/input/touchscreen/gsl_point_id differ diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 75a5eb3ee4c..3b3df91122b 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -461,7 +461,7 @@ config ARM_CHARLCD still useful. config BMP085 - tristate + bool depends on SYSFS config BMP085_I2C diff --git a/drivers/misc/ad525x_dpot.c b/drivers/misc/ad525x_dpot.c index beb7422c3cc..8f99e8e3f0a 100644 --- a/drivers/misc/ad525x_dpot.c +++ b/drivers/misc/ad525x_dpot.c @@ -216,7 +216,7 @@ static s32 dpot_read_i2c(struct dpot_data *dpot, u8 reg) */ value = swab16(value); - if (dpot->uid == DPOT_UID(AD5274_ID)) + if (dpot->uid == DPOT_UID(AD5271_ID)) value = value >> 2; return value; default: diff --git a/drivers/misc/c2port/c2port-duramar2150.c b/drivers/misc/c2port/c2port-duramar2150.c index 3dc61ea7dc6..5484301d57d 100644 --- a/drivers/misc/c2port/c2port-duramar2150.c +++ b/drivers/misc/c2port/c2port-duramar2150.c @@ -129,8 +129,8 @@ static int __init duramar2150_c2port_init(void) duramar2150_c2port_dev = c2port_device_register("uc", &duramar2150_c2port_ops, NULL); - if (IS_ERR(duramar2150_c2port_dev)) { - ret = PTR_ERR(duramar2150_c2port_dev); + if (!duramar2150_c2port_dev) { + ret = -ENODEV; goto free_region; } diff --git a/drivers/misc/mediatek/Kconfig b/drivers/misc/mediatek/Kconfig index b2d7a9553c9..63ee0575fc8 100644 --- a/drivers/misc/mediatek/Kconfig +++ b/drivers/misc/mediatek/Kconfig @@ -11,6 +11,9 @@ config MTK_PLATFORM config ARCH_MTK_PROJECT string "MTK project name" +config AUSTIN_PROJECT + bool "amazon project name" + config MTK_INTERNAL bool "Enable MTK internal debug feature" help @@ -399,19 +402,11 @@ config MTK_TC1_FEATURE bool "MTK_TC1_FEATURE" default n -config MTK_COMBO_AOSP_TETHERING_SUPPORT - bool "Multiplex wlan0 for both AP and STA" - default n - -config MTK_USE_DRVGEN - bool "use drvgen" - default n - source "drivers/misc/mediatek/Kconfig.kernel" source "drivers/misc/mediatek/Kconfig.drivers" source "drivers/misc/mediatek/smartpa/Kconfig" - +source "drivers/misc/mediatek/cpu_stress/Kconfig" source "drivers/misc/mediatek/lastpc/Kconfig" source "drivers/misc/mediatek/fmradio/Kconfig" source "drivers/misc/mediatek/hwmon/Kconfig" @@ -422,7 +417,6 @@ source "drivers/misc/mediatek/conn_md/Kconfig" source "drivers/misc/mediatek/lens/Kconfig" source "drivers/misc/mediatek/imgsensor/Kconfig" source "drivers/misc/mediatek/flashlight/Kconfig" -source "drivers/misc/mediatek/dum-char/Kconfig" source "drivers/misc/mediatek/sysenv/Kconfig" source "drivers/misc/mediatek/smi/Kconfig" source "drivers/misc/mediatek/btcvsd/Kconfig" diff --git a/drivers/misc/mediatek/Kconfig.drivers b/drivers/misc/mediatek/Kconfig.drivers index efc7bc53cbd..e5f18ae91ac 100644 --- a/drivers/misc/mediatek/Kconfig.drivers +++ b/drivers/misc/mediatek/Kconfig.drivers @@ -778,6 +778,12 @@ config MTK_MLC_NAND_SUPPORT depends on MTK_MTD_NAND ---help--- Enables support for MLC NAND. + +config MTK_COMBO_NAND_SUPPORT + tristate "Mediatek COMBO NAND Support" + depends on MTK_MTD_NAND + ---help--- + Enables support for COMBO NAND. # Power Related if POWER_SUPPLY @@ -855,6 +861,12 @@ config X2_BQ27531_SUPPORT bool "X2_BQ27531 support" default n +config MTK_AUTO_POWER_ON_WITH_CHARGER + bool "Device auto boot into android when charger plug-in" + default n + help + Auto boot into android when charger in + config MTK_BQ24250_SUPPORT bool "MediaTek Battery driver for BQ24250" default n @@ -892,6 +904,12 @@ config MTK_BQ24296_SUPPORT BQ24296 charger IC support Yes to support bq24296 No to not support bq24296 +config MTK_SN2871_SUPPORT + bool "MTK_SN2871_SUPPORT" + help + SN2871 charger IC support Yes to support sn2871 No to not + support sn2871 + config MTK_BQ27541_SUPPORT bool "MTK_BQ27541_SUPPORT" help @@ -1079,6 +1097,18 @@ config MTK_BMA250 bool "Accelerometer BMA250 for MediaTek package" default n +config MTK_BMA253 + bool "Accelerometer BMA253 for MediaTek package" + default n + +config MTK_MC3410 + bool "Accelerometer MC3410 for MediaTek package" + default n + +config MTK_HALL_SENSOR + bool "HALL Sensor BU52013 for MediaTek Package" + default n + config MTK_MPU6515A bool "MPU6515A for MediaTek package" default n @@ -1095,14 +1125,6 @@ config MTK_BMA056 bool "MTK_BMA056 for MediaTek package" default n -config MTK_BMA2XX - bool "BMA2XX for MediaTek package" - default n - -config MTK_HALL - bool "Hall sensor for MediaTek package" - default n - # Gyro sensor config MTK_MPU3050C bool "MPU3050C for MediaTek package" @@ -1572,6 +1594,15 @@ config MTK_KERNEL_POWER_OFF_CHARGING kernel and charging animation by IPO service. no: not support KPOC feature, and power off charging would running by lk. +config MTK_BATTERY_LIFETIME_DATA_SUPPORT + bool "Enable Battery LifeTime Data Logging" + help + This config is to log battery related info. + Set yes and it would keep max/min voltage, + max/min charging current, max/min battery + temperature, etc. + default n + config MTK_BQ24160_SUPPORT bool "MTK_BQ24160_SUPPORT" help @@ -1601,11 +1632,6 @@ config MTK_MT8193_HDCP_SUPPORT help Enable hdmi tx hdcp support -config MTK_HDMI_HDCP_SUPPORT - bool "MTK_HDMI_HDCP_SUPPORT" - help - Enable hdmi tx hdcp support - config CUSTOM_KERNEL_HDMI string "CUSTOM_KERNEL_HDMI" help @@ -1634,12 +1660,6 @@ config MTK_THERMAL_PA_VIA_ATCMD Internal switch for thermal management to query modem RF temperature via AT command. -config MTK_COMBO_NAND_SUPPORT - bool "MTK_COMBO_NAND_SUPPORT" - depends on MTK_MTD_NAND && !MTK_EMMC_SUPPORT - help - To support different NAND page size on the same load - config MTK_UMTS_TDD128_MODE bool "MTK_UMTS_TDD128_MODE" help diff --git a/drivers/misc/mediatek/Kconfig.kernel b/drivers/misc/mediatek/Kconfig.kernel index 4db9c0a1fae..aca578a4844 100644 --- a/drivers/misc/mediatek/Kconfig.kernel +++ b/drivers/misc/mediatek/Kconfig.kernel @@ -339,18 +339,6 @@ config MTK_TABLET_HARDWARE help MTM tablet machine name -config GATOR_DRIVER - tristate "DS-5 profiling tool kernel driver" - default n - depends on PROFILING - depends on HIGH_RES_TIMERS - depends on LOCAL_TIMERS || !(ARM && SMP) - depends on PERF_EVENTS - depends on HW_PERF_EVENTS || !(ARM || ARM64) - select TRACING - help - kernel driver of DS-5 profiling tool - config MTK_IPV6_TETHER_NDP_MODE bool "MTK_IPV6_TETHER_NDP_MODE" help diff --git a/drivers/misc/mediatek/Makefile b/drivers/misc/mediatek/Makefile old mode 100644 new mode 100755 index 77d310e3382..29742d9b367 --- a/drivers/misc/mediatek/Makefile +++ b/drivers/misc/mediatek/Makefile @@ -69,13 +69,6 @@ endif obj-$(CONFIG_MTK_WFD_SUPPORT) += uibc/ -ifneq ($(CONFIG_GATOR_DRIVER),) - ifneq ($(wildcard $(srctree)/$(src)/gator-driver/),) - obj-$(CONFIG_GATOR_DRIVER) += gator-driver/ - endif -endif - - obj-$(CONFIG_MTK_XHCI) += xhci/ #obj-y += hdmitx/ @@ -101,10 +94,6 @@ obj-$(CONFIG_CUSTOM_KERNEL_ACCELEROMETER) += accelerometer/ obj-$(CONFIG_CUSTOM_KERNEL_GYROSCOPE) += gyroscope/ obj-$(CONFIG_CUSTOM_KERNEL_MAGNETOMETER) += magnetometer/ obj-$(CONFIG_CUSTOM_KERNEL_BAROMETER) += barometer/ -#/*[PLATFORM]-ADD-BEIGIN by falin.luo 2015.4.17*/ -#add hall sensor support -obj-$(CONFIG_MTK_HALL) += hall/ -#/*[PLATFORM]-ADD-END by falin.luo 2015.4.17*/ ifneq ($(CONFIG_CUSTOM_KERNEL_SENSORHUB),"") obj-y += sensorHub/ @@ -148,7 +137,7 @@ endif endif #obj-y += matv/ #obj-y += touchpanel/ -# +#obj-y += cpu_stress/ obj-$(CONFIG_MTK_VOW_SUPPORT) += vow/ @@ -200,7 +189,6 @@ endif obj-y += accdet/ obj-y += keypad/ -obj-$(CONFIG_MTK_DUM_CHAR) += dum-char/ obj-$(CONFIG_MTK_SYSENV) += sysenv/ ifdef CONFIG_CUSTOM_KERNEL_SSW @@ -227,7 +215,6 @@ ifneq (,$(filter $(CONFIG_MTK_PLATFORM), "mt6572" "mt6582" "mt6592" "mt6595" "mt obj-y += masp/ endif obj-$(CONFIG_MTK_MMC) += mmc-host/ -obj-$(CONFIG_MTK_MMC) += pmt/ obj-$(CONFIG_MTK_MTD_NAND) += nand/ obj-$(CONFIG_MTK_GPT_SCHEME_SUPPORT) += partition/ obj-$(CONFIG_MTK_SOUND) += smartpa/ @@ -254,7 +241,7 @@ obj-$(CONFIG_USB_MU3D_DRV) += mu3phy/ obj-$(CONFIG_MTK_TEST_XHCI) += xhci_test/ -obj-y += vibrator/ +obj-$(CONFIG_MTK_VIBRATOR) += vibrator/ obj-y += wdt/ obj-y += freqhopping/ obj-y += selinux_warning/ @@ -284,7 +271,7 @@ obj-$(CONFIG_MTK_SCHED_CMP_POWER_AWARE_CONTROLLER) += pa/ obj-$(CONFIG_HMP_POWER_AWARE_CONTROLLER) += pa_hmp/ #widevine drm -#$(warning "CONFIG_TRUSTONIC_TEE_SUPPORT = $(CONFIG_TRUSTONIC_TEE_SUPPORT)") +$(warning "CONFIG_TRUSTONIC_TEE_SUPPORT = $(CONFIG_TRUSTONIC_TEE_SUPPORT)") obj-$(CONFIG_TRUSTONIC_TEE_SUPPORT) += secwidevine/ obj-$(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) += trustzone/ @@ -294,3 +281,6 @@ obj-$(CONFIG_PWR_LOSS_MTK_TEST) += power-loss-test/ endif # end of CONFIG_ARCH_MT6735 endif # end of CONFIG_ARCH_MT6795 + +obj-y += dynamic_boost/ +obj-y += hwinfo/ diff --git a/drivers/misc/mediatek/Makefile.custom b/drivers/misc/mediatek/Makefile.custom index eca752973de..b8ed3ec3433 100644 --- a/drivers/misc/mediatek/Makefile.custom +++ b/drivers/misc/mediatek/Makefile.custom @@ -19,10 +19,27 @@ MTK_PLATFORM_PATH_ROOT := $(srctree)/drivers/misc/mediatek/mach/$(MTK_PLATFORM) MTK_PROJECT_PATH_ROOT := $(srctree)/drivers/misc/mediatek/mach/$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT) endif -ifneq ($(CONFIG_MTK_USE_DRVGEN),y) -DRVGEN_OUT := $(MTK_PROJECT_PATH_ROOT)/dct/dct -endif - +ifeq ($(CONFIG_AUSTIN_PROJECT),y) +ccflags-y += -I$(MTK_PLATFORM_PATH_ROOT)/include \ + -I$(MTK_PLATFORM_PATH_ROOT)/include/mach \ + -I$(MTK_PROJECT_PATH_ROOT)/accdet \ + -I$(MTK_PROJECT_PATH_ROOT)/core \ + -I$(MTK_PROJECT_PATH_ROOT)/camera/camera \ + -I$(MTK_PROJECT_PATH_ROOT)/common \ + -I$(MTK_PROJECT_PATH_ROOT)/dct/dct_austin \ + -I$(srctree)/arch/arm//mach-$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT)/dct/dct_austin \ + -I$(MTK_PROJECT_PATH_ROOT)/hdmi \ + -I$(MTK_PROJECT_PATH_ROOT)/imgsensor/inc \ + -I$(MTK_PROJECT_PATH_ROOT)/keypad \ + -I$(MTK_PROJECT_PATH_ROOT)/leds/mt65xx \ + -I$(MTK_PROJECT_PATH_ROOT)/power \ + -I$(MTK_PROJECT_PATH_ROOT)/rtc \ + -I$(MTK_PROJECT_PATH_ROOT)/sound/inc \ + -I$(MTK_PROJECT_PATH_ROOT)/touchpanel/ft5406_82 \ + -I$(MTK_PROJECT_PATH_ROOT)/vibrator \ + -I$(DRVGEN_OUT)/inc \ + -I$(MTK_PROJECT_PATH_ROOT)/multibridge/mt8193/inc +else ccflags-y += -I$(MTK_PLATFORM_PATH_ROOT)/include \ -I$(MTK_PLATFORM_PATH_ROOT)/include/mach \ -I$(MTK_PROJECT_PATH_ROOT)/accdet \ @@ -30,6 +47,7 @@ ccflags-y += -I$(MTK_PLATFORM_PATH_ROOT)/include \ -I$(MTK_PROJECT_PATH_ROOT)/camera/camera \ -I$(MTK_PROJECT_PATH_ROOT)/common \ -I$(MTK_PROJECT_PATH_ROOT)/dct/dct \ + -I$(srctree)/arch/arm//mach-$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT)/dct/dct \ -I$(MTK_PROJECT_PATH_ROOT)/hdmi \ -I$(MTK_PROJECT_PATH_ROOT)/imgsensor/inc \ -I$(MTK_PROJECT_PATH_ROOT)/keypad \ @@ -41,7 +59,7 @@ ccflags-y += -I$(MTK_PLATFORM_PATH_ROOT)/include \ -I$(MTK_PROJECT_PATH_ROOT)/vibrator \ -I$(DRVGEN_OUT)/inc \ -I$(MTK_PROJECT_PATH_ROOT)/multibridge/mt8193/inc - +endif ccflags-y += -I$(MTK_CUSTOM_PATH)/accdet/$(MTK_PLATFORM) \ -I$(MTK_CUSTOM_PATH)/accelerometer/inc \ -I$(MTK_CUSTOM_PATH)/alsps/inc \ @@ -74,8 +92,6 @@ ccflags-y += -I$(MTK_CUSTOM_PATH)/accdet/$(MTK_PLATFORM) \ -I$(MTK_CUSTOM_PATH)/leds/$(MTK_PLATFORM) \ -I$(MTK_CUSTOM_PATH)/lens/inc \ -I$(MTK_CUSTOM_PATH)/magnetometer/inc \ - -I$(MTK_CUSTOM_PATH)/met/platform/$(MTK_PLATFORM) \ - -I$(MTK_CUSTOM_PATH)/met/$(MTK_PLATFORM) \ -I$(MTK_CUSTOM_PATH)/sensorHub/inc \ -I$(MTK_CUSTOM_PATH)/smi/$(MTK_PLATFORM) \ -I$(MTK_CUSTOM_PATH)/ssw/inc \ diff --git a/drivers/misc/mediatek/accdet/mt8127/accdet.c b/drivers/misc/mediatek/accdet/mt8127/accdet.c index a7335ea9188..65c8dc1ba82 100644 --- a/drivers/misc/mediatek/accdet/mt8127/accdet.c +++ b/drivers/misc/mediatek/accdet/mt8127/accdet.c @@ -7,6 +7,10 @@ #include +#define EARPHONE_SWITCH +#define GPIO_HEADSET_SWITCH1 GPIO87 +#define GPIO_HEADSET_SWITCH2 GPIO90 + #define SW_WORK_AROUND_ACCDET_REMOTE_BUTTON_ISSUE #define DEBUG_THREAD 1 @@ -351,6 +355,27 @@ static void disable_micbias_callback(struct work_struct *work) #endif } +#define ACCDET_ADC_CHANNEL (8) +#define ADC_BOARD_ID (15) +static int board_voltage; + +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int *rawdata); +static int get_board_voltage(void) +{ + int data[4]; + int voltage = 0; + int ret = 0; + + ret = IMM_GetOneChannelValue(ADC_BOARD_ID, data, &voltage); + if (0 != ret) { + ACCDET_DEBUG("init_board_voltage get ADC error: %d\n", ret); + return 0; + } + board_voltage = (voltage*1500)/4096; + ACCDET_DEBUG("board_voltage = %d mv\n", board_voltage); + +} + static void accdet_eint_work_callback(struct work_struct *work) { #ifndef MTK_ALPS_BOX_SUPPORT @@ -364,6 +389,9 @@ static void accdet_eint_work_callback(struct work_struct *work) eint_accdet_sync_flag = 1; mutex_unlock(&accdet_eint_irq_sync_mutex); #ifdef ACCDET_LOW_POWER + #ifdef CONFIG_AUSTIN_PROJECT + mod_timer(&micbias_timer, jiffies + MICBIAS_DISABLE_TIMER); + #endif wake_lock_timeout(&accdet_timer_lock, 7*HZ); #endif #ifdef ACCDET_28V_MODE @@ -392,7 +420,48 @@ static void accdet_eint_work_callback(struct work_struct *work) pmic_pwrap_write(ACCDET_STATE_SWCTRL, (pmic_pwrap_read(ACCDET_STATE_SWCTRL)|ACCDET_SWCTRL_IDLE_EN)); #endif //enable ACCDET unit - enable_accdet(ACCDET_SWCTRL_EN); + enable_accdet(ACCDET_SWCTRL_EN); + #if defined(EARPHONE_SWITCH) + msleep(60); + int accdet_adc = 0; + int i = 0; + int arr[10] = {0}; + accdet_auxadc_switch(1); + for (i = 0; i < 10; i++) { + arr[i] = PMIC_IMM_GetOneChannelValue(ACCDET_ADC_CHANNEL, 1, 1); + printk("accdet_voltage arr[%d]=%d\n", i, arr[i]); + } + accdet_auxadc_switch(0); + accdet_adc = (arr[4] + arr[5] + arr[6] + arr[7])/4; + ACCDET_DEBUG("accdet_voltage = %d mv, board_voltage = %d mv\n", accdet_adc, board_voltage); + #if defined(CONFIG_AUSTIN_PROJECT) + if (accdet_adc > 550) { + ACCDET_DEBUG("[Accdet] ctia headset!!!\n"); + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ONE); + } else { + ACCDET_DEBUG("[Accdet] omtp headset!!!\n"); + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ONE); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ZERO); + } + #else + if (board_voltage > 570) { + if (accdet_adc > 550) { + ACCDET_DEBUG("[Accdet] ctia headset!!!\n"); + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ONE); + } else { + ACCDET_DEBUG("[Accdet] omtp headset!!!\n"); + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ONE); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ZERO); + } + } else { + ACCDET_DEBUG("[Accdet] ---HVT EVT1.0 board--- ctia headset!!!\n"); + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ONE); + } + #endif + #endif } else { //EINT_PIN_PLUG_OUT //Disable ACCDET @@ -416,6 +485,10 @@ static void accdet_eint_work_callback(struct work_struct *work) accdet_auxadc_switch(0); disable_accdet(); headset_plug_out(); + #if defined(EARPHONE_SWITCH) + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ONE); + #endif #ifdef ACCDET_28V_MODE pmic_pwrap_write(ACCDET_RSV, ACCDET_1V9_MODE_OFF); ACCDET_DEBUG("ACCDET use in 1.9V mode!! \n"); @@ -480,13 +553,13 @@ static void accdet_eint_func(void) #ifdef ACCDET_LOW_POWER //INIT the timer to disable micbias. - +#ifndef CONFIG_AUSTIN_PROJECT init_timer(&micbias_timer); micbias_timer.expires = jiffies + MICBIAS_DISABLE_TIMER; micbias_timer.function = &disable_micbias; micbias_timer.data = ((unsigned long) 0 ); add_timer(&micbias_timer); - +#endif #endif } @@ -560,40 +633,79 @@ static DEFINE_MUTEX(accdet_multikey_mutex); 0V<=MD< 0.09V<= UP<0.24V<=DW <0.5V */ - -#define DW_KEY_HIGH_THR (500) //0.50v=500000uv -#define DW_KEY_THR (240) //0.24v=240000uv -#define UP_KEY_THR (90) //0.09v=90000uv +/*HVT*/ +#define DW_KEY_HIGH_THR (400) /*400mv*/ +#define DW_KEY_THR (280) /*280mv*/ +#define UP_KEY_THR (180) /*180mv*/ #define MD_KEY_THR (0) +/*EVT1.2*/ +#define DW_KEY_HIGH_THR_1 (400) /*400mv*/ +#define DW_KEY_THR_1 (200) /*200mv*/ +#define UP_KEY_THR_1 (100) /*100mv*/ +#define MD_KEY_THR_1 (0) + +#if defined(CONFIG_AUSTIN_PROJECT) static int key_check(int b) { - //ACCDET_DEBUG("adc_data: %d v\n",b); - - /* 0.24V ~ */ + /*ACCDET_DEBUG("adc_data: %d v\n",b);*/ + ACCDET_DEBUG("accdet: come in key_check!!\n"); - if((b= DW_KEY_THR)) - { - ACCDET_DEBUG("adc_data: %d mv\n",b); + if ((b < DW_KEY_HIGH_THR_1) && (b >= DW_KEY_THR_1)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); return DW_KEY; - } - else if ((b < DW_KEY_THR)&& (b >= UP_KEY_THR)) - { - ACCDET_DEBUG("adc_data: %d mv\n",b); + } else if ((b < DW_KEY_THR_1) && (b >= UP_KEY_THR_1)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); return UP_KEY; - } - else if ((b < UP_KEY_THR) && (b >= MD_KEY_THR)) - { - ACCDET_DEBUG("adc_data: %d mv\n",b); + } else if ((b < UP_KEY_THR_1) && (b >= MD_KEY_THR_1)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); return MD_KEY; } ACCDET_DEBUG("accdet: leave key_check!!\n"); return NO_KEY; } +#else +static int key_check(int b) +{ + /*ACCDET_DEBUG("adc_data: %d v\n",b);*/ + + /* 0.24V ~ */ + if (board_voltage > 570) /*Board EVT1.2*/ + { + ACCDET_DEBUG("accdet: come in key_check!!\n"); + if ((b < DW_KEY_HIGH_THR_1) && (b >= DW_KEY_THR_1)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); + return DW_KEY; + } else if ((b < DW_KEY_THR_1) && (b >= UP_KEY_THR_1)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); + return UP_KEY; + } else if ((b < UP_KEY_THR_1) && (b >= MD_KEY_THR_1)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); + return MD_KEY; + } + ACCDET_DEBUG("accdet: leave key_check!!\n"); + return NO_KEY; + } else { + ACCDET_DEBUG("accdet: come in key_check!!\n"); + if ((b < DW_KEY_HIGH_THR) && (b >= DW_KEY_THR)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); + return DW_KEY; + } else if ((b < DW_KEY_THR) && (b >= UP_KEY_THR)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); + return UP_KEY; + } else if ((b < UP_KEY_THR) && (b >= MD_KEY_THR)) { + ACCDET_DEBUG("adc_data: %d mv\n", b); + return MD_KEY; + } + ACCDET_DEBUG("accdet: leave key_check!!\n"); + return NO_KEY; + } +} +#endif static void send_key_event(int keycode,int flag) { - if(call_status == 0) + if (0) { switch (keycode) { @@ -1068,6 +1180,10 @@ static inline void check_cable_type(void) mutex_lock(&accdet_eint_irq_sync_mutex); if(1 == eint_accdet_sync_flag) { accdet_status = PLUG_OUT; + #if defined(EARPHONE_SWITCH) + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ZERO); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ONE); + #endif }else { ACCDET_DEBUG("[Accdet] Headset has plugged out\n"); } @@ -1351,9 +1467,17 @@ static int dump_register(void) static ssize_t accdet_store_call_state(struct device_driver *ddri, const char *buf, size_t count) { - if (sscanf(buf, "%u", &call_status) != 1) { - ACCDET_DEBUG("accdet: Invalid values\n"); - return -EINVAL; + int ret; + + if (buf == NULL) { + ACCDET_DEBUG("[%s] Invalid input!!\n", __func__); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &call_status); + if (ret != 0) { + ACCDET_DEBUG("accdet: Invalid values\n"); + return -EINVAL; } switch(call_status) @@ -1374,7 +1498,7 @@ static ssize_t accdet_store_call_state(struct device_driver *ddri, const char *b break; default: - ACCDET_DEBUG("[Accdet]accdet call : Invalid values\n"); + ACCDET_DEBUG("[Accdet]accdet call : Invalid values\n"); break; } return count; @@ -1384,11 +1508,16 @@ static ssize_t accdet_store_call_state(struct device_driver *ddri, const char *b static ssize_t show_pin_recognition_state(struct device_driver *ddri, char *buf) { + if (buf == NULL) { + ACCDET_DEBUG("[%s] Invalid input!!\n", __func__); + return -EINVAL; + } + #ifdef ACCDET_PIN_RECOGNIZATION ACCDET_DEBUG("ACCDET show_pin_recognition_state = %d\n", cable_pin_recognition); - return sprintf(buf, "%u\n", cable_pin_recognition); + return snprintf(buf, (size_t)sizeof(cable_pin_recognition), "%u\n", cable_pin_recognition); #else - return sprintf(buf, "%u\n", 0); + return snprintf(buf, 4, "%u\n", 0); #endif } @@ -1416,54 +1545,55 @@ static int dbug_thread(void *unused) //static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count) static ssize_t store_accdet_start_debug_thread(struct device_driver *ddri, const char *buf, size_t count) { - - unsigned int start_flag; - int error; + int ret = 0; + int error = 0; + int start_flag = 0; - if (sscanf(buf, "%u", &start_flag) != 1) { + if (buf == NULL) { + ACCDET_DEBUG("[%s] Invalid input!!\n", __func__); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &start_flag); + if (ret != 0) { ACCDET_DEBUG("accdet: Invalid values\n"); return -EINVAL; } - ACCDET_DEBUG("[Accdet] start flag =%d \n",start_flag); - - g_start_debug_thread = start_flag; - - if(1 == start_flag) - { - thread = kthread_run(dbug_thread, 0, "ACCDET"); - if (IS_ERR(thread)) - { - error = PTR_ERR(thread); - ACCDET_DEBUG( " failed to create kernel thread: %d\n", error); - } - } + if (start_flag) {/* if write 0, Invalid; otherwise, valid */ + g_start_debug_thread = 1; + thread = kthread_run(dbug_thread, 0, "ACCDET"); + if (IS_ERR(thread)) { + error = PTR_ERR(thread); + ACCDET_DEBUG("[store_accdet_start_debug_thread] failed to create kernel thread: %d\n", error); + } else { + ACCDET_DEBUG("[store_accdet_start_debug_thread] start debug thread!\n"); + } + } else { + g_start_debug_thread = 0; + ACCDET_DEBUG("[store_accdet_start_debug_thread] stop debug thread!\n"); + } return count; } static ssize_t store_accdet_set_headset_mode(struct device_driver *ddri, const char *buf, size_t count) { - - unsigned int value; - //int error; - - if (sscanf(buf, "%u", &value) != 1) { - ACCDET_DEBUG("accdet: Invalid values\n"); - return -EINVAL; - } - - ACCDET_DEBUG("[Accdet]store_accdet_set_headset_mode value =%d \n",value); - + ACCDET_DEBUG("[%s] Not Support\n", __func__); return count; } static ssize_t store_accdet_dump_register(struct device_driver *ddri, const char *buf, size_t count) { - unsigned int value; -// int error; + int value; + int ret; - if (sscanf(buf, "%u", &value) != 1) - { + if (buf == NULL) { + ACCDET_DEBUG("[%s] Invalid input!!\n", __func__); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &value); + if (ret != 0) { ACCDET_DEBUG("accdet: Invalid values\n"); return -EINVAL; } @@ -1614,6 +1744,20 @@ int mt_accdet_probe(void) wake_lock_init(&accdet_irq_lock, WAKE_LOCK_SUSPEND, "accdet irq wakelock"); wake_lock_init(&accdet_key_lock, WAKE_LOCK_SUSPEND, "accdet key wakelock"); wake_lock_init(&accdet_timer_lock, WAKE_LOCK_SUSPEND, "accdet timer wakelock"); + +#if defined(EARPHONE_SWITCH) + get_board_voltage(); + + mt_set_gpio_mode(GPIO_HEADSET_SWITCH2, GPIO_MODE_00); + mt_set_gpio_pull_enable(GPIO_HEADSET_SWITCH2, GPIO_PULL_ENABLE); + mt_set_gpio_dir(GPIO_HEADSET_SWITCH2, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_HEADSET_SWITCH2, GPIO_OUT_ONE); + + mt_set_gpio_mode(GPIO_HEADSET_SWITCH1, GPIO_MODE_00); + mt_set_gpio_pull_enable(GPIO_HEADSET_SWITCH1, GPIO_PULL_ENABLE); + mt_set_gpio_dir(GPIO_HEADSET_SWITCH1, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_HEADSET_SWITCH1, GPIO_OUT_ZERO); +#endif #ifdef SW_WORK_AROUND_ACCDET_REMOTE_BUTTON_ISSUE init_waitqueue_head(&send_event_wq); //start send key event thread @@ -1650,7 +1794,9 @@ int mt_accdet_probe(void) queue_work(accdet_workqueue, &accdet_work); //schedule a work for the first detection #endif #ifdef ACCDET_EINT - +#ifdef CONFIG_AUSTIN_PROJECT + setup_timer(&micbias_timer, disable_micbias, (unsigned long) 0); +#endif accdet_eint_workqueue = create_singlethread_workqueue("accdet_eint"); INIT_WORK(&accdet_eint_work, accdet_eint_work_callback); accdet_setup_eint(); diff --git a/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.c b/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.c index 3f7c10748fa..3e4e3cbd83f 100644 --- a/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.c +++ b/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.c @@ -45,7 +45,7 @@ /*----------------------------------------------------------------------------*/ #define DEBUG 1 /*----------------------------------------------------------------------------*/ -//#define CONFIG_KXTJ2_1009_LOWPASS /*apply low pass filter on output*/ +#define CONFIG_KXTJ2_1009_LOWPASS /*apply low pass filter on output*/ #define SW_CALIBRATION //#define USE_EARLY_SUSPEND /*----------------------------------------------------------------------------*/ @@ -71,6 +71,7 @@ static int kxtj2_1009_i2c_remove(struct i2c_client *client); static int kxtj2_1009_i2c_detect(struct i2c_client *client/*, int kind*/, struct i2c_board_info *info); static int kxtj2_1009_suspend(struct i2c_client *client, pm_message_t msg); static int kxtj2_1009_resume(struct i2c_client *client); +extern struct acc_hw* get_kxtj2_1009_cust_acc_hw(void); /*----------------------------------------------------------------------------*/ typedef enum { @@ -154,6 +155,18 @@ static char selftestRes[8]= {0}; static DEFINE_MUTEX(kxtj2_1009_mutex); static bool enable_status = false; +/* auto detect driver */ +#if defined(CONFIG_MTK_AUTO_DETECT_ACCELEROMETER) +static int kxtj2_init_flag = -1; // 0 means ok, -1 means fail. +static int kxtj2_local_init(void); +static int kxtj2_local_remove(void); + +static struct sensor_init_info kxtj2_init_info = { + .name = "kxtj2_1009", + .init = kxtj2_local_init, + .uninit = kxtj2_local_init, +}; +#endif /*----------------------------------------------------------------------------*/ #define GSE_TAG "[Gsensor] " @@ -230,7 +243,7 @@ static int KXTJ2_1009_SetDataResolution(struct kxtj2_1009_i2c_data *obj) KXTJ2_1009_SetPowerMode(obj->client, cur_sensor_power/*true*/); - //kxtj2_1009_data_resolution[0] has been set when initialize: +/-2g in 8-bit resolution: 15.6 mg/LSB*/ + /*kxtj2_1009_data_resolution[0] has been set when initialize: +/-2g in 8-bit resolution: 15.6 mg/LSB*/ obj->reso = &kxtj2_1009_data_resolution[0]; return 0; @@ -292,7 +305,7 @@ static int KXTJ2_1009_ReadData(struct i2c_client *client, s16 data[KXTJ2_1009_AX priv->fir.raw[priv->fir.num][KXTJ2_1009_AXIS_Y] = data[KXTJ2_1009_AXIS_Y]; priv->fir.raw[priv->fir.num][KXTJ2_1009_AXIS_Z] = data[KXTJ2_1009_AXIS_Z]; priv->fir.sum[KXTJ2_1009_AXIS_X] += data[KXTJ2_1009_AXIS_X]; - priv->fir.sum[KXTJ2_1009_AXIS_Y] += data[KXTJ2_1009IK_AXIS_Y]; + priv->fir.sum[KXTJ2_1009_AXIS_Y] += data[KXTJ2_1009_AXIS_Y]; priv->fir.sum[KXTJ2_1009_AXIS_Z] += data[KXTJ2_1009_AXIS_Z]; if(atomic_read(&priv->trace) & ADX_TRC_FILTER) { @@ -610,7 +623,6 @@ static int KXTJ2_1009_SetBWRate(struct i2c_client *client, u8 bwrate) memset(databuf, 0, sizeof(u8)*10); - KXTJ2_1009_SetPowerMode(client, false); if(hwmsen_read_block(client, KXTJ2_1009_REG_BW_RATE, databuf, 0x01)) @@ -632,7 +644,6 @@ static int KXTJ2_1009_SetBWRate(struct i2c_client *client, u8 bwrate) return KXTJ2_1009_ERR_I2C; } - KXTJ2_1009_SetPowerMode(client, cur_sensor_power/*true*/); printk("KXTJ2_1009_SetBWRate OK! \n"); @@ -826,7 +837,6 @@ static int KXTJ2_1009_ReadRawData(struct i2c_client *client, char *buf) { sprintf(buf, "KXTJ2_1009_ReadRawData %04x %04x %04x", obj->data[KXTJ2_1009_AXIS_X], obj->data[KXTJ2_1009_AXIS_Y], obj->data[KXTJ2_1009_AXIS_Z]); - } return 0; @@ -1448,7 +1458,7 @@ static int kxtj2_1009_delete_attr(struct device_driver *driver) } /*----------------------------------------------------------------------------*/ -int gsensor_operate(void* self, uint32_t command, void* buff_in, int size_in, +static int gsensor_operate(void* self, uint32_t command, void* buff_in, int size_in, void* buff_out, int size_out, int* actualout) { int err = 0; @@ -1456,7 +1466,7 @@ int gsensor_operate(void* self, uint32_t command, void* buff_in, int size_in, struct kxtj2_1009_i2c_data *priv = (struct kxtj2_1009_i2c_data*)self; hwm_sensor_data* gsensor_data; char buff[KXTJ2_1009_BUFSIZE]; - + //GSE_FUN(f); switch (command) { @@ -1621,7 +1631,6 @@ static long kxtj2_1009_unlocked_ioctl(struct file *file, unsigned int cmd,unsign case GSENSOR_IOCTL_INIT: kxtj2_1009_init_client(client, 0); break; - case GSENSOR_IOCTL_READ_CHIPINFO: data = (void __user *) arg; if(data == NULL) @@ -1875,7 +1884,7 @@ static int kxtj2_1009_i2c_detect(struct i2c_client *client/*, int kind*/, struct strcpy(info->type, KXTJ2_1009_DEV_NAME); return 0; } - +char *kxtj2_1009_name = "kxtj2_1009"; /*----------------------------------------------------------------------------*/ static int kxtj2_1009_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -1893,7 +1902,7 @@ static int kxtj2_1009_i2c_probe(struct i2c_client *client, const struct i2c_devi memset(obj, 0, sizeof(struct kxtj2_1009_i2c_data)); - obj->hw = get_cust_acc_hw(); + obj->hw = get_kxtj2_1009_cust_acc_hw(); if(0 != (err = hwmsen_get_convert(obj->hw->direction, &obj->cvt))) { @@ -1939,12 +1948,19 @@ static int kxtj2_1009_i2c_probe(struct i2c_client *client, const struct i2c_devi GSE_ERR("kxtj2_1009_device register failed\n"); goto exit_misc_device_register_failed; } - +#if defined(CONFIG_MTK_AUTO_DETECT_ACCELEROMETER) + if(0 != (err = kxtj2_1009_create_attr(&kxtj2_init_info.platform_diver_addr->driver))) + { + GSE_ERR("create attribute err = %d\n", err); + goto exit_create_attr_failed; + } +#else if(0 != (err = kxtj2_1009_create_attr(&kxtj2_1009_gsensor_driver.driver))) { GSE_ERR("create attribute err = %d\n", err); goto exit_create_attr_failed; } +#endif sobj.self = obj; sobj.polling = 1; @@ -1962,7 +1978,9 @@ static int kxtj2_1009_i2c_probe(struct i2c_client *client, const struct i2c_devi register_early_suspend(&obj->early_drv); #endif - GSE_LOG("%s: OK\n", __func__); + GSE_LOG("%s: OK\n", __func__); + kxtj2_init_flag = 0; + /*g_gsensor_name =kxtj2_1009_name;*/ return 0; exit_create_attr_failed: @@ -1974,6 +1992,7 @@ static int kxtj2_1009_i2c_probe(struct i2c_client *client, const struct i2c_devi kfree(obj); exit: GSE_ERR("%s: err = %d\n", __func__, err); + kxtj2_init_flag = -1; return err; } @@ -1981,11 +2000,17 @@ static int kxtj2_1009_i2c_probe(struct i2c_client *client, const struct i2c_devi static int kxtj2_1009_i2c_remove(struct i2c_client *client) { int err = 0; - +#if defined(CONFIG_MTK_AUTO_DETECT_ACCELEROMETER) + if(0 != (err = kxtj2_1009_delete_attr(&kxtj2_init_info.platform_diver_addr->driver))) + { + GSE_ERR("kxtj2_1009_delete_attr fail: %d\n", err); + } +#else if(0 != (err = kxtj2_1009_delete_attr(&kxtj2_1009_gsensor_driver.driver))) { GSE_ERR("kxtj2_1009_delete_attr fail: %d\n", err); } +#endif if(0 != (err = misc_deregister(&kxtj2_1009_device))) { @@ -2002,10 +2027,42 @@ static int kxtj2_1009_i2c_remove(struct i2c_client *client) kfree(i2c_get_clientdata(client)); return 0; } + +#if defined(CONFIG_MTK_AUTO_DETECT_ACCELEROMETER) +/*----------------------------------------------------------------------------*/ +static int kxtj2_local_remove(void) +{ + struct acc_hw *hw = get_kxtj2_1009_cust_acc_hw(); + GSE_FUN(); + + KXTJ2_1009_power(hw, 0); + if (i2c_add_driver(&kxtj2_1009_i2c_driver)) { + GSE_ERR("add i2c driver failed\n"); + return -1; + } + + return 0; +} + +/*----------------------------------------------------------------------------*/ +static int kxtj2_local_init(void) +{ + struct acc_hw *hw = get_kxtj2_1009_cust_acc_hw(); + GSE_FUN(); + + KXTJ2_1009_power(hw, 0); + if (i2c_add_driver(&kxtj2_1009_i2c_driver)) { + GSE_ERR("add i2c driver failed\n"); + return -1; + } + + return kxtj2_init_flag; // return init result. +} +#else /*----------------------------------------------------------------------------*/ static int kxtj2_1009_probe(struct platform_device *pdev) { - struct acc_hw *hw = get_cust_acc_hw(); + struct acc_hw *hw = get_kxtj2_1009_cust_acc_hw(); GSE_FUN(); KXTJ2_1009_power(hw, 1); @@ -2020,7 +2077,7 @@ static int kxtj2_1009_probe(struct platform_device *pdev) /*----------------------------------------------------------------------------*/ static int kxtj2_1009_remove(struct platform_device *pdev) { - struct acc_hw *hw = get_cust_acc_hw(); + struct acc_hw *hw = get_kxtj2_1009_cust_acc_hw(); GSE_FUN(); KXTJ2_1009_power(hw, 0); @@ -2036,26 +2093,32 @@ static struct platform_driver kxtj2_1009_gsensor_driver = { .owner = THIS_MODULE, } }; - +#endif /*----------------------------------------------------------------------------*/ static int __init kxtj2_1009_init(void) { - struct acc_hw *hw = get_cust_acc_hw(); - GSE_FUN(); + struct acc_hw *hw = get_kxtj2_1009_cust_acc_hw(); + GSE_FUN(); GSE_LOG("%s: i2c_number=%d\n", __func__,hw->i2c_num); i2c_register_board_info(hw->i2c_num, &i2c_kxtj2_1009, 1); +#if defined(CONFIG_MTK_AUTO_DETECT_ACCELEROMETER) + hwmsen_gsensor_add(&kxtj2_init_info); +#else if(platform_driver_register(&kxtj2_1009_gsensor_driver)) { GSE_ERR("failed to register driver"); return -ENODEV; } +#endif return 0; } /*----------------------------------------------------------------------------*/ static void __exit kxtj2_1009_exit(void) { GSE_FUN(); +#if !defined(CONFIG_MTK_AUTO_DETECT_ACCELEROMETER) platform_driver_unregister(&kxtj2_1009_gsensor_driver); +#endif } /*----------------------------------------------------------------------------*/ module_init(kxtj2_1009_init); diff --git a/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.h b/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.h index 0966b90765b..fca7b9b1566 100644 --- a/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.h +++ b/drivers/misc/mediatek/accelerometer/KXTJ2_1009/kxtj2_1009.h @@ -21,11 +21,11 @@ */ #ifndef KXTJ2_1009_H #define KXTJ2_1009_H - + #include - + #define KXTJ2_1009_I2C_SLAVE_ADDR 0x1C - + /* KXTJ2_1009 Register Map (Please refer to KXTJ2_1009 Specifications) */ #define KXTJ2_1009_REG_DEVID 0x0F #define KXTJ2_1009_REG_BW_RATE 0x21 @@ -35,12 +35,12 @@ #define KXTJ2_1009_REG_DATA_FORMAT 0x1B #define KXTJ2_1009_REG_DATA_RESOLUTION 0x1B #define KXTJ2_1009_RANGE_DATA_RESOLUTION_MASK 0x40 -#define KXTJ2_1009_REG_DATAX0 0x06 -#define KXTJ2_1009_FIXED_DEVID 0x09 +#define KXTJ2_1009_REG_DATAX0 0x06 +#define KXTJ2_1009_FIXED_DEVID 0x09 #define KXTJ2_1009_BW_200HZ 0x05 #define KXTJ2_1009_BW_100HZ 0x04 -#define KXTJ2_1009_BW_50HZ 0x03 -#define KXTJ2_1009_MEASURE_MODE 0x80 +#define KXTJ2_1009_BW_50HZ 0x03 +#define KXTJ2_1009_MEASURE_MODE 0x80 #define KXTJ2_1009_RANGE_MASK 0x18 #define KXTJ2_1009_RANGE_2G 0x00 #define KXTJ2_1009_RANGE_4G 0x08 @@ -48,18 +48,15 @@ #define KXTJ2_1009_REG_INT_ENABLE 0x1E #define KXTJ2_1009_SELF_TEST 0x10 - - + #define KXTJ2_1009_SUCCESS 0 #define KXTJ2_1009_ERR_I2C -1 #define KXTJ2_1009_ERR_STATUS -3 #define KXTJ2_1009_ERR_SETUP_FAILURE -4 #define KXTJ2_1009_ERR_GETGSENSORDATA -5 #define KXTJ2_1009_ERR_IDENTIFICATION -6 - - - -#define KXTJ2_1009_BUFSIZE 256 - -#endif +#define KXTJ2_1009_BUFSIZE 256 + + +#endif diff --git a/drivers/misc/mediatek/accelerometer/Makefile b/drivers/misc/mediatek/accelerometer/Makefile index 66356ed77bc..5df776e3a55 100755 --- a/drivers/misc/mediatek/accelerometer/Makefile +++ b/drivers/misc/mediatek/accelerometer/Makefile @@ -17,9 +17,6 @@ endif ifeq ($(CONFIG_MTK_BMA222E),y) obj-y += bma222E/ endif -ifeq ($(CONFIG_MTK_BMA2XX),y) -obj-y += bma2xx/ -endif ifeq ($(CONFIG_MTK_BMA222E_NEW),y) obj-y += bma222E-new/ endif @@ -32,6 +29,9 @@ endif ifeq ($(CONFIG_MTK_BMA250),y) obj-y += bma250/ endif +ifeq ($(CONFIG_MTK_BMA253),y) +obj-y += bma253/ +endif ifeq ($(CONFIG_MTK_KXTIK1004),y) obj-y += kxtik1004/ endif @@ -54,3 +54,6 @@ endif ifeq ($(CONFIG_MTK_BMA056),y) obj-y += bma056/ endif +ifeq ($(CONFIG_MTK_MC3410),y) +obj-y += mc3410-new/ +endif diff --git a/drivers/misc/mediatek/accelerometer/bma2xx/Makefile b/drivers/misc/mediatek/accelerometer/bma253/Makefile similarity index 75% rename from drivers/misc/mediatek/accelerometer/bma2xx/Makefile rename to drivers/misc/mediatek/accelerometer/bma253/Makefile index b9c97f39dca..0ce42252852 100644 --- a/drivers/misc/mediatek/accelerometer/bma2xx/Makefile +++ b/drivers/misc/mediatek/accelerometer/bma253/Makefile @@ -1,4 +1,4 @@ include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y := bma2xx.o +obj-y := bma253.o diff --git a/drivers/misc/mediatek/accelerometer/bma2xx/bma2xx.c b/drivers/misc/mediatek/accelerometer/bma253/bma253.c similarity index 88% rename from drivers/misc/mediatek/accelerometer/bma2xx/bma2xx.c rename to drivers/misc/mediatek/accelerometer/bma253/bma253.c index f0e6984f726..5d2d8bc3c28 100644 --- a/drivers/misc/mediatek/accelerometer/bma2xx/bma2xx.c +++ b/drivers/misc/mediatek/accelerometer/bma253/bma253.c @@ -10,7 +10,7 @@ * GNU General Public License for more details. * * History: V1.0 --- [2013.01.10]Driver creation - * V1.1 --- [2013.02.18]Remove power mode setting in resume function. + * V1.1 --- [2013.02.18]Remove power mode setting in resume function. * V1.2 --- [2013.03.14]Instead late_resume, use resume to make sure * driver resume is ealier than processes resume. */ @@ -30,9 +30,39 @@ #include #include -#include -#include -#include +#ifdef MT6516 +#include +#include +#include +#include +#endif + +#ifdef MT6573 +#include +#include +#include +#include +#endif + +#ifdef MT6575 +#include +#include +#include +#include +#endif + +#ifdef MT6577 +#include +#include +#include +#include +#endif + +#if defined(MT6573) || defined(MT6575) || defined(MT6577) +#define POWER_NONE_MACRO MT65XX_POWER_NONE +#elif defined(MT6516) +#define POWER_NONE_MACRO MT6516_POWER_NONE +#endif #include #include @@ -41,7 +71,7 @@ #include #include -#include "bma2xx.h" +#include "bma253.h" /* sensor type */ enum SENSOR_TYPE_ENUM { @@ -128,7 +158,6 @@ struct bma_i2c_data { atomic_t trace; atomic_t suspend; atomic_t filter; - atomic_t selftest; s16 cali_sw[BMA_AXES_NUM+1];/* unmapped axis value */ /* hw offset */ @@ -141,10 +170,6 @@ struct bma_i2c_data { #endif }; -/******add leon zhu*********/ -static char selftestRes[8]= {0}; -/********end**************/ - /* log macro */ #define GSE_TAG "[gsensor] " #define GSE_FUN(f) printk(KERN_INFO GSE_TAG"%s\n", __func__) @@ -152,9 +177,17 @@ static char selftestRes[8]= {0}; printk(KERN_ERR GSE_TAG"%s %d : "fmt, __func__, __LINE__, ##args) #define GSE_LOG(fmt, args...) printk(KERN_INFO GSE_TAG fmt, ##args) -static struct platform_driver bma_gsensor_driver; +/*static struct platform_driver bma_gsensor_driver;*/ static struct i2c_driver bma_i2c_driver; static struct bma_i2c_data *obj_i2c_data; + +extern struct acc_hw* get_bma253_cust_acc_hw(void); +static int bma2xx_local_init(void); +static int bma2xx_remove(void); +static int bma2xx_init_flag =-1; /*0<==>OK -1 <==> fail*/ + +char *bma223_name = "bma223"; + static int bma_set_powermode(struct i2c_client *client, enum BMA_POWERMODE_ENUM power_mode); static const struct i2c_device_id bma_i2c_id[] = { @@ -169,7 +202,13 @@ static const struct i2c_device_id bma_i2c_id[] = { * BMA222E, BMA250E, BMA255, BMA280 automatically. */ static struct i2c_board_info __initdata bma_i2c_info = { - I2C_BOARD_INFO(BMA_DEV_NAME, BMA_I2C_ADDRESS(BMA2X2, PIN_LOW)) + I2C_BOARD_INFO(BMA_DEV_NAME, 0x18) +}; + +static struct sensor_init_info bma2xx_init_info = { + .name = "bma2xx", + .init = bma2xx_local_init, + .uninit = bma2xx_remove, }; /* I2C operation functions */ @@ -1810,204 +1849,6 @@ static ssize_t store_datarate_value(struct device_driver *ddri, return err; } -/**********add leon zhu******************/ -/*----------------------------------------------------------------------------*/ -static int BMA2xx_JudgeTestResult(struct i2c_client *client) -{ - struct bma_i2c_data *obj = obj_i2c_data; - int res = 0; - int index =0; - s16 acc[BMA_AXES_NUM]; - int self_result; - - -agen: - memset(acc, 0, sizeof(int)*BMA_AXES_NUM); - if(res = bma_read_raw_data(client, acc)) - { - GSE_ERR("I2C error: ret value=%d", res); - return EIO; - } - else - { - printk("0 step: %d %d %d\n", acc[0],acc[1],acc[2]); - - acc[BMA_AXIS_X] = acc[BMA_AXIS_X] * 9807 / 64; - acc[BMA_AXIS_Y] = acc[BMA_AXIS_Y] * 9807 / 64; - acc[BMA_AXIS_Z] = acc[BMA_AXIS_Z] * 9807 / 64; - - printk("1 step: %d %d %d\n", acc[0],acc[1],acc[2]); - - self_result = acc[BMA_AXIS_X]*acc[BMA_AXIS_X] - + acc[BMA_AXIS_Y]*acc[BMA_AXIS_Y] - + acc[BMA_AXIS_Z]*acc[BMA_AXIS_Z]; - - - printk("2 step: result = %d", self_result); - //if ( (self_result>550000) && (self_result<1700000) ) //between 0.55g and 1.7g - //if ( (self_result>48112033) && (self_result<163580913) ) //between 0.55g and 1.7g - if ( (self_result>45000000) && (self_result<170000000) ) //between 0.55g and 1.7g - { - GSE_ERR("BMA2XX_JudgeTestResult successful\n"); - return 0; - } - else - { - GSE_ERR("BMA2XX_JudgeTestResult failt\n"); - if (index++ < 5) - goto agen; - return -EINVAL; - } - - } - -} - -/*----------------------------------------------------------------------------*/ -static int BMA2XX_InitSelfTest(struct i2c_client *client) -{ - int err = 0; - err = bma_set_datarate(client, - (enum BMA_DATARATE_ENUM)BMA_DATARATE_10HZ); - if (err < 0) { - GSE_ERR("set bandwidth failed, err = %d\n", err); - return err; - } - - err = bma_set_range(client, (enum BMA_RANGE_ENUM)BMA_RANGE_2G); - if (err < 0) { - GSE_ERR("set range failed, err = %d\n", err); - return err; - } - - mdelay(60); - - return 0; - -} - -/*----------------------------------------------------------------------------*/ -static ssize_t show_self_value(struct device_driver *ddri, char *buf) -{ - struct bma_i2c_data *obj = obj_i2c_data; - - if (obj == NULL) - { - GSE_ERR("bma i2c data pointer is null\n"); - return 0; - } - - return snprintf(buf, 8, "%s\n", selftestRes); -} -/*----------------------------------------------------------------------------*/ -static ssize_t store_self_value(struct device_driver *ddri, char *buf, size_t count) -{ - /*write anything to this register will trigger the process*/ - struct item{ - s16 raw[BMA_AXES_NUM]; - }; - - struct bma_i2c_data *obj = obj_i2c_data; - int idx, res, num; - struct item *prv = NULL, *nxt = NULL; - - - if(1 != sscanf(buf, "%d", &num)) - { - GSE_ERR("parse number fail\n"); - return count; - } - else if(num == 0) - { - GSE_ERR("invalid data count\n"); - return count; - } - - prv = kzalloc(sizeof(*prv) * num, GFP_KERNEL); - nxt = kzalloc(sizeof(*nxt) * num, GFP_KERNEL); - if (!prv || !nxt) - { - goto exit; - } - - - GSE_LOG("NORMAL:\n"); - bma_set_powermode(obj->client, BMA_NORMAL_MODE); - - /*initial setting for self test*/ - BMA2XX_InitSelfTest(obj->client); - GSE_LOG("SELFTEST:\n"); - - if(!BMA2xx_JudgeTestResult(obj->client)) - { - GSE_LOG("SELFTEST : PASS\n"); - strcpy(selftestRes,"y"); - } - else - { - GSE_LOG("SELFTEST : FAIL\n"); - strcpy(selftestRes,"n"); - } - - exit: - /*restore the setting*/ - bma_init_client(obj->client,0); - kfree(prv); - kfree(nxt); - return count; -} -/*----------------------------------------------------------------------------*/ -static ssize_t show_selftest_value(struct device_driver *ddri, char *buf) -{ - struct bma_i2c_data *obj = obj_i2c_data; - - if (obj == NULL) - { - GSE_ERR("i2c client is null!!\n"); - return 0; - } - - return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&obj->selftest)); -} -/*----------------------------------------------------------------------------*/ -static ssize_t store_selftest_value(struct device_driver *ddri, char *buf, size_t count) -{ - struct bma_i2c_data *obj = obj_i2c_data; - int tmp; - - if(NULL == obj) - { - GSE_ERR("i2c data obj is null!!\n"); - return 0; - } - - - if(1 == sscanf(buf, "%d", &tmp)) - { - if(atomic_read(&obj->selftest) && !tmp) - { - /*enable -> disable*/ - bma_init_client(obj->client, 0); - } - else if(!atomic_read(&obj->selftest) && tmp) - { - /*disable -> enable*/ - BMA2XX_InitSelfTest(obj->client); - } - - GSE_LOG("selftest: %d => %d\n", atomic_read(&obj->selftest), tmp); - atomic_set(&obj->selftest, tmp); - } - else - { - GSE_ERR("invalid content: '%s', length = %d\n", buf, count); - } - return count; -} -/*----------------------------------------------------------------------------* - -/*******************end************************/ - static DRIVER_ATTR(chipinfo, S_IWUSR | S_IRUGO, show_chipinfo_value, NULL); static DRIVER_ATTR(sensordata, S_IWUSR | S_IRUGO, show_sensordata_value, NULL); static DRIVER_ATTR(cali, S_IWUSR | S_IRUGO, show_cali_value, store_cali_value); @@ -2022,14 +1863,6 @@ static DRIVER_ATTR(range, S_IWUSR | S_IRUGO, show_range_value, store_range_value); static DRIVER_ATTR(datarate, S_IWUSR | S_IRUGO, show_datarate_value, store_datarate_value); -/***********add leon zhu*************/ -//static DRIVER_ATTR(selftest, S_IWUSR | S_IRUGO, show_self_value, store_self_value); -//static DRIVER_ATTR(self, S_IWUSR | S_IRUGO, show_selftest_value, store_selftest_value); -static DRIVER_ATTR(selftest, S_IWUSR | S_IRUGO, - show_self_value, store_self_value); -static DRIVER_ATTR(self, S_IWUSR | S_IRUGO, - show_selftest_value, store_selftest_value); -/**************end*****************/ static struct driver_attribute *bma_attr_list[] = { /* chip information */ @@ -2050,12 +1883,6 @@ static struct driver_attribute *bma_attr_list[] = { &driver_attr_range, /* get data rate */ &driver_attr_datarate, - /************add leon zhu ******************/ - /*self control: 0: disable, 1: enable*/ - &driver_attr_selftest, - /*self test demo*/ - &driver_attr_self, - /**************end***********************/ }; static int bma_create_attr(struct device_driver *driver) @@ -2090,7 +1917,7 @@ static int bma_delete_attr(struct device_driver *driver) return err; } -int gsensor_operate(void *self, uint32_t command, void *buff_in, int size_in, +int bma2xx_operate(void *self, uint32_t command, void *buff_in, int size_in, void *buff_out, int size_out, int *actualout) { int err = 0; @@ -2309,42 +2136,13 @@ static long bma_unlocked_ioctl(struct file *file, unsigned int cmd, GSE_ERR("perform calibration in suspend mode\n"); err = -EINVAL; } else { - printk("GSENSOR_IOCTL_SET_CALI sensor_data.x = %d y =%d z = %d obj->sensitivity = %d\n",sensor_data.x,sensor_data.y,sensor_data.z,obj->sensitivity); /* convert: m/s^2 -> LSB */ - /**********add by Zero**********/ - #if 0 cali[BMA_AXIS_X] = sensor_data.x * obj->sensitivity / GRAVITY_EARTH_1000; cali[BMA_AXIS_Y] = sensor_data.y * obj->sensitivity / GRAVITY_EARTH_1000; cali[BMA_AXIS_Z] = sensor_data.z * obj->sensitivity / GRAVITY_EARTH_1000; - #else - - if (sensor_data.x > 0) - sensor_data.x = sensor_data.x + 153; - else if(sensor_data.x < 0) - sensor_data.x = sensor_data.x - 153; - - if (sensor_data.y > 0) - sensor_data.y = sensor_data.y + 153; - else if(sensor_data.y < 0) - sensor_data.y = sensor_data.y - 153; - - if (sensor_data.z > 0) - sensor_data.z = sensor_data.z + 153; - else if(sensor_data.z < 0) - sensor_data.z = sensor_data.z - 153; - - cali[BMA_AXIS_X] = sensor_data.x * - obj->sensitivity / GRAVITY_EARTH_1000; - cali[BMA_AXIS_Y] = sensor_data.y * - obj->sensitivity / GRAVITY_EARTH_1000; - cali[BMA_AXIS_Z] = sensor_data.z * - obj->sensitivity / GRAVITY_EARTH_1000; - #endif - printk("GSENSOR_IOCTL_SET_CALI cali[BMA_AXIS_X]= %d y =%d z = %d\n",cali[BMA_AXIS_X],cali[BMA_AXIS_Y],cali[BMA_AXIS_Z]); - /************end*****************/ err = bma_write_calibration(client, cali); } break; @@ -2460,7 +2258,7 @@ static int bma_i2c_probe(struct i2c_client *client, goto exit; } - obj->hw = get_cust_acc_hw(); + obj->hw = get_bma253_cust_acc_hw(); err = hwmsen_get_convert(obj->hw->direction, &obj->cvt); if (err) { GSE_ERR("invalid direction: %d\n", obj->hw->direction); @@ -2498,7 +2296,7 @@ static int bma_i2c_probe(struct i2c_client *client, goto exit_misc_device_register_failed; } - err = bma_create_attr(&bma_gsensor_driver.driver); + err = bma_create_attr(&(bma2xx_init_info.platform_diver_addr->driver)); if (err) { GSE_ERR("create attribute failed, err = %d\n", err); goto exit_create_attr_failed; @@ -2506,19 +2304,20 @@ static int bma_i2c_probe(struct i2c_client *client, sobj.self = obj; sobj.polling = 1; - sobj.sensor_operate = gsensor_operate; + sobj.sensor_operate = bma2xx_operate; err = hwmsen_attach(ID_ACCELEROMETER, &sobj); if (err) { GSE_ERR("hwmsen attach failed, err = %d\n", err); goto exit_hwmsen_attach_failed; } - + extern int gsensor_driver_load; + bma2xx_init_flag = 0; GSE_LOG("%s: OK\n", __func__); return 0; exit_hwmsen_attach_failed: - bma_delete_attr(&bma_gsensor_driver.driver); + bma_delete_attr(&(bma2xx_init_info.platform_diver_addr->driver)); exit_create_attr_failed: misc_deregister(&bma_device); exit_misc_device_register_failed: @@ -2527,6 +2326,7 @@ exit_hwmsen_get_convert_failed: kfree(obj); exit: GSE_ERR("err = %d\n", err); + bma2xx_init_flag = -1; return err; } @@ -2538,7 +2338,7 @@ static int bma_i2c_remove(struct i2c_client *client) if (err) GSE_ERR("hwmsen_detach failed, err = %d\n", err); - err = bma_delete_attr(&bma_gsensor_driver.driver); + err = bma_delete_attr(&(bma2xx_init_info.platform_diver_addr->driver)); if (err) GSE_ERR("bma_delete_attr failed, err = %d\n", err); @@ -2553,28 +2353,30 @@ static int bma_i2c_remove(struct i2c_client *client) return 0; } -static int bma_probe(struct platform_device *pdev) +static int bma2xx_local_init(void) { - struct acc_hw *hw = get_cust_acc_hw(); + struct acc_hw *hw = get_bma253_cust_acc_hw(); GSE_FUN(); bma_power(hw, 1); - if (i2c_add_driver(&bma_i2c_driver)) { - GSE_ERR("add i2c driver failed\n"); + if(i2c_add_driver(&bma_i2c_driver)) + { + GSE_ERR("add driver error\n"); return -1; } - + if(-1 == bma2xx_init_flag) + { + return -1; + } return 0; } -static int bma_remove(struct platform_device *pdev) +static int bma2xx_remove(void) { - struct acc_hw *hw = get_cust_acc_hw(); + struct acc_hw *hw = get_bma253_cust_acc_hw(); GSE_FUN(); - bma_power(hw, 0); i2c_del_driver(&bma_i2c_driver); - return 0; } @@ -2590,35 +2392,23 @@ static struct i2c_driver bma_i2c_driver = { .id_table = bma_i2c_id, }; -static struct platform_driver bma_gsensor_driver = { - .probe = bma_probe, - .remove = bma_remove, - .driver = { - .name = "gsensor", - .owner = THIS_MODULE, - } -}; - static int __init bma_init(void) { - struct acc_hw *hw = get_cust_acc_hw(); + struct acc_hw *hw = get_bma253_cust_acc_hw(); GSE_LOG("%s: bosch accelerometer driver version: %s\n", __func__, BMA_DRIVER_VERSION); i2c_register_board_info(hw->i2c_num, &bma_i2c_info, 1); + hwmsen_gsensor_add(&bma2xx_init_info); - if (platform_driver_register(&bma_gsensor_driver)) { - GSE_ERR("register gsensor platform driver failed\n"); - return -ENODEV; - } return 0; } static void __exit bma_exit(void) { GSE_FUN(); - platform_driver_unregister(&bma_gsensor_driver); + /*platform_driver_unregister(&bma_gsensor_driver);*/ } module_init(bma_init); diff --git a/drivers/misc/mediatek/accelerometer/bma2xx/bma2xx.h b/drivers/misc/mediatek/accelerometer/bma253/bma253.h similarity index 93% rename from drivers/misc/mediatek/accelerometer/bma2xx/bma2xx.h rename to drivers/misc/mediatek/accelerometer/bma253/bma253.h index 742f188ca86..f959571325e 100644 --- a/drivers/misc/mediatek/accelerometer/bma2xx/bma2xx.h +++ b/drivers/misc/mediatek/accelerometer/bma253/bma253.h @@ -1,18 +1,26 @@ -/* BOSCH Accelerometer Sensor Driver Header File +/* linux/drivers/hwmon/adxl345.c * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. + * (C) Copyright 2008 + * MediaTek + * + * BMA253 driver for MT6516 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA BMA253 */ - -#ifndef BMA2XX_H -#define BMA2XX_H +#ifndef BMA253_H +#define BMA253_H #include /************************************************************* diff --git a/drivers/misc/mediatek/hall/Makefile b/drivers/misc/mediatek/accelerometer/mc3410-new/Makefile similarity index 75% rename from drivers/misc/mediatek/hall/Makefile rename to drivers/misc/mediatek/accelerometer/mc3410-new/Makefile index d0c94060078..5aa68c8dbbc 100644 --- a/drivers/misc/mediatek/hall/Makefile +++ b/drivers/misc/mediatek/accelerometer/mc3410-new/Makefile @@ -1,4 +1,4 @@ include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y := hall.o +obj-y := mc3410.o diff --git a/drivers/misc/mediatek/accelerometer/mc3410-new/mc3410.c b/drivers/misc/mediatek/accelerometer/mc3410-new/mc3410.c new file mode 100644 index 00000000000..eaa70d4d67f --- /dev/null +++ b/drivers/misc/mediatek/accelerometer/mc3410-new/mc3410.c @@ -0,0 +1,4265 @@ +/* +* Copyright(C)2014 MediaTek Inc. +* Modification based on code covered by the below mentioned copyright +* and/or permission notice(S). +*/ + +/***************************************************************************** + * + * Copyright (c) 2014 mCube, Inc. + * + * + * This code and information are provided "as is" without warranty of any + * kind, either expressed or implied, including but not limited to the + * implied warranties of merchantability and/or fitness for a + * particular purpose. + * + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + *****************************************************************************/ + +/***************************************************************************** + *** HEADER FILES + *****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include "mc3410.h" + +/***************************************************************************** + *** CONFIGURATION + *****************************************************************************/ +//#define _MC3XXX_SUPPORT_DOT_CALIBRATION_ /* Just for mcube's calibration APK*/ +#define _MC3XXX_SUPPORT_LPF_ +#define _MC3XXX_SUPPORT_CONCURRENCY_PROTECTION_ +//#define _MC3XXX_SUPPORT_APPLY_AVERAGE_AGORITHM_ +//#define _MC3XXX_SUPPORT_PERIODIC_DOC_ +//#define _MC3XXX_SUPPORT_VPROXIMITY_SENSOR_ +#define _MC3XXX_SUPPORT_LRF_ +//#define _MC3XXX_SUPPORT_POWER_SAVING_SHUTDOWN_POWER_ +#define C_MAX_FIR_LENGTH (32) +#define VIRTUAL_Z 0 + +/***************************************************************************** + *** CONSTANT / DEFINITION + *****************************************************************************/ +/************************** + *** CONFIGURATION + **************************/ +#define MC3XXX_DEV_NAME "MC3XXX" +#define MC3XXX_DEV_DRIVER_VERSION "2.1.6" +#define MC3XXX_DEV_DRIVER_VERSION_VIRTUAL_Z "1.0.1" + +/************************** + *** COMMON + **************************/ +#define MC3XXX_AXIS_X 0 +#define MC3XXX_AXIS_Y 1 +#define MC3XXX_AXIS_Z 2 +#define MC3XXX_AXES_NUM 3 +#define MC3XXX_DATA_LEN 6 +#define MC3XXX_RESOLUTION_LOW 1 +#define MC3XXX_RESOLUTION_HIGH 2 +#define MC3XXX_LOW_REOLUTION_DATA_SIZE 3 +#define MC3XXX_HIGH_REOLUTION_DATA_SIZE 6 +#define MC3XXX_INIT_SUCC (0) +#define MC3XXX_INIT_FAIL (-1) +#define MC3XXX_REGMAP_LENGTH (64) +#define DEBUG_SWITCH 0 +#define C_I2C_FIFO_SIZE 8 + +/************************** + *** DEBUG + **************************/ + /********************* + *** G-Sensor + *********************/ + #if DEBUG_SWITCH + #define GSE_TAG "[Gsensor] " + #define GSE_FUN(f) printk(KERN_INFO GSE_TAG"%s\n", __FUNCTION__) + #define GSE_ERR(fmt, args...) printk(KERN_ERR GSE_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) + #define GSE_LOG(fmt, args...) printk(KERN_NOTICE GSE_TAG fmt, ##args) + #else + #define GSE_TAG + #define GSE_FUN(f) do {} while (0) + #define GSE_ERR(fmt, args...) do {} while (0) + #define GSE_LOG(fmt, args...) do {} while (0) + #endif + + /********************* + *** vProximity Sensor + *********************/ + #if 0 + #define PS_TAG "[mCube/Psensor] " + #define PS_FUN(f) printk(KERN_INFO PS_TAG"%s\n", __FUNCTION__) + #define PS_ERR(fmt, args...) printk(KERN_ERR PS_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) + #define PS_LOG(fmt, args...) printk(KERN_ERR PS_TAG fmt, ##args) + #else + #define PS_TAG + #define PS_FUN(f) do {} while (0) + #define PS_ERR(fmt, args...) do {} while (0) + #define PS_LOG(fmt, args...) do {} while (0) + #endif + +/* Maintain cust info here */ +struct acc_hw accel_cust; +static struct acc_hw *hw = &accel_cust; + +/* For driver get cust info */ +struct acc_hw *get_cust_acc(void) { + return &accel_cust; +} +/***************************************************************************** + *** DATA TYPE / STRUCTURE DEFINITION / ENUM + *****************************************************************************/ +typedef enum +{ + MCUBE_TRC_FILTER = 0x01, + MCUBE_TRC_RAWDATA = 0x02, + MCUBE_TRC_IOCTL = 0x04, + MCUBE_TRC_CALI = 0X08, + MCUBE_TRC_INFO = 0X10, + MCUBE_TRC_REGXYZ = 0X20, +} MCUBE_TRC; + +struct scale_factor +{ + u8 whole; + u8 fraction; +}; + +struct data_resolution +{ + struct scale_factor scalefactor; + int sensitivity; +}; + +struct data_filter +{ + s16 raw[C_MAX_FIR_LENGTH][MC3XXX_AXES_NUM]; + int sum[MC3XXX_AXES_NUM]; + int num; + int idx; +}; + +struct mc3xxx_i2c_data +{ + //================================================ + struct i2c_client *client; + struct acc_hw *hw; + struct hwmsen_convert cvt; + + //================================================ + struct data_resolution *reso; + atomic_t trace; + atomic_t suspend; + atomic_t selftest; + atomic_t filter; + s16 cali_sw[MC3XXX_AXES_NUM + 1]; + + //================================================ + s16 offset[MC3XXX_AXES_NUM + 1]; + s16 data[MC3XXX_AXES_NUM + 1]; + + //================================================ + #if defined(_MC3XXX_SUPPORT_LPF_) + atomic_t firlen; + atomic_t fir_en; + struct data_filter fir; + #endif + + //================================================ + #if defined(USE_EARLY_SUSPEND) + struct early_suspend early_drv; + #endif +}; + +#ifdef _MC3XXX_SUPPORT_LRF_ + typedef struct + { + s16 nIsNewRound; + s16 nPreDiff; + s16 nPreValue; + s16 nMaxValue; + s16 nMinValue; + s16 nRepValue; + s16 nNewDataMonitorCount; + } S_LRF_CB; +#endif + +/***************************************************************************** + *** EXTERNAL FUNCTION + *****************************************************************************/ +//extern struct acc_hw* mc3xxx_get_cust_acc_hw(void); + +/***************************************************************************** + *** STATIC FUNCTION + *****************************************************************************/ +static int mc3xxx_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int mc3xxx_i2c_remove(struct i2c_client *client); +static int _mc3xxx_i2c_auto_probe(struct i2c_client *client); +#ifndef USE_EARLY_SUSPEND + static int mc3xxx_suspend(struct i2c_client *client, pm_message_t msg); + static int mc3xxx_resume(struct i2c_client *client); +#endif +static int mc3xxx_local_init(void); +static int mc3xxx_remove(void); +static int MC3XXX_SetPowerMode(struct i2c_client *client, bool enable); +static int MC3XXX_WriteCalibration(struct i2c_client *client, int dat[MC3XXX_AXES_NUM]); +static void MC3XXX_SetGain(void); + +/***************************************************************************** + *** STATIC VARIBLE & CONTROL BLOCK DECLARATION + *****************************************************************************/ +static unsigned char s_bResolution = 0x00; +static unsigned char s_bPCODE = 0x00; +static unsigned char s_bPCODER = 0x00; +static unsigned char s_bHWID = 0x00; +static unsigned char s_bMPOL = 0x00; +static int s_nInitFlag = MC3XXX_INIT_FAIL; +static struct acc_init_info mc3xxx_init_info = + { + .name = MC3XXX_DEV_NAME, + .init = mc3xxx_local_init, + .uninit = mc3xxx_remove, + }; +#ifdef CONFIG_OF +static const struct of_device_id accel_of_match[] = { + {.compatible = "mediatek,GSENSOR"}, + {}, +}; +#endif +static const struct i2c_device_id mc3xxx_i2c_id[] = { {MC3XXX_DEV_NAME, 0}, {} }; +//static struct i2c_board_info __initdata mc3xxx_i2c_board_info = { I2C_BOARD_INFO(MC3XXX_DEV_NAME, 0x4C) }; +static unsigned short mc3xxx_i2c_auto_probe_addr[] = { 0x4C, 0x6C, 0x4E, 0x6D, 0x6E, 0x6F }; +static struct i2c_driver mc3xxx_i2c_driver = { + .driver = { + .name = MC3XXX_DEV_NAME, + #ifdef CONFIG_OF + .of_match_table = accel_of_match, + #endif + }, + .probe = mc3xxx_i2c_probe, + .remove = mc3xxx_i2c_remove, + + #if !defined(USE_EARLY_SUSPEND) + .suspend = mc3xxx_suspend, + .resume = mc3xxx_resume, + #endif + + .id_table = mc3xxx_i2c_id, + }; + +static struct i2c_client *mc3xxx_i2c_client = NULL; +static struct mc3xxx_i2c_data *mc3xxx_obj_i2c_data = NULL; +static struct data_resolution mc3xxx_offset_resolution = { {7, 8}, 256 }; +static bool mc3xxx_sensor_power = false; +static GSENSOR_VECTOR3D gsensor_gain, gsensor_offset; +static char selftestRes[10] = {0}; +static struct file* fd_file = NULL; +static mm_segment_t oldfs; +static unsigned char offset_buf[6]; +static signed int offset_data[3]; +static signed int gain_data[3]; +static unsigned char s_baOTP_OffsetData[6] = { 0 }; +static signed int s_nIsRBM_Enabled = false; +static DEFINE_MUTEX(MC3XXX_i2c_mutex); +extern struct acc_hw* get_mc3410_cust_acc_hw(void); + +#ifdef _MC3XXX_SUPPORT_LRF_ + static S_LRF_CB s_taLRF_CB[MC3XXX_AXES_NUM]; +#endif + +#ifdef _MC3XXX_SUPPORT_CONCURRENCY_PROTECTION_ + static struct semaphore s_tSemaProtect; +#endif + +#ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ + static int s_nIsCaliLoaded = false; + static int LPF_FirstRun = 1; +#endif + +static int LPF_SamplingRate = 5; +static int LPF_CutoffFrequency = 0x00000004; +static unsigned int iAReal0_X; +static unsigned int iAcc0Lpf0_X; +static unsigned int iAcc0Lpf1_X; +static unsigned int iAcc1Lpf0_X; +static unsigned int iAcc1Lpf1_X; + +static unsigned int iAReal0_Y; +static unsigned int iAcc0Lpf0_Y; +static unsigned int iAcc0Lpf1_Y; +static unsigned int iAcc1Lpf0_Y; +static unsigned int iAcc1Lpf1_Y; + +static unsigned int iAReal0_Z; +static unsigned int iAcc0Lpf0_Z; +static unsigned int iAcc0Lpf1_Z; +static unsigned int iAcc1Lpf0_Z; +static unsigned int iAcc1Lpf1_Z; + +static signed char s_bAccuracyStatus = SENSOR_STATUS_ACCURACY_MEDIUM; + +#ifdef _MC3XXX_SUPPORT_PERIODIC_DOC_ + static DECLARE_WAIT_QUEUE_HEAD(wq_mc3xxx_open_status); + + static atomic_t s_t_mc3xxx_open_status = ATOMIC_INIT(0); + + static unsigned char s_bIsPDOC_Enabled = false; +#endif + +#ifdef _MC3XXX_SUPPORT_VPROXIMITY_SENSOR_ + static int P_STATUS; + static int prev_P_STATUS = 0; +#endif + +/***************************************************************************** + *** MACRO + *****************************************************************************/ +#ifdef _MC3XXX_SUPPORT_CONCURRENCY_PROTECTION_ + #define MC3XXX_MUTEX_INIT() sema_init(&s_tSemaProtect, 1) + + #define MC3XXX_MUTEX_LOCK() \ + if (down_interruptible(&s_tSemaProtect)) \ + return (-ERESTARTSYS) + + #define MC3XXX_MUTEX_LOCK_RETURN_VOID() \ + if (down_interruptible(&s_tSemaProtect)) \ + return + + #define MC3XXX_MUTEX_UNLOCK() up(&s_tSemaProtect) +#else + #define MC3XXX_MUTEX_INIT() do {} while (0) + #define MC3XXX_MUTEX_LOCK() do {} while (0) + #define MC3XXX_MUTEX_LOCK_RETURN_VOID() do {} while (0) + #define MC3XXX_MUTEX_UNLOCK() do {} while (0) +#endif + +#define MCUBE_RREMAP(nDataX, nDataY) \ + if (MC3XXX_PCODE_3250 == s_bPCODE) \ + { \ + int _nTemp = 0; \ + \ + _nTemp = nDataX; \ + nDataX = nDataY; \ + nDataY = -_nTemp; \ + GSE_LOG("[%s] 3250 read remap\n", __FUNCTION__); \ + } \ + else \ + { \ + if (s_bMPOL & 0x01) nDataX = -nDataX; \ + if (s_bMPOL & 0x02) nDataY = -nDataY; \ + } + +#define MCUBE_WREMAP(nDataX, nDataY) \ + if (MC3XXX_PCODE_3250 == s_bPCODE) \ + { \ + int _nTemp = 0; \ + \ + _nTemp = nDataX; \ + nDataX = -nDataY; \ + nDataY = _nTemp; \ + GSE_LOG("[%s] 3250 write remap\n", __FUNCTION__); \ + } \ + else \ + { \ + if (s_bMPOL & 0x01) nDataX = -nDataX; \ + if (s_bMPOL & 0x02) nDataY = -nDataY; \ + GSE_LOG("[%s] 35X0 remap [s_bMPOL: %d]\n", __FUNCTION__, s_bMPOL); \ + } + +#define IS_MCFM12() ((0xC0 <= s_bHWID) && (s_bHWID <= 0xCF)) +#define IS_MCFM3X() ((0x20 == s_bHWID) || ((0x22 <= s_bHWID) && (s_bHWID <= 0x2F))) + +/***************************************************************************** + *** TODO + *****************************************************************************/ +#define DATA_PATH "/sdcard2/mcube-register-map.txt" + +#ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ + static char file_path[MC3XXX_BUF_SIZE] = "/data/data/com.mcube.acc/files/mcube-calib.txt"; + static char backup_file_path[MC3XXX_BUF_SIZE] = "/data/misc/sensors/mcube-calib.txt"; +#endif + +/***************************************************************************** + *** FUNCTION + *****************************************************************************/ + +/**************I2C operate API*****************************/ +static int MC3XXX_i2c_read_block(struct i2c_client *client, u8 addr, u8 *data, u8 len) +{ + u8 beg = addr; + int err; + struct i2c_msg msgs[2]={{0},{0}}; + + mutex_lock(&MC3XXX_i2c_mutex); + + msgs[0].addr = client->addr; + msgs[0].flags = 0; + msgs[0].len =1; + msgs[0].buf = &beg; + + msgs[1].addr = client->addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len =len; + msgs[1].buf = data; + + if (!client) + { + mutex_unlock(&MC3XXX_i2c_mutex); + return -EINVAL; + } + else if (len > C_I2C_FIFO_SIZE) + { + GSE_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE); + mutex_unlock(&MC3XXX_i2c_mutex); + return -EINVAL; + } + err = i2c_transfer(client->adapter, msgs, sizeof(msgs)/sizeof(msgs[0])); + if (err != 2) + { + GSE_ERR("i2c_transfer error: (%d %p %d) %d\n",addr, data, len, err); + err = -EIO; + } + else + { + err = 0; + } + mutex_unlock(&MC3XXX_i2c_mutex); + return err; + +} + +static int MC3XXX_i2c_write_block(struct i2c_client *client, u8 addr, u8 *data, u8 len) +{ /*because address also occupies one byte, the maximum length for write is 7 bytes*/ + int err, idx, num; + char buf[C_I2C_FIFO_SIZE]; + err =0; + mutex_lock(&MC3XXX_i2c_mutex); + if (!client) + { + mutex_unlock(&MC3XXX_i2c_mutex); + return -EINVAL; + } + else if (len >= C_I2C_FIFO_SIZE) + { + GSE_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE); + mutex_unlock(&MC3XXX_i2c_mutex); + return -EINVAL; + } + + num = 0; + buf[num++] = addr; + for (idx = 0; idx < len; idx++) + { + buf[num++] = data[idx]; + } + + err = i2c_master_send(client, buf, num); + if (err < 0) + { + GSE_ERR("send command error!!\n"); + mutex_unlock(&MC3XXX_i2c_mutex); + return -EFAULT; + } + else + { + err = 0; + } + mutex_unlock(&MC3XXX_i2c_mutex); + return err; +} + + +/***************************************** + *** GetLowPassFilter + *****************************************/ +static unsigned int GetLowPassFilter(unsigned int X0,unsigned int Y1) +{ + unsigned int lTemp; + + lTemp = Y1; + lTemp *= LPF_CutoffFrequency; // 4HZ LPF RC=0.04 + X0 *= LPF_SamplingRate; + lTemp += X0; + lTemp += LPF_CutoffFrequency; + lTemp /= (LPF_CutoffFrequency + LPF_SamplingRate); + Y1 = lTemp; + + return Y1; +} + +/***************************************** + *** openFile + *****************************************/ +static struct file *openFile(char *path,int flag,int mode) +{ + struct file *fp = NULL; + + fp = filp_open(path, flag, mode); + + if (IS_ERR(fp) || !fp->f_op) + { + GSE_LOG("Calibration File filp_open return NULL\n"); + return NULL; + } + else + { + return fp; + } +} + +/***************************************** + *** readFile + *****************************************/ +#ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ +static int readFile(struct file *fp,char *buf,int readlen) +{ + if (fp->f_op && fp->f_op->read) + return fp->f_op->read(fp,buf,readlen, &fp->f_pos); + else + return -1; +} +#endif + +/***************************************** + *** writeFile + *****************************************/ +static int writeFile(struct file *fp,char *buf,int writelen) +{ + if (fp->f_op && fp->f_op->write) + return fp->f_op->write(fp,buf,writelen, &fp->f_pos); + else + return -1; +} + +/***************************************** + *** closeFile + *****************************************/ +static int closeFile(struct file *fp) +{ + filp_close(fp,NULL); + return 0; +} + +/***************************************** + *** initKernelEnv + *****************************************/ +static void initKernelEnv(void) +{ + oldfs = get_fs(); + set_fs(KERNEL_DS); + printk(KERN_INFO "initKernelEnv\n"); +} + +/***************************************** + *** mcube_write_log_data + *****************************************/ +static int mcube_write_log_data(struct i2c_client *client, u8 data[0x3f]) +{ + #define _WRT_LOG_DATA_BUFFER_SIZE (66 * 50) + + s16 rbm_data[3] = {0}, raw_data[3] = {0}; + int err = 0; + char *_pszBuffer = NULL; + int n = 0, i = 0; + + initKernelEnv(); + fd_file = openFile(DATA_PATH ,O_RDWR | O_CREAT,0); + if (fd_file == NULL) + { + GSE_LOG("mcube_write_log_data fail to open\n"); + } + else + { + rbm_data[MC3XXX_AXIS_X] = (s16)((data[0x0d]) | (data[0x0e] << 8)); + rbm_data[MC3XXX_AXIS_Y] = (s16)((data[0x0f]) | (data[0x10] << 8)); + rbm_data[MC3XXX_AXIS_Z] = (s16)((data[0x11]) | (data[0x12] << 8)); + + raw_data[MC3XXX_AXIS_X] = (rbm_data[MC3XXX_AXIS_X] + offset_data[0]/2)*gsensor_gain.x/gain_data[0]; + raw_data[MC3XXX_AXIS_Y] = (rbm_data[MC3XXX_AXIS_Y] + offset_data[1]/2)*gsensor_gain.y/gain_data[1]; + raw_data[MC3XXX_AXIS_Z] = (rbm_data[MC3XXX_AXIS_Z] + offset_data[2]/2)*gsensor_gain.z/gain_data[2]; + + _pszBuffer = kzalloc(_WRT_LOG_DATA_BUFFER_SIZE, GFP_KERNEL); + + if (NULL == _pszBuffer) + { + GSE_ERR("fail to allocate memory for buffer\n"); + return -1; + } + + memset(_pszBuffer, 0, _WRT_LOG_DATA_BUFFER_SIZE); + + n += sprintf(_pszBuffer+n, "G-sensor RAW X = %d Y = %d Z = %d\n", raw_data[0] ,raw_data[1] ,raw_data[2]); + n += sprintf(_pszBuffer+n, "G-sensor RBM X = %d Y = %d Z = %d\n", rbm_data[0] ,rbm_data[1] ,rbm_data[2]); + + for (i = 0; i < 64; i++) + { + n += sprintf(_pszBuffer+n, "mCube register map Register[%x] = 0x%x\n",i,data[i]); + } + + msleep(50); + + if ((err = writeFile(fd_file,_pszBuffer,n)) > 0) + GSE_LOG("buf:%s\n",_pszBuffer); + else + GSE_LOG("write file error %d\n",err); + + kfree(_pszBuffer); + set_fs(oldfs); + closeFile(fd_file); + } + + return 0; +} + +#ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ +/***************************************** + *** mcube_read_cali_file + *****************************************/ +static int mcube_read_cali_file(struct i2c_client *client) +{ + int cali_data[3] = {0},cali_data1[3] = {0}; + int err = 0; + char buf[64] = {0}; + + GSE_LOG("[%s]\n",__func__); + + initKernelEnv(); + fd_file = openFile(file_path,O_RDONLY,0); + + if (fd_file == NULL) + { + GSE_LOG("%s:fail to open calibration file: %s\n", __func__, file_path); + fd_file = openFile(backup_file_path,O_RDONLY,0); + + if(fd_file == NULL) + { + GSE_LOG("%s:fail to open calibration file: %s\n", __func__, backup_file_path); + cali_data[0] = 0; + cali_data[1] = 0; + cali_data[2] = 0; + return (-1); + } + else + { + GSE_LOG("Open backup calibration file successfully: %s\n", backup_file_path); + } + } + else + { + GSE_LOG("Open calibration file successfully: %s\n", file_path); + } + + memset(buf, 0, sizeof(buf)); + + if ((err = readFile(fd_file, buf, sizeof(buf))) > 0) + GSE_LOG("cali_file: buf:%s\n",buf); + else + GSE_LOG("read file error %d\n",err); + + set_fs(oldfs); + closeFile(fd_file); + + sscanf(buf, "%d %d %d",&cali_data[MC3XXX_AXIS_X], &cali_data[MC3XXX_AXIS_Y], &cali_data[MC3XXX_AXIS_Z]); + GSE_LOG("cali_data: %d %d %d\n", cali_data[MC3XXX_AXIS_X], cali_data[MC3XXX_AXIS_Y], cali_data[MC3XXX_AXIS_Z]); + + cali_data1[MC3XXX_AXIS_X] = cali_data[MC3XXX_AXIS_X] * gsensor_gain.x / GRAVITY_EARTH_1000; + cali_data1[MC3XXX_AXIS_Y] = cali_data[MC3XXX_AXIS_Y] * gsensor_gain.y / GRAVITY_EARTH_1000; + cali_data1[MC3XXX_AXIS_Z] = cali_data[MC3XXX_AXIS_Z] * gsensor_gain.z / GRAVITY_EARTH_1000; + + GSE_LOG("cali_data1: %d %d %d\n", cali_data1[MC3XXX_AXIS_X], cali_data1[MC3XXX_AXIS_Y], cali_data1[MC3XXX_AXIS_Z]); + + MC3XXX_WriteCalibration(client, cali_data1); + + return 0; +} + +/***************************************** + *** mcube_load_cali + *****************************************/ +static void mcube_load_cali(struct i2c_client *pt_i2c_client) +{ + if (false == s_nIsCaliLoaded) + { + GSE_LOG("[%s] loading cali file...\n", __FUNCTION__); + + if (MC3XXX_RETCODE_SUCCESS == mcube_read_cali_file(pt_i2c_client)) + s_nIsCaliLoaded = true; + } +} + +#endif // _MC3XXX_SUPPORT_DOT_CALIBRATION_ + +/***************************************** + *** mcube_psensor_ioctl + *****************************************/ +#ifdef _MC3XXX_SUPPORT_VPROXIMITY_SENSOR_ +static long mcube_psensor_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int err=0; + void __user *data; + int pSensor=0; + + if(_IOC_DIR(cmd) & _IOC_READ) + { + err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + } + else if(_IOC_DIR(cmd) & _IOC_WRITE) + { + err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + } + + if(err) + { + PS_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd)); + return -EFAULT; + } + + switch(cmd) + { + case PSENSOR_IOCTL_SET_POSTURE: + data = (void __user*)arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + + if(copy_from_user(&pSensor, data, sizeof(int))) + { + err = -EFAULT; + break; + } + + P_STATUS = pSensor; + PS_LOG("IOCTL Get P_STATUS = %d",pSensor); + break; + default: + + PS_ERR("unknown IOCTL: 0x%08x\n", cmd); + //err = -ENOIOCTLCMD; + break; + } + return err; +} + +/***************************************** + *** STATIC STRUCTURE:: fops + *****************************************/ +static struct file_operations mcube_psensor_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = mcube_psensor_ioctl, +}; + +/***************************************** + *** STATIC STRUCTURE:: misc-device + *****************************************/ +static struct miscdevice mcube_psensor_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "psensor", + .fops = &mcube_psensor_fops, +}; + +/***************************************** + *** psensor_ps_operate + *****************************************/ +static int psensor_ps_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out /*sensor_data*/, int size_out, int* actualout) +{ + int err = 0; + int value; + int val=-1; + hwm_sensor_data* sensor_data; + //struct mcube_psensor_priv *obj = (struct mcube_psensor_priv *)self; + + //PS_FUN(f); + switch (command) + { + case SENSOR_DELAY: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + PS_ERR("Set delay parameter error!\n"); + err = -EINVAL; + } + // Do nothing + break; + + case SENSOR_ENABLE: + value = *(int *)buff_in; + if(value) + { + if((buff_in == NULL) || (size_in < sizeof(int))) + { + PS_ERR("Enable sensor parameter error!\n"); + err = -EINVAL; + } + + else + { + value = *(int *)buff_in; + //obj->enable = 1; + PS_ERR("enable ps \n"); + } + } + else + { + //obj->enable = 0; + PS_ERR("disable ps \n"); + } + break; + case SENSOR_GET_DATA: + PS_LOG("fwq get ps data !!!!!!\n"); + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + PS_ERR("get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + sensor_data = (hwm_sensor_data *)buff_out; + PS_LOG("mcube sensor data P_STATUS=%d\n",P_STATUS); + + if(prev_P_STATUS != P_STATUS ) + { + if(P_STATUS == 0) + { + PS_LOG("TURN ON LCD\n"); + val=1; + PS_LOG("Set val = 1, Proximity sensor far away\n"); + } + else if (P_STATUS == 1) + { + PS_LOG("TURN OFF LCD\n"); + val=0; + PS_LOG("Set val = 0, Proximity sensor close\n"); + } + PS_LOG("mcube sensor data prev_P_STATUS=%d, P_STATUS=%d\n",prev_P_STATUS,P_STATUS); + prev_P_STATUS = P_STATUS; + } + else + { + PS_LOG("P_STATUS %5d=>%5d\n",prev_P_STATUS,P_STATUS); + prev_P_STATUS = P_STATUS; + val= (P_STATUS==0)? (1):(0); + } + sensor_data->values[0] = val; + sensor_data->value_divide = 1; + sensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; + prev_P_STATUS = P_STATUS; + } + break; + default: + PS_ERR("proxmy sensor operate function has no this command %d!\n", command); + err = -1; + break; + } + + return err; +} +#endif // end of _MC3XXX_SUPPORT_VPROXIMITY_SENSOR_ + +/***************************************** + *** MC3XXX_power + *****************************************/ +static void MC3XXX_power(struct acc_hw *hw, unsigned int on) +{ +#ifdef __USE_LINUX_REGULATOR_FRAMEWORK__ +#else + static unsigned int power_on = 0; + + if(hw->power_id != MT65XX_POWER_NONE) // have externel LDO + { + GSE_LOG("power %s\n", on ? "on" : "off"); + if(power_on == on) // power status not change + { + GSE_LOG("ignore power control: %d\n", on); + } + else if(on) // power on + { + if(!hwPowerOn(hw->power_id, hw->power_vol, MC3XXX_DEV_NAME)) + { + GSE_ERR("power on fails!!\n"); + } + } + else // power off + { + if (!hwPowerDown(hw->power_id, "MC3XXX")) + { + GSE_ERR("power off fail!!\n"); + } + } + } + power_on = on; +#endif +} + +#ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ +/***************************************** + *** MC3XXX_rbm + *****************************************/ +static void MC3XXX_rbm(struct i2c_client *client, int enable) +{ + u8 _baDataBuf[3] = { 0 }; + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x07, _baDataBuf, 0x01); + + MC3XXX_i2c_read_block(client, 0x04, _baDataBuf, 0x01); + + //GSE_LOG("[%s] REG(0x04): 0x%X, enable: %d\n", __FUNCTION__, _baDataBuf[0], enable); + + if (0x00 == (_baDataBuf[0] & 0x40)) + { + _baDataBuf[0] = 0x6D; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 0x01); + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 0x01); + } + + //MC3XXX_i2c_read_block(client, 0x04, _baDataBuf, 0x01); + //GSE_LOG("BEGIN - REG(0x04): 0x%X\n", _baDataBuf[0]); + + if (1 == enable) + { + _baDataBuf[0] = 0x00; + MC3XXX_i2c_write_block(client, 0x3B, _baDataBuf, 0x01); + + _baDataBuf[0] = 0x02; + MC3XXX_i2c_write_block(client, 0x14, _baDataBuf, 0x01); + + if (MC3XXX_RESOLUTION_LOW == s_bResolution) + { + gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 1024; + } + + s_nIsRBM_Enabled = 1; + LPF_FirstRun = 1; + + GSE_LOG("set rbm!!\n"); + } + else if (0 == enable) + { + _baDataBuf[0] = 0x00; + MC3XXX_i2c_write_block(client, 0x14, _baDataBuf, 0x01); + + _baDataBuf[0] = s_bPCODER; + MC3XXX_i2c_write_block(client, 0x3B, _baDataBuf, 0x01); + + MC3XXX_SetGain(); + + s_nIsRBM_Enabled = 0; + + GSE_LOG("clear rbm!!\n"); + } + + MC3XXX_i2c_read_block(client, 0x04, _baDataBuf, 0x01); + + //GSE_LOG("RBM CONTROL DONE - REG(0x04): 0x%X\n", _baDataBuf[0]); + + if (_baDataBuf[0] & 0x40) + { + _baDataBuf[0] = 0x6D; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 0x01); + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 0x01); + } + + //MC3XXX_i2c_read_block(client, 0x04, _baDataBuf, 0x01); + //GSE_LOG("END - REG(0x04): 0x%X\n", _baDataBuf[0]); + + _baDataBuf[0] = 0x41; + MC3XXX_i2c_write_block(client, 0x07, _baDataBuf, 0x01); + + msleep(220); +} + +/***************************************** + *** MC3XXX_ReadData_RBM + *****************************************/ +static int MC3XXX_ReadData_RBM(struct i2c_client *client, int data[MC3XXX_AXES_NUM]) +{ + u8 addr = 0x0d; + u8 rbm_buf[MC3XXX_DATA_LEN] = {0}; + int err = 0; + + if(NULL == client) + { + err = -EINVAL; + return err; + } + +/********************************************/ + + if((err = MC3XXX_i2c_read_block(client, addr, rbm_buf, 0x06))) + { + GSE_ERR("error: %d\n", err); + return err; + } + + data[MC3XXX_AXIS_X] = (s16)((rbm_buf[0]) | (rbm_buf[1] << 8)); + data[MC3XXX_AXIS_Y] = (s16)((rbm_buf[2]) | (rbm_buf[3] << 8)); + data[MC3XXX_AXIS_Z] = (s16)((rbm_buf[4]) | (rbm_buf[5] << 8)); + + GSE_LOG("rbm_buf<<<<<[%02x %02x %02x %02x %02x %02x]\n",rbm_buf[0], rbm_buf[2], rbm_buf[2], rbm_buf[3], rbm_buf[4], rbm_buf[5]); + GSE_LOG("RBM<<<<<[%04x %04x %04x]\n", data[MC3XXX_AXIS_X], data[MC3XXX_AXIS_Y], data[MC3XXX_AXIS_Z]); + GSE_LOG("RBM<<<<<[%04d %04d %04d]\n", data[MC3XXX_AXIS_X], data[MC3XXX_AXIS_Y], data[MC3XXX_AXIS_Z]); + + +/********************************************/ + MCUBE_RREMAP(data[0], data[1]); + + return err; +} +#endif // _MC3XXX_SUPPORT_DOT_CALIBRATION_ + +/***************************************** + *** MC3XXX_ValidateSensorIC + *****************************************/ +static int MC3XXX_ValidateSensorIC(unsigned char *pbPCode, unsigned char *pbHwID) +{ + GSE_LOG("[%s] *pbPCode: 0x%02X, *pbHwID: 0x%02X\n", __FUNCTION__, *pbPCode, *pbHwID); + + if ( (0x01 == *pbHwID) + || (0x03 == *pbHwID) + || ((0x04 <= *pbHwID) && (*pbHwID <= 0x0F))) + { + if ((MC3XXX_PCODE_3210 == *pbPCode) || (MC3XXX_PCODE_3230 == *pbPCode) || (MC3XXX_PCODE_3250 == *pbPCode)) + return (MC3XXX_RETCODE_SUCCESS); + } + else if ( (0x02 == *pbHwID) + || (0x21 == *pbHwID) + || ((0x10 <= *pbHwID) && (*pbHwID <= 0x1F))) + { + if ( (MC3XXX_PCODE_3210 == *pbPCode) || (MC3XXX_PCODE_3230 == *pbPCode) + || (MC3XXX_PCODE_3250 == *pbPCode) + || (MC3XXX_PCODE_3410 == *pbPCode) || (MC3XXX_PCODE_3410N == *pbPCode) + || (MC3XXX_PCODE_3430 == *pbPCode) || (MC3XXX_PCODE_3430N == *pbPCode)) + { + return (MC3XXX_RETCODE_SUCCESS); + } + } + else if ((0xC0 <= *pbHwID) && (*pbHwID <= 0xCF)) + { + *pbPCode = (*pbPCode & 0x71); + + if ((MC3XXX_PCODE_3510 == *pbPCode) || (MC3XXX_PCODE_3530 == *pbPCode)) + return (MC3XXX_RETCODE_SUCCESS); + } + else if ((0x20 == *pbHwID) || ((0x22 <= *pbHwID) && (*pbHwID <= 0x2F))) + { + *pbPCode = (*pbPCode & 0xF1); + + if ( (MC3XXX_PCODE_3210 == *pbPCode) || (MC3XXX_PCODE_3216 == *pbPCode) || (MC3XXX_PCODE_3236 == *pbPCode) + || (MC3XXX_PCODE_RESERVE_1 == *pbPCode) || (MC3XXX_PCODE_RESERVE_2 == *pbPCode) || (MC3XXX_PCODE_RESERVE_3 == *pbPCode) + || (MC3XXX_PCODE_RESERVE_4 == *pbPCode) || (MC3XXX_PCODE_RESERVE_5 == *pbPCode) || (MC3XXX_PCODE_RESERVE_6 == *pbPCode) + || (MC3XXX_PCODE_RESERVE_7 == *pbPCode) || (MC3XXX_PCODE_RESERVE_8 == *pbPCode) || (MC3XXX_PCODE_RESERVE_9 == *pbPCode)) + { + return (MC3XXX_RETCODE_SUCCESS); + } + } + + return (MC3XXX_RETCODE_ERROR_IDENTIFICATION); +} + +/***************************************** + *** MC3XXX_Read_Chip_ID + *****************************************/ +static int MC3XXX_Read_Chip_ID(struct i2c_client *client, char *buf) +{ + u8 _bChipID[4] = { 0 }; + + GSE_LOG("[%s]\n", __func__); + + if (!buf || !client) + return EINVAL; + + if (MC3XXX_i2c_read_block(client, 0x3C, _bChipID, 4)) + { + GSE_ERR("[%s] i2c read fail\n", __func__); + _bChipID[0] = 0; + _bChipID[1] = 0; + _bChipID[2] = 0; + _bChipID[3] = 0; + } + + GSE_LOG("[%s] %02X-%02X-%02X-%02X\n", __func__, _bChipID[3], _bChipID[2], _bChipID[1], _bChipID[0]); + + return sprintf(buf, "%02X-%02X-%02X-%02X\n", _bChipID[3], _bChipID[2], _bChipID[1], _bChipID[0]); +} + +/***************************************** + *** MC3XXX_Read_Reg_Map + *****************************************/ +static int MC3XXX_Read_Reg_Map(struct i2c_client *p_i2c_client, u8 *pbUserBuf) +{ + u8 _baData[MC3XXX_REGMAP_LENGTH] = { 0 }; + int _nIndex = 0; + + GSE_LOG("[%s]\n", __func__); + + if(NULL == p_i2c_client) + return (-EINVAL); + + for(_nIndex = 0; _nIndex < MC3XXX_REGMAP_LENGTH; _nIndex++) + { + MC3XXX_i2c_read_block(p_i2c_client, _nIndex, &_baData[_nIndex], 1); + + if (NULL != pbUserBuf) + pbUserBuf[_nIndex] = _baData[_nIndex]; + + printk(KERN_INFO "[Gsensor] REG[0x%02X] = 0x%02X\n", _nIndex, _baData[_nIndex]); + } + + mcube_write_log_data(p_i2c_client, _baData); + + return (0); +} + +/***************************************** + *** MC3XXX_SaveDefaultOffset + *****************************************/ +static void MC3XXX_SaveDefaultOffset(struct i2c_client *p_i2c_client) +{ + GSE_LOG("[%s]\n", __func__); + + MC3XXX_i2c_read_block(p_i2c_client, 0x21, &s_baOTP_OffsetData[0], 3); + MC3XXX_i2c_read_block(p_i2c_client, 0x24, &s_baOTP_OffsetData[3], 3); + + GSE_LOG("s_baOTP_OffsetData: 0x%02X - 0x%02X - 0x%02X - 0x%02X - 0x%02X - 0x%02X\n", + s_baOTP_OffsetData[0], s_baOTP_OffsetData[1], s_baOTP_OffsetData[2], + s_baOTP_OffsetData[3], s_baOTP_OffsetData[4], s_baOTP_OffsetData[5]); +} + +/***************************************** + *** MC3XXX_LPF + *****************************************/ +#ifdef _MC3XXX_SUPPORT_LPF_ +static void MC3XXX_LPF(struct mc3xxx_i2c_data *priv, s16 data[MC3XXX_AXES_NUM]) +{ + if(atomic_read(&priv->filter)) + { + if(atomic_read(&priv->fir_en) && !atomic_read(&priv->suspend)) + { + int idx, firlen = atomic_read(&priv->firlen); + if(priv->fir.num < firlen) + { + priv->fir.raw[priv->fir.num][MC3XXX_AXIS_X] = data[MC3XXX_AXIS_X]; + priv->fir.raw[priv->fir.num][MC3XXX_AXIS_Y] = data[MC3XXX_AXIS_Y]; + priv->fir.raw[priv->fir.num][MC3XXX_AXIS_Z] = data[MC3XXX_AXIS_Z]; + priv->fir.sum[MC3XXX_AXIS_X] += data[MC3XXX_AXIS_X]; + priv->fir.sum[MC3XXX_AXIS_Y] += data[MC3XXX_AXIS_Y]; + priv->fir.sum[MC3XXX_AXIS_Z] += data[MC3XXX_AXIS_Z]; + if(atomic_read(&priv->trace) & MCUBE_TRC_FILTER) + { + GSE_LOG("add [%2d] [%5d %5d %5d] => [%5d %5d %5d]\n", priv->fir.num, + priv->fir.raw[priv->fir.num][MC3XXX_AXIS_X], priv->fir.raw[priv->fir.num][MC3XXX_AXIS_Y], priv->fir.raw[priv->fir.num][MC3XXX_AXIS_Z], + priv->fir.sum[MC3XXX_AXIS_X], priv->fir.sum[MC3XXX_AXIS_Y], priv->fir.sum[MC3XXX_AXIS_Z]); + } + priv->fir.num++; + priv->fir.idx++; + } + else + { + idx = priv->fir.idx % firlen; + priv->fir.sum[MC3XXX_AXIS_X] -= priv->fir.raw[idx][MC3XXX_AXIS_X]; + priv->fir.sum[MC3XXX_AXIS_Y] -= priv->fir.raw[idx][MC3XXX_AXIS_Y]; + priv->fir.sum[MC3XXX_AXIS_Z] -= priv->fir.raw[idx][MC3XXX_AXIS_Z]; + priv->fir.raw[idx][MC3XXX_AXIS_X] = data[MC3XXX_AXIS_X]; + priv->fir.raw[idx][MC3XXX_AXIS_Y] = data[MC3XXX_AXIS_Y]; + priv->fir.raw[idx][MC3XXX_AXIS_Z] = data[MC3XXX_AXIS_Z]; + priv->fir.sum[MC3XXX_AXIS_X] += data[MC3XXX_AXIS_X]; + priv->fir.sum[MC3XXX_AXIS_Y] += data[MC3XXX_AXIS_Y]; + priv->fir.sum[MC3XXX_AXIS_Z] += data[MC3XXX_AXIS_Z]; + priv->fir.idx++; + data[MC3XXX_AXIS_X] = priv->fir.sum[MC3XXX_AXIS_X]/firlen; + data[MC3XXX_AXIS_Y] = priv->fir.sum[MC3XXX_AXIS_Y]/firlen; + data[MC3XXX_AXIS_Z] = priv->fir.sum[MC3XXX_AXIS_Z]/firlen; + if(atomic_read(&priv->trace) & MCUBE_TRC_FILTER) + { + GSE_LOG("add [%2d] [%5d %5d %5d] => [%5d %5d %5d] : [%5d %5d %5d]\n", idx, + priv->fir.raw[idx][MC3XXX_AXIS_X], priv->fir.raw[idx][MC3XXX_AXIS_Y], priv->fir.raw[idx][MC3XXX_AXIS_Z], + priv->fir.sum[MC3XXX_AXIS_X], priv->fir.sum[MC3XXX_AXIS_Y], priv->fir.sum[MC3XXX_AXIS_Z], + data[MC3XXX_AXIS_X], data[MC3XXX_AXIS_Y], data[MC3XXX_AXIS_Z]); + } + } + } + } +} +#endif // END OF #ifdef _MC3XXX_SUPPORT_LPF_ + +#ifdef _MC3XXX_SUPPORT_LRF_ +/***************************************** + *** _MC3XXX_LowResFilter + *****************************************/ +static void _MC3XXX_LowResFilter(s16 nAxis, s16 naData[MC3XXX_AXES_NUM]) +{ + #define _LRF_DIFF_COUNT_POS 2 + #define _LRF_DIFF_COUNT_NEG (-_LRF_DIFF_COUNT_POS) + #define _LRF_DIFF_BOUNDARY_POS (_LRF_DIFF_COUNT_POS + 1) + #define _LRF_DIFF_BOUNDARY_NEG (_LRF_DIFF_COUNT_NEG - 1) + #define _LRF_DIFF_DATA_UNCHANGE_MAX_COUNT 11 + + signed int _nCurrDiff = 0; + signed int _nSumDiff = 0; + s16 _nCurrData = naData[nAxis]; + + _nCurrDiff = (_nCurrData - s_taLRF_CB[nAxis].nRepValue); + + if ((_LRF_DIFF_COUNT_NEG < _nCurrDiff) && (_nCurrDiff < _LRF_DIFF_COUNT_POS)) + { + if (s_taLRF_CB[nAxis].nIsNewRound) + { + s_taLRF_CB[nAxis].nMaxValue = _nCurrData; + s_taLRF_CB[nAxis].nMinValue = _nCurrData; + + s_taLRF_CB[nAxis].nIsNewRound = 0; + s_taLRF_CB[nAxis].nNewDataMonitorCount = 0; + } + else + { + if (_nCurrData > s_taLRF_CB[nAxis].nMaxValue) + s_taLRF_CB[nAxis].nMaxValue = _nCurrData; + else if (_nCurrData < s_taLRF_CB[nAxis].nMinValue) + s_taLRF_CB[nAxis].nMinValue = _nCurrData; + + if (s_taLRF_CB[nAxis].nMinValue != s_taLRF_CB[nAxis].nMaxValue) + { + if (_nCurrData == s_taLRF_CB[nAxis].nPreValue) + s_taLRF_CB[nAxis].nNewDataMonitorCount++; + else + s_taLRF_CB[nAxis].nNewDataMonitorCount = 0; + } + } + + if (1 != (s_taLRF_CB[nAxis].nMaxValue - s_taLRF_CB[nAxis].nMinValue)) + s_taLRF_CB[nAxis].nRepValue = ((s_taLRF_CB[nAxis].nMaxValue + s_taLRF_CB[nAxis].nMinValue) / 2); + + _nSumDiff = (_nCurrDiff + s_taLRF_CB[nAxis].nPreDiff); + + if (_nCurrDiff) + s_taLRF_CB[nAxis].nPreDiff = _nCurrDiff; + + if ((_LRF_DIFF_BOUNDARY_NEG < _nSumDiff) && (_nSumDiff < _LRF_DIFF_BOUNDARY_POS)) + { + if (_LRF_DIFF_DATA_UNCHANGE_MAX_COUNT > s_taLRF_CB[nAxis].nNewDataMonitorCount) + { + naData[nAxis] = s_taLRF_CB[nAxis].nRepValue; + goto _LRF_RETURN; + } + } + } + + s_taLRF_CB[nAxis].nRepValue = _nCurrData; + s_taLRF_CB[nAxis].nPreDiff = 0; + s_taLRF_CB[nAxis].nIsNewRound = 1; + +_LRF_RETURN: + + GSE_LOG(">>>>> [_MC3XXX_LowResFilter][%d] _nCurrDiff: %4d _nSumDiff: %4d _nCurrData: %4d Rep: %4d\n", nAxis, _nCurrDiff, _nSumDiff, _nCurrData, s_taLRF_CB[nAxis].nRepValue); + + s_taLRF_CB[nAxis].nPreValue = _nCurrData; + + #undef _LRF_DIFF_COUNT_POS + #undef _LRF_DIFF_COUNT_NEG + #undef _LRF_DIFF_BOUNDARY_POS + #undef _LRF_DIFF_BOUNDARY_NEG + #undef _LRF_DIFF_DATA_UNCHANGE_MAX_COUNT +} +#endif // END OF #ifdef _MC3XXX_SUPPORT_LRF_ + +/***************************************** + *** _MC3XXX_ReadData_RBM2RAW + *****************************************/ +static void _MC3XXX_ReadData_RBM2RAW(s16 waData[MC3XXX_AXES_NUM]) +{ + struct mc3xxx_i2c_data *_pt_i2c_obj = mc3xxx_obj_i2c_data; + + waData[MC3XXX_AXIS_X] = (waData[MC3XXX_AXIS_X] + offset_data[MC3XXX_AXIS_X] / 2) * 1024 / gain_data[MC3XXX_AXIS_X] + 8096; + waData[MC3XXX_AXIS_Y] = (waData[MC3XXX_AXIS_Y] + offset_data[MC3XXX_AXIS_Y] / 2) * 1024 / gain_data[MC3XXX_AXIS_Y] + 8096; + waData[MC3XXX_AXIS_Z] = (waData[MC3XXX_AXIS_Z] + offset_data[MC3XXX_AXIS_Z] / 2) * 1024 / gain_data[MC3XXX_AXIS_Z] + 8096; + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("RBM->RAW <<<<<[%08d %08d %08d]\n", waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + iAReal0_X = (0x0010 * waData[MC3XXX_AXIS_X]); + iAcc1Lpf0_X = GetLowPassFilter(iAReal0_X,iAcc1Lpf1_X); + iAcc0Lpf0_X = GetLowPassFilter(iAcc1Lpf0_X,iAcc0Lpf1_X); + waData[MC3XXX_AXIS_X] = (iAcc0Lpf0_X / 0x0010); + + iAReal0_Y = (0x0010 * waData[MC3XXX_AXIS_Y]); + iAcc1Lpf0_Y = GetLowPassFilter(iAReal0_Y,iAcc1Lpf1_Y); + iAcc0Lpf0_Y = GetLowPassFilter(iAcc1Lpf0_Y,iAcc0Lpf1_Y); + waData[MC3XXX_AXIS_Y] = (iAcc0Lpf0_Y / 0x0010); + + iAReal0_Z = (0x0010 * waData[MC3XXX_AXIS_Z]); + iAcc1Lpf0_Z = GetLowPassFilter(iAReal0_Z,iAcc1Lpf1_Z); + iAcc0Lpf0_Z = GetLowPassFilter(iAcc1Lpf0_Z,iAcc0Lpf1_Z); + waData[MC3XXX_AXIS_Z] = (iAcc0Lpf0_Z / 0x0010); + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("RBM->RAW->LPF <<<<<[%08d %08d %08d]\n", waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + waData[MC3XXX_AXIS_X] = (waData[MC3XXX_AXIS_X] - 8096) * gsensor_gain.x / 1024; + waData[MC3XXX_AXIS_Y] = (waData[MC3XXX_AXIS_Y] - 8096) * gsensor_gain.y / 1024; + waData[MC3XXX_AXIS_Z] = (waData[MC3XXX_AXIS_Z] - 8096) * gsensor_gain.z / 1024; + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("RBM->RAW->LPF->RAW <<<<<[%08d %08d %08d]\n", waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + iAcc0Lpf1_X=iAcc0Lpf0_X; + iAcc1Lpf1_X=iAcc1Lpf0_X; + iAcc0Lpf1_Y=iAcc0Lpf0_Y; + iAcc1Lpf1_Y=iAcc1Lpf0_Y; + iAcc0Lpf1_Z=iAcc0Lpf0_Z; + iAcc1Lpf1_Z=iAcc1Lpf0_Z; +} + +/***************************************** + *** MC3XXX_ReadData + *****************************************/ +static int MC3XXX_ReadData(struct i2c_client *pt_i2c_client, s16 waData[MC3XXX_AXES_NUM]) +{ + u8 _baData[MC3XXX_DATA_LEN] = { 0 }; + struct mc3xxx_i2c_data *_pt_i2c_obj = ((struct mc3xxx_i2c_data*) i2c_get_clientdata(pt_i2c_client)); + + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("[%s] s_nIsRBM_Enabled: %d\n", __FUNCTION__, s_nIsRBM_Enabled); + } + if (NULL == pt_i2c_client) + { + GSE_ERR("ERR: Null Pointer\n"); + + return (MC3XXX_RETCODE_ERROR_NULL_POINTER); + } + + if (!s_nIsRBM_Enabled) + { + if (MC3XXX_RESOLUTION_LOW == s_bResolution) + { + if (MC3XXX_i2c_read_block(pt_i2c_client, MC3XXX_REG_XOUT, _baData, MC3XXX_LOW_REOLUTION_DATA_SIZE)) + { + GSE_ERR("ERR: fail to read data via I2C!\n"); + + return (MC3XXX_RETCODE_ERROR_I2C); + } + + waData[MC3XXX_AXIS_X] = ((s8) _baData[0]); + waData[MC3XXX_AXIS_Y] = ((s8) _baData[1]); + waData[MC3XXX_AXIS_Z] = ((s8) _baData[2]); + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("[%s][low] X: %d, Y: %d, Z: %d\n", __FUNCTION__, waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + + #ifdef _MC3XXX_SUPPORT_LRF_ + _MC3XXX_LowResFilter(MC3XXX_AXIS_X, waData); + _MC3XXX_LowResFilter(MC3XXX_AXIS_Y, waData); + _MC3XXX_LowResFilter(MC3XXX_AXIS_Z, waData); + #endif + } + else if (MC3XXX_RESOLUTION_HIGH == s_bResolution) + { + if (MC3XXX_i2c_read_block(pt_i2c_client, MC3XXX_REG_XOUT_EX_L, _baData, MC3XXX_HIGH_REOLUTION_DATA_SIZE)) + { + GSE_ERR("ERR: fail to read data via I2C!\n"); + + return (MC3XXX_RETCODE_ERROR_I2C); + } + + waData[MC3XXX_AXIS_X] = ((signed short) ((_baData[0]) | (_baData[1]<<8))); + waData[MC3XXX_AXIS_Y] = ((signed short) ((_baData[2]) | (_baData[3]<<8))); + waData[MC3XXX_AXIS_Z] = ((signed short) ((_baData[4]) | (_baData[5]<<8))); + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("[%s][high] X: %d, Y: %d, Z: %d\n", __FUNCTION__, waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + } + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("RAW<<<<<[%04d %04d %04d]\n", waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + #ifdef _MC3XXX_SUPPORT_LPF_ + { + struct mc3xxx_i2c_data *_ptPrivData = i2c_get_clientdata(pt_i2c_client); + + MC3XXX_LPF(_ptPrivData, waData); + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("LPF<<<<<[%04d %04d %04d]\n", waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + } + #endif + } + else + { + if (MC3XXX_i2c_read_block(pt_i2c_client, MC3XXX_REG_XOUT_EX_L, _baData, MC3XXX_HIGH_REOLUTION_DATA_SIZE)) + { + GSE_ERR("ERR: fail to read data via I2C!\n"); + + return (MC3XXX_RETCODE_ERROR_I2C); + } + + waData[MC3XXX_AXIS_X] = ((s16)((_baData[0]) | (_baData[1] << 8))); + waData[MC3XXX_AXIS_Y] = ((s16)((_baData[2]) | (_baData[3] << 8))); + waData[MC3XXX_AXIS_Z] = ((s16)((_baData[4]) | (_baData[5] << 8))); + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("RBM<<<<<[%08d %08d %08d]\n", waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y], waData[MC3XXX_AXIS_Z]); + } + _MC3XXX_ReadData_RBM2RAW(waData); + } + + MCUBE_RREMAP(waData[MC3XXX_AXIS_X], waData[MC3XXX_AXIS_Y]); + + return (MC3XXX_RETCODE_SUCCESS); +} + +/***************************************** + *** MC3XXX_ReadOffset + *****************************************/ +static int MC3XXX_ReadOffset(struct i2c_client *client, s16 ofs[MC3XXX_AXES_NUM]) +{ + int err=0; + u8 off_data[6]={0}; + + + if (MC3XXX_RESOLUTION_HIGH == s_bResolution) + { + if ((err = MC3XXX_i2c_read_block(client, MC3XXX_REG_XOUT_EX_L, off_data, MC3XXX_DATA_LEN))) + { + GSE_ERR("error: %d\n", err); + return err; + } + ofs[MC3XXX_AXIS_X] = ((s16)(off_data[0]))|((s16)(off_data[1])<<8); + ofs[MC3XXX_AXIS_Y] = ((s16)(off_data[2]))|((s16)(off_data[3])<<8); + ofs[MC3XXX_AXIS_Z] = ((s16)(off_data[4]))|((s16)(off_data[5])<<8); + } + else if (MC3XXX_RESOLUTION_LOW == s_bResolution) + { + if ((err = MC3XXX_i2c_read_block(client, 0, off_data, 3))) + { + GSE_ERR("error: %d\n", err); + return err; + } + ofs[MC3XXX_AXIS_X] = (s8)off_data[0]; + ofs[MC3XXX_AXIS_Y] = (s8)off_data[1]; + ofs[MC3XXX_AXIS_Z] = (s8)off_data[2]; + } + + GSE_LOG("MC3XXX_ReadOffset %d %d %d \n",ofs[MC3XXX_AXIS_X] ,ofs[MC3XXX_AXIS_Y],ofs[MC3XXX_AXIS_Z]); + + MCUBE_RREMAP(ofs[0], ofs[1]); + + return err; +} + +/***************************************** + *** MC3XXX_ResetCalibration + *****************************************/ +static int MC3XXX_ResetCalibration(struct i2c_client *client) +{ + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + u8 buf[MC3XXX_AXES_NUM] = {0x00, 0x00, 0x00}; + s16 tmp=0; + int err=0; + + u8 bMsbFilter = 0x3F; + s16 wSignBitMask = 0x2000; + s16 wSignPaddingBits = 0xC000; + + buf[0] = 0x43; + + if((err = MC3XXX_i2c_write_block(client, 0x07, buf, 1))) + { + GSE_ERR("error 0x07: %d\n", err); + } + + + if((err = MC3XXX_i2c_write_block(client, 0x21, offset_buf, 6))) // add by liang for writing offset register as OTP value + { + GSE_ERR("error: %d\n", err); + } + + buf[0] = 0x41; + + if((err = MC3XXX_i2c_write_block(client, 0x07, buf, 1))) + { + GSE_ERR("error: %d\n", err); + } + + msleep(20); + + if (IS_MCFM12() || IS_MCFM3X()) + { + bMsbFilter = 0x7F; + wSignBitMask = 0x4000; + wSignPaddingBits = 0x8000; + } + + tmp = ((offset_buf[1] & bMsbFilter) << 8) + offset_buf[0]; // add by Liang for set offset_buf as OTP value + if (tmp & wSignBitMask) + tmp |= wSignPaddingBits; + offset_data[0] = tmp; + + tmp = ((offset_buf[3] & bMsbFilter) << 8) + offset_buf[2]; // add by Liang for set offset_buf as OTP value + if (tmp & wSignBitMask) + tmp |= wSignPaddingBits; + offset_data[1] = tmp; + + tmp = ((offset_buf[5] & bMsbFilter) << 8) + offset_buf[4]; // add by Liang for set offset_buf as OTP value + if (tmp & wSignBitMask) + tmp |= wSignPaddingBits; + offset_data[2] = tmp; + + memset(obj->cali_sw, 0x00, sizeof(obj->cali_sw)); + + return err; +} + +/***************************************** + *** MC3XXX_ReadCalibration + *****************************************/ +static int MC3XXX_ReadCalibration(struct i2c_client *client, int dat[MC3XXX_AXES_NUM]) +{ + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + int err =0; + + if ((err = MC3XXX_ReadOffset(client, obj->offset))) { + GSE_ERR("read offset fail, %d\n", err); + return err; + } + + dat[MC3XXX_AXIS_X] = obj->offset[MC3XXX_AXIS_X]; + dat[MC3XXX_AXIS_Y] = obj->offset[MC3XXX_AXIS_Y]; + dat[MC3XXX_AXIS_Z] = obj->offset[MC3XXX_AXIS_Z]; + + GSE_LOG("MC3XXX_ReadCalibration %d %d %d \n",dat[obj->cvt.map[MC3XXX_AXIS_X]] ,dat[obj->cvt.map[MC3XXX_AXIS_Y]],dat[obj->cvt.map[MC3XXX_AXIS_Z]]); + + return 0; +} + +/***************************************** + *** MC3XXX_WriteCalibration + *****************************************/ +static int MC3XXX_WriteCalibration(struct i2c_client *client, int dat[MC3XXX_AXES_NUM]) +{ + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + int err = 0; + u8 buf[9] ={ 0}; + s16 tmp = 0, x_gain = 0, y_gain = 0, z_gain = 0; + s32 x_off = 0, y_off = 0, z_off = 0; + int cali[MC3XXX_AXES_NUM] = {0}; + + u8 bMsbFilter = 0x3F; + s16 wSignBitMask = 0x2000; + s16 wSignPaddingBits = 0xC000; + s32 dwRangePosLimit = 0x1FFF; + s32 dwRangeNegLimit = -0x2000; + + GSE_LOG("UPDATE dat: (%+3d %+3d %+3d)\n", dat[MC3XXX_AXIS_X], dat[MC3XXX_AXIS_Y], dat[MC3XXX_AXIS_Z]); + + cali[MC3XXX_AXIS_X] = obj->cvt.sign[MC3XXX_AXIS_X]*(dat[obj->cvt.map[MC3XXX_AXIS_X]]); + cali[MC3XXX_AXIS_Y] = obj->cvt.sign[MC3XXX_AXIS_Y]*(dat[obj->cvt.map[MC3XXX_AXIS_Y]]); + cali[MC3XXX_AXIS_Z] = obj->cvt.sign[MC3XXX_AXIS_Z]*(dat[obj->cvt.map[MC3XXX_AXIS_Z]]); + + MCUBE_WREMAP(cali[MC3XXX_AXIS_X], cali[MC3XXX_AXIS_Y]); + + GSE_LOG("UPDATE dat: (%+3d %+3d %+3d)\n", cali[MC3XXX_AXIS_X], cali[MC3XXX_AXIS_Y], cali[MC3XXX_AXIS_Z]); + + // read registers 0x21~0x29 + if ((err = MC3XXX_i2c_read_block(client, 0x21, buf, 3))) + { + GSE_ERR("error: %d\n", err); + return err; + } + if ((err = MC3XXX_i2c_read_block(client, 0x24, &buf[3], 3))) + { + GSE_ERR("error: %d\n", err); + return err; + } + if ((err = MC3XXX_i2c_read_block(client, 0x27, &buf[6], 3))) + { + GSE_ERR("error: %d\n", err); + return err; + } + + if (IS_MCFM12() || IS_MCFM3X()) + { + bMsbFilter = 0x7F; + wSignBitMask = 0x4000; + wSignPaddingBits = 0x8000; + dwRangePosLimit = 0x3FFF; + dwRangeNegLimit = -0x4000; + } + + // get x,y,z offset + tmp = ((buf[1] & bMsbFilter) << 8) + buf[0]; + if (tmp & wSignBitMask) + tmp |= wSignPaddingBits; + x_off = tmp; + + tmp = ((buf[3] & bMsbFilter) << 8) + buf[2]; + if (tmp & wSignBitMask) + tmp |= wSignPaddingBits; + y_off = tmp; + + tmp = ((buf[5] & bMsbFilter) << 8) + buf[4]; + if (tmp & wSignBitMask) + tmp |= wSignPaddingBits; + z_off = tmp; + + // get x,y,z gain + x_gain = ((buf[1] >> 7) << 8) + buf[6]; + y_gain = ((buf[3] >> 7) << 8) + buf[7]; + z_gain = ((buf[5] >> 7) << 8) + buf[8]; + + // prepare new offset + x_off = x_off + 16 * cali[MC3XXX_AXIS_X] * 256 * 128 / 3 / gsensor_gain.x / (40 + x_gain); + y_off = y_off + 16 * cali[MC3XXX_AXIS_Y] * 256 * 128 / 3 / gsensor_gain.y / (40 + y_gain); + z_off = z_off + 16 * cali[MC3XXX_AXIS_Z] * 256 * 128 / 3 / gsensor_gain.z / (40 + z_gain); + + //add for over range + if( x_off > dwRangePosLimit) + { + x_off = dwRangePosLimit; + } + else if( x_off < dwRangeNegLimit) + { + x_off = dwRangeNegLimit; + } + + if( y_off > dwRangePosLimit) + { + y_off = dwRangePosLimit; + } + else if( y_off < dwRangeNegLimit) + { + y_off = dwRangeNegLimit; + } + + if( z_off > dwRangePosLimit) + { + z_off = dwRangePosLimit; + } + else if( z_off < dwRangeNegLimit) + { + z_off = dwRangeNegLimit; + } + + //storege the cerrunt offset data with DOT format + offset_data[0] = x_off; + offset_data[1] = y_off; + offset_data[2] = z_off; + + //storege the cerrunt Gain data with GOT format + gain_data[0] = 256*8*128/3/(40+x_gain); + gain_data[1] = 256*8*128/3/(40+y_gain); + gain_data[2] = 256*8*128/3/(40+z_gain); + + buf[0]=0x43; + MC3XXX_i2c_write_block(client, 0x07, buf, 1); + + buf[0] = x_off & 0xff; + buf[1] = ((x_off >> 8) & bMsbFilter) | (x_gain & 0x0100 ? 0x80 : 0); + buf[2] = y_off & 0xff; + buf[3] = ((y_off >> 8) & bMsbFilter) | (y_gain & 0x0100 ? 0x80 : 0); + buf[4] = z_off & 0xff; + buf[5] = ((z_off >> 8) & bMsbFilter) | (z_gain & 0x0100 ? 0x80 : 0); + + MC3XXX_i2c_write_block(client, 0x21, buf, 6); + + buf[0]=0x41; + MC3XXX_i2c_write_block(client, 0x07, buf, 1); + + msleep(50); + + return err; +} + +/***************************************** + *** MC3XXX_SetPowerMode + *****************************************/ +static int MC3XXX_SetPowerMode(struct i2c_client *client, bool enable) +{ + u8 databuf[2] = {0}; + int res = 0; + u8 addr = MC3XXX_REG_MODE_FEATURE; + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + + if(enable == mc3xxx_sensor_power) + GSE_LOG("Sensor power status should not be set again!!!\n"); + + if(MC3XXX_i2c_read_block(client, addr, databuf,1)) + { + GSE_ERR("read power ctl register err!\n"); + return MC3XXX_RETCODE_ERROR_I2C; + } + + GSE_LOG("set power read MC3XXX_REG_MODE_FEATURE =%x\n", databuf[0]); + + if(enable) + { + databuf[0] = 0x41; + res = MC3XXX_i2c_write_block(client, MC3XXX_REG_MODE_FEATURE, databuf, 1); + #ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ + mcube_load_cali(client); + #endif + } + else + { + databuf[0] = 0x43; + res = MC3XXX_i2c_write_block(client, MC3XXX_REG_MODE_FEATURE, databuf, 1); + } + + if(res < 0) + { + GSE_LOG("fwq set power mode failed!\n"); + return MC3XXX_RETCODE_ERROR_I2C; + } + else if(atomic_read(&obj->trace) & MCUBE_TRC_INFO) + { + GSE_LOG("fwq set power mode ok %d!\n", databuf[1]); + } + + mc3xxx_sensor_power = enable; + + return MC3XXX_RETCODE_SUCCESS; +} + +/***************************************** + *** MC3XXX_SetResolution + *****************************************/ +static void MC3XXX_SetResolution(void) +{ + GSE_LOG("[%s]\n", __FUNCTION__); + + switch (s_bPCODE) + { + case MC3XXX_PCODE_3230: + case MC3XXX_PCODE_3430: + case MC3XXX_PCODE_3430N: + case MC3XXX_PCODE_3530: + case MC3XXX_PCODE_3236: + s_bResolution = MC3XXX_RESOLUTION_LOW; + break; + + case MC3XXX_PCODE_3210: + case MC3XXX_PCODE_3250: + case MC3XXX_PCODE_3410: + case MC3XXX_PCODE_3410N: + case MC3XXX_PCODE_3510: + case MC3XXX_PCODE_3216: + s_bResolution = MC3XXX_RESOLUTION_HIGH; + break; + + // === RESERVED ==================================BGN=== + // === (move to normal section once it is confirmed) === + case MC3XXX_PCODE_RESERVE_10: + GSE_ERR("RESERVED ONLINE!\n"); + // TODO: should have a default configuration... + break; + + case MC3XXX_PCODE_RESERVE_1: + case MC3XXX_PCODE_RESERVE_3: + case MC3XXX_PCODE_RESERVE_4: + case MC3XXX_PCODE_RESERVE_5: + case MC3XXX_PCODE_RESERVE_6: + case MC3XXX_PCODE_RESERVE_8: + case MC3XXX_PCODE_RESERVE_9: + GSE_ERR("RESERVED ONLINE!\n"); + s_bResolution = MC3XXX_RESOLUTION_LOW; + break; + + case MC3XXX_PCODE_RESERVE_2: + case MC3XXX_PCODE_RESERVE_7: + GSE_ERR("RESERVED ONLINE!\n"); + s_bResolution = MC3XXX_RESOLUTION_HIGH; + break; + // === RESERVED ==================================END=== + + default: + GSE_ERR("ERR: no resolution assigned!\n"); + break; + } + + GSE_LOG("[%s] s_bResolution: %d\n", __FUNCTION__, s_bResolution); +} + +/***************************************** + *** MC3XXX_SetSampleRate + *****************************************/ +static void MC3XXX_SetSampleRate(struct i2c_client *pt_i2c_client) +{ + unsigned char _baDataBuf[2] = { 0 }; + + GSE_LOG("[%s]\n", __FUNCTION__); + + _baDataBuf[0] = MC3XXX_REG_SAMPLE_RATE; + _baDataBuf[1] = 0x00; + + if (IS_MCFM12() || IS_MCFM3X()) + { + unsigned char _baData2Buf[2] = { 0 }; + + _baData2Buf[0] = 0x2A; + MC3XXX_i2c_read_block(pt_i2c_client, 0x2A, _baData2Buf, 1); + + GSE_LOG("[%s] REG(0x2A) = 0x%02X\n", __FUNCTION__, _baData2Buf[0]); + + _baData2Buf[0] = (_baData2Buf[0] & 0xC0); + + switch (_baData2Buf[0]) + { + case 0x00: _baDataBuf[0] = 0x00; break; + case 0x40: _baDataBuf[0] = 0x08; break; + case 0x80: _baDataBuf[0] = 0x09; break; + case 0xC0: _baDataBuf[0] = 0x0A; break; + + default: GSE_ERR("[%s] no chance to get here... check code!\n", __FUNCTION__); break; + } + } + else + _baDataBuf[0] = 0x00; + + MC3XXX_i2c_write_block(pt_i2c_client, MC3XXX_REG_SAMPLE_RATE, _baDataBuf, 1); +} + +/***************************************** + *** MC3XXX_ConfigRegRange + *****************************************/ +static void MC3XXX_ConfigRegRange(struct i2c_client *pt_i2c_client) +{ + unsigned char _baDataBuf[2] = { 0 }; + int res = 0; + + //_baDataBuf[0] = 0x3F; + /* Modify low pass filter bandwith to 512hz, for solving sensor data don't change issue */ + _baDataBuf[0] = 0x0F; + + if (MC3XXX_RESOLUTION_LOW == s_bResolution) + _baDataBuf[0] = 0x32; + + if (IS_MCFM12() || IS_MCFM3X()) + { + if (MC3XXX_RESOLUTION_LOW == s_bResolution) + _baDataBuf[0] = 0x02; + else + _baDataBuf[0] = 0x25; + } + res = MC3XXX_i2c_write_block(pt_i2c_client, MC3XXX_REG_RANGE_CONTROL, _baDataBuf, 1); + if (res < 0) + GSE_ERR("MC3XXX_ConfigRegRange fail \n"); + + GSE_LOG("[%s] set 0x%X\n", __FUNCTION__, _baDataBuf[1]); +} + +/***************************************** + *** MC3XXX_SetGain + *****************************************/ +static void MC3XXX_SetGain(void) +{ + gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 1024; + + if (MC3XXX_RESOLUTION_LOW == s_bResolution) + { + gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 86; + + if (IS_MCFM12() || IS_MCFM3X()) + { + gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 64; + } + } + + GSE_LOG("[%s] gain: %d / %d / %d\n", __FUNCTION__, gsensor_gain.x, gsensor_gain.y, gsensor_gain.z); +} + +/***************************************** + *** MC3XXX_Init + *****************************************/ +static int MC3XXX_Init(struct i2c_client *client, int reset_cali) +{ + unsigned char _baDataBuf[2] = { 0 }; + + GSE_LOG("[%s]\n", __FUNCTION__); + + #ifdef _MC3XXX_SUPPORT_POWER_SAVING_SHUTDOWN_POWER_ + if (MC3XXX_RETCODE_SUCCESS != _mc3xxx_i2c_auto_probe(client)) + { + //GSE_ERR("ERR: fail to probe mCube sensor!\n"); + return (MC3XXX_RETCODE_ERROR_I2C); + } + + //GSE_LOG("[%s] confirmed i2c addr: 0x%X\n", __FUNCTION__, client->addr); + #endif + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, MC3XXX_REG_MODE_FEATURE, _baDataBuf, 1); + + MC3XXX_SetResolution(); + MC3XXX_SetSampleRate(client); + MC3XXX_ConfigRegRange(client); + MC3XXX_SetGain(); + + _baDataBuf[0] = 0x00; + MC3XXX_i2c_write_block(client, MC3XXX_REG_TAP_DETECTION_ENABLE, _baDataBuf, 1); + + _baDataBuf[0] = 0x00; + MC3XXX_i2c_write_block(client, MC3XXX_REG_INTERRUPT_ENABLE, _baDataBuf, 1); + + _baDataBuf[0] = 0; + MC3XXX_i2c_read_block(client, 0x2A, _baDataBuf, 1); + s_bMPOL = (_baDataBuf[0] & 0x03); + + #ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ + MC3XXX_rbm(client,0); + #endif + + #ifdef _MC3XXX_SUPPORT_LPF_ + { + struct mc3xxx_i2c_data *_pt_i2c_data = i2c_get_clientdata(client); + + memset(&_pt_i2c_data->fir, 0x00, sizeof(_pt_i2c_data->fir)); + } + #endif + + #ifdef _MC3XXX_SUPPORT_LRF_ + memset(&s_taLRF_CB, 0, sizeof(s_taLRF_CB)); + #endif + + #ifdef _MC3XXX_SUPPORT_PERIODIC_DOC_ + init_waitqueue_head(&wq_mc3xxx_open_status); + #endif + + GSE_LOG("[%s] init ok.\n", __FUNCTION__); + + return (MC3XXX_RETCODE_SUCCESS); +} + +/***************************************** + *** MC3XXX_ReadChipInfo + *****************************************/ +static int MC3XXX_ReadChipInfo(struct i2c_client *client, char *buf, int bufsize) +{ + if((NULL == buf)||(bufsize<=30)) + { + return -1; + } + + if(NULL == client) + { + *buf = 0; + return -2; + } + + sprintf(buf, "MC3XXX Chip"); + return 0; +} + +/***************************************** + *** MC3XXX_ReadSensorData + *****************************************/ +static int MC3XXX_ReadSensorData(struct i2c_client *pt_i2c_client, char *pbBuf, int nBufSize) +{ + int _naAccelData[MC3XXX_AXES_NUM] = { 0 }; + struct mc3xxx_i2c_data *_pt_i2c_obj = ((struct mc3xxx_i2c_data*) i2c_get_clientdata(pt_i2c_client)); + + if ((NULL == pt_i2c_client) || (NULL == pbBuf)) + { + GSE_ERR("ERR: Null Pointer \n"); + + return (MC3XXX_RETCODE_ERROR_NULL_POINTER); + } + + if (false == mc3xxx_sensor_power) + { + if (MC3XXX_RETCODE_SUCCESS != MC3XXX_SetPowerMode(pt_i2c_client, true)) + GSE_ERR("ERR: fail to set power mode!\n"); + } + + #ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ + mcube_load_cali(pt_i2c_client); + + if ((s_nIsRBM_Enabled) && (1 == LPF_FirstRun)) + { + int _nLoopIndex = 0; + + LPF_FirstRun = 0; + + for (_nLoopIndex = 0; _nLoopIndex < (LPF_SamplingRate + LPF_CutoffFrequency); _nLoopIndex++) + MC3XXX_ReadData(pt_i2c_client, _pt_i2c_obj->data); + } + #endif + + if (MC3XXX_RETCODE_SUCCESS != MC3XXX_ReadData(pt_i2c_client, _pt_i2c_obj->data)) + { + GSE_ERR("ERR: fail to read data!\n"); + + return (MC3XXX_RETCODE_ERROR_I2C); + } + + //output format: mg + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("[%s] raw data: %d, %d, %d\n", __FUNCTION__, _pt_i2c_obj->data[MC3XXX_AXIS_X], _pt_i2c_obj->data[MC3XXX_AXIS_Y], _pt_i2c_obj->data[MC3XXX_AXIS_Z]); + } + _naAccelData[(_pt_i2c_obj->cvt.map[MC3XXX_AXIS_X])] = (_pt_i2c_obj->cvt.sign[MC3XXX_AXIS_X] * _pt_i2c_obj->data[MC3XXX_AXIS_X]); + _naAccelData[(_pt_i2c_obj->cvt.map[MC3XXX_AXIS_Y])] = (_pt_i2c_obj->cvt.sign[MC3XXX_AXIS_Y] * _pt_i2c_obj->data[MC3XXX_AXIS_Y]); + _naAccelData[(_pt_i2c_obj->cvt.map[MC3XXX_AXIS_Z])] = (_pt_i2c_obj->cvt.sign[MC3XXX_AXIS_Z] * _pt_i2c_obj->data[MC3XXX_AXIS_Z]); + + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("[%s] map data: %d, %d, %d!\n", __FUNCTION__, _naAccelData[MC3XXX_AXIS_X], _naAccelData[MC3XXX_AXIS_Y], _naAccelData[MC3XXX_AXIS_Z]); + } + _naAccelData[MC3XXX_AXIS_X] = (_naAccelData[MC3XXX_AXIS_X] * GRAVITY_EARTH_1000 / gsensor_gain.x); + _naAccelData[MC3XXX_AXIS_Y] = (_naAccelData[MC3XXX_AXIS_Y] * GRAVITY_EARTH_1000 / gsensor_gain.y); + _naAccelData[MC3XXX_AXIS_Z] = (_naAccelData[MC3XXX_AXIS_Z] * GRAVITY_EARTH_1000 / gsensor_gain.z); + + if(atomic_read(&_pt_i2c_obj->trace) & MCUBE_TRC_INFO) { + GSE_LOG("[%s] accel data: %d, %d, %d!\n", __FUNCTION__, _naAccelData[MC3XXX_AXIS_X], _naAccelData[MC3XXX_AXIS_Y], _naAccelData[MC3XXX_AXIS_Z]); + } + sprintf(pbBuf, "%04x %04x %04x", _naAccelData[MC3XXX_AXIS_X], _naAccelData[MC3XXX_AXIS_Y], _naAccelData[MC3XXX_AXIS_Z]); + + return (MC3XXX_RETCODE_SUCCESS); +} + +/***************************************** + *** _MC3XXX_ReadAverageData + *****************************************/ +#ifdef _MC3XXX_SUPPORT_APPLY_AVERAGE_AGORITHM_ +static int _MC3XXX_ReadAverageData(struct i2c_client *client, char *buf) +{ + struct mc3xxx_i2c_data *obj = (struct mc3xxx_i2c_data*)i2c_get_clientdata(client); + int acc[MC3XXX_AXES_NUM]={0}; + s16 sensor_data[3]={0}; + s16 sensor_data_max[3]={0}; + s16 sensor_data_mini[3]={0}; + s32 sensor_data_sum[3]={0}; + + int i = 0,j=0; + + MC3XXX_ReadData(client, sensor_data); + GSE_LOG("MC3XXX_ReadRawData MC3XXX_ReadData: %d, %d, %d!\n", sensor_data[MC3XXX_AXIS_X], sensor_data[MC3XXX_AXIS_Y], sensor_data[MC3XXX_AXIS_Z]); + sensor_data_max[MC3XXX_AXIS_X]=sensor_data[MC3XXX_AXIS_X]; + sensor_data_max[MC3XXX_AXIS_Y]=sensor_data[MC3XXX_AXIS_Y]; + sensor_data_max[MC3XXX_AXIS_Z]=sensor_data[MC3XXX_AXIS_Z]; + + sensor_data_mini[MC3XXX_AXIS_X]=sensor_data[MC3XXX_AXIS_X]; + sensor_data_mini[MC3XXX_AXIS_Y]=sensor_data[MC3XXX_AXIS_Y]; + sensor_data_mini[MC3XXX_AXIS_Z]=sensor_data[MC3XXX_AXIS_Z]; + + sensor_data_sum[MC3XXX_AXIS_X]+=sensor_data[MC3XXX_AXIS_X]; + sensor_data_sum[MC3XXX_AXIS_Y]+=sensor_data[MC3XXX_AXIS_Y]; + sensor_data_sum[MC3XXX_AXIS_Z]+=sensor_data[MC3XXX_AXIS_Z]; + + for(i=0; i<11 ; i++) + { + MC3XXX_ReadData(client, sensor_data); + GSE_LOG("MC3XXX_ReadRawData MC3XXX_ReadData: %d, %d, %d!\n", sensor_data[MC3XXX_AXIS_X], sensor_data[MC3XXX_AXIS_Y], sensor_data[MC3XXX_AXIS_Z]); + + sensor_data_sum[MC3XXX_AXIS_X]+=sensor_data[MC3XXX_AXIS_X]; + sensor_data_sum[MC3XXX_AXIS_Y]+=sensor_data[MC3XXX_AXIS_Y]; + sensor_data_sum[MC3XXX_AXIS_Z]+=sensor_data[MC3XXX_AXIS_Z]; + for(j=0; j<3 ; j++) + { + if(sensor_data[j]>sensor_data_max[j]) + { + sensor_data_max[j]=sensor_data[j]; + } + if(sensor_data[j]cvt.map[MC3XXX_AXIS_X])] = obj->cvt.sign[MC3XXX_AXIS_X] * sensor_data[MC3XXX_AXIS_X]; + acc[(obj->cvt.map[MC3XXX_AXIS_Y])] = obj->cvt.sign[MC3XXX_AXIS_Y] * sensor_data[MC3XXX_AXIS_Y]; + acc[(obj->cvt.map[MC3XXX_AXIS_Z])] = obj->cvt.sign[MC3XXX_AXIS_Z] * sensor_data[MC3XXX_AXIS_Z]; + + GSE_LOG("MC3XXX_ReadRawData mapdata: %d, %d, %d!\n", acc[MC3XXX_AXIS_X], acc[MC3XXX_AXIS_Y], acc[MC3XXX_AXIS_Z]); + + acc[MC3XXX_AXIS_X] = (acc[MC3XXX_AXIS_X]*GRAVITY_EARTH_1000/gsensor_gain.x); + acc[MC3XXX_AXIS_Y] = (acc[MC3XXX_AXIS_Y]*GRAVITY_EARTH_1000/gsensor_gain.y); + acc[MC3XXX_AXIS_Z] = (acc[MC3XXX_AXIS_Z]*GRAVITY_EARTH_1000/gsensor_gain.z); + + GSE_LOG("MC3XXX_ReadRawData mapdata1: %d, %d, %d!\n", acc[MC3XXX_AXIS_X], acc[MC3XXX_AXIS_Y], acc[MC3XXX_AXIS_Z]); + + sprintf(buf, "%04x %04x %04x", acc[MC3XXX_AXIS_X], acc[MC3XXX_AXIS_Y], acc[MC3XXX_AXIS_Z]); + + return 0; +} +#endif // END OF #ifdef _MC3XXX_SUPPORT_APPLY_AVERAGE_AGORITHM_ + +/***************************************** + *** MC3XXX_ReadRawData + *****************************************/ +static int MC3XXX_ReadRawData(struct i2c_client *client, char *buf) +{ + int res = 0; + + if (!buf || !client) + { + return EINVAL; + } + + if(mc3xxx_sensor_power == false) + { + res = MC3XXX_SetPowerMode(client, true); + if(res) + { + GSE_ERR("Power on mc3xxx error %d!\n", res); + } + } + + #ifdef _MC3XXX_SUPPORT_APPLY_AVERAGE_AGORITHM_ + return (_MC3XXX_ReadAverageData(client, buf)); + #else + { + s16 sensor_data[3]={0}; + + if((res = MC3XXX_ReadData(client, sensor_data))) + { + GSE_ERR("I2C error: ret value=%d", res); + return EIO; + } + else + { + sprintf(buf, "%04x %04x %04x", sensor_data[MC3XXX_AXIS_X], + sensor_data[MC3XXX_AXIS_Y], sensor_data[MC3XXX_AXIS_Z]); + } + } + #endif + + return 0; +} + +#ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ +/***************************************** + *** MC3XXX_ReadRBMData + *****************************************/ +static int MC3XXX_ReadRBMData(struct i2c_client *client, char *buf) +{ + int res = 0; + int data[3] = { 0 }; + + if (!buf || !client) + { + return EINVAL; + } + + if(mc3xxx_sensor_power == false) + { + res = MC3XXX_SetPowerMode(client, true); + if(res) + { + GSE_ERR("Power on mc3xxx error %d!\n", res); + } + } + + if((res = MC3XXX_ReadData_RBM(client, data))) + { + GSE_ERR("I2C error: ret value=%d", res); + return EIO; + } + else + { + sprintf(buf, "%04x %04x %04x", data[MC3XXX_AXIS_X], + data[MC3XXX_AXIS_Y], data[MC3XXX_AXIS_Z]); + + } + + return res; +} +#endif // _MC3XXX_SUPPORT_DOT_CALIBRATION_ + +/***************************************** + *** MC3XXX_JudgeTestResult + *****************************************/ +static int MC3XXX_JudgeTestResult(struct i2c_client *client) +{ + int res = 0; + int self_result = 0; + s16 acc[MC3XXX_AXES_NUM] = { 0 }; + + if((res = MC3XXX_ReadData(client, acc))) + { + GSE_ERR("I2C error: ret value=%d", res); + return EIO; + } + else + { + acc[MC3XXX_AXIS_X] = acc[MC3XXX_AXIS_X] * 1000 / gsensor_gain.x; + acc[MC3XXX_AXIS_Y] = acc[MC3XXX_AXIS_Y] * 1000 / gsensor_gain.y; + acc[MC3XXX_AXIS_Z] = acc[MC3XXX_AXIS_Z] * 1000 / gsensor_gain.z; + + self_result = ( (acc[MC3XXX_AXIS_X] * acc[MC3XXX_AXIS_X]) + + (acc[MC3XXX_AXIS_Y] * acc[MC3XXX_AXIS_Y]) + + (acc[MC3XXX_AXIS_Z] * acc[MC3XXX_AXIS_Z])); + + if ( (self_result > 475923) && (self_result < 2185360) ) //between 0.7g and 1.5g + { + GSE_ERR("MC3XXX_JudgeTestResult successful\n"); + return MC3XXX_RETCODE_SUCCESS; + } + else + { + GSE_ERR("MC3XXX_JudgeTestResult failt\n"); + return -EINVAL; + } + } +} + +/***************************************** + *** MC3XXX_SelfCheck + *****************************************/ +static void MC3XXX_SelfCheck(struct i2c_client *client, u8 *pUserBuf) +{ + u8 _bRData1 = 0; + u8 _bRData2 = 0; + u8 _bRData3 = 0; + u8 _baDataBuf[2] = { 0 }; + + MC3XXX_i2c_read_block(client, 0x20, &_bRData1, 1); + MC3XXX_i2c_read_block(client, 0x3B, &_bRData2, 1); + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x07, _baDataBuf, 1); + + mdelay(10); + + for ( ; ; ) + { + _baDataBuf[0] = 0x6D; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 1); + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 1); + + _bRData3 = 0x00; + MC3XXX_i2c_read_block(client, 0x04, &_bRData3, 1); + + if (_bRData3 & 0x40) + break; + } + + _baDataBuf[0] = (_bRData2 & 0xFE); + MC3XXX_i2c_write_block(client, 0x3B, _baDataBuf, 1); + + _baDataBuf[0] = 0x03; + MC3XXX_i2c_write_block(client, 0x20, _baDataBuf, 1); + + _baDataBuf[0] = 0x40; + MC3XXX_i2c_write_block(client, 0x14, _baDataBuf, 1); + + mdelay(10); + + _baDataBuf[0] = pUserBuf[0]; + MC3XXX_i2c_write_block(client, 0x00, _baDataBuf, 1); + + _baDataBuf[0] = 0x41; + MC3XXX_i2c_write_block(client, 0x07, _baDataBuf, 1); + + mdelay(10); + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x07, _baDataBuf, 1); + + mdelay(10); + + MC3XXX_Read_Reg_Map(client, pUserBuf); + + mdelay(10); + + _baDataBuf[0] = 0x00; + MC3XXX_i2c_write_block(client, 0x14, _baDataBuf, 1); + + _baDataBuf[0] = _bRData1; + MC3XXX_i2c_write_block(client, 0x20, _baDataBuf, 1); + + _baDataBuf[0] = _bRData2; + MC3XXX_i2c_write_block(client, 0x3B, _baDataBuf, 1); + + mdelay(10); + + for ( ; ; ) + { + _baDataBuf[0] = 0x6D; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 1); + + _baDataBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x1B, _baDataBuf, 1); + + _bRData3 = 0xFF; + MC3XXX_i2c_read_block(client, 0x04, &_bRData3, 1); + + if (!(_bRData3 & 0x40)) + break; + } + + mdelay(10); +} + +/***************************************** + *** MC3XXX_GetOpenStatus + *****************************************/ +#ifdef _MC3XXX_SUPPORT_PERIODIC_DOC_ +static int MC3XXX_GetOpenStatus(void) +{ + //GSE_LOG("[%s] %d\n", __FUNCTION__, atomic_read(&s_t_mc3xxx_open_status)); + + wait_event_interruptible(wq_mc3xxx_open_status, (atomic_read(&s_t_mc3xxx_open_status) != 0)); + + //GSE_LOG("[%s] pass wait_event_interruptible: %d\n", __FUNCTION__, atomic_read(&s_t_mc3xxx_open_status)); + + return (atomic_read(&s_t_mc3xxx_open_status)); +} +#endif + +/***************************************** + *** show_chipinfo_value + *****************************************/ +static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mc3xxx_i2c_client; + char strbuf[MC3XXX_BUF_SIZE]={0}; + GSE_LOG("fwq show_chipinfo_value \n"); + if(NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + MC3XXX_ReadChipInfo(client, strbuf, MC3XXX_BUF_SIZE); + return snprintf(buf, PAGE_SIZE, "%s\n", strbuf); +} + +/***************************************** + *** show_sensordata_value + *****************************************/ +static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mc3xxx_i2c_client; + char strbuf[MC3XXX_BUF_SIZE] = { 0 }; + + if(NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + MC3XXX_MUTEX_LOCK(); + MC3XXX_ReadSensorData(client, strbuf, MC3XXX_BUF_SIZE); + MC3XXX_MUTEX_UNLOCK(); + return snprintf(buf, PAGE_SIZE, "%s\n", strbuf); +} + +/***************************************** + *** show_cali_value + *****************************************/ +static ssize_t show_cali_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mc3xxx_i2c_client; + struct mc3xxx_i2c_data *obj; + int err = 0; + int len = 0; + int mul = 0; + int tmp[MC3XXX_AXES_NUM] = { 0 }; + + GSE_LOG("fwq show_cali_value \n"); + + if(NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + obj = (struct mc3xxx_i2c_data*) i2c_get_clientdata(client); + + + if((err = MC3XXX_ReadOffset(client, obj->offset))) + { + return -EINVAL; + } + else if((err = MC3XXX_ReadCalibration(client, tmp))) + { + return -EINVAL; + } + else + { +// +++ 20130104 -- obj->reso is no longer used, replaced by gensor_gain to avoid system crash + //mul = obj->reso->sensitivity/mc3xxx_offset_resolution.sensitivity; + mul = gsensor_gain.x /mc3xxx_offset_resolution.sensitivity; + /*len += snprintf(buf+len, PAGE_SIZE-len, "[HW ][%d] (%+3d, %+3d, %+3d) : (0x%02X, 0x%02X, 0x%02X)\n", mul, + obj->offset[MC3XXX_AXIS_X], obj->offset[MC3XXX_AXIS_Y], obj->offset[MC3XXX_AXIS_Z], + obj->offset[MC3XXX_AXIS_X], obj->offset[MC3XXX_AXIS_Y], obj->offset[MC3XXX_AXIS_Z]); + */ +// +++ 20130104 -- obj->reso is no longer used, replaced by gensor_gain to avoid system crash + len += snprintf(buf+len, PAGE_SIZE-len, "[HW] (%+3d, %+3d, %+3d) : (0x%02X, 0x%02X, 0x%02X)\n", + obj->offset[MC3XXX_AXIS_X], obj->offset[MC3XXX_AXIS_Y], obj->offset[MC3XXX_AXIS_Z], + obj->offset[MC3XXX_AXIS_X], obj->offset[MC3XXX_AXIS_Y], obj->offset[MC3XXX_AXIS_Z]); + + len += snprintf(buf+len, PAGE_SIZE-len, "[SW][%d] (%+3d, %+3d, %+3d)\n", 1, + obj->cali_sw[MC3XXX_AXIS_X], obj->cali_sw[MC3XXX_AXIS_Y], obj->cali_sw[MC3XXX_AXIS_Z]); + + len += snprintf(buf+len, PAGE_SIZE-len, "[ALL] (%+3d, %+3d, %+3d) : (%+3d, %+3d, %+3d)\n", + obj->offset[MC3XXX_AXIS_X]*mul + obj->cali_sw[MC3XXX_AXIS_X], + obj->offset[MC3XXX_AXIS_Y]*mul + obj->cali_sw[MC3XXX_AXIS_Y], + obj->offset[MC3XXX_AXIS_Z]*mul + obj->cali_sw[MC3XXX_AXIS_Z], + tmp[MC3XXX_AXIS_X], tmp[MC3XXX_AXIS_Y], tmp[MC3XXX_AXIS_Z]); + + return len; + } +} + +/***************************************** + *** store_cali_value + *****************************************/ +static ssize_t store_cali_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct i2c_client *client = mc3xxx_i2c_client; + int err=0; + int x=0; + int y=0; + int z=0; + int dat[MC3XXX_AXES_NUM]={0}; + + if(!strncmp(buf, "rst", 3)) + { + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_ResetCalibration(client); + MC3XXX_MUTEX_UNLOCK(); + + if (err) + GSE_ERR("reset offset err = %d\n", err); + } + else if(3 == sscanf(buf, "0x%02X 0x%02X 0x%02X", &x, &y, &z)) + { + dat[MC3XXX_AXIS_X] = x; + dat[MC3XXX_AXIS_Y] = y; + dat[MC3XXX_AXIS_Z] = z; + + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_WriteCalibration(client, dat); + MC3XXX_MUTEX_UNLOCK(); + + if (err) + GSE_ERR("write calibration err = %d\n", err); + } + else + { + GSE_ERR("invalid format\n"); + } + + return count; +} + +/***************************************** + *** show_selftest_value + *****************************************/ +static ssize_t show_selftest_value(struct device_driver *ddri, char *buf) +{ + struct i2c_client *client = mc3xxx_i2c_client; + + if (NULL == client) + { + GSE_ERR("i2c client is null!!\n"); + return 0; + } + + return snprintf(buf, 8, "%s\n", selftestRes); +} + +/***************************************** + *** store_selftest_value + *****************************************/ +static ssize_t store_selftest_value(struct device_driver *ddri, const char *buf, size_t count) +{ /*write anything to this register will trigger the process*/ + struct i2c_client *client = mc3xxx_i2c_client; + int num = 0; + + if (1 != sscanf(buf, "%d", &num)) + { + GSE_ERR("parse number fail\n"); + return count; + } + else if(0 == num) + { + GSE_ERR("invalid data count\n"); + return count; + } + + GSE_LOG("NORMAL:\n"); + MC3XXX_MUTEX_LOCK(); + MC3XXX_SetPowerMode(client, true); + MC3XXX_MUTEX_UNLOCK(); + GSE_LOG("SELFTEST:\n"); + + if (!MC3XXX_JudgeTestResult(client)) + { + GSE_LOG("SELFTEST : PASS\n"); + strcpy(selftestRes,"y"); + } + else + { + GSE_LOG("SELFTEST : FAIL\n"); + strcpy(selftestRes,"n"); + } + + return count; +} + +/***************************************** + *** show_firlen_value + *****************************************/ +static ssize_t show_firlen_value(struct device_driver *ddri, char *buf) +{ + #ifdef _MC3XXX_SUPPORT_LPF_ + struct i2c_client *client = mc3xxx_i2c_client; + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + GSE_LOG("fwq show_firlen_value \n"); + if(atomic_read(&obj->firlen)) + { + int idx = 0, len = atomic_read(&obj->firlen); + GSE_LOG("len = %2d, idx = %2d\n", obj->fir.num, obj->fir.idx); + + for(idx = 0; idx < len; idx++) + { + GSE_LOG("[%5d %5d %5d]\n", obj->fir.raw[idx][MC3XXX_AXIS_X], obj->fir.raw[idx][MC3XXX_AXIS_Y], obj->fir.raw[idx][MC3XXX_AXIS_Z]); + } + + GSE_LOG("sum = [%5d %5d %5d]\n", obj->fir.sum[MC3XXX_AXIS_X], obj->fir.sum[MC3XXX_AXIS_Y], obj->fir.sum[MC3XXX_AXIS_Z]); + GSE_LOG("avg = [%5d %5d %5d]\n", obj->fir.sum[MC3XXX_AXIS_X]/len, obj->fir.sum[MC3XXX_AXIS_Y]/len, obj->fir.sum[MC3XXX_AXIS_Z]/len); + } + return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&obj->firlen)); + #else + GSE_LOG("fwq show_firlen_value \n"); + return snprintf(buf, PAGE_SIZE, "not support\n"); + #endif +} + +/***************************************** + *** store_firlen_value + *****************************************/ +static ssize_t store_firlen_value(struct device_driver *ddri, const char *buf, size_t count) +{ + #ifdef _MC3XXX_SUPPORT_LPF_ + struct i2c_client *client = mc3xxx_i2c_client; + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + int firlen = 0; + + GSE_LOG("fwq store_firlen_value \n"); + + if(1 != sscanf(buf, "%d", &firlen)) + { + GSE_ERR("invallid format\n"); + } + else if(firlen > C_MAX_FIR_LENGTH) + { + GSE_ERR("exceeds maximum filter length\n"); + } + else + { + atomic_set(&obj->firlen, firlen); + if(0 == firlen) + { + atomic_set(&obj->fir_en, 0); + } + else + { + memset(&obj->fir, 0x00, sizeof(obj->fir)); + atomic_set(&obj->fir_en, 1); + } + } + #endif + return count; +} + +/***************************************** + *** show_trace_value + *****************************************/ +static ssize_t show_trace_value(struct device_driver *ddri, char *buf) +{ + ssize_t res = 0; + struct mc3xxx_i2c_data *obj = mc3xxx_obj_i2c_data; + + GSE_LOG("fwq show_trace_value \n"); + + if (obj == NULL) + { + GSE_ERR("i2c_data obj is null!!\n"); + return 0; + } + + res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace)); + return res; +} + +/***************************************** + *** store_trace_value + *****************************************/ +static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count) +{ + struct mc3xxx_i2c_data *obj = mc3xxx_obj_i2c_data; + int trace = 0; + + GSE_LOG("fwq store_trace_value \n"); + + if (obj == NULL) + { + GSE_ERR("i2c_data obj is null!!\n"); + return 0; + } + + if(1 == sscanf(buf, "0x%x", &trace)) + { + atomic_set(&obj->trace, trace); + } + else + { + GSE_ERR("invalid content: '%s', length = %zu\n", buf, count); + } + + return count; +} + +/***************************************** + *** show_status_value + *****************************************/ +static ssize_t show_status_value(struct device_driver *ddri, char *buf) +{ + ssize_t len = 0; + struct mc3xxx_i2c_data *obj = mc3xxx_obj_i2c_data; + + GSE_LOG("fwq show_status_value \n"); + + if (obj == NULL) + { + GSE_ERR("i2c_data obj is null!!\n"); + return 0; + } + + if(obj->hw) + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n", + obj->hw->i2c_num, obj->hw->direction, obj->hw->power_id, obj->hw->power_vol); + } + else + { + len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n"); + } + return len; +} + +/***************************************** + *** show_power_status + *****************************************/ +static ssize_t show_power_status(struct device_driver *ddri, char *buf) +{ + ssize_t res = 0; + u8 uData = 0; + struct mc3xxx_i2c_data *obj = mc3xxx_obj_i2c_data; + + if (obj == NULL) + { + GSE_ERR("i2c_data obj is null!!\n"); + return 0; + } + MC3XXX_i2c_read_block(obj->client, MC3XXX_REG_MODE_FEATURE, &uData, 1); + + res = snprintf(buf, PAGE_SIZE, "0x%04X\n", uData); + return res; +} + +/***************************************** + *** show_version_value + *****************************************/ +static ssize_t show_version_value(struct device_driver *ddri, char *buf) +{ + if ( 1 == VIRTUAL_Z) + return snprintf(buf, PAGE_SIZE, "%s\n", MC3XXX_DEV_DRIVER_VERSION_VIRTUAL_Z); + else + return snprintf(buf, PAGE_SIZE, "%s\n", MC3XXX_DEV_DRIVER_VERSION); +} + +/***************************************** + *** show_chip_id + *****************************************/ +static ssize_t show_chip_id(struct device_driver *ddri, char *buf) +{ + struct mc3xxx_i2c_data *_pt_i2c_data = mc3xxx_obj_i2c_data; + + return MC3XXX_Read_Chip_ID(_pt_i2c_data->client, buf); +} + +/***************************************** + *** show_virtual_z + *****************************************/ +static ssize_t show_virtual_z(struct device_driver *ddri, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%s\n", VIRTUAL_Z == 1 ? "Virtual Z Support": "No Virtual Z Support"); +} + +/***************************************** + *** show_regiter_map + *****************************************/ +static ssize_t show_regiter_map(struct device_driver *ddri, char *buf) +{ + u8 _bIndex = 0; + u8 _baRegMap[64] = { 0 }; + ssize_t _tLength = 0; + + struct i2c_client *client = mc3xxx_i2c_client; + + if ((0xA5 == buf[0]) && (0x7B == buf[1]) && (0x40 == buf[2])) + { + MC3XXX_MUTEX_LOCK(); + MC3XXX_Read_Reg_Map(client, buf); + MC3XXX_MUTEX_UNLOCK(); + + buf[0x21] = s_baOTP_OffsetData[0]; + buf[0x22] = s_baOTP_OffsetData[1]; + buf[0x23] = s_baOTP_OffsetData[2]; + buf[0x24] = s_baOTP_OffsetData[3]; + buf[0x25] = s_baOTP_OffsetData[4]; + buf[0x26] = s_baOTP_OffsetData[5]; + + _tLength = 64; + } + else + { + MC3XXX_MUTEX_LOCK(); + MC3XXX_Read_Reg_Map(client, _baRegMap); + MC3XXX_MUTEX_UNLOCK(); + + for (_bIndex = 0; _bIndex < 64; _bIndex++) + _tLength += snprintf((buf + _tLength), (PAGE_SIZE - _tLength), "Reg[0x%02X]: 0x%02X\n", _bIndex, _baRegMap[_bIndex]); + } + + return (_tLength); +} + +/***************************************** + *** store_regiter_map + *****************************************/ +static ssize_t store_regiter_map(struct device_driver *ddri, const char *buf, size_t count) +{ + // reserved + //GSE_LOG("[%s] buf[0]: 0x%02X\n", __FUNCTION__, buf[0]); + + return count; +} + +/***************************************** + *** show_chip_orientation + *****************************************/ +static ssize_t show_chip_orientation(struct device_driver *ptDevDrv, char *pbBuf) +{ + ssize_t _tLength = 0; + struct acc_hw *_ptAccelHw = get_cust_acc(); + + GSE_LOG("[%s] default direction: %d\n", __FUNCTION__, _ptAccelHw->direction); + + _tLength = snprintf(pbBuf, PAGE_SIZE, "default direction = %d\n", _ptAccelHw->direction); + + return (_tLength); +} + +/***************************************** + *** store_chip_orientation + *****************************************/ +static ssize_t store_chip_orientation(struct device_driver *ptDevDrv, const char *pbBuf, size_t tCount) +{ + int _nDirection = 0; + struct mc3xxx_i2c_data *_pt_i2c_obj = mc3xxx_obj_i2c_data; + + if (NULL == _pt_i2c_obj) + return (0); + + if (1 == sscanf(pbBuf, "%d", &_nDirection)) + { + if (hwmsen_get_convert(_nDirection, &_pt_i2c_obj->cvt)) + GSE_ERR("ERR: fail to set direction\n"); + } + + GSE_LOG("[%s] set direction: %d\n", __FUNCTION__, _nDirection); + + return (tCount); +} + +/***************************************** + *** show_accuracy_status + *****************************************/ +static ssize_t show_accuracy_status(struct device_driver *ddri, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", s_bAccuracyStatus); +} + +/***************************************** + *** store_accuracy_status + *****************************************/ +static ssize_t store_accuracy_status(struct device_driver *ddri, const char *buf, size_t count) +{ + int _nAccuracyStatus = 0; + + if (1 != sscanf(buf, "%d", &_nAccuracyStatus)) + { + GSE_ERR("incorrect argument\n"); + return count; + } + + if (SENSOR_STATUS_ACCURACY_HIGH < _nAccuracyStatus) + { + GSE_ERR("illegal accuracy status\n"); + return count; + } + + s_bAccuracyStatus = ((int8_t) _nAccuracyStatus); + + return count; +} + +/***************************************** + *** show_selfcheck_value + *****************************************/ +static ssize_t show_selfcheck_value(struct device_driver *ptDevDriver, char *pbBuf) +{ + struct i2c_client *_pt_i2c_client = mc3xxx_i2c_client; + + //GSE_LOG("[%s] 0x%02X\n", __FUNCTION__, pbBuf[0]); + + MC3XXX_MUTEX_LOCK(); + MC3XXX_SelfCheck(_pt_i2c_client, pbBuf); + MC3XXX_Init(_pt_i2c_client, 0); + MC3XXX_MUTEX_UNLOCK(); + + return (64); +} + +/***************************************** + *** store_selfcheck_value + *****************************************/ +static ssize_t store_selfcheck_value(struct device_driver *ddri, const char *buf, size_t count) +{ + // reserved + //GSE_LOG("[%s] buf[0]: 0x%02X\n", __FUNCTION__, buf[0]); + + return count; +} + +/***************************************** + *** show_chip_validate_value + *****************************************/ +static ssize_t show_chip_validate_value(struct device_driver *ptDevDriver, char *pbBuf) +{ + unsigned char _bChipValidation = 0; + + _bChipValidation = MC3XXX_ValidateSensorIC(&s_bPCODE, &s_bHWID); + + return snprintf(pbBuf, PAGE_SIZE, "%d\n", _bChipValidation); +} + +/***************************************** + *** show_pdoc_enable_value + *****************************************/ +static ssize_t show_pdoc_enable_value(struct device_driver *ptDevDriver, char *pbBuf) +{ + #ifdef _MC3XXX_SUPPORT_PERIODIC_DOC_ + return snprintf(pbBuf, PAGE_SIZE, "%d\n", s_bIsPDOC_Enabled); + #else + unsigned char _bIsPDOC_Enabled = false; + + return snprintf(pbBuf, PAGE_SIZE, "%d\n", _bIsPDOC_Enabled); + #endif +} + +/***************************************** + *** DRIVER ATTRIBUTE LIST TABLE + *****************************************/ +static DRIVER_ATTR(chipinfo , S_IRUGO, show_chipinfo_value, NULL ); +static DRIVER_ATTR(sensordata , S_IRUGO, show_sensordata_value, NULL ); +static DRIVER_ATTR(cali , S_IWUSR | S_IRUGO, show_cali_value, store_cali_value ); +static DRIVER_ATTR(selftest , S_IWUSR | S_IRUGO, show_selftest_value, store_selftest_value ); +static DRIVER_ATTR(firlen , S_IWUSR | S_IRUGO, show_firlen_value, store_firlen_value ); +static DRIVER_ATTR(trace , S_IWUSR | S_IRUGO, show_trace_value, store_trace_value ); +static DRIVER_ATTR(status , S_IRUGO, show_status_value, NULL ); +static DRIVER_ATTR(power , S_IRUGO, show_power_status, NULL ); +static DRIVER_ATTR(version , S_IRUGO, show_version_value, NULL ); +static DRIVER_ATTR(chipid , S_IRUGO, show_chip_id, NULL ); +static DRIVER_ATTR(virtualz , S_IRUGO, show_virtual_z, NULL ); +static DRIVER_ATTR(regmap , S_IWUSR | S_IRUGO, show_regiter_map, store_regiter_map ); +static DRIVER_ATTR(orientation, S_IWUSR | S_IRUGO, show_chip_orientation, store_chip_orientation); +static DRIVER_ATTR(accuracy , S_IWUSR | S_IRUGO, show_accuracy_status , store_accuracy_status ); +static DRIVER_ATTR(selfcheck , S_IWUSR | S_IRUGO, show_selfcheck_value , store_selfcheck_value ); +static DRIVER_ATTR(validate , S_IRUGO, show_chip_validate_value, NULL ); +static DRIVER_ATTR(pdoc , S_IRUGO, show_pdoc_enable_value , NULL ); + +static struct driver_attribute *mc3xxx_attr_list[] = { + &driver_attr_chipinfo, + &driver_attr_sensordata, + &driver_attr_cali, + &driver_attr_selftest, + &driver_attr_firlen, + &driver_attr_trace, + &driver_attr_status, + &driver_attr_power, + &driver_attr_version, + &driver_attr_chipid, + &driver_attr_virtualz, + &driver_attr_regmap, + &driver_attr_orientation, + &driver_attr_accuracy, + &driver_attr_selfcheck, + &driver_attr_validate, + &driver_attr_pdoc, + }; + +/***************************************** + *** mc3xxx_create_attr + *****************************************/ +static int mc3xxx_create_attr(struct device_driver *driver) +{ + int idx, err = 0; + int num = (int)(sizeof(mc3xxx_attr_list)/sizeof(mc3xxx_attr_list[0])); + if (driver == NULL) + { + return -EINVAL; + } + + for(idx = 0; idx < num; idx++) + { + if((err = driver_create_file(driver, mc3xxx_attr_list[idx]))) + { + GSE_ERR("driver_create_file (%s) = %d\n", mc3xxx_attr_list[idx]->attr.name, err); + break; + } + } + return err; +} + +/***************************************** + *** mc3xxx_delete_attr + *****************************************/ +static int mc3xxx_delete_attr(struct device_driver *driver) +{ + int idx ,err = 0; + int num = (int)(sizeof(mc3xxx_attr_list)/sizeof(mc3xxx_attr_list[0])); + + if(driver == NULL) + { + return -EINVAL; + } + + + for(idx = 0; idx < num; idx++) + { + driver_remove_file(driver, mc3xxx_attr_list[idx]); + } + + + return err; +} + +/***************************************** + *** gsensor_operate + *****************************************/ +static int gsensor_operate(void* self, uint32_t command, void* buff_in, int size_in, + void* buff_out, int size_out, int* actualout) +{ + int err = 0; + int value = 0; + struct mc3xxx_i2c_data *priv = (struct mc3xxx_i2c_data*)self; + hwm_sensor_data* gsensor_data = NULL; + char buff[MC3XXX_BUF_SIZE] = { 0 }; + + GSE_FUN(f); + switch (command) + { + case SENSOR_DELAY: + GSE_LOG("fwq set delay\n"); + if((buff_in == NULL) || (size_in < sizeof(int))) + { + GSE_ERR("Set delay parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + if(value >= 50) + { + atomic_set(&priv->filter, 0); + } + else + { + #if defined(_MC3XXX_SUPPORT_LPF_) + priv->fir.num = 0; + priv->fir.idx = 0; + priv->fir.sum[MC3XXX_AXIS_X] = 0; + priv->fir.sum[MC3XXX_AXIS_Y] = 0; + priv->fir.sum[MC3XXX_AXIS_Z] = 0; + atomic_set(&priv->filter, 1); + #endif + } + } + break; + + case SENSOR_ENABLE: + if((buff_in == NULL) || (size_in < sizeof(int))) + { + GSE_ERR("Enable sensor parameter error!\n"); + err = -EINVAL; + } + else + { + value = *(int *)buff_in; + + GSE_LOG("fwq sensor enable gsensor: %d\n", value); + + if(((value == 0) && (mc3xxx_sensor_power == false)) ||((value == 1) && (mc3xxx_sensor_power == true))) + { + GSE_LOG("Gsensor device have updated!\n"); + } + else + { + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_SetPowerMode( priv->client, !mc3xxx_sensor_power); + MC3XXX_MUTEX_UNLOCK(); + } + + #ifdef _MC3XXX_SUPPORT_PERIODIC_DOC_ + if (0 == value) + atomic_set(&s_t_mc3xxx_open_status, 0); + else + atomic_set(&s_t_mc3xxx_open_status, 1); + + wake_up(&wq_mc3xxx_open_status); + #endif + } + break; + + case SENSOR_GET_DATA: + /*GSE_LOG("fwq sensor operate get data\n");*/ + if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) + { + GSE_ERR("get sensor data parameter error!\n"); + err = -EINVAL; + } + else + { + gsensor_data = (hwm_sensor_data *)buff_out; + MC3XXX_MUTEX_LOCK(); + MC3XXX_ReadSensorData(priv->client, buff, MC3XXX_BUF_SIZE); + MC3XXX_MUTEX_UNLOCK(); + sscanf(buff, "%x %x %x", &gsensor_data->values[0], + &gsensor_data->values[1], &gsensor_data->values[2]); + gsensor_data->status = s_bAccuracyStatus; + gsensor_data->value_divide = 1000; + /*GSE_LOG("MC3XXX_ReadSensorData: X :%d,Y: %d, Z: %d\n",gsensor_data->values[0],gsensor_data->values[1],gsensor_data->values[2]);*/ + } + break; + default: + GSE_ERR("gsensor operate function no this parameter %d!\n", command); + err = -1; + break; + } + + return err; +} + +/***************************************** + *** mc3xxx_open + *****************************************/ +static int mc3xxx_open(struct inode *inode, struct file *file) +{ + file->private_data = mc3xxx_i2c_client; + + if(file->private_data == NULL) + { + GSE_ERR("null pointer!!\n"); + return -EINVAL; + } + return nonseekable_open(inode, file); +} + +/***************************************** + *** mc3xxx_release + *****************************************/ +static int mc3xxx_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +/***************************************** + *** mc3xxx_ioctl + *****************************************/ +static long mc3xxx_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct i2c_client *client = (struct i2c_client*)file->private_data; + struct mc3xxx_i2c_data *obj = (struct mc3xxx_i2c_data*)i2c_get_clientdata(client); + char strbuf[MC3XXX_BUF_SIZE] = {0}; + void __user *data = NULL; + SENSOR_DATA sensor_data = {0}; + long err = 0; + int cali[3] = {0}; + + #ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ + int prod = -1; + int tempZ = 0; + unsigned char _bTempPCode = 0x00; + #endif + + //GSE_FUN(f); + if(_IOC_DIR(cmd) & _IOC_READ) + { + err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + } + else if(_IOC_DIR(cmd) & _IOC_WRITE) + { + err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + } + + if(err) + { + GSE_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd)); + return -EFAULT; + } + + switch(cmd) + { + case GSENSOR_IOCTL_INIT: + GSE_LOG("fwq GSENSOR_IOCTL_INIT\n"); + MC3XXX_MUTEX_LOCK(); + MC3XXX_Init(client, 0); + MC3XXX_MUTEX_UNLOCK(); + break; + + case GSENSOR_IOCTL_READ_CHIPINFO: + GSE_LOG("fwq GSENSOR_IOCTL_READ_CHIPINFO\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + + MC3XXX_ReadChipInfo(client, strbuf, MC3XXX_BUF_SIZE); + if(copy_to_user(data, strbuf, strlen(strbuf)+1)) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_READ_SENSORDATA: + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + MC3XXX_MUTEX_LOCK(); + #ifdef _MC3XXX_SUPPORT_APPLY_AVERAGE_AGORITHM_ + MC3XXX_ReadRawData(client, strbuf); + #else + MC3XXX_ReadSensorData(client, strbuf, MC3XXX_BUF_SIZE); + #endif + MC3XXX_MUTEX_UNLOCK(); + if(copy_to_user(data, strbuf, strlen(strbuf)+1)) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_READ_GAIN: + GSE_LOG("fwq GSENSOR_IOCTL_READ_GAIN\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + + if(copy_to_user(data, &gsensor_gain, sizeof(GSENSOR_VECTOR3D))) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_READ_OFFSET: + GSE_LOG("fwq GSENSOR_IOCTL_READ_OFFSET\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + + if(copy_to_user(data, &gsensor_offset, sizeof(GSENSOR_VECTOR3D))) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_READ_RAW_DATA: + GSE_LOG("fwq GSENSOR_IOCTL_READ_RAW_DATA\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + MC3XXX_MUTEX_LOCK(); + MC3XXX_ReadRawData(client, strbuf); + MC3XXX_MUTEX_UNLOCK(); + if(copy_to_user(data, strbuf, strlen(strbuf)+1)) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_IOCTL_SET_CALI: + GSE_LOG("fwq GSENSOR_IOCTL_SET_CALI!!\n"); + data = (void __user*)arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + if(copy_from_user(&sensor_data, data, sizeof(sensor_data))) + { + err = -EFAULT; + break; + } + if(atomic_read(&obj->suspend)) + { + GSE_ERR("Perform calibration in suspend state!!\n"); + err = -EINVAL; + } + else + { + obj->cali_sw[MC3XXX_AXIS_X] += sensor_data.x; + obj->cali_sw[MC3XXX_AXIS_Y] += sensor_data.y; + obj->cali_sw[MC3XXX_AXIS_Z] += sensor_data.z; + + cali[MC3XXX_AXIS_X] = sensor_data.x * gsensor_gain.x / GRAVITY_EARTH_1000; + cali[MC3XXX_AXIS_Y] = sensor_data.y * gsensor_gain.y / GRAVITY_EARTH_1000; + cali[MC3XXX_AXIS_Z] = sensor_data.z * gsensor_gain.z / GRAVITY_EARTH_1000; + + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_WriteCalibration(client, cali); + MC3XXX_MUTEX_UNLOCK(); + } + break; + + case GSENSOR_IOCTL_CLR_CALI: + GSE_LOG("fwq GSENSOR_IOCTL_CLR_CALI!!\n"); + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_ResetCalibration(client); + MC3XXX_MUTEX_UNLOCK(); + break; + + case GSENSOR_IOCTL_GET_CALI: + GSE_LOG("fwq mc3xxx GSENSOR_IOCTL_GET_CALI\n"); + data = (void __user*)arg; + if(data == NULL) + { + err = -EINVAL; + break; + } +// if((err = MC3XXX_ReadCalibration(client, cali))) +// { +// break; +// } + + sensor_data.x = obj->cali_sw[MC3XXX_AXIS_X]; + sensor_data.y = obj->cali_sw[MC3XXX_AXIS_Y]; + sensor_data.z = obj->cali_sw[MC3XXX_AXIS_Z]; + if(copy_to_user(data, &sensor_data, sizeof(sensor_data))) + { + err = -EFAULT; + break; + } + break; + + //add in Sensors_io.h + // ============================================================================== + #ifdef _MC3XXX_SUPPORT_DOT_CALIBRATION_ + + case GSENSOR_MCUBE_IOCTL_SET_CALI: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_SET_CALI!!\n"); + data = (void __user*)arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + if(copy_from_user(&sensor_data, data, sizeof(sensor_data))) + { + err = -EFAULT; + break; + } + if(atomic_read(&obj->suspend)) + { + GSE_ERR("Perform calibration in suspend state!!\n"); + err = -EINVAL; + } + else + { + cali[MC3XXX_AXIS_X] = sensor_data.x * gsensor_gain.x / GRAVITY_EARTH_1000; + cali[MC3XXX_AXIS_Y] = sensor_data.y * gsensor_gain.y / GRAVITY_EARTH_1000; + cali[MC3XXX_AXIS_Z] = sensor_data.z * gsensor_gain.z / GRAVITY_EARTH_1000; + + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_WriteCalibration(client, cali); + MC3XXX_MUTEX_UNLOCK(); + } + break; + + case GSENSOR_IOCTL_SET_CALI_MODE: + GSE_LOG("fwq mc3xxx GSENSOR_IOCTL_SET_CALI_MODE\n"); + break; + + case GSENSOR_MCUBE_IOCTL_READ_RBM_DATA: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_READ_RBM_DATA\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + MC3XXX_MUTEX_LOCK(); + MC3XXX_ReadRBMData(client, strbuf); + MC3XXX_MUTEX_UNLOCK(); + if(copy_to_user(data, strbuf, strlen(strbuf)+1)) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_MCUBE_IOCTL_SET_RBM_MODE: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_SET_RBM_MODE\n"); + MC3XXX_MUTEX_LOCK(); + MC3XXX_rbm(client,1); + MC3XXX_MUTEX_UNLOCK(); + break; + + case GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE\n"); + MC3XXX_MUTEX_LOCK(); + MC3XXX_rbm(client,0); + MC3XXX_MUTEX_UNLOCK(); + break; + + case GSENSOR_MCUBE_IOCTL_REGISTER_MAP: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_REGISTER_MAP\n"); + + MC3XXX_Read_Reg_Map(client, NULL); + + break; + + case GSENSOR_MCUBE_IOCTL_READ_PRODUCT_ID: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_READ_PRODUCT_ID\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + + if (MC3XXX_RETCODE_SUCCESS != (prod = MC3XXX_ValidateSensorIC(&s_bPCODE, &s_bHWID))) + GSE_LOG("Not mCube accelerometers!\n"); + + if(copy_to_user(data, &prod, sizeof(prod))) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_MCUBE_IOCTL_READ_FILEPATH: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_READ_FILEPATH\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + + if(copy_to_user(data, file_path, (strlen(file_path)+1))) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_MCUBE_IOCTL_VIRTUAL_Z: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_VIRTUAL_Z\n"); + data = (void __user *) arg; + tempZ = VIRTUAL_Z; + if(data == NULL) + { + err = -EINVAL; + break; + } + if(copy_to_user(data, &tempZ, sizeof(tempZ))) + { + err = -EFAULT; + break; + } + break; + + case GSENSOR_MCUBE_IOCTL_READ_PCODE: + GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_READ_PCODE\n"); + data = (void __user *) arg; + if(data == NULL) + { + err = -EINVAL; + break; + } + + _bTempPCode = s_bPCODE; + GSE_LOG("mCube PCode = %2x!\n", _bTempPCode); + if(copy_to_user(data, &_bTempPCode, sizeof(_bTempPCode))) + { + err = -EFAULT; + break; + } + break; + + #endif // END of _MC3XXX_SUPPORT_DOT_CALIBRATION_ + + // ============================================================================== + #ifdef _MC3XXX_SUPPORT_PERIODIC_DOC_ + + case GSENSOR_MCUBE_IOCTL_GET_OFLAG: + { + int _nSensorsOpenStatus = 0; + void __user *_pArg = ((void __user *) arg); + + GSE_LOG("[%s] GSENSOR_MCUBE_IOCTL_GET_OFLAG\n", __func__); + + _nSensorsOpenStatus = MC3XXX_GetOpenStatus(); + + if(copy_to_user(_pArg, &_nSensorsOpenStatus, sizeof(_nSensorsOpenStatus))) + return (-EFAULT); + } + break; + + #endif // END of _MC3XXX_SUPPORT_PERIODIC_DOC_ + + default: + GSE_ERR("unknown IOCTL: 0x%08x\n", cmd); + err = -ENOIOCTLCMD; + break; + + } + + return err; +} + +#ifdef CONFIG_COMPAT +static long mc3xxx_compat_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + long err = 0; + + void __user *arg32 = compat_ptr(arg); + + if (!file->f_op || !file->f_op->unlocked_ioctl) + return -ENOTTY; + + switch (cmd) + { + case COMPAT_GSENSOR_IOCTL_READ_SENSORDATA: + if (arg32 == NULL) + { + err = -EINVAL; + break; + } + + err = file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_READ_SENSORDATA, (unsigned long)arg32); + if (err){ + GSE_ERR("GSENSOR_IOCTL_READ_SENSORDATA unlocked_ioctl failed."); + return err; + } + break; + case COMPAT_GSENSOR_IOCTL_SET_CALI: + if (arg32 == NULL) + { + err = -EINVAL; + break; + } + + err = file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_SET_CALI, (unsigned long)arg32); + if (err){ + GSE_ERR("GSENSOR_IOCTL_SET_CALI unlocked_ioctl failed."); + return err; + } + break; + case COMPAT_GSENSOR_IOCTL_GET_CALI: + if (arg32 == NULL) + { + err = -EINVAL; + break; + } + + err = file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_GET_CALI, (unsigned long)arg32); + if (err){ + GSE_ERR("GSENSOR_IOCTL_GET_CALI unlocked_ioctl failed."); + return err; + } + break; + case COMPAT_GSENSOR_IOCTL_CLR_CALI: + if (arg32 == NULL) + { + err = -EINVAL; + break; + } + + err = file->f_op->unlocked_ioctl(file, GSENSOR_IOCTL_CLR_CALI, (unsigned long)arg32); + if (err){ + GSE_ERR("GSENSOR_IOCTL_CLR_CALI unlocked_ioctl failed."); + return err; + } + break; + + default: + GSE_ERR("unknown IOCTL: 0x%08x\n", cmd); + err = -ENOIOCTLCMD; + break; + + } + + return err; +} +#endif +/***************************************** + *** MC3XXX_reset + *****************************************/ +static void MC3XXX_reset(struct i2c_client *client) +{ + unsigned char _baBuf[2] = { 0 }; + + _baBuf[0] = 0x43; + + MC3XXX_i2c_write_block(client, MC3XXX_REG_MODE_FEATURE, _baBuf, 0x01); + + MC3XXX_i2c_read_block(client, 0x04, _baBuf, 0x01); + + if (0x00 == (_baBuf[0] & 0x40)) + { + _baBuf[0] = 0x6D; + MC3XXX_i2c_write_block(client, 0x1B, _baBuf, 0x01); + + _baBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x1B, _baBuf, 0x01); + } + + _baBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x07, _baBuf, 1); + + _baBuf[0] = 0x80; + MC3XXX_i2c_write_block(client, 0x1C, _baBuf, 1); + + _baBuf[0] = 0x80; + MC3XXX_i2c_write_block(client, 0x17, _baBuf, 1); + + msleep(5); + + _baBuf[0] = 0x00; + MC3XXX_i2c_write_block(client, 0x1C, _baBuf, 1); + + _baBuf[0] = 0x00; + MC3XXX_i2c_write_block(client, 0x17, _baBuf, 1); + + msleep(5); + + MC3XXX_i2c_read_block(client, 0x21, offset_buf, 6); + + MC3XXX_i2c_read_block(client, 0x04, _baBuf, 0x01); + + if (_baBuf[0] & 0x40) + { + _baBuf[0] = 0x6D; + MC3XXX_i2c_write_block(client, 0x1B, _baBuf, 0x01); + + _baBuf[0] = 0x43; + MC3XXX_i2c_write_block(client, 0x1B, _baBuf, 0x01); + } + + _baBuf[0] = 0x41; + + MC3XXX_i2c_write_block(client, MC3XXX_REG_MODE_FEATURE, _baBuf, 0x01); +} + +/***************************************** + *** STRUCT:: mc3xxx_fops + *****************************************/ +static struct file_operations mc3xxx_fops = { + .owner = THIS_MODULE, + .open = mc3xxx_open, + .release = mc3xxx_release, + .unlocked_ioctl = mc3xxx_ioctl, + #ifdef CONFIG_COMPAT + .compat_ioctl = mc3xxx_compat_ioctl, + #endif + }; + +/***************************************** + *** STRUCT:: mc3xxx_device + *****************************************/ +static struct miscdevice mc3xxx_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "gsensor", + .fops = &mc3xxx_fops, + }; + +#ifndef USE_EARLY_SUSPEND +/***************************************** + *** mc3xxx_suspend + *****************************************/ +static int mc3xxx_suspend(struct i2c_client *client, pm_message_t msg) +{ + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + int err = 0; + GSE_FUN(); + + if(msg.event == PM_EVENT_SUSPEND) + { + if(obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return -EINVAL; + } + + atomic_set(&obj->suspend, 1); + + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_SetPowerMode(client, false); + MC3XXX_MUTEX_UNLOCK(); + + if (err) + { + GSE_ERR("write power control fail!!\n"); + return err; + } + + MC3XXX_power(obj->hw, 0); + } + return err; +} + +/***************************************** + *** mc3xxx_resume + *****************************************/ +static int mc3xxx_resume(struct i2c_client *client) +{ + struct mc3xxx_i2c_data *obj = i2c_get_clientdata(client); + int err; + GSE_FUN(); + + if(obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return -EINVAL; + } + + MC3XXX_power(obj->hw, 1); + + MC3XXX_MUTEX_LOCK(); + err = MC3XXX_Init(client, 0); + + if(err) + { + MC3XXX_MUTEX_UNLOCK(); + GSE_ERR("initialize client fail!!\n"); + return err; + } + + err = MC3XXX_SetPowerMode(client, true); + MC3XXX_MUTEX_UNLOCK(); + + if (err) + { + GSE_ERR("write power control fail!!\n"); + return err; + } + + atomic_set(&obj->suspend, 0); + + return 0; +} +#else +/***************************************** + *** mc3xxx_early_suspend + *****************************************/ +static void mc3xxx_early_suspend(struct early_suspend *h) +{ + struct mc3xxx_i2c_data *obj = container_of(h, struct mc3xxx_i2c_data, early_drv); + int err; + GSE_FUN(); + + if(obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return; + } + atomic_set(&obj->suspend, 1); + /* + if(err = hwmsen_write_byte(obj->client, MC3XXX_REG_POWER_CTL, 0x00)) + { + GSE_ERR("write power control fail!!\n"); + return; + } + */ + MC3XXX_MUTEX_LOCK_RETURN_VOID(); + err = MC3XXX_SetPowerMode(obj->client, false); + MC3XXX_MUTEX_UNLOCK(); + + if (err) + { + GSE_ERR("write power control fail!!\n"); + return; + } + + MC3XXX_power(obj->hw, 0); +} + +/***************************************** + *** mc3xxx_late_resume + *****************************************/ +static void mc3xxx_late_resume(struct early_suspend *h) +{ + struct mc3xxx_i2c_data *obj = container_of(h, struct mc3xxx_i2c_data, early_drv); + int err; + GSE_FUN(); + + if(obj == NULL) + { + GSE_ERR("null pointer!!\n"); + return; + } + + MC3XXX_power(obj->hw, 1); + + MC3XXX_MUTEX_LOCK_RETURN_VOID(); + err = MC3XXX_Init(obj->client, 0); + + if(err) + { + MC3XXX_MUTEX_UNLOCK(); + GSE_ERR("initialize client fail!!\n"); + return; + } + + err = MC3XXX_SetPowerMode(obj->client, true); + MC3XXX_MUTEX_UNLOCK(); + + if (err) + { + GSE_ERR("write power control fail!!\n"); + return; + } + + + atomic_set(&obj->suspend, 0); +} +#endif + +/***************************************** + *** _mc3xxx_i2c_auto_probe + *****************************************/ +static int _mc3xxx_i2c_auto_probe(struct i2c_client *client) +{ + #define _MC3XXX_I2C_PROBE_ADDR_COUNT_ (sizeof(mc3xxx_i2c_auto_probe_addr) / sizeof(mc3xxx_i2c_auto_probe_addr[0])) + + unsigned char _baData1Buf[2] = { 0 }; + unsigned char _baData2Buf[2] = { 0 }; + + int _nCount = 0; + int _naCheckCount[_MC3XXX_I2C_PROBE_ADDR_COUNT_] = { 0 }; + + GSE_FUN(); + + memset(_naCheckCount, 0, sizeof(_naCheckCount)); + +_I2C_AUTO_PROBE_RECHECK_: + s_bPCODE = 0x00; + s_bPCODER = 0x00; + s_bHWID = 0x00; + + for (_nCount = 0; _nCount < _MC3XXX_I2C_PROBE_ADDR_COUNT_; _nCount++) + { + client->addr = mc3xxx_i2c_auto_probe_addr[_nCount]; + + //GSE_LOG("[%s][%d] probing addr: 0x%X\n", __FUNCTION__, _nCount, client->addr); + + _baData1Buf[0] = 0; + if (0 > MC3XXX_i2c_read_block(client, 0x3B, _baData1Buf, 1)) + { + continue; + } + + _naCheckCount[_nCount]++; + + //GSE_LOG("[%s][%d] addr: 0x%X ok to read REG(0x3B): 0x%X\n", __FUNCTION__, _nCount, client->addr, _baData1Buf[0]); + + if (0x00 == _baData1Buf[0]) + { + if (1 == _naCheckCount[_nCount]) + { + MC3XXX_reset(client); + msleep(3); + goto _I2C_AUTO_PROBE_RECHECK_; + } + else + { + continue; + } + } + + _baData2Buf[0] = 0; + MC3XXX_i2c_read_block(client, 0x18, _baData2Buf, 1); + + s_bPCODER = _baData1Buf[0]; + + if (MC3XXX_RETCODE_SUCCESS == MC3XXX_ValidateSensorIC(&_baData1Buf[0], &_baData2Buf[0])) + { + s_bPCODE = _baData1Buf[0]; + s_bHWID = _baData2Buf[0]; + + MC3XXX_SaveDefaultOffset(client); + + //GSE_LOG("[%s] addr: 0x%X confirmed ok to use. s_bPCODE: 0x%02X, s_bHWID: 0x%02X\n", __FUNCTION__, client->addr, s_bPCODE, s_bHWID); + + return (MC3XXX_RETCODE_SUCCESS); + } + } + + return (MC3XXX_RETCODE_ERROR_I2C); + + #undef _MC3XXX_I2C_PROBE_ADDR_COUNT_ +} + + +// if use this typ of enable , Gsensor should report inputEvent(x, y, z ,stats, div) to HAL +static int mc3xxx_open_report_data(int open) +{ + //should queuq work to report event if is_report_input_direct=true + return 0; +} + +// if use this typ of enable , Gsensor only enabled but not report inputEvent to HAL + +static int mc3xxx_enable_nodata(int en) +{ + int res =0; + int retry = 0; + bool power=false; + + if(1==en) + { + power=true; + } + if(0==en) + { + power =false; + } + + for(retry = 0; retry < 3; retry++){ + res = MC3XXX_SetPowerMode(mc3xxx_obj_i2c_data->client, power); + if(res == 0) + { + GSE_LOG("MC3XXX_SetPowerMode done\n"); + break; + } + GSE_LOG("MC3XXX_SetPowerMode fail\n"); + } + + + if(res != 0) + { + GSE_LOG("MC3XXX_SetPowerMode fail!\n"); + return -1; + } + GSE_LOG("mc3xxx_enable_nodata OK!\n"); + return 0; +} + +static int mc3xxx_set_delay(u64 ns) +{ + int value =0; + value = (int)ns/1000/1000; + + GSE_LOG("mc3xxx_set_delay (%d), chip only use 1024HZ \n",value); + return 0; +} + +static int mc3xxx_get_data(int* x ,int* y,int* z, int* status) +{ + char buff[MC3XXX_BUF_SIZE]; + MC3XXX_ReadSensorData(mc3xxx_obj_i2c_data->client, buff, MC3XXX_BUF_SIZE); + + sscanf(buff, "%x %x %x", x, y, z); + *status = SENSOR_STATUS_ACCURACY_MEDIUM; + + return 0; +} + + +/***************************************** + *** mc3xxx_i2c_probe + *****************************************/ +static int mc3xxx_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_client *new_client; + struct mc3xxx_i2c_data *obj; + struct hwmsen_object sobj; + int err = 0; + GSE_FUN(); + + if (MC3XXX_RETCODE_SUCCESS != _mc3xxx_i2c_auto_probe(client)) + { + GSE_ERR("ERR: fail to probe mCube sensor!\n"); + goto exit; + } + + if(!(obj = kzalloc(sizeof(*obj), GFP_KERNEL))) + { + err = -ENOMEM; + goto exit; + } + + obj->hw = hw; + + if((err = hwmsen_get_convert(obj->hw->direction, &obj->cvt))) + { + GSE_ERR("invalid direction: %d\n", obj->hw->direction); + goto exit_kfree; + } + + mc3xxx_obj_i2c_data = obj; + obj->client = client; + new_client = obj->client; + i2c_set_clientdata(new_client,obj); + + atomic_set(&obj->trace, 0); + atomic_set(&obj->suspend, 0); + + #ifdef _MC3XXX_SUPPORT_LPF_ + if(obj->hw->firlen > C_MAX_FIR_LENGTH) + { + atomic_set(&obj->firlen, C_MAX_FIR_LENGTH); + } + else + { + atomic_set(&obj->firlen, obj->hw->firlen); + } + + if(atomic_read(&obj->firlen) > 0) + { + atomic_set(&obj->fir_en, 1); + } + #endif + + mc3xxx_i2c_client = new_client; + + MC3XXX_reset(new_client); + + if (MC3XXX_RETCODE_SUCCESS != _mc3xxx_i2c_auto_probe(client)) + { + //GSE_ERR("ERR: fail to probe mCube sensor!\n"); + goto exit_init_failed; + } + + //GSE_LOG("[%s] 2nd confirmed i2c addr: 0x%X\n", __FUNCTION__, client->addr); + + MC3XXX_i2c_read_block(client, 0x21, offset_buf, 6); + + if((err = MC3XXX_Init(new_client, 1))) + { + goto exit_init_failed; + } + + MC3XXX_MUTEX_INIT(); + + if((err = misc_register(&mc3xxx_device))) + { + GSE_ERR("mc3xxx_device register failed\n"); + goto exit_misc_device_register_failed; + } + + if((err = mc3xxx_create_attr(&mc3xxx_init_info.platform_diver_addr->driver))) + { + GSE_ERR("create attribute err = %d\n", err); + goto exit_create_attr_failed; + } + + sobj.self = obj; + sobj.polling = 1; + sobj.sensor_operate = gsensor_operate; + if((err = hwmsen_attach(ID_ACCELEROMETER, &sobj))) + { + GSE_ERR("attach fail = %d\n", err); + goto exit_kfree; + } + + #ifdef USE_EARLY_SUSPEND + obj->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1, + obj->early_drv.suspend = mc3xxx_early_suspend, + obj->early_drv.resume = mc3xxx_late_resume, + register_early_suspend(&obj->early_drv); + #endif + + GSE_LOG("%s: OK\n", __func__); + s_nInitFlag = MC3XXX_INIT_SUCC; + return 0; + +exit_create_attr_failed: + misc_deregister(&mc3xxx_device); +exit_misc_device_register_failed: +exit_init_failed: +exit_kfree: + kfree(obj); + obj = NULL; +exit: + GSE_ERR("%s: err = %d\n", __func__, err); + s_nInitFlag = MC3XXX_INIT_FAIL; + + return err; +} +#if 0 +/*----------------------------------------------------------------------------*/ +static int mc3410_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_client *new_client; + struct mc3410_i2c_data *obj; + struct hwmsen_object sobj; + int err = 0; + GSE_FUN(); + + if(!(obj = kzalloc(sizeof(*obj), GFP_KERNEL))) + { + err = -ENOMEM; + goto exit; + } + + memset(obj, 0, sizeof(struct mc3410_i2c_data)); + + obj->hw = get_cust_acc_hw(); + + if((err = hwmsen_get_convert(obj->hw->direction, &obj->cvt))) + { + GSE_ERR("invalid direction: %d\n", obj->hw->direction); + goto exit; + } + + obj_i2c_data = obj; + obj->client = client; + new_client = obj->client; + i2c_set_clientdata(new_client,obj); + + atomic_set(&obj->trace, 0); + atomic_set(&obj->suspend, 0); + +#ifdef CONFIG_MC3410_LOWPASS + if(obj->hw->firlen > C_MAX_FIR_LENGTH) + { + atomic_set(&obj->firlen, C_MAX_FIR_LENGTH); + } + else + { + atomic_set(&obj->firlen, obj->hw->firlen); + } + + if(atomic_read(&obj->firlen) > 0) + { + atomic_set(&obj->fir_en, 1); + } + +#endif + + mc3410_i2c_client = new_client; + + if((err = mc3410_init_client(new_client, 1))) + { + goto exit_init_failed; + } + + + if((err = misc_register(&mc3410_device))) + { + GSE_ERR("mc3410_device register failed\n"); + goto exit_misc_device_register_failed; + } + + if((err = mc3410_create_attr(&mc3410_gsensor_driver.driver))) + { + GSE_ERR("create attribute err = %d\n", err); + goto exit_create_attr_failed; + } + + sobj.self = obj; + sobj.polling = 1; + sobj.sensor_operate = gsensor_operate; + if((err = hwmsen_attach(ID_ACCELEROMETER, &sobj))) + { + GSE_ERR("attach fail = %d\n", err); + goto exit_kfree; + } + +#ifdef CONFIG_HAS_EARLYSUSPEND + obj->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1, + obj->early_drv.suspend = mc3410_early_suspend, + obj->early_drv.resume = mc3410_late_resume, + register_early_suspend(&obj->early_drv); +#endif + + GSE_LOG("%s: OK\n", __func__); + return 0; + + exit_create_attr_failed: + misc_deregister(&mc3410_device); + exit_misc_device_register_failed: + exit_init_failed: + //i2c_detach_client(new_client); + exit_kfree: + kfree(obj); + exit: + GSE_ERR("%s: err = %d\n", __func__, err); + return err; +} +#endif + +/***************************************** + *** mc3xxx_i2c_remove + *****************************************/ +static int mc3xxx_i2c_remove(struct i2c_client *client) +{ + int err = 0; + + if((err = mc3xxx_delete_attr(&(mc3xxx_init_info.platform_diver_addr->driver)))) + { + GSE_ERR("mc3xxx_delete_attr fail: %d\n", err); + } + + if((err = misc_deregister(&mc3xxx_device))) + { + GSE_ERR("misc_deregister fail: %d\n", err); + } + + #ifdef _MC3XXX_SUPPORT_VPROXIMITY_SENSOR_ + misc_deregister(&mcube_psensor_device); + #endif + + mc3xxx_i2c_client = NULL; + i2c_unregister_device(client); + kfree(i2c_get_clientdata(client)); + + return 0; +} + + +/***************************************** + *** mc3xxx_remove + *****************************************/ +static int mc3xxx_remove(void) +{ + + GSE_FUN(); + + MC3XXX_power(hw, 0); + i2c_del_driver(&mc3xxx_i2c_driver); + + return 0; +} + +/***************************************** + *** mc3xxx_local_init + *****************************************/ +static int mc3xxx_local_init(void) +{ + + GSE_FUN(); + MC3XXX_power(hw, 1); + + if(i2c_add_driver(&mc3xxx_i2c_driver)) + { + GSE_ERR("add driver error\n"); + return -1; + } + + if(MC3XXX_INIT_FAIL == s_nInitFlag) + { + return -1; + } + + return 0; +} + +/***************************************** + *** mc3xxx_init + *****************************************/ +static int __init mc3xxx_init(void) +{ + hw = get_mc3410_cust_acc_hw(); + + struct i2c_board_info mc3xxx_i2c_board_info = {I2C_BOARD_INFO(MC3XXX_DEV_NAME, 0x4c)}; + GSE_LOG("%s: i2c_number:%d, i2c_addr:0x%02x\n", __func__,hw->i2c_num,0x4c); + i2c_register_board_info(hw->i2c_num, &mc3xxx_i2c_board_info, 1); + + hwmsen_gsensor_add(&mc3xxx_init_info); + return 0; +} + +/***************************************** + *** mc3xxx_exit + *****************************************/ +static void __exit mc3xxx_exit(void) +{ + GSE_FUN(); +} + +/*----------------------------------------------------------------------------*/ +module_init(mc3xxx_init); +module_exit(mc3xxx_exit); +/*----------------------------------------------------------------------------*/ +MODULE_DESCRIPTION("mc3XXX G-Sensor Driver"); +MODULE_AUTHOR("mCube-inc"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(MC3XXX_DEV_DRIVER_VERSION); + diff --git a/drivers/misc/mediatek/accelerometer/mc3410-new/mc3410.h b/drivers/misc/mediatek/accelerometer/mc3410-new/mc3410.h new file mode 100644 index 00000000000..5fe16858748 --- /dev/null +++ b/drivers/misc/mediatek/accelerometer/mc3410-new/mc3410.h @@ -0,0 +1,106 @@ +/***************************************************************************** + * + * Copyright (c) 2014 mCube, Inc. + * + * This code and information are provided "as is" without warranty of any + * kind, either expressed or implied, including but not limited to the + * implied warranties of merchantability and/or fitness for a + * particular purpose. + * + * + * Accelerometer Sensor Driver + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + *****************************************************************************/ + +#ifndef _MC3XXX_H_ + #define _MC3XXX_H_ + +#include + +/*********************************************** + *** REGISTER MAP + ***********************************************/ +#define MC3XXX_REG_XOUT 0x00 +#define MC3XXX_REG_YOUT 0x01 +#define MC3XXX_REG_ZOUT 0x02 +#define MC3XXX_REG_TILT_STATUS 0x03 +#define MC3XXX_REG_SAMPLE_RATE_STATUS 0x04 +#define MC3XXX_REG_SLEEP_COUNT 0x05 +#define MC3XXX_REG_INTERRUPT_ENABLE 0x06 +#define MC3XXX_REG_MODE_FEATURE 0x07 +#define MC3XXX_REG_SAMPLE_RATE 0x08 +#define MC3XXX_REG_TAP_DETECTION_ENABLE 0x09 +#define MC3XXX_REG_TAP_DWELL_REJECT 0x0A +#define MC3XXX_REG_DROP_CONTROL 0x0B +#define MC3XXX_REG_SHAKE_DEBOUNCE 0x0C +#define MC3XXX_REG_XOUT_EX_L 0x0D +#define MC3XXX_REG_XOUT_EX_H 0x0E +#define MC3XXX_REG_YOUT_EX_L 0x0F +#define MC3XXX_REG_YOUT_EX_H 0x10 +#define MC3XXX_REG_ZOUT_EX_L 0x11 +#define MC3XXX_REG_ZOUT_EX_H 0x12 +#define MC3XXX_REG_RANGE_CONTROL 0x20 +#define MC3XXX_REG_SHAKE_THRESHOLD 0x2B +#define MC3XXX_REG_UD_Z_TH 0x2C +#define MC3XXX_REG_UD_X_TH 0x2D +#define MC3XXX_REG_RL_Z_TH 0x2E +#define MC3XXX_REG_RL_Y_TH 0x2F +#define MC3XXX_REG_FB_Z_TH 0x30 +#define MC3XXX_REG_DROP_THRESHOLD 0x31 +#define MC3XXX_REG_TAP_THRESHOLD 0x32 +#define MC3XXX_REG_PRODUCT_CODE 0x3B + +/*********************************************** + *** RETURN CODE + ***********************************************/ +#define MC3XXX_RETCODE_SUCCESS (0) +#define MC3XXX_RETCODE_ERROR_I2C (-1) +#define MC3XXX_RETCODE_ERROR_NULL_POINTER (-2) +#define MC3XXX_RETCODE_ERROR_STATUS (-3) +#define MC3XXX_RETCODE_ERROR_SETUP (-4) +#define MC3XXX_RETCODE_ERROR_GET_DATA (-5) +#define MC3XXX_RETCODE_ERROR_IDENTIFICATION (-6) + +/*********************************************** + *** CONFIGURATION + ***********************************************/ +#define MC3XXX_BUF_SIZE 256 + +/*********************************************** + *** PRODUCT ID + ***********************************************/ +#define MC3XXX_PCODE_3210 0x90 +#define MC3XXX_PCODE_3230 0x19 +#define MC3XXX_PCODE_3250 0x88 +#define MC3XXX_PCODE_3410 0xA8 +#define MC3XXX_PCODE_3410N 0xB8 +#define MC3XXX_PCODE_3430 0x29 +#define MC3XXX_PCODE_3430N 0x39 +#define MC3XXX_PCODE_3510 0x40 +#define MC3XXX_PCODE_3530 0x30 +#define MC3XXX_PCODE_3216 0x10 +#define MC3XXX_PCODE_3236 0x60 + +#define MC3XXX_PCODE_RESERVE_1 0x20 +#define MC3XXX_PCODE_RESERVE_2 0x11 +#define MC3XXX_PCODE_RESERVE_3 0x21 +#define MC3XXX_PCODE_RESERVE_4 0x61 +#define MC3XXX_PCODE_RESERVE_5 0xA0 +#define MC3XXX_PCODE_RESERVE_6 0xE0 +#define MC3XXX_PCODE_RESERVE_7 0x91 +#define MC3XXX_PCODE_RESERVE_8 0xA1 +#define MC3XXX_PCODE_RESERVE_9 0xE1 + +#define MC3XXX_PCODE_RESERVE_10 0x99 + +#endif // END OF _MC3XXX_H_ + diff --git a/drivers/misc/mediatek/aee/aed/aed.h b/drivers/misc/mediatek/aee/aed/aed.h index bbfd8af9b79..74c01da158c 100644 --- a/drivers/misc/mediatek/aee/aed/aed.h +++ b/drivers/misc/mediatek/aee/aed/aed.h @@ -179,6 +179,11 @@ void aee_rr_proc_done(struct proc_dir_entry *aed_proc_dir); void dram_console_init(struct proc_dir_entry *aed_proc_dir); void dram_console_done(struct proc_dir_entry *aed_proc_dir); +#ifdef CONFIG_MTK_AEE_IPANIC struct aee_oops *ipanic_oops_copy(void); void ipanic_oops_free(struct aee_oops *oops, int erase); +#else +static inline struct aee_oops *ipanic_oops_copy(void) { return NULL; } +static inline void ipanic_oops_free(struct aee_oops *oops, int erase) {} +#endif #endif diff --git a/drivers/misc/mediatek/aee/common/reboot-reason.c b/drivers/misc/mediatek/aee/common/reboot-reason.c index d80660d6bd4..c5dd3462bc5 100644 --- a/drivers/misc/mediatek/aee/common/reboot-reason.c +++ b/drivers/misc/mediatek/aee/common/reboot-reason.c @@ -19,30 +19,22 @@ #include #include #include "aee-common.h" +#include +#include +#include #define RR_PROC_NAME "reboot-reason" extern int aee_rr_last_fiq_step(void); static struct proc_dir_entry *aee_rr_file; -#define WDT_NORMAL_BOOT 0 -#define WDT_HW_REBOOT 1 -#define WDT_SW_REBOOT 2 - -typedef enum { - BR_POWER_KEY = 0, - BR_USB, - BR_RTC, - BR_WDT, - BR_WDT_BY_PASS_PWK, - BR_TOOL_BY_PASS_PWK, - BR_2SEC_REBOOT, - BR_UNKNOWN, - BR_KE_REBOOT -} boot_reason_t; - -char boot_reason[][16] = - { "keypad", "usb_chg", "rtc", "wdt", "reboot", "tool reboot", "smpl", "others", "kpanic" }; +#define BR_REBOOT_START (BR_UNKNOWN + 1) +#define BR_REBOOT_WARM (BR_REBOOT_START + RTC_REBOOT_REASON_WARM) +#define BR_REBOOT_PANIC (BR_REBOOT_START + RTC_REBOOT_REASON_PANIC) +#define BR_REBOOT_SW_WDT (BR_REBOOT_START + RTC_REBOOT_REASON_SW_WDT) +#define BR_REBOOT_FROM_POC (BR_REBOOT_START + RTC_REBOOT_REASON_FROM_POC) +#define BR_REBOOT_INTO_POC (BR_REBOOT_START + RTC_REBOOT_REASON_FROM_POC+1) +#define BR_MAXIMUM (BR_REBOOT_START + 5) extern int aee_rr_reboot_reason_show(struct seq_file *m, void *v); int __weak aee_rr_reboot_reason_show(struct seq_file *m, void *v) @@ -51,6 +43,56 @@ int __weak aee_rr_reboot_reason_show(struct seq_file *m, void *v) return 0; } +static const char * const boot_reason_messages[] = { + "ColdBoot From Power Key", + "ColdBoot From Charger", + "rtc", + "Hardware Watchdog Reboot", + "reboot", + "tool reboot", + "smpl", + "others", + "Warm Reboot", + "Kernel Panic Reboot", + "SW Watchdog Reboot", + "Reboot From Power-Off-Charging", + "Reboot Into Power-Off-Charging" +}; + +static const char * const boot_reason_values[] = { + "keypad", + "usb_chg", + "rtc", + "wdt", + "reboot", + "tool reboot", + "smpl", + "others", + "warm reboot", + "panic reboot", + "swwdt reboot", + "poc reboot", + "reboot into poc" +}; + +typedef enum { + SR_NORMAL = 0, + SR_LONG_KEY_PRESS +} shutdown_reason_t; + +static int s_boot_reason; +static shutdown_reason_t g_shutdown_reason = SR_NORMAL; + +static const char * const shutdown_reason_messages[] = { + "Normal Shutdown", + "Long Key Press Shutdown", +}; + +static const char * const shutdown_reason_values[] = { + "normal", + "long key press", +}; + static int aee_rr_reboot_reason_proc_open(struct inode *inode, struct file *file) { return single_open(file, aee_rr_reboot_reason_show, NULL); @@ -83,29 +125,29 @@ EXPORT_SYMBOL(aee_rr_proc_done); /* define /sys/bootinfo/powerup_reason */ static ssize_t powerup_reason_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { - int g_boot_reason = 0; - char *br_ptr; - if ((br_ptr = strstr(saved_command_line, "boot_reason=")) != 0) { - /* get boot reason */ - g_boot_reason = br_ptr[12] - '0'; - LOGE("g_boot_reason=%d\n", g_boot_reason); -#ifdef CONFIG_MTK_RAM_CONSOLE - if (aee_rr_last_fiq_step() != 0) - g_boot_reason = BR_KE_REBOOT; -#endif - return sprintf(buf, "%s\n", boot_reason[g_boot_reason]); - } else - return 0; - + return sprintf(buf, "%s\n", boot_reason_values[s_boot_reason]); } static struct kobj_attribute powerup_reason_attr = __ATTR_RO(powerup_reason); +/* define /sys/bootinfo/shutdown_reason */ +static ssize_t shutdown_reason_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + /* + * Check whether last shutdown is due to long power key press. + */ + + return sprintf(buf, "%s\n", shutdown_reason_values[g_shutdown_reason]); +} + +static struct kobj_attribute shutdown_reason_attr = __ATTR_RO(shutdown_reason); + struct kobject *bootinfo_kobj; EXPORT_SYMBOL(bootinfo_kobj); static struct attribute *bootinfo_attrs[] = { &powerup_reason_attr.attr, + &shutdown_reason_attr.attr, NULL }; @@ -113,10 +155,56 @@ static struct attribute_group bootinfo_attr_group = { .attrs = bootinfo_attrs, }; +/* Print boot reason and shutdown reason into kernel log */ +static void print_boot_shutdown_reason(void) +{ + /* Print boot reason. Copy from powerup_reason_show() */ + char *br_ptr; + br_ptr = strstr(saved_command_line, "boot_reason="); + + s_boot_reason = BR_UNKNOWN; + if (br_ptr == NULL) + pr_err("Fail to read boot reason: boot_reason not found!\n"); + else { + /* get boot reason */ + s_boot_reason = br_ptr[12] - '0'; + if (s_boot_reason == BR_WDT_BY_PASS_PWK) + s_boot_reason = BR_REBOOT_WARM + rtc_get_reboot_reason(); + if ((s_boot_reason < BR_POWER_KEY) + || (s_boot_reason >= BR_MAXIMUM)) { + pr_err("Fail to read boot reason: Undefined = %d!\n", + s_boot_reason); + s_boot_reason = BR_UNKNOWN; + } +#ifdef CONFIG_MTK_KERNEL_POWER_OFF_CHARGING + if (s_boot_reason == BR_WDT && (g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT + || g_boot_mode == LOW_POWER_OFF_CHARGING_BOOT)) + s_boot_reason = BR_REBOOT_INTO_POC; + if ((g_boot_mode != KERNEL_POWER_OFF_CHARGING_BOOT) + && (g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT)) + rtc_mark_reboot_reason(RTC_REBOOT_REASON_WARM); + else + rtc_mark_reboot_reason(RTC_REBOOT_REASON_FROM_POC); +#else + rtc_mark_reboot_reason(RTC_REBOOT_REASON_WARM); +#endif + } + pr_notice("Boot reason: %s\n", boot_reason_messages[s_boot_reason]); + + /* Print shutdown reason. */ + if (rtc_lprst_detected()) { + g_shutdown_reason = SR_LONG_KEY_PRESS; + rtc_mark_clear_lprst(); + } + pr_notice("Shutdown reason: %s\n", shutdown_reason_messages[g_shutdown_reason]); +} + int ksysfs_bootinfo_init(void) { int error; + print_boot_shutdown_reason(); + bootinfo_kobj = kobject_create_and_add("bootinfo", NULL); if (!bootinfo_kobj) { return -ENOMEM; diff --git a/drivers/misc/mediatek/aee/common/wdt-handler.c b/drivers/misc/mediatek/aee/common/wdt-handler.c index 9ef4446823b..d65866f2cf5 100644 --- a/drivers/misc/mediatek/aee/common/wdt-handler.c +++ b/drivers/misc/mediatek/aee/common/wdt-handler.c @@ -21,6 +21,7 @@ #include #include #endif +#include #include "aee-common.h" #undef WDT_DEBUG_VERBOSE @@ -52,7 +53,7 @@ extern void irq_raise_softirq(const struct cpumask *mask, unsigned int irq); #define WDT_PERCPU_LOG_SIZE 1024 #define WDT_LOG_DEFAULT_SIZE 4096 -#define WDT_SAVE_STACK_SIZE 128 +#define WDT_SAVE_STACK_SIZE 512 #define MAX_EXCEPTION_FRAME 16 extern int debug_locks; @@ -276,7 +277,9 @@ static void aee_wdt_dump_stack_bin(unsigned int cpu, unsigned long bottom, unsig } #endif /* #ifdef CONFIG_FIQ_GLUE */ +#ifdef CONFIG_MTK_AEE_MRDUMP extern void mrdump_mini_per_cpu_regs(int cpu, struct pt_regs *regs); +#endif /* save binary register and stack value into ram console */ static void aee_save_reg_stack_sram(int cpu) { @@ -314,12 +317,14 @@ static void aee_save_reg_stack_sram(int cpu) if (wdt_percpu_stackframe[cpu][i] == 0) break; len += snprintf((str_buf + len), (sizeof(str_buf) - len), - "%08lx, ", wdt_percpu_stackframe[cpu][i]); + "<%08lx>%pS, ", wdt_percpu_stackframe[cpu][i], (void *) wdt_percpu_stackframe[cpu][i]); } aee_sram_fiq_log(str_buf); } +#ifdef CONFIG_MTK_AEE_MRDUMP mrdump_mini_per_cpu_regs(cpu, ®s_buffer_bin[cpu].regs); +#endif } #ifdef CONFIG_SMP @@ -410,6 +415,10 @@ void aee_smp_send_stop(void) void aee_wdt_irq_info(void) { + + pr_err("Watchdog timeout FIQ!!!\n"); + dump_stack(); + unsigned long long t; unsigned long nanosec_rem; int res = 0, cpu; diff --git a/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hal.c b/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hal.c index 4b82de01591..eae722f8b36 100644 --- a/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hal.c +++ b/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hal.c @@ -17,9 +17,9 @@ * Zhong Wang * ****************************************************************************/ - -#include /* For init/exit macros */ -#include /* For MODULE_ marcros */ + +#include /* For init/exit macros */ +#include /* For MODULE_ marcros */ #include #include #include @@ -43,20 +43,21 @@ #include #include #include -#include // generate by DCT Tool +#include /*generate by DCT Tool */ #include "mt_auxadc_sw.h" #include "mt_auxadc_hw.h" +#include -#define DRV_ClearBits(addr,data) {\ +#define DRV_ClearBits(addr, data) {\ kal_uint16 temp;\ temp = DRV_Reg(addr);\ temp &=~(data);\ mt65xx_reg_sync_writew(temp, addr);\ } -#define DRV_SetBits(addr,data) {\ +#define DRV_SetBits(addr, data) {\ kal_uint16 temp;\ temp = DRV_Reg(addr);\ temp |= (data);\ @@ -96,164 +97,156 @@ mt65xx_reg_sync_writel(temp, REG);\ } -#define VOLTAGE_FULL_RANGE 1500 // VA voltage -#define AUXADC_PRECISE 4096 // 12 bits +#define VOLTAGE_FULL_RANGE 1500 /* VA voltage */ +#define AUXADC_PRECISE 4096 /* 12 bits */ +#define ADC_NAME "dvt-adc" + +#define ReadREG(reg) (*((volatile const u16 *)(reg))) +#define WriteREG(reg, val) ((*((volatile u16 *)(reg))) = ((u16)(val))) +#define MskWriteREG(reg, val, msk) WriteREG((reg), ((ReadREG((reg)) & (~((u16)(msk)))) | (((u16)(val)) & ((u16)(msk))))) + +struct udvt_cmd { + int cmd; + int value; +}; +static int adc_using_set_clr_mode = 1; +static unsigned int adc_auto_set_need_trigger_1st_sample; +static int adc_run; +static int adc_log_en; +static int adc_bg_detect_en; +static int adc_wakeup_src_en; + +unsigned int auxadc_sample_data[4] = { 0 }; +unsigned int auxadc_select_channel[4] = { 0 }; + + +struct timer_list adc_udvt_timer; +struct tasklet_struct adc_udvt_tasklet; /***************************************************************************** * Integrate with NVRAM ****************************************************************************/ -//use efuse cali -#if 0 -static kal_uint32 g_adc_ge = 0; -static kal_uint32 g_adc_oe = 0; -//static kal_uint32 g_o_vts = 0; -static kal_uint32 g_o_vbg = 0; -//static kal_uint32 g_degc_cali = 0; -static kal_uint32 g_adc_cali_en = 0; -//static kal_uint32 g_o_vts_abb = 0; -//static kal_int32 g_o_slope = 0; -//static kal_uint32 g_o_slope_sign = 0; -//static kal_uint32 g_id = 0; -static kal_uint32 g_y_vbg = 0;//defaul 1967 if cali_en=0 -#endif static DEFINE_MUTEX(mutex_get_cali_value); -static int adc_auto_set =0; +static int adc_auto_set = 0; -static u16 mt_tpd_read_adc(u16 pos) { - AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_TP_ADDR, pos); - AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_TP_CON0, 0x01); - while(0x01 & AUXADC_DRV_ReadReg16((volatile u16 *)AUXADC_TP_CON0)) { ; } //wait for write finish - return AUXADC_DRV_ReadReg16((volatile u16 *)AUXADC_TP_DATA0); +static u16 mt_tpd_read_adc(u16 pos) +{ + AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_TP_ADDR, pos); + AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_TP_CON0, 0x01); + while (0x01 & AUXADC_DRV_ReadReg16((volatile u16 *)AUXADC_TP_CON0)) {; + } //wait for write finish + return AUXADC_DRV_ReadReg16((volatile u16 *)AUXADC_TP_DATA0); } static void mt_auxadc_disable_penirq(void) { - //Turn off PENIRQ detection circuit AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_TP_CMD, 1); - //run once touch function mt_tpd_read_adc(TP_CMD_ADDR_X); } -//step1 check con2 if auxadc is busy -//step2 clear bit -//step3 read channle and make sure old ready bit ==0 -//step4 set bit to trigger sample -//step5 read channle and make sure ready bit ==1 -//step6 read data +/* +step1 check con2 if auxadc is busy +step2 clear bit +step3 read channle and make sure old ready bit ==0 +step4 set bit to trigger sample +step5 read channle and make sure ready bit ==1 +step6 read data +*/ -int IMM_auxadc_GetOneChannelValue(int dwChannel, int data[4], int* rawdata) +int IMM_auxadc_GetOneChannelValue(int dwChannel, int data[4], int *rawdata) { - unsigned int channel[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - int idle_count =0; - int data_ready_count=0; - - mutex_lock(&mutex_get_cali_value); -#if 0 - if(enable_clock(MT_PDN_PERI_AUXADC,"AUXADC")) - { - printk("hwEnableClock AUXADC failed."); - } -#endif - if(dwChannel == PAD_AUX_XP)mt_auxadc_disable_penirq(); - //step1 check con2 if auxadc is busy - while ((*(volatile u16 *)AUXADC_CON2) & 0x01) - { - printk("[adc_api]: wait for module idle\n"); - msleep(100); - idle_count++; - if(idle_count>30) - { - //wait for idle time out - printk("[adc_api]: wait for auxadc idle time out\n"); - mutex_unlock(&mutex_get_cali_value); - return -1; - } - } - // step2 clear bit - if(0 == adc_auto_set) - { - //clear bit - AUXADC_DRV_ClearBits16((volatile u16 *)AUXADC_CON1, (1 << dwChannel)); - } - + unsigned int channel[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int idle_count = 0; + int data_ready_count = 0; - //step3 read channle and make sure old ready bit ==0 - while ((*(volatile u16 *)(AUXADC_DAT0 + dwChannel * 0x04)) & (1<<12)) - { - printk("[adc_api]: wait for channel[%d] ready bit clear\n",dwChannel); - msleep(10); - data_ready_count++; - if(data_ready_count>30) - { - //wait for idle time out - printk("[adc_api]: wait for channel[%d] ready bit clear time out\n",dwChannel); - mutex_unlock(&mutex_get_cali_value); - return -2; - } - } - - //step4 set bit to trigger sample - if(0==adc_auto_set) - { - AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_CON1, (1 << dwChannel)); - } - //step5 read channle and make sure ready bit ==1 - udelay(25);//we must dealay here for hw sample cahnnel data - while (0==((*(volatile u16 *)(AUXADC_DAT0 + dwChannel * 0x04)) & (1<<12))) - { - printk("[adc_api]: wait for channel[%d] ready bit ==1\n",dwChannel); - msleep(10); - data_ready_count++; - - if(data_ready_count>30) - { - //wait for idle time out - printk("[adc_api]: wait for channel[%d] data ready time out\n",dwChannel); - mutex_unlock(&mutex_get_cali_value); - return -3; - } - } - //step6 read data - - channel[dwChannel] = (*(volatile u16 *)(AUXADC_DAT0 + dwChannel * 0x04)) & 0x0FFF; - if(NULL != rawdata) - { - *rawdata = channel[dwChannel]; - } - //printk("[adc_api: imm mode raw data => channel[%d] = %d\n",dwChannel, channel[dwChannel]); - //printk("[adc_api]: imm mode => channel[%d] = %d.%02d\n", dwChannel, (channel[dwChannel] * 150 / AUXADC_PRECISE / 100), ((channel[dwChannel] * 150 / AUXADC_PRECISE) % 100)); - data[0] = (channel[dwChannel] * 150 / AUXADC_PRECISE / 100); - data[1] = ((channel[dwChannel] * 150 / AUXADC_PRECISE) % 100); - + mutex_lock(&mutex_get_cali_value); #if 0 - if(disable_clock(MT_PDN_PERI_AUXADC,"AUXADC")) - { - printk("hwEnableClock AUXADC failed."); - } -#endif - mutex_unlock(&mutex_get_cali_value); - - return 0; - + if (enable_clock(MT_PDN_PERI_AUXADC, "AUXADC")) { + printk("hwEnableClock AUXADC failed."); + } +#endif + if (dwChannel == PAD_AUX_XP) + mt_auxadc_disable_penirq(); + /*step1 check con2 if auxadc is busy */ + while ((*(volatile u16 *)AUXADC_CON2) & 0x01) { + msleep(100); + idle_count++; + if (idle_count > 30) { + /*wait for idle time out */ + printk(KERN_ERR "[adc_api]: wait for auxadc idle time out\n"); + mutex_unlock(&mutex_get_cali_value); + return -1; + } + } + /* step2 clear bit */ + if (0 == adc_auto_set) + AUXADC_DRV_ClearBits16((volatile u16 *)AUXADC_CON1, (1 << dwChannel)); + + /*step3 read channle and make sure old ready bit ==0 */ + while ((*(volatile u16 *)(AUXADC_DAT0 + dwChannel * 0x04)) & (1 << 12)) { + msleep(10); + data_ready_count++; + if (data_ready_count > 30) { + printk(KERN_ERR "[adc_api]: wait for channel[%d] ready bit clear time out\n", + dwChannel); + mutex_unlock(&mutex_get_cali_value); + return -2; + } + } + + /*step4 set bit to trigger sample */ + if (0 == adc_auto_set) { + AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_CON1, (1 << dwChannel)); + } + /*step5 read channle and make sure ready bit ==1 */ + udelay(25); /*we must dealay here for hw sample cahnnel data */ + while (0 == ((*(volatile u16 *)(AUXADC_DAT0 + dwChannel * 0x04)) & (1 << 12))) { + msleep(10); + data_ready_count++; + + if (data_ready_count > 30) { + printk(KERN_ERR "[adc_api]: wait for channel[%d] data ready time out\n", dwChannel); + mutex_unlock(&mutex_get_cali_value); + return -3; + } + } + + channel[dwChannel] = (*(volatile u16 *)(AUXADC_DAT0 + dwChannel * 0x04)) & 0x0FFF; + if (NULL != rawdata) { + *rawdata = channel[dwChannel]; + } + + data[0] = (channel[dwChannel] * 150 / AUXADC_PRECISE / 100); + data[1] = ((channel[dwChannel] * 150 / AUXADC_PRECISE) % 100); + +#if 0 + if (disable_clock(MT_PDN_PERI_AUXADC, "AUXADC")) { + printk("hwEnableClock AUXADC failed."); + } +#endif + mutex_unlock(&mutex_get_cali_value); + + return 0; + } -// 1v == 1000000 uv -// this function voltage Unit is uv -int IMM_auxadc_GetOneChannelValue_Cali(int Channel, int*voltage) +/* this function voltage Unit is uv */ +int IMM_auxadc_GetOneChannelValue_Cali(int Channel, int *voltage) { - int ret = 0, data[4], rawvalue; - - ret = IMM_auxadc_GetOneChannelValue( Channel, data, &rawvalue); - if(ret) - { - printk("[adc_api]:IMM_auxadc_GetOneChannelValue_Cali get raw value error %d \n",ret); + int ret = 0, data[4]; + int rawvalue[4]; + ret = IMM_auxadc_GetOneChannelValue(Channel, data, rawvalue); + if (ret) { + printk(KERN_ERR "[adc_api]:IMM_auxadc_GetOneChannelValue_Cali get raw value error %d \n", + ret); return -1; - } - *voltage = rawvalue*1500000 / AUXADC_PRECISE; - //printk("[adc_api]:IMM_auxadc_GetOneChannelValue_Cali voltage= %d uv \n",*voltage); - return 0; - + } + *voltage = (rawvalue[0]) * 1500 / AUXADC_PRECISE; + *voltage = *voltage*1000; + + return 0; + } #if 0 @@ -262,11 +255,10 @@ static int IMM_auxadc_get_evrage_data(int times, int Channel) int ret = 0, data[4], i, ret_value = 0, ret_temp = 0; i = times; - while (i--) - { + while (i--) { ret_value = IMM_auxadc_GetOneChannelValue(Channel, data, &ret_temp); ret += ret_temp; - printk("[auxadc_get_data(channel%d)]: ret_temp=%d\n",Channel,ret_temp); + printk("[auxadc_get_data(channel%d)]: ret_temp=%d\n", Channel, ret_temp); } ret = ret / times; @@ -274,98 +266,500 @@ static int IMM_auxadc_get_evrage_data(int times, int Channel) } #endif +static long adc_udvt_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + /* void __user *uarg = (void __user *)arg; */ + struct udvt_cmd *pcmd = (struct udvt_cmd *)arg; + + int voltage[4] = { 0 }; + +/* printk(KERN_EMERG"cmd:%d, value:0x%x\n", pcmd->cmd, pcmd->value); */ + + switch (pcmd->cmd) { + case ENABLE_ADC_CLOCK: +#if 0 + if (enable_clock(MT_CG_PERI_AUXADC_PDN, "AUXADC") == 0) { + printk(KERN_EMERG "[adc_udvt]: ENABLE_ADC_CLOCK\n"); + } else { + printk(KERN_EMERG "[adc_udvt]: enable_clock failed.\n"); + } +#endif + break; + + case DISABLE_ADC_CLOCK: +#if 0 + if (disable_clock(MT_CG_PERI_AUXADC_PDN, "AUXADC") == 0) { + printk(KERN_EMERG "[adc_udvt]: DISABLE_ADC_CLOCK\n"); + } else { + printk(KERN_EMERG "[adc_udvt]: disable_clock failed.\n"); + } +#endif + break; +#if 0 + case ENABLE_ADC_DCM: + printk(KERN_EMERG "[adc_udvt]: dcm_enable(ALL_DCM)\n"); + dcm_enable(ALL_DCM); + break; +#endif + case ENABLE_ADC_AUTO_SET: + adc_auto_set = 1; + adc_auto_set_need_trigger_1st_sample = 0xffff; + WriteREG(AUXADC_CON0, 0xffff); + break; + + case DISABLE_ADC_AUTO_SET: + adc_auto_set = 0; + adc_auto_set_need_trigger_1st_sample = 0; + WriteREG(AUXADC_CON0, 0x0000); + break; + + case SET_AUXADC_CON0: + WriteREG(AUXADC_CON0, pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_CON1: + WriteREG(AUXADC_CON1, pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_CON1_SET: + adc_using_set_clr_mode = 1; + break; + + case SET_AUXADC_CON1_CLR: + adc_using_set_clr_mode = 0; + break; + + case SET_AUXADC_CON2: + *(volatile u16 *)AUXADC_CON2 = (u16) (pcmd->value & 0xFFFF); + break; +#if 0 + + case SET_AUXADC_CON3: + *(volatile u16 *)AUXADC_CON3 = (u16) (pcmd->value & 0xFFFF); + break; +#endif + + case SET_AUXADC_DAT0: + *(volatile u16 *)AUXADC_DAT0 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT1: + *(volatile u16 *)AUXADC_DAT1 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT2: + *(volatile u16 *)AUXADC_DAT2 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT3: + *(volatile u16 *)AUXADC_DAT3 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT4: + *(volatile u16 *)AUXADC_DAT4 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT5: + *(volatile u16 *)AUXADC_DAT5 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT6: + *(volatile u16 *)AUXADC_DAT6 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT7: + *(volatile u16 *)AUXADC_DAT7 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT8: + *(volatile u16 *)AUXADC_DAT8 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT9: + *(volatile u16 *)AUXADC_DAT9 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT10: + *(volatile u16 *)AUXADC_DAT10 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT11: + *(volatile u16 *)AUXADC_DAT11 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT12: + *(volatile u16 *)AUXADC_DAT12 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT13: + *(volatile u16 *)AUXADC_DAT13 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT14: + *(volatile u16 *)AUXADC_DAT13 = (u16) (pcmd->value & 0xFFFF); + break; + + case SET_AUXADC_DAT15: + *(volatile u16 *)AUXADC_DAT13 = (u16) (pcmd->value & 0xFFFF); + break; + + case GET_AUXADC_CON0: + pcmd->value = ((*(volatile u16 *)AUXADC_CON0) & 0xFFFF); + break; + + case GET_AUXADC_CON1: + pcmd->value = ((*(volatile u16 *)AUXADC_CON1) & 0xFFFF); + break; + + case GET_AUXADC_CON2: + pcmd->value = ((*(volatile u16 *)AUXADC_CON2) & 0xFFFF); + break; +#if 0 + + case GET_AUXADC_CON3: + pcmd->value = ((*(volatile u16 *)AUXADC_CON3) & 0xFFFF); + break; +#endif + + case GET_AUXADC_DAT0: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT0) & 0xFFFF); + break; + + case GET_AUXADC_DAT1: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT1) & 0xFFFF); + break; + + case GET_AUXADC_DAT2: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT2) & 0xFFFF); + break; + + case GET_AUXADC_DAT3: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT3) & 0xFFFF); + break; + + case GET_AUXADC_DAT4: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT4) & 0xFFFF); + break; + + case GET_AUXADC_DAT5: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT5) & 0xFFFF); + break; + + case GET_AUXADC_DAT6: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT6) & 0xFFFF); + break; + + case GET_AUXADC_DAT7: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT7) & 0xFFFF); + break; + + case GET_AUXADC_DAT8: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT8) & 0xFFFF); + break; + + case GET_AUXADC_DAT9: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT9) & 0xFFFF); + break; + + case GET_AUXADC_DAT10: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT10) & 0xFFFF); + break; + + case GET_AUXADC_DAT11: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT11) & 0xFFFF); + break; + + case GET_AUXADC_DAT12: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT12) & 0xFFFF); + break; + + case GET_AUXADC_DAT13: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT13) & 0xFFFF); + break; + + case GET_AUXADC_DAT14: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT13) & 0xFFFF); + break; + + case GET_AUXADC_DAT15: + pcmd->value = ((*(volatile u16 *)AUXADC_DAT13) & 0xFFFF); + break; +#if 0 + + case ENABLE_SYN_MODE: + adc_mode = 1; + break; + + case DISABLE_SYN_MODE: + adc_mode = 0; + break; +#endif + + case ENABLE_ADC_RUN: + adc_run = 1; + +#if 0 + printk(KERN_EMERG "hwDisableClock AUXADC."); + + if (disable_clock(MT65XX_PDN_PERI_AUXADC, "AUXADC")) { + printk(KERN_EMERG "hwEnableClock AUXADC failed."); + } +#endif + break; + + case DISABLE_ADC_RUN: + adc_run = 0; + break; + + case ENABLE_ADC_LOG: + adc_log_en = 1; + break; + + case DISABLE_ADC_LOG: + adc_log_en = 0; + break; + + case ENABLE_BG_DETECT: + adc_bg_detect_en = 1; + break; + + case DISABLE_BG_DETECT: + adc_bg_detect_en = 0; + break; +#if 0 + + case ENABLE_3G_TX: + adc_3g_tx_en = 1; + break; + + case DISABLE_3G_TX: + adc_3g_tx_en = 0; + break; + + case ENABLE_2G_TX: + adc_2g_tx_en = 1; + break; + + case DISABLE_2G_TX: + adc_2g_tx_en = 0; + break; +#endif + + case SET_ADC_WAKE_SRC: + /* slp_set_wakesrc(WAKE_SRC_CFG_KEY|WAKE_SRC_LOW_BAT, TRUE, FALSE); */ + adc_wakeup_src_en = 1; + break; + + case SET_DET_VOLT: + (*(volatile u16 *)AUXADC_DET_VOLT) = pcmd->value; + printk(KERN_DEBUG "AUXADC_DET_VOLT: 0x%x\n", (*(volatile u16 *)AUXADC_DET_VOLT)); + break; + + case SET_DET_PERIOD: + (*(volatile u16 *)AUXADC_DET_PERIOD) = pcmd->value; + printk(KERN_DEBUG "AUXADC_DET_PERIOD: 0x%x\n", + (*(volatile u16 *)AUXADC_DET_PERIOD)); + break; + + case SET_DET_DEBT: + (*(volatile u16 *)AUXADC_DET_DEBT) = pcmd->value; + printk(KERN_DEBUG "AUXADC_DET_DEBT: 0x%x\n", (*(volatile u16 *)AUXADC_DET_DEBT)); + break; + + case Set_Adc_Channel0: + IMM_auxadc_GetOneChannelValue_Cali(0, auxadc_sample_data); + printk(KERN_DEBUG "Get channel0 voltage value: 0x%x!\n", auxadc_sample_data[0]); + + break; + + case Set_Adc_Channel1: + IMM_auxadc_GetOneChannelValue_Cali(1, auxadc_sample_data); + printk(KERN_DEBUG "Get channel0 voltage value: 0x%x!\n", auxadc_sample_data[0]); + + break; + + case Set_Adc_Channel2: + IMM_auxadc_GetOneChannelValue_Cali(2, auxadc_sample_data); + printk(KERN_DEBUG "Get channel0 voltage value: 0x%x!\n", auxadc_sample_data[0]); + + break; + + case Set_Adc_Channel3: + IMM_auxadc_GetOneChannelValue_Cali(3, auxadc_sample_data); + printk(KERN_DEBUG "Get channel0 voltage value: 0x%x!\n", auxadc_sample_data[0]); + + break; + + case Set_Adc_Channel4: + IMM_auxadc_GetOneChannelValue_Cali(4, auxadc_sample_data); + printk(KERN_DEBUG "Get channel0 voltage value: 0x%x!\n", auxadc_sample_data[0]); + + break; + + case Set_Adc_Channel5: + IMM_auxadc_GetOneChannelValue_Cali(5, auxadc_sample_data); + printk(KERN_DEBUG "Get channel0 voltage value: 0x%x!\n", auxadc_sample_data[0]); + + break; + + default: + return -EINVAL; + } + + return 0; +} + + +static int adc_udvt_dev_open(struct inode *inode, struct file *file) +{ + /* if(hwEnableClock(MT65XX_PDN_PERI_TP,"Touch")==FALSE) */ + /* printk(KERN_EMERG"hwEnableClock TP failed.\n"); */ + + return 0; +} + +static int adc_udvt_dev_read(struct file *file, int __user * buf, size_t size, loff_t * ppos) +{ + unsigned long p = *ppos; + unsigned int count = size; + int ret = 0; + + int i = 0, data[4] = { 0 }; + int rawvalue[4] = { 0 }; + i = auxadc_select_channel[0]; + + ret = IMM_auxadc_GetOneChannelValue(i, data, rawvalue); + + if (copy_to_user(buf, data, count)) + { + ret = -EFAULT; + } else { + *ppos += count; + ret = count; + + rawvalue[0] = rawvalue[0] * 1500000 / AUXADC_PRECISE; + + printk(KERN_DEBUG "[adc_api]: 2!imm mode raw data => channel[%d] = %d,%d\n", i, rawvalue[0], + *rawvalue); + + } + + + return ret; +} + +static int adc_udvt_dev_write(struct file *file, int __user * buf, size_t size, loff_t * ppos) +{ + unsigned long p = *ppos; + unsigned int count = size; + int i = 0, data[4] = { 0 }; + int ret = 0; + + if (copy_from_user(data, buf, count)) { + printk(KERN_ERR "copy_from_user fail!\n"); + ret = -EFAULT; + } else { + *ppos += count; + ret = count; + } + auxadc_select_channel[0] = data[0]; /*get select channel from user space*/ + return ret; + +} + + +static struct file_operations adc_udvt_dev_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = adc_udvt_dev_ioctl, + .open = adc_udvt_dev_open, + .read = adc_udvt_dev_read, + .write = adc_udvt_dev_write, +}; + +static struct miscdevice adc_udvt_dev = { + .minor = MISC_DYNAMIC_MINOR, + .name = ADC_NAME, + .fops = &adc_udvt_dev_fops, +}; + +void adc_udvt_tasklet_fn() +{ + + unsigned int i = 0, data[4] = { 0 }; + int res = 0; + + res = IMM_auxadc_GetOneChannelValue_Cali(i, data); + + if (res < 0) + printk(KERN_ERR "[adc_udvt]: get data error\n"); + else + printk(KERN_DEBUG "[adc_udvt]: channel[%2u]=%4u mV\n", i, data[0]); + return; +} + static void mt_auxadc_cal_prepare(void) { //mt6582 no voltage calibration + int ret; + + ret = misc_register(&adc_udvt_dev); + if (ret) { + printk("[adc_udvt]: register driver failed (%d)\n", ret); + /* return ret; */ + } + + tasklet_init(&adc_udvt_tasklet, adc_udvt_tasklet_fn, 0); } void mt_auxadc_hal_init(void) { - AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_MISC, 1 << 14); //power on ADC + AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_MISC, 1 << 14); mt_auxadc_cal_prepare(); - AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_CON_RTP, 1); //disable RTP + AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_CON_RTP, 1); } void mt_auxadc_hal_suspend(void) { - if(disable_clock(MT_PDN_PERI_AUXADC,"AUXADC")) - { - printk("hwEnableClock AUXADC failed."); - } - + if (disable_clock(MT_PDN_PERI_AUXADC, "AUXADC")) { + printk(KERN_ERR "hwEnableClock AUXADC failed."); + } + } void mt_auxadc_hal_resume(void) { - - if(enable_clock(MT_PDN_PERI_AUXADC,"AUXADC")) - { - printk("hwEnableClock AUXADC again!!!."); - if(enable_clock(MT_PDN_PERI_AUXADC,"AUXADC")) - { - printk("hwEnableClock AUXADC failed."); - } + + if (enable_clock(MT_PDN_PERI_AUXADC, "AUXADC")) { + printk(KERN_ERR "hwEnableClock AUXADC again!!!."); + if (enable_clock(MT_PDN_PERI_AUXADC, "AUXADC")) { + printk(KERN_ERR "hwEnableClock AUXADC failed."); + } } - AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_MISC, 1 << 14); //power on ADC - AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_CON_RTP, 1); //disable RTP + AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_MISC, 1 << 14); /*power on ADC */ + AUXADC_DRV_SetBits16((volatile u16 *)AUXADC_CON_RTP, 1); /*disable RTP */ } int mt_auxadc_dump_register(char *buf) { - printk("[auxadc]: AUXADC_CON0=%x\n",*(volatile u16 *)AUXADC_CON0); - printk("[auxadc]: AUXADC_CON1=%x\n",*(volatile u16 *)AUXADC_CON1); - printk("[auxadc]: AUXADC_CON2=%x\n",*(volatile u16 *)AUXADC_CON2); + if (buf == NULL) { + pr_debug("[%s] Invalid input!!\n", __func__); + return 0; + } - return sprintf(buf, "AUXADC_CON0:%x\n AUXADC_CON1:%x\n AUXADC_CON2:%x\n" - , *(volatile u16 *)AUXADC_CON0,*(volatile u16 *)AUXADC_CON1,*(volatile u16 *)AUXADC_CON2); + if (strlen(buf) < 64) { + pr_debug("[%s] Invalid input!!\n", __func__); + return 0; + } + + printk(KERN_DEBUG "[auxadc]: AUXADC_CON0=%x\n", *(volatile u16 *)AUXADC_CON0); + printk(KERN_DEBUG "[auxadc]: AUXADC_CON1=%x\n", *(volatile u16 *)AUXADC_CON1); + printk(KERN_DEBUG "[auxadc]: AUXADC_CON2=%x\n", *(volatile u16 *)AUXADC_CON2); + + return sprintf(buf, "AUXADC_CON0:%x\n AUXADC_CON1:%x\n AUXADC_CON2:%x\n", + *(volatile u16 *)AUXADC_CON0, *(volatile u16 *)AUXADC_CON1, + *(volatile u16 *)AUXADC_CON2); } - - -void mt_auxadc_enableBackgroundDection(u16 channel, u16 volt, u16 period, u16 debounce, u16 tFlag) -{ - // Set background detection period, Set 0 to disable background detection. - *(volatile u16 *)AUXADC_DET_PERIOD = period * 32; - - // Set the Debounce Time - *(volatile u16 *)AUXADC_DET_DEBT = debounce * 32; - - // set the voltage for background detection(bit 15 set higher or lower) - *(volatile u16 *)AUXADC_DET_VOLT = (u16)((unsigned int)(4096 * volt) / 1500); - - if (tFlag == 1) - { - *(volatile u16 *)AUXADC_DET_VOLT |= 1 << 15; - } - else - { - *(volatile u16 *)AUXADC_DET_VOLT &= ~(1 << 15); - } - // Set the Channel - *(volatile u16 *)AUXADC_DET_SEL = channel; - -} - -void mt_auxadc_disableBackgroundDection(u16 channel) -{ - // Set the Channel - *(volatile u16 *)AUXADC_DET_SEL = channel; - - // Set 0 to disable background detection. - *(volatile u16 *)AUXADC_DET_PERIOD = 0; -} - -u16 mt_auxadc_getCurrentChannel() -{ - return *(volatile u16 *)AUXADC_DET_SEL; -} - -u16 mt_auxadc_getCurrentTrigger() -{ - return (*(volatile u16 *)AUXADC_DET_VOLT >> 15) & (u16)1; -} - - diff --git a/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hw.h b/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hw.h index 5025d602cc9..31392d425a0 100644 --- a/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hw.h +++ b/drivers/misc/mediatek/auxadc/mt8127/mt_auxadc_hw.h @@ -5,23 +5,159 @@ #define AUXADC_CON0 (AUXADC_BASE + 0x000) #define AUXADC_CON1 (AUXADC_BASE + 0x004) +#define AUXADC_CON1_SET (AUXADC_BASE + 0x008) +#define AUXADC_CON1_CLR (AUXADC_BASE + 0x00C) #define AUXADC_CON2 (AUXADC_BASE + 0x010) #define AUXADC_DAT0 (AUXADC_BASE + 0x014) +#define AUXADC_DAT1 (AUXADC_BASE + 0x018) +#define AUXADC_DAT2 (AUXADC_BASE + 0x01C) +#define AUXADC_DAT3 (AUXADC_BASE + 0x020) +#define AUXADC_DAT4 (AUXADC_BASE + 0x024) +#define AUXADC_DAT5 (AUXADC_BASE + 0x028) +#define AUXADC_DAT6 (AUXADC_BASE + 0x02C) +#define AUXADC_DAT7 (AUXADC_BASE + 0x030) +#define AUXADC_DAT8 (AUXADC_BASE + 0x034) +#define AUXADC_DAT9 (AUXADC_BASE + 0x038) +#define AUXADC_DAT10 (AUXADC_BASE + 0x03C) +#define AUXADC_DAT11 (AUXADC_BASE + 0x040) +#define AUXADC_DAT12 (AUXADC_BASE + 0x044) +#define AUXADC_DAT13 (AUXADC_BASE + 0x048) +#define AUXADC_DAT14 (AUXADC_BASE + 0x04C) +#define AUXADC_DAT15 (AUXADC_BASE + 0x050) #define AUXADC_TP_CMD (AUXADC_BASE + 0x005c) #define AUXADC_TP_ADDR (AUXADC_BASE + 0x0060) #define AUXADC_TP_CON0 (AUXADC_BASE + 0x0064) #define AUXADC_TP_DATA0 (AUXADC_BASE + 0x0074) -#define AUXADC_MISC (AUXADC_BASE + 0x0094) + #define AUXADC_DET_VOLT (AUXADC_BASE + 0x084) #define AUXADC_DET_SEL (AUXADC_BASE + 0x088) #define AUXADC_DET_PERIOD (AUXADC_BASE + 0x08C) #define AUXADC_DET_DEBT (AUXADC_BASE + 0x090) +#define AUXADC_MISC (AUXADC_BASE + 0x0094) + +#define AUXADC_ECC (AUXADC_BASE + 0x098) +#define AUXADC_SAMPLE_LIST (AUXADC_BASE + 0x09c) +#define AUXADC_ABIST_PERIOD (AUXADC_BASE + 0x0A0) +#define AUXADC_TST (AUXADC_BASE + 0x0A4) +#define AUXADC_SPL_EN (AUXADC_BASE + 0x0B0) #define PAD_AUX_XP 13 #define TP_CMD_ADDR_X 0x0005 #define AUXADC_CON_RTP (APMIXEDSYS_BASE + 0x0404) +#define BASE_VALUE (100) +#define SET_AUXADC_CON0 (BASE_VALUE + 1) +#define SET_AUXADC_CON1 (BASE_VALUE + 2) +#define SET_AUXADC_CON2 (BASE_VALUE + 3) +/* efine SET_AUXADC_CON3 (BASE_VALUE + 4) */ +#define SET_AUXADC_DAT0 (BASE_VALUE + 5) +#define SET_AUXADC_DAT1 (BASE_VALUE + 6) +#define SET_AUXADC_DAT2 (BASE_VALUE + 7) +#define SET_AUXADC_DAT3 (BASE_VALUE + 8) +#define SET_AUXADC_DAT4 (BASE_VALUE + 9) +#define SET_AUXADC_DAT5 (BASE_VALUE + 10) +#define SET_AUXADC_DAT6 (BASE_VALUE + 11) +#define SET_AUXADC_DAT7 (BASE_VALUE + 12) +#define SET_AUXADC_DAT8 (BASE_VALUE + 13) +#define SET_AUXADC_DAT9 (BASE_VALUE + 14) +#define SET_AUXADC_DAT10 (BASE_VALUE + 15) +#define SET_AUXADC_DAT11 (BASE_VALUE + 16) +#define SET_AUXADC_DAT12 (BASE_VALUE + 17) +#define SET_AUXADC_DAT13 (BASE_VALUE + 18) +#define SET_AUXADC_DET_VOLT (BASE_VALUE + 19) +#define SET_AUXADC_DET_SEL (BASE_VALUE + 20) +#define SET_AUXADC_DET_PERIOD (BASE_VALUE + 21) +#define SET_AUXADC_DET_DEBT (BASE_VALUE + 22) +#define SET_AUXADC_TXPWR_CH (BASE_VALUE + 23) +#define SET_AUXADC_DAT14 (BASE_VALUE + 24) +#define SET_AUXADC_DAT15 (BASE_VALUE + 25) +#define SET_AUXADC_CON1_SET (BASE_VALUE + 26) +#define SET_AUXADC_CON1_CLR (BASE_VALUE + 27) +#if 0 +#define SET_AUXADC_2GTX_CH (BASE_VALUE + 24) +#define SET_AUXADC_2GTX_DAT0 (BASE_VALUE + 25) +#define SET_AUXADC_2GTX_DAT1 (BASE_VALUE + 26) +#define SET_AUXADC_2GTX_DAT2 (BASE_VALUE + 27) +#define SET_AUXADC_2GTX_DAT3 (BASE_VALUE + 28) +#define SET_AUXADC_2GTX_DAT4 (BASE_VALUE + 29) +#define SET_AUXADC_2GTX_DAT5 (BASE_VALUE + 30) +#endif +#define GET_AUXADC_CON0 (BASE_VALUE + 31) +#define GET_AUXADC_CON1 (BASE_VALUE + 32) +#define GET_AUXADC_CON2 (BASE_VALUE + 33) +#define GET_AUXADC_CON3 (BASE_VALUE + 34) +#define GET_AUXADC_DAT0 (BASE_VALUE + 35) +#define GET_AUXADC_DAT1 (BASE_VALUE + 36) +#define GET_AUXADC_DAT2 (BASE_VALUE + 37) +#define GET_AUXADC_DAT3 (BASE_VALUE + 38) +#define GET_AUXADC_DAT4 (BASE_VALUE + 39) +#define GET_AUXADC_DAT5 (BASE_VALUE + 40) +#define GET_AUXADC_DAT6 (BASE_VALUE + 41) +#define GET_AUXADC_DAT7 (BASE_VALUE + 42) +#define GET_AUXADC_DAT8 (BASE_VALUE + 43) +#define GET_AUXADC_DAT9 (BASE_VALUE + 44) +#define GET_AUXADC_DAT10 (BASE_VALUE + 45) +#define GET_AUXADC_DAT11 (BASE_VALUE + 46) +#define GET_AUXADC_DAT12 (BASE_VALUE + 47) +#define GET_AUXADC_DAT13 (BASE_VALUE + 48) +#define GET_AUXADC_DET_VOLT (BASE_VALUE + 49) +#define GET_AUXADC_DET_SEL (BASE_VALUE + 50) +#define GET_AUXADC_DET_PERIOD (BASE_VALUE + 51) +#define GET_AUXADC_DET_DEBT (BASE_VALUE + 52) +#define GET_AUXADC_TXPWR_CH (BASE_VALUE + 53) +#define GET_AUXADC_DAT14 (BASE_VALUE + 54) +#define GET_AUXADC_DAT15 (BASE_VALUE + 55) +#if 0 +#define GET_AUXADC_2GTX_CH (BASE_VALUE + 54) +#define GET_AUXADC_2GTX_DAT0 (BASE_VALUE + 55) +#define GET_AUXADC_2GTX_DAT1 (BASE_VALUE + 56) +#define GET_AUXADC_2GTX_DAT2 (BASE_VALUE + 57) +#define GET_AUXADC_2GTX_DAT3 (BASE_VALUE + 58) +#define GET_AUXADC_2GTX_DAT4 (BASE_VALUE + 59) +#define GET_AUXADC_2GTX_DAT5 (BASE_VALUE + 60) +#endif +#define SET_ADC_WAKE_SRC (BASE_VALUE + 61) +#define ENABLE_SYN_MODE (BASE_VALUE + 80) +#define DISABLE_SYN_MODE (BASE_VALUE + 81) + +#define ENABLE_ADC_RUN (BASE_VALUE + 84) +#define DISABLE_ADC_RUN (BASE_VALUE + 85) + +#define ENABLE_BG_DETECT (BASE_VALUE + 86) +#define DISABLE_BG_DETECT (BASE_VALUE + 87) + +#define ENABLE_ADC_CLOCK (BASE_VALUE + 88) +#define DISABLE_ADC_CLOCK (BASE_VALUE + 89) +#define ENABLE_ADC_DCM (BASE_VALUE + 90) + +#if 0 +#define ENABLE_3G_TX (BASE_VALUE + 88) +#define DISABLE_3G_TX (BASE_VALUE + 89) + +#define ENABLE_2G_TX (BASE_VALUE + 90) +#define DISABLE_2G_TX (BASE_VALUE + 91) +#endif +#define SET_DET_VOLT (BASE_VALUE + 92) +#define GET_DET_VOLT (BASE_VALUE + 93) +#define SET_DET_PERIOD (BASE_VALUE + 94) +#define GET_DET_PERIOD (BASE_VALUE + 95) +#define SET_DET_DEBT (BASE_VALUE + 96) +#define GET_DET_DEBT (BASE_VALUE + 97) +#define ENABLE_ADC_AUTO_SET (BASE_VALUE + 98) +#define DISABLE_ADC_AUTO_SET (BASE_VALUE + 99) + +#define GET_ALL_REG_VAL (BASE_VALUE + 100) + +#define ENABLE_ADC_LOG (98) +#define DISABLE_ADC_LOG (99) + +#define Set_Adc_Channel0 (BASE_VALUE + 101) +#define Set_Adc_Channel1 (BASE_VALUE + 102) +#define Set_Adc_Channel2 (BASE_VALUE + 103) +#define Set_Adc_Channel3 (BASE_VALUE + 104) +#define Set_Adc_Channel4 (BASE_VALUE + 105) +#define Set_Adc_Channel5 (BASE_VALUE + 106) #endif /*_MTK_ADC_HW_H*/ diff --git a/drivers/misc/mediatek/auxadc/mt_auxadc.c b/drivers/misc/mediatek/auxadc/mt_auxadc.c index 760f93f00c5..d54e17bc929 100644 --- a/drivers/misc/mediatek/auxadc/mt_auxadc.c +++ b/drivers/misc/mediatek/auxadc/mt_auxadc.c @@ -101,14 +101,12 @@ int IMM_get_adc_channel_num(char *channel_name, int len) { unsigned int i; - printk("[ADC] name = %s\n", channel_name); - printk("[ADC] name_len = %d\n", len); for (i = 0; i < ADC_CHANNEL_MAX; i++) { if (!strncmp(channel_name, g_adc_info[i].channel_name, len)) { return g_adc_info[i].channel_number; } } - printk("[ADC] find channel number failed\n"); + printk(KERN_ERR "[ADC] find channel number failed\n"); return -1; } @@ -152,8 +150,7 @@ static long auxadc_cali_unlocked_ioctl(struct file *file, unsigned int cmd,unsig } } for (i = 0; i < ADC_CHANNEL_MAX; i++) - printk("auxadc_cali_slop[%d] = %d\n", i, *(auxadc_cali_slop + i)); - printk("**** MT auxadc_cali ioctl : SET_ADC_CALI_Slop Done!\n"); + printk(KERN_DEBUG "auxadc_cali_slop[%d] = %d\n", i, *(auxadc_cali_slop + i)); break; case SET_ADC_CALI_Offset: @@ -161,8 +158,7 @@ static long auxadc_cali_unlocked_ioctl(struct file *file, unsigned int cmd,unsig ret = copy_from_user(auxadc_cali_offset, nvram_data_addr, 36); g_AUXADC_Cali = KAL_FALSE; for (i = 0; i < ADC_CHANNEL_MAX; i++) - printk("auxadc_cali_offset[%d] = %d\n", i, *(auxadc_cali_offset + i)); - printk("**** MT auxadc_cali ioctl : SET_ADC_CALI_Offset Done!\n"); + printk(KERN_DEBUG "auxadc_cali_offset[%d] = %d\n", i, *(auxadc_cali_offset + i)); break; case SET_ADC_CALI_Cal : @@ -175,8 +171,7 @@ static long auxadc_cali_unlocked_ioctl(struct file *file, unsigned int cmd,unsig g_AUXADC_Cali = KAL_FALSE; } for (i = 0; i < 1; i++) - printk("auxadc_cali_cal[%d] = %d\n", i, *(auxadc_cali_cal + i)); - printk("**** MT auxadc_cali ioctl : SET_ADC_CALI_Cal Done!\n"); + printk(KERN_DEBUG "auxadc_cali_cal[%d] = %d\n", i, *(auxadc_cali_cal + i)); break; case ADC_CHANNEL_READ: @@ -184,10 +179,7 @@ static long auxadc_cali_unlocked_ioctl(struct file *file, unsigned int cmd,unsig user_data_addr = (long *)arg; ret = copy_from_user(auxadc_in_data, user_data_addr, 8); /* 2*int = 2*4 */ - printk("this api is removed !! \n"); ret = copy_to_user(user_data_addr, auxadc_out_data, 8); - printk("**** ioctl : AUXADC Channel %d * %d times = %d\n", auxadc_in_data[0], - auxadc_in_data[1], auxadc_out_data[0]); break; default: @@ -226,14 +218,12 @@ static ssize_t show_AUXADC_Channel_0_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 0)); - printk("[EM] AUXADC_Channel_0_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_0_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -244,14 +234,12 @@ static ssize_t show_AUXADC_Channel_0_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 0)); - printk("[EM] AUXADC_Channel_0_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_0_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -266,14 +254,12 @@ static ssize_t show_AUXADC_Channel_1_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 1)); - printk("[EM] AUXADC_Channel_1_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_1_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -284,14 +270,12 @@ static ssize_t show_AUXADC_Channel_1_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 1)); - printk("[EM] AUXADC_Channel_1_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_1_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -306,14 +290,12 @@ static ssize_t show_AUXADC_Channel_2_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 2)); - printk("[EM] AUXADC_Channel_2_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_2_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -324,14 +306,12 @@ static ssize_t show_AUXADC_Channel_2_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 2)); - printk("[EM] AUXADC_Channel_2_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_2_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -346,14 +326,12 @@ static ssize_t show_AUXADC_Channel_3_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 3)); - printk("[EM] AUXADC_Channel_3_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_3_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -364,14 +342,12 @@ static ssize_t show_AUXADC_Channel_3_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 3)); - printk("[EM] AUXADC_Channel_3_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_3_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -386,14 +362,12 @@ static ssize_t show_AUXADC_Channel_4_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 4)); - printk("[EM] AUXADC_Channel_4_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_4_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -404,14 +378,12 @@ static ssize_t show_AUXADC_Channel_4_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 4)); - printk("[EM] AUXADC_Channel_4_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_4_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -426,14 +398,12 @@ static ssize_t show_AUXADC_Channel_5_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 5)); - printk("[EM] AUXADC_Channel_5_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_5_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -444,14 +414,12 @@ static ssize_t show_AUXADC_Channel_5_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 5)); - printk("[EM] AUXADC_Channel_5_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_5_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -466,14 +434,12 @@ static ssize_t show_AUXADC_Channel_6_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 6)); - printk("[EM] AUXADC_Channel_6_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_6_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -484,14 +450,12 @@ static ssize_t show_AUXADC_Channel_6_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 6)); - printk("[EM] AUXADC_Channel_6_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_6_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -506,14 +470,12 @@ static ssize_t show_AUXADC_Channel_7_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 7)); - printk("[EM] AUXADC_Channel_7_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_7_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -524,14 +486,12 @@ static ssize_t show_AUXADC_Channel_7_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 7)); - printk("[EM] AUXADC_Channel_7_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_7_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -546,14 +506,12 @@ static ssize_t show_AUXADC_Channel_8_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 8)); - printk("[EM] AUXADC_Channel_8_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_8_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -564,14 +522,12 @@ static ssize_t show_AUXADC_Channel_8_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 8)); - printk("[EM] AUXADC_Channel_8_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_8_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -586,14 +542,12 @@ static ssize_t show_AUXADC_Channel_9_Slope(struct device *dev, struct device_att { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 9)); - printk("[EM] AUXADC_Channel_9_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_9_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -604,14 +558,12 @@ static ssize_t show_AUXADC_Channel_9_Offset(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 9)); - printk("[EM] AUXADC_Channel_9_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_9_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -626,14 +578,12 @@ static ssize_t show_AUXADC_Channel_10_Slope(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 10)); - printk("[EM] AUXADC_Channel_10_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_10_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -644,14 +594,12 @@ static ssize_t show_AUXADC_Channel_10_Offset(struct device *dev, struct device_a { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 10)); - printk("[EM] AUXADC_Channel_10_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_10_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -666,14 +614,12 @@ static ssize_t show_AUXADC_Channel_11_Slope(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 11)); - printk("[EM] AUXADC_Channel_11_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_11_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -684,14 +630,12 @@ static ssize_t show_AUXADC_Channel_11_Offset(struct device *dev, struct device_a { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 11)); - printk("[EM] AUXADC_Channel_11_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_11_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -706,14 +650,12 @@ static ssize_t show_AUXADC_Channel_12_Slope(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 12)); - printk("[EM] AUXADC_Channel_12_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_12_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -724,14 +666,12 @@ static ssize_t show_AUXADC_Channel_12_Offset(struct device *dev, struct device_a { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 12)); - printk("[EM] AUXADC_Channel_12_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_12_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -746,14 +686,12 @@ static ssize_t show_AUXADC_Channel_13_Slope(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 13)); - printk("[EM] AUXADC_Channel_13_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_13_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -764,14 +702,12 @@ static ssize_t show_AUXADC_Channel_13_Offset(struct device *dev, struct device_a { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 13)); - printk("[EM] AUXADC_Channel_13_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_13_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -786,14 +722,12 @@ static ssize_t show_AUXADC_Channel_14_Slope(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 14)); - printk("[EM] AUXADC_Channel_14_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_14_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -804,14 +738,12 @@ static ssize_t show_AUXADC_Channel_14_Offset(struct device *dev, struct device_a { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 14)); - printk("[EM] AUXADC_Channel_14_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_14_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -826,14 +758,12 @@ static ssize_t show_AUXADC_Channel_15_Slope(struct device *dev, struct device_at { int ret_value = 1; ret_value = (*(auxadc_cali_slop + 15)); - printk("[EM] AUXADC_Channel_15_Slope : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_15_Slope(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -844,14 +774,12 @@ static ssize_t show_AUXADC_Channel_15_Offset(struct device *dev, struct device_a { int ret_value = 1; ret_value = (*(auxadc_cali_offset + 15)); - printk("[EM] AUXADC_Channel_15_Offset : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } static ssize_t store_AUXADC_Channel_15_Offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -867,7 +795,6 @@ static ssize_t show_AUXADC_Channel_Is_Calibration(struct device *dev, struct dev { int ret_value = 2; ret_value = g_AUXADC_Cali; - printk("[EM] AUXADC_Channel_Is_Calibration : %d\n", ret_value); return sprintf(buf, "%u\n", ret_value); } @@ -875,7 +802,6 @@ static ssize_t store_AUXADC_Channel_Is_Calibration(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support Write Function\n"); return size; } @@ -884,13 +810,17 @@ static DEVICE_ATTR(AUXADC_Channel_Is_Calibration, 0664, show_AUXADC_Channel_Is_C static ssize_t show_AUXADC_register(struct device *dev,struct device_attribute *attr, char *buf) { + if (buf == NULL) { + pr_debug("[%s] Invalid input!!\n", __func__); + return 0; + } + return mt_auxadc_dump_register(buf); } static ssize_t store_AUXADC_register(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - printk("[EM] Not Support store_AUXADC_register\n"); return size; } @@ -903,14 +833,19 @@ static ssize_t show_AUXADC_chanel(struct device *dev,struct device_attribute *at int i = 0, data[4] = {0,0,0,0}; char buf_temp[960]; int res =0; + + if (buf == NULL) { + pr_debug("[%s] Invalid input!!\n", __func__); + return 0; + } + for (i = 0; i < 5; i++) { res = IMM_auxadc_GetOneChannelValue(i,data,NULL); if (res < 0) { - printk("[adc_driver]: get data error\n"); + printk(KERN_ERR "[adc_driver]: get data error\n"); break; } else { - printk("[adc_driver]: channel[%d]=%d.%d \n",i,data[0],data[1]); sprintf(buf_temp,"channel[%d]=%d.%d \n",i,data[0],data[1]); strcat(buf,buf_temp); } @@ -933,22 +868,22 @@ static int dbug_thread(void *unused) for (i = 0; i < ADC_CHANNEL_MAX; i++) { res = IMM_auxadc_GetOneChannelValue(i,data,&rawdata); if (res < 0) { - printk("[adc_driver]: get data error\n"); + printk(KERN_ERR "[adc_driver]: get data error\n"); break; } else { - printk("[adc_driver]: channel[%d]raw =%d\n",i,rawdata); - printk("[adc_driver]: channel[%d]=%d.%.02d\n", i, data[0], + printk(KERN_DEBUG "[adc_driver]: channel[%d]raw =%d\n",i,rawdata); + printk(KERN_DEBUG "[adc_driver]: channel[%d]=%d.%.02d\n", i, data[0], data[1]); } res = IMM_auxadc_GetOneChannelValue_Cali(i,&cali_voltage ); if (res < 0) { - printk("[adc_driver]: get cali voltage error\n"); + printk(KERN_ERR "[adc_driver]: get cali voltage error\n"); break; } else { - printk("[adc_driver]: channel[%d] cali_voltage =%d\n", i, + printk(KERN_DEBUG "[adc_driver]: channel[%d] cali_voltage =%d\n", i, cali_voltage); } @@ -965,24 +900,32 @@ static int dbug_thread(void *unused) static ssize_t store_AUXADC_channel(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - unsigned int start_flag; - int error; + int start_flag = 0; + int error = 0; + int ret = 0; - if (sscanf(buf, "%u", &start_flag) != 1) { - printk("[adc_driver]: Invalid values\n"); - return -EINVAL; - } + if (buf == NULL) { + pr_debug("[%s] Invalid input!!\n", __func__); + return 0; + } - printk("[adc_driver] start flag =%d \n",start_flag); + ret = kstrtoint(buf, 0, &start_flag); + if (ret < 0) { + pr_debug("[%s] Invalid invalues!!\n", __func__); + return 0; + } + + pr_debug("[adc_driver] start flag =%d\n", start_flag); + if (start_flag) { g_start_debug_thread = start_flag; - if (1 == start_flag) { - thread = kthread_run(dbug_thread, 0, "AUXADC"); - + thread = kthread_run(dbug_thread, 0, "AUXADC"); if (IS_ERR(thread)) { - error = PTR_ERR(thread); - printk( "[adc_driver] failed to create kernel thread: %d\n", error); - } + error = PTR_ERR(thread); + pr_debug("[adc_driver] failed to create kernel thread: %d\n", error); } + } else { + pr_debug("[%s] Invalid input!!\n", __func__); + } return size; } @@ -1110,17 +1053,12 @@ static int adc_channel_info_init(void) /* ap_domain &= ~(1<owner = THIS_MODULE; auxadc_cali_cdev->ops = &auxadc_cali_fops; ret = cdev_add(auxadc_cali_cdev, auxadc_cali_devno, 1); if(ret) - printk("auxadc_cali Error: cdev_add\n"); + printk(KERN_ERR "auxadc_cali Error: cdev_add\n"); auxadc_cali_major = MAJOR(auxadc_cali_devno); auxadc_cali_class = class_create(THIS_MODULE, AUXADC_CALI_DEVNAME); adc_dev = (struct device *)device_create(auxadc_cali_class, NULL, auxadc_cali_devno, NULL, AUXADC_CALI_DEVNAME); - printk("[MT AUXADC_probe] NVRAM prepare : done !!\n"); if(mt_auxadc_create_device_attr(adc_dev)) goto exit; @@ -1190,13 +1120,11 @@ exit: static int mt_auxadc_remove(struct platform_device *dev) { - printk("******** MT auxadc driver remove!! ********\n" ); return 0; } static void mt_auxadc_shutdown(struct platform_device *dev) { - printk("******** MT auxadc driver shutdown!! ********\n" ); } static int mt_auxadc_suspend(struct platform_device *dev, pm_message_t state) @@ -1255,14 +1183,13 @@ static int __init mt_auxadc_init(void) ret = platform_driver_register(&mt_auxadc_driver); if (ret) { - printk("****[mt_auxadc_driver] Unable to register driver (%d)\n", ret); + printk(KERN_ERR "****[mt_auxadc_driver] Unable to register driver (%d)\n", ret); return ret; } - printk("****[mt_auxadc_driver] Initialization : DONE \n"); #ifndef CONFIG_MTK_FPGA if(enable_clock(MT_PDN_PERI_AUXADC,"AUXADC")) - printk("hwEnableClock AUXADC failed."); + printk(KERN_ERR "hwEnableClock AUXADC failed."); #endif return 0; } diff --git a/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.c b/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.c index 00e6684a048..799142582c8 100644 --- a/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.c +++ b/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.c @@ -1,43 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Kernelc - * - * Project: - * -------- - * MT6583 Audio Driver Kernel Function - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Chipeng Chang - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ /***************************************************************************** @@ -74,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -692,7 +662,7 @@ static int AudDrv_btcvsd_probe(struct platform_device *dev) static int AudDrv_btcvsd_open(struct inode *inode, struct file *fp) { - xlog_printk(ANDROID_LOG_INFO, "Sound", "AudDrv_btcvsd_open do nothing inode:%p, file:%p \n", inode, fp); + pr_debug("%s AudDrv_btcvsd_open do nothing inode:%p, file:%p \n",__func__, inode, fp); return 0; } @@ -920,7 +890,7 @@ static ssize_t AudDrv_btcvsd_read(struct file *fp, char __user *data, size_t co //printk("AudDrv_btcvsd_read 2-2 copy_to_user target=0x%x, source=0x%x,size_2=%d\n",(Read_Data_Ptr+size_1),((kal_uint8 *)btsco.pRX->PacketBuf+BTSCORX_ReadIdx_tmp+size_1),size_2); if (copy_to_user((void __user *)(Read_Data_Ptr + size_1), (void *)((kal_uint8 *)btsco.pRX->PacketBuf), size_2)) { - xlog_printk(ANDROID_LOG_ERROR, "Sound", "AudDrv_btcvsd_read Fail 3 copy to user Read_Data_Ptr:%p, pRX->PacketBuf:%p, BTSCORX_ReadIdx_tmp:0x%x, read_size:%x", Read_Data_Ptr, btsco.pRX->PacketBuf, BTSCORX_ReadIdx_tmp, read_size); + pr_info("%s AudDrv_btcvsd_read Fail 3 copy to user Read_Data_Ptr:%p, pRX->PacketBuf:%p, BTSCORX_ReadIdx_tmp:0x%x, read_size:%x",__func__,Read_Data_Ptr, btsco.pRX->PacketBuf, BTSCORX_ReadIdx_tmp, read_size); if (read_count == 0) { return -1; diff --git a/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.h b/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.h index b36cd46c843..73b0d7f38a0 100644 --- a/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.h +++ b/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD.h @@ -1,3 +1,15 @@ +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef AUDDRV_BTCVSD_H #define AUDDRV_BTCVSD_H diff --git a/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD_ioctl.h b/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD_ioctl.h index 66bf72b35df..54234809eb4 100644 --- a/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD_ioctl.h +++ b/drivers/misc/mediatek/btcvsd/mt8127/AudDrv_BTCVSD_ioctl.h @@ -1,32 +1,15 @@ -/******************************************************************************* +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Filename: - * --------- - * auddrv_btcvsd_ioctl.h + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * Project: - * -------- - * Android Audio BTCVSD Driver - * - * Description: - * ------------ - * ioctl control message - * - * Author: - * ------- - * - * - * - *------------------------------------------------------------------------------ - * $Revision$ - * $Modtime:$ - * $Log:$ - * - * . - * - * - * - *******************************************************************************/ + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef _AUDDRV_BTCVSD_IOCTL_MSG_H #define _AUDDRV_BTCVSD_IOCTL_MSG_H diff --git a/drivers/misc/mediatek/btcvsd/mt8127/AudioBTCVSDDef.h b/drivers/misc/mediatek/btcvsd/mt8127/AudioBTCVSDDef.h index 583798895f5..dc052929b6a 100644 --- a/drivers/misc/mediatek/btcvsd/mt8127/AudioBTCVSDDef.h +++ b/drivers/misc/mediatek/btcvsd/mt8127/AudioBTCVSDDef.h @@ -1,3 +1,15 @@ +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef _AUDIO_BTCVSD_DEF_H_ #define _AUDIO_BTCVSD_DEF_H_ diff --git a/drivers/misc/mediatek/ccci_util/ccci_util_lib_sys.c b/drivers/misc/mediatek/ccci_util/ccci_util_lib_sys.c index 16e9c6198fc..a76dc7960cd 100644 --- a/drivers/misc/mediatek/ccci_util/ccci_util_lib_sys.c +++ b/drivers/misc/mediatek/ccci_util/ccci_util_lib_sys.c @@ -305,11 +305,18 @@ static int command_parser(const char *input_str, char cmd[], unsigned long out_ int i=0, j, k; char tmp_buf[32]; char filter_str[256]; + size_t string_count = count; + unsigned int para_label = 1; + + if (string_count > 256) { + CCCI_UTIL_ERR_MSG("error: input String length = %u>256\n", (unsigned int)string_count); + return -1; + } // Filter out 0xD and 0xA j=0; i=0; - while((i<256)&&(input_str[i]!='\0')) { + while ((i < 255) && (input_str[i] != '\0') && (string_count--)) { if((input_str[i] == 0xD)||(input_str[i] == 0xA)) { i++; continue; @@ -320,6 +327,11 @@ static int command_parser(const char *input_str, char cmd[], unsigned long out_ } filter_str[j] = '\0'; + if (string_count >= 2) { + CCCI_UTIL_ERR_MSG("error: In-valid input String\n"); + return -1; + } + i=0; // Parse command if(filter_str[i] == '\0') @@ -327,9 +339,19 @@ static int command_parser(const char *input_str, char cmd[], unsigned long out_ j=0; while(filter_str[i] != '\0') { if(filter_str[i] != '_') { - cmd[j] = filter_str[i]; - j++; - i++; + if ((filter_str[i] < 'A') || ((filter_str[i] > 'Z') + && (filter_str[i] < 'a')) || (filter_str[i] > 'z')) { + CCCI_UTIL_ERR_MSG("error: In-valid command\n"); + return -1; + } + if (j < 31) { + cmd[j] = filter_str[i]; + j++; + i++; + } else { + CCCI_UTIL_ERR_MSG("error: cmd[] is out-of-bounds\n"); + return -1; + } } else { i++; break; @@ -342,11 +364,37 @@ static int command_parser(const char *input_str, char cmd[], unsigned long out_ if(filter_str[i] == '\0') return k+1; j=0; + para_label = 1; while(filter_str[i] != '\0') { if(filter_str[i] != '_') { - tmp_buf[j] = filter_str[i]; - j++; - i++; + if (para_label) { + if ((filter_str[i] == '0') && ((filter_str[i+1] == 'x') + || (filter_str[i+1] == 'X'))) { + tmp_buf[j] = filter_str[i]; + tmp_buf[j+1] = filter_str[i+1]; + i = i + 2; + j = j + 2; + para_label = 0; + continue; + } else { + CCCI_UTIL_ERR_MSG("error: In-valid parameter header\n"); + return -1; + } + } + if ((filter_str[i] < '0') || ((filter_str[i] > '9') + && (filter_str[i] < 'A')) || ((filter_str[i] > 'F') + && (filter_str[i] < 'a')) || (filter_str[i] > 'f')) { + CCCI_UTIL_ERR_MSG("error: In-valid parameter\n"); + return -1; + } + if (j < 31) { + tmp_buf[j] = filter_str[i]; + j++; + i++; + } else { + CCCI_UTIL_ERR_MSG("error: parameter[] is out-of-bounds\n"); + return -1; + } } else { i++; break; @@ -476,8 +524,10 @@ static ssize_t aat_show(char *buf) static ssize_t aat_store(const char *buf, size_t count) { - int para_num = command_parser(buf, aat_cmd, aat_para); - cmd_process(aat_cmd, aat_para, para_num); + int para_num = command_parser(buf, count, aat_cmd, aat_para); + + if (para_num > 0) + cmd_process(aat_cmd, aat_para, para_num); return count; } diff --git a/drivers/misc/mediatek/cmdq/cmdq_driver.c b/drivers/misc/mediatek/cmdq/cmdq_driver.c index d0440b06210..54cd55b1a04 100644 --- a/drivers/misc/mediatek/cmdq/cmdq_driver.c +++ b/drivers/misc/mediatek/cmdq/cmdq_driver.c @@ -41,8 +41,9 @@ static const struct of_device_id cmdq_of_ids[] = { }; #endif -#define CMDQ_MAX_DUMP_REG_COUNT (2048) +/* max count of regs */ #define CMDQ_MAX_COMMAND_SIZE (0x10000) +#define CMDQ_MAX_DUMP_REG_COUNT (2048) #define CMDQ_MAX_WRITE_ADDR_COUNT (PAGE_SIZE / sizeof(u32)) static dev_t gCmdqDevNo; @@ -242,9 +243,9 @@ static void cmdq_driver_process_read_address_request(cmdqReadAddressStruct *req_ do { if (NULL == req_user || - 0 == req_user->count || + 0 == req_user->count || req_user->count > CMDQ_MAX_DUMP_REG_COUNT || - NULL == req_user->values || NULL == req_user->dmaAddresses) { + NULL == req_user->values || NULL == req_user->dmaAddresses) { CMDQ_ERR("[READ_PA] invalid req_user\n"); break; } @@ -370,7 +371,6 @@ static long cmdq_driver_process_command_request(cmdqCommandStruct *pCommand) CMDQ_ERR("mismatch regRequest and regValue\n"); return -EFAULT; } - if (pCommand->regRequest.count > CMDQ_MAX_DUMP_REG_COUNT) return -EINVAL; @@ -467,7 +467,6 @@ static long cmdq_ioctl(struct file *pFile, unsigned int code, unsigned long para if (copy_from_user(&command, (void *)param, sizeof(cmdqCommandStruct))) { return -EFAULT; } - if (command.regRequest.count > CMDQ_MAX_DUMP_REG_COUNT || !command.blockSize || command.blockSize > CMDQ_MAX_COMMAND_SIZE) @@ -497,7 +496,6 @@ static long cmdq_ioctl(struct file *pFile, unsigned int code, unsigned long para if (job.command.blockSize > CMDQ_MAX_COMMAND_SIZE) return -EINVAL; - /* not support secure path for async ioctl yet */ if (true == job.command.secData.isSecure) { CMDQ_ERR("not support secure path for CMDQ_IOCTL_ASYNC_JOB_EXEC\n"); @@ -555,6 +553,7 @@ static long cmdq_ioctl(struct file *pFile, unsigned int code, unsigned long para return -EFAULT; } pTask = (TaskStruct *)(unsigned long)jobResult.hJob; + if (pTask->regCount > CMDQ_MAX_DUMP_REG_COUNT) return -EINVAL; diff --git a/drivers/misc/mediatek/connectivity/combo/common/core/include/wmt_lib.h b/drivers/misc/mediatek/connectivity/combo/common/core/include/wmt_lib.h index 8fd67d61c31..c96b2086bf4 100644 --- a/drivers/misc/mediatek/connectivity/combo/common/core/include/wmt_lib.h +++ b/drivers/misc/mediatek/connectivity/combo/common/core/include/wmt_lib.h @@ -80,8 +80,6 @@ when mtk_wcn_wmt_func_on is called by wifi through rfkill) #define MAX_GPIO_CTRL_TIME (2000) /* [FixMe][GeorgeKuo] a temp value */ -#define MAX_PATCH_NUM 10 - /******************************************************************************* * E X T E R N A L R E F E R E N C E S ******************************************************************************** diff --git a/drivers/misc/mediatek/connectivity/combo/common/linux/wmt_dev.c b/drivers/misc/mediatek/connectivity/combo/common/linux/wmt_dev.c index 51c8b6796b0..858aef71b76 100644 --- a/drivers/misc/mediatek/connectivity/combo/common/linux/wmt_dev.c +++ b/drivers/misc/mediatek/connectivity/combo/common/linux/wmt_dev.c @@ -1163,20 +1163,13 @@ long WMT_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case WMT_IOCTL_SET_PATCH_NUM:{ pAtchNum = arg; - if (pAtchNum == 0 || pAtchNum > MAX_PATCH_NUM) { - WMT_ERR_FUNC("patch num(%d) == 0 or > %d!\n", pAtchNum, MAX_PATCH_NUM); - iRet = -1; - break; - } - - pPatchInfo = kzalloc(sizeof(WMT_PATCH_INFO) * pAtchNum, GFP_ATOMIC); - if (!pPatchInfo) { - WMT_ERR_FUNC("allocate memory fail!\n"); - iRet = -EFAULT; - break; - } WMT_INFO_FUNC(" get patch num from launcher = %d\n", pAtchNum); wmt_lib_set_patch_num(pAtchNum); + pPatchInfo = kzalloc(sizeof(WMT_PATCH_INFO) *pAtchNum, GFP_ATOMIC); + if (!pPatchInfo) { + WMT_ERR_FUNC("allocate memory fail!\n"); + break; + } } break; diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_kal.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_kal.c index 0bbc9f89e3b..7f52f5585db 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_kal.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_kal.c @@ -1553,9 +1553,9 @@ kalIndicateStatusAndComplete(IN P_GLUE_INFO_T prGlueInfo, ssid.aucSsid[(ssid.u4SsidLen >= PARAM_MAX_LEN_SSID) ? (PARAM_MAX_LEN_SSID - 1) : ssid.u4SsidLen] = '\0'; - DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [ssid:%s " MACSTR "]\n", + DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [" MACSTR "]\n", prGlueInfo->prDevHandler->name, - ssid.aucSsid, MAC2STR(arBssid))); + MAC2STR(arBssid))); } while (0); if (prGlueInfo->fgIsRegistered == TRUE) { diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_p2p.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_p2p.c index 3d1eece30c7..52f4408e8f9 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_p2p.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6620/wlan/os/linux/gl_p2p.c @@ -3299,148 +3299,6 @@ mtk_p2p_wext_discovery_results(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - struct iw_event iwe; - char *current_ev = extra; - UINT_32 i; - P_GLUE_INFO_T prGlueInfo = NULL; - P_ADAPTER_T prAdapter = NULL; - P_P2P_INFO_T prP2PInfo = (P_P2P_INFO_T) NULL; - P_EVENT_P2P_DEV_DISCOVER_RESULT_T prTargetResult = (P_EVENT_P2P_DEV_DISCOVER_RESULT_T) NULL; - P_PARAM_VARIABLE_IE_T prDesiredIE = NULL; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - prP2PInfo = prAdapter->prP2pInfo; - - for (i = 0; i < prP2PInfo->u4DeviceNum; i++) { - prTargetResult = &prP2PInfo->arP2pDiscoverResult[i]; - - /* SIOCGIWAP */ - iwe.cmd = SIOCGIWAP; - iwe.u.ap_addr.sa_family = ARPHRD_ETHER; - memcpy(iwe.u.ap_addr.sa_data, prTargetResult->aucInterfaceAddr, 6); - - current_ev = iwe_stream_add_event(info, current_ev, - extra + IW_SCAN_MAX_DATA, &iwe, IW_EV_ADDR_LEN); - - - /* SIOCGIWESSID */ - iwe.cmd = SIOCGIWESSID; - iwe.u.data.flags = 1; - iwe.u.data.length = prTargetResult->u2NameLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, prTargetResult->aucName); - - /* IWEVGENIE for WPA IE */ - if (prTargetResult->u2IELength <= 600 - && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf, prTargetResult->u2IELength, - 0xDD, (PUINT_8 *) &prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16) prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } -#if CFG_SUPPORT_WPS - - /* IWEVGENIE for WPS IE */ - if ((prTargetResult->u2IELength <= 600) - && wextSrchDesiredWPSIE(prTargetResult->pucIeBuf, prTargetResult->u2IELength, - 0xDD, (PUINT_8 *) &prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16) prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } -#endif - - /* IWEVGENIE for RSN IE */ - if ((prTargetResult->u2IELength <= 600) - && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf, prTargetResult->u2IELength, - 0x30, (PUINT_8 *) &prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16) prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } - - /* IOC_P2P_GO_WSC_IE */ -#if 1 - /* device capability */ - if (1) { - UINT_8 data[40]; - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 8 + sizeof("p2p_cap="); - - snprintf(data, iwe.u.data.length, "p2p_cap=%02x%02x%02x%02x%c", - prTargetResult->ucDeviceCapabilityBitmap, - prTargetResult->ucGroupCapabilityBitmap, - (UINT_8) prTargetResult->u2ConfigMethod, - (UINT_8) (prTargetResult->u2ConfigMethod >> 8), '\0'); - current_ev = - iwe_stream_add_point(info, current_ev, extra + IW_SCAN_MAX_DATA, &iwe, - (char *)data); - - /* printk("%s\n", data); */ - kalMemZero(data, 40); - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 12 + sizeof("p2p_dev_type="); - - snprintf(data, iwe.u.data.length, "p2p_dev_type=%02x%02x%02x%02x%02x%02x%c", - (UINT_8) prTargetResult->rPriDevType.u2CategoryID, - (UINT_8) prTargetResult->rPriDevType.u2SubCategoryID, - (UINT_8) prTargetResult->arSecDevType[0].u2CategoryID, - (UINT_8) prTargetResult->arSecDevType[0].u2SubCategoryID, - (UINT_8) prTargetResult->arSecDevType[1].u2CategoryID, - (UINT_8) prTargetResult->arSecDevType[1].u2SubCategoryID, '\0'); - current_ev = - iwe_stream_add_point(info, current_ev, extra + IW_SCAN_MAX_DATA, &iwe, - (char *)data); - /* printk("%s\n", data); */ - - kalMemZero(data, 40); - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 17 + sizeof("p2p_grp_bssid="); - - snprintf(data, iwe.u.data.length, "p2p_grp_bssid=" MACSTR "%c", - MAC2STR(prTargetResult->aucBSSID), '\0'); - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)data); - /* printk("%s\n", data); */ - - } -#endif - } - - /* Length of data */ - wrqu->data.length = (current_ev - extra); - wrqu->data.flags = 0; return 0; } /* end of mtk_p2p_wext_discovery_results() */ @@ -3465,41 +3323,6 @@ mtk_p2p_wext_wsc_ie(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_HOSTAPD_PARAM prHostapdParam = (P_IW_P2P_HOSTAPD_PARAM) extra; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - if (prHostapdParam->len > 0) { - if (prHostapdParam->len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[0], prHostapdParam->data, - prHostapdParam->len)) { - return -EFAULT; - } - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[2], prHostapdParam->data, - prHostapdParam->len)) { - return -EFAULT; - } - } else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[0] = prHostapdParam->len; - prGlueInfo->prP2PInfo->u2WSCIELen[2] = prHostapdParam->len; - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX); - - /* @TODO: send message to P2P-FSM */ return 0; } /* end of mtk_p2p_wext_wsc_ie() */ @@ -3524,62 +3347,6 @@ mtk_p2p_wext_connect_disconnect(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - struct iw_point *prData = (struct iw_point *)&wrqu->data; -/* P_IW_P2P_CONNECT_DEVICE prConnectDevice = (P_IW_P2P_CONNECT_DEVICE)extra; */ -/* P_MSG_HDR_T prMsgHdr; */ -/* P_MSG_P2P_CONNECTION_REQUEST_T prMsgP2PConnReq; */ -/* P_MSG_P2P_CONNECTION_ABORT_T prMsgP2PConnAbt; */ -/* UINT_8 aucBCAddr[] = BC_MAC_ADDR; */ - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - if (prData->flags == P2P_CONNECT) { -#if 0 - /* indicate P2P-FSM with MID_MNY_P2P_CONNECTION_REQ */ - prMsgP2PConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T) cnmMemAlloc(prAdapter, - RAM_TYPE_MSG, - sizeof - (MSG_P2P_CONNECTION_REQUEST_T)); - - if (!prMsgP2PConnReq) { - ASSERT(0); /* Can't trigger P2P FSM */ - return -ENOMEM; - } - - - mboxSendMsg(prAdapter, - MBOX_ID_0, (P_MSG_HDR_T) prMsgP2PConnReq, MSG_SEND_METHOD_BUF); -#endif - } else if (prData->flags == P2P_DISCONNECT) { -#if 0 - /* indicate P2P-FSM with MID_MNY_P2P_CONNECTION_ABORT */ - prMsgP2PConnAbt = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, - RAM_TYPE_MSG, - sizeof(MSG_P2P_CONNECTION_ABORT_T)); - - if (!prMsgP2PConnAbt) { - ASSERT(0); /* Can't trigger P2P FSM */ - return -ENOMEM; - } - - COPY_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, prConnectDevice->sta_addr); - - prMsgP2PConnAbt->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT; - - mboxSendMsg(prAdapter, - MBOX_ID_0, (P_MSG_HDR_T) prMsgP2PConnAbt, MSG_SEND_METHOD_BUF); -#endif - } else { - return -EINVAL; - } return 0; } /* end of mtk_p2p_wext_connect_disconnect() */ @@ -3604,66 +3371,6 @@ mtk_p2p_wext_password_ready(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_PASSWORD_READY prPasswordReady = (P_IW_P2P_PASSWORD_READY) extra; - P_P2P_CONNECTION_SETTINGS_T prConnSettings; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - prConnSettings = prAdapter->rWifiVar.prP2PConnSettings; - - /* retrieve IE for Probe Request */ - if (prPasswordReady->probe_req_len > 0) { - if (prPasswordReady->probe_req_len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[1], prPasswordReady->probe_req_ie, - prPasswordReady->probe_req_len)) { - return -EFAULT; - } - } else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[1] = prPasswordReady->probe_req_len; - - /* retrieve IE for Probe Response */ - if (prPasswordReady->probe_rsp_len > 0) { - if (prPasswordReady->probe_rsp_len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[2], prPasswordReady->probe_rsp_ie, - prPasswordReady->probe_rsp_len)) { - return -EFAULT; - } - } else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[2] = prPasswordReady->probe_rsp_len; - - switch (prPasswordReady->active_config_method) { - case 1: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_PUSH_BUTTON; - break; - case 2: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_KEYPAD; - break; - case 3: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_DISPLAY; - break; - default: - break; - } - - prConnSettings->fgIsPasswordIDRdy = TRUE; return 0; } /* end of mtk_p2p_wext_password_ready() */ @@ -3687,30 +3394,6 @@ mtk_p2p_wext_request_dev_info(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_DEVICE_REQ prDeviceReq = (P_IW_P2P_DEVICE_REQ) extra; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - /* specify data length */ - wrqu->data.length = sizeof(IW_P2P_DEVICE_REQ); - - /* copy to upper-layer supplied buffer */ - kalMemCopy(prDeviceReq->name, prGlueInfo->prP2PInfo->aucConnReqDevName, - prGlueInfo->prP2PInfo->u4ConnReqNameLength); - prDeviceReq->name_len = prGlueInfo->prP2PInfo->u4ConnReqNameLength; - prDeviceReq->name[prDeviceReq->name_len] = '\0'; - COPY_MAC_ADDR(prDeviceReq->device_addr, prGlueInfo->prP2PInfo->rConnReqPeerAddr); - prDeviceReq->device_type = prGlueInfo->prP2PInfo->ucConnReqDevType; - prDeviceReq->config_method = prGlueInfo->prP2PInfo->i4ConnReqConfigMethod; - prDeviceReq->active_config_method = prGlueInfo->prP2PInfo->i4ConnReqActiveConfigMethod; return 0; } /* end of mtk_p2p_wext_request_dev_info() */ @@ -3998,126 +3681,7 @@ mtk_p2p_wext_set_int(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - UINT_32 index; - INT_32 value; - PUINT_32 pu4IntBuf; - P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL; - P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL; - P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL; - UINT_32 u4Leng; - - ASSERT(prDev); - ASSERT(wrqu); - - /* printk("mtk_p2p_wext_set_int\n"); */ - pu4IntBuf = (PUINT_32) extra; - - if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) { - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prP2pSpecificBssInfo = prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo; - prP2pConnSettings = prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings; - prP2pFsmInfo = prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo; - - u4SubCmd = (UINT_32) wrqu->mode; - index = pu4IntBuf[1]; - value = pu4IntBuf[2]; - - printk("set parameter, u4SubCmd=%d idx=%d value=%lu\n", (INT_16) u4SubCmd, (INT_16) index, - value); - - switch (u4SubCmd) { - case PRIV_CMD_INT_P2P_SET: - switch (index) { - case 0: /* Listen CH */ - { - UINT_8 ucSuggestChnl = 0; - - prP2pConnSettings->ucListenChnl = value; - - /* 20110920 - frog: User configurations are placed in ConnSettings. */ - if (rlmFuncFindAvailableChannel - (prGlueInfo->prAdapter, value, &ucSuggestChnl, TRUE, TRUE)) { - prP2pSpecificBssInfo->ucListenChannel = value; - } else { - prP2pSpecificBssInfo->ucListenChannel = ucSuggestChnl; - } - - - break; - } - case 1: /* P2p mode */ - break; - case 4: /* Noa duration */ - prP2pSpecificBssInfo->rNoaParam.u4NoaDurationMs = value; - /* only to apply setting when setting NOA count */ - /* status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam); */ - break; - case 5: /* Noa interval */ - prP2pSpecificBssInfo->rNoaParam.u4NoaIntervalMs = value; - /* only to apply setting when setting NOA count */ - /* status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam); */ - break; - case 6: /* Noa count */ - prP2pSpecificBssInfo->rNoaParam.u4NoaCount = value; - status = - mtk_p2p_wext_set_noa_param(prDev, info, wrqu, - (char *)&prP2pSpecificBssInfo->rNoaParam); - break; - case 100: /* Oper CH */ - /* 20110920 - frog: User configurations are placed in ConnSettings. */ - prP2pConnSettings->ucOperatingChnl = value; - break; - case 101: /* Local config Method, for P2P SDK */ - /* prP2pConnSettings->u2LocalConfigMethod; */ - break; - case 102: /* Sigma P2p reset */ - kalMemZero(prP2pConnSettings->aucTargetDevAddr, MAC_ADDR_LEN); - /* prP2pConnSettings->eConnectionPolicy = ENUM_P2P_CONNECTION_POLICY_AUTO; */ - break; - case 103: /* WPS MODE */ - kalP2PSetWscMode(prGlueInfo, value); - break; - case 104: /* P2p send persence, duration */ - break; - case 105: /* P2p send persence, interval */ - break; - case 106: /* P2P set sleep */ - value = 1; - kalIoctl(prGlueInfo, - wlanoidSetP2pPowerSaveProfile, - &value, sizeof(value), FALSE, FALSE, TRUE, TRUE, &u4Leng); - break; - case 107: /* P2P set opps, CTWindowl */ - prP2pSpecificBssInfo->rOppPsParam.u4CTwindowMs = value; - status = - mtk_p2p_wext_set_oppps_param(prDev, info, wrqu, - (char *)&prP2pSpecificBssInfo-> - rOppPsParam); - break; - case 108: /* p2p_set_power_save */ - kalIoctl(prGlueInfo, - wlanoidSetP2pPowerSaveProfile, - &value, sizeof(value), FALSE, FALSE, TRUE, TRUE, &u4Leng); - - break; - - default: - break; - } - break; - default: - break; - } - - return status; + return 0; } /*----------------------------------------------------------------------------*/ @@ -4139,141 +3703,7 @@ mtk_p2p_wext_set_struct(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL; - - ASSERT(prDev); - ASSERT(wrqu); - - if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) { - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - u4SubCmd = (UINT_32) wrqu->data.flags; - - kalMemZero(&prGlueInfo->prP2PInfo->aucOidBuf[0], sizeof(prGlueInfo->prP2PInfo->aucOidBuf)); - - switch (u4SubCmd) { - case PRIV_CMD_OID: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME "extra buffer is valid\n"); - } else { - printk(KERN_INFO DRV_NAME "extra 0x%p\n", extra); - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEND_SD_RESPONSE: - status = - mtk_p2p_wext_send_service_discovery_response(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_SEND_SD_REQUEST: - status = - mtk_p2p_wext_send_service_discovery_request(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_TERMINATE_SD_PHASE: - status = - mtk_p2p_wext_terminate_service_discovery_phase(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_INVITATION: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_INVITATION_STRUCT)) { -/* status = mtk_p2p_wext_invitation_request(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); */ - } - break; - - case P2P_CMD_ID_INVITATION_ABORT: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_ABORT_INVITATION)) { -/* status = mtk_p2p_wext_invitation_abort(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); */ - } - break; - - case P2P_CMD_ID_START_FORMATION: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_START_FORMATION)) { - status = - mtk_p2p_wext_start_formation(prDev, info, wrqu, - (char *)(prP2PReq->aucBuffer)); - } - break; - default: - status = -EOPNOTSUPP; - } - - break; -#if CFG_SUPPORT_ANTI_PIRACY - case PRIV_SEC_CHECK_OID: - if (wrqu->data.length > 256) { - status = -EOPNOTSUPP; - break; - } - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), - wrqu->data.pointer, wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME "extra buffer is valid\n"); - } else { - printk(KERN_INFO DRV_NAME "extra 0x%p\n", extra); - } - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEC_CHECK: - status = - mtk_p2p_wext_set_sec_check_request(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - } - break; -#endif - case PRIV_CMD_P2P_VERSION: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME "extra buffer is valid\n"); - } else { - printk(KERN_INFO DRV_NAME "extra 0x%p\n", extra); - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_P2P_VERSION: - status = mtk_p2p_wext_set_p2p_version(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - break; - } - break; - default: - status = -EOPNOTSUPP; - break; - } - - return status; + return 0; } @@ -4296,227 +3726,7 @@ mtk_p2p_wext_get_struct(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL; - - ASSERT(prDev); - ASSERT(wrqu); - - if (!prDev || !wrqu) { - printk(KERN_INFO DRV_NAME "%s(): invalid param(0x%p, 0x%p)\n", - __func__, prDev, wrqu); - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - u4SubCmd = (UINT_32) wrqu->data.flags; - - kalMemZero(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - sizeof(prGlueInfo->prP2PInfo->aucOidBuf)); - - switch (u4SubCmd) { - case PRIV_CMD_OID: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_GET_SD_REQUEST: - status = - mtk_p2p_wext_get_service_discovery_request(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_GET_SD_RESPONSE: - status = - mtk_p2p_wext_get_service_discovery_response(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_INVITATION_INDICATE: - { - status = - mtk_p2p_wext_invitation_indicate(prDev, info, wrqu, - (char *)(prP2PReq->aucBuffer)); - prP2PReq->outBufferLength = wrqu->data.length; - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.length + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } else { - return 0; - } - break; - } - case P2P_CMD_ID_INVITATION_STATUS: - { - status = - mtk_p2p_wext_invitation_status(prDev, info, wrqu, - (char *)(prP2PReq->aucBuffer)); - prP2PReq->outBufferLength = wrqu->data.length; - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.length + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } else { - return 0; - } - break; - } - case P2P_CMD_ID_GET_CH_LIST: - { - UINT_16 i; - UINT_8 NumOfChannel = 50; - RF_CHANNEL_INFO_T aucChannelList[50]; - UINT_8 ucMaxChannelNum = 50; - PUINT_8 pucChnlList = (PUINT_8) prP2PReq->aucBuffer; - - kalGetChnlList(prGlueInfo, BAND_NULL, ucMaxChannelNum, - &NumOfChannel, aucChannelList); - if (NumOfChannel > 50) - NumOfChannel = 50; - prP2PReq->outBufferLength = NumOfChannel; - - for (i = 0; i < NumOfChannel; i++) { -#if 0 - /* 20120208 frog: modify to avoid clockwork warning. */ - prP2PReq->aucBuffer[i] = aucChannelList[i].ucChannelNum; -#else - *pucChnlList = aucChannelList[i].ucChannelNum; - pucChnlList++; -#endif - } - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - NumOfChannel + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, - aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } else { - return 0; - } - break; - } - - case P2P_CMD_ID_GET_OP_CH: - { - prP2PReq->inBufferLength = 4; - - status = wlanoidQueryP2pOpChannel(prGlueInfo->prAdapter, - prP2PReq->aucBuffer, - prP2PReq->inBufferLength, - &prP2PReq->outBufferLength); - - if (status == 0) { /* WLAN_STATUS_SUCCESS */ - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - prP2PReq->outBufferLength + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, - aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", - __func__); - return -EIO; - } - } else { - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, - aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", - __func__); - return -EIO; - } - } - break; - } - - default: - status = -EOPNOTSUPP; - } - - break; -#if CFG_SUPPORT_ANTI_PIRACY - case PRIV_SEC_CHECK_OID: - if (wrqu->data.length > 256) { - status = -EOPNOTSUPP; - break; - } - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), - wrqu->data.pointer, sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEC_CHECK: - status = - mtk_p2p_wext_get_sec_check_response(prDev, info, wrqu, - (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - } - break; -#endif - case PRIV_CMD_P2P_VERSION: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_P2P_VERSION: - status = mtk_p2p_wext_get_p2p_version(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - break; - } - - - /* Copy queried data to user. */ - if (status == 0) { /* WLAN_STATUS_SUCCESS */ - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - prP2PReq->outBufferLength + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - - else { - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - - break; - default: - return -EOPNOTSUPP; - } - - return status; + return 0; } diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_kal.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_kal.c index af8972a13fb..a809676abd9 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_kal.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_kal.c @@ -1551,9 +1551,9 @@ kalIndicateStatusAndComplete(IN P_GLUE_INFO_T prGlueInfo, ssid.aucSsid[(ssid.u4SsidLen >= PARAM_MAX_LEN_SSID) ? (PARAM_MAX_LEN_SSID - 1) : ssid.u4SsidLen] = '\0'; - DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [ssid:%s " MACSTR "]\n", + DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [" MACSTR "]\n", prGlueInfo->prDevHandler->name, - ssid.aucSsid, MAC2STR(arBssid))); + MAC2STR(arBssid))); } while (0); if (prGlueInfo->fgIsRegistered == TRUE) { diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_p2p.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_p2p.c index 844623b78e8..8dc2494764b 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_p2p.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6628/wlan/os/linux/gl_p2p.c @@ -3281,148 +3281,6 @@ mtk_p2p_wext_discovery_results(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - struct iw_event iwe; - char *current_ev = extra; - UINT_32 i; - P_GLUE_INFO_T prGlueInfo = NULL; - P_ADAPTER_T prAdapter = NULL; - P_P2P_INFO_T prP2PInfo = (P_P2P_INFO_T) NULL; - P_EVENT_P2P_DEV_DISCOVER_RESULT_T prTargetResult = (P_EVENT_P2P_DEV_DISCOVER_RESULT_T) NULL; - P_PARAM_VARIABLE_IE_T prDesiredIE = NULL; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - prP2PInfo = prAdapter->prP2pInfo; - - for (i = 0; i < prP2PInfo->u4DeviceNum; i++) { - prTargetResult = &prP2PInfo->arP2pDiscoverResult[i]; - - /* SIOCGIWAP */ - iwe.cmd = SIOCGIWAP; - iwe.u.ap_addr.sa_family = ARPHRD_ETHER; - memcpy(iwe.u.ap_addr.sa_data, prTargetResult->aucInterfaceAddr, 6); - - current_ev = iwe_stream_add_event(info, current_ev, - extra + IW_SCAN_MAX_DATA, &iwe, IW_EV_ADDR_LEN); - - - /* SIOCGIWESSID */ - iwe.cmd = SIOCGIWESSID; - iwe.u.data.flags = 1; - iwe.u.data.length = prTargetResult->u2NameLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, prTargetResult->aucName); - - /* IWEVGENIE for WPA IE */ - if (prTargetResult->u2IELength <= 600 - && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf, prTargetResult->u2IELength, - 0xDD, (PUINT_8 *) &prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16) prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } -#if CFG_SUPPORT_WPS - - /* IWEVGENIE for WPS IE */ - if ((prTargetResult->u2IELength <= 600) - && wextSrchDesiredWPSIE(prTargetResult->pucIeBuf, prTargetResult->u2IELength, - 0xDD, (PUINT_8 *) &prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16) prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } -#endif - - /* IWEVGENIE for RSN IE */ - if ((prTargetResult->u2IELength <= 600) - && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf, prTargetResult->u2IELength, - 0x30, (PUINT_8 *) &prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16) prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } - - /* IOC_P2P_GO_WSC_IE */ -#if 1 - /* device capability */ - if (1) { - UINT_8 data[40]; - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 8 + sizeof("p2p_cap="); - - snprintf(data, iwe.u.data.length, "p2p_cap=%02x%02x%02x%02x%c", - prTargetResult->ucDeviceCapabilityBitmap, - prTargetResult->ucGroupCapabilityBitmap, - (UINT_8) prTargetResult->u2ConfigMethod, - (UINT_8) (prTargetResult->u2ConfigMethod >> 8), '\0'); - current_ev = - iwe_stream_add_point(info, current_ev, extra + IW_SCAN_MAX_DATA, &iwe, - (char *)data); - - /* printk("%s\n", data); */ - kalMemZero(data, 40); - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 12 + sizeof("p2p_dev_type="); - - snprintf(data, iwe.u.data.length, "p2p_dev_type=%02x%02x%02x%02x%02x%02x%c", - (UINT_8) prTargetResult->rPriDevType.u2CategoryID, - (UINT_8) prTargetResult->rPriDevType.u2SubCategoryID, - (UINT_8) prTargetResult->arSecDevType[0].u2CategoryID, - (UINT_8) prTargetResult->arSecDevType[0].u2SubCategoryID, - (UINT_8) prTargetResult->arSecDevType[1].u2CategoryID, - (UINT_8) prTargetResult->arSecDevType[1].u2SubCategoryID, '\0'); - current_ev = - iwe_stream_add_point(info, current_ev, extra + IW_SCAN_MAX_DATA, &iwe, - (char *)data); - /* printk("%s\n", data); */ - - kalMemZero(data, 40); - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 17 + sizeof("p2p_grp_bssid="); - - snprintf(data, iwe.u.data.length, "p2p_grp_bssid=" MACSTR "%c", - MAC2STR(prTargetResult->aucBSSID), '\0'); - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)data); - /* printk("%s\n", data); */ - - } -#endif - } - - /* Length of data */ - wrqu->data.length = (current_ev - extra); - wrqu->data.flags = 0; return 0; } /* end of mtk_p2p_wext_discovery_results() */ @@ -3447,41 +3305,6 @@ mtk_p2p_wext_wsc_ie(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_HOSTAPD_PARAM prHostapdParam = (P_IW_P2P_HOSTAPD_PARAM) extra; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - if (prHostapdParam->len > 0) { - if (prHostapdParam->len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[0], prHostapdParam->data, - prHostapdParam->len)) { - return -EFAULT; - } - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[2], prHostapdParam->data, - prHostapdParam->len)) { - return -EFAULT; - } - } else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[0] = prHostapdParam->len; - prGlueInfo->prP2PInfo->u2WSCIELen[2] = prHostapdParam->len; - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX); - - /* @TODO: send message to P2P-FSM */ return 0; } /* end of mtk_p2p_wext_wsc_ie() */ @@ -3506,62 +3329,6 @@ mtk_p2p_wext_connect_disconnect(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - struct iw_point *prData = (struct iw_point *)&wrqu->data; -/* P_IW_P2P_CONNECT_DEVICE prConnectDevice = (P_IW_P2P_CONNECT_DEVICE)extra; */ -/* P_MSG_HDR_T prMsgHdr; */ -/* P_MSG_P2P_CONNECTION_REQUEST_T prMsgP2PConnReq; */ -/* P_MSG_P2P_CONNECTION_ABORT_T prMsgP2PConnAbt; */ -/* UINT_8 aucBCAddr[] = BC_MAC_ADDR; */ - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - if (prData->flags == P2P_CONNECT) { -#if 0 - /* indicate P2P-FSM with MID_MNY_P2P_CONNECTION_REQ */ - prMsgP2PConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T) cnmMemAlloc(prAdapter, - RAM_TYPE_MSG, - sizeof - (MSG_P2P_CONNECTION_REQUEST_T)); - - if (!prMsgP2PConnReq) { - ASSERT(0); /* Can't trigger P2P FSM */ - return -ENOMEM; - } - - - mboxSendMsg(prAdapter, - MBOX_ID_0, (P_MSG_HDR_T) prMsgP2PConnReq, MSG_SEND_METHOD_BUF); -#endif - } else if (prData->flags == P2P_DISCONNECT) { -#if 0 - /* indicate P2P-FSM with MID_MNY_P2P_CONNECTION_ABORT */ - prMsgP2PConnAbt = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, - RAM_TYPE_MSG, - sizeof(MSG_P2P_CONNECTION_ABORT_T)); - - if (!prMsgP2PConnAbt) { - ASSERT(0); /* Can't trigger P2P FSM */ - return -ENOMEM; - } - - COPY_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, prConnectDevice->sta_addr); - - prMsgP2PConnAbt->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT; - - mboxSendMsg(prAdapter, - MBOX_ID_0, (P_MSG_HDR_T) prMsgP2PConnAbt, MSG_SEND_METHOD_BUF); -#endif - } else { - return -EINVAL; - } return 0; } /* end of mtk_p2p_wext_connect_disconnect() */ @@ -3586,66 +3353,6 @@ mtk_p2p_wext_password_ready(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_PASSWORD_READY prPasswordReady = (P_IW_P2P_PASSWORD_READY) extra; - P_P2P_CONNECTION_SETTINGS_T prConnSettings; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - prConnSettings = prAdapter->rWifiVar.prP2PConnSettings; - - /* retrieve IE for Probe Request */ - if (prPasswordReady->probe_req_len > 0) { - if (prPasswordReady->probe_req_len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[1], prPasswordReady->probe_req_ie, - prPasswordReady->probe_req_len)) { - return -EFAULT; - } - } else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[1] = prPasswordReady->probe_req_len; - - /* retrieve IE for Probe Response */ - if (prPasswordReady->probe_rsp_len > 0) { - if (prPasswordReady->probe_rsp_len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user - (prGlueInfo->prP2PInfo->aucWSCIE[2], prPasswordReady->probe_rsp_ie, - prPasswordReady->probe_rsp_len)) { - return -EFAULT; - } - } else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[2] = prPasswordReady->probe_rsp_len; - - switch (prPasswordReady->active_config_method) { - case 1: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_PUSH_BUTTON; - break; - case 2: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_KEYPAD; - break; - case 3: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_DISPLAY; - break; - default: - break; - } - - prConnSettings->fgIsPasswordIDRdy = TRUE; return 0; } /* end of mtk_p2p_wext_password_ready() */ @@ -3669,30 +3376,6 @@ mtk_p2p_wext_request_dev_info(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_DEVICE_REQ prDeviceReq = (P_IW_P2P_DEVICE_REQ) extra; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - /* specify data length */ - wrqu->data.length = sizeof(IW_P2P_DEVICE_REQ); - - /* copy to upper-layer supplied buffer */ - kalMemCopy(prDeviceReq->name, prGlueInfo->prP2PInfo->aucConnReqDevName, - prGlueInfo->prP2PInfo->u4ConnReqNameLength); - prDeviceReq->name_len = prGlueInfo->prP2PInfo->u4ConnReqNameLength; - prDeviceReq->name[prDeviceReq->name_len] = '\0'; - COPY_MAC_ADDR(prDeviceReq->device_addr, prGlueInfo->prP2PInfo->rConnReqPeerAddr); - prDeviceReq->device_type = prGlueInfo->prP2PInfo->ucConnReqDevType; - prDeviceReq->config_method = prGlueInfo->prP2PInfo->i4ConnReqConfigMethod; - prDeviceReq->active_config_method = prGlueInfo->prP2PInfo->i4ConnReqActiveConfigMethod; return 0; } /* end of mtk_p2p_wext_request_dev_info() */ @@ -3980,126 +3663,7 @@ mtk_p2p_wext_set_int(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - UINT_32 index; - INT_32 value; - PUINT_32 pu4IntBuf; - P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL; - P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL; - P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL; - UINT_32 u4Leng; - - ASSERT(prDev); - ASSERT(wrqu); - - /* printk("mtk_p2p_wext_set_int\n"); */ - pu4IntBuf = (PUINT_32) extra; - - if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) { - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prP2pSpecificBssInfo = prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo; - prP2pConnSettings = prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings; - prP2pFsmInfo = prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo; - - u4SubCmd = (UINT_32) wrqu->mode; - index = pu4IntBuf[1]; - value = pu4IntBuf[2]; - - printk("set parameter, u4SubCmd=%d idx=%d value=%lu\n", (INT_16) u4SubCmd, (INT_16) index, - value); - - switch (u4SubCmd) { - case PRIV_CMD_INT_P2P_SET: - switch (index) { - case 0: /* Listen CH */ - { - UINT_8 ucSuggestChnl = 0; - - prP2pConnSettings->ucListenChnl = value; - - /* 20110920 - frog: User configurations are placed in ConnSettings. */ - if (rlmFuncFindAvailableChannel - (prGlueInfo->prAdapter, value, &ucSuggestChnl, TRUE, TRUE)) { - prP2pSpecificBssInfo->ucListenChannel = value; - } else { - prP2pSpecificBssInfo->ucListenChannel = ucSuggestChnl; - } - - - break; - } - case 1: /* P2p mode */ - break; - case 4: /* Noa duration */ - prP2pSpecificBssInfo->rNoaParam.u4NoaDurationMs = value; - /* only to apply setting when setting NOA count */ - /* status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam); */ - break; - case 5: /* Noa interval */ - prP2pSpecificBssInfo->rNoaParam.u4NoaIntervalMs = value; - /* only to apply setting when setting NOA count */ - /* status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam); */ - break; - case 6: /* Noa count */ - prP2pSpecificBssInfo->rNoaParam.u4NoaCount = value; - status = - mtk_p2p_wext_set_noa_param(prDev, info, wrqu, - (char *)&prP2pSpecificBssInfo->rNoaParam); - break; - case 100: /* Oper CH */ - /* 20110920 - frog: User configurations are placed in ConnSettings. */ - prP2pConnSettings->ucOperatingChnl = value; - break; - case 101: /* Local config Method, for P2P SDK */ - /* prP2pConnSettings->u2LocalConfigMethod; */ - break; - case 102: /* Sigma P2p reset */ - kalMemZero(prP2pConnSettings->aucTargetDevAddr, MAC_ADDR_LEN); - /* prP2pConnSettings->eConnectionPolicy = ENUM_P2P_CONNECTION_POLICY_AUTO; */ - break; - case 103: /* WPS MODE */ - kalP2PSetWscMode(prGlueInfo, value); - break; - case 104: /* P2p send persence, duration */ - break; - case 105: /* P2p send persence, interval */ - break; - case 106: /* P2P set sleep */ - value = 1; - kalIoctl(prGlueInfo, - wlanoidSetP2pPowerSaveProfile, - &value, sizeof(value), FALSE, FALSE, TRUE, TRUE, &u4Leng); - break; - case 107: /* P2P set opps, CTWindowl */ - prP2pSpecificBssInfo->rOppPsParam.u4CTwindowMs = value; - status = - mtk_p2p_wext_set_oppps_param(prDev, info, wrqu, - (char *)&prP2pSpecificBssInfo-> - rOppPsParam); - break; - case 108: /* p2p_set_power_save */ - kalIoctl(prGlueInfo, - wlanoidSetP2pPowerSaveProfile, - &value, sizeof(value), FALSE, FALSE, TRUE, TRUE, &u4Leng); - - break; - - default: - break; - } - break; - default: - break; - } - - return status; + return 0; } /*----------------------------------------------------------------------------*/ @@ -4121,141 +3685,7 @@ mtk_p2p_wext_set_struct(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL; - - ASSERT(prDev); - ASSERT(wrqu); - - if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) { - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - u4SubCmd = (UINT_32) wrqu->data.flags; - - kalMemZero(&prGlueInfo->prP2PInfo->aucOidBuf[0], sizeof(prGlueInfo->prP2PInfo->aucOidBuf)); - - switch (u4SubCmd) { - case PRIV_CMD_OID: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME "extra buffer is valid\n"); - } else { - printk(KERN_INFO DRV_NAME "extra 0x%p\n", extra); - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEND_SD_RESPONSE: - status = - mtk_p2p_wext_send_service_discovery_response(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_SEND_SD_REQUEST: - status = - mtk_p2p_wext_send_service_discovery_request(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_TERMINATE_SD_PHASE: - status = - mtk_p2p_wext_terminate_service_discovery_phase(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_INVITATION: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_INVITATION_STRUCT)) { -/* status = mtk_p2p_wext_invitation_request(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); */ - } - break; - - case P2P_CMD_ID_INVITATION_ABORT: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_ABORT_INVITATION)) { -/* status = mtk_p2p_wext_invitation_abort(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); */ - } - break; - - case P2P_CMD_ID_START_FORMATION: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_START_FORMATION)) { - status = - mtk_p2p_wext_start_formation(prDev, info, wrqu, - (char *)(prP2PReq->aucBuffer)); - } - break; - default: - status = -EOPNOTSUPP; - } - - break; -#if CFG_SUPPORT_ANTI_PIRACY - case PRIV_SEC_CHECK_OID: - if (wrqu->data.length > 256) { - status = -EOPNOTSUPP; - break; - } - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), - wrqu->data.pointer, wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME "extra buffer is valid\n"); - } else { - printk(KERN_INFO DRV_NAME "extra 0x%p\n", extra); - } - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEC_CHECK: - status = - mtk_p2p_wext_set_sec_check_request(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - } - break; -#endif - case PRIV_CMD_P2P_VERSION: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME "extra buffer is valid\n"); - } else { - printk(KERN_INFO DRV_NAME "extra 0x%p\n", extra); - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_P2P_VERSION: - status = mtk_p2p_wext_set_p2p_version(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - break; - } - break; - default: - status = -EOPNOTSUPP; - break; - } - - return status; + return 0; } @@ -4278,227 +3708,7 @@ mtk_p2p_wext_get_struct(IN struct net_device *prDev, IN struct iw_request_info *info, IN OUT union iwreq_data *wrqu, IN OUT char *extra) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL; - - ASSERT(prDev); - ASSERT(wrqu); - - if (!prDev || !wrqu) { - printk(KERN_INFO DRV_NAME "%s(): invalid param(0x%p, 0x%p)\n", - __func__, prDev, wrqu); - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - u4SubCmd = (UINT_32) wrqu->data.flags; - - kalMemZero(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - sizeof(prGlueInfo->prP2PInfo->aucOidBuf)); - - switch (u4SubCmd) { - case PRIV_CMD_OID: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_GET_SD_REQUEST: - status = - mtk_p2p_wext_get_service_discovery_request(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_GET_SD_RESPONSE: - status = - mtk_p2p_wext_get_service_discovery_response(prDev, info, wrqu, - (char *)prP2PReq); - break; - - case P2P_CMD_ID_INVITATION_INDICATE: - { - status = - mtk_p2p_wext_invitation_indicate(prDev, info, wrqu, - (char *)(prP2PReq->aucBuffer)); - prP2PReq->outBufferLength = wrqu->data.length; - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.length + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } else { - return 0; - } - break; - } - case P2P_CMD_ID_INVITATION_STATUS: - { - status = - mtk_p2p_wext_invitation_status(prDev, info, wrqu, - (char *)(prP2PReq->aucBuffer)); - prP2PReq->outBufferLength = wrqu->data.length; - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.length + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } else { - return 0; - } - break; - } - case P2P_CMD_ID_GET_CH_LIST: - { - UINT_16 i; - UINT_8 NumOfChannel = 50; - RF_CHANNEL_INFO_T aucChannelList[50]; - UINT_8 ucMaxChannelNum = 50; - PUINT_8 pucChnlList = (PUINT_8) prP2PReq->aucBuffer; - - kalGetChnlList(prGlueInfo, BAND_NULL, ucMaxChannelNum, - &NumOfChannel, aucChannelList); - if (NumOfChannel > 50) - NumOfChannel = 50; - prP2PReq->outBufferLength = NumOfChannel; - - for (i = 0; i < NumOfChannel; i++) { -#if 0 - /* 20120208 frog: modify to avoid clockwork warning. */ - prP2PReq->aucBuffer[i] = aucChannelList[i].ucChannelNum; -#else - *pucChnlList = aucChannelList[i].ucChannelNum; - pucChnlList++; -#endif - } - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - NumOfChannel + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, - aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } else { - return 0; - } - break; - } - - case P2P_CMD_ID_GET_OP_CH: - { - prP2PReq->inBufferLength = 4; - - status = wlanoidQueryP2pOpChannel(prGlueInfo->prAdapter, - prP2PReq->aucBuffer, - prP2PReq->inBufferLength, - &prP2PReq->outBufferLength); - - if (status == 0) { /* WLAN_STATUS_SUCCESS */ - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - prP2PReq->outBufferLength + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, - aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", - __func__); - return -EIO; - } - } else { - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, - aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", - __func__); - return -EIO; - } - } - break; - } - - default: - status = -EOPNOTSUPP; - } - - break; -#if CFG_SUPPORT_ANTI_PIRACY - case PRIV_SEC_CHECK_OID: - if (wrqu->data.length > 256) { - status = -EOPNOTSUPP; - break; - } - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), - wrqu->data.pointer, sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEC_CHECK: - status = - mtk_p2p_wext_get_sec_check_response(prDev, info, wrqu, - (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - } - break; -#endif - case PRIV_CMD_P2P_VERSION: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_P2P_VERSION: - status = mtk_p2p_wext_get_p2p_version(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - break; - } - - - /* Copy queried data to user. */ - if (status == 0) { /* WLAN_STATUS_SUCCESS */ - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - prP2PReq->outBufferLength + - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - - else { - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - - break; - default: - return -EOPNOTSUPP; - } - - return status; + return 0; } diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/nic/que_mgt.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/nic/que_mgt.c index 54d6428279b..47cb2837674 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/nic/que_mgt.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/nic/que_mgt.c @@ -3197,23 +3197,8 @@ P_SW_RFB_T qmHandleRxPackets(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfbList } } -#if CFG_SUPPORT_WAPI /* Todo:: Move the data class error check here */ - if (prCurrSwRfb->u2PacketLen > ETHER_HEADER_LEN) { - PUINT_8 pc = (PUINT_8) prCurrSwRfb->pvHeader; - UINT_16 u2Etype = 0; - u2Etype = (pc[ETHER_TYPE_LEN_OFFSET] << 8) | (pc[ETHER_TYPE_LEN_OFFSET + 1]); - /* for wapi integrity test. WPI_1x packet should be always in non-encrypted mode. - if we received any WPI(0x88b4) packet that is encrypted, drop here. */ - if (u2Etype == ETH_WPI_1X && - HAL_RX_STATUS_GET_SEC_MODE(prRxStatus) != 0) { - DBGLOG(QM, INFO, ("drop wpi packet with sec mode\n")); - prCurrSwRfb->eDst = RX_PKT_DESTINATION_NULL; - QUEUE_INSERT_TAIL(prReturnedQue, (P_QUE_ENTRY_T) prCurrSwRfb); - continue; - } - } -#endif + if (prCurrSwRfb->fgReorderBuffer && !fgIsBMC && fgIsHTran) { /* If this packet should dropped or indicated to the host immediately, * it should be enqueued into the rReturnedQue with specific flags. If diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_kal.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_kal.c index 10699599896..50e374bc264 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_kal.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_kal.c @@ -1767,9 +1767,9 @@ kalIndicateStatusAndComplete(IN P_GLUE_INFO_T prGlueInfo, ssid.aucSsid[(ssid.u4SsidLen >= PARAM_MAX_LEN_SSID) ? (PARAM_MAX_LEN_SSID - 1) : ssid.u4SsidLen] = '\0'; - DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [ssid:%s " MACSTR "]\n", + DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [" MACSTR "]\n", prGlueInfo->prDevHandler->name, - ssid.aucSsid, MAC2STR(arBssid))); + MAC2STR(arBssid))); } while (0); if (prGlueInfo->fgIsRegistered == TRUE) { diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext.c index 7ab78ddf6a7..6bd7ddaa0bc 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext.c @@ -1783,7 +1783,7 @@ wext_set_mlme(IN struct net_device *prNetDev, /*----------------------------------------------------------------------------*/ static int wext_set_scan(IN struct net_device *prNetDev, - IN struct iw_request_info *prIwrInfo, IN struct iw_scan_req *prIwScanReq, IN char *pcExtra) + IN struct iw_request_info *prIwrInfo, IN union iwreq_data *prData, IN char *pcExtra) { P_GLUE_INFO_T prGlueInfo = NULL; WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; @@ -1798,8 +1798,10 @@ wext_set_scan(IN struct net_device *prNetDev, #if WIRELESS_EXT > 17 /* retrieve SSID */ - if (prIwScanReq) - essid_len = prIwScanReq->essid_len; + if (prData) { + essid_len = + ((struct iw_scan_req *)(((struct iw_point *)prData)->pointer))->essid_len; + } #endif init_completion(&prGlueInfo->rScanComp); @@ -3697,7 +3699,6 @@ int wext_support_ioctl(IN struct net_device *prDev, IN struct ifreq *prIfReq, IN int ret = 0; char *prExtraBuf = NULL; UINT_32 u4ExtraSize = 0; - struct iw_scan_req * prIwScanReq = NULL; /* prDev is verified in the caller function wlanDoIOCTL() */ @@ -3840,22 +3841,23 @@ int wext_support_ioctl(IN struct net_device *prDev, IN struct ifreq *prIfReq, IN } #if WIRELESS_EXT > 17 else if (iwr->u.data.length == sizeof(struct iw_scan_req)) { - prIwScanReq = kalMemAlloc(iwr->u.data.length, VIR_MEM_TYPE); - if (!prIwScanReq) { + prExtraBuf = kalMemAlloc(MAX_SSID_LEN, VIR_MEM_TYPE); + if (!prExtraBuf) { ret = -ENOMEM; break; } - - if (copy_from_user(prIwScanReq, iwr->u.data.pointer, iwr->u.data.length)) { + if (copy_from_user + (prExtraBuf, ((struct iw_scan_req *)(iwr->u.data.pointer))->essid, + ((struct iw_scan_req *)(iwr->u.data.pointer))->essid_len)) { ret = -EFAULT; } else { - if (prIwScanReq->essid_len > IW_ESSID_MAX_SIZE) - prIwScanReq->essid_len = IW_ESSID_MAX_SIZE; - ret = wext_set_scan(prDev, NULL, prIwScanReq, &(prIwScanReq->essid[0])); + ret = + wext_set_scan(prDev, NULL, (union iwreq_data *)&(iwr->u.data), + prExtraBuf); } - kalMemFree(prIwScanReq, VIR_MEM_TYPE, iwr->u.data.length); - prIwScanReq = NULL; + kalMemFree(prExtraBuf, VIR_MEM_TYPE, MAX_SSID_LEN); + prExtraBuf = NULL; } #endif else { diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext_priv.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext_priv.c index dd645311f62..e6a333dd21a 100644 --- a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext_priv.c +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/linux/gl_wext_priv.c @@ -1698,7 +1698,6 @@ priv_get_struct(IN struct net_device *prNetDev, UINT_32 u4BufLen = 0; PUINT_32 pu4IntBuf = NULL; int status = 0; - UINT_32 u4CopyDataMax = 0; kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf)); @@ -1764,14 +1763,11 @@ priv_get_struct(IN struct net_device *prNetDev, pu4IntBuf = (PUINT_32) prIwReqData->data.pointer; prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0]; - u4CopyDataMax = sizeof(aucOidBuf) - OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent); - if ((prIwReqData->data.length > u4CopyDataMax) - || copy_from_user(&prNdisReq->ndisOidContent[0], - prIwReqData->data.pointer, - prIwReqData->data.length)) { - DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n")); - return -EFAULT; - } + if (copy_from_user(&prNdisReq->ndisOidContent[0], + prIwReqData->data.pointer, prIwReqData->data.length)) { + DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n")); + return -EFAULT; + } prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL; prNdisReq->inNdisOidlength = 8; diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/windows/ce/hif/sdio/include/mt6516.h b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/windows/ce/hif/sdio/include/mt6516.h new file mode 100644 index 00000000000..e2a78a320d5 --- /dev/null +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/windows/ce/hif/sdio/include/mt6516.h @@ -0,0 +1,89 @@ +/* +** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/os/windows/ce/hif/sdio/include/mt6516.h#1 $ +*/ + +/*! \file "cloibri.h" + \brief Define Colibri-platform related definition + +*/ + + + +/* +** $Log: mt6516.h $ +** +** 09 17 2012 cm.chang +** [BORA00002149] [MT6630 Wi-Fi] Initial software development +** Duplicate source from MT6620 v2.3 driver branch +** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base) + * + * 07 08 2010 cp.wu + * + * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository. + * + * 06 06 2010 kevin.huang + * [WPD00003832][MT6620 5931] Create driver base + * [MT6620 5931] Create driver base +** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 20:31:31 GMT mtk01426 +** Init for develop +*/ + +#ifndef _MT6516_H +#define _MT6516_H + +/******************************************************************************* +* C O M P I L E R F L A G S +******************************************************************************** +*/ + +/******************************************************************************* +* E X T E R N A L R E F E R E N C E S +******************************************************************************** +*/ +#include "gl_os.h" + +/******************************************************************************* +* C O N S T A N T S +******************************************************************************** +*/ +#define SDIO_DEVICE_NAME (L"SHC1:") + +/******************************************************************************* +* D A T A T Y P E S +******************************************************************************** +*/ + +/******************************************************************************* +* P U B L I C D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* P R I V A T E D A T A +******************************************************************************** +*/ + +/******************************************************************************* +* M A C R O S +******************************************************************************** +*/ +#define CFG_HAVE_PLATFORM_INIT + +/******************************************************************************* +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************** +*/ + +BOOLEAN platformBusInit(IN P_GLUE_INFO_T prGlueInfo); + +VOID platformBusDeinit(IN P_GLUE_INFO_T prGlueInfo); + +VOID platformSetPowerState(IN P_GLUE_INFO_T prGlueInfo, IN UINT_32 ePowerMode); + + +/******************************************************************************* +* F U N C T I O N S +******************************************************************************** +*/ + +#endif /* _MT6516_H */ diff --git a/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/windows/ce/hif/sdio/mt6516.c b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/windows/ce/hif/sdio/mt6516.c new file mode 100644 index 00000000000..171ae6b50c3 --- /dev/null +++ b/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630/wlan/os/windows/ce/hif/sdio/mt6516.c @@ -0,0 +1,134 @@ +/* +** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/os/windows/ce/hif/sdio/mt6516.c#1 $ +*/ + +/*! \file "mt6516.c" + \brief Define MT6516-platform related functions + +*/ + + + +/* +** $Log: mt6516.c $ +** +** 09 17 2012 cm.chang +** [BORA00002149] [MT6630 Wi-Fi] Initial software development +** Duplicate source from MT6620 v2.3 driver branch +** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base) + * + * 03 14 2011 terry.wu + * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message + * Revert windows debug message. + * + * 07 08 2010 cp.wu + * + * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository. + * + * 06 06 2010 kevin.huang + * [WPD00003832][MT6620 5931] Create driver base + * [MT6620 5931] Create driver base +** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 20:29:24 GMT mtk01426 +** Init for develop +** +*/ + +/****************************************************************************** +* C O M P I L E R F L A G S +******************************************************************************* +*/ + +/****************************************************************************** +* E X T E R N A L R E F E R E N C E S +******************************************************************************* +*/ +#include "gl_os.h" +LINT_EXT_HEADER_BEGIN +#include + LINT_EXT_HEADER_END +#include "hif.h" +#include "mt6516.h" +/****************************************************************************** +* C O N S T A N T S +******************************************************************************* +*/ +/****************************************************************************** +* D A T A T Y P E S +******************************************************************************* +*/ +/****************************************************************************** +* P U B L I C D A T A +******************************************************************************* +*/ + HANDLE hSdio = INVALID_HANDLE_VALUE; + +/****************************************************************************** +* P R I V A T E D A T A +******************************************************************************* +*/ + +/****************************************************************************** +* M A C R O S +******************************************************************************* +*/ + +/****************************************************************************** +* F U N C T I O N D E C L A R A T I O N S +******************************************************************************* +*/ + +/****************************************************************************** +* F U N C T I O N S +******************************************************************************* +*/ + +BOOLEAN platformBusInit(IN P_GLUE_INFO_T prGlueInfo) +{ + ASSERT(prGlueInfo); + + if (INVALID_HANDLE_VALUE == hSdio) { + hSdio = CreateFile(SDIO_DEVICE_NAME, (GENERIC_READ | GENERIC_WRITE), 0, /* devices must be opened w/exclusive-access */ + NULL, /* no security attrs */ + OPEN_EXISTING, /* devices must use OPEN_EXISTING */ + FILE_ATTRIBUTE_NORMAL, /* normal */ + NULL /* hTemplate must be NULL for devices */ + ); + } + + if (INVALID_HANDLE_VALUE == hSdio) { + ERRORLOG(("Fail to open SDIO device:%s\r\n", SDIO_DEVICE_NAME)); + return FALSE; + } + + return TRUE; +} + +VOID platformBusDeinit(IN P_GLUE_INFO_T prGlueInfo) +{ + ASSERT(prGlueInfo); + + if (INVALID_HANDLE_VALUE != hSdio) { + CloseHandle(hSdio); + hSdio = INVALID_HANDLE_VALUE; + } +} + +VOID platformSetPowerState(IN P_GLUE_INFO_T prGlueInfo, IN UINT_32 ePowerMode) +{ + CEDEVICE_POWER_STATE cPowerState; + + ASSERT(prGlueInfo); + + if (ParamDeviceStateD0 == ePowerMode) { + cPowerState = D0; + } else if (ParamDeviceStateD3 == ePowerMode) { + cPowerState = D4; + } else { + ERRORLOG(("platformSetPowerState fail, unsupported ePowerMode:%x\n", ePowerMode)); + return; + } + + DeviceIoControl(hSdio, + IOCTL_POWER_SET, NULL, 0, &cPowerState, sizeof(cPowerState), NULL, NULL); + return; +} diff --git a/drivers/misc/mediatek/connectivity/common_detect/Makefile b/drivers/misc/mediatek/connectivity/common_detect/Makefile index 8bb410013b0..8c7189e73f1 100644 --- a/drivers/misc/mediatek/connectivity/common_detect/Makefile +++ b/drivers/misc/mediatek/connectivity/common_detect/Makefile @@ -3,8 +3,12 @@ # kernel build system and can use its language. ifneq ($(KERNELRELEASE),) include $(srctree)/drivers/misc/mediatek/Makefile.custom - subdir-ccflags-y += -I$(srctree)/arch/arm/mach-$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT)/dct/dct - + ifeq ($(CONFIG_AUSTIN_PROJECT),y) + subdir-ccflags-y += -I$(srctree)/arch/arm/mach-$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT)/dct/dct_austin + else + subdir-ccflags-y += -I$(srctree)/arch/arm/mach-$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT)/dct/dct + endif + COMBO_CHIP_SUPPORT := false ifneq ($(filter "MT6620E3",$(CONFIG_MTK_COMBO_CHIP)),) COMBO_CHIP_SUPPORT := true diff --git a/drivers/misc/mediatek/connectivity/common_detect/mtk_wcn_stub_alps.c b/drivers/misc/mediatek/connectivity/common_detect/mtk_wcn_stub_alps.c index cd6142b1116..c2d20e1ab36 100644 --- a/drivers/misc/mediatek/connectivity/common_detect/mtk_wcn_stub_alps.c +++ b/drivers/misc/mediatek/connectivity/common_detect/mtk_wcn_stub_alps.c @@ -307,7 +307,7 @@ signed long mtk_wcn_cmb_stub_query_ctrl() } else { - CMB_STUB_LOG_WARN("[cmb_stub] thermal_ctrl_cb null\n"); + CMB_STUB_LOG_DBG("[cmb_stub] thermal_ctrl_cb null\n"); } return temp; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/core/btm_core.c b/drivers/misc/mediatek/connectivity/conn_soc/common/core/btm_core.c index bfe30573b3e..d3ef38b088d 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/core/btm_core.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/core/btm_core.c @@ -1431,4 +1431,8 @@ INT32 stp_btm_reset_btm_wq(MTKSTP_BTM_T *stp_btm) return 0; } +INT32 wmt_btm_trigger_reset(VOID) +{ + return stp_btm_notify_wmt_rst_wq(stp_btm); +} diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/btm_core.h b/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/btm_core.h index fba532b866d..8fa36b3bf4c 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/btm_core.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/btm_core.h @@ -127,7 +127,7 @@ INT32 stp_notify_btm_poll_cpupcr_ctrl(UINT32 en); INT32 stp_btm_notify_wmt_trace_wq(MTKSTP_BTM_T *stp_btm); INT32 stp_notify_btm_do_fw_assert_via_emi(MTKSTP_BTM_T *stp_btm); INT32 stp_notify_btm_handle_wmt_lte_coex(MTKSTP_BTM_T *stp_btm); - +INT32 wmt_btm_trigger_reset(VOID); MTKSTP_BTM_T *stp_btm_init(void); /******************************************************************************* diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/wmt_lib.h b/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/wmt_lib.h index 50b778d3be0..90b43356ff9 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/wmt_lib.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/core/include/wmt_lib.h @@ -79,7 +79,6 @@ when mtk_wcn_wmt_func_on is called by wifi through rfkill) #define MAX_GPIO_CTRL_TIME (2000) /* [FixMe][GeorgeKuo] a temp value */ #define MAX_PATCH_NUM 10 - /******************************************************************************* * E X T E R N A L R E F E R E N C E S ******************************************************************************** @@ -311,6 +310,7 @@ extern PUINT8 wmt_lib_get_cpupcr_xml_format(PUINT32 len); extern INT32 wmt_lib_register_thermal_ctrl_cb(thermal_query_ctrl_cb thermal_ctrl); extern UINT32 wmt_lib_set_host_assert_info(UINT32 type,UINT32 reason,UINT32 en); extern INT8 wmt_lib_co_clock_get(VOID); +extern INT32 wmt_lib_trigger_reset(VOID); #if CFG_WMT_LTE_COEX_HANDLING extern MTK_WCN_BOOL wmt_lib_handle_idc_msg(ipc_ilm_t *idc_infor); #endif diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/core/wmt_lib.c b/drivers/misc/mediatek/connectivity/conn_soc/common/core/wmt_lib.c index f17c35627e8..4b029ad72f2 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/core/wmt_lib.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/core/wmt_lib.c @@ -2127,3 +2127,8 @@ UINT32 wmt_lib_consys_osc_en_ctrl(UINT32 en) } #endif +INT32 wmt_lib_trigger_reset(VOID) +{ + return wmt_btm_trigger_reset(); +} + diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/include/wmt_exp.h b/drivers/misc/mediatek/connectivity/conn_soc/common/include/wmt_exp.h index 47ebbf1b78b..aa9472a7c20 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/include/wmt_exp.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/include/wmt_exp.h @@ -297,6 +297,7 @@ mtk_wcn_wmt_func_ctrl_for_plat (UINT32 on, ENUM_WMTDRV_TYPE_T type); extern INT32 mtk_wcn_wmt_system_state_reset(VOID); +extern MTK_WCN_BOOL mtk_wcn_wmt_do_reset(ENUM_WMTDRV_TYPE_T type); #ifdef MTK_WCN_WMT_STP_EXP_SYMBOL_ABSTRACT extern VOID mtk_wcn_wmt_exp_init(VOID); diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/stp_dbg.c b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/stp_dbg.c index 6d34fbe5e4c..9c6956c013c 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/stp_dbg.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/stp_dbg.c @@ -60,10 +60,14 @@ MTKSTP_DBG_T *g_stp_dbg = NULL; #define STP_DBG_FAMILY_NAME "STP_DBG" #define MAX_BIND_PROCESS (4) #ifdef WMT_PLAT_ALPS +#ifdef CONFIG_MTK_AEE_AED #define STP_DBG_AEE_EXP_API (1) #else #define STP_DBG_AEE_EXP_API (0) #endif +#else +#define STP_DBG_AEE_EXP_API (0) +#endif enum { __STP_DBG_ATTR_INVALID, STP_DBG_ATTR_MSG, diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_dev.c b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_dev.c index 9f34bee93e5..3b540c728c7 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_dev.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_dev.c @@ -2514,22 +2514,24 @@ WMT_unlocked_ioctl ( } break; - + case WMT_IOCTL_SET_PATCH_NUM: { pAtchNum = arg; if (pAtchNum == 0 || pAtchNum > MAX_PATCH_NUM) { - WMT_ERR_FUNC("patch num(%d) == 0 or > %d!\n", pAtchNum, MAX_PATCH_NUM); + WMT_ERR_FUNC("Invalid Num=(%d)\n", pAtchNum); iRet = -1; break; } - pPatchInfo = kzalloc(sizeof(WMT_PATCH_INFO) * pAtchNum, GFP_ATOMIC); + pPatchInfo = kzalloc(sizeof(WMT_PATCH_INFO)*pAtchNum,GFP_ATOMIC); if (!pPatchInfo) { WMT_ERR_FUNC("allocate memory fail!\n"); iRet = -EFAULT; + pAtchNum = 0; break; } - WMT_INFO_FUNC(" get patch num from launcher = %d\n",pAtchNum); + + WMT_INFO_FUNC("Get Num=(%d)\n", pAtchNum); wmt_lib_set_patch_num(pAtchNum); } break; @@ -2539,12 +2541,12 @@ WMT_unlocked_ioctl ( P_WMT_PATCH_INFO pTemp = NULL; UINT32 dWloadSeq; static UINT32 counter = 0; - + if (!pPatchInfo) { WMT_ERR_FUNC("NULL patch info pointer\n"); break; } - + if (copy_from_user(&wMtPatchInfo, (void *)arg, sizeof(WMT_PATCH_INFO))) { WMT_ERR_FUNC("copy_from_user failed at %d\n", __LINE__); iRet = -EFAULT; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_exp.c b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_exp.c index b2cd298d105..2801234c1c5 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_exp.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pri/wmt_exp.c @@ -552,6 +552,15 @@ INT32 mtk_wcn_wmt_wlan_unreg() return 0; } +MTK_WCN_BOOL mtk_wcn_wmt_do_reset(ENUM_WMTDRV_TYPE_T type) +{ + INT32 iRet = -1; + WMT_INFO_FUNC("reset source:%d\n", type); + iRet = wmt_lib_trigger_reset(); + return 0 == iRet ? MTK_WCN_BOOL_TRUE : MTK_WCN_BOOL_FALSE; +} +EXPORT_SYMBOL(mtk_wcn_wmt_do_reset); + #ifdef MTK_WCN_WMT_STP_EXP_SYMBOL_ABSTRACT VOID mtk_wcn_wmt_exp_init() { diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/stp_chrdev_bt.c b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/stp_chrdev_bt.c old mode 100644 new mode 100755 index 8599d014fd4..77ca2610d37 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/stp_chrdev_bt.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/stp_chrdev_bt.c @@ -60,7 +60,6 @@ static unsigned int gDbgLevel = BT_LOG_INFO; #define BT_TRC_FUNC(f) if(gDbgLevel >= BT_LOG_DBG){printk(PFX "<%s> <%d>\n", __FUNCTION__, __LINE__);} #define VERSION "1.0" -#define BT_NVRAM_CUSTOM_NAME "/data/BT_Addr" static int BT_devs = 1; /* device count */ static int BT_major = BT_DEV_MAJOR; /* dynamic allocation */ @@ -75,65 +74,6 @@ static DECLARE_WAIT_QUEUE_HEAD(BT_wq); static int flag = 0; static volatile int retflag = 0; -unsigned char g_bt_bd_addr[10]={0x01,0x1a,0xfc,0x06,0x00,0x55,0x66,0x77,0x88,0x00}; -unsigned char g_nvram_btdata[8]; - -static int nvram_read(char *filename, char *buf, ssize_t len, int offset) -{ - struct file *fd; - //ssize_t ret; - int retLen = -1; - - mm_segment_t old_fs = get_fs(); - set_fs(KERNEL_DS); - - fd = filp_open(filename, O_WRONLY|O_CREAT, 0644); - - if(IS_ERR(fd)) { - BT_ERR_FUNC("failed to open!!\n"); - return -1; - } - do{ - if ((fd->f_op == NULL) || (fd->f_op->read == NULL)) - { - BT_ERR_FUNC("file can not be read!!\n"); - break; - } - - if (fd->f_pos != offset) { - if (fd->f_op->llseek) { - if(fd->f_op->llseek(fd, offset, 0) != offset) { - BT_ERR_FUNC("[nvram_read] : failed to seek!!\n"); - break; - } - } else { - fd->f_pos = offset; - } - } - - retLen = fd->f_op->read(fd, - buf, - len, - &fd->f_pos); - - }while(false); - - filp_close(fd, NULL); - - set_fs(old_fs); - - return retLen; -} - - -int platform_load_nvram_data( char * filename, char * buf, int len) -{ - //int ret; - BT_INFO_FUNC("platform_load_nvram_data ++ BDADDR\n"); - - return nvram_read( filename, buf, len, 0); -} - static void bt_cdev_rst_cb( ENUM_WMTDRV_TYPE_T src, ENUM_WMTDRV_TYPE_T dst, @@ -413,15 +353,8 @@ static int BT_open(struct inode *inode, struct file *file) mtk_wcn_stp_set_bluez(0); BT_INFO_FUNC("Now it's in MTK Bluetooth Mode\n"); - BT_INFO_FUNC("WMT turn on BT OK!\n"); + BT_INFO_FUNC("xgx-WMT turn on BT OK!\n"); BT_INFO_FUNC("STP is ready!\n"); - platform_load_nvram_data(BT_NVRAM_CUSTOM_NAME, - (char *)&g_nvram_btdata, sizeof(g_nvram_btdata)); - - BT_INFO_FUNC("Read NVRAM : BD address %02x%02x%02x%02x%02x%02x Cap 0x%02x Codec 0x%02x\n", - g_nvram_btdata[0], g_nvram_btdata[1], g_nvram_btdata[2], - g_nvram_btdata[3], g_nvram_btdata[4], g_nvram_btdata[5], - g_nvram_btdata[6], g_nvram_btdata[7]); mtk_wcn_stp_register_event_cb(BT_TASK_INDX, BT_event_cb); BT_INFO_FUNC("mtk_wcn_stp_register_event_cb finish\n"); diff --git a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/wmt_chrdev_wifi.c b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/wmt_chrdev_wifi.c index db7b653df52..6ff5659bb46 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/wmt_chrdev_wifi.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/common/linux/pub/wmt_chrdev_wifi.c @@ -62,7 +62,7 @@ UINT32 gDbgLevel = WIFI_LOG_DBG; #define WLAN_IFACE_NAME "wlan0" -#if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) +#if CFG_TC1_FEATURE #define LEGACY_IFACE_NAME "legacy0" #endif @@ -72,10 +72,14 @@ enum { WLAN_MODE_STA_P2P, WLAN_MODE_MAX }; + +#define POWER_RECOVERING 0xFDEAD +static int recovery_state = 0; static INT32 wlan_mode = WLAN_MODE_HALT; static INT32 powered = 0; static INT8 *ifname = WLAN_IFACE_NAME; -#if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) +static wait_queue_head_t recover_waitq; +#if CFG_TC1_FEATURE volatile INT32 wlan_if_changed = 0; EXPORT_SYMBOL(wlan_if_changed); #endif @@ -166,7 +170,7 @@ module_param(WIFI_major, uint, 0); static struct cdev WIFI_cdev; volatile INT32 retflag = 0; static struct semaphore wr_mtx; - +static struct semaphore recovery_mtx; /******************************************************************* * WHOLE CHIP RESET PROCEDURE: @@ -187,7 +191,7 @@ INT32 wifi_reset_start(VOID) struct net_device *netdev = NULL; PARAM_CUSTOM_P2P_SET_STRUC_T p2pmode; - down(&wr_mtx); + down(&recovery_mtx); if (powered == 1) { netdev = dev_get_by_name(&init_net, ifname); @@ -200,9 +204,9 @@ INT32 wifi_reset_start(VOID) if (pf_set_p2p_mode) { if (pf_set_p2p_mode(netdev, p2pmode) != 0){ - WIFI_ERR_FUNC("Turn off p2p/ap mode fail"); + WIFI_ERR_FUNC("Turn off p2p/ap mode fail\n"); } else { - WIFI_INFO_FUNC("Turn off p2p/ap mode"); + WIFI_INFO_FUNC("Turn off p2p/ap mode\n"); } } dev_put(netdev); @@ -210,7 +214,7 @@ INT32 wifi_reset_start(VOID) } } else { - /* WIFI is off before whole chip reset, do nothing */ + WIFI_INFO_FUNC("WIFI is off before whole chip reset, do nothing\n"); } return 0; @@ -224,80 +228,96 @@ EXPORT_SYMBOL(wifi_reset_start); /*-----------------------------------------------------------------*/ INT32 wifi_reset_end(ENUM_RESET_STATUS_T status) { - struct net_device *netdev = NULL; - PARAM_CUSTOM_P2P_SET_STRUC_T p2pmode; - INT32 wait_cnt = 0; - INT32 ret = -1; + struct net_device *netdev = NULL; + PARAM_CUSTOM_P2P_SET_STRUC_T p2pmode; + INT32 wait_cnt = 0; + INT32 ret = -1; - if (status == RESET_FAIL) { - /* whole chip reset fail, donot recover WIFI */ - ret = 0; - up(&wr_mtx); - } - else if (status == RESET_SUCCESS) { - WIFI_WARN_FUNC("WIFI state recovering...\n"); + if (status == RESET_FAIL) { + /* whole chip reset fail, donot recover WIFI */ + if (recovery_state == POWER_RECOVERING) { + /* WIFI is doing recovery wakeup userspace thread */ + WIFI_INFO_FUNC("Chip reset failed, wakeup userspace thread\n"); + recovery_state = 0; + wake_up_interruptible(&recover_waitq); + } - if (powered == 1) { - /* WIFI is on before whole chip reset, reopen it now */ - if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { - WIFI_ERR_FUNC("WMT turn on WIFI fail!\n"); - goto done; - } - else { - WIFI_INFO_FUNC("WMT turn on WIFI success!\n"); - } + ret = 0; + up(&recovery_mtx); + } else if (status == RESET_SUCCESS) { + WIFI_WARN_FUNC("WIFI state recovering...\n"); - if (pf_set_p2p_mode == NULL) { - WIFI_ERR_FUNC("Set p2p mode handler is NULL\n"); - goto done; - } + if (powered == 1) { + /* WIFI is on before whole chip reset, reopen it now */ + if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { + WIFI_ERR_FUNC("WMT turn on WIFI fail!\n"); + goto done; + } else { + WIFI_INFO_FUNC("WMT turn on WIFI success!\n"); + } - netdev = dev_get_by_name(&init_net, ifname); - while (netdev == NULL && wait_cnt < 10) { - WIFI_ERR_FUNC("Fail to get %s net device, sleep 300ms\n", ifname); - msleep(300); - wait_cnt ++; - netdev = dev_get_by_name(&init_net, ifname); - } - if (wait_cnt >= 10) { - WIFI_ERR_FUNC("Get %s net device timeout\n", ifname); - goto done; - } + if (pf_set_p2p_mode == NULL) { + WIFI_ERR_FUNC("Set p2p mode handler is NULL\n"); + goto done; + } - if (wlan_mode == WLAN_MODE_STA_P2P){ - p2pmode.u4Enable = 1; - p2pmode.u4Mode = 0; - if (pf_set_p2p_mode(netdev, p2pmode) != 0){ - WIFI_ERR_FUNC("Set wlan mode fail\n"); - } - else{ - WIFI_WARN_FUNC("Set wlan mode %d\n", WLAN_MODE_STA_P2P); - ret = 0; - } - } else if (wlan_mode == WLAN_MODE_AP){ - p2pmode.u4Enable = 1; - p2pmode.u4Mode = 1; - if (pf_set_p2p_mode(netdev, p2pmode) != 0){ - WIFI_ERR_FUNC("Set wlan mode fail\n"); - } - else{ - WIFI_WARN_FUNC("Set wlan mode %d\n", WLAN_MODE_AP); - ret = 0; - } - } + netdev = dev_get_by_name(&init_net, ifname); + while (netdev == NULL && wait_cnt < 10) { + WIFI_ERR_FUNC("Fail to get %s net device, sleep 300ms\n", ifname); + msleep(300); + wait_cnt ++; + netdev = dev_get_by_name(&init_net, ifname); + } + if (wait_cnt >= 10) { + WIFI_ERR_FUNC("Get %s net device timeout\n", ifname); + goto done; + } + + if (wlan_mode == WLAN_MODE_STA_P2P){ + p2pmode.u4Enable = 1; + p2pmode.u4Mode = 0; + if (pf_set_p2p_mode(netdev, p2pmode) != 0){ + WIFI_ERR_FUNC("Set wlan mode fail\n"); + } else{ + WIFI_WARN_FUNC("Set wlan mode %d\n", WLAN_MODE_STA_P2P); + ret = 0; + } + } else if (wlan_mode == WLAN_MODE_AP){ + p2pmode.u4Enable = 1; + p2pmode.u4Mode = 1; + if (pf_set_p2p_mode(netdev, p2pmode) != 0){ + WIFI_ERR_FUNC("Set wlan mode fail\n"); + } else{ + WIFI_WARN_FUNC("Set wlan mode %d\n", WLAN_MODE_AP); + ret = 0; + } + } + if (recovery_state == POWER_RECOVERING) { + /* WIFI is doing recovery wakeup userspace thread */ + WIFI_INFO_FUNC("Powered Wifi Rcovery end, wakeup userspace thread\n"); + recovery_state = 0; + wake_up_interruptible(&recover_waitq); + ret = 0; + } done: - if (netdev != NULL){ - dev_put(netdev); - } - } - else { - /* WIFI is off before whole chip reset, do nothing */ - ret = 0; - } - up(&wr_mtx); - } + if (netdev != NULL){ + dev_put(netdev); + } + } else if (recovery_state == POWER_RECOVERING){ + /* WIFI is doing recovery wakeup userspace thread */ + WIFI_INFO_FUNC("Wifi Rcovery end, wakeup userspace thread\n"); + recovery_state = 0; + wake_up_interruptible(&recover_waitq); + ret = 0; + } else { + /* WIFI is off before whole chip reset, do nothing */ + WIFI_INFO_FUNC("WIFI is off before whole chip reset, do nothing \n"); - return ret; + ret = 0; + } + up(&recovery_mtx); + } + return ret; } EXPORT_SYMBOL(wifi_reset_end); @@ -332,6 +352,7 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff struct net_device *netdev = NULL; PARAM_CUSTOM_P2P_SET_STRUC_T p2pmode; INT32 wait_cnt = 0; + long timeout = 0; down(&wr_mtx); if (count <= 0) { @@ -380,7 +401,7 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff powered = 0; retval = count; wlan_mode = WLAN_MODE_HALT; - #if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) + #if CFG_TC1_FEATURE ifname = WLAN_IFACE_NAME; wlan_if_changed = 0; #endif @@ -399,7 +420,9 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff } if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) { - WIFI_ERR_FUNC("WMT turn on WIFI fail!\n"); + WIFI_ERR_FUNC("WMT turn on WIFI fail!, should do chip reset\n"); + retval = 0xDEAD; + } else { powered = 1; @@ -407,8 +430,29 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff WIFI_INFO_FUNC("WMT turn on WIFI success!\n"); wlan_mode = WLAN_MODE_HALT; } - } - else if (local[0] == 'D') { + } else if (local[0] == '2') { + /* + * power 2 means should do chip recovery as previous + * power 1 failed + */ + WIFI_INFO_FUNC("WMT WIFI before chip reset\n"); + recovery_state = POWER_RECOVERING; + mtk_wcn_wmt_do_reset(WMTDRV_TYPE_WIFI); + + timeout = wait_event_interruptible_timeout(recover_waitq, + (recovery_state != POWER_RECOVERING), + (10 * HZ)); + if (timeout == 0) { + WIFI_ERR_FUNC("WMT WIFI recover timeout\n"); + recovery_state = 0; + } + if (timeout < 0) { + recovery_state = 0; + WIFI_INFO_FUNC("WMT WIFI recover wait error\n"); + } + WIFI_INFO_FUNC("WMT WIFI after chip reset\n"); + retval = count; + } else if (local[0] == 'D') { INT32 k = 0; /* * 0: no debug @@ -538,7 +582,7 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff } if (local[0] == 'S' || local[0] == 'P'){ - #if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) + #if CFG_TC1_FEATURE /* Restore NIC name to wlan0 */ rtnl_lock(); if (strcmp(ifname, WLAN_IFACE_NAME) != 0){ @@ -566,7 +610,7 @@ ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff retval = count; } } else if (local[0] == 'A'){ - #if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) + #if CFG_TC1_FEATURE /* Change NIC name to legacy0, since wlan0 is used for AP */ rtnl_lock(); if (strcmp(ifname, LEGACY_IFACE_NAME) != 0){ @@ -651,6 +695,9 @@ static int WIFI_init(void) #endif sema_init(&wr_mtx, 1); + sema_init(&recovery_mtx, 1); + + init_waitqueue_head(&recover_waitq); WIFI_INFO_FUNC("%s driver(major %d) installed.\n", WIFI_DRIVER_NAME, WIFI_major); retflag = 0; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/Makefile b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/Makefile index 0779f94f504..85c60c2f642 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/Makefile +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/Makefile @@ -119,8 +119,8 @@ OS_OBJS := $(OS_DIR)gl_init.o \ $(OS_DIR)gl_wext_priv.o \ $(OS_DIR)gl_rst.o \ $(OS_DIR)gl_cfg80211.o \ - $(OS_DIR)platform.o - + $(OS_DIR)platform.o \ + $(OS_DIR)gl_proc.o MGMT_OBJS := $(MGMT_DIR)ais_fsm.o \ $(MGMT_DIR)aaa_fsm.o \ $(MGMT_DIR)assoc.o \ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_bow.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_bow.c index 3532f86df80..33dd99ca66b 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_bow.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_bow.c @@ -1863,7 +1863,7 @@ bowStopping( //prBowBssInfo->fgIsBeaconActivated = FALSE; nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_BOW_INDEX); bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED); - nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX, STA_REC_INDEX_NOT_FOUND); /*temp solution for FW hal_pwr_mgt.c#3037 ASSERT*/ nicDeactivateNetwork(prAdapter, NETWORK_TYPE_BOW_INDEX); SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_BOW_INDEX); @@ -2034,7 +2034,7 @@ bowStarting( //4 <3.1> use command packets to inform firmware rlmBssInitForAPandIbss(prAdapter, prBssInfo); - nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX, STA_REC_INDEX_NOT_FOUND); //4 <3.2> Update AdHoc PM parameter nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_BOW_INDEX); @@ -2708,7 +2708,7 @@ bowFsmRunEventJoinComplete( #endif //4 <1.3> Update BSS_INFO_T - nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX, STA_REC_INDEX_NOT_FOUND); #if CFG_BOW_TEST DBGLOG(BOW, EVENT, ("Finish bowUpdateBssInfoForJOIN.\n")); #endif @@ -2944,7 +2944,7 @@ bowRunEventAAAComplete ( /*Update BssInfo to connected*/ bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED); - nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX, STA_REC_INDEX_NOT_FOUND); /*Update StaRec to State3*/ cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3); @@ -3177,7 +3177,7 @@ bowValidateAssocReq ( /*Undpate BssInfo to FW*/ bowChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED); - nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX, STA_REC_INDEX_NOT_FOUND); /*reply successful*/ *pu2StatusCode = STATUS_CODE_SUCCESSFUL; @@ -3411,7 +3411,7 @@ bowRunEventChGrant ( } else { /*update bssinfo*/ - nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_BOW_INDEX, STA_REC_INDEX_NOT_FOUND); bowReleaseCh(prAdapter); } diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_lib.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_lib.c index 639b3c37cac..9db76cc18ec 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_lib.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_lib.c @@ -1241,20 +1241,18 @@ wlanAdapterStart ( PARAM_PTA_IPC_T rBwcsPta; UINT_32 u4SetInfoLen; #endif + enum Adapter_Start_Fail_Reason { + ALLOC_ADAPTER_MEM_FAIL, + DRIVER_OWN_FAIL, + INIT_ADAPTER_FAIL, + RAM_CODE_DOWNLOAD_FAIL, + WAIT_FIRMWARE_READY_FAIL, + } eFailReason; - enum Adapter_Start_Fail_Reason { - ALLOC_ADAPTER_MEM_FAIL, - DRIVER_OWN_FAIL, - INIT_ADAPTER_FAIL, - RAM_CODE_DOWNLOAD_FAIL, - WAIT_FIRMWARE_READY_FAIL, - FAIL_REASON_MAX - } eFailReason; ASSERT(prAdapter); DEBUGFUNC("wlanAdapterStart"); - eFailReason = FAIL_REASON_MAX; //4 <0> Reset variables in ADAPTER_T prAdapter->fgIsFwOwn = TRUE; prAdapter->fgIsEnterD3ReqIssued = FALSE; @@ -1288,7 +1286,7 @@ wlanAdapterStart ( if(prAdapter->fgIsFwOwn == TRUE) { DBGLOG(INIT, ERROR, ("nicpmSetDriverOwn() failed!\n")); u4Status = WLAN_STATUS_FAILURE; - eFailReason = DRIVER_OWN_FAIL; + eFailReason = DRIVER_OWN_FAIL; break; } @@ -1296,7 +1294,7 @@ wlanAdapterStart ( if ( (u4Status = nicInitializeAdapter(prAdapter)) != WLAN_STATUS_SUCCESS ) { DBGLOG(INIT, ERROR, ("nicInitializeAdapter failed!\n")); u4Status = WLAN_STATUS_FAILURE; - eFailReason = INIT_ADAPTER_FAIL; + eFailReason = INIT_ADAPTER_FAIL; break; } #endif @@ -1371,14 +1369,16 @@ wlanAdapterStart ( u4ImgSecSize, (PUINT_8)pvFwImageMapFile + prFwHead->arSection[i].u4Offset + j) != WLAN_STATUS_SUCCESS) { DBGLOG(INIT, ERROR, ("Firmware scatter download failed %d!\n", (int)i)); - u4Status = WLAN_STATUS_FAILURE; + /* Firmware download dead means 0xFDEAD */ + u4Status = 0xFDEAD; break; } } #endif /* escape from loop if any pending error occurs */ - if(u4Status == WLAN_STATUS_FAILURE) { + if(u4Status == WLAN_STATUS_FAILURE || u4Status == 0xFDEAD) { + eFailReason = RAM_CODE_DOWNLOAD_FAIL; break; } } @@ -1412,7 +1412,7 @@ wlanAdapterStart ( #endif if(u4Status != WLAN_STATUS_SUCCESS) { - eFailReason = RAM_CODE_DOWNLOAD_FAIL; + eFailReason = RAM_CODE_DOWNLOAD_FAIL; break; } @@ -1428,7 +1428,7 @@ wlanAdapterStart ( else { DBGLOG(INIT, ERROR, ("No Firmware found!\n")); u4Status = WLAN_STATUS_FAILURE; - eFailReason = RAM_CODE_DOWNLOAD_FAIL; + eFailReason = RAM_CODE_DOWNLOAD_FAIL; break; } @@ -1616,7 +1616,7 @@ wlanAdapterStart ( else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE || fgIsBusAccessFailed == TRUE) { u4Status = WLAN_STATUS_FAILURE; - eFailReason = WAIT_FIRMWARE_READY_FAIL; + eFailReason = WAIT_FIRMWARE_READY_FAIL; break; } else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) { @@ -1626,7 +1626,7 @@ wlanAdapterStart ( DBGLOG(INIT, ERROR, ("Waiting for Ready bit: Timeout, ID=%u\n", (u4MailBox0 & 0x0000FFFF))); u4Status = WLAN_STATUS_FAILURE; - eFailReason = WAIT_FIRMWARE_READY_FAIL; + eFailReason = WAIT_FIRMWARE_READY_FAIL; break; } else { @@ -1697,7 +1697,6 @@ wlanAdapterStart ( RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE); if(u4Status != WLAN_STATUS_SUCCESS) { - eFailReason = WAIT_FIRMWARE_READY_FAIL; break; } @@ -1878,27 +1877,22 @@ wlanAdapterStart ( } else { - // release allocated memory - switch (eFailReason) - { - case WAIT_FIRMWARE_READY_FAIL: - case RAM_CODE_DOWNLOAD_FAIL: - DBGLOG(INIT, ERROR, ("Wait firmware ready fail or ram code download fail, FailReason: %d\n", - eFailReason)); - KAL_WAKE_LOCK_DESTROY(prAdapter, &prAdapter->rTxThreadWakeLock); - nicRxUninitialize(prAdapter); - nicTxRelease(prAdapter); - /* System Service Uninitialization */ - nicUninitSystemService(prAdapter); - case INIT_ADAPTER_FAIL: - case DRIVER_OWN_FAIL: - nicReleaseAdapterMemory(prAdapter); - case ALLOC_ADAPTER_MEM_FAIL: - break; - default: - break; - } - } + /* error handle: release allocated memory */ + switch (eFailReason) { + case WAIT_FIRMWARE_READY_FAIL: + case RAM_CODE_DOWNLOAD_FAIL: + KAL_WAKE_LOCK_DESTROY(prAdapter, &prAdapter->rTxThreadWakeLock); + nicRxUninitialize(prAdapter); + nicTxRelease(prAdapter); + /* System Service Uninitialization */ + nicUninitSystemService(prAdapter); + case INIT_ADAPTER_FAIL: + case DRIVER_OWN_FAIL: + nicReleaseAdapterMemory(prAdapter); + case ALLOC_ADAPTER_MEM_FAIL: + break; + } + } return u4Status; } /* wlanAdapterStart */ @@ -3990,13 +3984,13 @@ wlanUpdateNetworkAddress ( // eFUSE has a valid address, don't do anything if(prAdapter->fgIsEmbbededMacAddrValid == TRUE) { #if CFG_SHOW_MACADDR_SOURCE - DBGLOG(INIT, INFO, ("Using embedded MAC address")); + DBGLOG(INIT, TRACE, ("Using embedded MAC address")); #endif return WLAN_STATUS_SUCCESS; } else { #if CFG_SHOW_MACADDR_SOURCE - DBGLOG(INIT, INFO, ("Using dynamically generated MAC address")); + DBGLOG(INIT, TRACE, ("Using dynamically generated MAC address")); #endif // dynamic generate u4SysTime = kalGetTimeTick(); @@ -4569,7 +4563,7 @@ wlanQueryPermanentAddress( // header checking .. prHifRxHdr = (P_HIF_RX_HEADER_T)aucBuffer; - if ((prHifRxHdr->u2PacketType & HIF_RX_HDR_PACKET_TYPE_MASK) != HIF_RX_PKT_TYPE_EVENT) { + if(prHifRxHdr->u2PacketType != HIF_RX_PKT_TYPE_EVENT) { return WLAN_STATUS_FAILURE; } @@ -4659,7 +4653,7 @@ wlanQueryNicCapability( // header checking .. prHifRxHdr = (P_HIF_RX_HEADER_T)aucBuffer; - if ((prHifRxHdr->u2PacketType & HIF_RX_HDR_PACKET_TYPE_MASK) != HIF_RX_PKT_TYPE_EVENT) { + if(prHifRxHdr->u2PacketType != HIF_RX_PKT_TYPE_EVENT) { return WLAN_STATUS_FAILURE; } @@ -4998,7 +4992,7 @@ wlanQueryPdMcr( // header checking .. prHifRxHdr = (P_HIF_RX_HEADER_T)aucBuffer; - if ((prHifRxHdr->u2PacketType & HIF_RX_HDR_PACKET_TYPE_MASK) != HIF_RX_PKT_TYPE_EVENT) { + if(prHifRxHdr->u2PacketType != HIF_RX_PKT_TYPE_EVENT) { return WLAN_STATUS_FAILURE; } @@ -5139,6 +5133,30 @@ static VOID wlanChangeNvram6620to6628(PUINT_8 pucEFUSE){ } #endif +ENUM_BAND_EDGE_CERT_T getBandEdgeCert(P_ADAPTER_T prAdapter) +{ + P_DOMAIN_INFO_ENTRY prDomainInfo; + P_DOMAIN_SUBBAND_INFO prSubband; + UINT32 i; + + prDomainInfo = rlmDomainGetDomainInfo(prAdapter); + ASSERT(prDomainInfo); + + for (i = 0; i < MAX_SUBBAND_NUM; i++) { + prSubband = &prDomainInfo->rSubBand[i]; + + if (prSubband->ucBand == BAND_2G4) { + if (prSubband->ucFirstChannelNum == 1) { + if (prSubband->ucNumChannels == 13) + return BAND_EDGE_CERT_KCC; + else + return BAND_EDGE_CERT_FCC; + } + } + } + return BAND_EDGE_CERT_FCC; +} + /*----------------------------------------------------------------------------*/ /*! * @brief This function is called to load manufacture data from NVRAM @@ -5274,11 +5292,12 @@ wlanLoadManufactureData ( rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40 = prRegInfo->cBandEdgeMaxPwrOFDM40; - printk("NVRAM 2G Bandedge CCK(%d) HT20(%d)HT40(%d)\n", - rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrCCK, - rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM20, - rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40 - ); + rCmdEdgeTxPwrLimit.cBandEdgeCert = getBandEdgeCert(prAdapter); + + DBGLOG(INIT, TRACE, ("NVRAM 2G Bandedge CCK(%d) HT20(%d)HT40(%d)\n", + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrCCK, + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM20, + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40)); wlanSendSetQueryCmd(prAdapter, CMD_ID_SET_EDGE_TXPWR_LIMIT, @@ -5951,10 +5970,10 @@ wlanCheckSystemConfiguration ( if(fgIsConfExist == TRUE && (CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part1CfgPeerVersion || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part2CfgPeerVersion - || prAdapter->rVerInfo.u2Part1CfgOwnVersion < CFG_DRV_PEER_VERSION - || prAdapter->rVerInfo.u2Part2CfgOwnVersion < CFG_DRV_PEER_VERSION /* NVRAM */ + || prAdapter->rVerInfo.u2Part1CfgOwnVersion <= CFG_DRV_PEER_VERSION + || prAdapter->rVerInfo.u2Part2CfgOwnVersion <= CFG_DRV_PEER_VERSION /* NVRAM */ || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2FwPeerVersion - || prAdapter->rVerInfo.u2FwOwnVersion < CFG_DRV_PEER_VERSION + || prAdapter->rVerInfo.u2FwOwnVersion <= CFG_DRV_PEER_VERSION || (prAdapter->fgIsEmbbededMacAddrValid == FALSE && (IS_BMCAST_MAC_ADDR(prRegInfo->aucMacAddr) || EQUAL_MAC_ADDR(aucZeroMacAddr, prRegInfo->aucMacAddr))) @@ -6025,10 +6044,10 @@ wlanCheckSystemConfiguration ( if(fgIsConfExist == TRUE) { if((CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part1CfgPeerVersion || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part2CfgPeerVersion - || prAdapter->rVerInfo.u2Part1CfgOwnVersion < CFG_DRV_PEER_VERSION - || prAdapter->rVerInfo.u2Part2CfgOwnVersion < CFG_DRV_PEER_VERSION /* NVRAM */ + || prAdapter->rVerInfo.u2Part1CfgOwnVersion <= CFG_DRV_PEER_VERSION + || prAdapter->rVerInfo.u2Part2CfgOwnVersion <= CFG_DRV_PEER_VERSION /* NVRAM */ || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2FwPeerVersion - || prAdapter->rVerInfo.u2FwOwnVersion < CFG_DRV_PEER_VERSION)) { + || prAdapter->rVerInfo.u2FwOwnVersion <= CFG_DRV_PEER_VERSION)) { u4ErrCode |= NVRAM_ERROR_VERSION_MISMATCH; } diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_oid.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_oid.c index 5f803301d48..7480351da8a 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_oid.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_oid.c @@ -1646,8 +1646,7 @@ wlanoidSetBssidListScanExt ( if (prAdapter->rAcpiState == ACPI_STATE_D3) { DBGLOG(REQ, INFO, ("Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n", prAdapter->rAcpiState, prAdapter->fgIsRadioOff)); - rStatus = WLAN_STATUS_ADAPTER_NOT_READY; - goto exit; + return WLAN_STATUS_ADAPTER_NOT_READY; } ASSERT(pu4SetInfoLen); @@ -1655,15 +1654,13 @@ wlanoidSetBssidListScanExt ( if(u4SetBufferLen != sizeof(PARAM_SCAN_REQUEST_EXT_T)) { DBGLOG(REQ, INFO, ("u4SetBufferLen != sizeof(PARAM_SCAN_REQUEST_EXT_T)\n")); - rStatus = WLAN_STATUS_INVALID_LENGTH; - goto exit; + return WLAN_STATUS_INVALID_LENGTH; } if (prAdapter->fgIsRadioOff) { DBGLOG(REQ, INFO, ("Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n", prAdapter->rAcpiState, prAdapter->fgIsRadioOff)); - rStatus = WLAN_STATUS_SUCCESS; - goto exit; + return WLAN_STATUS_SUCCESS; } DBGLOG(INIT, TRACE, ("ScanEx\n")); @@ -1724,15 +1721,12 @@ wlanoidSetBssidListScanExt ( } else { /* reject the scan request */ - rStatus = WLAN_STATUS_FAILURE; - goto exit; + rStatus = WLAN_STATUS_FAILURE; } } else { - DBGLOG(REQ, INFO, ("ScanEx fail %d!\n", prAdapter->fgEnOnlineScan)); /* reject the scan request */ rStatus = WLAN_STATUS_FAILURE; - goto exit; } } else @@ -1745,18 +1739,112 @@ wlanoidSetBssidListScanExt ( aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength); } else { - DBGLOG(REQ, INFO, ("ScanEx fail %d!\n", prAdapter->fgEnOnlineScan)); /* reject the scan request */ rStatus = WLAN_STATUS_FAILURE; - goto exit; + DBGLOG(REQ, INFO, ("ScanEx fail %d!\n", prAdapter->fgEnOnlineScan)); } } -exit: - return rStatus; } /* wlanoidSetBssidListScanWithIE */ +/*----------------------------------------------------------------------------*/ +/*! +* \brief This routine is called to request the driver to perform +* scanning with attaching information elements(IEs) specified from user space +* and multiple SSID +* +* \param[in] prAdapter Pointer to the Adapter structure. +* \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set. +* \param[in] u4SetBufferLen The length of the set buffer. +* \param[out] pu4SetInfoLen If the call is successful, returns the number of +* bytes read from the set buffer. If the call failed +* due to invalid length of the set buffer, returns +* the amount of storage needed. +* +* \retval WLAN_STATUS_SUCCESS +* \retval WLAN_STATUS_ADAPTER_NOT_READY +* \retval WLAN_STATUS_FAILURE +*/ +/*----------------------------------------------------------------------------*/ +WLAN_STATUS +wlanoidSetBssidListScanAdv( + IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen +) +{ + struct PARAM_SCAN_REQUEST_ADV_T *prScanRequest; + PARAM_SSID_T rSsid[CFG_SCAN_SSID_MAX_NUM]; + PUINT_8 pucIe; + UINT_8 ucSsidNum; + UINT_32 i, u4IeLength; + + DEBUGFUNC("wlanoidSetBssidListScanAdv()"); + + if (prAdapter->rAcpiState == ACPI_STATE_D3) { + DBGLOG(OID, WARN, ("Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n", + prAdapter->rAcpiState, prAdapter->fgIsRadioOff)); + return WLAN_STATUS_ADAPTER_NOT_READY; + } + + ASSERT(pu4SetInfoLen); + *pu4SetInfoLen = 0; + + if (u4SetBufferLen != sizeof(struct PARAM_SCAN_REQUEST_ADV_T)) + return WLAN_STATUS_INVALID_LENGTH; + else if (pvSetBuffer == NULL) + return WLAN_STATUS_INVALID_DATA; + + if (prAdapter->fgIsRadioOff) { + DBGLOG(OID, WARN, ("Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n", + prAdapter->rAcpiState, prAdapter->fgIsRadioOff)); + return WLAN_STATUS_SUCCESS; + } + + prScanRequest = (struct PARAM_SCAN_REQUEST_ADV_T *)pvSetBuffer; + + ucSsidNum = (UINT_8)(prScanRequest->u4SsidNum); + for (i = 0; i < prScanRequest->u4SsidNum; i++) { + COPY_SSID(rSsid[i].aucSsid, + rSsid[i].u4SsidLen, + prScanRequest->rSsid[i].aucSsid, + prScanRequest->rSsid[i].u4SsidLen); + } + + pucIe = prScanRequest->pucIE; + u4IeLength = prScanRequest->u4IELength; + +#if CFG_SUPPORT_RDD_TEST_MODE + if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) { + if ((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)) { + if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != + PARAM_MEDIA_STATE_CONNECTED) + aisFsmScanRequestAdv(prAdapter, ucSsidNum, rSsid, pucIe, + u4IeLength); + else + return WLAN_STATUS_FAILURE; + } + else + return WLAN_STATUS_FAILURE; + } + else +#endif + { + if (prAdapter->fgEnOnlineScan == TRUE) + aisFsmScanRequestAdv(prAdapter, ucSsidNum, rSsid, pucIe, + u4IeLength); + else if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != + PARAM_MEDIA_STATE_CONNECTED) + aisFsmScanRequestAdv(prAdapter, ucSsidNum, rSsid, pucIe, + u4IeLength); + else + return WLAN_STATUS_FAILURE; + } + + return WLAN_STATUS_SUCCESS; +} /* wlanoidSetBssidListScanAdv */ /*----------------------------------------------------------------------------*/ @@ -1881,6 +1969,178 @@ wlanoidSetBssid ( return WLAN_STATUS_SUCCESS; } /* end of wlanoidSetBssid() */ +WLAN_STATUS +wlanoidSetConnect( + IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen + ) +{ + P_GLUE_INFO_T prGlueInfo; + P_PARAM_CONNECT_T pParamConn; + P_CONNECTION_SETTINGS_T prConnSettings; + UINT_32 i; + INT_32 i4Idx = -1, i4MaxRSSI = INT_MIN; + P_MSG_AIS_ABORT_T prAisAbortMsg; + BOOLEAN fgIsValidSsid = TRUE; + BOOLEAN fgEqualSsid = FALSE; + BOOLEAN fgEqualBssid = FALSE; + const UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR; + + ASSERT(prAdapter); + ASSERT(pu4SetInfoLen); + + /* MSDN: + * Powering on the radio if the radio is powered off through a setting of OID_802_11_DISASSOCIATE + */ + if(prAdapter->fgIsRadioOff == TRUE) { + prAdapter->fgIsRadioOff = FALSE; + } + + if(u4SetBufferLen != sizeof(PARAM_CONNECT_T)) { + return WLAN_STATUS_INVALID_LENGTH; + } + else if (prAdapter->rAcpiState == ACPI_STATE_D3) { + DBGLOG(REQ, WARN, ("Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n", + prAdapter->rAcpiState, prAdapter->fgIsRadioOff)); + return WLAN_STATUS_ADAPTER_NOT_READY; + } + prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T)); + if (!prAisAbortMsg) { + ASSERT(0); + return WLAN_STATUS_FAILURE; + } + prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ; + + pParamConn = (P_PARAM_CONNECT_T) pvSetBuffer; + prConnSettings = &prAdapter->rWifiVar.rConnSettings; + + if (pParamConn->u4SsidLen > 32) { + return WLAN_STATUS_INVALID_LENGTH; + } else if (!pParamConn->pucBssid && !pParamConn->pucSsid) + return WLAN_STATUS_INVALID_LENGTH; + + prGlueInfo = prAdapter->prGlueInfo; + kalMemZero(prConnSettings->aucSSID, sizeof(prConnSettings->aucSSID)); + kalMemZero(prConnSettings->aucBSSID, sizeof(prConnSettings->aucBSSID)); + prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_ANY; + prConnSettings->fgIsConnByBssidIssued = FALSE; + + if (pParamConn->pucSsid) { + prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI; + COPY_SSID(prConnSettings->aucSSID, + prConnSettings->ucSSIDLen, + pParamConn->pucSsid, + (UINT_8)pParamConn->u4SsidLen); + if (EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid, + prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen, + pParamConn->pucSsid, + pParamConn->u4SsidLen)) + fgEqualSsid = TRUE; + } + if (pParamConn->pucBssid) { + if (!EQUAL_MAC_ADDR(aucZeroMacAddr, pParamConn->pucBssid) && + IS_UCAST_MAC_ADDR(pParamConn->pucBssid)) { + prConnSettings->eConnectionPolicy = CONNECT_BY_BSSID; + prConnSettings->fgIsConnByBssidIssued = TRUE; + COPY_MAC_ADDR(prConnSettings->aucBSSID, pParamConn->pucBssid); + if (EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, + pParamConn->pucBssid)) + fgEqualBssid = TRUE; + } else { + DBGLOG(INIT, TRACE, ("wrong bssid "MACSTR"to connect\n", MAC2STR(pParamConn->pucBssid))); + } + } else + DBGLOG(INIT, TRACE, ("No Bssid set\n")); + prConnSettings->u4FreqInKHz = pParamConn->u4CenterFreq; + prConnSettings->fgSpecificChnl = ((pParamConn->ucSpecificChnl == 0) ? FALSE : TRUE); + kalMemCopy(&prConnSettings->rSpecificRfChnlInfo, &pParamConn->rChannelInfo, sizeof(RF_CHANNEL_INFO_T)); + + // prepare for CMD_BUILD_CONNECTION & CMD_GET_CONNECTION_STATUS + // re-association check + if(kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) { + if(fgEqualSsid) { + prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_REASSOCIATION; + if (fgEqualBssid) { + kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED); + } + } + else { + DBGLOG(INIT, TRACE, ("DisBySsid\n")); + kalIndicateStatusAndComplete(prGlueInfo, + WLAN_STATUS_MEDIA_DISCONNECT, + NULL, + 0); + prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION; + } + } else + prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION; +#if 0 + // check if any scanned result matchs with the SSID + for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) { + PUINT_8 aucSsid = prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid; + UINT_8 ucSsidLength = (UINT_8) prAdapter->rWlanInfo.arScanResult[i].rSsid.u4SsidLen; + INT_32 i4RSSI = prAdapter->rWlanInfo.arScanResult[i].rRssi; + + if(EQUAL_SSID(aucSsid, ucSsidLength, pParamConn->pucSsid, pParamConn->u4SsidLen) && + i4RSSI >= i4MaxRSSI) { + i4Idx = (INT_32)i; + i4MaxRSSI = i4RSSI; + } + if(EQUAL_MAC_ADDR(prAdapter->rWlanInfo.arScanResult[i].arMacAddress, pAddr)) { + i4Idx = (INT_32)i; + break; + } + } +#endif + /* prepare message to AIS */ + if (prConnSettings->eOPMode == NET_TYPE_IBSS + || prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS) { + /* IBSS */ /* beacon period */ + prConnSettings->u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod; + prConnSettings->u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow; + } + + if (prAdapter->rWifiVar.fgSupportWZCDisassociation) { + if (pParamConn->u4SsidLen == ELEM_MAX_LEN_SSID) { + fgIsValidSsid = FALSE; + + for (i = 0; i < ELEM_MAX_LEN_SSID; i++) { + if ( !((0 < pParamConn->pucSsid[i]) && (pParamConn->pucSsid[i] <= 0x1F)) ) { + fgIsValidSsid = TRUE; + break; + } + } + } + } + + /* Set Connection Request Issued Flag */ + if (fgIsValidSsid) { + prConnSettings->fgIsConnReqIssued = TRUE; + } + else { + prConnSettings->fgIsConnReqIssued = FALSE; + } + + if (fgEqualSsid || fgEqualBssid) { + prAisAbortMsg->fgDelayIndication = TRUE; + } + else { + /* Update the information to CONNECTION_SETTINGS_T */ + prAisAbortMsg->fgDelayIndication = FALSE; + } + + mboxSendMsg(prAdapter, + MBOX_ID_0, + (P_MSG_HDR_T) prAisAbortMsg, + MSG_SEND_METHOD_BUF); + + DBGLOG(INIT, INFO, ("bssid "MACSTR", conn policy %d, disc reason %d\n", + MAC2STR(prConnSettings->aucBSSID), + prConnSettings->eConnectionPolicy, prAisAbortMsg->ucReasonOfDisconnect)); + return WLAN_STATUS_SUCCESS; +} /*----------------------------------------------------------------------------*/ /*! @@ -2044,7 +2304,7 @@ wlanoidSetSsid ( (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF); - DBGLOG(INIT, TRACE, ("SSsid %s\n", prAdapter->rWifiVar.rConnSettings.aucSSID)); + DBGLOG(INIT, INFO, ("SSsid %s\n", prAdapter->rWifiVar.rConnSettings.aucSSID)); return WLAN_STATUS_SUCCESS; } /* end of wlanoidSetSsid() */ @@ -5432,7 +5692,7 @@ wlanoidQueryMcrRead ( OUT PUINT_32 pu4QueryInfoLen ) { - P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrRdInfo; + P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrRdInfo; CMD_ACCESS_REG rCmdAccessReg; DEBUGFUNC("wlanoidQueryMcrRead"); @@ -5444,13 +5704,13 @@ wlanoidQueryMcrRead ( ASSERT(pvQueryBuffer); } - *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T); + *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T); - if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T)) { + if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T)) { return WLAN_STATUS_INVALID_LENGTH; } - prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T)pvQueryBuffer; + prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T)pvQueryBuffer; /* 0x9000 - 0x9EFF reserved for FW */ #if CFG_SUPPORT_SWCR @@ -5518,7 +5778,7 @@ wlanoidSetMcrWrite ( OUT PUINT_32 pu4SetInfoLen ) { - P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrWrInfo; + P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrWrInfo; CMD_ACCESS_REG rCmdAccessReg; #if CFG_STRESS_TEST_SUPPORT @@ -5534,15 +5794,15 @@ wlanoidSetMcrWrite ( ASSERT(prAdapter); ASSERT(pu4SetInfoLen); - *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T); + *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T); - if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T)) { + if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T)) { return WLAN_STATUS_INVALID_LENGTH; } ASSERT(pvSetBuffer); - prMcrWrInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T)pvSetBuffer; + prMcrWrInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T)pvSetBuffer; /* 0x9000 - 0x9EFF reserved for FW */ /* 0xFFFE reserved for FW */ @@ -5566,7 +5826,7 @@ wlanoidSetMcrWrite ( if(prMcrWrInfo->u4McrData <= 11 && prMcrWrInfo->u4McrData >= 1){ prBssInfo->ucPrimaryChannel = prMcrWrInfo->u4McrData; } - nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex); + nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex, STA_REC_INDEX_NOT_FOUND); DBGLOG(INIT, TRACE, ("[Stress Test] Channel is switched to %d ...\n", prBssInfo->ucPrimaryChannel)); return WLAN_STATUS_SUCCESS; @@ -5850,7 +6110,7 @@ wlanoidQuerySwCtrlRead ( OUT PUINT_32 pu4QueryInfoLen ) { - P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo; + P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo; WLAN_STATUS rWlanStatus; UINT_16 u2Id, u2SubId; UINT_32 u4Data; @@ -5866,13 +6126,13 @@ wlanoidQuerySwCtrlRead ( ASSERT(pvQueryBuffer); } - *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T); + *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T); - if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T)) { + if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T)) { return WLAN_STATUS_INVALID_LENGTH; } - prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T)pvQueryBuffer; + prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T)pvQueryBuffer; u2Id = (UINT_16)(prSwCtrlInfo->u4Id >> 16); u2SubId = (UINT_16)(prSwCtrlInfo->u4Id & BITS(0,15)); @@ -5950,7 +6210,7 @@ wlanoidSetSwCtrlWrite ( OUT PUINT_32 pu4SetInfoLen ) { - P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo; + P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo; CMD_SW_DBG_CTRL_T rCmdSwCtrl; WLAN_STATUS rWlanStatus; UINT_16 u2Id, u2SubId; @@ -5970,15 +6230,15 @@ wlanoidSetSwCtrlWrite ( prGlueInfo = prAdapter->prGlueInfo; #endif - *pu4SetInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T); + *pu4SetInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T); - if (u4SetBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T)) { + if (u4SetBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T)) { return WLAN_STATUS_INVALID_LENGTH; } ASSERT(pvSetBuffer); - prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T)pvSetBuffer; + prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T)pvSetBuffer; u2Id = (UINT_16)(prSwCtrlInfo->u4Id >> 16); u2SubId = (UINT_16)(prSwCtrlInfo->u4Id & BITS(0,15)); @@ -6144,7 +6404,7 @@ wlanoidSetSwCtrlWrite ( /* abort to re-connect */ #if 1 - DBGLOG(INIT, TRACE, ("DisBySwC\n")); + DBGLOG(INIT, INFO, ("DisBySwC\n")); kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, @@ -7536,14 +7796,14 @@ wlanoidSetDisassociate ( (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF); - /* indicate for disconnection */ - if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) { + /* indicate for disconnection */ + if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) { DBGLOG(INIT, TRACE, ("DisByOid\n")); - kalIndicateStatusAndComplete(prAdapter->prGlueInfo, - WLAN_STATUS_MEDIA_DISCONNECT, - NULL, - 0); - } + kalIndicateStatusAndComplete(prAdapter->prGlueInfo, + WLAN_STATUS_MEDIA_DISCONNECT, + NULL, + 0); + } #if !defined(LINUX) prAdapter->fgIsRadioOff = TRUE; @@ -8269,6 +8529,7 @@ wlanoidSetNetworkAddress( P_PARAM_NETWORK_ADDRESS prNetworkAddress; P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp; UINT_32 u4IpAddressCount, u4CmdSize; + UINT_32 u4Ipv6AddressCount = 0; PUINT_8 pucBuf = (PUINT_8)pvSetBuffer; #if CFG_ENABLE_GTK_FRAME_FILTER UINT_32 u4IpV4AddrListSize; @@ -8291,16 +8552,23 @@ wlanoidSetNetworkAddress( u4IpAddressCount = 0; prNetworkAddress = prNetworkAddressList->arAddress; + DBGLOG(REQ, LOUD, ("u4AddressCount (%d)\n", prNetworkAddressList->u4AddressCount)); for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) { + DBGLOG(REQ, LOUD, ("prNetworkAddress (%p)\n", prNetworkAddress)); if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP && prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) { u4IpAddressCount++; + prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG)prNetworkAddress + + prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + } else if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP && + prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IPV6)) { + u4Ipv6AddressCount++; + prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG)prNetworkAddress + + prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); } - - prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) (prNetworkAddress + - (ULONG) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress))); } + DBGLOG(REQ, LOUD, ("u4IpAddressCount (%u), u4Ipv6AddressCount (%u)\n", u4IpAddressCount, u4Ipv6AddressCount)); // construct payload of command packet u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) + sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount; @@ -8315,7 +8583,7 @@ wlanoidSetNetworkAddress( #if CFG_ENABLE_GTK_FRAME_FILTER u4IpV4AddrListSize = OFFSET_OF(IPV4_NETWORK_ADDRESS_LIST, arNetAddr) + - (u4IpAddressCount * sizeof(IPV4_NETWORK_ADDRESS)); + (u4IpAddressCount * sizeof(IPV4_NETWORK_ADDRESS)); if(prBssInfo->prIpV4NetAddrList) { FREE_IPV4_NETWORK_ADDR_LIST(prBssInfo->prIpV4NetAddrList); } @@ -8330,9 +8598,6 @@ wlanoidSetNetworkAddress( if (prAdapter->fgEnArpFilter) { prCmdNetworkAddressList->ucAddressCount = (UINT_8)u4IpAddressCount; prNetworkAddress = prNetworkAddressList->arAddress; - - DBGLOG(REQ, INFO, ("u4IpAddressCount (%u)\n", u4IpAddressCount)); - for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) { if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP && prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) { @@ -8354,7 +8619,7 @@ wlanoidSetNetworkAddress( DBGLOG(REQ, INFO, ("prNetAddrIp->in_addr:%d:%d:%d:%d\n", pucBuf[0], pucBuf[1],pucBuf[2],pucBuf[3])); } - prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) (prNetworkAddress + + prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG)prNetworkAddress + (ULONG) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress))); } @@ -8362,6 +8627,10 @@ wlanoidSetNetworkAddress( prCmdNetworkAddressList->ucAddressCount = 0; } + prCmdNetworkAddressList->ucDtimSkipCount = + prAdapter->dtim_skip_count > 0 && prAdapter->dtim_skip_count <= 6 ? + prAdapter->dtim_skip_count : 0; + rStatus = wlanSendSetQueryCmd(prAdapter, CMD_ID_SET_IP_ADDRESS, TRUE, @@ -8376,6 +8645,120 @@ wlanoidSetNetworkAddress( ); kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize); + + return rStatus; +} + +WLAN_STATUS +wlanoidSetIPv6NetworkAddress( + IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen + ) +{ + WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; + UINT_32 i, j; + P_CMD_SET_IPV6_NETWORK_ADDRESS_LIST prCmdIpv6NetworkAddressList; + P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST)pvSetBuffer; + P_PARAM_NETWORK_ADDRESS prNetworkAddress; + P_PARAM_NETWORK_ADDRESS_IPV6 prNetAddrIpv6; + UINT_32 u4IpAddressCount, u4CmdSize; + UINT_32 u4Ipv6AddressCount = 0; + PUINT_8 pucBuf = (PUINT_8)pvSetBuffer; + + DEBUGFUNC("wlanoidSetNetworkAddress"); + DBGLOG(INIT, LOUD, ("\n")); + + ASSERT(prAdapter); + ASSERT(pu4SetInfoLen); + + *pu4SetInfoLen = 4; + + if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST)) { + return WLAN_STATUS_INVALID_DATA; + } + + *pu4SetInfoLen = 0; + u4IpAddressCount = 0; + + prNetworkAddress = prNetworkAddressList->arAddress; + DBGLOG(REQ, LOUD, ("u4AddressCount (%d)\n", prNetworkAddressList->u4AddressCount)); + for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) { + DBGLOG(REQ, LOUD, ("prNetworkAddress (%p)\n", prNetworkAddress)); + if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP && + prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) { + u4IpAddressCount++; + prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG)prNetworkAddress + + prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + } else if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP && + prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IPV6)) { + u4Ipv6AddressCount++; + prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG)prNetworkAddress + + prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + } + } + + DBGLOG(REQ, LOUD, ("u4IpAddressCount (%u), u4Ipv6AddressCount (%u)\n", u4IpAddressCount, u4Ipv6AddressCount)); + + if (prAdapter->fgEnArpFilter) + { + u4CmdSize = OFFSET_OF(CMD_SET_IPV6_NETWORK_ADDRESS_LIST, arNetAddress) + + sizeof(IPV6_NETWORK_ADDRESS) * u4Ipv6AddressCount; + if (u4Ipv6AddressCount == 0) + u4CmdSize = sizeof (CMD_SET_IPV6_NETWORK_ADDRESS_LIST); + + prCmdIpv6NetworkAddressList = (P_CMD_SET_IPV6_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE); + if (NULL == prCmdIpv6NetworkAddressList) + { + DBGLOG(REQ, ERROR, ("mem alloc for prCmdIpv6NetworkAddressList failed, size:%d\n", u4CmdSize)); + return WLAN_STATUS_FAILURE; + } + + prCmdIpv6NetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; + prCmdIpv6NetworkAddressList->ucAddressCount = (UINT_8)u4Ipv6AddressCount; + prNetworkAddress = prNetworkAddressList->arAddress; + + DBGLOG(REQ, LOUD, ("u4Ipv6AddressCount (%u)\n", u4Ipv6AddressCount)); + + for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) { + DBGLOG(REQ, LOUD, ("prNetworkAddress (%p)\n", prNetworkAddress)); + if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP && + prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)){ + prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG)prNetworkAddress + + prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + } else if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP && + prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IPV6)) { + prNetAddrIpv6 = (P_PARAM_NETWORK_ADDRESS_IPV6)prNetworkAddress->aucAddress; + DBGLOG(REQ, LOUD, ("prNetAddrIpv6:%p\n", prNetAddrIpv6)); + DBGLOG(REQ, LOUD, ("addr:%d.%d.%d.%d...\n", prNetAddrIpv6->addr[0], prNetAddrIpv6->addr[1], prNetAddrIpv6->addr[2], prNetAddrIpv6->addr[3])); + kalMemCopy(prCmdIpv6NetworkAddressList->arNetAddress[j].aucIpAddr, + prNetAddrIpv6->addr, + sizeof (IPV6_NETWORK_ADDRESS)); + pucBuf = prCmdIpv6NetworkAddressList->arNetAddress[j].aucIpAddr; + DBGLOG(REQ, INFO, ("prNetAddrIpv6->addr:%d:%d:%d:%d\n", pucBuf[0], pucBuf[1],pucBuf[2],pucBuf[3])); + prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG)prNetworkAddress + + prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + j++; + } + } + rStatus = wlanSendSetQueryCmd(prAdapter, + CMD_ID_SET_IPV6_ADDRESS, + TRUE, + FALSE, + TRUE, + nicCmdEventSetIpAddress, + nicOidCmdTimeoutCommon, + u4CmdSize, + (PUINT_8)prCmdIpv6NetworkAddressList, + pvSetBuffer, + u4SetBufferLen + ); + + kalMemFree(prCmdIpv6NetworkAddressList, VIR_MEM_TYPE, u4CmdSize); + + } + return rStatus; } @@ -9925,7 +10308,7 @@ wlanoidUpdateSLTMode ( prBssInfo->eHtProtectMode = HT_PROTECT_MODE_NONE; prBssInfo->eGfOperationMode = GF_MODE_NORMAL; - nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex); + nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex, STA_REC_INDEX_NOT_FOUND); prStaRec->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M); @@ -10265,29 +10648,47 @@ wlanoidQueryEepromType( */ /*----------------------------------------------------------------------------*/ WLAN_STATUS -wlanoidSetCountryCode ( - IN P_ADAPTER_T prAdapter, - IN PVOID pvSetBuffer, - IN UINT_32 u4SetBufferLen, - OUT PUINT_32 pu4SetInfoLen - ) +wlanoidSetCountryCode(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen) { - PUINT_8 pucCountry; + PUINT_8 pucCountry; + UINT_16 country; - ASSERT(prAdapter); - ASSERT(pvSetBuffer); - ASSERT(u4SetBufferLen == 2); + ASSERT(prAdapter); + ASSERT(pvSetBuffer); + ASSERT(u4SetBufferLen == 2); - *pu4SetInfoLen = 2; + *pu4SetInfoLen = 2; - pucCountry = pvSetBuffer; + pucCountry = pvSetBuffer; - prAdapter->rWifiVar.rConnSettings.u2CountryCode = - (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]) ; + country = (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]); +#if CFG_CUSTOM_REG + country = rlm_get_support_country(country); +#endif + prAdapter->rWifiVar.rConnSettings.u2CountryCode = country; - rlmDomainSendCmd(prAdapter, TRUE); + rlmDomainSendCmd(prAdapter, TRUE); - return WLAN_STATUS_SUCCESS; + wlanUpdateChannelTable(prAdapter->prGlueInfo); + + return WLAN_STATUS_SUCCESS; +} + +WLAN_STATUS +wlanoidGetCountryCode(IN P_ADAPTER_T prAdapter, + IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen) +{ + ASSERT(prAdapter); + if (u4QueryBufferLen) + ASSERT(pvQueryBuffer); + + *pu4QueryInfoLen = sizeof(UINT_16); + *(PUINT_16) pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.u2CountryCode; + + return WLAN_STATUS_SUCCESS; } #if 0 @@ -10451,6 +10852,119 @@ wlanoidSetUApsdParam ( } #endif +/*----------------------------------------------------------------------------*/ +/*! +* \brief This routine is called to set specified power table to fw if exists. +* +* \param[in] prAdapter Pointer to the Adapter structure. +* \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set. +* \param[in] u4SetBufferLen The length of the set buffer. +* \param[out] pu4SetInfoLen If the call is successful, returns the number of +* bytes read from the set buffer. If the call failed +* due to invalid length of the set buffer, returns +* the amount of storage needed. +* +* \retval WLAN_STATUS_SUCCESS +* \retval WLAN_STATUS_FAILURE +*/ +/*----------------------------------------------------------------------------*/ +WLAN_STATUS +wlanoidUpdatePowerTable(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen) +{ + PUINT_8 pucCountry; + P_COUNTRY_POWER_TABLE pCountryPwrTable = NULL; + UINT_16 region = 0, country = 0; + pucCountry = pvSetBuffer; + + /* convert country code to region code. */ + country = (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]); +#if CFG_CUSTOM_REG + region = rlm_get_region(country); +#else + region = country; +#endif + region = ((UINT_16)((((UINT_16)(region) & 0x00FF) << 8) | + (((UINT_16)(region) & 0xFF00) >> 8))); + + /*update specified power and band edge power if used to firmware*/ + pCountryPwrTable = wlanGetUpdatedPowerTable((PUINT_8)®ion); + + if (pCountryPwrTable != NULL) { + CMD_EDGE_TXPWR_LIMIT_T rCmdEdgeTxPwrLimit; + DBGLOG(INIT, INFO, ("updated power table found\n")); + /*set CMD_ID_SET_EDGE_TXPWR_LIMIT to chip*/ + if (0 != pCountryPwrTable->r2GBandEdgePwr.fg2G4BandEdgePwrUsed) { + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrCCK = + pCountryPwrTable->r2GBandEdgePwr.cBandEdgeMaxPwrCCK; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM20 = + pCountryPwrTable->r2GBandEdgePwr.cBandEdgeMaxPwrOFDM20; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40 = + pCountryPwrTable->r2GBandEdgePwr.cBandEdgeMaxPwrOFDM40; + } else { + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrCCK = MAX_TX_POWER; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM20 = MAX_TX_POWER; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40 = MAX_TX_POWER; + } + + wlanSendSetQueryCmd(prAdapter, + CMD_ID_SET_EDGE_TXPWR_LIMIT, + TRUE, + FALSE, + FALSE, + NULL, + NULL, + sizeof(CMD_EDGE_TXPWR_LIMIT_T), + (PUINT_8) &rCmdEdgeTxPwrLimit, + NULL, + 0); + + /*set CMD_ID_SET_EDGE_TXPWR_LIMIT_5G to chip*/ + if (pCountryPwrTable->r5GBandEdgePwr.uc5GBandEdgePwrUsed != 0 && + pCountryPwrTable->ucSupport5GBand != 0) { + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrCCK = 0; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM20 = + pCountryPwrTable->r5GBandEdgePwr.c5GBandEdgeMaxPwrOFDM20; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40 = + pCountryPwrTable->r5GBandEdgePwr.c5GBandEdgeMaxPwrOFDM40; + } else { + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrCCK = 0; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM20 = MAX_TX_POWER; + rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40 = MAX_TX_POWER; + } + + wlanSendSetQueryCmd(prAdapter, + CMD_ID_SET_5G_EDGE_TXPWR_LIMIT, + TRUE, + FALSE, + FALSE, + NULL, + NULL, + sizeof(CMD_EDGE_TXPWR_LIMIT_T), + (PUINT_8) &rCmdEdgeTxPwrLimit, + NULL, + 0); + + /*set CMD_ID_SET_TX_PWR to chip*/ + if (pCountryPwrTable->ucTxPwrValid != 0) + wlanSendSetQueryCmd(prAdapter, + CMD_ID_SET_TX_PWR, + TRUE, + FALSE, + FALSE, + NULL, + NULL, + sizeof(CMD_TX_PWR_T), + (PUINT_8) (&pCountryPwrTable->rTxPwr), + NULL, + 0); + } else { + /*no special power table found*/ + DBGLOG(INIT, INFO, ("no updated power table found\n")); + } + return WLAN_STATUS_SUCCESS; +} + /*----------------------------------------------------------------------------*/ /*! * \brief This routine is called to set BT profile or BT information and the @@ -11448,6 +11962,118 @@ wlanoidSetRoamingInfo ( } #endif /* CFG_SUPPORT_ROAMING_ENC */ +WLAN_STATUS +wlanoidGetRoamParams(IN P_ADAPTER_T prAdapter, + OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen) +{ + INT_32 rangeHi = 0; + INT_32 rangeMed = 0; + INT_32 rangeLo = 0; + UINT_8 pref5gHi = 0; + UINT_8 pref5gMed = 0; + UINT_8 pref5gLo = 0; + PUINT_8 pucQueryBuffer = (PUINT_8)pvQueryBuffer; + P_CMD_ROAMING_CTRL_T prRoamCtrl = &prAdapter->rWifiVar.rRoamingInfo.rRoamCtrl; + ASSERT(prAdapter); + ASSERT(pu4QueryInfoLen); + if (u4QueryBufferLen) + ASSERT(pvQueryBuffer); + + *pu4QueryInfoLen = 0; +#if AMZN_5GHZ_PREF + scanGet5gRoamingPreference(&rangeHi, &rangeMed, &rangeLo, &pref5gHi, &pref5gMed, &pref5gLo); +#endif + *pu4QueryInfoLen = kalSprintf(pucQueryBuffer, "rssiRangeHi:%d\n" + "rssiRangeMed:%d\nrssiRangeLo:%d\npref5GhzHi:%d\npref5GhzMed:%d\n" + "pref5GhzLow:%d\n", rangeHi, rangeMed, rangeLo, pref5gHi, pref5gMed, pref5gLo); + pucQueryBuffer += *pu4QueryInfoLen; + *pu4QueryInfoLen += kalSprintf(pucQueryBuffer, "roaming_enable: %s\n" + "RcpiAdjustStep: %d\nRcpiLowThreshold:%d\nRoamRetryCount:%d\n" + "RoamingStableTimeout:%d\n", prRoamCtrl->fgEnable ? "true":"false", + prRoamCtrl->ucRcpiAdjustStep, prRoamCtrl->u2RcpiLowThr, prRoamCtrl->ucRoamingRetryCount, + prRoamCtrl->ucRoamingStableTimeout); + return WLAN_STATUS_SUCCESS; +} + +WLAN_STATUS +wlanoidSetRoamParams(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen) +{ + PUINT_8 pucSetBuf = (PUINT_8)pvSetBuffer; + INT_32 i4Status = 0; + P_ROAMING_INFO_T prRoamInfo = &prAdapter->rWifiVar.rRoamingInfo; + ASSERT(prAdapter); + ASSERT(pvSetBuffer); + if (kalStrnCmp(pucSetBuf, "roam_5g_bias ", 13) == 0) { + INT_32 rangeHi = 0; + INT_32 rangeMed = 0; + INT_32 rangeLo = 0; + UINT_32 pref5gHi = 0; + UINT_32 pref5gMed = 0; + UINT_32 pref5gLo = 0; + pucSetBuf += 13; + i4Status = sscanf(pucSetBuf, "%d,%d,%d,%u,%u,%u", &rangeHi, &rangeMed, + &rangeLo, &pref5gHi, &pref5gMed, &pref5gLo); + if (i4Status != 6) + return WLAN_STATUS_INVALID_DATA; +#if AMZN_5GHZ_PREF + scanSet5gRoamingPreference(rangeHi, rangeMed, rangeLo, + (UINT_8)pref5gHi, (UINT_8)pref5gMed, (UINT_8)pref5gLo); +#endif + return WLAN_STATUS_SUCCESS; + } else if (kalStrnCmp(pucSetBuf, "roam_param ", 11) == 0) + pucSetBuf += 11; + else + return WLAN_STATUS_INVALID_DATA; + + i4Status = sscanf(pucSetBuf, "%hhu,%hhu,%hu,%hhu,%hhu", &prRoamInfo->rRoamCtrl.fgEnable, + &prRoamInfo->rRoamCtrl.ucRcpiAdjustStep, &prRoamInfo->rRoamCtrl.u2RcpiLowThr, + &prRoamInfo->rRoamCtrl.ucRoamingRetryCount, &prRoamInfo->rRoamCtrl.ucRoamingStableTimeout); + + DBGLOG(REQ, INFO, ("roaming_params: %d,%d,%d,%d,%d\n", prRoamInfo->rRoamCtrl.fgEnable, + prRoamInfo->rRoamCtrl.ucRcpiAdjustStep, prRoamInfo->rRoamCtrl.u2RcpiLowThr, + prRoamInfo->rRoamCtrl.ucRoamingRetryCount, prRoamInfo->rRoamCtrl.ucRoamingStableTimeout)); + + if (i4Status != 5) { + DBGLOG(REQ, ERROR, ("fail\n")); + return WLAN_STATUS_INVALID_DATA; + } + return wlanSendSetQueryCmd(prAdapter, + CMD_ID_ROAMING_CONTROL, + TRUE, + FALSE, + TRUE, + nicCmdEventSetCommon, + nicOidCmdTimeoutCommon, + sizeof(CMD_ROAMING_CTRL_T), + (PUINT_8)&prRoamInfo->rRoamCtrl, pvSetBuffer, u4SetBufferLen); +} + +WLAN_STATUS +wlanoidSetForceRoam(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen) +{ + P_ROAMING_INFO_T prRoamingFsmInfo; + ENUM_ROAMING_STATE_T eNextState; + + prRoamingFsmInfo = (P_ROAMING_INFO_T) &(prAdapter->rWifiVar.rRoamingInfo); + + if (!(prRoamingFsmInfo->fgIsEnableRoaming)) + return WLAN_STATUS_FAILURE; + + DBGLOG(ROAMING, EVENT, ("Current Time = %d\n", kalGetTimeTick())); + + if (prRoamingFsmInfo->eCurrentState != ROAMING_STATE_DECISION) + return WLAN_STATUS_FAILURE; + + eNextState = ROAMING_STATE_DISCOVERY; + + if (eNextState != prRoamingFsmInfo->eCurrentState) + roamingFsmSteps(prAdapter, eNextState); + + return WLAN_STATUS_SUCCESS; +} + /*----------------------------------------------------------------------------*/ /*! * \brief This routine is called to set chip @@ -11516,4 +12142,75 @@ wlanoidSetChipConfig(IN P_ADAPTER_T prAdapter, return rWlanStatus; } /* wlanoidSetChipConfig */ +/*----------------------------------------------------------------------------*/ +/*! \brief This routine is called to query the TSF from firmware via CMD ID +* +* \param[in] pvAdapter Pointer to the Adapter structure +* \param[in] pvQueryBuf A pointer to the buffer that holds the result of the +* query buffer +* \param[in] u4QueryBufLen The length of the query buffer +* \param[out] pu4QueryInfoLen If the call is successful, returns the number of +* bytes written into the query buffer. If the call +* failed due to invalid length of the query buffer, +* returns the amount of storage needed. +* +* \retval WLAN_STATUS_SUCCESS +* \retval WLAN_STATUS_BUFFER_TOO_SHORT +*/ +/*----------------------------------------------------------------------------*/ +WLAN_STATUS +wlanoidQueryTsf ( + IN P_ADAPTER_T prAdapter, + IN PVOID pvQueryBuffer, + IN UINT_32 u4QueryBufferLen, + OUT PUINT_32 pu4QueryInfoLen + ) +{ + ASSERT(prAdapter); + ASSERT(pu4QueryInfoLen); + if (u4QueryBufferLen) { + ASSERT(pvQueryBuffer); + } + + if (u4QueryBufferLen < MAC_ADDR_LEN) { + return WLAN_STATUS_BUFFER_TOO_SHORT; + } + + return wlanSendSetQueryCmd(prAdapter, + CMD_ID_GET_TSF, + FALSE, + TRUE, + TRUE, + nicCmdEventTsfRead, + nicOidCmdTimeoutCommon, + sizeof(CMD_TSF_GET_T), + (PUINT_8)pvQueryBuffer, + pvQueryBuffer, + u4QueryBufferLen + ); + +} /* wlanoidQueryCurrentAddr */ + +WLAN_STATUS +wlanoidNotifyFwSuspend(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen) +{ + WIFI_SYSTEM_SUSPEND_CMD_T rSuspendCmd; + + if (!prAdapter || !pvSetBuffer) + return WLAN_STATUS_INVALID_DATA; + + rSuspendCmd.fgIsSystemSuspend = *(PBOOLEAN)pvSetBuffer; + return wlanSendSetQueryCmd(prAdapter, + CMD_ID_SET_SYSTEM_SUSPEND, + TRUE, + FALSE, + TRUE, + nicCmdEventSetCommon, + nicOidCmdTimeoutCommon, + sizeof(BOOLEAN), + (PUINT_8)&rSuspendCmd, + NULL, + 0); +} diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_p2p.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_p2p.c index 0e465a843ea..75b10036ca0 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_p2p.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/common/wlan_p2p.c @@ -1785,7 +1785,8 @@ wlanoidSetP2pWPSmode ( status = nicUpdateBss( prAdapter, - NETWORK_TYPE_P2P_INDEX); + NETWORK_TYPE_P2P_INDEX, + STA_REC_INDEX_NOT_FOUND); return status; } /* end of wlanoidSetP2pWPSmode() */ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/CFG_Wifi_File.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/CFG_Wifi_File.h index 87522fddb6c..2771a5315ae 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/CFG_Wifi_File.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/CFG_Wifi_File.h @@ -191,6 +191,20 @@ typedef struct _MT6620_CFG_PARAM_STRUCT { } MT6620_CFG_PARAM_STRUCT, *P_MT6620_CFG_PARAM_STRUCT, WIFI_CFG_PARAM_STRUCT, *P_WIFI_CFG_PARAM_STRUCT; +typedef struct _BANDEDGE_5G_T { + UINT_8 uc5GBandEdgePwrUsed; + UINT_8 c5GBandEdgeMaxPwrOFDM20; + UINT_8 c5GBandEdgeMaxPwrOFDM40; + +} BANDEDGE_5G_T, *P_BANDEDGE_5G_T; + +typedef struct _BANDEDGE_2G_T { + UINT_8 fg2G4BandEdgePwrUsed; + INT_8 cBandEdgeMaxPwrCCK; + INT_8 cBandEdgeMaxPwrOFDM20; + INT_8 cBandEdgeMaxPwrOFDM40; +} BANDEDGE_2G_T, *P_BANDEDGE_2G_T; + /******************************************************************************* * P R I V A T E D A T A ******************************************************************************** diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/config.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/config.h index cd58e7703e7..891dbcaa9e0 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/config.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/config.h @@ -949,7 +949,9 @@ #define CFG_SUPPORT_STATISTICS 1 #define CFG_SUPPORT_DBG_POWERMODE 1 /* for debugging power always active mode */ +#define AMZN_PWR_TABLE_ENABLE 0 /* amazon specified power table setup enable flag */ +#define CFG_FORCE_USE_20BW 1 /*------------------------------------------------------------------------------ * SLT Option *------------------------------------------------------------------------------ @@ -1248,6 +1250,12 @@ #define CFG_INIT_ADHOC_BEACON_INTERVAL (100) #define CFG_INIT_ADHOC_ATIM_WINDOW (0) +/*------------------------------------------------------------------------------ +* Flags and Parameters for Maximum Scan SSID number +*------------------------------------------------------------------------------ +*/ +#define CFG_SCAN_SSID_MAX_NUM (4) +#define CFG_SCAN_SSID_MATCH_MAX_NUM (16) /*------------------------------------------------------------------------------ * Flags and Parameters for Load Setup Default @@ -1511,7 +1519,7 @@ #define CFG_SUPPORT_P2P_RSSI_QUERY 0 -#define CFG_SHOW_MACADDR_SOURCE 1 +#define CFG_SHOW_MACADDR_SOURCE 0 #define CFG_SUPPORT_802_11V 0 /* Support 802.11v Wireless Network Management */ #define CFG_SUPPORT_802_11V_TIMING_MEASUREMENT 0 @@ -1560,6 +1568,26 @@ #define COMPILE_FLAG0_GET_STA_LINK_STATUS (1<<0) #define COMPILE_FLAG0_WFD_ENHANCEMENT_PROTECT (1<<1) +/*------------------------------------------------------------------------------ + * Flags for wakeup event satistics + *------------------------------------------------------------------------------ + */ +#define CFG_SUPPORT_WAKEUP_STATISTICS 1 + +/*------------------------------------------------------------------------------ + * Flags of custom region domain + *------------------------------------------------------------------------------ + */ +#define CFG_CUSTOM_REG 1 + +/*------------------------------------------------------------------------------ + * Flags of THERMO_THROTTLING SUPPORT + *------------------------------------------------------------------------------ + */ + +#define CFG_SUPPORT_THERMO_THROTTLING 1 +#define WLAN_INCLUDE_PROC 1 + /******************************************************************************* * D A T A T Y P E S ******************************************************************************** diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/debug.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/debug.h index 043efe2cf82..7e6317cfddb 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/debug.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/debug.h @@ -200,6 +200,7 @@ typedef enum _ENUM_DBG_MODULE_T { DBG_WAPI_IDX, /* WAPI */ DBG_ROAMING_IDX, /* ROAMING */ DBG_TDLS_IDX, /* TDLS */ /* CFG_SUPPORT_TDLS */ + DBG_OID_IDX, DBG_MODULE_NUM /* Notice the XLOG check */ } ENUM_DBG_MODULE_T; @@ -277,32 +278,32 @@ typedef enum _ENUM_DBG_MODULE_T { /* The following macros are used for future debug message. */ /* TODO(Kevin): We should remove INITLOG/ERRORLOG/WARNLOG macro sooner or later */ #define INITLOG(_Fmt) \ - { \ + do { \ if (aucDebugModule[DBG_INIT_IDX] & DBG_CLASS_TRACE) { \ LOG_FUNC("%s: ", __FUNCTION__); \ LOG_FUNC _Fmt; \ } \ - } + } while (0) #define ERRORLOG(_Fmt) \ - { \ + do { \ if (aucDebugModule[DBG_INIT_IDX] & DBG_CLASS_ERROR) { \ LOG_FUNC("**Error[%s:%d]-", __FILE__, __LINE__); \ LOG_FUNC _Fmt; \ } \ - } + } while (0) #define WARNLOG(_Fmt) \ - { \ + do { \ if (aucDebugModule[DBG_INIT_IDX] & DBG_CLASS_WARN) { \ LOG_FUNC("**Warning[%s:%d]-", __FILE__, __LINE__); \ LOG_FUNC _Fmt; \ } \ - } + } while (0) /*lint -save -e960 Multiple use of '#/##' */ #define DBGLOG(_Module, _Class, _Fmt) \ - { \ + do { \ if (aucDebugModule[DBG_##_Module##_IDX] & DBG_CLASS_##_Class) { \ if (DBG_CLASS_##_Class == DBG_CLASS_ERROR) { \ LOG_FUNC_TIME("[wlan] **Error[%s:%d]-", __FILE__, __LINE__); \ @@ -317,23 +318,23 @@ typedef enum _ENUM_DBG_MODULE_T { } \ LOG_FUNC _Fmt; \ } \ - } + } while (0) #define DBGLOG_MEM8(_Module, _Class, _StartAddr, _Length) \ - { \ + do { \ if (aucDebugModule[DBG_##_Module##_IDX] & DBG_CLASS_##_Class) { \ LOG_FUNC("%s: (" #_Module " " #_Class ")\n", __FUNCTION__); \ dumpMemory8((PUINT_8) (_StartAddr), (UINT_32) (_Length)); \ } \ - } + } while (0) #define DBGLOG_MEM32(_Module, _Class, _StartAddr, _Length) \ - { \ + do { \ if (aucDebugModule[DBG_##_Module##_IDX] & DBG_CLASS_##_Class) { \ LOG_FUNC("%s: (" #_Module " " #_Class ")\n", __FUNCTION__); \ dumpMemory32((PUINT_32) (_StartAddr), (UINT_32) (_Length)); \ } \ - } + } while (0) /*lint -restore */ /*lint -save -e961 use of '#undef' is discouraged */ @@ -375,7 +376,7 @@ typedef enum _ENUM_DBG_MODULE_T { #if defined(LINUX) #define DBGLOG(_Module, _Class, _Fmt) \ - { \ + do { \ if (aucDebugModule[DBG_##_Module##_IDX] & DBG_CLASS_##_Class) { \ if (DBG_CLASS_##_Class == DBG_CLASS_ERROR) { \ LOG_FUNC_TIME("[wlan] **Error[%s:%d]-", __FILE__, __LINE__); \ @@ -390,7 +391,7 @@ typedef enum _ENUM_DBG_MODULE_T { } \ LOG_FUNC _Fmt; \ } \ - } + } while (0) #else #define DBGLOG(_Module, _Class, _Fmt) #endif diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/ais_fsm.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/ais_fsm.h index 24d320fa5d3..0384d545baf 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/ais_fsm.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/ais_fsm.h @@ -371,8 +371,8 @@ typedef struct _AIS_FSM_INFO_T { UINT_8 ucConnTrialCount; - UINT_8 ucScanSSIDLen; - UINT_8 aucScanSSID[ELEM_MAX_LEN_SSID]; + UINT_8 ucScanSSIDNum; + PARAM_SSID_T arScanSSID[SCN_SSID_MAX_NUM]; UINT_32 u4ScanIELength; UINT_8 aucScanIEBuf[MAX_IE_LENGTH]; @@ -389,6 +389,9 @@ typedef struct _AIS_FSM_INFO_T { /* Packet filter for AIS module. */ UINT_32 u4AisPacketFilter; + /* for roaming target */ + PARAM_SSID_T rRoamingSSID; + } AIS_FSM_INFO_T, *P_AIS_FSM_INFO_T; @@ -716,6 +719,15 @@ aisFsmScanRequest ( IN UINT_32 u4IeLength ); +VOID +aisFsmScanRequestAdv( + IN P_ADAPTER_T prAdapter, + IN UINT_8 ucSsidNum, + IN P_PARAM_SSID_T prSsid, + IN PUINT_8 pucIe, + IN UINT_32 u4IeLength +); + /*----------------------------------------------------------------------------*/ /* Internal State Checking */ /*----------------------------------------------------------------------------*/ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/rlm_domain.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/rlm_domain.h index f7f586bbf27..e847d8e7001 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/rlm_domain.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/rlm_domain.h @@ -138,6 +138,8 @@ #define COUNTRY_CODE_EC (((UINT_16) 'E' << 8) | (UINT_16) 'C') /* Ecuador */ #define COUNTRY_CODE_EE (((UINT_16) 'E' << 8) | (UINT_16) 'E') /* Estonia */ #define COUNTRY_CODE_EG (((UINT_16) 'E' << 8) | (UINT_16) 'G') /* Egypt */ +#define COUNTRY_CODE_EL (((UINT_16) 'E' << 8) | (UINT_16) 'L') /* Greece */ + #define COUNTRY_CODE_ER (((UINT_16) 'E' << 8) | (UINT_16) 'R') /* Eritrea */ #define COUNTRY_CODE_ES (((UINT_16) 'E' << 8) | (UINT_16) 'S') /* Spain */ #define COUNTRY_CODE_ET (((UINT_16) 'E' << 8) | (UINT_16) 'T') /* Ethiopia */ @@ -258,6 +260,8 @@ #define COUNTRY_CODE_PT (((UINT_16) 'P' << 8) | (UINT_16) 'T') /* Portugal */ #define COUNTRY_CODE_PW (((UINT_16) 'P' << 8) | (UINT_16) 'W') /* Palau */ #define COUNTRY_CODE_PY (((UINT_16) 'P' << 8) | (UINT_16) 'Y') /* Paraguay */ +#define COUNTRY_CODE_PZ (((UINT_16) 'P' << 8) | (UINT_16) 'Z') /* Panama */ + #define COUNTRY_CODE_QA (((UINT_16) 'Q' << 8) | (UINT_16) 'A') /* Qatar */ #define COUNTRY_CODE_RE (((UINT_16) 'R' << 8) | (UINT_16) 'E') /* Reunion (France) */ #define COUNTRY_CODE_RKS (((UINT_16) 'R' << 8) | (UINT_16) 'K') /* Kosvo (Added on window's list) */ @@ -301,6 +305,7 @@ #define COUNTRY_CODE_UA (((UINT_16) 'U' << 8) | (UINT_16) 'A') /* Ukraine */ #define COUNTRY_CODE_UG (((UINT_16) 'U' << 8) | (UINT_16) 'G') /* Ugnada */ #define COUNTRY_CODE_US (((UINT_16) 'U' << 8) | (UINT_16) 'S') /* US */ +#define COUNTRY_CODE_UK (((UINT_16) 'U' << 8) | (UINT_16) 'K') /* United Kingdom */ #define COUNTRY_CODE_UY (((UINT_16) 'U' << 8) | (UINT_16) 'Y') /* Uruguay */ #define COUNTRY_CODE_UZ (((UINT_16) 'U' << 8) | (UINT_16) 'Z') /* Uzbekistan */ #define COUNTRY_CODE_VA (((UINT_16) 'V' << 8) | (UINT_16) 'A') /* Vatican (Holy See) */ @@ -311,6 +316,8 @@ #define COUNTRY_CODE_VN (((UINT_16) 'V' << 8) | (UINT_16) 'N') /* Vietnam */ #define COUNTRY_CODE_VU (((UINT_16) 'V' << 8) | (UINT_16) 'U') /* Vanuatu */ #define COUNTRY_CODE_WS (((UINT_16) 'W' << 8) | (UINT_16) 'S') /* Samoa */ +#define COUNTRY_CODE_WW (((UINT_16) 'W' << 8) | (UINT_16) 'W') /* World Wide */ + #define COUNTRY_CODE_YE (((UINT_16) 'Y' << 8) | (UINT_16) 'E') /* Yemen */ #define COUNTRY_CODE_YT (((UINT_16) 'Y' << 8) | (UINT_16) 'T') /* Mayotte (France) */ #define COUNTRY_CODE_ZA (((UINT_16) 'Z' << 8) | (UINT_16) 'A') /* South Africa */ @@ -330,6 +337,8 @@ #define MIB_REG_DOMAIN_JAPAN 0x40 /* MPHPT (Japan) */ #define MIB_REG_DOMAIN_OTHER 0x00 /* other */ +#define MAX_TX_POWER 63 +#define MIN_TX_POWER (-64) /******************************************************************************* * D A T A T Y P E S @@ -457,6 +466,18 @@ typedef struct _COUNTRY_CH_SET_T { ENUM_CH_SET_UNII_UPPER_T eUniiUpper; } COUNTRY_CH_SET_T, *P_COUNTRY_CH_SET_T; +#if CFG_CUSTOM_REG +#define REGION_CODE_FCC (((UINT_16) 'U' << 8) | (UINT_16) 'S') /* US */ +#define REGION_CODE_JP (((UINT_16) 'J' << 8) | (UINT_16) 'P') /* JP */ +#define REGION_CODE_CE (((UINT_16) 'E' << 8) | (UINT_16) 'U') /* EU */ +#define REGION_CODE_WW (((UINT_16) 'W' << 8) | (UINT_16) 'W') /* WW */ + +struct reg_mapping { + UINT_16 country_code; + UINT_16 region; +}; +#endif + /******************************************************************************* * P U B L I C D A T A @@ -514,6 +535,11 @@ rlmDomainIsLegalChannel ( UINT_8 ucChannel ); +#if CFG_CUSTOM_REG +UINT_16 rlm_get_support_country(UINT_16 country); +UINT_16 rlm_get_region(UINT_16 country); +#endif + /******************************************************************************* * F U N C T I O N S ******************************************************************************** diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/roaming_fsm.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/roaming_fsm.h index d0e2dff8a40..43569f526f3 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/roaming_fsm.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/roaming_fsm.h @@ -93,7 +93,15 @@ typedef struct _ROAMING_PARAM_T { UINT_16 u2Data; } ROAMING_PARAM_T, *P_ROAMING_PARAM_T; -/**/ + typedef struct _CMD_ROAMING_CTRL_T { + UINT_8 fgEnable; + UINT_8 ucRcpiAdjustStep; + UINT_16 u2RcpiLowThr; + UINT_8 ucRoamingRetryCount; + UINT_8 ucRoamingStableTimeout; + UINT_8 aucReserved[2]; + } CMD_ROAMING_CTRL_T, *P_CMD_ROAMING_CTRL_T; + typedef enum _ENUM_ROAMING_STATE_T { ROAMING_STATE_IDLE = 0, ROAMING_STATE_DECISION, @@ -111,7 +119,7 @@ typedef struct _ROAMING_INFO_T { #define ROAMING_ENTRY_TIMEOUT_SKIP_COUNT_MAX 2 UINT_32 RoamingEntryTimeoutSkipCount; - + CMD_ROAMING_CTRL_T rRoamCtrl; } ROAMING_INFO_T, *P_ROAMING_INFO_T; /******************************************************************************* diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/scan.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/scan.h index 97ce31c22c2..d9ab5a13fc2 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/scan.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/mgmt/scan.h @@ -256,6 +256,7 @@ * C O M P I L E R F L A G S ******************************************************************************** */ +#define AMZN_5GHZ_PREF 1 /******************************************************************************* * E X T E R N A L R E F E R E N C E S @@ -309,6 +310,11 @@ /*----------------------------------------------------------------------------*/ #define SCN_SSID_MAX_NUM 4 +#define SCAN_ONE_CHNL_DEFAULT_DWELL_TIME 150 + +#define SCN_BSS_JOIN_FAIL_THRESOLD 4 +#define SCN_BSS_JOIN_FAIL_CNT_RESET_SEC 15 +#define SCN_BSS_JOIN_FAIL_RESET_STEP 2 /******************************************************************************* * D A T A T Y P E S @@ -451,6 +457,8 @@ struct _BSS_DESC_T { ULARGE_INTEGER u8TimeStamp; /* Place u8TimeStamp before aucIEBuf[1] to force DW align */ UINT_8 aucRawBuf[CFG_RAW_BUFFER_SIZE]; UINT_8 aucIEBuf[CFG_IE_BUFFER_SIZE]; + UINT_8 ucJoinFailureCount; + OS_SYSTIME rJoinFailTime; #ifdef CFG_AIS_SUPPORT_REJ_CNT_AVOID #define SCN_BSS_DESC_REJ_ERR_CNT_TIMEOUT_SEC 60 @@ -888,6 +896,12 @@ scnQuerySparseChannel ( ); +#if AMZN_5GHZ_PREF +VOID scanSet5gRoamingPreference(INT_32 rangeHi, INT_32 rangeMed, + INT_32 rangeLow, UINT_8 pref5gHi, UINT_8 pref5gMed, UINT_8 pref5gLo); +VOID scanGet5gRoamingPreference(PINT_32 rangeHi, PINT_32 rangeMed, + PINT_32 rangeLow, PUINT_8 pref5gHi, PUINT_8 pref5gMed, PUINT_8 pref5gLo); +#endif #endif /* _SCAN_H */ #if CFG_SUPPORT_AGPS_ASSIST diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/adapter.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/adapter.h index 20d3395b1aa..17ad4038e02 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/adapter.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/adapter.h @@ -701,6 +701,10 @@ typedef struct _CONNECTION_SETTINGS_T { UINT_32 u4FreqInKHz; /* Center frequency */ + BOOLEAN fgSpecificChnl; + RF_CHANNEL_INFO_T rSpecificRfChnlInfo; + + /* ATIM windows using for IBSS power saving function */ UINT_16 u2AtimWindow; @@ -920,7 +924,6 @@ struct _BSS_INFO_T { BOOLEAN fgTdlsIsProhibited; /* TRUE: AP prohibits TDLS links */ BOOLEAN fgTdlsIsChSwProhibited; /* TRUE: AP prohibits TDLS chan switch */ #endif /* CFG_SUPPORT_TDLS */ - BOOLEAN fgIsIndicatedPMBssConn; }; @@ -1357,6 +1360,10 @@ struct _ADAPTER_T { BOOLEAN fgEnDbgPowerMode; /* dbg priviledge power mode, always keep in active */ #endif +#if CFG_SUPPORT_WAKEUP_STATISTICS + WAKEUP_STATISTIC arWakeupStatistic[WAKEUP_TYPE_NUM]; +#endif + unsigned char dtim_skip_count; };/* end of _ADAPTER_T */ /******************************************************************************* diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/hif_rx.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/hif_rx.h index 3d7099e377f..3be06d5e40e 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/hif_rx.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/hif_rx.h @@ -89,8 +89,6 @@ /*! HIF_RX_HEADER_T */ // DW 0, Byte 1 #define HIF_RX_HDR_PACKET_TYPE_MASK BITS(0,1) -#define HIF_RX_HDR_SEC_MODE_MASK BITS(2, 5) -#define HIF_RX_HDR_SEC_MODE_OFFSET 2 // DW 1, Byte 0 #define HIF_RX_HDR_HEADER_LEN BITS(2,7) @@ -102,8 +100,9 @@ #define HIF_RX_HDR_DO_REORDER BIT(1) #define HIF_RX_HDR_PAL BIT(2) #define HIF_RX_HDR_TCL BIT(3) -#define HIF_RX_HDR_NETWORK_IDX_MASK BITS(4,7) +#define HIF_RX_HDR_NETWORK_IDX_MASK BITS(4,6) #define HIF_RX_HDR_NETWORK_IDX_OFFSET 4 +#define HIF_RX_HDR_FLAG_RETRY BIT(7) // DW 1, Byte 2, 3 #define HIF_RX_HDR_SEQ_NO_MASK BITS(0,11) @@ -147,6 +146,7 @@ typedef enum _ENUM_HIF_RX_PKT_TYPE_T { HIF_RX_PKT_TYPE_EVENT, HIF_RX_PKT_TYPE_TX_LOOPBACK, HIF_RX_PKT_TYPE_MANAGEMENT, + HIF_RX_PKT_TYPE_SW_DEFINED, HIF_RX_PKT_TYPE_NUM } ENUM_HIF_RX_PKT_TYPE_T, *P_ENUM_HIF_RX_PKT_TYPE_T; @@ -177,9 +177,8 @@ typedef enum _ENUM_HIF_RX_PKT_TYPE_T { #define HIF_RX_HDR_GET_NETWORK_IDX(_prHifRxHdr) \ ((((_prHifRxHdr)->uc80211_Reorder_PAL_TCL) & HIF_RX_HDR_NETWORK_IDX_MASK)\ >> HIF_RX_HDR_NETWORK_IDX_OFFSET) - -#define HIF_RX_HDR_GET_SEC_MODE(_prHifRxHdr) \ - ((((_prHifRxHdr)->u2PacketType) & HIF_RX_HDR_SEC_MODE_MASK) >> HIF_RX_HDR_SEC_MODE_OFFSET) +#define HIF_RX_HDR_GET_RETRY_FLAG(_prHifRxHdr) \ + (((((_prHifRxHdr)->uc80211_Reorder_PAL_TCL) & HIF_RX_HDR_FLAG_RETRY) ? TRUE : FALSE)) #define HIF_RX_HDR_GET_TID(_prHifRxHdr) \ ((((_prHifRxHdr)->u2SeqNoTid) & HIF_RX_HDR_TID_MASK)\ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic.h index 87c257bb973..7339a019701 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic.h @@ -266,6 +266,24 @@ typedef enum _ENUM_IE_UPD_METHOD_T { IE_UPD_METHOD_DELETE_ALL, } ENUM_IE_UPD_METHOD_T, *P_ENUM_IE_UPD_METHOD_T; +#if CFG_SUPPORT_WAKEUP_STATISTICS +typedef enum _WAKEUP_TYPE { + ABNORMAL_INT, + SOFTWARE_INT, + TX_INT, + RX_DATA_INT, + RX_EVENT_INT, + RX_MGMT_INT, + RX_OTHERS_INT, + WAKEUP_TYPE_NUM +} WAKEUP_TYPE; + +typedef struct _WAKEUP_STATISTIC { + UINT_16 u2Count; + OS_SYSTIME rStartTime; + UINT_16 u2TimePerHundred; +} WAKEUP_STATISTIC, P_WAKEUP_STATISTIC; +#endif /******************************************************************************* * E X T E R N A L R E F E R E N C E S @@ -483,7 +501,8 @@ nicDeactivateNetwork( WLAN_STATUS nicUpdateBss( IN P_ADAPTER_T prAdapter, - IN ENUM_NETWORK_TYPE_INDEX_T eNetworkTypeIdx + IN ENUM_NETWORK_TYPE_INDEX_T eNetworkTypeIdx, + IN UINT_8 ucStaNoClear ); /* BSS-INFO Indication (PM) */ @@ -726,5 +745,8 @@ nicUpdateRddTestMode( ); #endif -#endif /* _NIC_H */ +#if CFG_SUPPORT_WAKEUP_STATISTICS +INT_32 nicUpdateWakeupStatistics(P_ADAPTER_T prAdapter, WAKEUP_TYPE intType); +#endif +#endif /* _NIC_H */ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic_rx.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic_rx.h index 7b7177e4d02..6f2695585cd 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic_rx.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/nic_rx.h @@ -324,6 +324,10 @@ typedef WLAN_STATUS (*PROCESS_RX_MGT_FUNCTION)(P_ADAPTER_T, P_SW_RFB_T); * M A C R O S ******************************************************************************** */ +#define RXM_RXD_PKT_TYPE_SW_BITMAP 0xE00F +#define RXM_RXD_PKT_TYPE_SW_EVENT 0xE000 +#define RXM_RXD_PKT_TYPE_SW_FRAME 0xE001 + #define RX_INC_CNT(prRxCtrl, eCounter) \ {((P_RX_CTRL_T)prRxCtrl)->au8Statistics[eCounter]++;} diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/que_mgt.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/que_mgt.h index d7b2114e634..1729fbb8b60 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/que_mgt.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic/que_mgt.h @@ -468,6 +468,9 @@ typedef struct _RX_BA_ENTRY_T { //UINT_8 ucTxBufferSize; //BOOL fgIsAcConstrain; //BOOL fgIsBaEnabled; + TIMER_T rReorderBubbleTimer; + UINT_16 u2FirstBubbleSn; + BOOLEAN fgHasBubble; } RX_BA_ENTRY_T, *P_RX_BA_ENTRY_T; /* The mailbox message (could be used for Host-To-Device or Device-To-Host Mailbox) */ @@ -626,8 +629,18 @@ typedef struct _EVENT_STA_UPDATE_FREE_QUOTA_T { UINT_8 aucReserved[1]; } EVENT_STA_UPDATE_FREE_QUOTA_T, *P_EVENT_STA_UPDATE_FREE_QUOTA_T; - - +typedef struct _EVENT_CHECK_REORDER_BUBBLE_T { + /* Event header */ + UINT_16 u2Length; + UINT_16 u2Reserved1; + /* Must be filled with 0x0001 (EVENT Packet) */ + UINT_8 ucEID; + UINT_8 ucSeqNum; + UINT_8 aucReserved2[2]; + /* Event Body */ + UINT_8 ucStaRecIdx; + UINT_8 ucTid; + } EVENT_CHECK_REORDER_BUBBLE_T, *P_EVENT_CHECK_REORDER_BUBBLE_T; /* WMM-2.2.1 WMM Information Element */ typedef struct _IE_WMM_INFO_T { @@ -987,19 +1000,23 @@ qmInsertFallAheadReorderPkt( IN P_RX_BA_ENTRY_T prReorderQueParm, OUT P_QUE_T prReturnedQue ); +BOOLEAN qmPopOutDueToFallWithin( + IN P_ADAPTER_T prAdapter, + IN P_RX_BA_ENTRY_T prReorderQueParm, + OUT P_QUE_T prReturnedQue); -BOOLEAN -qmPopOutDueToFallWithin( - IN P_RX_BA_ENTRY_T prReorderQueParm, - OUT P_QUE_T prReturnedQue - ); +VOID qmPopOutDueToFallAhead( + IN P_ADAPTER_T prAdapter, + IN P_RX_BA_ENTRY_T prReorderQueParm, + OUT P_QUE_T prReturnedQue); -VOID -qmPopOutDueToFallAhead( - IN P_RX_BA_ENTRY_T prReorderQueParm, - OUT P_QUE_T prReturnedQue - ); +VOID qmHandleReorderBubbleTimeout( + IN P_ADAPTER_T prAdapter, + IN UINT_32 u4Param); +VOID qmHandleEventCheckReorderBubble( + IN P_ADAPTER_T prAdapter, + IN P_WIFI_EVENT_T prEvent); VOID qmHandleMailboxRxMessage( diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic_cmd_event.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic_cmd_event.h index 40b8edc1cfa..0542fec72d4 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic_cmd_event.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/nic_cmd_event.h @@ -730,6 +730,8 @@ typedef enum _ENUM_CMD_ID_T { CMD_ID_SET_5G_EDGE_TXPWR_LIMIT, /* 0x3B (Set) */ CMD_ID_SET_RSSI_COMPENSATE, /* 0x3C (Set) */ CMD_ID_SET_BAND_SUPPORT = 0x3D, /* 0x3D (Set) */ + CMD_ID_SET_IPV6_ADDRESS = 0x4B, /* 0x4B (Set) */ + CMD_ID_SET_SYSTEM_SUSPEND = 0x60, /* 0x60 (Set) */ CMD_ID_GET_NIC_CAPABILITY = 0x80, /* 0x80 (Query) */ CMD_ID_GET_LINK_QUALITY, /* 0x81 (Query) */ CMD_ID_GET_STATISTICS, /* 0x82 (Query) */ @@ -752,6 +754,7 @@ typedef enum _ENUM_CMD_ID_T { CMD_ID_DUMP_MEM, /* 0xc8 (Query) */ CMD_ID_CHIP_CONFIG = 0xCA, /* 0xca (Set / Query) */ + CMD_ID_GET_TSF = 0xCB, /* 0xcb (Set / Query) */ #if CFG_SUPPORT_RDD_TEST_MODE CMD_ID_SET_RDD_CH = 0xE1, @@ -762,6 +765,7 @@ typedef enum _ENUM_CMD_ID_T { CMD_ID_SET_OSC = 0xf2, #endif CMD_ID_SET_ROAMING_INFO = 0xF3, + CMD_ID_ROAMING_CONTROL = 0xF4, #if CFG_SUPPORT_BUILD_DATE_CODE CMD_ID_GET_BUILD_DATE_CODE = 0xF8, @@ -826,6 +830,8 @@ typedef enum _ENUM_EVENT_ID_T { EVENT_ID_DUMP_MEM, EVENT_ID_STA_STATISTICS= 0x29, /* 0x29 (Query ) */ EVENT_ID_STA_STATISTICS_UPDATE, /* 0x2A (Unsolicited) */ + EVENT_ID_CHECK_REORDER_BUBBLE, /* 0x2B (Unsolicited) */ + EVENT_ID_TSF_GET = 0x37, EVENT_ID_TDLS = 0x80, EVENT_ID_STATS_ENV = 0x81, @@ -834,9 +840,7 @@ typedef enum _ENUM_EVENT_ID_T { #endif EVENT_ID_GET_AIS_BSS_INFO = 0xF9, EVENT_ID_DEBUG_CODE = 0xFB, - EVENT_ID_RFTEST_READY = 0xFC, /* 0xFC */ - - EVENT_ID_WARNING_TO_DRIVER = 0xFE, /* 0xFE, FW warning Log send to driver */ + EVENT_ID_RFTEST_READY = 0xFC /* 0xFC */ } ENUM_EVENT_ID_T, *P_ENUM_EVENT_ID_T; @@ -1287,10 +1291,25 @@ typedef struct _IPV4_NETWORK_ADDRESS { typedef struct _CMD_SET_NETWORK_ADDRESS_LIST { UINT_8 ucNetTypeIndex; UINT_8 ucAddressCount; - UINT_8 ucReserved[2]; + UINT_8 ucDtimSkipCount; + UINT_8 ucReserved[1]; IPV4_NETWORK_ADDRESS arNetAddress[1]; } CMD_SET_NETWORK_ADDRESS_LIST, *P_CMD_SET_NETWORK_ADDRESS_LIST; +/*CMD_SET_IPV6_ADDRESS*/ +typedef struct _IPV6_NETWORK_ADDRESS { + UINT_8 aucIpAddr[16]; +} IPV6_NETWORK_ADDRESS, *P_IPV6_NETWORK_ADDRESS; + +typedef struct _CMD_SET_IPV6_NETWORK_ADDRESS_LIST +{ + UINT_8 ucNetTypeIndex; + UINT_8 ucAddressCount; + UINT_8 ucReserved[2]; + IPV6_NETWORK_ADDRESS arNetAddress[1]; +} CMD_SET_IPV6_NETWORK_ADDRESS_LIST, *P_CMD_SET_IPV6_NETWORK_ADDRESS_LIST; + + typedef struct _PATTERN_DESCRIPTION { UINT_8 fgCheckBcA1; UINT_8 fgCheckMcA1; @@ -1358,7 +1377,7 @@ typedef struct _CMD_SET_BSS_INFO { UINT_16 u2OperationalRateSet; UINT_16 u2BSSBasicRateSet; UINT_8 ucStaRecIdxOfAP; - UINT_8 ucReserved2; + UINT_8 ucStaRecNoClear; UINT_8 ucReserved3; UINT_8 ucNonHTBasicPhyType; /* For Slot Time and CWmin */ UINT_8 ucAuthMode; @@ -1672,7 +1691,7 @@ typedef struct _CMD_EDGE_TXPWR_LIMIT_T { INT_8 cBandEdgeMaxPwrCCK; INT_8 cBandEdgeMaxPwrOFDM20; INT_8 cBandEdgeMaxPwrOFDM40; - INT_8 cReserved; + INT_8 cBandEdgeCert; } CMD_EDGE_TXPWR_LIMIT_T, *P_CMD_EDGE_TXPWR_LIMIT_T; typedef struct _CMD_RSSI_COMPENSATE_T { @@ -1862,12 +1881,17 @@ typedef struct _CMD_ROAMING_INFO_T { UINT_32 Reserved[9]; } CMD_ROAMING_INFO_T; -typedef struct _EVENT_LOG_TO_DRIVER_T { - UCHAR fileName[64]; - UINT_32 lineNo; - UINT_32 WifiUpTime; - UCHAR log[896]; /* total size is aucBuffer in WIFI_EVENT_T */ -} EVENT_LOG_TO_DRIVER_T, *P_EVENT_LOG_TO_DRIVER_T; +#define NUM_MAX_RESERVE_TSF 8 +typedef struct _CMD_TSF_GET_T { + UINT_32 au4LocalTsf[NUM_MAX_RESERVE_TSF][2]; + UINT_8 ucBssBmp; /*Bit0: AIS; Bit1: P2P*/ + UINT_8 ucReserved[3]; +} CMD_TSF_GET_T, *P_CMD_TSF_GET_T; + +typedef struct _WIFI_SYSTEM_SUSPEND_CMD_T { + BOOLEAN fgIsSystemSuspend; + UINT_8 reserved[3]; +} WIFI_SYSTEM_SUSPEND_CMD_T, *P_WIFI_SYSTEM_SUSPEND_CMD_T; /******************************************************************************* * P U B L I C D A T A @@ -2132,6 +2156,12 @@ nicCmdEventGetBSSInfo ( IN PUINT_8 pucEventBuf ); +VOID +nicCmdEventTsfRead ( + IN P_ADAPTER_T prAdapter, + IN P_CMD_INFO_T prCmdInfo, + IN PUINT_8 pucEventBuf + ); /******************************************************************************* * F U N C T I O N S diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/p2p_precomp.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/p2p_precomp.h index 892b5b714ba..c210dd54983 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/p2p_precomp.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/p2p_precomp.h @@ -73,8 +73,6 @@ /* Dependency: hif_rx.h (P_HIF_RX_HEADER_T) */ #include "nic_rx.h" -#include "que_mgt.h" - #if CFG_ENABLE_WIFI_DIRECT #include "p2p_typedef.h" #include "p2p_cmd_buf.h" @@ -121,6 +119,7 @@ #include "aa_fsm.h" #include "cnm_timer.h" +#include "que_mgt.h" #if CFG_ENABLE_BT_OVER_WIFI #include "bow.h" diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/precomp.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/precomp.h index 0514833ca81..5cde5275d94 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/precomp.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/precomp.h @@ -220,8 +220,6 @@ /* Dependency: hif_rx.h (P_HIF_RX_HEADER_T) */ #include "nic_rx.h" -#include "que_mgt.h" - #if CFG_ENABLE_WIFI_DIRECT #include "p2p_typedef.h" #include "p2p_cmd_buf.h" @@ -272,7 +270,7 @@ #include "aa_fsm.h" #include "cnm_timer.h" - +#include "que_mgt.h" #if CFG_ENABLE_BT_OVER_WIFI #include "bow.h" diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/typedef.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/typedef.h index c0e31a8bb93..71e80658221 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/typedef.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/typedef.h @@ -131,6 +131,8 @@ #define WLAN_STATUS_MEDIA_CONNECT ((WLAN_STATUS) 0x4001000BL) #define WLAN_STATUS_MEDIA_DISCONNECT ((WLAN_STATUS) 0x4001000CL) +#define WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY ((WLAN_STATUS) 0x4001000DL) + #define WLAN_STATUS_MEDIA_SPECIFIC_INDICATION ((WLAN_STATUS) 0x40010012L) #define WLAN_STATUS_SCAN_COMPLETE ((WLAN_STATUS) 0x60010001L) diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_lib.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_lib.h index 2bc375159d1..960d24d3aaa 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_lib.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_lib.h @@ -341,6 +341,7 @@ #define CSUM_OFFLOAD_EN_ALL BITS(0,6) /* TCP, UDP, IP Checksum */ +#define RX_LEN_MISMATCH BIT(8) #define RX_CS_TYPE_UDP BIT(7) #define RX_CS_TYPE_TCP BIT(6) #define RX_CS_TYPE_IPv6 BIT(5) @@ -635,6 +636,11 @@ typedef struct _PARAM_GET_STA_STATISTICS { UINT_32 u4TxAverageAirTime; + UINT_32 u4NetDevTxPkts; + UINT_32 u4NetDevTxBytes; + UINT_32 u4NetDevRxPkts; + UINT_32 u4NetDevRxBytes; + /* Global queue management statistic */ UINT_32 au4TcAverageQueLen[NUM_TC_RESOURCE_TO_STATISTICS]; UINT_32 au4TcCurrentQueLen[NUM_TC_RESOURCE_TO_STATISTICS]; @@ -643,6 +649,12 @@ typedef struct _PARAM_GET_STA_STATISTICS { UINT_8 au4Reserved[32]; } PARAM_GET_STA_STA_STATISTICS, *P_PARAM_GET_STA_STATISTICS; +typedef enum _ENUM_BAND_EDGE_CERT_T { + BAND_EDGE_CERT_FCC = 0, + BAND_EDGE_CERT_KCC = 1, + BAND_EDGE_CERT_NUM = 2 +} ENUM_BAND_EDGE_CERT_T, *P_ENUM_BAND_EDGE_CERT_T; + #if CFG_AUTO_CHANNEL_SEL_SUPPORT typedef struct _LTE_SAFE_CH_INFO_T { diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_oid.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_oid.h index de2027b9194..4d3e6df9087 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_oid.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/include/wlan_oid.h @@ -360,6 +360,16 @@ typedef struct _PARAM_SSID_T { UINT_8 aucSsid[PARAM_MAX_LEN_SSID]; } PARAM_SSID_T, *P_PARAM_SSID_T; +typedef struct _PARAM_CONNECT_T { + UINT_32 u4SsidLen; /*!< SSID length in bytes. Zero length is broadcast(any) SSID */ + UINT_8 *pucSsid; + UINT_8 *pucBssid; + UINT_32 u4CenterFreq; + UINT_8 ucSpecificChnl; + RF_CHANNEL_INFO_T rChannelInfo; + ENUM_CHNL_EXT_T eChnlSco; +} PARAM_CONNECT_T, *P_PARAM_CONNECT_T; + /* This is enum defined for user to select an AdHoc Mode */ typedef enum _ENUM_PARAM_AD_HOC_MODE_T { AD_HOC_MODE_11B = 0, /*!< Create 11b IBSS if we support 802.11abg/802.11bg. */ @@ -654,10 +664,10 @@ typedef struct _PARAM_PMKID_CANDIDATE_LIST_T } PARAM_PMKID_CANDIDATE_LIST_T, *P_PARAM_PMKID_CANDIDATE_LIST_T; //#endif -typedef struct _PARAM_CUSTOM_MCR_RW_STRUC_T { - UINT_32 u4McrOffset; - UINT_32 u4McrData; -} PARAM_CUSTOM_MCR_RW_STRUC_T, *P_PARAM_CUSTOM_MCR_RW_STRUC_T; +typedef struct _PARAM_CUSTOM_MCR_RW_STRUCT_T { + UINT_32 u4McrOffset; + UINT_32 u4McrData; +} PARAM_CUSTOM_MCR_RW_STRUCT_T, *P_PARAM_CUSTOM_MCR_RW_STRUCT_T; typedef struct _PARAM_CUSTOM_MEM_DUMP_STRUC_T { UINT_32 u4Address; @@ -667,10 +677,10 @@ typedef struct _PARAM_CUSTOM_MEM_DUMP_STRUC_T { } PARAM_CUSTOM_MEM_DUMP_STRUC_T, *P_PARAM_CUSTOM_MEM_DUMP_STRUC_T; -typedef struct _PARAM_CUSTOM_SW_CTRL_STRUC_T { +typedef struct _PARAM_CUSTOM_SW_CTRL_STRUCT_T { UINT_32 u4Id; UINT_32 u4Data; -} PARAM_CUSTOM_SW_CTRL_STRUC_T, *P_PARAM_CUSTOM_SW_CTRL_STRUC_T; +} PARAM_CUSTOM_SW_CTRL_STRUCT_T, *P_PARAM_CUSTOM_SW_CTRL_STRUCT_T; typedef struct _CMD_CHIP_CONFIG_T { @@ -866,6 +876,13 @@ typedef struct _PARAM_NETWORK_ADDRESS_IP UINT_8 sin_zero[8]; } PARAM_NETWORK_ADDRESS_IP, *P_PARAM_NETWORK_ADDRESS_IP; +typedef struct _PARAM_NETWORK_ADDRESS_IPV6 +{ + UINT_16 sin_port; + UINT_8 addr[16]; +} PARAM_NETWORK_ADDRESS_IPV6, *P_PARAM_NETWORK_ADDRESS_IPV6; + + typedef struct _PARAM_NETWORK_ADDRESS { UINT_16 u2AddressLength; // length in bytes of Address[] in this UINT_16 u2AddressType; // type of this address (PARAM_PROTOCOL_ID_XXX above) @@ -1040,6 +1057,13 @@ typedef struct _PARAM_SCAN_REQUEST_EXT_T { PUINT_8 pucIE; } PARAM_SCAN_REQUEST_EXT_T, *P_PARAM_SCAN_REQUEST_EXT_T; +struct PARAM_SCAN_REQUEST_ADV_T { + UINT_32 u4SsidNum; + PARAM_SSID_T rSsid[CFG_SCAN_SSID_MAX_NUM]; + UINT_32 u4IELength; + PUINT_8 pucIE; +}; + #if CFG_SUPPORT_HOTSPOT_2_0 typedef struct _PARAM_HS20_SET_BSSID_POOL { BOOLEAN fgIsEnable; @@ -1121,6 +1145,14 @@ wlanoidSetBssidListScanExt ( OUT PUINT_32 pu4SetInfoLen ); +WLAN_STATUS +wlanoidSetBssidListScanAdv( + IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen +); + WLAN_STATUS wlanoidQueryBssidList( IN P_ADAPTER_T prAdapter, @@ -1145,6 +1177,14 @@ wlanoidSetSsid( OUT PUINT_32 pu4SetInfoLen ); +WLAN_STATUS +wlanoidSetConnect( + IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen + ); + WLAN_STATUS wlanoidQuerySsid( IN P_ADAPTER_T prAdapter, @@ -1796,6 +1836,14 @@ wlanoidSetNetworkAddress ( OUT PUINT_32 pu4SetInfoLen ); +WLAN_STATUS +wlanoidSetIPv6NetworkAddress( + IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen + ); + WLAN_STATUS wlanoidQueryMaxFrameSize ( IN P_ADAPTER_T prAdapter, @@ -1988,6 +2036,14 @@ wlanoidQueryEepromType( OUT PUINT_32 pu4QueryInfoLen ); +WLAN_STATUS +wlanoidGetCountryCode( + IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen + ); + WLAN_STATUS wlanoidSetCountryCode ( IN P_ADAPTER_T prAdapter, @@ -1996,6 +2052,12 @@ wlanoidSetCountryCode ( OUT PUINT_32 pu4SetInfoLen ); +WLAN_STATUS +wlanoidUpdatePowerTable(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen); + WLAN_STATUS wlanSendMemDumpCmd ( IN P_ADAPTER_T prAdapter, @@ -2171,6 +2233,20 @@ wlanoidSetRoamingInfo ( OUT PUINT_32 pu4QueryInfoLen ); +WLAN_STATUS +wlanoidGetRoamParams(IN P_ADAPTER_T prAdapter, + OUT PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen); + +WLAN_STATUS +wlanoidSetRoamParams(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen); + +WLAN_STATUS +wlanoidSetForceRoam(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen); + +extern VOID wlanUpdateChannelTable(P_GLUE_INFO_T prGlueInfo); + /******************************************************************************* * F U N C T I O N S ******************************************************************************** @@ -2184,5 +2260,18 @@ wlanoidSetChipConfig( OUT PUINT_32 pu4SetInfoLen ); +WLAN_STATUS +wlanoidQueryTsf ( + IN P_ADAPTER_T prAdapter, + IN PVOID pvQueryBuffer, + IN UINT_32 u4QueryBufferLen, + OUT PUINT_32 pu4QueryInfoLen + ); + +WLAN_STATUS +wlanoidNotifyFwSuspend(IN P_ADAPTER_T prAdapter, + IN PVOID pvSetBuffer, + IN UINT_32 u4SetBufferLen, + OUT PUINT_32 pu4SetInfoLen); #endif /* _WLAN_OID_H */ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/ais_fsm.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/ais_fsm.c index c37ec67f1a9..4a3feb4cd47 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/ais_fsm.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/ais_fsm.c @@ -1070,7 +1070,10 @@ aisInitializeConnectionSettings ( prConnSettings->fgIsScanReqIssued = FALSE; - /* MIB attributes */ + prConnSettings->fgSpecificChnl = FALSE; + kalMemZero(&prConnSettings->rSpecificRfChnlInfo, sizeof(RF_CHANNEL_INFO_T)); + + /* MIB attributes */ prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT; prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT; @@ -1892,7 +1895,7 @@ aisFsmSteps ( P_CONNECTION_SETTINGS_T prConnSettings; P_BSS_DESC_T prBssDesc; P_MSG_CH_REQ_T prMsgChReq; - P_MSG_SCN_SCAN_REQ prScanReqMsg; + P_MSG_SCN_SCAN_REQ_V2 prScanReqMsg; P_AIS_REQ_HDR_T prAisReq; ENUM_BAND_T eBand; UINT_8 ucChannel; @@ -2271,7 +2274,7 @@ aisFsmSteps ( #endif } - prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter, + prScanReqMsg = (P_MSG_SCN_SCAN_REQ_V2)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen); if (!prScanReqMsg) { @@ -2279,7 +2282,7 @@ aisFsmSteps ( return; } - prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ; + prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ_V2; prScanReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfScanReq; prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX; @@ -2299,28 +2302,45 @@ aisFsmSteps ( } #endif /* CFG_SUPPORT_ROAMING_ENC */ - if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN - || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) { - if(prAisFsmInfo->ucScanSSIDLen == 0) { - /* Scan for all available SSID */ - prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD; - } - else { - prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED; - COPY_SSID(prScanReqMsg->aucSSID, - prScanReqMsg->ucSSIDLength, - prAisFsmInfo->aucScanSSID, - prAisFsmInfo->ucScanSSIDLen); - } - } - else { - /* Scan for determined SSID */ - prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED; - COPY_SSID(prScanReqMsg->aucSSID, - prScanReqMsg->ucSSIDLength, - prConnSettings->aucSSID, - prConnSettings->ucSSIDLen); - } + if (prAisFsmInfo->eCurrentState == AIS_STATE_SCAN + || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) { + if (prAisFsmInfo->ucScanSSIDNum == 0) { + prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN; + + prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD; + prScanReqMsg->ucSSIDNum = 0; + } + else if (prAisFsmInfo->ucScanSSIDNum == 1 + && prAisFsmInfo->arScanSSID[0].u4SsidLen == 0) { + prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN; + + prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD; + prScanReqMsg->ucSSIDNum = 0; + } + else { + prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN; + + prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED; + prScanReqMsg->ucSSIDNum = prAisFsmInfo->ucScanSSIDNum; + prScanReqMsg->prSsid = prAisFsmInfo->arScanSSID; + } + } + else { + prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN; + + COPY_SSID(prAisFsmInfo->rRoamingSSID.aucSsid, + prAisFsmInfo->rRoamingSSID.u4SsidLen, + prConnSettings->aucSSID, prConnSettings->ucSSIDLen); + + /* Scan for determined SSID */ + prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED; + prScanReqMsg->ucSSIDNum = 1; + prScanReqMsg->prSsid = &(prAisFsmInfo->rRoamingSSID); + } + + /* using default channel dwell time/timeout value */ + prScanReqMsg->u2ProbeDelay = 0; + prScanReqMsg->u2ChannelDwellTime = 0; /* check if tethering is running and need to fix on specific channel */ if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) { @@ -2330,8 +2350,17 @@ aisFsmSteps ( = eBand;; prScanReqMsg->arChnlInfoList[0].ucChannelNum = ucChannel; - } - else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) { + } else if ((prConnSettings->fgSpecificChnl) && + (!prConnSettings->fgIsScanReqIssued)) { + prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED; + prScanReqMsg->ucChannelListNum = 1; + kalMemCopy(&prScanReqMsg->arChnlInfoList[0], + &prConnSettings->rSpecificRfChnlInfo, + sizeof(RF_CHANNEL_INFO_T)); + prScanReqMsg->u2ChannelDwellTime = SCAN_ONE_CHNL_DEFAULT_DWELL_TIME; + /* Disable specific channel scan when connection retry fail */ + prConnSettings->fgSpecificChnl = FALSE; + } else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) { if(prAdapter->fgEnable5GBand == TRUE) { prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL; } @@ -2367,7 +2396,7 @@ aisFsmSteps ( MBOX_ID_0, (P_MSG_HDR_T) prScanReqMsg, MSG_SEND_METHOD_BUF); - DBGLOG(AIS, WARN, ("SendSR%d\n", prScanReqMsg->ucSeqNum)); + DBGLOG(AIS, INFO, ("SendSR%d\n", prScanReqMsg->ucSeqNum)); prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */ prAdapter->ucScanTime ++; @@ -2527,7 +2556,7 @@ aisFsmRunEventScanDone ( ASSERT(prAdapter); ASSERT(prMsgHdr); - DBGLOG(AIS, WARN, ("ScanDone\n")); + DBGLOG(AIS, INFO, ("ScanDone\n")); DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %u\n", kalGetTimeTick())); @@ -2657,6 +2686,21 @@ aisFsmRunEventAbort ( else { prConnSettings->fgIsDisconnectedByNonRequest = FALSE; } + /* to support user space triggered roaming */ + if (ucReasonOfDisconnect == DISCONNECT_REASON_CODE_REASSOCIATION && + prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) { + + if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && + prAisFsmInfo->fgIsInfraChannelFinished == TRUE) { + aisFsmSteps(prAdapter, AIS_STATE_SEARCH); + } + else { + aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE); + aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE); + aisFsmInsertRequest(prAdapter, AIS_REQUEST_ROAMING_CONNECT); + } + return; + } aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE); aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT); @@ -2920,10 +2964,23 @@ aisFsmRunEventJoinComplete ( nicEnterCtiaMode(prAdapter, TRUE, FALSE); } } +#if CFG_SUPPORT_ROAMING +#ifndef CONFIG_CFG80211_ALLOW_RECONNECT + if (prAdapter->rWifiVar.rConnSettings.eConnectionPolicy == CONNECT_BY_BSSID && + prAdapter->rWifiVar.rConnSettings.fgIsConnByBssidIssued) { + prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI; + prAdapter->rWifiVar.rConnSettings.fgIsConnByBssidIssued = FALSE; + } +#endif +#endif } #if CFG_SUPPORT_ROAMING - roamingFsmRunEventStart(prAdapter); + /* if bssid is given, it means we no need fw roaming */ +#ifdef CONFIG_CFG80211_ALLOW_RECONNECT + if (prAdapter->rWifiVar.rConnSettings.eConnectionPolicy != CONNECT_BY_BSSID) +#endif + roamingFsmRunEventStart(prAdapter); #endif /* CFG_SUPPORT_ROAMING */ //4 <1.7> Set the Next State of AIS FSM @@ -2970,6 +3027,15 @@ aisFsmRunEventJoinComplete ( // ASSERT(prBssDesc); // ASSERT(prBssDesc->fgIsConnecting); + prBssDesc->ucJoinFailureCount++; + if (prBssDesc->ucJoinFailureCount >= SCN_BSS_JOIN_FAIL_THRESOLD) { + GET_CURRENT_SYSTIME(&prBssDesc->rJoinFailTime); + DBGLOG(AIS, INFO, + ("Bss %pM join fail %d times,temp disable it at time:%u\n", + prBssDesc->aucBSSID, + SCN_BSS_JOIN_FAIL_THRESOLD, prBssDesc->rJoinFailTime)); + } + if(prBssDesc) { prBssDesc->fgIsConnecting = FALSE; } @@ -3232,7 +3298,7 @@ aisFsmRunEventFoundIBSSPeer ( prStaRec->fgIsMerging = FALSE; //4 <1.6> sync. to firmware - nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX, STA_REC_INDEX_NOT_FOUND); //4 <1.7> Indicate Connected Event to Host immediately. aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE); @@ -3579,6 +3645,7 @@ aisUpdateBssInfoForJOIN ( if(prBssDesc) { prBssDesc->fgIsConnecting = FALSE; prBssDesc->fgIsConnected = TRUE; + prBssDesc->ucJoinFailureCount = 0; //4 <4.1> Setup MIB for current BSS prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval; @@ -3601,7 +3668,7 @@ aisUpdateBssInfoForJOIN ( rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength); //4 <4.3> Sync with firmware for BSS-INFO - nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX, STA_REC_INDEX_NOT_FOUND); //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked //inside scanProcessBeaconAndProbeResp() after 1st beacon is received @@ -3700,7 +3767,7 @@ aisUpdateBssInfoForCreateIBSS ( rlmBssInitForAPandIbss(prAdapter, prAisBssInfo); //4 <3.2> use command packets to inform firmware - nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX, STA_REC_INDEX_NOT_FOUND); //4 <3.3> enable beaconing bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX); @@ -3861,7 +3928,7 @@ aisUpdateBssInfoForMergeIBSS ( rlmBssInitForAPandIbss(prAdapter, prAisBssInfo); //4 <5.3> use command packets to inform firmware - nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX, STA_REC_INDEX_NOT_FOUND); //4 <5.4> enable beaconing bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX); @@ -4033,7 +4100,7 @@ aisFsmDisconnect ( aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED); //4 <4.1> sync. with firmware - nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX, STA_REC_INDEX_NOT_FOUND); } if (!fgDelayIndication) { @@ -4407,15 +4474,17 @@ aisFsmScanRequest ( if (!prConnSettings->fgIsScanReqIssued) { prConnSettings->fgIsScanReqIssued = TRUE; - if(prSsid == NULL) { - prAisFsmInfo->ucScanSSIDLen = 0; - } - else { - COPY_SSID(prAisFsmInfo->aucScanSSID, - prAisFsmInfo->ucScanSSIDLen, - prSsid->aucSsid, - (UINT_8)prSsid->u4SsidLen); - } + if (prSsid == NULL) { + prAisFsmInfo->ucScanSSIDNum = 0; + } + else { + prAisFsmInfo->ucScanSSIDNum = 1; + + COPY_SSID(prAisFsmInfo->arScanSSID[0].aucSsid, + prAisFsmInfo->arScanSSID[0].u4SsidLen, + prSsid->aucSsid, + prSsid->u4SsidLen); + } if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) { prAisFsmInfo->u4ScanIELength = u4IeLength; @@ -4459,6 +4528,99 @@ aisFsmScanRequest ( } /* end of aisFsmScanRequest() */ +/*----------------------------------------------------------------------------*/ +/*! +* \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN +* +* \param[in] prAdapter Pointer of ADAPTER_T +* \param[in] ucSsidNum Number of SSID +* \param[in] prSsid Pointer to the array of SSID_T if specified +* \param[in] pucIe Pointer to buffer of extra information elements to be attached +* \param[in] u4IeLength Length of information elements +* +* \return none +*/ +/*----------------------------------------------------------------------------*/ +VOID +aisFsmScanRequestAdv( + IN P_ADAPTER_T prAdapter, + IN UINT_8 ucSsidNum, + IN P_PARAM_SSID_T prSsid, + IN PUINT_8 pucIe, + IN UINT_32 u4IeLength +) +{ + UINT_32 i; + P_CONNECTION_SETTINGS_T prConnSettings; + P_BSS_INFO_T prAisBssInfo; + P_AIS_FSM_INFO_T prAisFsmInfo; + + DEBUGFUNC("aisFsmScanRequestAdv()"); + + ASSERT(prAdapter); + ASSERT(ucSsidNum <= SCN_SSID_MAX_NUM); + ASSERT(u4IeLength <= MAX_IE_LENGTH); + + prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]); + prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo); + prConnSettings = &(prAdapter->rWifiVar.rConnSettings); + + if (!prConnSettings->fgIsScanReqIssued) { + prConnSettings->fgIsScanReqIssued = TRUE; + + if (ucSsidNum == 0) + prAisFsmInfo->ucScanSSIDNum = 0; + else { + + prAisFsmInfo->ucScanSSIDNum = ucSsidNum; + + for (i = 0; i < ucSsidNum; i++) { + COPY_SSID(prAisFsmInfo->arScanSSID[i].aucSsid, + prAisFsmInfo->arScanSSID[i].u4SsidLen, + prSsid[i].aucSsid, + prSsid[i].u4SsidLen); + } + } + + if (u4IeLength > 0) { + prAisFsmInfo->u4ScanIELength = u4IeLength; + kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength); + } + else + prAisFsmInfo->u4ScanIELength = 0; + + if (prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) { + if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE + && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) { + /* 802.1x might not finished yet, pend it for later handling ..*/ + aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN); + } + else { + if (prAisFsmInfo->fgIsChannelGranted == TRUE) { + DBGLOG(AIS, WARN, + ("Scan Request with channel granted for join operation: %d, %d", + prAisFsmInfo->fgIsChannelGranted, + prAisFsmInfo->fgIsChannelRequested)); + } + + /* start online scan */ + wlanClearScanningResult(prAdapter); + aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN); + } + } + else if (prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) { + wlanClearScanningResult(prAdapter); + aisFsmSteps(prAdapter, AIS_STATE_SCAN); + } + else + aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN); + } + else + DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", + prAisFsmInfo->eCurrentState)); + +} /* end of aisFsmScanRequestAdv() */ + /*----------------------------------------------------------------------------*/ /*! * \brief This function is invoked when CNM granted channel privilege @@ -4862,7 +5024,7 @@ aisFsmRoamingDisconnectPrevAP ( //4 <4.1> sync. with firmware prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */ - nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX, prTargetStaRec->ucIndex); prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */ #if (CFG_SUPPORT_TDLS == 1) diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/assoc.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/assoc.c index 1d4dbc55b44..158b78d3e22 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/assoc.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/assoc.c @@ -391,6 +391,8 @@ Add per station flow control when STA is in PS * P U B L I C D A T A ******************************************************************************** */ +#define MAX_DTIM_SKIP_COUNT 6 + APPEND_VAR_IE_ENTRY_T txAssocReqIETable[] = { { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP), NULL, rlmReqGenerateHtCapIE },/* 45 */ #if CFG_SUPPORT_WPS2 @@ -766,7 +768,7 @@ assocComposeReAssocReqFrameHeaderAndFF ( UINT_16 u2FrameCtrl; UINT_16 u2CapInfo; UINT_16 u2ListenInterval; - + P_BSS_DESC_T prTargetBssDesc = NULL; ASSERT(prStaRec); ASSERT(pucBuffer); @@ -805,16 +807,25 @@ assocComposeReAssocReqFrameHeaderAndFF ( /* Fill the Capability Information field. */ WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo); + /* Dynamic adjust the listen interval, just ensure that the minimal.*/ + /* listen interval * beacon interval no less than 600ms*/ + DBGLOG(SAA, TRACE, ("Use Dynamic DTIM skip count\n")); + u2ListenInterval = MAX_DTIM_SKIP_COUNT; + if (IS_STA_IN_AIS(prStaRec)) { + prTargetBssDesc = scanSearchBssDescByBssid(prAdapter, + prAssocFrame->aucBSSID); + if (prTargetBssDesc == NULL) { + DBGLOG(SAA, ERROR, ("BSS not exist!!\n")); + } else { + if (prTargetBssDesc->u2BeaconInterval >= 600) + u2ListenInterval = 1; + else if (prTargetBssDesc->u2BeaconInterval >= 300) + u2ListenInterval = 2; + else if (prTargetBssDesc->u2BeaconInterval >= 200) + u2ListenInterval = 3; + } + } - /* Calculate the listen interval for the maximum power mode. Currently, we - set it to the value 2 times DTIM period. */ - if (prStaRec->ucDTIMPeriod) { - u2ListenInterval = prStaRec->ucDTIMPeriod * DEFAULT_LISTEN_INTERVAL_BY_DTIM_PERIOD; - } - else { - DBGLOG(SAA, TRACE, ("Use default listen interval\n")); - u2ListenInterval = DEFAULT_LISTEN_INTERVAL; - } prStaRec->u2ListenInterval = u2ListenInterval; /* Fill the Listen Interval field. */ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/auth.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/auth.c index ad8d7a9fc7b..60d3a6958bf 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/auth.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/auth.c @@ -797,7 +797,8 @@ authCheckRxAuthFrameStatus ( if (u2RxAuthAlgNum != (UINT_16)prStaRec->ucAuthAlgNum) { DBGLOG(SAA, LOUD, ("Discard Auth frame with auth type = %d, current = %d\n", u2RxAuthAlgNum, prStaRec->ucAuthAlgNum)); - return WLAN_STATUS_FAILURE; + *pu2StatusCode = STATUS_CODE_AUTH_ALGORITHM_NOT_SUPPORTED; + return WLAN_STATUS_SUCCESS; } //WLAN_GET_FIELD_16(&prAuthFrame->u2AuthTransSeqNo, &u2RxTransactionSeqNum); @@ -805,7 +806,8 @@ authCheckRxAuthFrameStatus ( if (u2RxTransactionSeqNum != u2TransactionSeqNum) { DBGLOG(SAA, LOUD, ("Discard Auth frame with Transaction Seq No = %d\n", u2RxTransactionSeqNum)); - return WLAN_STATUS_FAILURE; + *pu2StatusCode = STATUS_CODE_AUTH_OUT_OF_SEQ; + return WLAN_STATUS_SUCCESS; } //4 <3> Get the Status code diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/cnm.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/cnm.c index 1b8efbf35c9..9a0753c2c3d 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/cnm.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/cnm.c @@ -771,6 +771,7 @@ cnmBss40mBwPermitted ( { P_BSS_INFO_T prBssInfo; UINT_8 i; + P_BSS_DESC_T prBssDesc = NULL; /* Note: To support real-time decision instead of current activated-time, * the STA roaming case shall be considered about synchronization @@ -788,6 +789,18 @@ cnmBss40mBwPermitted ( } } + if (eNetTypeIdx == NETWORK_TYPE_AIS_INDEX) + prBssDesc = prAdapter->rWifiVar.rAisFsmInfo.prTargetBssDesc; + else if ((eNetTypeIdx == NETWORK_TYPE_P2P_INDEX) && (prAdapter->rWifiVar.prP2pFsmInfo)) + prBssDesc = prAdapter->rWifiVar.prP2pFsmInfo->prTargetBss; + if (prBssDesc) { +#if (CFG_FORCE_USE_20BW == 1) + if (prBssDesc->eBand == BAND_2G4) + return FALSE; +#endif + if (prBssDesc->eSco == CHNL_EXT_SCN) + return FALSE; + } return TRUE; } diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_fsm.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_fsm.c index 1c125f2c5d9..b8042ff74eb 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_fsm.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_fsm.c @@ -2441,7 +2441,7 @@ p2pFsmRunEventDeauthTxDone ( /* Because the eConnectionState is changed before Deauth TxDone. Dont Check eConnectionState */ //if (eOriMediaStatus != prP2pBssInfo->eConnectionState) { /* Update Disconnected state to FW. */ - nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX, STA_REC_INDEX_NOT_FOUND); //} @@ -2579,24 +2579,7 @@ p2pFsmRunEventJoinComplete ( prJoinInfo->aucIEBuf, prJoinInfo->u4BufLength, prStaRec->u2StatusCode); - /* ALPS01912628 */ - /* Driver will not CMD_ID_INDICATE_PM_BSS_CONNECT to firmware due to not RX beacon - * firmware will report beacon timeout with TYPE=2 to driver ; here just stop the beacon timeout - * TYPE=2 timer. Driver will update the DTIMPeriod late if RX beacon - */ - if (!prP2pBssInfo->fgIsIndicatedPMBssConn) { - if (prP2pBssInfo->ucDTIMPeriod == 0) - if (prP2pFsmInfo->prTargetBss) - /* get DTIMPeriod of targetBss, driver will update later if RX beacon */ - prP2pBssInfo->ucDTIMPeriod = prP2pFsmInfo->prTargetBss->ucDTIMPeriod; - else - prP2pBssInfo->ucDTIMPeriod = 1; /* assign 1, driver will update later if RX beacon */ - nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_P2P_INDEX); - DBGLOG(P2P, INFO, ("P2P: GC join success, indicate BSS connect, DTIMPeriod %d from: %s\n", - prP2pBssInfo->ucDTIMPeriod, prP2pFsmInfo->prTargetBss? "TargetBss":"Pickup")); - prP2pBssInfo->fgIsIndicatedPMBssConn = TRUE; - prP2pBssInfo->ucDTIMPeriod = 0; /* give driver a chance to update later if RX beacon */ - } + } else { /* Join Fail*/ @@ -3332,7 +3315,7 @@ p2pRunEventAAAComplete ( /* Update Connected state to FW. */ if (eOriMediaState != prP2pBssInfo->eConnectionState) { - nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX, STA_REC_INDEX_NOT_FOUND); } } while (FALSE); diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_func.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_func.c index 9adcd80d2cf..b71850d992e 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_func.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_func.c @@ -304,7 +304,7 @@ p2pFuncSwitchOPMode ( /* Update BSS INFO to FW. */ if ((fgSyncToFW) && (eOpMode != OP_MODE_ACCESS_POINT)) { - nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX, STA_REC_INDEX_NOT_FOUND); } } @@ -426,7 +426,7 @@ p2pFuncStartGO ( rlmBssInitForAPandIbss(prAdapter, prBssInfo); //4 <3.2> Reset HW TSF Update Mode and Beacon Mode - nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX, STA_REC_INDEX_NOT_FOUND); //4 <3.3> Update Beacon again for network phy type confirmed. bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX); @@ -1089,7 +1089,7 @@ p2pFuncDisconnect ( if (eOriMediaStatus != prP2pBssInfo->eConnectionState) { /* Update Disconnected state to FW. */ - nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX, STA_REC_INDEX_NOT_FOUND); } } @@ -1098,8 +1098,6 @@ p2pFuncDisconnect ( /* GO: It would stop Beacon TX. GC: Stop all BSS related PS function. */ nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_P2P_INDEX); - prP2pBssInfo->fgIsIndicatedPMBssConn = FALSE; - /* Reset RLM related field of BSSINFO. */ rlmBssAborted(prAdapter, prP2pBssInfo); } @@ -1427,7 +1425,7 @@ p2pFuncUpdateBssInfoForJOIN ( rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength); //4 <4.3> Sync with firmware for BSS-INFO - nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX); + nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX, STA_REC_INDEX_NOT_FOUND); //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked //inside scanProcessBeaconAndProbeResp() after 1st beacon is received @@ -1465,7 +1463,7 @@ p2pFuncValidateAuth ( P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL; P_WLAN_AUTH_FRAME_T prAuthFrame = (P_WLAN_AUTH_FRAME_T)NULL; - DBGLOG(P2P, TRACE, ("p2pValidate Authentication Frame\n")) + DBGLOG(P2P, TRACE, ("p2pValidate Authentication Frame\n")); do { ASSERT_BREAK((prAdapter != NULL) && diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_scan.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_scan.c index b60b4270712..0b0e31b4e67 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_scan.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/p2p_scan.c @@ -674,8 +674,6 @@ scanP2pProcessBeaconAndProbeResp( prP2pConnSettings->ucSSIDLen))) {// SSID Match prP2pBssInfo->ucDTIMPeriod = prBssDesc->ucDTIMPeriod; nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_P2P_INDEX); - DBGLOG(P2P, INFO, ("P2P: Indicate BSS connect, DTIMPeriod %d\n", prBssDesc->ucDTIMPeriod)); - prP2pBssInfo->fgIsIndicatedPMBssConn = TRUE; } do { @@ -696,7 +694,7 @@ scanP2pProcessBeaconAndProbeResp( rChannelInfo.eBand = prBssDesc->eBand; prBssDesc->fgIsP2PReport = TRUE; - DBGLOG(P2P, INFO, ("indicate %s [%d]\n", prBssDesc->aucSSID,prBssDesc->ucChannelNum)); + DBGLOG(P2P, TRACE, ("indicate %s [%d]\n", prBssDesc->aucSSID,prBssDesc->ucChannelNum)); kalP2PIndicateBssInfo(prAdapter->prGlueInfo, (PUINT_8)prSwRfb->pvHeader, diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/privacy.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/privacy.c index b273586160f..8ce2543083e 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/privacy.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/privacy.c @@ -559,7 +559,7 @@ secTxPortControlCheck( if (IS_STA_IN_AIS(prStaRec)) { if (!prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist && (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION1_ENABLED)){ - DBGLOG(INIT, TRACE, ("Drop Tx packet due the key is removed!!!\n")); + DBGLOG(INIT, INFO, ("Drop Tx packet due the key is removed!!!\n")); return FALSE; } } diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm.c index a75deef584d..ca998d9eef6 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm.c @@ -1636,9 +1636,13 @@ rlmProcessAssocRsp ( prBssInfo->fgUseShortSlotTime = (prBssInfo->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME) ? TRUE : FALSE; - if ((ucPriChannel = - rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength)) > 0) { - prBssInfo->ucPrimaryChannel = ucPriChannel; + ucPriChannel = + rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength); + + if (prBssInfo->ucPrimaryChannel != ucPriChannel) { + DBGLOG(RLM, INFO, + ("Use RF pri channel[%u].Pri channel in HT OP IE is :[%u]\n", prBssInfo->ucPrimaryChannel, + ucPriChannel)); } if (!RLM_NET_IS_11N(prBssInfo) || @@ -1995,7 +1999,7 @@ rlmProcessChannelSwitchIE( prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]); printk("[5G DFS] switch channel [%d]->[%d] \r\n", prAisBssInfo->ucPrimaryChannel, prChannelSwitchIE->ucNewChannelNum); prAisBssInfo->ucPrimaryChannel = prChannelSwitchIE->ucNewChannelNum; - nicUpdateBss(prAdapter, prAisBssInfo->ucNetTypeIndex); + nicUpdateBss(prAdapter, prAisBssInfo->ucNetTypeIndex, STA_REC_INDEX_NOT_FOUND); } return; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm_domain.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm_domain.c index 0f331b4c792..75a0402842e 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm_domain.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rlm_domain.c @@ -140,8 +140,7 @@ static const UINT_16 g_u2CountryGroup1[] = { COUNTRY_CODE_AS, COUNTRY_CODE_AI, COUNTRY_CODE_BM, COUNTRY_CODE_CA, COUNTRY_CODE_KY, COUNTRY_CODE_GU, COUNTRY_CODE_FM, COUNTRY_CODE_PR, - COUNTRY_CODE_US, COUNTRY_CODE_VI, - + COUNTRY_CODE_US, COUNTRY_CODE_VI, COUNTRY_CODE_EL, COUNTRY_CODE_PZ, }; static const UINT_16 g_u2CountryGroup2[] = { COUNTRY_CODE_AR, COUNTRY_CODE_AU, COUNTRY_CODE_AZ, COUNTRY_CODE_BW, @@ -181,7 +180,7 @@ static const UINT_16 g_u2CountryGroup5[] = COUNTRY_CODE_TR, COUNTRY_CODE_TC, COUNTRY_CODE_GB, COUNTRY_CODE_VA, COUNTRY_CODE_FR }; -static const UINT_16 g_u2CountryGroup6[] = {COUNTRY_CODE_JP}; +static const UINT_16 g_u2CountryGroup6[] = {COUNTRY_CODE_JP, COUNTRY_CODE_UK}; static const UINT_16 g_u2CountryGroup7[] = { COUNTRY_CODE_AM, COUNTRY_CODE_IL, COUNTRY_CODE_KW, COUNTRY_CODE_MA, @@ -237,8 +236,12 @@ static const UINT_16 g_u2CountryGroup21[] = COUNTRY_CODE_UDF }; +static const UINT_16 g_u2CountryGroup22[] = +{ + COUNTRY_CODE_WW +}; -#define REG_DOMAIN_DEF_IDX 20 /* EU (Europe Union) */ +#define REG_DOMAIN_DEF_IDX 22 /* WW (World Wide) */ DOMAIN_INFO_ENTRY arSupportedRegDomains[] = { { @@ -259,8 +262,10 @@ DOMAIN_INFO_ENTRY arSupportedRegDomains[] = { { 81, BAND_2G4, CHNL_SPAN_5, 1, 11, FALSE }, /* CH_SET_2G4_1_11 */ { 115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE }, /* CH_SET_UNII_LOW_36_48 */ +#if !CFG_CUSTOM_REG { 118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE }, /* CH_SET_UNII_MID_52_64 */ { 121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE }, /* CH_SET_UNII_WW_100_144 */ +#endif { 125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE }, /* CH_SET_UNII_UPPER_149_165 */ { 0, BAND_NULL, 0, 0, 0, FALSE } } @@ -307,8 +312,10 @@ DOMAIN_INFO_ENTRY arSupportedRegDomains[] = { { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */ { 115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE }, /* CH_SET_UNII_LOW_36_48 */ +#if !CFG_CUSTOM_REG { 118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE }, /* CH_SET_UNII_MID_52_64 */ { 121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE }, /* CH_SET_UNII_WW_100_140 */ +#endif { 125, BAND_NULL, 0, 0, 0, FALSE }, /* CH_SET_UNII_UPPER_NA */ { 0, BAND_NULL, 0, 0, 0, FALSE } } @@ -317,11 +324,13 @@ DOMAIN_INFO_ENTRY arSupportedRegDomains[] = { (PUINT_16) g_u2CountryGroup6, sizeof(g_u2CountryGroup6) / 2, { { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */ - { 82, BAND_2G4, CHNL_SPAN_5, 14, 1, FALSE }, /* CH_SET_2G4_14_14 */ { 115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE }, /* CH_SET_UNII_LOW_36_48 */ +#if !CFG_CUSTOM_REG { 118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE }, /* CH_SET_UNII_MID_52_64 */ { 121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE }, /* CH_SET_UNII_WW_100_140 */ +#endif { 125, BAND_NULL, 0, 0, 0, FALSE }, /* CH_SET_UNII_UPPER_NA*/ + { 0, BAND_NULL, 0, 0, 0, FALSE } } }, { @@ -487,8 +496,10 @@ DOMAIN_INFO_ENTRY arSupportedRegDomains[] = { { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */ { 115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE }, /* CH_SET_UNII_LOW_36_48 */ +#if !CFG_CUSTOM_REG { 118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE }, /* CH_SET_UNII_MID_52_64 */ { 121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE }, /* CH_SET_UNII_WW_100_144 */ +#endif { 125, BAND_5G, CHNL_SPAN_20, 149, 7, FALSE }, /* CH_SET_UNII_UPPER_149_173 */ { 0, BAND_NULL, 0, 0, 0, FALSE } } @@ -505,48 +516,114 @@ DOMAIN_INFO_ENTRY arSupportedRegDomains[] = { { 125, BAND_5G, CHNL_SPAN_20, 149, 0, FALSE }, { 0, BAND_NULL, 0, 0, 0, FALSE } } + }, + { + /* Note: World Wide Region now, add CH14 by default according to Amazon's request */ + (PUINT_16) g_u2CountryGroup22, sizeof(g_u2CountryGroup22) / 2, + { + { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_14 */ + + { 115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE }, +#if !CFG_CUSTOM_REG + { 118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE }, + { 121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE }, +#endif + { 125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE }, + { 0, BAND_NULL, 0, 0, 0, FALSE } + } } }; #define REG_DOMAIN_PASSIVE_DEF_IDX 0 +#define REG_DOMAIN_PASSIVE_GROUP_NUM \ + (sizeof(arSupportedRegDomains_Passive) / sizeof(DOMAIN_INFO_ENTRY)) static const UINT_16 g_u2CountryGroup0_Passive[] = { COUNTRY_CODE_UDF }; +#if CFG_CUSTOM_REG +static UINT_16 g_u2CountryGroup1_Passive[] = { + COUNTRY_CODE_WW +}; +#endif + +/* + * Passive scan setting example + * static UINT_16 g_u2CountryGroup1_Passive[] = { + * COUNTRY_CODE_TW + * }; + */ + DOMAIN_INFO_ENTRY arSupportedRegDomains_Passive[] = { { - /* default passive channel table is empty */ - g_u2CountryGroup0_Passive, 0, - { - { 81, BAND_2G4, CHNL_SPAN_5, 11, 0, 0 }, /* CH_SET_2G4_1_14 */ - { 82, BAND_2G4, CHNL_SPAN_5, 5, 0, 0 }, - - { 115, BAND_5G, CHNL_SPAN_20, 36, 0, 0 }, /* CH_SET_UNII_LOW_36_48 */ - { 118, BAND_5G, CHNL_SPAN_20, 52, 0, 0 }, /* CH_SET_UNII_MID_52_64 */ - { 121, BAND_5G, CHNL_SPAN_20, 100, 0, 0 }, /* CH_SET_UNII_WW_100_140 */ - { 125, BAND_5G, CHNL_SPAN_20, 149, 0, 0 }, /* CH_SET_UNII_UPPER_149_173 */ - } - }, + /* default passive scan channel table is empty */ + COUNTRY_CODE_NULL, 0, + { + {81, BAND_2G4, CHNL_SPAN_5, 11, 0, 0}, /* CH_SET_2G4_1_14 */ + {82, BAND_2G4, CHNL_SPAN_5, 5, 0, 0}, + + {115, BAND_5G, CHNL_SPAN_20, 36, 0, 0}, /* CH_SET_UNII_LOW_36_48 */ + {118, BAND_5G, CHNL_SPAN_20, 52, 0, 0}, /* CH_SET_UNII_MID_52_64 */ + {121, BAND_5G, CHNL_SPAN_20, 100, 0, 0}, /* CH_SET_UNII_WW_100_140 */ + {125, BAND_5G, CHNL_SPAN_20, 149, 0, 0}, /* CH_SET_UNII_UPPER_149_173 */ + } + }, { - COUNTRY_CODE_NULL, 0, + /* User Defined passive scan channel table */ + g_u2CountryGroup0_Passive, 0, + { + {81, BAND_2G4, CHNL_SPAN_5, 12, 1, 0}, /* CH_SET_2G4_1_14 */ + {82, BAND_2G4, CHNL_SPAN_5, 5, 0, 0}, + + {115, BAND_5G, CHNL_SPAN_20, 36, 0, 0}, /* CH_SET_UNII_LOW_36_48 */ + {118, BAND_5G, CHNL_SPAN_20, 52, 0, 0}, /* CH_SET_UNII_MID_52_64 */ + {121, BAND_5G, CHNL_SPAN_20, 100, 0, 0}, /* CH_SET_UNII_WW_100_140 */ + {125, BAND_5G, CHNL_SPAN_20, 149, 0, 0}, /* CH_SET_UNII_UPPER_149_173 */ + } + }, + +#if CFG_CUSTOM_REG + { + g_u2CountryGroup1_Passive, + ARRAY_SIZE(g_u2CountryGroup1_Passive), { - { 81, BAND_2G4, CHNL_SPAN_5, 12, 1, 0 }, /* CH_SET_2G4_1_14 */ - { 82, BAND_2G4, CHNL_SPAN_5, 5, 0, 0 }, - - { 115, BAND_5G, CHNL_SPAN_20, 36, 0, 0 }, /* CH_SET_UNII_LOW_36_48 */ - { 118, BAND_5G, CHNL_SPAN_20, 52, 0, 0 }, /* CH_SET_UNII_MID_52_64 */ - { 121, BAND_5G, CHNL_SPAN_20, 100, 0, 0 }, /* CH_SET_UNII_WW_100_140 */ - { 125, BAND_5G, CHNL_SPAN_20, 149, 0, 0 }, /* CH_SET_UNII_UPPER_149_173 */ + {81, BAND_2G4, CHNL_SPAN_5, 1, 0, 0}, + {82, BAND_2G4, CHNL_SPAN_5, 12, 2, 0}, + {115, BAND_5G, CHNL_SPAN_20, 36, 0, 0}, + {118, BAND_5G, CHNL_SPAN_20, 52, 0, 0}, + {121, BAND_5G, CHNL_SPAN_20, 100, 0, 0}, + {125, BAND_5G, CHNL_SPAN_20, 149, 5, 0}, } - } + }, +#endif + + /* + * Passive scan setting example + * 1-11 active + * 12-14 passive + * 36-48 passive + * 52-64 passive + * 100-140 passive + * 146-165 active + * { + * g_u2CountryGroup1_Passive, 1, + * { + * {81, BAND_2G4, CHNL_SPAN_5, 1, 0, 0}, + * {82, BAND_2G4, CHNL_SPAN_5, 12, 3, 0}, + * {115, BAND_5G, CHNL_SPAN_20, 36, 4, 0}, + * {118, BAND_5G, CHNL_SPAN_20, 52, 4, 0}, + * {121, BAND_5G, CHNL_SPAN_20, 100, 11, 0}, + * {125, BAND_5G, CHNL_SPAN_20, 149, 0, 0}, + * } + * }, + */ }; - #if 0 COUNTRY_CH_SET_T arCountryChSets[] = { /* idx=0: US, Bahamas, Barbados, Bolivia(Voluntary), Dominica (the Commonwealth of Dominica), @@ -601,6 +678,19 @@ COUNTRY_CH_SET_T arCountryChSets[] = { }; #endif +#if CFG_CUSTOM_REG +static struct reg_mapping support_region[] = { + { COUNTRY_CODE_WW, REGION_CODE_WW }, + { COUNTRY_CODE_US, REGION_CODE_FCC }, + { COUNTRY_CODE_JP, REGION_CODE_JP }, + { COUNTRY_CODE_FR, REGION_CODE_CE }, + { COUNTRY_CODE_DE, REGION_CODE_CE }, + { COUNTRY_CODE_IT, REGION_CODE_CE }, + { COUNTRY_CODE_ES, REGION_CODE_CE }, + { COUNTRY_CODE_GB, REGION_CODE_CE }, + { COUNTRY_CODE_FR, REGION_CODE_CE }, +}; +#endif /******************************************************************************* * P R I V A T E D A T A @@ -678,6 +768,7 @@ rlmDomainGetDomainInfo ( P_ADAPTER_T prAdapter ) { +#define REG_DOMAIN_DEF_IDX 22 /* WW:world wide */ #define REG_DOMAIN_GROUP_NUM \ (sizeof(arSupportedRegDomains) / sizeof(DOMAIN_INFO_ENTRY)) @@ -732,10 +823,14 @@ rlmDomainGetDomainInfo ( /* If no matched countryCode */ if (i >= REG_DOMAIN_GROUP_NUM){ +#if 0 if (prAdapter->prDomainInfo) /* use previous NVRAM setting */ return prAdapter->prDomainInfo; else /* if never set before, use EU */ - prDomainInfo = &arSupportedRegDomains[REG_DOMAIN_DEF_IDX]; + prDomainInfo = &arSupportedRegDomains[REG_DOMAIN_DEF_IDX]; +#else + prDomainInfo = &arSupportedRegDomains[REG_DOMAIN_DEF_IDX]; +#endif } @@ -889,7 +984,8 @@ VOID rlmDomainPassiveScanSendCmd( P_CMD_SET_DOMAIN_INFO_T prCmd; WLAN_STATUS rStatus; P_DOMAIN_SUBBAND_INFO prSubBand; - UINT_8 i; + UINT_16 u2TargetCountryCode; + UINT_8 i, j; prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_DOMAIN_INFO_T)); @@ -913,13 +1009,22 @@ VOID rlmDomainPassiveScanSendCmd( DBGLOG(RLM, INFO, ("rlmDomainPassiveScanSendCmd(), CountryCode = %x\n", prAdapter->rWifiVar.rConnSettings.u2CountryCode)); - if (prAdapter->rWifiVar.rConnSettings.u2CountryCode == COUNTRY_CODE_UDF){ - prDomainInfo = &arSupportedRegDomains_Passive[1]; - } - else{ - prDomainInfo = &arSupportedRegDomains_Passive[0]; + u2TargetCountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode; + + for (i = 0; i < REG_DOMAIN_PASSIVE_GROUP_NUM; i++) { + prDomainInfo = &arSupportedRegDomains_Passive[i]; + + for (j = 0; j < prDomainInfo->u4CountryNum; j++) { + if (prDomainInfo->pu2CountryGroup[j] == u2TargetCountryCode) + break; + } + if (j < prDomainInfo->u4CountryNum) + break; /* Found */ } + if (i >= REG_DOMAIN_PASSIVE_GROUP_NUM) + prDomainInfo = &arSupportedRegDomains_Passive[REG_DOMAIN_PASSIVE_DEF_IDX]; + for (i = 0; i < 6; i++) { prSubBand = &prDomainInfo->rSubBand[i]; @@ -996,3 +1101,32 @@ rlmDomainIsLegalChannel ( return FALSE; } +#if CFG_CUSTOM_REG +UINT_16 rlm_get_support_country(UINT_16 country) +{ + UINT_16 ret = COUNTRY_CODE_WW; + UINT_32 i; + + for (i = 0; i < ARRAY_SIZE(support_region); i++) { + if (country == support_region[i].country_code) + return country; + } + DBGLOG(RLM, INFO, ("Country:%x is not support.Replaced with WW\n", + country)); + return ret; +} + +UINT_16 rlm_get_region(UINT_16 country) +{ + UINT_16 ret = REGION_CODE_WW; + UINT_32 i; + + for (i = 0; i < ARRAY_SIZE(support_region); i++) { + if (country == support_region[i].country_code) + return support_region[i].region; + } + DBGLOG(RLM, INFO, ("Country:%x is not support.Replaced with WW\n", + country)); + return ret; +} +#endif diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/roaming_fsm.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/roaming_fsm.c index 3018a4cd492..dcf4f7fbb7d 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/roaming_fsm.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/roaming_fsm.c @@ -138,6 +138,7 @@ roamingFsmInit ( { P_ROAMING_INFO_T prRoamingFsmInfo; P_CONNECTION_SETTINGS_T prConnSettings; + P_CMD_ROAMING_CTRL_T prRoamCtrl = &prAdapter->rWifiVar.rRoamingInfo.rRoamCtrl; DBGLOG(ROAMING, LOUD, ("->roamingFsmInit(): Current Time = %u\n", kalGetTimeTick())); @@ -150,6 +151,12 @@ roamingFsmInit ( prRoamingFsmInfo->eCurrentState = ROAMING_STATE_IDLE; prRoamingFsmInfo->rRoamingDiscoveryUpdateTime = 0; + /* default value of roaming ctrl in firmware. */ + prRoamCtrl->fgEnable = TRUE; + prRoamCtrl->ucRcpiAdjustStep = 8; + prRoamCtrl->u2RcpiLowThr = 90; + prRoamCtrl->ucRoamingRetryCount = 2; + prRoamCtrl->ucRoamingStableTimeout = 10; return; } /* end of roamingFsmInit() */ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rsn.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rsn.c index 0c8b4da3f0a..a5d4d162063 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rsn.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/rsn.c @@ -1751,7 +1751,7 @@ rsnTkipHandleMICFailure ( prAdapter, NETWORK_TYPE_AIS_INDEX, Param_PowerModeCAM, - TRUE); + FALSE); /* Generate authentication request event. */ DBGLOG(RSN, INFO, ("Generate TKIP MIC error event (type: 0%d)\n", diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/scan.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/scan.c index b6365feecd0..bfdd664cf11 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/scan.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/scan.c @@ -658,6 +658,16 @@ #define ROAMING_NO_SWING_RCPI_STEP (10) +#if AMZN_5GHZ_PREF +#define RSSI_HI_5GHZ (-60) +#define RSSI_MED_5GHZ (-67) +#define RSSI_LO_5GHZ (-70) + +#define PREF_HI_5GHZ (20) +#define PREF_MED_5GHZ (15) +#define PREF_LO_5GHZ (3) +#endif /* end AMZN_5GHZ_PREF */ + /******************************************************************************* * D A T A T Y P E S ******************************************************************************** @@ -667,6 +677,14 @@ * P U B L I C D A T A ******************************************************************************** */ +#if AMZN_5GHZ_PREF +INT_32 rssiRangeHi = RSSI_HI_5GHZ; +INT_32 rssiRangeMed = RSSI_MED_5GHZ; +INT_32 rssiRangeLo = RSSI_LO_5GHZ; +UINT_8 pref5GhzHi = PREF_HI_5GHZ; +UINT_8 pref5GhzMed = PREF_MED_5GHZ; +UINT_8 pref5GhzLo = PREF_LO_5GHZ; +#endif /* end AMZN_5GHZ_PREF */ /******************************************************************************* * P R I V A T E D A T A @@ -687,6 +705,50 @@ * F U N C T I O N S ******************************************************************************** */ +#if AMZN_5GHZ_PREF +INT_32 adptClntAdjust5gPref(P_BSS_DESC_T prBssDesc) +{ + INT_32 rssi = RCPI_TO_dBm(prBssDesc->ucRCPI); + DBGLOG(SCN, INFO, ("adptClntAdjust5gPref:: enter band=%d RSSI = %d\n", + prBssDesc->eBand, rssi)); + if (prBssDesc->eBand == BAND_5G) { + if (rssi > rssiRangeHi) + rssi += pref5GhzHi; + else if (rssi > rssiRangeMed) + rssi += pref5GhzMed; + else if (rssi > rssiRangeLo) + rssi += pref5GhzLo; + } + /* Reduce chances of roam ping-pong */ + if (prBssDesc->fgIsConnected) + rssi += (ROAMING_NO_SWING_RCPI_STEP >> 1); + + DBGLOG(SCN, INFO, ("adptClntAdjust5gPref:: exit RSSI = %d\n", rssi)); + return rssi; +} + +VOID scanSet5gRoamingPreference(INT_32 rangeHi, INT_32 rangeMed, + INT_32 rangeLow, UINT_8 pref5gHi, UINT_8 pref5gMed, UINT_8 pref5gLo) +{ + rssiRangeHi = rangeHi; + rssiRangeMed = rangeMed; + rssiRangeLo = rangeLow; + pref5GhzHi = pref5gHi; + pref5GhzMed = pref5gMed; + pref5GhzLo = pref5gLo; +} +VOID scanGet5gRoamingPreference(PINT_32 rangeHi, PINT_32 rangeMed, + PINT_32 rangeLow, PUINT_8 pref5gHi, PUINT_8 pref5gMed, PUINT_8 pref5gLo) +{ + *rangeHi = rssiRangeHi; + *rangeMed = rssiRangeMed; + *rangeLow = rssiRangeLo; + *pref5gHi = pref5GhzHi; + *pref5gMed = pref5GhzMed; + *pref5gLo = pref5GhzLo; +} +#endif /* end AMZN_5GHZ_PREF */ + /*----------------------------------------------------------------------------*/ /*! * @brief This function is used by SCN to initialize its variables @@ -1276,6 +1338,18 @@ scanRemoveBssDescsByPolicy ( } } + if (prConnSettings->fgIsConnReqIssued && + (EQUAL_SSID(prBssDesc->aucSSID, prBssDesc->ucSSIDLen, + prConnSettings->aucSSID, prConnSettings->ucSSIDLen))) { + /* Don't remove specific BSSID which driver are going to connect. */ + DBGLOG(SCN, LOUD, + ("Don't free scan BSS Descriptori" + " due to it is the target BSS!!\n")); + continue; + /* prBssDescWeakest won't be the SSID trying to connect. */ + } + + if (!prBssDescWeakest) { /* 1st element */ prBssDescWeakest = prBssDesc; continue; @@ -1288,8 +1362,18 @@ scanRemoveBssDescsByPolicy ( } if ((u4SameSSIDCount >= SCN_BSS_DESC_SAME_SSID_THRESHOLD) && - (prBssDescWeakestSameSSID)) { - prBssDescWeakest = prBssDescWeakestSameSSID; + (prBssDescWeakestSameSSID)) { + if (prConnSettings->fgIsConnByBssidIssued && + (EQUAL_MAC_ADDR(prBssDescWeakestSameSSID->aucBSSID, + prConnSettings->aucBSSID))) { + DBGLOG(SCN, LOUD, ("Can't age this BSS Desc," + "due to this is target BSSID!!\n")); + } else { + DBGLOG(SCN, LOUD, + ("Release weakest BSS descriptor" + "due to same SSID & not BSSID connect!!\n")); + prBssDescWeakest = prBssDescWeakestSameSSID; + } } if (prBssDescWeakest) { @@ -1587,7 +1671,7 @@ scanAddToBssDesc ( UINT_8 ucHwChannelNum = 0; UINT_8 ucIeDsChannelNum = 0; UINT_8 ucIeHtChannelNum = 0; - BOOLEAN fgIsValidSsid = FALSE, fgEscape = FALSE; + BOOLEAN fgIsValidSsid = FALSE, fgEscape = FALSE, fgIsCopy = FALSE; PARAM_SSID_T rSsid; UINT_64 u8Timestamp; BOOLEAN fgIsNewBssDesc = FALSE; @@ -1776,9 +1860,11 @@ scanAddToBssDesc ( } } #if 1 - + if ((prBssDesc->u2RawLength == 0) || (fgIsValidSsid)) { prBssDesc->u2RawLength = prSwRfb->u2PacketLen; kalMemCopy(prBssDesc->aucRawBuf, prWlanBeaconFrame, prBssDesc->u2RawLength); + fgIsCopy = TRUE; + } #endif /* NOTE: Keep consistency of Scan Record during JOIN process */ @@ -1811,9 +1897,12 @@ scanAddToBssDesc ( else { prBssDesc->fgIsIEOverflow = FALSE; } - prBssDesc->u2IELength = u2IELength; - kalMemCopy(prBssDesc->aucIEBuf, prWlanBeaconFrame->aucInfoElem, u2IELength); + if (fgIsCopy) { + prBssDesc->u2IELength = u2IELength; + + kalMemCopy(prBssDesc->aucIEBuf, prWlanBeaconFrame->aucInfoElem, u2IELength); + } //4 <2.2> reset prBssDesc variables in case that AP has been reconfigured prBssDesc->fgIsERPPresent = FALSE; @@ -2105,37 +2194,29 @@ scanAddToBssDesc ( prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_HT; } - /* if not 11n only */ - if (!(prBssDesc->u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) { - /* check if support 11g */ - if ((prBssDesc->u2OperationalRateSet & RATE_SET_OFDM) || - prBssDesc->fgIsERPPresent) { - prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_ERP; - } + /* check if support 11g */ + if ((prBssDesc->u2OperationalRateSet & RATE_SET_OFDM) || + prBssDesc->fgIsERPPresent) { + prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_ERP; + } - /* if not 11g only */ - if (!(prBssDesc->u2BSSBasicRateSet & RATE_SET_OFDM)) { - /* check if support 11b */ - if ((prBssDesc->u2OperationalRateSet & RATE_SET_HR_DSSS)) { - prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS; - } - } - } - } - else { /* (BAND_5G == prBssDesc->eBande) */ - /* check if support 11n */ - if (prBssDesc->fgIsHTPresent) { - prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_HT; - } + /* if not 11g only */ + if (!(prBssDesc->u2BSSBasicRateSet & RATE_SET_OFDM)) { + /* check if support 11b */ + if ((prBssDesc->u2OperationalRateSet & RATE_SET_HR_DSSS)) { + prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS; + } + } + } else { /* (BAND_5G == prBssDesc->eBande) */ + /* check if support 11n */ + if (prBssDesc->fgIsHTPresent) { + prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_HT; + } - /* if not 11n only */ - if (!(prBssDesc->u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) { - /* Support 11a definitely */ - prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM; - - ASSERT(!(prBssDesc->u2OperationalRateSet & RATE_SET_HR_DSSS)); - } - } + /* Support 11a definitely */ + prBssDesc->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM; + ASSERT(!(prBssDesc->u2OperationalRateSet & RATE_SET_HR_DSSS)); + } //4 <6> Update BSS_DESC_T's Last Update TimeStamp. @@ -2423,7 +2504,6 @@ scanReportBss2Cfg80211 ( prBssDesc->ucChannelNum, RCPI_TO_dBm(prBssDesc->ucRCPI)); kalMemZero(prBssDesc->aucRawBuf,CFG_RAW_BUFFER_SIZE); - prBssDesc->u2RawLength=0; #if CFG_ENABLE_WIFI_DIRECT @@ -3251,41 +3331,122 @@ scanSearchBssDescByPolicy ( //4 <6E> Condition - Choose the one with better RCPI(RSSI). - if (fgIsFindBestRSSI) { +#if AMZN_5GHZ_PREF + if (fgIsFindBestRSSI) { + INT_32 pAdjRssi = adptClntAdjust5gPref(prPrimaryBssDesc); + INT_32 cAdjRssi = adptClntAdjust5gPref(prCandidateBssDesc); + /* TODO(Kevin): We shouldn't compare the actual value, we should + * allow some acceptable tolerance of some RSSI percentage here. + */ + DBGLOG(SCN, TRACE, + ("Candidate [%pM]: RCPI = %d, joinFailCnt=%d, Primary [%pM]: RCPI = %d, joinFailCnt=%d\n", + prCandidateBssDesc->aucBSSID, + prCandidateBssDesc->ucRCPI, prCandidateBssDesc->ucJoinFailureCount, + prPrimaryBssDesc->aucBSSID, + prPrimaryBssDesc->ucRCPI, prPrimaryBssDesc->ucJoinFailureCount)); + + ASSERT(!(prCandidateBssDesc->fgIsConnected && prPrimaryBssDesc->fgIsConnected)); + if (prPrimaryBssDesc->ucJoinFailureCount > SCN_BSS_JOIN_FAIL_THRESOLD) { + /* give a chance to do join if join fail before + * SCN_BSS_DECRASE_JOIN_FAIL_CNT_SEC seconds + */ + if (CHECK_FOR_TIMEOUT(rCurrentTime, prBssDesc->rJoinFailTime, + SEC_TO_SYSTIME(SCN_BSS_JOIN_FAIL_CNT_RESET_SEC))) { + prBssDesc->ucJoinFailureCount -= SCN_BSS_JOIN_FAIL_RESET_STEP; + DBGLOG(SCN, INFO, + ("decrease join fail count for Bss %pM to %u, timeout second %d\n", + prBssDesc->aucBSSID, prBssDesc->ucJoinFailureCount, + SCN_BSS_JOIN_FAIL_CNT_RESET_SEC)); + + } + } + /* NOTE: To prevent SWING, we do roaming only if target AP + * has at least 5dBm larger than us. + */ + if (prCandidateBssDesc->fgIsConnected) { + if ((cAdjRssi <= pAdjRssi) + && prPrimaryBssDesc->ucJoinFailureCount <= SCN_BSS_JOIN_FAIL_THRESOLD) { + + prCandidateBssDesc = prPrimaryBssDesc; + prCandidateStaRec = prPrimaryStaRec; + continue; + } + } + else if (prPrimaryBssDesc->fgIsConnected) { + if ((cAdjRssi < pAdjRssi) + || (prCandidateBssDesc->ucJoinFailureCount > SCN_BSS_JOIN_FAIL_THRESOLD)) { + + prCandidateBssDesc = prPrimaryBssDesc; + prCandidateStaRec = prPrimaryStaRec; + continue; + } + } + else if (prPrimaryBssDesc->ucJoinFailureCount > SCN_BSS_JOIN_FAIL_THRESOLD) + continue; + else if (prCandidateBssDesc->ucJoinFailureCount > SCN_BSS_JOIN_FAIL_THRESOLD || + (cAdjRssi < pAdjRssi)) { + + prCandidateBssDesc = prPrimaryBssDesc; + prCandidateStaRec = prPrimaryStaRec; + continue; + } + } +#else /* AMZN_5GHZ_PREF */ + if (fgIsFindBestRSSI) { /* TODO(Kevin): We shouldn't compare the actual value, we should * allow some acceptable tolerance of some RSSI percentage here. */ - DBGLOG(SCN, TRACE, ("Candidate ["MACSTR"]: RCPI = %d, Primary ["MACSTR"]: RCPI = %d\n", - MAC2STR(prCandidateBssDesc->aucBSSID), prCandidateBssDesc->ucRCPI, - MAC2STR(prPrimaryBssDesc->aucBSSID), prPrimaryBssDesc->ucRCPI)); + DBGLOG(SCN, TRACE, + ("Candidate [%pM]: RCPI = %d, joinFailCnt=%d, Primary [%pM]: RCPI = %d, joinFailCnt=%d\n", + prCandidateBssDesc->aucBSSID, + prCandidateBssDesc->ucRCPI, prCandidateBssDesc->ucJoinFailureCount, + prPrimaryBssDesc->aucBSSID, + prPrimaryBssDesc->ucRCPI, prPrimaryBssDesc->ucJoinFailureCount)); ASSERT(!(prCandidateBssDesc->fgIsConnected && prPrimaryBssDesc->fgIsConnected)); - /* NOTE: To prevent SWING, we do roaming only if target AP has at least 5dBm larger than us. */ + if (prPrimaryBssDesc->ucJoinFailureCount >= SCN_BSS_JOIN_FAIL_THRESOLD) { + /* give a chance to do join if join fail before + * SCN_BSS_DECRASE_JOIN_FAIL_CNT_SEC seconds + */ + if (CHECK_FOR_TIMEOUT(rCurrentTime, prBssDesc->rJoinFailTime, + SEC_TO_SYSTIME(SCN_BSS_JOIN_FAIL_CNT_RESET_SEC))) { + prBssDesc->ucJoinFailureCount = SCN_BSS_JOIN_FAIL_THRESOLD - + SCN_BSS_JOIN_FAIL_RESET_STEP; + DBGLOG(SCN, INFO, + ("decrease join fail count for Bss %pM to %u, timeout second %d\n", + prBssDesc->aucBSSID, prBssDesc->ucJoinFailureCount, + SCN_BSS_JOIN_FAIL_CNT_RESET_SEC)); + } + } + /* NOTE: To prevent SWING, we do roaming only if target AP has at least 5dBm larger than us. */ if (prCandidateBssDesc->fgIsConnected) { - if (prCandidateBssDesc->ucRCPI + ROAMING_NO_SWING_RCPI_STEP <= prPrimaryBssDesc->ucRCPI) { + if (prCandidateBssDesc->ucRCPI + ROAMING_NO_SWING_RCPI_STEP <= prPrimaryBssDesc->ucRCPI && + prPrimaryBssDesc->ucJoinFailureCount < SCN_BSS_JOIN_FAIL_THRESOLD) { prCandidateBssDesc = prPrimaryBssDesc; prCandidateStaRec = prPrimaryStaRec; continue; } - } - else if (prPrimaryBssDesc->fgIsConnected) { - if (prCandidateBssDesc->ucRCPI < prPrimaryBssDesc->ucRCPI + ROAMING_NO_SWING_RCPI_STEP) { - + } else if (prPrimaryBssDesc->fgIsConnected) { + if (prCandidateBssDesc->ucRCPI < prPrimaryBssDesc->ucRCPI + ROAMING_NO_SWING_RCPI_STEP || + (prCandidateBssDesc->ucJoinFailureCount >= + SCN_BSS_JOIN_FAIL_THRESOLD)) { prCandidateBssDesc = prPrimaryBssDesc; prCandidateStaRec = prPrimaryStaRec; continue; } - } - else if (prCandidateBssDesc->ucRCPI < prPrimaryBssDesc->ucRCPI) { - prCandidateBssDesc = prPrimaryBssDesc; - prCandidateStaRec = prPrimaryStaRec; - continue; - } + } else if (prPrimaryBssDesc->ucJoinFailureCount >= SCN_BSS_JOIN_FAIL_THRESOLD) + continue; + else if (prCandidateBssDesc->ucJoinFailureCount >= SCN_BSS_JOIN_FAIL_THRESOLD || + prCandidateBssDesc->ucRCPI < prPrimaryBssDesc->ucRCPI) { + prCandidateBssDesc = prPrimaryBssDesc; + prCandidateStaRec = prPrimaryStaRec; + continue; + } } - +#endif /* end AMZN_5GHZ_PREF */ #if 0 /* If reach here, that means they have the same Encryption Score, and * both RSSI value are close too. diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/tdls.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/tdls.c index 0b07d85b801..f537c6cb985 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/tdls.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/mgmt/tdls.c @@ -6493,7 +6493,8 @@ TdlsexRxFrameHandle( { case ELEM_ID_HT_CAP: /* 0x2d */ /* backup the HT IE of 1st unhandled setup request frame */ - if (prGlueInfo->rTdlsHtCap.ucId == 0x00) + if (prGlueInfo->rTdlsHtCap.ucId == 0x00 && + ucElmLen <= sizeof(IE_HT_CAP_T) - 2) { kalMemCopy(prGlueInfo->aucTdlsHtPeerMac, pucPeerMac, 6); kalMemCopy(&prGlueInfo->rTdlsHtCap, pPkt-2, ucElmLen+2); diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic.c index bc1ee8e2015..0166384931e 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic.c @@ -684,13 +684,13 @@ static IST_EVENT_FUNCTION apfnEventFuncTable[] = { */ #define LOCAL_NIC_ALLOCATE_MEMORY(pucMem, u4Size, eMemType, pucComment) \ { \ - DBGLOG(INIT, INFO, ("Allocating %u bytes for %s.\n", u4Size, pucComment)); \ + DBGLOG(INIT, TRACE, ("Allocating %u bytes for %s.\n", u4Size, pucComment)); \ if ((pucMem = (PUINT_8)kalMemAlloc(u4Size, eMemType)) == (PUINT_8)NULL) { \ DBGLOG(INIT, ERROR, ("Could not allocate %u bytes for %s.\n", u4Size, pucComment)); \ break; \ } \ ASSERT(((ULONG)pucMem % 4) == 0); \ - DBGLOG(INIT, INFO, ("Virtual Address = %p for %s.\n", pucMem, pucComment)); \ + DBGLOG(INIT, TRACE, ("Virtual Address = %p for %s.\n", pucMem, pucComment)); \ } @@ -1239,8 +1239,8 @@ nicVerifyChipID ( HAL_MCR_RD(prAdapter, MCR_WCIR, &u4CIR ); - DBGLOG(INIT, TRACE,("Chip ID: 0x%x\n", (UINT_32)(u4CIR & WCIR_CHIP_ID))); - DBGLOG(INIT, TRACE,("Revision ID: 0x%x\n", (UINT_32)((u4CIR & WCIR_REVISION_ID) >> 16))); + DBGLOG(INIT, INFO,("Chip ID: 0x%x\n", (UINT_32)(u4CIR & WCIR_CHIP_ID))); + DBGLOG(INIT, INFO,("Revision ID: 0x%x\n", (UINT_32)((u4CIR & WCIR_REVISION_ID) >> 16))); #if 0 if (((u4CIR & WCIR_CHIP_ID) != MTK_CHIP_REV_72) && @@ -1381,6 +1381,10 @@ nicProcessAbnormalInterrupt ( UINT_32 u4Value; HAL_MCR_RD(prAdapter, MCR_WASR, &u4Value); +#if CFG_SUPPORT_WAKEUP_STATISTICS + nicUpdateWakeupStatistics(prAdapter, ABNORMAL_INT); +#endif + DBGLOG(REQ, WARN, ("MCR_WASR: 0x%x \n", u4Value)); } @@ -1448,6 +1452,10 @@ nicProcessSoftwareInterrupt( } #endif +#if CFG_SUPPORT_WAKEUP_STATISTICS + nicUpdateWakeupStatistics(prAdapter, SOFTWARE_INT); +#endif + DBGLOG(REQ, WARN, ("u4IntrBits: 0x%x \n", u4IntrBits)); return; @@ -2172,7 +2180,8 @@ nicDeactivateNetwork( WLAN_STATUS nicUpdateBss( IN P_ADAPTER_T prAdapter, - IN ENUM_NETWORK_TYPE_INDEX_T eNetworkTypeIdx + IN ENUM_NETWORK_TYPE_INDEX_T eNetworkTypeIdx, + IN UINT_8 ucStaNoClear ) { WLAN_STATUS u4Status; @@ -2246,6 +2255,7 @@ nicUpdateBss( prBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE && prBssInfo->prStaRecOfAP != NULL) { rCmdSetBssInfo.ucStaRecIdxOfAP = prBssInfo->prStaRecOfAP->ucIndex; + rCmdSetBssInfo.ucStaRecNoClear = ucStaNoClear; cnmAisInfraConnectNotify(prAdapter); } @@ -2255,6 +2265,7 @@ nicUpdateBss( (prBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) && (prBssInfo->prStaRecOfAP != NULL)) { rCmdSetBssInfo.ucStaRecIdxOfAP = prBssInfo->prStaRecOfAP->ucIndex; + rCmdSetBssInfo.ucStaRecNoClear = STA_REC_INDEX_NOT_FOUND; } #endif @@ -2263,10 +2274,12 @@ nicUpdateBss( prBssInfo->eCurrentOPMode == OP_MODE_BOW && prBssInfo->prStaRecOfAP != NULL) { rCmdSetBssInfo.ucStaRecIdxOfAP = prBssInfo->prStaRecOfAP->ucIndex; + rCmdSetBssInfo.ucStaRecNoClear = STA_REC_INDEX_NOT_FOUND; } #endif else { rCmdSetBssInfo.ucStaRecIdxOfAP = STA_REC_INDEX_NOT_FOUND; + rCmdSetBssInfo.ucStaRecNoClear = STA_REC_INDEX_NOT_FOUND; } u4Status = wlanSendSetQueryCmd(prAdapter, @@ -2460,7 +2473,7 @@ nicConfigPowerSaveProfile ( ) { DEBUGFUNC("nicConfigPowerSaveProfile"); - DBGLOG(INIT, TRACE, ("eNetTypeIndex:%d, ePwrMode:%d, fgEnCmdEvent:%d\n", + DBGLOG(INIT, INFO, ("eNetTypeIndex:%d, ePwrMode:%d, fgEnCmdEvent:%d\n", eNetTypeIndex, ePwrMode, fgEnCmdEvent)); ASSERT(prAdapter); @@ -4671,3 +4684,24 @@ nicUpdateRddTestMode( } #endif +#if CFG_SUPPORT_WAKEUP_STATISTICS +INT_32 nicUpdateWakeupStatistics(P_ADAPTER_T prAdapter, WAKEUP_TYPE intType) +{ + P_WAKEUP_STATISTIC *prWakeupSta = &prAdapter->arWakeupStatistic[intType]; + if (glWlanGetSuspendFlag() == 0) + return 0; + prWakeupSta->u2Count++; + glWlanClearSuspendFlag(); + if (prWakeupSta->u2Count % 100 == 0) { + OS_SYSTIME rCurrent; + if (prWakeupSta->u2Count > 0) { + GET_CURRENT_SYSTIME(&rCurrent); + prWakeupSta->u2TimePerHundred = rCurrent-prWakeupSta->rStartTime; + } + GET_CURRENT_SYSTIME(&prWakeupSta->rStartTime) + DBGLOG(RX, INFO, ("wakeup frequency: %d", prWakeupSta->u2TimePerHundred)); + } + return 1; +} +#endif + diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_cmd_event.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_cmd_event.c index 8ff7e44560a..acac2c5f293 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_cmd_event.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_cmd_event.c @@ -332,6 +332,36 @@ ******************************************************************************** */ +VOID +nicCmdEventTsfRead ( + IN P_ADAPTER_T prAdapter, + IN P_CMD_INFO_T prCmdInfo, + IN PUINT_8 pucEventBuf + ) +{ + UINT_32 u4QueryInfoLen; + P_CMD_TSF_GET_T prTsfRdInfo; + P_GLUE_INFO_T prGlueInfo; + + + ASSERT(prAdapter); + ASSERT(prCmdInfo); + ASSERT(pucEventBuf); + //4 <2> Update information of OID + if (prCmdInfo->fgIsOid) { + prGlueInfo = prAdapter->prGlueInfo; + prTsfRdInfo = (P_CMD_TSF_GET_T)(pucEventBuf); + u4QueryInfoLen = sizeof(CMD_TSF_GET_T); + kalMemCopy(prCmdInfo->pvInformationBuffer, prTsfRdInfo, u4QueryInfoLen); + kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS); + } + + return; + +} + + + VOID nicCmdEventQueryMcrRead ( IN P_ADAPTER_T prAdapter, @@ -340,7 +370,7 @@ nicCmdEventQueryMcrRead ( ) { UINT_32 u4QueryInfoLen; - P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrRdInfo; + P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrRdInfo; P_GLUE_INFO_T prGlueInfo; P_CMD_ACCESS_REG prCmdAccessReg; @@ -354,9 +384,9 @@ nicCmdEventQueryMcrRead ( prGlueInfo = prAdapter->prGlueInfo; prCmdAccessReg = (P_CMD_ACCESS_REG)(pucEventBuf); - u4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T); + u4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T); - prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T) prCmdInfo->pvInformationBuffer; + prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T) prCmdInfo->pvInformationBuffer; prMcrRdInfo->u4McrOffset = prCmdAccessReg->u4Address; prMcrRdInfo->u4McrData = prCmdAccessReg->u4Data; @@ -376,7 +406,7 @@ nicCmdEventQuerySwCtrlRead ( ) { UINT_32 u4QueryInfoLen; - P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo; + P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo; P_GLUE_INFO_T prGlueInfo; P_CMD_SW_DBG_CTRL_T prCmdSwCtrl; @@ -389,9 +419,9 @@ nicCmdEventQuerySwCtrlRead ( prGlueInfo = prAdapter->prGlueInfo; prCmdSwCtrl = (P_CMD_SW_DBG_CTRL_T)(pucEventBuf); - u4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T); + u4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T); - prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T) prCmdInfo->pvInformationBuffer; + prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T) prCmdInfo->pvInformationBuffer; prSwCtrlInfo->u4Id = prCmdSwCtrl->u4Id; prSwCtrlInfo->u4Data = prCmdSwCtrl->u4Data; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_rx.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_rx.c index 0197c386ab6..b654cc19179 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_rx.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_rx.c @@ -1141,8 +1141,11 @@ nicRxFillChksumStatus( ASSERT(prSwRfb); if (prAdapter->u4CSUMFlags != CSUM_NOT_SUPPORTED){ - if (u4TcpUdpIpCksStatus & RX_CS_TYPE_IPv4) { // IPv4 packet - prSwRfb->aeCSUM[CSUM_TYPE_IPV6] = CSUM_RES_NONE; + if (u4TcpUdpIpCksStatus & RX_LEN_MISMATCH) { + prSwRfb->aeCSUM[CSUM_TYPE_IPV4] = CSUM_RES_NONE; + prSwRfb->aeCSUM[CSUM_TYPE_IPV6] = CSUM_RES_NONE; + } else if (u4TcpUdpIpCksStatus & RX_CS_TYPE_IPv4) { /* IPv4 packet */ + prSwRfb->aeCSUM[CSUM_TYPE_IPV6] = CSUM_RES_NONE; if(u4TcpUdpIpCksStatus & RX_CS_STATUS_IP) { //IP packet csum failed prSwRfb->aeCSUM[CSUM_TYPE_IPV4] = CSUM_RES_FAILED; } else { @@ -1617,18 +1620,6 @@ nicRxProcessEventPacket ( // Event Handling switch(prEvent->ucEID) { - case EVENT_ID_WARNING_TO_DRIVER: - { - P_EVENT_LOG_TO_DRIVER_T prEventLog; - UINT_32 UpTimeSec, UpTimeMicroSec; - - prEventLog = (P_EVENT_LOG_TO_DRIVER_T)(prEvent->aucBuffer); - UpTimeSec = prEventLog->WifiUpTime/1000000; - UpTimeMicroSec = prEventLog->WifiUpTime%1000000; - LOG_FUNC("[%d.%d] FW Warning!! %s: %d, %s\n", UpTimeSec, UpTimeMicroSec, prEventLog->fileName, prEventLog->lineNo, prEventLog->log); - - break; - } case EVENT_ID_CMD_RESULT: prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum); @@ -2277,6 +2268,9 @@ nicRxProcessEventPacket ( (UINT32)(prEvent->u2PacketLen-8)); break; #endif /* CFG_SUPPORT_STATISTICS */ + case EVENT_ID_CHECK_REORDER_BUBBLE: + qmHandleEventCheckReorderBubble(prAdapter, prEvent); + break; case EVENT_ID_ACCESS_REG: case EVENT_ID_NIC_CAPABILITY: @@ -2337,6 +2331,15 @@ nicRxProcessMgmtPacket ( nicRxFillRFB(prAdapter, prSwRfb); ucSubtype = (*(PUINT_8)(prSwRfb->pvHeader) & MASK_FC_SUBTYPE )>> OFFSET_OF_FC_SUBTYPE; +#if CFG_SUPPORT_WAKEUP_STATISTICS + if (nicUpdateWakeupStatistics(prAdapter, RX_MGMT_INT) != 0) { + DBGLOG(RX, INFO, ("mgmt frame, subtype 0x%x, on channel %d\n", ucSubtype, + HIF_RX_HDR_GET_CHNL_NUM(prSwRfb->prHifRxHdr))); + if (aucDebugModule[DBG_RX_IDX] & DBG_CLASS_INFO) + dumpMemory8(ANDROID_LOG_ERROR, (PUINT_8) prSwRfb->pvHeader, + (UINT_32)prSwRfb->u2PacketLen); + } +#endif #if CFG_RX_PKTS_DUMP { @@ -2435,10 +2438,29 @@ nicRxProcessRFBs ( if (prSwRfb){ switch(prSwRfb->ucPacketType){ case HIF_RX_PKT_TYPE_DATA: +#if CFG_SUPPORT_WAKEUP_STATISTICS + if (1 == nicUpdateWakeupStatistics(prAdapter, RX_DATA_INT)) + glWlanSetIndicateWoWFlag(); +#endif + nicRxProcessDataPacket(prAdapter, prSwRfb); break; + case HIF_RX_PKT_TYPE_SW_DEFINED: + if ((prSwRfb->prHifRxHdr->u2PacketType & RXM_RXD_PKT_TYPE_SW_BITMAP) == + RXM_RXD_PKT_TYPE_SW_EVENT) + nicRxProcessEventPacket(prAdapter, prSwRfb); + else if ((prSwRfb->prHifRxHdr->u2PacketType & RXM_RXD_PKT_TYPE_SW_BITMAP) == + RXM_RXD_PKT_TYPE_SW_FRAME) + nicRxProcessMgmtPacket(prAdapter, prSwRfb); + else + ASSERT(0); + break; case HIF_RX_PKT_TYPE_EVENT: +#if CFG_SUPPORT_WAKEUP_STATISTICS + nicUpdateWakeupStatistics(prAdapter, RX_EVENT_INT); +#endif + nicRxProcessEventPacket(prAdapter, prSwRfb); break; @@ -2463,6 +2485,10 @@ nicRxProcessRFBs ( break; default: +#if CFG_SUPPORT_WAKEUP_STATISTICS + nicUpdateWakeupStatistics(prAdapter, RX_OTHERS_INT); +#endif + RX_INC_CNT(prRxCtrl, RX_TYPE_ERR_DROP_COUNT); RX_INC_CNT(prRxCtrl, RX_DROP_TOTAL_COUNT); DBGLOG(RX, ERROR, ("ucPacketType = %d\n", prSwRfb->ucPacketType)); diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_tx.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_tx.c index db1b6f7e233..d63f2f95062 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_tx.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/nic_tx.c @@ -679,10 +679,11 @@ nicTxReleaseResource ( for (i = 0; i < TC_NUM; i++) { prTxCtrl->rTc.aucFreeBufferCount[i] += aucTxRlsCnt[i]; } - if (aucTxRlsCnt[TC4_INDEX] != 0 || aucTxRlsCnt[TC5_INDEX] != 0){ + + if (aucTxRlsCnt[TC4_INDEX] != 0 || aucTxRlsCnt[TC5_INDEX] != 0){ DBGLOG(TX, STATE, ("Release: TC4 count %d, Free=%d; TC5 count %d, Free=%d\n", - aucTxRlsCnt[TC4_INDEX], prTxCtrl->rTc.aucFreeBufferCount[TC4_INDEX], - aucTxRlsCnt[TC5_INDEX], prTxCtrl->rTc.aucFreeBufferCount[TC5_INDEX])); + aucTxRlsCnt[TC4_INDEX], prTxCtrl->rTc.aucFreeBufferCount[TC4_INDEX], + aucTxRlsCnt[TC5_INDEX], prTxCtrl->rTc.aucFreeBufferCount[TC5_INDEX])); } KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_RESOURCE); #if 0 @@ -1947,6 +1948,9 @@ nicProcessTxInterrupt( #endif /* CFG_SDIO_INTR_ENHANCE */ nicTxAdjustTcq(prAdapter); +#if CFG_SUPPORT_WAKEUP_STATISTICS + nicUpdateWakeupStatistics(prAdapter, TX_INT); +#endif // Indicate Service Thread if(kalGetTxPendingCmdCount(prAdapter->prGlueInfo) > 0 @@ -2053,6 +2057,7 @@ nicTxReturnMsduInfo ( } KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); + prMsduInfo->fgIsBasicRate = FALSE; QUEUE_INSERT_TAIL(&prTxCtrl->rFreeMsduInfoList, (P_QUE_ENTRY_T)prMsduInfo); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); prMsduInfo = prNextMsduInfo; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/que_mgt.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/que_mgt.c index 28927f070a2..d98a4adffac 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/que_mgt.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/nic/que_mgt.c @@ -607,6 +607,11 @@ qmInit( prQM->arRxBaTable[u4QueArrayIdx].u2WinEnd = 0xFFFF; prQM->arRxBaTable[u4QueArrayIdx].fgIsWaitingForPktWithSsn = FALSE; + prQM->arRxBaTable[u4QueArrayIdx].fgHasBubble = FALSE; + cnmTimerInitTimer(prAdapter, + &(prQM->arRxBaTable[u4QueArrayIdx].rReorderBubbleTimer), + (PFN_MGMT_TIMEOUT_FUNC)qmHandleReorderBubbleTimeout, + (UINT_32)(&prQM->arRxBaTable[u4QueArrayIdx])); } prQM->ucRxBaCount = 0; @@ -2975,21 +2980,7 @@ qmHandleRxPackets( } } -#if CFG_SUPPORT_WAPI - if (prCurrSwRfb->u2PacketLen > ETHER_HEADER_LEN) { - PUINT_8 pc = (PUINT_8) prCurrSwRfb->pvHeader; - UINT_16 u2Etype = 0; - u2Etype = (pc[ETH_TYPE_LEN_OFFSET] << 8) | (pc[ETH_TYPE_LEN_OFFSET + 1]); - /* for wapi integrity test. WPI_1x packet should be always in non-encrypted mode. - if we received any WPI(0x88b4) packet that is encrypted, drop here. */ - if (u2Etype == ETH_WPI_1X && HIF_RX_HDR_GET_SEC_MODE(prHifRxHdr) != 0) { - DBGLOG(QM, INFO, ("drop wpi packet with sec mode\n")); - prCurrSwRfb->eDst = RX_PKT_DESTINATION_NULL; - QUEUE_INSERT_TAIL(&rReturnedQue, (P_QUE_ENTRY_T) prCurrSwRfb); - continue; - } - } -#endif + /* BAR frame */ if(HIF_RX_HDR_GET_BAR_FLAG(prHifRxHdr)){ prCurrSwRfb->eDst = RX_PKT_DESTINATION_NULL; @@ -3155,7 +3146,7 @@ qmProcessPktWithReordering( } #endif - if (qmPopOutDueToFallWithin(prReorderQueParm, prReturnedQue) == FALSE) + if (qmPopOutDueToFallWithin(prAdapter, prReorderQueParm, prReturnedQue) == FALSE) STATS_RX_REORDER_HOLE_INC(prStaRec); /* record hole count */ } /* Case 2: Fall ahead */ @@ -3188,7 +3179,7 @@ qmProcessPktWithReordering( (((prReorderQueParm->u2WinEnd) - (prReorderQueParm->u2WinSize) + MAX_SEQ_NO_COUNT + 1) % MAX_SEQ_NO_COUNT); - qmPopOutDueToFallAhead(prReorderQueParm, prReturnedQue); + qmPopOutDueToFallAhead(prAdapter, prReorderQueParm, prReturnedQue); STATS_RX_REORDER_FALL_AHEAD_INC(prStaRec); @@ -3291,7 +3282,7 @@ qmProcessBarFrame( prReorderQueParm->u2WinEnd = ((prReorderQueParm->u2WinStart) + (prReorderQueParm->u2WinSize) - 1) % MAX_SEQ_NO_COUNT; DBGLOG(QM, TRACE, ("QM:(BAR)[%d](%u){%d,%d}\n", prSwRfb->ucTid, u4SSN, prReorderQueParm->u2WinStart, prReorderQueParm->u2WinEnd)); - qmPopOutDueToFallAhead(prReorderQueParm, prReturnedQue); + qmPopOutDueToFallAhead(prAdapter, prReorderQueParm, prReturnedQue); } else{ DBGLOG(QM, TRACE, ("QM:(BAR)(%d)(%u){%u,%u}\n", prSwRfb->ucTid, u4SSN, u4WinStart, u4WinEnd)); @@ -3409,6 +3400,7 @@ qmInsertFallAheadReorderPkt( BOOLEAN qmPopOutDueToFallWithin( + IN P_ADAPTER_T prAdapter, IN P_RX_BA_ENTRY_T prReorderQueParm, OUT P_QUE_T prReturnedQue ) @@ -3447,6 +3439,20 @@ qmPopOutDueToFallWithin( } /* SN > WinStart, break to update WinEnd */ else{ + /* Start bubble timer */ + if (!prReorderQueParm->fgHasBubble) { + cnmTimerStartTimer(prAdapter, + &(prReorderQueParm->rReorderBubbleTimer), + QM_RX_BA_ENTRY_MISS_TIMEOUT_MS); + prReorderQueParm->fgHasBubble = TRUE; + prReorderQueParm->u2FirstBubbleSn = prReorderQueParm->u2WinStart; + DBGLOG(QM, TRACE, ("QM:(Bub Timer) STA[%u] TID[%u] BubSN[%u] Win{%d, %d}\n", + prReorderQueParm->ucStaRecIdx, + prReorderedSwRfb->ucTid, + prReorderQueParm->u2FirstBubbleSn, + prReorderQueParm->u2WinStart, + prReorderQueParm->u2WinEnd)); + } if ((fgMissing == TRUE) && CHECK_FOR_TIMEOUT(rCurrentTime, (*prMissTimeout), MSEC_TO_SYSTIME(QM_RX_BA_ENTRY_MISS_TIMEOUT_MS))) { @@ -3495,6 +3501,7 @@ qmPopOutDueToFallWithin( VOID qmPopOutDueToFallAhead( + IN P_ADAPTER_T prAdapter, IN P_RX_BA_ENTRY_T prReorderQueParm, OUT P_QUE_T prReturnedQue ) @@ -3502,7 +3509,6 @@ qmPopOutDueToFallAhead( P_SW_RFB_T prReorderedSwRfb; P_QUE_T prReorderQue; BOOLEAN fgDequeuHead; - prReorderQue = &(prReorderQueParm->rReOrderQue); /* Check whether any packet can be indicated to the higher layer */ @@ -3534,6 +3540,20 @@ qmPopOutDueToFallAhead( /* SN > WinStart, break to update WinEnd */ else{ + /* Start bubble timer */ + if (!prReorderQueParm->fgHasBubble) { + cnmTimerStartTimer(prAdapter, + &(prReorderQueParm->rReorderBubbleTimer), + QM_RX_BA_ENTRY_MISS_TIMEOUT_MS); + prReorderQueParm->fgHasBubble = TRUE; + prReorderQueParm->u2FirstBubbleSn = prReorderQueParm->u2WinStart; + DBGLOG(QM, TRACE, ("QM:(Bub Timer) STA[%u] TID[%u] BubSN[%u] Win{%d, %d}\n", + prReorderQueParm->ucStaRecIdx, + prReorderedSwRfb->ucTid, + prReorderQueParm->u2FirstBubbleSn, + prReorderQueParm->u2WinStart, + prReorderQueParm->u2WinEnd)); + } break; } @@ -3794,6 +3814,7 @@ qmAddRxBaEntry( prRxBaEntry->u2WinEnd = ((u2WinStart + u2WinSize - 1) % MAX_SEQ_NO_COUNT); prRxBaEntry->fgIsValid = TRUE; prRxBaEntry->fgIsWaitingForPktWithSsn = TRUE; + prRxBaEntry->fgHasBubble = FALSE; g_arMissTimeout[ucStaRecIdx][ucTid] = 0; @@ -3866,6 +3887,13 @@ qmDelRxBaEntry( } + if (prRxBaEntry->fgHasBubble) { + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], DELBA\n", + prRxBaEntry->ucStaRecIdx, + prRxBaEntry->ucTid)); + cnmTimerStopTimer(prAdapter, &prRxBaEntry->rReorderBubbleTimer); + prRxBaEntry->fgHasBubble = FALSE; + } #if ((QM_TEST_MODE == 0) && (QM_TEST_STA_REC_DEACTIVATION == 0)) /* Update RX BA entry state. Note that RX queue flush is not done here */ prRxBaEntry->fgIsValid = FALSE; @@ -5358,4 +5386,187 @@ qmGetRxReorderQueuedBufferCount( return u4Total; } +VOID qmHandleReorderBubbleTimeout( + IN P_ADAPTER_T prAdapter, + IN UINT_32 u4Param + ) +{ + P_RX_BA_ENTRY_T prReorderQueParm = (P_RX_BA_ENTRY_T)u4Param; + P_SW_RFB_T prSwRfb = (P_SW_RFB_T)NULL; + P_EVENT_CHECK_REORDER_BUBBLE_T prCheckReorderEvent; + + KAL_SPIN_LOCK_DECLARATION(); + if (!prReorderQueParm->fgIsValid) { + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], No Rx BA entry\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + return; + } + if (!prReorderQueParm->fgHasBubble) { + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], Bubble has been filled\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + return; + } + + DBGLOG(QM, TRACE, ("QM:(Bub Timeout) STA[%u] TID[%u] BubSN[%u]\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid, + prReorderQueParm->u2FirstBubbleSn)); + + /* Generate a self-inited event to Rx path */ + KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE); + QUEUE_REMOVE_HEAD(&prAdapter->rRxCtrl.rFreeSwRfbList, prSwRfb, P_SW_RFB_T); + KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE); + + if (prSwRfb) { + prCheckReorderEvent = (P_EVENT_CHECK_REORDER_BUBBLE_T)prSwRfb->pucRecvBuff; + + prSwRfb->ucPacketType = HIF_RX_PKT_TYPE_SW_DEFINED; + + prSwRfb->prHifRxHdr->u2PacketType = RXM_RXD_PKT_TYPE_SW_EVENT; + + prCheckReorderEvent->ucEID = EVENT_ID_CHECK_REORDER_BUBBLE; + + prCheckReorderEvent->ucStaRecIdx = prReorderQueParm->ucStaRecIdx; + prCheckReorderEvent->ucTid = prReorderQueParm->ucTid; + prCheckReorderEvent->u2Length = sizeof(EVENT_CHECK_REORDER_BUBBLE_T); + + KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE); + QUEUE_INSERT_TAIL(&prAdapter->rRxCtrl.rReceivedRfbList, &prSwRfb->rQueEntry); + RX_INC_CNT(&prAdapter->rRxCtrl, RX_MPDU_TOTAL_COUNT); + KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE); + + DBGLOG(QM, LOUD, ("QM:(Bub Check Event Sent) STA[%u] TID[%u]\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + + nicRxProcessRFBs(prAdapter); + DBGLOG(QM, LOUD, ("QM:(Bub Check Event Handled) STA[%u] TID[%u]\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + } else { + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], Bub check event alloc failed\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + + cnmTimerStartTimer(prAdapter, &(prReorderQueParm->rReorderBubbleTimer), QM_RX_BA_ENTRY_MISS_TIMEOUT_MS); + + DBGLOG(QM, TRACE, ("QM:(Bub Timer Restart) STA[%u] TID[%u] BubSN[%u] Win{%d, %d}\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid, + prReorderQueParm->u2FirstBubbleSn, + prReorderQueParm->u2WinStart, + prReorderQueParm->u2WinEnd)); + } + + return; +} + +VOID +qmHandleEventCheckReorderBubble( + IN P_ADAPTER_T prAdapter, + IN P_WIFI_EVENT_T prEvent + ) +{ + P_EVENT_CHECK_REORDER_BUBBLE_T prCheckReorderEvent = (P_EVENT_CHECK_REORDER_BUBBLE_T)prEvent; + P_RX_BA_ENTRY_T prReorderQueParm; + P_QUE_T prReorderQue; + QUE_T rReturnedQue; + P_QUE_T prReturnedQue = &rReturnedQue; + P_SW_RFB_T prReorderedSwRfb, prSwRfb; + + QUEUE_INITIALIZE(prReturnedQue); + /* Get target Rx BA entry */ + prReorderQueParm = qmLookupRxBaEntry( + prAdapter, + prCheckReorderEvent->ucStaRecIdx, + prCheckReorderEvent->ucTid); + + /* Sanity Check */ + if (!prReorderQueParm) { + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], No Rx BA entry\n", + prCheckReorderEvent->ucStaRecIdx, + prCheckReorderEvent->ucTid)); + return; + } + if (!prReorderQueParm->fgIsValid) { + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], No Rx BA entry\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + return; + } + + if (!prReorderQueParm->fgHasBubble) { + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], Bubble has been filled\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + return; + } + + prReorderQue = &(prReorderQueParm->rReOrderQue); + + if (QUEUE_IS_EMPTY(prReorderQue)) { + prReorderQueParm->fgHasBubble = FALSE; + DBGLOG(QM, TRACE, ("QM:(Bub Check Cancel) STA[%u] TID[%u], Bubble has been filled\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + return; + } + + DBGLOG(QM, TRACE, ("QM:(Bub Check Event Got) STA[%u] TID[%u]\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + + /* Expected bubble timeout => pop out packets before win_end */ + if (prReorderQueParm->u2FirstBubbleSn == prReorderQueParm->u2WinStart) { + prReorderedSwRfb = (P_SW_RFB_T)QUEUE_GET_TAIL(prReorderQue); + + prReorderQueParm->u2WinStart = prReorderedSwRfb->u2SSN + 1; + prReorderQueParm->u2WinEnd = + ((prReorderQueParm->u2WinStart) + (prReorderQueParm->u2WinSize) - 1) % MAX_SEQ_NO_COUNT; + + qmPopOutDueToFallAhead(prAdapter, prReorderQueParm, prReturnedQue); + DBGLOG(QM, TRACE, ("QM:(Bub Flush) STA[%u] TID[%u] BubSN[%u] Win{%d, %d}\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid, + prReorderQueParm->u2FirstBubbleSn, + prReorderQueParm->u2WinStart, + prReorderQueParm->u2WinEnd)); + + if (QUEUE_IS_NOT_EMPTY(prReturnedQue)) { + QM_TX_SET_NEXT_MSDU_INFO((P_SW_RFB_T)QUEUE_GET_TAIL(prReturnedQue), NULL); + + prSwRfb = (P_SW_RFB_T)QUEUE_GET_HEAD(prReturnedQue); + while (prSwRfb) { + DBGLOG(QM, TRACE, ("QM:(Bub Flush) STA[%u] TID[%u] Pop Out SN[%u]\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid, + prSwRfb->u2SSN)); + prSwRfb = (P_SW_RFB_T)QUEUE_GET_NEXT_ENTRY((P_QUE_ENTRY_T)prSwRfb); + } + wlanProcessQueuedSwRfb(prAdapter, (P_SW_RFB_T)QUEUE_GET_HEAD(prReturnedQue)); + } else { + DBGLOG(QM, TRACE, ("QM:(Bub Flush) STA[%u] TID[%u] Pop Out 0 packet\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid)); + } + + prReorderQueParm->fgHasBubble = FALSE; + } + /* First bubble has been filled but others exist */ + else { + prReorderQueParm->u2FirstBubbleSn = prReorderQueParm->u2WinStart; + cnmTimerStartTimer(prAdapter, &(prReorderQueParm->rReorderBubbleTimer), QM_RX_BA_ENTRY_MISS_TIMEOUT_MS); + + DBGLOG(QM, TRACE, ("QM:(Bub Timer) STA[%u] TID[%u] BubSN[%u] Win{%d, %d}\n", + prReorderQueParm->ucStaRecIdx, + prReorderQueParm->ucTid, + prReorderQueParm->u2FirstBubbleSn, + prReorderQueParm->u2WinStart, + prReorderQueParm->u2WinEnd)); + } + + return; +} diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_cfg80211.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_cfg80211.c index 7a4d5cf93b5..81701fd1499 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_cfg80211.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_cfg80211.c @@ -56,6 +56,7 @@ #include #include #include "gl_cfg80211.h" +#include "gl_p2p_ioctl.h" /******************************************************************************* * C O N S T A N T S @@ -884,7 +885,6 @@ mtk_cfg80211_del_station ( * others: failure */ /*----------------------------------------------------------------------------*/ -static PARAM_SCAN_REQUEST_EXT_T rScanRequest; int mtk_cfg80211_scan ( struct wiphy *wiphy, @@ -897,7 +897,8 @@ mtk_cfg80211_scan ( P_GLUE_INFO_T prGlueInfo = NULL; WLAN_STATUS rStatus; UINT_32 u4BufLen; -// PARAM_SCAN_REQUEST_EXT_T rScanRequest; + int i; + struct PARAM_SCAN_REQUEST_ADV_T rScanRequest; prGlueInfo = (P_GLUE_INFO_T) wiphy_priv(wiphy); ASSERT(prGlueInfo); @@ -911,13 +912,18 @@ mtk_cfg80211_scan ( return -EBUSY; } - if(request->n_ssids == 0) { - rScanRequest.rSsid.u4SsidLen = 0; - } - else if(request->n_ssids == 1) { - COPY_SSID(rScanRequest.rSsid.aucSsid, rScanRequest.rSsid.u4SsidLen, request->ssids[0].ssid, request->ssids[0].ssid_len); - } - else { + if (request->n_ssids == 0) { + rScanRequest.u4SsidNum = 0; + } else if (request->n_ssids <= SCN_SSID_MAX_NUM) { + rScanRequest.u4SsidNum = request->n_ssids; + + for (i = 0; i < request->n_ssids; i++) { + COPY_SSID(rScanRequest.rSsid[i].aucSsid, + rScanRequest.rSsid[i].u4SsidLen, + request->ssids[i].ssid, + request->ssids[i].ssid_len); + } + } else { DBGLOG(REQ, INFO, ("request->n_ssids:%d\n", request->n_ssids)); return -EINVAL; } @@ -930,24 +936,22 @@ mtk_cfg80211_scan ( rScanRequest.u4IELength = 0; } - prGlueInfo->prScanRequest = request; + prGlueInfo->prScanRequest = request; - rStatus = kalIoctl(prGlueInfo, - wlanoidSetBssidListScanExt, - &rScanRequest, - sizeof(PARAM_SCAN_REQUEST_EXT_T), - FALSE, - FALSE, - FALSE, - FALSE, - &u4BufLen); + rStatus = kalIoctl(prGlueInfo, + wlanoidSetBssidListScanAdv, + &rScanRequest, + sizeof(struct PARAM_SCAN_REQUEST_ADV_T), + FALSE, FALSE, FALSE, FALSE, + &u4BufLen); - if (rStatus != WLAN_STATUS_SUCCESS) { + if (rStatus != WLAN_STATUS_SUCCESS) { DBGLOG(REQ, INFO, ("scan error:%x\n", rStatus)); - prGlueInfo->prScanRequest = NULL; return -EINVAL; } + prGlueInfo->prScanRequest = request; + return 0; } @@ -977,7 +981,7 @@ mtk_cfg80211_connect ( ENUM_PARAM_ENCRYPTION_STATUS_T eEncStatus; ENUM_PARAM_AUTH_MODE_T eAuthMode; UINT_32 cipher; - PARAM_SSID_T rNewSsid; + PARAM_CONNECT_T rNewSsid; BOOLEAN fgCarryWPSIE = FALSE; ENUM_PARAM_OP_MODE_T eOpMode; @@ -1320,41 +1324,33 @@ mtk_cfg80211_connect ( } } - if(sme->ssid_len > 0) { - /* connect by SSID */ - COPY_SSID(rNewSsid.aucSsid, rNewSsid.u4SsidLen, sme->ssid, sme->ssid_len); + if (sme->channel) { + rNewSsid.u4CenterFreq = sme->channel->center_freq; + rNewSsid.ucSpecificChnl = 1; + mtk_p2p_cfg80211func_channel_format_switch(sme->channel, + NL80211_CHAN_NO_HT, + &rNewSsid.rChannelInfo, + &rNewSsid.eChnlSco); + } else { + rNewSsid.u4CenterFreq = 0; + rNewSsid.ucSpecificChnl = 0; + } + rNewSsid.pucBssid = sme->bssid; + rNewSsid.pucSsid = sme->ssid; + rNewSsid.u4SsidLen = sme->ssid_len; + rStatus = kalIoctl(prGlueInfo, + wlanoidSetConnect, + (PVOID) &rNewSsid, + sizeof(PARAM_CONNECT_T), + FALSE, + FALSE, + TRUE, + FALSE, + &u4BufLen); - rStatus = kalIoctl(prGlueInfo, - wlanoidSetSsid, - (PVOID) &rNewSsid, - sizeof(PARAM_SSID_T), - FALSE, - FALSE, - TRUE, - FALSE, - &u4BufLen); - - if (rStatus != WLAN_STATUS_SUCCESS) { - DBGLOG(REQ, WARN, ("set SSID:%x\n", rStatus)); - return -EINVAL; - } - } - else { - /* connect by BSSID */ - rStatus = kalIoctl(prGlueInfo, - wlanoidSetBssid, - (PVOID) sme->bssid, - MAC_ADDR_LEN, - FALSE, - FALSE, - TRUE, - FALSE, - &u4BufLen); - - if (rStatus != WLAN_STATUS_SUCCESS) { - DBGLOG(REQ, WARN, ("set BSSID:%x\n", rStatus)); - return -EINVAL; - } + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(REQ, WARN, ("set SSID:%x\n", rStatus)); + return -EINVAL; } return 0; @@ -1765,9 +1761,7 @@ mtk_cfg80211_mgmt_frame_register ( } if (prGlueInfo->prAdapter != NULL){ - - /* prGlueInfo->ulFlag |= GLUE_FLAG_FRAME_FILTER_AIS; */ - set_bit(GLUE_FLAG_FRAME_FILTER_AIS_BIT, &prGlueInfo->ulFlag); + set_bit(GLUE_FLAG_FRAME_FILTER_AIS, &prGlueInfo->ulFlag); /* wake up main thread */ wake_up_interruptible(&prGlueInfo->waitq); @@ -2480,6 +2474,10 @@ mtk_cfg80211_testmode_get_sta_statistics( u4LinkScore = 100; } + rQueryStaStatistics.u4NetDevRxPkts = prGlueInfo->rNetDevStats.rx_packets; + rQueryStaStatistics.u4NetDevRxBytes = prGlueInfo->rNetDevStats.rx_bytes; + rQueryStaStatistics.u4NetDevTxPkts = prGlueInfo->rNetDevStats.tx_packets; + rQueryStaStatistics.u4NetDevTxBytes = prGlueInfo->rNetDevStats.tx_bytes; NLA_PUT_U8(skb, NL80211_TESTMODE_STA_STATISTICS_INVALID, 0); NLA_PUT_U8(skb, NL80211_TESTMODE_STA_STATISTICS_VERSION, NL80211_DRIVER_TESTMODE_VERSION); @@ -2501,6 +2499,11 @@ mtk_cfg80211_testmode_get_sta_statistics( NLA_PUT_U32(skb, NL80211_TESTMODE_STA_STATISTICS_THRESHOLD_CNT, rQueryStaStatistics.u4TxExceedThresholdCount); NLA_PUT_U32(skb, NL80211_TESTMODE_STA_STATISTICS_AVG_PROCESS_TIME, rQueryStaStatistics.u4TxAverageProcessTime); + NLA_PUT_U32(skb, NL80211_TESTMODE_STA_STATISTICS_TX_PKTS, rQueryStaStatistics.u4NetDevTxPkts); + NLA_PUT_U32(skb, NL80211_TESTMODE_STA_STATISTICS_TX_BYTES, rQueryStaStatistics.u4NetDevTxBytes); + NLA_PUT_U32(skb, NL80211_TESTMODE_STA_STATISTICS_RX_PKTS, rQueryStaStatistics.u4NetDevRxPkts); + NLA_PUT_U32(skb, NL80211_TESTMODE_STA_STATISTICS_RX_BYTES, rQueryStaStatistics.u4NetDevRxBytes); + /* Network counter */ NLA_PUT( skb, @@ -2608,7 +2611,7 @@ mtk_cfg80211_testmode_sw_cmd( prGlueInfo = (P_GLUE_INFO_T) wiphy_priv(wiphy); -#if 1 +#if 0 printk("--> %s()\n", __func__); #endif @@ -2804,6 +2807,20 @@ int mtk_cfg80211_testmode_cmd( if(mtk_cfg80211_testmode_hs20_cmd(wiphy, data, len)) fgIsValid = TRUE; break; +#endif +#if CFG_SUPPORT_WAKEUP_STATISTICS + case TESTMODE_CMD_ID_WAKEUP_STATISTICS: + { + P_NL80211_QUERY_WAKEUP_STATISTICS prWakeupSta = + (P_NL80211_QUERY_WAKEUP_STATISTICS)data; + if (copy_to_user((PUINT_8)prWakeupSta->prWakeupCount, + (PUINT_8)prGlueInfo->prAdapter->arWakeupStatistic, + sizeof(prGlueInfo->prAdapter->arWakeupStatistic))) { + DBGLOG(INIT, ERROR, ("copy wakepu statistics fail\n")); + } + i4Status = 0; + break; + } #endif default: i4Status = -EINVAL; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_init.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_init.c index deac41f0b3e..82ce7a67ac0 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_init.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_init.c @@ -667,6 +667,13 @@ #include #endif +#ifdef CONFIG_IDME +#include +#ifdef CONFIG_OF +#include +#endif +#endif + /******************************************************************************* * C O N S T A N T S ******************************************************************************** @@ -684,6 +691,20 @@ int g_u4P2PEnding = 0; int g_u4P2POnOffing = 0; #endif +#ifdef CONFIG_OF +#define IDME_OF_MAC_ADDR "/idme/mac_addr" +#define IDME_OF_WIFI_MFG "/idme/wifi_mfg" +#define IDME_OF_BOARD_ID "/idme/board_id" +#else +#define IDME_OF_MAC_ADDR "/proc/idme/mac_addr" +#define IDME_OF_WIFI_MFG "/proc/idme/wifi_mfg" +#define IDME_OF_BOARD_ID "/proc/idme/board_id" +#endif +#define BOARD_ID_abf123_STR "0031" +#define BOARD_ID_BISCUIT_STR "0110" +#define BOARD_ID_AUSTIN_STR "0037" +char idme_board_id[16]; + /******************************************************************************* * D A T A T Y P E S @@ -708,7 +729,7 @@ MODULE_SUPPORTED_DEVICE(NIC_NAME); MODULE_LICENSE("GPL"); #define NIC_INF_NAME "wlan%d" /* interface name */ -#if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) +#if CFG_TC1_FEATURE #define NIC_INF_NAME_IN_AP_MODE "legacy%d" extern volatile int wlan_if_changed; #endif @@ -938,6 +959,211 @@ mtk_cfg80211_ais_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { } }; +#if AMZN_PWR_TABLE_ENABLE +#define COUNTRY_PWR_TBL(_alpha2, \ + _cck, \ + _ofdm_bpsk, _ofdm_qpsk, _ofdm_16qam, _ofdm_48m, _ofdm_54m, \ + _ht20_bpsk, _ht20_qpsk, _ht20_16qam, _ht20_mcs5, _ht20_mcs6, _ht20_mcs7, \ + _ht40_bpsk, _ht40_qpsk, _ht40_16qam, _ht40_mcs5, _ht40_mcs6, _ht40_mcs7, \ + _ofdm_bpsk_5g, _ofdm_qpsk_5g, _ofdm_16qam_5g, _ofdm_48m_5g, _ofdm_54m_5g, \ + _ht20_bpsk_5g, _ht20_qpsk_5g, _ht20_16qam_5g, _ht20_mcs5_5g, _ht20_mcs6_5g, _ht20_mcs7_5g, \ + _ht40_bpsk_5g, _ht40_qpsk_5g, _ht40_16qam_5g, _ht40_mcs5_5g, _ht40_mcs6_5g, _ht40_mcs7_5g, \ + _edge_enabled, _edge_cck, _edge_ofdm_20m, _edge_ofdm_40m, \ + _support_5g, \ + _edge_enabled_5g, _edge_ofdm_20m_5g, _edge_ofdm_40m_5g) { \ + .auCountryCode = (_alpha2), \ + .rTxPwr.cTxPwr2G4Cck = (_cck), \ + .rTxPwr.cTxPwr2G4OFDM_BPSK = (_ofdm_bpsk), \ + .rTxPwr.cTxPwr2G4OFDM_QPSK = (_ofdm_qpsk), \ + .rTxPwr.cTxPwr2G4OFDM_16QAM = (_ofdm_16qam), \ + .rTxPwr.cTxPwr2G4OFDM_48Mbps = (_ofdm_48m), \ + .rTxPwr.cTxPwr2G4OFDM_54Mbps = (_ofdm_54m), \ + .rTxPwr.cTxPwr2G4HT20_BPSK = (_ht20_bpsk), \ + .rTxPwr.cTxPwr2G4HT20_QPSK = (_ht20_qpsk), \ + .rTxPwr.cTxPwr2G4HT20_16QAM = (_ht20_16qam), \ + .rTxPwr.cTxPwr2G4HT20_MCS5 = (_ht20_mcs5), \ + .rTxPwr.cTxPwr2G4HT20_MCS6 = (_ht20_mcs6), \ + .rTxPwr.cTxPwr2G4HT20_MCS7 = (_ht20_mcs7), \ + .rTxPwr.cTxPwr2G4HT40_BPSK = (_ht40_bpsk), \ + .rTxPwr.cTxPwr2G4HT40_QPSK = (_ht40_qpsk), \ + .rTxPwr.cTxPwr2G4HT40_16QAM = (_ht40_16qam), \ + .rTxPwr.cTxPwr2G4HT40_MCS5 = (_ht40_mcs5), \ + .rTxPwr.cTxPwr2G4HT40_MCS6 = (_ht40_mcs6), \ + .rTxPwr.cTxPwr2G4HT40_MCS7 = (_ht40_mcs7), \ + .rTxPwr.cTxPwr5GOFDM_BPSK = (_ofdm_bpsk_5g), \ + .rTxPwr.cTxPwr5GOFDM_QPSK = (_ofdm_qpsk_5g), \ + .rTxPwr.cTxPwr5GOFDM_16QAM = (_ofdm_16qam_5g), \ + .rTxPwr.cTxPwr5GOFDM_48Mbps = (_ofdm_48m_5g), \ + .rTxPwr.cTxPwr5GOFDM_54Mbps = (_ofdm_54m_5g), \ + .rTxPwr.cTxPwr5GHT20_BPSK = (_ht20_bpsk_5g), \ + .rTxPwr.cTxPwr5GHT20_QPSK = (_ht20_qpsk_5g), \ + .rTxPwr.cTxPwr5GHT20_16QAM = (_ht20_16qam_5g), \ + .rTxPwr.cTxPwr5GHT20_MCS5 = (_ht20_mcs5_5g), \ + .rTxPwr.cTxPwr5GHT20_MCS6 = (_ht20_mcs6_5g), \ + .rTxPwr.cTxPwr5GHT20_MCS7 = (_ht20_mcs7_5g), \ + .rTxPwr.cTxPwr5GHT40_BPSK = (_ht40_bpsk_5g), \ + .rTxPwr.cTxPwr5GHT40_QPSK = (_ht40_qpsk_5g), \ + .rTxPwr.cTxPwr5GHT40_16QAM = (_ht40_16qam_5g), \ + .rTxPwr.cTxPwr5GHT40_MCS5 = (_ht40_mcs5_5g), \ + .rTxPwr.cTxPwr5GHT40_MCS6 = (_ht40_mcs6_5g), \ + .rTxPwr.cTxPwr5GHT40_MCS7 = (_ht40_mcs7_5g), \ + .ucTxPwrValid = 1, \ + .r2GBandEdgePwr.fg2G4BandEdgePwrUsed = (_edge_enabled), \ + .r2GBandEdgePwr.cBandEdgeMaxPwrCCK = (_edge_cck), \ + .r2GBandEdgePwr.cBandEdgeMaxPwrOFDM20 = (_edge_ofdm_20m), \ + .r2GBandEdgePwr.cBandEdgeMaxPwrOFDM40 = (_edge_ofdm_40m), \ + .ucSupport5GBand = (_support_5g), \ + .r5GBandEdgePwr.uc5GBandEdgePwrUsed = (_edge_enabled_5g), \ + .r5GBandEdgePwr.c5GBandEdgeMaxPwrOFDM20 = (_edge_ofdm_20m_5g), \ + .r5GBandEdgePwr.c5GBandEdgeMaxPwrOFDM40 = (_edge_ofdm_40m_5g), \ +} + +static COUNTRY_POWER_TABLE asCountryPwrTbl[] = { + COUNTRY_PWR_TBL("WW", /* country code */ + 0x1D, /* CCK */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* OFDM */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, /* 5G_OFDM */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, /* 5G_HT20 */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, /* 5G_HT40 */ + 0x1, 0x1C, 0x1D, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x1E, 0x1E), /* 5G band edge */ + COUNTRY_PWR_TBL("US", /* country code */ + 0x1D, /* CCK */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* OFDM */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, /* 5G_OFDM */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, /* 5G_HT20 */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, /* 5G_HT40 */ + 0x1, 0x1C, 0x1D, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x1E, 0x1E), /* 5G band edge */ + COUNTRY_PWR_TBL("EU", /* country code */ + 0x1F, /* CCK */ + 0x23, 0x23, 0x23, 0x23, 0x23, /* OFDM */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, /* 5G_OFDM */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* 5G_HT20 */ + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, /* 5G_HT40 */ + 0x1, 0x1F, 0x1E, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x1B, 0x21), /* 5G band edge */ + COUNTRY_PWR_TBL("JP", /* country code */ + 0x24, /* CCK */ + 0x23, 0x23, 0x23, 0x23, 0x23, /* OFDM */ + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x21, 0x21, 0x21, 0x21, 0x21, /* 5G_OFDM */ + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, /* 5G_HT20 */ + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, /* 5G_HT40 */ + 0x1, 0x24, 0x1F, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x21, 0x21), /* 5G band edge */ +}; + +static COUNTRY_POWER_TABLE power_table_abf123[] = { + COUNTRY_PWR_TBL("WW", /* country code */ + 0x1C, /* CCK */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* OFDM */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, /* 5G_OFDM */ + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1B, /* 5G_HT20 */ + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, /* 5G_HT40 */ + 0x1, 0x26, 0x22, 0x1A, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x22, 0x18), /* 5G band edge */ + COUNTRY_PWR_TBL("US", /* country code */ + 0x1C, /* CCK */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* OFDM */ + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, /* 5G_OFDM */ + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1B, /* 5G_HT20 */ + 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, /* 5G_HT40 */ + 0x1, 0x26, 0x22, 0x1A, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x22, 0x18), /* 5G band edge */ + COUNTRY_PWR_TBL("EU", /* country code */ + 0x20, /* CCK */ + 0x24, 0x24, 0x24, 0x24, 0x24, /* OFDM */ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x20, 0x20, 0x20, 0x20, 0x20, /* 5G_OFDM */ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* 5G_HT20 */ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* 5G_HT40 */ + 0x1, 0x24, 0x24, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x20, 0x20), /* 5G band edge */ + COUNTRY_PWR_TBL("JP", /* country code */ + 0x24, /* CCK */ + 0x24, 0x24, 0x24, 0x24, 0x24, /* OFDM */ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x20, 0x20, 0x20, 0x20, 0x20, /* 5G_OFDM */ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* 5G_HT20 */ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* 5G_HT40 */ + 0x1, 0x24, 0x24, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x20, 0x20), /* 5G band edge */ +}; + +static COUNTRY_POWER_TABLE power_table_biscuit[] = { + COUNTRY_PWR_TBL("WW", /* country code */ + 0x24, /* CCK */ + 0x26, 0x26, 0x26, 0x26, 0x26, /* OFDM */ + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x24, 0x24, 0x24, 0x24, 0x20, /* 5G_OFDM */ + 0x24, 0x24, 0x24, 0x1C, 0x1C, 0x1C, /* 5G_HT20 */ + 0x22, 0x22, 0x22, 0x1C, 0x1C, 0x1C, /* 5G_HT40 */ + 0x1, 0x24, 0x26, 0x0, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x24, 0x1E), /* 5G band edge */ + COUNTRY_PWR_TBL("US", /* country code */ + 0x2A, /* CCK */ + 0x26, 0x26, 0x26, 0x26, 0x26, /* OFDM */ + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x24, 0x24, 0x24, 0x24, 0x20, /* 5G_OFDM */ + 0x24, 0x24, 0x24, 0x1C, 0x1C, 0x1C, /* 5G_HT20 */ + 0x22, 0x22, 0x22, 0x1C, 0x1C, 0x1C, /* 5G_HT40 */ + 0x1, 0x2A, 0x26, 0x0, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x1, 0x24, 0x1E), /* 5G band edge */ + COUNTRY_PWR_TBL("EU", /* country code */ + 0x24, /* CCK */ + 0x26, 0x26, 0x26, 0x26, 0x26, /* OFDM */ + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x24, 0x24, 0x24, 0x24, 0x20, /* 5G_OFDM */ + 0x24, 0x24, 0x24, 0x1C, 0x1C, 0x1C, /* 5G_HT20 */ + 0x22, 0x22, 0x22, 0x1C, 0x1C, 0x1C, /* 5G_HT40 */ + 0x1, 0x24, 0x26, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x0, 0x24, 0x0), /* 5G band edge */ + COUNTRY_PWR_TBL("JP", /* country code */ + 0x24, /* CCK */ + 0x26, 0x26, 0x26, 0x26, 0x26, /* OFDM */ + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, /* HT20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* HT40 */ + 0x24, 0x24, 0x24, 0x24, 0x20, /* 5G_OFDM */ + 0x24, 0x24, 0x24, 0x1C, 0x1C, 0x1C, /* 5G_HT20 */ + 0x22, 0x22, 0x22, 0x1C, 0x1C, 0x1C, /* 5G_HT40 */ + 0x1, 0x24, 0x26, 0x00, /* 2.4G band edge */ + 0x1, /* 5G support */ + 0x0, 0x24, 0x0), /* 5G band edge */ +}; + +struct board_id_power_table_map board_id_power_table_list[] = { + {BOARD_ID_abf123_STR, power_table_abf123, ARRAY_SIZE(power_table_abf123)}, + {BOARD_ID_BISCUIT_STR, power_table_biscuit, ARRAY_SIZE(power_table_biscuit)}, +}; +#endif /******************************************************************************* * M A C R O S @@ -1048,6 +1274,11 @@ glLoadNvram ( OFFSET_OF(WIFI_CFG_PARAM_STRUCT, aucCountryCode[0]), (PUINT_16)aucTmp); + /* cast to wide characters */ + if (('X' == aucTmp[0] && 'X' == aucTmp[1]) || + (0 == aucTmp[0] && 0 == aucTmp[1])) + aucTmp[0] = aucTmp[1] = 'W'; + // cast to wide characters prRegInfo->au2CountryCode[0] = (UINT_16) aucTmp[0]; prRegInfo->au2CountryCode[1] = (UINT_16) aucTmp[1]; @@ -1140,6 +1371,50 @@ glLoadNvram ( return; } +/*----------------------------------------------------------------------------*/ +/*! + * \brief Update Channel table for cfg80211 for Wi-Fi Direct based on current country code + * + * \param[in] prGlueInfo Pointer to glue info + * + * \return none + */ +/*----------------------------------------------------------------------------*/ +P_COUNTRY_POWER_TABLE wlanGetUpdatedPowerTable(P_UINT_8 paucCountry) +{ +#if AMZN_PWR_TABLE_ENABLE + UINT_8 i = 0; + COUNTRY_POWER_TABLE *country_pwr_tbl = asCountryPwrTbl; + int pwr_tbl_size = ARRAY_SIZE(asCountryPwrTbl); + + if (NULL == paucCountry) + return NULL; + + DBGLOG(INIT, INFO, ("aucCountry:%c%c\n", paucCountry[0], paucCountry[1])); + + for (i = 0; i < ARRAY_SIZE(board_id_power_table_list); i++) { + if (!strncmp(idme_board_id, board_id_power_table_list[i].board_id, + strlen(board_id_power_table_list[i].board_id))) { + country_pwr_tbl = board_id_power_table_list[i].power_table; + pwr_tbl_size = board_id_power_table_list[i].tbl_size; + DBGLOG(INIT, INFO, + ("board_id:%s\n", + board_id_power_table_list[i].board_id)); + break; + } + } + + for (i = 0; i < pwr_tbl_size; i++) { + if (paucCountry[0] == country_pwr_tbl[i].auCountryCode[0] && + paucCountry[1] == country_pwr_tbl[i].auCountryCode[1]) + return &country_pwr_tbl[i]; + } + + return NULL; +#else + return NULL; +#endif +} #if CFG_ENABLE_WIFI_DIRECT /*----------------------------------------------------------------------------*/ @@ -1200,7 +1475,7 @@ wlanSubModInit( ) { //4 Mark HALT, notify main thread to finish current job - prGlueInfo->ulFlag |= GLUE_FLAG_SUB_MOD_INIT; + set_bit(GLUE_FLAG_SUB_MOD_INIT, &prGlueInfo->ulFlag); /* wake up main thread */ wake_up_interruptible(&prGlueInfo->waitq); /* wait main thread finish sub module INIT*/ @@ -1236,7 +1511,7 @@ wlanSubModExit( #endif //4 Mark HALT, notify main thread to finish current job - prGlueInfo->ulFlag |= GLUE_FLAG_SUB_MOD_EXIT; + set_bit(GLUE_FLAG_SUB_MOD_EXIT, &prGlueInfo->ulFlag); /* wake up main thread */ wake_up_interruptible(&prGlueInfo->waitq); /* wait main thread finish sub module EXIT */ @@ -1480,7 +1755,7 @@ wlanDoIOCTL( ret = priv_support_ioctl(prDev, prIFReq, i4Cmd); } else { - DBGLOG(INIT, WARN, ("Unexpected ioctl command: 0x%04x\n", i4Cmd)); + DBGLOG(INIT, INFO, ("Unexpected ioctl command: 0x%04x\n", i4Cmd)); /* return 0 for safe? */ } @@ -1501,6 +1776,7 @@ static struct delayed_work workq; static struct net_device *gPrDev; static BOOLEAN fgIsWorkMcStart = FALSE; static BOOLEAN fgIsWorkMcEverInit = FALSE; +static struct wireless_dev *gprWdev; static void wlanSetMulticastList (struct net_device *prDev) @@ -2250,7 +2526,7 @@ wlanNetCreate( //4 <1.1> Create wireless_dev prWdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL); - DBGLOG(INIT, INFO, ("wireless_dev prWdev(0x%p) allocated\n", prWdev)); + DBGLOG(INIT, TRACE, ("wireless_dev prWdev(0x%p) allocated\n", prWdev)); if (!prWdev) { DBGLOG(INIT, ERROR, ("Allocating memory to wireless_dev context failed\n")); return NULL; @@ -2258,7 +2534,7 @@ wlanNetCreate( //4 <1.2> Create wiphy prWdev->wiphy = wiphy_new(&mtk_wlan_ops, sizeof(GLUE_INFO_T)); - DBGLOG(INIT, INFO, ("wiphy (0x%p) allocated\n", prWdev->wiphy)); + DBGLOG(INIT, TRACE, ("wiphy (0x%p) allocated\n", prWdev->wiphy)); if (!prWdev->wiphy) { DBGLOG(INIT, ERROR, ("Allocating memory to wiphy device failed\n")); kfree(prWdev); @@ -2279,7 +2555,7 @@ wlanNetCreate( //4 <1.4> configure wireless_dev & wiphy prWdev->iftype = NL80211_IFTYPE_STATION; - prWdev->wiphy->max_scan_ssids = 1; /* FIXME: for combo scan */ + prWdev->wiphy->max_scan_ssids = 4; /* FIXME: for combo scan */ prWdev->wiphy->max_scan_ie_len = 512; prWdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC); prWdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &mtk_band_2ghz; @@ -2308,7 +2584,7 @@ wlanNetCreate( //4 <3> Initial Glue structure //4 <3.1> Create net device -#if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) +#if CFG_TC1_FEATURE if (wlan_if_changed) { prGlueInfo->prDevHandler = alloc_netdev_mq(sizeof(P_GLUE_INFO_T), NIC_INF_NAME_IN_AP_MODE, ether_setup, CFG_MAX_TXQ_NUM); } else { @@ -2318,7 +2594,7 @@ wlanNetCreate( prGlueInfo->prDevHandler = alloc_netdev_mq(sizeof(P_GLUE_INFO_T), NIC_INF_NAME, ether_setup, CFG_MAX_TXQ_NUM); #endif - DBGLOG(INIT, INFO, ("net_device prDev(0x%p) allocated\n", prGlueInfo->prDevHandler)); + DBGLOG(INIT, TRACE, ("net_device prDev(0x%p) allocated\n", prGlueInfo->prDevHandler)); if (!prGlueInfo->prDevHandler) { DBGLOG(INIT, ERROR, ("Allocating memory to net_device context failed\n")); goto netcreate_err; @@ -2336,6 +2612,7 @@ wlanNetCreate( //4 <3.1.2> co-relate with wiphy bi-directionally prGlueInfo->prDevHandler->ieee80211_ptr = prWdev; + gprWdev = prWdev; #if CFG_TCP_IP_CHKSUM_OFFLOAD prGlueInfo->prDevHandler->features = NETIF_F_HW_CSUM; #endif @@ -2474,10 +2751,28 @@ wlanNetDestroy( } /* end of wlanNetDestroy() */ #ifndef CONFIG_X86 -UINT_8 g_aucBufIpAddr[32] = {0}; +UINT_8 g_aucBufIpAddr[64] = {0}; +static void wlanNotifyFwSuspend(P_GLUE_INFO_T prGlueInfo, BOOLEAN fgSuspend) +{ + WLAN_STATUS rStatus = WLAN_STATUS_FAILURE; + UINT_32 u4SetInfoLen; + + rStatus = kalIoctl(prGlueInfo, + wlanoidNotifyFwSuspend, + (PVOID)&fgSuspend, + sizeof(fgSuspend), + FALSE, + FALSE, + TRUE, + FALSE, + &u4SetInfoLen); + if (rStatus != WLAN_STATUS_SUCCESS) + DBGLOG(INIT, INFO, ("wlanNotifyFwSuspend fail\n")); +} void wlanHandleSystemSuspend(void) { + WLAN_STATUS rStatus = WLAN_STATUS_FAILURE; struct net_device *prDev = NULL; P_GLUE_INFO_T prGlueInfo = NULL; UINT_8 ip[4] = { 0 }; @@ -2485,6 +2780,7 @@ void wlanHandleSystemSuspend(void) #ifdef CONFIG_IPV6 UINT_8 ip6[16] = { 0 }; // FIX ME: avoid to allocate large memory in stack UINT_32 u4NumIPv6 = 0; + P_PARAM_NETWORK_ADDRESS_IPV6 prParamIpv6Addr; #endif UINT_32 i; P_PARAM_NETWORK_ADDRESS_IP prParamIpAddr; @@ -2501,13 +2797,16 @@ void wlanHandleSystemSuspend(void) // ASSERT(prDev); fgIsUnderSuspend = true; + /* <2> acquire the prGlueInfo */ + prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); + ASSERT(prGlueInfo); - // <2> get the IPv4 address + /* <3> get the IPv4 address */ if(!prDev || !(prDev->ip_ptr)||\ !((struct in_device *)(prDev->ip_ptr))->ifa_list||\ !(&(((struct in_device *)(prDev->ip_ptr))->ifa_list->ifa_local))){ DBGLOG(INIT, INFO, ("ip is not avaliable.\n")); - return; + goto notify_suspend; } // <3> acquire the prGlueInfo @@ -2528,37 +2827,39 @@ void wlanHandleSystemSuspend(void) } #ifdef CONFIG_IPV6 - // <5> get the IPv6 address - if(!prDev || !(prDev->ip6_ptr)||\ - !((struct in_device *)(prDev->ip6_ptr))->ifa_list||\ - !(&(((struct in_device *)(prDev->ip6_ptr))->ifa_list->ifa_local))){ - DBGLOG(INIT, INFO, ("ipv6 is not avaliable.\n")); - return; - } - // <6> copy the IPv6 address - kalMemCopy(ip6, &(((struct in_device *)(prDev->ip6_ptr))->ifa_list->ifa_local), sizeof(ip6)); - DBGLOG(INIT, INFO, ("ipv6 is %d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\n", - ip6[0],ip6[1],ip6[2],ip6[3], - ip6[4],ip6[5],ip6[6],ip6[7], - ip6[8],ip6[9],ip6[10],ip6[11], - ip6[12],ip6[13],ip6[14],ip6[15] - )); +// <5> get the IPv6 address + if(!prDev || !(prDev->ip6_ptr)||\ + !((struct inet6_dev *)(prDev->ip6_ptr))->addr_list.next){ + DBGLOG(INIT, WARN, ("ipv6 is not avaliable.\n")); + u4NumIPv6 = 0; + } else { + struct inet6_ifaddr *ifa; + struct list_head *addr_list; + addr_list = &(((struct inet6_dev *)(prDev->ip6_ptr))->addr_list); + ifa = list_entry(addr_list->next, typeof (*ifa), if_list); - // todo: traverse between list to find whole sets of IPv6 addresses - if (!((ip6[0] == 0) && - (ip6[1] == 0) && - (ip6[2] == 0) && - (ip6[3] == 0) && - (ip6[4] == 0) && - (ip6[5] == 0))) { - //u4NumIPv6++; - } + // <6> copy the IPv6 address + kalMemCopy(ip6,&(ifa->addr.s6_addr[0]), sizeof (ip6)); + DBGLOG(INIT, INFO, ("ipv6 is %d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\n", + ip6[0],ip6[1],ip6[2],ip6[3], + ip6[4],ip6[5],ip6[6],ip6[7], + ip6[8],ip6[9],ip6[10],ip6[11], + ip6[12],ip6[13],ip6[14],ip6[15] + )); + // todo: traverse between list to find whole sets of IPv6 addresses + for (i = 0; i < sizeof (ip6); i++) { + if (ip6[i] != 0) + { + u4NumIPv6 = 1; + break; + } + } + } #endif // <7> set up the ARP filter { - WLAN_STATUS rStatus = WLAN_STATUS_FAILURE; UINT_32 u4SetInfoLen = 0; // UINT_8 aucBuf[32] = {0}; UINT_32 u4Len = OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST, arAddress); @@ -2567,33 +2868,39 @@ void wlanHandleSystemSuspend(void) kalMemZero(g_aucBufIpAddr, sizeof(g_aucBufIpAddr)); - prParamNetAddrList->u4AddressCount = u4NumIPv4 + u4NumIPv6; +#ifdef CONFIG_IPV6 + prParamNetAddrList->u4AddressCount = u4NumIPv4 + u4NumIPv6; + DBGLOG(INIT, INFO, ("u4NumIPv4:%d, u4NumIPv6:%d\n", u4NumIPv4, u4NumIPv6)); +#else + prParamNetAddrList->u4AddressCount = u4NumIPv4; + DBGLOG(INIT, INFO, ("u4NumIPv4:%d\n", u4NumIPv4)); +#endif prParamNetAddrList->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP; - for (i = 0; i < u4NumIPv4; i++) { + if (u4NumIPv4 > 0){ + DBGLOG(INIT, LOUD, ("prParamNetAddr:%p\n", prParamNetAddr)); prParamNetAddr->u2AddressLength = sizeof(PARAM_NETWORK_ADDRESS_IP);//4;; prParamNetAddr->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP;; -#if 0 - kalMemCopy(prParamNetAddr->aucAddress, ip, sizeof(ip)); - prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((UINT_32)prParamNetAddr + sizeof(ip)); - u4Len += OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(ip); -#else prParamIpAddr = (P_PARAM_NETWORK_ADDRESS_IP)prParamNetAddr->aucAddress; kalMemCopy(&prParamIpAddr->in_addr, ip, sizeof(ip)); - prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((ULONG)prParamNetAddr + sizeof(PARAM_NETWORK_ADDRESS)); - u4Len += OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(PARAM_NETWORK_ADDRESS); -#endif + prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((ULONG)prParamNetAddr + prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + u4Len += prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress); + DBGLOG(INIT, LOUD, ("prParamNetAddr:%p\n", prParamNetAddr)); } #ifdef CONFIG_IPV6 - for (i = 0; i < u4NumIPv6; i++) { - prParamNetAddr->u2AddressLength = 6;; - prParamNetAddr->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP;; - kalMemCopy(prParamNetAddr->aucAddress, ip6, sizeof(ip6)); - prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((ULONG)prParamNetAddr + sizeof(ip6)); - u4Len += OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(ip6); - } + if (u4NumIPv6 > 0) { + DBGLOG(INIT, LOUD, ("prParamNetAddr:%p\n", prParamNetAddr)); + prParamNetAddr->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP; + prParamNetAddr->u2AddressLength = sizeof (PARAM_NETWORK_ADDRESS_IPV6); + prParamIpv6Addr = (P_PARAM_NETWORK_ADDRESS_IPV6)prParamNetAddr->aucAddress; + kalMemCopy(prParamIpv6Addr->addr, ip6, sizeof (ip6)); + prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((ULONG)prParamNetAddr + prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + u4Len += prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress); + DBGLOG(INIT, LOUD, ("prParamIpv6Addr:%p\n", prParamIpv6Addr)); + } #endif ASSERT(u4Len <= sizeof(g_aucBufIpAddr/*aucBuf*/)); + DBGLOG(REQ, LOUD, ("kalIoctl (0x%p, 0x%p)\n", prGlueInfo, prParamNetAddrList)); rStatus = kalIoctl(prGlueInfo, wlanoidSetNetworkAddress, (PVOID)prParamNetAddrList, @@ -2605,9 +2912,33 @@ void wlanHandleSystemSuspend(void) &u4SetInfoLen); if (rStatus != WLAN_STATUS_SUCCESS) { - DBGLOG(INIT, INFO, ("set HW pattern filter fail 0x%x\n", rStatus)); + DBGLOG(REQ, ERROR, ("set HW pattern filter fail 0x%x\n", rStatus)); } + +#ifdef CONFIG_IPV6 + DBGLOG(REQ, LOUD, ("kalIoctl (0x%p, 0x%p)\n", prGlueInfo, prParamNetAddrList)); + rStatus = kalIoctl(prGlueInfo, + wlanoidSetIPv6NetworkAddress, + (PVOID)prParamNetAddrList, + u4Len, + FALSE, + FALSE, + TRUE, + FALSE, + &u4SetInfoLen); + + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(REQ, WARN, ("set IPv6 HW pattern filter fail 0x%x\n", rStatus)); + } +#endif + } + +notify_suspend: + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, WARN, ("[Suspend Error] set HW pattern filter fail 0x%x\n", rStatus)); + wlanNotifyFwSuspend(prGlueInfo, TRUE); + } } void wlanHandleSystemResume(void) @@ -2673,7 +3004,7 @@ void wlanHandleSystemResume(void) !((struct in_device *)(prDev->ip_ptr))->ifa_list||\ !(&(((struct in_device *)(prDev->ip_ptr))->ifa_list->ifa_local))){ DBGLOG(INIT, INFO, ("ip is not avaliable.\n")); - return; + goto notify_resume; } // <4> copy the IPv4 address @@ -2682,27 +3013,31 @@ void wlanHandleSystemResume(void) ip[0],ip[1],ip[2],ip[3])); #ifdef CONFIG_IPV6 - // <5> get the IPv6 address - if(!prDev || !(prDev->ip6_ptr)||\ - !((struct in_device *)(prDev->ip6_ptr))->ifa_list||\ - !(&(((struct in_device *)(prDev->ip6_ptr))->ifa_list->ifa_local))){ - DBGLOG(INIT, INFO, ("ipv6 is not avaliable.\n")); - return; - } - // <6> copy the IPv6 address - kalMemCopy(ip6, &(((struct in_device *)(prDev->ip6_ptr))->ifa_list->ifa_local), sizeof(ip6)); - DBGLOG(INIT, INFO, ("ipv6 is %d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\n", - ip6[0],ip6[1],ip6[2],ip6[3], - ip6[4],ip6[5],ip6[6],ip6[7], - ip6[8],ip6[9],ip6[10],ip6[11], - ip6[12],ip6[13],ip6[14],ip6[15] - )); +// <5> get the IPv6 address + if(!prDev || !(prDev->ip6_ptr)||\ + !((struct inet6_dev *)(prDev->ip6_ptr))->addr_list.next){ + DBGLOG(INIT, WARN, ("ipv6 is not avaliable.\n")); + } else { + struct inet6_ifaddr *ifa; + struct list_head *addr_list; + addr_list = &(((struct inet6_dev *)(prDev->ip6_ptr))->addr_list); + ifa = list_entry(addr_list->next, typeof (*ifa), if_list); + + // <6> copy the IPv6 address + kalMemCopy(ip6,&(ifa->addr.s6_addr[0]), sizeof (ip6)); + DBGLOG(INIT, INFO, ("ipv6 is %d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\n", + ip6[0],ip6[1],ip6[2],ip6[3], + ip6[4],ip6[5],ip6[6],ip6[7], + ip6[8],ip6[9],ip6[10],ip6[11], + ip6[12],ip6[13],ip6[14],ip6[15] + )); + } + #endif // <7> clear the ARP filter { WLAN_STATUS rStatus = WLAN_STATUS_FAILURE; UINT_32 u4SetInfoLen = 0; -// UINT_8 aucBuf[32] = {0}; UINT_32 u4Len = sizeof(PARAM_NETWORK_ADDRESS_LIST); P_PARAM_NETWORK_ADDRESS_LIST prParamNetAddrList = (P_PARAM_NETWORK_ADDRESS_LIST)g_aucBufIpAddr;//aucBuf; @@ -2723,9 +3058,31 @@ void wlanHandleSystemResume(void) &u4SetInfoLen); if (rStatus != WLAN_STATUS_SUCCESS) { - DBGLOG(INIT, INFO, ("set HW pattern filter fail 0x%x\n", rStatus)); + DBGLOG(INIT, WARN, ("clear HW pattern filter fail 0x%x\n", rStatus)); } + +#ifdef CONFIG_IPV6 + rStatus = kalIoctl(prGlueInfo, + wlanoidSetIPv6NetworkAddress, + (PVOID)prParamNetAddrList, + u4Len, + FALSE, + FALSE, + TRUE, + FALSE, + &u4SetInfoLen); + + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, WARN, ("clear IPv6 HW pattern filter fail 0x%x\n", rStatus)); + } +#endif } + +notify_resume: + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, WARN, ("set HW pattern filter fail 0x%x\n", rStatus)); + wlanNotifyFwSuspend(prGlueInfo, FALSE); + } } #endif //! CONFIG_X86 @@ -2864,6 +3221,93 @@ set_dbg_level_handler( kalPrint("[wlan] change debug level"); } +#ifdef CONFIG_IDME +static int idme_get_mac_addr(UINT_8 *mac_addr) +{ + UINT_8 buf[PARAM_MAC_ADDR_LEN * 2 + 1] = {""}, str[3] = {""}; + int i, mac[PARAM_MAC_ADDR_LEN]; + mm_segment_t fs; + struct file *f; + size_t len; + + f = filp_open(IDME_OF_MAC_ADDR, O_RDONLY, 0); + if (IS_ERR(f)) { + DBGLOG(INIT, ERROR, ("(IDME) cannot read %s\n", IDME_OF_MAC_ADDR)); + return -1; + } + + fs = get_fs(); + set_fs(get_ds()); + f->f_op->read(f, buf, PARAM_MAC_ADDR_LEN * 2, &f->f_pos); + set_fs(fs); + + if (strlen(buf) != PARAM_MAC_ADDR_LEN * 2) + goto bailout; + + for (i = 0; i < PARAM_MAC_ADDR_LEN; i++) { + str[0] = buf[i * 2]; + str[1] = buf[i * 2 + 1]; + if (!isxdigit(str[0]) || !isxdigit(str[1])) + goto bailout; + len = sscanf(str, "%02x", &mac[i]); + if (len != 1) + goto bailout; + } + for (i = 0; i < PARAM_MAC_ADDR_LEN; i++) + mac_addr[i] = (UINT_8)mac[i]; + + DBGLOG(INIT, INFO, ("(IDME) mac_addr: xx:xx:xx:%02x:%02x:%02x\n", + mac_addr[3], mac_addr[4], mac_addr[5])); + return 0; +bailout: + DBGLOG(INIT, ERROR, ("(IDME) wrong mac_addr '%s', expected format 10AE60112233\n", buf)); + return -1; +} + +static void idme_get_board_id(P_REG_INFO_T prRegInfo) +{ +#ifdef CONFIG_OF + struct device_node *ap; + int len; + + ap = of_find_node_by_path(IDME_OF_BOARD_ID); + if (likely(ap)) { + const char *board_id = of_get_property(ap, "value", &len); + if (likely(len >= 16)) + memcpy(idme_board_id, board_id, sizeof(idme_board_id)); + } +#else + char board_id[17] = {""}; + mm_segment_t fs; + struct file *f; + + f = filp_open(IDME_OF_BOARD_ID, O_RDONLY, 0); + if (IS_ERR(f)) { + DBGLOG(INIT, ERROR, ("(IDME) cannot read %s\n", IDME_OF_BOARD_ID)); + return; + } + + fs = get_fs(); + set_fs(get_ds()); + f->f_op->read(f, board_id, 16, &f->f_pos); + set_fs(fs); + + if (strlen(board_id) == sizeof(idme_board_id)) + memcpy(idme_board_id, board_id, sizeof(idme_board_id)); +#endif +} +#endif + +INT_32 wlanRegulatoryHint(PUINT_8 pauCountryCode) +{ + if (NULL == gprWdev || NULL == pauCountryCode) { + DBGLOG(INIT, WARN, ("gprWdev:0x%p, pauCountryCode:0x%p\n", + gprWdev, pauCountryCode)); + return -1; + } + return regulatory_hint(gprWdev->wiphy, pauCountryCode); +} + /*----------------------------------------------------------------------------*/ /*! * \brief Wlan probe function. This function probes and initializes the device. @@ -2887,18 +3331,19 @@ wlanProbe( P_GLUE_INFO_T prGlueInfo = NULL; P_ADAPTER_T prAdapter = NULL; INT_32 i4Status = 0; + WLAN_STATUS u4SAStatus = WLAN_STATUS_SUCCESS; /* Start Adapter status */ BOOLEAN bRet = FALSE; - enum probe_fail_reason { - BUS_INIT_FAIL, - NET_CREATE_FAIL, - BUS_SET_IRQ_FAIL, - ADAPTER_START_FAIL, - NET_REGISTER_FAIL, - PROC_INIT_FAIL, - FAIL_REASON_NUM - } eFailReason; + enum probe_fail_reason { + BUS_INIT_FAIL, + NET_CREATE_FAIL, + BUS_SET_IRQ_FAIL, + ADAPTER_START_FAIL, + NET_REGISTER_FAIL, + PROC_INIT_FAIL, + + FAIL_REASON_NUM + } eFailReason; - eFailReason = FAIL_REASON_NUM; do { //4 <1> Initialize the IO port of the interface /* GeorgeKuo: pData has different meaning for _HIF_XXX: @@ -2913,7 +3358,7 @@ wlanProbe( if (FALSE == bRet) { DBGLOG(INIT, ERROR, (KERN_ALERT "wlanProbe: glBusInit() fail\n")); i4Status = -EIO; - eFailReason = BUS_INIT_FAIL; + eFailReason = BUS_INIT_FAIL; break; } @@ -2921,7 +3366,7 @@ wlanProbe( if ((prWdev = wlanNetCreate(pvData)) == NULL) { DBGLOG(INIT, ERROR, ("wlanProbe: No memory for dev and its private\n")); i4Status = -ENOMEM; - eFailReason = NET_CREATE_FAIL; + eFailReason = NET_CREATE_FAIL; break; } @@ -2949,7 +3394,7 @@ wlanProbe( if (i4Status != WLAN_STATUS_SUCCESS) { DBGLOG(INIT, ERROR, ("wlanProbe: Set IRQ error\n")); - eFailReason = BUS_SET_IRQ_FAIL; + eFailReason = BUS_SET_IRQ_FAIL; break; } @@ -3009,8 +3454,14 @@ wlanProbe( prRegInfo->u4StartAddress = CFG_FW_START_ADDRESS; prRegInfo->u4LoadAddress = CFG_FW_LOAD_ADDRESS; +#ifdef CONFIG_IDME + idme_get_board_id(prRegInfo); +#endif // Load NVRAM content to REG_INFO_T glLoadNvram(prGlueInfo, prRegInfo); +#ifdef CONFIG_IDME + idme_get_mac_addr(&(prRegInfo->aucMacAddr[0])); +#endif #if CFG_SUPPORT_CFG_FILE wlanCfgApply(prAdapter); #endif @@ -3026,8 +3477,11 @@ wlanProbe( goto bailout; } else { - if (wlanAdapterStart(prAdapter, prRegInfo, prFwBuffer, u4FwSize) != WLAN_STATUS_SUCCESS) { - i4Status = -EIO; + if ((u4SAStatus = wlanAdapterStart(prAdapter, prRegInfo, prFwBuffer, u4FwSize)) != WLAN_STATUS_SUCCESS) { + if (u4SAStatus == 0xFDEAD) + i4Status = -0xFDEAD; + else + i4Status = -EIO; } } @@ -3059,7 +3513,7 @@ bailout: if (wlanAdapterStart(prAdapter, prRegInfo, NULL, 0) != WLAN_STATUS_SUCCESS) { i4Status = -EIO; - eFailReason = ADAPTER_START_FAIL; + eFailReason = ADAPTER_START_FAIL; break; } #endif @@ -3158,19 +3612,27 @@ bailout: if ((i4DevIdx = wlanNetRegister(prWdev)) < 0){ i4Status = -ENXIO; DBGLOG(INIT, ERROR, ("wlanProbe: Cannot register the net_device context to the kernel\n")); - eFailReason = NET_REGISTER_FAIL; + eFailReason = NET_REGISTER_FAIL; break; } wlanRegisterNotifier(); //4 <6> Initialize /proc filesystem #ifdef WLAN_INCLUDE_PROC - DBGLOG(INIT, TRACE, ("init procfs...\n")); - if ( (i4Status = procInitProcfs(prDev, NIC_DEVICE_ID_LOW)) < 0) { + DBGLOG(INIT, TRACE, ("init procfs...\n")); +#if 0 + if ( (i4Status = procInitProcfs(prDev, NIC_DEVICE_ID_LOW)) < 0) { DBGLOG(INIT, ERROR, ("wlanProbe: init procfs failed\n")); - eFailReason = PROC_INIT_FAIL; + eFailReason = PROC_INIT_FAIL; break; - } + } +#endif + i4Status = procCreateFsEntry(prGlueInfo); + if (i4Status < 0) { + DBGLOG(INIT, ERROR, ("wlanProbe: Creat procfs failed\n")); + eFailReason = PROC_INIT_FAIL; + break; + } #endif /* WLAN_INCLUDE_PROC */ #if CFG_ENABLE_BT_OVER_WIFI @@ -3199,30 +3661,29 @@ bailout: while (FALSE); if (i4Status != WLAN_STATUS_SUCCESS) - { - switch (eFailReason) - { - case PROC_INIT_FAIL: - wlanNetUnregister(prWdev); - case NET_REGISTER_FAIL: - set_bit(GLUE_FLAG_HALT_BIT, &prGlueInfo->ulFlag); - /* wake up main thread */ - wake_up_interruptible(&prGlueInfo->waitq); - /* wait main thread stops */ - wait_for_completion_interruptible(&prGlueInfo->rHaltComp); - KAL_WAKE_LOCK_DESTROY(prGlueInfo->prAdapter, &prGlueInfo->rAhbIsrWakeLock); - wlanAdapterStop(prAdapter); - case ADAPTER_START_FAIL: - if (prWdev != NULL) - glBusFreeIrq(prWdev->netdev, *((P_GLUE_INFO_T *) netdev_priv(prWdev->netdev))); - case BUS_SET_IRQ_FAIL: - KAL_WAKE_LOCK_DESTROY(prAdapter, &prGlueInfo->rAhbIsrWakeLock); - wlanNetDestroy(prWdev); - case NET_CREATE_FAIL: - case BUS_INIT_FAIL: - default: - break; - } + { + switch (eFailReason) { + case PROC_INIT_FAIL: + wlanNetUnregister(prWdev); + case NET_REGISTER_FAIL: + set_bit(GLUE_FLAG_HALT_BIT, &prGlueInfo->ulFlag); + /* wake up main thread */ + wake_up_interruptible(&prGlueInfo->waitq); + /* wait main thread stops */ + wait_for_completion_interruptible(&prGlueInfo->rHaltComp); + KAL_WAKE_LOCK_DESTROY(prAdapter, &prAdapter->rTxThreadWakeLock); + wlanAdapterStop(prAdapter); + case ADAPTER_START_FAIL: + glBusFreeIrq(prWdev->netdev, *((P_GLUE_INFO_T *) netdev_priv(prWdev->netdev))); + case BUS_SET_IRQ_FAIL: + KAL_WAKE_LOCK_DESTROY(prAdapter, &prGlueInfo->rAhbIsrWakeLock); + wlanNetDestroy(prWdev); + case NET_CREATE_FAIL: + case BUS_INIT_FAIL: + break; + } + DBGLOG(INIT, ERROR, ("wlanProbe %d\n", i4Status)); + return i4Status; } #if CFG_ENABLE_WIFI_DIRECT @@ -3239,28 +3700,14 @@ bailout: kalIndicateAgpsNotify(prAdapter, AGPS_EVENT_WLAN_ON, NULL, 0); #endif #if (CFG_SUPPORT_MET_PROFILING == 1) - { - int iMetInitRet = WLAN_STATUS_FAILURE; - if (i4Status == WLAN_STATUS_SUCCESS) - { - DBGLOG(INIT, TRACE, ("init MET procfs...\n")); - iMetInitRet = kalMetInitProcfs(prGlueInfo); - if (iMetInitRet < 0) - { - DBGLOG(INIT, ERROR, ("wlanProbe: init MET procfs failed\n")); - } - } - } + DBGLOG(INIT, TRACE, ("init MET procfs...\n")); + printk("MET_PROF: MET PROCFS init....\n"); + if ( (i4Status = kalInitProcfs(prGlueInfo)) < 0) { + DBGLOG(INIT, ERROR, ("wlanProbe: init MET procfs failed\n")); + } #endif - if (i4Status == WLAN_STATUS_SUCCESS) { - /* probe ok */ - DBGLOG(INIT, TRACE, ("wlanProbe ok\n")); - } else { - /* probe failed */ - DBGLOG(INIT, ERROR, ("wlanProbe failed\n")); - } - - return i4Status; + DBGLOG(INIT, INFO, ("wlanProbe ok\n")); + return i4Status; } /* end of wlanProbe() */ @@ -3395,11 +3842,11 @@ wlanRemove( //4 <3> Remove /proc filesystem. #ifdef WLAN_INCLUDE_PROC - procRemoveProcfs(prDev, NIC_DEVICE_ID_LOW); + procRemoveProcfs(); #endif /* WLAN_INCLUDE_PROC */ #if (CFG_SUPPORT_MET_PROFILING == 1) - kalMetRemoveProcfs(); + kalRemoveProcfs(); #endif /* Force to do DMA reset */ @@ -3464,6 +3911,7 @@ static int initWlan(void) /* memory pre-allocation */ kalInitIOBuffer(); + procInitFs(); ret = ((glRegisterBus(wlanProbe, wlanRemove) == WLAN_STATUS_SUCCESS) ? 0: -EIO); @@ -3491,21 +3939,24 @@ static int initWlan(void) DBG_CLASS_WARN | \ DBG_CLASS_STATE | \ DBG_CLASS_EVENT | \ - DBG_CLASS_TRACE | \ DBG_CLASS_INFO; } + aucDebugModule[DBG_INIT_IDX] &= ~(DBG_CLASS_TRACE); + aucDebugModule[DBG_P2P_IDX] &= ~(DBG_CLASS_TRACE); aucDebugModule[DBG_TX_IDX] &= ~(DBG_CLASS_EVENT | \ - DBG_CLASS_TRACE | \ DBG_CLASS_INFO); aucDebugModule[DBG_RX_IDX] &= ~(DBG_CLASS_EVENT | \ - DBG_CLASS_TRACE | \ DBG_CLASS_INFO); aucDebugModule[DBG_REQ_IDX] &= ~(DBG_CLASS_EVENT | \ - DBG_CLASS_TRACE | \ + DBG_CLASS_INFO); + aucDebugModule[DBG_SCN_IDX] &= ~(DBG_CLASS_EVENT | \ + DBG_CLASS_INFO); + aucDebugModule[DBG_RLM_IDX] &= ~(DBG_CLASS_EVENT | \ DBG_CLASS_INFO); aucDebugModule[DBG_INTR_IDX] = 0; aucDebugModule[DBG_MEM_IDX] = 0; #endif /* DBG */ + glRegisterPlatformDev(); return ret; } /* end of initWlan() */ @@ -3525,6 +3976,7 @@ static VOID exitWlan(void) { DBGLOG(INIT, INFO, ("exitWlan\n")); + glUnregisterPlatformDev(); /* unregister set_dbg_level handler to mtk_wmt_wifi */ register_set_dbg_level_handler(NULL); @@ -3537,6 +3989,7 @@ static VOID exitWlan(void) /* free pre-allocated memory */ kalUninitIOBuffer(); + procUninitProcFs(); DBGLOG(INIT, INFO, ("exitWlan\n")); return; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_kal.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_kal.c index c0285272ca0..1bd62a868cb 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_kal.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_kal.c @@ -879,7 +879,7 @@ kalFirmwareOpen ( DBGLOG(INIT, INFO, ("Open FW image: %s failed\n", CFG_FW_FILENAME)); goto error_open; } - DBGLOG(INIT, INFO, ("Open FW image: %s done\n", CFG_FW_FILENAME)); + DBGLOG(INIT, TRACE, ("Open FW image: %s done\n", CFG_FW_FILENAME)); return WLAN_STATUS_SUCCESS; error_open: @@ -1816,12 +1816,15 @@ kalRxIndicatePkts ( #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) if(!in_interrupt()){ + glIndicateWoWPacket(prSkb); netif_rx_ni(prSkb); /* only in non-interrupt context */ } else { + glIndicateWoWPacket(prSkb); netif_rx(prSkb); } #else + glIndicateWoWPacket(prSkb); netif_rx(prSkb); #endif @@ -1900,9 +1903,8 @@ kalIndicateStatusAndComplete ( ssid.aucSsid[(ssid.u4SsidLen >= PARAM_MAX_LEN_SSID) ? (PARAM_MAX_LEN_SSID - 1) : ssid.u4SsidLen ] = '\0'; - DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [ssid:%s " MACSTR "]\n", + DBGLOG(INIT, INFO, ("[wifi] %s netif_carrier_on [" MACSTR "]\n", prGlueInfo->prDevHandler->name, - ssid.aucSsid, MAC2STR(arBssid))); } while(0); @@ -1940,8 +1942,18 @@ kalIndicateStatusAndComplete ( } /* CFG80211 Indication */ - if(eStatus == WLAN_STATUS_MEDIA_CONNECT - && prGlueInfo->prDevHandler->ieee80211_ptr->sme_state == CFG80211_SME_CONNECTING) { + if(eStatus == WLAN_STATUS_ROAM_OUT_FIND_BEST + && prGlueInfo->prDevHandler->ieee80211_ptr->sme_state == CFG80211_SME_CONNECTED) { + cfg80211_roamed_bss(prGlueInfo->prDevHandler, + bss, + prGlueInfo->aucReqIe, + prGlueInfo->u4ReqIeLength, + prGlueInfo->aucRspIe, + prGlueInfo->u4RspIeLength, + GFP_KERNEL); + bss = NULL; + } else if(prGlueInfo->prDevHandler->ieee80211_ptr->sme_state == CFG80211_SME_CONNECTING) { + /* to support user space roaming, cfg80211 will change the sme_state to connecting before reassociate */ cfg80211_connect_result(prGlueInfo->prDevHandler, arBssid, prGlueInfo->aucReqIe, @@ -1951,21 +1963,14 @@ kalIndicateStatusAndComplete ( WLAN_STATUS_SUCCESS, GFP_KERNEL); } - else if(eStatus == WLAN_STATUS_ROAM_OUT_FIND_BEST - && prGlueInfo->prDevHandler->ieee80211_ptr->sme_state == CFG80211_SME_CONNECTED) { - cfg80211_roamed_bss(prGlueInfo->prDevHandler, - bss, - prGlueInfo->aucReqIe, - prGlueInfo->u4ReqIeLength, - prGlueInfo->aucRspIe, - prGlueInfo->u4RspIeLength, - GFP_KERNEL); - } + if (bss) + cfg80211_put_bss(priv_to_wiphy(prGlueInfo), bss); } break; case WLAN_STATUS_MEDIA_DISCONNECT: + case WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY: /* indicate disassoc event */ wext_indicate_wext_event(prGlueInfo, SIOCGIWAP, NULL, 0); /* For CR 90 and CR99, While supplicant do reassociate, driver will do netif_carrier_off first, @@ -1983,14 +1988,16 @@ kalIndicateStatusAndComplete ( netif_carrier_off(prGlueInfo->prDevHandler); - if(prGlueInfo->fgIsRegistered == TRUE - && prGlueInfo->prDevHandler->ieee80211_ptr->sme_state == CFG80211_SME_CONNECTED) { - P_WIFI_VAR_T prWifiVar = &prGlueInfo->prAdapter->rWifiVar; - UINT_16 u2DeauthReason = prWifiVar->arBssInfo[NETWORK_TYPE_AIS_INDEX].u2DeauthReason; - /* CFG80211 Indication */ - DBGLOG(INIT, INFO, ("[wifi] %s cfg80211_disconnected\n", prGlueInfo->prDevHandler->name)); - cfg80211_disconnected(prGlueInfo->prDevHandler, u2DeauthReason, NULL, 0, GFP_KERNEL); - } + if(prGlueInfo->fgIsRegistered == TRUE + && (prGlueInfo->prDevHandler->ieee80211_ptr->sme_state == CFG80211_SME_CONNECTED + || prGlueInfo->prDevHandler->ieee80211_ptr->sme_state == CFG80211_SME_CONNECTING) && + eStatus == WLAN_STATUS_MEDIA_DISCONNECT) { + P_WIFI_VAR_T prWifiVar = &prGlueInfo->prAdapter->rWifiVar; + UINT_16 u2DeauthReason = prWifiVar->arBssInfo[NETWORK_TYPE_AIS_INDEX].u2DeauthReason; + /* CFG80211 Indication */ + DBGLOG(INIT, INFO, ("[wifi] %s cfg80211_disconnected\n", prGlueInfo->prDevHandler->name)); + cfg80211_disconnected(prGlueInfo->prDevHandler, u2DeauthReason, NULL, 0, GFP_KERNEL); + } prGlueInfo->eParamMediaStateIndicated = PARAM_MEDIA_STATE_DISCONNECTED; @@ -3255,6 +3262,7 @@ kalIsCardRemoved( // Linux MMC doesn't have removal notification yet } + /*----------------------------------------------------------------------------*/ /*! * \brief This routine is used to send command to firmware for overriding netweork address @@ -3274,6 +3282,11 @@ kalRetrieveNetworkAddress( ASSERT(prGlueInfo); if(prGlueInfo->fgIsMacAddrOverride == FALSE) { +#ifdef CONFIG_IDME + COPY_MAC_ADDR(prMacAddr, &prGlueInfo->rRegInfo.aucMacAddr); + return TRUE; +#else + #if !defined(CONFIG_X86) #if !defined(CONFIG_MTK_TC1_FEATURE) UINT_32 i; @@ -3303,6 +3316,7 @@ kalRetrieveNetworkAddress( /* x86 Linux doesn't need to override network address so far */ return FALSE; #endif +#endif } else { COPY_MAC_ADDR(prMacAddr, prGlueInfo->rMacAddrOverride); @@ -4692,9 +4706,10 @@ nla_put_failure: #if (CFG_SUPPORT_MET_PROFILING == 1) #define PROC_MET_PROF_CTRL "met_ctrl" #define PROC_MET_PROF_PORT "met_port" +#define PROC_TSF_PROF "tsf" -struct proc_dir_entry *pMetProcDir; -void *pMetGlobalData = NULL; +struct proc_dir_entry *pProcDir; +void *pProcFsGlobalData = NULL; static unsigned long __read_mostly tracing_mark_write_addr = 0; static void inline __mt_update_tracing_mark_write_addr(void) @@ -4828,8 +4843,8 @@ kalMetCtrlWriteProcfs ( if (sscanf(acBuf, " %d", &u8MetProfEnable) == 1) { printk("MET_PROF: Write MET PROC Enable=%d \n", u8MetProfEnable); } - if (pMetGlobalData != NULL) { - prGlueInfo = (P_GLUE_INFO_T) pMetGlobalData; + if (pProcFsGlobalData != NULL) { + prGlueInfo = (P_GLUE_INFO_T) pProcFsGlobalData; prGlueInfo->u8MetProfEnable = (UINT_8)u8MetProfEnable; } return count; @@ -4867,13 +4882,92 @@ kalMetPortWriteProcfs ( if (sscanf(acBuf, " %d", &u16MetUdpPort) == 1) { printk("MET_PROF: Write MET PROC UDP_PORT=%d\n", u16MetUdpPort); } - if (pMetGlobalData != NULL) { - prGlueInfo = (P_GLUE_INFO_T) pMetGlobalData; + if (pProcFsGlobalData != NULL) { + prGlueInfo = (P_GLUE_INFO_T) pProcFsGlobalData; prGlueInfo->u16MetUdpPort = (UINT_16)u16MetUdpPort; } return count; } +/*----------------------------------------------------------------------------*/ +/*! +* \brief The PROC function for reading TSF information. +* +* \param[in] file pointer to file. +* \param[in] buffer Buffer from user space. +* \param[in] count Number of characters to write +* \param[in] data Pointer to the private data structure. +* +* \return number of characters write from User Space. +*/ +/*----------------------------------------------------------------------------*/ +static int +kalTsfReadProcfs ( + struct file *file, + const char __user *buffer, + size_t count, + loff_t *off + ) +{ + P_GLUE_INFO_T prGlueInfo; + CMD_TSF_GET_T rTsfInfo; + UINT_32 u4BufLen; + UINT_32 u4Count; + WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; + char uaBuf[100]; + char *p = uaBuf; + UINT32 i = 0; + INT32 retval = 0; + UINT_64 TSF = 0; + ASSERT(pProcFsGlobalData); + + rTsfInfo.ucBssBmp = 0x01; /*only query AIS's TSF*/ + prGlueInfo = (P_GLUE_INFO_T) pProcFsGlobalData; + + rStatus = kalIoctl(prGlueInfo, + wlanoidQueryTsf, + (PVOID)&rTsfInfo, + sizeof(rTsfInfo), + TRUE, + TRUE, + TRUE, + FALSE, + &u4BufLen); + + if (rStatus != WLAN_STATUS_SUCCESS) { + SPRINTF(p, ("read TSF failed\n")); + goto out; + } + + DBGLOG(INIT, INFO, ("TsfInfo BssBmp %d\n", rTsfInfo.ucBssBmp)); + for (i =0; i < sizeof (rTsfInfo.ucBssBmp) * 8; i++) + { + if (0!= (rTsfInfo.ucBssBmp & (1 << i))) { + DBGLOG(INIT, INFO, ("TsfInfo bit (%d) valid, TSF[0]:0x%08x, TSF[1]:0x%08x\n", i, rTsfInfo.au4LocalTsf[i][0], rTsfInfo.au4LocalTsf[i][1])); + } + } + if (rTsfInfo.ucBssBmp & 0x1) { + TSF = rTsfInfo.au4LocalTsf[0][1]; + TSF <<= 32; + TSF += rTsfInfo.au4LocalTsf[0][0]; + SPRINTF(p, ("TSF:%llu\n", TSF)); + } else { + SPRINTF(p, ("read TSF failed\n")); + } +out: + u4Count = (UINT_32)((ULONG)p - (ULONG)uaBuf); + count = (u4Count > count) ? count : u4Count; + retval = copy_to_user(buffer, uaBuf, count); + if (retval) { + DBGLOG(INIT, INFO, ("%s copy to user buffer failed\n", __func__)); + retval = 0; + } else + retval = count; + + return retval; +} + + struct file_operations rMetProcCtrlFops = { write: kalMetCtrlWriteProcfs @@ -4882,12 +4976,16 @@ struct file_operations rMetProcPortFops = { write: kalMetPortWriteProcfs }; - -int kalMetInitProcfs( +struct file_operations rProcTsfFops = { + read: kalTsfReadProcfs + +}; + +int kalInitProcfs( IN P_GLUE_INFO_T prGlueInfo ) { - //struct proc_dir_entry *pMetProcDir; + //struct proc_dir_entry *pProcDir; if (init_net.proc_net == (struct proc_dir_entry *)NULL) { DBGLOG(INIT, INFO, ("init proc fs fail: proc_net == NULL\n")); return -ENOENT; @@ -4895,8 +4993,8 @@ int kalMetInitProcfs( /* * Directory: Root (/proc/net/wlan0) */ - pMetProcDir = proc_mkdir("wlan0", init_net.proc_net); - if (pMetProcDir == NULL) { + pProcDir = proc_mkdir("wlan0", init_net.proc_net); + if (pProcDir == NULL) { return -ENOENT; } /* @@ -4904,27 +5002,29 @@ int kalMetInitProcfs( |-- met_ctrl (PROC_MET_PROF_CTRL) |-- met_port (PROC_MET_PROF_PORT) */ - //proc_create(PROC_MET_PROF_CTRL, 0x0644, pMetProcDir, &rMetProcFops); - proc_create(PROC_MET_PROF_CTRL, 0, pMetProcDir, &rMetProcCtrlFops); - proc_create(PROC_MET_PROF_PORT, 0, pMetProcDir, &rMetProcPortFops); + //proc_create(PROC_MET_PROF_CTRL, 0x0644, pProcDir, &rMetProcFops); + proc_create(PROC_MET_PROF_CTRL, 0, pProcDir, &rMetProcCtrlFops); + proc_create(PROC_MET_PROF_PORT, 0, pProcDir, &rMetProcPortFops); + proc_create(PROC_TSF_PROF, 0, pProcDir, &rProcTsfFops); - pMetGlobalData = (void *) prGlueInfo; + pProcFsGlobalData = (void *) prGlueInfo; return 0; } -int kalMetRemoveProcfs(void) +int kalRemoveProcfs(void) { if (init_net.proc_net == (struct proc_dir_entry *)NULL) { DBGLOG(INIT, WARN, ("remove proc fs fail: proc_net == NULL\n")); return -ENOENT; } - remove_proc_entry(PROC_MET_PROF_CTRL, pMetProcDir); - remove_proc_entry(PROC_MET_PROF_PORT, pMetProcDir); + remove_proc_entry(PROC_MET_PROF_CTRL, pProcDir); + remove_proc_entry(PROC_MET_PROF_PORT, pProcDir); + remove_proc_entry(PROC_TSF_PROF, pProcDir); /* remove root directory (proc/net/wlan0) */ remove_proc_entry("wlan0", init_net.proc_net); /* clear MetGlobalData */ - pMetGlobalData = NULL; + pProcFsGlobalData = NULL; return 0; } diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p.c index e779bd711d9..21fa627cffe 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p.c @@ -3118,6 +3118,10 @@ mtk_p2p_wext_set_key( /* BSSID */ memcpy(prKey->arBSSID, prIWEncExt->addr.sa_data, 6); + if (prIWEncExt->key_len >= 32) { + ret = -EINVAL; + break; + } memcpy(prKey->aucKeyMaterial, prIWEncExt->key, prIWEncExt->key_len); prKey->u4KeyLength = prIWEncExt->key_len; @@ -3470,158 +3474,6 @@ mtk_p2p_wext_discovery_results( IN OUT char *extra ) { - struct iw_event iwe; - char *current_ev = extra; - UINT_32 i; - P_GLUE_INFO_T prGlueInfo = NULL; - P_ADAPTER_T prAdapter = NULL; - P_P2P_INFO_T prP2PInfo = (P_P2P_INFO_T)NULL; - P_EVENT_P2P_DEV_DISCOVER_RESULT_T prTargetResult = (P_EVENT_P2P_DEV_DISCOVER_RESULT_T)NULL; - P_PARAM_VARIABLE_IE_T prDesiredIE = NULL; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - prP2PInfo = prAdapter->prP2pInfo; - - for(i = 0 ; i < prP2PInfo->u4DeviceNum ; i++) { - prTargetResult = &prP2PInfo->arP2pDiscoverResult[i]; - - /* SIOCGIWAP */ - iwe.cmd = SIOCGIWAP; - iwe.u.ap_addr.sa_family = ARPHRD_ETHER; - memcpy(iwe.u.ap_addr.sa_data, - prTargetResult->aucInterfaceAddr, - 6); - - current_ev = iwe_stream_add_event(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, IW_EV_ADDR_LEN); - - - /* SIOCGIWESSID */ - iwe.cmd = SIOCGIWESSID; - iwe.u.data.flags = 1; - iwe.u.data.length = prTargetResult->u2NameLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, prTargetResult->aucName); - - /* IWEVGENIE for WPA IE */ - if(prTargetResult->u2IELength <= 600 && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf, - prTargetResult->u2IELength, - 0xDD, - (PUINT_8 *)&prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } - -#if CFG_SUPPORT_WPS - - /* IWEVGENIE for WPS IE */ - if((prTargetResult->u2IELength <= 600) && wextSrchDesiredWPSIE(prTargetResult->pucIeBuf, - prTargetResult->u2IELength, - 0xDD, - (PUINT_8 *)&prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } - -#endif - - /* IWEVGENIE for RSN IE */ - if((prTargetResult->u2IELength <= 600) && wextSrchDesiredWPAIE(prTargetResult->pucIeBuf, - prTargetResult->u2IELength, - 0x30, - (PUINT_8 *)&prDesiredIE)) { - - iwe.cmd = IWEVGENIE; - iwe.u.data.flags = 1; - iwe.u.data.length = 2 + (__u16)prDesiredIE->ucLength; - - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)prDesiredIE); - } - - /* IOC_P2P_GO_WSC_IE */ -#if 1 - /* device capability */ - if (1) { - UINT_8 data[40]; - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 8 + sizeof("p2p_cap="); - if (iwe.u.data.length > 40) - iwe.u.data.length = 40; - - snprintf(data, iwe.u.data.length, "p2p_cap=%02x%02x%02x%02x%c", - prTargetResult->ucDeviceCapabilityBitmap, prTargetResult->ucGroupCapabilityBitmap, - (UINT_8)prTargetResult->u2ConfigMethod, (UINT_8)(prTargetResult->u2ConfigMethod >> 8), '\0' ); - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)data); - - //printk("%s\n", data); - kalMemZero(data, 40); - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 12 + sizeof("p2p_dev_type="); - if (iwe.u.data.length > 40) - iwe.u.data.length = 40; - - snprintf(data, iwe.u.data.length, "p2p_dev_type=%02x%02x%02x%02x%02x%02x%c", - (UINT_8)prTargetResult->rPriDevType.u2CategoryID,(UINT_8)prTargetResult->rPriDevType.u2SubCategoryID, - (UINT_8)prTargetResult->arSecDevType[0].u2CategoryID,(UINT_8)prTargetResult->arSecDevType[0].u2SubCategoryID, - (UINT_8)prTargetResult->arSecDevType[1].u2CategoryID,(UINT_8)prTargetResult->arSecDevType[1].u2SubCategoryID, - '\0'); - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)data); - //printk("%s\n", data); - - kalMemZero(data, 40); - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.flags = 0; - iwe.u.data.length = 17 + sizeof("p2p_grp_bssid="); - if (iwe.u.data.length > 40) - iwe.u.data.length = 40; - - snprintf(data, iwe.u.data.length, "p2p_grp_bssid="MACSTR"%c", - MAC2STR(prTargetResult->aucBSSID), '\0'); - current_ev = iwe_stream_add_point(info, current_ev, - extra + IW_SCAN_MAX_DATA, - &iwe, (char *)data); - //printk("%s\n", data); - - } -#endif - } - - /* Length of data */ - wrqu->data.length = (current_ev - extra); - wrqu->data.flags = 0; return 0; } /* end of mtk_p2p_wext_discovery_results() */ @@ -3649,38 +3501,6 @@ mtk_p2p_wext_wsc_ie( IN OUT char *extra ) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_HOSTAPD_PARAM prHostapdParam = (P_IW_P2P_HOSTAPD_PARAM)extra; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev)); - ASSERT(prGlueInfo); - - if (prHostapdParam->len > 0) { - if (prHostapdParam->len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[0], prHostapdParam->data, prHostapdParam->len)) { - return -EFAULT; - } - if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prHostapdParam->data, prHostapdParam->len)) { - return -EFAULT; - } - } - else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[0] = prHostapdParam->len; - prGlueInfo->prP2PInfo->u2WSCIELen[2] = prHostapdParam->len; - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX); - - //@TODO: send message to P2P-FSM return 0; } /* end of mtk_p2p_wext_wsc_ie() */ @@ -3708,67 +3528,6 @@ mtk_p2p_wext_connect_disconnect( IN OUT char *extra ) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - struct iw_point *prData= (struct iw_point *)&wrqu->data; -// P_IW_P2P_CONNECT_DEVICE prConnectDevice = (P_IW_P2P_CONNECT_DEVICE)extra; -// P_MSG_HDR_T prMsgHdr; -// P_MSG_P2P_CONNECTION_REQUEST_T prMsgP2PConnReq; -// P_MSG_P2P_CONNECTION_ABORT_T prMsgP2PConnAbt; -// UINT_8 aucBCAddr[] = BC_MAC_ADDR; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - if (prData->flags == P2P_CONNECT) { -#if 0 - // indicate P2P-FSM with MID_MNY_P2P_CONNECTION_REQ - prMsgP2PConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T) cnmMemAlloc(prAdapter, - RAM_TYPE_MSG, - sizeof(MSG_P2P_CONNECTION_REQUEST_T)); - - if (!prMsgP2PConnReq) { - ASSERT(0); // Can't trigger P2P FSM - return -ENOMEM; - } - - - mboxSendMsg(prAdapter, - MBOX_ID_0, - (P_MSG_HDR_T) prMsgP2PConnReq, - MSG_SEND_METHOD_BUF); -#endif - } - else if(prData->flags == P2P_DISCONNECT) { -#if 0 - // indicate P2P-FSM with MID_MNY_P2P_CONNECTION_ABORT - prMsgP2PConnAbt = (P_MSG_HDR_T) cnmMemAlloc(prAdapter, - RAM_TYPE_MSG, - sizeof(MSG_P2P_CONNECTION_ABORT_T)); - - if (!prMsgP2PConnAbt) { - ASSERT(0); // Can't trigger P2P FSM - return -ENOMEM; - } - - COPY_MAC_ADDR(prMsgP2PConnAbt->aucTargetID, prConnectDevice->sta_addr); - - prMsgP2PConnAbt->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT; - - mboxSendMsg(prAdapter, - MBOX_ID_0, - (P_MSG_HDR_T) prMsgP2PConnAbt, - MSG_SEND_METHOD_BUF); -#endif - } - else { - return -EINVAL; - } return 0; } /* end of mtk_p2p_wext_connect_disconnect() */ @@ -3796,64 +3555,6 @@ mtk_p2p_wext_password_ready( IN OUT char *extra ) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_PASSWORD_READY prPasswordReady = (P_IW_P2P_PASSWORD_READY)extra; - P_P2P_CONNECTION_SETTINGS_T prConnSettings; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *)netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - prConnSettings = prAdapter->rWifiVar.prP2PConnSettings; - - /* retrieve IE for Probe Request */ - if (prPasswordReady->probe_req_len > 0) { - if (prPasswordReady->probe_req_len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[1], prPasswordReady->probe_req_ie, prPasswordReady->probe_req_len)) { - return -EFAULT; - } - } - else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[1] = prPasswordReady->probe_req_len; - - /* retrieve IE for Probe Response */ - if (prPasswordReady->probe_rsp_len > 0) { - if (prPasswordReady->probe_rsp_len <= MAX_WSC_IE_LENGTH) { - if (copy_from_user(prGlueInfo->prP2PInfo->aucWSCIE[2], prPasswordReady->probe_rsp_ie, prPasswordReady->probe_rsp_len)) { - return -EFAULT; - } - } - else { - return -E2BIG; - } - } - - prGlueInfo->prP2PInfo->u2WSCIELen[2] = prPasswordReady->probe_rsp_len; - - switch (prPasswordReady->active_config_method) { - case 1: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_PUSH_BUTTON; - break; - case 2: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_KEYPAD; - break; - case 3: - prConnSettings->u2LocalConfigMethod = WPS_ATTRI_CFG_METHOD_DISPLAY; - break; - default: - break; - } - - prConnSettings->fgIsPasswordIDRdy = TRUE; return 0; } /* end of mtk_p2p_wext_password_ready() */ @@ -3880,29 +3581,6 @@ mtk_p2p_wext_request_dev_info( IN OUT char *extra ) { - P_ADAPTER_T prAdapter = NULL; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_DEVICE_REQ prDeviceReq = (P_IW_P2P_DEVICE_REQ)extra; - - ASSERT(prDev); - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prAdapter = prGlueInfo->prAdapter; - ASSERT(prAdapter); - - // specify data length - wrqu->data.length = sizeof(IW_P2P_DEVICE_REQ); - - // copy to upper-layer supplied buffer - kalMemCopy(prDeviceReq->name, prGlueInfo->prP2PInfo->aucConnReqDevName, prGlueInfo->prP2PInfo->u4ConnReqNameLength); - prDeviceReq->name_len = prGlueInfo->prP2PInfo->u4ConnReqNameLength; - prDeviceReq->name[prDeviceReq->name_len]='\0'; - COPY_MAC_ADDR(prDeviceReq->device_addr, prGlueInfo->prP2PInfo->rConnReqPeerAddr); - prDeviceReq->device_type = prGlueInfo->prP2PInfo->ucConnReqDevType; - prDeviceReq->config_method = prGlueInfo->prP2PInfo->i4ConnReqConfigMethod; - prDeviceReq->active_config_method = prGlueInfo->prP2PInfo->i4ConnReqActiveConfigMethod; return 0; } /* end of mtk_p2p_wext_request_dev_info() */ @@ -4227,132 +3905,7 @@ mtk_p2p_wext_set_int ( IN OUT char *extra ) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - UINT_32 index; - INT_32 value; - PUINT_32 pu4IntBuf; - P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T)NULL; - P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T)NULL; - P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T)NULL; - UINT_32 u4Leng; - - ASSERT(prDev); - ASSERT(wrqu); - - //printk("mtk_p2p_wext_set_int\n"); - pu4IntBuf = (PUINT_32) extra; - - if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) { - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - prP2pSpecificBssInfo = prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo; - prP2pConnSettings = prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings; - prP2pFsmInfo = prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo; - - u4SubCmd = (UINT_32) wrqu->mode; - index = pu4IntBuf[1]; - value = pu4IntBuf[2]; - - printk("set parameter, u4SubCmd=%d idx=%d value=%d\n", (INT_16)u4SubCmd, (INT_16)index, value); - - switch (u4SubCmd) { - case PRIV_CMD_INT_P2P_SET: - switch (index) { - case 0: /* Listen CH */ - { - UINT_8 ucSuggestChnl = 0; - - prP2pConnSettings->ucListenChnl = value; - - // 20110920 - frog: User configurations are placed in ConnSettings. - if (rlmFuncFindAvailableChannel(prGlueInfo->prAdapter, value, &ucSuggestChnl, TRUE, TRUE)) { - prP2pSpecificBssInfo->ucListenChannel = value; - } - else { - prP2pSpecificBssInfo->ucListenChannel = ucSuggestChnl; - } - - - break; - } - case 1: /* P2p mode */ - break; - case 4: /* Noa duration */ - prP2pSpecificBssInfo->rNoaParam.u4NoaDurationMs = value; - // only to apply setting when setting NOA count - //status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam); - break; - case 5: /* Noa interval */ - prP2pSpecificBssInfo->rNoaParam.u4NoaIntervalMs = value; - // only to apply setting when setting NOA count - //status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam); - break; - case 6: /* Noa count */ - prP2pSpecificBssInfo->rNoaParam.u4NoaCount = value; - status = mtk_p2p_wext_set_noa_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rNoaParam); - break; - case 100: /* Oper CH */ - // 20110920 - frog: User configurations are placed in ConnSettings. - prP2pConnSettings->ucOperatingChnl = value; - break; - case 101: /* Local config Method, for P2P SDK */ - //prP2pConnSettings->u2LocalConfigMethod; - break; - case 102: /* Sigma P2p reset */ - kalMemZero(prP2pConnSettings->aucTargetDevAddr, MAC_ADDR_LEN); - //prP2pConnSettings->eConnectionPolicy = ENUM_P2P_CONNECTION_POLICY_AUTO; - break; - case 103: /* WPS MODE */ - kalP2PSetWscMode(prGlueInfo, value); - break; - case 104: /* P2p send persence, duration */ - break; - case 105: /* P2p send persence, interval */ - break; - case 106: /* P2P set sleep */ - value = 1; - kalIoctl(prGlueInfo, - wlanoidSetP2pPowerSaveProfile, - &value, - sizeof(value), - FALSE, - FALSE, - TRUE, - TRUE, - &u4Leng); - break; - case 107: /* P2P set opps, CTWindowl */ - prP2pSpecificBssInfo->rOppPsParam.u4CTwindowMs = value; - status = mtk_p2p_wext_set_oppps_param(prDev, info, wrqu, (char *)&prP2pSpecificBssInfo->rOppPsParam); - break; - case 108: /* p2p_set_power_save */ - kalIoctl(prGlueInfo, - wlanoidSetP2pPowerSaveProfile, - &value, - sizeof(value), - FALSE, - FALSE, - TRUE, - TRUE, - &u4Leng); - - break; - - default: - break; - } - break; - default: - break; - } - - return status; + return 0; } /*----------------------------------------------------------------------------*/ @@ -4377,139 +3930,7 @@ mtk_p2p_wext_set_struct ( IN OUT char *extra ) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL; - - ASSERT(prDev); - ASSERT(wrqu); - - if (FALSE == GLUE_CHK_PR2(prDev, wrqu)) { - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - u4SubCmd = (UINT_32) wrqu->data.flags; - - kalMemZero(&prGlueInfo->prP2PInfo->aucOidBuf[0], - sizeof(prGlueInfo->prP2PInfo->aucOidBuf)); - - switch (u4SubCmd) { - case PRIV_CMD_OID: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, - wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME"extra buffer is valid\n"); - } - else { - printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra); - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - switch(prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEND_SD_RESPONSE: - status = mtk_p2p_wext_send_service_discovery_response(prDev, info, wrqu, (char *)prP2PReq); - break; - - case P2P_CMD_ID_SEND_SD_REQUEST: - status = mtk_p2p_wext_send_service_discovery_request(prDev, info, wrqu, (char *)prP2PReq); - break; - - case P2P_CMD_ID_TERMINATE_SD_PHASE: - status = mtk_p2p_wext_terminate_service_discovery_phase(prDev, info, wrqu, (char *)prP2PReq); - break; - - case P2P_CMD_ID_INVITATION: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_INVITATION_STRUCT)) { -// status = mtk_p2p_wext_invitation_request(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); - } - break; - - case P2P_CMD_ID_INVITATION_ABORT: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_ABORT_INVITATION)) { -// status = mtk_p2p_wext_invitation_abort(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); - } - break; - - case P2P_CMD_ID_START_FORMATION: - if (prP2PReq->inBufferLength == sizeof(IW_P2P_IOCTL_START_FORMATION)) { - status = mtk_p2p_wext_start_formation(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); - } - break; - default: - status = -EOPNOTSUPP; - } - - break; -#if CFG_SUPPORT_ANTI_PIRACY - case PRIV_SEC_CHECK_OID: - if (wrqu->data.length > 256) { - status = -EOPNOTSUPP; - break; - } - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), - wrqu->data.pointer, - wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME"extra buffer is valid\n"); - } - else { - printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra); - } - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0])); - - switch(prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEC_CHECK: - status = mtk_p2p_wext_set_sec_check_request(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - } - break; -#endif - case PRIV_CMD_P2P_VERSION: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, - wrqu->data.length)) { - status = -EFAULT; - break; - } - - if (!kalMemCmp(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), extra, wrqu->data.length)) { - printk(KERN_INFO DRV_NAME"extra buffer is valid\n"); - } - else { - printk(KERN_INFO DRV_NAME"extra 0x%p\n", extra); - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_P2P_VERSION: - status = mtk_p2p_wext_set_p2p_version(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - break; - } - break; - default: - status = -EOPNOTSUPP; - break; - } - - return status; + return 0; } @@ -4535,216 +3956,7 @@ mtk_p2p_wext_get_struct ( IN OUT char *extra ) { - int status = 0; - UINT_32 u4SubCmd = 0; - P_GLUE_INFO_T prGlueInfo = NULL; - P_IW_P2P_TRANSPORT_STRUCT prP2PReq = NULL; - - ASSERT(prDev); - ASSERT(wrqu); - - if (!prDev || !wrqu) { - printk(KERN_INFO DRV_NAME "%s(): invalid param(0x%p, 0x%p)\n", - __func__, - prDev, - wrqu); - return -EINVAL; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - ASSERT(prGlueInfo); - - u4SubCmd = (UINT_32) wrqu->data.flags; - - kalMemZero(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - sizeof(prGlueInfo->prP2PInfo->aucOidBuf)); - - switch (u4SubCmd) { - case PRIV_CMD_OID: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, - sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - - switch(prP2PReq->u4CmdId) { - case P2P_CMD_ID_GET_SD_REQUEST: - status = mtk_p2p_wext_get_service_discovery_request(prDev, info, wrqu, (char *)prP2PReq); - break; - - case P2P_CMD_ID_GET_SD_RESPONSE: - status = mtk_p2p_wext_get_service_discovery_response(prDev, info, wrqu, (char *)prP2PReq); - break; - - case P2P_CMD_ID_INVITATION_INDICATE: - { - status = mtk_p2p_wext_invitation_indicate(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); - prP2PReq->outBufferLength = wrqu->data.length; - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.length + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - else { - return 0; - } - break; - } - case P2P_CMD_ID_INVITATION_STATUS: - { - status = mtk_p2p_wext_invitation_status(prDev, info, wrqu, (char *)(prP2PReq->aucBuffer)); - prP2PReq->outBufferLength = wrqu->data.length; - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.length + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - else { - return 0; - } - break; - } - case P2P_CMD_ID_GET_CH_LIST: - { - UINT_16 i; - UINT_8 NumOfChannel = 50; - RF_CHANNEL_INFO_T aucChannelList[50]; - UINT_8 ucMaxChannelNum = 50; - PUINT_8 pucChnlList = (PUINT_8)prP2PReq->aucBuffer; - - kalGetChnlList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList); - if (NumOfChannel > 50) - NumOfChannel = 50; - prP2PReq->outBufferLength = NumOfChannel; - - for (i=0; iaucBuffer[i] = aucChannelList[i].ucChannelNum; -#else - *pucChnlList = aucChannelList[i].ucChannelNum; - pucChnlList++; -#endif - } - if(copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - NumOfChannel + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - else { - return 0; - } - break; - } - - case P2P_CMD_ID_GET_OP_CH: - { - prP2PReq->inBufferLength = 4; - - status = wlanoidQueryP2pOpChannel(prGlueInfo->prAdapter, - prP2PReq->aucBuffer, - prP2PReq->inBufferLength, - &prP2PReq->outBufferLength); - - if (status == 0) { // WLAN_STATUS_SUCCESS - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - prP2PReq->outBufferLength + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - else { - if (copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - break; - } - - default: - status = -EOPNOTSUPP; - } - - break; -#if CFG_SUPPORT_ANTI_PIRACY - case PRIV_SEC_CHECK_OID: - if (wrqu->data.length > 256) { - status = -EOPNOTSUPP; - break; - } - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucSecCheck[0]), - wrqu->data.pointer, - sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucSecCheck[0])); - - switch(prP2PReq->u4CmdId) { - case P2P_CMD_ID_SEC_CHECK: - status = mtk_p2p_wext_get_sec_check_response(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - } - break; -#endif - case PRIV_CMD_P2P_VERSION: - if (copy_from_user(&(prGlueInfo->prP2PInfo->aucOidBuf[0]), - wrqu->data.pointer, - sizeof(IW_P2P_TRANSPORT_STRUCT))) { - printk(KERN_NOTICE "%s() copy_from_user oidBuf fail\n", __func__); - return -EFAULT; - } - - prP2PReq = (P_IW_P2P_TRANSPORT_STRUCT) (&(prGlueInfo->prP2PInfo->aucOidBuf[0])); - - switch (prP2PReq->u4CmdId) { - case P2P_CMD_ID_P2P_VERSION: - status = mtk_p2p_wext_get_p2p_version(prDev, info, wrqu, (char *)prP2PReq); - break; - default: - status = -EOPNOTSUPP; - break; - } - - - /* Copy queried data to user. */ - if (status == 0) { // WLAN_STATUS_SUCCESS - if(copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - prP2PReq->outBufferLength + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - - else { - if(copy_to_user(wrqu->data.pointer, - &(prGlueInfo->prP2PInfo->aucOidBuf[0]), - OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer))) { - printk(KERN_NOTICE "%s() copy_to_user() fail\n", __func__); - return -EIO; - } - } - - break; - default: - return -EOPNOTSUPP; - } - - return status; + return 0; } diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_cfg80211.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_cfg80211.c index 6717fcd5b64..0b645e98b6f 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_cfg80211.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_cfg80211.c @@ -144,14 +144,14 @@ ******************************************************************************** */ - +/* BOOLEAN mtk_p2p_cfg80211func_channel_format_switch( IN struct ieee80211_channel *channel, IN enum nl80211_channel_type channel_type, IN P_RF_CHANNEL_INFO_T prRfChnlInfo, IN P_ENUM_CHNL_EXT_T prChnlSco - ); + );*/ /******************************************************************************* * F U N C T I O N S @@ -386,6 +386,7 @@ mtk_p2p_cfg80211_scan ( P_P2P_SSID_STRUCT_T prSsidStruct = (P_P2P_SSID_STRUCT_T)NULL; struct ieee80211_channel *prChannel = NULL; struct cfg80211_ssid *prSsid = NULL; + GLUE_SPIN_LOCK_DECLARATION(); /* [---------Channel---------] [---------SSID---------][---------IE---------] */ DBGLOG(INIT, TRACE, ("mtk_p2p_cfg80211_scan\n")); @@ -406,16 +407,16 @@ mtk_p2p_cfg80211_scan ( } DBGLOG(P2P, TRACE, ("mtk_p2p_cfg80211_scan.\n")); - - + GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV); if (prP2pGlueInfo->prScanRequest != NULL) { /* There have been a scan request on-going processing. */ DBGLOG(P2P, TRACE, ("There have been a scan request on-going processing.\n")); - break; + GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV); + break; } prP2pGlueInfo->prScanRequest = request; - + GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV); /* Should find out why the n_channels so many? */ if (request->n_channels > MAXIMUM_OPERATION_CHANNEL_LIST) { request->n_channels = MAXIMUM_OPERATION_CHANNEL_LIST; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_init.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_init.c index 28684f24664..1817d491b53 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_init.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_p2p_init.c @@ -44,7 +44,7 @@ */ #define P2P_MODE_INF_NAME "p2p%d"; -#if CFG_TC1_FEATURE || defined(CONFIG_MTK_COMBO_AOSP_TETHERING_SUPPORT) +#if CFG_TC1_FEATURE #define AP_MODE_INF_NAME "wlan%d"; #else #define AP_MODE_INF_NAME "ap%d"; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_proc.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_proc.c index bd0ce76cfb5..4784d1d3e19 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_proc.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_proc.c @@ -63,22 +63,33 @@ * E X T E R N A L R E F E R E N C E S ******************************************************************************** */ -#include "gl_os.h" -#include "gl_kal.h" +#include "precomp.h" +//#include "gl_os.h" +//#include "gl_kal.h" -#include "wlan_lib.h" -#include "debug.h" +//#include "wlan_lib.h" +//#include "debug.h" /******************************************************************************* * C O N S T A N T S ******************************************************************************** */ -#define PROC_MCR_ACCESS "mcr" -#define PROC_DRV_STATUS "status" -#define PROC_RX_STATISTICS "rx_statistics" -#define PROC_TX_STATISTICS "tx_statistics" -#define PROC_DBG_LEVEL "dbg_level" +#define PROC_WLAN_CHIP_ID "chipid" +#define PROC_VERSION "FWVersion" +#define PROC_WLAN_MCR "MCR" +#define PROC_WLAN_THERMO "wlanThermo" +#define PROC_COUNTRY "country" +#define PROC_ROAM_PARAM "roam_param" +#define PROC_DRV_STATUS "status" +#define PROC_RX_BA_WIN "RxBaWin" +#define PROC_RX_STATISTICS "rx_statistics" +#define PROC_TX_STATISTICS "tx_statistics" +#define PROC_DBG_LEVEL_NAME "dbgLevel" +#define PROC_ANTENNA_SELECT "antenna_select" +/*#define PROC_ANTENNA_RSSI "antenna_query" */ +#define PROC_DTIM "dtim_skip_count" +#define PROC_ROOT_NAME "wlan" #define PROC_MCR_ACCESS_MAX_USER_INPUT_LEN 20 #define PROC_RX_STATISTICS_MAX_USER_INPUT_LEN 10 @@ -87,6 +98,9 @@ #define PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN 30 +#define PROC_UID_SHELL 2000 +#define PROC_GID_WIFI 1010 + /******************************************************************************* * D A T A T Y P E S ******************************************************************************** @@ -102,6 +116,10 @@ ******************************************************************************** */ static UINT_32 u4McrOffset = 0; +static UINT_16 u2RxBaWin = 0x0; +#if CFG_SUPPORT_THERMO_THROTTLING +static P_GLUE_INFO_T g_prGlueInfo_proc; +#endif /******************************************************************************* * M A C R O S @@ -117,6 +135,99 @@ static UINT_32 u4McrOffset = 0; * F U N C T I O N S ******************************************************************************** */ + +static ssize_t +procRxBAWinRead( +struct file *filp, +char __user *buf, +size_t count, +loff_t *f_pos) +{ + UINT_32 u4CopySize = 0; + UINT_16 u2RxBa; + UINT_8 aucProcBuf[42]; + + if (*f_pos > 0) + return 0; /* To indicate end of file. */; + + u2RxBa = u2RxBaWin; + if (!u2RxBaWin) + kalSprintf(aucProcBuf, "RxBaWin : 0x%x(disable)\n", u2RxBa); + else + kalSprintf(aucProcBuf, "RxBaWin : 0x%x\n", u2RxBa); + u4CopySize = kalStrLen(aucProcBuf); + if (u4CopySize > count) + u4CopySize = count; + + if (copy_to_user(buf, aucProcBuf, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } + *f_pos += u4CopySize; + + return (ssize_t)u4CopySize; +} + +static ssize_t +procRxBAWinWrite( +struct file *file, +const char __user *buffer, +size_t count, +loff_t *data) +{ + UINT8 acBuf[21]; + int i4CopySize; + PARAM_CUSTOM_SW_CTRL_STRUCT_T uSwCtrlInfo; + UINT_32 u4BufLen; + WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; + UINT8 *temp = &acBuf[0]; + + if (count < (sizeof(acBuf) - 1)) + i4CopySize = count; + else + i4CopySize = (sizeof(acBuf) - 1); + + if (copy_from_user(acBuf, buffer, i4CopySize)) { + pr_err("error of copy from user\n"); + return -EFAULT; + } + acBuf[i4CopySize] = '\0'; + + rStatus = sscanf(temp, "0x%hx", &u2RxBaWin); + + if (u2RxBaWin & 0x08) + u2RxBaWin &= 0x18; + else if (u2RxBaWin & 0x04) + u2RxBaWin &= 0x14; + else if (u2RxBaWin & 0x02) + u2RxBaWin &= 0x12; + else if (u2RxBaWin & 0x01) + u2RxBaWin &= 0x11; + + uSwCtrlInfo.u4Data = (UINT_32)u2RxBaWin; + uSwCtrlInfo.u4Id = 0x30000000; + + if (rStatus == 1) { + rStatus = kalIoctl(g_prGlueInfo_proc, + (PFN_OID_HANDLER_FUNC) wlanoidSetSwCtrlWrite, + (PVOID)&uSwCtrlInfo, + sizeof(uSwCtrlInfo), + FALSE, FALSE, TRUE, FALSE, + &u4BufLen); + if (rStatus == WLAN_STATUS_FAILURE) { + DBGLOG(INIT, INFO, ("write RxBaWin failed 0x%x\n", rStatus)); + return -EINVAL; + } + } + return (ssize_t)count; +} + +static const struct file_operations rxba_fops = { + .owner = THIS_MODULE, + .write = procRxBAWinWrite, + .read = procRxBAWinRead, +}; + /*----------------------------------------------------------------------------*/ /*! * \brief The PROC function for reading MCR register to User Space, the offset of @@ -132,57 +243,42 @@ static UINT_32 u4McrOffset = 0; * \return number of characters print to the buffer from User Space. */ /*----------------------------------------------------------------------------*/ -static int -procMCRRead ( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data - ) +static ssize_t procMCRRead(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { - P_GLUE_INFO_T prGlueInfo; - PARAM_CUSTOM_MCR_RW_STRUC_T rMcrInfo; - UINT_32 u4BufLen; - char *p = page; - UINT_32 u4Count; - WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; + UINT_32 u4BufLen = 0; + UINT_32 u4CopySize = 0; + PARAM_CUSTOM_MCR_RW_STRUCT_T rMcrInfo; + WLAN_STATUS rStatus; + UINT_8 aucProcBuf[42]; + if (*f_pos > 0) + return 0; /* To indicate end of file. */; - ASSERT(data); + rMcrInfo.u4McrOffset = u4McrOffset; - // Kevin: Apply PROC read method 1. - if (off != 0) { - return 0; // To indicate end of file. - } + rStatus = kalIoctl(g_prGlueInfo_proc, + wlanoidQueryMcrRead, + (PVOID)&rMcrInfo, sizeof(rMcrInfo), TRUE, TRUE, TRUE, FALSE, &u4BufLen); - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv((struct net_device *)data)); + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO, ("read mcr failed\n")); + return -EINVAL; + } - rMcrInfo.u4McrOffset = u4McrOffset; + kalSprintf(aucProcBuf, "Offset : 0x%08x, Value : 0x%08x\n", + rMcrInfo.u4McrOffset, rMcrInfo.u4McrData); + u4CopySize = kalStrLen(aucProcBuf); + if (u4CopySize > count) + u4CopySize = count; - rStatus = kalIoctl(prGlueInfo, - wlanoidQueryMcrRead, - (PVOID)&rMcrInfo, - sizeof(rMcrInfo), - TRUE, - TRUE, - TRUE, - FALSE, - &u4BufLen); - - - SPRINTF(p, ("MCR (0x%08xh): 0x%08x\n", - rMcrInfo.u4McrOffset, rMcrInfo.u4McrData)); - - u4Count = (UINT_32)((ULONG)p - (ULONG)page); - - *eof = 1; - - return (int)u4Count; - -} /* end of procMCRRead() */ + if (copy_to_user(buf, aucProcBuf, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } + *f_pos += u4CopySize; + return (ssize_t)u4CopySize; +} /* end of procMCRRead() */ /*----------------------------------------------------------------------------*/ /*! @@ -197,346 +293,143 @@ procMCRRead ( * \return number of characters write from User Space. */ /*----------------------------------------------------------------------------*/ -static int -procMCRWrite ( - struct file *file, - const char *buffer, - unsigned long count, - void *data - ) +static ssize_t procMCRWrite(struct file *file, const char __user *buffer, size_t count, loff_t *data) { - P_GLUE_INFO_T prGlueInfo; - char acBuf[PROC_MCR_ACCESS_MAX_USER_INPUT_LEN + 1]; // + 1 for "\0" - int i4CopySize; - PARAM_CUSTOM_MCR_RW_STRUC_T rMcrInfo; - UINT_32 u4BufLen; - WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; + UINT8 acBuf[PROC_MCR_ACCESS_MAX_USER_INPUT_LEN + 1]; /* + 1 for "\0" */ + int i4CopySize; + PARAM_CUSTOM_MCR_RW_STRUCT_T rMcrInfo; + UINT_32 u4BufLen, u4McrData = 0; + WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; + UINT8 *temp = &acBuf[0]; + i4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1); - ASSERT(data); + if (copy_from_user(acBuf, buffer, i4CopySize)) { + pr_err("error of copy from user\n"); + return -EFAULT; + } + acBuf[i4CopySize] = '\0'; - i4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1); - if (copy_from_user(acBuf, buffer, i4CopySize)) { - return 0; - } - acBuf[i4CopySize] = '\0'; + rStatus = sscanf(temp, "0x%x 0x%x", &u4McrOffset, &u4McrData); + rMcrInfo.u4McrOffset = u4McrOffset; + rMcrInfo.u4McrData = u4McrData; - switch (sscanf(acBuf, "0x%x 0x%x", - &rMcrInfo.u4McrOffset, &rMcrInfo.u4McrData)) { - case 2: - /* NOTE: Sometimes we want to test if bus will still be ok, after accessing - * the MCR which is not align to DW boundary. - */ - //if (IS_ALIGN_4(rMcrInfo.u4McrOffset)) - { - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv((struct net_device *)data)); - - u4McrOffset = rMcrInfo.u4McrOffset; + if (rStatus == 2) { + /* NOTE: Sometimes we want to test if bus will still be ok, after accessing + * the MCR which is not align to DW boundary. + */ + /* if (IS_ALIGN_4(rMcrInfo.u4McrOffset)) */ + rStatus = kalIoctl(g_prGlueInfo_proc, + wlanoidSetMcrWrite, + (PVOID)&rMcrInfo, sizeof(rMcrInfo), FALSE, FALSE, TRUE, FALSE, &u4BufLen); + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO, ("write mcr failed\n")); + return -EINVAL; + } + } + return (ssize_t)count; +} /* end of procMCRWrite() */ - //printk("Write 0x%lx to MCR 0x%04lx\n", - //rMcrInfo.u4McrOffset, rMcrInfo.u4McrData); +static const struct file_operations mcr_fops = { + .owner = THIS_MODULE, + .write = procMCRWrite, + .read = procMCRRead, +}; - rStatus = kalIoctl(prGlueInfo, - wlanoidSetMcrWrite, - (PVOID)&rMcrInfo, - sizeof(rMcrInfo), - FALSE, - FALSE, - TRUE, - FALSE, - &u4BufLen); +static struct proc_dir_entry *gprProcRoot; +static UINT_8 aucProcBuf[1536]; +static UINT_8 aucDbModuleName[][PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN] = { + "INIT", "HAL", "INTR", "REQ", "TX", "RX", "RFTEST", "EMU", "SW1", "SW2", + "SW3", "SW4", "HEM", "AIS", "RLM", "MEM", "CNM", "RSN", "BSS", "SCN", + "SAA", "AAA", "P2P", "QM", "SEC", "BOW", "WAPI", "ROAMING", "TDLS", "OID" +}; - } - break; - - case 1: - //if (IS_ALIGN_4(rMcrInfo.u4McrOffset)) - { - u4McrOffset = rMcrInfo.u4McrOffset; - } - break; - - default: - break; - } - - return count; - -} /* end of procMCRWrite() */ - -#if 0 -/*----------------------------------------------------------------------------*/ -/*! -* \brief The PROC function for reading Driver Status to User Space. -* -* \param[in] page Buffer provided by kernel. -* \param[in out] start Start Address to read(3 methods). -* \param[in] off Offset. -* \param[in] count Allowable number to read. -* \param[out] eof End of File indication. -* \param[in] data Pointer to the private data structure. -* -* \return number of characters print to the buffer from User Space. -*/ -/*----------------------------------------------------------------------------*/ -static int -procDrvStatusRead ( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data - ) +static ssize_t procDbgLevelRead(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { - P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv; - char *p = page; - UINT_32 u4Count; + UINT_8 *temp = &aucProcBuf[0]; + UINT_32 u4CopySize = 0; + UINT_16 i; + UINT_16 u2ModuleNum = 0; - GLUE_SPIN_LOCK_DECLARATION(); + /* if *f_ops>0, we should return 0 to make cat command exit */ + if (*f_pos > 0) + return 0; + kalStrCpy(temp, "\nERROR|WARN|STATE|EVENT|TRACE|INFO|LOUD|TEMP\n" + "bit0 |bit1|bit2 |bit3 |bit4 |bit5|bit6|bit7\n\n" + "Debug Module\tIndex\tLevel\tDebug Module\tIndex\tLevel\n\n"); + temp += kalStrLen(temp); - ASSERT(data); + u2ModuleNum = (sizeof(aucDbModuleName) / PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN) & 0xfe; + for (i = 0; i < u2ModuleNum; i += 2) + SPRINTF(temp, ("DBG_%s_IDX\t(0x%02x):\t0x%02x\tDBG_%s_IDX\t(0x%02x):\t0x%02x\n", + &aucDbModuleName[i][0], i, aucDebugModule[i], + &aucDbModuleName[i+1][0], i+1, aucDebugModule[i+1])); - // Kevin: Apply PROC read method 1. - if (off != 0) { - return 0; // To indicate end of file. - } + if ((sizeof(aucDbModuleName) / PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN) & 0x1) + SPRINTF(temp, ("DBG_%s_IDX\t(0x%02x):\t0x%02x\n", + &aucDbModuleName[u2ModuleNum][0], u2ModuleNum, aucDebugModule[u2ModuleNum])); + u4CopySize = kalStrLen(aucProcBuf); + if (u4CopySize > count) + u4CopySize = count; + if (copy_to_user(buf, aucProcBuf, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } - SPRINTF(p, ("GLUE LAYER STATUS:")); - SPRINTF(p, ("\n==================")); + *f_pos += u4CopySize; + return (ssize_t)u4CopySize; +} - SPRINTF(p, ("\n* Number of Pending Frames: %ld\n", - prGlueInfo->u4TxPendingFrameNum)); - - GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - wlanoidQueryDrvStatusForLinuxProc(prGlueInfo->prAdapter, p, &u4Count); - - GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - u4Count += (UINT_32)(p - page); - - *eof = 1; - - return (int)u4Count; - -} /* end of procDrvStatusRead() */ - - -/*----------------------------------------------------------------------------*/ -/*! -* \brief The PROC function for reading Driver RX Statistic Counters to User Space. -* -* \param[in] page Buffer provided by kernel. -* \param[in out] start Start Address to read(3 methods). -* \param[in] off Offset. -* \param[in] count Allowable number to read. -* \param[out] eof End of File indication. -* \param[in] data Pointer to the private data structure. -* -* \return number of characters print to the buffer from User Space. -*/ -/*----------------------------------------------------------------------------*/ -static int -procRxStatisticsRead ( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data - ) +static ssize_t procDbgLevelWrite(struct file *file, const char *buffer, size_t count, loff_t *data) { - P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv; - char *p = page; - UINT_32 u4Count; + UINT_32 u4NewDbgModule, u4NewDbgLevel; + UINT_8 i = 0; + UINT_32 u4CopySize = sizeof(aucProcBuf); + UINT_8 *temp = &aucProcBuf[0]; - GLUE_SPIN_LOCK_DECLARATION(); + kalMemSet(aucProcBuf, 0, u4CopySize); + if (u4CopySize > count) + u4CopySize = count; + else + u4CopySize = u4CopySize - 1; + + if (copy_from_user(aucProcBuf, buffer, u4CopySize)) { + pr_err("error of copy from user\n"); + return -EFAULT; + } + aucProcBuf[u4CopySize] = '\0'; + + while (temp) { + if (sscanf(temp, "0x%x:0x%x", &u4NewDbgModule, &u4NewDbgLevel) != 2) { + pr_info("debug module and debug level should be one byte in length\n"); + break; + } + if (u4NewDbgModule == 0xFF) { + for (i = 0; i < DBG_MODULE_NUM; i++) + aucDebugModule[i] = u4NewDbgLevel & DBG_CLASS_MASK; + + break; + } else if (u4NewDbgModule >= DBG_MODULE_NUM) { + pr_info("debug module index should less than %d\n", DBG_MODULE_NUM); + break; + } + aucDebugModule[u4NewDbgModule] = u4NewDbgLevel & DBG_CLASS_MASK; + temp = kalStrChr(temp, ','); + if (!temp) + break; + temp++; /* skip ',' */ + } + return count; +} - ASSERT(data); - - // Kevin: Apply PROC read method 1. - if (off != 0) { - return 0; // To indicate end of file. - } - - - SPRINTF(p, ("RX STATISTICS (Write 1 to clear):")); - SPRINTF(p, ("\n=================================\n")); - - GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - wlanoidQueryRxStatisticsForLinuxProc(prGlueInfo->prAdapter, p, &u4Count); - - GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - u4Count += (UINT_32)(p - page); - - *eof = 1; - - return (int)u4Count; - -} /* end of procRxStatisticsRead() */ - - -/*----------------------------------------------------------------------------*/ -/*! -* \brief The PROC function for reset Driver RX Statistic Counters. -* -* \param[in] file pointer to file. -* \param[in] buffer Buffer from user space. -* \param[in] count Number of characters to write -* \param[in] data Pointer to the private data structure. -* -* \return number of characters write from User Space. -*/ -/*----------------------------------------------------------------------------*/ -static int -procRxStatisticsWrite ( - struct file *file, - const char *buffer, - unsigned long count, - void *data - ) -{ - P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv; - char acBuf[PROC_RX_STATISTICS_MAX_USER_INPUT_LEN + 1]; // + 1 for "\0" - UINT_32 u4CopySize; - UINT_32 u4ClearCounter; - - GLUE_SPIN_LOCK_DECLARATION(); - - - ASSERT(data); - - u4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1); - copy_from_user(acBuf, buffer, u4CopySize); - acBuf[u4CopySize] = '\0'; - - if (sscanf(acBuf, "%ld", &u4ClearCounter) == 1) { - if (u4ClearCounter == 1) { - GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - wlanoidSetRxStatisticsForLinuxProc(prGlueInfo->prAdapter); - - GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - } - } - - return count; - -} /* end of procRxStatisticsWrite() */ - - -/*----------------------------------------------------------------------------*/ -/*! -* \brief The PROC function for reading Driver TX Statistic Counters to User Space. -* -* \param[in] page Buffer provided by kernel. -* \param[in out] start Start Address to read(3 methods). -* \param[in] off Offset. -* \param[in] count Allowable number to read. -* \param[out] eof End of File indication. -* \param[in] data Pointer to the private data structure. -* -* \return number of characters print to the buffer from User Space. -*/ -/*----------------------------------------------------------------------------*/ -static int -procTxStatisticsRead ( - char *page, - char **start, - off_t off, - int count, - int *eof, - void *data - ) -{ - P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv; - char *p = page; - UINT_32 u4Count; - - GLUE_SPIN_LOCK_DECLARATION(); - - - ASSERT(data); - - // Kevin: Apply PROC read method 1. - if (off != 0) { - return 0; // To indicate end of file. - } - - - SPRINTF(p, ("TX STATISTICS (Write 1 to clear):")); - SPRINTF(p, ("\n=================================\n")); - - GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - wlanoidQueryTxStatisticsForLinuxProc(prGlueInfo->prAdapter, p, &u4Count); - - GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - u4Count += (UINT_32)(p - page); - - *eof = 1; - - return (int)u4Count; - -} /* end of procTxStatisticsRead() */ - - -/*----------------------------------------------------------------------------*/ -/*! -* \brief The PROC function for reset Driver TX Statistic Counters. -* -* \param[in] file pointer to file. -* \param[in] buffer Buffer from user space. -* \param[in] count Number of characters to write -* \param[in] data Pointer to the private data structure. -* -* \return number of characters write from User Space. -*/ -/*----------------------------------------------------------------------------*/ -static int -procTxStatisticsWrite ( - struct file *file, - const char *buffer, - unsigned long count, - void *data - ) -{ - P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv; - char acBuf[PROC_RX_STATISTICS_MAX_USER_INPUT_LEN + 1]; // + 1 for "\0" - UINT_32 u4CopySize; - UINT_32 u4ClearCounter; - - GLUE_SPIN_LOCK_DECLARATION(); - - - ASSERT(data); - - u4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1); - copy_from_user(acBuf, buffer, u4CopySize); - acBuf[u4CopySize] = '\0'; - - if (sscanf(acBuf, "%ld", &u4ClearCounter) == 1) { - if (u4ClearCounter == 1) { - GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - - wlanoidSetTxStatisticsForLinuxProc(prGlueInfo->prAdapter); - - GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM); - } - } - - return count; - -} /* end of procTxStatisticsWrite() */ -#endif - +static const struct file_operations dbglevel_ops = { + .owner = THIS_MODULE, + .read = procDbgLevelRead, + .write = procDbgLevelWrite, +}; #if DBG static UINT_8 aucDbModuleName[][PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN] = { @@ -567,7 +460,7 @@ static UINT_8 aucDbModuleName[][PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN] = { "DBG_SEC_IDX", "DBG_BOW_IDX" }; - + extern UINT_8 aucDebugModule[]; @@ -659,102 +552,328 @@ procDbgLevelWrite ( } #endif /* DBG */ +static ssize_t procCountryRead(struct file *file, char __user *buf, + size_t count, loff_t *f_pos) -/*----------------------------------------------------------------------------*/ -/*! -* \brief This function create a PROC fs in linux /proc/net subdirectory. -* -* \param[in] prDev Pointer to the struct net_device. -* \param[in] pucDevName Pointer to the name of net_device. -* -* \return N/A -*/ -/*----------------------------------------------------------------------------*/ -INT_32 -procInitProcfs ( - struct net_device *prDev, - char *pucDevName - ) { - P_GLUE_INFO_T prGlueInfo; - struct proc_dir_entry *prEntry; + UINT_32 u4BufLen = 0; + UINT_32 u4CopySize = 0; + UINT_16 u2CountryCode = 0; + WLAN_STATUS rStatus; + UINT_8 *temp = aucProcBuf; + + if (*f_pos > 0) + return 0; + + rStatus = kalIoctl(g_prGlueInfo_proc, wlanoidGetCountryCode, + &u2CountryCode, sizeof(u2CountryCode), TRUE, FALSE, FALSE, FALSE, &u4BufLen); + + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO, ("failed get country code")); + return -EINVAL; + } + + /* country code NULL */ + if (u2CountryCode == 0x0) + kalStrCpy(aucProcBuf, "Country: NULL\n"); + else + SPRINTF(temp, ("Country: %c%c\n", (char)((u2CountryCode & 0xFF00) >> 8), + (char)(u2CountryCode & 0x00FF))); + + u4CopySize = kalStrLen(aucProcBuf); + if (u4CopySize > count) + u4CopySize = count; + + if (copy_to_user(buf, aucProcBuf, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } + + *f_pos += u4CopySize; + return (ssize_t)u4CopySize; +} + +static ssize_t procCountryWrite(struct file *file, const char __user *buffer, + size_t count, loff_t *data) +{ + UINT_32 u4BufLen = 0; + WLAN_STATUS rStatus; + UINT_8 aucCountry[2]; + UINT_32 u4CopySize = sizeof(aucProcBuf); + + aucCountry[0] = aucProcBuf[0]; + aucCountry[1] = aucProcBuf[1]; + if ('X' == aucProcBuf[0] && 'X' == aucProcBuf[1]) + aucProcBuf[0] = aucProcBuf[1] = 'W'; + + kalMemSet(aucProcBuf, 0, u4CopySize); + if (u4CopySize >= count+1) + u4CopySize = count; + + if (copy_from_user(aucProcBuf, buffer, u4CopySize)) { + pr_err("error of copy from user\n"); + return -EFAULT; + } + + aucProcBuf[u4CopySize] = '\0'; + rStatus = kalIoctl(g_prGlueInfo_proc, wlanoidSetCountryCode, + &aucProcBuf[0], 2, FALSE, FALSE, TRUE, FALSE, &u4BufLen); + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO,( "failed set country code: %s\n", aucProcBuf)); + return -EINVAL; + } + + rStatus = kalIoctl(g_prGlueInfo_proc, wlanoidUpdatePowerTable, + &aucProcBuf[0], 2, FALSE, FALSE, TRUE, FALSE, &u4BufLen); + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO, ("failed update power table: %c%c\n", aucProcBuf[0], aucProcBuf[1])); + return -EINVAL; + } + /*Indicate channel change notificaiton to wpa_supplicant via cfg80211*/ + if ('W' == aucCountry[0] && 'W' == aucCountry[1]) + aucCountry[0] = aucCountry[1] = 'X'; + wlanRegulatoryHint(&aucCountry[0]); + + return count; +} + +static const struct file_operations country_ops = { + .owner = THIS_MODULE, + .write = procCountryWrite, + .read = procCountryRead +}; + +static ssize_t procRoamRead(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) +{ + UINT_32 u4CopySize; + WLAN_STATUS rStatus; + UINT_32 u4BufLen = 0; + /* if *f_pos > 0, it means has read successed last time, don't try again */ + if (*f_pos > 0) + return 0; + rStatus = kalIoctl(g_prGlueInfo_proc, wlanoidGetRoamParams, aucProcBuf, sizeof(aucProcBuf), + TRUE, FALSE, FALSE, FALSE, &u4BufLen); + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO, ("failed to read roam params\n")); + return -EINVAL; + } + + u4CopySize = kalStrLen(aucProcBuf); + if (u4CopySize > count) + u4CopySize = count; + + if (copy_to_user(buf, aucProcBuf, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } + + *f_pos += u4CopySize; + + return (INT_32)u4CopySize; +} + +static ssize_t procRoamWrite(struct file *file, const char __user *buffer, size_t count, loff_t *data) +{ + WLAN_STATUS rStatus; + UINT_32 u4BufLen = 0; + UINT_32 u4CopySize = sizeof(aucProcBuf); + + kalMemSet(aucProcBuf, 0, u4CopySize); + if (u4CopySize >= count+1) + u4CopySize = count; + + if (copy_from_user(aucProcBuf, buffer, u4CopySize)) { + pr_err("error of copy from user\n"); + return -EFAULT; + } + + if (kalStrnCmp(aucProcBuf, "force_roam", 10) == 0) + rStatus = kalIoctl(g_prGlueInfo_proc, wlanoidSetForceRoam, NULL, 0, + FALSE, FALSE, FALSE, FALSE, &u4BufLen); + else + rStatus = kalIoctl(g_prGlueInfo_proc, wlanoidSetRoamParams, aucProcBuf, + kalStrLen(aucProcBuf), FALSE, FALSE, TRUE, FALSE, &u4BufLen); + + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO, ("failed to set roam params: %s\n", aucProcBuf)); + return -EINVAL; + } + return count; +} + +static const struct file_operations roam_ops = { + .owner = THIS_MODULE, + .read = procRoamRead, + .write = procRoamWrite, +}; + +static ssize_t procVersionRead(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) +{ + UINT_32 u4CopySize; + P_WIFI_VER_INFO_T wifiVer = &g_prGlueInfo_proc->prAdapter->rVerInfo; + UINT_8 temp[40]; + /* if *f_pos > 0, it means has read successed last time, don't try again */ + if (*f_pos > 0) + return 0; + DBGLOG(INIT, INFO, ("here4\n")); + kalSprintf(temp, "Firmware Version: 0x%x.%lx\n", + wifiVer->u2FwOwnVersion>>8, + wifiVer->u2FwOwnVersion & BITS(0, 7)); + + u4CopySize = kalStrLen(temp); + if (copy_to_user(buf, temp, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } + *f_pos += u4CopySize; + + return (INT_32)u4CopySize; +} +static const struct file_operations version_fops = { + .owner = THIS_MODULE, + .read = procVersionRead, +}; + +static ssize_t procChipIDRead(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) +{ + UINT_32 u4CopySize; + P_WIFI_VER_INFO_T wifiVer = &g_prGlueInfo_proc->prAdapter->rVerInfo; + UINT_8 temp[25]; + /* if *f_pos > 0, it means has read successed last time, don't try again */ + if (*f_pos > 0) + return 0; + DBGLOG(INIT, INFO, ("here\n")); + kalSprintf(temp, "Chip ID : 0x%04x\n", wifiVer->u2FwProductID); + + u4CopySize = kalStrLen(temp); + if (copy_to_user(buf, temp, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } + *f_pos += u4CopySize; + + return (INT_32)u4CopySize; +} +static const struct file_operations ChipID_fops = { + .owner = THIS_MODULE, + .read = procChipIDRead, +}; + +static ssize_t dtim_skip_count_read(struct file *filp, + char __user *buf, + size_t count, loff_t *f_pos) +{ + UINT_32 u4CopySize; + P_ADAPTER_T prAdapter; + int pos = 0; + unsigned char dtim_skip_count = 0; + + if (g_prGlueInfo_proc != NULL) + prAdapter = g_prGlueInfo_proc->prAdapter; + else + return -EFAULT; + /* if *f_pos > 0, it means has read successed last time, + * don't try again + */ + if (*f_pos > 0) + return 0; + + dtim_skip_count = prAdapter->dtim_skip_count; + pos += snprintf(aucProcBuf, sizeof(aucProcBuf), + "DTIM Skip Count:%hhu\n", + dtim_skip_count); + + u4CopySize = kalStrLen(aucProcBuf); + if (copy_to_user(buf, aucProcBuf, u4CopySize)) { + pr_err("copy to user failed\n"); + return -EFAULT; + } + *f_pos += u4CopySize; + + return (INT_32)u4CopySize; +} + +static ssize_t dtim_skip_count_write(struct file *file, + const char __user *buffer, + size_t count, loff_t *data) +{ + P_ADAPTER_T prAdapter; + unsigned char dtim_skip_count = 0; + UINT_32 u4CopySize = sizeof(aucProcBuf); + + if (g_prGlueInfo_proc != NULL) + prAdapter = g_prGlueInfo_proc->prAdapter; + else + return -EFAULT; + + kalMemSet(aucProcBuf, 0, u4CopySize); + + if (u4CopySize > count) + u4CopySize = count; + else + u4CopySize = u4CopySize - 1; + + if (copy_from_user(aucProcBuf, buffer, u4CopySize)) { + pr_err("error of copy from user\n"); + return -EFAULT; + } + + aucProcBuf[u4CopySize] = '\0'; + + if (sscanf(aucProcBuf, "%hhu", &dtim_skip_count) == 1) { + if (dtim_skip_count > 6) + return -EINVAL; + prAdapter->dtim_skip_count = dtim_skip_count; + } else { + return -EINVAL; + } + + return count; +} - ASSERT(prDev); +static const struct file_operations dtim_ops = { + .owner = THIS_MODULE, + .read = dtim_skip_count_read, + .write = dtim_skip_count_write, +}; - if (init_net.proc_net == (struct proc_dir_entry *)NULL) { - DBGLOG(INIT, INFO, ("init proc fs fail: proc_net == NULL\n")); - return -ENOENT; - } +INT_32 procInitFs(VOID) +{ + struct proc_dir_entry *prEntry; - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); + if (init_net.proc_net == (struct proc_dir_entry *)NULL) { + pr_err("init proc fs fail: proc_net == NULL\n"); + return -ENOENT; + } - if (!prGlueInfo) { - DBGLOG(INIT, WARN, ("The OS context is NULL\n")); - return -ENOENT; - } + /* + * Directory: Root (/proc/net/wlan0) + */ + gprProcRoot = proc_mkdir(PROC_ROOT_NAME, init_net.proc_net); + if (!gprProcRoot) { + pr_err("gprProcRoot == NULL\n"); + return -ENOENT; + } + proc_set_user(gprProcRoot, KUIDT_INIT(PROC_UID_SHELL), KGIDT_INIT(PROC_GID_WIFI)); - /* - /proc/net/wlan0 - |-- mcr (PROC_MCR_ACCESS) - |-- status (PROC_DRV_STATUS) - |-- rx_statistics (PROC_RX_STATISTICS) - |-- tx_statistics (PROC_TX_STATISTICS) - |-- dbg_level (PROC_DBG_LEVEL) - |-- (end) - */ + prEntry = proc_create(PROC_DBG_LEVEL_NAME, 0664, gprProcRoot, &dbglevel_ops); + if (prEntry == NULL) { + pr_err("Unable to create /proc entry dbgLevel\n\r"); + return -1; + } + proc_set_user(prEntry, KUIDT_INIT(PROC_UID_SHELL), KGIDT_INIT(PROC_GID_WIFI)); - /* - * Directory: Root (/proc/net/wlan0) - */ + return 0; +} /* end of procInitProcfs() */ - prGlueInfo->pProcRoot = proc_mkdir(pucDevName, init_net.proc_net); - if (prGlueInfo->pProcRoot == NULL) { - return -ENOENT; - } - - /* File Root/mcr (RW) */ - prEntry = create_proc_entry(PROC_MCR_ACCESS, 0, prGlueInfo->pProcRoot); - if (prEntry) { - prEntry->read_proc = procMCRRead; - prEntry->write_proc = procMCRWrite; - prEntry->data = (void *)prDev; - } - -#if 0 - /* File Root/status (RW) */ - prEntry = create_proc_read_entry(PROC_DRV_STATUS, 0, prGlueInfo->pProcRoot, - procDrvStatusRead, prDev); - - /* File Root/rx_statistics (RW) */ - prEntry = create_proc_entry(PROC_RX_STATISTICS, 0, prGlueInfo->pProcRoot); - if (prEntry) { - prEntry->read_proc = procRxStatisticsRead; - prEntry->write_proc = procRxStatisticsWrite; - prEntry->data = (void *)prDev; - } - - /* File Root/tx_statistics (RW) */ - prEntry = create_proc_entry(PROC_TX_STATISTICS, 0, prGlueInfo->pProcRoot); - if (prEntry) { - prEntry->read_proc = procTxStatisticsRead; - prEntry->write_proc = procTxStatisticsWrite; - prEntry->data = (void *)prDev; - } - -#if DBG - /* File Root/dbg_level (RW) */ - prEntry = create_proc_entry(PROC_DBG_LEVEL, 0644, prGlueInfo->pProcRoot); - if (prEntry) { - prEntry->read_proc = procDbgLevelRead; - prEntry->write_proc = procDbgLevelWrite; - } -#endif /* DBG */ -#endif - return 0; - -} /* end of procInitProcfs() */ +INT_32 procUninitProcFs(VOID) +{ + remove_proc_entry(PROC_DBG_LEVEL_NAME, gprProcRoot); + remove_proc_subtree(PROC_ROOT_NAME, init_net.proc_net); + return 0; +} /*----------------------------------------------------------------------------*/ @@ -767,45 +886,103 @@ procInitProcfs ( * \return N/A */ /*----------------------------------------------------------------------------*/ -INT_32 -procRemoveProcfs ( - struct net_device *prDev, - char *pucDevName - ) +INT_32 procRemoveProcfs(VOID) { - P_GLUE_INFO_T prGlueInfo = NULL; - - - ASSERT(prDev); - - if (!prDev) { - return -ENOENT; - } - - if (init_net.proc_net == (struct proc_dir_entry *)NULL) { - DBGLOG(INIT, WARN, ("remove proc fs fail: proc_net == NULL\n")); - return -ENOENT; - } - - prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prDev)); - if (!prGlueInfo->pProcRoot) { - DBGLOG(INIT, WARN, ("The procfs root is NULL\n")); - return -ENOENT; - } -#if 0 -#if DBG - remove_proc_entry(PROC_DBG_LEVEL, prGlueInfo->pProcRoot); -#endif /* DBG */ - remove_proc_entry(PROC_TX_STATISTICS, prGlueInfo->pProcRoot); - remove_proc_entry(PROC_RX_STATISTICS, prGlueInfo->pProcRoot); - remove_proc_entry(PROC_DRV_STATUS, prGlueInfo->pProcRoot); + /* remove root directory (proc/net/wlan0) */ + /* remove_proc_entry(pucDevName, init_net.proc_net); */ + //remove_proc_entry(PROC_WLAN_THERMO, gprProcRoot); + remove_proc_entry(PROC_ROAM_PARAM, gprProcRoot); + remove_proc_entry(PROC_COUNTRY, gprProcRoot); + remove_proc_entry(PROC_WLAN_MCR, gprProcRoot); + remove_proc_entry(PROC_VERSION, gprProcRoot); + //remove_proc_entry(PROC_RX_BA_WIN, gprProcRoot); + remove_proc_entry(PROC_WLAN_CHIP_ID, gprProcRoot); + remove_proc_entry(PROC_DTIM, gprProcRoot); +#if CFG_SUPPORT_THERMO_THROTTLING + g_prGlueInfo_proc = NULL; #endif - remove_proc_entry(PROC_MCR_ACCESS, prGlueInfo->pProcRoot); + return 0; +} /* end of procRemoveProcfs() */ - /* remove root directory (proc/net/wlan0) */ - remove_proc_entry(pucDevName, init_net.proc_net); - return 0; -} /* end of procRemoveProcfs() */ +INT_32 procCreateFsEntry(P_GLUE_INFO_T prGlueInfo) +{ + struct proc_dir_entry *prEntry; + DBGLOG(INIT, TRACE, ("[%s]\n", __func__)); + +#if CFG_SUPPORT_THERMO_THROTTLING + g_prGlueInfo_proc = prGlueInfo; +#endif + prGlueInfo->pProcRoot = gprProcRoot; +#if 0 + prEntry = proc_create(PROC_WLAN_THERMO, 0664, gprProcRoot, &proc_fops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, "Unable to create /proc entry\n\r"); + return -1; + } +#endif + + prEntry = proc_create(PROC_ROAM_PARAM, 0664, gprProcRoot, &roam_ops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, ("Unable to create /proc entry\n\r")); + return -1; + } + + + prEntry = proc_create(PROC_COUNTRY, 0664, gprProcRoot, &country_ops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, ("Unable to create /proc entry\n\r")); + return -1; + } + + + prEntry = proc_create(PROC_WLAN_MCR, 0664, gprProcRoot, &mcr_fops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, ("Unable to create /proc entry\n\r")); + return -1; + } + + prEntry = proc_create(PROC_VERSION, 0664, gprProcRoot, &version_fops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, ("Unable to create /proc entry\n\r")); + return -1; + } + + prEntry = proc_create(PROC_WLAN_CHIP_ID, 0664, gprProcRoot, &ChipID_fops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, ("Unable to create /proc entry\n\r")); + return -1; + } + prEntry = proc_create(PROC_RX_BA_WIN, 0664, gprProcRoot, &rxba_fops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, ("Unable to create /proc entry\n\r")); + return -1; + } +#if 0 +#ifdef CONFIG_MTK_WIFI_ANTENNA_SWITCH + prEntry = proc_create(PROC_ANTENNA_SELECT, 0664, gprProcRoot, &antenna_select_fops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, "Unable to create /proc entry\n\r"); + return -1; + } +#endif +#ifdef CONFIG_MTK_WIFI_ANTENNA_SELECT + prEntry = proc_create(PROC_ANTENNA_RSSI, 0664, gprProcRoot, + &antenna_rssi_fops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, "Unable to create /proc entry\n\r"); + return -1; + } +#endif +#endif + prEntry = proc_create(PROC_DTIM, 0664, gprProcRoot, &dtim_ops); + if (prEntry == NULL) { + DBGLOG(INIT, ERROR, ("Unable to create /proc entry\n\r")); + return -1; + } + + proc_set_user(prEntry, KUIDT_INIT(PROC_UID_SHELL), KGIDT_INIT(PROC_GID_WIFI)); + return 0; +} diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext.c old mode 100644 new mode 100755 index 6198963997c..317bc345e6d --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext.c @@ -545,6 +545,10 @@ static const struct iw_priv_args rIwPrivTable[] = { /* handle any command with many input parameters */ {PRIV_CMD_OTHER, IW_PRIV_TYPE_CHAR | 256, 0, "set_str_cmd"}, + {PRIV_CMD_DTIM_SKIP_COUNT, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, + "set_dtim_skip"}, + {PRIV_CMD_DTIM_SKIP_COUNT, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_dtim_skip"}, }; static const iw_handler rIwPrivHandler[] = { @@ -588,7 +592,6 @@ const struct iw_handler_def wext_handler_def = { * F U N C T I O N D E C L A R A T I O N S ******************************************************************************** */ -extern VOID wlanUpdateChannelTable(P_GLUE_INFO_T prGlueInfo); /******************************************************************************* * F U N C T I O N S @@ -1788,8 +1791,12 @@ wext_set_mlme ( */ /*----------------------------------------------------------------------------*/ static int -wext_set_scan(IN struct net_device *prNetDev, - IN struct iw_request_info *prIwrInfo, IN struct iw_scan_req *prIwScanReq, IN char *pcExtra) +wext_set_scan ( + IN struct net_device *prNetDev, + IN struct iw_request_info *prIwrInfo, + IN union iwreq_data *prData, + IN char *pcExtra + ) { P_GLUE_INFO_T prGlueInfo = NULL; WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; @@ -1804,8 +1811,9 @@ wext_set_scan(IN struct net_device *prNetDev, #if WIRELESS_EXT > 17 /* retrieve SSID */ - if (prIwScanReq) - essid_len = prIwScanReq->essid_len; + if(prData) { + essid_len = ((struct iw_scan_req *)(((struct iw_point*)prData)->pointer))->essid_len; + } #endif init_completion(&prGlueInfo->rScanComp); @@ -2551,7 +2559,7 @@ wext_get_essid ( kalMemFree(prSsid, VIR_MEM_TYPE, sizeof(PARAM_SSID_T)); - return 0; + return rStatus; } /* wext_get_essid */ @@ -3927,16 +3935,40 @@ wext_set_country ( aucCountry[0] = *((PUINT_8)iwr->u.data.pointer + 8); aucCountry[1] = *((PUINT_8)iwr->u.data.pointer + 9); - rStatus = kalIoctl(prGlueInfo, - wlanoidSetCountryCode, - &aucCountry[0], - 2, - FALSE, - FALSE, - TRUE, - FALSE, - &u4BufLen); - wlanUpdateChannelTable(prGlueInfo); + if ('X' == aucCountry[0] && 'X' == aucCountry[1]) + aucCountry[0] = aucCountry[1] = 'W'; + + rStatus = kalIoctl(prGlueInfo, + wlanoidSetCountryCode, + &aucCountry[0], + 2, + FALSE, + FALSE, + TRUE, + FALSE, + &u4BufLen); + if (rStatus != WLAN_STATUS_SUCCESS) + return -1; + + rStatus = kalIoctl(prGlueInfo, + wlanoidUpdatePowerTable, + &aucCountry[0], + 2, + FALSE, + FALSE, + TRUE, + FALSE, + &u4BufLen); + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(INIT, INFO, ("failed update power table: %c%c\n", + aucCountry[0], aucCountry[1])); + return -EINVAL; + } + /*Indicate channel change notificaiton to wpa_supplicant via cfg80211*/ + if ('W' == aucCountry[0] && 'W' == aucCountry[1]) + aucCountry[0] = aucCountry[1] = 'X'; + wlanRegulatoryHint(&aucCountry[0]); + return 0; } @@ -3969,7 +4001,6 @@ wext_support_ioctl ( int ret = 0; char *prExtraBuf = NULL; UINT_32 u4ExtraSize = 0; - struct iw_scan_req * prIwScanReq = NULL; /* prDev is verified in the caller function wlanDoIOCTL() */ @@ -4116,23 +4147,21 @@ wext_support_ioctl ( } #if WIRELESS_EXT > 17 else if (iwr->u.data.length == sizeof(struct iw_scan_req)) { - prIwScanReq = kalMemAlloc(iwr->u.data.length, VIR_MEM_TYPE); - if (!prIwScanReq) { - ret = -ENOMEM; - break; - } + prExtraBuf = kalMemAlloc(MAX_SSID_LEN, VIR_MEM_TYPE); + if (!prExtraBuf) { + ret = -ENOMEM; + break; + } + if (copy_from_user(prExtraBuf, ((struct iw_scan_req *) (iwr->u.data.pointer))->essid, + ((struct iw_scan_req *) (iwr->u.data.pointer))->essid_len)) { + ret = -EFAULT; + } else { + ret = wext_set_scan(prDev, NULL, (union iwreq_data *) &(iwr->u.data), prExtraBuf); + } - if (copy_from_user(prIwScanReq, iwr->u.data.pointer, iwr->u.data.length)) { - ret = -EFAULT; - } else { - if (prIwScanReq->essid_len > IW_ESSID_MAX_SIZE) - prIwScanReq->essid_len = IW_ESSID_MAX_SIZE; - ret = wext_set_scan(prDev, NULL, prIwScanReq, &(prIwScanReq->essid[0])); - } - - kalMemFree(prIwScanReq, VIR_MEM_TYPE, iwr->u.data.length); - prIwScanReq = NULL; - } + kalMemFree(prExtraBuf, VIR_MEM_TYPE, MAX_SSID_LEN); + prExtraBuf = NULL; + } #endif else { ret = -EINVAL; @@ -4220,19 +4249,19 @@ wext_support_ioctl ( #endif case SIOCGIWESSID: /* 0x8B1B, get SSID */ + u4ExtraSize = iwr->u.essid.length; if (!iwr->u.essid.pointer) { ret = -EINVAL; break; } - if (iwr->u.essid.length < IW_ESSID_MAX_SIZE) { - DBGLOG(INIT, INFO, ("[wifi] iwr->u.essid.length:%d too small\n", - iwr->u.essid.length)); + if (u4ExtraSize != IW_ESSID_MAX_SIZE && u4ExtraSize != IW_ESSID_MAX_SIZE + 1) { + DBGLOG(INIT, ERROR, ("[wifi] iwr->u.essid.length: %d error\n", u4ExtraSize)); ret = -E2BIG; /* let caller try larger buffer */ break; } - prExtraBuf = kalMemAlloc(IW_ESSID_MAX_SIZE, VIR_MEM_TYPE); + prExtraBuf = kalMemAlloc(IW_ESSID_MAX_SIZE + 1, VIR_MEM_TYPE); if (!prExtraBuf) { ret = -ENOMEM; break; @@ -4242,12 +4271,12 @@ wext_support_ioctl ( ret = wext_get_essid(prDev, NULL, &iwr->u.essid, prExtraBuf); if (ret == 0) { - if (copy_to_user(iwr->u.essid.pointer, prExtraBuf, iwr->u.essid.length)) { + if (copy_to_user(iwr->u.essid.pointer, prExtraBuf, IW_ESSID_MAX_SIZE)) { ret = -EFAULT; } } - kalMemFree(prExtraBuf, VIR_MEM_TYPE, IW_ESSID_MAX_SIZE); + kalMemFree(prExtraBuf, VIR_MEM_TYPE, IW_ESSID_MAX_SIZE + 1); prExtraBuf = NULL; break; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext_priv.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext_priv.c index 11dd7fd5687..23487a4ef47 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext_priv.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/gl_wext_priv.c @@ -542,7 +542,7 @@ static WLAN_REQ_ENTRY arWlanOidReqTable[] = { {OID_CUSTOM_MCR_RW, DISP_STRING("OID_CUSTOM_MCR_RW"), - TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T), + TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T), (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMcrRead, (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMcrWrite}, @@ -554,7 +554,7 @@ static WLAN_REQ_ENTRY arWlanOidReqTable[] = { {OID_CUSTOM_SW_CTRL, DISP_STRING("OID_CUSTOM_SW_CTRL"), - TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T), + TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T), (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySwCtrlRead, (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSwCtrlWrite}, @@ -752,6 +752,7 @@ priv_set_int ( UINT_32 u4BufLen = 0; int status = 0; P_PTA_IPC_T prPtaIpc; + unsigned char dtim_skip_count = 0; ASSERT(prNetDev); ASSERT(prIwReqInfo); @@ -1089,6 +1090,17 @@ case PRIV_CMD_MET_PROFILING: break; #endif + case PRIV_CMD_DTIM_SKIP_COUNT: + dtim_skip_count = (unsigned char)pu4IntBuf[1]; + if (prGlueInfo->prAdapter && + dtim_skip_count >= 0 && + dtim_skip_count <= 6) { + prGlueInfo->prAdapter->dtim_skip_count = + dtim_skip_count; + } else { + status = -EINVAL; + } + break; default: return -EOPNOTSUPP; @@ -1262,6 +1274,12 @@ priv_get_int ( prIwReqData->mode = 0; return status; + case PRIV_CMD_DTIM_SKIP_COUNT: + if (prGlueInfo->prAdapter) + prIwReqData->mode = + prGlueInfo->prAdapter->dtim_skip_count; + return status; + default: break; } @@ -1334,15 +1352,14 @@ priv_get_int ( { wlanQueryDebugCode(prGlueInfo->prAdapter); - kalMemSet(gucBufDbgCode, '.', sizeof(gucBufDbgCode)); - u4BufLen = prIwReqData->data.length; - if (u4BufLen > sizeof(gucBufDbgCode)) - u4BufLen = sizeof(gucBufDbgCode); - if (copy_to_user(prIwReqData->data.pointer, gucBufDbgCode, u4BufLen)) { - return -EFAULT; - } - else - return status; + kalMemSet(gucBufDbgCode, '.', sizeof(gucBufDbgCode)); + if (copy_to_user(prIwReqData->data.pointer, gucBufDbgCode, + (prIwReqData->data.length < sizeof(gucBufDbgCode)? + prIwReqData->data.length:sizeof(gucBufDbgCode)))) { + return -EFAULT; + } + else + return status; } default: @@ -1772,7 +1789,6 @@ priv_get_struct ( UINT_32 u4BufLen = 0; PUINT_32 pu4IntBuf = NULL; int status = 0; - UINT_32 u4CopyDataMax = 0; kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf)); @@ -1843,11 +1859,14 @@ priv_get_struct ( pu4IntBuf = (PUINT_32)prIwReqData->data.pointer; prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0]; - u4CopyDataMax = sizeof(aucOidBuf) - OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent); - if ((prIwReqData->data.length > u4CopyDataMax) - || copy_from_user(&prNdisReq->ndisOidContent[0], - prIwReqData->data.pointer, - prIwReqData->data.length)) { + if (prIwReqData->data.length > (sizeof(NDIS_TRANSPORT_STRUCT) - + OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) { + DBGLOG(REQ, WARN, ("priv_get_struct() length Err!\n")); + return -EFAULT; + } + if (copy_from_user(&prNdisReq->ndisOidContent[0], + prIwReqData->data.pointer, + prIwReqData->data.length)) { DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n")); return -EFAULT; } @@ -1868,7 +1887,6 @@ priv_get_struct ( } } return 0; - break; default: DBGLOG(REQ, WARN, ("get struct cmd:0x%x\n", u4SubCmd)); return -EOPNOTSUPP; diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/hif/ahb/ahb.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/hif/ahb/ahb.c index d2bf5d7a830..57955515f5b 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/hif/ahb/ahb.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/hif/ahb/ahb.c @@ -743,7 +743,7 @@ glSetHifInfo ( HifInfo->HifTmrLoopbkFn.expires = jiffies + MSEC_TO_SYSTIME(30000); add_timer(&(HifInfo->HifTmrLoopbkFn)); - HIF_DBG(("[WiFi/HIF] Start loopback test after 10 seconds (jiffies = %u)...\n", + printk(("[WiFi/HIF] Start loopback test after 10 seconds (jiffies = %u)...\n", jiffies)); } #endif /* CONF_HIF_LOOPBACK_AUTO */ diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_cfg80211.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_cfg80211.h index 10dc85aec80..d7db1316a1c 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_cfg80211.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_cfg80211.h @@ -66,6 +66,13 @@ typedef struct _NL80211_DRIVER_GET_STA_STATISTICS_PARAMS { UINT_8 aucMacAddr[MAC_ADDR_LEN]; }NL80211_DRIVER_GET_STA_STATISTICS_PARAMS, *P_NL80211_DRIVER_GET_STA_STATISTICS_PARAMS; +#if CFG_SUPPORT_WAKEUP_STATISTICS +typedef struct _NL80211_QUERY_WAKEUP_STATISTICS { + NL80211_DRIVER_TEST_MODE_PARAMS hdr; + struct _WAKEUP_STATISTIC *prWakeupCount; +} NL80211_QUERY_WAKEUP_STATISTICS, *P_NL80211_QUERY_WAKEUP_STATISTICS; +#endif + typedef struct _NL80211_DRIVER_POORLINK_PARAMS { NL80211_DRIVER_TEST_MODE_PARAMS hdr; INT_8 cRssi; //cRssi=0 means it is a invalid value. @@ -89,6 +96,10 @@ typedef enum _ENUM_TESTMODE_STA_STATISTICS_ATTR{ NL80211_TESTMODE_STA_STATISTICS_TOTAL_CNT, NL80211_TESTMODE_STA_STATISTICS_THRESHOLD_CNT, NL80211_TESTMODE_STA_STATISTICS_AVG_PROCESS_TIME, + NL80211_TESTMODE_STA_STATISTICS_TX_PKTS, + NL80211_TESTMODE_STA_STATISTICS_TX_BYTES, + NL80211_TESTMODE_STA_STATISTICS_RX_PKTS, + NL80211_TESTMODE_STA_STATISTICS_RX_BYTES, NL80211_TESTMODE_STA_STATISTICS_FAIL_CNT, NL80211_TESTMODE_STA_STATISTICS_TIMEOUT_CNT, diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_kal.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_kal.h index e19370d9ec1..40dfc0fd36c 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_kal.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_kal.h @@ -2381,10 +2381,10 @@ kalMetProfilingFinish ( IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo ); -int kalMetInitProcfs( +int kalInitProcfs( IN P_GLUE_INFO_T prGlueInfo ); -int kalMetRemoveProcfs(void); +int kalRemoveProcfs(void); UINT_64 kalGetBootTime(void); diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_os.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_os.h index c114587940a..c5fae866dfb 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_os.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_os.h @@ -537,6 +537,7 @@ #include /* struct in_device */ #include /* struct iphdr */ +#include #include /* for memcpy()/memset() function */ #include /* for offsetof() macro */ @@ -995,6 +996,7 @@ enum TestModeCmdType { TESTMODE_CMD_ID_WAPI = 2, TESTMODE_CMD_ID_HS20 = 3, TESTMODE_CMD_ID_POORLINK = 4, + TESTMODE_CMD_ID_WAKEUP_STATISTICS = 8, TESTMODE_CMD_ID_STATISTICS = 0x10, TESTMODE_CMD_ID_LINK_DETECT = 0x20, /* old test mode command id, compatible with exist testmode command */ @@ -1067,6 +1069,21 @@ struct wpa_driver_hs20_data_s { #endif +typedef struct _COUNTRY_POWER_TABLE { + UINT_8 auCountryCode[2]; /* ISO/IEC 3166-1 two-character country codes */ + TX_PWR_PARAM_T rTxPwr; + UINT_8 ucTxPwrValid; + BANDEDGE_2G_T r2GBandEdgePwr; + UINT_8 ucSupport5GBand; + BANDEDGE_5G_T r5GBandEdgePwr; +} COUNTRY_POWER_TABLE, *P_COUNTRY_POWER_TABLE; + +struct board_id_power_table_map { + char board_id[5]; + COUNTRY_POWER_TABLE *power_table; + int tbl_size; +}; + /******************************************************************************* * P U B L I C D A T A ******************************************************************************** @@ -1217,17 +1234,17 @@ struct wpa_driver_hs20_data_s { ******************************************************************************** */ #ifdef WLAN_INCLUDE_PROC -INT_32 -procRemoveProcfs ( - struct net_device *prDev, - char *pucDevName - ); - +INT_32 procRemoveProcfs(VOID); +INT_32 procCreateFsEntry(P_GLUE_INFO_T prGlueInfo); +INT_32 procInitFs(VOID); +INT_32 procUninitProcFs(VOID); +#if 0 INT_32 procInitProcfs ( struct net_device *prDev, char *pucDevName ); +#endif #endif /* WLAN_INCLUDE_PROC */ #if CFG_ENABLE_BT_OVER_WIFI @@ -1286,10 +1303,19 @@ p2pSetMulticastListWorkQueueWrapper( P_GLUE_INFO_T prGlueInfo ); - +INT_32 wlanRegulatoryHint(PUINT_8 uCountryCode); +P_COUNTRY_POWER_TABLE wlanGetUpdatedPowerTable(P_UINT_8 paucCountry); #endif +int glRegisterPlatformDev(void); +int glUnregisterPlatformDev(void); +int glWlanSetSuspendFlag(void); +int glWlanGetSuspendFlag(void); +int glWlanClearSuspendFlag(void); +int glIndicateWoWPacket(void *data); +int glWlanSetIndicateWoWFlag(void); + /******************************************************************************* * F U N C T I O N S ******************************************************************************** diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_p2p_ioctl.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_p2p_ioctl.h index ab4d5669073..ddecaf14e17 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_p2p_ioctl.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_p2p_ioctl.h @@ -810,6 +810,14 @@ mtk_p2p_cfg80211_mgmt_frame_register( ); #endif + +BOOLEAN +mtk_p2p_cfg80211func_channel_format_switch( + IN struct ieee80211_channel *channel, + IN enum nl80211_channel_type channel_type, + IN P_RF_CHANNEL_INFO_T prRfChnlInfo, + IN P_ENUM_CHNL_EXT_T prChnlSco); + int mtk_p2p_cfg80211_set_bitrate_mask( IN struct wiphy *wiphy, diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_wext_priv.h b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_wext_priv.h index 83d109b952c..4d9cefc0339 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_wext_priv.h +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/include/gl_wext_priv.h @@ -208,6 +208,8 @@ #define PRIV_CMD_MET_PROFILING 33 +#define PRIV_CMD_DTIM_SKIP_COUNT 34 + /* other string command ID */ #define PRIV_CMD_OTHER_TDLS 0x00 diff --git a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/platform.c b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/platform.c index b1bd0cfb05a..c3486316369 100644 --- a/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/platform.c +++ b/drivers/misc/mediatek/connectivity/conn_soc/drv_wlan/mt_wifi/wlan/os/linux/platform.c @@ -105,6 +105,8 @@ #include #include #include +#include +#include #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 12) #include @@ -117,6 +119,11 @@ #include #endif #endif +#ifdef CONFIG_IP_WOW +#include +#include +#endif +#include extern BOOLEAN fgIsUnderSuspend; @@ -143,6 +150,41 @@ extern BOOLEAN fgIsUnderSuspend; * P R I V A T E D A T A ******************************************************************************** */ +#if CONFIG_PM +#define SPM_WAKEUP_EVENT_READY 0 +#define DEV_NAME "wlan_ad_die" + +static atomic_t fgSuspendFlag = ATOMIC_INIT(0); +static atomic_t fgIndicateWoW = ATOMIC_INIT(0); +static int wlan_probe(struct platform_device *pdev); +static int wlan_remove(struct platform_device *pdev); +static int wlan_suspend(struct platform_device *pdev, pm_message_t state); +static int wlan_resume(struct platform_device *pdev); +static void wlan_release(struct device *dev); +static void wlan_shutdown(struct platform_device *pdev); + +static struct platform_device mtk_wlan_dev = { + .name = DEV_NAME, + .id = -1, + .dev = { + .release = wlan_release, + } +}; + +static struct platform_driver mtk_wlan_drv = { + .probe = wlan_probe, + .remove = wlan_remove, +#ifdef CONFIG_PM + .shutdown = wlan_shutdown, + .suspend = wlan_suspend, + .resume = wlan_resume, +#endif + .driver = { + .name = DEV_NAME, + .owner = THIS_MODULE, + } +}; +#endif /******************************************************************************* * M A C R O S @@ -165,10 +207,11 @@ static int netdev_event(struct notifier_block *nb, unsigned long notification, v { UINT_8 ip[4] = { 0 }; UINT_32 u4NumIPv4 = 0; -//#ifdef CONFIG_IPV6 -#if 0 + +#ifdef CONFIG_IPV6 UINT_8 ip6[16] = { 0 }; // FIX ME: avoid to allocate large memory in stack UINT_32 u4NumIPv6 = 0; + P_PARAM_NETWORK_ADDRESS_IPV6 prParamIpv6Addr; #endif struct in_ifaddr *ifa = (struct in_ifaddr *) ptr; struct net_device *prDev = ifa->ifa_dev->dev; @@ -223,33 +266,34 @@ static int netdev_event(struct notifier_block *nb, unsigned long notification, v (ip[3] == 0))) { u4NumIPv4++; } - -//#ifdef CONFIG_IPV6 -#if 0 - if(!prDev || !(prDev->ip6_ptr)||\ - !((struct in_device *)(prDev->ip6_ptr))->ifa_list||\ - !(&(((struct in_device *)(prDev->ip6_ptr))->ifa_list->ifa_local))){ - printk(KERN_INFO "ipv6 is not avaliable.\n"); - return NOTIFY_DONE; - } - - kalMemCopy(ip6, &(((struct in_device *)(prDev->ip6_ptr))->ifa_list->ifa_local), sizeof(ip6)); - printk(KERN_INFO"ipv6 is %d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\n", - ip6[0],ip6[1],ip6[2],ip6[3], - ip6[4],ip6[5],ip6[6],ip6[7], - ip6[8],ip6[9],ip6[10],ip6[11], - ip6[12],ip6[13],ip6[14],ip6[15] - ); - - // todo: traverse between list to find whole sets of IPv6 addresses - if (!((ip6[0] == 0) && - (ip6[1] == 0) && - (ip6[2] == 0) && - (ip6[3] == 0) && - (ip6[4] == 0) && - (ip6[5] == 0))) { - //u4NumIPv6++; - } +#ifdef CONFIG_IPV6 + // <5> get the IPv6 address + if(!prDev || !(prDev->ip6_ptr)||\ + !((struct inet6_dev *)(prDev->ip6_ptr))->addr_list.next){ + DBGLOG(INIT, WARN, ("ipv6 is not avaliable.\n")); + u4NumIPv6 = 0; + } else { + struct inet6_ifaddr *ifa; + struct list_head *addr_list; + addr_list = &(((struct inet6_dev *)(prDev->ip6_ptr))->addr_list); + ifa = list_entry(addr_list->next, typeof (*ifa), if_list); + // <6> copy the IPv6 address + kalMemCopy(ip6,&(ifa->addr.s6_addr[0]), sizeof (ip6)); + DBGLOG(INIT, INFO, ("ipv6 is %d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d\n", + ip6[0],ip6[1],ip6[2],ip6[3], + ip6[4],ip6[5],ip6[6],ip6[7], + ip6[8],ip6[9],ip6[10],ip6[11], + ip6[12],ip6[13],ip6[14],ip6[15] + )); + // todo: traverse between list to find whole sets of IPv6 addresses + for (i = 0; i < sizeof (ip6); i++) { + if (ip6[i] != 0) + { + u4NumIPv6 = 1; + break; + } + } + } #endif // here we can compare the dev with other network's netdev to @@ -262,46 +306,41 @@ static int netdev_event(struct notifier_block *nb, unsigned long notification, v { WLAN_STATUS rStatus = WLAN_STATUS_FAILURE; UINT_32 u4SetInfoLen = 0; - UINT_8 aucBuf[32] = {0}; + UINT_8 aucBuf[64] = {0}; UINT_32 u4Len = OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST, arAddress); P_PARAM_NETWORK_ADDRESS_LIST prParamNetAddrList = (P_PARAM_NETWORK_ADDRESS_LIST)aucBuf; P_PARAM_NETWORK_ADDRESS prParamNetAddr = prParamNetAddrList->arAddress; -//#ifdef CONFIG_IPV6 -#if 0 - prParamNetAddrList->u4AddressCount = u4NumIPv4 + u4NumIPv6; +#ifdef CONFIG_IPV6 + prParamNetAddrList->u4AddressCount = u4NumIPv4 + u4NumIPv6; + DBGLOG(INIT, INFO, ("u4NumIPv4:%d, u4NumIPv6:%d", u4NumIPv4, u4NumIPv6)); #else - prParamNetAddrList->u4AddressCount = u4NumIPv4; + prParamNetAddrList->u4AddressCount = u4NumIPv4; + DBGLOG(INIT, INFO, ("u4NumIPv4:%d", u4NumIPv4)); #endif prParamNetAddrList->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP; for (i = 0; i < u4NumIPv4; i++) { prParamNetAddr->u2AddressLength = sizeof(PARAM_NETWORK_ADDRESS_IP);//4;; prParamNetAddr->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP;; -#if 0 - kalMemCopy(prParamNetAddr->aucAddress, ip, sizeof(ip)); - prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((PUINT_8)prParamNetAddr + sizeof(ip)); - u4Len += OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(ip); -#else prParamIpAddr = (P_PARAM_NETWORK_ADDRESS_IP)prParamNetAddr->aucAddress; kalMemCopy(&prParamIpAddr->in_addr, ip, sizeof(ip)); - prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((PUINT_8)prParamNetAddr + sizeof(PARAM_NETWORK_ADDRESS)); - u4Len += OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(PARAM_NETWORK_ADDRESS); -#endif + prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((ULONG)prParamNetAddr + prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + u4Len += prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress); } -//#ifdef CONFIG_IPV6 -#if 0 - for (i = 0; i < u4NumIPv6; i++) { - prParamNetAddr->u2AddressLength = 6;; - prParamNetAddr->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP;; - kalMemCopy(prParamNetAddr->aucAddress, ip6, sizeof(ip6)); - prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((PUINT_8)prParamNetAddr + sizeof(ip6)); - u4Len += OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) + sizeof(ip6); - } +#ifdef CONFIG_IPV6 + if (u4NumIPv6 > 0) { + prParamNetAddr->u2AddressType = PARAM_PROTOCOL_ID_TCP_IP; + prParamNetAddr->u2AddressLength = sizeof (PARAM_NETWORK_ADDRESS_IPV6); + prParamIpv6Addr = (P_PARAM_NETWORK_ADDRESS_IPV6)prParamNetAddr->aucAddress; + kalMemCopy(prParamIpv6Addr->addr, ip6, sizeof (ip6)); + prParamNetAddr = (P_PARAM_NETWORK_ADDRESS)((ULONG)prParamNetAddr + prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)); + u4Len += prParamNetAddr->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress); + } #endif + ASSERT(u4Len <= sizeof(aucBuf)); - DBGLOG(REQ, INFO, ("kalIoctl (0x%p, 0x%p)\n", prGlueInfo, prParamNetAddrList)); - + DBGLOG(REQ, LOUD, ("kalIoctl (0x%p, 0x%p)\n", prGlueInfo, prParamNetAddrList)); rStatus = kalIoctl(prGlueInfo, wlanoidSetNetworkAddress, (PVOID)prParamNetAddrList, @@ -313,8 +352,25 @@ static int netdev_event(struct notifier_block *nb, unsigned long notification, v &u4SetInfoLen); if (rStatus != WLAN_STATUS_SUCCESS) { - DBGLOG(REQ, INFO, ("set HW pattern filter fail 0x%x\n", rStatus)); + DBGLOG(REQ, ERROR, ("set HW pattern filter fail 0x%x\n", rStatus)); } + +#ifdef CONFIG_IPV6 + DBGLOG(REQ, LOUD, ("kalIoctl (0x%p, 0x%p)\n", prGlueInfo, prParamNetAddrList)); + rStatus = kalIoctl(prGlueInfo, + wlanoidSetIPv6NetworkAddress, + (PVOID)prParamNetAddrList, + u4Len, + FALSE, + FALSE, + TRUE, + FALSE, + &u4SetInfoLen); + + if (rStatus != WLAN_STATUS_SUCCESS) { + DBGLOG(REQ, WARN, ("set IPv6 HW pattern filter fail 0x%x\n", rStatus)); + } +#endif } return NOTIFY_DONE; @@ -389,6 +445,149 @@ void wlanUnregisterNotifier(void) #endif } +#ifdef CONFIG_PM +/*-----------platform bus related operation APIs----------------*/ +static int wlan_probe(struct platform_device *pdev) +{ + platform_set_drvdata(pdev, NULL); + DBGLOG(INIT, INFO, ("wlan platform driver probe\n")); + return 0; +} + +static int wlan_remove(struct platform_device *pdev) +{ + platform_set_drvdata(pdev, NULL); + DBGLOG(INIT, INFO, ("wlan platform driver remove\n")); + return 0; +} + +static void wlan_shutdown(struct platform_device *pdev) +{ + + return; +} + +static int wlan_suspend(struct platform_device *pdev, pm_message_t state) +{ + glWlanSetSuspendFlag(); + return 0; +} + +static int wlan_resume(struct platform_device *pdev) +{ + return 0; +} + +static void wlan_release(struct device *dev) +{ + return; +} + +int glRegisterPlatformDev(void) +{ + int retval; + /* Register platform device */ + retval = platform_device_register(&mtk_wlan_dev); + if (retval) { + DBGLOG(INIT, ERROR, + ("wlan platform device register failed, ret(%d)\n", + retval)); + return retval; + } + + /* Register platform driver */ + retval = platform_driver_register(&mtk_wlan_drv); + if (retval) { + DBGLOG(INIT, ERROR, + ("wlan platform driver register failed, ret(%d)\n", + retval)); + } + + return retval; +} + +int glUnregisterPlatformDev(void) +{ + platform_device_unregister(&mtk_wlan_dev); + platform_driver_unregister(&mtk_wlan_drv); + return 0; +} + +int glWlanSetSuspendFlag(void) +{ + return atomic_set(&fgSuspendFlag, 1); +} + +int glWlanGetSuspendFlag(void) +{ +#if SPM_WAKEUP_EVENT_READY + if (atomic_read(&fgSuspendFlag) != 0) { + int irq_num = 0; + wakeup_event_t wake_event; + wake_event = spm_read_wakeup_event_and_irq(&irq_num); + if (wake_event != 1) + atomic_set(&fgSuspendFlag, 0); + } +#endif + return atomic_read(&fgSuspendFlag); +} + +int glWlanSetIndicateWoWFlag(void) +{ + return atomic_set(&fgIndicateWoW, 1); +} + +int glWlanClearSuspendFlag(void) +{ + return atomic_set(&fgSuspendFlag, 0); +} + +int glIndicateWoWPacket(void *data) +{ +#if (defined(CONFIG_IP_WOW) && defined(CONFIG_PM_SLEEP)) + if (0 != atomic_read(&fgIndicateWoW)) { + /*check wakeup event*/ + atomic_set(&fgIndicateWoW, 0); + DBGLOG(RX, INFO, ("tagging wow skb..\n")); + tag_wow_skb(data); + } +#endif + return 0; +} + +#else +int glRegisterPlatformDev(void) +{ + return 0; +} + +int glUnregisterPlatformDev(void) +{ + return 0; +} + +int glWlanSetSuspendFlag(void) +{ + return 0; +} + +int glWlanGetSuspendFlag(void) +{ + return 0; +} + +int glWlanClearSuspendFlag(void) +{ + return 0; +} + +int glIndicateWoWPacket(void *data) +{ + return 0; +} +#endif + + //EXPORT_SYMBOL(wlanUnregisterNotifier); /*----------------------------------------------------------------------------*/ diff --git a/drivers/misc/mediatek/cpu_stress/Kconfig b/drivers/misc/mediatek/cpu_stress/Kconfig new file mode 100644 index 00000000000..e8102cfc539 --- /dev/null +++ b/drivers/misc/mediatek/cpu_stress/Kconfig @@ -0,0 +1,5 @@ +config MTK_CPU_STRESS + bool CONFIG_MTK_CPU_STRESS + default n + help + CONFIG_MTK_CPU_STRESS diff --git a/drivers/misc/mediatek/cpu_stress/Makefile b/drivers/misc/mediatek/cpu_stress/Makefile new file mode 100755 index 00000000000..804347f3e3e --- /dev/null +++ b/drivers/misc/mediatek/cpu_stress/Makefile @@ -0,0 +1,3 @@ + +obj-y += $(subst ",,$(CONFIG_MTK_PLATFORM))/ + diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.c index 471b9f6c018..5e2f9245c68 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.c @@ -130,6 +130,8 @@ int disp_is_aal_config() void disp_onConfig_aal(int i4FrameUpdate) { + if(g_Shutdown == 1) + return ; if (i4FrameUpdate) g_AAL_NewFrameUpdate = 1; @@ -240,4 +242,9 @@ void disp_aal_notify_backlight_changed(int bl_1024) } } +int disp_disable_aal_service(void) +{ + g_aal_service_running = 0; + return 0; +} diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.h b/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.h index a4099761bec..429ff50922d 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.h +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_aal.h @@ -71,4 +71,6 @@ int disp_is_aal_config(void); void disp_aal_reset(void); +int disp_disable_aal_service(void); + #endif diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.c index e5510bccd40..a2ed4525c8e 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.c @@ -15,12 +15,16 @@ #include #include +#ifndef CONFIG_AUSTIN_PROJECT #define DDP_GAMMA_SUPPORT +#endif #define POLLING_TIME_OUT 1000 #define PWM_DEFAULT_DIV_VALUE 0x0 +int g_Shutdown = 0; + unsigned int bls_dbg_log = 0; #define BLS_DBG(string, args...) if(bls_dbg_log) printk("[BLS]"string,##args) // default off, use "adb shell "echo dbg_log:1 > sys/kernel/debug/dispsys" to enable #define BLS_MSG(string, args...) printk("[BLS]"string,##args) // default on, important msg, not err @@ -33,62 +37,241 @@ static int gBLSMutexID = 3; static int gBLSPowerOn = 0; #endif static int gMaxLevel = 1023; +#ifndef CONFIG_AUSTIN_PROJECT +static int gMinLevel = 100; +#else +static int gMinLevel = 20; +#endif static int gPWMDiv = PWM_DEFAULT_DIV_VALUE; +extern unsigned long DISP_GetLCMIndex(void); +static int lcmindex = -1; + + static DEFINE_MUTEX(backlight_mutex); static DISPLAY_PWM_T g_pwm_lut; static DISPLAY_GAMMA_T g_gamma_lut; -static DISPLAY_GAMMA_T g_gamma_index = +static DISPLAY_GAMMA_T g_gamma_index[4] = { -entry: -{ - { - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, - 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, - 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, - 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, - 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, - 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, - 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, - 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, - 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, - 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, - 1000, 1004, 1008, 1012, 1016, 1020, 1023 - }, - { - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, - 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, - 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, - 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, - 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, - 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, - 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, - 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, - 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, - 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, - 1000, 1004, 1008, 1012, 1016, 1020, 1023 - }, - { - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, - 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, - 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, - 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, - 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, - 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, - 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, - 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, - 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, - 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, - 1000, 1004, 1008, 1012, 1016, 1020, 1023 - } -} + {/*tvp 1st*/ + entry: + { + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, + 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, + 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, + 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, + 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, + 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, + 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, + 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, + 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, + 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, + 1000, 1004, 1008, 1012, 1016, 1020, 1023 + }, + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, + 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, + 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, + 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, + 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, + 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, + 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, + 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, + 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, + 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, + 1000, 1004, 1008, 1012, 1016, 1020, 1023 + }, + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, + 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, + 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, + 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, + 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, + 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, + 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, + 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, + 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, + 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, + 1000, 1004, 1008, 1012, 1016, 1020, 1023 + } + } + }, + {/*txd*/ + entry: + { + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 43, 47, 51, 55, 59, + 63, 67, 71, 75, 79, 83, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, + 125, 130, 135, 140, 145, 150, 155, 159, 164, 169, 174, 179, 184, 188, 193, 198, + 203, 208, 213, 218, 222, 227, 232, 237, 242, 247, 251, 256, 261, 266, 271, 276, + 280, 284, 288, 292, 296, 300, 303, 307, 311, 315, 319, 322, 326, 330, 334, 338, + 341, 345, 349, 353, 357, 361, 364, 368, 372, 376, 380, 383, 387, 391, 395, 399, + 402, 406, 409, 412, 415, 418, 421, 425, 428, 431, 434, 437, 440, 444, 447, 450, + 453, 456, 459, 462, 466, 469, 472, 475, 478, 481, 485, 488, 491, 494, 497, 500, + 503, 507, 510, 513, 517, 520, 523, 527, 530, 533, 537, 540, 543, 547, 550, 553, + 556, 560, 563, 566, 570, 573, 576, 580, 583, 586, 590, 593, 596, 600, 603, 606, + 609, 613, 616, 619, 623, 626, 629, 633, 636, 639, 643, 646, 649, 653, 656, 659, + 662, 666, 669, 672, 676, 679, 682, 686, 689, 692, 696, 699, 702, 706, 709, 712, + 715, 719, 723, 727, 731, 735, 739, 743, 747, 751, 755, 758, 762, 766, 770, 774, + 778, 782, 786, 790, 794, 798, 801, 805, 809, 813, 817, 821, 825, 829, 833, 837, + 841, 845, 848, 852, 855, 859, 863, 866, 870, 873, 877, 881, 884, 888, 891, 895, + 899, 902, 906, 909, 913, 917, 920, 924, 927, 931, 935, 938, 942, 945, 949, 952, + 952, + }, + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, + 63, 67, 71, 75, 79, 83, 87, 91, 95, 99, 103, 107, 111, 115, 119, 123, + 126, 132, 137, 142, 147, 152, 157, 162, 167, 172, 177, 182, 187, 192, 197, 202, + 207, 212, 217, 222, 227, 232, 237, 242, 247, 252, 257, 262, 267, 272, 277, 282, + 287, 291, 295, 299, 303, 307, 310, 314, 318, 322, 326, 329, 333, 337, 341, 345, + 348, 352, 356, 360, 364, 368, 371, 375, 379, 383, 387, 390, 394, 398, 402, 406, + 409, 413, 416, 419, 423, 426, 429, 433, 436, 439, 443, 446, 449, 453, 456, 459, + 462, 466, 469, 472, 476, 479, 482, 486, 489, 492, 496, 499, 502, 506, 509, 512, + 515, 519, 522, 525, 529, 532, 535, 539, 542, 545, 549, 552, 555, 559, 562, 565, + 568, 572, 575, 578, 582, 585, 588, 592, 595, 598, 602, 605, 608, 612, 615, 618, + 621, 625, 628, 632, 635, 639, 642, 645, 649, 652, 656, 659, 662, 666, 669, 673, + 676, 679, 683, 686, 690, 693, 696, 700, 703, 707, 710, 713, 717, 720, 724, 727, + 730, 735, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 791, + 795, 799, 803, 807, 811, 815, 819, 823, 827, 831, 835, 839, 843, 847, 851, 855, + 859, 863, 867, 870, 874, 878, 881, 885, 888, 892, 896, 899, 903, 907, 910, 914, + 917, 921, 925, 928, 932, 936, 939, 943, 946, 950, 954, 957, 961, 965, 968, 972, + 975, + }, + { + 0, 4, 8, 12, 16, 20, 24, 27, 31, 35, 39, 43, 47, 50, 54, 58, + 62, 66, 70, 74, 77, 81, 85, 89, 93, 97, 100, 104, 108, 112, 116, 120, + 123, 129, 134, 139, 144, 149, 154, 160, 165, 170, 175, 180, 185, 191, 196, 201, + 206, 211, 216, 221, 227, 232, 237, 242, 247, 252, 258, 263, 268, 273, 278, 283, + 288, 292, 296, 300, 304, 308, 312, 316, 319, 323, 327, 331, 335, 339, 343, 347, + 350, 354, 358, 362, 366, 370, 374, 378, 381, 385, 389, 393, 397, 401, 405, 409, + 412, 416, 419, 422, 426, 429, 432, 436, 439, 442, 446, 449, 452, 456, 459, 462, + 465, 469, 472, 475, 479, 482, 485, 489, 492, 495, 499, 502, 505, 509, 512, 515, + 518, 522, 525, 529, 532, 535, 539, 542, 545, 549, 552, 555, 559, 562, 565, 569, + 572, 575, 579, 582, 585, 589, 592, 595, 599, 602, 605, 609, 612, 615, 619, 622, + 625, 629, 632, 636, 639, 643, 646, 650, 653, 656, 660, 663, 667, 670, 674, 677, + 680, 684, 687, 691, 694, 698, 701, 705, 708, 711, 715, 718, 722, 725, 729, 732, + 735, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 791, 795, + 799, 803, 807, 811, 815, 819, 823, 827, 831, 835, 839, 843, 847, 851, 855, 859, + 863, 867, 871, 874, 878, 881, 885, 888, 892, 895, 899, 902, 906, 909, 913, 916, + 920, 924, 927, 931, 934, 938, 941, 945, 948, 952, 955, 959, 962, 966, 967, 969, + 971, + } + } + }, + {/*tpv 2nd*/ + entry: + { + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, + 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124, + 128, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189, + 193, 198, 202, 206, 210, 214, 218, 222, 226, 230, 234, 238, 242, 246, 250, 254, + 258, 263, 268, 272, 277, 282, 286, 291, 295, 300, 305, 309, 314, 319, 323, 328, + 332, 337, 342, 346, 351, 356, 360, 365, 369, 374, 379, 383, 388, 393, 397, 402, + 406, 411, 415, 419, 423, 427, 431, 435, 439, 443, 447, 451, 455, 459, 463, 467, + 471, 475, 479, 483, 487, 491, 495, 499, 503, 507, 511, 515, 519, 523, 527, 531, + 535, 539, 542, 546, 549, 553, 556, 560, 563, 567, 570, 574, 577, 581, 584, 588, + 591, 595, 598, 602, 605, 609, 612, 616, 619, 623, 626, 630, 633, 637, 640, 644, + 647, 651, 654, 657, 660, 664, 667, 670, 673, 677, 680, 683, 686, 690, 693, 696, + 699, 703, 706, 709, 712, 716, 719, 722, 725, 729, 732, 735, 738, 742, 745, 748, + 751, 755, 759, 763, 766, 770, 774, 778, 781, 785, 789, 792, 796, 800, 804, 807, + 811, 815, 818, 822, 826, 830, 833, 837, 841, 844, 848, 852, 856, 859, 863, 867, + 870, 873, 875, 878, 880, 883, 885, 888, 890, 892, 895, 897, 900, 902, 905, 907, + 909, 912, 914, 917, 919, 922, 924, 927, 929, 931, 934, 936, 939, 941, 944, 946, + 948 + }, + { + 0, 5, 10, 15, 20, 24, 29, 34, 39, 44, 48, 53, 58, 63, 67, 72, + 77, 82, 87, 91, 96, 101, 106, 110, 115, 120, 125, 130, 134, 139, 144, 149, + 153, 158, 163, 167, 172, 176, 181, 186, 190, 195, 199, 204, 209, 213, 218, 222, + 227, 232, 236, 241, 245, 250, 255, 259, 264, 268, 273, 278, 282, 287, 291, 296, + 300, 305, 310, 315, 319, 324, 329, 334, 338, 343, 348, 352, 357, 362, 367, 371, + 376, 381, 385, 390, 395, 400, 404, 409, 414, 418, 423, 428, 433, 437, 442, 447, + 451, 456, 460, 465, 469, 474, 478, 482, 487, 491, 496, 500, 504, 509, 513, 518, + 522, 526, 531, 535, 540, 544, 548, 553, 557, 562, 566, 570, 575, 579, 584, 588, + 592, 596, 600, 604, 607, 611, 615, 618, 622, 626, 629, 633, 637, 640, 644, 648, + 651, 655, 659, 663, 666, 670, 674, 677, 681, 685, 688, 692, 696, 699, 703, 707, + 710, 715, 719, 723, 727, 731, 736, 740, 744, 748, 752, 757, 761, 765, 769, 773, + 777, 782, 786, 790, 794, 798, 803, 807, 811, 815, 819, 824, 828, 832, 836, 840, + 844, 847, 850, 853, 856, 859, 862, 865, 868, 871, 874, 877, 880, 883, 886, 889, + 891, 894, 897, 900, 903, 906, 909, 912, 915, 918, 921, 924, 927, 930, 933, 936, + 938, 940, 942, 944, 946, 948, 950, 951, 953, 955, 957, 959, 961, 962, 964, 966, + 968, 970, 972, 974, 975, 977, 979, 981, 983, 985, 986, 988, 990, 992, 994, 996, + 997 + }, + { + 0, 5, 10, 15, 20, 25, 29, 34, 39, 44, 49, 53, 58, 63, 68, 73, + 77, 82, 87, 92, 97, 102, 106, 111, 116, 121, 126, 130, 135, 140, 145, 150, + 154, 159, 164, 169, 174, 179, 184, 189, 193, 198, 203, 208, 213, 218, 223, 228, + 232, 237, 242, 247, 252, 257, 262, 267, 271, 276, 281, 286, 291, 296, 301, 306, + 310, 315, 320, 325, 330, 335, 340, 345, 349, 354, 359, 364, 369, 374, 379, 384, + 388, 393, 398, 403, 408, 413, 418, 423, 427, 432, 437, 442, 447, 452, 457, 462, + 466, 471, 475, 480, 484, 488, 493, 497, 501, 506, 510, 515, 519, 523, 528, 532, + 536, 541, 545, 550, 554, 558, 563, 567, 571, 576, 580, 585, 589, 593, 598, 602, + 606, 610, 614, 618, 621, 625, 629, 633, 636, 640, 644, 648, 651, 655, 659, 663, + 666, 670, 674, 678, 681, 685, 689, 693, 696, 700, 704, 708, 711, 715, 719, 723, + 726, 731, 735, 740, 744, 748, 753, 757, 761, 766, 770, 774, 779, 783, 787, 792, + 796, 800, 805, 809, 813, 818, 822, 826, 831, 835, 839, 844, 848, 852, 857, 861, + 865, 868, 871, 874, 876, 879, 882, 885, 887, 890, 893, 896, 898, 901, 904, 907, + 909, 912, 915, 918, 920, 923, 926, 929, 931, 934, 937, 940, 942, 945, 948, 951, + 953, 956, 958, 960, 962, 964, 967, 969, 971, 973, 975, 978, 980, 982, 984, 986, + 988, 991, 993, 995, 997, 999, 1002, 1004, 1006, 1008, 1010, 1013, 1015, 1017, 1019, 1021, + 1023 + } + } + }, + {/*kingdisplay*/ + entry: + { + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, + 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, + 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, + 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, + 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, + 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, + 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, + 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, + 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, + 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, + 1000, 1004, 1008, 1012, 1016, 1020, 1023 + }, + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, + 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, + 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, + 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, + 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, + 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, + 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, + 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, + 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, + 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, + 1000, 1004, 1008, 1012, 1016, 1020, 1023 + }, + { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, + 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, + 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, + 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, + 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444, 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, + 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, + 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, + 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, + 800, 804, 808, 812, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, + 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, + 1000, 1004, 1008, 1012, 1016, 1020, 1023 + } + } + } }; DISPLAY_GAMMA_T * get_gamma_index(void) { BLS_DBG("get_gamma_index!\n"); - return &g_gamma_index; + return &g_gamma_index[lcmindex]; } DISPLAY_PWM_T * get_pwm_lut(void) @@ -97,11 +280,7 @@ DISPLAY_PWM_T * get_pwm_lut(void) return &g_pwm_lut; } -/* [FEATURE]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/04/20,use customized brightness_mapping()*/ -//static unsigned int brightness_mapping(unsigned int level); -extern unsigned int brightness_mapping(unsigned int level); -/* [FEATURE]-Mod-END by TCTSZ.yaohui.zeng, 2015/04/20*/ - +static unsigned int brightness_mapping(unsigned int level); void disp_onConfig_bls(DISP_AAL_PARAM *param) { unsigned long prevSetting = DISP_REG_GET(DISP_REG_BLS_BLS_SETTING); @@ -146,8 +325,7 @@ void disp_onConfig_bls(DISP_AAL_PARAM *param) } -/* [FEATURE]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/04/20,use customized brightness_mapping()*/ -/* + static unsigned int brightness_mapping(unsigned int level) { unsigned int mapped_level; @@ -157,10 +335,11 @@ static unsigned int brightness_mapping(unsigned int level) if (mapped_level > gMaxLevel) mapped_level = gMaxLevel; + if (mapped_level < gMinLevel && mapped_level != 0) + mapped_level = gMinLevel; + return mapped_level; } -*/ -/* [FEATURE]-Mod-END by TCTSZ.yaohui.zeng, 2015/04/20*/ #if !defined(CONFIG_MTK_AAL_SUPPORT) #ifdef USE_DISP_BLS_MUTEX @@ -220,6 +399,9 @@ void disp_bls_update_gamma_lut(void) int index, i; unsigned long CurVal, Count; + if(lcmindex==-1) + lcmindex = DISP_GetLCMIndex(); + BLS_MSG("disp_bls_update_gamma_lut!\n"); if (DISP_REG_GET(DISP_REG_BLS_EN) & 0x1) @@ -233,7 +415,7 @@ void disp_bls_update_gamma_lut(void) { for(Count = 0; Count < 257 ; Count++) { - g_gamma_lut.entry[index][Count] = g_gamma_index.entry[index][Count]; + g_gamma_lut.entry[index][Count] = g_gamma_index[lcmindex].entry[index][Count]; } } @@ -628,3 +810,24 @@ void disp_bls_contrl_directly(bool enable) } } +void disp_bls_shutdown(bool shutdown) +{ + if(!prev_debug) + { + prev_debug = DISP_REG_GET(DISP_REG_BLS_DEBUG); + } + if(!shutdown) + { + g_Shutdown = 0; + DISP_REG_SET(DISP_REG_BLS_DEBUG, prev_debug); + DISP_REG_SET(DISP_REG_BLS_PWM_DUTY, 0); + DISP_REG_SET(DISP_REG_BLS_EN,0x00010001); + } + else + { + g_Shutdown = 1; + DISP_REG_SET(DISP_REG_BLS_DEBUG, 0x3); + DISP_REG_SET(DISP_REG_BLS_PWM_DUTY, 0); + DISP_REG_SET(DISP_REG_BLS_EN, 0); + } +} diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.h b/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.h index c41e94885ba..38a784e9013 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.h +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_bls.h @@ -3,6 +3,7 @@ #include "ddp_drv.h" +extern int g_Shutdown; void disp_bls_init(unsigned int srcWidth, unsigned int srcHeight); int disp_bls_config(void); @@ -22,4 +23,6 @@ void disp_bls_update_pwm_lut(void); void disp_onConfig_bls(DISP_AAL_PARAM *param); void disp_bls_contrl_directly(bool enable); +void disp_bls_shutdown(bool shutdown); + #endif diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq.c index 9f6dce9f8b7..f2d08994592 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq.c @@ -2711,7 +2711,7 @@ int32_t cmdq_core_wait_task_done_with_interruptible_timeout( swTimeout, predump_start_time_ms, predump_duration_ms, predump_retry_count); timeout_ms = predump_start_time_ms; - waitQ = wait_event_interruptible_timeout(gCmdWaitQueue[thread], (TASK_STATE_BUSY != pTask->taskState), msecs_to_jiffies(timeout_ms)); + waitQ = wait_event_interruptible_timeout(gCmdWaitQueue[thread], (TASK_STATE_BUSY != pTask->taskState), msecs_to_jiffies(timeout_ms)); // if SW timeout, predump HW PC timeout_ms = predump_duration_ms; diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.c index c29126ee8e0..647716920e6 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.c @@ -252,6 +252,21 @@ int32_t cmdq_append_command(cmdqRecHandle handle, CMDQ_MSG("REC: 0x%p CMD: 0x%p, op: 0x%02x, argA: 0x%08x, argB: 0x%08x\n", handle, pCommand, code, argA, argB); + /* It is differenet Read/Write/Poll instruction encoding between ROME and 82. + * instr SYNC: same + * + * instr Read/Write/Poll + * @82 + * argA, bit 0-21: engine address + * argA, bit 22-23: subsys encoding + * argA, bit 24-31: OP + * + * @ROME + * argA, bit 0-15: engine address + * argA, bit 16-23: subsys encoding + * argA, bit 24-31: OP + * + */ switch(code) { case CMDQ_CODE_READ: @@ -336,11 +351,13 @@ int32_t cmdq_append_command(cmdqRecHandle handle, #endif bool cmdq_rec_is_dsi_cmd_mode(CMDQ_SCENARIO_ENUM scn) { + // not support DISPLAY until ROME return false; } static void cmdq_rec_insert_frame_sync_instructions(cmdqRecHandle handle) { + // dummy function becuase we support prefetch since ROME } int32_t cmdqRecReset(cmdqRecHandle handle) @@ -469,6 +486,7 @@ int32_t cmdq_rec_finalize_command(cmdqRecHandle handle, bool loop) if (!handle->finalized) { #if 0 + // Never go here because we do not support prefetch until ROME // FOR disp sys, we should insert CONFIG_DIRTY event // so that trigger loop wakes up if (cmdq_core_should_enable_prefetch(handle->scenario)) diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.h b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.h index e70da2931b3..180f5c23390 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.h +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_record.h @@ -137,7 +137,8 @@ typedef struct cmdqRecStruct struct TaskStruct *pRunningTask; // running task after flush() or startLoop() CMDQ_HW_THREAD_PRIORITY_ENUM priority; // setting high priority. This implies Prefetch ENABLE. bool finalized; // set to true after flush() or startLoop() - uint32_t prefetchCount; // maintainence prefetch instruction + uint32_t prefetchCount; // maintainence prefetch instruction, not support util ROME + cmdqSecDataStruct secData; // metadata about secure command } cmdqRecStruct, *cmdqRecHandle; diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_sec.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_sec.c index baaed44fe80..df95fb876b8 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_sec.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_cmdq_sec.c @@ -60,7 +60,7 @@ static int32_t cmdq_sec_setup_context_session(cmdqSecContextHandle handle) int32_t status = 0; // alloc message bufer - handle->iwcMessage = kmalloc(sizeof(uint8_t*) * (sizeof(iwcCmdqMessage_t)), GFP_KERNEL); + //handle->iwcMessage = kmalloc(sizeof(uint8_t*) * (sizeof(iwcCmdqMessage_t)), GFP_KERNEL); if(NULL == handle->iwcMessage) { CMDQ_ERR("handle->iwcMessage kmalloc failed!\n"); @@ -82,6 +82,7 @@ static void cmdq_sec_deinit_session_unlocked(cmdqSecContextHandle handle) { CMDQ_MSG("[SEC]-->SESSION_DEINIT\n"); +#if 0 do { if(NULL != handle->iwcMessage) @@ -91,6 +92,7 @@ static void cmdq_sec_deinit_session_unlocked(cmdqSecContextHandle handle) } }while(0); +#endif CMDQ_MSG("[SEC]<--SESSION_DEINIT\n"); } @@ -348,6 +350,7 @@ int32_t cmdq_sec_submit_to_secure_world( smp_mb(); CMDQ_MSG("[SEC]-->SEC_SUBMIT: tgid[%d]\n", tgid); + CMDQ_MSG("submit to secure world\n"); do { // find handle first @@ -413,7 +416,7 @@ int32_t cmdq_sec_submit_to_secure_world( } else { - CMDQ_LOG("[SEC]<--SEC_SUBMIT: err[%d], pTask[0x%p], THR[%d], tgid[%d], duration_ms[%d], cmdId[%d]\n", status, pTask, thread, tgid, duration, iwcCommand); + CMDQ_MSG("[SEC]<--SEC_SUBMIT: err[%d], pTask[0x%p], THR[%d], tgid[%d], duration_ms[%d], cmdId[%d]\n", status, pTask, thread, tgid, duration, iwcCommand); } return status; } @@ -492,7 +495,12 @@ int32_t cmdq_sec_release_context_handle_unlocked(cmdqSecContextHandle handle) // 2. delete secContext from list list_del(&(handle->listEntry)); // 3. release secure path resource in normal world - + if (handle->iwcMessage) { + kfree(handle->iwcMessage); + handle->iwcMessage = NULL; + } + kfree(handle); + handle = NULL; }while(0); return status; } @@ -525,11 +533,14 @@ int32_t cmdq_sec_release_context_handle(uint32_t tgid) cmdqSecContextHandle cmdq_sec_context_handle_create(uint32_t tgid) { cmdqSecContextHandle handle = NULL; - handle = kmalloc(sizeof(uint8_t*) * sizeof(cmdqSecContextStruct), GFP_ATOMIC); + handle = kmalloc(sizeof(cmdqSecContextStruct), GFP_ATOMIC); if (handle) { - handle->iwcMessage = NULL; - + handle->iwcMessage = kmalloc(sizeof(iwcCmdqMessage_t), GFP_KERNEL); + if(NULL == handle->iwcMessage) + { + CMDQ_ERR("handle->iwcMessage kmalloc failed!\n"); + } handle->tgid = tgid; handle->referCount = 0; } diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_debug.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_debug.c index ff1f97373f1..b6a6c8e6012 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_debug.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_debug.c @@ -101,8 +101,6 @@ static char STR_HELP[] = "ACTION\n" " regr:addr\n" "\n" - " regw:addr,value\n" - "\n" " dbg_log:0|1\n" "\n" " irq_log:0|1\n" @@ -186,7 +184,7 @@ static void process_dbg_opt(const char *opt) char *p = (char *)opt + 5; unsigned int addr = (unsigned int) simple_strtoul(p, &p, 16); - if (addr >= 0xf4000000 && addr <= 0xf5000000) + if (addr) { unsigned int regVal = DISP_REG_GET(addr); DISP_MSG("regr: 0x%08X = 0x%08X\n", addr, regVal); @@ -195,22 +193,6 @@ static void process_dbg_opt(const char *opt) goto Error; } } - else if (0 == strncmp(opt, "regw:", 5)) - { - char *p = (char *)opt + 5; - unsigned int addr = (unsigned int) simple_strtoul(p, &p, 16); - unsigned int val = (unsigned int) simple_strtoul(p + 1, &p, 16); - if (addr >= 0xf4000000 && addr <= 0xf5000000) - { - unsigned int regVal; - DISP_REG_SET(addr, val); - regVal = DISP_REG_GET(addr); - DISP_DBG("regw: 0x%08X, 0x%08X = 0x%08X\n", addr, val, regVal); - sprintf(buf, "regw: 0x%08X, 0x%08X = 0x%08X\n", addr, val, regVal); - } else { - goto Error; - } - } else if (0 == strncmp(opt, "dbg_log:", 8)) { char *p = (char *)opt + 8; @@ -306,6 +288,9 @@ static void process_dbg_opt(const char *opt) for (i = 0; i < LUMA_HIST_BIN; i++) { DISP_DBG("LUMA_HIST_%02d: %d\n", i, hist[i]); +#if 1 //def monica_porting + if (strlen(dbg_buf) <= 2018) +#endif sprintf(dbg_buf + strlen(dbg_buf), "LUMA_HIST_%2d: %d\n", i, hist[i]); } } @@ -319,10 +304,16 @@ static void process_dbg_opt(const char *opt) ReleaseUpdateMutex(); DISP_DBG("pwmDuty: %lu\n", param.pwmDuty); +#if 1 //def monica_porting + if (strlen(dbg_buf) <= 2018) +#endif sprintf(dbg_buf + strlen(dbg_buf), "pwmDuty: %lu\n", param.pwmDuty); for (i = 0; i < LUMA_CURVE_POINT; i++) { DISP_DBG("lumaCurve[%02d]: %lu\n", i, param.lumaCurve[i]); +#if 1 //def monica_porting + if (strlen(dbg_buf) <= 2018) +#endif sprintf(dbg_buf + strlen(dbg_buf), "lumaCurve[%02d]: %lu\n", i, param.lumaCurve[i]); } } diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_dpfd.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_dpfd.c index e0a407ed85b..6f69bd1dcdf 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_dpfd.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_dpfd.c @@ -221,7 +221,7 @@ unsigned int ddp_bitblt_ioctl_wait_reequest( unsigned long ioctl_user_param ) } } - if( b_found == 0 ){ + if( b_found == 0 || ch >= DDPKBITBLIT_CHNL_COUNT){ DDPK_ERROR("DDPK Bitblt cannot found request flag\n"); spin_unlock_irqrestore(&g_ddpk_bitblt_chnls.lock, irq_state ); return -ERESTARTSYS; diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.c index f39943e6e62..4002d1e4314 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.c @@ -282,10 +282,12 @@ void disp_check_clock_tree(void) { unsigned int mutex_mod = 0; unsigned int mutex_sof = 0; - DISP_MSG("0xf0000000=0x%x, 0xf0000050=0x%x, 0xf0000040=0x%x\n", + DISP_MSG("0xf0000000=0x%x, 0xf0000050=0x%x, 0xf0000040=0x%x, 0xf4000100=0x%x, 0xf4000110=0x%x\n", *(volatile unsigned int*)(0xf0000000), *(volatile unsigned int*)(0xf0000050), - *(volatile unsigned int*)(0xf0000040)); + *(volatile unsigned int*)(0xf0000040), + *(volatile unsigned int*)(0xf4000100), + *(volatile unsigned int*)(0xf4000110)); // All need if ((DISP_REG_GET(0xf0000040)&0xff) != 0x01) { DISP_ERR("CLK_CFG_0 abnormal: hf_faxi_ck is off! 0xf0000040=0x%x \n", DISP_REG_GET(0xf0000040)); @@ -299,8 +301,8 @@ void disp_check_clock_tree(void) { if ((DISP_REG_GET(0xf4000100)&(1<<1)) != 0) { DISP_ERR("MMSYS_CG_CON0 abnormal: SMI_LARB0 is off!\n"); } - if ((DISP_REG_GET(0xf4000100)&(1<<3)) != 0) { - DISP_ERR("MMSYS_CG_CON0 abnormal: MUTEX is off(bit3 = 1) 0xf4000100 = 0x%x!\n",DISP_REG_GET(0xf4000100)); + if ((DISP_REG_GET(0xf4000100)&(1<<18)) != 0) { + DISP_ERR("MMSYS_CG_CON0 abnormal: MUTEX is off(bit18 = 1) 0xf4000100 = 0x%x!\n",DISP_REG_GET(0xf4000100)); } for (mutexID = 0; mutexID < 4; mutexID++) { mutex_mod = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD(mutexID)); @@ -326,9 +328,9 @@ void disp_check_clock_tree(void) { DISP_ERR("MMSYS_CG_CON0 abnormal: DISP_BLS is off!\n"); } //CLK_CFG_1 - if ((DISP_REG_GET(0xf0000050)&0x0ff) == 0) { - DISP_ERR("CLK_CFG_1 abnormal: fpwm_ck is off!\n"); - } + //if ((DISP_REG_GET(0xf0000050)&0x0ff) == 0) { + // DISP_ERR("CLK_CFG_1 abnormal: fpwm_ck is off!\n"); + //} } if (mutex_mod&(1<<10)) { if ((DISP_REG_GET(0xf4000100)&(1<<7)) != 0) { @@ -340,13 +342,10 @@ void disp_check_clock_tree(void) { DISP_ERR("MMSYS_CG_CON0 abnormal: DISP_RDMA1 is off!\n"); } } - - // - // DSI CMD/VDO if (mutex_sof==0x1) { // MMSYS_CG_CON1 - if ((DISP_REG_GET(0xf4000110)&0x07) != 0) { + if ((DISP_REG_GET(0xf4000110)&0x03) != 0) { DISP_ERR("MMSYS_CG_CON1 abnormal: DSI is off!\n"); } // CLK_CFG_1 @@ -356,13 +355,15 @@ void disp_check_clock_tree(void) { } // DPI0 if (mutex_sof==0x2) { - // CLK_CFG_1 - if ((DISP_REG_GET(0xf0000104)&(1<<28)) == 0) { - DISP_ERR("CLK_CFG_1 abnormal: hf_dpi0_ck is off!\n"); + if ((DISP_REG_GET(0xf4000110)&0x0c) != 0) { + DISP_ERR("MMSYS_CG_CON1 abnormal: DPI0 is off!\n"); } } - + // DPI1 if (mutex_sof==0x3) { + if ((DISP_REG_GET(0xf4000110)&0x30) != 0) { + DISP_ERR("MMSYS_CG_CON1 abnormal: DPI1 is off!\n"); + } } } } @@ -1586,47 +1587,25 @@ static long disp_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned lo DISP_DBG("cmd=0x%x, arg=0x%x \n", cmd, (unsigned int)arg); switch(cmd) { - case DISP_IOCTL_WRITE_REG: - - if(copy_from_user(&wParams, (void *)arg, sizeof(DISP_WRITE_REG ))) - { - DISP_ERR("DISP_IOCTL_WRITE_REG, copy_from_user failed\n"); - return -EFAULT; - } - - DISP_DBG("write 0x%x = 0x%x (0x%x)\n", wParams.reg, wParams.val, wParams.mask); - if(wParams.reg>DISPSYS_REG_ADDR_MAX || wParams.regDISPSYS_REG_ADDR_MAX || rParams.reg= DDP_REG_BASE_DISP_BLS && wParams.reg <= (DDP_REG_BASE_DISP_BLS + 0x1000)) || + (wParams.reg >= DDP_REG_BASE_DISP_COLOR && wParams.reg <= (DDP_REG_BASE_DISP_COLOR + 0x1000)) || + (wParams.reg >= DDP_REG_BASE_MM_MUTEX && wParams.reg <= (DDP_REG_BASE_MM_MUTEX + 0x1000))) { - DISP_ERR("reg read, addr invalid, addr min=0x%x, max=0x%x, addr=0x%x \n", - DISPSYS_REG_ADDR_MIN, - DISPSYS_REG_ADDR_MAX, - rParams.reg); - return -EFAULT; + rParams.val = (*(volatile unsigned int*)rParams.reg) & rParams.mask; } - - rParams.val = (*(volatile unsigned int*)rParams.reg) & rParams.mask; - - DISP_DBG("read 0x%x = 0x%x (0x%x)\n", rParams.reg, value, rParams.mask); - + else + { + DISP_ERR("reg read, addr invalid, addr=0x%x \n", rParams.reg); + return -EFAULT; + } if(copy_to_user((void*)arg, &rParams, sizeof(DISP_READ_REG))) { DISP_ERR("DISP_IOCTL_READ_REG, copy_to_user failed\n"); @@ -1634,29 +1613,6 @@ static long disp_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned lo } break; - case DISP_IOCTL_READ_REG_TABLE: - if(copy_from_user(&rTableParams, (void *)arg, sizeof(DISP_READ_REG_TABLE))) - { - DISP_ERR("DISP_IOCTL_READ_REG_TABLE, copy_from_user failed\n"); - return -EFAULT; - } - - for (count=0; countDISPSYS_REG_ADDR_MAX || rTableParams.reg[count]vm_end - a_pstVMArea->vm_start; + unsigned long paStart = a_pstVMArea->vm_pgoff << PAGE_SHIFT; + unsigned long paEnd = paStart + size; + unsigned long MAX_SIZE = DISPSYS_REG_ADDR_MAX - DISPSYS_REG_ADDR_MIN; + if (size > MAX_SIZE) { + DISP_MSG("MMAP Size Range OVERFLOW!!\n"); + return -1; + } + if (paStart < (DISPSYS_REG_ADDR_MIN-0xE0000000) || paEnd > (DISPSYS_REG_ADDR_MAX-0xE0000000)) { + DISP_MSG("MMAP Address Range OVERFLOW!!\n"); + return -1; + } +#endif a_pstVMArea->vm_page_prot = pgprot_noncached(a_pstVMArea->vm_page_prot); if(remap_pfn_range(a_pstVMArea , a_pstVMArea->vm_start , @@ -2526,9 +2407,6 @@ static int disp_probe(struct platform_device *pdev) // enable CMDQ interrupt DISP_REG_SET(DISP_REG_CMDQ_THRx_IRQ_FLAG_EN(i),0x13); //SL TEST CMDQ time out } - - init_waitqueue_head(&disp_irq_log_wq); - mb(); // Register IRQ //DISP_REGISTER_IRQ(MT6582_DISP_COLOR_IRQ_ID); @@ -2542,7 +2420,7 @@ static int disp_probe(struct platform_device *pdev) DISP_REGISTER_IRQ(MT6582_DISP_MUTEX_IRQ_ID); //DISP_REGISTER_IRQ(MT6582_G2D_IRQ_ID); - + init_waitqueue_head(&disp_irq_log_wq); disp_irq_log_task = kthread_create(disp_irq_log_kthread_func, NULL, "disp_config_update_kthread"); if (IS_ERR(disp_irq_log_task)) { @@ -2550,7 +2428,7 @@ static int disp_probe(struct platform_device *pdev) } wake_up_process(disp_irq_log_task); -#ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT +/*#ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT // TEE IRQ Callback deal if(disp_secure_irq_task==NULL) { @@ -2561,7 +2439,7 @@ static int disp_probe(struct platform_device *pdev) } wake_up_process(disp_secure_irq_task); } -#endif +#endif*/ // init error log timer init_timer(&disp_irq_err_timer); @@ -2725,6 +2603,19 @@ static int __init disp_init(void) ASSERT(pRegBackup!=NULL); *pRegBackup = DDP_UNBACKED_REG_MEM; +#ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT + if(disp_secure_irq_task==NULL) + { + DISP_MSG("disp_init creates kthread of disp_secure_intr_callback\n"); + disp_secure_irq_task = kthread_create(disp_secure_intr_callback, NULL, "disp_secure_irq_task"); + if (IS_ERR(disp_secure_irq_task)) + { + DISP_ERR("DISP_InitVSYNC(): Cannot create disp_irq_log_task kthread\n"); + } + wake_up_process(disp_secure_irq_task); + } +#endif + cmdqInitialize(); #if defined(CONFIG_TRUSTONIC_TEE_SUPPORT) && (CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT) @@ -2734,7 +2625,6 @@ static int __init disp_init(void) ; } #endif - return 0; } @@ -3446,14 +3336,66 @@ void disp_print_reg(DISP_MODULE_ENUM module) break; } } - +/* porting from abc123 : power_saving*/ int disp_module_clock_on(DISP_MODULE_ENUM module, char* caller_name) { + switch (module) { + case DISP_MODULE_OVL: + enable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + enable_clock(MT_CG_DISP0_DISP_OVL, caller_name); + break; + case DISP_MODULE_WDMA: + enable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + enable_clock(MT_CG_DISP0_DISP_WDMA, caller_name); + break; + case DISP_MODULE_RDMA0: + enable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + enable_clock(MT_CG_DISP0_DISP_RDMA, caller_name); + //enable_clock(MT_CG_DISP0_RDMA0_OUTPUT, caller_name); + break; + case DISP_MODULE_RDMA1: + enable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + enable_clock(MT_CG_DISP0_DISP_RMDA1, caller_name); + //enable_clock(MT_CG_DISP0_RDMA1_OUTPUT, caller_name); + break; + case DISP_MODULE_SMI: + enable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + break; + default: + DISP_ERR("disp_module_clock_on, unknow module=%d\n", module); + } + return 0; } - +/* porting from abc123 : power_saving*/ int disp_module_clock_off(DISP_MODULE_ENUM module, char* caller_name) { + switch (module) { + case DISP_MODULE_OVL: + disable_clock(MT_CG_DISP0_DISP_OVL, caller_name); + disable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + break; + case DISP_MODULE_WDMA: + disable_clock(MT_CG_DISP0_DISP_WDMA, caller_name); + disable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + break; + case DISP_MODULE_RDMA0: + disable_clock(MT_CG_DISP0_DISP_RDMA, caller_name); + disable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + //disable_clock(MT_CG_DISP0_RDMA0_OUTPUT, caller_name); + break; + case DISP_MODULE_RDMA1: + disable_clock(MT_CG_DISP0_DISP_RMDA1, caller_name); + disable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + //disable_clock(MT_CG_DISP0_RDMA1_OUTPUT, caller_name); + break; + case DISP_MODULE_SMI: + disable_clock(MT_CG_DISP0_SMI_LARB0, caller_name); + break; + default: + DISP_ERR("disp_module_clock_off, unknow module=%d\n", module); + } + return 0; } diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.h b/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.h index 692918e95fc..08221baefb9 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.h +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_drv.h @@ -258,7 +258,6 @@ struct disp_mva_map #define DISP_IOCTL_MAGIC 'x' -#define DISP_IOCTL_WRITE_REG _IOW (DISP_IOCTL_MAGIC, 1, DISP_WRITE_REG) #define DISP_IOCTL_READ_REG _IOWR (DISP_IOCTL_MAGIC, 2, DISP_READ_REG) #define DISP_IOCTL_WAIT_IRQ _IOR (DISP_IOCTL_MAGIC, 3, disp_wait_irq_struct) #define DISP_IOCTL_DUMP_REG _IOR (DISP_IOCTL_MAGIC, 4, int) @@ -282,7 +281,6 @@ struct disp_mva_map #define DISP_IOCTL_RUN_DPF _IOW (DISP_IOCTL_MAGIC, 30, int) #define DISP_IOCTL_CHECK_OVL _IOR (DISP_IOCTL_MAGIC, 31, int) -#define DISP_IOCTL_GET_OVL _IOWR (DISP_IOCTL_MAGIC, 32, DISP_OVL_INFO) #define DISP_IOCTL_EXEC_COMMAND _IOW (DISP_IOCTL_MAGIC, 33, DISP_EXEC_COMMAND) #define DISP_IOCTL_RESOURCE_REQUIRE _IOR (DISP_IOCTL_MAGIC, 34, int) @@ -305,6 +303,9 @@ struct disp_mva_map //Update BLS setting #define DISP_IOCTL_SET_PWMLUT _IOW (DISP_IOCTL_MAGIC, 22 , DISPLAY_PWM_T) +//Disable AAL Service +#define DISP_IOCTL_DISABLE_AAL_SERVICE _IOW (DISP_IOCTL_MAGIC, 23 , int) + //Add for AAL control - E /*----------------------------------------------------------------------------- DDP Kernel Mode API (for Kernel Trap) @@ -327,8 +328,6 @@ struct disp_mva_map #define DISP_IOCTL_SET_PQ_GAL_PARAM _IOW (DISP_IOCTL_MAGIC, 59 , DISP_PQ_PARAM) #define DISP_IOCTL_GET_PQ_GAL_PARAM _IOR (DISP_IOCTL_MAGIC, 60 , DISP_PQ_PARAM) -#define DISP_IOCTL_READ_REG_TABLE _IOWR (DISP_IOCTL_MAGIC, 61, DISP_READ_REG_TABLE) - #define DISP_SECURE_MVA_MAP _IOW (DISP_IOCTL_MAGIC, 80 , struct disp_mva_map) #define DISP_SECURE_MVA_UNMAP _IOW (DISP_IOCTL_MAGIC, 81 , struct disp_mva_map) diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_hal.h b/drivers/misc/mediatek/dispsys/mt8127/ddp_hal.h index 00064a9f086..fc18e8fd675 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_hal.h +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_hal.h @@ -92,7 +92,6 @@ struct disp_path_config_mem_out_struct unsigned int dirty; unsigned int outFormat; unsigned int dstAddr; - unsigned int dstPitch; struct DISP_REGION srcROI; // ROI unsigned int security; int ion_fd; @@ -132,6 +131,12 @@ typedef struct _RDMA_CONFIG_STRUCT int disp_wait_timeout(bool flag, unsigned int timeout); int disp_path_config(struct disp_path_config_struct* pConfig); +/* porting from abc123 : power_saving*/ +int disp_path_config_internal_setting(struct disp_path_config_struct *pConfig); +int disp_path_config_internal_mutex(struct disp_path_config_struct *pConfig); +int disp_path_config_mutex(struct disp_path_config_struct *pConfig, int mutexId); +int disp_path_config_setting(struct disp_path_config_struct *pConfig, int mutexId); + int disp_path_config_layer(OVL_CONFIG_STRUCT* pOvlConfig); int disp_path_config_layer_addr(unsigned int layer, unsigned int addr); int disp_path_get_mutex(void); @@ -155,6 +160,7 @@ int disp_path_change_tdshp_status(unsigned int layer, unsigned int enable); int disp_hdmi_path_clock_on(char* name); int disp_hdmi_path_clock_off(char* name); +int disp_path_rdma_start(unsigned idx); /* porting from abc123 : power_saving*/ void disp_path_clear_mem_out_done_flag(void); int disp_path_query(void); // return different functions according to chip type @@ -182,6 +188,7 @@ void disp_path_unregister_ovl_rdma_callback(void (*callback)(unsigned int param) int disp_path_config_OVL_WDMA_path(int mutex_id); int disp_path_config_OVL_WDMA(struct disp_path_config_mem_out_struct* pConfig, int OvlSecure); void disp_path_wait_ovl_wdma_done(void); +int disp_path_get_ovl_en(void); /* porting from abc123 : power_saving*/ #endif #endif diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.c index 4c081d69aea..3563ebff477 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.c @@ -148,6 +148,26 @@ int OVLReset() { return 0; } +/* porting from abc123 : power_saving*/ +int OVLSWReset(void) +{ + unsigned int delay_cnt = 0; + /* static unsigned int cnt=0; */ + /* pr_info("[DDP] OVLReset called %d\n", cnt++); */ + + DISP_REG_SET(DISP_REG_OVL_RST, 0x1); /* soft reset */ + while ((DISP_REG_GET(DISP_REG_OVL_INTSTA) & 0x1) != 0) { + delay_cnt++; + if (delay_cnt > 10000) { + pr_info("[DDP] error, OVLSWReset() timeout!\n"); + break; + } + } + DISP_REG_SET(DISP_REG_OVL_RST, 0x0); + + return 0; +} + int OVLROI(unsigned int bgW, unsigned int bgH, unsigned int bgColor) @@ -346,8 +366,10 @@ int OVLLayerConfig(unsigned int layer, if((source == OVL_LAYER_SOURCE_MEM && addr == 0)) { - printk("error: source from memory, but addr is 0! \n"); - ASSERT(0); // direct link support YUV444 only + printk("error: source from memory, but addr is 0, disable layer %d! \n", layer); + OVLLayerSwitch(layer, 0); + return 0; + //ASSERT(0); // direct link support YUV444 only } switch (fmt) { @@ -434,9 +456,9 @@ int OVLLayerConfig(unsigned int layer, } printk("OVL align 64byte:ROI(%d,%d %d,%d), (%d,%d), 0x%08x-->0x%08x, %d-->%d\n", src_x, src_y, dst_w, dst_h, dst_x, dst_w, addr, address, dst_w, width); } -#else +//#else if (layer_pitch && ( (layer_pitch&0x7f) != 0 || (start&0x70) >= 0x50 || (end&0x70) < 0x30 )) { - DISP_DBG("[DDP] warning: hw request(pitch:0x%x,star:0x%x,end:0x%x)\n", layer_pitch, start, end); + printk("[DDP] warning: hw request(pitch:0x%x,star:0x%x,end:0x%x)\n", layer_pitch, start, end); } #endif switch(layer) { diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.h b/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.h index 044f6fd20be..dbe4d3b0030 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.h +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_ovl.h @@ -17,6 +17,9 @@ int OVLStop(void); // reset overlay module int OVLReset(void); +/*porting from abc123 : power_saving; SW reset overlay module */ +int OVLSWReset(void); + // set region of interest int OVLROI(unsigned int bgW, unsigned int bgH, // region size diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_path.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_path.c index b2f166ec5b6..aff2857a1a7 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_path.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_path.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,8 @@ extern unsigned int gBitbltSecure; #define DISP_INDEX_OFFSET 0x0 // must be consistent with ddp_rdma.c +static atomic_t g_clock_on = ATOMIC_INIT(0); + unsigned int gMutexID = 0; unsigned int gMemOutMutexID = 1; extern unsigned int decouple_addr; @@ -1544,6 +1547,18 @@ int disp_path_config(struct disp_path_config_struct* pConfig) fb_height = pConfig->srcROI.height; return disp_path_config_(pConfig, gMutexID); } +/* porting from abc123 : power_saving*/ +int disp_path_config_internal_setting(struct disp_path_config_struct *pConfig) +{ + fb_width = pConfig->srcROI.width; + fb_height = pConfig->srcROI.height; + return disp_path_config_setting(pConfig, gMutexID); +} + +int disp_path_config_internal_mutex(struct disp_path_config_struct *pConfig) +{ + return disp_path_config_mutex(pConfig, gMutexID); +} DISP_MODULE_ENUM g_dst_module; @@ -1932,6 +1947,7 @@ static int disp_reg_backup(void) //disp_bls_backup(); // OVL +#if 1 #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT // When backup OVL registers, consider secure case if (0 == gOvlSecure) @@ -2054,7 +2070,7 @@ static int disp_reg_backup(void) } } #endif // CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT - +#endif // RDMA, RDMA1 for (index = 0; index < 1; index++) { //Donot back up RDMA1. It's only for HDMI using reg_backup(DISP_REG_RDMA_INT_ENABLE + index*DISP_INDEX_OFFSET); @@ -2089,6 +2105,7 @@ static int disp_reg_backup(void) reg_backup(DISP_REG_RDMA_DUMMY + index*DISP_INDEX_OFFSET); reg_backup(DISP_REG_RDMA_DEBUG_OUT_SEL + index*DISP_INDEX_OFFSET); } +#if 1 // WDMA #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT // when backup WDMA 1 registers, consider secure case @@ -2147,7 +2164,7 @@ static int disp_reg_backup(void) #endif // CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT DISP_MSG("disp_reg_backup() end, *pRegBackup=0x%x, reg_offset=%d \n", *pRegBackup, reg_offset); - +#endif return 0; } @@ -2170,7 +2187,7 @@ static int disp_reg_restore(void) disp_mutex_restore(); // BLS //disp_bls_restore(); - +#if 1 // OVL #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT // when restoring OVL registers, consider secure case @@ -2293,7 +2310,7 @@ static int disp_reg_restore(void) } } #endif // CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT - +#endif // RDMA, RDMA1 for (index = 0; index < 1; index++) { //Donot restore RDMA1. It's only for HDMI using. @@ -2329,6 +2346,8 @@ static int disp_reg_restore(void) reg_restore(DISP_REG_RDMA_DUMMY + index*DISP_INDEX_OFFSET); reg_restore(DISP_REG_RDMA_DEBUG_OUT_SEL + index*DISP_INDEX_OFFSET); } +#if 1 +//WDMA #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT //pr_err("disp_reg_resotre gMemOutSecure=%d", gMemOutSecure); // when restoring WDMA 1 registers, consider secure case @@ -2383,7 +2402,7 @@ static int disp_reg_restore(void) } } #endif // CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT - +#endif //DISP_MSG("disp_reg_restore() release mutex \n"); //disp_path_release_mutex(); DISP_MSG("disp_reg_restore() done \n"); @@ -2534,8 +2553,9 @@ int disp_intr_disable_and_clear(void) DISP_REG_SET(DISP_REG_CONFIG_MUTEX_INTSTA, 0); disp_unregister_rdma1_irq(); - //clear bls interrupt status + //clear bls interrupt status DISP_REG_SET(DISP_REG_BLS_INTSTA, 0); + return 0; } @@ -2560,38 +2580,49 @@ int disp_rdma1_intr_disable_and_clear(void) int disp_path_clock_on(char* name) { + bool bRDMAOff = 0; + + if (atomic_read(&g_clock_on)) { + if (NULL == name) + name = ""; + DISP_MSG("calling disp_path_power_on when power is already on, caller:%s \n", name); + return 0; + } + + atomic_inc(&g_clock_on); + if(name != NULL) { DISP_MSG("disp_path_power_on, caller:%s \n", name); } enable_clock(MT_CG_DISP0_SMI_COMMON , "DDP"); - DISP_MSG("%s %d\n", __FUNCTION__, __LINE__); enable_clock(MT_CG_DISP0_SMI_LARB0 , "DDP"); - DISP_MSG("%s %d\n", __FUNCTION__, __LINE__); //enable_clock(MT_CG_DISP0_MUTEX , "DDP"); enable_clock(MT_CG_DISP0_MUTEX_32K , "DDP"); + DISP_MSG("%s %d DISP CG:%x\n", __FUNCTION__, __LINE__, DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0)); //enable_clock(MT_CG_DISP0_MM_CMDQ , "DDP"); -// //enable_clock(MT_CG_DISP0_CMDQ_SMI , "DDP"); + //enable_clock(MT_CG_DISP0_CMDQ_SMI , "DDP"); -// enable_clock(MT_CG_DISP0_ROT_ENGINE , "DDP"); -// enable_clock(MT_CG_DISP0_ROT_SMI , "DDP"); -// enable_clock(MT_CG_DISP0_SCL , "DDP"); -// enable_clock(MT_CG_DISP0_DISP_WDMA, "DDP"); -// //enable_clock(MT_CG_DISP0_WDMA0_SMI , "DDP"); + //enable_clock(MT_CG_DISP0_ROT_ENGINE , "DDP"); + //enable_clock(MT_CG_DISP0_ROT_SMI , "DDP"); + //enable_clock(MT_CG_DISP0_SCL , "DDP"); + //enable_clock(MT_CG_DISP0_DISP_WDMA, "DDP"); + //enable_clock(MT_CG_DISP0_WDMA0_SMI , "DDP"); - enable_clock(MT_CG_DISP0_DISP_OVL , "DDP"); + //enable_clock(MT_CG_DISP0_DISP_OVL , "DDP"); /* porting from abc123 : power_saving*/ //enable_clock(MT_CG_DISP0_OVL_SMI , "DDP"); enable_clock(MT_CG_DISP0_DISP_COLOR , "DDP"); -// enable_clock(MT_CG_DISP0_2DSHP , "DDP"); + //enable_clock(MT_CG_DISP0_2DSHP , "DDP"); enable_clock(MT_CG_DISP0_DISP_BLS , "DDP"); - enable_clock(MT_CG_DISP0_DISP_WDMA, "DDP"); + //enable_clock(MT_CG_DISP0_DISP_WDMA, "DDP"); /* porting from abc123 : power_saving*/ //enable_clock(MT_CG_DISP0_WDMA0_SMI , "DDP"); //enable_clock(MT_CG_DISP0_RDMA0_ENGINE, "DDP"); //enable_clock(MT_CG_DISP0_RDMA0_SMI , "DDP"); //enable_clock(MT_CG_DISP0_RDMA0_OUTPUT, "DDP"); enable_clock(MT_CG_DISP0_DISP_RDMA, "DDP"); + bRDMAOff = 1; //enable_clock(MT_CG_DISP0_DISP_RMDA1, "DDP"); //enable_clock(MT_CG_DISP0_RDMA1_SMI , "DDP"); //enable_clock(MT_CG_DISP0_RDMA1_OUTPUT, "DDP"); @@ -2608,6 +2639,15 @@ int disp_path_clock_on(char* name) enable_clock(MT_CG_DISP0_MDP_BLS_26M , "DDP"); //#endif + + /* porting from abc123: DE request RDMA reset before engine enable */ + /* prevent reset RDMA interruptedly during RDMA working */ + //when boot up, skip it, orelse it will cause screen flash issue. + /*if(*pRegBackup != DDP_UNBACKED_REG_MEM) + { + if (bRDMAOff == 1) + RDMAReset(0); + }*/ // restore ddp related registers if (strncmp(name, "ipoh_mtkfb", 10)) { @@ -2636,6 +2676,16 @@ int disp_path_clock_on(char* name) int disp_path_clock_off(char* name) { + + if (!atomic_read(&g_clock_on)) { + if (NULL == name) + name = ""; + DISP_MSG("calling disp_path_power_off when power is already off, caller:%s \n", name); + return 0; + } + + atomic_dec(&g_clock_on); + if(name != NULL) { DISP_MSG("disp_path_power_off, caller:%s \n", name); @@ -2644,6 +2694,10 @@ int disp_path_clock_off(char* name) // disable intr and clear intr status disp_intr_disable_and_clear(); + /* porting from abc123: */ + /* DE request RDMA engine enable after DSI, so disable before backup register */ + //RDMADisable(0); //this line causes reboot + // backup ddp related registers disp_reg_backup(); @@ -2665,6 +2719,8 @@ int disp_path_clock_off(char* name) // Better to reset DMA engine before disable their clock RDMAStop(0); RDMAReset(0); +/* porting from abc123 */ +/* #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT if (0 == (gOvlLayerSecure[0]|gOvlLayerSecure[1]|gOvlLayerSecure[2]|gOvlLayerSecure[3])) { @@ -2701,10 +2757,11 @@ int disp_path_clock_off(char* name) disable_clock(MT_CG_DISP0_DISP_OVL , "DDP"); //disable_clock(MT_CG_DISP0_OVL_SMI , "DDP"); +*/ disable_clock(MT_CG_DISP0_DISP_COLOR , "DDP"); -// disable_clock(MT_CG_DISP0_2DSHP , "DDP"); + //disable_clock(MT_CG_DISP0_2DSHP , "DDP"); disable_clock(MT_CG_DISP0_DISP_BLS , "DDP"); - disable_clock(MT_CG_DISP0_DISP_WDMA, "DDP"); + //disable_clock(MT_CG_DISP0_DISP_WDMA, "DDP"); /* porting from abc123 */ //disable_clock(MT_CG_DISP0_WDMA0_SMI , "DDP"); //disable_clock(MT_CG_DISP0_RDMA0_ENGINE, "DDP"); //disable_clock(MT_CG_DISP0_RDMA0_SMI , "DDP"); @@ -2743,9 +2800,16 @@ int disp_path_clock_off(char* name) //disable_clock(MT_CG_DISP0_G2D_ENGINE , "DDP"); //disable_clock(MT_CG_DISP0_G2D_SMI , "DDP"); - //DISP_MSG("DISP CG:%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0)); + DISP_MSG("DISP CG:%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0)); return 0; } + +/* porting from abc123 */ +int disp_path_rdma_start(unsigned idx) +{ + return RDMAStart(idx); +} + #else static int disp_path_clock_on(char* name) @@ -2998,13 +3062,14 @@ int disp_path_config_layer_ovl_engine(OVL_CONFIG_STRUCT* pOvlConfig,int OvlSecur if(!gOvlEngineControl) return 0; - //OVLStop(); + OVLStop(); /*monica_porting3; originally removed fro 8127 but 8135 has it */ _DISP_DumpLayer(pOvlConfig); disp_path_config_layer_(pOvlConfig,OvlSecure); - //OVLStart(); + OVLSWReset(); /* porting from abc123; */ + OVLStart(); /* porting from abc123; originally removed fro 8127 but 8135 has it */ return 0; } @@ -3172,7 +3237,8 @@ int disp_path_config_OVL_WDMA(struct disp_path_config_mem_out_struct* pConfig, i { // config wdma1 WDMAReset(1); - WDMAConfig(1, + if(pConfig->outFormat != eYUV_420_3P){ + WDMAConfig(1, WDMA_INPUT_FORMAT_ARGB, pConfig->srcROI.width, pConfig->srcROI.height, @@ -3182,35 +3248,56 @@ int disp_path_config_OVL_WDMA(struct disp_path_config_mem_out_struct* pConfig, i pConfig->srcROI.height, pConfig->outFormat, pConfig->dstAddr, - (pConfig->dstPitch)?pConfig->dstPitch:pConfig->srcROI.width, + pConfig->srcROI.width, ///pitch 1, 0); - - if(pConfig->outFormat == eYUV_420_3P) { - unsigned int picSz, uAddr, vAddr, width_align, height_align; - width_align = ALIGN_TO(pConfig->srcROI.width, 16); - height_align = ALIGN_TO(pConfig->srcROI.height, 16); - picSz = width_align * height_align; - uAddr = pConfig->dstAddr + picSz; - if (pConfig->dstPitch) - vAddr = uAddr + ((ALIGN_TO(pConfig->dstPitch>>1, 16)*height_align)>>1); - else - vAddr = uAddr + ((ALIGN_TO(pConfig->srcROI.width>>1, 16)*height_align)>>1); + } + else{ + unsigned int picSz, uAddr, vAddr, height_align, width_align; + height_align = pConfig->srcROI.height; //((pConfig->srcROI.height + (16-1)) & (~(16-1))); + width_align = ((pConfig->srcROI.width + (16-1)) & (~(16-1))); + picSz = /*pConfig->srcROI.width*/width_align * height_align; + WDMAConfig(1, + WDMA_INPUT_FORMAT_ARGB, + pConfig->srcROI.width, + pConfig->srcROI.height, + 0, + 0, + pConfig->srcROI.width, + pConfig->srcROI.height, + pConfig->outFormat, + pConfig->dstAddr, + width_align, ///pitch + 1, + 0); - pr_err("[normal] WFD dstAddr:0x%08x picSz:0x%08x uAddr:0x%08x vAddr:0x%08x\n", - pConfig->dstAddr,picSz,uAddr,vAddr); - pr_err("[normal] WFD width:%d align width:%d, height:%d, align width:%d\n", - pConfig->srcROI.width, width_align, pConfig->srcROI.height, height_align); - WDMAConfigUV(1, uAddr, vAddr, pConfig->srcROI.width); - if (pConfig->dstPitch) { - pr_err("[normal] WFD dstPitch:%d\n", pConfig->dstPitch); - DISP_REG_SET(DISP_INDEX_OFFSET + DISP_REG_WDMA_DST_UV_PITCH, - ALIGN_TO(pConfig->dstPitch>>1, 16)); - } + uAddr = pConfig->dstAddr + picSz; + vAddr = uAddr + (picSz>>2); + pr_err("[normal] WFD align_height:%d width_align:%d; width:%d\ndstAddr:0x%08x picSz:0x%08x uAddr:0x%08x vAddr:0x%08x\n", + height_align, width_align, pConfig->srcROI.width,pConfig->dstAddr,picSz,uAddr,vAddr); + WDMAConfigUV(1, uAddr, vAddr, width_align); } WDMAStart(1); } +#if 0 //temporarily marked for lacking of trustzone code +#ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT + { + MTEEC_PARAM param[4]; + unsigned int paramTypes; + TZ_RESULT ret; + + param[0].value.a = DISP_WDMA; + param[1].value.a = (pConfig->security == 1); + paramTypes = TZ_ParamTypes2(TZPT_VALUE_INPUT,TZPT_VALUE_INPUT); + ret = KREE_TeeServiceCall(ddp_session_handle(), TZCMD_DDP_SET_SECURE_MODE, paramTypes, param); + if(ret!= TZ_RESULT_SUCCESS) + { + DISP_ERR("KREE_TeeServiceCall(TZCMD_DDP_SET_SECURE_MODE) fail, ret=%d \n", ret); + } + } +#endif +#endif } else { @@ -3221,6 +3308,14 @@ int disp_path_config_OVL_WDMA(struct disp_path_config_mem_out_struct* pConfig, i } #endif int disp_path_config_(struct disp_path_config_struct* pConfig, int mutexId) +{ + + disp_path_config_mutex(pConfig, mutexId); + + return disp_path_config_setting(pConfig, mutexId); +} + +int disp_path_config_mutex(struct disp_path_config_struct *pConfig, int mutexId) { unsigned int mutexSof; //unsigned int mutexValue; @@ -3288,6 +3383,7 @@ int disp_path_config_(struct disp_path_config_struct* pConfig, int mutexId) g_dst_module = pConfig->dstModule; +#if 0 #ifdef DDP_USE_CLOCK_API #else // TODO: clock manager sholud manager the clock ,not here @@ -3295,6 +3391,7 @@ int disp_path_config_(struct disp_path_config_struct* pConfig, int mutexId) DISP_REG_SET(DISP_REG_CONFIG_MMSYS_CG_CLR1 , 0xFFFFFFFF); DISP_REG_SET(DISP_REG_CONFIG_MMSYS_CG_CON0 , 0xFFF00000); DISP_REG_SET(DISP_REG_CONFIG_MMSYS_CG_CON1 , 0xFFFFC000); +#endif #endif /*config mutex mode*/ @@ -3366,6 +3463,22 @@ int disp_path_config_(struct disp_path_config_struct* pConfig, int mutexId) DISP_REG_SET(DISP_REG_CONFIG_MUTEX_SOF(gMemOutMutexID), 0x0);// single mode DISP_REG_SET(DISP_REG_CONFIG_MUTEX_INTSTA, (1 << gMemOutMutexID)|(1 << mutexId)); } + + /* porting from abc123 */ + return 0; +} + +int disp_path_config_setting(struct disp_path_config_struct *pConfig, int mutexId) +{ + +#ifdef DDP_USE_CLOCK_API + +#else + /* TODO: clock manager sholud manager the clock ,not here */ + DISP_REG_SET(DISP_REG_CONFIG_CG_CLR0, 0xFFFFFFFF); + DISP_REG_SET(DISP_REG_CONFIG_CG_CLR1, 0xFFFFFFFF); +#endif + ///> config config reg switch(pConfig->dstModule) { @@ -3500,6 +3613,8 @@ int disp_path_config_(struct disp_path_config_struct* pConfig, int mutexId) { DISP_ERR("layer ID undefined! %d \n", pConfig->ovl_config.layer); } + if (disp_path_get_ovl_en() == 0) /* porting from abc123 */ + OVLSWReset(); OVLStart(); #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT if(pConfig->dstModule==DISP_MODULE_WDMA) //1. mem->ovl->wdma0->mem @@ -3829,4 +3944,10 @@ int disp_path_config_(struct disp_path_config_struct* pConfig, int mutexId) return 0; } +#ifdef MTK_OVERLAY_ENGINE_SUPPORT +int disp_path_get_ovl_en(void) +{ + return DISP_REG_GET(DISP_REG_OVL_EN); +} +#endif diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.c b/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.c index da75dfca7f1..73092f8bb08 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.c +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.c @@ -72,6 +72,14 @@ int RDMAStop(unsigned idx) { DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_INT_STATUS, 0); return 0; } +/* porting from abc123 */ +int RDMADisable(unsigned idx) +{ + ASSERT(idx <= 2); + DISP_REG_SET_FIELD(GLOBAL_CON_FLD_ENGINE_EN, + idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_GLOBAL_CON, 0); + return 0; +} int RDMAReset(unsigned idx) { unsigned int delay_cnt=0; @@ -157,7 +165,7 @@ int RDMAConfig_(unsigned idx, unsigned int input_is_yuv = 0; unsigned int output_is_yuv = 0; // Calculate fifo settings - unsigned int fifo_pseudo_length = 256; //HW fifo SRAM: 240(89), 256(71/72/82/92), 512 + unsigned int fifo_pseudo_length = 256; //HW fifo SRAM: 240(89), 256(71/72/82/92), 512(ROME) unsigned int fifo_threashold; // Calculate ultra settings unsigned int fps = 60; @@ -424,7 +432,7 @@ int RDMAConfig(unsigned idx, unsigned int input_is_yuv = 0; unsigned int output_is_yuv = 0; // Calculate fifo settings - unsigned int fifo_pseudo_length = 256; //HW fifo SRAM: 240(89), 256(71/72/82/92), 512 + unsigned int fifo_pseudo_length = 256; //HW fifo SRAM: 240(89), 256(71/72/82/92), 512(ROME) unsigned int fifo_threashold; // Calculate ultra settings unsigned int fps = 60; diff --git a/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.h b/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.h index 066d5f07f63..12deff60e08 100644 --- a/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.h +++ b/drivers/misc/mediatek/dispsys/mt8127/ddp_rdma.h @@ -34,6 +34,9 @@ int RDMAStop(unsigned idx); // reset module int RDMAReset(unsigned idx); +/* porting from abc123; disable module */ +int RDMADisable(unsigned idx); + // configu module int RDMAConfig(unsigned idx, enum RDMA_MODE mode, diff --git a/drivers/misc/mediatek/dual_ccci/Makefile b/drivers/misc/mediatek/dual_ccci/Makefile deleted file mode 100644 index c8ce65d5214..00000000000 --- a/drivers/misc/mediatek/dual_ccci/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom -#CONFIG_MTK_CCCI_DRIVER :=m -ifeq ($(CONFIG_MTK_CCCI_EXT), y) - -#include $(MTK_ROOT_BUILD)/Makefile - -#CCCI_PLATFORM_DRIVER_DIR := $(wildcard $(obj)/$(call to-root,$(obj))mediatek/platform/$(call lc,\ -# $(CONFIG_MTK_PLATFORM))/kernel/drivers/ccci) -#CCCI_PLATFORM_DRIVER_DIR := $(srctree)/mediatek/platform/$(call lc,$(CONFIG_MTK_PLATFORM))/kernel/drivers/dual_ccci -CCCI_PLATFORM_DRIVER_DIR := $(srctree)/drivers/misc/mediatek/dual_ccci -ifeq ($(CCCI_PLATFORM_DRIVER_DIR),) -$(error Invalid ccci platform path, please check) -endif - -obj-y += $(subst ",,$(CONFIG_MTK_PLATFORM))/ - -obj-$(CONFIG_MTK_CCCI_DRIVER) += ccci.o -ccci-y :=ccci_init.o -ccci-y +=ccci_hw.o -ccci-y +=ccci_logical.o -ccci-y +=ccci_md_main.o -ccci-y +=ccci_chrdev.o -ccci-y +=ccci_tty.o -ccci-y +=ccci_ipc.o -#ccci-y +=ccci_pmic.o -ccci-y +=ccci_fs_main.o -ccci-y +=ccci_rpc_main.o -ccci-y +=ccmni_net.o -ccci-y +=ccmni_v2_net.o -ccci-y +=ccmni.o -ccci-y +=ccmni_pfp.o -ccci-y +=ccci_mk_node.o -ccci-y +=ccci_statistics.o - -#include $(CCCI_PLATFORM_DRIVER_DIR)/Makefile - -ifeq ($(CONFIG_MTK_CCCI_DRIVER), y) -ccflags-y += -DENABLE_CCCI_DRV_BUILDIN -endif - -clean-files += $(patsubst $(obj)/%,%,$(wildcard $(obj)/*~)) - -ccflags-y += -I$(srctree)/../bionic/libc/kernel/common/linux -I$(srctree)/$(obj)/include -I$(CCCI_PLATFORM_DRIVER_DIR)/include - -ifneq ($(TARGET_BUILD_VARIANT),user) -#ccflags-y += -DCCCI_DEBUG_ON -D__CCCI_LOG__ -DCCCI_MD_DEBUG_ON #-save-temps -ccflags-y += -DCCCI_DEBUG_ON -DCCCI_MD_DEBUG_ON #-save-temps -#ccflags-y += -DENCRYPT_DEBUG -DCCCI_RPC_DEBUG_ON -endif -ccflags-y += -D__CCCI_LOG__ - -else -obj- :=dummy.o - - -endif diff --git a/drivers/misc/mediatek/dual_ccci/ccci_chrdev.c b/drivers/misc/mediatek/dual_ccci/ccci_chrdev.c deleted file mode 100644 index fc8afa68d49..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_chrdev.c +++ /dev/null @@ -1,1356 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern unsigned long long lg_ch_tx_debug_enable[]; -extern unsigned long long lg_ch_rx_debug_enable[]; -//extern unsigned int md_ex_type; -//unsigned int push_data_fail = 0; -unsigned int get_sim_switch_type(void); - -static chr_ctl_block_t *chr_ctlb[MAX_MD_NUM]; -static struct wake_lock chrdev_wakelock[MAX_MD_NUM]; -static struct wake_lock chrdev_wakelock_mdlogger[MAX_MD_NUM]; -char chrdev_wakelock_name[MAX_MD_NUM][32]; -char chrdev_wakelock_mdlog_name[MAX_MD_NUM][32]; -unsigned int md_img_exist[MD_IMG_MAX_CNT] = {0}; -unsigned int md_type_saving = 0; - -unsigned int curr_sim_mode[MAX_MD_NUM]; - -struct ccci_dev_client *md_logger_client = NULL; -static spinlock_t md_logger_lock; -static unsigned int catch_more = 0; - - -#ifdef CONFIG_MTK_MD_SBP_CUSTOM_VALUE -static unsigned int md_sbp_code = 0; -static unsigned int md_sbp_code_default = 0; -#endif //CONFIG_MTK_MD_SBP_CUSTOM_VALUE - -#ifndef CONFIG_MODEM_FIRMWARE_CIP_PATH -#define CONFIG_MODEM_FIRMWARE_CIP_PATH "/custom/etc/firmware/" -#endif - -#ifndef CONFIG_MODEM_FIRMWARE_PATH -#define CONFIG_MODEM_FIRMWARE_PATH "/etc/firmware/" -#endif - -static char * type_str[] = { [modem_invalid]="invalid", - [modem_2g]="2g", - [modem_3g]="3g", - [modem_wg]="wg", - [modem_tg]="tg", - }; - -int scan_image_list(int md_id, char fmt[], int out_img_list[], int img_list_size) -{ - int i; - int img_num = 0; - char full_path[64] = {0}; - char img_name[32] = {0}; - struct file *filp = NULL; - - for(i=0; i<(sizeof(type_str)/sizeof(char*)); i++) { - snprintf(img_name, 32, fmt, md_id+1, type_str[i]); - // Find at CIP first - snprintf(full_path, 64, "%s%s", CONFIG_MODEM_FIRMWARE_CIP_PATH, img_name); - CCCI_MSG_INF(md_id, "chr", "Find:%s\n" ,full_path); - filp = filp_open(full_path, O_RDONLY, 0644); - if (IS_ERR(filp)) { - // Find at default - snprintf(full_path, 64, "%s%s", CONFIG_MODEM_FIRMWARE_PATH, img_name); - CCCI_MSG_INF(md_id, "chr", "Find:%s\n" ,full_path); - filp = filp_open(full_path, O_RDONLY, 0644); - if (IS_ERR(filp)) { - CCCI_MSG_INF(md_id, "chr", "%s not found(%d,%d)\n" ,full_path, img_num, i); - continue; - } - } - // Run here means open image success - filp_close(filp, NULL); - CCCI_MSG_INF(md_id, "chr", "Image:%s found\n", full_path); - if(img_numlock); - atomic_set(&client->user,1); - client->pid=pid; - client->ch_num=ch; - INIT_LIST_HEAD(&client->dev_list); - init_waitqueue_head(&client->wait_q); - client->fasync=NULL; - client->wakeup_waitq=0; -} - - -static void release_client(struct ccci_dev_client *client) -{ - unsigned long flags; - chr_ctl_block_t *ctlb = (chr_ctl_block_t *)client->ctlb; - WARN_ON(spin_is_locked(&client->lock)||list_empty(&client->dev_list)); - mutex_lock(&ctlb->chr_dev_mutex); - if(client->ch_num == CCCI_MD_LOG_RX) { - spin_lock_irqsave(&md_logger_lock, flags); - md_logger_client = NULL; - spin_unlock_irqrestore(&md_logger_lock, flags); - } - list_del(&client->dev_list); - un_register_to_logic_ch(client->md_id, client->ch_num); - kfree(client); - mutex_unlock(&ctlb->chr_dev_mutex); -} - -static inline void ccci_put_client(struct ccci_dev_client *client) -{ - WARN_ON(client==NULL); - if (atomic_dec_and_test(&client->user)) - release_client(client); -} - - -static void ccci_chrdev_callback(void *private) -{ - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - struct ccci_dev_client *client=(struct ccci_dev_client *)(ch_info->m_owner); - - client->wakeup_waitq = 1; - wake_up_interruptible(&client->wait_q); - if(client->ch_num != CCCI_MD_LOG_RX) - wake_lock_timeout(&chrdev_wakelock[client->md_id], HZ/2); - else - wake_lock_timeout(&chrdev_wakelock_mdlogger[client->md_id], HZ); // MD logger using 1s wake lock - - kill_fasync(&client->fasync, SIGIO, POLL_IN); - return ; -} - -static struct ccci_dev_client *find_get_client(int md_id, int ch, pid_t pid) -{ - struct ccci_dev_client *client=NULL; - int ret; - chr_ctl_block_t *ctlb = chr_ctlb[md_id]; - - //schedule_timeout(10*HZ); - mutex_lock(&ctlb->chr_dev_mutex); - - list_for_each_entry(client,&ctlb->chr_dev_list,dev_list) - { - if (client->ch_num == ch) - { - atomic_inc(&client->user); - break ; - } - } - if (&client->dev_list==&ctlb->chr_dev_list) - { - CCCI_CHR_MSG(md_id, "Create a Client for CH%d\n",ch); - client = kmalloc(sizeof(*client),GFP_KERNEL); - if (client==NULL) - { - CCCI_MSG_INF(md_id, "chr", "kmalloc for create client fail \n"); - client = ERR_PTR(-ENOMEM); - goto out; - } - - ccci_client_init(client,ch,pid); - client->md_id = md_id; - client->ctlb = ctlb; - list_add(&client->dev_list,&ctlb->chr_dev_list); - - ret = register_to_logic_ch(md_id, ch, ccci_chrdev_callback, client); - if (ret) - { - //CCCI_MSG_INF(md_id, "chr", "register ch fail: %d \n",ret); - kfree(client); - client = ERR_PTR(ret); - goto out; - } - } - -out: - mutex_unlock(&ctlb->chr_dev_mutex); - return client; -} - - -static int ccci_dev_open(struct inode *inode, struct file *file) -{ - int minor = iminor(inode); - int major = imajor(inode); - int index, minor_start; - int md_id; - int ret = 0; - struct ccci_dev_client *client = NULL; - - ret = get_md_id_by_dev_major(major); - if(ret < 0) { - CCCI_MSG("[Error]invalid md sys id: %d\n", ret); - goto out; - } - md_id = ret; - - ret = get_dev_id_by_md_id(md_id, "std chr", NULL, &minor_start); - if(ret < 0){ - CCCI_MSG_INF(md_id, "chr", "get minor start fail(%d)\n", ret); - goto out; - } - index = minor - minor_start; - - client = find_get_client(md_id, index, current->pid); - CCCI_CHR_MSG(md_id, "Open by %s ch:%d\n", current->comm,index); - if (IS_ERR(client)) - { - CCCI_MSG_INF(md_id, "chr", "find client fail\n"); - ret = PTR_ERR(client); - goto out; - } - file->private_data=client; - if(index == CCCI_MD_LOG_RX) { - md_logger_client = client; - catch_more = 0; - } - - nonseekable_open(inode,file); -out: - return ret; - -} - - -static int ccci_dev_release(struct inode *inode, struct file *file) -{ - struct ccci_dev_client *client=(struct ccci_dev_client *)file->private_data; - ccci_put_client(client); - return 0; -} - - -static int ccci_dev_fasync(int fd, struct file *file, int on) -{ - struct ccci_dev_client *client=(struct ccci_dev_client *)file->private_data; - return fasync_helper(fd,file,on,&client->fasync); -} - - -static unsigned int ccci_dev_poll(struct file *file,poll_table *wait) -{ - struct ccci_dev_client *client=(struct ccci_dev_client *)file->private_data; - int ret=0; - logic_channel_info_t *ch_info; - unsigned long flags; - - ch_info = get_logic_ch_info(client->md_id, client->ch_num); - - poll_wait(file,&client->wait_q,wait); - spin_lock_irqsave(&client->lock, flags); - if ( ch_info && get_logic_ch_data_len(ch_info)) - { - ret |= POLLIN|POLLRDNORM; - } - if( (client->ch_num == CCCI_MD_LOG_RX) && (catch_more) ) { - CCCI_MSG_INF(0, "chr", "add poll error\n"); - catch_more = 0; - ret |= POLLERR; - } - - spin_unlock_irqrestore(&client->lock, flags); - return ret; -} - - -static ssize_t ccci_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) -{ - struct ccci_dev_client *client=(struct ccci_dev_client *)file->private_data; - int md_id = client->md_id; - int i=count/sizeof(ccci_msg_t); - int j=0; - int ret=0; - int ch=client->ch_num; - ccci_msg_t *buff = NULL; - ccci_msg_t msg; - WARN_ON(count%sizeof(ccci_msg_t)); - - if (!buf || (i < 1)) - { - CCCI_MSG_INF(md_id, "chr", "count:%d, i:%d, buf:0x%x \n", count, i, ((unsigned int) buf)); - ret=-EINVAL; - goto out; - } - - buff = (ccci_msg_t *)kmalloc(i*sizeof(ccci_msg_t),GFP_KERNEL); - if (buff==NULL) - { - CCCI_MSG_INF(md_id, "chr", "kmalloc for ccci_msg_t fail \n"); - ret=-ENOMEM; - goto out; - } - if (copy_from_user(buff,buf,i*sizeof(ccci_msg_t))) - { - CCCI_MSG_INF(md_id, "chr", "ccci_dev_write: copy from user fail \n"); - ret=-EFAULT; - goto out_free; - } - - if(lg_ch_tx_debug_enable[md_id] & (1ULL<channel)) { - CCCI_MSG_INF(md_id, "chr", "ccci_dev_write: PID: %d, client: %p, lg_ch: %d\n", - client->pid, client, buff->channel); - } - - for (j=0;jprivate_data; - int ret=0,i=0; - ccci_msg_t buff,*u_buff=(ccci_msg_t *)buf; - int value, n; - logic_channel_info_t *ch_info; - int md_id; - - n = count/sizeof(ccci_msg_t); - WARN_ON(client==NULL); - WARN_ON(count%sizeof(ccci_msg_t)); - - md_id = client->md_id; - ch_info = get_logic_ch_info(client->md_id, client->ch_num); - -retry: - - for (;ilock); - ret = get_logic_ch_data(ch_info, &buff); - spin_unlock_bh(&client->lock); - - if (ret==sizeof(ccci_msg_t)) { - if (copy_to_user(u_buff+i,&buff,sizeof(ccci_msg_t))) { - CCCI_MSG_INF(md_id, "chr", "read: [%d:%s]copy_to_user fail: %08X, %08X, %02d, %08X\n", - client->pid, current->comm, buff.data0, buff.data1, buff.channel, buff.reserved); - ret= -EFAULT; - break; - } - - if(lg_ch_rx_debug_enable[md_id] & (1ULL<pid, current->comm, - buff.data0, buff.data1, buff.channel, buff.reserved); - } - } else { - if (file->f_flags & O_NONBLOCK) { - ret=-EAGAIN; - goto out; - } - - value = wait_event_interruptible(client->wait_q, client->wakeup_waitq); - if(value == -ERESTARTSYS) { - CCCI_CHR_MSG(md_id, "Interrupted syscall.signal_pend=0x%llx\n", - *(long long *)current->pending.signal.sig); - ret = -EINTR; - goto out; - } - else if(value == 0) { - client->wakeup_waitq = 0; - if(lg_ch_rx_debug_enable[md_id] & (1ULL<ch_num, current->pid, current->comm); - } - goto retry; - } - } - } - -out: - //finish_wait(&client->wait_q,&wait); - if (i) { - ret=i*sizeof(ccci_msg_t); - } - -// spin_unlock_bh(&client->lock); - return ret; -} - -static long ccci_dev_ioctl( struct file *file, unsigned int cmd, unsigned long arg) -{ - int addr, len, state, ret = 0; - struct ccci_dev_client *client=(struct ccci_dev_client *)file->private_data; - int md_id = client->md_id; - int ch = client->ch_num; - - switch (cmd) - { - case CCCI_IOC_GET_MD_PROTOCOL_TYPE: - { - char md_protol[] = "AP_TST"; - unsigned int data_size = sizeof(md_protol) / sizeof(char); - - CCCI_MSG_INF(md_id, "chr", "Call CCCI_IOC_GET_MD_PROTOCOL_TYPE!\n"); - - if (copy_to_user((void __user *)arg, md_protol, data_size)) - { - CCCI_MSG_INF(md_id, "chr", "copy_to_user MD_PROTOCOL failed !!\n"); - return -EFAULT; - } - - break; - } - - case CCCI_IOC_GET_MD_STATE: - state = get_curr_md_state(md_id); - if(state >= 0) { - //CCCI_DBG_MSG(md_id, "chr", "MD%d state %d\n", md_id+1, state); - state+='0'; // Make number to charactor - ret = put_user((unsigned int)state, (unsigned int __user *)arg); - } else { - CCCI_MSG_INF(md_id, "chr", "Get MD%d state fail: %d\n", md_id+1, state); - ret = state; - } - break; - - case CCCI_IOC_PCM_BASE_ADDR: - if( (ch == CCCI_PCM_RX) || (ch == CCCI_PCM_TX) ) { - ccci_pcm_base_req(md_id, NULL, &addr, &len); - //audio used this address in ap side, so return ap view - ret = put_user((unsigned int)addr, (unsigned int __user *)arg); - } else { - CCCI_MSG_INF(md_id, "chr", "get PCM base fail: invalid user(%d) \n", ch); - ret = -1; - } - break; - - case CCCI_IOC_PCM_LEN: - if( (ch == CCCI_PCM_RX) || (ch == CCCI_PCM_TX) ) { - ccci_pcm_base_req(md_id, NULL, &addr, &len); - ret = put_user((unsigned int)len, (unsigned int __user *)arg); - } else { - CCCI_MSG_INF(md_id, "chr", "get PCM len fail: invalid user(%d)\n", ch); - ret = -1; - } - break; - - case CCCI_IOC_ALLOC_MD_LOG_MEM: - if( (ch == CCCI_MD_LOG_RX) || (ch == CCCI_MD_LOG_TX) ) { - ccci_mdlog_base_req(md_id, NULL, &addr, &len); - //mdlogger send this address to md, so return md view - addr -= get_md2_ap_phy_addr_fixed(); - ret = addr; - } else { - CCCI_MSG_INF(md_id, "chr", "get MD log base fail: invalid user(%d)\n", ch); - ret = -1; - } - break; - - case CCCI_IOC_MD_RESET: - CCCI_MSG_INF(md_id, "chr", "MD reset ioctl(%d) called by %s\n", ch, current->comm); - ret = send_md_reset_notify(md_id); - break; - - case CCCI_IOC_FORCE_MD_ASSERT: - CCCI_MSG_INF(md_id, "chr", "Force MD assert ioctl(%d) called by %s\n", ch, current->comm); - ret = ccci_trigger_md_assert(md_id); - break; - - default: - CCCI_MSG_INF(md_id, "chr", "illegal IOCTL %X called by %s\n", cmd, current->comm); - ret = -ENOTTY; - break; - } - - // CCCI_DEBUG("ret=%d cmd=0x%x addr=%0x len=%d\n",ret,cmd,addr,len); - return ret; -} - -static int ccci_dev_mmap(struct file *file, struct vm_area_struct *vma) -{ - int pfn, len = 0; - unsigned long addr; - struct ccci_dev_client *client=(struct ccci_dev_client *)file->private_data; - int md_id = client->md_id; - - /* only PCM buffer for PCM channels can be mapped */ - if (client->ch_num == CCCI_PCM_RX || client->ch_num == CCCI_PCM_TX) { - ccci_pcm_base_req(md_id, NULL, &addr, &len); - } else if (client->ch_num==CCCI_MD_LOG_RX||client->ch_num==CCCI_MD_LOG_TX) { - ccci_mdlog_base_req(md_id, NULL, &addr, &len); - } - - CCCI_CHR_MSG(md_id, "remap addr:0x%lx len:%d map-len:%lu\n",addr,len,vma->vm_end-vma->vm_start); - if ((vma->vm_end-vma->vm_start)> len) { - CCCI_DBG_MSG(md_id, "chr", "Get invalid mm size request from ch%d!\n", client->ch_num); - return -1; // mmap return -1 when fail - } - - len=(vma->vm_end-vma->vm_start)vm_end-vma->vm_start:len; - pfn = addr; - pfn >>= PAGE_SHIFT; - /* ensure that memory does not get swapped to disk */ - vma->vm_flags |= VM_IO; - /* ensure non-cacheable */ - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - if (remap_pfn_range(vma, vma->vm_start, pfn,len, vma->vm_page_prot)) { - return -EAGAIN; - } - - return 0; -} - - -static struct file_operations ccci_chrdev_fops= -{ - .owner = THIS_MODULE, - .open = ccci_dev_open, - .read = ccci_dev_read, - .write = ccci_dev_write, - .release = ccci_dev_release, - .unlocked_ioctl = ccci_dev_ioctl, - .fasync = ccci_dev_fasync, - .poll = ccci_dev_poll, - .mmap = ccci_dev_mmap, - -}; - -int ccci_chrdev_init(int md_id) -{ - int ret=0; - int major,minor; - char name[16]; - chr_ctl_block_t *ctlb; - - ctlb = (chr_ctl_block_t *)kmalloc(sizeof(chr_ctl_block_t), GFP_KERNEL); - if(ctlb == NULL) { - ret = -CCCI_ERR_GET_MEM_FAIL; - goto out; - } - - // Init control struct - memset(ctlb, 0, sizeof(chr_ctl_block_t)); - mutex_init(&ctlb->chr_dev_mutex); - ctlb->chr_dev_list.next = &ctlb->chr_dev_list; - ctlb->chr_dev_list.prev = &ctlb->chr_dev_list; - ctlb->md_id = md_id; - - ret = get_dev_id_by_md_id(md_id, "std chr", &major, &minor); - if (ret < 0) { - CCCI_MSG_INF(md_id, "chr", "get std chr dev id fail: %d\n", ret); - ret = -1; - goto out; - } - - snprintf(name, 16, "%s%d", CCCI_DEV_NAME, md_id); - if (register_chrdev_region(MKDEV(major, minor), STD_CHR_DEV_NUM, name) != 0) { - CCCI_MSG_INF(md_id, "chr", "regsiter CCCI_CHRDEV fail\n"); - ret = -1; - goto out; - } - - cdev_init(&ctlb->ccci_chrdev, &ccci_chrdev_fops); - ctlb->ccci_chrdev.owner = THIS_MODULE; - ret = cdev_add(&ctlb->ccci_chrdev, MKDEV(major,minor), STD_CHR_DEV_NUM); - if (ret) { - CCCI_MSG_INF(md_id, "chr", "cdev_add fail\n"); - goto out_err0; - } - - sprintf(chrdev_wakelock_name[md_id], "ccci%d_chr", (md_id+1)); - wake_lock_init(&chrdev_wakelock[md_id], WAKE_LOCK_SUSPEND, chrdev_wakelock_name[md_id]); - - sprintf(chrdev_wakelock_mdlog_name[md_id], "ccci%d_chr_mdlog", (md_id+1)); - wake_lock_init(&chrdev_wakelock_mdlogger[md_id], WAKE_LOCK_SUSPEND, chrdev_wakelock_mdlog_name[md_id]); - - spin_lock_init(&md_logger_lock); - - ctlb->major = major; - ctlb->minor = minor; - chr_ctlb[md_id] = ctlb; - - return ret; - -out_err0: - unregister_chrdev_region(MKDEV(major,minor), STD_CHR_DEV_NUM); - -out: - if (ctlb) - kfree(ctlb); - - return ret; -} - - -void ccci_chrdev_exit(int md_id) -{ - if (chr_ctlb[md_id]) { - unregister_chrdev_region(MKDEV(chr_ctlb[md_id]->major, chr_ctlb[md_id]->minor),CCCI_MAX_CH_NUM); - cdev_del(&chr_ctlb[md_id]->ccci_chrdev); - kfree(chr_ctlb[md_id]); - chr_ctlb[md_id] = NULL; - } - wake_lock_destroy(&chrdev_wakelock[md_id]); - wake_lock_destroy(&chrdev_wakelock_mdlogger[md_id]); -} - - -//======================================================= -// CCCI Virtual charactor device function -//======================================================= - -static vir_ctl_block_t *vir_chr_ctlb[MAX_MD_NUM]; - - - -static void bind_system_msg_transfer(int md_id, ccci_vir_client_t *client) -{ - unsigned long flags; - vir_ctl_block_t *ctlb = vir_chr_ctlb[md_id]; - spin_lock_irqsave(&ctlb->bind_lock, flags); - ctlb->system_msg_client = client; - spin_unlock_irqrestore(&ctlb->bind_lock, flags); -} - - -static void remove_system_msg_transfer(int md_id) -{ - unsigned long flags; - vir_ctl_block_t *ctlb = vir_chr_ctlb[md_id]; - spin_lock_irqsave(&ctlb->bind_lock, flags); - ctlb->system_msg_client = NULL; - spin_unlock_irqrestore(&ctlb->bind_lock, flags); -} - - -void ccci_system_message(int md_id, unsigned int message, unsigned int resv) -{ - unsigned long flags; - vir_ctl_block_t *ctlb = vir_chr_ctlb[md_id]; - ccci_msg_t msg; - struct kfifo *sys_msg_fifo; - ccci_vir_client_t *client = ctlb->system_msg_client; - - msg.data0 = 0xFFFFFFFF; - msg.data1 = message; - msg.channel = CCCI_MONITOR_CH; - msg.reserved = resv; - - spin_lock_irqsave(&ctlb->bind_lock, flags); - if(client != NULL) { - sys_msg_fifo = &client->private_fifo; - if (kfifo_is_full(sys_msg_fifo)) { - spin_unlock_irqrestore(&ctlb->bind_lock, flags); - CCCI_MSG_INF(md_id, "chr", "send system msg fail: fifo full\n"); - return; - } else { - // Push data - kfifo_in(&client->private_fifo, &msg, sizeof(ccci_msg_t)); - client->wakeup_waitq = 1; - wake_up_interruptible(&client->wait_q); - } - } else { - spin_unlock_irqrestore(&ctlb->bind_lock, flags); - CCCI_MSG_INF(md_id, "chr", "send sys msg fail: no bind client\n"); - return; - } - spin_unlock_irqrestore(&ctlb->bind_lock, flags); - -} - - -static void ccci_vir_client_init(ccci_vir_client_t *client, int idx, pid_t pid) -{ - WARN_ON(client==NULL); - spin_lock_init(&client->lock); - atomic_set(&client->user,1); - client->pid=pid; - client->index=idx; - INIT_LIST_HEAD(&client->dev_list); - init_waitqueue_head(&client->wait_q); - client->fasync=NULL; - client->wakeup_waitq=0; -} - - -static void release_vir_client(ccci_vir_client_t *client) -{ - vir_ctl_block_t *ctlb = (vir_ctl_block_t *)client->ctlb; - WARN_ON(spin_is_locked(&client->lock)||list_empty(&client->dev_list)); - mutex_lock(&ctlb->chr_dev_mutex); - - if(client->index == 0) { - remove_system_msg_transfer(ctlb->md_id); - } - - list_del(&client->dev_list); - if(client->fifo_ready) { - kfifo_free(&client->private_fifo); - client->fifo_ready = 0; - } - - kfree(client); - mutex_unlock(&ctlb->chr_dev_mutex); -} - -static inline void ccci_put_vir_client(ccci_vir_client_t *client) -{ - WARN_ON(client == NULL); - if (atomic_dec_and_test(&client->user)) - release_vir_client(client); -} - - -static ccci_vir_client_t *find_get_vir_client(int md_id, int idx, pid_t pid) -{ - ccci_vir_client_t *client = NULL; - vir_ctl_block_t *ctlb = vir_chr_ctlb[md_id]; - - mutex_lock(&ctlb->chr_dev_mutex); - - list_for_each_entry(client,&ctlb->chr_dev_list,dev_list) - { - if (client->index == idx) { - atomic_inc(&client->user); - break ; - } - } - if (&client->dev_list == &ctlb->chr_dev_list) { - CCCI_CHR_MSG(md_id, "Create a Vir Client %d\n", idx); - client = kmalloc(sizeof(*client), GFP_KERNEL); - if (client == NULL) { - CCCI_MSG_INF(md_id, "chr", "kmalloc for create client fail \n"); - client = ERR_PTR(-ENOMEM); - goto out; - } - memset(client, 0, sizeof(ccci_vir_client_t)); - - if (idx == 0) { - // Vir char 0(transfer msg between md_init and ccci driver) need fifo - if (0!=kfifo_alloc(&client->private_fifo, sizeof(ccci_msg_t)*CCCI_VIR_CHR_KFIFO_SIZE, GFP_KERNEL)){ - CCCI_MSG_INF(md_id, "chr", "allocate kfifo fail for vir client0\n"); - client->fifo_ready = 0; - kfree(client); - client = NULL; - goto out; - } else { - client->fifo_ready = 1; - } - } - - ccci_vir_client_init(client, idx, pid); - client->md_id = md_id; - client->ctlb = ctlb; - list_add(&client->dev_list,&ctlb->chr_dev_list); - } - -out: - mutex_unlock(&ctlb->chr_dev_mutex); - return client; -} - - -static int ccci_vir_chr_open(struct inode *inode, struct file *file) -{ - int minor = iminor(inode); - int major = imajor(inode); - int index = -1, minor_start; - int md_id; - int ret = 0; - ccci_vir_client_t *client = NULL; - - ret = get_md_id_by_dev_major(major); - if(ret < 0) { - CCCI_MSG("%s: get md id fail: %d\n", __FUNCTION__, ret); - goto out; - } - - md_id = ret; - ret = get_dev_id_by_md_id(md_id, "vir chr", NULL, &minor_start); - if(ret < 0) { - CCCI_MSG_INF(md_id, "chr", "%s: get dev minor id fail: %d\n", __FUNCTION__, ret); - goto out; - } - index = minor - minor_start; - - client = find_get_vir_client(md_id, index, current->pid); - CCCI_CHR_MSG(md_id, "Vchar(ch%d) open by %s\n", index, current->comm); - if (IS_ERR(client)) { - CCCI_MSG_INF(md_id, "chr", "%s: find client fail \n", __FUNCTION__); - ret = PTR_ERR(client); - goto out; - } - - if(atomic_read(&client->user)>1) { - CCCI_MSG_INF(md_id, "chr", "%s: [Error]multi-open, not support it\n", __FUNCTION__); - return -EPERM; - } - - //CCCI_DBG_MSG(md_id, "chr", "idx:%d fifo%d\n", client->index, client->fifo_ready); - - file->private_data = client; - nonseekable_open(inode, file); -out: - if(index == 0) { // Always using vir char 0 as MD monitor port, and bind it to system message port - bind_system_msg_transfer(md_id, client); - } - return ret; - -} - - -static int ccci_vir_chr_release(struct inode *inode, struct file *file) -{ - ccci_vir_client_t *client = (ccci_vir_client_t *)file->private_data; - ccci_put_vir_client(client); - return 0; -} - - -static int ccci_vir_chr_fasync(int fd, struct file *file, int on) -{ - return -EACCES; // Dummy function, not support fasync for user space -} - - -static unsigned int ccci_vir_chr_poll(struct file *file,poll_table *wait) -{ - return -EACCES; // Dummy function, not support poll for user space -} - - -static ssize_t ccci_vir_chr_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) -{ - return -EACCES; // Dummy function, not support write for user space -} - - -static ssize_t ccci_vir_chr_read(struct file *file, char *buf, size_t count, loff_t *ppos) -{ - ccci_vir_client_t *client = (ccci_vir_client_t *)file->private_data; - ccci_msg_t buff,*u_buff = (ccci_msg_t *)buf; - int ret = 0; - int value; - int md_id; - - WARN_ON(client == NULL); - md_id = client->md_id; - -retry: - - // Check fifo if has data - if (kfifo_is_empty(&client->private_fifo)) { - ret = 0; - } else { - // Pop data - ret = kfifo_out(&client->private_fifo, &buff, sizeof(ccci_msg_t)); - } - - if (ret == sizeof(buff)) { - if (copy_to_user(u_buff, &buff,sizeof(buff))) { - CCCI_MSG_INF(md_id, "chr", "%s: copy_to_user fail: %08X, %08X, %02d, %08X\n", - __FUNCTION__, buff.data0, buff.data1, buff.channel, buff.reserved); - ret= -EFAULT; - } - } else { - if (file->f_flags & O_NONBLOCK) { - ret = -EAGAIN; - goto out; - } - - value = wait_event_interruptible(client->wait_q, client->wakeup_waitq); - if(value == -ERESTARTSYS) { - ret = -EINTR; - goto out; - } else if(value == 0) { - client->wakeup_waitq = 0; - goto retry; - } - } - -out: - return ret; -} - -void ccci_md_logger_notify(void) -{ - unsigned long flags; - spin_lock_irqsave(&md_logger_lock, flags); - if (md_logger_client) { - wake_up_interruptible(&md_logger_client->wait_q); - wake_lock_timeout(&chrdev_wakelock_mdlogger[md_logger_client->md_id], HZ); // MD logger using 1s wake lock - catch_more = 1; - } - spin_unlock_irqrestore(&md_logger_lock, flags); -} -static long ccci_vir_chr_ioctl( struct file *file, unsigned int cmd, unsigned long arg) -{ - int addr, ret = 0; - ccci_vir_client_t *client=(ccci_vir_client_t *)file->private_data; - int md_id = client->md_id; - int idx = client->index; - unsigned int sim_mode; - unsigned int sim_switch_type; - unsigned int md_type; - unsigned int sim_type; - unsigned int enable_sim_type; -#ifdef CONFIG_MTK_ICUSB_SUPPORT - unsigned int sim_id; -#endif - unsigned int sim_slot_cfg[3]; - int ccci_cfg_setting[2]; - int setting_num; - int scaned_num = -1; - - switch (cmd) - { - case CCCI_IOC_GET_MD_PROTOCOL_TYPE: - { - char md_protol[] = "AP_TST"; - unsigned int data_size = sizeof(md_protol) / sizeof(char); - - CCCI_MSG_INF(md_id, "chr", "Call CCCI_IOC_GET_MD_PROTOCOL_TYPE!\n"); - - if (copy_to_user((void __user *)arg, md_protol, data_size)) - { - CCCI_MSG_INF(md_id, "chr", "copy_to_user MD_PROTOCOL failed !!\n"); - return -EFAULT; - } - - break; - } - - case CCCI_IOC_MD_RESET: - CCCI_MSG_INF(md_id, "chr", "MD reset ioctl vir(%d) called by %s\n", idx, current->comm); - ret = send_md_reset_notify(md_id); - break; - - case CCCI_IOC_FORCE_MD_ASSERT: - CCCI_MSG_INF(md_id, "chr", "Force MD assert ioctl(%d) called by %s\n", idx, current->comm); - ret = ccci_trigger_md_assert(md_id); - break; - - case CCCI_IOC_SEND_RUN_TIME_DATA: - if(idx == 0) { - ret = ccci_send_run_time_data(md_id); - } else { - CCCI_MSG_INF(md_id, "chr", "Set runtime by invalid user(%d) called by %s\n", idx, current->comm); - ret = -1; - } - break; - - case CCCI_IOC_GET_MD_INFO: - addr = is_modem_debug_ver(md_id); - ret = put_user((unsigned int)addr, (unsigned int __user *)arg); - break; - - case CCCI_IOC_GET_MD_EX_TYPE: - ret = get_md_exception_type(md_id); - CCCI_MSG_INF(md_id, "chr", "get modem exception type=%d\n", ret); - break; - - case CCCI_IOC_SEND_STOP_MD_REQUEST: - CCCI_MSG_INF(md_id, "chr", "stop MD request ioctl called by %s\n", current->comm); - ret = send_md_stop_notify(md_id); - break; - - case CCCI_IOC_SEND_START_MD_REQUEST: - CCCI_MSG_INF(md_id, "chr", "start MD request ioctl called by %s\n", current->comm); - ret = send_md_start_notify(md_id); - break; - - case CCCI_IOC_DO_START_MD: - CCCI_MSG_INF(md_id, "chr", "start MD ioctl called by %s\n", current->comm); - ret = ccci_start_modem(md_id); - break; - - case CCCI_IOC_DO_STOP_MD: - CCCI_MSG_INF(md_id, "chr", "stop MD ioctl called by %s\n", current->comm); - ret = ccci_stop_modem(md_id, 0); - break; - - case CCCI_IOC_ENTER_DEEP_FLIGHT: - CCCI_MSG_INF(md_id, "chr", "enter MD flight mode ioctl called by %s\n", current->comm); - ret = send_enter_flight_mode_request(md_id); - break; - - case CCCI_IOC_LEAVE_DEEP_FLIGHT: - CCCI_MSG_INF(md_id, "chr", "leave MD flight mode ioctl called by %s\n", current->comm); - ret = send_leave_flight_mode_request(md_id); - break; - - case CCCI_IOC_POWER_ON_MD_REQUEST: - CCCI_MSG_INF(md_id, "chr", "Power on MD request ioctl called by %s\n", current->comm); - ret = send_power_on_md_request(md_id); - break; - - case CCCI_IOC_POWER_OFF_MD_REQUEST: - CCCI_MSG_INF(md_id, "chr", "Power off MD request ioctl called by %s\n", current->comm); - ret = send_power_down_md_request(md_id); - break; - - case CCCI_IOC_POWER_ON_MD: - if(idx == 0) { - ret = let_md_go(md_id); - } else { - CCCI_MSG_INF(md_id, "chr", "Power on MD by invalid user(%d) called by %s\n", idx, current->comm); - ret = -1; - } - break; - - case CCCI_IOC_POWER_OFF_MD: - if(idx == 0) { - ret = let_md_stop(md_id, 1*1000); // <<<< Fix this - } else { - CCCI_MSG_INF(md_id, "chr", "Power off MD by invalid user(%d) called by %s\n", idx, current->comm); - ret = -1; - } - break; - - case CCCI_IOC_SIM_SWITCH: - if(copy_from_user(&sim_mode, (void __user *)arg, sizeof(unsigned int))) { - CCCI_MSG_INF(md_id, "chr", "IOC_SIM_SWITCH: copy_from_user fail!\n"); - ret = -EFAULT; - } else { - ret = exec_ccci_kern_func(ID_SSW_SWITCH_MODE, (char*)(&sim_mode), sizeof(unsigned int));//switch_sim_mode(sim_mode); - CCCI_MSG_INF(md_id, "chr", "IOC_SIM_SWITCH(%x): %d\n", sim_mode, ret); - } - break; - - case CCCI_IOC_UPDATE_SIM_SLOT_CFG: - if(copy_from_user(&sim_slot_cfg, (void __user *)arg, sizeof(sim_slot_cfg))) { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_UPDATE_SIM_SLOT_CFG: copy_from_user fail!\n"); - ret = -EFAULT; - } else { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_UPDATE_SIM_SLOT_CFG get s0:%d s1:%d en:%d\n", - sim_slot_cfg[0], sim_slot_cfg[1], sim_slot_cfg[2]); - sim_mode = (2<<16)|(sim_slot_cfg[0]&0x000000FF)|((sim_slot_cfg[1]<<8)&0x0000FF00); - ret = exec_ccci_kern_func(ID_SSW_SWITCH_MODE, (char*)(&sim_mode), sizeof(unsigned int)); - if(ret == 0) { - curr_sim_mode[md_id] = sim_mode; - sim_mode = sim_mode&0x0000FFFF; - sim_mode |= (1<<24); // SIM slot save to ccci nvram idx 1 - if ( sim_slot_cfg[2] ) { // Need save setting - sim_mode |= (1<<31); // Set save nvram flag - } - send_update_cfg_request(md_id, sim_mode); - } else { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_UPDATE_SIM_SLOT_CFG exec (%d)\n", ret); - } - ret = 0; - } - break; - - case CCCI_IOC_SIM_SWITCH_TYPE: - sim_switch_type = get_sim_switch_type(); - ret = put_user(sim_switch_type, (unsigned int __user *)arg); - break; - - case CCCI_IOC_SEND_BATTERY_INFO: - send_battery_info(md_id); - break; - -#ifdef CONFIG_MTK_ICUSB_SUPPORT - case CCCI_IOC_SEND_ICUSB_NOTIFY: - if(copy_from_user(&sim_id, (void __user *)arg, sizeof(unsigned int))) { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_SEND_ICUSB_NOTIFY: copy_from_user fail!\n"); - ret = -EFAULT; - } else { - send_icusb_notify(md_id, sim_id); - } - break; -#endif - - case CCCI_IOC_RELOAD_MD_TYPE: - if(copy_from_user(&md_type, (void __user *)arg, sizeof(unsigned int))) { - CCCI_MSG_INF(md_id, "chr", "IOC_RELOAD_MD_TYPE: copy_from_user fail!\n"); - ret = -EFAULT; - } else { - CCCI_MSG_INF(md_id, "chr", "IOC_RELOAD_MD_TYPE: storing md type(%d)!\n", md_type); - set_modem_support(md_id, md_type); - ccci_set_reload_modem(md_id); - } - break; - - case CCCI_IOC_GET_SIM_TYPE: //for regional phone boot animation - if (get_sim_type(md_id, &sim_type)) - { - CCCI_MSG_INF(md_id, "chr", "sim type may not be correct\n"); - } - ret = put_user((unsigned int)sim_type, (unsigned int __user *)arg); - break; - - case CCCI_IOC_ENABLE_GET_SIM_TYPE: //for regional phone boot animation - if(copy_from_user(&enable_sim_type, (void __user *)arg, sizeof(unsigned int))) { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_ENABLE_GET_SIM_TYPE: copy_from_user fail!\n"); - ret = -EFAULT; - } else { - enable_get_sim_type(md_id, enable_sim_type); - } - break; - - case CCCI_IOC_SET_MD_IMG_EXIST: -#if 0 - if(copy_from_user(&md_img_exist, (void __user *)arg, sizeof(md_img_exist))) { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_ENABLE_GET_SIM_TYPE: copy_from_user fail!\n"); - ret = -EFAULT; - } -#endif - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_ENABLE_GET_SIM_TYPE: need not set!\n"); - break; - - case CCCI_IOC_GET_MD_IMG_EXIST: - memset(md_img_exist, 0, sizeof(md_img_exist)); - scaned_num = scan_image_list(md_id, "modem_%d_%s_n.img", &md_img_exist, MD_IMG_MAX_CNT); - if (scaned_num < 1) { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_GET_MD_IMG_EXIST: scan md imfage fail!\n"); - ret= -EFAULT; - } else { - if (copy_to_user((void __user *)arg, &md_img_exist, sizeof(md_img_exist))) { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_GET_MD_IMG_EXIST: copy_to_user fail!\n"); - ret= -EFAULT; - } - } - break; - - case CCCI_IOC_GET_MD_TYPE: - md_type = get_modem_support(md_id); - ret = put_user((unsigned int)md_type, (unsigned int __user *)arg); - break; - - case CCCI_IOC_STORE_MD_TYPE: - CCCI_DBG_MSG(md_id, "chr", "store md type ioctl called by %s!\n", current->comm); - if(copy_from_user(&md_type_saving, (void __user *)arg, sizeof(unsigned int))) { - CCCI_MSG_INF(md_id, "chr", "store md type fail: copy_from_user fail!\n"); - ret = -EFAULT; - } else { - CCCI_MSG_INF(md_id, "chr", "storing md type(%d) in kernel space!\n", md_type_saving); - if (0x1 <= md_type_saving && md_type_saving <= 0x4){ - if (md_type_saving != get_modem_support(md_id)) - CCCI_MSG_INF(md_id, "chr", "Maybe Wrong: md type storing not equal with current setting!(%d %d)\n", md_type, get_modem_support(md_id)); - //Notify md_init daemon to store md type in nvram - ccci_system_message(md_id, CCCI_MD_MSG_STORE_NVRAM_MD_TYPE, 0); - } - else { - CCCI_MSG_INF(md_id, "chr", "store md type fail: invalid md type(0x%x)\n", md_type_saving); - } - } - break; - - case CCCI_IOC_GET_MD_TYPE_SAVING: - ret = put_user(md_type_saving, (unsigned int __user *)arg); - break; - - case CCCI_IOC_GET_CFG_SETTING: - setting_num = 2; - ret = get_common_cfg_setting(md_id, ccci_cfg_setting, &setting_num); - if (copy_to_user((void __user *)arg, ccci_cfg_setting, sizeof(ccci_cfg_setting))) { - CCCI_MSG_INF(md_id, "chr", "CCCI_IOC_GET_CFG_SETTING: copy_to_user fail\n"); - ret= -EFAULT; - } - break; - -#ifdef CONFIG_MTK_MD_SBP_CUSTOM_VALUE - case CCCI_IOC_GET_MD_SBP_CFG: - CCCI_MSG_INF(md_id, "chr", "SBP confg length:%d!\n", strlen(CONFIG_MTK_MD_SBP_CUSTOM_VALUE)); - if (strlen(CONFIG_MTK_MD_SBP_CUSTOM_VALUE) > 0) { - if (!md_sbp_code_default) { - int tmpret = kstrtouint(CONFIG_MTK_MD_SBP_CUSTOM_VALUE, 0, &md_sbp_code_default); - if (!tmpret){ - CCCI_MSG_INF(md_id, "chr", "GET_MD_SBP_CFG: get config sbp code:%d!\n", md_sbp_code_default); - } else { - CCCI_MSG_INF(md_id, "chr", "GET_MD_SBP_CFG: get config sbp code fail! ret:%d, Config val:%s\n" - , tmpret, CONFIG_MTK_MD_SBP_CUSTOM_VALUE); - } - } else { - CCCI_MSG_INF(md_id, "chr", "GET_MD_SBP_CFG: config sbp code:%d!\n", md_sbp_code_default); - } - - ret = put_user(md_sbp_code_default, (unsigned int __user *)arg); - - } else { - ret = -ENOTTY; - } - break; - - case CCCI_IOC_SET_MD_SBP_CFG: - if(copy_from_user(&md_sbp_code, (void __user *)arg, sizeof(unsigned int))) { - CCCI_MSG_INF(md_id, "chr", "SET_MD_SBP_CFG: copy_from_user fail!\n"); - ret = -EFAULT; - } else { - CCCI_MSG_INF(md_id, "chr", "SET_MD_SBP_CFG: set md sbp code:0x%x!\n", md_sbp_code); - ccci_set_md_sbp(md_id, md_sbp_code); - } - break; -#endif // CONFIG_MTK_MD_SBP_CUSTOM_VALUE - - default: - CCCI_MSG_INF(md_id, "chr", "illegal IOCTL %X called by %s\n", cmd, current->comm); - ret = -ENOTTY; - break; - } - - return ret; -} - - -static int ccci_vir_chr_mmap(struct file *file, struct vm_area_struct *vma) -{ - return -1; // Dummy function, not support mmap, // mmap return -1 when fail -} - - -static struct file_operations ccci_vir_chrdev_fops= -{ - .owner = THIS_MODULE, - .open=ccci_vir_chr_open, - .read=ccci_vir_chr_read, - .write=ccci_vir_chr_write, - .release=ccci_vir_chr_release, - .unlocked_ioctl=ccci_vir_chr_ioctl, - .fasync=ccci_vir_chr_fasync, - .poll=ccci_vir_chr_poll, - .mmap=ccci_vir_chr_mmap, - -}; - - -int ccci_vir_chrdev_init(int md_id) -{ - int ret = 0; - int major, minor; - char name[16]; - vir_ctl_block_t *ctlb; - - curr_sim_mode[md_id] = -1; - - ctlb = (vir_ctl_block_t *)kmalloc(sizeof(vir_ctl_block_t), GFP_KERNEL); - if(ctlb == NULL) { - ret = -CCCI_ERR_GET_MEM_FAIL; - goto out; - } - - // Init control struct - memset(ctlb, 0, sizeof(vir_ctl_block_t)); - mutex_init(&ctlb->chr_dev_mutex); - ctlb->chr_dev_list.next = &ctlb->chr_dev_list; - ctlb->chr_dev_list.prev = &ctlb->chr_dev_list; - ctlb->md_id = md_id; - - ret = get_dev_id_by_md_id(md_id, "vir chr", &major, &minor); - if (ret < 0) { - CCCI_MSG_INF(md_id, "chr", "Get ccci vir dev id fail(%d)!\n", ret); - ret=-1; - goto out; - } - - snprintf(name, 16, "vir_chr%d", md_id); - if (register_chrdev_region(MKDEV(major,minor),CCCI_MAX_VCHR_NUM, name) != 0) { - CCCI_MSG_INF(md_id, "chr", "Regsiter CCCI_VCHRDEV failed!\n"); - ret=-1; - goto out; - } - - cdev_init(&ctlb->ccci_chrdev,&ccci_vir_chrdev_fops); - ctlb->ccci_chrdev.owner = THIS_MODULE; - ret = cdev_add(&ctlb->ccci_chrdev,MKDEV(major,minor),CCCI_MAX_VCHR_NUM); - if (ret) { - CCCI_MSG_INF(md_id, "chr", "cdev_add failed\n"); - goto out_err0; - } - - ctlb->major = major; - ctlb->minor = minor; - spin_lock_init(&ctlb->bind_lock); - vir_chr_ctlb[md_id] = ctlb; - return ret; - -out_err0: - unregister_chrdev_region(MKDEV(major,minor),CCCI_MAX_VCHR_NUM); - -out: - if (ctlb) - kfree(ctlb); - - return ret; -} - - -void ccci_vir_chrdev_exit(int md_id) -{ - if (vir_chr_ctlb[md_id]) { - unregister_chrdev_region(MKDEV(vir_chr_ctlb[md_id]->major, vir_chr_ctlb[md_id]->minor),CCCI_MAX_CH_NUM); - cdev_del(&vir_chr_ctlb[md_id]->ccci_chrdev); - kfree(vir_chr_ctlb[md_id]); - vir_chr_ctlb[md_id] = NULL; - } -} - - -#ifdef CONFIG_MTK_MD_SBP_CUSTOM_VALUE - -int __weak ccci_set_md_sbp(int md_id, unsigned int md_sbp) -{ - CCCI_ERR("calling weak function %s(%d,%d)\n", __FUNCTION__, md_id, md_sbp); - return -1; -} - -#endif // CONFIG_MTK_MD_SBP_CUSTOM_VALUE diff --git a/drivers/misc/mediatek/dual_ccci/ccci_fs_main.c b/drivers/misc/mediatek/dual_ccci/ccci_fs_main.c deleted file mode 100644 index b432b5ffc80..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_fs_main.c +++ /dev/null @@ -1,466 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_fs.c - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * MT65XX CCCI FS Proxy Driver - * - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define CCCI_FS_DEVNAME "ccci_fs" - -extern unsigned long long lg_ch_tx_debug_enable[]; -extern unsigned long long lg_ch_rx_debug_enable[]; -//enable fs_tx or fs_rx log -unsigned int fs_tx_debug_enable[MAX_MD_NUM] = {0}; -unsigned int fs_rx_debug_enable[MAX_MD_NUM] = {0}; - -typedef struct _fs_ctl_block -{ - unsigned int fs_md_id; - spinlock_t fs_spinlock; - dev_t fs_dev_num; - struct cdev fs_cdev; - fs_stream_buffer_t *fs_buffers; - int fs_buffers_phys_addr; - struct kfifo fs_fifo; - int reset_handle; - wait_queue_head_t fs_waitq; - struct wake_lock fs_wake_lock; - char fs_wakelock_name[16]; - int fs_smem_size; -}fs_ctl_block_t; - -static fs_ctl_block_t *fs_ctl_block[MAX_MD_NUM]; - - -// will be called when modem sends us something. -// we will then copy it to the tty's buffer. -// this is essentially the "read" fops. -static void ccci_fs_callback(void *private) -{ - unsigned long flag; - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - ccci_msg_t msg; - fs_ctl_block_t *ctl_b = (fs_ctl_block_t *)ch_info->m_owner; - - spin_lock_irqsave(&ctl_b->fs_spinlock,flag); - while(get_logic_ch_data(ch_info, &msg)){ - if (msg.channel == CCCI_FS_RX) { - if(fs_rx_debug_enable[ctl_b->fs_md_id]){ - CCCI_DBG_MSG(ctl_b->fs_md_id, "fs ", "fs_callback: %08X %08X %08X\n", - msg.data0, msg.data1, msg.reserved); - } - - if (kfifo_in(&ctl_b->fs_fifo, (unsigned char *) &msg.reserved, sizeof(msg.reserved)) == sizeof(msg.reserved)) { - wake_up_interruptible(&ctl_b->fs_waitq); - wake_lock_timeout(&ctl_b->fs_wake_lock, HZ/2); - } else { - CCCI_DBG_MSG(ctl_b->fs_md_id, "fs ", "[Error]Unable to put new request into fifo\n"); - } - } - } - spin_unlock_irqrestore(&ctl_b->fs_spinlock,flag); -} - - -static int ccci_fs_get_index(int md_id) -{ - int ret; - unsigned long flag; - fs_ctl_block_t *ctl_b; - - if(unlikely(fs_ctl_block[md_id] == NULL)) { - CCCI_MSG_INF(md_id, "fs ", "fs_get_index: fata error, fs_ctl_b is NULL\n"); - return -EPERM; - } - ctl_b = fs_ctl_block[md_id]; - - CCCI_FS_MSG(md_id, "get_fs_index++\n"); - - if (wait_event_interruptible(ctl_b->fs_waitq, kfifo_len(&ctl_b->fs_fifo) != 0) != 0) { - if(fs_rx_debug_enable[md_id]) - CCCI_MSG_INF(md_id, "fs ", "fs_get_index: Interrupted by syscall.signal_pend\n"); - return -ERESTARTSYS; - } - - spin_lock_irqsave(&ctl_b->fs_spinlock,flag); - if (kfifo_out(&ctl_b->fs_fifo, (unsigned char *) &ret, sizeof(int)) != sizeof(int)) { - spin_unlock_irqrestore(&ctl_b->fs_spinlock,flag); - CCCI_MSG_INF(md_id, "fs ", "get fs index fail from fifo\n"); - return -EFAULT; - } - - spin_unlock_irqrestore(&ctl_b->fs_spinlock,flag); - - if(fs_rx_debug_enable[md_id]) - CCCI_MSG_INF(md_id, "fs ", "fs_index=%d \n", ret); - - CCCI_FS_MSG(md_id, "get_fs_index--\n"); - return ret; -} - - -static int ccci_fs_send(int md_id, unsigned long arg) -{ - void __user *argp; - ccci_msg_t msg; - fs_stream_msg_t message; - int ret = 0; - int xmit_retry = 0; - fs_ctl_block_t *ctl_b; - - CCCI_FS_MSG(md_id, "ccci_fs_send++\n"); - - if(unlikely(fs_ctl_block[md_id] == NULL)) { - CCCI_MSG_INF(md_id, "fs ", "fs_get_index: fatal error, fs_ctl_b is NULL\n"); - return -EPERM; - } - ctl_b = fs_ctl_block[md_id]; - - argp = (void __user *) arg; - if (copy_from_user((void *) &message, argp, sizeof(fs_stream_msg_t))) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_send: copy_from_user fail!\n"); - return -EFAULT; - } - - msg.data0 = ctl_b->fs_buffers_phys_addr - get_md2_ap_phy_addr_fixed() + (sizeof(fs_stream_buffer_t) * message.index); - msg.data1 = message.length + 4; - msg.channel = CCCI_FS_TX; - msg.reserved = message.index; - - if(fs_tx_debug_enable[md_id]) { - CCCI_MSG_INF(md_id, "fs ", "fs_send: %08X %08X %08X\n", - msg.data0, msg.data1, msg.reserved); - } - - mb(); - do{ - ret = ccci_message_send(md_id, &msg, 1); - if(ret == sizeof(ccci_msg_t)) - break; - - if(ret == -CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) { - xmit_retry++; - msleep(10); - if( (xmit_retry&0xF) == 0) { - CCCI_MSG_INF(md_id, "fs ", "fs_chr has retried %d times\n", xmit_retry); - } - }else{ - break; - } - }while(1); - - if(ret != sizeof(ccci_msg_t)) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_send fail : %08X, %08X, %08X\n", - ret, msg.data0, msg.data1, msg.reserved); - return ret; - } - - CCCI_FS_MSG(md_id, "ccci_fs_send--\n"); - - return 0; -} - - -static int ccci_fs_mmap(struct file *file, struct vm_area_struct *vma) -{ - unsigned long off, start, len; - fs_ctl_block_t *ctl_b; - int md_id; - - ctl_b =(fs_ctl_block_t *)file->private_data; - md_id = ctl_b->fs_md_id; - - CCCI_FS_MSG(md_id, "mmap++\n"); - - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_mmap: vm_pgoff too large\n"); - return -EINVAL; - } - - off = vma->vm_pgoff << PAGE_SHIFT; - start = (unsigned long) ctl_b->fs_buffers_phys_addr; - len = PAGE_ALIGN((start & ~PAGE_MASK) + ctl_b->fs_smem_size); - - if ((vma->vm_end - vma->vm_start + off) > len) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_mmap: memory require over ccci_fs_smem size\n"); - return -1; // mmap return -1 when fail - } - - off += start & PAGE_MASK; - vma->vm_pgoff = off >> PAGE_SHIFT; - vma->vm_flags |= VM_IO; - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - - CCCI_FS_MSG(md_id, "mmap--\n"); - - return remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, vma->vm_end - vma->vm_start, vma->vm_page_prot); -} - - -static long ccci_fs_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - int ret; - int md_id; - fs_ctl_block_t *ctl_b; - - ctl_b =(fs_ctl_block_t *)file->private_data; - md_id = ctl_b->fs_md_id; - - switch(cmd) - { - case CCCI_FS_IOCTL_GET_INDEX: - ret = ccci_fs_get_index(md_id); - break; - - case CCCI_FS_IOCTL_SEND: - ret = ccci_fs_send(md_id, arg); - break; - - default: - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_ioctl: [Error]unknown ioctl:%d\n", cmd); - ret = -ENOIOCTLCMD; - break; - } - - return ret; -} - -// clear kfifo invalid data which may not be processed before close operation -void ccci_fs_resetfifo(int md_id) -{ - fs_ctl_block_t *ctl_b = fs_ctl_block[md_id]; - unsigned long flag; - - CCCI_MSG("ccci_fs_resetfifo\n"); - - // Reset FS KFIFO - spin_lock_irqsave(&ctl_b->fs_spinlock, flag); - kfifo_reset(&ctl_b->fs_fifo); - spin_unlock_irqrestore(&ctl_b->fs_spinlock, flag); - - return; -} - -static int ccci_fs_open(struct inode *inode, struct file *file) -{ - int md_id; - int major; - fs_ctl_block_t *ctl_b; - - major = imajor(inode); - md_id = get_md_id_by_dev_major(major); - if(md_id < 0) { - CCCI_MSG("FS open fail: invalid major id:%d\n", major); - return -1; - } - CCCI_MSG_INF(md_id, "fs ", "FS open by %s\n", current->comm); - - ctl_b = fs_ctl_block[md_id]; - file->private_data=ctl_b; - nonseekable_open(inode,file); - - // modem reset registration. - ctl_b->reset_handle = ccci_reset_register(md_id, "CCCI_FS"); - ASSERT(ctl_b->reset_handle >= 0); - - return 0; -} - - -static int ccci_fs_release(struct inode *inode, struct file *file) -{ - int md_id; - int major; - fs_ctl_block_t *ctl_b; - // unsigned long flag; - - major = imajor(inode); - md_id = get_md_id_by_dev_major(major); - if(md_id < 0) { - CCCI_MSG("FS release fail: invalid major id:%d\n", major); - return -1; - } - CCCI_MSG_INF(md_id, "fs ", "FS release by %s\n", current->comm); - - ctl_b = fs_ctl_block[md_id]; - - memset(ctl_b->fs_buffers, 0, ctl_b->fs_smem_size); - ccci_user_ready_to_reset(md_id, ctl_b->reset_handle); - - // CR: 1260702 - // clear kfifo invalid data which may not be processed before close operation - // spin_lock_irqsave(&ctl_b->fs_spinlock,flag); - // kfifo_reset(&ctl_b->fs_fifo); - // spin_unlock_irqrestore(&ctl_b->fs_spinlock,flag); - - return 0; -} - - -static int ccci_fs_start(int md_id) -{ - fs_ctl_block_t *ctl_b; - unsigned long flag; - - if(unlikely(fs_ctl_block[md_id] == NULL)) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_start: fatal error, fs_ctl_b is NULL\n"); - return -CCCI_ERR_FATAL_ERR; - } - ctl_b = fs_ctl_block[md_id]; - - if ( 0 != kfifo_alloc(&ctl_b->fs_fifo,sizeof(unsigned) * CCCI_FS_MAX_BUFFERS, GFP_KERNEL)) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_start: kfifo alloc fail \n"); - return -CCCI_ERR_ALLOCATE_MEMORY_FAIL; - } - - // Reset FS KFIFO - spin_lock_irqsave(&ctl_b->fs_spinlock,flag); - kfifo_reset(&ctl_b->fs_fifo); - spin_unlock_irqrestore(&ctl_b->fs_spinlock,flag); - - - // modem related channel registration. - ASSERT(ccci_fs_base_req(md_id, (int*)&ctl_b->fs_buffers, &ctl_b->fs_buffers_phys_addr, \ - &ctl_b->fs_smem_size) == 0); - - ASSERT(register_to_logic_ch(md_id, CCCI_FS_RX, ccci_fs_callback, ctl_b) == 0); - - return 0; -} - - -static void ccci_fs_stop(int md_id) -{ - fs_ctl_block_t *ctl_b; - - if(unlikely(fs_ctl_block[md_id] == NULL)) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_stop: fatal error, fs_ctl_b is NULL\n"); - return; - } - ctl_b = fs_ctl_block[md_id]; - if (ctl_b->fs_buffers != NULL) { - kfifo_free(&ctl_b->fs_fifo); - ASSERT(un_register_to_logic_ch(md_id, CCCI_FS_RX) == 0); - ctl_b->fs_buffers = NULL; - ctl_b->fs_buffers_phys_addr = 0; - } -} - - -static struct file_operations fs_fops = -{ - .owner = THIS_MODULE, - .unlocked_ioctl = ccci_fs_ioctl, - .open = ccci_fs_open, - .mmap = ccci_fs_mmap, - .release = ccci_fs_release, -}; - - -int __init ccci_fs_init(int md_id) -{ - int ret; - int major, minor; - fs_ctl_block_t *ctl_b; - - ret = get_dev_id_by_md_id(md_id, "fs", &major, &minor); - if(ret<0) { - CCCI_MSG("ccci_fs_init: get md device number failed(%d)\n", ret); - return ret; - } - // Allocate fs ctrl struct memory - ctl_b = (fs_ctl_block_t *)kmalloc(sizeof(fs_ctl_block_t), GFP_KERNEL); - if(ctl_b == NULL) - return -CCCI_ERR_GET_MEM_FAIL; - memset(ctl_b, 0, sizeof(fs_ctl_block_t)); - - fs_ctl_block[md_id] = ctl_b; - - // Init ctl_b - ctl_b->fs_md_id = md_id; - spin_lock_init(&ctl_b->fs_spinlock); - init_waitqueue_head(&ctl_b->fs_waitq); - ctl_b->fs_dev_num = MKDEV(major, minor); - snprintf(ctl_b->fs_wakelock_name, sizeof(ctl_b->fs_wakelock_name), "ccci%d_fs", (md_id+1)); - wake_lock_init(&ctl_b->fs_wake_lock, WAKE_LOCK_SUSPEND, ctl_b->fs_wakelock_name); - - ret = register_chrdev_region(ctl_b->fs_dev_num, 1, ctl_b->fs_wakelock_name); - if (ret) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_init: Register char device failed(%d)\n", ret); - goto _REG_CHR_REGION_FAIL; - } - - cdev_init(&ctl_b->fs_cdev, &fs_fops); - ctl_b->fs_cdev.owner = THIS_MODULE; - ctl_b->fs_cdev.ops = &fs_fops; - - ret = cdev_add(&ctl_b->fs_cdev, ctl_b->fs_dev_num, 1); - if (ret) { - CCCI_MSG_INF(md_id, "fs ", "cdev_add fail(%d)\n", ret); - unregister_chrdev_region(ctl_b->fs_dev_num, 1); - goto _REG_CHR_REGION_FAIL; - } - - ret = ccci_fs_start(md_id); - if (ret) { - CCCI_MSG_INF(md_id, "fs ", "FS initialize fail\n"); - goto _CCCI_FS_START_FAIL; - } - - CCCI_FS_MSG(md_id, "Init complete, device major number = %d\n", MAJOR(ctl_b->fs_dev_num)); - - return 0; -_CCCI_FS_START_FAIL: - cdev_del(&ctl_b->fs_cdev); - unregister_chrdev_region(ctl_b->fs_dev_num, 1); - -_REG_CHR_REGION_FAIL: - kfree(ctl_b); - fs_ctl_block[md_id] = NULL; - - return ret; -} - - -void __exit ccci_fs_exit(int md_id) -{ - fs_ctl_block_t *ctl_b = fs_ctl_block[md_id]; - - if(unlikely(ctl_b == NULL)) { - CCCI_MSG_INF(md_id, "fs ", "ccci_fs_exit: fs_ctl_b is NULL\n"); - return; - } - - ccci_fs_stop(md_id); - - cdev_del(&ctl_b->fs_cdev); - unregister_chrdev_region(ctl_b->fs_dev_num, 1); - wake_lock_destroy(&ctl_b->fs_wake_lock); - kfree(ctl_b); - fs_ctl_block[md_id] = NULL; -} diff --git a/drivers/misc/mediatek/dual_ccci/ccci_hw.c b/drivers/misc/mediatek/dual_ccci/ccci_hw.c deleted file mode 100644 index c03d6153164..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_hw.c +++ /dev/null @@ -1,493 +0,0 @@ -#include -#include -#include -#include -#include -#include - - -#define CCIF_DEBUG //ccif issue debug - -extern unsigned long long lg_ch_tx_debug_enable[]; -extern unsigned long long lg_ch_rx_debug_enable[]; - - - -static int __ccif_v1_en_intr(ccif_t* ccif) -{ - unsigned long flag; - CCCI_FUNC_ENTRY(ccif->m_md_id); - - spin_lock_irqsave(&ccif->m_lock,flag); - if(ccif->m_irq_dis_cnt) { - enable_irq(ccif->m_irq_id); - ccif->m_irq_dis_cnt--; - } - spin_unlock_irqrestore(&ccif->m_lock,flag); - - return 0; -} - - -static void __ccif_v1_dis_intr(ccif_t* ccif) -{ - unsigned long flag; - CCCI_FUNC_ENTRY(ccif->m_md_id); - - spin_lock_irqsave(&ccif->m_lock,flag); - if(ccif->m_irq_dis_cnt == 0) { - disable_irq(ccif->m_irq_id); - ccif->m_irq_dis_cnt++; - } - spin_unlock_irqrestore(&ccif->m_lock,flag); -} - - -static int __ccif_v1_dump_reg(ccif_t* ccif, unsigned int buf[], int len) -{ - int i,j; - volatile unsigned int *curr_ccif_smem_addr = (volatile unsigned int *)CCIF_TXCHDATA(ccif->m_reg_base); - - CCCI_DBG_MSG(ccif->m_md_id, "cci", "[CCCI REG_INFO]\n"); - CCCI_DBG_MSG(ccif->m_md_id, "cci", "CON(%lx)=%08X, BUSY(%lx)=%08x, START(%lx)=%08x, MRCHNUM(%lx)=%08x\n", - CCIF_CON(ccif->m_reg_base), ccci_read32(CCIF_CON(ccif->m_reg_base)), - CCIF_BUSY(ccif->m_reg_base), ccci_read32(CCIF_BUSY(ccif->m_reg_base)), - CCIF_START(ccif->m_reg_base), ccci_read32(CCIF_START(ccif->m_reg_base)), - MD_CCIF_RCHNUM(ccif->m_md_reg_base), ccci_read32(MD_CCIF_RCHNUM(ccif->m_md_reg_base))); - CCCI_DBG_MSG(ccif->m_md_id, "cci", "MCON(%lx)=%08X, MBUSY(%lx)=%08x, MSTART(%lx)=%08x, RCHNUM(%lx)=%08x\n", - MD_CCIF_CON(ccif->m_md_reg_base), ccci_read32(MD_CCIF_CON(ccif->m_md_reg_base)), - MD_CCIF_BUSY(ccif->m_md_reg_base), ccci_read32(MD_CCIF_BUSY(ccif->m_md_reg_base)), - MD_CCIF_START(ccif->m_md_reg_base), ccci_read32(MD_CCIF_START(ccif->m_md_reg_base)), - CCIF_RCHNUM(ccif->m_reg_base), ccci_read32(CCIF_RCHNUM(ccif->m_reg_base))); - - for(i=0; i<16; i++){ - CCCI_DBG_MSG(ccif->m_md_id, "cci", "%08X: %08X %08X %08X %08X\n", (unsigned int)curr_ccif_smem_addr, \ - curr_ccif_smem_addr[0], curr_ccif_smem_addr[1], - curr_ccif_smem_addr[2], curr_ccif_smem_addr[3]); - curr_ccif_smem_addr+=4; - } - - if(buf == NULL || len < (4*16+8)){ - // Only dump by log - return 0; - }else{ - j=0; - buf[j++] = ccci_read32(CCIF_CON(ccif->m_reg_base)); - buf[j++] = ccci_read32(CCIF_BUSY(ccif->m_reg_base)); - buf[j++] = ccci_read32(CCIF_START(ccif->m_reg_base)); - buf[j++] = ccci_read32(MD_CCIF_RCHNUM(ccif->m_reg_base)); - - buf[j++] = ccci_read32(MD_CCIF_CON(ccif->m_reg_base)); - buf[j++] = ccci_read32(MD_CCIF_BUSY(ccif->m_reg_base)); - buf[j++] = ccci_read32(MD_CCIF_START(ccif->m_reg_base)); - buf[j++] = ccci_read32(CCIF_RCHNUM(ccif->m_reg_base)); - curr_ccif_smem_addr = (volatile unsigned int *)CCIF_TXCHDATA(ccif->m_reg_base); - for(i=0; i<4*16; i++) - buf[j++] = curr_ccif_smem_addr[i]; - } - - return j; -} - - -static int __ccif_v1_read_phy_ch_data(ccif_t* ccif, int ch, unsigned int buf[]) -{ - ccif_msg_t *rx_msg = (ccif_msg_t*)(CCIF_RXCHDATA(ccif->m_reg_base)); - buf[0] = rx_msg[ch].data[0]; - buf[1] = rx_msg[ch].data[1]; - buf[2] = rx_msg[ch].channel; - buf[3] = rx_msg[ch].reserved; - return sizeof(ccif_msg_t); -} - - -static int __ccif_v1_write_phy_ch_data(ccif_t* ccif, unsigned int buf[], int retry_en) -{ - int ret = 0; - unsigned int busy; - unsigned long flag; - unsigned int retry_count = 200; - unsigned int ch; - ccif_msg_t *tx_msg; - int md_id = ccif->m_md_id; - - CCCI_FUNC_ENTRY(md_id); - if(retry_en == 0) - retry_count = 1; - - do{ - spin_lock_irqsave(&ccif->m_lock, flag); - busy=ccci_read32(CCIF_BUSY(ccif->m_reg_base)); - - ch = ccif->m_tx_idx; - if (busy&(1<m_lock,flag); - - udelay(1); - retry_count--; - } else { - ccci_write32(CCIF_BUSY(ccif->m_reg_base), 1<m_tx_idx++; - ccif->m_tx_idx &= (CCIF_STD_V1_MAX_CH_NUM-1); - //spin_unlock_irqrestore(&ccif->m_lock,flag); - - //mb(); // Note here, make sure data has write to memory be really send - tx_msg = (ccif_msg_t*)(CCIF_TXCHDATA(ccif->m_reg_base)); - ccci_write32(&(tx_msg[ch].data[0]), buf[0]); - ccci_write32(&(tx_msg[ch].data[1]), buf[1]); - ccci_write32(&(tx_msg[ch].channel), buf[2]); - ccci_write32(&(tx_msg[ch].reserved), buf[3]); - //mb(); - - ccci_write32(CCIF_TCHNUM(ccif->m_reg_base), ch); - - spin_unlock_irqrestore(&ccif->m_lock,flag); - - ret = sizeof(ccif_msg_t); - break; - } - }while(retry_count>0); - - if(lg_ch_tx_debug_enable[md_id] & (1<< buf[2])) - CCCI_MSG_INF(md_id, "cci", "[TX]: %08X, %08X, %02d, %08X (%02d)\n", - buf[0], buf[1], buf[2], buf[3], ch); - - return ret; -} - - -static int __ccif_v1_get_rx_ch(ccif_t* ccif) -{ - while (CCIF_CON_ARB != ccci_read32(CCIF_CON(ccif->m_reg_base))){ - ccci_write32(CCIF_CON(ccif->m_reg_base), CCIF_CON_ARB); - } - return ccci_read32(CCIF_RCHNUM(ccif->m_reg_base)); -} - - -static int __ccif_v1_get_busy_state(ccif_t* ccif) -{ - return ccci_read32(CCIF_BUSY(ccif->m_reg_base)); -} - - -static void __ccif_v1_set_busy_state(ccif_t* ccif, unsigned int val) -{ - //*CCIF_BUSY(ccif->m_reg_base) = val; - ccci_write32(CCIF_BUSY(ccif->m_reg_base), val); -} - - -static int __ccif_v1_ack(ccif_t* ccif, int ch) -{ - //*CCIF_ACK(ccif->m_reg_base) = (1 << ch); - ccci_write32(CCIF_ACK(ccif->m_reg_base), (1<m_reg_base); - - for(i=0; i<4*16; i++){ - ccci_write32(&ccif_tx_addr[i], 0); - } - return 0; -} - - -static int __ccif_v1_write_runtime_data(ccif_t* ccif, unsigned int buf[], int len) -{ - int i; - volatile unsigned int *curr_ccif_smem_addr = (unsigned int*)(ccif->m_reg_base+CCIF_STD_V1_RUN_TIME_DATA_OFFSET); - if ( len > CCIF_STD_V1_RUM_TIME_MEM_MAX_LEN ) { - return -CCCI_ERR_CCIF_INVALID_RUNTIME_LEN; - } - for(i=0; im_reg_base), 1); - ccif->m_rx_idx = 0; - ccif->m_tx_idx = 0; - // ACK MD all channel - ccci_write32(CCIF_ACK(ccif->m_reg_base), 0xFF); - __ccif_v1_clear_sram(ccif); - - return 0; -} - - -// Note: This is a common function -static irqreturn_t __ccif_irq_handler(int irq, void *data) -{ - int ret; - ccif_t *ccif = (ccif_t*)data; - - ret = ccif->ccif_intr_handler(ccif); - if(ret){ - CCCI_MSG_INF(ccif->m_md_id, "cci", "ccif_irq_handler fail: %d!\n", ret); - } - - return IRQ_HANDLED; -} - - -static int __ccif_v1_reg_intr(ccif_t* ccif) -{ - int ret; - unsigned long flags; - - spin_lock_irqsave(&ccif->m_lock,flags); - ccif->m_irq_dis_cnt=0; - spin_unlock_irqrestore(&ccif->m_lock,flags); - ret = request_irq(ccif->m_irq_id, __ccif_irq_handler, IRQF_TRIGGER_LOW, "CCIF", ccif); - - return ret; -} - - -static int __ccif_v1_init(ccif_t* ccif) -{ - //*CCIF_CON(ccif->m_reg_base) = 1; - ccci_write32(CCIF_CON(ccif->m_reg_base), CCIF_CON_ARB); - ccif->m_rx_idx = 0; - ccif->m_tx_idx = 0; - // ACK MD all channel - //*CCIF_ACK(ccif->m_reg_base) = 0xFF; - ccci_write32(CCIF_ACK(ccif->m_reg_base), 0xFF); - __ccif_v1_clear_sram(ccif); - - return 0; -} - - -static int __ccif_v1_de_init(ccif_t* ccif) -{ - // Disable ccif irq, no need for there is kernel waring of free already-free irq when free_irq - //ccif->ccif_dis_intr(ccif); - - // Check if TOP half is running - while(test_bit(CCIF_TOP_HALF_RUNNING,&ccif->m_status)) - yield(); - - WARN_ON(spin_is_locked(&ccif->m_lock)); - - // Un-register irq - free_irq(ccif->m_irq_id,ccif); - - // Free memory - kfree(ccif); - - return 0; -} - - -static int __ccif_v1_register_call_back(ccif_t* ccif, int (*push_func)(ccif_msg_t*, void*), void (*notify_func)(void*)) -{ - if(!test_and_set_bit(CCIF_CALL_BACK_FUNC_LOCKED, &ccif->m_status)) { - ccif->push_msg = push_func; - ccif->notify_push_done = notify_func; - return 0; - } else { - CCCI_DBG_MSG(ccif->m_md_id, "cci", "[Error]ccif call back func has registered!\n"); - return CCCI_ERR_CCIF_CALL_BACK_HAS_REGISTERED; - } -} - - -static int __ccif_v1_register_isr_notify(ccif_t* ccif, void (*notify_func)(int)) -{ - if(!test_and_set_bit(CCIF_ISR_INFO_CALL_BACK_LOCKED, &ccif->m_status)){ - ccif->isr_notify = notify_func; - return 0; - } else { - CCCI_DBG_MSG(ccif->m_md_id, "cci", "[Error]ccif isr call back func has registered\n"); - return CCCI_ERR_CCIF_CALL_BACK_HAS_REGISTERED; - } -} - - -static int __ccif_v1_intr_handler(ccif_t *ccif) -{ - ccif_msg_t phy_ch_data; - int re_enter_cnt = 0; - int r_ch_val; - int i; - int rx_ch; - int md_id = ccif->m_md_id; - bool reg_err = FALSE; - unsigned int msg[4]; - - CCCI_FUNC_ENTRY(md_id); - set_bit(CCIF_TOP_HALF_RUNNING,&ccif->m_status); - - //CCCI_DBG_MSG(md_id, "cci", "ISR\n"); - - if(ccif->isr_notify) - ccif->isr_notify(md_id); - - rx_ch = ccif->m_rx_idx; - - while( (r_ch_val = ccif->ccif_get_rx_ch(ccif)) && (re_enter_cntccif_read_phy_ch_data(ccif, rx_ch, (unsigned int*)&phy_ch_data); - #ifdef CCIF_DEBUG - if (phy_ch_data.channel >= CCCI_MAX_CH_NUM) { - if (!reg_err) { - reg_err = TRUE; - __ccif_v1_dump_reg(ccif, NULL, 0); - CCCI_MSG_INF(md_id, "cci", "[CCIF Register Error]RX: %08X, %08X, %02d, %08X (%02d)\n", phy_ch_data.data[0], \ - phy_ch_data.data[1], phy_ch_data.channel, phy_ch_data.reserved, rx_ch); - } - } - #endif - - if((lg_ch_rx_debug_enable[md_id] & ENABLE_ALL_RX_LOG) || - (lg_ch_rx_debug_enable[md_id] & (1<< phy_ch_data.channel))) { - CCCI_DBG_MSG(md_id, "cci", "[RX]: %08X, %08X, %02d, %08X (%02d)\n", phy_ch_data.data[0], \ - phy_ch_data.data[1], phy_ch_data.channel, phy_ch_data.reserved, rx_ch); - } - - // push ccif message to up layer - if (unlikely(ccif->push_msg == NULL)) { - CCCI_DBG_MSG(md_id, "cci", "push_msg func not registered:0x%08x, 0x%08x, %02d, 0x%08x\n", \ - phy_ch_data.data[0], phy_ch_data.data[1], phy_ch_data.channel, phy_ch_data.reserved); - } else { - if ( ccif->push_msg(&phy_ch_data, ccif->m_logic_ctl_block) != sizeof(ccif_msg_t) ) { - //CCCI_DBG_MSG(md_id, "cci", "push data fail(ch%d)\n", phy_ch_data.channel); - } - } - - // Ack modem side ccif - ccci_write32(CCIF_ACK(ccif->m_reg_base), (1<%02x : %d=CCIF_INTR_MAX_RE_ENTER_CNT) && (r_ch_val!=0) ) { - CCCI_DBG_MSG(md_id, "cci", "too much message to process\n"); - __ccif_v1_dump_reg(ccif, NULL, 0); - } - - // Store latest rx channel index - ccif->m_rx_idx = rx_ch; - - // Notify uplayer begin to process data - if (unlikely(ccif->notify_push_done == NULL)) { - //CCCI_DBG_MSG(md_id, "cci", "notify_push_done not registered!\n"); - } else { - ccif->notify_push_done(ccif->m_logic_ctl_block); - } - - clear_bit(CCIF_TOP_HALF_RUNNING,&ccif->m_status); - - - #ifdef CCIF_DEBUG - if (reg_err) { - reg_err = FALSE; - msg[0] = 0xFFFFFFFF; - msg[1] = 0x5B5B5B5B; - msg[2] = CCCI_FORCE_ASSERT_CH; - msg[3] = 0xB5B5B5B5; - __ccif_v1_write_phy_ch_data(ccif, msg, 0); - } - #endif - - return 0; -} - - -ccif_t* ccif_create_instance(ccif_hw_info_t *info, void* ctl_b, int md_id) -{ - ccif_t *ccif; - - if(info == NULL){ - CCCI_MSG_INF(md_id, "cci", "[error]ccif hw info is null\n"); - return NULL; - } - - ccif = kmalloc(sizeof(ccif_t), GFP_KERNEL); - if(ccif == NULL){ - CCCI_MSG_INF(md_id, "cci", "[error]allocate memory for ccif structure fail\n"); - return NULL; - } - - if (info->md_id != md_id) { - CCCI_MSG_INF(md_id, "cci", "[error]ccif_instance_md_id is mis-match to hw_info_md_id: (%d, %d)\n", - md_id, info->md_id); - return NULL; - } - - switch(info->type){ - case CCIF_STD_V1: - ccif->m_ccif_type = info->type; - ccif->m_irq_id = info->irq_id; - ccif->m_reg_base = info->reg_base; - ccif->m_md_reg_base = info->md_reg_base; - ccif->m_irq_attr = info->irq_attr; - ccif->m_status = 0; - ccif->m_rx_idx = 0; - ccif->m_md_id = md_id; //info->md_id; - spin_lock_init(&ccif->m_lock); - ccif->register_call_back_func = __ccif_v1_register_call_back; - ccif->register_isr_notify_func = __ccif_v1_register_isr_notify; - ccif->ccif_init = __ccif_v1_init; - ccif->ccif_de_init = __ccif_v1_de_init; - ccif->ccif_register_intr = __ccif_v1_reg_intr; - ccif->ccif_en_intr = __ccif_v1_en_intr; - ccif->ccif_dis_intr = __ccif_v1_dis_intr; - ccif->ccif_dump_reg = __ccif_v1_dump_reg; - ccif->ccif_read_phy_ch_data = __ccif_v1_read_phy_ch_data; - ccif->ccif_write_phy_ch_data = __ccif_v1_write_phy_ch_data; - ccif->ccif_get_rx_ch = __ccif_v1_get_rx_ch; - ccif->ccif_get_busy_state = __ccif_v1_get_busy_state; - ccif->ccif_set_busy_state = __ccif_v1_set_busy_state; - ccif->ccif_ack_phy_ch = __ccif_v1_ack; - ccif->ccif_clear_sram = __ccif_v1_clear_sram; - ccif->ccif_write_runtime_data = __ccif_v1_write_runtime_data; - ccif->ccif_intr_handler = __ccif_v1_intr_handler; - ccif->ccif_reset = __ccif_v1_reset; - ccif->m_logic_ctl_block = ctl_b; - ccif->m_irq_dis_cnt = 0; - return ccif; - - case CCIF_VIR: - default: - CCCI_MSG_INF(md_id, "cci", "%s: [error]invalid ccif type(%d)\n", __FUNCTION__, info->type); - kfree(ccif); - return NULL; - } -} - - diff --git a/drivers/misc/mediatek/dual_ccci/ccci_init.c b/drivers/misc/mediatek/dual_ccci/ccci_init.c deleted file mode 100644 index 2ec85841513..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_init.c +++ /dev/null @@ -1,293 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -unsigned long long lg_ch_rx_debug_enable[MAX_MD_NUM]; -unsigned long long lg_ch_tx_debug_enable[MAX_MD_NUM]; - -static int __init ccci_init(void) -{ - int ret = CCCI_ERR_MODULE_INIT_OK; - unsigned int md_num = 1; - int i = 0; - int md_en[MAX_MD_NUM] = {0}; - - //1. Get and set Support MD nmmber - md_num = get_md_sys_max_num(); - set_md_sys_max_num(md_num); - - //2. Get and set MD enable table - for(i = 0; i < md_num; i++) { - if(get_modem_is_enabled(i)){ - md_en[i] = 1; - set_md_enable(i, 1); - } else { - md_en[i] = 0; - set_md_enable(i, 0); - } - } - -#ifdef ENABLE_CCCI_DRV_BUILDIN -CCCI_MSG("ccci_init: device_initcall_sync\n"); -#else // MODULE -CCCI_MSG("ccci_init: module_init\n"); -#endif - - //3. Init ccci device table - ret = init_ccci_dev_node(); - if(ret) { - CCCI_MSG("init_ccci_dev_node fail: %d\n", ret); - ret = -CCCI_ERR_INIT_DEV_NODE_FAIL; - goto out; - } - - //4. Init ccci driver for each modem - for(i = 0; i < md_num; i++) - { - if(md_en[i] == 0) { - CCCI_MSG_INF(i, "cci", "md initial fail: md%d is not enabled\n", i+1); - continue; - } - - // 4.0 Init platform support function - ret = platform_init(i, !md_en[i]); - if (ret) { - CCCI_MSG_INF(i, "cci", "platform_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_PLATFORM_FAIL; - goto platform_out; - } else { - CCCI_DBG_MSG(i, "cci", "platform_init OK!\n"); - } - - // Make ccci device node - ret = mk_ccci_dev_node(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "mk_ccci_dev_node fail: %d\n", ret); - ret = -CCCI_ERR_MK_DEV_NODE_FAIL; - goto mk_node_out; - } else { - CCCI_DBG_MSG(i, "cci", "mk_ccci_dev_node OK!\n"); - } - - // Statistics init - statistics_init(i); - - // 4.1 Init ccci logical layer - ret = ccci_logic_layer_init(i); - if(ret) { - CCCI_MSG_INF(i, "cci", "ccci logical layer init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_LOGIC_LAYER_FAIL; - goto logic_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_logic_layer_init OK!\n"); - } - - // 4.2 Init md ctrl - ret = ccci_md_ctrl_init(i); - if(ret) { - CCCI_MSG_INF(i, "cci", "ccci md ctrl init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_MD_CTRL_FAIL; - goto mdctl_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_md_ctrl_init OK!\n"); - } - - // 4.3 Init char dev - ret = ccci_chrdev_init(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "ccci_chrdev_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_CHAR_DEV_FAIL; - goto char_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_chrdev_init OK!\n"); - } - - // 4.4 Init tty dev - ret = ccci_tty_init(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "ccci_tty_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_TTY_FAIL; - goto tty_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_tty_init OK!\n"); - } - - // 4.5 Init ipc dev - ret = ccci_ipc_init(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "ccci_ipc_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_IPC_FAIL; - goto ipc_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_ipc_init OK!\n"); - } - - // 4.6 Init rpc dev - ret = ccci_rpc_init(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "ccci_rpc_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_RPC_FAIL; - goto rpc_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_rpc_init OK!\n"); - } - - // 4.7 Init fs dev - ret = ccci_fs_init(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "ccci_fs_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_FS_FAIL; - goto fs_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_fs_init OK!\n"); - } - - // 4.8 Init ccmni dev - ret = ccmni_init(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "ccmni_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_CCMNI_FAIL; - goto ccmni_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccmni_init OK!\n"); - } - - // 4.9 Init pmic dev - // .... - - // 4.10 Init vir char dev - ret = ccci_vir_chrdev_init(i); - if (ret) { - CCCI_MSG_INF(i, "cci", "ccci_vir_chrdev_init fail: %d\n", ret); - ret = -CCCI_ERR_INIT_VIR_CHAR_FAIL; - goto virchar_out; - } else { - CCCI_DBG_MSG(i, "cci", "ccci_vir_chrdev_init OK!\n"); - } - - CCCI_MSG_INF(i, "cci", "md initial OK!\n"); - } - - // 5. Init common section - ret = ccci_md_ctrl_common_init(); - if (ret == 0) - goto out; - else { - i = md_num-1; - CCCI_MSG_INF(i, "cci", "ccci_md_ctrl_common_init fail: %d\n", ret); - } - -virchar_out: - ccci_vir_chrdev_exit(i); - -ccmni_out: - ccmni_exit(i); - -fs_out: - ccci_fs_exit(i); - -rpc_out: - ccci_rpc_exit(i); - -ipc_out: - ccci_ipc_exit(i); - -tty_out: - ccci_tty_exit(i); - -char_out: - ccci_chrdev_exit(i); - -mdctl_out: - ccci_md_ctrl_exit(i); - -logic_out: - ccci_logic_layer_exit(i); - -platform_out: - platform_deinit(i); - -mk_node_out: - ccci_dev_node_exit(i); - -out: - if ((i == MD_SYS2) && (md_num > MD_SYS2)) { - ccci_vir_chrdev_exit(MD_SYS1); - ccmni_exit(MD_SYS1); - ccci_fs_exit(MD_SYS1); - ccci_rpc_exit(MD_SYS1); - ccci_ipc_exit(MD_SYS1); - ccci_tty_exit(MD_SYS1); - ccci_chrdev_exit(MD_SYS1); - ccci_md_ctrl_exit(MD_SYS1); - ccci_logic_layer_exit(MD_SYS1); - platform_deinit(MD_SYS1); - ccci_dev_node_exit(MD_SYS1); - } - - if (ret == CCCI_ERR_MODULE_INIT_OK) - CCCI_MSG("ccci module init OK\n"); - else { - release_ccci_dev_node(); - ccci_helper_exit(); - CCCI_MSG("ccci module init fail: %d\n", ret); - } - - return ret; -} - -static void __exit ccci_exit(void) -{ - unsigned int md_num = 1, i; - - //1. Get Support MD nmmber - md_num = get_md_sys_max_num(); - - //2. Init ccci driver for each modem - for(i=0; i -#include -#include -#include -#include - -#define local_AP_id_2_unify_id(id) local_xx_id_2_unify_id(id,1) -#define local_MD_id_2_unify_id(id) local_xx_id_2_unify_id(id,0) -#define unify_AP_id_2_local_id(id) unify_xx_id_2_local_id(id,1) -#define unify_MD_id_2_local_id(id) unify_xx_id_2_local_id(id,0) - -typedef struct _ipc_ctl_block -{ - int m_md_id; - spinlock_t ccci_ipc_wr_lock; - spinlock_t ccci_ipc_rd_lock; - CCCI_IPC_MEM *ipc_mem; - unsigned int ccci_ipc_smem_base_phy; - int ccci_ipc_smem_size; - unsigned int ccci_ipc_wr_buffer_phy; - unsigned int ccci_ipc_rd_buffer_phy; - struct cdev ccci_ipc_cdev; - wait_queue_head_t poll_md_queue_head; - int md_is_ready; - IPC_TASK ipc_task[MAX_NUM_IPC_TASKS] ; - MD_CALL_BACK_QUEUE md_status_update_call_back; - int major; - int start_minor; -}ipc_ctl_block_t; - -static ipc_ctl_block_t *ipc_ctl_block[MAX_MD_NUM]; - -static void release_recv_item(CCCI_RECV_ITEM *item); -static void ipc_call_back_func(MD_CALL_BACK_QUEUE*,unsigned long); - - - -static void ipc_smem_init(CCCI_IPC_MEM *ipc_mem) -{ - int i; - - ipc_mem->buffer.buff_wr.size=CCCI_IPC_BUFFER_SIZE; - ipc_mem->buffer.buff_wr.rx_offset=0; - ipc_mem->buffer.buff_wr.tx_offset=0; - ipc_mem->buffer.buff_rd.size=CCCI_IPC_BUFFER_SIZE; - ipc_mem->buffer.buff_rd.rx_offset=0; - ipc_mem->buffer.buff_rd.tx_offset=0; - - for (i=0;iilm+i)->src_mod_id = -1UL; - (ipc_mem->ilm+i)->dest_mod_id = -1UL; - (ipc_mem->ilm+i)->sap_id = -1UL; - (ipc_mem->ilm+i)->msg_id = -1UL; - (ipc_mem->ilm+i)->local_para_ptr = NULL; - (ipc_mem->ilm+i)->local_para_ptr = NULL; - } -} - -int ccci_ipc_ipo_h_restore(int md_id) -{ - ipc_ctl_block_t *ctl_b; - - ctl_b = ipc_ctl_block[md_id]; - ipc_smem_init(ctl_b->ipc_mem); - return 0; -} - -static void ipc_call_back_func(MD_CALL_BACK_QUEUE *queue,unsigned long data) -{ - IPC_TASK *tsk; - int i; - CCCI_RECV_ITEM *item,*n; - ipc_ctl_block_t *ctl_b = container_of(queue, ipc_ctl_block_t, md_status_update_call_back); - unsigned long flags; - - switch (data) - { - case CCCI_MD_EXCEPTION: - ctl_b->md_is_ready=0; - CCCI_DBG_MSG(ctl_b->m_md_id, "ipc", "MD exception call chain !\n"); - break; - - case CCCI_MD_RESET: - //if (ctl_b->md_is_ready) - { - ctl_b->md_is_ready=0; - CCCI_DBG_MSG(ctl_b->m_md_id, "ipc", "MD reset call chain !\n"); - for (i=0;iipc_task+i; - spin_lock_irqsave(&tsk->lock, flags); - list_for_each_entry_safe(item,n,&tsk->recv_list,list) - { - release_recv_item(item); - } - spin_unlock_irqrestore(&tsk->lock, flags); - //__wake_up(&tsk->write_wait_queue, TASK_NORMAL, 0, (void*)POLLERR); - //__wake_up(&tsk->read_wait_queue, TASK_NORMAL, 0, (void*)POLLERR); - } - spin_lock_irqsave(&ctl_b->ccci_ipc_wr_lock, flags); - ctl_b->ipc_mem->buffer.buff_wr.tx_offset=0; - ctl_b->ipc_mem->buffer.buff_wr.rx_offset=0; - spin_unlock_irqrestore(&ctl_b->ccci_ipc_wr_lock, flags); - - spin_lock_irqsave(&ctl_b->ccci_ipc_rd_lock, flags); - ctl_b->ipc_mem->buffer.buff_rd.tx_offset=0; - ctl_b->ipc_mem->buffer.buff_rd.rx_offset=0; - spin_unlock_irqrestore(&ctl_b->ccci_ipc_rd_lock, flags); - - } - break; - - case CCCI_MD_BOOTUP: - ctl_b->md_is_ready=1; - wake_up_all(&ctl_b->poll_md_queue_head); - CCCI_IPC_MSG(ctl_b->m_md_id, "MD boot up successfully.\n"); - break; - - } - -} - - -static IPC_MSGSVC_TASKMAP_T ipc_msgsvc_maptbl[] = -{ - // X_IPC_MODULE_CONF(1,M_SSDBG1,0,1) //TASK_ID_1 - // X_IPC_MODULE_CONF(1,AP_SSDBG2,1,1) //TASK_ID_2 - #define __IPC_ID_TABLE - #include "ccci_ipc_task_ID.h" - #undef __IPC_ID_TABLE - -}; - -void find_task_to_clear(IPC_TASK task_table[], unsigned int to_id) -{ - IPC_TASK *task=NULL; - int i, tmp; - ipc_ctl_block_t *ctl_b = (ipc_ctl_block_t*)(container_of(task_table, ipc_ctl_block_t, ipc_task[0])); - - for (i=0;im_md_id, "ipc", "%s: task->to_id(%d:%d)\n", __FUNCTION__, i, task_table[i].to_id); - - if (task==NULL) - { - task=ctl_b->ipc_task+i; - tmp=i; - continue; - } - if (time_after(task->jiffies,task_table[i].jiffies)) - { - task=task_table+i; - CCCI_DBG_MSG(ctl_b->m_md_id, "ipc", "%s: select task->to_id(%d:%d)\n", __FUNCTION__, i, task_table[i].to_id); - } else if (task->jiffies==task_table[i].jiffies) { - CCCI_DBG_MSG(ctl_b->m_md_id, "ipc", "[Error]Wrong time stamp(%ld, %ld), select task->to_id(%d:%d)\n", - task->jiffies, task_table[i].jiffies, tmp, task->to_id); - } - } - } - - if (task==NULL) - { - CCCI_MSG_INF(ctl_b->m_md_id, "ipc", "Wrong MD ID(%d) to clear for next recv.\n",to_id); - return; - } - CCCI_IPC_MSG(ctl_b->m_md_id, "wake up task:%d \n", task-ctl_b->ipc_task); - clear_bit(CCCI_TASK_PENDING,&task->flag); - wake_up_poll(&task->write_wait_queue, POLLOUT); -} - -static IPC_MSGSVC_TASKMAP_T *local_xx_id_2_unify_id(uint32 local_id,int AP) -{ - int i; - - for (i=0;ilist)) - list_del_init(&item->list); - - if (item->data) - kfree(item->data); - kfree(item); - } -} - - -void *read_from_ring_buffer(int md_id, ipc_ilm_t *ilm, BUFF *buff_rd, int *len) -{ - int size; - int write; - int read; - int data_size; - uint8 *data; - void *ret=NULL; - int over=0; - int copy=0; - int real_size=0; - unsigned long flag; - ipc_ctl_block_t *ctl_b = ipc_ctl_block[md_id]; - - spin_lock_irqsave(&ctl_b->ccci_ipc_rd_lock, flag); - size=buff_rd->size; - write=buff_rd->tx_offset; - read=buff_rd->rx_offset; - data_size=(write-read)>=0?(write-read):(size-(read-write)); - - if(data_size == 0) - CCCI_IPC_MSG(md_id, "data_size=0, read(%d)", read); - else if (data_size < 0) { - CCCI_MSG_INF(md_id, "ipc", "[Error]wrong data_size: %d", data_size); - return NULL; - } - - CCCI_IPC_MSG(md_id, "tx_offset=%d, rx_offset=%d\n", write, read); - - data=(uint8 *)kmalloc(data_size+sizeof(ipc_ilm_t), GFP_ATOMIC); - if (data==NULL) - { - CCCI_MSG_INF(md_id, "ipc", "kmalloc for read ilm fail!\n"); - ret=NULL; - goto out; - } - - *((ipc_ilm_t *)data)=*ilm; - ilm=(ipc_ilm_t *)data; - data +=sizeof(ipc_ilm_t) ; - - if (writebuffer+read,over); - copy+=over; - read=(read+over)&(size-1); - } - - if (copybuffer+read,data_size-copy); - } - real_size +=(ilm->local_para_ptr)?((local_para_struct *)data)->msg_len:0; - data +=real_size; - real_size +=(ilm->peer_buff_ptr)?((peer_buff_struct *)data)->pdu_len:0; - - buff_rd->rx_offset += real_size; - buff_rd->rx_offset &= size-1; - ret=ilm; - *len=real_size+sizeof(ipc_ilm_t); - - if(real_size>data_size) - CCCI_MSG_INF(md_id, "ipc", "[Error]wrong real_size(%d)>data_size(%d)", real_size, data_size); - -out: - spin_unlock_irqrestore(&ctl_b->ccci_ipc_rd_lock, flag); - - CCCI_IPC_MSG(md_id, "recv real_size=%08x data_size=%08x\n", real_size, data_size); - - return ret; -} - -static void recv_item(int md_id, unsigned int addr, unsigned int len, IPC_TASK *task, BUFF *buff_rd) -{ - ipc_ctl_block_t *ctl_b = ipc_ctl_block[md_id]; - ipc_ilm_t *ilm=(ipc_ilm_t *)((uint32)ctl_b->ipc_mem+(addr - ctl_b->ccci_ipc_smem_base_phy + get_md2_ap_phy_addr_fixed())); - CCCI_RECV_ITEM *item ; - unsigned long flags; - - if(len!=sizeof(ipc_ilm_t)) - CCCI_MSG_INF(md_id, "ipc", "[Error]Wrong msg len: sizeof(ipc_ilm_t)=%d,len=%d\n", sizeof(ipc_ilm_t), len); - - CCCI_IPC_MSG(md_id, "Recv item Physical_Addr:%x Virtual_Addr:%p Len:%d.\n", addr, ilm, len); - - if (addr > ctl_b->ccci_ipc_smem_base_phy - get_md2_ap_phy_addr_fixed() + offset_of(CCCI_IPC_MEM, ilm_md) + sizeof(ipc_ilm_t)*MAX_NUM_IPC_TASKS_MD) - { - CCCI_MSG_INF(md_id, "ipc", "[Error]Wrong physical address(%x)\n", addr); - return ; - } - - item=kmalloc(sizeof(CCCI_RECV_ITEM),GFP_ATOMIC); - if (item==NULL) - { - CCCI_MSG_INF(md_id, "ipc", "kmalloc for recv_item fail!\n"); - goto out; - } - - if (ilm->local_para_ptr){ - if((uint32)ilm->local_para_ptr<(uint32)ctl_b->ccci_ipc_rd_buffer_phy || - (uint32)ilm->local_para_ptr>=(uint32)ctl_b->ccci_ipc_rd_buffer_phy+CCCI_IPC_BUFFER_SIZE) - CCCI_MSG_INF(md_id, "ipc", "[Error]wrong ilm->local_para_ptr address(%p)", ilm->local_para_ptr); - } - - if (ilm->peer_buff_ptr){ - if((uint32)ilm->peer_buff_ptr<(uint32)ctl_b->ccci_ipc_rd_buffer_phy || - (uint32)ilm->peer_buff_ptr>=(uint32)ctl_b->ccci_ipc_rd_buffer_phy+CCCI_IPC_BUFFER_SIZE) - CCCI_MSG_INF(md_id, "ipc", "[Error]wrong ilm->peer_buff_ptr address(%p)", ilm->peer_buff_ptr); - } - CCCI_IPC_MSG(md_id, "recv ilm->local_para_ptr(%p), ilm->peer_buff_ptr(%p)\n", ilm->local_para_ptr, ilm->peer_buff_ptr); - - INIT_LIST_HEAD(&item->list); - item->data=(uint8 *)read_from_ring_buffer(md_id, ilm, buff_rd, &item->len); - if (item->data==NULL) - { - CCCI_MSG_INF(md_id, "ipc", "read ipc rx data fail\n"); - goto out1; - } - - spin_lock_irqsave(&task->lock,flags); - list_add_tail(&item->list,&task->recv_list); - spin_unlock_irqrestore(&task->lock,flags); - - kill_fasync(&task->fasync, SIGIO, POLL_IN); - wake_up_poll(&task->read_wait_queue,POLLIN); - goto out; - -out1: - kfree(item); -out: - return; -} - - -static int write_to_ring_buffer(int md_id, uint8 *data, int count, IPC_TASK *task, BUFF *ipc_buffer) -{ - int ret=0; - int free; - int write,read,over,copy; - int size; - int write_begin; - unsigned long flags; - ipc_ilm_t *ilm=task->ilm_p; - local_para_struct *local_para = ilm->local_para_ptr?(local_para_struct*)data:NULL; - peer_buff_struct *peer_buff=ilm->peer_buff_ptr? - (peer_buff_struct*)((uint32)data+(local_para?local_para->msg_len:0)):NULL; - ipc_ctl_block_t *ctl_b = ipc_ctl_block[md_id]; - - - CCCI_IPC_MSG(md_id, "local_para_struct addr=%p peer_buff_struct addr=%p\n",local_para,peer_buff); - if ((local_para?local_para->msg_len:0)+(peer_buff?peer_buff->pdu_len:0)!=count) - { - CCCI_MSG_INF(md_id, "ipc", "[Error]Count is not equal(%x != %x ) !\n", - (local_para?local_para->msg_len:0)+(peer_buff?peer_buff->pdu_len:0),count); - return -EINVAL; - } - - if ((local_para?local_para->ref_count!=1:0)||(peer_buff?peer_buff->ref_count!=1:0)) - { - CCCI_MSG_INF(md_id, "ipc", "[Error]ref count !=1 .\n"); - return -EINVAL; - } - - spin_lock_irqsave(&ctl_b->ccci_ipc_wr_lock, flags); - - write_begin=write=ipc_buffer->tx_offset; - read=ipc_buffer->rx_offset; - size=ipc_buffer->size; - copy=0; - - if (read < write) { - free=size-(write-read); - over=size-write; - } else if (read == write) { - free = size - 1; - over = size - write; - } else { - free = read - write -1; - over=0; - } - - if (count>free) { - CCCI_MSG_INF(md_id, "ipc", "[Error]memory isn't enough, data_len(%d)>free_len(%d, %d, %d)\n", - count, free, write, read); - ret=-E2BIG; - goto out; - } - - if (over) { - if (countbuffer+write,data,over); - copy+=over; - write=(write+over)&(size-1); - data+=copy; - } - - if (copybuffer+write, data, count-copy); - } - mb(); - - ipc_buffer->tx_offset += count; - ipc_buffer->tx_offset &= size-1; - ret=count; - ilm->local_para_ptr=local_para?(local_para_struct *)(ctl_b->ccci_ipc_wr_buffer_phy+write_begin):NULL; - ilm->peer_buff_ptr=peer_buff? - (peer_buff_struct *)(ctl_b->ccci_ipc_wr_buffer_phy+((write_begin+(local_para?local_para->msg_len:0))&(size-1))):NULL; - -out: - spin_unlock_irqrestore(&ctl_b->ccci_ipc_wr_lock, flags); - return ret; -} - - -static void ccci_ipc_callback(void *private) -{ - IPC_TASK *task; - IPC_MSGSVC_TASKMAP_T *id_map; - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - ccci_msg_t msg; - ipc_ctl_block_t *ctl_b = (ipc_ctl_block_t *)ch_info->m_owner; - int md_id = ctl_b->m_md_id; - - while(get_logic_ch_data(ch_info, &msg)) { - if (msg.channel==CCCI_IPC_RX_ACK||msg.channel==CCCI_IPC_TX) { - CCCI_MSG_INF(md_id, "ipc", "[Error]invalid ipc rx channel(%d)!\n", msg.channel); - } - - if (msg.channel==CCCI_IPC_RX) { - CCCI_IPC_MSG(md_id, "CCCI_IPC_RX:Unify AP id(%x) \n", msg.reserved); - if ((id_map=unify_AP_id_2_local_id(msg.reserved))==NULL) - { - CCCI_MSG_INF(md_id, "ipc", "[Error]Wrong Unify AP id(%x)@RX\n", msg.reserved); - return; - } - - task=((ipc_ctl_block_t *)(ch_info->m_owner))->ipc_task+id_map->task_id; - recv_item(md_id, msg.addr, msg.len, task, &ctl_b->ipc_mem->buffer.buff_rd); - ccci_ipc_ack(md_id, CCCI_IPC_RX_ACK, IPC_MSGSVC_RVC_DONE, msg.reserved); - } - - if (msg.channel==CCCI_IPC_TX_ACK) { - CCCI_IPC_MSG(md_id, "CCCI_IPC_TX_ACK: Unify MD ID(%x)\n", msg.reserved); - if ((id_map=unify_MD_id_2_local_id(msg.reserved))==NULL) - { - CCCI_MSG_INF(md_id, "ipc", "[Error]Wrong AP Unify id (%d)@Tx ack.\n",msg.reserved); - return; - } - - find_task_to_clear(ctl_b->ipc_task, id_map->task_id); - - if(msg.id!=IPC_MSGSVC_RVC_DONE) - CCCI_MSG_INF(md_id, "ipc", "[Error]Not write mailbox id: %d\n", msg.id); - } - } -} - - -static void ipc_task_init(int md_id, IPC_TASK *task,ipc_ilm_t *ilm) -{ - ipc_ctl_block_t *ctl_b = ipc_ctl_block[md_id]; - - spin_lock_init(&task->lock); - task->flag = 0; - task->user = (atomic_t)ATOMIC_INIT(0); - task->jiffies = -1UL; - task->fasync = NULL; - task->ilm_p = ilm; - task->time_out = -1; - task->ilm_phy_addr = ctl_b->ccci_ipc_smem_base_phy - get_md2_ap_phy_addr_fixed() - + offset_of(CCCI_IPC_MEM, ilm) +(uint32)ilm-(uint32)(ctl_b->ipc_mem->ilm); - task->to_id = -1; - - init_waitqueue_head(&task->read_wait_queue); - init_waitqueue_head(&task->write_wait_queue); - INIT_LIST_HEAD(&task->recv_list); - task->owner = ipc_ctl_block[md_id]; -} - -static int ccci_ipc_open(struct inode *inode, struct file *file) -{ - int md_id; - int major; - int index; - ipc_ctl_block_t *ctl_b; - - major = imajor(inode); - md_id = get_md_id_by_dev_major(major); - if(md_id < 0) { - CCCI_MSG("IPC open fail: invalid major id:%d\n", major); - return -1; - } - - ctl_b = ipc_ctl_block[md_id]; - index = iminor(inode) - ctl_b->start_minor; - if (index >= MAX_NUM_IPC_TASKS) - { - CCCI_MSG_INF(md_id, "ipc", "[Error]Wrong minor num %d.\n",index); - return -EINVAL; - } - CCCI_DBG_MSG(md_id, "ipc", "%s: register task%d\n", __FUNCTION__, index); - nonseekable_open(inode,file); - file->private_data = ctl_b->ipc_task+index; - atomic_inc(&((ctl_b->ipc_task+index)->user)); - return 0; - -} - -static ssize_t ccci_ipc_read(struct file *file, char *buf, size_t count, loff_t *ppos) -{ - int ret = 0; - IPC_TASK *task = file->private_data; - CCCI_RECV_ITEM *recv_data; - ipc_ctl_block_t *ctl_b; - unsigned long flags; - - ctl_b = (ipc_ctl_block_t *)task->owner; - -retry: - spin_lock_irqsave(&task->lock, flags); - if (ctl_b->md_is_ready == 0) - { - ret=-EIO; - goto out_unlock; - } - if (list_empty(&task->recv_list)) - { - if (file->f_flags & O_NONBLOCK) - { - ret = -EAGAIN; - goto out_unlock; - } - spin_unlock_irqrestore(&task->lock, flags); - interruptible_sleep_on(&task->read_wait_queue); - if (signal_pending(current)) - { - CCCI_IPC_MSG(ctl_b->m_md_id, "Interrupt read sys_call : task:%s pid:%d tgid:%d SIGPEND:%#llx. GROUP_SIGPEND:%#llx .\n", - current->comm,current->pid,current->tgid, - *(unsigned long long *)current->pending.signal.sig, - *(unsigned long long *)current->signal->shared_pending.signal.sig); - ret = -EINTR; - goto out; - } - goto retry; - } - recv_data=container_of(task->recv_list.next,CCCI_RECV_ITEM,list); - - if (recv_data->len > count) - { - CCCI_MSG_INF(ctl_b->m_md_id, "ipc", "[Error]Recv buff is too small(count=%d data_len=%d)!\n", \ - count,recv_data->len); - ret = -E2BIG; - goto out_unlock; - } - list_del_init(&recv_data->list); - spin_unlock_irqrestore(&task->lock, flags); - - if (copy_to_user(buf, recv_data->data, recv_data->len)) - { - ret = -EFAULT; - release_recv_item(recv_data); - goto out; - } - ret = recv_data->len; - release_recv_item(recv_data); - goto out; - -out_unlock: - spin_unlock_irqrestore(&task->lock, flags); - -out: - return ret; -} - -static ssize_t ccci_ipc_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) -{ - int ret = 0; - IPC_TASK *task = file->private_data; - ipc_ctl_block_t *ctl_b; - IPC_MSGSVC_TASKMAP_T *id_map; - ipc_ilm_t *ilm = NULL; - int md_id; - - ctl_b = (ipc_ctl_block_t *)task->owner; - md_id = ctl_b->m_md_id; - - if (count < sizeof(ipc_ilm_t)) - { - CCCI_MSG_INF(md_id, "ipc", "%s: [Error]Write len(%d) < ipc_ilm_t\n", __FUNCTION__, count); - ret = -EINVAL; - goto out; - } - - ilm = kmalloc(count, GFP_KERNEL); - if (ilm == NULL) - { - CCCI_MSG_INF(md_id, "ipc", "%s: kmalloc fail!\n", __FUNCTION__); - ret = -ENOMEM; - goto out; - } - if (copy_from_user(ilm, buf, count)) - { - CCCI_MSG_INF(md_id, "ipc", "%s: copy_from_user fail!\n", __FUNCTION__); - ret = -EFAULT; - goto out_free; - } - if ((id_map = local_MD_id_2_unify_id(ilm->dest_mod_id)) == NULL) - { - CCCI_MSG_INF(md_id, "ipc", "%s: [Error]Invalid Dest MD id (%d)\n", __FUNCTION__, ilm->dest_mod_id); - ret = -EINVAL; - goto out_free; - } - - if (test_and_set_bit(CCCI_TASK_PENDING, &task->flag)) - { - CCCI_IPC_MSG(md_id, "write is busy. Task ID=%d.\n", task-ctl_b->ipc_task); - if (file->f_flags & O_NONBLOCK) - { - ret = -EBUSY; - goto out_free; - } else if (wait_event_interruptible_exclusive(task->write_wait_queue, - !test_and_set_bit(CCCI_TASK_PENDING,&task->flag)||ctl_b->md_is_ready==0) == -ERESTARTSYS) - { - ret = -EINTR; - goto out_free; - } - } - - spin_lock_irq(&task->lock); - if (ctl_b->md_is_ready == 0) - { - ret = -EIO; - spin_unlock_irq(&task->lock); - goto out_free; - } - spin_unlock_irq(&task->lock); - task->jiffies = jiffies; - *task->ilm_p = *ilm; - task->to_id = ilm->dest_mod_id; - task->ilm_p->src_mod_id = task - ctl_b->ipc_task; - - CCCI_DBG_MSG(md_id, "ipc", "%s: src=%d, dst=%d, data_len=%d\n", __FUNCTION__, - task->ilm_p->src_mod_id, task->to_id, count); - - if (count > sizeof(ipc_ilm_t)) - { - if (write_to_ring_buffer(md_id, (uint8*)(ilm+1), count-sizeof(ipc_ilm_t), - task, &ctl_b->ipc_mem->buffer.buff_wr) != count-sizeof(ipc_ilm_t)) - { - CCCI_MSG_INF(md_id, "ipc", "[Error]write_to_ring_buffer fail!\n"); - clear_bit(CCCI_TASK_PENDING, &task->flag); - ret = -EAGAIN; - goto out_free; - } - } - - ret = ccci_ipc_write_stream(md_id, CCCI_IPC_TX, task->ilm_phy_addr, sizeof(ipc_ilm_t), id_map->extq_id); - if (ret != sizeof(ccci_msg_t)) - { - CCCI_MSG_INF(md_id, "ipc", "%s: ccci_ipc_write_stream fail: %d\n", __FUNCTION__, ret); - clear_bit(CCCI_TASK_PENDING, &task->flag); - ret = -EAGAIN; - goto out_free; - } - -out_free: - kfree(ilm); - -out: - return ret==sizeof(ccci_msg_t)?count:ret; -} - -static long ccci_ipc_ioctl( struct file *file, unsigned int cmd, unsigned long arg) -{ - IPC_TASK *task = file->private_data; - CCCI_RECV_ITEM *item, *n; - unsigned long flags; - long ret = 0; - ipc_ctl_block_t *ctl_b; - - ctl_b = (ipc_ctl_block_t *)task->owner; - - switch(cmd) - { - case CCCI_IPC_RESET_RECV: - spin_lock_irqsave(&task->lock, flags); - list_for_each_entry_safe(item,n,&task->recv_list,list) - { - release_recv_item(item); - } - spin_unlock_irqrestore(&task->lock, flags); - ret=0; - break; - - case CCCI_IPC_RESET_SEND: - clear_bit(CCCI_TASK_PENDING,&task->flag); - wake_up(&task->write_wait_queue); - break; - - case CCCI_IPC_WAIT_MD_READY: - if (ctl_b->md_is_ready == 0) - { - interruptible_sleep_on(&ctl_b->poll_md_queue_head); - if (signal_pending(current)) { - CCCI_MSG_INF(ctl_b->m_md_id, "ipc", "Got signal @ WAIT_MD_READY\n"); - ret = -EINTR; - } - } - break; - - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static int ccci_ipc_release(struct inode *inode, struct file *file) -{ - CCCI_RECV_ITEM *item,*n; - IPC_TASK *task = file->private_data; - unsigned long flags; - - if (atomic_dec_and_test(&task->user)) - { - spin_lock_irqsave(&task->lock, flags); - list_for_each_entry_safe(item, n, &task->recv_list, list) - { - release_recv_item(item); - } - spin_unlock_irqrestore(&task->lock, flags); - } - clear_bit(CCCI_TASK_PENDING, &task->flag); - CCCI_DBG_MSG(0, "ipc", "%s\n", __FUNCTION__); - - return 0; -} - -static int ccci_ipc_fasync(int fd, struct file *file, int on) -{ - IPC_TASK *task = file->private_data; - return fasync_helper(fd, file, on, &task->fasync); -} - -static uint32 ccci_ipc_poll(struct file *file, poll_table *wait) -{ - IPC_TASK *task = file->private_data; - int ret = 0; - ipc_ctl_block_t *ctl_b; - - ctl_b = (ipc_ctl_block_t *)task->owner; - poll_wait(file,&task->read_wait_queue, wait); - poll_wait(file,&task->write_wait_queue, wait); - spin_lock_irq(&task->lock); - - if (ctl_b->md_is_ready==0) { - //ret |= POLLERR; - goto out; - } - - if (!list_empty(&task->recv_list)) - ret |= POLLIN|POLLRDNORM; - - if (!test_bit(CCCI_TASK_PENDING,&task->flag)) - ret |= POLLOUT|POLLWRNORM; - -out: - spin_unlock_irq(&task->lock); - return ret; -} - -static struct file_operations ccci_ipc_fops= -{ - .owner = THIS_MODULE, - .open = ccci_ipc_open, - .read = ccci_ipc_read, - .write = ccci_ipc_write, - .release = ccci_ipc_release, - .unlocked_ioctl = ccci_ipc_ioctl, - .fasync = ccci_ipc_fasync, - .poll = ccci_ipc_poll, -}; - -int __init ccci_ipc_init(int md_id) -{ - int ret = 0; - int i = 0; - int major, minor; - char buf[16]; - ipc_ctl_block_t *ctl_b; - - ret = get_dev_id_by_md_id(md_id, "ipc", &major, &minor); - if(ret < 0) { - CCCI_MSG("ccci_ipc_init: get md device number failed(%d)\n", ret); - return ret; - } - // Allocate ipc ctrl struct memory - ctl_b = (ipc_ctl_block_t *)kmalloc(sizeof(ipc_ctl_block_t), GFP_KERNEL); - if(ctl_b == NULL) - return -CCCI_ERR_GET_MEM_FAIL; - memset(ctl_b, 0, sizeof(ipc_ctl_block_t)); - - ipc_ctl_block[md_id] = ctl_b; - spin_lock_init(&ctl_b->ccci_ipc_wr_lock); - spin_lock_init(&ctl_b->ccci_ipc_rd_lock); - init_waitqueue_head(&ctl_b->poll_md_queue_head); - ctl_b->md_status_update_call_back.call = ipc_call_back_func; - ctl_b->md_status_update_call_back.next = NULL, - ctl_b->m_md_id = md_id; - ctl_b->major = major; - ctl_b->start_minor = minor; - ccci_ipc_base_req(md_id, (int*)(&ctl_b->ipc_mem),&ctl_b->ccci_ipc_smem_base_phy,&ctl_b->ccci_ipc_smem_size); - - ctl_b->ccci_ipc_wr_buffer_phy = ctl_b->ccci_ipc_smem_base_phy - get_md2_ap_phy_addr_fixed() \ - +offset_of(CCCI_IPC_MEM,buffer.buff_wr.buffer); - ctl_b->ccci_ipc_rd_buffer_phy = ctl_b->ccci_ipc_smem_base_phy - get_md2_ap_phy_addr_fixed() \ - +offset_of(CCCI_IPC_MEM,buffer.buff_rd.buffer); - //CCCI_MSG_INF(md_id, "ipc", "ccci_ipc_wr_buffer_phy: %#x, ccci_ipc_buffer_phy_rd: %#x.\n", - // ctl_b->ccci_ipc_wr_buffer_phy, ctl_b->ccci_ipc_rd_buffer_phy); - - ipc_smem_init(ctl_b->ipc_mem); - - for (i=0;iipc_task+i,ctl_b->ipc_mem->ilm+i); - } - - snprintf(buf, 16, "CCCI_IPC_DEV%d", md_id); - if (register_chrdev_region(MKDEV(major,minor),MAX_NUM_IPC_TASKS,buf) != 0) - { - CCCI_MSG_INF(md_id, "ipc", "Regsiter CCCI_IPC_DEV failed!\n"); - ret = -1; - goto _IPC_MAPPING_FAIL; - } - - cdev_init(&ctl_b->ccci_ipc_cdev,&ccci_ipc_fops); - ctl_b->ccci_ipc_cdev.owner = THIS_MODULE; - if ((ret = cdev_add(&ctl_b->ccci_ipc_cdev, MKDEV(major, minor), MAX_NUM_IPC_TASKS))< 0) - { - CCCI_MSG_INF(md_id, "ipc", "cdev_add failed!\n"); - goto _CHR_DEV_ADD_FAIL; - } - - if (register_to_logic_ch(md_id, CCCI_IPC_RX, ccci_ipc_callback, ctl_b)|| - register_to_logic_ch(md_id, CCCI_IPC_TX_ACK, ccci_ipc_callback, ctl_b)) - { - CCCI_MSG_INF(md_id, "ipc", "ccci_ipc_register failed!\n"); - ret = -1; - goto _REG_LOGIC_CH_FAIL; - } - - md_register_call_chain(md_id, &ctl_b->md_status_update_call_back); - goto out; - -_REG_LOGIC_CH_FAIL: - un_register_to_logic_ch(md_id, CCCI_IPC_RX); - un_register_to_logic_ch(md_id, CCCI_IPC_TX_ACK); - -_CHR_DEV_ADD_FAIL: - cdev_del(&ctl_b->ccci_ipc_cdev); - -_IPC_MAPPING_FAIL: - kfree(ctl_b); - ipc_ctl_block[md_id] = NULL; - -out: - return ret; -} - -void __exit ccci_ipc_exit(int md_id) -{ - int i; - ipc_ctl_block_t *ctl_b = ipc_ctl_block[md_id]; - - if(ctl_b == NULL) - return; - - for (i = 0;i < MAX_NUM_IPC_TASKS; i++) - { - if (atomic_read(&ctl_b->ipc_task[i].user)) - { - CCCI_MSG_INF(md_id, "ipc", "BUG for taskID %d module exit count.\n",i); - } - } - - cdev_del(&ctl_b->ccci_ipc_cdev); - unregister_chrdev_region(MKDEV(ctl_b->major,ctl_b->start_minor),MAX_NUM_IPC_TASKS); - md_unregister_call_chain(md_id, &ctl_b->md_status_update_call_back); - un_register_to_logic_ch(md_id, CCCI_IPC_RX); - un_register_to_logic_ch(md_id, CCCI_IPC_TX_ACK); - - kfree(ctl_b); - ipc_ctl_block[md_id] = NULL; -} - diff --git a/drivers/misc/mediatek/dual_ccci/ccci_logical.c b/drivers/misc/mediatek/dual_ccci/ccci_logical.c deleted file mode 100644 index 6e5bcd921c2..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_logical.c +++ /dev/null @@ -1,847 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define FIRST_PENDING (1<<0) -#define PENDING_50MS (1<<1) -//#define PENDING_100MS (1<<2) -#define PENDING_1500MS (1<<2) - - -const logic_channel_static_info_t logic_ch_static_info_tab[] = -{ - {CCCI_CONTROL_RX, 8, "ctl_rx", L_CH_MUST_RDY_FOR_BOOT}, - {CCCI_CONTROL_TX, 0, "ctl_tx", L_CH_ATTR_TX|L_CH_ATTR_PRVLG1|L_CH_ATTR_PRVLG0|L_CH_ATTR_PRVLG2}, - {CCCI_SYSTEM_RX, 16, "sys_rx", 0}, - {CCCI_SYSTEM_TX, 0, "sys_tx", L_CH_ATTR_TX}, - {CCCI_PCM_RX, 128, "audio_rx", 0}, - {CCCI_PCM_TX, 0, "audio_tx", L_CH_ATTR_TX}, - {CCCI_UART1_RX, 8, "meta_rx", L_CH_DROP_TOLERATED}, - {CCCI_UART1_RX_ACK, 0, "meta_rx_ack", L_CH_ATTR_TX|L_CH_ATTR_DUMMY_WRITE}, - {CCCI_UART1_TX, 0, "meta_tx", L_CH_ATTR_TX|L_CH_ATTR_DUMMY_WRITE}, - {CCCI_UART1_TX_ACK, 8, "meta_tx_ack", L_CH_DROP_TOLERATED}, - {CCCI_UART2_RX, 8, "muxd_rx", L_CH_DROP_TOLERATED}, - {CCCI_UART2_RX_ACK, 0, "muxd_rx_ack", L_CH_ATTR_TX}, - {CCCI_UART2_TX, 0, "muxd_tx", L_CH_ATTR_TX}, - {CCCI_UART2_TX_ACK, 8, "muxd_tx_ack", L_CH_DROP_TOLERATED}, - {CCCI_FS_RX, 16, "md_nvram_rx", 0}, - {CCCI_FS_TX, 0, "md_nvram_tx", L_CH_ATTR_TX|L_CH_ATTR_PRVLG1|L_CH_ATTR_OPEN_CLEAR|L_CH_ATTR_PRVLG0|L_CH_ATTR_PRVLG2}, - {CCCI_PMIC_RX, 0, "pmic_rx", 0}, - {CCCI_PMIC_TX, 0, "pmic_tx", L_CH_ATTR_TX}, - {CCCI_UEM_RX, 8, "uem_rx", 0}, - {CCCI_UEM_TX, 0, "uem_tx", L_CH_ATTR_TX}, - {CCCI_CCMNI1_RX, 8, "ccmni1_rx", L_CH_DROP_TOLERATED}, - {CCCI_CCMNI1_RX_ACK, 0, "ccmni1_rx_ack", L_CH_ATTR_TX}, - {CCCI_CCMNI1_TX, 0, "ccmni1_tx", L_CH_ATTR_TX}, - {CCCI_CCMNI1_TX_ACK, 8, "ccmni1_tx_ack", L_CH_DROP_TOLERATED}, - {CCCI_CCMNI2_RX, 8, "ccmni2_rx", L_CH_DROP_TOLERATED}, - {CCCI_CCMNI2_RX_ACK, 0, "ccmni2_rx_ack", L_CH_ATTR_TX}, - {CCCI_CCMNI2_TX, 0, "ccmni2_tx", L_CH_ATTR_TX}, - {CCCI_CCMNI2_TX_ACK, 8, "ccmni2_tx_ack", L_CH_DROP_TOLERATED}, - {CCCI_CCMNI3_RX, 8, "ccmni3_rx", L_CH_DROP_TOLERATED}, - {CCCI_CCMNI3_RX_ACK, 0, "ccmni3_rx_ack", L_CH_ATTR_TX}, - {CCCI_CCMNI3_TX, 0, "ccmni3_tx", L_CH_ATTR_TX}, - {CCCI_CCMNI3_TX_ACK, 8, "ccmni3_tx_ack", L_CH_DROP_TOLERATED}, - {CCCI_RPC_RX, 8, "rpc_rx", 0}, - {CCCI_RPC_TX, 0, "rpc_tx", L_CH_ATTR_TX|L_CH_ATTR_PRVLG1}, - {CCCI_IPC_RX, 8, "ipc_rx", 0}, - {CCCI_IPC_RX_ACK, 0, "ipc_rx_ack", L_CH_ATTR_TX}, - {CCCI_IPC_TX, 0, "ipc_tx", L_CH_ATTR_TX}, - {CCCI_IPC_TX_ACK, 8, "ipc_tx_ack", 0}, - {CCCI_IPC_UART_RX, 8, "ipc_uart_rx", L_CH_DROP_TOLERATED}, - {CCCI_IPC_UART_RX_ACK, 0, "ipc_uart_rx_ack", L_CH_ATTR_TX}, - {CCCI_IPC_UART_TX, 0, "ipc_uart_tx", L_CH_ATTR_TX}, - {CCCI_IPC_UART_TX_ACK, 8, "ipc_uart_tx_ack", L_CH_DROP_TOLERATED}, - {CCCI_MD_LOG_RX, 256, "md_log_rx", 0}, - {CCCI_MD_LOG_TX, 0, "md_log_tx", L_CH_ATTR_TX|L_CH_ATTR_PRVLG1|L_CH_ATTR_PRVLG2}, -#ifdef CONFIG_MTK_ICUSB_SUPPORT - {CCCI_ICUSB_RX, 8, "icusb_rx", L_CH_DROP_TOLERATED}, - {CCCI_ICUSB_RX_ACK, 0, "icusb_rx_ack", L_CH_ATTR_TX}, - {CCCI_ICUSB_TX, 0, "icusb_tx", L_CH_ATTR_TX}, - {CCCI_ICUSB_TX_ACK, 8, "icusb_tx_ack", L_CH_DROP_TOLERATED}, -#endif -}; - -#define MAX_LOGIC_CH_ID (sizeof(logic_ch_static_info_tab)/sizeof(logic_channel_static_info_t)) - - -static logic_dispatch_ctl_block_t *logic_dispatch_ctlb[MAX_MD_NUM]; -static unsigned char md_enabled[MAX_MD_NUM]; // Boot up time will determine this -static unsigned char active_md[MAX_MD_NUM]; -static unsigned int max_md_sys = 0; - -//extern int get_ccif_hw_info(int md_id, ccif_hw_info_t *ccif_hw_info); - - - -/****************************************************************************/ -/* update&get md sys info */ -/* */ -/****************************************************************************/ -void set_md_sys_max_num(unsigned int max_num) -{ - max_md_sys = max_num; -} - -void set_md_enable(int md_id, int en) -{ - md_enabled[md_id] = en; -} - -void update_active_md_sys_state(int md_id, int active) -{ - if(md_enabled[md_id]) { - active_md[md_id] = active; - if(active){ - //CCCI_DBG_MSG(md_id, "cci", "enable modem intr\n"); - ccci_enable_md_intr(md_id); - } - } else { - CCCI_MSG("md_sys%d is not enable\n", md_id); - } -} - - -int get_md_wakeup_src(int md_id, char *buf, unsigned int len) -{ - unsigned int i, rx, ch; - ccif_msg_t data; - unsigned int rx_ch[CCIF_STD_V1_MAX_CH_NUM][2] = {{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}}; - char str[64]; - char log_buf[256] = ""; - int ret = 0; - char *channel_name; - ccif_t *ccif; - int curr_str_len = 0; - - logic_dispatch_ctl_block_t *ctlb; - - ctlb = logic_dispatch_ctlb[md_id]; - ccif = ctlb->m_ccif; - - rx = ccif->ccif_get_rx_ch(ccif); - if(rx == 0) - return ret; - - for (i = 0; i < CCIF_STD_V1_MAX_CH_NUM; i++) { - if (rx&(1<ccif_read_phy_ch_data(ccif, i, (unsigned int *)&data); - for (ch = 0; ch < i; ch++) - if (data.channel == rx_ch[ch][0]) - break; - - rx_ch[ch][0] = data.channel; - rx_ch[ch][1]++; - } - } - - for (i = 0; i < CCIF_STD_V1_MAX_CH_NUM ; i ++) { - if (rx_ch[i][1]) { - if ((rx_ch[i][0] >= 0) && (rx_ch[i][0] < MAX_LOGIC_CH_ID)){ - channel_name = logic_ch_static_info_tab[rx_ch[i][0]].m_ch_name; - sprintf(str,"%s(%d,%d) ", channel_name, rx_ch[i][0], rx_ch[i][1]); - } - else - sprintf(str,"%s(%d,%d) ", "unknown", rx_ch[i][0], rx_ch[i][1]); - - curr_str_len += strlen(str); - if( curr_str_len < 255) { - strcat(log_buf, str); - } - } - } - if(curr_str_len > 255) { - CCCI_MSG("[ccci/ctl] wakeup source buffer not enough(req:%d>255) for MD%d\n", curr_str_len, md_id+1); - } - - CCCI_MSG("[ccci/ctl] (%d)CCIF_MD%d wakeup source: %s\n", md_id+1, md_id+1, log_buf); - - return ret; -} - - -/****************************************************************************/ -/* logical channel handle function */ -/* */ -/****************************************************************************/ -int register_to_logic_ch(int md_id, int ch, void (*func)(void*), void *owner) -{ - logic_channel_info_t *ch_info; - int ret = 0; - unsigned long flags; - logic_dispatch_ctl_block_t *ctl_b; - - ctl_b = logic_dispatch_ctlb[md_id]; - ch_info = &(ctl_b->m_logic_ch_table[ch]); - - if ((ch_info->m_attrs&L_CH_ATTR_TX) && (func != NULL)) { - return 0; - } - - spin_lock_irqsave(&ch_info->m_lock, flags); - // Check whether call back function has been registered - if (!ch_info->m_register) { - ch_info->m_register = 1; - ch_info->m_call_back = func; - ch_info->m_owner = owner; - } else { - CCCI_MSG_INF(md_id, "cci", "%s fail: %s(ch%d) cb func has registered\n", \ - __FUNCTION__, ch_info->m_ch_name, ch_info->m_ch_id); - ret = -CCCI_ERR_LOGIC_CH_HAS_REGISTERED; - } - spin_unlock_irqrestore(&ch_info->m_lock, flags); - - return ret; -} - -int un_register_to_logic_ch(int md_id, int ch) -{ - logic_channel_info_t *ch_info; - unsigned long flags; - logic_dispatch_ctl_block_t *ctl_b; - - if (unlikely(ch >= CCCI_MAX_CH_NUM)){ - CCCI_MSG_INF(md_id, "cci", "%s fail: invalid logic ch%d\n", __FUNCTION__, ch); - return -CCCI_ERR_INVALID_LOGIC_CHANNEL_ID; - } - - ctl_b = logic_dispatch_ctlb[md_id]; - ch_info=&(ctl_b->m_logic_ch_table[ch]); - - spin_lock_irqsave(&ch_info->m_lock, flags); - if(ch_info->m_register == 0) - CCCI_MSG_INF(md_id, "cci", "ch%d not registered yet\n", ch); - ch_info->m_call_back = NULL; - ch_info->m_owner = NULL; - ch_info->m_register = 0; - spin_unlock_irqrestore(&ch_info->m_lock, flags); - - return 0; -} - -int get_logic_ch_data(logic_channel_info_t *ch_info, ccci_msg_t *msg) -{ - if (unlikely(ch_info == NULL)){ - CCCI_MSG("%s fail: get invalid ch info\n", __FUNCTION__); - return -CCCI_ERR_GET_NULL_POINTER; - } - - if (unlikely(ch_info->m_attrs&L_CH_ATTR_TX)){ - CCCI_MSG_INF(ch_info->m_md_id, "cci", "%s fail: %s(ch%d) is tx \n", \ - __FUNCTION__, ch_info->m_ch_name, msg->channel); - return -CCCI_ERR_GET_RX_DATA_FROM_TX_CHANNEL; - } - - // check whether fifo is ready - if (unlikely(!ch_info->m_kfifo_ready)){ - CCCI_MSG_INF(ch_info->m_md_id, "cci", "%s fail: %s(ch%d) kfifo not ready\n", \ - __FUNCTION__, ch_info->m_ch_name, msg->channel); - return -CCCI_ERR_KFIFO_IS_NOT_READY; - } - - // Check fifo if has data - if (kfifo_is_empty(&ch_info->m_kfifo)) - { - return 0; - } - - // Pop data - return kfifo_out(&ch_info->m_kfifo, msg, sizeof(ccif_msg_t)); -} - - -int get_logic_ch_data_len(logic_channel_info_t *ch_info) -{ - if (unlikely(ch_info == NULL)){ - CCCI_MSG("%s get invalid ch info\n", __FUNCTION__); - return 0; - } - - if (unlikely(ch_info->m_attrs&L_CH_ATTR_TX)){ - CCCI_MSG_INF(ch_info->m_md_id, "cci", "%s fail: %s(ch%d) is tx \n", \ - __FUNCTION__, ch_info->m_ch_name, ch_info->m_ch_id); - return 0; - } - - // check whether fifo is ready - if (unlikely(!ch_info->m_kfifo_ready)){ - CCCI_MSG_INF(ch_info->m_md_id, "cci", "%s fail: %s(ch%d) kfifo not ready\n", \ - __FUNCTION__, ch_info->m_ch_name, ch_info->m_ch_id); - return 0; - } - - // Check fifo data length - return kfifo_len(&ch_info->m_kfifo); -} - - -logic_channel_info_t* get_logic_ch_info(int md_id, int ch_id) -{ - logic_channel_info_t *ch_info; - logic_dispatch_ctl_block_t *ctl_block; - - if (unlikely(ch_id >= CCCI_MAX_CH_NUM)){ - CCCI_MSG_INF(md_id, "cci", "%s fail: invalid logic ch%d\n", __FUNCTION__, ch_id); - return NULL; - } - - ctl_block = logic_dispatch_ctlb[md_id]; - ch_info = &(ctl_block->m_logic_ch_table[ch_id]); - return ch_info; -} - - -static int __logic_dispatch_push(ccif_msg_t *msg, void *ctl_b) -{ - logic_channel_info_t *ch_info; - int ret = 0; - logic_dispatch_ctl_block_t *ctl_block = (logic_dispatch_ctl_block_t*)ctl_b; - int md_id = ctl_block->m_md_id; - int drop = 1; - - if (unlikely(msg->channel >= CCCI_MAX_CH_NUM)){ - CCCI_MSG_INF(md_id, "cci", "%s get invalid logic ch id:%d\n", \ - __FUNCTION__, msg->channel); - ret = -CCCI_ERR_INVALID_LOGIC_CHANNEL_ID; - goto _out; - } - - ch_info = &(ctl_block->m_logic_ch_table[msg->channel]); - if (unlikely(ch_info->m_attrs&L_CH_ATTR_TX)){ - CCCI_MSG_INF(md_id, "cci", "%s CH:%d %s is tx channel\n", __FUNCTION__, \ - msg->channel, ch_info->m_ch_name); - ret = -CCCI_ERR_PUSH_RX_DATA_TO_TX_CHANNEL; - goto _out; - } - - // check whether fifo is ready - if (!ch_info->m_kfifo_ready){ - CCCI_MSG_INF(md_id, "cci", "%s CH:%d %s's kfifo is not ready\n", \ - __FUNCTION__, msg->channel, ch_info->m_ch_name); - ret = -CCCI_ERR_KFIFO_IS_NOT_READY; - goto _out; - } - - // Check fifo free space - if (kfifo_is_full(&ch_info->m_kfifo)) - { - if (ch_info->m_attrs&L_CH_DROP_TOLERATED){ - CCCI_CTL_MSG(md_id, "Drop (%08X %08X %02d %08X) is tolerated\n", \ - msg->data[0], msg->data[1], msg->channel, msg->reserved); - ret = sizeof(ccif_msg_t); - } else { - // message should NOT be droped - CCCI_DBG_MSG(md_id, "cci", "kfifo full: ch:%s size:%d (%08X %08X %02d %08X)\n", - ch_info->m_ch_name, kfifo_size(&ch_info->m_kfifo),msg->data[0], - msg->data[1], msg->channel, msg->reserved); - // disalbe CCIF interrupt here???? - ret = 0; // Fix this!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - } - goto _out; - } - - // Push data - ret = kfifo_in(&ch_info->m_kfifo,msg,sizeof(ccif_msg_t)); - WARN_ON(ret!=sizeof(ccif_msg_t)); - ctl_block->m_has_pending_data = 1; - drop = 0; -_out: - add_logic_layer_record(md_id, (ccci_msg_t*)msg, drop); - return ret; -} - - -static void __logic_layer_tasklet(unsigned long data) -{ - logic_dispatch_ctl_block_t *logic_ctlb = (logic_dispatch_ctl_block_t*)data; - logic_channel_info_t *ch_info; - int i=0; - - logic_ctlb->m_running = 1; - while(logic_ctlb->m_has_pending_data) - { - logic_ctlb->m_has_pending_data = 0; - for (i=0;im_logic_ch_table[i]; - if (!ch_info->m_kfifo_ready) - continue; - - if (!kfifo_is_empty(&ch_info->m_kfifo)) { - spin_lock(&ch_info->m_lock); // Note here, register call back should using spinlock_irqsave - // Has data to process - if (ch_info->m_call_back != NULL){ - // 1.Check if this channel is active, has call back means this channel is active - ch_info->m_call_back(ch_info); - } else if (ch_info->m_attrs&L_CH_MUST_RDY_FOR_BOOT) { - // 2.Important channel not ready, show waring message - CCCI_DBG_MSG(ch_info->m_md_id, "cci", "Has pending msg for ch:%d\n", ch_info->m_ch_id); - } - spin_unlock(&ch_info->m_lock); - } - } - } - logic_ctlb->m_running = 0; - //wake_lock_timeout(&logic_ctlb->m_wakeup_wake_lock, 3*HZ/2); //1.5s -} - -static void __let_logic_dispatch_tasklet_run(void* ctl_b) -{ - logic_dispatch_ctl_block_t *ctl_block = (logic_dispatch_ctl_block_t *)ctl_b; - tasklet_schedule(&ctl_block->m_dispatch_tasklet); -} - - -void freeze_logic_layer_tx(int md_id) -{ - logic_dispatch_ctl_block_t *ctl_b; - - ctl_b = logic_dispatch_ctlb[md_id]; - ctl_b->m_freezed = 1; -} - -void freeze_all_logic_layer(int md_id) -{ - logic_dispatch_ctl_block_t *ctl_b; - ccif_t *ccif; - - ctl_b = logic_dispatch_ctlb[md_id]; - ccif = ctl_b->m_ccif; - - ccif->ccif_dis_intr(ccif); - ctl_b->m_freezed = 1; -} - -int logic_layer_reset(int md_id) -{ - logic_dispatch_ctl_block_t *ctl_b; - ccif_t *ccif; - unsigned int ref_jiffies = jiffies; - int i; - - ctl_b = logic_dispatch_ctlb[md_id]; - ccif = ctl_b->m_ccif; - - // Check whether there is on-going isr/tasklet - while ((CCIF_TOP_HALF_RUNNING&ccif->m_status)||ctl_b->m_running||ctl_b->m_has_pending_data){ - yield(); - if ((jiffies-ref_jiffies)>2*HZ){ - CCCI_MSG_INF(ctl_b->m_md_id, "cci", "%s wait isr/tasklet more than 2 seconds\n", __FUNCTION__); - break; - } - } - // isr/tasklet done, then reset ccif and logic channel - ccif->ccif_reset(ccif); - for(i=0; im_logic_ch_table[i].m_kfifo_ready) - kfifo_reset(&(ctl_b->m_logic_ch_table[i].m_kfifo)); - } - ctl_b->m_has_pending_data = 0; - ctl_b->m_freezed = 0; - ctl_b->m_running = 0; - //ctl_b->m_privilege = MD_BOOT_STAGE_0; - ctl_b->m_status_flag = 0; - return 0; -} - - -/****************************************************************************/ -/* logical channel handle function */ -/* */ -/****************************************************************************/ -int bind_to_low_layer_notify(int md_id, void (*isr_func)(int), void (*send_func)(int, unsigned int)) -{ - logic_dispatch_ctl_block_t *ctl_b; - ccif_t *ccif; - int ret = 0; - - ctl_b = logic_dispatch_ctlb[md_id]; - - // Check whether call back function has been registered - if (NULL != ctl_b->m_send_notify_cb){ - ret = -CCCI_ERR_MD_CB_HAS_REGISTER; - return ret; - } else { - ctl_b->m_send_notify_cb = send_func; - } - - if(isr_func) { - ccif = ctl_b->m_ccif; - ret = ccif->register_isr_notify_func(ccif, isr_func); - } - return ret; -} - - -// Support function for ccci char/tty/ccmni/fs/rpc/ipc/... -int ccci_message_send(int md_id, ccci_msg_t *msg, int retry_en) -{ - logic_dispatch_ctl_block_t *ctl_b; - ccif_t *ccif; - int ret = 0; - int args = 0; - int drop = 0; - unsigned long flags; - int need_notify = 0; - int md_stage = 0; - - ctl_b = logic_dispatch_ctlb[md_id]; - ccif = ctl_b->m_ccif; - - if(unlikely(ctl_b->m_freezed)){ - CCCI_MSG_INF(md_id, "cci", "%s fail: ccci is freezed\n", __FUNCTION__); - ret = -CCCI_ERR_MD_NOT_READY; - goto out; - } - - if (unlikely(msg->channel >= CCCI_MAX_CH_NUM)){ - if (msg->channel == CCCI_FORCE_ASSERT_CH){ - ret = ccif->ccif_write_phy_ch_data(ccif, (unsigned int*)msg, retry_en); - goto out; - } else { - CCCI_MSG_INF(md_id, "cci", "%s fail: invalid logic ch(%d)\n", \ - __FUNCTION__, msg->channel); - ret = -CCCI_ERR_INVALID_LOGIC_CHANNEL_ID; - goto out; - } - } - - md_stage = get_curr_md_state(md_id); - if (unlikely(md_stage == MD_BOOT_STAGE_0)){ // PRIVILEGE 0 <-- - // At ccci privilege mode, only privilege channel can send data to modem - if (ctl_b->m_logic_ch_table[msg->channel].m_attrs & L_CH_ATTR_PRVLG0){ - ret = ccif->ccif_write_phy_ch_data(ccif, (unsigned int*)msg, retry_en); - } else { - ret = -ENODEV; - } - } else if (unlikely(md_stage == MD_BOOT_STAGE_1)){ // PRIVILEGE 1 <-- - if (ctl_b->m_logic_ch_table[msg->channel].m_attrs & L_CH_ATTR_PRVLG1){ - ret = ccif->ccif_write_phy_ch_data(ccif, (unsigned int*)msg, retry_en); - } else { - ret = -ENODEV; - } - } else if (unlikely(md_stage == MD_BOOT_STAGE_EXCEPTION)) { // PRIVILEGE 2 <-- - if (ctl_b->m_logic_ch_table[msg->channel].m_attrs & L_CH_ATTR_PRVLG2){ - ret = ccif->ccif_write_phy_ch_data(ccif, (unsigned int*)msg, retry_en); - } else if (ctl_b->m_logic_ch_table[msg->channel].m_attrs & L_CH_ATTR_DUMMY_WRITE){ - ret = sizeof(ccci_msg_t); // Dummy write here, MD using polling - } else { - ret = -ETXTBSY; - } - } else { - ret = ccif->ccif_write_phy_ch_data(ccif, (unsigned int*)msg, retry_en); - } - -out: - spin_lock_irqsave(&ctl_b->m_lock, flags); - if (ret == -CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) { - drop = 1; - if((get_debug_mode_flag()&(DBG_FLAG_JTAG|DBG_FLAG_DEBUG))==0) { - need_notify = 1; - if((ctl_b->m_status_flag & FIRST_PENDING)==0 ) { - ctl_b->m_status_flag |= FIRST_PENDING; - ctl_b->m_last_send_ref_jiffies = jiffies; // Update jiffies; - } else { - if( ((jiffies - ctl_b->m_last_send_ref_jiffies) > 5) - && ((ctl_b->m_status_flag & PENDING_50MS)==0) ) {//50ms - // Dump EE memory - args = 1; - ctl_b->m_status_flag |= PENDING_50MS; - } else if( (jiffies - ctl_b->m_last_send_ref_jiffies) > 150) {//1500ms//100ms - //Trigger EE - args = 2; - //ctl_b->m_status_flag |= PENDING_100MS; - ctl_b->m_status_flag |= PENDING_1500MS; - } - } - } - } else { - ctl_b->m_status_flag = 0; - } - spin_unlock_irqrestore(&ctl_b->m_lock, flags); - if((NULL != ctl_b->m_send_notify_cb)&&need_notify) { - ctl_b->m_send_notify_cb(md_id, args); - } - - add_logic_layer_record(md_id, msg, drop); - - return ret; -} - - -void ccci_disable_md_intr(int md_id) -{ - ccif_t *ccif_obj; - - ccif_obj = logic_dispatch_ctlb[md_id]->m_ccif; - ccif_obj->ccif_dis_intr(ccif_obj); -} - -void ccci_enable_md_intr(int md_id) -{ - ccif_t *ccif_obj; - - ccif_obj = logic_dispatch_ctlb[md_id]->m_ccif; - ccif_obj->ccif_en_intr(ccif_obj); -} - -void ccci_hal_reset(int md_id) -{ - ccif_t *ccif_obj; - - ccif_obj = logic_dispatch_ctlb[md_id]->m_ccif; - ccif_obj->ccif_reset(ccif_obj); -} - -void ccci_hal_irq_register(int md_id) -{ - ccif_t *ccif_obj; - - ccif_obj = logic_dispatch_ctlb[md_id]->m_ccif; - ccif_obj->ccif_register_intr(ccif_obj); -} - -int ccci_write_runtime_data(int md_id, unsigned char buf[], int len) -{ - ccif_t *ccif_obj; - int tmp; - - tmp = (int)buf; - if ((tmp&(~0x3)) != tmp) { - return -CCCI_ERR_START_ADDR_NOT_4BYTES_ALIGN; - } - - if ((len&(~0x3)) != len) { - return -CCCI_ERR_NOT_DIVISIBLE_BY_4; - } - - ccif_obj = logic_dispatch_ctlb[md_id]->m_ccif; - return ccif_obj->ccif_write_runtime_data(ccif_obj, (unsigned int *)buf, len>>2); -} - - -void ccci_dump_logic_layer_info(int md_id, unsigned int buf[], int len) -{ - ccif_t *ccif; - logic_dispatch_ctl_block_t *ctl_b; - - ctl_b = logic_dispatch_ctlb[md_id]; - - if(ctl_b != NULL){ - // 1. Dump CCIF Info - ccif = ctl_b->m_ccif; - ccif->ccif_dump_reg(ccif, buf, len); - // 2. Dump logic layer info - dump_logical_layer_tx_rx_histroy(md_id); - } -} - -void ccci_dump_hw_reg_val(int md_id, unsigned int buf[], int len) -{ - ccif_t *ccif; - logic_dispatch_ctl_block_t *ctl_b; - - ctl_b = logic_dispatch_ctlb[md_id]; - - if(ctl_b != NULL){ - // 1. Dump CCIF Info - ccif = ctl_b->m_ccif; - ccif->ccif_dump_reg(ccif, buf, len); - } -} - - -/****************************************************************************/ -/* ccci logical layer initial */ -/* */ -/****************************************************************************/ -int ccci_logic_ctlb_init(int md_id) -{ - int ret = 0; - ccif_t *ccif; - logic_channel_info_t *ch_info; - int ch_id, ch_attr, i; - logic_dispatch_ctl_block_t *ctl_b; - ccif_hw_info_t ccif_hw_inf; - - CCCI_FUNC_ENTRY(md_id); - - // Channel number check - if((sizeof(logic_ch_static_info_tab)/sizeof(logic_channel_static_info_t)) != CCCI_MAX_CH_NUM) { - CCCI_MSG_INF(md_id, "cci", "%s: channel max number mis-match fail\n", __FUNCTION__); - return -CCCI_ERR_CHANNEL_NUM_MIS_MATCH; - } - - // Allocate ctl block memory - ctl_b = (logic_dispatch_ctl_block_t*)kzalloc(sizeof(logic_dispatch_ctl_block_t), GFP_KERNEL); - if(ctl_b == NULL) { - CCCI_MSG_INF(md_id, "cci", "%s: alloc memory fail for logic_dispatch_ctlb\n", __FUNCTION__); - return -CCCI_ERR_ALLOCATE_MEMORY_FAIL; - } - logic_dispatch_ctlb[md_id] = ctl_b; - - // Get CCIF HW info - if(get_ccif_hw_info(md_id, &ccif_hw_inf) < 0) { - CCCI_MSG_INF(md_id, "cci", "%s: get ccif%d hw info fail\n", __FUNCTION__, md_id+1); - ret = -CCCI_ERR_CCIF_GET_HW_INFO_FAIL; - goto _ccif_instance_create_fail; - } - - // Create ccif instance - ccif = ccif_create_instance(&ccif_hw_inf, ctl_b, md_id); - if(ccif == NULL) { - CCCI_MSG_INF(md_id, "cci", "%s: create ccif instance fail\n", __FUNCTION__); - ret = -CCCI_ERR_CREATE_CCIF_INSTANCE_FAIL; - goto _ccif_instance_create_fail; - } - - ccif->ccif_init(ccif); - ctl_b->m_ccif = ccif; - - // Initialize logic channel and its kfifo - // Step1, set all runtime channel id to CCCI_INVALID_CH_ID means default state - // So, even if static channel table is out of order, we can make sure logic_dispatch_ctlb's channel - // table is in order - for(i = 0; i < CCCI_MAX_CH_NUM; i++) - { - ch_info = &ctl_b->m_logic_ch_table[i]; - ch_info->m_ch_id = CCCI_INVALID_CH_ID; - } - - // Step2, set all runtime channel info according to static channel info, make it in order - for(i = 0; i < CCCI_MAX_CH_NUM; i++) - { - ch_id = logic_ch_static_info_tab[i].m_ch_id; - ch_info = &ctl_b->m_logic_ch_table[ch_id]; - - if (ch_info->m_ch_id != CCCI_INVALID_CH_ID) { - CCCI_MSG_INF(md_id, "cci", "[Error]%s: ch%d has registered\n", __FUNCTION__, ch_id); - ret = -CCCI_ERR_REPEAT_CHANNEL_ID; - goto _ccif_logic_channel_init_fail; - } else { - ch_info->m_ch_id = ch_id; - ch_info->m_attrs = logic_ch_static_info_tab[i].m_attrs; - ch_info->m_ch_name = logic_ch_static_info_tab[i].m_ch_name; - ch_info->m_call_back = NULL; - - if(logic_ch_static_info_tab[i].m_kfifo_size) { - if (0 != kfifo_alloc(&ch_info->m_kfifo, sizeof(ccif_msg_t)*logic_ch_static_info_tab[i].m_kfifo_size, GFP_KERNEL)) { - CCCI_MSG_INF(md_id, "cci", "%s: alloc kfifo fail for %s(ch%d) \n", \ - __FUNCTION__, ch_info->m_ch_name, ch_id); - - ch_info->m_kfifo_ready = 0; - ret = CCCI_ERR_ALLOCATE_MEMORY_FAIL; - goto _ccif_logic_channel_init_fail; - } else { - ch_info->m_kfifo_ready = 1; - ch_info->m_md_id = md_id; - } - } else { - ch_info->m_kfifo_ready = 0; - } - - spin_lock_init(&ch_info->m_lock); - } - - //initial channel recording info - if(logic_ch_static_info_tab[i].m_attrs&L_CH_ATTR_TX) - ch_attr = CCCI_LOG_TX; - else - ch_attr = CCCI_LOG_RX; - statistics_init_ch_dir(md_id, ch_id, ch_attr, ch_info->m_ch_name); - } - - // Init logic_dispatch_ctlb - tasklet_init(&ctl_b->m_dispatch_tasklet,__logic_layer_tasklet,(unsigned long)ctl_b); - ctl_b->m_has_pending_data = 0; - ctl_b->m_freezed = 0; - ctl_b->m_running = 0; - //ctl_b->m_privilege = MD_BOOT_STAGE_0; - ctl_b->m_md_id = md_id; - snprintf(ctl_b->m_wakelock_name, sizeof(ctl_b->m_wakelock_name), "ccci%d_logic", (md_id+1)); - wake_lock_init(&ctl_b->m_wakeup_wake_lock, WAKE_LOCK_SUSPEND, ctl_b->m_wakelock_name); - ctl_b->m_send_notify_cb = NULL; - spin_lock_init(&ctl_b->m_lock); - - // Init CCIF now - ccif->register_call_back_func(ccif, __logic_dispatch_push, __let_logic_dispatch_tasklet_run); - //ccif->ccif_register_intr(ccif); - - // Init done - //CCCI_DBG_MSG(md_id, "cci", "ccci_logic_ctlb_init success!\n"); - return ret; - -_ccif_logic_channel_init_fail: - for(i = 0; i < CCCI_MAX_CH_NUM; i++) - { - ch_info = &ctl_b->m_logic_ch_table[i]; - if(ch_info->m_kfifo_ready){ - kfifo_free(&ch_info->m_kfifo); - ch_info->m_kfifo_ready = 0; - } - } - -_ccif_instance_create_fail: - kfree(ctl_b); - logic_dispatch_ctlb[md_id] = NULL; - - return ret; -} - -void ccci_logic_ctlb_deinit(int md_id) -{ - ccif_t *ccif; - logic_channel_info_t *ch_info; - int i; - logic_dispatch_ctl_block_t *ctl_b; - - ctl_b = logic_dispatch_ctlb[md_id]; - - if(ctl_b != NULL){ - // Step 1, freeze ccci - ctl_b->m_freezed = 1; - // Step 2, de-init ccif - ccif = logic_dispatch_ctlb[md_id]->m_ccif; - ccif->ccif_de_init(ccif); - // Step 3, kill ccci dispatch tasklet - tasklet_kill(&ctl_b->m_dispatch_tasklet); - // Step 4, free kfifo memory - for(i=0; im_logic_ch_table[i]; - if(ch_info->m_kfifo_ready){ - kfifo_free(&ch_info->m_kfifo); - ch_info->m_kfifo_ready = 0; - } - } - // Step 5, destory wake lock - wake_lock_destroy(&ctl_b->m_wakeup_wake_lock); - // Step 6, free logic_dispatch_ctlb memory - kfree(ctl_b); - logic_dispatch_ctlb[md_id] = NULL; - } -} - -int ccci_logic_layer_init(int md_id) -{ - int ret = 0; - - ret = ccci_logic_ctlb_init(md_id); - - return ret; -} - -void ccci_logic_layer_exit(int md_id) -{ - ccci_logic_ctlb_deinit(md_id); -} - - - diff --git a/drivers/misc/mediatek/dual_ccci/ccci_md_main.c b/drivers/misc/mediatek/dual_ccci/ccci_md_main.c deleted file mode 100644 index 068dbb505fc..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_md_main.c +++ /dev/null @@ -1,2558 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_md.c - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * MT65XX MD initialization and handshake driver - * - * - ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -//------------------- md cotrol variable define---------------------// -typedef struct _md_ctl_block -{ - struct mutex ccci_md_boot_mutex; // for ccci_mb_mutex - struct mutex ccci_reset_mutex; - MD_CALL_BACK_HEAD_T md_notifier; - volatile int md_boot_stage; - atomic_t md_reset_on_going; - unsigned char is_first_boot; - unsigned char md_ex_type; - unsigned char need_reload_image; // For md_ex_flag - unsigned char img_inf_ready; // for valid_image_info - unsigned char stop_retry_boot_md; - unsigned char image_type; // production, debug - unsigned char reboot_reason; - unsigned char ipo_h_restore; - char load_img_inf[IMG_INF_LEN]; // For image_buf - smem_alloc_t *smem_table; - ccci_mem_layout_t *md_layout; - // -- TRM wake lock - struct wake_lock trm_wake_lock; - char wakelock_name[16]; - // -- Timer - struct timer_list md_ex_monitor; - struct timer_list md_boot_up_check_timer; - // -- EE flag - volatile unsigned int ee_info_got; - volatile unsigned int ee_info_flag; - spinlock_t ctl_lock; - unsigned int m_md_id; - struct ccci_reset_sta reset_sta[NR_CCCI_RESET_USER]; -}md_ctl_block_t; - -static md_ctl_block_t *md_ctlb[MAX_MD_NUM]; - -static void ex_monitor_func(unsigned long); -static void md_boot_up_timeout_func(unsigned long); - -//-------------------external variable and function define--------------// -extern unsigned long long lg_ch_tx_debug_enable[]; -extern unsigned long long lg_ch_rx_debug_enable[]; -extern unsigned int tty_debug_enable[]; -extern unsigned int fs_tx_debug_enable[]; -extern unsigned int fs_rx_debug_enable[]; - -extern int get_md_wakeup_src(int md_id, char *buf, unsigned int len); - -#ifndef ENABLE_SW_MEM_REMAP -int get_md2_ap_phy_addr_fixed(void) -{ - return 0; -} -#endif -#ifndef ENABLE_DUMP_MD_REGISTER -void ccci_dump_md_register(int md_id) -{ -} -#endif -//-------------------other variable and function define----------------// -volatile atomic_t data_connect_sta[MAX_MD_NUM]; - - - -/****************************************************************************/ -/* API about getting ccci share memory address&size */ -/* */ -/****************************************************************************/ -int ccci_mdlog_base_req(int md_id, void *addr_vir, void *addr_phy, unsigned int *len) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if( addr_phy != NULL ) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_mdlog_smem_base_phy; - } - if( addr_vir != NULL ) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_mdlog_smem_base_virt; - } - if( len != NULL ) { - *len = md_ctlb[md_id]->smem_table->ccci_mdlog_smem_size; - } - return 0; - } -} - -/* - * ccci_pcm_base_reg: get PCM buffer information - * @addr: kernel space buffer to store the address of PCM buffer - * @len: kernel space buffer to store the length of PCM buffer - * return 0 for success; negative value for failure - */ -int ccci_pcm_base_req(int md_id, void *addr_vir, void *addr_phy, unsigned int *len) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if( addr_phy != NULL ) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_pcm_smem_base_phy; - } - if( addr_vir != NULL ) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_pcm_smem_base_virt; - } - if( len != NULL ) { - *len = md_ctlb[md_id]->smem_table->ccci_pcm_smem_size; - } - return 0; - } -} - -/* - * ccci_uart_base_req: request TTY share buffer - * @port: UART port to request - * @addr: physical address of TTY share buffer - * @len: length of TTY share buffer - * return 0 for success; negative value for failure - */ -int ccci_uart_base_req(int md_id, int port, void *addr_vir, void *addr_phy, unsigned int *len) -{ - if (port >= CCCI_UART_PORT_NUM) { - return -CCCI_ERR_INVALID_PARAM; - } - - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if(addr_vir != NULL) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_uart_smem_base_virt[port]; - } - if(addr_phy != NULL) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_uart_smem_base_phy[port]; - } - if(len != NULL) { - *len = md_ctlb[md_id]->smem_table->ccci_uart_smem_size[port]; - } - return 0; - } -} - -/* - * ccci_fs_base_req: request CCCI_FS share buffer - * @addr: physical address of CCCI_FS share buffer - * @len: length of CCCI_FS share buffer - * return 0 for success; negative value for failure - */ -int ccci_fs_base_req(int md_id, void *addr_vir, void *addr_phy, unsigned int *len) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if(addr_vir != NULL) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_fs_smem_base_virt; - } - if(addr_phy != NULL) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_fs_smem_base_phy; - } - if(len != NULL) { - *len = md_ctlb[md_id]->smem_table->ccci_fs_smem_size; - } - return 0; - } -} - -/* - * ccci_rpc_base_req: requeset CCCI_FS share buffer - * @addr: physical address of CCCI_FS share buffer - * @len: length of CCCI_FS share buffer - * return 0 for success; negative value for failure - */ -int ccci_rpc_base_req(int md_id, int *addr_vir, int *addr_phy, int *len) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if(addr_vir != NULL) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_rpc_smem_base_virt; - } - if(addr_phy != NULL) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_rpc_smem_base_phy; - } - if(len != NULL) { - *len = md_ctlb[md_id]->smem_table->ccci_rpc_smem_size; - } - return 0; - } -} - - -/* - * ccci_pmic_base_req: get PMIC share buffer information - * @addr: kernel space buffer to store the address of PMIC share buffer - * @len: kernel space buffer to store the length of PMIC share buffer - * return 0 for success; negative value for failure - */ -int ccci_pmic_base_req(int md_id, void *addr_vir, void *addr_phy, int *len) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if(addr_vir != NULL) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_pmic_smem_base_virt; - } - if(addr_phy != NULL) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_pmic_smem_base_phy; - } - if(len != NULL) { - *len = md_ctlb[md_id]->smem_table->ccci_pmic_smem_size; - } - return 0; - } -} - -int ccci_ipc_base_req(int md_id, void *addr_vir, void *addr_phy, int *len) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if(addr_vir != NULL) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_ipc_smem_base_virt; - } - if(addr_phy != NULL) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_ipc_smem_base_phy; - } - if(len != NULL) { - *len = md_ctlb[md_id]->smem_table->ccci_ipc_smem_size; - } - return 0; - } -} - -/* - * ccmni_v2_ul_base_req: get CCMNI Up Link control buffer information - * @addr: kernel space buffer to store the address of CCMNI control buffer - * return 0 for success; negative value for failure - */ -int ccmni_v2_ul_base_req(int md_id, void *addr_vir, void *addr_phy) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if(addr_vir != NULL) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_ccmni_smem_ul_base_virt; - } - if(addr_phy != NULL) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_ccmni_smem_ul_base_phy; - } - return 0; - } -} - -int ccmni_v2_dl_base_req(int md_id, void *addr_vir, void *addr_phy) -{ - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - if(addr_vir != NULL) { - *(unsigned int *)addr_vir = md_ctlb[md_id]->smem_table->ccci_ccmni_smem_dl_base_virt; - } - if(addr_phy != NULL) { - *(unsigned int *)addr_phy = md_ctlb[md_id]->smem_table->ccci_ccmni_smem_dl_base_phy; - } - return 0; - } -} - -int ccci_ccmni_v2_ctl_mem_base_req(int md_id, int port, int *addr_virt, int *addr_phy, int *len) -{ - if (port >= CCMNI_V2_PORT_NUM) { - return -CCCI_ERR_INVALID_PARAM; - } - - if(md_ctlb[md_id] == NULL) { - return -CCCI_ERR_FATAL_ERR; - } else { - *addr_virt = md_ctlb[md_id]->smem_table->ccci_ccmni_ctl_smem_base_virt[port]; - *addr_phy = md_ctlb[md_id]->smem_table->ccci_ccmni_ctl_smem_base_phy[port]; - *len = md_ctlb[md_id]->smem_table->ccci_ccmni_ctl_smem_size[port]; - return 0; - } -} - - -/****************************************************************************/ -/* API about getting modem information */ -/* */ -/****************************************************************************/ -int get_curr_md_state(int md_id) -{ - return md_ctlb[md_id]->md_boot_stage; -} - -int get_md_exception_type(int md_id) -{ - return md_ctlb[md_id]->md_ex_type; -} - -int get_common_cfg_setting(int md_id, int cfg[], int *num) -{ - #ifdef CONFIG_EVDO_DT_SUPPORT - unsigned char* str_slot1_mode = MTK_TELEPHONY_BOOTUP_MODE_SLOT1; - unsigned char* str_slot2_mode = MTK_TELEPHONY_BOOTUP_MODE_SLOT2; - - cfg[0] = str_slot1_mode[0] - '0'; - cfg[1] = str_slot2_mode[0] - '0'; - - *num = 2; - - return 0; - - #else - return -1; - #endif -} - - -/****************************************************************************/ -/* API about transfer information between AP and MD */ -/* */ -/****************************************************************************/ -static int send_ccci_system_ch_msg(int md_id, unsigned int msg_id, unsigned int data) -{ - ccci_msg_t msg; - msg.data0 = 0xFFFFFFFF; - msg.id = msg_id; - msg.channel = CCCI_SYSTEM_TX; - msg.reserved = data; - return ccci_message_send(md_id, &msg, 1); -} - - -void lock_md_dormant(int md_id) -{ - ccci_msg_t msg; - msg.data0 = 0xFFFFFFFF; - msg.id = MD_DORMANT_NOTIFY; - msg.channel = CCCI_SYSTEM_TX; - msg.reserved = 0x1; - ccci_message_send(md_id, &msg, 1); - CCCI_MSG_INF(md_id, "ctl", "notify modem lock dormant mode\n"); -} - -void unlock_md_dormant(int md_id) -{ - ccci_msg_t msg; - msg.data0 = 0xFFFFFFFF; - msg.id = MD_DORMANT_NOTIFY; - msg.channel = CCCI_SYSTEM_TX; - msg.reserved = 0x0; - ccci_message_send(md_id, &msg, 1); - - CCCI_MSG_INF(md_id, "ctl", "notify modem unlock dormant mode\n"); -} - -/* -ccci_dormancy -When "data_connect_sta" is not zero, which means there are data connection exist -So the suspend function should call this API to notify modem disconnect data -connection before enter suspend state to save power. axs - */ -int ccci_dormancy(int md_id, char *buf, unsigned int len) -{ - if(atomic_read(&data_connect_sta[md_id]) > 0) - { - CCCI_MSG_INF(md_id, "ctl", "notify enter dormancy, data_sta<%d>\n", atomic_read(&data_connect_sta[md_id])); - //ccci_write_mailbox(CCCI_SYSTEM_TX, 0xE); - atomic_set(&data_connect_sta[md_id],0x0); - } - - return 0; -} - - -/* -When data channel coming, the "data_connect_sta" should be marked -This function called in IRQ_handler function. -*/ -void check_data_connected(int md_id, int channel) -{ - if(channel >= CCCI_CCMNI1_RX && channel <= CCCI_CCMNI3_TX_ACK) - atomic_inc((atomic_t*)&data_connect_sta[md_id]); -} - - -#if 0 -void __ccci_dormancy(int md_id) -{ - char buf=0; - ccci_dormancy(md_id, &buf, 1); -} -#endif - - -// ccci_sys_rx_dispatch_cb: CCCI_SYSTEM_RX message dispatch call back function for MODEM -// @buff: pointer to a CCCI buffer -// @private_data: pointer to private data of CCCI_SYSTEM_RX -void ccci_sys_rx_dispatch_cb(void *private) -{ - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - ccci_msg_t msg; - int md_id = ch_info->m_md_id; - - while(get_logic_ch_data(ch_info, &msg)) { - exec_ccci_sys_call_back(md_id, msg.id, msg.reserved); - } -} - - -int md_wdt_monitor(int md_id, int data) -{ - CCCI_MSG_INF(md_id, "ctl", "wdt msg\n"); - start_md_wdt_recov_timer(md_id); - return 0; -} - - -int md_get_battery_info(int md_id, int data) -{ - ccci_system_message(md_id, CCCI_MD_MSG_SEND_BATTERY_INFO, 0); - CCCI_MSG_INF(md_id, "ctl", "request to send battery voltage to md\n"); - - return 0; -} - -int md_set_sim_type(int md_id, int data) -{ - set_sim_type(md_id, data); - CCCI_MSG_INF(md_id, "ctl", "receive sim type from md\n"); - - return 0; -} - - -void wakeup_md(int md_id) -{ - ccci_msg_t msg; - msg.data0 = 0xFFFFFFFF; - msg.id = MD_WAKEN_UP; - msg.channel = CCCI_SYSTEM_TX; - msg.reserved = 0x0; - ccci_message_send(md_id, &msg, 0x1); - - CCCI_MSG_INF(md_id, "ctl", "wake up md\n"); -} - - -/****************************************************************************/ -/* register store&show function of ccci debug log filter */ -/* */ -/****************************************************************************/ -size_t ccci_msg_filter_store(char buf[], size_t len) -{ - unsigned int msg_mask=0; - unsigned int key; - int ret; - int md_id; - - ret = sscanf(buf, "-l=%d 0x%x 0x%x", &md_id, &key, &msg_mask); - if(ret != 3){ - CCCI_MSG("Parse msg filter fail: %d\n", ret); - } else if( md_id >= MAX_MD_NUM){ - CCCI_MSG("Invalid MD sys ID:%d\n", md_id+1); - } else if( key != 0x20111111){ - CCCI_MSG("Wrong key\n"); - } else{ - ccci_msg_mask[md_id] = msg_mask; - } - return len; -} - -size_t ccci_msg_filter_show(char buf[], size_t len) -{ - int md_num; - int i; - int curr = 0; - - md_num = get_md_sys_max_num(); - - for(i = 0; i < md_num; i++) - { - if(get_modem_is_enabled(i)){ - curr += snprintf(&buf[curr], len-curr, "[MD%d] msg mask: %x\n", i+1, ccci_msg_mask[i]); - } - } - - return curr; -} - -size_t ccci_ch_filter_store(char buf[], size_t len) -{ - unsigned long long lg_ch_tx_mask= 0; - unsigned long long lg_ch_rx_mask= 0; - unsigned int tty_mask= 0; - unsigned int fs_tx_mask= 0; - unsigned int fs_rx_mask = 0; - unsigned int key = 0; - int md_id; - int ret = 0; - - //ret = sscanf(buf, "-c=0x%x 0x%llX 0x%llX 0x%x 0x%x 0x%x", &key, &lg_ch_tx_mask, - // &lg_ch_rx_mask, &fs_tx_mask, &fs_rx_mask, &tty_mask); - ret = sscanf(buf, "-c=%d 0x%x 0x%llx 0x%llx 0x%x 0x%x 0x%x ", &md_id, &key, &lg_ch_tx_mask, \ - &lg_ch_rx_mask, &fs_tx_mask, &fs_rx_mask, &tty_mask); - if(ret != 7){ - CCCI_MSG("Parse channel filter fail: %d\n", ret); - } else if ( md_id >= MAX_MD_NUM){ - CCCI_MSG("Invalid MD sys ID:%d\n", md_id+1); - } else if ( key != 0x20111111){ - CCCI_MSG("Wrong key\n"); - } else { - CCCI_MSG("%x %x %x %x %llx %llx\n", key, fs_tx_mask, fs_rx_mask, tty_mask, \ - lg_ch_tx_mask, lg_ch_rx_mask); - lg_ch_tx_debug_enable[md_id] = lg_ch_tx_mask; - lg_ch_rx_debug_enable[md_id] = lg_ch_rx_mask; - fs_tx_debug_enable[md_id] = fs_tx_mask; - fs_rx_debug_enable[md_id] = fs_rx_mask; - tty_debug_enable[md_id] = tty_mask; - } - return len; -} - -size_t ccci_ch_filter_show(char buf[], size_t len) -{ - int md_num; - int i; - int curr = 0; - - md_num = get_md_sys_max_num(); - - for(i=0; i 0){ - curr_ch_p = (unsigned char*)curr_p; - for(j=0; jtype,debug_info->name?:"Unknown"); - - switch(debug_info->type) - { - case MD_EX_TYPE_ASSERT_DUMP: - case MD_EX_TYPE_ASSERT: - CCCI_MSG_INF(md_id, "cci", "filename = %s\n", debug_info->assert.file_name); - CCCI_MSG_INF(md_id, "cci", "line = %d\n", debug_info->assert.line_num); - CCCI_MSG_INF(md_id, "cci", "para0 = %d, para1 = %d, para2 = %d\n", - debug_info->assert.parameters[0], - debug_info->assert.parameters[1], - debug_info->assert.parameters[2]); - snprintf(ex_info,EE_BUF_LEN,"\n[%s] file:%s line:%d\np1:0x%08x\np2:0x%08x\np3:0x%08x\n", - debug_info->name, - debug_info->assert.file_name, - debug_info->assert.line_num, - debug_info->assert.parameters[0], - debug_info->assert.parameters[1], - debug_info->assert.parameters[2]); - break; - case MD_EX_TYPE_FATALERR_BUF: - case MD_EX_TYPE_FATALERR_TASK: - CCCI_MSG_INF(md_id, "cci", "fatal error code 1 = %d\n", debug_info->fatal_error.err_code1); - CCCI_MSG_INF(md_id, "cci", "fatal error code 2 = %d\n", debug_info->fatal_error.err_code2); - snprintf(ex_info,EE_BUF_LEN,"\n[%s] err_code1:%d err_code2:%d\n", debug_info->name, - debug_info->fatal_error.err_code1, debug_info->fatal_error.err_code2); - break; - case MD_EX_TYPE_EMI_CHECK: - CCCI_MSG_INF(md_id, "cci", "md_emi_check: %08X, %08X, %02d, %08X\n", - debug_info->data.data0, debug_info->data.data1, - debug_info->data.channel, debug_info->data.reserved); - snprintf(ex_info,EE_BUF_LEN,"\n[emi_chk] %08X, %08X, %02d, %08X\n", - debug_info->data.data0, debug_info->data.data1, - debug_info->data.channel, debug_info->data.reserved); - break; - case DSP_EX_TYPE_ASSERT: - CCCI_MSG_INF(md_id, "cci", "filename = %s\n", debug_info->dsp_assert.file_name); - CCCI_MSG_INF(md_id, "cci", "line = %d\n", debug_info->dsp_assert.line_num); - CCCI_MSG_INF(md_id, "cci", "exec unit = %s\n", debug_info->dsp_assert.execution_unit); - CCCI_MSG_INF(md_id, "cci", "para0 = %d, para1 = %d, para2 = %d\n", - debug_info->dsp_assert.parameters[0], - debug_info->dsp_assert.parameters[1], - debug_info->dsp_assert.parameters[2]); - snprintf(ex_info,EE_BUF_LEN,"\n[%s] file:%s line:%d\nexec:%s\np1:%d\np2:%d\np3:%d\n", - debug_info->name, debug_info->assert.file_name, debug_info->assert.line_num, - debug_info->dsp_assert.execution_unit, - debug_info->dsp_assert.parameters[0], - debug_info->dsp_assert.parameters[1], - debug_info->dsp_assert.parameters[2]); - break; - case DSP_EX_TYPE_EXCEPTION: - CCCI_MSG_INF(md_id, "cci", "exec unit = %s, code1:0x%08x\n", debug_info->dsp_exception.execution_unit, - debug_info->dsp_exception.code1); - snprintf(ex_info,EE_BUF_LEN,"\n[%s] exec:%s code1:0x%08x\n", - debug_info->name, debug_info->dsp_exception.execution_unit, - debug_info->dsp_exception.code1); - break; - case DSP_EX_FATAL_ERROR: - CCCI_MSG_INF(md_id, "cci", "exec unit = %s\n", debug_info->dsp_fatal_err.execution_unit); - CCCI_MSG_INF(md_id, "cci", "err_code0 = 0x%08x, err_code1 = 0x%08x\n", - debug_info->dsp_fatal_err.err_code[0], - debug_info->dsp_fatal_err.err_code[1]); - - snprintf(ex_info,EE_BUF_LEN,"\n[%s] exec:%s err_code1:0x%08x err_code2:0x%08x\n", - debug_info->name, debug_info->dsp_fatal_err.execution_unit, - debug_info->dsp_fatal_err.err_code[0], - debug_info->dsp_fatal_err.err_code[1]); - break; - default: // Only display exception name - snprintf(ex_info,EE_BUF_LEN,"\n[%s]\n", debug_info->name); - break; - } - - // Add additional info - switch(debug_info->more_info) - { - case MD_EE_CASE_ONLY_EX: - strcat(ex_info, "\nTime out case\n"); - break; - - case MD_EE_CASE_ONLY_EX_OK: - strcat(ex_info, "\nOnly EX_OK case\n"); - break; - case MD_EE_CASE_AP_MASK_I_BIT_TOO_LONG: - strcat(i_bit_ex_info, ex_info); - strcpy(ex_info, i_bit_ex_info); - #if defined (CONFIG_MTK_AEE_FEATURE) && defined (ENABLE_AEE_MD_EE) - aee_kernel_warning_api(__FILE__, __LINE__, DB_OPT_FTRACE, "CCCI", i_bit_ex_info); - #endif - break; - case MD_EE_CASE_TX_TRG: - case MD_EE_CASE_ISR_TRG: - //strcat("\n[Others] May I-Bit dis too long\n", ex_info); - break; - - case MD_EE_CASE_NO_RESPONSE: - strcat(ex_info, "\n[Others] MD long time no response\n"); - break; - - default: - break; - } - - // Dump Exception share memory - CCCI_DBG_MSG(md_id, "cci", "\n\n"); - CCCI_DBG_MSG(md_id, "cci", "Dump MD%d Exception share memory\n", md_id+1); - ccci_mem_dump((int*)md_ctlb[md_id]->smem_table->ccci_exp_smem_base_virt, md_ctlb[md_id]->smem_table->ccci_exp_smem_size); - - // Dump MD MCU register - CCCI_MSG_INF(md_id, "cci", "Dump MD MCU register(dummy)(%d)+\n", get_curr_md_state(md_id)); - ccci_dump_md_register(md_id); - CCCI_MSG_INF(md_id, "cci", "Dump MD MCU register(dummy)(%d)\n", get_curr_md_state(md_id)); - - // Dump MD image memory - CCCI_DBG_MSG(md_id, "cci", "\n\n"); - CCCI_DBG_MSG(md_id, "cci", "Dump MD%d Image memory\n", md_id+1); - ccci_mem_dump((int*)md_ctlb[md_id]->md_layout->md_region_vir, MD_IMG_DUMP_SIZE); - // Dump MD image memory - CCCI_DBG_MSG(md_id, "cci", "\n\n"); - CCCI_DBG_MSG(md_id, "cci", "Dump MD%d layout struct\n", md_id+1); - ccci_mem_dump((int*)md_ctlb[md_id]->md_layout, sizeof(ccci_mem_layout_t)); - - // Dump Logical layer info - CCCI_DBG_MSG(md_id, "cci", "\n\n"); - CCCI_DBG_MSG(md_id, "cci", "Dump MD%d logic layer info\n", md_id+1); - ccci_dump_logic_layer_info(md_id, NULL, 0); - - ccci_aed(md_id, CCCI_AED_DUMP_EX_MEM|CCCI_AED_DUMP_MD_IMG_MEM, ex_info); -} -extern void ccmni_v2_dump(int md_id); -static void ccci_dump_runtime_data(int md_id, modem_runtime_t *runtime, smem_alloc_t *smem) -{ - int i; - char ctmp[12]; - int *p; - - p = (int*)ctmp; - *p = runtime->Prefix; - p++; - *p = runtime->Platform_L; - p++; - *p = runtime->Platform_H; - - CCCI_MSG_INF(md_id, "ctl", "**********************************************\n"); - CCCI_DBG_MSG(md_id, "ctl", "Prefix %c%c%c%c\n", ctmp[0], ctmp[1], ctmp[2], ctmp[3]); - CCCI_MSG_INF(md_id, "ctl", "Platform_L %c%c%c%c\n", ctmp[4], ctmp[5], ctmp[6], ctmp[7]); - CCCI_MSG_INF(md_id, "ctl", "Platform_H %c%c%c%c\n", ctmp[8], ctmp[9], ctmp[10], ctmp[11]); - CCCI_MSG_INF(md_id, "ctl", "DriverVersion 0x%x\n", runtime->DriverVersion); - CCCI_DBG_MSG(md_id, "ctl", "BootChannel %d\n", runtime->BootChannel); - CCCI_MSG_INF(md_id, "ctl", "BootingStartID(Mode) 0x%x\n", runtime->BootingStartID); - CCCI_DBG_MSG(md_id, "ctl", "BootAttributes %d\n", runtime->BootAttributes); - CCCI_DBG_MSG(md_id, "ctl", "BootReadyID %d\n", runtime->BootReadyID); - - CCCI_DBG_MSG(md_id, "ctl", "ExceShareMemBase 0x%x\n", runtime->ExceShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "ExceShareMemSize 0x%x\n", runtime->ExceShareMemSize); - - CCCI_DBG_MSG(md_id, "ctl", "MDExExpInfoBase 0x%x\n", runtime->MDExExpInfoBase); - CCCI_DBG_MSG(md_id, "ctl", "MDExExpInfoSize 0x%x\n", runtime->MDExExpInfoSize); - - CCCI_DBG_MSG(md_id, "ctl", "MiscInfoBase 0x%x\n", runtime->MiscInfoBase); - CCCI_DBG_MSG(md_id, "ctl", "MiscInfoSize 0x%x\n", runtime->MiscInfoSize); - - CCCI_DBG_MSG(md_id, "ctl", "PcmShareMemBase 0x%x\n", runtime->PcmShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "PcmShareMemSize 0x%x\n", runtime->PcmShareMemSize); - - CCCI_DBG_MSG(md_id, "ctl", "MdlogShareMemBase 0x%x\n", runtime->MdlogShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "MdlogShareMemSize 0x%x\n", runtime->MdlogShareMemSize); - - CCCI_DBG_MSG(md_id, "ctl", "RpcShareMemBase 0x%x\n", runtime->RpcShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "RpcShareMemSize 0x%x\n", runtime->RpcShareMemSize); - - CCCI_DBG_MSG(md_id, "ctl", "FileShareMemBase 0x%x\n", runtime->FileShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "FileShareMemSize 0x%x\n", runtime->FileShareMemSize); - - CCCI_DBG_MSG(md_id, "ctl", "UartPortNum %d\n", runtime->UartPortNum); - for (i = 0; i < CCCI_UART_PORT_NUM; i++) { - CCCI_DBG_MSG(md_id, "ctl", "UartShareMemBase[%d] 0x%x\n", i, runtime->UartShareMemBase[i]); - CCCI_DBG_MSG(md_id, "ctl", "UartShareMemSize[%d] 0x%x\n", i, runtime->UartShareMemSize[i]); - } - - //CCCI_DBG_MSG(md_id, "ctl", "PmicShareMemBase 0x%x\n", runtime->PmicShareMemBase); - //CCCI_DBG_MSG(md_id, "ctl", "PmicShareMemSize 0x%x\n", runtime->PmicShareMemSize); - - //CCCI_DBG_MSG(md_id, "ctl", "SysShareMemBase 0x%x\n", runtime->SysShareMemBase); - //CCCI_DBG_MSG(md_id, "ctl", "SysShareMemSize 0x%x\n", runtime->SysShareMemSize); - - CCCI_DBG_MSG(md_id, "ctl", "IPCShareMemBase 0x%x\n",runtime->IPCShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "IPCShareMemSize 0x%x\n",runtime->IPCShareMemSize); - - CCCI_DBG_MSG(md_id, "ctl", "NetPortNum %d\n", runtime->NetPortNum); - CCCI_DBG_MSG(md_id, "ctl", "MDULNetShareMemBase 0x%x\n", runtime->MDULNetShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "MDULNetShareMemSize 0x%x\n", runtime->MDULNetShareMemSize); - CCCI_DBG_MSG(md_id, "ctl", "MDDLNetShareMemBase 0x%x\n", runtime->MDDLNetShareMemBase); - CCCI_DBG_MSG(md_id, "ctl", "MDDLNetShareMemSize 0x%x\n", runtime->MDDLNetShareMemSize); - -#if 0 - for (i = 0; i < NET_PORT_NUM; i++) { - CCCI_DBG_MSG(md_id, "ctl", "NetDLCtrlShareMemBase[%d] 0x%x\n", i, runtime->NetDLCtrlShareMemBase[i]); - CCCI_DBG_MSG(md_id, "ctl", "NetDLCtrlShareMemSize[%d] 0x%x\n", i, runtime->NetDLCtrlShareMemSize[i]); - - CCCI_DBG_MSG(md_id, "ctl", "NetULCtrlShareMemBase[%d] 0x%x\n", i, runtime->NetULCtrlShareMemBase[i]); - CCCI_DBG_MSG(md_id, "ctl", "NetULCtrlShareMemSize[%d] 0x%x\n", i, runtime->NetULCtrlShareMemSize[i]); - } -#endif - CCCI_DBG_MSG(md_id, "ctl", "CheckSum %d\n", runtime->CheckSum); - - p = (int*)ctmp; - *p = runtime->Postfix; - CCCI_DBG_MSG(md_id, "ctl", "Postfix %c%c%c%c\n", ctmp[0], ctmp[1], ctmp[2], ctmp[3]); - - CCCI_DBG_MSG(md_id, "ctl", "----------------------------------------------\n"); - - CCCI_MSG_INF(md_id, "ctl", "ccci_smem_virt 0x%x\n", (unsigned int)smem->ccci_smem_vir); - CCCI_MSG_INF(md_id, "ctl", "ccci_smem_phy, AP=0x%x,MD=0x%x\n", (unsigned int)smem->ccci_smem_phy,(unsigned int)smem->ccci_smem_phy - get_md2_ap_phy_addr_fixed()); - CCCI_MSG_INF(md_id, "ctl", "ccci_smem_size 0x%x\n", smem->ccci_smem_size); - - CCCI_DBG_MSG(md_id, "ctl", "md_runtime_data_smem_virt 0x%x\n", smem->ccci_md_runtime_data_smem_base_virt); - CCCI_DBG_MSG(md_id, "ctl", "md_runtime_data_smem_phy AP=0x%x,MD=0x%x\n", smem->ccci_md_runtime_data_smem_base_phy,smem->ccci_md_runtime_data_smem_base_phy - get_md2_ap_phy_addr_fixed()); - CCCI_DBG_MSG(md_id, "ctl", "md_runtime_data_smem_size 0x%x\n", smem->ccci_md_runtime_data_smem_size); - CCCI_MSG_INF(md_id, "ctl", "**********************************************\n"); - ccmni_v2_dump(md_id); -} - - - -/****************************************************************************/ -/* API about modem exception handle */ -/* */ -/****************************************************************************/ -static void ccci_md_exception(int md_id, DEBUG_INFO_T *debug_info) -{ - EX_LOG_T *ex_info; - int ee_type; - - if(debug_info == NULL) { - return; - } - - ex_info = (EX_LOG_T*)md_ctlb[md_id]->smem_table->ccci_exp_smem_base_virt; - memset(debug_info,0,sizeof(DEBUG_INFO_T)); - ee_type = ex_info->header.ex_type; - debug_info->type = ee_type; - md_ctlb[md_id]->md_ex_type = ee_type; - - switch (ee_type) - { - case MD_EX_TYPE_INVALID: - debug_info->name="INVALID"; - break; - - case MD_EX_TYPE_UNDEF: - debug_info->name="UNDEF"; - break; - - case MD_EX_TYPE_SWI: - debug_info->name="SWI"; - break; - - case MD_EX_TYPE_PREF_ABT: - debug_info->name="PREFETCH ABORT"; - break; - - case MD_EX_TYPE_DATA_ABT: - debug_info->name="DATA ABORT"; - break; - - case MD_EX_TYPE_ASSERT: - debug_info->name="ASSERT"; - snprintf(debug_info->assert.file_name,sizeof(debug_info->assert.file_name), - ex_info->content.assert.filename); - debug_info->assert.line_num = ex_info->content.assert.linenumber; - debug_info->assert.parameters[0] = ex_info->content.assert.parameters[0]; - debug_info->assert.parameters[1] = ex_info->content.assert.parameters[1]; - debug_info->assert.parameters[2] = ex_info->content.assert.parameters[2]; - break; - - case MD_EX_TYPE_FATALERR_TASK: - debug_info->name="Fatal error (task)"; - debug_info->fatal_error.err_code1=ex_info->content.fatalerr.error_code.code1; - debug_info->fatal_error.err_code2=ex_info->content.fatalerr.error_code.code2; - break; - - case MD_EX_TYPE_FATALERR_BUF: - debug_info->name="Fatal error (buff)"; - debug_info->fatal_error.err_code1=ex_info->content.fatalerr.error_code.code1; - debug_info->fatal_error.err_code2=ex_info->content.fatalerr.error_code.code2; - break; - - case MD_EX_TYPE_LOCKUP: - debug_info->name="Lockup"; - break; - - case MD_EX_TYPE_ASSERT_DUMP: - debug_info->name="ASSERT DUMP"; - snprintf(debug_info->assert.file_name,sizeof(debug_info->assert.file_name), - ex_info->content.assert.filename); - debug_info->assert.line_num=ex_info->content.assert.linenumber; - break; - - case DSP_EX_TYPE_ASSERT: - debug_info->name="MD DMD ASSERT"; - snprintf(debug_info->dsp_assert.file_name,sizeof(debug_info->dsp_assert.file_name), - ex_info->content.assert.filename); - debug_info->dsp_assert.line_num = ex_info->content.assert.linenumber; - snprintf(debug_info->dsp_assert.execution_unit,sizeof(debug_info->dsp_assert.execution_unit), - ex_info->envinfo.execution_unit); - debug_info->dsp_assert.parameters[0] = ex_info->content.assert.parameters[0]; - debug_info->dsp_assert.parameters[1] = ex_info->content.assert.parameters[1]; - debug_info->dsp_assert.parameters[2] = ex_info->content.assert.parameters[2]; - break; - - case DSP_EX_TYPE_EXCEPTION: - debug_info->name="MD DMD Exception"; - snprintf(debug_info->dsp_exception.execution_unit,sizeof(debug_info->dsp_exception.execution_unit), - ex_info->envinfo.execution_unit); - debug_info->dsp_exception.code1 = ex_info->content.fatalerr.error_code.code1; - break; - - case DSP_EX_FATAL_ERROR: - debug_info->name="MD DMD FATAL ERROR"; - snprintf(debug_info->dsp_fatal_err.execution_unit,sizeof(debug_info->dsp_fatal_err.execution_unit), - ex_info->envinfo.execution_unit); - debug_info->dsp_fatal_err.err_code[0] = ex_info->content.fatalerr.error_code.code1; - debug_info->dsp_fatal_err.err_code[1] = ex_info->content.fatalerr.error_code.code2; - break; - - default: - debug_info->name= "UNKNOWN Exception"; - break; - } - - debug_info->ext_mem=(int*)ex_info; - debug_info->ext_size=md_ctlb[md_id]->smem_table->ccci_exp_smem_size; - debug_info->md_image=(int*)md_ctlb[md_id]->md_layout->md_region_vir; - debug_info->md_size=MD_IMG_DUMP_SIZE; -} - -static void ex_monitor_func(unsigned long data) -{ - //int md_ex_get, md_ex_ok_get; - //int trusted = 0; - //volatile int reentrant_times; - int ee_on_going = 0; - int ee_case; - int need_update_state = 0; - unsigned long flags; - unsigned int ee_info_flag; - md_ctl_block_t *md_ctlb = (md_ctl_block_t *)data; - DEBUG_INFO_T debug_info; - - spin_lock_irqsave(&md_ctlb->ctl_lock, flags); - if((1<ee_info_flag) { - ee_on_going = 1; - } else { - ee_info_flag = md_ctlb->ee_info_flag; - md_ctlb->ee_info_flag |= (1<ctl_lock, flags); - - if(ee_on_going) - return; - - if ((ee_info_flag&((1<m_md_id, "ctl", "Receive MD_EX_REC_OK\n"); - if (ee_info_flag & (1 << MD_EE_AP_MASK_I_BIT_TOO_LONG)) { - ee_case = MD_EE_CASE_AP_MASK_I_BIT_TOO_LONG; - } - - } else if((ee_info_flag&((1<m_md_id, "ctl", \ - "Only recv MD_EX, timeout trigger dump. Dump data may be not correct.\n"); - if (ee_info_flag & (1 << MD_EE_AP_MASK_I_BIT_TOO_LONG)) { - ee_case = MD_EE_CASE_AP_MASK_I_BIT_TOO_LONG; - } - - } else if((ee_info_flag&((1<m_md_id, "ctl", \ - "Only recv MD_EX_OK, No physical channel occur.\n"); - if (ee_info_flag & (1 << MD_EE_AP_MASK_I_BIT_TOO_LONG)) { - ee_case = MD_EE_CASE_AP_MASK_I_BIT_TOO_LONG; - } - } else if (ee_info_flag & (1 << MD_EE_AP_MASK_I_BIT_TOO_LONG)) { - ee_case = MD_EE_CASE_AP_MASK_I_BIT_TOO_LONG; - if((ee_info_flag&(1<m_md_id, "ctl", "MD no response > 1500ms.\n"); - } - } else { - CCCI_DBG_MSG(md_ctlb->m_md_id, "ctl", "Invalid MD_EX\n"); - goto _dump_done; - } - - if(need_update_state) { - spin_lock_irqsave(&md_ctlb->ctl_lock, flags); - //set_curr_md_state(md_ctlb->m_md_id, MD_BOOT_STAGE_EXCEPTION); - md_ctlb->md_boot_stage = MD_BOOT_STAGE_EXCEPTION; - md_ctlb->need_reload_image = 1; - spin_unlock_irqrestore(&md_ctlb->ctl_lock, flags); - md_call_chain(&md_ctlb->md_notifier,CCCI_MD_EXCEPTION); - } - - ccci_system_message(md_ctlb->m_md_id, CCCI_MD_MSG_NOTIFY, ee_case); - ccci_md_exception(md_ctlb->m_md_id, &debug_info); - debug_info.more_info = ee_case; - ccci_ee_info_dump(md_ctlb->m_md_id, &debug_info); - -_dump_done: - spin_lock_irqsave(&md_ctlb->ctl_lock, flags); - md_ctlb->ee_info_flag = 0; - spin_unlock_irqrestore(&md_ctlb->ctl_lock, flags); - -} - - -void ccci_aed(int md_id, unsigned int dump_flag, char *aed_str) -{ - #define AED_STR_LEN (512) - int *ex_log_addr = NULL; - int ex_log_len = 0; - int *md_img_addr = NULL; - int md_img_len = 0; - int info_str_len = 0; - char buff[AED_STR_LEN]; - char *img_inf; - - img_inf = get_md_info_str(md_id); - if(img_inf == NULL) - img_inf = ""; - info_str_len = strlen(aed_str); - info_str_len += strlen(img_inf); - - if(info_str_len > AED_STR_LEN){ - buff[AED_STR_LEN-1] = '\0'; // Cut string length to AED_STR_LEN - } - - snprintf(buff, AED_STR_LEN, "md%d:%s%s", md_id+1, aed_str, img_inf); - - if(dump_flag & CCCI_AED_DUMP_EX_MEM){ - ex_log_addr = (int*)md_ctlb[md_id]->smem_table->ccci_exp_smem_base_virt; - ex_log_len = md_ctlb[md_id]->smem_table->ccci_exp_smem_size; - } - if(dump_flag & CCCI_AED_DUMP_MD_IMG_MEM){ - md_img_addr = (int*)md_ctlb[md_id]->md_layout->md_region_vir; - md_img_len = MD_IMG_DUMP_SIZE; - } - if(dump_flag & CCCI_AED_DUMP_CCIF_REG) { - ex_log_addr = (int *)md_ctlb[md_id]->smem_table->ccci_exp_smem_base_virt; - ex_log_len = 68*4; - ccci_dump_hw_reg_val(md_id, (unsigned int*)ex_log_addr, ex_log_len); - } - - #if defined (CONFIG_MTK_AEE_FEATURE) && defined (ENABLE_AEE_MD_EE) - aed_md_exception(ex_log_addr, ex_log_len, md_img_addr, md_img_len, buff); - #endif -} - -void md_emi_check(int md_id, ccci_msg_t *buff, DEBUG_INFO_T *debug_info) -{ - if ((buff==NULL) || (debug_info==NULL)) - return; - - memset(debug_info,0,sizeof(DEBUG_INFO_T)); - debug_info->type=MD_EX_TYPE_EMI_CHECK; - debug_info->name="EMI_CHK"; - debug_info->data=*buff; - - if(md_id < get_md_sys_max_num()) { - md_ctlb[md_id]->md_ex_type = MD_EX_TYPE_EMI_CHECK; - } -} - -void md_ee_info_check(int md_id, unsigned int *p_ee_info) -{ - md_ctl_block_t *ctl_b = md_ctlb[md_id]; - modem_exception_exp_t *exp_ee_info; - - *p_ee_info = 0; - exp_ee_info = (modem_exception_exp_t*)ctl_b->smem_table->ccci_md_ex_exp_info_smem_base_virt; - - if(exp_ee_info->exception_occur) { - *p_ee_info = exp_ee_info->exception_occur << MD_EE_INFO_OFFSET; - } -} - -void ccci_check_md_no_physical_channel(int md_id, unsigned int args) -{ - md_ctl_block_t *ctl_b = md_ctlb[md_id]; - modem_exception_exp_t *exp_ee_info; - int trigger_ee = 0; - int trigger_ee_timer = 0; - unsigned long flags; - unsigned int ee_info; - - md_ee_info_check(md_id, &ee_info); - - if (ee_info){ - if(ctl_b->ee_info_got == 0) { - ctl_b->ee_info_got = 1; - exp_ee_info = (modem_exception_exp_t*)ctl_b->smem_table->ccci_md_ex_exp_info_smem_base_virt; - CCCI_MSG_INF(md_id, "ctl", "receive MD_EX @S(%08X)(%d:%d)\n", exp_ee_info->exception_occur, \ - exp_ee_info->send_time, exp_ee_info->wait_time); - ccci_dump_hw_reg_val(md_id, NULL, 0); - trigger_ee = 1; - } - } - - // Trigger EE if needed - if(trigger_ee) { - spin_lock_irqsave(&ctl_b->ctl_lock, flags); - ctl_b->ee_info_flag |= ((1<ee_info_flag & (1<md_boot_stage = MD_BOOT_STAGE_EXCEPTION; - spin_unlock_irqrestore(&ctl_b->ctl_lock, flags); - if(trigger_ee_timer) { - mod_timer(&ctl_b->md_ex_monitor,jiffies+EE_TIMER_BASE+2); - } - } else { - if(ctl_b->ee_info_got == 0) { - switch(args) - { - case 1: // pending 50ms, dump EE buffer only - CCCI_MSG_INF(md_id, "cci", "TX 50ms\n"); - ccci_dump_hw_reg_val(md_id, NULL, 0); - CCCI_MSG_INF(md_id, "cci", "Dump MD%d Exception share memory\n", md_id+1); - ccci_mem_dump((int*)md_ctlb[md_id]->smem_table->ccci_exp_smem_base_virt, md_ctlb[md_id]->smem_table->ccci_exp_smem_size); - break; - - case 2: //pending 1500ms, trigger EE - CCCI_MSG_INF(md_id, "cci", "TX 1500ms\n"); - if ((ctl_b->ee_info_flag & (1<ctl_lock, flags); - if((ctl_b->ee_info_flag & ((1<ee_info_flag |= ((1<ctl_lock, flags); - - if(trigger_ee_timer) { - mod_timer(&ctl_b->md_ex_monitor,jiffies+EE_TIMER_BASE+1); - } - break; - - default: - break; - } - } - } -} - - -void ccif_isr_check(int md_id) -{ - md_ctl_block_t *ctl_b = md_ctlb[md_id]; - modem_exception_exp_t *exp_ee_info; - int trigger_ee = 0; - int trigger_ee_timer = 0; - unsigned long flags; - unsigned int ee_info = 0; - - // Check ext exception info - md_ee_info_check(md_id, &ee_info); - - if (ee_info){ - if(ctl_b->ee_info_got == 0) { - ctl_b->ee_info_got = 1; - exp_ee_info = (modem_exception_exp_t*)ctl_b->smem_table->ccci_md_ex_exp_info_smem_base_virt; - CCCI_MSG_INF(md_id, "ctl", "receive MD_EX @ISR(%08X)(%d:%d)\n", exp_ee_info->exception_occur, \ - exp_ee_info->send_time, exp_ee_info->wait_time); - ccci_dump_hw_reg_val(md_id, NULL, 0); - trigger_ee = 1; - } - } - // Trigger EE if needed - if(trigger_ee) { - spin_lock_irqsave(&ctl_b->ctl_lock, flags); - ctl_b->ee_info_flag |= ((1<ee_info_flag & (1<md_boot_stage = MD_BOOT_STAGE_EXCEPTION; - spin_unlock_irqrestore(&ctl_b->ctl_lock, flags); - if(trigger_ee_timer) { - mod_timer(&ctl_b->md_ex_monitor,jiffies+EE_TIMER_BASE+1); - } - } -} - - - -/****************************************************************************/ -/* register callback function during modem boot up stage */ -/* */ -/****************************************************************************/ -void md_call_chain(MD_CALL_BACK_HEAD_T *head,unsigned long data) -{ - MD_CALL_BACK_QUEUE *queue; - unsigned long flag; - - spin_lock_irqsave(&head->lock,flag); - head->is_busy = 1; - spin_unlock_irqrestore(&head->lock,flag); - - queue=head->next; - while (queue) - { - queue->call(queue,data); - queue=queue->next; - } - - spin_lock_irqsave(&head->lock,flag); - head->is_busy = 0; - spin_unlock_irqrestore(&head->lock,flag); -} - -static void notify_chain(unsigned long data) -{ - md_ctl_block_t *ctl_b = (md_ctl_block_t *)data; - md_call_chain(&ctl_b->md_notifier,CCCI_MD_STOP); -} - - -int md_register_call_chain(int md_id, MD_CALL_BACK_QUEUE *queue) -{ - MD_CALL_BACK_HEAD_T *head; - unsigned long flag; - int retry= 10; - - head = &(md_ctlb[md_id]->md_notifier); - - do { - spin_lock_irqsave(&head->lock,flag); - if(head->is_busy) { - spin_unlock_irqrestore(&head->lock,flag); - msleep(10); - } else { - queue->next=head->next; - head->next=queue; - spin_unlock_irqrestore(&head->lock,flag); - return 0; - } - }while(retry-->0); - - CCCI_MSG_INF(md_id, "ctl", "md_register_call_chain fail\n"); - return -1; -} - - -int md_unregister_call_chain(int md_id,MD_CALL_BACK_QUEUE *queue) -{ - unsigned long flag; - int ret=-1; - MD_CALL_BACK_HEAD_T *head; - MD_CALL_BACK_QUEUE **_queue=NULL; - int retry = 10; - - head = &(md_ctlb[md_id]->md_notifier); - - do { - spin_lock_irqsave(&head->lock,flag); - if(head->is_busy) { - spin_unlock_irqrestore(&head->lock,flag); - msleep(10); - } else { - // Find and remove-- - _queue=&head->next; - while(*_queue) - { - if (*_queue==queue) - { - head->next=(*_queue)->next; - *_queue=NULL; - ret=0; - break; - } - _queue=&(*_queue)->next; - } - //---------------- - spin_unlock_irqrestore(&head->lock,flag); - return 0; - } - }while(retry-->0); - CCCI_MSG_INF(md_id, "ctl", "md_unregister_call_chain fail\n"); - return ret; -} - - - -/****************************************************************************/ -/* modem boot up function */ -/* */ -/****************************************************************************/ -static void md_boot_up_timeout_func(unsigned long data) -{ - md_ctl_block_t *ctl_b = (md_ctl_block_t *)data; - int md_id = ctl_b->m_md_id; - char ex_info[EE_BUF_LEN]=""; - - CCCI_MSG_INF(md_id, "ctl", "Time out at md_boot_stage_%d! \n", ctl_b->md_boot_stage); - - if(ctl_b->stop_retry_boot_md) - return; - - //ccci_system_message(ctl_b->m_md_id, CCCI_MD_MSG_BOOT_TIMEOUT, 0); - if(ctl_b->md_boot_stage == MD_BOOT_STAGE_0) { - // Handshake 1 fail, only dump ccif share memory - snprintf(ex_info, EE_BUF_LEN, "\n[Others] MD_BOOT_UP_FAIL(HS%d)\n", (ctl_b->md_boot_stage+1)); - CCCI_DBG_MSG(md_id, "cci", "Dump MD%d Image memory\n", md_id+1); - ccci_mem_dump((int*)md_ctlb[md_id]->md_layout->md_region_vir, MD_IMG_DUMP_SIZE); - #ifdef ENABLE_CCCI_DRV_BUILDIN - CCCI_DBG_MSG(md_id, "cci", "Dump TASK_UNINTERRUPTIBLE\n"); - show_state_filter(TASK_UNINTERRUPTIBLE); - #endif - ccci_aed(md_id, CCCI_AED_DUMP_CCIF_REG, ex_info); - } else if(ctl_b->md_boot_stage == MD_BOOT_STAGE_1) { - #if defined (CONFIG_MTK_AEE_FEATURE) && defined (ENABLE_AEE_MD_EE) - aee_kernel_warning_api(__FILE__, __LINE__, DB_OPT_FTRACE, "CCCI", "modem boot up timeout"); - #endif - // Handshake 2 fail - snprintf(ex_info, EE_BUF_LEN, "\n[Others] MD_BOOT_UP_FAIL(HS%d)\n", (ctl_b->md_boot_stage+1)); - CCCI_DBG_MSG(md_id, "cci", "Dump MD%d Image memory\n", md_id+1); - ccci_mem_dump((int*)md_ctlb[md_id]->md_layout->md_region_vir, MD_IMG_DUMP_SIZE); - #ifdef ENABLE_CCCI_DRV_BUILDIN - CCCI_DBG_MSG(md_id, "cci", "Dump TASK_UNINTERRUPTIBLE\n"); - show_state_filter(TASK_UNINTERRUPTIBLE); - #endif - ccci_dump_hw_reg_val(md_id, NULL, 0); - - CCCI_DBG_MSG(md_id, "cci", "Dump MD%d Exception share memory\n", md_id+1); - ccci_mem_dump((int*)md_ctlb[md_id]->smem_table->ccci_exp_smem_base_virt, md_ctlb[md_id]->smem_table->ccci_exp_smem_size); - - ccci_aed(md_id, CCCI_AED_DUMP_EX_MEM, ex_info); - } -} - -// set_md_runtime: setup MODEM runtime data -static int set_md_runtime(int md_id, - modem_runtime_t *runtime, - modem_runtime_info_tag_t *tag) -{ - int i; - struct file *filp = NULL; - LOGGING_MODE mdlog_flag = MODE_IDLE; - int ret = 0; - md_ctl_block_t *ctl_b; - int dl_ctl_mem_size, ul_ctl_mem_size; - - ctl_b = md_ctlb[md_id]; - memset(runtime, 0, sizeof(modem_runtime_t)); - - runtime->Prefix = 0x46494343; // "CCIF" - runtime->Postfix = 0x46494343; // "CCIF" - runtime->BootChannel = CCCI_CONTROL_RX; - - if(ctl_b->smem_table->ccci_sys_smem_size) - { - runtime->SysShareMemBase = ctl_b->smem_table->ccci_sys_smem_base_phy - get_md2_ap_phy_addr_fixed(); - runtime->SysShareMemSize = ctl_b->smem_table->ccci_sys_smem_size; - } - else - { - runtime->SysShareMemBase = 0; - runtime->SysShareMemSize = 0; - } - - if(ctl_b->smem_table->ccci_exp_smem_size) - { - runtime->ExceShareMemBase = ctl_b->smem_table->ccci_exp_smem_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->ExceShareMemSize = ctl_b->smem_table->ccci_exp_smem_size; - } - else - { - runtime->ExceShareMemBase = 0; - runtime->ExceShareMemSize = 0; - } - if(ctl_b->smem_table->ccci_mdlog_smem_size) - { - runtime->MdlogShareMemBase = ctl_b->smem_table->ccci_mdlog_smem_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->MdlogShareMemSize = ctl_b->smem_table->ccci_mdlog_smem_size; - } - else - { - runtime->MdlogShareMemBase = 0; - runtime->MdlogShareMemSize = 0; - } - if(ctl_b->smem_table->ccci_pcm_smem_size) - { - runtime->PcmShareMemBase = ctl_b->smem_table->ccci_pcm_smem_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->PcmShareMemSize = ctl_b->smem_table->ccci_pcm_smem_size; - } - else - { - runtime->PcmShareMemBase = 0; - runtime->PcmShareMemSize = 0; - } - - if(ctl_b->smem_table->ccci_pmic_smem_size) - { - runtime->PmicShareMemBase = ctl_b->smem_table->ccci_pmic_smem_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->PmicShareMemSize = ctl_b->smem_table->ccci_pmic_smem_size; - - } - else - { - runtime->PmicShareMemBase = 0; - runtime->PmicShareMemSize = 0; - } - - if(ctl_b->smem_table->ccci_fs_smem_size) - { - runtime->FileShareMemBase = ctl_b->smem_table->ccci_fs_smem_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->FileShareMemSize = ctl_b->smem_table->ccci_fs_smem_size; - } - else - { - runtime->FileShareMemBase = 0; - runtime->FileShareMemSize = 0; - } - - if(ctl_b->smem_table->ccci_rpc_smem_size) - { - runtime->RpcShareMemBase = ctl_b->smem_table->ccci_rpc_smem_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->RpcShareMemSize = ctl_b->smem_table->ccci_rpc_smem_size; - } - else - { - runtime->RpcShareMemBase = 0; - runtime->RpcShareMemSize = 0; - } - - if(sizeof(CCCI_IPC_BUFFER)) - { - runtime->IPCShareMemBase = ctl_b->smem_table->ccci_ipc_smem_base_phy+offset_of(CCCI_IPC_MEM,buffer)- get_md2_ap_phy_addr_fixed(); // Note this - runtime->IPCShareMemSize = sizeof(CCCI_IPC_BUFFER); // Note this - } - else - { - runtime->IPCShareMemBase = 0; - runtime->IPCShareMemSize = 0; - } - - if(sizeof(ipc_ilm_t) * MAX_NUM_IPC_TASKS_MD) - { - runtime->IPCMDIlmShareMemBase = (int)ctl_b->smem_table->ccci_ipc_smem_base_phy \ - + offset_of(CCCI_IPC_MEM, ilm_md)- get_md2_ap_phy_addr_fixed(); - runtime->IPCMDIlmShareMemSize = sizeof(ipc_ilm_t) * MAX_NUM_IPC_TASKS_MD; - - } - else - { - runtime->IPCMDIlmShareMemBase = 0; - runtime->IPCMDIlmShareMemSize = 0; - } - - if(sizeof(ipc_ilm_t) * MAX_NUM_IPC_TASKS_MD) - { - runtime->IPCMDIlmShareMemBase = (int)ctl_b->smem_table->ccci_ipc_smem_base_phy \ - + offset_of(CCCI_IPC_MEM, ilm_md)- get_md2_ap_phy_addr_fixed(); - runtime->IPCMDIlmShareMemSize = sizeof(ipc_ilm_t) * MAX_NUM_IPC_TASKS_MD; - } - else - { - runtime->IPCMDIlmShareMemBase = 0; - runtime->IPCMDIlmShareMemSize = 0; - } - for (i = 0; i < CCCI_UART_PORT_NUM; i++) { - if((ctl_b->smem_table->ccci_uart_smem_base_phy[i] != 0) && - (ctl_b->smem_table->ccci_uart_smem_size[i] != 0)) - { - if(ctl_b->smem_table->ccci_uart_smem_size[i]) - { - runtime->UartShareMemBase[i] = ctl_b->smem_table->ccci_uart_smem_base_phy[i]- get_md2_ap_phy_addr_fixed(); - runtime->UartShareMemSize[i] = ctl_b->smem_table->ccci_uart_smem_size[i]; - } - else - { - runtime->UartShareMemBase[i] = 0; - runtime->UartShareMemSize[i] = 0; - } - } - } - runtime->UartPortNum = i; - - for(i = 0; i < NET_PORT_NUM; i++) - { - if(ctl_b->smem_table->ccci_ccmni_ctl_smem_base_phy[i] == 0 || - ctl_b->smem_table->ccci_ccmni_ctl_smem_size[i] == 0) - { - break; - } - if(ccci_get_sub_module_cfg(md_id, "net_dl_ctl", (char*)&dl_ctl_mem_size, sizeof(int)) != sizeof(int)) { - CCCI_MSG_INF(md_id, "ctl", "Get net_dl_ctl fail\n"); - dl_ctl_mem_size = 0; - } - if(ccci_get_sub_module_cfg(md_id, "net_ul_ctl", (char*)&ul_ctl_mem_size, sizeof(int)) != sizeof(int)) { - CCCI_MSG_INF(md_id, "ctl", "Get net_ul_ctl fail\n"); - dl_ctl_mem_size = 0; - } - if(dl_ctl_mem_size) - { - runtime->NetDLCtrlShareMemBase[i] = ctl_b->smem_table->ccci_ccmni_ctl_smem_base_phy[i]- get_md2_ap_phy_addr_fixed(); - runtime->NetDLCtrlShareMemSize[i] = dl_ctl_mem_size; - } - else - { - runtime->NetDLCtrlShareMemBase[i] = 0; - runtime->NetDLCtrlShareMemSize[i] = 0; - } - - if(ul_ctl_mem_size) - { - runtime->NetULCtrlShareMemBase[i] = ctl_b->smem_table->ccci_ccmni_ctl_smem_base_phy[i] + dl_ctl_mem_size- get_md2_ap_phy_addr_fixed(); - runtime->NetULCtrlShareMemSize[i] = ul_ctl_mem_size; - } - else - { - runtime->NetULCtrlShareMemBase[i] = 0; - runtime->NetULCtrlShareMemSize[i] = 0; - } - - } - runtime->NetPortNum = i; - - if(ctl_b->smem_table->ccci_ccmni_smem_dl_size) - { - runtime->MDDLNetShareMemBase = ctl_b->smem_table->ccci_ccmni_smem_dl_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->MDDLNetShareMemSize = ctl_b->smem_table->ccci_ccmni_smem_dl_size; - } - else - { - runtime->MDDLNetShareMemBase = 0; - runtime->MDDLNetShareMemSize = 0; - } - if(ctl_b->smem_table->ccci_ccmni_smem_ul_size) - { - runtime->MDULNetShareMemBase = ctl_b->smem_table->ccci_ccmni_smem_ul_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->MDULNetShareMemSize = ctl_b->smem_table->ccci_ccmni_smem_ul_size; - } - else - { - runtime->MDULNetShareMemBase = 0; - runtime->MDULNetShareMemSize = 0; - } - if(ctl_b->smem_table->ccci_md_ex_exp_info_smem_size) - { - runtime->MDExExpInfoBase = ctl_b->smem_table->ccci_md_ex_exp_info_smem_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->MDExExpInfoSize = ctl_b->smem_table->ccci_md_ex_exp_info_smem_size; - } - else - { - runtime->MDExExpInfoBase = 0; - runtime->MDExExpInfoSize = 0; - } - if(ctl_b->smem_table->ccci_md_ex_exp_info_smem_size) - { - runtime->MiscInfoBase = ctl_b->smem_table->ccci_misc_info_base_phy- get_md2_ap_phy_addr_fixed(); - runtime->MiscInfoSize = ctl_b->smem_table->ccci_misc_info_size; - } - else - { - runtime->MiscInfoBase = 0; - runtime->MiscInfoSize = 0; - } - - //add a new attribute of mdlogger auto start info to notify md - filp = filp_open(MDLOGGER_FILE_PATH, O_RDONLY, 0777); - if (IS_ERR(filp)) { - CCCI_MSG_INF(md_id, "ctl", "open /data/mdl/mdl_config fail:%ld\n", PTR_ERR(filp)); - filp=NULL; - } - else { - ret = kernel_read(filp, 0, (char*)&mdlog_flag,sizeof(int)); - if (ret != sizeof(int)) { - CCCI_MSG_INF(md_id, "ctl", "read /data/mdl/mdl_config fail: %d!\n", ret); - mdlog_flag = MODE_IDLE; - } - } - - if(filp != NULL) { - //CCCI_MSG_INF("ctl", "close /data/mdl/mdl_config!\n"); - //filp_close(filp, current->files); - filp_close(filp, NULL); - } - - if (is_meta_mode() || is_advanced_meta_mode()) - runtime->BootingStartID = ((char)mdlog_flag <<8 | META_BOOT_ID); - else - runtime->BootingStartID = ((char)mdlog_flag <<8 | NORMAL_BOOT_ID); - - //CCCI_MSG_INF(md_id, "ctl", "send /data/mdl/mdl_config =%d to modem!\n", mdlog_flag); - - platform_set_runtime_data(md_id, runtime); // Updata platform info and driver version - config_misc_info(md_id, (unsigned int*)ctl_b->smem_table->ccci_misc_info_base_virt, ctl_b->smem_table->ccci_misc_info_size); - - // Configure runtime tag - tag->prefix = runtime->Prefix; - tag->platform_L = runtime->Platform_L; - tag->platform_H = runtime->Platform_H; - tag->driver_version = runtime->DriverVersion; - tag->runtime_data_base = ctl_b->smem_table->ccci_md_runtime_data_smem_base_phy- get_md2_ap_phy_addr_fixed(); - tag->runtime_data_size = sizeof(modem_runtime_t); - CCCI_MSG_INF(md_id, "ctl", "set runtime data: size=%d!\n", sizeof(modem_runtime_t)); - tag->postfix = runtime->Postfix; - - return 0; -} - -int ccci_send_run_time_data(int md_id) -{ - int ret=0; - md_ctl_block_t *ctl_b; - modem_runtime_info_tag_t runtime_tag; - ccci_msg_t msg; - modem_runtime_t *runtime; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - /* Set runtime data and echo start-boot command */ - //CCCI_MSG_INF(md_id, "ctl", "set modem runtime\n"); - runtime = (modem_runtime_t*)(ctl_b->smem_table->ccci_md_runtime_data_smem_base_virt); - ret = set_md_runtime(md_id, runtime, &runtime_tag); - if (ret < 0) { - CCCI_MSG_INF(md_id, "ctl", "set MODEM runtime data fail\n"); - return ret; - } - - //if(ctl_b->is_first_boot) { - //CCCI_MSG_INF(md_id, "ctl", "dump md%d runtime data\n", md_id+1); - ccci_dump_runtime_data(md_id, runtime, ctl_b->smem_table); - //} - - ret = ccci_write_runtime_data(md_id, (unsigned char*)&runtime_tag, sizeof(modem_runtime_info_tag_t) ); - if (ret < 0) { - CCCI_MSG_INF(md_id, "ctl", "fail to write MODEM runtime data(%d)\n", ret); - return ret; - } - - msg.magic = 0xFFFFFFFF; - msg.id = MD_INIT_START_BOOT; - msg.channel = CCCI_CONTROL_TX; - msg.reserved = MD_INIT_CHK_ID; - md_boot_up_additional_operation(md_id); - mb(); - - ret = ccci_message_send(md_id, &msg, 1); - if (ret != sizeof(msg)) { - CCCI_MSG_INF(md_id, "ctl", "fail to write CCCI_CONTROL_TX(%d)\n", ret); - return ret; - } - - if ((get_debug_mode_flag()&(DBG_FLAG_JTAG|DBG_FLAG_DEBUG))==0) - mod_timer(&ctl_b->md_boot_up_check_timer, jiffies+15*HZ); - - CCCI_MSG_INF(md_id, "ctl", "wait for NORMAL_BOOT_ID @ %d\n", get_curr_md_state(md_id)); - - //prepare md boot up env, such as set mpu protection - md_env_setup_before_ready(md_id); - - return 0; -} - -int ccci_set_reload_modem(int md_id) -{ - md_ctl_block_t *ctl_b; - ctl_b = md_ctlb[md_id]; - ctl_b->need_reload_image = 1; - CCCI_MSG_INF(md_id, "ctl", "md image will be reloaded!\n"); - return 0; -} - -//ccci_start_modem: do start modem operation -int ccci_start_modem(int md_id) -{ - md_ctl_block_t *ctl_b; - int ret = 0; - char err_str[256]; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - if(ctl_b->ipo_h_restore) { - ctl_b->ipo_h_restore = 0; - ccci_misc_ipo_h_restore(md_id); - ccci_load_firmware(md_id, LOAD_ALL_IMG, err_str, 256); - } else if(ctl_b->need_reload_image) { - CCCI_MSG_INF(md_id, "ctl", "re-load firmware!\n"); - if((ret = ccci_load_firmware(md_id, RELOAD_ONLY, err_str, 256)) <0) { - CCCI_MSG_INF(md_id, "ctl", "load firmware fail, so modem boot fail:%d!\n", ret); - ccci_aed(md_id, 0, err_str); - return -CCCI_ERR_LOAD_IMG_NOMEM; - } else { - //when load firmware successfully, no need to load it again when reset modem - CCCI_MSG_INF(md_id, "ctl", "load firmware successful!\n"); - } - ctl_b->need_reload_image = 0; - } - - ctl_b->ee_info_got = 0; - - md_env_setup_before_boot(md_id); - - //update_active_md_sys_state(md_id, 1); - ccci_enable_md_intr(md_id); - - ret = let_md_go(md_id); - if(ret == 0) { - mod_timer(&ctl_b->md_boot_up_check_timer, jiffies+5*HZ); - } else { - CCCI_MSG_INF(md_id, "ctl", "ungate_md fail: %d\n", ret); - } - - atomic_set(&ctl_b->md_reset_on_going, 0); - - CCCI_MSG_INF(md_id, "ctl", "wait for MD_INIT_START_BOOT\n"); - return 0; -} - - -int ccci_pre_stop(int md_id) -{ - md_ctl_block_t *ctl_b; - int ret = 0; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - /* prevent another reset modem action from wdt timeout IRQ during modem reset */ - if(atomic_inc_and_test(&ctl_b->md_reset_on_going) > 1){ - CCCI_MSG_INF(md_id, "ctl", "One reset flow is on-going \n"); - return -CCCI_ERR_MD_IN_RESET; - } - - additional_operation_before_stop_md(md_id); - - CCCI_MSG_INF(md_id, "ctl", "Now disable CCIF irq\n"); - - ccci_disable_md_intr(md_id); - - CCCI_MSG_INF(md_id, "ctl", "CCIF irq disabled\n"); - //set_curr_md_state(md_id, MD_BOOT_STAGE_0); - ctl_b->md_boot_stage = MD_BOOT_STAGE_0; - - return ret; -} - -extern void ccci_md_logger_notify(void); -extern void ccci_fs_resetfifo(int md_id); -int ccci_stop_modem(int md_id, unsigned int timeout) -{ - md_ctl_block_t *ctl_b; - int ret = 0, i; - - ctl_b = md_ctlb[md_id]; - - if(in_irq()) { - CCCI_MSG_INF(md_id, "ctl", "@I\n"); - // If at ISR, using tasklet do call chain work - tasklet_schedule(&ctl_b->md_notifier.tasklet); - } else { - CCCI_MSG_INF(md_id, "ctl", "@N\n"); - md_call_chain(&ctl_b->md_notifier,CCCI_MD_STOP); - } - ccci_md_logger_notify(); - CCCI_MSG_INF(md_id, "ctl", "md power off before\n"); - - CCCI_MSG_INF(md_id, "ctl", "stop modem, delete boot up check timer\n"); - del_timer(&ctl_b->md_boot_up_check_timer); - ccmni_v2_dump(md_id); - let_md_stop(md_id, timeout); - for (i = 0; i < NR_CCCI_RESET_USER; i++) { - ctl_b->reset_sta[i].is_reset = 0; - } - md_call_chain(&ctl_b->md_notifier,CCCI_MD_RESET); - CCCI_MSG_INF(md_id, "ctl", "md power off end\n"); - ccmni_v2_dump(md_id); - // Reset share memory if needed - memset( (void*)ctl_b->smem_table->ccci_md_ex_exp_info_smem_base_virt, 0, sizeof(modem_exception_exp_t)); - ccci_fs_resetfifo(md_id); - ret = logic_layer_reset(md_id); - - return ret; -} - - -//send_md_reset_notify: send modem reset message to user -int send_md_reset_notify(int md_id) -{ - int ret; - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - CCCI_MSG_INF(md_id, "ctl", "send reset modem request message\n"); - - ret = ccci_pre_stop(md_id); - //if( (ret < 0)&&(ret != -CCCI_ERR_MD_IN_RESET) ) - if (ret < 0) - return ret; - wake_lock_timeout(&ctl_b->trm_wake_lock, 10*HZ); - ccci_system_message(md_id, CCCI_MD_MSG_RESET, 0); - - return 0; -} - - -// send_md_stop_notify -int send_md_stop_notify(int md_id) -{ - int ret; - CCCI_MSG_INF(md_id, "ctl", "send stop modem request message\n"); - - ret = ccci_pre_stop(md_id); - if(ret == 0) { - ccci_stop_modem(md_id, 1*1000); // <<<<<<<<< Fix here - //} else if( (ret < 0)&&(ret != -CCCI_ERR_MD_IN_RESET) ) - } else if (ret < 0) - return ret; - ccci_system_message(md_id, CCCI_MD_MSG_STOP_MD_REQUEST, 0); - return 0; -} - - -//send_md_start_notify -int send_md_start_notify(int md_id) -{ - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - CCCI_MSG_INF(md_id, "ctl", "send start modem request message\n"); - ccci_system_message(md_id, CCCI_MD_MSG_START_MD_REQUEST, 0); - return 0; -} - -int send_enter_flight_mode_request(int md_id) -{ - md_ctl_block_t *ctl_b; - int ret; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - if(ctl_b->md_boot_stage != MD_BOOT_STAGE_2){ - return -CCCI_ERR_MD_NOT_READY; - } - - CCCI_MSG_INF(md_id, "ctl", "send enter flight mode message\n"); - ret = ccci_pre_stop(md_id); - if(ret == 0) { - ccci_stop_modem(md_id, 1*1000); - //} else if( (ret < 0)&&(ret != -CCCI_ERR_MD_IN_RESET) ) - } else if(ret < 0) - return ret; - ccci_system_message(md_id, CCCI_MD_MSG_ENTER_FLIGHT_MODE, 0); - return 0; -} - -int send_leave_flight_mode_request(int md_id) -{ - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - CCCI_MSG_INF(md_id, "ctl", "send leave flight mode message\n"); - ccci_system_message(md_id, CCCI_MD_MSG_LEAVE_FLIGHT_MODE, 0); - return 0; -} - -int send_power_on_md_request(int md_id) -{ - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - CCCI_MSG_INF(md_id, "ctl", "send power up md message\n"); - ccci_system_message(md_id, CCCI_MD_MSG_POWER_ON_REQUEST, 0); - return 0; -} - -int send_power_down_md_request(int md_id) -{ - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - CCCI_MSG_INF(md_id, "ctl", "send power down md message\n"); - ccci_system_message(md_id, CCCI_MD_MSG_POWER_DOWN_REQUEST, 0); - return 0; -} - -int send_update_cfg_request(int md_id, unsigned int val) -{ - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - CCCI_MSG_INF(md_id, "ctl", "send update nvram request 0x%x\n", val); - ccci_system_message(md_id, CCCI_MD_MSG_CFG_UPDATE, val); - return 0; -} - - -// ccci_reset_register: register a user for ccci reset -// @name: user name -// return a handle if success; return negative value if failure -int ccci_reset_register(int md_id, char *name) -{ - int handle, i; - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - //CCCI_MSG_INF(md_id, "ctl", "Register a reset handle\n"); - - if (name == NULL) { - CCCI_MSG_INF(md_id, "ctl", "[Error]Invalid reset handle name\n"); - return -CCCI_ERR_INVALID_PARAM; - } - - mutex_lock(&ctl_b->ccci_reset_mutex); - for (handle = 0; handle < NR_CCCI_RESET_USER; handle++) { - if (ctl_b->reset_sta[handle].is_allocate == 0) { - ctl_b->reset_sta[handle].is_allocate = 1; - break; - } - } - - if (handle < NR_CCCI_RESET_USER) { - ctl_b->reset_sta[handle].is_reset = 0; - mutex_unlock(&ctl_b->ccci_reset_mutex); - - for (i = 0; i < NR_CCCI_RESET_USER_NAME; i++) { - if (name[i] == '\0') { - break; - } else { - ctl_b->reset_sta[handle].name[i] = name[i]; - } - } - CCCI_MSG_INF(md_id, "ctl", "Register a reset handle by %s(%d)\n", current->comm, handle); - return handle; - } - else { - mutex_unlock(&ctl_b->ccci_reset_mutex); - ASSERT(0); - return -CCCI_ERR_ASSERT_ERR; - } -} - - - -// ccci_user_ready_to_reset: ready to reset and request to reset md -// @handle: a user handle gotten from ccci_reset_register() -// return 0 if CCCI is reset; return negative value for failure -int ccci_user_ready_to_reset(int md_id, int handle) -{ - int i; - int reset_ready = 1; - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - if(atomic_read(&ctl_b->md_reset_on_going) == 0){ - CCCI_MSG_INF(md_id, "ctl", "Ignore reset request\n"); - mutex_lock(&ctl_b->ccci_reset_mutex); - ctl_b->reset_sta[handle].is_allocate = 0; - ctl_b->reset_sta[handle].is_reset = 0; - mutex_unlock(&ctl_b->ccci_reset_mutex); - return 0; - } - if (handle >= NR_CCCI_RESET_USER) { - CCCI_MSG_INF(md_id, "ctl", "reset_request: invalid handle:%d \n", handle); - return -CCCI_ERR_INVALID_PARAM; - } - - if (ctl_b->reset_sta[handle].is_allocate == 0) { - CCCI_MSG_INF(md_id, "ctl", "reset_request: handle(%d) not alloc: alloc=%d \n", - handle, ctl_b->reset_sta[handle].is_allocate); - return -CCCI_ERR_INVALID_PARAM; - } - CCCI_MSG_INF(md_id, "ctl", "%s (%d) call reset request \n",current->comm, handle); - - mutex_lock(&ctl_b->ccci_reset_mutex); - ctl_b->reset_sta[handle].is_allocate = 0; - ctl_b->reset_sta[handle].is_reset = 1; - CCCI_MSG_INF(md_id, "ctl", "Dump not ready list++++\n"); - for (i = 0; i < NR_CCCI_RESET_USER; i++) { - if (ctl_b->reset_sta[i].is_allocate && (ctl_b->reset_sta[i].is_reset == 0)) { - reset_ready = 0; - CCCI_MSG_INF(md_id, "ctl", " ==> %s\n", ctl_b->reset_sta[i].name); - } - } - CCCI_MSG_INF(md_id, "ctl", "Dump not ready list----\n"); - mutex_unlock(&ctl_b->ccci_reset_mutex); - - if (reset_ready == 0) - return -CCCI_ERR_RESET_NOT_READY; - - // All service ready, send reset request - CCCI_MSG_INF(md_id, "ctl", "Reset MD by %s(%d) \n", current->comm, handle); - ccci_system_message(md_id, CCCI_MD_MSG_READY_TO_RESET, 0); - - return 0; -} - -int ccci_trigger_md_assert(int md_id) -{ - ccci_msg_t msg; - msg.magic = 0xFFFFFFFF; - msg.id = 0x5A5A5A5A; - msg.channel = CCCI_FORCE_ASSERT_CH; - msg.reserved= 0xA5A5A5A5; - return ccci_message_send(md_id, &msg, 1); -} - -int ccci_force_md_assert(int md_id, char buf[], unsigned int len) -{ - ccci_trigger_md_assert(md_id); - return 0; -} - -// ccci_md_ctrl_cb: CCCI_CONTROL_RX callback function for MODEM -// @buff: pointer to a CCCI buffer -// @private_data: pointer to private data of CCCI_CONTROL_RX -void ccci_md_ctrl_cb(void *private) -{ - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - ccci_msg_t msg; - int ret; - md_ctl_block_t *ctl_b = (md_ctl_block_t *)ch_info->m_owner; - int md_id = ctl_b->m_md_id; - DEBUG_INFO_T debug_info; - unsigned long flags; - int need_update_state = 0; - - while(get_logic_ch_data(ch_info, &msg)) { - if (msg.id == MD_INIT_START_BOOT && - msg.reserved == MD_INIT_CHK_ID && - ctl_b->md_boot_stage == MD_BOOT_STAGE_0) - { - del_timer(&ctl_b->md_boot_up_check_timer); - CCCI_MSG_INF(md_id, "ctl", "receive MD_INIT_START_BOOT\n"); - //set_curr_md_state(md_id, MD_BOOT_STAGE_1); - ctl_b->md_boot_stage = MD_BOOT_STAGE_1; - - //md_boot_up_additional_operation(md_id); - - ccci_system_message(md_id, CCCI_MD_MSG_BOOT_UP, 0); - } - else if (msg.id == NORMAL_BOOT_ID && - ctl_b->md_boot_stage == MD_BOOT_STAGE_1) - { - del_timer(&ctl_b->md_boot_up_check_timer); - CCCI_MSG_INF(md_id, "ctl", "receive NORMAL_BOOT_ID\n"); - //set_curr_md_state(md_id, MD_BOOT_STAGE_2); - ctl_b->md_boot_stage = MD_BOOT_STAGE_2; - md_boot_ready_additional_operation(md_id); - - md_call_chain(&ctl_b->md_notifier,CCCI_MD_BOOTUP); - - ccci_system_message(md_id, CCCI_MD_MSG_BOOT_READY, 0); - - } - else if (msg.id == MD_EX) - { - del_timer(&ctl_b->md_boot_up_check_timer); - if (unlikely(msg.reserved != MD_EX_CHK_ID)) - CCCI_MSG_INF(md_id, "ctl", "receive invalid MD_EX\n"); - else - { - spin_lock_irqsave(&ctl_b->ctl_lock, flags); - ctl_b->ee_info_flag |= ((1<md_boot_stage = MD_BOOT_STAGE_EXCEPTION; - ctl_b->need_reload_image = 1; - spin_unlock_irqrestore(&ctl_b->ctl_lock, flags); - md_call_chain(&ctl_b->md_notifier,CCCI_MD_EXCEPTION); - - //atomic_set(&ctl_b->md_ex, 1); - mod_timer(&ctl_b->md_ex_monitor,jiffies+EE_TIMER_BASE); - CCCI_MSG_INF(md_id, "ctl", "receive MD_EX\n"); - //ret = ccci_write(CCCI_CONTROL_TX, buff); - msg.channel = CCCI_CONTROL_TX; - ret = ccci_message_send(md_id, &msg, 1); - if (ret != sizeof(msg) ) - { - CCCI_MSG_INF(md_id, "ctl", "write CCCI_CONTROL_TX fail: %d\n", ret); - } - - ccci_system_message(md_id, CCCI_MD_MSG_EXCEPTION, 0); - } - } - else if (msg.id == MD_EX_REC_OK) - { - if (unlikely(msg.reserved != MD_EX_REC_OK_CHK_ID)) - CCCI_MSG_INF(md_id, "ctl", "receive invalid MD_EX_REC_OK\n"); - else - { - spin_lock_irqsave(&ctl_b->ctl_lock, flags); - ctl_b->ee_info_flag |= ((1<ee_info_flag & (1<ee_info_flag |= (1<ee_info_flag &= ~(1<md_boot_stage = MD_BOOT_STAGE_EXCEPTION; - ctl_b->need_reload_image = 1; - need_update_state = 1; - } - spin_unlock_irqrestore(&ctl_b->ctl_lock, flags); - - if(need_update_state) { - md_call_chain(&ctl_b->md_notifier,CCCI_MD_EXCEPTION); - del_timer(&ctl_b->md_boot_up_check_timer); - } - //atomic_set(&ctl_b->md_ex_ok, 1); - mod_timer(&ctl_b->md_ex_monitor,jiffies); - } - } - else if (msg.id == MD_INIT_START_BOOT && - msg.reserved == MD_INIT_CHK_ID && !ctl_b->is_first_boot) - { - /* reset state and notify the user process md_init */ - //set_curr_md_state(md_id, MD_BOOT_STAGE_0); - ctl_b->md_boot_stage = MD_BOOT_STAGE_0; - CCCI_MSG_INF(md_id, "ctl", "MD second bootup detected!\n"); - - ccci_system_message(md_id, CCCI_MD_MSG_RESET, 0); - } - else if (msg.id == MD_EX_RESUME_CHK_ID) - { - md_emi_check(md_id, &msg, &debug_info); - ccci_ee_info_dump(md_id, &debug_info); - } - else if (msg.id == CCCI_DRV_VER_ERROR) - { - CCCI_MSG_INF(md_id, "ctl", "AP CCCI driver version mis-match to MD!!\n"); - ctl_b->stop_retry_boot_md = 1; - ccci_aed(md_id, 0, "AP/MD driver version mis-match\n"); - } - else - { - CCCI_MSG_INF(md_id, "ctl", "receive unknow data from CCCI_CONTROL_RX = %d\n", msg.id); - } - } -} - - -/****************************************************************************/ -/* modem boot up function */ -/* return 0 for success; return negative values for failure */ -/****************************************************************************/ -static int boot_md(int md_id) -{ - int ret=0; - md_ctl_block_t *ctl_b; - char err_str[256]; - - CCCI_MSG_INF(md_id, "ctl", "boot md%d\n", md_id+1); - if(md_id >= get_md_sys_max_num()) { - return -CCCI_ERR_INVALID_PARAM; - } - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - if (ctl_b->md_boot_stage != MD_BOOT_STAGE_0) { - CCCI_MSG_INF(md_id, "ctl", "MD has boot up!\n"); - return 0; - } - - CCCI_MSG_INF(md_id, "ctl", "booting up MODEM: start to load firmware...\n"); - - // Step 1, load image - if(ctl_b->is_first_boot) { - if((ret = ccci_load_firmware(md_id, LOAD_ALL_IMG, err_str, 256)) <0) { - CCCI_MSG_INF(md_id, "ctl", "load firmware fail, so modem boot fail!\n"); - ccci_aed(md_id, 0, err_str); - return ret; - } else { - //when load firmware successfully, no need to load it again when reset modem - ctl_b->is_first_boot = 0; - CCCI_MSG_INF(md_id, "ctl", "load firmware successful!\n"); - } - } else { - CCCI_MSG_INF(md_id, "ctl", "modem&dsp firmware already exist, not load again!\n"); - } - - // Step 2.1, register md control call back function - ret = register_to_logic_ch(md_id ,CCCI_CONTROL_RX, ccci_md_ctrl_cb, ctl_b); - if (ret != 0 ) { - CCCI_MSG_INF(md_id, "ctl", "register CCCI_CONTROL_RX fail\n"); - un_register_to_logic_ch(0, CCCI_CONTROL_TX); - return ret; - } - - // Step 2.2, register md control call back function - ret = register_to_logic_ch(md_id ,CCCI_SYSTEM_RX, ccci_sys_rx_dispatch_cb, NULL); - if (ret != 0 ) { - CCCI_MSG_INF(md_id, "ctl", "register CCCI_SYSTEM_RX fail\n"); - un_register_to_logic_ch(0, CCCI_SYSTEM_RX); - return ret; - } - - // Step 3, register MD wdt call back. - ccci_md_wdt_notify_register(md_id, send_md_reset_notify); - - // Step 4, power on modem - ccci_power_on_md(md_id); - - // Step 5, register md intr - ccci_hal_irq_register(md_id); - - // step 6, start modem */ - ccci_start_modem(md_id); - - return ret; -} - - -static ssize_t boot_md_show(char *buf) -{ - int md_num = get_md_sys_max_num(); - int i; - int curr=0; - - for(i=0; imd_boot_stage); - } - - return curr; -} - -static ssize_t boot_md_store(const char *buf, size_t count) -{ - md_ctl_block_t *ctl_b; - int md_id; - - if(buf[0] == '0') { - md_id = 0; - } else if(buf[0] == '1') { - md_id = 1; - } else { - //md_id = 100; - CCCI_MSG("[Error] invalid md sys id: %d\n", buf[0]); - return 0; - } - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - CCCI_MSG_INF(md_id, "ctl", "[Error]md ctlb is null\n"); - return 0; - } - - mutex_lock(&ctl_b->ccci_md_boot_mutex); - - if (ctl_b->md_boot_stage == MD_BOOT_STAGE_0) { - //CCCI_MSG_INF(md_id, "ctl", "Boot MD sys %d\n", md_id+1); - boot_md(md_id); - } else { - CCCI_MSG_INF(md_id, "ctl", "MD already in boot stage %d\n", ctl_b->md_boot_stage); - } - - mutex_unlock(&ctl_b->ccci_md_boot_mutex); - - return count; -} - - -/****************************************************************************/ -/* API for IPO feature */ -/* */ -/****************************************************************************/ -int ccci_ipo_h_restore(int md_id, char buf[], unsigned int len) -{ - md_ctl_block_t *ctl_b; - - ctl_b = md_ctlb[md_id]; - if(ctl_b == NULL) { - return -CCCI_ERR_FATAL_ERR; - } - - // 1. Restore memory re-mapping/MD env/WDT irq - if(ccci_ipo_h_platform_restore(md_id) <0 ) { - printk("[ccci/ctl] IPO-H p1 fail\n"); - return -CCCI_IPO_H_RESTORE_FAIL; - } - //md_dsp_wdt_irq_dis(md_id); - - // 2. Restore share memory - // Clear all share memory to zero - CCCI_DBG_MSG(md_id, "ctl", "IPO-H: SMEM add:0x%08x, size:%d\n", \ - ctl_b->smem_table->ccci_smem_vir, ctl_b->smem_table->ccci_smem_size); - memset((void*)ctl_b->smem_table->ccci_smem_vir, 0, ctl_b->smem_table->ccci_smem_size); - // 2-1 UART - if(ccci_uart_ipo_h_restore(md_id)<0) - return -CCCI_IPO_H_RESTORE_FAIL; - // 2-2 IPC - if(ccci_ipc_ipo_h_restore(md_id)<0) - return -CCCI_IPO_H_RESTORE_FAIL; - // 2-3 CCMNI - if(ccmni_ipo_h_restore(md_id)<0) - return -CCCI_IPO_H_RESTORE_FAIL; - - // 3. Set flag to reload image - ctl_b->ipo_h_restore = 1; - - // 4. Re-init CCIF - ccci_hal_reset(md_id); - - // 5. Re register CCIF interrupt - //ccci_hal_irq_register(md_id); - //ccci_disable_md_intr(md_id); - - // 6. Power on MD - ccci_power_on_md(md_id); - - return 0; - -} - - -/****************************************************************************/ -/* modem control initial function */ -/* */ -/****************************************************************************/ -int ccci_md_ctrl_init(int md_id) -{ - int ret; - md_ctl_block_t *ctlb; - - // Allocate md ctrl struct memory - ctlb = (md_ctl_block_t *)kmalloc(sizeof(md_ctl_block_t), GFP_KERNEL); - if(ctlb == NULL) - return -CCCI_ERR_GET_MEM_FAIL; - - // Init control struct - memset(ctlb, 0, sizeof(md_ctl_block_t)); - mutex_init(&ctlb->ccci_md_boot_mutex); - mutex_init(&ctlb->ccci_reset_mutex); - spin_lock_init(&ctlb->md_notifier.lock); - ctlb->md_notifier.next=NULL; - tasklet_init(&ctlb->md_notifier.tasklet, notify_chain, (unsigned long)ctlb); - - ctlb->md_boot_stage = MD_BOOT_STAGE_0; - ctlb->is_first_boot = 1; - ctlb->md_ex_type = 0; - ctlb->need_reload_image = 0; - ctlb->img_inf_ready = 0; - ctlb->stop_retry_boot_md = 0; - ctlb->image_type = 0; - ctlb->reboot_reason = 0; - ctlb->ipo_h_restore = 0; - ctlb->smem_table = get_md_smem_layout(md_id); - if(ctlb->smem_table == NULL) { - ret = -CCCI_ERR_GET_SMEM_SETTING_FAIL; - goto _GET_SMEM_SETTING_FAIL; - } - ctlb->md_layout = get_md_sys_layout(md_id); - if(ctlb->md_layout == NULL) { - ret = -CCCI_ERR_GET_MEM_LAYOUT_FAIL; - goto _GET_SMEM_SETTING_FAIL; - } - snprintf(ctlb->wakelock_name, sizeof(ctlb->wakelock_name), "ccci%d_trm", (md_id+1)); - wake_lock_init(&ctlb->trm_wake_lock, WAKE_LOCK_SUSPEND, ctlb->wakelock_name); - - // Timer init - init_timer(&ctlb->md_ex_monitor); - ctlb->md_ex_monitor.function = ex_monitor_func; - ctlb->md_ex_monitor.data = (unsigned long)ctlb; - init_timer(&ctlb->md_boot_up_check_timer); - ctlb->md_boot_up_check_timer.function = md_boot_up_timeout_func; - ctlb->md_boot_up_check_timer.data = (unsigned long)ctlb; - - spin_lock_init(&ctlb->ctl_lock); - ctlb->ee_info_got = 0; - ctlb->ee_info_flag = 0; - - ctlb->m_md_id = md_id; - md_ctlb[md_id] = ctlb; - - //register lock/unlock modem dormant mode when AP suspend&resume - //register_resume_notify(md_id, RSM_ID_MD_LOCK_DORMANT, lock_md_dormant); - //register_suspend_notify(md_id, SLP_ID_MD_UNLOCK_DORMANT, unlock_md_dormant); - #ifdef ENABLE_MD_WAKE_UP - register_resume_notify(md_id, RSM_ID_WAKE_UP_MD, wakeup_md); - #endif - - //register fast dormancy function as ccci kernel func and suspend callback - register_ccci_kern_func_by_md_id(md_id, ID_CCCI_DORMANCY, ccci_dormancy); - register_suspend_notify(md_id, SLP_ID_MD_FAST_DROMANT, md_fast_dormancy); - - //md send msg before it trigger watdog timeout irq - register_ccci_sys_call_back(md_id, MD_WDT_MONITOR, md_wdt_monitor); - - //send info to md by system channel - register_sys_msg_notify_func(md_id, send_ccci_system_ch_msg); - - //print the name of get wake up source of CCIF_MD when AP wake up - register_ccci_kern_func_by_md_id(md_id, ID_GET_MD_WAKEUP_SRC, get_md_wakeup_src); - - //register call back function in isr and no physical channel to check if md ex happens - bind_to_low_layer_notify(md_id, ccif_isr_check, ccci_check_md_no_physical_channel); - - //md get AP battery voltage by send system rx msg - register_ccci_sys_call_back(md_id, MD_GET_BATTERY_INFO, md_get_battery_info); - - //md set sim type by send system rx msg - register_ccci_sys_call_back(md_id, MD_SIM_TYPE, md_set_sim_type); - - // register IPO-H call back - register_ccci_kern_func_by_md_id(md_id, ID_IPO_H_RESTORE_CB, ccci_ipo_h_restore); - - register_ccci_kern_func_by_md_id(md_id, ID_FORCE_MD_ASSERT, ccci_force_md_assert); - - //Clear all share memory to zero - memset((void*)ctlb->smem_table->ccci_smem_vir, 0, ctlb->smem_table->ccci_smem_size); - - return 0; - -_GET_SMEM_SETTING_FAIL: - kfree(ctlb); - return ret; -} - - -int ccci_md_ctrl_common_init(void) -{ - register_filter_func("-l", ccci_msg_filter_store, ccci_msg_filter_show); - register_filter_func("-c", ccci_ch_filter_store, ccci_ch_filter_show); - // MUST register callbacks after memory is allocated - //boot_register_md_func(boot_md_show, boot_md_store); - - register_ccci_attr_func("boot", boot_md_show, boot_md_store); - return 0; -} - -/* - * ccci_md_ctrl_exit - */ -void ccci_md_ctrl_exit(int md_id) -{ - md_ctl_block_t *ctlb = md_ctlb[md_id]; - - if (ctlb == NULL) - return; - wake_lock_destroy(&ctlb->trm_wake_lock); - del_timer(&ctlb->md_boot_up_check_timer); - del_timer(&ctlb->md_boot_up_check_timer); - //ccci_free_smem(md_id); - tasklet_kill(&ctlb->md_notifier.tasklet); - kfree(ctlb); - md_ctlb[md_id] = NULL; -} - - diff --git a/drivers/misc/mediatek/dual_ccci/ccci_mk_node.c b/drivers/misc/mediatek/dual_ccci/ccci_mk_node.c deleted file mode 100644 index ec067bb84c1..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_mk_node.c +++ /dev/null @@ -1,540 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -typedef struct _ccci_node -{ - char *name; - char *type; - int idx; - int ext_num; -}ccci_node_t; - -typedef struct _ccci_node_type -{ - char *type; - int major; - int minor_start; - int range; -}ccci_node_type_t; - -typedef struct _ccci_node_type_table -{ - int major; - ccci_node_type_t array[CCCI_NODE_TYPE_NUM]; -}ccci_node_type_table_t; - -static ccci_node_t ccci1_node_list[] = { - //{"ccci_sys_rx", "std chr", 2, 0}, - //{"ccci_sys_tx", "std chr", 3, 0}, - {"ccci_pcm_rx", "std chr", 4, 0}, - {"ccci_pcm_tx", "std chr", 5, 0}, - {"ccci_uem_rx", "std chr", 18, 0}, - {"ccci_uem_tx", "std chr", 19, 0}, - {"ccci_md_log_rx", "std chr", 42, 0}, - {"ccci_md_log_tx", "std chr", 43, 0}, -#ifdef CONFIG_MTK_ICUSB_SUPPORT - {"ttyC", "tty", 0, 4}, -#else - {"ttyC", "tty", 0, 3}, -#endif - {"ccci_ipc_1220_0", "ipc", 0, 0}, //used by AGPS - {"ccci_ipc_2", "ipc", 2, 0}, //used by GPS - - {"ccci_fs", "fs", 0, 0}, -#if defined(CONFIG_MTK_TC1_FEATURE) - {"ccci_rpc", "rpc", 0, 0}, -#endif - {"ccci_monitor", "vir chr", 0, 0}, - {"ccci_ioctl", "vir chr", 1, 5}, -}; - -static ccci_node_t ccci2_node_list[] = { - //{"ccci2_sys_rx", "std chr", 2, 0}, - //{"ccci2_sys_tx", "std chr", 3, 0}, - {"ccci2_pcm_rx", "std chr", 4, 0}, - {"ccci2_pcm_tx", "std chr", 5, 0}, - {"ccci2_uem_rx", "std chr", 18, 0}, - {"ccci2_uem_tx", "std chr", 19, 0}, - {"ccci2_md_log_rx", "std chr", 42, 0}, - {"ccci2_md_log_tx", "std chr", 43, 0}, - -#ifdef CONFIG_MTK_ICUSB_SUPPORT - {"ccci2_tty", "tty", 0, 4}, -#else - {"ccci2_tty", "tty", 0, 3}, -#endif - - {"ccci2_ipc_", "ipc", 0, 1}, - - {"ccci2_fs", "fs", 0, 0}, -#if defined(CONFIG_MTK_TC1_FEATURE) - {"ccci2_rpc", "rpc", 0, 0}, -#endif - - {"ccci2_monitor", "vir chr", 0, 0}, - {"ccci2_ioctl", "vir chr", 1, 5}, -}; - -static ccci_node_type_table_t ccci_node_type_table[MAX_MD_NUM]; -static void *dev_class = NULL; - - -static void init_ccci_node_type_table(void) -{ - int i; - int curr = 0; - int major; - ccci_node_type_table_t *curr_table = NULL; - - memset(ccci_node_type_table, 0, sizeof(ccci_node_type_table)); - - for(i = 0; i < MAX_MD_NUM; i++){ - major = get_dev_major_for_md_sys(i); - curr_table = &ccci_node_type_table[i]; - curr = 0; - if(major < 0) - continue; - - curr_table->major = major; - - curr_table->array[0].type = "std chr"; - curr_table->array[0].major = major; - curr_table->array[0].minor_start = curr; - curr_table->array[0].range = STD_CHR_DEV_NUM; - curr += STD_CHR_DEV_NUM; - - curr_table->array[1].type = "ipc"; - curr_table->array[1].major = major; - curr_table->array[1].minor_start = curr; - curr_table->array[1].range = IPC_DEV_NUM; - curr += IPC_DEV_NUM; - - curr_table->array[2].type = "fs"; - curr_table->array[2].major = major; - curr_table->array[2].minor_start = curr; - curr_table->array[2].range = FS_DEV_NUM; - curr += FS_DEV_NUM; - - curr_table->array[3].type = "vir chr"; - curr_table->array[3].major = major; - curr_table->array[3].minor_start = curr; - curr_table->array[3].range = VIR_CHR_DEV_NUM; - curr += VIR_CHR_DEV_NUM; - - curr_table->array[4].type = "tty"; - curr_table->array[4].major = major; - curr_table->array[4].minor_start = curr; - curr_table->array[4].range = TTY_DEV_NUM; - curr += TTY_DEV_NUM; - -#if defined(CONFIG_MTK_TC1_FEATURE) - curr_table->array[5].type = "rpc"; - curr_table->array[5].major = major; - curr_table->array[5].minor_start = curr; - curr_table->array[5].range = RPC_DEV_NUM; - curr += RPC_DEV_NUM; -#endif - } -} - - -int get_md_id_by_dev_major(int dev_major) -{ - int i ; - - for(i = 0; i < MAX_MD_NUM; i++){ - if(ccci_node_type_table[i].major == dev_major) - return i; - } - - return -1; -} - - -int get_dev_id_by_md_id(int md_id, char node_name[], int *major, int* minor) -{ - int i; - ccci_node_type_table_t *curr_table = NULL; - - curr_table = &ccci_node_type_table[md_id]; - - for(i = 0; i < CCCI_NODE_TYPE_NUM; i++) { - if(curr_table->array[i].type == NULL) - break; - if(strcmp(curr_table->array[i].type, node_name) == 0) { - if(major != NULL) - *major = curr_table->array[i].major; - if(minor != NULL) - *minor = curr_table->array[i].minor_start; - return 0; - } - } - - return -1; -} - - -/*************************************************************************** - * Make device node helper function section - ***************************************************************************/ -static void* create_dev_class(struct module *owner, const char *name) -{ - int err = 0; - - struct class *dev_class = class_create(owner, name); - if(IS_ERR(dev_class)){ - err = PTR_ERR(dev_class); - CCCI_MSG("create %s class fail: %d\n", name, err); - return NULL; - } - - return dev_class; -} - - -static int register_dev_node(void *dev_class, const char *name, int major_id, int minor_start_id, int index) -{ - int ret = 0; - dev_t dev; - struct device *devices; - - if(index >= 0) { - dev = MKDEV(major_id, minor_start_id) + index; - devices = device_create( (struct class *)dev_class, NULL, dev, NULL, "%s%d", name, index ); - } else { - dev = MKDEV(major_id, minor_start_id); - devices = device_create( (struct class *)dev_class, NULL, dev, NULL, "%s", name ); - } - - if(IS_ERR(devices)) { - ret = PTR_ERR(devices); - } - - return ret; -} - - - -static void release_dev_node(void *dev_class, int major_id, int minor_start_id, int index) -{ - dev_t dev; - - if(index >= 0) { - dev = MKDEV(major_id, minor_start_id) + index; - device_destroy((struct class *)dev_class, dev); - } else { - dev = MKDEV(major_id, minor_start_id); - device_destroy((struct class *)dev_class, dev); - } -} - - - -/* ccci sysfs kobject */ -typedef struct ccci_info -{ - struct kobject kobj; - unsigned int ccci_attr_count; -}ccci_info_t; - -typedef struct ccci_attribute -{ - struct attribute attr; - ssize_t (*show)(char *buf); - ssize_t (*store)(const char *buf, size_t count); -}ccci_attribute_t; - -#define CCCI_ATTR(_name, _mode, _show, _store) \ - ccci_attribute_t ccci_attr_##_name = { \ - .attr = {.name = __stringify(_name), .mode = _mode }, \ - .show = _show, \ - .store = _store, \ -} - -/* common func declare */ -void ccci_attr_release(struct kobject *kobj); -ssize_t ccci_attr_show(struct kobject *kobj, struct attribute *attr, char *buf); -ssize_t ccci_attr_store(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count); - - -/* private func declear of specific attr */ -//ssize_t show_attr_boot(char *buf); -//ssize_t store_attr_boot(const char *buf, size_t count); - -ssize_t show_attr_md1_postfix(char *buf); -ssize_t show_attr_md2_postfix(char *buf); -ssize_t show_attr_version(char *buf) -{ - return snprintf(buf, 16, "%d\n", 2); // hardcode -} - -/* global vars */ -static ccci_info_t *ccci_sys_info = NULL; -struct sysfs_ops ccci_sysfs_ops = { - .show = ccci_attr_show, - .store = ccci_attr_store -}; - -CCCI_ATTR(boot, 0660, NULL, NULL); -CCCI_ATTR(modem_info, 0644, NULL, NULL); -CCCI_ATTR(md1_postfix, 0644, show_attr_md1_postfix, NULL); -CCCI_ATTR(md2_postfix, 0644, show_attr_md2_postfix, NULL); -CCCI_ATTR(version, 0644, show_attr_version, NULL); - -struct attribute *ccci_default_attrs[] = { - &ccci_attr_boot.attr, - &ccci_attr_modem_info.attr, - &ccci_attr_md1_postfix.attr, - &ccci_attr_md2_postfix.attr, - &ccci_attr_version.attr, - NULL -}; - -struct kobj_type ccci_ktype = { - .release = ccci_attr_release, - .sysfs_ops = &ccci_sysfs_ops, - .default_attrs = ccci_default_attrs -}; - -/* common func implement */ -ssize_t ccci_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) -{ - ssize_t len = 0; - ccci_attribute_t *a = container_of(attr, ccci_attribute_t, attr); - - if (a->show) - { - len = a->show(buf); - } - - return len; -} - -ssize_t ccci_attr_store(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count) -{ - ssize_t len = 0; - ccci_attribute_t *a = container_of(attr, ccci_attribute_t, attr); - - if (a->store) - { - len = a->store(buf, count); - } - - return len; -} - -void ccci_attr_release(struct kobject *kobj) -{ - ccci_info_t *ccci_info_temp = container_of(kobj, ccci_info_t, kobj); - kfree(ccci_info_temp); - ccci_sys_info = NULL; -} - - -/* private func implement */ -#if 0 -ssize_t show_attr_boot(char *buf) -{ - sprintf(buf, "show ccci info success\n"); - - CCCI_MSG("show_attr_boot!\n"); - - return strlen(buf); -} - -ssize_t store_attr_boot(const char *buf, size_t count) -{ - int test = 0; - sscanf(buf, "%d", &test); - - CCCI_MSG("store_attr_boot!\n", test); - return strlen(buf); -} -#endif - -ssize_t show_attr_md1_postfix(char *buf) -{ - get_md_post_fix(MD_SYS1, buf, NULL); - - CCCI_MSG("md1: %s\n", buf); - - return strlen(buf); -} - -ssize_t show_attr_md2_postfix(char *buf) -{ - get_md_post_fix(MD_SYS2, buf, NULL); - - CCCI_MSG("md2: %s\n", buf); - - return strlen(buf); -} - - -int register_ccci_attr_func(const char *buf, ssize_t (*show)(char*), ssize_t (*store)(const char*,size_t)) -{ - int i = 0; - ccci_attribute_t *ccci_attr_temp = NULL; - - while(ccci_default_attrs[i]) - { - if (!strncmp(ccci_default_attrs[i]->name, buf, strlen(ccci_default_attrs[i]->name))) { - ccci_attr_temp = container_of(ccci_default_attrs[i], ccci_attribute_t, attr); - break; - } - i++; - } - if (ccci_attr_temp) { - ccci_attr_temp->show = show; - ccci_attr_temp->store = store; - return 0; - } else { - CCCI_MSG("fail to register ccci attibute!\n"); - return -1; - } -} - - - -#define CCCI_KOBJ_NAME "ccci" -extern struct kobject *kernel_kobj; -int ccci_attr_install(void) -{ - int ret = 0; - - ccci_sys_info = kmalloc(sizeof(ccci_info_t), GFP_KERNEL); - if (!ccci_sys_info) - return -ENOMEM; - - memset(ccci_sys_info, 0, sizeof(ccci_info_t)); - - ret = kobject_init_and_add(&ccci_sys_info->kobj, &ccci_ktype, kernel_kobj, CCCI_KOBJ_NAME); - if (ret < 0) { - kobject_put(&ccci_sys_info->kobj); - CCCI_MSG("fail to add ccci kobject in kernel\n"); - return ret; - } - - ccci_sys_info->ccci_attr_count = sizeof(*ccci_default_attrs)/sizeof(struct attribute); - - return ret; - -} - - -int init_ccci_dev_node(void) -{ - int ret = 0; - init_ccci_node_type_table(); - - // Make device class - dev_class = create_dev_class(THIS_MODULE, "ccci_node"); - if(dev_class == NULL) - return -1; - - ret = ccci_attr_install(); - - return ret; -} - - -void release_ccci_dev_node(void) -{ - if (dev_class) - class_destroy((struct class *)dev_class); - - if (ccci_sys_info) { - if (&ccci_sys_info->kobj) - kobject_put(&ccci_sys_info->kobj); - - kfree(ccci_sys_info); - ccci_sys_info = NULL; - } -} - - -int mk_ccci_dev_node(int md_id) -{ - int i, j, major, minor, num; - ccci_node_t *dev_node; - int ret = 0; - - if (md_id == MD_SYS1) { - dev_node = ccci1_node_list; - num = sizeof(ccci1_node_list)/sizeof(ccci_node_t); - } else if (md_id == MD_SYS2) { - dev_node = ccci2_node_list; - num = sizeof(ccci2_node_list)/sizeof(ccci_node_t); - } else { - return -1; - } - - for(i = 0; i < num; i++) { - if(get_dev_id_by_md_id(md_id, dev_node[i].type, &major, &minor) < 0) - break; - - minor = minor + dev_node[i].idx; - if(dev_node[i].ext_num == 0) { - ret = register_dev_node(dev_class, dev_node[i].name, major, minor, -1); - if(ret < 0) - CCCI_MSG_INF(md_id, "cci", "create %s device fail: %d\n", dev_node[i].name, ret); - } else { - for(j = 0; j < dev_node[i].ext_num; j++) { - ret = register_dev_node(dev_class, dev_node[i].name, major, minor, j); - if(ret < 0) { - CCCI_MSG_INF(md_id, "cci", "create %s device fail: %d\n", dev_node[i].name, ret); - return ret; - } - } - } - } - - return ret; -} - - -void ccci_dev_node_exit(int md_id) -{ - int i, j, major, minor, num; - ccci_node_t *dev_node; - - if (md_id == MD_SYS1) { - dev_node = ccci1_node_list; - num = sizeof(ccci1_node_list)/sizeof(ccci_node_t); - } else if (md_id == MD_SYS2) { - dev_node = ccci2_node_list; - num = sizeof(ccci2_node_list)/sizeof(ccci_node_t); - } else { - return; - } - - for(i = 0; i < num; i++) { - if(get_dev_id_by_md_id(md_id, dev_node[i].type, &major, &minor) < 0) - break; - - minor = minor + dev_node[i].idx; - if(dev_node[i].ext_num == 0) { - release_dev_node(dev_class, major, minor, -1); - } else { - for(j = 0; j < dev_node[i].ext_num; j++) - release_dev_node(dev_class, major, minor, j); - } - } -} - - - diff --git a/drivers/misc/mediatek/dual_ccci/ccci_pmic.c b/drivers/misc/mediatek/dual_ccci/ccci_pmic.c deleted file mode 100644 index aaa94a3592e..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_pmic.c +++ /dev/null @@ -1,335 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_pmic.c - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * MT65XX CCCI PMIC Driver - * - ****************************************************************************/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -typedef enum -{ - VSIM_1_3V = 0, - VSIM_1_5V, - VSIM_1_8V, - VSIM_2_5V, - VSIM_2_8V, - VSIM_3_0V, - VSIM_3_3V, - VSIM_1_2V -}vsim_sel_enum; - - -#define CONFIG_CCCI_PMIC_DEBUG_MSG -#define CCCI_PMIC_DEVNAME "ccci_pmic" -#define CCCI_PMIC_QSIZE (10) - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)) -static spinlock_t pmic_spinlock = SPIN_LOCK_UNLOCKED; -#else -static DEFINE_SPINLOCK(pmic_spinlock); -#endif - -static shared_mem_pmic_t *ccci_pmic_shared_mem; -static int ccci_pmic_shared_mem_phys_addr; - -static dev_t pmic_dev_num; -static struct cdev pmic_cdev; -static struct kfifo pmic_fifo; - -static void ccci_pmic_read(struct work_struct *ws); -static DECLARE_WORK (ccci_pmic_read_work, ccci_pmic_read); - -int g_VSIM_1 = 2; -int g_VSIM_2 = 2; - -static void ccci_pmic_read(struct work_struct *ws) -{ - unsigned long exec_time_1=0, exec_time_2=0; - unsigned long arg; - unsigned long flag; - // mt6326_check_power(); - - /* - * 0. Start Timer - */ - // exec_time_1 = sampletrigger(0, 0, 0); - exec_time_1 = 0; - - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("************* ccci_pmic_callback : exec_time_1 = %ld ms\r\n", exec_time_1); - CCCI_PMIC_MSG("ccci_pmic_callback : exec_time_1 = %ld ms\r\n", exec_time_1); - //#endif - - /* - * 1. Parsing CCCI Message Format which received from MD site - */ - spin_lock_irqsave(&pmic_spinlock,flag); - if (kfifo_out(&pmic_fifo, (unsigned char *) &arg, sizeof(unsigned long)) != sizeof(unsigned long)) - { - spin_unlock_irqrestore(&pmic_spinlock,flag); - CCCI_MSG("Unable to get new request from fifo\n"); - return; - } - spin_unlock_irqrestore(&pmic_spinlock,flag); - ccci_pmic_shared_mem->ccci_msg.pmic6326_op = arg & 0x000000FF; - ccci_pmic_shared_mem->ccci_msg.pmic6326_type = (arg & 0x0000FF00) >> 8; - ccci_pmic_shared_mem->ccci_msg.pmic6326_param1 = (arg & 0x00FF0000) >> 16; - ccci_pmic_shared_mem->ccci_msg.pmic6326_param2 = (arg & 0xFF000000) >> 24; - - /* - * 2. Execute the operation (API) that MD site called - */ - switch(ccci_pmic_shared_mem->ccci_msg.pmic6326_op) - { - case PMIC6326_VSIM_ENABLE : - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("ccci_pmic_callback : PMIC6326_VSIM_ENABLE\n"); - CCCI_PMIC_MSG("PMIC6326_VSIM_ENABLE\n"); - //#endif - //pmic_vsim_enable(ccci_pmic_shared_mem->ccci_msg.pmic6326_param1); - - break; - - case PMIC6326_VSIM_SET_AND_ENABLE : - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("ccci_pmic_callback : PMIC6326_VSIM_SET_AND_ENABLE\n"); - CCCI_PMIC_MSG("PMIC6326_VSIM_SET_AND_ENABLE\n"); - //#endif - //pmic_vsim_cal(0); - //pmic_vsim_sel(ccci_pmic_shared_mem->ccci_msg.pmic6326_param1); - //pmic_vsim_enable(KAL_TRUE); - - break; - - case PMIC6236_LOCK : - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("ccci_pmic_callback : PMIC6236_LOCK\n"); - CCCI_PMIC_MSG("PMIC6236_LOCK\n"); - //#endif - break; - - case PMIC6326_UNLOCK : - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("ccci_pmic_callback : PMIC6326_UNLOCK\n"); - CCCI_PMIC_MSG("CONFIG_CCCI_PMIC_DEBUG_MSG\n"); - //#endif - break; - - case PMIC6326_VSIM2_ENABLE : - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("ccci_pmic_callback : PMIC6326_VSIM2_ENABLE\n"); - CCCI_PMIC_MSG("PMIC6326_VSIM2_ENABLE\n"); - //#endif - //pmic_vsim2_enable(ccci_pmic_shared_mem->ccci_msg.pmic6326_param1); - - break; - - case PMIC6326_VSIM2_SET_AND_ENABLE : - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("ccci_pmic_callback : PMIC6326_VSIM2_SET_AND_ENABLE\n"); - CCCI_PMIC_MSG("PMIC6326_VSIM2_SET_AND_ENABLE\n"); - //#endif - //pmic_vsim2_sel(ccci_pmic_shared_mem->ccci_msg.pmic6326_param1); - //pmic_vsim2_enable(KAL_TRUE); - - break; - - default : - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("ccci_pmic_callback : ERROR op !\n"); - CCCI_PMIC_MSG("Error op\n"); - //#endif - } - - - // exec_time_2 = sampletrigger(0, 0, 1); - exec_time_2 = 10000; - - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("************* ccci_pmic_callback : exec_time_2 = %ld ms\r\n", exec_time_2); - CCCI_PMIC_MSG("exec_time_2 = %ld ms\r\n", exec_time_2); - //#endif - - exec_time_2 = (exec_time_2 - exec_time_1)/1000; - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("************* ccci_pmic_callback : exec_time = %ld ms\r\n", exec_time_2); - CCCI_PMIC_MSG("exec_time = %ld ms\r\n", exec_time_2); - //#endif - - /* - * 3. AP site write Message to share memory "ccci_pmic_shared_mem" - */ - ccci_pmic_shared_mem->ccci_msg.pmic6326_type = (kal_uint8)PMIC6326_RES; - ccci_pmic_shared_mem->ccci_msg_info.pmic6326_exec_time = exec_time_2; - - ccci_pmic_shared_mem->ccci_msg = ccci_pmic_shared_mem->ccci_msg; - ccci_pmic_shared_mem->ccci_msg_info = ccci_pmic_shared_mem->ccci_msg_info; - - /* - * 4. Inform AP CCCI driver - */ - //ccci_write_mailbox(CCCI_PMIC_TX, 0); -} - - -static void ccci_pmic_callback(CCCI_BUFF_T *buff, void *private_data) -{ - unsigned long flag; - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("CCCI_PMIC: ccci_pmic_callback\n"); - CCCI_PMIC_MSG("callback++\n"); - //#endif - - spin_lock_irqsave(&pmic_spinlock,flag); - if (buff->channel == CCCI_PMIC_RX) - { - if (kfifo_in(&pmic_fifo, (unsigned char *) &buff->data[1], sizeof(unsigned long)) != sizeof(unsigned long)) - { - spin_unlock_irqrestore(&pmic_spinlock,flag); - //CCCI_LOGE("CCCI_PMIC: Unable to put new request into fifo\n"); - CCCI_PMIC_MSG("callback--0\n"); - return; - } - spin_unlock_irqrestore(&pmic_spinlock,flag); - schedule_work(&ccci_pmic_read_work); - } - CCCI_PMIC_MSG("callback--1\n"); -} - - -static int ccci_pmic_start(void) -{ - int size; - #if 0 - unsigned int i=0; - unsigned long exec_time_1=0, exec_time_2=0; - - /* Test Timer*/ - exec_time_1 = sampletrigger(0, 0, 0); - printk("************* ccci_pmic_callback : exec_time_1 = %ld ms\r\n", exec_time_1); - - for(i=0;i<1000;i++) - { - printk("************* "); - } - - exec_time_2 = sampletrigger(0, 0, 1); - printk("************* ccci_pmic_callback : exec_time_2 = %ld ms\r\n", exec_time_2); - - exec_time_2 = (exec_time_2 - exec_time_1)/1000; - printk("************* ccci_pmic_callback : exec_time = %ld ms\r\n", exec_time_2); - #endif - - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("CCCI_PMIC: ccci_pmic_start ****************************\n"); - CCCI_PMIC_MSG("ccci_pmic_start\n"); - //#endif - - if (0!= kfifo_alloc(&pmic_fifo,sizeof(unsigned long) * CCCI_PMIC_QSIZE, GFP_KERNEL)) - { - //CCCI_LOGE("CCCI_PMIC: Unable to create fifo\n"); - CCCI_MSG(" Unable to create fifo\n"); - return -EFAULT; - } - - //ASSERT(ccci_pmic_setup((int*)&ccci_pmic_shared_mem, &ccci_pmic_shared_mem_phys_addr, &size) == CCCI_SUCCESS); - //printk("CCCI PMIC %x:%x:%d\n", (unsigned int)ccci_pmic_shared_mem, (unsigned int)ccci_pmic_shared_mem_phys_addr, size); - CCCI_PMIC_MSG("%x:%x:%d\n", (unsigned int)ccci_pmic_shared_mem, (unsigned int)ccci_pmic_shared_mem_phys_addr, size); - //ASSERT(ccci_register(CCCI_PMIC_RX, ccci_pmic_callback, NULL) == CCCI_SUCCESS); - //ASSERT(ccci_register(CCCI_PMIC_TX, ccci_pmic_callback, NULL) == CCCI_SUCCESS); - - return 0; -} - -static void ccci_pmic_stop(void) -{ - //#ifdef CONFIG_CCCI_PMIC_DEBUG_MSG - //printk("CCCI_PMIC: ccci_pmic_stop ****************************\n"); - CCCI_PMIC_MSG("pmic_stop\n"); - //#endif - ccci_pmic_shared_mem = NULL; - ccci_pmic_shared_mem_phys_addr = 0; - //ASSERT(ccci_unregister(CCCI_PMIC_RX) == CCCI_SUCCESS); - //ASSERT(ccci_unregister(CCCI_PMIC_TX) == CCCI_SUCCESS); - - kfifo_free(&pmic_fifo); -} - -static struct file_operations pmic_fops = -{ - .owner = THIS_MODULE, - //.ioctl = ccci_pmic_ioctl, - //.open = ccci_pmic_open, - //.release = ccci_pmic_release, -}; - - int __init ccci_pmic_init(void) -{ - int ret; - - if (alloc_chrdev_region(&pmic_dev_num, 0, 1, CCCI_PMIC_DEVNAME)) - { - //printk(KERN_ERR "CCCI_PMIC: Device major number allocation failed\n"); - CCCI_MSG("Device major number allocation failed\n"); - return -EAGAIN; - } - - cdev_init(&pmic_cdev, &pmic_fops); - pmic_cdev.owner = THIS_MODULE; - ret = cdev_add(&pmic_cdev, pmic_dev_num, 1); - if (ret) - { - //printk(KERN_ERR "CCCI_PMIC: Char device add failed\n"); - CCCI_MSG("Char device add failed\n"); - return ret; - } - - ret = ccci_pmic_start(); - if (ret) - { - //printk(KERN_ERR "CCCI_PMIC: Unable to initialize environment\n"); - CCCI_MSG("Unable to initialize environment\n"); - return ret; - } - - //printk("CCCI_PMIC: Init complete, device major number = %d\n", MAJOR(pmic_dev_num)); - CCCI_PMIC_MSG("Init complete, device major number = %d\n", MAJOR(pmic_dev_num)); - - return 0; -} - - void __exit ccci_pmic_exit(void) -{ - ccci_pmic_stop(); - - cdev_del(&pmic_cdev); - unregister_chrdev_region(pmic_dev_num, 1); -} diff --git a/drivers/misc/mediatek/dual_ccci/ccci_rpc_main.c b/drivers/misc/mediatek/dual_ccci/ccci_rpc_main.c deleted file mode 100644 index 1e4c53910ee..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_rpc_main.c +++ /dev/null @@ -1,693 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_fs.c - * - * Project: - * -------- - * YuSu - * - * Description: - * ------------ - * MT6516 CCCI RPC - * - * Author: - * ------- - * - * - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/********************************************************************************* - * RPC Daemon section - *********************************************************************************/ -#if defined(CONFIG_MTK_TC1_FEATURE) - -typedef struct _rpc_stream_msg_t -{ - unsigned length; - unsigned index; -}rpc_stream_msg_t; - -static void rpc_daemon_notify(int md_id, unsigned int buff_index); - -#define RPC_CCCI_TC1_CMD 0x00003000 - -#define CCCI_RPC_IOC_MAGIC 'R' -#define CCCI_RPC_IOCTL_GET_INDEX _IO(CCCI_RPC_IOC_MAGIC, 1) -#define CCCI_RPC_IOCTL_SEND _IOR(CCCI_RPC_IOC_MAGIC, 2, unsigned int) -#endif /* CONFIG_MTK_TC1_FEATURE */ - -typedef struct test -{ - int op; - char buf[0]; -}test_t; - -typedef struct _rpc_ctl_block -{ - spinlock_t rpc_fifo_lock; - RPC_BUF *rpc_buf_vir; - unsigned int rpc_buf_phy; - unsigned int rpc_buf_len; - struct kfifo rpc_fifo; - struct work_struct rpc_work; - int m_md_id; - int rpc_smem_instance_size; - int rpc_max_buf_size; - int rpc_ch_num; - -#if defined(CONFIG_MTK_TC1_FEATURE) - spinlock_t rpc_daemon_fifo_lock; - struct kfifo rpc_daemon_fifo; - atomic_t rpcd_response_done; - wait_queue_head_t rpcd_send_waitq; - wait_queue_head_t rpcd_response_waitq; - - struct cdev rpc_cdev; - dev_t rpc_dev_num; - atomic_t md_is_ready; - MD_CALL_BACK_QUEUE md_status_update_call_back; - -#ifdef _DEBUG_RPCD - atomic_t rpcd_resp_indx; -#endif -#endif -}rpc_ctl_block_t; - -static rpc_ctl_block_t *rpc_ctl_block[MAX_MD_NUM]; - -extern void ccci_rpc_work_helper(int md_id, int *p_pkt_num, RPC_PKT pkt[], RPC_BUF *p_rpc_buf, unsigned int tmp_data[]); - -static int get_pkt_info(int md_id, unsigned int* pktnum, RPC_PKT* pkt_info, char* pdata) -{ - unsigned int pkt_num = *((unsigned int*)pdata); - unsigned int idx = 0; - unsigned int i = 0; - rpc_ctl_block_t *ctl_b = rpc_ctl_block[md_id]; - - CCCI_RPC_MSG(md_id, "package number = 0x%08X\n", pkt_num); - - if(pkt_num > IPC_RPC_MAX_ARG_NUM) - return -1; - - idx = sizeof(unsigned int); - for(i = 0; i < pkt_num; i++) - { - pkt_info[i].len = *((unsigned int*)(pdata + idx)); - idx += sizeof(unsigned int); - pkt_info[i].buf = (pdata + idx); - - CCCI_RPC_MSG(md_id, "pak[%d]: vir = 0x%08X, len = 0x%08X\n", i, \ - (unsigned int)pkt_info[i].buf, pkt_info[i].len); - - // 4 byte alignment - idx += ((pkt_info[i].len+3)>>2)<<2; - } - - if(idx > ctl_b->rpc_max_buf_size) - { - CCCI_MSG_INF(md_id, "rpc", "over flow, pdata = %p, idx = 0x%08X, max = %p\n", - pdata, idx, pdata + ctl_b->rpc_max_buf_size); - return -1; - } - *pktnum = pkt_num; - - return 0; -} - - -static int rpc_write(int md_id, int buf_idx, RPC_PKT* pkt_src, unsigned int pkt_num) -{ - int ret = 0; - ccci_msg_t msg; - RPC_BUF *rpc_buf_tmp = NULL; - unsigned char *pdata = NULL; - unsigned int data_len = 0; - unsigned int i = 0; - unsigned int AlignLength = 0; - rpc_ctl_block_t *ctl_b = rpc_ctl_block[md_id]; - - //rpc_buf_tmp = ctl_b->rpc_buf_vir + buf_idx; - rpc_buf_tmp = (RPC_BUF*)((unsigned int)(ctl_b->rpc_buf_vir) + ctl_b->rpc_smem_instance_size*buf_idx); - rpc_buf_tmp->op_id = IPC_RPC_API_RESP_ID | rpc_buf_tmp->op_id; - pdata = rpc_buf_tmp->buf; - *((unsigned int*)pdata) = pkt_num; - - pdata += sizeof(unsigned int); - data_len += sizeof(unsigned int); - - for(i = 0; i < pkt_num; i++) - { - if((data_len + 2*sizeof(unsigned int) + pkt_src[i].len) > ctl_b->rpc_max_buf_size) - { - CCCI_MSG_INF(md_id, "rpc", "Stream buffer full!!\n"); - ret = -CCCI_ERR_LARGE_THAN_BUF_SIZE; - goto _Exit; - } - - *((unsigned int*)pdata) = pkt_src[i].len; - pdata += sizeof(unsigned int); - data_len += sizeof(unsigned int); - - // 4 byte aligned - AlignLength = ((pkt_src[i].len + 3) >> 2) << 2; - data_len += AlignLength; - - if(pdata != pkt_src[i].buf){ - memcpy(pdata, pkt_src[i].buf, pkt_src[i].len); - } - else{ - CCCI_RPC_MSG(md_id, "same addr, no copy\n"); - } - - pdata += AlignLength; - } - - //msg.data0 = ctl_b->rpc_buf_phy + (sizeof(RPC_BUF) * buf_idx); - msg.data0 = (unsigned int)(ctl_b->rpc_buf_phy)-get_md2_ap_phy_addr_fixed() + ctl_b->rpc_smem_instance_size*buf_idx; - msg.data1 = data_len + 4; - msg.reserved = buf_idx; - msg.channel = CCCI_RPC_TX; - - CCCI_RPC_MSG(md_id, "Write, %08X, %08X, %08X, %08X\n", - msg.data0, msg.data1, msg.channel, msg.reserved); - - mb(); - ret = ccci_message_send(md_id, &msg, 1); - if(ret != sizeof(ccci_msg_t)) - { - CCCI_MSG_INF(md_id, "rpc", "fail send msg <%d>!!!\n", ret); - return ret; - } else { - ret = 0; - } - -_Exit: - return ret; -} - - -static void ccci_rpc_work(struct work_struct *work) -{ - int pkt_num = 0; - int ret_val = 0; - unsigned int buf_idx = 0; - RPC_PKT pkt[IPC_RPC_MAX_ARG_NUM] = { {0}, }; - RPC_BUF *rpc_buf_tmp = NULL; - unsigned int tmp_data[4]; - rpc_ctl_block_t *ctl_b = container_of(work, rpc_ctl_block_t, rpc_work); - int md_id= ctl_b->m_md_id; - - CCCI_RPC_MSG(md_id, "ccci_rpc_work++\n"); - - if(ctl_b->rpc_buf_vir == NULL) - { - CCCI_MSG_INF(md_id, "rpc", "invalid rpc_buf_vir!!\n"); - return; - } - - while(kfifo_out(&ctl_b->rpc_fifo, &buf_idx, sizeof(unsigned int))) - { - if(buf_idx < 0 || buf_idx > ctl_b->rpc_ch_num) - { - CCCI_MSG_INF(md_id, "rpc", "invalid idx %d\n", buf_idx); - ret_val = FS_PARAM_ERROR; // !!!!! Make more meaningful - pkt[pkt_num].len = sizeof(unsigned int); - pkt[pkt_num++].buf = (void*) &ret_val; - goto _Next; - } - - pkt_num = 0; - memset(pkt, 0x00, sizeof(RPC_PKT)*IPC_RPC_MAX_ARG_NUM); - - //rpc_buf_tmp = ctl_b->rpc_buf_vir + buf_idx; - rpc_buf_tmp = (RPC_BUF*)((unsigned int)(ctl_b->rpc_buf_vir) + ctl_b->rpc_smem_instance_size*buf_idx); - - if(get_pkt_info(md_id, &pkt_num, pkt, rpc_buf_tmp->buf) < 0) - { - CCCI_MSG_INF(md_id, "rpc", "Fail to get packet info\n"); - ret_val = FS_PARAM_ERROR; // !!!!! Make more meaningful - pkt[pkt_num].len = sizeof(unsigned int); - pkt[pkt_num++].buf = (void*) &ret_val; - goto _Next; - } - -#if defined(CONFIG_MTK_TC1_FEATURE) - if((rpc_buf_tmp->op_id & 0x0000F000) == RPC_CCCI_TC1_CMD) - { -#ifdef _DEBUG_RPCD - int resp_inx = atomic_read(&ctl_b->rpcd_resp_indx); - CCCI_DBG_MSG(ctl_b->m_md_id, "rpc", "op_id=0x%X, Wait RPCD [Resp=%d]\n", rpc_buf_tmp->op_id, resp_inx); -#endif - rpc_daemon_notify(md_id, buf_idx); - - wait_event_interruptible(ctl_b->rpcd_response_waitq, atomic_read(&ctl_b->rpcd_response_done)==1) ; - atomic_set(&ctl_b->rpcd_response_done, 0); -#ifdef _DEBUG_RPCD - CCCI_DBG_MSG(ctl_b->m_md_id, "rpc", "Done RPCD CMD [Resp=%d]\n", resp_inx); -#endif - continue; - } -#endif - CCCI_RPC_MSG(md_id, "call ccci_rpc_work_helper()\n"); - ccci_rpc_work_helper(md_id, &pkt_num, pkt, rpc_buf_tmp, tmp_data); // !!!!! Make more meaningful - -_Next: - if(rpc_write(md_id, buf_idx, pkt, pkt_num) != 0) - { - CCCI_MSG_INF(md_id, "rpc", "fail to write packet!!\r\n"); - return ; - } - } - - CCCI_RPC_MSG(md_id, "ccci_rpc_work--\n"); -} - - -static void ccci_rpc_callback(void *private) -{ - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - ccci_msg_t msg; - rpc_ctl_block_t *ctl_b = (rpc_ctl_block_t *)ch_info->m_owner; - int md_id = ctl_b->m_md_id; - - while(get_logic_ch_data(ch_info, &msg)){ - CCCI_RPC_MSG(md_id, "ccci_rpc_callback, %08X, %08X, %08X, %08X\n", - msg.data0, msg.data1, msg.channel, msg.reserved); - spin_lock_bh(&ctl_b->rpc_fifo_lock); - kfifo_in(&ctl_b->rpc_fifo, &msg.reserved, sizeof(unsigned int)); - spin_unlock_bh(&ctl_b->rpc_fifo_lock); - } - - schedule_work(&ctl_b->rpc_work); - CCCI_RPC_MSG(md_id, "ccci_rpc_callback --\n"); -} - -#if defined(CONFIG_MTK_TC1_FEATURE) -void rpc_daemon_notify(int md_id, unsigned int buff_index) -{ - rpc_ctl_block_t *ctl_b = rpc_ctl_block[md_id]; -#ifdef _DEBUG_RPCD - CCCI_RPC_MSG(md_id, "[CCCI_RPC] rpc_daemon_notify(%d) [Resp=%d]\n", buff_index, atomic_read(&ctl_b->rpcd_resp_indx)); -#endif - - spin_lock_bh(&ctl_b->rpc_daemon_fifo_lock); - kfifo_in(&ctl_b->rpc_daemon_fifo, &buff_index, sizeof(unsigned int)); - spin_unlock_bh(&ctl_b->rpc_daemon_fifo_lock); - wake_up_interruptible(&ctl_b->rpcd_send_waitq); -} - - - -static int rpc_get_share_mem_index(struct file *file) -{ - int ret; - rpc_ctl_block_t *ctl_b = (rpc_ctl_block_t *)file->private_data; - if(ctl_b== NULL){ - ASSERT(ctl_b!= NULL); - return -EFAULT; - } - -#ifdef _DEBUG_RPCD - atomic_inc(&ctl_b->rpcd_resp_indx); - CCCI_RPC_MSG(ctl_b->m_md_id, "get index start [Resp=%d]\n", atomic_read(&ctl_b->rpcd_resp_indx)); -#endif - - if (wait_event_interruptible(ctl_b->rpcd_send_waitq, kfifo_len(&ctl_b->rpc_daemon_fifo) != 0) != 0) - { - CCCI_MSG_INF(ctl_b->m_md_id, "rpc", "return rpc_get_share_mem_index():ERESTARTSYS\n"); - return -ERESTARTSYS; - } - - if (kfifo_out(&ctl_b->rpc_daemon_fifo, (unsigned int *) &ret, sizeof(int)) != sizeof(int)){ - CCCI_MSG_INF(ctl_b->m_md_id, "rpc", "Unable to get new request from fifo\n"); - return -EFAULT; - } - -#ifdef _DEBUG_RPCD - CCCI_RPC_MSG(ctl_b->m_md_id, "get index end [Resp=%d]\n", atomic_read(&ctl_b->rpcd_resp_indx)); -#endif - return ret; -} - -static void wakeup_rpc_work(rpc_ctl_block_t* ctl_b) -{ - CCCI_RPC_MSG(ctl_b->m_md_id, "wakeup rpc_work\n"); - atomic_set(&ctl_b->rpcd_response_done, 1); - wake_up_interruptible(&ctl_b->rpcd_response_waitq); -} - -static void ccci_rpc_resetfifo(rpc_ctl_block_t* ctl_b) -{ - ASSERT(ctl_b!=NULL); - - CCCI_MSG("(%d) ccci_rpc_resetfifo\n", ctl_b->m_md_id); - - spin_lock_bh(&ctl_b->rpc_fifo_lock); - kfifo_reset(&ctl_b->rpc_fifo); - spin_unlock_bh(&ctl_b->rpc_fifo_lock); - - spin_lock_bh(&ctl_b->rpc_daemon_fifo_lock); - kfifo_reset(&ctl_b->rpc_daemon_fifo); - spin_unlock_bh(&ctl_b->rpc_daemon_fifo_lock); - - return; -} - - -static void rpc_md_ev_callback(MD_CALL_BACK_QUEUE *queue,unsigned long data) -{ - rpc_ctl_block_t *ctl_b = container_of(queue, rpc_ctl_block_t, md_status_update_call_back); - CCCI_DBG_MSG(ctl_b->m_md_id, "rpc", "rpc_md_ev_callback++\n"); - - switch (data) - { - case CCCI_MD_RESET: - CCCI_MSG_INF(ctl_b->m_md_id, "rpc", "MD reset call chain !\n"); - atomic_set(&ctl_b->md_is_ready, 0); - ccci_rpc_resetfifo(ctl_b); - wakeup_rpc_work(ctl_b); - break; - - case CCCI_MD_BOOTUP: - atomic_set(&ctl_b->rpcd_response_done, 0); - atomic_set(&ctl_b->md_is_ready, 1); - CCCI_MSG_INF(ctl_b->m_md_id, "rpc", "MD boot up successfully.\n"); - break; - } - CCCI_DBG_MSG(ctl_b->m_md_id, "rpc", "rpc_md_ev_callback--\n"); -} - -static int rpc_daemon_send_helper(struct file *file, unsigned long arg) -{ - void __user *argp; - ccci_msg_t msg; - rpc_stream_msg_t message; - int md_id; - int ret = 0; - rpc_ctl_block_t *ctl_b = (rpc_ctl_block_t *)file->private_data; //rpc_ctl_block[0]; -#ifdef _DEBUG_RPCD - CCCI_DBG_MSG(ctl_b->m_md_id, "rpc", "Send RPCD -> MD [Resp=%d]\n", atomic_read(&ctl_b->rpcd_resp_indx)); -#endif - - if(ctl_b== NULL){ - ASSERT(ctl_b!= NULL); - ret= -EFAULT; - goto _send_return; - } - md_id = ctl_b->m_md_id; - argp = (void __user *) arg; - - if(atomic_read(&ctl_b->md_is_ready)==0){ - CCCI_MSG_INF(ctl_b->m_md_id, "rpc", "rpc_daemon_send_helper-- by MD_RESET!\n"); - ret=-EINTR; - goto _send_return; - } - - if (copy_from_user((void *) &message, argp, sizeof(rpc_stream_msg_t))) - { - ret=-EFAULT; - goto _send_return; - } - - msg.data0 = (unsigned int)(ctl_b->rpc_buf_phy) - get_md2_ap_phy_addr_fixed() + ctl_b->rpc_smem_instance_size*message.index; - msg.data1 = message.length + 4; - msg.reserved = message.index; - msg.channel = CCCI_RPC_TX; - - CCCI_RPC_MSG(md_id, "Write, %08X, %08X, %08X, %08X\n", - msg.data0, msg.data1, msg.channel, msg.reserved); - - mb(); - ret = ccci_message_send(md_id, &msg, 1); - if(ret != sizeof(ccci_msg_t)) - { - CCCI_MSG_INF(md_id, "rpc", "fail send msg <%d>!!!\n", ret); - goto _send_return; - } - -_send_return: - CCCI_DBG_MSG(ctl_b->m_md_id, "rpc", "rpc_daemon_send_helper--(%d)\n", ret); - wakeup_rpc_work(ctl_b); - return ret; -} - -static int rpc_mmap(struct file *file, struct vm_area_struct *vma) -{ - unsigned long off, start, len; - rpc_ctl_block_t *ctl_b = (rpc_ctl_block_t *)file->private_data; //rpc_ctl_block[0]; - - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)){ - return -EINVAL; - } - - - off = vma->vm_pgoff << PAGE_SHIFT; - start = (unsigned long) ctl_b->rpc_buf_phy; - len = PAGE_ALIGN((start & ~PAGE_MASK) + ctl_b->rpc_smem_instance_size); - - if ((vma->vm_end - vma->vm_start + off) > len) - { - return -EINVAL; - } - - off += start & PAGE_MASK; - vma->vm_pgoff = off >> PAGE_SHIFT; - vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP); - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - - return remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, vma->vm_end - vma->vm_start, vma->vm_page_prot); -} - -static long rpc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - int ret; - - switch(cmd) - { - case CCCI_RPC_IOCTL_GET_INDEX: - ret = rpc_get_share_mem_index(file); - break; - - case CCCI_RPC_IOCTL_SEND: - ret = rpc_daemon_send_helper(file, arg); - break; - - default: - ret = -ENOIOCTLCMD; - break; - } - - return ret; -} - -static int rpc_open(struct inode *inode, struct file *file) -{ - int major = imajor(inode); - int md_id; - - md_id = get_md_id_by_dev_major(major); - file->private_data = (void*)rpc_ctl_block[md_id]; - - return 0; -} - -static int rpc_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static struct file_operations rpc_fops = -{ - .owner = THIS_MODULE, - .unlocked_ioctl = rpc_ioctl, - .open = rpc_open, - .mmap = rpc_mmap, - .release = rpc_release, -}; - -static int rpc_device_init(rpc_ctl_block_t* ctl_b) -{ - int ret; - int major, minor; - char name[16]; - int md_id = ctl_b->m_md_id; - - CCCI_MSG_INF(md_id, "rpc", "rpc_device_init++\n"); - - - ctl_b->md_status_update_call_back.call = rpc_md_ev_callback; - ctl_b->md_status_update_call_back.next = NULL, - - CCCI_MSG_INF(md_id, "rpc", "register md_db rpc_md_ev_callback\n"); - md_register_call_chain(md_id, &ctl_b->md_status_update_call_back); - -#ifdef _DEBUG_RPCD - atomic_set(&ctl_b->rpcd_resp_indx, 0); -#endif - atomic_set(&ctl_b->md_is_ready, 1); - atomic_set(&ctl_b->rpcd_response_done, 0); - init_waitqueue_head(&ctl_b->rpcd_response_waitq); - init_waitqueue_head(&ctl_b->rpcd_send_waitq); - - ret = get_dev_id_by_md_id(md_id, "rpc", &major, &minor); - if (ret < 0) { - CCCI_MSG_INF(md_id, "rpc", "get rpc dev id fail: %d\n", ret); - goto _ret; - } - - spin_lock_init(&ctl_b->rpc_daemon_fifo_lock); - - ret=kfifo_alloc(&ctl_b->rpc_daemon_fifo, sizeof(unsigned int)*8, GFP_KERNEL); - if (ret) - { - CCCI_MSG_INF(md_id, "rpc", "unable to create daemon fifo\n"); - goto _ret; - } - - if(md_id) - snprintf(name, 16, "ccci%d_rpc", md_id+1); - else - strcpy(name, "ccci_rpc"); - - ctl_b->rpc_dev_num = MKDEV(major, minor); // Using FS major, sub id is 1, not 0 - ret = register_chrdev_region(ctl_b->rpc_dev_num, 1, name); - - if (ret){ - CCCI_MSG_INF(md_id, "rpc", "ccci_rpc: Register character device failed\n"); - goto _ret_kfifo_free; - } - - cdev_init(&ctl_b->rpc_cdev, &rpc_fops); - ctl_b->rpc_cdev.owner = THIS_MODULE; - ctl_b->rpc_cdev.ops = &rpc_fops; - - ret = cdev_add(&ctl_b->rpc_cdev, ctl_b->rpc_dev_num, 1); - if (ret){ - CCCI_MSG_INF(md_id, "rpc", "ccci_rpc: Char device add failed\n"); - unregister_chrdev_region(ctl_b->rpc_dev_num, 1); - goto _ret_kfifo_free; - } - goto _ret; - -_ret_kfifo_free: - kfifo_free(&ctl_b->rpc_daemon_fifo); -_ret: - CCCI_MSG_INF(md_id, "rpc", "rpc_device_init--\n"); - return ret; -} - -void rpc_device_deinit(int md_id) -{ - rpc_ctl_block_t *ctl_b = rpc_ctl_block[md_id]; - - kfifo_free(&ctl_b->rpc_daemon_fifo); - cdev_del(&ctl_b->rpc_cdev); - unregister_chrdev_region(ctl_b->rpc_dev_num, 1); -} -#endif /* CONFIG_MTK_TC1_FEATURE */ - -int __init ccci_rpc_init(int md_id) -{ - int ret; - rpc_ctl_block_t *ctl_b; - rpc_cfg_inf_t rpc_cfg; - int rpc_buf_vir, rpc_buf_phy, rpc_buf_len; - - // Allocate fs ctrl struct memory - ctl_b = (rpc_ctl_block_t *)kmalloc(sizeof(rpc_ctl_block_t), GFP_KERNEL); - if(ctl_b == NULL) - return -CCCI_ERR_GET_MEM_FAIL; - memset(ctl_b, 0, sizeof(rpc_ctl_block_t)); - rpc_ctl_block[md_id] = ctl_b; - - // Get rpc config information - ASSERT(ccci_get_sub_module_cfg(md_id, "rpc", (char*)&rpc_cfg, sizeof(rpc_cfg_inf_t)) \ - == sizeof(rpc_cfg_inf_t) ); - - ASSERT(ccci_rpc_base_req(md_id, &rpc_buf_vir, &rpc_buf_phy, &rpc_buf_len) == 0); - ctl_b->rpc_buf_vir = (RPC_BUF*)rpc_buf_vir; - ctl_b->rpc_buf_phy = (unsigned int)rpc_buf_phy; - ctl_b->rpc_buf_len = rpc_buf_len; - ctl_b->rpc_max_buf_size = rpc_cfg.rpc_max_buf_size; - ctl_b->rpc_ch_num = rpc_cfg.rpc_ch_num; - ctl_b->rpc_smem_instance_size = sizeof(RPC_BUF) + ctl_b->rpc_max_buf_size; - //Note!!!!! we should check cofigure mistake - - // Init ctl_b - ctl_b->m_md_id = md_id; - spin_lock_init(&ctl_b->rpc_fifo_lock); - - - ret=kfifo_alloc(&ctl_b->rpc_fifo,sizeof(unsigned) * ctl_b->rpc_ch_num, GFP_KERNEL); - - if (ret<0) - { - CCCI_MSG_INF(md_id, "rpc", "Unable to create fifo\n"); - goto _KFIFO_ALLOC_FAIL; - } - - INIT_WORK(&ctl_b->rpc_work, ccci_rpc_work); - - // modem related channel registration. - CCCI_RPC_MSG(md_id, "rpc_buf_vir=0x%p, rpc_buf_phy=0x%08X, rpc_buf_len=0x%08X\n", \ - ctl_b->rpc_buf_vir, ctl_b->rpc_buf_phy, ctl_b->rpc_buf_len); - ASSERT(ctl_b->rpc_buf_vir != NULL); - ASSERT(ctl_b->rpc_buf_len != 0); - ASSERT(register_to_logic_ch(md_id, CCCI_RPC_RX, ccci_rpc_callback, ctl_b) == 0); - -#if defined(CONFIG_MTK_TC1_FEATURE) - ASSERT(register_to_logic_ch(md_id, CCCI_RPC_TX, ccci_rpc_callback, ctl_b) == 0); - ret = rpc_device_init(ctl_b); - if(0 != ret) - goto _KFIFO_ALLOC_FAIL; -#endif - - return ret; - -_KFIFO_ALLOC_FAIL: - kfree(ctl_b); - rpc_ctl_block[md_id] = NULL; - - return ret; -} - -void __exit ccci_rpc_exit(int md_id) -{ - rpc_ctl_block_t *ctl_b; - - CCCI_RPC_MSG(md_id, "ccci_rpc_exit\n"); - ctl_b = rpc_ctl_block[md_id]; - if (ctl_b == NULL) - return; - -#if defined(CONFIG_MTK_TC1_FEATURE) - rpc_device_deinit(md_id); -#endif - kfifo_free(&ctl_b->rpc_fifo); - un_register_to_logic_ch(md_id, CCCI_RPC_RX); -#if defined(CONFIG_MTK_TC1_FEATURE) - un_register_to_logic_ch(md_id, CCCI_RPC_TX); -#endif - kfree(ctl_b); - rpc_ctl_block[md_id] = NULL; -} - - diff --git a/drivers/misc/mediatek/dual_ccci/ccci_statistics.c b/drivers/misc/mediatek/dual_ccci/ccci_statistics.c deleted file mode 100644 index 0180f404c3d..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_statistics.c +++ /dev/null @@ -1,249 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define CCCI_LOG_MAX_LEN 16 - - -typedef struct _ccci_log -{ - struct timeval tv; - ccci_msg_t msg; - int droped; -} ccci_log_t; - -typedef struct _logic_ch_record -{ - ccci_log_t log[CCCI_LOG_MAX_LEN]; - unsigned long msg_num; - unsigned long drop_num; - int log_idx; - int dir; - char *name; -}logic_ch_record_t; - -typedef struct _ch_history{ - logic_ch_record_t all_ch[CCCI_MAX_CH_NUM]; - int md_id; -}ch_history_t; - -static ch_history_t *history_ctlb[MAX_MD_NUM]; - - -void add_logic_layer_record(int md_id, ccci_msg_t *data, int drop) -{ - logic_ch_record_t *ctlb; - unsigned int ch = data->channel; - ccci_log_t *record; - - if (ch >= CCCI_MAX_CH_NUM) - return; - - ctlb = &(history_ctlb[md_id]->all_ch[ch]); - if(ctlb == NULL) - return; - - record = &(ctlb->log[ctlb->log_idx]); - ctlb->log_idx++; - ctlb->log_idx &= (CCCI_LOG_MAX_LEN-1); - do_gettimeofday(&(record->tv)); - record->msg = *data; - record->droped = drop; - if(drop) - ctlb->drop_num++; - else - ctlb->msg_num++; -} - - -static int s_to_date( long seconds, long usec, int *us, int *sec, int *min, int *hour, - int *day, int *month, int *year) -{ -#define DAY_PER_LEAP_YEAR 366 -#define DAY_PER_NON_LEAP_YEAR 365 - - unsigned int i = 0; - unsigned long mins, hours, days, month_t, year_t; - unsigned char m[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - - if(!sec || !min || !hour || !day || !month || !year) - { - CCCI_MSG("%s invalid param!\n", __FUNCTION__); - return (-1); - } - - *us = usec; - *sec = seconds % 60; - mins = seconds / 60; - *min = mins % 60; - hours = mins / 60; - *hour = hours % 24; - days = hours / 24; - - year_t = 1970; - - while(1) - { - if(!(year_t % 4) && (year_t % 100)) - { - if(days >= DAY_PER_LEAP_YEAR) - { - days -= DAY_PER_LEAP_YEAR; - year_t ++; - } - else - break; - } - else - { - if(days >= DAY_PER_NON_LEAP_YEAR) - { - days -= DAY_PER_NON_LEAP_YEAR; - year_t ++; - } - else - break; - } - } - - if(!(year_t % 4) && year_t % 100) - { - m[1] = 29; - } - - month_t = 1; - for(i=0; i < 12; i++) - { - if(days > m[i]) - { - days -= m[i]; - month_t++; - } - else - { - break; - } - } - - *day = days; - *year = year_t; - *month = month_t; - - return 0; -} - - -static int ccci_record_dump(ccci_log_t *log) -{ - int ms, sec, min, hour, day, month, year; - long tv_sec, tv_usec; - - tv_sec = (long)log->tv.tv_sec; - tv_usec = (long)log->tv.tv_usec; - - if ( (tv_sec==0)&&(tv_usec==0) ) - return -1; - - s_to_date(tv_sec, tv_usec, &ms, &sec, &min, &hour, &day, &month, &year); - - if(!log->droped) { - CCCI_DBG_COM_MSG("%08X %08X %02d %08X %d-%02d-%02d %02d:%02d:%02d.%06d\n", - log->msg.data0,log->msg.data1,log->msg.channel,log->msg.reserved, - year, month, day, hour, min, sec, ms); - } else { - CCCI_DBG_COM_MSG("%08X %08X %02d %08X %d-%02d-%02d %02d:%02d:%02d.%06d -\n", - log->msg.data0,log->msg.data1,log->msg.channel,log->msg.reserved, - year, month, day, hour, min, sec, ms); - } - return 0; -} - -void logic_layer_ch_record_dump(int md_id, int ch) -{ - ch_history_t *ctlb = history_ctlb[md_id]; - int i, j; - logic_ch_record_t *record; - - if ((ctlb != NULL)&&(ch < CCCI_MAX_CH_NUM)) { - record = &(ctlb->all_ch[ch]); - CCCI_DBG_COM_MSG("\n"); - if(record->dir == CCCI_LOG_TX) { - CCCI_DBG_COM_MSG("ch%02d tx:%ld\t tx_drop:%ld name: %s\t\n", ch, record->msg_num, record->drop_num, record->name); - } else { - CCCI_DBG_COM_MSG("ch%02d rx:%ld\t rx_drop:%ld name: %s\t\n", ch, record->msg_num, record->drop_num, record->name); - } - - // dump last ten message - j = record->log_idx - 1; - j &= (CCCI_LOG_MAX_LEN-1); - for (i=0; i<10; i++) { - if (ccci_record_dump(&(record->log[j]))<0) - break; - j--; - j &= (CCCI_LOG_MAX_LEN-1); - } - } -} - -void dump_logical_layer_tx_rx_histroy(int md_id) -{ - int i=0; - ch_history_t *ctlb = history_ctlb[md_id]; - - if (ctlb != NULL) { - for(i=0; iall_ch[ch]); - record->dir = dir; - record->name = name; - } else { - ret = -1; - } - - return ret; -} - - -int statistics_init(int md_id) -{ - history_ctlb[md_id] = kmalloc(sizeof(ch_history_t), GFP_KERNEL); - if(history_ctlb[md_id] != NULL) - memset(history_ctlb[md_id], 0, sizeof(ch_history_t)); - - return 0; -} - -void statistics_exit(int md_id) -{ - if(history_ctlb[md_id] != NULL){ - kfree(history_ctlb[md_id]); - history_ctlb[md_id] = NULL; - } - - return; -} - - diff --git a/drivers/misc/mediatek/dual_ccci/ccci_tty.c b/drivers/misc/mediatek/dual_ccci/ccci_tty.c deleted file mode 100644 index b5faabb08a8..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccci_tty.c +++ /dev/null @@ -1,1014 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_tty.c - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * MT65XX CCCI Virtual TTY Driver - * - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -typedef struct -{ - int m_md_id; - int count; - int ready; - int need_reset; - int reset_handle; - int channel; - int uart_tx; - int uart_rx_ack; - int idx; - struct wake_lock wake_lock; - char wakelock_name[16]; - wait_queue_head_t write_waitq; - wait_queue_head_t read_waitq; - wait_queue_head_t poll_waitq_r; - wait_queue_head_t poll_waitq_w; - spinlock_t poll_lock; - shared_mem_tty_t *shared_mem; - struct mutex ccci_tty_mutex; - int has_pending_read; - rwlock_t ccci_tty_rwlock; - struct timer_list timer; - struct tasklet_struct ccci_tty_tasklet; -} tty_instance_t; - -typedef struct _tty_ctl_block{ - int m_md_id; - tty_instance_t ccci_tty_modem; - tty_instance_t ccci_tty_meta; - tty_instance_t ccci_tty_ipc; -#ifdef CONFIG_MTK_ICUSB_SUPPORT - tty_instance_t ccci_tty_icusb; -#endif - shared_mem_tty_t *uart1_shared_mem; - shared_mem_tty_t *uart2_shared_mem; - shared_mem_tty_t *uart3_shared_mem; -#ifdef CONFIG_MTK_ICUSB_SUPPORT - shared_mem_tty_t *uart4_shared_mem; -#endif - int tty_buf_size; - MD_CALL_BACK_QUEUE tty_notifier; - char drv_name[32]; - char node_name[16]; - struct cdev ccci_tty_dev; - int major; - int minor; -}tty_ctl_block_t; - -static tty_ctl_block_t *tty_ctlb[MAX_MD_NUM]; - -unsigned int tty_debug_enable[MAX_MD_NUM] = {0}; -//1UL<<0, tty_modem; 1UL<<1, tty_meta; 1UL<<2, tty_rpc - -static int ccci_tty_readable(tty_instance_t *tty_instance) -{ - int read, write, size; - - read = tty_instance->shared_mem->rx_control.read; - write = tty_instance->shared_mem->rx_control.write; - size = write - read; - - if(size < 0) - size += tty_instance->shared_mem->rx_control.length; - - return size; -} - -static int ccci_tty_writeable(tty_instance_t *tty_instance) -{ - int read, write, size,length; - - read = tty_instance->shared_mem->tx_control.read; - write = tty_instance->shared_mem->tx_control.write; - length = tty_instance->shared_mem->tx_control.length; - - if (read == write) - { - size = length - 1; - } - else if (read < write) - { - size = length - write; - size += read; - } - else - { - size = read - write - 1; - } - - if ((size <= 0) || (length <= 0)) { - CCCI_MSG_INF(tty_instance->m_md_id, "tty", "writeable: read=%d,write=%d,length=%d,size=%d\n", - read, write, length, size); - } - return size; -} - -// will be called when modem sends us something. -// we will then copy it to the tty's buffer. -// this is essentially the "read" fops. -static void ccci_tty_callback(void *private) -{ - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - ccci_msg_t msg; - tty_ctl_block_t *ctlb = (tty_ctl_block_t *)ch_info->m_owner; - - while(get_logic_ch_data(ch_info, &msg)){ - switch(msg.channel) - { - case CCCI_UART1_TX_ACK: - // this should be in an interrupt, - // so no locking required... - if(ccci_tty_writeable(&ctlb->ccci_tty_meta)) { - wake_up_interruptible(&ctlb->ccci_tty_meta.write_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_meta.poll_waitq_w,POLLOUT); - } - break; - - case CCCI_UART1_RX: - if(ccci_tty_readable(&ctlb->ccci_tty_meta)) { - wake_up_interruptible(&ctlb->ccci_tty_meta.read_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_meta.poll_waitq_r,POLLIN); - wake_lock_timeout(&ctlb->ccci_tty_meta.wake_lock, HZ / 2); - } - break; - - case CCCI_UART2_TX_ACK: - // this should be in an interrupt, - // so no locking required... - if(ccci_tty_writeable(&ctlb->ccci_tty_modem)) { - wake_up_interruptible(&ctlb->ccci_tty_modem.write_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_modem.poll_waitq_w,POLLOUT); - } - break; - - case CCCI_UART2_RX: - if(ccci_tty_readable(&ctlb->ccci_tty_modem)) { - ctlb->ccci_tty_modem.has_pending_read = 1; - wake_up_interruptible(&ctlb->ccci_tty_modem.read_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_modem.poll_waitq_r,POLLIN); - wake_lock_timeout(&ctlb->ccci_tty_modem.wake_lock, HZ / 2); - } - break; - - case CCCI_IPC_UART_TX_ACK: - if(ccci_tty_writeable(&ctlb->ccci_tty_ipc)) { - wake_up_interruptible(&ctlb->ccci_tty_ipc.write_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_ipc.poll_waitq_w,POLLOUT); - } - break; - - case CCCI_IPC_UART_RX: - if(ccci_tty_readable(&ctlb->ccci_tty_ipc)) { - wake_up_interruptible(&ctlb->ccci_tty_ipc.read_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_ipc.poll_waitq_r,POLLIN); - wake_lock_timeout(&ctlb->ccci_tty_ipc.wake_lock, HZ / 2); - } - break; -#ifdef CONFIG_MTK_ICUSB_SUPPORT - case CCCI_ICUSB_TX_ACK: - if(ccci_tty_writeable(&ctlb->ccci_tty_icusb)) { - wake_up_interruptible(&ctlb->ccci_tty_icusb.write_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_icusb.poll_waitq_w,POLLOUT); - } - break; - - case CCCI_ICUSB_RX: - if(ccci_tty_readable(&ctlb->ccci_tty_icusb)) { - wake_up_interruptible(&ctlb->ccci_tty_icusb.read_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_icusb.poll_waitq_r,POLLIN); - wake_lock_timeout(&ctlb->ccci_tty_icusb.wake_lock, HZ / 2); - } - break; -#endif - - - default: - break; - } - } -} - - -static ssize_t ccci_tty_read(struct file *file, char *buf, size_t count, loff_t *ppos) -{ - tty_instance_t *tty_instance=(tty_instance_t *)file->private_data; - - int part, size, ret = 0; - int value; - unsigned read, write, length; - ccci_msg_t msg; - char *rx_buffer; - int md_id = tty_instance->m_md_id; - int data_be_read; - char *u_buf = buf; - - read = tty_instance->shared_mem->rx_control.read; - write = tty_instance->shared_mem->rx_control.write; - rx_buffer = tty_instance->shared_mem->buffer; - length = tty_instance->shared_mem->rx_control.length; - - do { - size = ccci_tty_readable(tty_instance); - - if (size == 0) { - if (file->f_flags & O_NONBLOCK) { - ret=-EAGAIN; - goto out; - } - else { - // Block read - value = wait_event_interruptible(tty_instance->read_waitq, ccci_tty_readable(tty_instance)); - if(value == -ERESTARTSYS) { - CCCI_TTY_MSG(md_id, "Interrupted syscall.signal_pend=0x%llx\n", - *(long long *)current->pending.signal.sig); - ret = -EINTR; - goto out; - } - } - } - else - break; - - }while(size==0); - - data_be_read = (int)count; - if(tty_debug_enable[md_id] & (1UL << tty_instance->idx)) - CCCI_DBG_MSG(md_id, "tty", "[RX](Before) tty%d read_request=%d write=%04d read=%4d\n", - tty_instance->idx, data_be_read, tty_instance->shared_mem->rx_control.write, read); - - if(data_be_read > size) - data_be_read = size; - //copy_to_user may be scheduled, - //So add 0.5s wake lock to make sure ccci user can be running. - wake_lock_timeout(&tty_instance->wake_lock, HZ / 2); - if( (read + data_be_read) >= length ) { - // Need read twice - - // Copy first part - part = length - read; - if (copy_to_user(u_buf,&rx_buffer[read],part)) { - CCCI_MSG_INF(md_id, "tty", "read: copy_to_user fail:u_buf=%08x,rx_buffer=0x%08x,read=%d,size=%d ret=%d line=%d\n",\ - (unsigned int)u_buf,(unsigned int)rx_buffer,read,part,ret,__LINE__); - - ret= -EFAULT; - goto out; - } - // Copy second part - if (copy_to_user(&u_buf[part],rx_buffer,data_be_read - part)) { - CCCI_MSG_INF(md_id, "tty", "read: copy_to_user fail:u_buf=%08x,rx_buffer=0x%08x,read=%d,size=%d ret=%d line=%d\n",\ - (unsigned int)u_buf,(unsigned int)rx_buffer,read,data_be_read - part,ret,__LINE__); - - ret= -EFAULT; - goto out; - } - } - else { - // Just need read once - if (copy_to_user(u_buf,&rx_buffer[read],data_be_read)) { - CCCI_MSG_INF(md_id, "tty", "read: copy_to_user fail:u_buf=%08x,rx_buffer=0x%08x,read=%d,size=%d ret=%d line=%d\n",\ - (unsigned int)u_buf,(unsigned int)rx_buffer,read,data_be_read,ret,__LINE__); - ret= -EFAULT; - goto out; - } - } - - // Update read pointer - read += data_be_read; - if(read >= length) - read -= length; - tty_instance->shared_mem->rx_control.read = read; - - // Ack to MD - msg.magic = 0xFFFFFFFF; - msg.id = tty_instance->channel; - msg.channel = tty_instance->uart_rx_ack; - msg.reserved = 0; - - mb(); - - ret = ccci_message_send(md_id, &msg, 1); - if( ret != sizeof(msg)) { - CCCI_DBG_MSG(md_id, "tty", "ccci_write_mailbox for %d fail: %d\n", - tty_instance->channel, ret); - //mod_timer(&tty_instance->timer,jiffies + msecs_to_jiffies(10)); - } else { - //del_timer(&tty_instance->timer): - } - - ret = data_be_read; - -out: - if(tty_debug_enable[md_id] & (1UL << tty_instance->idx)) - CCCI_DBG_MSG(md_id, "tty", "[RX](after) tty%d read_len=%d write=%04d read=%4d\n", - tty_instance->idx, ret, tty_instance->shared_mem->rx_control.write, - tty_instance->shared_mem->rx_control.read); - - return ret; -} - - -static ssize_t ccci_tty_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) -{ - tty_instance_t *tty_instance=(tty_instance_t *)file->private_data; - int ret = 0, part; - int data_be_write, size, value; - unsigned read, write, length; - int xmit_retry=0; - ccci_msg_t msg; - char *tx_buffer; - int md_id = tty_instance->m_md_id; - - if(count == 0) - return 0; - - mutex_lock(&tty_instance->ccci_tty_mutex); - - data_be_write = (int)count; - - if(tty_debug_enable[md_id] & (1UL << tty_instance->idx)) - CCCI_DBG_MSG(md_id, "tty", "[TX] (Before) tty%d write_request=%d write=%04d read=%4d\n", - tty_instance->idx, data_be_write, tty_instance->shared_mem->tx_control.write, - tty_instance->shared_mem->tx_control.read); - - size = 0; - - /* Check free space */ - read = tty_instance->shared_mem->tx_control.read; - write = tty_instance->shared_mem->tx_control.write; - length = tty_instance->shared_mem->tx_control.length; - tx_buffer = tty_instance->shared_mem->buffer + length; - - do { - size = ccci_tty_writeable(tty_instance); - - if (size == 0) { - if (file->f_flags & O_NONBLOCK) { - ret=-EAGAIN; - goto out; - } - else { - // Block write - value = wait_event_interruptible(tty_instance->write_waitq, ccci_tty_writeable(tty_instance)); - if(value == -ERESTARTSYS) { - CCCI_TTY_MSG(md_id, "(W)Interrupted syscall.signal_pend=0x%llx\n", - *(long long *)current->pending.signal.sig); - ret = -EINTR; - goto out; - } - } - } - else - break; - - }while(size==0); - - // Calculate write size - if(data_be_write >= size) - data_be_write = size; - - if ((size <= 0) || (length <= 0) || (length - write <= 0) || (data_be_write <= 0)) { - CCCI_MSG_INF(md_id, "tty", "write: length=%d,size=%d,write=%d,data_be_write=%d,count=%d\n", - length, size, write, data_be_write, count); - } - - if( (write+data_be_write) >= length) { - // Write twice - // 1st write - part = length - write; - ret = copy_from_user(&tx_buffer[write],buf,part); - if (ret) - { - CCCI_MSG_INF(md_id, "tty", "write: copy from user fail:tx_buffer=0x%08x,write=%d, buf=%08x, part=%d ret=%d line=%d\n",\ - (unsigned int)tx_buffer,write,(unsigned int)buf,part,ret,__LINE__); - ret=-EFAULT; - goto out; - } - // 2nd write - ret = copy_from_user(tx_buffer,&buf[part],data_be_write - part); - if (ret) - { - CCCI_MSG_INF(md_id, "tty", "write: copy from user fail:tx_buffer=0x%08x,buf=%08x,part=%d,data_be_write-part=%d ret=%d line=%d\n",\ - (unsigned int)tx_buffer,(unsigned int)buf,part,data_be_write - part,ret,__LINE__); - ret=-EFAULT; - goto out; - } - } - else { - // Write once is OK - ret = copy_from_user(&tx_buffer[write],buf,data_be_write); - if (ret) - { - CCCI_MSG_INF(md_id, "tty", "write: copy from user fail:tx_buffer=0x%08x,write=%d,buf=%08x,data_be_write=%d ret=%d line=%d\n",\ - (unsigned int)tx_buffer,write,(unsigned int)buf,data_be_write,ret,__LINE__); - ret=-EFAULT; - goto out; - } - } - - // Updata read pointer - write += data_be_write; - if(write >= length) - write -= length; - tty_instance->shared_mem->tx_control.write = write; - - mb(); - - msg.addr = 0; - msg.len = data_be_write; - msg.channel = tty_instance->uart_tx; - msg.reserved = 0; - - mb(); - - do{ - ret = ccci_message_send(md_id, &msg, 1); - if(ret == sizeof(msg)) - break; - - if(ret == -CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL){ - xmit_retry++; - msleep(10); - if( (xmit_retry%10) == 0){ - //CCCI_DBG_MSG(md_id, "tty", "[No Physical Channel]ttyC%d retry %d times fail\n", tty_instance->tty->index, xmit_retry); - } - } - else { - break; - } - }while(1); - - if (ret != sizeof(ccci_msg_t)) { - - tty_instance->ready = 1; - - if (ret == CCCI_MD_NOT_READY) { - CCCI_DBG_MSG(md_id, "tty", "ttyC%d write fail when Modem not ready\n", tty_instance->channel); - } - - } - else { - ret = data_be_write; - } - -out: - if(tty_debug_enable[md_id] & (1UL << tty_instance->idx)) - CCCI_DBG_MSG(md_id, "tty", "[TX] (After) tty%d write_request=%d write=%04d read=%4d\n", - tty_instance->idx, ret, tty_instance->shared_mem->tx_control.write, - tty_instance->shared_mem->tx_control.read); - mutex_unlock(&tty_instance->ccci_tty_mutex); - return ret; -} - - -static long ccci_tty_ioctl( struct file *file, unsigned int cmd, unsigned long arg) -{ - int ret = 0; - //tty_instance_t *tty_instance=(tty_instance_t *)file->private_data; - //int md_id = tty_instance->md_id; - - switch (cmd) - { - default: - ret = 0; - break; - } - - return ret; -} - - -static unsigned int ccci_tty_poll(struct file *file,poll_table *wait) -{ - tty_instance_t *tty_instance=(tty_instance_t *)file->private_data; - int ret=0; - unsigned long flags; - - poll_wait(file, &tty_instance->poll_waitq_r, wait); - poll_wait(file, &tty_instance->poll_waitq_w, wait); - spin_lock_irqsave(&tty_instance->poll_lock, flags); - if ( ccci_tty_readable(tty_instance)) - { - ret |= POLLIN|POLLRDNORM; - } - if ( ccci_tty_writeable(tty_instance)) - { - ret |= POLLOUT|POLLWRNORM; - } - spin_unlock_irqrestore(&tty_instance->poll_lock, flags); - return ret; -} - - -static int ccci_tty_open(struct inode *inode, struct file *file) -{ - int minor = iminor(inode); - int major = imajor(inode); - int index, minor_start; - int md_id; - int ret = 0; - char *name; - - tty_ctl_block_t *ctlb; - tty_instance_t *tty_instance = NULL; - - md_id = get_md_id_by_dev_major(major); - if(md_id<0) - { - CCCI_MSG_INF(md_id, "tty", "get_md_id_by_dev_major(%d)=%d\n", major,md_id); - return -ENODEV; - } - ret = get_dev_id_by_md_id(md_id, "tty", NULL, &minor_start); - if(ret < 0){ - CCCI_MSG_INF(md_id, "tty", "get minor start fail(%d)\n", ret); - return -ENODEV; - } - index = minor - minor_start; - - ctlb = tty_ctlb[md_id]; - switch(index) - { - case CCCI_TTY_MODEM: - name = "ccci_modem"; - tty_instance = &ctlb->ccci_tty_modem; - break; - - case CCCI_TTY_META: - name = "ccci_meta"; - tty_instance = &ctlb->ccci_tty_meta; - break; - - case CCCI_TTY_IPC : - name = "ccci_ipc" ; - tty_instance=&ctlb->ccci_tty_ipc; - break; -#ifdef CONFIG_MTK_ICUSB_SUPPORT - case CCCI_TTY_ICUSB : - name = "ccci_icusb" ; - tty_instance=&ctlb->ccci_tty_icusb; - break; -#endif - - default: - return -ENODEV; - } - - mutex_lock(&tty_instance->ccci_tty_mutex); - - tty_instance->count++; - tty_instance->m_md_id = md_id; - if(tty_instance->count > 1){ - CCCI_MSG_INF(md_id, "tty", "[tty_open]Multi-Open! %s open %s%d, %s, count:%d\n", - current->comm, ctlb->node_name, index, name, tty_instance->count); - - mutex_unlock(&tty_instance->ccci_tty_mutex); - return -EMFILE; - } - else { - CCCI_MSG_INF(md_id, "tty", "[tty_open]%s open %s%d, %s, nb_flag:%x\n", current->comm, - ctlb->node_name, index, name, file->f_flags & O_NONBLOCK); - write_lock_bh(&tty_instance->ccci_tty_rwlock); - - tty_instance->ready = 1; - - write_unlock_bh(&tty_instance->ccci_tty_rwlock); - - file->private_data=tty_instance; - nonseekable_open(inode,file); - - mutex_unlock(&tty_instance->ccci_tty_mutex); - - //Note: reset handle must be set after make sure open tty instance successfully - if(tty_instance->need_reset) { - //CCCI_MSG("%s opening ttyC%d, %s\n", current->comm, index, name); - tty_instance->reset_handle = ccci_reset_register(md_id, name); - ASSERT(tty_instance->reset_handle >= 0); - } -/* -//need test. Haow. - if ((index == CCCI_TTY_MODEM) && (tty_instance->has_pending_read == 1)) { - tty_instance->has_pending_read = 0; - wake_up_interruptible(&ctlb->ccci_tty_modem.read_waitq); - wake_up_interruptible_poll(&ctlb->ccci_tty_modem.poll_waitq_r,POLLIN); - } -*/ - } - - return ret; -} - - -static int ccci_tty_release(struct inode *inode, struct file *file) -{ - tty_instance_t *tty_instance = (tty_instance_t *)file->private_data; - int md_id; - tty_ctl_block_t *ctlb = NULL; - - md_id = tty_instance->m_md_id; - ctlb = tty_ctlb[md_id]; - - mutex_lock(&tty_instance->ccci_tty_mutex); - - tty_instance->count--; - - CCCI_MSG_INF(md_id, "tty", "[tty_close]Port%d count %d \n", tty_instance->idx, tty_instance->count); - - if (tty_instance->count == 0) { - // keep tty_instance->tty cannot be used by ccci_tty_read() - write_lock_bh(&tty_instance->ccci_tty_rwlock); - tty_instance->ready = 0; - write_unlock_bh(&tty_instance->ccci_tty_rwlock); - - ccci_reset_buffers(tty_instance->shared_mem, ctlb->tty_buf_size); - - if(tty_instance->need_reset) { - if (tty_instance->reset_handle >= 0) { - ccci_user_ready_to_reset(md_id, tty_instance->reset_handle); - } - else { - CCCI_MSG_INF(md_id, "tty", "[tty_close] fail, Invalid reset handle(port%d): %d \n", - tty_instance->idx, tty_instance->reset_handle); - } - } - } - - mutex_unlock(&tty_instance->ccci_tty_mutex); - - return 0; -} - -void ccci_reset_buffers(shared_mem_tty_t *shared_mem, int size) -{ - shared_mem->tx_control.length = size; - shared_mem->tx_control.read = 0; - shared_mem->tx_control.write = 0; - - shared_mem->rx_control.length = size; - shared_mem->rx_control.read = 0; - shared_mem->rx_control.write = 0; - - memset(shared_mem->buffer, 0, size*2); - - return; -} - -int ccci_uart_ipo_h_restore(int md_id) -{ - tty_ctl_block_t *ctlb = NULL; - - ctlb = tty_ctlb[md_id]; - ccci_reset_buffers(ctlb->uart1_shared_mem, ctlb->tty_buf_size); - ccci_reset_buffers(ctlb->uart2_shared_mem, ctlb->tty_buf_size); - ccci_reset_buffers(ctlb->uart3_shared_mem, ctlb->tty_buf_size); -#ifdef CONFIG_MTK_ICUSB_SUPPORT - ccci_reset_buffers(ctlb->uart4_shared_mem, ctlb->tty_buf_size); -#endif - return 0; -} - -static void tty_call_back_func(MD_CALL_BACK_QUEUE *notifier, unsigned long data) -{ - tty_ctl_block_t *ctl_b = container_of(notifier, tty_ctl_block_t, tty_notifier); - int md_id = ctl_b->m_md_id; - - switch (data) - { - case CCCI_MD_RESET: - CCCI_TTY_MSG(md_id, "tty_call_back_func: reset tty buffers \n"); - ccci_reset_buffers(ctl_b->ccci_tty_meta.shared_mem, ctl_b->tty_buf_size); - ccci_reset_buffers(ctl_b->ccci_tty_modem.shared_mem, ctl_b->tty_buf_size); - ccci_reset_buffers(ctl_b->ccci_tty_ipc.shared_mem, ctl_b->tty_buf_size); -#ifdef CONFIG_MTK_ICUSB_SUPPORT - ccci_reset_buffers(ctl_b->ccci_tty_icusb.shared_mem, ctl_b->tty_buf_size); -#endif - break; - - default: - break; - } -} - -static struct file_operations ccci_tty_ops= -{ - .owner = THIS_MODULE, - .open = ccci_tty_open, - .read = ccci_tty_read, - .write = ccci_tty_write, - .release = ccci_tty_release, - .unlocked_ioctl = ccci_tty_ioctl, - .poll = ccci_tty_poll, - -}; - -void tty_timer_func(unsigned long data) -{ - #if 0 - tty_instance_t *tty_instance = (tty_instance_t *) data; - tty_ctl_block_t *ctlb = NULL; - int md_id = tty_instance->m_md_id;; - - CCCI_DBG_MSG(md_id, "tty", "timer func running\n"); - switch (tty_instance->idx) - { - case CCCI_TTY_MODEM: - ctlb = container_of(tty_instance, tty_ctl_block_t, ccci_tty_modem); - tasklet_schedule(&ctlb->ccci_tty_modem_read_tasklet); - break; - case CCCI_TTY_META: - CCCI_DBG_MSG(md_id, "tty", "timer: META\n"); - ctlb = container_of(tty_instance, tty_ctl_block_t, ccci_tty_meta); - tasklet_schedule(&ctlb->ccci_tty_meta_read_tasklet); - break; - case CCCI_TTY_IPC: - ctlb = container_of(tty_instance, tty_ctl_block_t, ccci_tty_ipc); - tasklet_schedule(&ctlb->ccci_tty_ipc_read_tasklet); - break; - } - #endif -} - -#define CCCI_TTY_NAME "ccci_tty_drv" -#ifdef CONFIG_MTK_ICUSB_SUPPORT -#define CCCI_TTY_DEV_NUM (4) -#else -#define CCCI_TTY_DEV_NUM (3) -#endif - -void ccci_tty_instance_init(tty_instance_t *instance) -{ - rwlock_init(&instance->ccci_tty_rwlock); - spin_lock_init(&instance->poll_lock); - wake_lock_init(&instance->wake_lock, WAKE_LOCK_SUSPEND, instance->wakelock_name); - //setup_timer(&instance->timer, tty_timer_func, instance); - mutex_init(&instance->ccci_tty_mutex); - init_waitqueue_head(&instance->read_waitq); - init_waitqueue_head(&instance->write_waitq); - init_waitqueue_head(&instance->poll_waitq_r); - init_waitqueue_head(&instance->poll_waitq_w); - //tasklet_init(&instance->ccci_tty_tasklet, ccci_tty_read, instance); -} - -int ccci_tty_init(int md_id) -{ - int ret = 0; - int smem_phy = 0; - int smem_size = 0; - int tty_buf_len; - int major,minor; - tty_ctl_block_t *ctlb; - char name[16]; - - // Create control block structure - ctlb = (tty_ctl_block_t *)kmalloc(sizeof(tty_ctl_block_t), GFP_KERNEL); - if(ctlb == NULL) - return -CCCI_ERR_GET_MEM_FAIL; - - memset(ctlb, 0, sizeof(tty_ctl_block_t)); - tty_ctlb[md_id] = ctlb; - - // Init ctlb - ctlb->m_md_id = md_id; - ctlb->tty_notifier.call = tty_call_back_func; - ctlb->tty_notifier.next = NULL; - ret = md_register_call_chain(md_id ,&ctlb->tty_notifier); - if(ret) { - CCCI_MSG_INF(md_id, "tty", "md_register_call_chain fail: %d\n", ret); - goto _RELEASE_CTL_MEMORY; - } - - ret = get_dev_id_by_md_id(md_id, "tty", &major, &minor); - if(ret < 0) - goto _RELEASE_CTL_MEMORY; - - snprintf(name, 16, "%s%d", CCCI_TTY_NAME, md_id); - if (register_chrdev_region(MKDEV(major, minor), CCCI_TTY_DEV_NUM, name) != 0) { - CCCI_MSG_INF(md_id, "tty", "regsiter CCCI_TTY fail\n"); - ret = -1; - goto _RELEASE_CTL_MEMORY; - } - - cdev_init(&ctlb->ccci_tty_dev, &ccci_tty_ops); - ctlb->ccci_tty_dev.owner = THIS_MODULE; - ret = cdev_add(&ctlb->ccci_tty_dev, MKDEV(major,minor), CCCI_TTY_DEV_NUM); - if (ret) { - CCCI_MSG_INF(md_id, "tty", "cdev_add fail\n"); - goto _DEL_TTY_DRV; - } - - snprintf(ctlb->drv_name, 32, CCCI_TTY_NAME"_%d", md_id); - if(md_id == MD_SYS1) - snprintf(ctlb->node_name, 16, "ttyC"); - else if (md_id == MD_SYS2) - snprintf(ctlb->node_name, 16, "ccci%d_tty", md_id+1); - - ASSERT(ccci_uart_base_req(md_id, 0, (int*)&ctlb->uart1_shared_mem, &smem_phy, &smem_size) == 0); - //CCCI_DBG_MSG(md_id, "tty", "TTY0 %x:%x:%d\n", (unsigned int)ctlb->uart1_shared_mem, - // (unsigned int)smem_phy, smem_size); - - // Get tty config information - ASSERT(ccci_get_sub_module_cfg(md_id, "tty", (char*)&tty_buf_len, sizeof(int)) == sizeof(int) ); - tty_buf_len = (tty_buf_len - sizeof(shared_mem_tty_t))/2; - ctlb->tty_buf_size = tty_buf_len; - - // Meta section - ctlb->uart1_shared_mem->tx_control.length = tty_buf_len; - ctlb->uart1_shared_mem->tx_control.read = 0; - ctlb->uart1_shared_mem->tx_control.write = 0; - ctlb->uart1_shared_mem->rx_control.length = tty_buf_len; - ctlb->uart1_shared_mem->rx_control.read = 0; - ctlb->uart1_shared_mem->rx_control.write = 0; - - // meta related channel register - ASSERT(register_to_logic_ch(md_id, CCCI_UART1_RX, ccci_tty_callback, ctlb) == 0); - //ASSERT(ccci_register(CCCI_UART1_RX_ACK, ccci_tty_callback, NULL) == CCCI_SUCCESS); - //ASSERT(ccci_register(CCCI_UART1_TX, ccci_tty_callback, NULL) == CCCI_SUCCESS); - ASSERT(register_to_logic_ch(md_id, CCCI_UART1_TX_ACK, ccci_tty_callback, ctlb) == 0); - - ctlb->ccci_tty_meta.need_reset = 0; - ctlb->ccci_tty_meta.reset_handle = -1; - ctlb->ccci_tty_meta.count = 0; - ctlb->ccci_tty_meta.channel = 0; - ctlb->ccci_tty_meta.shared_mem = ctlb->uart1_shared_mem; - ctlb->ccci_tty_meta.uart_tx = CCCI_UART1_TX; - ctlb->ccci_tty_meta.uart_rx_ack = CCCI_UART1_RX_ACK; - ctlb->ccci_tty_meta.ready = 1; - ctlb->ccci_tty_meta.idx = 1; - snprintf(ctlb->ccci_tty_meta.wakelock_name, sizeof(ctlb->ccci_tty_meta.wakelock_name), "%s%d", "ccci_meta", (md_id+1)); - ccci_tty_instance_init(&ctlb->ccci_tty_meta); - - // MUX section - ASSERT(ccci_uart_base_req(md_id, 1, (int*)&ctlb->uart2_shared_mem, &smem_phy, &smem_size) == 0); - //CCCI_DBG_MSG(md_id, "tty", "TTY1 %x:%x:%d\n", (unsigned int)ctlb->uart2_shared_mem, - // (unsigned int)smem_phy, smem_size); - - ctlb->uart2_shared_mem->tx_control.length = tty_buf_len; - ctlb->uart2_shared_mem->tx_control.read = 0; - ctlb->uart2_shared_mem->tx_control.write = 0; - - ctlb->uart2_shared_mem->rx_control.length = tty_buf_len; - ctlb->uart2_shared_mem->rx_control.read = 0; - ctlb->uart2_shared_mem->rx_control.write = 0; - - // modem related channel registration. - ASSERT(register_to_logic_ch(md_id, CCCI_UART2_RX, ccci_tty_callback, ctlb) == 0); - //ASSERT(ccci_register(CCCI_UART2_RX_ACK, ccci_tty_callback, NULL) == CCCI_SUCCESS); - //ASSERT(ccci_register(CCCI_UART2_TX, ccci_tty_callback, NULL) == CCCI_SUCCESS); - ASSERT(register_to_logic_ch(md_id, CCCI_UART2_TX_ACK, ccci_tty_callback, ctlb) == 0); - - // modem reset registration. - ctlb->ccci_tty_modem.need_reset = 1; - ctlb->ccci_tty_modem.reset_handle = -1; - ctlb->ccci_tty_modem.count = 0; - ctlb->ccci_tty_modem.channel = 1; - ctlb->ccci_tty_modem.shared_mem = ctlb->uart2_shared_mem; - ctlb->ccci_tty_modem.uart_tx = CCCI_UART2_TX; - ctlb->ccci_tty_modem.uart_rx_ack = CCCI_UART2_RX_ACK; - ctlb->ccci_tty_modem.ready = 1; - ctlb->ccci_tty_modem.idx = 0; - snprintf(ctlb->ccci_tty_modem.wakelock_name, sizeof(ctlb->ccci_tty_modem.wakelock_name), "%s%d", "ccci_modem", (md_id+1)); - ccci_tty_instance_init(&ctlb->ccci_tty_modem); - - // for IPC uart - ASSERT(ccci_uart_base_req(md_id, 5, (int*)&ctlb->uart3_shared_mem, &smem_phy, &smem_size) == 0); - //CCCI_DBG_MSG(md_id, "tty", "TTY2 %x:%x:%d\n", (unsigned int)ctlb->uart3_shared_mem, - // (unsigned int)smem_phy, smem_size); - - ctlb->uart3_shared_mem->tx_control.length = tty_buf_len; - ctlb->uart3_shared_mem->tx_control.read = 0; - ctlb->uart3_shared_mem->tx_control.write = 0; - ctlb->uart3_shared_mem->rx_control.length = tty_buf_len; - ctlb->uart3_shared_mem->rx_control.read = 0; - ctlb->uart3_shared_mem->rx_control.write = 0; - // IPC related channel register - ASSERT(register_to_logic_ch(md_id, CCCI_IPC_UART_RX, ccci_tty_callback, ctlb) == 0); - //ASSERT(ccci_register(CCCI_IPC_UART_RX_ACK, ccci_tty_callback, NULL) == CCCI_SUCCESS); - //ASSERT(ccci_register(CCCI_IPC_UART_TX, ccci_tty_callback, NULL) == CCCI_SUCCESS); - ASSERT(register_to_logic_ch(md_id, CCCI_IPC_UART_TX_ACK, ccci_tty_callback, ctlb) == 0); - - // IPC reset register - ctlb->ccci_tty_ipc.need_reset = 0; - ctlb->ccci_tty_ipc.reset_handle = -1; - ctlb->ccci_tty_ipc.count = 0; - ctlb->ccci_tty_ipc.channel = 1; - ctlb->ccci_tty_ipc.shared_mem = ctlb->uart3_shared_mem; - ctlb->ccci_tty_ipc.uart_tx = CCCI_IPC_UART_TX; - ctlb->ccci_tty_ipc.uart_rx_ack = CCCI_IPC_UART_RX_ACK; - ctlb->ccci_tty_ipc.ready = 1; - ctlb->ccci_tty_ipc.idx = 2; - snprintf(ctlb->ccci_tty_ipc.wakelock_name, sizeof(ctlb->ccci_tty_ipc.wakelock_name), "%s%d", "ccci_ipc", (md_id+1)); - ccci_tty_instance_init(&ctlb->ccci_tty_ipc); - -#ifdef CONFIG_MTK_ICUSB_SUPPORT - // for ICUSB uart - ASSERT(ccci_uart_base_req(md_id, 6, (int*)&ctlb->uart4_shared_mem, &smem_phy, &smem_size) == 0); - //CCCI_DBG_MSG(md_id, "tty", "TTY2 %x:%x:%d\n", (unsigned int)ctlb->uart3_shared_mem, - // (unsigned int)smem_phy, smem_size); - ctlb->uart4_shared_mem->tx_control.length = tty_buf_len; - ctlb->uart4_shared_mem->tx_control.read = 0; - ctlb->uart4_shared_mem->tx_control.write = 0; - ctlb->uart4_shared_mem->rx_control.length = tty_buf_len; - ctlb->uart4_shared_mem->rx_control.read = 0; - ctlb->uart4_shared_mem->rx_control.write = 0; - // IPC related channel register - ASSERT(register_to_logic_ch(md_id, CCCI_ICUSB_RX, ccci_tty_callback, ctlb) == 0); - //ASSERT(ccci_register(CCCI_IPC_UART_RX_ACK, ccci_tty_callback, NULL) == CCCI_SUCCESS); - //ASSERT(ccci_register(CCCI_IPC_UART_TX, ccci_tty_callback, NULL) == CCCI_SUCCESS); - ASSERT(register_to_logic_ch(md_id, CCCI_ICUSB_TX_ACK, ccci_tty_callback, ctlb) == 0); - - // IPC reset register - ctlb->ccci_tty_icusb.need_reset = 0; - ctlb->ccci_tty_icusb.reset_handle = -1; - ctlb->ccci_tty_icusb.count = 0; - ctlb->ccci_tty_icusb.channel = 1; - ctlb->ccci_tty_icusb.shared_mem = ctlb->uart4_shared_mem; - ctlb->ccci_tty_icusb.uart_tx = CCCI_ICUSB_TX; - ctlb->ccci_tty_icusb.uart_rx_ack = CCCI_ICUSB_RX_ACK; - ctlb->ccci_tty_icusb.ready = 1; - ctlb->ccci_tty_icusb.idx = 3; - snprintf(ctlb->ccci_tty_icusb.wakelock_name, sizeof(ctlb->ccci_tty_icusb.wakelock_name), "%s%d", "ccci_icusb", (md_id+1)); - ccci_tty_instance_init(&ctlb->ccci_tty_icusb); -#endif - - return 0; - -_DEL_TTY_DRV: - unregister_chrdev_region(MKDEV(major,minor), CCCI_TTY_DEV_NUM); - -_RELEASE_CTL_MEMORY: - kfree(ctlb); - tty_ctlb[md_id] = NULL; - - return ret; -} - - -void __exit ccci_tty_exit(int md_id) -{ - tty_ctl_block_t *ctlb = tty_ctlb[md_id]; - - if(ctlb != NULL) { - unregister_chrdev_region(MKDEV(ctlb->major, ctlb->minor),CCCI_TTY_DEV_NUM); - cdev_del(&ctlb->ccci_tty_dev); - un_register_to_logic_ch(md_id, CCCI_UART1_RX); - //ccci_unregister(CCCI_UART1_RX_ACK); - //ccci_unregister(CCCI_UART1_TX); - un_register_to_logic_ch(md_id, CCCI_UART1_TX_ACK); - - un_register_to_logic_ch(md_id, CCCI_UART2_RX); - //ccci_unregister(CCCI_UART2_RX_ACK); - //ccci_unregister(CCCI_UART2_TX); - un_register_to_logic_ch(md_id, CCCI_UART2_TX_ACK); - - un_register_to_logic_ch(md_id, CCCI_IPC_UART_RX); - //ccci_unregister(CCCI_IPC_UART_RX_ACK); - //ccci_unregister(CCCI_IPC_UART_TX); - un_register_to_logic_ch(md_id, CCCI_IPC_UART_TX_ACK); - -#ifdef CONFIG_MTK_ICUSB_SUPPORT - un_register_to_logic_ch(md_id, CCCI_ICUSB_RX); - un_register_to_logic_ch(md_id, CCCI_ICUSB_TX_ACK); -#endif - ctlb->uart1_shared_mem = NULL; - ctlb->uart2_shared_mem = NULL; - ctlb->uart3_shared_mem = NULL; -#ifdef CONFIG_MTK_ICUSB_SUPPORT - ctlb->uart4_shared_mem = NULL; -#endif - - wake_lock_destroy(&ctlb->ccci_tty_modem.wake_lock); - wake_lock_destroy(&ctlb->ccci_tty_meta.wake_lock); - wake_lock_destroy(&ctlb->ccci_tty_ipc.wake_lock); -#ifdef CONFIG_MTK_ICUSB_SUPPORT - wake_lock_destroy(&ctlb->ccci_tty_icusb.wake_lock); -#endif - - kfree(ctlb); - tty_ctlb[md_id] = NULL; - } - - return; -} diff --git a/drivers/misc/mediatek/dual_ccci/ccmni.c b/drivers/misc/mediatek/dual_ccci/ccmni.c deleted file mode 100644 index 0f862ac4d47..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccmni.c +++ /dev/null @@ -1,122 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccmni.c - * - * Project: - * -------- - * - * - * Description: - * ------------ - * - * - * Author: - * ------- - * - * - ****************************************************************************/ -#include -extern int ccmni_v1_init(int md_id); -extern void ccmni_v1_exit(int md_id); -extern int ccmni_v2_init(int md_id); -extern void ccmni_v2_exit(int md_id); -extern int ccmni_v1_ipo_h_restore(int md_id); -extern int ccmni_v2_ipo_h_restore(int md_id); - - -void *ccmni_ctl_block[MAX_MD_NUM]; - -static char mac_addr_table[MAX_MD_NUM*5][ETH_ALEN]; -static int mac_addr_num = 0; - - -int is_mac_addr_duplicate(char *mac) -{ - int i = 0, j; - int found = 0; - - for(i=0; i= (MAX_MD_NUM*5) ) - mac_addr_num--; - } - return 0; -} - -int ccmni_init(int md_id) -{ - int ccmni_version = 0; - - if(ccci_get_sub_module_cfg(md_id, "net", (char*)&ccmni_version, sizeof(int)) != sizeof(int)) { - CCCI_MSG_INF(md_id, "net", "[Error]get ccmni version fail\n"); - return -1; - } else { - CCCI_MSG_INF(md_id, "net", "ccmni driver v%d\n", ccmni_version); - } - - switch(ccmni_version) - { - case 1: - return ccmni_v1_init(md_id); - case 2: - return ccmni_v2_init(md_id); - default: - CCCI_MSG_INF(md_id, "net", "[Error]invalid CCMNI version: %d\n", ccmni_version); - return -1; - } -} - - -void ccmni_exit(int md_id) -{ - int ccmni_version = 0; - - if(ccci_get_sub_module_cfg(md_id, "net", (char*)&ccmni_version, sizeof(int)) != sizeof(int)) { - CCCI_MSG_INF(md_id, "net", "get ccmni version fail\n"); - return; - } - - switch(ccmni_version) - { - case 1: - return ccmni_v1_exit(md_id); - case 2: - return ccmni_v2_exit(md_id); - default: - CCCI_MSG_INF(md_id, "net", "[Error]invalid CCMNI version: %d\n", ccmni_version); - return; - } -} - - -int ccmni_ipo_h_restore(int md_id) -{ - int ccmni_version = 0; - - if(ccci_get_sub_module_cfg(md_id, "net", (char*)&ccmni_version, sizeof(int)) != sizeof(int)) { - CCCI_MSG("Get ccmni verion fail\n"); - return -1; - } - - switch(ccmni_version) - { - case 1: - return ccmni_v1_ipo_h_restore(md_id); - case 2: - return ccmni_v2_ipo_h_restore(md_id); - default: - CCCI_MSG("[Error]CCMNI not support version\n"); - return -1; - } -} - diff --git a/drivers/misc/mediatek/dual_ccci/ccmni_net.c b/drivers/misc/mediatek/dual_ccci/ccmni_net.c deleted file mode 100644 index 0724e50a863..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccmni_net.c +++ /dev/null @@ -1,922 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccmni.c - * - * Project: - * -------- - * YuSu - * - * Description: - * ------------ - * MT6516 Cross Chip Modem Network Interface - * - * Author: - * ------- - * TL Lau (mtk02008) - * - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define CCMNI_TX_QUEUE 8 -#define CCMNI_UART_OFFSET 2 - -extern void *ccmni_ctl_block[]; - -typedef struct -{ - int channel; - int m_md_id; - int uart_rx; - int uart_rx_ack; - int uart_tx; - int uart_tx_ack; - int ready; - int net_if_off; - unsigned long flags; - struct timer_list timer; - unsigned long send_len; - struct net_device *dev; - struct wake_lock wake_lock; - spinlock_t spinlock; - - shared_mem_tty_t *shared_mem; - int shared_mem_phys_addr; - - unsigned char write_buffer [CCMNI_MTU + 4]; - unsigned char read_buffer [CCCI1_CCMNI_BUF_SIZE]; - unsigned char decode_buffer[CCCI1_CCMNI_BUF_SIZE]; - - unsigned char mac_addr [ETH_ALEN]; - - struct tasklet_struct tasklet; - void *owner; - -} ccmni_instance_t; - -typedef struct _ccmni_v1_ctl_block -{ - int m_md_id; - int ccci_is_ready; - ccmni_instance_t *ccmni_instance[CCMNI_V1_PORT_NUM]; - struct wake_lock ccmni_wake_lock; - char wakelock_name[16]; - MD_CALL_BACK_QUEUE ccmni_notifier; -}ccmni_v1_ctl_block_t; - -static void ccmni_read (unsigned long arg); -//static DECLARE_TASKLET (ccmni_read_tasklet, ccmni_read, 0); - -static void reset_ccmni_instance_buffer(ccmni_instance_t *ccmni_instance) -{ - unsigned long flags; - spin_lock_irqsave(&ccmni_instance->spinlock, flags); - ccci_reset_buffers(ccmni_instance->shared_mem, CCCI1_CCMNI_BUF_SIZE); - spin_unlock_irqrestore(&ccmni_instance->spinlock, flags); -} - -int ccmni_v1_ipo_h_restore(int md_id) -{ - int i; - ccmni_v1_ctl_block_t *ctlb; - - ctlb = ccmni_ctl_block[md_id]; - for(i=0; iccmni_instance[i]->shared_mem, CCCI1_CCMNI_BUF_SIZE); - - return 0; -} - -static void restore_ccmni_instance(ccmni_instance_t *ccmni_instance) -{ - unsigned long flags; - spin_lock_irqsave(&ccmni_instance->spinlock, flags); - if(ccmni_instance->net_if_off) { - ccmni_instance->net_if_off = 0; - netif_carrier_on(ccmni_instance->dev); - } - spin_unlock_irqrestore(&ccmni_instance->spinlock, flags); -} - -static void stop_ccmni_instance(ccmni_instance_t *ccmni_instance) -{ - unsigned long flags; - spin_lock_irqsave(&ccmni_instance->spinlock, flags); - if(ccmni_instance->net_if_off == 0) { - ccmni_instance->net_if_off = 1; - del_timer(&ccmni_instance->timer); - netif_carrier_off(ccmni_instance->dev); - } - spin_unlock_irqrestore(&ccmni_instance->spinlock, flags); -} - - -static void ccmni_notifier_call(MD_CALL_BACK_QUEUE *notifier, unsigned long val) -{ - int i; - ccmni_v1_ctl_block_t *ctl_b = container_of(notifier, ccmni_v1_ctl_block_t, - ccmni_notifier); - ccmni_instance_t *instance; - - switch(val) - { - case CCCI_MD_EXCEPTION : - ctl_b->ccci_is_ready=0; - for(i=0;iccmni_instance[i]; - if (instance) - stop_ccmni_instance(instance); - } - break; - case CCCI_MD_STOP: - for(i=0;iccmni_instance[i]; - if (instance) { - stop_ccmni_instance(instance); - } - } - break; - case CCCI_MD_RESET : - ctl_b->ccci_is_ready=0; - for(i=0;iccmni_instance[i]; - if (instance) { - reset_ccmni_instance_buffer(instance); - } - } - break; - - case CCCI_MD_BOOTUP: - if (ctl_b->ccci_is_ready==0) - { - ctl_b->ccci_is_ready=1; - for(i=0;iccmni_instance[i]; - if (instance) - restore_ccmni_instance(instance); - } - } - break; - - default: - break; - } - - return ; -} - - -static void timer_func(unsigned long data) -{ - ccmni_instance_t *ccmni=(ccmni_instance_t *)data; - int contin=0; - int ret=0; - ccci_msg_t msg; - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - spin_lock_bh(&ccmni->spinlock); - - if (ctl_b->ccci_is_ready == 0) - goto out; - - if (test_bit(CCMNI_RECV_ACK_PENDING,&ccmni->flags)) - { - msg.magic = 0; - msg.id = CCMNI_CHANNEL_OFFSET + ccmni->channel; - msg.channel = ccmni->uart_rx_ack; - msg.reserved = 0; - ret = ccci_message_send(md_id, &msg, 1); - - if (ret==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) - contin=1; - else - clear_bit(CCMNI_RECV_ACK_PENDING, &ccmni->flags); - } - - if (test_bit(CCMNI_SEND_PENDING,&ccmni->flags)) - { - msg.addr = 0; - msg.len = ccmni->send_len; - msg.channel = ccmni->uart_tx; - msg.reserved = 0; - ret = ccci_message_send(md_id, &msg, 1); - - if (ret==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) - contin=1; - else { - clear_bit(CCMNI_SEND_PENDING,&ccmni->flags); - ccmni->send_len=0; - } - } -out: - spin_unlock_bh(&ccmni->spinlock); - if (contin) - mod_timer(&ccmni->timer,jiffies+2); - - return; - -} - -static void ccmni_make_etherframe(void *_eth_hdr, u8 *mac_addr, int packet_type) -{ - struct ethhdr *eth_hdr = _eth_hdr; - - memcpy(eth_hdr->h_dest, mac_addr, sizeof(eth_hdr->h_dest)); - memset(eth_hdr->h_source, 0, sizeof(eth_hdr->h_source)); - if(packet_type == IPV6_VERSION){ - eth_hdr->h_proto = __constant_cpu_to_be16(ETH_P_IPV6); - }else{ - eth_hdr->h_proto = __constant_cpu_to_be16(ETH_P_IP); - } -} - -static int ccmni_receive(ccmni_instance_t *ccmni, int length) -{ - int counter, ret; - packet_info_t packet_info; - complete_ippkt_t *packet; - complete_ippkt_t *processed_packet; - struct sk_buff *skb; - complete_ippkt_t last_packet = {0}; - int offset_put_pkt = 0; - int offset_parse_frame = 0; - int packet_type; - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_receive() invoke pfp_unframe()\n", ccmni->channel); - do - { - packet_info = pfp_unframe(ccmni->decode_buffer+offset_put_pkt, \ - CCCI1_CCMNI_BUF_SIZE-offset_put_pkt, ccmni->read_buffer+offset_parse_frame, \ - length, ccmni->channel); - packet = packet_info.pkt_list; - - CCCI_CCMNI_MSG(md_id, "CCMNI%d num_complete_pkt=%d after pfp_unframe \n", \ - ccmni->channel, packet_info.num_complete_packets); - - for(counter = 0; counter < packet_info.num_complete_packets; counter++) - { - skb = dev_alloc_skb(packet->pkt_size); - if (skb) - { - packet_type = packet->pkt_data[0] & 0xF0; - memcpy(skb_put(skb, packet->pkt_size), packet->pkt_data, packet->pkt_size); - ccmni_make_etherframe(skb->data - ETH_HLEN, ccmni->dev->dev_addr, packet_type); - skb_set_mac_header(skb, -ETH_HLEN); - skb->dev = ccmni->dev; - if(packet_type == IPV6_VERSION){ - skb->protocol = htons(ETH_P_IPV6); - } - else { - skb->protocol = htons(ETH_P_IP); - } - skb->ip_summed = CHECKSUM_NONE; - - ret = netif_rx(skb); - - CCCI_CCMNI_MSG(md_id, "CCMNI%d invoke netif_rx()=%d\n", ccmni->channel, ret); - ccmni->dev->stats.rx_packets++; - ccmni->dev->stats.rx_bytes += packet->pkt_size; - CCCI_CCMNI_MSG(md_id, "CCMNI%d rx_pkts=%ld, stats_rx_bytes=%ld\n", ccmni->channel, \ - ccmni->dev->stats.rx_packets, ccmni->dev->stats.rx_bytes); - } - else - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d Socket buffer allocate fail\n", ccmni->channel); - } - - processed_packet = packet; - last_packet = *processed_packet; - packet = packet->next; - - /* Only clear the entry_used flag as 0 */ - release_one_used_complete_ippkt_entry(processed_packet); - }; - - /* It must to check if it is necessary to invoke the pfp_unframe() again due to no available complete_ippkt entry */ - if (packet_info.try_decode_again == 1) - { - offset_put_pkt += (last_packet.pkt_data - ccmni->decode_buffer + last_packet.pkt_size); - offset_parse_frame += packet_info.consumed_length; - } - } while (packet_info.try_decode_again == 1); - - offset_parse_frame += packet_info.consumed_length; - return offset_parse_frame; -} - -static void ccmni_read(unsigned long arg) -{ - int part, size; - int ret; - int read, write, consumed; - unsigned char *string; - ccmni_instance_t *ccmni = (ccmni_instance_t *) arg; - ccci_msg_t msg; - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t*)ccmni->owner; - int md_id= ctl_b->m_md_id; - char *rx_buffer; - - spin_lock_bh(&ccmni->spinlock); - if (ctl_b->ccci_is_ready==0) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read fail when modem not ready\n", ccmni->channel); - goto out; - } - - string = ccmni->read_buffer; - read = ccmni->shared_mem->rx_control.read; - write = ccmni->shared_mem->rx_control.write; - size = write - read; - part = 0; - rx_buffer = ccmni->shared_mem->buffer; - - if (size < 0) - { - size += ccmni->shared_mem->rx_control.length; - } - - if (read > write) - { - part = ccmni->shared_mem->rx_control.length - read; - memcpy(string, &rx_buffer[read], part); - - size -= part; - string += part; - read = 0; - } - - memcpy(string, &rx_buffer[read], size); - CCCI_CCMNI_MSG(md_id, "CCMNI%d_receive[Before]: size=%d, read=%d\n", \ - ccmni->channel, (size+part), read); - consumed = ccmni_receive(ccmni, size + part); - CCCI_CCMNI_MSG(md_id, "CCMNI%d_receive[After]: consume=%d\n", ccmni->channel, consumed); - - // Calculate the new position of the read pointer. - // Take into consideration the number of bytes actually consumed; - // i.e. number of bytes taken up by complete IP packets. - read += size; - if (read >= ccmni->shared_mem->rx_control.length) - { - read -= ccmni->shared_mem->rx_control.length; - } - - if (consumed < (size + part)) - { - read -= ((size + part) - consumed); - if (read < 0) - { - read += ccmni->shared_mem->rx_control.length; - } - } - - ccmni->shared_mem->rx_control.read = read; - // Send an acknowledgement back to modem side. - CCCI_CCMNI_MSG(md_id, "CCMNI%d_read to write mailbox(ch%d, tty%d)\n", ccmni->channel, - ccmni->uart_rx_ack, CCMNI_CHANNEL_OFFSET + ccmni->channel); - //ret = ccci_write_mailbox(ccmni->uart_rx_ack, CCMNI_CHANNEL_OFFSET + ccmni->channel); - msg.magic = 0xFFFFFFFF; - msg.id = CCMNI_CHANNEL_OFFSET + ccmni->channel; - msg.channel = ccmni->uart_rx_ack; - msg.reserved = 0; - ret = ccci_message_send(md_id, &msg, 1); - if (ret==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) - { - set_bit(CCMNI_RECV_ACK_PENDING,&ccmni->flags); - mod_timer(&ccmni->timer,jiffies); - } - else if (ret==sizeof(ccci_msg_t)) - clear_bit(CCMNI_RECV_ACK_PENDING,&ccmni->flags); -out: - spin_unlock_bh(&ccmni->spinlock); - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_read invoke wake_lock_timeout(1s)\n", ccmni->channel); - wake_lock_timeout(&ctl_b->ccmni_wake_lock, HZ); - - return; -} - - -// will be called when modem sends us something. -// we will then copy it to the tty's buffer. -// this is essentially the "read" fops. -static void ccmni_callback(void *private) -{ - logic_channel_info_t *ch_info = (logic_channel_info_t*)private; - ccmni_instance_t *ccmni = (ccmni_instance_t *)(ch_info->m_owner); - ccci_msg_t msg; - - while(get_logic_ch_data(ch_info, &msg)){ - switch(msg.channel) - { - case CCCI_CCMNI1_TX_ACK: - case CCCI_CCMNI2_TX_ACK: - case CCCI_CCMNI3_TX_ACK: - // this should be in an interrupt, - // so no locking required... - ccmni->ready = 1; - netif_wake_queue(ccmni->dev); - break; - - case CCCI_CCMNI1_RX: - case CCCI_CCMNI2_RX: - case CCCI_CCMNI3_RX: - //ccmni_read_tasklet2.data = (unsigned long) private_data; - //tasklet_schedule(&ccmni_read_tasklet); - tasklet_schedule(&ccmni->tasklet); - break; - - default: - break; - } - } -} - - -static void ccmni_write(ccmni_instance_t *ccmni, frame_info_t *frame_info) -{ - int size, over, total; - int ret; - unsigned read, write, length, len; - unsigned tmp_write; - unsigned char *ptr; - ccci_msg_t msg; - char *tx_buffer; - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - - size = 0; - ptr = (unsigned char *) frame_info->frame_list[0].frame_data; - len = frame_info->frame_list[0].frame_size; - - - read = ccmni->shared_mem->tx_control.read; - write = ccmni->shared_mem->tx_control.write; - length = ccmni->shared_mem->tx_control.length; - over = length - write; - tx_buffer = ccmni->shared_mem->buffer + length; - - if (read == write) - { - size = length; - } - else if (read < write) - { - size = length - write; - size += read; - } - else - { - size = read - write; - } - - if (len > size) - { - len = size; - total = size; - } - - total = len; - - if (over < len) - { - memcpy(&tx_buffer[write], (void *) ptr, over); - len -= over; - ptr += over; - write = 0; - } - - memcpy(&tx_buffer[write], (void *) ptr, len); - mb(); - tmp_write = write + len; - if (tmp_write >= length) - { - tmp_write -= length; - } - ccmni->shared_mem->tx_control.write = tmp_write; - - // ccmni->ready = 0; - len = total; - msg.addr = 0; - msg.len = len; - msg.channel = ccmni->uart_tx; - msg.reserved = 0; - - ret = ccci_message_send(md_id, &msg, 1); - if (ret==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) - { - set_bit(CCMNI_SEND_PENDING,&ccmni->flags); - ccmni->send_len +=len; - mod_timer(&ccmni->timer,jiffies); - } - else if (ret==sizeof(ccci_msg_t)) - clear_bit(CCMNI_SEND_PENDING,&ccmni->flags); - - return; -} - - -// The function start_xmit is called when there is one packet to transmit. -static int ccmni_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - int ret = NETDEV_TX_OK; - int size; - unsigned int read, write, length; - frame_info_t frame_info; - ccmni_instance_t *ccmni = netdev_priv(dev); - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - - spin_lock_bh(&ccmni->spinlock); - - if (ctl_b->ccci_is_ready==0) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d transfer data fail when modem not ready \n", ccmni->channel); - ret = NETDEV_TX_BUSY; - goto _ccmni_start_xmit_busy; - } - - read = ccmni->shared_mem->tx_control.read; - write = ccmni->shared_mem->tx_control.write; - length = ccmni->shared_mem->tx_control.length; - size = read - write; - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_start_xmit: skb_len=%d, size=%d, ccmni_ready=%d \n", \ - ccmni->channel, skb->len, size, ccmni->ready); - - if (size <= 0) - { - size += length; - } - - if (skb->len > CCMNI_MTU) - { - // Sanity check; this should not happen! - // Digest and return OK. - CCCI_DBG_MSG(md_id, "net", "CCMNI%d packet size exceed 1500 bytes: size=%d \n", \ - ccmni->channel, skb->len); - dev->stats.tx_dropped++; - goto _ccmni_start_xmit_exit; - } - - if(size >= 1) - size-=1; - else - CCCI_DBG_MSG(md_id, "net", "CCMNI%d size is Zero(1) \n", ccmni->channel); - - if (size < (skb->len + 4)) - { - // The TX buffer is full, or its not ready yet, - // we should stop the net queue for the moment. - CCCI_DBG_MSG(md_id, "net", "CCMNI%d TX busy and stop queue: size=%d, skb->len=%d \n", \ - ccmni->channel, size, skb->len); - CCCI_DBG_MSG(md_id, "net", " TX read = %d write = %d\n", \ - ccmni->shared_mem->tx_control.read, ccmni->shared_mem->tx_control.write); - CCCI_DBG_MSG(md_id, "net", " RX read = %d write = %d\n", \ - ccmni->shared_mem->rx_control.read, ccmni->shared_mem->rx_control.write); - - netif_stop_queue(ccmni->dev); - - // Set CCMNI ready to ZERO, and wait for the ACK from modem side. - ccmni->ready = 0; - ret = NETDEV_TX_BUSY; - - goto _ccmni_start_xmit_busy; - } - - frame_info = pfp_frame(ccmni->write_buffer, skb->data, skb->len, FRAME_START, ccmni->channel); - ccmni_write (ccmni, &frame_info); - - dev->stats.tx_packets++; - dev->stats.tx_bytes += skb->len; - -_ccmni_start_xmit_exit: - dev_kfree_skb(skb); - -_ccmni_start_xmit_busy: - spin_unlock_bh(&ccmni->spinlock); - - return ret; -} - - -static int ccmni_open(struct net_device *dev) -{ - ccmni_instance_t *ccmni = netdev_priv(dev); - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t*)ccmni->owner; - int md_id= ctl_b->m_md_id; - - CCCI_MSG_INF(md_id, "net", "CCMNI%d open \n", ccmni->channel); - if (ctl_b->ccci_is_ready == 0) { - CCCI_MSG_INF(md_id, "net", "CCMNI%d open fail when modem not ready \n", ccmni->channel); - return -EIO; - } - netif_start_queue(dev); - return 0; -} - -static int ccmni_close(struct net_device *dev) -{ - ccmni_instance_t *ccmni = netdev_priv(dev); - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t*)ccmni->owner; - - CCCI_MSG_INF(ctl_b->m_md_id, "net", "CCMNI%d close \n", ccmni->channel); - netif_stop_queue(dev); - return 0; -} - -static int ccmni_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - // No implementation at this moment. - // This is a place holder. - - return 0; -} - - -static void ccmni_tx_timeout(struct net_device *dev) -{ - // No implementation at this moment. - // This is a place holder. - - dev->stats.tx_errors++; - netif_wake_queue(dev); -} - - -static const struct net_device_ops ccmni_netdev_ops = -{ - .ndo_open = ccmni_open, - .ndo_stop = ccmni_close, - .ndo_start_xmit = ccmni_start_xmit, - .ndo_do_ioctl = ccmni_net_ioctl, - .ndo_tx_timeout = ccmni_tx_timeout, -}; - -extern int is_mac_addr_duplicate(char *mac); -static void ccmni_setup(struct net_device *dev) -{ - int retry = 10; - - ether_setup(dev); - - dev->header_ops = NULL; - dev->netdev_ops = &ccmni_netdev_ops; - dev->flags = IFF_NOARP & (~IFF_BROADCAST & ~IFF_MULTICAST); - dev->mtu = CCMNI_MTU; - dev->tx_queue_len = CCMNI_TX_QUEUE; - dev->addr_len = ETH_ALEN; - dev->destructor = free_netdev; - - while(retry-->0){ - random_ether_addr((u8 *) dev->dev_addr); - if(is_mac_addr_duplicate((u8*)dev->dev_addr)) - continue; - else - break; - } - - return; -} - -static int ccmni_create_instance(int md_id, int channel) -{ - int ret, size; - int uart_rx, uart_rx_ack; - int uart_tx, uart_tx_ack; - ccmni_instance_t *ccmni; - struct net_device *dev = NULL; - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t *)ccmni_ctl_block[md_id]; - - // Network device creation and registration. - dev = alloc_netdev(sizeof(ccmni_instance_t), "", ccmni_setup); - if (dev == NULL) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d allocate netdev fail!\n", channel); - return -ENOMEM; - } - - ccmni = netdev_priv(dev); - ccmni->dev = dev; - ccmni->channel = channel; - ccmni->owner = ccmni_ctl_block[md_id]; - - if(md_id == MD_SYS1) { - sprintf(dev->name, "ccmni%d", channel); - } else { - sprintf(dev->name, "cc%dmni%d", md_id+1, channel); - //sprintf(dev->name, "ccmni%d", channel); - } - - ret = register_netdev(dev); - if (ret != 0) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d register netdev fail: %d\n", ccmni->channel, ret); - goto _ccmni_create_instance_exit; - } - - // CCCI channel registration. - ASSERT(ccci_uart_base_req(md_id, CCMNI_UART_OFFSET + ccmni->channel, (int*)&ccmni->shared_mem, - &ccmni->shared_mem_phys_addr, &size) == CCCI_SUCCESS); - - if (ccmni->shared_mem == NULL) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d allocate memory fail\n", ccmni->channel); - unregister_netdev(dev); - ret = -ENOMEM; - goto _ccmni_create_instance_exit; - } - - CCCI_CCMNI_MSG(md_id, "0x%08X:0x%08X:%d\n", (unsigned int)ccmni->shared_mem, \ - (unsigned int)ccmni->shared_mem_phys_addr, size); - - ccmni->shared_mem->tx_control.length = CCCI1_CCMNI_BUF_SIZE; - ccmni->shared_mem->tx_control.read = 0; - ccmni->shared_mem->tx_control.write = 0; - - ccmni->shared_mem->rx_control.length = CCCI1_CCMNI_BUF_SIZE; - ccmni->shared_mem->rx_control.read = 0; - ccmni->shared_mem->rx_control.write = 0; - - switch(ccmni->channel) - { - case 0: - uart_rx = CCCI_CCMNI1_RX; - uart_rx_ack = CCCI_CCMNI1_RX_ACK; - uart_tx = CCCI_CCMNI1_TX; - uart_tx_ack = CCCI_CCMNI1_TX_ACK; - break; - - case 1: - uart_rx = CCCI_CCMNI2_RX; - uart_rx_ack = CCCI_CCMNI2_RX_ACK; - uart_tx = CCCI_CCMNI2_TX; - uart_tx_ack = CCCI_CCMNI2_TX_ACK; - break; - - case 2: - uart_rx = CCCI_CCMNI3_RX; - uart_rx_ack = CCCI_CCMNI3_RX_ACK; - uart_tx = CCCI_CCMNI3_TX; - uart_tx_ack = CCCI_CCMNI3_TX_ACK; - break; - - default: - CCCI_MSG_INF(md_id, "net", "[Error]CCMNI%d Invalid ccmni number\n", ccmni->channel); - unregister_netdev(dev); - ret = -ENOSYS; - goto _ccmni_create_instance_exit; - } - ccmni->m_md_id = md_id; - - ccmni->uart_rx = uart_rx; - ccmni->uart_rx_ack = uart_rx_ack; - ccmni->uart_tx = uart_tx; - ccmni->uart_tx_ack = uart_tx_ack; - - // Register this ccmni instance to the ccci driver. - // pass it the notification handler. - ASSERT(register_to_logic_ch(md_id, uart_rx, ccmni_callback, (void *) ccmni) == 0); - ASSERT(register_to_logic_ch(md_id, uart_tx_ack, ccmni_callback, (void *) ccmni) == 0); - - // Initialize the spinlock. - spin_lock_init(&ccmni->spinlock); - setup_timer(&ccmni->timer,timer_func,(unsigned long)ccmni); - - // Initialize the tasklet. - tasklet_init(&ccmni->tasklet, ccmni_read, (unsigned long)ccmni); - - ctl_b->ccmni_instance[channel] = ccmni; - ccmni->ready = 1; - ccmni->net_if_off = 0; - return ret; - -_ccmni_create_instance_exit: - free_netdev(dev); - kfree(ccmni); - ctl_b->ccmni_instance[channel] = NULL; - return ret; -} - - -static void ccmni_destroy_instance(int md_id, int channel) -{ - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t *)ccmni_ctl_block[md_id]; - ccmni_instance_t *ccmni = ctl_b->ccmni_instance[channel]; - - if (ccmni != NULL) - { - ccmni->ready = 0; - un_register_to_logic_ch(md_id, ccmni->uart_rx); - un_register_to_logic_ch(md_id, ccmni->uart_tx_ack); - - if (ccmni->shared_mem != NULL) { - ccmni->shared_mem = NULL; - ccmni->shared_mem_phys_addr = 0; - } - - if(ccmni->dev != NULL) { - unregister_netdev(ccmni->dev); - //free_netdev(ccmni->dev); - } - //tasklet_kill(&ccmni->tasklet); - ctl_b->ccmni_instance[channel] = NULL; - } -} - - -int ccmni_v1_init(int md_id) -{ - int count, ret, curr; - ccmni_v1_ctl_block_t *ctl_b; - - // Create control block structure - ctl_b = (ccmni_v1_ctl_block_t *)kmalloc(sizeof(ccmni_v1_ctl_block_t), GFP_KERNEL); - if(ctl_b == NULL) - return -CCCI_ERR_GET_MEM_FAIL; - - memset(ctl_b, 0, sizeof(ccmni_v1_ctl_block_t)); - ccmni_ctl_block[md_id] = ctl_b; - - // Init ctl_b - ctl_b->m_md_id = md_id; - ctl_b->ccmni_notifier.call = ccmni_notifier_call; - ctl_b->ccmni_notifier.next = NULL; - - for(count = 0; count < CCMNI_V1_PORT_NUM; count++) - { - ret = ccmni_create_instance(md_id, count); - if (ret != 0) { - CCCI_MSG_INF(md_id, "net", "CCMNI%d create instance fail: %d\n", count, ret); - goto _CCMNI_INSTANCE_CREATE_FAIL; - } else { - //CCCI_MSG_INF(md_id, "net", "CCMNI%d create instance ok!\n", count); - } - } - - ret=md_register_call_chain(md_id ,&ctl_b->ccmni_notifier); - if(ret) { - CCCI_MSG_INF(md_id, "net", "md_register_call_chain fail: %d\n", ret); - goto _CCMNI_INSTANCE_CREATE_FAIL; - } - - snprintf(ctl_b->wakelock_name, sizeof(ctl_b->wakelock_name), "ccci%d_net_v1", (md_id+1)); - wake_lock_init(&ctl_b->ccmni_wake_lock, WAKE_LOCK_SUSPEND, ctl_b->wakelock_name); - - return ret; - -_CCMNI_INSTANCE_CREATE_FAIL: - for(curr=0; curr<=count; curr++) { - ccmni_destroy_instance(md_id, curr); - } - kfree(ctl_b); - ccmni_ctl_block[md_id] = NULL; - return ret; -} - - -void ccmni_v1_exit(int md_id) -{ - int count; - ccmni_v1_ctl_block_t *ctl_b = (ccmni_v1_ctl_block_t *)ccmni_ctl_block[md_id]; - - if (ctl_b) { - for(count = 0; count < CCMNI_V1_PORT_NUM; count++) - ccmni_destroy_instance(md_id, count); - - md_unregister_call_chain(md_id, &ctl_b->ccmni_notifier); - wake_lock_destroy(&ctl_b->ccmni_wake_lock); - kfree(ctl_b); - ccmni_ctl_block[md_id] = NULL; - } - - return; -} - - diff --git a/drivers/misc/mediatek/dual_ccci/ccmni_pfp.c b/drivers/misc/mediatek/dual_ccci/ccmni_pfp.c deleted file mode 100644 index 9454572f01e..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccmni_pfp.c +++ /dev/null @@ -1,428 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccmni_pfp.c - * - * Project: - * -------- - * YuSu - * - * Description: - * ------------ - * MT6516 Cross Chip Modem Network Interface - Packet Framing Protocol - * - * Author: - * ------- - * Stanley Chou (mtk01411) - * - ****************************************************************************/ - -#define pr_fmt(fmt) "[" KBUILD_MODNAME "][pfp]" fmt - -#include -#include -#include -#include "ccmni_pfp.h" - -/* Compile option for pfp kernel debug */ -#undef __PFP_KERNEL_DEBUG__ - - -#if 1 - -#define PFP_LOG(instance_inx, flag, args...) - -#else - - #define PFP_LOG(instance_inx, flag, args...) \ - do \ - { \ - printk(flag "CCMNI%d: ", instance_inx); \ - printk(args); \ - } while (0) - -#endif - -ccmni_record_t ccmni_dev [MAX_PDP_CONT_NUM]; -unsigned char frame_cooked_data [MAX_PFP_LEN_FIELD_VALUE]; -unsigned char frame_raw_data [MAX_PFP_LEN_FIELD_VALUE + 4]; -unsigned char unframe_raw_data [FREE_RAW_DATA_BUF_SIZE]; -unsigned char unframe_cooked_data[FREE_COOKED_DATA_BUF_SIZE]; - -#ifndef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__ -complete_ippkt_t complete_ippkt_pool[SUPPORT_PKT_NUM]; -#endif - -#ifndef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__ -complete_ippkt_t* get_one_available_complete_ippkt_entry() -{ - int i = 0; - for (i=0; i < SUPPORT_PKT_NUM; i++) - { - if (complete_ippkt_pool[i].entry_used == 0) - { - complete_ippkt_pool[i].entry_used = 1; - return &complete_ippkt_pool[i]; - } - } - BUG_ON(1); - return NULL; -} - -void release_one_used_complete_ippkt_entry(complete_ippkt_t *entry) -{ - entry->pkt_size = 0; - entry->pkt_data = NULL; - entry->entry_used = 0; - entry->next = NULL; -} -#endif - -void pfp_reset(int ccmni_inx) -{ - ccmni_dev[ccmni_inx].unframe_state = PARSE_PFP_FRAME_START_FLAG_STATE; - ccmni_dev[ccmni_inx].pkt_size = 0; - ccmni_dev[ccmni_inx].last_pkt_node = NULL; -} - - - - - -frame_info_t pfp_frame(unsigned char* raw_data, unsigned char* cooked_data, int cooked_size, int frame_flag, int ccmni_inx) -{ - frame_info_t entry; - - /* One IP packet will only be packed as one frame */ - raw_data[0] = PFP_FRAME_START_FLAG; - raw_data[1] = PFP_FRAME_MAGIC_NUM; - /* Length Field Byte#1: Low Byte */ - raw_data[2] = (cooked_size & 0x000000FF); - /* Length Field Byte#2: High Byte */ - raw_data[3] = ((cooked_size >> 8) & 0x000000FF); - - // printk(KERN_INFO "CCMNI%d: TX_IPID=0x%02x%02x,pkt_size=%d\n",ccmni_inx,cooked_data[4],cooked_data[5],cooked_size); - /* Copy data from the input buffer to output buffer */ - memcpy(raw_data + 4, cooked_data, cooked_size); - - entry.num_frames = 1; - //entry.frame_list = (frame_format_t *) vmalloc(sizeof(frame_format_t) * entry.num_frames); - entry.frame_list[0].frame_size = cooked_size + 4; - entry.frame_list[0].frame_data = raw_data; - entry.pending_data_flag = FRAME_END; - entry.consumed_length = cooked_size; - - /* NOTE: CCCI Client must update its passed pointer cooked_data by adding - * the size (i.e., cooked_size) after returning from this API. - * - * NOTE: CCCI Client must update its passed poiniter raw_data by adding the - * frame_list[0].frame_size after returning from this API - */ - - return entry; -} - -packet_info_t pfp_unframe(unsigned char* cooked_data, int cooked_data_buf_size, - unsigned char* raw_data, int raw_size, int ccmni_inx) -{ - /* If this function is invoked for multiple PDP contexts, each one should - * have its own unframe_state belonged to its packet processing - */ - - //static int unframe_state[MAX_PDP_CONT_NUM] = {PARSE_PFP_FRAME_START_FLAG_STATE}; - //static int pkt_size[MAX_PDP_CONT_NUM] = {0}; - - int local_raw_size = raw_size; - int local_cooked_data_buf_free_size = cooked_data_buf_size; - unsigned char *local_raw_data = raw_data; - unsigned char *local_cooked_data = cooked_data; - int consumed_length = 0; - int keep_parsing = 1; - int retrieved_num_ip_pkts = 0; - packet_info_t entry = {0}; - - /* Lifecycle of CCMNIDev[ccmni_inx].last_node is same as that of PacketInfo entry */ - ccmni_dev[ccmni_inx].last_pkt_node = NULL; - - do - { -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: pfp_unframe_state=%d\n",ccmni_inx,ccmni_dev[ccmni_inx].unframe_state); -#endif - switch(ccmni_dev[ccmni_inx].unframe_state) - { - case PARSE_PFP_FRAME_START_FLAG_STATE: - { - // if(((unsigned char)local_raw_data[0]) == PFP_FRAME_START_FLAG) -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: check start flag-local_raw_data[0]=0x%02x\n",ccmni_inx,local_raw_data[0]); -#endif - if (local_raw_data[0] == PFP_FRAME_START_FLAG) - { - /* - * If the START_FLAG is not found, it will not change the - * unframe_state - still remain as PFP_FRAME_START_FLAG - */ - local_raw_data++; - local_raw_size--; - consumed_length++; - break; - } - else - { - /* Fall through to check if it is a magic num */ - ccmni_dev[ccmni_inx].unframe_state = PARSE_PFP_FRAME_MAGIC_NUM_STATE; - } - - } - - case PARSE_PFP_FRAME_MAGIC_NUM_STATE: - { - // if(((unsigned char)local_raw_data[0]) != PFP_FRAME_MAGIC_NUM) -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: check magic num-local_raw_data[0]=0x%02x\n",ccmni_inx,local_raw_data[0]); -#endif - - if (local_raw_data[0] != PFP_FRAME_MAGIC_NUM) - { - /* Something is wrong! MAGIC_NUM must follow the START_FLAG */ - ccmni_dev[ccmni_inx].unframe_state = PARSE_PFP_FRAME_START_FLAG_STATE; - } - else - { - ccmni_dev[ccmni_inx].unframe_state = PARSE_PFP_FRAME_LENGTH_FIELD_STATE; - } - - local_raw_data++; - local_raw_size--; - consumed_length++; - - break; - } - - case PARSE_PFP_FRAME_LENGTH_FIELD_STATE: - { - /* Check if two bytes Length Field can be obtained from the raw_data[] */ -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: local_raw_size=%d\n",ccmni_inx,local_raw_size); -#endif - if (local_raw_size >= 2) - { - ccmni_dev[ccmni_inx].pkt_size = ((local_raw_data[1] << 8) | local_raw_data[0]); - -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: pkt_size=%d,len[0]=0x%02x,len[1]=0x%02x\n",ccmni_inx,ccmni_dev[ccmni_inx].pkt_size,local_raw_data[0],local_raw_data[1]); -#endif - /* Parse the Length Field */ - local_raw_data += 2; - local_raw_size -= 2; - consumed_length += 2; - - /* Check if the value is exceeded the maximum size of one IP Packet: 1510 bytes */ - if (ccmni_dev[ccmni_inx].pkt_size <= MAX_PFP_LEN_FIELD_VALUE) - { - ccmni_dev[ccmni_inx].unframe_state = PARSE_PFP_FRAME_GET_DATA_STATE; - } - else - { - /* Change state to PARSE_START_FLAG to find the next frame */ -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: Reset decode state then continue to parse\n",ccmni_inx); -#endif - ccmni_dev[ccmni_inx].unframe_state = PARSE_PFP_FRAME_START_FLAG_STATE; - ccmni_dev[ccmni_inx].pkt_size = 0; - } - } - else - { - /* - * Not enough information to parse the Length Field's value: - * Keep the state as the PARSE_PFP_FRAME_LENGTH_FIELD_STATE - */ -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: not enough len bytes\n",ccmni_inx); -#endif - keep_parsing = 0; - } - - break; - } - - case PARSE_PFP_FRAME_GET_DATA_STATE: - { - if (local_raw_size < ccmni_dev[ccmni_inx].pkt_size) - { - /* - * If only partial data, it will not do anything for it: - * Wait for the data can be retrived as one complete IP Packet - */ -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: not enough pkt bytes\n",ccmni_inx); -#endif - keep_parsing = 0; - } - else - { - /* - * It must check the avaialbe space pointed by cooked_data is - * larger than the size of one packet - */ - - if (local_cooked_data_buf_free_size >= ccmni_dev[ccmni_inx].pkt_size) - { - complete_ippkt_t *current_node = entry.pkt_list; - complete_ippkt_t *previous_node = ccmni_dev[ccmni_inx].last_pkt_node; - - /* - * It can retrieve a complete IP Packet: Record the start position - * of memory of this IP Packet - */ - - if (current_node == NULL) - { -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: malloc for first pkt node\n",ccmni_inx); -#endif -#ifdef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__ - current_node = (complete_ippkt_t *) vmalloc(sizeof(complete_ippkt_t)); -#else - /* Find one available entry */ - current_node = (complete_ippkt_t *) get_one_available_complete_ippkt_entry(); -#endif - if (current_node != NULL) - { - entry.pkt_list = current_node; - } - else - { - /* Error Handle */ -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: Can't find one available complete_ippkt entry case1\n",ccmni_inx); -#endif - entry.try_decode_again = 1; - goto error_handle_return; - } - } - else - { -#if 0 - do - { - previous_node = current_node; - current_node = current_node->next; - } - while(current_node != NULL); -#endif - -#ifdef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__ - /* Find the 1st position to insert this new node into the linked list */ - current_node = (complete_ippkt_t *) vmalloc(sizeof(complete_ippkt_t)); -#else - /* Find one available entry */ - current_node = (complete_ippkt_t *) get_one_available_complete_ippkt_entry(); -#endif - if (current_node != NULL) - { - previous_node->next = current_node; - } - else - { - /* Error Handle */ -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: Can't find one available complete_ippkt entry case2\n",ccmni_inx); -#endif - entry.try_decode_again = 1; - goto error_handle_return; - } - } -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: prepare pkt node\n",ccmni_inx); -#endif - current_node->pkt_size = ccmni_dev[ccmni_inx].pkt_size; - - /* Copy data from the input buffer to output buffer */ - memcpy(local_cooked_data, local_raw_data, ccmni_dev[ccmni_inx].pkt_size); - - - // printk(KERN_INFO "CCMNI%d: RX_IPID:0x%02x%02x,pkt_size=%d\n",ccmni_inx,local_cooked_data[4],local_cooked_data[5],current_node->pkt_size); - - current_node->pkt_data = local_cooked_data; - local_cooked_data += ccmni_dev[ccmni_inx].pkt_size; - current_node->next = NULL; - - /* - * Remember the last_node for each CCMNI: It can directly access the tail - * one without iterating for inserting a new IP Pkt into this list - */ - - ccmni_dev[ccmni_inx].last_pkt_node = current_node; - - local_raw_data += ccmni_dev[ccmni_inx].pkt_size; - local_raw_size -= ccmni_dev[ccmni_inx].pkt_size; - local_cooked_data_buf_free_size -= ccmni_dev[ccmni_inx].pkt_size; - - /* - * consumed_length will add the num of data bytes copied from input buffer - * to output buffer - */ - - consumed_length += ccmni_dev[ccmni_inx].pkt_size; - retrieved_num_ip_pkts++; - - /* Change the state to parse the next one */ - ccmni_dev[ccmni_inx].unframe_state = PARSE_PFP_FRAME_START_FLAG_STATE; - ccmni_dev[ccmni_inx].pkt_size = 0; - } - else - { - /* - * Not available free space pointed by cooked_data to put one complete - * IP Packet : Keep the unframe_state as GET_DATA_STATE - */ -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("CCMNI%d: not enough free space provided by cooked_data\n",ccmni_inx); -#endif - keep_parsing = 0; - } - } - break; - } - - default: - { - break; - } - } - } - while (local_raw_size > 0 && keep_parsing == 1); -error_handle_return: - entry.consumed_length = consumed_length; - entry.num_complete_packets = retrieved_num_ip_pkts; - entry.parse_data_state = ccmni_dev[ccmni_inx].unframe_state; - - return entry; -} - - -void traverse_pkt_list(complete_ippkt_t *node) -{ - complete_ippkt_t *t_pkt_node = node; - complete_ippkt_t *prev_pkt_node = NULL; - - while (t_pkt_node != NULL) - { -#ifdef __PFP_KERNEL_DEBUG__ - pr_notice("Packet Node: data=0x%08x, size=%d\n", t_pkt_node->pkt_data, t_pkt_node->pkt_size); -#endif - prev_pkt_node = t_pkt_node; - t_pkt_node = t_pkt_node->next; - - vfree(prev_pkt_node); - } -} - -EXPORT_SYMBOL(pfp_frame); -EXPORT_SYMBOL(pfp_unframe); -EXPORT_SYMBOL(release_one_used_complete_ippkt_entry); - diff --git a/drivers/misc/mediatek/dual_ccci/ccmni_v2_net.c b/drivers/misc/mediatek/dual_ccci/ccmni_v2_net.c deleted file mode 100644 index 46fffa9b024..00000000000 --- a/drivers/misc/mediatek/dual_ccci/ccmni_v2_net.c +++ /dev/null @@ -1,1120 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccmni.c - * - * Project: - * -------- - * - * - * Description: - * ------------ - * - * - * Author: - * ------- - * - * - ****************************************************************************/ - -#include -#define CCMNI_DBG_INFO 1 - -extern void *ccmni_ctl_block[]; - -typedef struct -{ - int channel; - int m_md_id; - int uart_rx; - int uart_rx_ack; - int uart_tx; - int uart_tx_ack; - int ready; - int net_if_off; - int log_count; - unsigned long flags; - struct timer_list timer; - unsigned long send_len; - struct net_device *dev; - struct wake_lock wake_lock; - spinlock_t spinlock; - - shared_mem_ccmni_t *shared_mem; - int shared_mem_phys_addr; - - unsigned char mac_addr[ETH_ALEN]; - - struct tasklet_struct tasklet; - void *owner; - -} ccmni_v2_instance_t; - -typedef struct _ccmni_v2_ctl_block -{ - int m_md_id; - int ccci_is_ready; - ccmni_v2_instance_t *ccmni_v2_instance[CCMNI_V2_PORT_NUM]; - struct wake_lock ccmni_wake_lock; - char wakelock_name[16]; - MD_CALL_BACK_QUEUE ccmni_notifier; -}ccmni_v2_ctl_block_t; - -static void ccmni_v2_read (unsigned long arg); - - -static void ccmni_make_etherframe(void *_eth_hdr, u8 *mac_addr, int packet_type) -{ - struct ethhdr *eth_hdr = _eth_hdr; - - memcpy(eth_hdr->h_dest, mac_addr, sizeof(eth_hdr->h_dest)); - memset(eth_hdr->h_source, 0, sizeof(eth_hdr->h_source)); - if(packet_type == IPV6_VERSION){ - eth_hdr->h_proto = __constant_cpu_to_be16(ETH_P_IPV6); - }else{ - eth_hdr->h_proto = __constant_cpu_to_be16(ETH_P_IP); - } -} - -static unsigned char *ccmni_v2_phys_to_virt(int md_id, unsigned char *addr_phy) -{ - int ccmni_rx_base_phy; - int ccmni_rx_base_virt; - int p_to_v_offset; - - ccmni_v2_ul_base_req(md_id, &ccmni_rx_base_virt, &ccmni_rx_base_phy); - p_to_v_offset = (unsigned char*)(ccmni_rx_base_virt) - (unsigned char *)(ccmni_rx_base_phy); - - return (p_to_v_offset + addr_phy+ get_md2_ap_phy_addr_fixed()); -} - -void ccmni_v2_dump(int md_id) -{ - int i=0,port=0; - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t *)ccmni_ctl_block[md_id]; - - CCCI_MSG_INF(md_id, "ctl", "ccmni v2 dump start\n"); - for(port=0;portccmni_v2_instance[port]; - CCCI_MSG_INF(md_id, "ctl", "Port%d RX CONTROL: read_out=%d, avai_out=%d, avai_in=%d,q_len=%d\n",port, - ccmni->shared_mem->rx_control.read_out, - ccmni->shared_mem->rx_control.avai_out, - ccmni->shared_mem->rx_control.avai_in, - ccmni->shared_mem->rx_control.q_length); - CCCI_MSG_INF(md_id, "ctl", "Port%d RX ringbuff:\n",port); - for(i=0; ishared_mem->q_rx_ringbuff[i].ptr!=NULL && ccmni->shared_mem->q_rx_ringbuff[i].len!=0) - CCCI_MSG_INF(md_id,"ctl","[%d]: ptr=%08X len=%d\n",i,(int)(ccmni->shared_mem->q_rx_ringbuff[i].ptr), ccmni->shared_mem->q_rx_ringbuff[i].len); - } - CCCI_MSG_INF(md_id, "ctl", "Port%d TX CONTROL: read_out=%d, avai_out=%d, avai_in=%d,q_len=%d\n",port, - ccmni->shared_mem->tx_control.read_out, - ccmni->shared_mem->tx_control.avai_out, - ccmni->shared_mem->tx_control.avai_in, - ccmni->shared_mem->tx_control.q_length); - CCCI_MSG_INF(md_id, "ctl", "Port%d TX ringbuff:\n",port); - - for(i=0; i < CCMNI_CTRL_Q_TX_SIZE; i++) - { - if(ccmni->shared_mem->q_tx_ringbuff[i].ptr!=NULL&&ccmni->shared_mem->q_tx_ringbuff[i].len!=0) - CCCI_MSG_INF(md_id,"ctl","[%d]: ptr=%08X len=%d\n",i,(int)(ccmni->shared_mem->q_tx_ringbuff[i].ptr),ccmni->shared_mem->q_tx_ringbuff[i].len); - } - } - CCCI_MSG_INF(md_id, "ctl", "ccmni v2 dump end\n"); -} - - -static void ccmni_v2_reset_buffers(ccmni_v2_instance_t *ccmni) -{ - int *ccmni_rx_base_phy; - int *ccmni_rx_base_virt; - unsigned char *ptr_virt; - int md_id; - int count; -#if CCMNI_DBG_INFO - dbg_info_ccmni_t *dbg_info; -#endif - - if(ccmni == NULL) { - CCCI_MSG("[Error]CCMNI V2 get NULL pointer for buffer reset\n"); - return; - } - - md_id = ccmni->m_md_id; - // DL --RX - ccmni->shared_mem->rx_control.read_out = 0; - ccmni->shared_mem->rx_control.avai_out = 0; - ccmni->shared_mem->rx_control.avai_in = CCMNI_CTRL_Q_RX_SIZE_DEFAULT - 1; - ccmni->shared_mem->rx_control.q_length = CCMNI_CTRL_Q_RX_SIZE; - // UP -- TX - memset(&ccmni->shared_mem->tx_control, 0, sizeof(buffer_control_ccmni_t)); - memset(ccmni->shared_mem->q_tx_ringbuff, 0, sizeof(q_ringbuf_ccmni_t)*CCMNI_CTRL_Q_TX_SIZE); - - memset(ccmni->shared_mem->q_rx_ringbuff, 0, ccmni->shared_mem->rx_control.q_length * sizeof(q_ringbuf_ccmni_t)); - ccmni_v2_dl_base_req(md_id, &ccmni_rx_base_virt, &ccmni_rx_base_phy); - - //Each channel has 100 RX buffers default - for (count = 0; count < CCMNI_CTRL_Q_RX_SIZE_DEFAULT; count++) - { - ccmni->shared_mem->q_rx_ringbuff[count].ptr = \ - (CCMNI_CTRL_Q_RX_SIZE_DEFAULT * ccmni->channel + count ) * CCMNI_SINGLE_BUFF_SIZE + \ - (unsigned char *)ccmni_rx_base_phy + CCMNI_BUFF_HEADER_SIZE + CCMNI_BUFF_DBG_INFO_SIZE- get_md2_ap_phy_addr_fixed(); - - ptr_virt = ccmni_v2_phys_to_virt(md_id, (unsigned char *)(ccmni->shared_mem->q_rx_ringbuff[count].ptr)); - - //buffer header and footer init - //Assume int to be 32bit. May need further modifying!!!!! - *((int*)(ptr_virt - CCMNI_BUFF_HEADER_SIZE)) = CCMNI_BUFF_HEADER; - *((int*)(ptr_virt + CCMNI_BUFF_DATA_FIELD_SIZE)) = CCMNI_BUFF_FOOTER; - -#if CCMNI_DBG_INFO - //debug info - dbg_info = (dbg_info_ccmni_t *)(ptr_virt - CCMNI_BUFF_HEADER_SIZE - CCMNI_BUFF_DBG_INFO_SIZE); - dbg_info->port = ccmni->channel; - dbg_info->avai_in_no = count; -#endif - } - CCCI_MSG("ccmni_v2_reset_buffers\n"); -} - -int ccmni_v2_ipo_h_restore(int md_id) -{ - ccmni_v2_ctl_block_t *ctlb; - int i; - ctlb = ccmni_ctl_block[md_id]; - for(i=0; iccmni_v2_instance[i]); - - return 0; -} - -static void reset_ccmni_v2_instance_buffer(ccmni_v2_instance_t *ccmni_v2_instance) -{ - unsigned long flags; - spin_lock_irqsave(&ccmni_v2_instance->spinlock, flags); - ccmni_v2_reset_buffers(ccmni_v2_instance); - spin_unlock_irqrestore(&ccmni_v2_instance->spinlock, flags); -} - -static void stop_ccmni_v2_instance(ccmni_v2_instance_t *ccmni_v2_instance) -{ - unsigned long flags; - spin_lock_irqsave(&ccmni_v2_instance->spinlock, flags); - if(ccmni_v2_instance->net_if_off == 0) { - ccmni_v2_instance->net_if_off = 1; - netif_carrier_off(ccmni_v2_instance->dev); - del_timer(&ccmni_v2_instance->timer); - } - spin_unlock_irqrestore(&ccmni_v2_instance->spinlock, flags); -} - - -static void restore_ccmni_v2_instance(ccmni_v2_instance_t *ccmni_v2_instance) -{ - unsigned long flags; - spin_lock_irqsave(&ccmni_v2_instance->spinlock, flags); - if(ccmni_v2_instance->net_if_off) { - ccmni_v2_instance->net_if_off = 0; - netif_carrier_on(ccmni_v2_instance->dev); - } - spin_unlock_irqrestore(&ccmni_v2_instance->spinlock, flags); -} - -static void ccmni_v2_notifier_call(MD_CALL_BACK_QUEUE *notifier, unsigned long val) -{ - int i=0; - ccmni_v2_ctl_block_t *ctl_b = container_of(notifier, ccmni_v2_ctl_block_t, ccmni_notifier); - ccmni_v2_instance_t *instance; - - switch(val) - { - case CCCI_MD_EXCEPTION : - ctl_b->ccci_is_ready=0; - for(i=0;iccmni_v2_instance[i]; - if (instance) - { - stop_ccmni_v2_instance(instance); - } - } - break; - case CCCI_MD_STOP : - for(i=0;iccmni_v2_instance[i]; - if (instance) - { - stop_ccmni_v2_instance(instance); - } - } - break; - - case CCCI_MD_RESET : - ctl_b->ccci_is_ready=0; - for(i=0;iccmni_v2_instance[i]; - if (instance) - { - reset_ccmni_v2_instance_buffer(instance); - } - } - break; - - case CCCI_MD_BOOTUP: - if (ctl_b->ccci_is_ready==0) - { - ctl_b->ccci_is_ready=1; - for(i=0;iccmni_v2_instance[i]; - if (instance) - { - restore_ccmni_v2_instance(instance); - } - } - } - break; - - default: - break; - } - - return ; -} - - -static void timer_func(unsigned long data) -{ - ccmni_v2_instance_t *ccmni=(ccmni_v2_instance_t *)data; - int contin=0; - int ret=0; - ccci_msg_t msg; - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - - spin_lock_bh(&ccmni->spinlock); - - if (ctl_b == 0) - goto out; - - if (test_bit(CCMNI_RECV_ACK_PENDING,&ccmni->flags)) - { - msg.magic = 0; - msg.id = CCMNI_CHANNEL_OFFSET + ccmni->channel; - msg.channel = ccmni->uart_rx_ack; - msg.reserved = 0; - ret = ccci_message_send(md_id, &msg, 1); - - if (ret==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) - contin=1; - else - clear_bit(CCMNI_RECV_ACK_PENDING, &ccmni->flags); - } - - if (test_bit(CCMNI_SEND_PENDING,&ccmni->flags)) - { - msg.magic = 0; - msg.id = ccmni->send_len; - msg.channel = ccmni->uart_tx; - msg.reserved = 0; - ret = ccci_message_send(md_id, &msg, 1); - - if (ret==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) - contin=1; - else { - clear_bit(CCMNI_SEND_PENDING,&ccmni->flags); - ccmni->send_len=0; - } - } - if (test_bit(CCMNI_RECV_PENDING,&ccmni->flags)) - { - tasklet_schedule(&ccmni->tasklet); - } - -out: - spin_unlock_bh(&ccmni->spinlock); - if (contin) - mod_timer(&ccmni->timer,jiffies+2); - - return; - -} - -static int ccmni_v2_check_info(int md_id, int ch, const unsigned char *ccmni_ptr, int ccmni_len) -{ - int ret = 0; - - if ((ccmni_ptr == NULL) || (ccmni_len <= 0)) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d_check_info() ptr_n or len_n error!\n", ch); - ret = -CCCI_ERR_INVALID_PARAM; - goto check_info_error; - } - - //Check Header and Footer - if ((*(int*)(ccmni_ptr - CCMNI_BUFF_HEADER_SIZE) != CCMNI_BUFF_HEADER) || \ - (*(int*)(ccmni_ptr + CCMNI_BUFF_DATA_FIELD_SIZE) != CCMNI_BUFF_FOOTER)) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d_check_info() check header and footer error\n", ch); - ret = -CCCI_ERR_MEM_CHECK_FAIL; - goto check_info_error; - } - - //Check End Byte - if (*(unsigned char *)((unsigned int)(ccmni_ptr + ccmni_len + 3)&0xfffffffc) != CCMNI_DATA_END) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d_check_info() check end byte error\n", ch); - ret = -CCCI_ERR_MEM_CHECK_FAIL; - goto check_info_error; - } - - ret = 0; - -check_info_error: - - return ret; - -} - - -static int ccmni_v2_receive(ccmni_v2_instance_t *ccmni, const unsigned char *ccmni_ptr, int ccmni_len) -{ - int packet_type, ret = 0; - struct sk_buff *skb; - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - - if ((ccmni == NULL) || (ccmni_ptr == NULL) || (ccmni_len <= 0)) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d_receive: invalid private data\n", ccmni->channel); - ret = -1; - } - - skb = dev_alloc_skb(ccmni_len); - - if (skb) - { - packet_type = ccmni_ptr[0] & 0xF0; - memcpy(skb_put(skb, ccmni_len), ccmni_ptr, ccmni_len); - ccmni_make_etherframe(skb->data - ETH_HLEN, ccmni->dev->dev_addr, packet_type); - skb_set_mac_header(skb, -ETH_HLEN); - - skb->dev = ccmni->dev; - if(packet_type == IPV6_VERSION) - { - skb->protocol = htons(ETH_P_IPV6); - } - else - { - skb->protocol = htons(ETH_P_IP); - } - //skb->ip_summed = CHECKSUM_UNNECESSARY; - skb->ip_summed = CHECKSUM_NONE; - - ret = netif_rx(skb); - - CCCI_CCMNI_MSG(md_id, "CCMNI%d invoke netif_rx()=%d\n", ccmni->channel, ret); - - ccmni->dev->stats.rx_packets++; - ccmni->dev->stats.rx_bytes += ccmni_len; - CCCI_CCMNI_MSG(md_id, "CCMNI%d rx_pkts=%ld, stats_rx_bytes=%ld\n", ccmni->channel, \ - ccmni->dev->stats.rx_packets, ccmni->dev->stats.rx_bytes); - - ret = 0; - } - else - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d Socket buffer allocate fail\n", ccmni->channel); - ret = -CCCI_ERR_MEM_CHECK_FAIL; - } - - return ret; -} - - -static void ccmni_v2_read(unsigned long arg) -{ - int ret; - int read_out, avai_out, avai_in, q_length; - int packet_cnt, packet_cnt_save, consumed; - int rx_buf_res_left_cnt; -#if CCMNI_DBG_INFO - dbg_info_ccmni_t *dbg_info; -#endif - ccmni_v2_instance_t *ccmni = (ccmni_v2_instance_t *) arg; - unsigned char *ccmni_ptr; - unsigned int ccmni_len, q_idx; - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - ccci_msg_t msg; - - if (ccmni == NULL) - { - CCCI_DBG_MSG(md_id, "net", "[Error]CCMNI%d_read: invalid private data\n", ccmni->channel); - return; - } - - spin_lock_bh(&ccmni->spinlock); - - if (ctl_b->ccci_is_ready==0) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read fail when modem not ready\n", ccmni->channel); - goto out; - } - - read_out = ccmni->shared_mem->rx_control.read_out; - avai_out = ccmni->shared_mem->rx_control.avai_out; - avai_in = ccmni->shared_mem->rx_control.avai_in; - q_length = ccmni->shared_mem->rx_control.q_length; - - if ((read_out < 0) || (avai_out < 0) || (avai_in < 0) || (q_length < 0)) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read fail: avai_out=%d, read_out=%d, avai_in=%d, q_length=%d\n", \ - ccmni->channel, avai_out, read_out, avai_in, q_length); - goto out; - } - - if ((read_out >= q_length) || (avai_out >= q_length) || (avai_in >= q_length)) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read fail: avai_out=%d, read_out=%d, avai_in=%d, q_length=%d\n", \ - ccmni->channel, avai_out, read_out, avai_in, q_length); - goto out; - } - - //Number of packets waiting to be processed - packet_cnt = avai_out >= read_out ? (avai_out - read_out) : (avai_out - read_out + q_length); - - packet_cnt_save = packet_cnt; - rx_buf_res_left_cnt = avai_in >= avai_out ? (avai_in - avai_out) : (avai_in - avai_out + q_length); - - if (packet_cnt <= 0) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read fail: nothing to read, avai_out=%d, read_out=%d, q_length=%d\n", \ - ccmni->channel, avai_out, read_out, q_length); - goto out; - } - - q_idx = read_out; - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_receive[Before]: avai_out=%d, read_out=%d, avai_in=%d, packet_cnt=%d\n", \ - ccmni->channel, avai_out, read_out, avai_in, packet_cnt); - - consumed = 0; - - for (; packet_cnt > 0; packet_cnt--) - { - q_idx &= q_length - 1; - - ccmni_ptr = ccmni_v2_phys_to_virt(md_id, (unsigned char *)(ccmni->shared_mem->q_rx_ringbuff[q_idx].ptr)); - ccmni_len = ccmni->shared_mem->q_rx_ringbuff[q_idx].len; -#if CCMNI_DBG_INFO - //DBG info - dbg_info = (dbg_info_ccmni_t *)(ccmni_ptr - CCMNI_BUFF_HEADER_SIZE - CCMNI_BUFF_DBG_INFO_SIZE); -#endif - if (-CCCI_ERR_MEM_CHECK_FAIL == ccmni_v2_check_info(md_id, ccmni->channel, ccmni_ptr, ccmni_len)) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read: check info error, read_out=%d\n", ccmni->channel, read_out); -#if CCMNI_DBG_INFO - //dbg_info->port = ccmni->channel; - dbg_info->avai_in_no = q_idx; - //dbg_info->avai_out_no = q_idx; - dbg_info->read_out_no = q_idx; -#endif - avai_in++; - avai_in &= q_length - 1; - - ccmni->shared_mem->q_rx_ringbuff[avai_in].ptr = ccmni->shared_mem->q_rx_ringbuff[q_idx].ptr; - - ccmni_ptr = ccmni_v2_phys_to_virt(md_id, (unsigned char *)(ccmni->shared_mem->q_rx_ringbuff[avai_in].ptr)); -#if CCMNI_DBG_INFO - dbg_info = (dbg_info_ccmni_t *)(ccmni_ptr - CCMNI_BUFF_HEADER_SIZE - CCMNI_BUFF_DBG_INFO_SIZE); - dbg_info->avai_in_no = avai_in; -#endif - q_idx++; - consumed++; - continue; - } - ret = ccmni_v2_receive(ccmni, ccmni_ptr, ccmni_len); - if(0 == ret) - { -#if CCMNI_DBG_INFO - //dbg_info->port = ccmni->channel; - dbg_info->avai_in_no = q_idx; - //dbg_info->avai_out_no = q_idx; - dbg_info->read_out_no = q_idx; -#endif - avai_in++; - avai_in &= q_length - 1; - ccmni->shared_mem->q_rx_ringbuff[avai_in].ptr = ccmni->shared_mem->q_rx_ringbuff[q_idx].ptr; - - ccmni_ptr = ccmni_v2_phys_to_virt(md_id, (unsigned char *)(ccmni->shared_mem->q_rx_ringbuff[avai_in].ptr)); -#if CCMNI_DBG_INFO - dbg_info = (dbg_info_ccmni_t *)(ccmni_ptr - CCMNI_BUFF_HEADER_SIZE - CCMNI_BUFF_DBG_INFO_SIZE); - dbg_info->avai_in_no = avai_in; -#endif - q_idx++; - consumed++; - } else if (-CCCI_ERR_MEM_CHECK_FAIL == ret) { - //If dev_alloc_skb() failed, retry right now may still fail. So setup timer, and retry later. - set_bit(CCMNI_RECV_PENDING,&ccmni->flags); - //avai_in++; - //avai_in &= q_length - 1; - //ccmni->shared_mem->q_rx_ringbuff[avai_in].ptr = ccmni->shared_mem->q_rx_ringbuff[q_idx].ptr; - //ccmni->dev->stats.rx_dropped++; - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read: no sk_buff, retrying, read_out=%d, avai_out=%d\n", \ - ccmni->channel, q_idx, avai_out); - - mod_timer(&ccmni->timer,jiffies + msecs_to_jiffies(10)); //10 ms??? - - break; - //q_idx++; - //consumed++; - } - } - - read_out = (q_idx & (q_length - 1)); - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_receive[After]: consumed=%d\n", ccmni->channel, consumed); - - if (consumed > packet_cnt_save) - { - //Sanity check. This should not happen! - CCCI_DBG_MSG(md_id, "net", "CCMNI%d_read fail: consumed more than packet_cnt, consumed = %d, packet_cnt = %d\n", \ - ccmni->channel, consumed, packet_cnt_save); - - //Should ignore all data in buffer??? haow.wang - ccmni->shared_mem->rx_control.read_out = avai_out; - ccmni->shared_mem->rx_control.avai_in = avai_in; - goto out; - } - - ccmni->shared_mem->rx_control.read_out = read_out; - ccmni->shared_mem->rx_control.avai_in = avai_in; - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_read to write mailbox(ch%d, tty%d)\n", ccmni->channel, - ccmni->uart_rx_ack, CCMNI_CHANNEL_OFFSET + ccmni->channel); - msg.magic = 0xFFFFFFFF; - msg.id = CCMNI_CHANNEL_OFFSET + ccmni->channel; - msg.channel = ccmni->uart_rx_ack; - msg.reserved = 0; - ret = ccci_message_send(md_id, &msg, 1); - if (ret==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) { - set_bit(CCMNI_RECV_ACK_PENDING,&ccmni->flags); - mod_timer(&ccmni->timer,jiffies); - } else if (ret==sizeof(ccci_msg_t)) - clear_bit(CCMNI_RECV_ACK_PENDING,&ccmni->flags); - -out: - spin_unlock_bh(&ccmni->spinlock); - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_read invoke wake_lock_timeout(1s)\n", ccmni->channel); - wake_lock_timeout(&ctl_b->ccmni_wake_lock, HZ); - - return; -} - -// will be called when modem sends us something. -// we will then copy it to the tty's buffer. -// this is essentially the "read" fops. -static void ccmni_v2_callback(void *private_data) -{ - logic_channel_info_t *ch_info = (logic_channel_info_t *)private_data; - ccmni_v2_instance_t *ccmni = (ccmni_v2_instance_t *)(ch_info->m_owner); - ccci_msg_t msg; - - while(get_logic_ch_data(ch_info, &msg)) { - switch(msg.channel) - { - case CCCI_CCMNI1_TX_ACK: - case CCCI_CCMNI2_TX_ACK: - case CCCI_CCMNI3_TX_ACK: - // this should be in an interrupt, - // so no locking required... - ccmni->ready = 1; - netif_wake_queue(ccmni->dev); - break; - - case CCCI_CCMNI1_RX: - case CCCI_CCMNI2_RX: - case CCCI_CCMNI3_RX: - tasklet_schedule(&ccmni->tasklet); - break; - - default: - break; - } - } -} - - -// The function start_xmit is called when there is one packet to transmit. -static int ccmni_v2_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - int ret = NETDEV_TX_OK; - int result = 0; - int read_out, avai_in, avai_out, q_length, q_idx; -#if CCMNI_DBG_INFO - dbg_info_ccmni_t *dbg_info; -#endif - - unsigned char *ccmni_ptr; - ccmni_v2_instance_t *ccmni = netdev_priv(dev); - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t *)(ccmni->owner); - int md_id = ctl_b->m_md_id; - ccci_msg_t msg; - - spin_lock_bh(&ccmni->spinlock); - - if (ctl_b->ccci_is_ready==0) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d transfer data fail when modem not ready \n", ccmni->channel); - ret = NETDEV_TX_BUSY; - goto _ccmni_start_xmit_busy; - } - - read_out = ccmni->shared_mem->tx_control.read_out; - avai_in = ccmni->shared_mem->tx_control.avai_in; - avai_out = ccmni->shared_mem->tx_control.avai_out; - q_length = ccmni->shared_mem->tx_control.q_length; - - if ((read_out < 0) || (avai_out < 0) || (avai_in < 0) || (q_length < 0)) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d TX fail: avai_out=%d, read_out=%d, avai_in=%d, q_length=%d\n", \ - ccmni->channel, avai_out, read_out, avai_in, q_length); - goto _ccmni_start_xmit_busy; - } - - if ((read_out >= q_length) || (avai_out >= q_length) || (avai_in >= q_length)) - { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d TX fail: avai_out=%d, read_out=%d, avai_in=%d, q_length=%d\n", \ - ccmni->channel, avai_out, read_out, avai_in, q_length); - goto _ccmni_start_xmit_busy; - } - - //Choose Q index - q_idx = avai_out; - ccmni_ptr = ccmni->shared_mem->q_tx_ringbuff[q_idx].ptr; - - //check if too many data waiting to be read out or Q not initialized yet - //ccmni_ptr=NULL when not initialized???? haow.wang - if ((q_idx == avai_in) || (ccmni_ptr == NULL) ) - { - if (ccmni->log_count >= 1000) { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d TX busy and stop queue: q_idx=%d, skb->len=%d \n", \ - ccmni->channel, q_idx, skb->len); - CCCI_DBG_MSG(md_id, "net", " TX read_out = %d avai_out = %d avai_in = %d\n", \ - ccmni->shared_mem->tx_control.read_out, ccmni->shared_mem->tx_control.avai_out, ccmni->shared_mem->tx_control.avai_in); - CCCI_DBG_MSG(md_id, "net", " RX read_out = %d avai_out = %d avai_in = %d\n", \ - ccmni->shared_mem->rx_control.read_out, ccmni->shared_mem->rx_control.avai_out, ccmni->shared_mem->rx_control.avai_in); - ccmni->log_count = 1; - } else { - ccmni->log_count++; - } - netif_stop_queue(ccmni->dev); - - //Set CCMNI ready to ZERO, and wait for the ACK from modem side. - ccmni->ready = 0; - ret = NETDEV_TX_BUSY; - goto _ccmni_start_xmit_busy; - } - - ccmni_ptr = ccmni_v2_phys_to_virt(md_id, (unsigned char *)(ccmni->shared_mem->q_tx_ringbuff[q_idx].ptr)); - - CCCI_CCMNI_MSG(md_id, "CCMNI%d_start_xmit: skb_len=%d, ccmni_ready=%d \n", \ - ccmni->channel, skb->len, ccmni->ready); - - if (skb->len > CCMNI_MTU) - { - //Sanity check; this should not happen! - //Digest and return OK. - CCCI_DBG_MSG(md_id, "net", "CCMNI%d packet size exceed 1500 bytes: size=%d \n", \ - ccmni->channel, skb->len); - dev->stats.tx_dropped++; - goto _ccmni_start_xmit_exit; - } - -#if CCMNI_DBG_INFO - //DBG info - dbg_info = (dbg_info_ccmni_t *)(ccmni_ptr - CCMNI_BUFF_HEADER_SIZE - CCMNI_BUFF_DBG_INFO_SIZE); - dbg_info->avai_out_no = q_idx; -#endif - - memcpy(ccmni_ptr, skb->data, skb->len); - ccmni->shared_mem->q_tx_ringbuff[q_idx].len = skb->len; - - //End byte - *(unsigned char*)(ccmni_ptr + skb->len) = CCMNI_DATA_END; - - mb(); - - //Update avail_out after data buffer filled - q_idx++; - ccmni->shared_mem->tx_control.avai_out = (q_idx & (q_length - 1)); - - mb(); - - msg.addr = 0; - msg.len = skb->len; - msg.channel = ccmni->uart_tx; - msg.reserved = 0; - result = ccci_message_send(md_id, &msg, 1); - if (result==-CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL) - { - set_bit(CCMNI_SEND_PENDING,&ccmni->flags); - ccmni->send_len +=skb->len; - mod_timer(&ccmni->timer,jiffies); - } - else if (result==sizeof(ccci_msg_t)) - clear_bit(CCMNI_SEND_PENDING,&ccmni->flags); - - dev->stats.tx_packets++; - dev->stats.tx_bytes += skb->len; - -_ccmni_start_xmit_exit: - - dev_kfree_skb(skb); - -_ccmni_start_xmit_busy: - - spin_unlock_bh(&ccmni->spinlock); - - return ret; -} - -static int ccmni_v2_open(struct net_device *dev) -{ - ccmni_v2_instance_t *ccmni = netdev_priv(dev); - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t*)ccmni->owner; - int md_id = ctl_b->m_md_id; - - CCCI_DBG_MSG(md_id, "net", "CCMNI%d open \n", ccmni->channel); - if (ctl_b->ccci_is_ready == 0) { - CCCI_DBG_MSG(md_id, "net", "CCMNI%d open fail when modem not ready \n", ccmni->channel); - return -EIO; - } - netif_start_queue(dev); - return 0; -} - -static int ccmni_v2_close(struct net_device *dev) -{ - ccmni_v2_instance_t *ccmni = netdev_priv(dev); - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t*)ccmni->owner; - - CCCI_DBG_MSG(ctl_b->m_md_id, "net", "CCMNI%d close \n", ccmni->channel); - netif_stop_queue(dev); - return 0; -} - -static int ccmni_v2_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - // No implementation at this moment. - // This is a place holder. - - return 0; -} - - -static void ccmni_v2_tx_timeout(struct net_device *dev) -{ - // No implementation at this moment. - // This is a place holder. - - dev->stats.tx_errors++; - netif_wake_queue(dev); -} - - -static const struct net_device_ops ccmni_v2_netdev_ops = -{ - .ndo_open = ccmni_v2_open, - .ndo_stop = ccmni_v2_close, - .ndo_start_xmit = ccmni_v2_start_xmit, - .ndo_do_ioctl = ccmni_v2_net_ioctl, - .ndo_tx_timeout = ccmni_v2_tx_timeout, -}; - -extern int is_mac_addr_duplicate(char *mac); -static void ccmni_v2_setup(struct net_device *dev) -{ - ccmni_v2_instance_t *ccmni = netdev_priv(dev); - int retry = 10; - - ether_setup(dev); - - dev->header_ops = NULL; - dev->netdev_ops = &ccmni_v2_netdev_ops; - dev->flags = IFF_NOARP & (~IFF_BROADCAST & ~IFF_MULTICAST); - dev->mtu = CCMNI_MTU; - dev->tx_queue_len = CCMNI_TX_QUEUE; - dev->addr_len = ETH_ALEN; - dev->destructor = free_netdev; - - while(retry-->0){ - random_ether_addr((u8 *) dev->dev_addr); - if(is_mac_addr_duplicate((u8*)dev->dev_addr)) - continue; - else - break; - } - - CCCI_CCMNI_MSG(ccmni->m_md_id, "CCMNI%d_setup: features=0x%08x,flags=0x%08x\n", ccmni->channel, \ - (unsigned int)(dev->features), dev->flags); - - return; -} - - -static int ccmni_v2_create_instance(int md_id, int channel) -{ - int ret, size, count; - int uart_rx, uart_rx_ack; - int uart_tx, uart_tx_ack; - ccmni_v2_instance_t *ccmni; - struct net_device *dev = NULL; - int *ccmni_rx_base_phy; - int *ccmni_rx_base_virt; - unsigned char *ptr_virt; -#if CCMNI_DBG_INFO - dbg_info_ccmni_t *dbg_info; -#endif - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t *)ccmni_ctl_block[md_id]; - - // Network device creation and registration. - dev = alloc_netdev(sizeof(ccmni_v2_instance_t), "", ccmni_v2_setup); - if (dev == NULL) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d allocate netdev fail!\n", channel); - return -ENOMEM; - } - - ccmni = netdev_priv(dev); - ccmni->dev = dev; - ccmni->channel = channel; - ccmni->owner = ccmni_ctl_block[md_id]; - - if(md_id == MD_SYS1) { - sprintf(dev->name, "ccmni%d", channel); - } else { - sprintf(dev->name, "cc%dmni%d", md_id+1, channel); - //sprintf(dev->name, "ccmni%d", channel); - } - - ret = register_netdev(dev); - if (ret != 0) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d register netdev fail: %d\n", ccmni->channel, ret); - goto _ccmni_create_instance_exit; - } - - ASSERT(ccci_ccmni_v2_ctl_mem_base_req(md_id, ccmni->channel, (int*)&ccmni->shared_mem, \ - &ccmni->shared_mem_phys_addr, &size) == 0); - - if (ccmni->shared_mem == NULL) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d allocate memory fail\n", ccmni->channel); - unregister_netdev(dev); - ret = -ENOMEM; - goto _ccmni_create_instance_exit; - } - - CCCI_CCMNI_MSG(md_id, "0x%08X:0x%08X:%d\n", (unsigned int)ccmni->shared_mem, \ - (unsigned int)ccmni->shared_mem_phys_addr, size); - - ccmni->shared_mem->rx_control.read_out = 0; - ccmni->shared_mem->rx_control.avai_out = 0; - ccmni->shared_mem->rx_control.avai_in = CCMNI_CTRL_Q_RX_SIZE_DEFAULT - 1; - ccmni->shared_mem->rx_control.q_length = CCMNI_CTRL_Q_RX_SIZE; - memset(ccmni->shared_mem->q_rx_ringbuff, 0, ccmni->shared_mem->rx_control.q_length * sizeof(q_ringbuf_ccmni_t)); - - ccmni_v2_dl_base_req(md_id, &ccmni_rx_base_virt, &ccmni_rx_base_phy); - - if (ccmni_rx_base_virt == NULL || ccmni_rx_base_phy == NULL) - { - CCCI_MSG_INF(md_id, "net", "CCMNI%d allocate memory fail\n", ccmni->channel); - unregister_netdev(dev); - ret = -ENOMEM; - - goto _ccmni_create_instance_exit; - } - - switch(ccmni->channel) - { - case 0: - uart_rx = CCCI_CCMNI1_RX; - uart_rx_ack = CCCI_CCMNI1_RX_ACK; - uart_tx = CCCI_CCMNI1_TX; - uart_tx_ack = CCCI_CCMNI1_TX_ACK; - break; - - case 1: - uart_rx = CCCI_CCMNI2_RX; - uart_rx_ack = CCCI_CCMNI2_RX_ACK; - uart_tx = CCCI_CCMNI2_TX; - uart_tx_ack = CCCI_CCMNI2_TX_ACK; - break; - - case 2: - uart_rx = CCCI_CCMNI3_RX; - uart_rx_ack = CCCI_CCMNI3_RX_ACK; - uart_tx = CCCI_CCMNI3_TX; - uart_tx_ack = CCCI_CCMNI3_TX_ACK; - break; - - default: - CCCI_MSG_INF(md_id, "net", "[Error]CCMNI%d Invalid ccmni number\n", ccmni->channel); - unregister_netdev(dev); - ret = -ENOSYS; - goto _ccmni_create_instance_exit; - } - ccmni->m_md_id = md_id; - - //Each channel has 100 RX buffers default - for (count = 0; count < CCMNI_CTRL_Q_RX_SIZE_DEFAULT; count++) - { - ccmni->shared_mem->q_rx_ringbuff[count].ptr = \ - (CCMNI_CTRL_Q_RX_SIZE_DEFAULT * ccmni->channel + count ) * CCMNI_SINGLE_BUFF_SIZE + \ - (unsigned char *)ccmni_rx_base_phy + CCMNI_BUFF_HEADER_SIZE + CCMNI_BUFF_DBG_INFO_SIZE- get_md2_ap_phy_addr_fixed(); - - ptr_virt = ccmni_v2_phys_to_virt(md_id, (unsigned char *)(ccmni->shared_mem->q_rx_ringbuff[count].ptr)); - - //buffer header and footer init - //Assume int to be 32bit. May need further modifying!!!!! - *((int*)(ptr_virt - CCMNI_BUFF_HEADER_SIZE)) = CCMNI_BUFF_HEADER; - *((int*)(ptr_virt + CCMNI_BUFF_DATA_FIELD_SIZE)) = CCMNI_BUFF_FOOTER; - -#if CCMNI_DBG_INFO - //debug info - dbg_info = (dbg_info_ccmni_t *)(ptr_virt - CCMNI_BUFF_HEADER_SIZE - CCMNI_BUFF_DBG_INFO_SIZE); - dbg_info->port = ccmni->channel; - dbg_info->avai_in_no = count; -#endif - } - - ccmni->uart_rx = uart_rx; - ccmni->uart_rx_ack = uart_rx_ack; - ccmni->uart_tx = uart_tx; - ccmni->uart_tx_ack = uart_tx_ack; - - // Register this ccmni instance to the ccci driver. - // pass it the notification handler. - ASSERT(register_to_logic_ch(md_id, uart_rx, ccmni_v2_callback, (void *) ccmni) == 0); - ASSERT(register_to_logic_ch(md_id, uart_tx_ack, ccmni_v2_callback, (void *) ccmni) == 0); - - // Initialize the spinlock. - spin_lock_init(&ccmni->spinlock); - setup_timer(&ccmni->timer, timer_func, (unsigned long)ccmni); - - // Initialize the tasklet. - tasklet_init(&ccmni->tasklet, ccmni_v2_read, (unsigned long)ccmni); - - ctl_b->ccmni_v2_instance[channel] = ccmni; - ccmni->ready = 1; - ccmni->net_if_off = 0; - ccmni->log_count = 1; - - return ret; - -_ccmni_create_instance_exit: - free_netdev(dev); - kfree(ccmni); - ctl_b->ccmni_v2_instance[channel] = NULL; - return ret; -} - -static void ccmni_v2_destroy_instance(int md_id, int channel) -{ - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t*)ccmni_ctl_block[md_id]; - ccmni_v2_instance_t *ccmni = ctl_b->ccmni_v2_instance[channel]; - - if (ccmni != NULL) - { - ccmni->ready = 0; - un_register_to_logic_ch(md_id, ccmni->uart_rx); - un_register_to_logic_ch(md_id, ccmni->uart_tx_ack); - - if (ccmni->shared_mem != NULL) { - ccmni->shared_mem = NULL; - ccmni->shared_mem_phys_addr = 0; - } - - if(ccmni->dev != NULL) { - unregister_netdev(ccmni->dev); - } - //tasklet_kill(&ccmni->tasklet); - ctl_b->ccmni_v2_instance[channel] = NULL; - } -} - - -int ccmni_v2_init(int md_id) -{ - int count, ret, curr; - ccmni_v2_ctl_block_t *ctl_b; - - // Create control block structure - ctl_b = (ccmni_v2_ctl_block_t *)kmalloc(sizeof(ccmni_v2_ctl_block_t), GFP_KERNEL); - if(ctl_b == NULL) - return -CCCI_ERR_GET_MEM_FAIL; - - memset(ctl_b, 0, sizeof(ccmni_v2_ctl_block_t)); - ccmni_ctl_block[md_id] = ctl_b; - - // Init ctl_b - ctl_b->m_md_id = md_id; - ctl_b->ccmni_notifier.call = ccmni_v2_notifier_call; - ctl_b->ccmni_notifier.next = NULL; - - for(count = 0; count < CCMNI_V2_PORT_NUM; count++) - { - ret = ccmni_v2_create_instance(md_id, count); - if (ret != 0) { - CCCI_MSG_INF(md_id, "net", "CCMNI%d create instance fail: %d\n", count, ret); - goto _CCMNI_INSTANCE_CREATE_FAIL; - } else { - //CCCI_DBG_MSG(md_id, "net", "CCMNI%d create instance ok!\n", count); - } - } - - ret = md_register_call_chain(md_id, &ctl_b->ccmni_notifier); - if(ret) { - CCCI_MSG_INF(md_id, "net", "md_register_call_chain fail: %d\n", ret); - goto _CCMNI_INSTANCE_CREATE_FAIL; - } - - snprintf(ctl_b->wakelock_name, sizeof(ctl_b->wakelock_name), "ccci%d_net_v2", (md_id+1)); - wake_lock_init(&ctl_b->ccmni_wake_lock, WAKE_LOCK_SUSPEND, ctl_b->wakelock_name); - - return ret; - -_CCMNI_INSTANCE_CREATE_FAIL: - for(curr=0; curr<=count; curr++) { - ccmni_v2_destroy_instance(md_id, curr); - } - kfree(ctl_b); - ccmni_ctl_block[md_id] = NULL; - return ret; -} - -void ccmni_v2_exit(int md_id) -{ - int count; - ccmni_v2_ctl_block_t *ctl_b = (ccmni_v2_ctl_block_t *)ccmni_ctl_block[md_id]; - - if (ctl_b) { - for(count = 0; count < CCMNI_V2_PORT_NUM; count++) - { - ccmni_v2_destroy_instance(md_id, count); - } - md_unregister_call_chain(md_id, &ctl_b->ccmni_notifier); - wake_lock_destroy(&ctl_b->ccmni_wake_lock); - } - - return; -} - - - diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci.h b/drivers/misc/mediatek/dual_ccci/include/ccci.h deleted file mode 100644 index ee72b8fbf1b..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci.h +++ /dev/null @@ -1,134 +0,0 @@ -#ifndef __CCCI_H__ -#define __CCCI_H__ -#include -typedef void (*ccci_aed_cb_t)(unsigned int flag, char* aed_str); -/******************************************************************************/ -/** mdlogger mode define **/ -/******************************************************************************/ -typedef enum { - MODE_UNKNOWN = -1, // -1 - MODE_IDLE, // 0 - MODE_USB, // 1 - MODE_SD, // 2 - MODE_POLLING, // 3 - MODE_WAITSD, // 4 -}LOGGING_MODE; - -//================================================================================== -// IOCTL commands -//================================================================================== -// CCCI == EEMCS -#define CCCI_IOC_MAGIC 'C' -#define CCCI_IOC_MD_RESET _IO(CCCI_IOC_MAGIC, 0) // mdlogger // META // muxreport -#define CCCI_IOC_GET_MD_STATE _IOR(CCCI_IOC_MAGIC, 1, unsigned int) // audio -#define CCCI_IOC_PCM_BASE_ADDR _IOR(CCCI_IOC_MAGIC, 2, unsigned int) // audio -#define CCCI_IOC_PCM_LEN _IOR(CCCI_IOC_MAGIC, 3, unsigned int) // audio -#define CCCI_IOC_FORCE_MD_ASSERT _IO(CCCI_IOC_MAGIC, 4) // muxreport // mdlogger -#define CCCI_IOC_ALLOC_MD_LOG_MEM _IO(CCCI_IOC_MAGIC, 5) // mdlogger -#define CCCI_IOC_DO_MD_RST _IO(CCCI_IOC_MAGIC, 6) // md_init -#define CCCI_IOC_SEND_RUN_TIME_DATA _IO(CCCI_IOC_MAGIC, 7) // md_init -#define CCCI_IOC_GET_MD_INFO _IOR(CCCI_IOC_MAGIC, 8, unsigned int) // md_init -#define CCCI_IOC_GET_MD_EX_TYPE _IOR(CCCI_IOC_MAGIC, 9, unsigned int) // mdlogger -#define CCCI_IOC_SEND_STOP_MD_REQUEST _IO(CCCI_IOC_MAGIC, 10) // muxreport -#define CCCI_IOC_SEND_START_MD_REQUEST _IO(CCCI_IOC_MAGIC, 11) // muxreport -#define CCCI_IOC_DO_STOP_MD _IO(CCCI_IOC_MAGIC, 12) // md_init -#define CCCI_IOC_DO_START_MD _IO(CCCI_IOC_MAGIC, 13) // md_init -#define CCCI_IOC_ENTER_DEEP_FLIGHT _IO(CCCI_IOC_MAGIC, 14) // RILD // factory -#define CCCI_IOC_LEAVE_DEEP_FLIGHT _IO(CCCI_IOC_MAGIC, 15) // RILD // factory -#define CCCI_IOC_POWER_ON_MD _IO(CCCI_IOC_MAGIC, 16) // md_init -#define CCCI_IOC_POWER_OFF_MD _IO(CCCI_IOC_MAGIC, 17) // md_init -#define CCCI_IOC_POWER_ON_MD_REQUEST _IO(CCCI_IOC_MAGIC, 18) -#define CCCI_IOC_POWER_OFF_MD_REQUEST _IO(CCCI_IOC_MAGIC, 19) -#define CCCI_IOC_SIM_SWITCH _IOW(CCCI_IOC_MAGIC, 20, unsigned int) // RILD // factory -#define CCCI_IOC_SEND_BATTERY_INFO _IO(CCCI_IOC_MAGIC, 21) // md_init -#define CCCI_IOC_SIM_SWITCH_TYPE _IOR(CCCI_IOC_MAGIC, 22, unsigned int) // RILD -#define CCCI_IOC_STORE_SIM_MODE _IOW(CCCI_IOC_MAGIC, 23, unsigned int) // RILD -#define CCCI_IOC_GET_SIM_MODE _IOR(CCCI_IOC_MAGIC, 24, unsigned int) // RILD -#define CCCI_IOC_RELOAD_MD_TYPE _IO(CCCI_IOC_MAGIC, 25) // META // md_init // muxreport -#define CCCI_IOC_GET_SIM_TYPE _IOR(CCCI_IOC_MAGIC, 26, unsigned int) // terservice -#define CCCI_IOC_ENABLE_GET_SIM_TYPE _IOW(CCCI_IOC_MAGIC, 27, unsigned int) // terservice -#define CCCI_IOC_SEND_ICUSB_NOTIFY _IOW(CCCI_IOC_MAGIC, 28, unsigned int) // icusbd -#define CCCI_IOC_SET_MD_IMG_EXIST _IOW(CCCI_IOC_MAGIC, 29, unsigned int) // md_init -#define CCCI_IOC_GET_MD_IMG_EXIST _IOR(CCCI_IOC_MAGIC, 30, unsigned int) -#define CCCI_IOC_GET_MD_TYPE _IOR(CCCI_IOC_MAGIC, 31, unsigned int) // RILD -#define CCCI_IOC_STORE_MD_TYPE _IOW(CCCI_IOC_MAGIC, 32, unsigned int) // RILD -#define CCCI_IOC_GET_MD_TYPE_SAVING _IOR(CCCI_IOC_MAGIC, 33, unsigned int) // META -#define CCCI_IOC_GET_EXT_MD_POST_FIX _IOR(CCCI_IOC_MAGIC, 34, char[32]) // eemcs_fsd // mdlogger -#define CCCI_IOC_FORCE_FD _IOW(CCCI_IOC_MAGIC, 35, unsigned int) // RILD(6577) -#define CCCI_IOC_AP_ENG_BUILD _IOW(CCCI_IOC_MAGIC, 36, unsigned int) // md_init(6577) -#define CCCI_IOC_GET_MD_MEM_SIZE _IOR(CCCI_IOC_MAGIC, 37, unsigned int) // md_init(6577) -#define CCCI_IOC_UPDATE_SIM_SLOT_CFG _IOW(CCCI_IOC_MAGIC, 38, unsigned int) // RILD -#define CCCI_IOC_GET_CFG_SETTING _IOW(CCCI_IOC_MAGIC, 39, unsigned int) // md_init - -#define CCCI_IOC_SET_MD_SBP_CFG _IOW(CCCI_IOC_MAGIC, 40, unsigned int) // md_init -#define CCCI_IOC_GET_MD_SBP_CFG _IOW(CCCI_IOC_MAGIC, 41, unsigned int) // md_init -#define CCCI_IOC_GET_MD_PROTOCOL_TYPE _IOR(CCCI_IOC_MAGIC, 42, char[16]) /*metal tool to get modem protocol type: AP_TST or DHL*/ - - -//================================================================================== -// API functions exported in ccci -//================================================================================== -int ccci_md_ctrl_init(int md_id); -void ccci_md_ctrl_exit(int md_id); -int ccci_chrdev_init(int md_id); -void ccci_chrdev_exit(int md_id); -int ccci_tty_init(int md_id); -void ccci_tty_exit(int md_id); -int ccci_ipc_init(int md_id); -void ccci_ipc_exit(int md_id); -int ccci_rpc_init(int md_id); -void ccci_rpc_exit(int md_id); -int ccci_fs_init(int md_id); -void ccci_fs_exit(int md_id); -int ccmni_init(int md_id); -void ccmni_exit(int md_id); -int ccci_vir_chrdev_init(int md_id); -void ccci_vir_chrdev_exit(int md_id); -int init_ccci_dev_node(void); -void release_ccci_dev_node(void); -int mk_ccci_dev_node(int md_id); -void ccci_dev_node_exit(int md_id); -int statistics_init(int md_id); -void statistics_exit(int md_id); - - -int get_dev_id_by_md_id(int md_id, char node_name[], int *major, int* minor); -int get_md_id_by_dev_major(int dev_major); -int init_ccci_dev_node(void); -int send_md_reset_notify(int); -int ccci_trigger_md_assert(int); - -int get_md_exception_type(int md_id); -int send_md_stop_notify(int md_id); -int send_md_start_notify(int md_id); -int ccci_start_modem(int md_id); -int ccci_stop_modem(int md_id, unsigned int timeout); -int ccci_set_reload_modem(int md_id); -int ccci_send_run_time_data(int md_id); -int statistics_init_ch_dir(int md_sys_id, int ch, int dir, char *name); -void dump_logical_layer_tx_rx_histroy(int md_id); -void logic_layer_ch_record_dump(int md_id, int ch); -void add_logic_layer_record(int md_id, ccci_msg_t *data, int drop); -void ccci_dump_logic_layer_info(int md_id, unsigned int buf[], int len); -void ccci_dump_hw_reg_val(int md_id, unsigned int buf[], int len); -int send_enter_flight_mode_request(int md_id); -int send_leave_flight_mode_request(int md_id); -int send_power_on_md_request(int md_id); -int send_power_down_md_request(int md_id); -int send_update_cfg_request(int md_id, unsigned int val); -int ccci_md_ctrl_common_init(void); -int bind_to_low_layer_notify(int md_id, void (*isr_func)(int), void (*send_func)(int, unsigned int)); -ccif_t* ccif_create_instance(ccif_hw_info_t *info, void* ctl_b, int md_id); -int register_ccci_attr_func(const char *buf, ssize_t (*show)(char*), ssize_t (*store)(const char*,size_t)); -int get_common_cfg_setting(int md_id, int cfg[], int *num); -//================================================================================== -// API functions for IPO-H -//================================================================================== -int ccci_uart_ipo_h_restore(int md_id); -int ccci_ipc_ipo_h_restore(int md_id); -int ccmni_ipo_h_restore(int md_id); -int ccci_ipo_h_restore(int md_id, char buf[], unsigned int len); - -int ccci_misc_ipo_h_restore(int md_id); - -#endif //__CCCI_H__ \ No newline at end of file diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_cfg.h b/drivers/misc/mediatek/dual_ccci/include/ccci_cfg.h deleted file mode 100644 index 22e5c2f5ef9..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_cfg.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef __CCCI_CFG_H__ -#define __CCCI_CFG_H__ - -#include - - -/*******************************************************************/ -/** ccci version define and explanation **/ -/*******************************************************************/ -//v1.4 20120618: add dual ccci design for MT6589 and enhance ccci driver architecture -#define CCCI_VERSION "v1.4 20120618" - - -/*******************************************************************/ -/** ccci configure macro define **/ -/*******************************************************************/ -#define CCCI_MAX_CHANNEL (100) - - -#define CCCI_WAKEUP_LOCK_NAME_LEN (16) - -#define MDLOGGER_FILE_PATH "/data/mdl/mdl_config" - -#define IMG_INF_LEN (256) - -#define EE_BUF_LEN (256) - -#define EE_TIMER_BASE (HZ) - -#define CCCI_NODE_TYPE_NUM (10) -#define NET_PORT_NUM (4) - -// Total must less than 255 -#define STD_CHR_DEV_NUM CCCI_MAX_CH_NUM //(50) //notes: STD_CHR_DEV_NUM must be not less than CCCI_MAX_CH_NUM -#define IPC_DEV_NUM (20) -#define FS_DEV_NUM (10) -#define VIR_CHR_DEV_NUM (10) -#define TTY_DEV_NUM (10) -#define RPC_DEV_NUM (10) - -#define CCCI_MAX_VCHR_NUM (10) -#define CCCI_VIR_CHR_KFIFO_SIZE (16) - - -/*******************************************************************/ -/** Feature options **/ -/*******************************************************************/ -//#define USING_PRINTK_LOG - -#endif//__CCCI_CFG_H__ \ No newline at end of file diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_ch.h b/drivers/misc/mediatek/dual_ccci/include/ccci_ch.h deleted file mode 100644 index 97d7e9dfdb0..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_ch.h +++ /dev/null @@ -1,88 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_ch.h - * - * Project: - * -------- - * YuSu - * - * Description: - * ------------ - * MT6516 CCCI channel definitions - * - * Author: - * ------- - * CC Hwang (mtk00702) - * - ****************************************************************************/ - -#ifndef __CCCI_CH_H__ -#define __CCCI_CH_H__ - -typedef enum _ccci_ch{ - CCCI_CONTROL_RX = 0, - CCCI_CONTROL_TX = 1, - CCCI_SYSTEM_RX = 2, - CCCI_SYSTEM_TX = 3, - CCCI_PCM_RX = 4, - CCCI_PCM_TX = 5, - CCCI_UART1_RX = 6, - CCCI_UART1_RX_ACK = 7, - CCCI_UART1_TX = 8, - CCCI_UART1_TX_ACK = 9, - CCCI_UART2_RX = 10, - CCCI_UART2_RX_ACK = 11, - CCCI_UART2_TX = 12, - CCCI_UART2_TX_ACK = 13, - CCCI_FS_RX = 14, - CCCI_FS_TX = 15, - CCCI_PMIC_RX = 16, - CCCI_PMIC_TX = 17, - CCCI_UEM_RX = 18, - CCCI_UEM_TX = 19, - CCCI_CCMNI1_RX = 20, - CCCI_CCMNI1_RX_ACK = 21, - CCCI_CCMNI1_TX = 22, - CCCI_CCMNI1_TX_ACK = 23, - CCCI_CCMNI2_RX = 24, - CCCI_CCMNI2_RX_ACK = 25, - CCCI_CCMNI2_TX = 26, - CCCI_CCMNI2_TX_ACK = 27, - CCCI_CCMNI3_RX = 28, - CCCI_CCMNI3_RX_ACK = 29, - CCCI_CCMNI3_TX = 30, - CCCI_CCMNI3_TX_ACK = 31, - CCCI_RPC_RX = 32, - CCCI_RPC_TX = 33, - CCCI_IPC_RX = 34, - CCCI_IPC_RX_ACK = 35, - CCCI_IPC_TX = 36, - CCCI_IPC_TX_ACK = 37, - CCCI_IPC_UART_RX = 38, - CCCI_IPC_UART_RX_ACK = 39, - CCCI_IPC_UART_TX = 40, - CCCI_IPC_UART_TX_ACK = 41, - CCCI_MD_LOG_RX = 42, - CCCI_MD_LOG_TX = 43, -#ifdef CONFIG_MTK_ICUSB_SUPPORT - CCCI_ICUSB_RX = 44, - CCCI_ICUSB_RX_ACK = 45, - CCCI_ICUSB_TX = 46, - CCCI_ICUSB_TX_ACK = 47, -#endif - - // MAX Channel - CCCI_MAX_CH_NUM, - - // Force modem assert channel id - CCCI_FORCE_ASSERT_CH = 20090215, - - // Monitor channel - CCCI_MONITOR_CH = 0xf0000000, - // CCCI_INVALID_CH_ID - CCCI_INVALID_CH_ID = 0xffffffff, -}ccci_ch_t; - -#endif //__CCCI_CH_H__ diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_chrdev.h b/drivers/misc/mediatek/dual_ccci/include/ccci_chrdev.h deleted file mode 100644 index 4d055d5504e..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_chrdev.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef __CCCI_CHRDEV_H__ -#define __CCCI_CHRDEV_H__ -#include -#include -#include -#include -#include -#include - - -#define MAX_BUFFER_MESSAGES ((1<<20)/sizeof(CCCI_BUFF_T)) -#define DEFAULT_BUFFER (CCCI_FIFO_MAX_LEN*2) - -#define recv_array_is_full(array) ({ \ - unsigned int __nr=(array)->nr; \ - unsigned int __idx=(array)->in_idx; \ - WARN_ON(__idx>__nr); \ - __nr==__idx ; }) - -#define recv_array_is_empty(array) ({ \ - unsigned int __nr=(array)->in_idx; \ - unsigned int __idx=(array)->out_idx; \ - WARN_ON(__idx>__nr); \ - __nr==__idx ; }) - -#define reset_recv_array(array) ({ \ - (array)->in_idx=0; \ - (array)->out_idx=0; }) - - -#define get_first_entry(list,type,mem) ({ \ - type * __ret;\ - if (list_empty(list)) __ret=NULL;\ - else __ret=list_entry((list)->next,type,mem);\ - __ret; }) - -#define get_last_entry(list,type,mem) ({ \ - type * __ret;\ - if (list_empty(list)) __ret=NULL;\ - else __ret=list_entry((list)->prev,type,mem);\ - __ret; }) - -#define ccci_get_first(_list) get_first_entry(_list,struct recv_array,list) -#define ccci_get_last(_list) get_last_entry(_list,struct recv_array,list) -#define ccci_is_last_recv(list) list_is_last((list)->next,list) - - -struct recv_array{ - CCCI_BUFF_T *array; - unsigned int nr; - unsigned int in_idx; - unsigned int out_idx; - struct list_head list; -}; - -struct ccci_dev_client{ - spinlock_t lock; - atomic_t user; - pid_t pid; - int ch_num; - struct list_head dev_list; - wait_queue_head_t wait_q; - int md_id; - void *ctlb; - struct fasync_struct *fasync; - volatile unsigned int wakeup_waitq; -}; - -typedef struct _chr_ctl_block -{ - int md_id; - struct mutex chr_dev_mutex; - struct list_head chr_dev_list; - struct cdev ccci_chrdev; - int major; - int minor; -}chr_ctl_block_t; - - -typedef struct _ccci_vir_client{ - spinlock_t lock; - atomic_t user; - pid_t pid; - int index; - struct list_head dev_list; - wait_queue_head_t wait_q; - int md_id; - void *ctlb; - struct fasync_struct *fasync; - volatile unsigned int wakeup_waitq; - struct kfifo private_fifo; - int fifo_ready; -}ccci_vir_client_t; - -typedef struct _vir_chr_ctl_block -{ - int md_id; - struct mutex chr_dev_mutex; - struct list_head chr_dev_list; - struct cdev ccci_chrdev; - int major; - int minor; - spinlock_t bind_lock; - ccci_vir_client_t *system_msg_client; -}vir_ctl_block_t; - - -extern int ccci_chrdev_init(int); -extern void ccci_chrdev_exit(int); - - -#endif //__CCCI_CHRDEV_H__ diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_common.h b/drivers/misc/mediatek/dual_ccci/include/ccci_common.h deleted file mode 100644 index e528763b4a8..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_common.h +++ /dev/null @@ -1,357 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_common.h - * - * Project: - * -------- - * - * - * Description: - * ------------ - * - * Author: - * ------- - * - * - ****************************************************************************/ - -#ifndef __CCCI_COMMON_H__ -#define __CCCI_COMMON_H__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//================================================================================== -// debug log define -//================================================================================== -/*---------------------------alway on log-----------------------------------*/ - -#define pr_fmt(fmt) "["KBUILD_MODNAME"]"fmt - -#define CCCI_MSG(fmt, args...) pr_notice("[com] (0)" fmt, ##args) -#define CCCI_MSG_INF(idx, tag, fmt, args...) pr_notice("[" tag "] (%d)" fmt, (idx+1), ##args) -#define CCCI_DBG_MSG(idx, tag, fmt, args...) pr_debug("[" tag "] (%d)" fmt, (idx+1), ##args) -#define CCCI_DBG_COM_MSG(fmt, args...) pr_notice("[com] (0)" fmt, ##args) -#define CCCI_ERR(fmt, args...) pr_err("[err] (0)" fmt, ##args) -#define CCCI_ERR_INF(idx, tag, fmt, args...) pr_err("[" tag "] (%d)" fmt, (idx+1), ##args) - - -/*---------------------------Switchable log--------------------------------*/ -/* Debug message switch */ -#define CCCI_DBG_NONE (0x00000000) /* No debug log */ -#define CCCI_DBG_CTL (0x00000001) /* Control log */ -#define CCCI_DBG_TTY (0x00000002) /* TTY channel log */ -#define CCCI_DBG_FS (0x00000004) /* FS channel log */ -#define CCCI_DBG_RPC (0x00000008) /* RPC channel log */ -#define CCCI_DBG_IPC (0x00000010) /* IPC channel log */ -#define CCCI_DBG_PMIC (0x00000020) /* PMIC channel log */ -#define CCCI_DBG_CCMNI (0x00000040) /* CCMIN channel log */ -#define CCCI_DBG_FUNC (0x00000080) /* Functiong entry log */ -#define CCCI_DBG_MISC (0x00000100) /* Misc log */ -#define CCCI_DBG_CHR (0x00000200) /* Char dev log */ -#define CCCI_DBG_CCIF (0x00000400) /* Ccif log */ -#define CCCI_DBG_ALL (0xffffffff) - -#define ENABLE_ALL_RX_LOG (1ULL<<63) - -/*---------------------------------------------------------------------------*/ -/* Switchable messages */ -extern unsigned int ccci_msg_mask[]; - -#ifdef USING_PRINTK_LOG - -#define CCCI_FILTER_MSG(mask, fmt, args...) \ -do { \ - if ((CCCI_DBG_##mask) & ccci_msg_mask ) \ - printk("[ccci]" fmt , ##args); \ -} while(0) - -#define CCCI_CTL_MSG(fmt, args...) CCCI_FILTER_MSG(CTL, ""fmt, ##args) -#define CCCI_TTY_MSG(fmt, args...) CCCI_FILTER_MSG(TTY, ""fmt, ##args) -#define CCCI_FS_MSG(fmt, args...) CCCI_FILTER_MSG(FS, ""fmt, ##args) -#define CCCI_RPC_MSG(fmt, args...) CCCI_FILTER_MSG(RPC, ""fmt, ##args) -#define CCCI_IPC_MSG(fmt, args...) CCCI_FILTER_MSG(IPC, ""fmt, ##args) -#define CCCI_PMIC_MSG(fmt, args...) CCCI_FILTER_MSG(PMIC, ""fmt, ##args) -#define CCCI_FUNC_ENTRY(f) CCCI_FILTER_MSG(FUNC, "%s\n", __FUNCTION__) -#define CCCI_MISC_MSG(fmt, args...) CCCI_FILTER_MSG(MISC, fmt, ##args) -#define CCCI_CHR_MSG(fmt, args...) CCCI_FILTER_MSG(CHR, ""fmt, ##args) -#define CCCI_CCIF_MSG(fmt, args...) CCCI_FILTER_MSG(CCIF, ""fmt, ##args) -#define CCCI_CCMNI_MSG(fmt, args...) CCCI_FILTER_MSG(CCMNI, ""fmt, ##args) - -#else -#define CCCI_FILTER_MSG(mask, tag, idx, fmt, args...) \ -do { \ - if ((CCCI_DBG_##mask) & ccci_msg_mask[idx] ) \ - CCCI_MSG_INF(idx, tag, fmt, ##args); \ -} while(0) - -#define CCCI_CTL_MSG(idx, fmt, args...) CCCI_FILTER_MSG(CTL, "/ctl", idx, fmt, ##args) -#define CCCI_TTY_MSG(idx, fmt, args...) CCCI_FILTER_MSG(TTY, "/tty", idx, fmt, ##args) -#define CCCI_FS_MSG(idx, fmt, args...) CCCI_FILTER_MSG(FS, "/fs ", idx, fmt, ##args) -#define CCCI_RPC_MSG(idx, fmt, args...) CCCI_FILTER_MSG(RPC, "/rpc", idx, fmt, ##args) -#define CCCI_IPC_MSG(idx, fmt, args...) CCCI_FILTER_MSG(IPC, "/ipc", idx, fmt, ##args) -#define CCCI_PMIC_MSG(idx, fmt, args...) CCCI_FILTER_MSG(PMIC, "/pmc", idx, fmt, ##args) -#define CCCI_FUNC_ENTRY(idx) CCCI_FILTER_MSG(FUNC, "/fun", idx, "%s\n", __FUNCTION__) -#define CCCI_MISC_MSG(idx, fmt, args...) CCCI_FILTER_MSG(MISC, "/mis", idx, fmt, ##args) -#define CCCI_CHR_MSG(idx, fmt, args...) CCCI_FILTER_MSG(CHR, "/chr", idx, fmt, ##args) -#define CCCI_CCIF_MSG(idx, fmt, args...) CCCI_FILTER_MSG(CCIF, "/cci", idx, fmt, ##args) -#define CCCI_CCMNI_MSG(idx, fmt, args...) CCCI_FILTER_MSG(CCMNI, "/net", idx, fmt, ##args) -#endif - - - -//================================================================================== -// AEE function and macro define -//================================================================================== -#define CCCI_AED_DUMP_EX_MEM (1<<0) -#define CCCI_AED_DUMP_MD_IMG_MEM (1<<1) -#define CCCI_AED_DUMP_CCIF_REG (1<<2) - -void ccci_aed(int, unsigned int, char *); - - -//================================================================================== -// ccci related macro and structure define -//================================================================================== -#define CAN_BE_RELOAD (0x1<<1) -#define LOAD_ONE_TIME (0x1<<0) -#define LOAD_ALL_IMG (LOAD_ONE_TIME|CAN_BE_RELOAD) -#define RELOAD_ONLY (CAN_BE_RELOAD) - -#define CCCI_LOG_TX 0 -#define CCCI_LOG_RX 1 - -#define DBG_FLAG_DEBUG (1<<0) -#define DBG_FLAG_JTAG (1<<1) - - -enum { - MD_DEBUG_REL_INFO_NOT_READY = 0, - MD_IS_DEBUG_VERSION, - MD_IS_RELEASE_VERSION -}; - -typedef enum _ccif_type -{ - CCIF_STD_V1=0, // 16 channel ccif, tx 8, rx 8 - CCIF_VIR, // Virtual CCIF type -}ccif_type_t; - -typedef struct _ccif_hw_info -{ - unsigned long reg_base; - unsigned long md_reg_base; - unsigned int irq_id; - unsigned int irq_attr; - ccif_type_t type; - unsigned int md_id; -}ccif_hw_info_t; - -typedef struct _rpc_cfg_inf -{ - int rpc_ch_num; - int rpc_max_buf_size; -}rpc_cfg_inf_t; - - - -//================================================================================== -// share memory layout define -//================================================================================== -//share memory table -typedef struct _smem_alloc -{ - // Share memory - unsigned int ccci_smem_size; - unsigned int ccci_smem_vir; - unsigned int ccci_smem_phy; - // -- Log - unsigned int ccci_mdlog_smem_base_virt; - unsigned int ccci_mdlog_smem_base_phy; - unsigned int ccci_mdlog_smem_size; - // -- PCM - unsigned int ccci_pcm_smem_base_virt; - unsigned int ccci_pcm_smem_base_phy; - unsigned int ccci_pcm_smem_size; - // -- PMIC - unsigned int ccci_pmic_smem_base_virt; - unsigned int ccci_pmic_smem_base_phy; - unsigned int ccci_pmic_smem_size; - // -- FS - unsigned int ccci_fs_smem_base_virt; - unsigned int ccci_fs_smem_base_phy; - unsigned int ccci_fs_smem_size; - // -- RPC - unsigned int ccci_rpc_smem_base_virt; - unsigned int ccci_rpc_smem_base_phy; - unsigned int ccci_rpc_smem_size; - // -- TTY - unsigned int ccci_uart_smem_base_virt[CCCI_UART_PORT_NUM]; - unsigned int ccci_uart_smem_base_phy[CCCI_UART_PORT_NUM]; - unsigned int ccci_uart_smem_size[CCCI_UART_PORT_NUM]; - // -- Exception - unsigned int ccci_exp_smem_base_virt; - unsigned int ccci_exp_smem_base_phy; - unsigned int ccci_exp_smem_size; - // -- IPC - unsigned int ccci_ipc_smem_base_virt; - unsigned int ccci_ipc_smem_base_phy; - unsigned int ccci_ipc_smem_size; - // -- SYS - Eint exchagne - unsigned int ccci_sys_smem_base_virt; - unsigned int ccci_sys_smem_base_phy; - unsigned int ccci_sys_smem_size; - // -- CCMNI new version - // ----- Up-link - unsigned int ccci_ccmni_smem_ul_base_virt; - unsigned int ccci_ccmni_smem_ul_base_phy; - unsigned int ccci_ccmni_smem_ul_size; - // ----- Donw-link - unsigned int ccci_ccmni_smem_dl_base_virt; - unsigned int ccci_ccmni_smem_dl_base_phy; - unsigned int ccci_ccmni_smem_dl_size; - unsigned int ccci_ccmni_ctl_smem_base_virt[NET_PORT_NUM]; - unsigned int ccci_ccmni_ctl_smem_base_phy[NET_PORT_NUM]; - unsigned int ccci_ccmni_ctl_smem_size[NET_PORT_NUM]; - // -- EXT MD Exception - unsigned int ccci_md_ex_exp_info_smem_base_virt; - unsigned int ccci_md_ex_exp_info_smem_base_phy; - unsigned int ccci_md_ex_exp_info_smem_size; - // -- MD Runtime Data - unsigned int ccci_md_runtime_data_smem_base_virt; - unsigned int ccci_md_runtime_data_smem_base_phy; - unsigned int ccci_md_runtime_data_smem_size; - // -- Misc Info Data - unsigned int ccci_misc_info_base_virt; - unsigned int ccci_misc_info_base_phy; - unsigned int ccci_misc_info_size; -}smem_alloc_t; - -// Memory layout table -typedef struct _ccci_mem_layout -{ - // MD image - unsigned int md_region_vir; - unsigned int md_region_phy; - unsigned int md_region_size; - // DSP image - unsigned int dsp_region_vir; - unsigned int dsp_region_phy; - unsigned int dsp_region_size; - // Share memory - unsigned int smem_region_vir; - unsigned int smem_region_phy; - unsigned int smem_region_size; - unsigned int smem_region_phy_before_map; -}ccci_mem_layout_t; - - -// Misc info structure -typedef struct _misc_info -{ - unsigned int prefix; // "CCIF" - unsigned int support_mask; - unsigned int index; - unsigned int next; - unsigned int feature_0_val[4]; - unsigned int feature_1_val[4]; - unsigned int feature_2_val[4]; - unsigned int feature_3_val[4]; - unsigned int feature_4_val[4]; - unsigned int feature_5_val[4]; - unsigned int feature_6_val[4]; - unsigned int feature_7_val[4]; - unsigned int feature_8_val[4]; - unsigned int feature_9_val[4]; - unsigned int feature_10_val[4]; - unsigned int feature_11_val[4]; - unsigned int feature_12_val[4]; - unsigned int feature_13_val[4]; - unsigned int feature_14_val[4]; - unsigned int feature_15_val[4]; - unsigned int reserved_2[3]; - unsigned int postfix; // "CCIF" -} misc_info_t; - -typedef enum -{ - FEATURE_NOT_EXIST = 0, - FEATURE_NOT_SUPPORT, - FEATURE_SUPPORT, - FEATURE_PARTIALLY_SUPPORT, -} misc_feature_sta_t; - -typedef enum -{ - MISC_DMA_ADDR = 0, - MISC_32K_LESS, - MISC_RAND_SEED, - MISC_MD_COCLK_SETTING, - MISC_MD_SBP_SETTING, -} misc_feature_id_t; - - - -//================================================================================== -// API need implemented by ccci platform -//================================================================================== -int get_dev_major_for_md_sys(int md_id); -int get_ccif_hw_info(int md_id, ccif_hw_info_t *ccif_hw_info); -void md_env_setup_before_boot(int md_id); -void md_env_setup_before_ready(int md_id); -void md_boot_up_additional_operation(int md_id); -void md_boot_ready_additional_operation(int md_id); -void additional_operation_before_stop_md(int md_id); -smem_alloc_t* get_md_smem_layout(int md_id); -unsigned int get_md_sys_max_num(void); -void ccci_md_wdt_notify_register(int, int (*funcp)(int)); -int ccci_load_firmware(int md_id, unsigned int load_flag, char img_err_str[], int len); -int ccci_power_on_md(int md_id); -int ccci_power_down_md(int md_id); -int let_md_stop(int md_id, unsigned int timeout); -int let_md_go(int md_id); -int ccci_get_sub_module_cfg(int md_id, char name[], char out_buf[], int size); -int ccci_alloc_smem(int md_id); -void ccci_free_smem(int md_id); -ccci_mem_layout_t* get_md_sys_layout(int md_id); -int is_modem_debug_ver(int md_id); -char* get_md_info_str(int md_id); -void platform_set_runtime_data(int md_id, modem_runtime_t *runtime); -void config_misc_info(int md_id, unsigned int base[], unsigned int size); -void send_battery_info(int md_id); -#ifdef CONFIG_MTK_ICUSB_SUPPORT -void send_icusb_notify(int md_id, unsigned int sim_id); -#endif -void md_fast_dormancy(int md_id); -void start_md_wdt_recov_timer(int md_id); -int platform_init(int md_id, int power_down); -void platform_deinit(int md_id); -unsigned int get_debug_mode_flag(void); -int ccci_ipo_h_platform_restore(int md_id); -int set_sim_type(int md_id, int data); -int get_sim_type(int md_id, int *p_sim_type); -int enable_get_sim_type(int md_id, unsigned int enable); -void ccci_dump_md_register(int md_id); -#ifdef CONFIG_MTK_MD_SBP_CUSTOM_VALUE -int ccci_set_md_sbp(int md_id, unsigned int md_sbp); -#endif // CONFIG_MTK_MD_SBP_CUSTOM_VALUE - -int get_md2_ap_phy_addr_fixed(void);//Generally, AP and MD has same share memory address after hw remapp. - //however, if hardware remapp does not work, then need software remap, - //This variable is used to fix md phy addr does not equeal with AP. - //If hardware remap works, then the variable is 0. -//================================================================================== -// CCCI API cannot be directly called by platform, -// since ccci.ko is loaded after ccci_platform.ko, -// so there is no API exported to platform. -//================================================================================== -#endif //__CCCI_COMMON_H__ diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_err_no.h b/drivers/misc/mediatek/dual_ccci/include/ccci_err_no.h deleted file mode 100644 index 824eb8132ff..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_err_no.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef __CCCI_ERR_NO_H__ -#define __CCCI_ERR_NO_H__ - -// CCCI error number region -#define CCCI_ERR_MODULE_INIT_START_ID (0) -#define CCCI_ERR_COMMON_REGION_START_ID (100) -#define CCCI_ERR_CCIF_REGION_START_ID (200) -#define CCCI_ERR_CCCI_REGION_START_ID (300) -#define CCCI_ERR_LOAD_IMG_START_ID (400) - -// CCCI error number -#define CCCI_ERR_MODULE_INIT_OK (CCCI_ERR_MODULE_INIT_START_ID+0) -#define CCCI_ERR_INIT_DEV_NODE_FAIL (CCCI_ERR_MODULE_INIT_START_ID+1) -#define CCCI_ERR_INIT_PLATFORM_FAIL (CCCI_ERR_MODULE_INIT_START_ID+2) -#define CCCI_ERR_MK_DEV_NODE_FAIL (CCCI_ERR_MODULE_INIT_START_ID+3) -#define CCCI_ERR_INIT_LOGIC_LAYER_FAIL (CCCI_ERR_MODULE_INIT_START_ID+4) -#define CCCI_ERR_INIT_MD_CTRL_FAIL (CCCI_ERR_MODULE_INIT_START_ID+5) -#define CCCI_ERR_INIT_CHAR_DEV_FAIL (CCCI_ERR_MODULE_INIT_START_ID+6) -#define CCCI_ERR_INIT_TTY_FAIL (CCCI_ERR_MODULE_INIT_START_ID+7) -#define CCCI_ERR_INIT_IPC_FAIL (CCCI_ERR_MODULE_INIT_START_ID+8) -#define CCCI_ERR_INIT_RPC_FAIL (CCCI_ERR_MODULE_INIT_START_ID+9) -#define CCCI_ERR_INIT_FS_FAIL (CCCI_ERR_MODULE_INIT_START_ID+10) -#define CCCI_ERR_INIT_CCMNI_FAIL (CCCI_ERR_MODULE_INIT_START_ID+11) -#define CCCI_ERR_INIT_VIR_CHAR_FAIL (CCCI_ERR_MODULE_INIT_START_ID+12) - -// ---- Common -#define CCCI_ERR_FATAL_ERR (CCCI_ERR_COMMON_REGION_START_ID+0) -#define CCCI_ERR_ASSERT_ERR (CCCI_ERR_COMMON_REGION_START_ID+1) -#define CCCI_ERR_MD_IN_RESET (CCCI_ERR_COMMON_REGION_START_ID+2) -#define CCCI_ERR_RESET_NOT_READY (CCCI_ERR_COMMON_REGION_START_ID+3) -#define CCCI_ERR_GET_MEM_FAIL (CCCI_ERR_COMMON_REGION_START_ID+4) -#define CCCI_ERR_GET_SMEM_SETTING_FAIL (CCCI_ERR_COMMON_REGION_START_ID+5) -#define CCCI_ERR_INVALID_PARAM (CCCI_ERR_COMMON_REGION_START_ID+6) -#define CCCI_ERR_LARGE_THAN_BUF_SIZE (CCCI_ERR_COMMON_REGION_START_ID+7) -#define CCCI_ERR_GET_MEM_LAYOUT_FAIL (CCCI_ERR_COMMON_REGION_START_ID+8) -#define CCCI_ERR_MEM_CHECK_FAIL (CCCI_ERR_COMMON_REGION_START_ID+9) -#define CCCI_IPO_H_RESTORE_FAIL (CCCI_ERR_COMMON_REGION_START_ID+10) - -// ---- CCIF -#define CCCI_ERR_CCIF_NOT_READY (CCCI_ERR_CCIF_REGION_START_ID+0) -#define CCCI_ERR_CCIF_CALL_BACK_HAS_REGISTERED (CCCI_ERR_CCIF_REGION_START_ID+1) -#define CCCI_ERR_CCIF_GET_NULL_POINTER (CCCI_ERR_CCIF_REGION_START_ID+2) -#define CCCI_ERR_CCIF_UN_SUPPORT (CCCI_ERR_CCIF_REGION_START_ID+3) -#define CCCI_ERR_CCIF_NO_PHYSICAL_CHANNEL (CCCI_ERR_CCIF_REGION_START_ID+4) -#define CCCI_ERR_CCIF_INVALID_RUNTIME_LEN (CCCI_ERR_CCIF_REGION_START_ID+5) -#define CCCI_ERR_CCIF_INVALID_MD_SYS_ID (CCCI_ERR_CCIF_REGION_START_ID+6) -#define CCCI_ERR_CCIF_GET_HW_INFO_FAIL (CCCI_ERR_CCIF_REGION_START_ID+9) - -// ---- CCCI -#define CCCI_ERR_INVALID_LOGIC_CHANNEL_ID (CCCI_ERR_CCCI_REGION_START_ID+0) -#define CCCI_ERR_PUSH_RX_DATA_TO_TX_CHANNEL (CCCI_ERR_CCCI_REGION_START_ID+1) -#define CCCI_ERR_REG_CALL_BACK_FOR_TX_CHANNEL (CCCI_ERR_CCCI_REGION_START_ID+2) -#define CCCI_ERR_LOGIC_CH_HAS_REGISTERED (CCCI_ERR_CCCI_REGION_START_ID+3) -#define CCCI_ERR_MD_NOT_READY (CCCI_ERR_CCCI_REGION_START_ID+4) -#define CCCI_ERR_ALLOCATE_MEMORY_FAIL (CCCI_ERR_CCCI_REGION_START_ID+5) -#define CCCI_ERR_CREATE_CCIF_INSTANCE_FAIL (CCCI_ERR_CCCI_REGION_START_ID+6) -#define CCCI_ERR_REPEAT_CHANNEL_ID (CCCI_ERR_CCCI_REGION_START_ID+7) -#define CCCI_ERR_KFIFO_IS_NOT_READY (CCCI_ERR_CCCI_REGION_START_ID+8) -#define CCCI_ERR_GET_NULL_POINTER (CCCI_ERR_CCCI_REGION_START_ID+9) -#define CCCI_ERR_GET_RX_DATA_FROM_TX_CHANNEL (CCCI_ERR_CCCI_REGION_START_ID+10) -#define CCCI_ERR_CHANNEL_NUM_MIS_MATCH (CCCI_ERR_CCCI_REGION_START_ID+11) -#define CCCI_ERR_START_ADDR_NOT_4BYTES_ALIGN (CCCI_ERR_CCCI_REGION_START_ID+12) -#define CCCI_ERR_NOT_DIVISIBLE_BY_4 (CCCI_ERR_CCCI_REGION_START_ID+13) -#define CCCI_ERR_MD_AT_EXCEPTION (CCCI_ERR_CCCI_REGION_START_ID+14) -#define CCCI_ERR_MD_CB_HAS_REGISTER (CCCI_ERR_CCCI_REGION_START_ID+15) - -// ---- Load image error -#define CCCI_ERR_LOAD_IMG_NOMEM (CCCI_ERR_LOAD_IMG_START_ID+0) -#define CCCI_ERR_LOAD_IMG_FILE_OPEN (CCCI_ERR_LOAD_IMG_START_ID+1) -#define CCCI_ERR_LOAD_IMG_FILE_READ (CCCI_ERR_LOAD_IMG_START_ID+2) -#define CCCI_ERR_LOAD_IMG_KERN_READ (CCCI_ERR_LOAD_IMG_START_ID+3) -#define CCCI_ERR_LOAD_IMG_NO_ADDR (CCCI_ERR_LOAD_IMG_START_ID+4) -#define CCCI_ERR_LOAD_IMG_NO_FIRST_BOOT (CCCI_ERR_LOAD_IMG_START_ID+5) -#define CCCI_ERR_LOAD_IMG_LOAD_FIRM (CCCI_ERR_LOAD_IMG_START_ID+6) -#define CCCI_ERR_LOAD_IMG_FIRM_NULL (CCCI_ERR_LOAD_IMG_START_ID+7) -#define CCCI_ERR_LOAD_IMG_CHECK_HEAD (CCCI_ERR_LOAD_IMG_START_ID+8) -#define CCCI_ERR_LOAD_IMG_SIGN_FAIL (CCCI_ERR_LOAD_IMG_START_ID+9) -#define CCCI_ERR_LOAD_IMG_CIPHER_FAIL (CCCI_ERR_LOAD_IMG_START_ID+10) -#define CCCI_ERR_LOAD_IMG_MD_CHECK (CCCI_ERR_LOAD_IMG_START_ID+11) -#define CCCI_ERR_LOAD_IMG_DSP_CHECK (CCCI_ERR_LOAD_IMG_START_ID+12) -#define CCCI_ERR_LOAD_IMG_ABNORAL_SIZE (CCCI_ERR_LOAD_IMG_START_ID+13) - -#endif //__CCCi_ERR_NO_H__ \ No newline at end of file diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_fs.h b/drivers/misc/mediatek/dual_ccci/include/ccci_fs.h deleted file mode 100644 index 71ca0badacf..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_fs.h +++ /dev/null @@ -1,44 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_fs.h - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * MT65XX CCCI FS Proxy Driver - * - ****************************************************************************/ - -#ifndef __CCCI_FS_H__ -#define __CCCI_FS_H__ -/* - * define IOCTL commands - */ -#define CCCI_FS_IOC_MAGIC 'K' -#define CCCI_FS_IOCTL_GET_INDEX _IO(CCCI_FS_IOC_MAGIC, 1) -#define CCCI_FS_IOCTL_SEND _IOR(CCCI_FS_IOC_MAGIC, 2, unsigned int) - -#define CCCI_FS_MAX_BUF_SIZE (16384) -#define CCCI_FS_MAX_BUFFERS (5) - -typedef struct -{ - unsigned length; - unsigned index; -} fs_stream_msg_t; - - -typedef struct -{ - unsigned fs_ops; - unsigned char buffer[CCCI_FS_MAX_BUF_SIZE]; -} fs_stream_buffer_t; - -#define CCCI_FS_SMEM_SIZE (sizeof(fs_stream_buffer_t) * CCCI_FS_MAX_BUFFERS) - -#endif // __CCCI_FS_H__ diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_ipc.h b/drivers/misc/mediatek/dual_ccci/include/ccci_ipc.h deleted file mode 100644 index d5cc6409f45..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_ipc.h +++ /dev/null @@ -1,127 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_ipc.h - * - * - * Author: - * ------- - * Yalin wang (mtk80678) - * - ****************************************************************************/ - -#ifndef __CCCI_IPC_H__ -#define __CCCI_IPC_H__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "ccci_tty.h" -#define IPC_MSGSVC_RVC_DONE 0x12344321 -#define MAX_NUM_IPC_TASKS_MD 10 -#define MAX_NUM_IPC_TASKS 10 -#define CCCI_IPC_BUFFER_SIZE (4<<10) -#define CCCI_IPC_DEV_MAJOR 183 -#define CCCI_TASK_PENDING 0x01 -#define CCCI_MD_IMAGE_MAPPING_SIZE (20<<20) -#define CCCI_IPC_MAGIC 'P' -#define CCCI_IPC_RESET_RECV _IO(CCCI_IPC_MAGIC,0) -#define CCCI_IPC_RESET_SEND _IO(CCCI_IPC_MAGIC,1) -#define CCCI_IPC_WAIT_MD_READY _IO(CCCI_IPC_MAGIC,2) - - -typedef unsigned int uint32; -typedef unsigned char uint8; -typedef unsigned short uint16; - -typedef struct { - uint8 ref_count; - uint16 msg_len; - uint8 data[0]; -} local_para_struct ; - -typedef struct { - uint16 pdu_len; - uint8 ref_count; - uint8 pb_resvered; - uint16 free_header_space; - uint16 free_tail_space; - uint8 data[0]; -}peer_buff_struct ; - -typedef struct ipc_ilm_struct -{ - uint32 src_mod_id; - uint32 dest_mod_id; - uint32 sap_id; - uint32 msg_id; - local_para_struct *local_para_ptr; - peer_buff_struct *peer_buff_ptr; -}ipc_ilm_t; - - typedef struct{ - uint32 rx_offset; - uint32 tx_offset; - uint32 size; - uint8 buffer[CCCI_IPC_BUFFER_SIZE]; -} BUFF; - -typedef struct { - BUFF buff_wr; - BUFF buff_rd; -} CCCI_IPC_BUFFER; - -typedef struct { - ipc_ilm_t ilm_md[MAX_NUM_IPC_TASKS_MD]; //md side ilms - ipc_ilm_t ilm[MAX_NUM_IPC_TASKS] ; - CCCI_IPC_BUFFER buffer; -} CCCI_IPC_MEM; - -typedef struct { - struct list_head list; - void *data; - uint32 len; -}CCCI_RECV_ITEM; - -typedef struct { - spinlock_t lock; - unsigned long flag; - atomic_t user; - unsigned long jiffies; - uint32 to_id; - struct fasync_struct *fasync; - ipc_ilm_t *ilm_p; - uint32 time_out; - uint32 ilm_phy_addr; - wait_queue_head_t read_wait_queue; - wait_queue_head_t write_wait_queue; - struct list_head recv_list; - void *owner; -}IPC_TASK; - -typedef struct IPC_MSGSVC_TASKMAP_STRUCT -{ - uint32 extq_id; /* IPC universal mapping external queue */ - uint32 task_id; /* IPC processor internal task id */ - -}IPC_MSGSVC_TASKMAP_T; - -extern int __init ccci_ipc_init(int); -extern void __exit ccci_ipc_exit(int); - -#define offset_of(type,mem) ((uint32)(&(((type *)0)->mem))) -#define CCCI_IPC_SMEM_SIZE (sizeof(CCCI_IPC_MEM)) - - - -#endif //__CCCI_IPC_H__ \ No newline at end of file diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_ipc_task_ID.h b/drivers/misc/mediatek/dual_ccci/include/ccci_ipc_task_ID.h deleted file mode 100644 index 0f72880cb19..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_ipc_task_ID.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef __CCCI_IPC_TASK_ID_H__ -#define __CCCI_IPC_TASK_ID_H__ -// Priority --> Local module ID --> External ID --> Max sent message -// X_IPC_MODULE_CONF(1,M_SSDBG1,0,1) //TASK_ID_1 -// X_IPC_MODULE_CONF(1,AP_SSDBG2,1,1) //TASK_ID_2 -#ifdef __IPC_ID_TABLE -#define X_IPC_MODULE_CONF(a,b,c,d) {c,b}, -#else -#define X_IPC_MODULE_CONF(a,b,c,d) -#endif - - -#define AP_UNIFY_ID_FLAG (1<<31) -#define MD_UNIFY_ID_FLAG (0<<31) - -//---------------------------------------------------------- -#define AGPS_MD_MOD_L4C 0 -#define AGPS_MD_MOD_L4C_2 1 -#define AGPS_MD_MOD_L4C_3 2 -#define AGPS_MD_MOD_L4C_4 3 -//agps MD begin task_id -//Wait to add - -#define AGPS_AP_MOD_MMI 0 -//agps AP begin task_id -//Wait to add -#define GPS_AP_MOD 2 -//-------------------------------------------------------------------------- -X_IPC_MODULE_CONF(1, AGPS_MD_MOD_L4C, MD_UNIFY_ID_FLAG|0, 1) -X_IPC_MODULE_CONF(1, AGPS_MD_MOD_L4C_2, MD_UNIFY_ID_FLAG|1, 1) -X_IPC_MODULE_CONF(1, AGPS_MD_MOD_L4C_3, MD_UNIFY_ID_FLAG|2, 1) -X_IPC_MODULE_CONF(1, AGPS_MD_MOD_L4C_4, MD_UNIFY_ID_FLAG|3, 1) -//Wait to add -//-------------------------------------------------------------------------- -X_IPC_MODULE_CONF(1, AGPS_AP_MOD_MMI, AP_UNIFY_ID_FLAG|0, 1) -X_IPC_MODULE_CONF(1, GPS_AP_MOD, AP_UNIFY_ID_FLAG|2, 1) -//Wait to add -//------------------------------------------------------------------------- - -#endif diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_layer.h b/drivers/misc/mediatek/dual_ccci/include/ccci_layer.h deleted file mode 100644 index 27718b619a6..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_layer.h +++ /dev/null @@ -1,313 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_layer.h - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * MT65XX CCCI header file - * - ****************************************************************************/ - -#ifndef __CCCI_LAYER_H__ -#define __CCCI_LAYER_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define CCCI_DEV_NAME "ccci" -//#define CCCI_DEV_MAJOR 184 move to platform.h -#define CCCI_SYSFS_INFO "info" -#define CCCI_FIFO_MAX_LEN 8 /* 8 = max of physical channel */ - - -//--------------logical channel attribute define-------------------// -#define L_CH_ATTR_TX (1<<0) // This logic channel is a TX channel -#define L_CH_ATTR_PRVLG0 (1<<1) // This logic channel can send data even if runtime data not send -#define L_CH_ATTR_PRVLG1 (1<<2) // This logic channel can send data even if modem not boot ready -#define L_CH_ATTR_PRVLG2 (1<<3) // This logic channel can send data even if modem has exception -#define L_CH_ATTR_DUMMY_WRITE (1<<4) // This logic channel using dummy write if modem has exception -#define L_CH_ATTR_OPEN_CLEAR (1<<5) // Clear all fifo data when open -#define L_CH_DROP_TOLERATED (1<<6) // Drop message is tolerated for this channel -#define L_CH_MUST_RDY_FOR_BOOT (1<<7) // During modem boot up, the channel must be ready - -//#define MD_BOOT_STAGE_0 (1) // Not set runtime data to MD -//#define MD_BOOT_STAGE_1 (2) // Has set runtime data to MD, but MD not ready yet -//#define MD_BOOT_STAGE_2 (3) // Modem is ready - - -//--------------TX transfer function define-------------------// -/* initialize a CCCI mailbox buffer */ -#define CCCI_INIT_MAILBOX(buff, mailbox_id) \ - do { \ - ((ccci_msg_t*)buff)->magic = 0xFFFFFFFF; \ - ((ccci_msg_t*)buff)->id = (mailbox_id); \ - ((ccci_msg_t*)buff)->channel = CCCI_INVALID_CH_ID; \ - ((ccci_msg_t*)buff)->reserved = 0; \ - } while (0) - -/* initialize a CCCI stream buffer */ -#define CCCI_INIT_STREAM(buff, stream_addr, stream_len) \ - do { \ - ((ccci_msg_t*)buff)->addr = (stream_addr); \ - ((ccci_msg_t*)buff)->len = (stream_len); \ - ((ccci_msg_t*)buff)->channel = CCCI_INVALID_CH_ID; \ - ((ccci_msg_t*)buff)->reserved = 0; \ - } while (0) - - -//-----------------data structure define-------------------------// -/* CCCI API return value */ -typedef enum -{ - CCCI_SUCCESS = 0, - CCCI_FAIL = -EIO, - CCCI_IN_USE = -EEXIST, - CCCI_NOT_OWNER = -EPERM, - CCCI_INVALID_PARAM = -EINVAL, - CCCI_NO_PHY_CHANNEL = -ENXIO, - CCCI_IN_INTERRUPT = -EACCES, - CCCI_IN_IRQ = -EINTR, - CCCI_MD_NOT_READY = -EBUSY, - CCCI_MD_IN_RESET = -ESRCH, - CCCI_RESET_NOT_READY = -ENODEV -}CCCI_RETURNVAL_T; - -/*typedef enum -{ -#define X_DEF_CH -#include "ccci_ch.h" -#undef X_DEF_CH - CCCI_MAX_CHANNEL=100, - CCCI_FORCE_RESET_MODEM_CHANNEL = 20090215, -} CCCI_CHANNEL_T; -*/ - -/* CCCI mailbox channel structure */ -typedef struct -{ - unsigned int magic; /* 0xFFFFFFFF */ - unsigned int id; -} CCCI_MAILBOX_T; - -/* CCCI stream channel structure */ -typedef struct -{ - unsigned int addr; - unsigned int len; -} CCCI_STREAM_T; - -/* CCCI channel buffer structure */ -typedef struct -{ - unsigned int data[2]; - unsigned int channel; - unsigned int reserved; -} CCCI_BUFF_T; - -/* CCCI callback function prototype */ -typedef void (*CCCI_CALLBACK)(CCCI_BUFF_T *buff, void *private_data); - -/* CCCI status */ -/* -typedef enum -{ - CCCI_IDLE = 0x00, - CCCI_ACTIVE_READ = 0x01,ror: expected specifier-qualifier-list before 'CCCI_BUFF_T' - - CCCI_ACTIVE_WRITE = 0x02, - CCCI_ACTIVE_ISR = 0x04 -} CCCI_STATE_T; -*/ -/* CCCI control structure */ - -typedef enum { - CCCI_ENABLED=0x0, - CCCI_RUNNING=0x1, - -} CCCI_STATE_T; -typedef struct _CCCI_LOG_T -{ - unsigned long sec; - unsigned long nanosec; - CCCI_BUFF_T buff; - short rx; -} CCCI_LOG_T; - -// CCCI mailbox channel structure -typedef struct _ccci_mail_box{ - unsigned int magic; // 0xFFFFFFFF - unsigned int id; -}ccci_mail_box_t; - -// CCCI stream channel structure -typedef struct _ccci_stream_msg{ - unsigned int addr; - unsigned int len; -}ccci_stream_msg_t; - -// CCCI common channel structure -typedef struct _ccci_common_msg{ - unsigned int data[2]; -}ccci_common_msg_t; - -typedef struct _ccci_msg{ - union{ - unsigned int magic; // For mail box magic number - unsigned int addr; // For stream start addr - unsigned int data0; // For ccci common data[0] - }; - union{ - unsigned int id; // For mail box message id - unsigned int len; // For stream len - unsigned int data1; // For ccci common data[1] - }; - unsigned int channel; - unsigned int reserved; -}ccci_msg_t; - -typedef struct dump_debug_info -{ - unsigned int type; - char *name; - unsigned int more_info; - union { - struct { - - char file_name[30]; - int line_num; - unsigned int parameters[3]; - } assert; - struct { - int err_code1; - int err_code2; - - }fatal_error; - ccci_msg_t data; - struct { - unsigned char execution_unit[9]; // 8+1 - char file_name[30]; - int line_num; - unsigned int parameters[3]; - }dsp_assert; - struct { - unsigned char execution_unit[9]; - unsigned int code1; - }dsp_exception; - struct { - unsigned char execution_unit[9]; - unsigned int err_code[2]; - }dsp_fatal_err; - }; - int *ext_mem; - size_t ext_size; - int *md_image; - size_t md_size; - void *platform_data; - void (*platform_call)(void *data); -}DEBUG_INFO_T ; - -typedef struct _logic_channel_info{ - unsigned int m_ch_id; - unsigned int m_attrs; - struct kfifo m_kfifo; - unsigned int m_kfifo_ready; - char* m_ch_name; - char* m_owner_name; - void* m_owner; - void (*m_call_back)(void*); - spinlock_t m_lock; - unsigned int m_register; - int m_md_id; -}logic_channel_info_t; - -typedef struct _logic_channel_static_info{ - unsigned int m_ch_id; - unsigned int m_kfifo_size; - char* m_ch_name; - unsigned int m_attrs; -}logic_channel_static_info_t; - -typedef struct _logic_dispatch_ctl_block{ - logic_channel_info_t m_logic_ch_table[CCCI_MAX_CH_NUM]; - ccif_t *m_ccif; - struct tasklet_struct m_dispatch_tasklet; - volatile unsigned char m_has_pending_data; - volatile unsigned char m_freezed; - volatile unsigned char m_running; - unsigned int m_md_id; - struct wake_lock m_wakeup_wake_lock; - char m_wakelock_name[16]; - void (*m_send_notify_cb)(int, unsigned int); - unsigned long m_last_send_ref_jiffies; - unsigned long m_status_flag; - spinlock_t m_lock; -}logic_dispatch_ctl_block_t; -//volatile unsigned char m_privilege; - - -//-----------------function define-------------------------// -int register_to_logic_ch(int md_id, int ch, void (*func)(void*), void* owner); -int un_register_to_logic_ch(int md_id, int ch); -int logic_layer_reset(int); -int cal_ring_buffer_free_space(int read_idx, int write_idx, int ring_buf_len); -int cal_ring_buffer_valid_data_size(int read_idx, int write_idx, int ring_buf_len); -int ccci_logic_ctlb_init(int); -void ccci_logic_ctlb_deinit(int); -int get_logic_ch_data(logic_channel_info_t *ch_info, ccci_msg_t *msg); -int get_logic_ch_data_len(logic_channel_info_t *ch_info); -logic_channel_info_t* get_logic_ch_info(int md_id, int ch_id); -void freeze_logic_layer_tx(int); -void freeze_all_logic_layer(int); -//void set_curr_md_state(int md_id, int state); -void * get_dispatch_ctl_block(int md_sys); -int ccci_message_send(int md_id, ccci_msg_t *msg, int retry_en); -void ccci_system_message(int md_id, unsigned int msg, unsigned int resv); -void ccci_disable_md_intr(int md_id); -void ccci_enable_md_intr(int md_id); -void ccci_hal_reset(int md_id); -void ccci_hal_irq_register(int md_id); -void set_md_sys_max_num(unsigned int max_num); -void update_active_md_sys_state(int md_id, int active); -void set_md_enable(int md_id, int en); -int ccci_logic_layer_init(int); -void ccci_logic_layer_exit(int); -int ccci_write_runtime_data(int md_id, unsigned char buf[], int len); - - - -//-----------------external function define---------------------// -//typedef int (*is_md_boot_func)(void); -//typedef int (*reset_md_func)(void); -//typedef int (*ccci_base_req_func)(void*,int*); -//extern is_md_boot_func is_md_boot_funcp; -//extern reset_md_func reset_md_funcp; -//extern ccci_base_req_func ccci_pcm_base_req_funcp; -//extern ccci_base_req_func ccci_log_base_req_funcp; -//extern void ccci_register_mdfunc(is_md_boot_func func1, reset_md_func func2, -// ccci_base_req_func pcm_func,ccci_base_req_func log_func); -extern int __init ccif_module_init(void); -extern void __exit ccif_module_exit(void); - - -#endif // __CCCI_LAYER_H__ - diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_md.h b/drivers/misc/mediatek/dual_ccci/include/ccci_md.h deleted file mode 100644 index d1b8cd9a7ff..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_md.h +++ /dev/null @@ -1,447 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_md.h - * - * Project: - * -------- - * Andes - * - * Description: - * ------------ - * MT65XX Modem initialization and handshake header file - * - ****************************************************************************/ - -#ifndef __CCCI_MD_H__ -#define __CCCI_MD_H__ -#include -#include - -#define CCCI_SYSFS_MD_INIT "modem" -#define CCCI_SYSFS_MD_BOOT_ATTR "boot" -#define MD_BOOT_CMD_CHAR '0' -#define NORMAL_BOOT_ID 0 -#define META_BOOT_ID 1 -//#define MD_RUNTIME_ADDR (CCIF_BASE + 0x0140) -//#define SLEEP_CON 0xF0001204 -//#define CCCI_CURRENT_VERSION 0x00000923 -#define NR_CCCI_RESET_USER 10 -#define NR_CCCI_RESET_USER_NAME 16 - -#define CCCI_UART_PORT_NUM 8 - -#define CCCI_MD_EXCEPTION 0x1 -#define CCCI_MD_RESET 0x2 -#define CCCI_MD_BOOTUP 0x3 -#define CCCI_MD_STOP 0x4 - -#define LOCK_MD_SLP 0x1 -#define UNLOCK_MD_SLP 0x0 - -#define MD_IMG_MAX_CNT 0x4 -/*-----------------------------------------------------------*/ -/* Device ID assignment */ -#define CCCI_TTY_DEV_MAJOR (169) //(0: Modem; 1: Meta; 2:IPC) - - -enum { - MD_BOOT_STAGE_0 = 0, - MD_BOOT_STAGE_1 = 1, - MD_BOOT_STAGE_2 = 2, - MD_BOOT_STAGE_EXCEPTION = 3 -}; - -enum { - MD_INIT_START_BOOT = 0x00000000, - MD_INIT_CHK_ID = 0x5555FFFF, - MD_EX = 0x00000004, - MD_EX_CHK_ID = 0x45584350, - MD_EX_REC_OK = 0x00000006, - MD_EX_REC_OK_CHK_ID = 0x45524543, - MD_EX_RESUME_CHK_ID = 0x7, - CCCI_DRV_VER_ERROR = 0x5, - - // System channel, AP->MD || AP<-->MD message start from 0x100 -/* MD_DORMANT_NOTIFY = 0x100, - MD_SLP_REQUEST = 0x101, - MD_TX_POWER = 0x102, - MD_RF_TEMPERATURE = 0x103, - MD_RF_TEMPERATURE_3G = 0x104, - MD_GET_BATTERY_INFO = 0x105, -*/ - // System channel, MD --> AP message start from 0x1000 - MD_WDT_MONITOR = 0x1000, - MD_WAKEN_UP = 0x10000, -}; - -enum { - ER_MB_START_CMD = -1, - ER_MB_CHK_ID = -2, - ER_MB_BOOT_READY = -3, - ER_MB_UNKNOW_STAGE = -4 -}; - -enum { - MD_EX_TYPE_INVALID = 0, - MD_EX_TYPE_UNDEF = 1, - MD_EX_TYPE_SWI = 2, - MD_EX_TYPE_PREF_ABT = 3, - MD_EX_TYPE_DATA_ABT = 4, - MD_EX_TYPE_ASSERT = 5, - MD_EX_TYPE_FATALERR_TASK = 6, - MD_EX_TYPE_FATALERR_BUF = 7, - MD_EX_TYPE_LOCKUP = 8, - MD_EX_TYPE_ASSERT_DUMP = 9, - MD_EX_TYPE_ASSERT_FAIL = 10, - DSP_EX_TYPE_ASSERT = 11, - DSP_EX_TYPE_EXCEPTION = 12, - DSP_EX_FATAL_ERROR = 13, - NUM_EXCEPTION -}; -#define MD_EX_TYPE_EMI_CHECK 99 - -enum { - MD_EE_FLOW_START = 0, - MD_EE_DUMP_ON_GOING, - MD_STATE_UPDATE, - MD_EE_MSG_GET, - MD_EE_TIME_OUT_SET, - MD_EE_OK_MSG_GET, - MD_EE_FOUND_BY_ISR, - MD_EE_FOUND_BY_TX, - MD_EE_PENDING_TOO_LONG, - - MD_EE_INFO_OFFSET = 20, - MD_EE_EXCP_OCCUR = 20, - MD_EE_AP_MASK_I_BIT_TOO_LONG = 21, -}; - -enum { - MD_EE_CASE_NORMAL = 0, - MD_EE_CASE_ONLY_EX, - MD_EE_CASE_ONLY_EX_OK, - MD_EE_CASE_TX_TRG, - MD_EE_CASE_ISR_TRG, - MD_EE_CASE_NO_RESPONSE, - MD_EE_CASE_AP_MASK_I_BIT_TOO_LONG, -}; - - - -#ifdef AP_MD_EINT_SHARE_DATA -enum { - CCCI_EXCH_CORE_AWAKEN = 0, - CCCI_EXCH_CORE_SLEEP = 1, - CCCI_EXCH_CORE_SLUMBER = 2 -}; -#endif - -/* CCCI system message */ -enum { - CCCI_SYS_MSG_RESET_MD = 0x20100406 -}; - -/* MD Message, this is for user space deamon use */ -enum { - CCCI_MD_MSG_BOOT_READY = 0xFAF50001, - CCCI_MD_MSG_BOOT_UP = 0xFAF50002, - CCCI_MD_MSG_EXCEPTION = 0xFAF50003, - CCCI_MD_MSG_RESET = 0xFAF50004, - CCCI_MD_MSG_RESET_RETRY = 0xFAF50005, - CCCI_MD_MSG_READY_TO_RESET = 0xFAF50006, - CCCI_MD_MSG_BOOT_TIMEOUT = 0xFAF50007, - CCCI_MD_MSG_STOP_MD_REQUEST = 0xFAF50008, - CCCI_MD_MSG_START_MD_REQUEST = 0xFAF50009, - CCCI_MD_MSG_ENTER_FLIGHT_MODE = 0xFAF5000A, - CCCI_MD_MSG_LEAVE_FLIGHT_MODE = 0xFAF5000B, - CCCI_MD_MSG_POWER_ON_REQUEST = 0xFAF5000C, - CCCI_MD_MSG_POWER_DOWN_REQUEST = 0xFAF5000D, - CCCI_MD_MSG_SEND_BATTERY_INFO = 0xFAF5000E, - CCCI_MD_MSG_NOTIFY = 0xFAF5000F, - CCCI_MD_MSG_STORE_NVRAM_MD_TYPE = 0xFAF50010, - CCCI_MD_MSG_CFG_UPDATE = 0xFAF50011, -}; - -/* MD Status, this is for user space deamon use */ -enum { - CCCI_MD_STA_BOOT_READY = 0, - CCCI_MD_STA_BOOT_UP = 1, - CCCI_MD_STA_RESET = 2, -}; - -#if 0 -/* MODEM MAUI SW ASSERT LOG */ -struct modem_assert_log -{ - char ex_type; - char ex_nvram; - short ex_serial; - char data1[212]; - char filename[24]; - int linenumber; - char data2[268]; -}; - -/* MODEM MAUI SW FATAL ERROR LOG */ -struct modem_fatalerr_log -{ - char ex_type; - char ex_nvram; - short ex_serial; - char data1[212]; - int err_code1; - int err_code2; - char data2[288]; -}; -#endif - -struct cores_sleep_info -{ - unsigned char AP_Sleep; - unsigned char padding1[3]; - unsigned int RTC_AP_WakeUp; - unsigned int AP_SettleTime; /* clock settle duration */ - unsigned char MD_Sleep; - unsigned char padding2[3]; - unsigned int RTC_MD_WakeUp; - unsigned int RTC_MD_Settle_OK; /* clock settle done time */ -}; - -/* MODEM MAUI Exception header (4 bytes)*/ -typedef struct _exception_record_header_t -{ - unsigned char ex_type; - unsigned char ex_nvram; - unsigned short ex_serial_num; -}EX_HEADER_T; - -/* MODEM MAUI Environment information (164 bytes) */ -typedef struct _ex_environment_info_t -{ - unsigned char boot_mode; - unsigned char reserved1[8]; - unsigned char execution_unit[8]; - unsigned char reserved2[147]; -}EX_ENVINFO_T; - -/* MODEM MAUI Special for fatal error (8 bytes)*/ -typedef struct _ex_fatalerror_code_t -{ - unsigned int code1; - unsigned int code2; -}EX_FATALERR_CODE_T; - -/* MODEM MAUI fatal error (296 bytes)*/ -typedef struct _ex_fatalerror_t -{ - EX_FATALERR_CODE_T error_code; - unsigned char reserved1[288]; -}EX_FATALERR_T; - -/* MODEM MAUI Assert fail (296 bytes)*/ -typedef struct _ex_assert_fail_t -{ - unsigned char filename[24]; - unsigned int linenumber; - unsigned int parameters[3]; - unsigned char reserved1[256]; -}EX_ASSERTFAIL_T; - -/* MODEM MAUI Globally exported data structure (300 bytes) */ -typedef union -{ - EX_FATALERR_T fatalerr; - EX_ASSERTFAIL_T assert; -}EX_CONTENT_T; - -/* MODEM MAUI Standard structure of an exception log ( */ -typedef struct _ex_exception_log_t -{ - EX_HEADER_T header; - unsigned char reserved1[12]; - EX_ENVINFO_T envinfo; - unsigned char reserved2[36]; - EX_CONTENT_T content; -}EX_LOG_T; - -struct core_eint_config -{ - unsigned char eint_no; - unsigned char Sensitivity; - unsigned char ACT_Polarity; - unsigned char Dbounce_En; - unsigned int Dbounce_ms; -}; - -struct ccci_cores_exch_data -{ - struct cores_sleep_info sleep_info; - unsigned int report_os_tick; /* report OS Tick Periodic in second unit */ - /* ( 0 = disable ) */ - unsigned int nr_eint_config; - unsigned int eint_config_offset; /* offset from SysShareMemBase for struct coreeint_config */ -}; - -#define CCCI_SYS_SMEM_SIZE sizeof(struct ccci_cores_exch_data) - -struct ccci_reset_sta -{ - int is_allocate; - int is_reset; - char name[NR_CCCI_RESET_USER_NAME]; -}; - -typedef struct _modem_runtime -{ - int Prefix; // "CCIF" - - int Platform_L; // Hardware Platform String ex: "MT6589E1" - int Platform_H; - int DriverVersion; // 0x20121001 since W12.39 - int BootChannel; // Channel to ACK AP with boot ready - int BootingStartID; // MD is booting. NORMAL_BOOT_ID or META_BOOT_ID - int BootAttributes; // Attributes passing from AP to MD Booting - int BootReadyID; // MD response ID if boot successful and ready - int MdlogShareMemBase; - int MdlogShareMemSize; - int PcmShareMemBase; - int PcmShareMemSize; - int UartPortNum; - int UartShareMemBase[CCCI_UART_PORT_NUM]; // <<< Current UART_MAX_PORT_NUM is 8 - int UartShareMemSize[CCCI_UART_PORT_NUM]; - int FileShareMemBase; - int FileShareMemSize; - int RpcShareMemBase; - int RpcShareMemSize; - int PmicShareMemBase; - int PmicShareMemSize; - int ExceShareMemBase; - int ExceShareMemSize; // 512 Bytes Required - int SysShareMemBase; - int SysShareMemSize; - int IPCShareMemBase; - int IPCShareMemSize; - int MDULNetShareMemBase; - int MDULNetShareMemSize; - int MDDLNetShareMemBase; - int MDDLNetShareMemSize; - int NetPortNum; - int NetULCtrlShareMemBase[NET_PORT_NUM]; // <<< Current NET_PORT_NUM is 4 - int NetULCtrlShareMemSize[NET_PORT_NUM]; - int NetDLCtrlShareMemBase[NET_PORT_NUM]; - int NetDLCtrlShareMemSize[NET_PORT_NUM]; - int MDExExpInfoBase; //md exception expand info memory - int MDExExpInfoSize; - int IPCMDIlmShareMemBase; - int IPCMDIlmShareMemSize; - int MiscInfoBase; - int MiscInfoSize; - - int CheckSum; - int Postfix; //"CCIF" -}modem_runtime_t; - - -#define CCCI_MD_RUNTIME_DATA_SMEM_SIZE (sizeof(modem_runtime_t)) - -typedef struct _modem_runtime_info_tag -{ - int prefix; //"CCIF" - int platform_L; //Hardware platform string. ex: 'TK6516E0' - int platform_H; - int driver_version; //0x00000923 since W09.23 - int runtime_data_base; - int runtime_data_size; - int postfix; //"CCIF" -}modem_runtime_info_tag_t; - -typedef struct _modem_exception_exp -{ - int exception_occur; - int send_time; - int wait_time; -}modem_exception_exp_t; - - -typedef struct _MD_CALL_BACK_QUEUE { - void (*call)(struct _MD_CALL_BACK_QUEUE*,unsigned long data); - struct _MD_CALL_BACK_QUEUE *next; -}MD_CALL_BACK_QUEUE; - -typedef struct { - spinlock_t lock; - MD_CALL_BACK_QUEUE *next; - int is_busy; - struct tasklet_struct tasklet; -}MD_CALL_BACK_HEAD_T; - - -#if 0 -struct IMG_CHECK_INFO{ - char *product_ver; /* debug/release/invalid */ - char *image_type; /*2G/3G/invalid*/ - char *platform; /* MT6573_S00(MT6573E1) or MT6573_S01(MT6573E2) */ - char *build_time; /* build time string */ - char *build_ver; /* project version, ex:11A_MD.W11.28 */ -}; - - -#define NAME_LEN 100 -struct image_info -{ - int idx; /*idx=0,modem image; idx=1, dsp image */ - char file_name[NAME_LEN]; - unsigned long address; - ssize_t size; - loff_t offset; - struct IMG_CHECK_INFO img_info; - struct IMG_CHECK_INFO ap_info; - int (*load_firmware)(struct image_info *info); -}; -#endif - -typedef int (*ccci_cores_sleep_info_base_req)(void *); -typedef int (*ccci_core_eint_config_setup)(int, void *); - - -int __init ccci_md_init_mod_init(void); -void __exit ccci_md_init_mod_exit(void); - - -int ccci_mdlog_base_req(int md_id, void *addr_vir, void *addr_phy, unsigned int *len); -int ccci_pcm_base_req(int md_id, void *addr_vir, void *addr_phy, unsigned int *len); -int ccci_uart_base_req(int md_id, int port, void *addr_vir, void *addr_phy, unsigned int *len); -int ccci_fs_base_req(int md_id, void *addr_vir, void *addr_phy, unsigned int *len); -int ccci_rpc_base_req(int md_id, int *addr_vir, int *addr_phy, int *len); -int ccci_pmic_base_req(int md_id, void *addr_vir, void *addr_phy, int *len); -int ccci_ipc_base_req(int md_id, void *addr_vir, void *addr_phy, int *len); -int ccmni_v2_ul_base_req(int md_id, void *addr_vir, void *addr_phy); -int ccmni_v2_dl_base_req(int md_id, void *addr_vir, void *addr_phy); -int ccci_ccmni_v2_ctl_mem_base_req(int md_id, int port, int *addr_virt, int *addr_phy, int *len); - - -int md_register_call_chain(int md_id, MD_CALL_BACK_QUEUE *queue); -int md_unregister_call_chain(int md_id, MD_CALL_BACK_QUEUE *queue); -void md_call_chain(MD_CALL_BACK_HEAD_T *head,unsigned long data); - -int ccci_reset_register(int md_id, char *name); -int ccci_user_ready_to_reset(int md_id, int handle); - - -int get_curr_md_state(int md_id); -void check_data_connected(int md_id, int channel); - - -//extern int ccci_sys_smem_base_phy; -extern int ccci_smem_size ; -extern int *ccci_smem_virt ; -extern dma_addr_t ccci_smem_phy; -extern int is_first_boot; -extern MD_CALL_BACK_HEAD_T md_notifier; - - - -#endif // __CCCI_MD_H__ - diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_pmic.h b/drivers/misc/mediatek/dual_ccci/include/ccci_pmic.h deleted file mode 100644 index c9bf53050a4..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_pmic.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef __CCCI_PMIC_H__ -#define __CCCI_PMIC_H__ - -typedef enum -{ - PMIC6326_VSIM_ENABLE = 0, - PMIC6326_VSIM_SET_AND_ENABLE = 1, - PMIC6236_LOCK = 2, - PMIC6326_UNLOCK = 3, - PMIC6326_VSIM2_ENABLE = 4, - PMIC6326_VSIM2_SET_AND_ENABLE = 5, - PMIC6326_MAX -}pmic6326_ccci_op; - -typedef enum -{ - PMIC6326_REQ = 0, // Local side send request to remote side - PMIC6326_RES = 1 // Remote side send response to local side -}pmic6326_ccci_type; - -/* - The CCCI message format (CCIF Mailbox port) - | 4 bytes | 4 bytes | 4 bytes | 4 bytes | - Magic number Message ID Logical channel Reserved - PMIC msg PMIC msg info -*/ - -/* - PMIC msg format - (MSB) (LSB) - | 1 byte | 1 byte | 1 byte | 1 byte | - Param2 Param1 Type Op -*/ - -/* - PMIC msg info format - (MSB) (LSB) - | 1 byte | 1 byte | 2 bytes | - Param2 Param1 Exec_time -*/ - - - -typedef struct -{ - unsigned short pmic6326_op; // Operation - unsigned short pmic6326_type; // message type: Request or Response - unsigned short pmic6326_param1; - unsigned short pmic6326_param2; -}pmic6326_ccci_msg; - -typedef struct -{ - unsigned int pmic6326_exec_time; // Operation execution time (In ms) - unsigned short pmic6326_param1; - unsigned short pmic6326_param2; -}pmic6326_ccci_msg_info; - -/* - PMIC share memory - (MSB) (LSB) - | 1 byte | 1 byte | 1 byte | 1 byte | - Param2 Param1 Type Op - | 1 byte | 1 byte | 2 bytes | - Param2 Param1 Exec_time -*/ - -typedef struct -{ - pmic6326_ccci_msg ccci_msg; - pmic6326_ccci_msg_info ccci_msg_info; -}pmic6326_share_mem_info; - -typedef struct -{ - pmic6326_ccci_msg ccci_msg; - pmic6326_ccci_msg_info ccci_msg_info; -} shared_mem_pmic_t; - -int __init ccci_pmic_init(void); -void __exit ccci_pmic_exit(void); - -#define CCCI_PMIC_SMEM_SIZE sizeof(shared_mem_pmic_t) -#endif // __CCCI_PMIC_H__ diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_rpc.h b/drivers/misc/mediatek/dual_ccci/include/ccci_rpc.h deleted file mode 100644 index 55f7cecf48e..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_rpc.h +++ /dev/null @@ -1,79 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccci_rpc.h - * - * Project: - * -------- - * YuSu - * - * Description: - * ------------ - * - * - * Author: - * ------- - * - * - ****************************************************************************/ - -#ifndef __CCCI_RPC_H__ -#define __CCCI_RPC_H__ - -#define CCCI_SED_LEN_BYTES 16 -typedef struct {unsigned char sed[CCCI_SED_LEN_BYTES]; }sed_t; -#define SED_INITIALIZER { {[0 ... CCCI_SED_LEN_BYTES-1]=0}} -/******************************************************************************* - * Define marco or constant. - *******************************************************************************/ -#define IPC_RPC_EXCEPT_MAX_RETRY 7 -#define IPC_RPC_MAX_RETRY 0xFFFF -#define IPC_RPC_MAX_ARG_NUM 6 /* parameter number */ - -#define IPC_RPC_USE_DEFAULT_INDEX -1 -#define IPC_RPC_API_RESP_ID 0xFFFF0000 -#define IPC_RPC_INC_BUF_INDEX(x) (x = (x + 1) % IPC_RPC_REQ_BUFFER_NUM) - -/******************************************************************************* - * Define data structure. - *******************************************************************************/ -typedef enum -{ - IPC_RPC_CPSVC_SECURE_ALGO_OP = 0x2001, - IPC_RPC_GET_SECRO_OP = 0x2002, - IPC_RPC_GET_TDD_EINT_NUM_OP = 0x4001, - IPC_RPC_GET_TDD_GPIO_NUM_OP = 0x4002, - IPC_RPC_GET_TDD_ADC_NUM_OP = 0x4003, - IPC_RPC_GET_EMI_CLK_TYPE_OP = 0x4004, - IPC_RPC_GET_EINT_ATTR_OP = 0x4005, - IPC_RPC_GET_GPIO_VAL_OP = 0x4006, - IPC_RPC_GET_ADC_VAL_OP = 0x4007, -}RPC_OP_ID; - -typedef struct -{ - unsigned int len; - void *buf; -}RPC_PKT; - -typedef struct -{ - unsigned int op_id; - unsigned char buf[0]; -}RPC_BUF; - -#define FS_NO_ERROR 0 -#define FS_NO_OP -1 -#define FS_PARAM_ERROR -2 -#define FS_NO_FEATURE -3 -#define FS_NO_MATCH -4 -#define FS_FUNC_FAIL -5 -#define FS_ERROR_RESERVED -6 -#define FS_MEM_OVERFLOW -7 - -extern int ccci_rpc_init(int); -extern void ccci_rpc_exit(int); - - -#endif // __CCCI_RPC_H__ diff --git a/drivers/misc/mediatek/dual_ccci/include/ccci_tty.h b/drivers/misc/mediatek/dual_ccci/include/ccci_tty.h deleted file mode 100644 index dd5eff2242f..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccci_tty.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __CCCI_TTY_H__ -#define __CCCI_TTY_H__ - -#define CCCI_TTY_MODEM 0 -#define CCCI_TTY_META 1 -#define CCCI_TTY_IPC 2 -#define CCCI_TTY_ICUSB 3 - -typedef struct -{ - unsigned read; - unsigned write; - unsigned length; -} buffer_control_tty_t; - - -typedef struct -{ - buffer_control_tty_t rx_control; - buffer_control_tty_t tx_control; - unsigned char buffer[0]; // [RX | TX] - //unsigned char *tx_buffer; -} shared_mem_tty_t; - -extern void ccci_reset_buffers(shared_mem_tty_t *shared_mem, int size); -extern int __init ccci_tty_init(int); -extern void __exit ccci_tty_exit(int); - - -#endif // __CCCI_TTY_H__ diff --git a/drivers/misc/mediatek/dual_ccci/include/ccif.h b/drivers/misc/mediatek/dual_ccci/include/ccif.h deleted file mode 100644 index b5d6917a25a..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccif.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef __CCIF_H__ -#define __CCIF_H__ - -// CCIF common macro definition -#define CCIF_INTR_MAX_RE_ENTER_CNT (5) - - -typedef struct _ccif_statistics -{ - unsigned long long irq_cnt; - unsigned int re_enter_cnt; - unsigned int max_re_enter_cnt; -}ccif_statistics_t; - -typedef enum { - CCIF_TOP_HALF_RUNNING=0x0, - CCIF_BOTTOM_HALF_RUNNING, - CCIF_CALL_BACK_FUNC_LOCKED, - CCIF_ISR_INFO_CALL_BACK_LOCKED, -} ccif_state_bit_t; - -typedef struct -{ - unsigned int data[2]; - unsigned int channel; - unsigned int reserved; -} ccif_msg_t; - -typedef int (*ccif_push_func_t)(ccif_msg_t*); -typedef int (*ccif_notify_funct_t)(void); - -typedef struct _ccif -{ - unsigned long m_reg_base; - unsigned long m_md_reg_base; - unsigned long m_status; - unsigned int m_rx_idx; - unsigned int m_tx_idx; - unsigned int m_irq_id; - unsigned int m_irq_attr; - unsigned int m_ccif_type; - ccif_statistics_t m_statistics; - spinlock_t m_lock; - void* m_logic_ctl_block; - unsigned int m_irq_dis_cnt; - unsigned int m_md_id; - - int (*push_msg)(ccif_msg_t*, void*); - void (*notify_push_done)(void*); - void (*isr_notify)(int); - int (*register_call_back_func)(struct _ccif *, int (*push_func)(ccif_msg_t*, void*), void (*notify_func)(void*)); - int (*register_isr_notify_func)(struct _ccif *, void (*additional)(int)); - int (*ccif_init)(struct _ccif *); - int (*ccif_de_init)(struct _ccif *); - int (*ccif_register_intr)(struct _ccif *); - int (*ccif_en_intr)(struct _ccif *); - void (*ccif_dis_intr)(struct _ccif *); - int (*ccif_dump_reg)(struct _ccif *, unsigned int buf[], int len); - int (*ccif_read_phy_ch_data)(struct _ccif *, int ch, unsigned int buf[]); - int (*ccif_write_phy_ch_data)(struct _ccif *, unsigned int buf[], int retry_en); - int (*ccif_get_rx_ch)(struct _ccif *); - int (*ccif_get_busy_state)(struct _ccif *); - void (*ccif_set_busy_state)(struct _ccif *, unsigned int val); - int (*ccif_ack_phy_ch)(struct _ccif *, int ch); - int (*ccif_clear_sram)(struct _ccif *); - int (*ccif_write_runtime_data)(struct _ccif *, unsigned int buf[], int len); - int (*ccif_intr_handler)(struct _ccif *); - int (*ccif_reset)(struct _ccif *); -}ccif_t; - -//ccif_t* ccif_create_instance(ccif_hw_info_t *info, void* ctl_b, int md_id); - -#endif //__CCIF_H__ \ No newline at end of file diff --git a/drivers/misc/mediatek/dual_ccci/include/ccmni_net.h b/drivers/misc/mediatek/dual_ccci/include/ccmni_net.h deleted file mode 100644 index dc4ef3f9e22..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccmni_net.h +++ /dev/null @@ -1,205 +0,0 @@ -/************************************ -* -* CCMNI Memory Layout -* -*|------------------------------| -*| | -*| | -*| CCMNI UP-Link Memory | -*| (Maintained by MD) | -*| | -*|------------------------------| -*| CCMNI1 RX Memory | -*|------------------------------| -*| CCMNI2 RX Memory | -*|------------------------------| -*| ... | -*|------------------------------| -*| CCMNIn RX Memory | -*|------------------------------| -*| CCMNI1 - Ctrl Memory | -*|------------------------------| -*| CCMNI2 - Ctrl Memory | -*|------------------------------| -*| ... | -*|------------------------------| -*| CCMNIn - Ctrl Memory | -*|------------------------------| -************************************ -* -* CCMNI ctrl memory layout -* -*|------------------------------| -*| CCMNI1 - TX Read out | -*|------------------------------| -*| CCMNI1 - TX Avai out | -*|------------------------------| -*| CCMNI1 - TX Avai in | -*|------------------------------| -*| CCMNI1 - TX Queue len | -*|------------------------------| -*| | -*| | -*| CCMNI1 TX Queue | -*| | -*| | -*|------------------------------| -*| CCMNI1 - RX Read out | -*|------------------------------| -*| CCMNI1 - RX Avai out | -*|------------------------------| -*| CCMNI1 - RX Avai in | -*|------------------------------| -*| CCMNI1 - RX Queue len | -*|------------------------------| -*| | -*| | -*| CCMNI1 RX Queue | -*| | -*| | -*|------------------------------| -************************************* -* -* CCMNI RX memory layout -* -*|------------------------------| -*| Buffer[0] 1500B + 28B | -*|------------------------------| -*| Buffer[1] 1500B + 28B | -*|------------------------------| -*| ... | -*|------------------------------| -*| Buffer[n] 1500B + 28B | -*|------------------------------| -*********************************** -* -*CCMNI ctrl Q memory layout (ring buffer) -*For example, ptr_n points to the start address of RX memory's Data field of Buffer[n], -*len_n stands for the length of RX memory's Data field of Buffer[n] (not including End Byte). -* -*|-----------------------------| -*| ptr_n / len_n | -*|-----------------------------| -*| ... | -*|-----------------------------| -*| ptr_1 / len_1 | -*|-----------------------------| -*| ptr_1 / len_1 | -*|-----------------------------| -***********************************/ - -/****************Data buffer mem layout*************** -*|-------------------------------------------------------------------------------| -*| DBG(16B) | Header(4B) | Data Field (1500B Max.) + End Byte (1B) + Blank (nB) | Footer (4B) | -*|-------------------------------------------------------------------------------| -* -*|----------------------------------------------------------| -*| DBG | -*|----------------------------------------------------------| -*| port (1B) | avail in no. (1B) | avail out no. (1B) | read out no. (1B) | -*|----------------------------------------------------------| -************************************************/ - -#ifndef __CCCI_CCMNI_H__ -#define __CCCI_CCMNI_H__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define CCCI_NETWORK 0 -#define CCMNI_MTU 1500 - -#define CCMNI_CHANNEL_OFFSET 2 -//#define CCMNI_MAX_CHANNELS NET_PORT_NUM -//#define CCMNI_CHANNEL_CNT CCMNI_V2_PORT_NUM //Currently, we use 3 channels. - - -#define IPV4_VERSION 0x40 -#define IPV6_VERSION 0x60 - -//Flags bit used for timer -#define CCMNI_RECV_ACK_PENDING (0) -#define CCMNI_SEND_PENDING (1) -#define CCMNI_RECV_PENDING (2) - -#define CCMNI_TX_QUEUE 8 -//To store 256 ptr_n & len_n. Normally we use 100. -//If current channel busy, we may use the rest by negotiating with other channels, -//other channels may release their unused resources. -#define CCMNI_CTRL_Q_RX_SIZE (256) -#define CCMNI_CTRL_Q_TX_SIZE (64) - -#define CCMNI_RX_ACK_BOUND (CCMNI_CTRL_Q_RX_SIZE_DEFAULT/4) - -#define CCMNI_CTRL_Q_RX_SIZE_DEFAULT 100 - -#define CCMNI_SINGLE_BUFF_SIZE (CCMNI_MTU + 28) -#define CCMNI_BUFF_DATA_FIELD_SIZE (CCMNI_SINGLE_BUFF_SIZE -24) //1500+1+3 - -#define CCCI_CCMNI_SMEM_UL_SIZE (300 * 1024) -#define CCCI_CCMNI_SMEM_DL_SIZE (300 * CCMNI_SINGLE_BUFF_SIZE) - -//Used for negotiating -#define RX_BUF_RESOURCE_LOWER_BOUND (20) -#define RX_BUF_RESOURCE_UPPER_BOUND (80) //Should be more than 2*RX_BUF_RESOURCE_OCCUPY_CNT -#define RX_BUF_RESOURCE_OCCUPY_CNT (20) //((RX_BUF_RESOURCE_UPPER_BOUND - RX_BUF_RESOURCE_LOWER_BOUND)/2 ) - - -typedef struct -{ - unsigned port; - unsigned avai_in_no; - unsigned avai_out_no; - unsigned read_out_no; -} dbg_info_ccmni_t; - -#define CCMNI_BUFF_DBG_INFO_SIZE (sizeof(dbg_info_ccmni_t)) -#define CCMNI_BUFF_HEADER_SIZE (4) -#define CCMNI_BUFF_FOOTER_SIZE (4) - -#define CCMNI_BUFF_HEADER (0xE1E1E1E1) -#define CCMNI_BUFF_FOOTER (0xE2E2E2E2) -#define CCMNI_DATA_END (0xE3) - -typedef struct -{ - unsigned char *ptr; - unsigned len; -} q_ringbuf_ccmni_t; - -typedef struct -{ - unsigned avai_in; - unsigned avai_out; - unsigned read_out; - unsigned q_length; //default 256 for Rx -} buffer_control_ccmni_t; - -typedef struct -{ - buffer_control_ccmni_t rx_control; //Down Llink - q_ringbuf_ccmni_t q_rx_ringbuff[CCMNI_CTRL_Q_RX_SIZE]; //Down Link, default 256 - buffer_control_ccmni_t tx_control; //Up Link - q_ringbuf_ccmni_t q_tx_ringbuff[CCMNI_CTRL_Q_TX_SIZE]; //Up Link, default 64 -} shared_mem_ccmni_t; - -#define CCCI_CCMNI_SMEM_SIZE (sizeof(shared_mem_ccmni_t)) -#define CCMNI_DL_CTRL_MEM_SIZE ((sizeof(buffer_control_ccmni_t)) + (CCMNI_CTRL_Q_RX_SIZE * (sizeof(q_ringbuf_ccmni_t)))) -#define CCMNI_UL_CTRL_MEM_SIZE ((sizeof(buffer_control_ccmni_t)) + (CCMNI_CTRL_Q_TX_SIZE * (sizeof(q_ringbuf_ccmni_t)))) - -#endif // __CCCI_CCMNI_H__ \ No newline at end of file diff --git a/drivers/misc/mediatek/dual_ccci/include/ccmni_pfp.h b/drivers/misc/mediatek/dual_ccci/include/ccmni_pfp.h deleted file mode 100644 index 3ec9c0e6a2d..00000000000 --- a/drivers/misc/mediatek/dual_ccci/include/ccmni_pfp.h +++ /dev/null @@ -1,120 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * ccmni_pfp.h - * - * Project: - * -------- - * YuSu - * - * Description: - * ------------ - * MT6516 Cross Chip Modem Network Interface - Packet Framing Protocol - * - * Author: - * ------- - * Stanley Chou (mtk01411) - * - ****************************************************************************/ -#ifndef __CCCI_CCMNI_PFP_H__ -#define __CCCI_CCMNI_PFP_H__ -/* Compile Option to decide if DYNAMIC_MULTIPLE_FRAME encode/decode is supported or not */ - -#define MAX_PDP_CONT_NUM 3 -#define PFP_FRAME_START_FLAG 0xF9 -#define PFP_FRAME_MAGIC_NUM 0x66 -/* MAX_PFP_LEN_FIELD_VALUE is the maximum size of one IP Packet */ -#define MAX_PFP_LEN_FIELD_VALUE 1500 -#define FREE_RAW_DATA_BUF_SIZE 2048 -#define FREE_COOKED_DATA_BUF_SIZE 2048 -#define SUPPORT_FRAME_NUM 1 -#define SUPPORT_PKT_NUM 1024 - -enum frame_flag_t -{ - FRAME_START = 0, - FRAME_CONTINUOUS, - FRAME_END -}; - -enum unframe_state_t -{ - PARSE_PFP_FRAME_START_FLAG_STATE = 0, - PARSE_PFP_FRAME_MAGIC_NUM_STATE, - PARSE_PFP_FRAME_LENGTH_FIELD_STATE, - PARSE_PFP_FRAME_GET_DATA_STATE -}; - -/* Following implementations are designed for PFP(Packet Frame Protocol) */ -typedef struct -{ - int frame_size; - unsigned char *frame_data; -} frame_format_t; - -typedef struct -{ - int num_frames; - int pending_data_flag; - int consumed_length; -#ifdef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__ - frame_format_t *frame_list; -#else - frame_format_t frame_list[SUPPORT_FRAME_NUM]; -#endif -} frame_info_t; - -typedef struct _complete_ippkt_t -{ - int pkt_size; - unsigned char *pkt_data; -#ifndef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__ - int entry_used; -#endif - struct _complete_ippkt_t *next; -} complete_ippkt_t; - -typedef struct _packet_info_t -{ - int num_complete_packets; - int consumed_length; - int try_decode_again; - enum unframe_state_t parse_data_state; - complete_ippkt_t *pkt_list; -} packet_info_t; - -typedef struct _ccmni_record_t -{ - /* Next expected state to be parsed while entering the pfp_unframe() again */ - enum unframe_state_t unframe_state; - /* Record the latest parsed Packet length for getting the data */ - int pkt_size; - /* For fast to find the last node of pkt_list to insert a new parsed IP Pkt into this pkt_list */ - complete_ippkt_t *last_pkt_node; -} ccmni_record_t; - -extern ccmni_record_t ccmni_dev[]; - -/* The following buffers are used for testing purpose */ -/* Store one IP Packet data */ -extern unsigned char frame_cooked_data []; -/* Pack the IP Packet into a Frame sent to Modem */ -extern unsigned char frame_raw_data []; -extern unsigned char unframe_raw_data []; -extern unsigned char unframe_cooked_data[]; - - -void pfp_reset (int ccmni_inx); -frame_info_t pfp_frame (unsigned char* raw_data, unsigned char* cooked_data, - int cooked_size, int frame_flag, int ccmni_inx); -packet_info_t pfp_unframe(unsigned char* cooked_data, int cooked_data_buf_size, - unsigned char* raw_data, int raw_size, int ccmni_inx); -void traverse_pkt_list(complete_ippkt_t *node); - -#ifndef __SUPPORT_DYNAMIC_MULTIPLE_FRAME__ -complete_ippkt_t* get_one_available_complete_ippkt_entry(void); -void release_one_used_complete_ippkt_entry(complete_ippkt_t* entry); -#endif - -#endif // __CCCI_CCMNI_PFP_H__ \ No newline at end of file diff --git a/drivers/misc/mediatek/dum-char/Kconfig b/drivers/misc/mediatek/dum-char/Kconfig deleted file mode 100644 index cc538348289..00000000000 --- a/drivers/misc/mediatek/dum-char/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config MTK_DUM_CHAR - bool CONFIG_MTK_DUM_CHAR - default n - help - CONFIG_MTK_DUM_CHAR diff --git a/drivers/misc/mediatek/dum-char/Makefile b/drivers/misc/mediatek/dum-char/Makefile deleted file mode 100755 index 45264cbc007..00000000000 --- a/drivers/misc/mediatek/dum-char/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -obj-$(CONFIG_ARCH_MT6582) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ -obj-$(CONFIG_ARCH_MT6592) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ -obj-$(CONFIG_ARCH_MT6572) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ -obj-$(CONFIG_ARCH_MT8127) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ diff --git a/drivers/misc/mediatek/dum-char/mt8127/dumchar.c b/drivers/misc/mediatek/dum-char/mt8127/dumchar.c deleted file mode 100644 index 770add8dfc4..00000000000 --- a/drivers/misc/mediatek/dum-char/mt8127/dumchar.c +++ /dev/null @@ -1,1217 +0,0 @@ -#include -#include -#include -#include /* printk() */ -#include /* kmalloc() */ -#include /* everything... filp_open*/ -#include /* error codes */ -#include /* size_t */ -#include /*proc*/ -#include -#include /* O_ACCMODE */ -#include -#include /*set_fs get_fs mm_segment_t*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include //show_stack(current,NULL) - -#include -#include -#include - -#include "partition_define.h" -#include "dumchar.h" /* local definitions */ - - -struct device; - -static struct class *dumchar_class; -static struct device *dumchar_device[PART_MAX_COUNT]; -static struct dumchar_dev *dumchar_devices; /* store all dum char info, allocated in dumchar_init */ - -//struct excel_info *PartInfo; -struct excel_info PartInfo[PART_MAX_COUNT]; -EXPORT_SYMBOL(PartInfo); - -#ifdef CONFIG_MTK_EMMC_SUPPORT - -extern int simple_sd_ioctl_rw(struct msdc_ioctl* msdc_ctl); -extern int init_pmt(void); -#ifdef CONFIG_MTK_EMMC_CACHE -extern void msdc_get_cache_region(); -#endif - -#endif - -static unsigned int major; - -#ifdef CONFIG_MTK_MTD_NAND -extern struct mtd_info *__mtd_next_device(int i); -#endif - - -int IsEmmc(void) { -#ifdef CONFIG_MTK_EMMC_SUPPORT - return 1; -#else - return 0; -#endif -} -EXPORT_SYMBOL(IsEmmc); - - -#ifdef CONFIG_MTK_EMMC_SUPPORT -int eMMC_rw_x(loff_t addr,u32 *buffer, int host_num, int iswrite,u32 totalsize, int transtype, Region part) -{ - struct msdc_ioctl cmd; - int result = 0; - - if (addr < 0) { - printk("DumChar ERROR:Wrong Address %llx for emmc!\n", addr); - return -EINVAL; - } - - memset(&cmd, 0,sizeof (struct msdc_ioctl)); - - if (addr % 512 == 0) { - cmd.address = addr/512; - } else { - printk("DumChar ERROR: Wrong Address\n"); - return -EINVAL; - } - - //cmd->address =0x100000; - cmd.buffer = buffer; - cmd.clock_freq = 0; - cmd.host_num = host_num; - cmd.iswrite = iswrite; - cmd.result = -1; - cmd.trans_type = transtype; - cmd.total_size = totalsize; - //cmd.region = part; - cmd.partition = part; - - cmd.opcode = MSDC_CARD_DUNM_FUNC; - - result = simple_sd_ioctl_rw(&cmd); - - return result; -} -EXPORT_SYMBOL(eMMC_rw_x); - -void emmc_create_sys_symlink(struct mmc_card *card) -{ - return; -} - -static void emmc_create_symlink(void) -{ - dev_t devt; - int partno; - struct gendisk *disk; - struct disk_part_iter piter; - struct hd_struct *part; - - char link_target[256]; - char link_name[256]; - - int i; - - devt = blk_lookup_devt("mmcblk0", 0); - disk = get_gendisk(devt, &partno); - if (!disk || get_capacity(disk) == 0) { - printk("devt %d disk %p\n", devt, disk); - return ; - } - - disk_part_iter_init(&piter, disk, 0); - while ((part = disk_part_iter_next(&piter))) { - for (i = 0; i < PART_NUM; i++) { - if (PartInfo[i].start_address == part->start_sect * 512) { - sprintf(link_target, "/dev/block/%sp%d", disk->disk_name, part->partno); - sprintf(link_name, "/emmc@%s", PartInfo[i].name); - printk(KERN_ERR "%s:target=%s, name=%s\n", __func__, link_target, link_name); - sys_symlink(link_target, link_name); - break; - } - } - } - disk_part_iter_exit(&piter); -} - -#else - -int mtd_create_symlink(void) -{ - char *link_target; - char link_name[256]; - int i; - for (i = 0; i < PART_NUM; i++) { - if (dumchar_devices[i].actname) { - memset(link_name, 0x0, sizeof(link_name)); - link_target = dumchar_devices[i].actname; - sprintf(link_name, "/mtd@%s", dumchar_devices[i].dumname); - printk("[mtd_create_symlink]: target=%s, name=%s\n", link_target, link_name); - sys_symlink(link_target, link_name); - } - } - return 0; -} - -#endif - -#ifdef CONFIG_MTK_EMMC_SUPPORT - -static int init_sd_cmd(struct msdc_ioctl * cmd,loff_t addr, - u32 __user *buffer, int host_num, int iswrite, - u32 totalsize, int transtype, Region part) -{ - if (!cmd) { - printk("DumChar ERROR:no space for msdc_ioctl\n"); - return -EINVAL; - } - if (addr < 0) { - printk("DumChar ERROR:Wrong Address %llx for emmc!\n", addr); - return -EINVAL; - } - - if (totalsize > MAX_SD_BUFFER) { - printk("DumChar ERROR:too mucn bytes for msdc\n"); - return -EINVAL; - } - - memset(cmd, 0, sizeof(struct msdc_ioctl)); - if (addr % 512 == 0) { - cmd->address = addr / 512; - } else { - printk("DumChar ERROR: Wrong Address\n"); - return -EINVAL; - } - - cmd->buffer = buffer; - cmd->clock_freq = 0; - cmd->host_num = host_num; - cmd->iswrite = iswrite; - cmd->result = -1; - cmd->trans_type =transtype; - cmd->total_size = totalsize; - cmd->partition = part; - - /* cmdtype:MSDC_SINGLE_READ_WRITE while MAX_SD_BUFFER >totalsize >512 byte; - MSDC_MULTIPLE_READ_WRITE while totalsize <=512 byte; - */ - if (totalsize <= 512) { - cmd->opcode = MSDC_SINGLE_READ_WRITE; - } else { - cmd->opcode = MSDC_MULTIPLE_READ_WRITE; - } - -/* - printk("*****************************\nDumCharDebug:in init_sd_cmd:\n"); - printk("cmd->opcode=%d MSDC_SINGLE_READ_WRITE =(2) MSDC_MULTIPLE_READ_WRITE =(3)\n",cmd->opcode); - printk("cmd->host_num=%d supose=1\n",cmd->host_num); - printk("cmd->iswrite=%d write=1 read=0\n",cmd->iswrite); - printk("cmd->trans_type=%d\n",cmd->trans_type); - printk("cmd->total_size=%d\n",cmd->total_size); - printk("cmd->address=%d\n",cmd->address); - printk("cmd->buffer=%p\n",cmd->buffer); - printk("cmd->cmd_driving=%d\n",cmd->cmd_driving); - printk("cmd->dat_driving=%d\n",cmd->dat_driving); - printk("cmd->clock_freq=%d\n",cmd->clock_freq); - printk("cmd->result=%d\n",cmd->result); - printk("***************************\n"); -*/ - return 0; -} - -static ssize_t sd_single_read(struct file *filp, char __user *buf, size_t count, loff_t addr, Region part) -{ - struct file_obj *fo = filp->private_data; - struct msdc_ioctl cmd; - ssize_t result = 0; - - if (init_sd_cmd(&cmd, addr, (u32 *)buf, 0, 0, count, 0, part)) { - printk("DumChar:init sd_cmd fail\n"); - return -EINVAL; - } - - if (fo->act_filp->f_op->unlocked_ioctl) { - result = fo->act_filp->f_op->unlocked_ioctl(fo->act_filp, 1, (unsigned long )&cmd); - } else if (fo->act_filp->f_op->compat_ioctl) { - result= fo->act_filp->f_op->compat_ioctl(fo->act_filp, 1, (unsigned long)&cmd); - } - - if (result == 0) { - result = count; - } - - return result; -} - -static ssize_t sd_single_write(struct file *filp, const char __user *buf, size_t count, loff_t addr, Region part) -{ - struct file_obj *fo = filp->private_data; - struct msdc_ioctl cmd; - int result = 0; - - if (init_sd_cmd(&cmd, addr,(u32 *)buf, 0, 1, count, 0, part)) { - printk("DumChar:init sd_cmd fail\n"); - return -EINVAL; - } - - if (fo->act_filp->f_op->unlocked_ioctl ) { - result = fo->act_filp->f_op->unlocked_ioctl( fo->act_filp, 1, (unsigned long)&cmd); - } else if (fo->act_filp->f_op->compat_ioctl ) { - result= fo->act_filp->f_op->compat_ioctl(fo->act_filp, 1, (unsigned long)&cmd); - } - - if (result >=0) { - result = count; - } else { - result = 0; - } - - return result; -} - -static ssize_t sd_read(struct file *filp, char __user *buf, size_t count,loff_t *pos, Region part) -{ - struct file_obj *fo = filp->private_data; - struct dumchar_dev *dev = dumchar_devices + fo->index; - size_t total_retlen = 0; - int retlen = 0; - int len; - loff_t addr = *pos; - - if (*pos - dev->start_address + count > dev->size) - count = dev->size - (*pos - dev->start_address); - - if (!count) - return 0; - - if (addr % ALIE_LEN != 0 || (addr + count) % ALIE_LEN != 0) { - loff_t startaddr = addr; - loff_t endaddr = addr + count; - loff_t startaddr2, endaddr2; - loff_t buflen; - char *pbuf; - char *pbuf2; - mm_segment_t curr_fs; - - if (addr % ALIE_LEN != 0) { - startaddr = (addr / ALIE_LEN) * ALIE_LEN; - } - - if ((addr + count) % ALIE_LEN != 0) { - endaddr = ((addr + count) / ALIE_LEN + 1) * ALIE_LEN; - } - - buflen = endaddr - startaddr; - startaddr2 = startaddr; - endaddr2 = endaddr; - - pbuf = kzalloc(buflen, GFP_KERNEL); - if (!pbuf) { - printk("DumChar: malloc buff fail\n"); - return -ENOMEM; - } - pbuf2 = pbuf; - - curr_fs = get_fs(); - set_fs(KERNEL_DS); - - while (buflen > 0) { - if (buflen > MAX_SD_BUFFER) { - len = MAX_SD_BUFFER; - } else { - len = buflen; - } - - retlen= sd_single_read(filp, pbuf2,len, startaddr2, part); - - if (retlen > 0) { - startaddr2 += retlen; - total_retlen += retlen; - buflen -= retlen; - pbuf2 += retlen; - printk("while retlen > 0 total_retlen=%d\n",(int)total_retlen); - } else { - break; - } - } - - set_fs(curr_fs); - -#if defined(PrintBuff) - int iter=0; - printk("******************************\nGet %d bytes from %d to %d in %s in kernel\n", - (int)total_retlen,(int)startaddr,(int)endaddr,dev->dumname); - - for (iter = 0; iter < total_retlen; iter++) { - if (iter % 16 == 0) { - printk("\n"); - } - printk(" %02x", pbuf[iter]); - } - - printk("\n********************************************************************\n"); -#endif - - if (total_retlen == (endaddr - startaddr)) { - int n = copy_to_user(buf,pbuf+(addr-startaddr),count); - if (n != 0) { - printk(KERN_ERR "read fail in DumChar_sd_read\n"); - } - total_retlen = count -n; - } else { - printk(KERN_ERR "read fail DumChar_sd_read!\n"); - } - -#if defined(PrintBuff) - printk("******************************\nGet %ld bytes from %d in %s in user:\n",count,(int)*pos,dev->dumname); - for (iter =0; iter < count; iter++) { - if (iter % 16 == 0) { - printk("\n"); - } - printk(" %02x",buf[iter]); - } - printk("\n********************************************************************\n"); -#endif - kfree(pbuf); - } else { - while (count > 0) { - if (count > MAX_SD_BUFFER) { - len = MAX_SD_BUFFER; - } else { - len = count; - } - retlen = sd_single_read(filp, buf, len, addr, part); - if (retlen > 0) { - addr += retlen; - total_retlen += retlen; - count -= retlen; - buf += retlen; - } else { - break; - } - } - } - *pos += total_retlen; - - return total_retlen; -} - -static ssize_t sd_write(struct file *filp, const char __user *buf, size_t count, loff_t *pos, Region part) -{ - struct file_obj *fo = filp->private_data; - struct dumchar_dev *dev =dumchar_devices + fo->index; - size_t total_retlen = 0; - int retlen = 0; - int len; - loff_t addr = *pos;//+dev->start_address; - - if (*pos + count > dev->size) - count = dev->size - *pos; - - if (!count) - return 0; - - while (count > 0) { - if (count > MAX_SD_BUFFER) { - len = MAX_SD_BUFFER; - } else { - len = count; - } - retlen = sd_single_write(filp, buf,len, addr, part); - if (retlen > 0) { - addr += retlen; - total_retlen += retlen; - count -= retlen; - buf += retlen; - } else { - return total_retlen; - } - } - - *pos += total_retlen; - return total_retlen; -} - -#endif - -static ssize_t dumchar_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) -{ - struct file_obj *fo = filp->private_data; - struct dumchar_dev *dev = dumchar_devices+fo->index; - ssize_t result = 0; -#ifdef CONFIG_MTK_EMMC_SUPPORT - loff_t pos = 0; -#endif - if (fo->act_filp == (struct file *)0xffffffff) { - printk("[dumchar_read] It is forbidded to access %s with dumchar(/dev/%s)," - "the %s partition is managed by filesystem!\n", dev->dumname, dev->dumname, dev->dumname); - printk("[dumchar_read] show_stack*************************************\n"); - show_stack(NULL,NULL); - return -EINVAL; - } - - if (dev->type != NAND && dev->type != EMMC) { - printk("DumChar:Wrong Dummy device Type %d ,it should be MTD or SDCARD!\n",dev->type); - return -EINVAL; - } - - if (dev->type == EMMC) { -#ifdef CONFIG_MTK_EMMC_SUPPORT - pos = *f_pos + dev->start_address; - switch (dev->region) { - case EMMC_PART_USER: - result = vfs_read(fo->act_filp,buf,count,&pos); - break; - case EMMC_PART_BOOT1: - result = sd_read(filp,buf,count,&pos,EMMC_PART_BOOT1); - break; - default: - printk("DumChar: Wrong EMMC Region\n"); - return -EINVAL; - } - fo->act_filp->f_pos = pos - dev->start_address; - *f_pos = pos - dev->start_address; -#endif - } else { - result = vfs_read(fo->act_filp, buf, count, f_pos); - fo->act_filp->f_pos = *f_pos; - } - return result; -} - -ssize_t dumchar_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos) -{ - struct file_obj *fo = filp->private_data; - struct dumchar_dev *dev = dumchar_devices + fo->index; - ssize_t result=0; -#ifdef CONFIG_MTK_EMMC_SUPPORT - loff_t pos=0; -#endif -#ifdef CONFIG_MTK_COMBO_NAND_SUPPORT - struct mtd_info *mtd; - unsigned int writesize = -1; -#endif - - if (fo->act_filp == (struct file *)0xffffffff) { - printk("[dumchar_write] It is forbidded to access %s with dumchar(/dev/%s)," - "the %s partition is managed by filesystem!\n", dev->dumname, dev->dumname, dev->dumname); - printk("[dumchar_write] show_stack*************************************\n"); - show_stack(NULL,NULL); - return -EINVAL; - } - -#ifdef CONFIG_MTK_COMBO_NAND_SUPPORT - mtd_for_each_device(mtd) { - if (dev->mtd_index == mtd->index) { - writesize = mtd->writesize; - break; - } - } - if (writesize < 0) { - printk("[dumchar_write] Get writesize fail\n"); - show_stack(NULL,NULL); - return -EINVAL; - } - if ((__u32)*f_pos % (writesize) != 0) { - printk("[dumchar_write] Address Not alignment, write_size=%d byte, address =%lld\n", writesize, *f_pos); - show_stack(NULL,NULL); - return -EINVAL; - } -#else - if (*f_pos % (WRITE_SIZE_Byte) != 0) { - printk("[dumchar_write] Address Not alignment, write_size=%d byte, address =%lld\n", WRITE_SIZE_Byte, *f_pos); - show_stack(NULL,NULL); - return -EINVAL; - } -#endif - - if (dev->type != NAND && dev->type != EMMC) { - printk("DumChar:Wrong Dummy device Type %d ,it should be MTD or SDCARD!\n",dev->type); - return -EINVAL; - } - - if (dev->type == EMMC) { -#ifdef CONFIG_MTK_EMMC_SUPPORT - pos = *f_pos + dev->start_address; - switch(dev->region) { - case EMMC_PART_USER: - result = vfs_write(fo->act_filp, buf, count, &pos); - break; - case EMMC_PART_BOOT1: - result = sd_write(filp, buf, count, &pos, EMMC_PART_BOOT1); - break; - default: - printk("DumChar: Wrong EMMC Region\n"); - return -EINVAL; - } - fo->act_filp->f_pos = pos -dev->start_address; - *f_pos = pos - dev->start_address; -#endif - } else { - result = vfs_write(fo->act_filp, buf, count, f_pos); - fo->act_filp->f_pos = *f_pos; - } - return result; -} - -static long dumchar_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct file_obj *fo = filp->private_data; - struct dumchar_dev *dev = dumchar_devices + fo->index; - long result=0; -#ifdef CONFIG_MTK_EMMC_SUPPORT - long i; - struct mtd_info_user info; - struct erase_info_user erase_info; - void __user *argp = (void __user *)arg; - u_long size; - mm_segment_t curr_fs; - char *ebuf; - loff_t addr; - __u32 count; -#endif - - if (fo->act_filp == (struct file *)0xffffffff) { - printk("[dumchar_ioctl] It is forbidded to access %s with dumchar(/dev/%s)," - "the %s partition is managed by filesystem!\n", dev->dumname, dev->dumname, dev->dumname); - printk("[dumchar_loctl] show_stack*************************************\n"); - show_stack(NULL,NULL); - return -EINVAL; - } - - if (dev->type != NAND && dev->type != EMMC) { - printk("DumChar:Wrong Dummy device Type %d ,it should be MTD or SDCARD!\n",dev->type); - return -EINVAL; - } - - if (dev->type == NAND) { - if (fo->act_filp->f_op->unlocked_ioctl) { - result = fo->act_filp->f_op->unlocked_ioctl(fo->act_filp, cmd, arg); - } else if (fo->act_filp->f_op->compat_ioctl) { - result = fo->act_filp->f_op->compat_ioctl(fo->act_filp, cmd, arg); - } - } else { -#ifdef CONFIG_MTK_EMMC_SUPPORT - size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT; - if (cmd & IOC_IN) { - if (!access_ok(VERIFY_READ, argp, size)) - return -EFAULT; - } - if (cmd & IOC_OUT) { - if (!access_ok(VERIFY_WRITE, argp, size)) - return -EFAULT; - } - - switch (cmd) { - case MEMGETREGIONCOUNT: - break; - case MEMGETREGIONINFO: - break; - case MEMGETINFO: - info.type = MTD_NANDFLASH; - info.flags = MTD_WRITEABLE; - info.size = dev->size; - info.erasesize = 128*1024; - info.writesize = 512; - info.oobsize = 0; - info.padding = 0; - if (copy_to_user(argp, &info, sizeof(struct mtd_info_user))) - return -EFAULT; - break; - case MEMERASE: - if (copy_from_user(&erase_info,argp, sizeof(struct erase_info_user))) - return -EFAULT; - addr = (loff_t)erase_info.start + dev->start_address; - count = erase_info.length; - ebuf = kmalloc(MAX_SD_BUFFER, GFP_KERNEL); - if (!ebuf) { - printk("DumChar: malloc ebuf buffer fail\n"); - return -ENOMEM; - } - memset(ebuf, 0xFF, MAX_SD_BUFFER); - - curr_fs = get_fs(); - set_fs(KERNEL_DS); - - switch(dev->region) { - case EMMC_PART_USER: - for (i = 0; i < (count + MAX_SD_BUFFER - 1) / MAX_SD_BUFFER; i++) { - result = vfs_write(fo->act_filp, ebuf, MAX_SD_BUFFER, &addr); - } - break; - case EMMC_PART_BOOT1: - for (i = 0; i < (count + MAX_SD_BUFFER - 1) / MAX_SD_BUFFER; i++) { - result = sd_write(filp, ebuf, MAX_SD_BUFFER, &addr, EMMC_PART_BOOT1); - } - break; - default: - printk("DumChar: Wrong EMMC Region\n"); - return -EINVAL; - } - - set_fs(curr_fs); - kfree(ebuf); - break; - case MEMERASE64: - break; - case MEMWRITEOOB: - break; - case MEMREADOOB: - break; - case MEMWRITEOOB64: - break; - case MEMREADOOB64: - break; - case MEMLOCK: - break; - case MEMUNLOCK: - break; - case MEMGETOOBSEL: - break; - case MEMGETBADBLOCK: - break; - case MEMSETBADBLOCK: - break; - case ECCGETLAYOUT: - break; - case ECCGETSTATS: - break; - case MTDFILEMODE: - break; - case MTD_FILE_MODE_NORMAL: - break; - default: - result = -EINVAL; - } -#endif - } - return result; -} - -loff_t dumchar_llseek(struct file *filp, loff_t off, int whence) -{ - struct file_obj *fo = filp->private_data; - struct dumchar_dev *dev = dumchar_devices + fo->index; - loff_t newpos; - - if (fo->act_filp == (struct file *)0xffffffff) { - printk("[dumchar_llseek] It is forbidded to access %s with dumchar(/dev/%s)," - "the %s partition is managed by filesystem!\n", dev->dumname, dev-> dumname, dev->dumname); - printk("[dumchar_llseek] show_stack*************************************\n"); - show_stack(NULL,NULL); - return -EINVAL; - } - - if (dev->type != NAND && dev->type != EMMC) { - printk("DumChar:Wrong Dummy device Type %d ,it should be MTD or SDCARD!\n",dev->type); - return -EINVAL; - } - - if (fo->act_filp->f_op->llseek) { - newpos = fo->act_filp->f_op->llseek(fo->act_filp, off, whence); - } else { - switch(whence) { - case SEEK_SET: - newpos = off; - break; - case SEEK_CUR: - newpos = fo->act_filp->f_pos + off; - break; - case SEEK_END: - newpos = dev->size + off; - break; - default: - return -EINVAL; - } - } - - if (newpos >= 0 && newpos <= dev->size) { - fo->act_filp->f_pos = newpos; - filp->f_pos = newpos; - return fo->act_filp->f_pos ; - } - - return -EINVAL; -} - -int dumchar_open(struct inode *inode, struct file *filp) -{ - struct dumchar_dev *dev; /* device information */ - struct file_obj *fo; - int i, result = -1, found = 0; - - fo = kmalloc(sizeof(struct file_obj), GFP_KERNEL); - if (!fo) { - printk("DumChar: kmalloc file_obj fail!\n"); - return -ENOMEM; - } - - filp->private_data = fo; - - for (i = 0; i < PART_NUM; i++) { - if (!strcmp(filp->f_path.dentry->d_name.name, dumchar_devices[i].dumname)) { - dev = &(dumchar_devices[i]); - fo->index = i; - found = 1; - //printk( "DumChar: find dev %s index=%d\n",dumchar_devices[i].dumname,i); - break; - } - } - - if (found == 0) { - printk(" DumChar:ERROR:No Such Dummy Device %s\n ",filp->f_path.dentry->d_name.name); - return -EINVAL; - } - - if (!strcmp(dev->dumname,"usrdata") || !strcmp(dev->dumname,"cache") || - !strcmp(dev->dumname,"android") || !strcmp(dev->dumname,"fat")) { - printk("[dumchar_open] It is forbidded to access %s with dumchar(/dev/%s)," - "the %s partition is managed by filesystem!\n", dev->dumname, dev->dumname, dev->dumname); - printk("[dumchar_open] show_stack*************************************\n"); - show_stack(NULL,NULL); - fo->act_filp = (struct file *)0xffffffff; - kfree(fo); - return -EINVAL; - } else { - printk("[dumchar_open][%s] will open %s for %s!\n", current->comm, dev->actname, filp->f_path.dentry->d_name.name); - fo->act_filp = filp_open(dev->actname,filp->f_flags, 0777); - if (IS_ERR(fo->act_filp)) { - result = PTR_ERR(fo->act_filp); - printk(" DumChar: [%s] open %s failed ( %s ). fo->act_filp=%p!, result=%d\n", - current->comm, dev->actname, filp->f_path.dentry->d_name.name, fo->act_filp,result); - printk("[dumchar_open] show_stack*************************************\n"); - show_stack(NULL,NULL); - //printk("[dumchar_open] BUG_ON*************************************\n"); - //BUG_ON(1); - //printk("[dumchar_open] ************\n"); - goto open_fail2; - } else { - if (!(fo->act_filp->f_op)) { - printk(" DumChar:open %s failed ( %s ). has no file operations registered!\n", - dev->actname, filp->f_path.dentry->d_name.name); - result = -EIO; - goto open_fail1; - } - } - } - return 0; /* success */ - -open_fail1: - filp_close(fo->act_filp, NULL); -open_fail2: - fo->act_filp = NULL; - kfree(fo); - return result; -} - -int dumchar_release(struct inode *inode, struct file *filp) -{ - struct file_obj *fo = filp->private_data; - struct dumchar_dev *dev = &dumchar_devices[fo->index]; - if (!strcmp(dev->dumname,"usrdata") || !strcmp(dev->dumname,"cache") || - !strcmp(dev->dumname,"android") || !strcmp(dev->dumname,"fat")) { - printk("[dumchar_release] It is forbidded to access %s with dumchar(/dev/%s)," - "the %s partition is managed by filesystem!\n", dev->dumname, dev->dumname, dev->dumname); - } else { - filp_close(fo->act_filp, NULL); - } - - kfree(fo); - return 0; -} - -struct file_operations dumchar_fops = { - .owner = THIS_MODULE, - .llseek = dumchar_llseek, - .read = dumchar_read, - .write = dumchar_write, - .unlocked_ioctl = dumchar_ioctl, - .open = dumchar_open, - .release = dumchar_release, -}; - -int dumchar_probe(struct platform_device *dev) -{ - int result, i, m, l; - dev_t devno; -#ifdef CONFIG_MTK_MTD_NAND - struct mtd_info *mtd; -#endif - -#ifdef CONFIG_MTK_EMMC_SUPPORT - struct storage_info s_info = {0}; - printk("[Dumchar_probe]*******************Introduction******************\n"); - printk("[Dumchar_probe]There are 3 address in eMMC Project: Linear Address, Logical Address, Physical Address\n"); - printk("[Dumchar_probe]Linear Address: Used in scatter file, uboot, preloader,flash tool etc. \n"); - printk("[Dumchar_probe]Linear Address: MBR linear address is fixed in eMMCComo.mk, that is same for all chips in the project \n"); - printk("[Dumchar_probe]Logical Address: Used in /proc/dumchar_info, mmcblk0 etc. MBR logical address is 0\n"); - printk("[Dumchar_probe]Physical Address: Used in eMMC driver, MBR Physical Address = MBR Linear Address - (BOOT1 size + BOOT2 Size + RPMB Size)\n"); - printk("[Dumchar_probe]define User_Region_Header (BOOT1 size + BOOT2 Size + RPMB Size)\n"); - printk("[Dumchar_probe]*******************Introduction******************\n"); - - init_pmt(); -#ifdef CONFIG_MTK_EMMC_CACHE - msdc_get_cache_region(); -#endif - - msdc_get_info(EMMC_CARD_BOOT, EMMC_USER_CAPACITY, &s_info); - msdc_get_info(EMMC_CARD_BOOT,EMMC_RESERVE,&s_info); -#endif - - dumchar_devices = kzalloc(PART_NUM * sizeof(struct dumchar_dev), GFP_KERNEL); - if (!dumchar_devices) { - result = -ENOMEM; - printk("DumChar: malloc dumchar_dev fail\n"); - goto fail_malloc; - } - - result = alloc_chrdev_region(&devno, 0, PART_NUM, "DumChar"); - if (result < 0) { - printk("DumChar: Get chrdev region fail\n"); - goto fail_alloc_chrdev_region; - } - major = MAJOR(devno); - - for (i = 0; i < PART_NUM; i++) { - dumchar_devices[i].dumname = PartInfo[i].name; - sema_init(&(dumchar_devices[i].sem), 1); - devno = MKDEV(major,i); - cdev_init(&dumchar_devices[i].cdev, &dumchar_fops); - dumchar_devices[i].cdev.owner = THIS_MODULE; - dumchar_devices[i].cdev.ops = &dumchar_fops; - result = cdev_add(&dumchar_devices[i].cdev, devno, 1); - if (result) { - printk("DumChar: register char device dumchar fail!\n"); - goto fail_register_chrdev; - } - - dumchar_devices[i].type = PartInfo[i].type; - - if (dumchar_devices[i].type == EMMC) { -#ifdef CONFIG_MTK_EMMC_SUPPORT - dumchar_devices[i].region = PartInfo[i].region; - switch(dumchar_devices[i].region) { - case EMMC_PART_BOOT1: - sprintf(dumchar_devices[i].actname, MSDC_RAW_DEVICE); - dumchar_devices[i].start_address = PartInfo[i].start_address; - break; - case EMMC_PART_USER: - sprintf(dumchar_devices[i].actname, "/dev/block/mmcblk0"); - #ifdef CONFIG_MTK_NEW_COMBO_EMMC_SUPPORT - dumchar_devices[i].start_address = PartInfo[i].start_address; - #else - dumchar_devices[i].start_address = PartInfo[i].start_address - MBR_START_ADDRESS_BYTE; - #endif - break; - default: - printk("Error! the emmc region is not supportted!\n"); - goto fail_register_chrdev; - } - - dumchar_devices[i].size = PartInfo[i].size; - - if (!strcmp(PartInfo[i].name,"fat")) { - dumchar_devices[i].size = s_info.emmc_user_capacity * 512 - - dumchar_devices[i].start_address - s_info.emmc_reserve * 512; - } - #ifdef CONFIG_MTK_SHARED_SDCARD - if (!strcmp(PartInfo[i].name,"usrdata")) { - dumchar_devices[i].size = s_info.emmc_user_capacity * 512 - - dumchar_devices[i].start_address - s_info.emmc_reserve * 512; - } - #endif - printk("[Dumchar] %s start address=%llx size=%llx\n", dumchar_devices[i].dumname, - dumchar_devices[i].start_address, dumchar_devices[i].size); -#endif - } else { -#ifdef CONFIG_MTK_MTD_NAND - char *mtdname = dumchar_devices[i].dumname; - if (!strcmp(dumchar_devices[i].dumname, "seccfg")) - mtdname = "seccnfg"; - - if (!strcmp(dumchar_devices[i].dumname, "bootimg")) - mtdname = "boot"; - - if (!strcmp(dumchar_devices[i].dumname, "sec_ro")) - mtdname = "secstatic"; - - if (!strcmp(dumchar_devices[i].dumname, "android")) - mtdname = "system"; - - if (!strcmp(dumchar_devices[i].dumname, "usrdata")) - mtdname = "userdata"; - - mtd_for_each_device(mtd) { - if (!strcmp(mtd->name,mtdname)) { - dumchar_devices[i].mtd_index = mtd->index; - sprintf(dumchar_devices[i].actname,"/dev/mtd/mtd%d",mtd->index); - dumchar_devices[i].size = mtd->size; - dumchar_devices[i].start_address= mtd_partition_start_address(mtd); - break; - } - } -#endif - } - } - - dumchar_class = class_create(THIS_MODULE, "dumchar"); - if (IS_ERR(dumchar_class)) { - printk("DumChar: fail in class create"); - result = PTR_ERR(dumchar_class); - goto fail_register_chrdev; - } - - for (l = 0; l < PART_NUM; l++) { - if (!strcmp(dumchar_devices[l].dumname,"otp")) { - dumchar_device[l] = device_create(dumchar_class, NULL, MKDEV(major, l), NULL, "otp_bak"); - } else { - dumchar_device[l] = device_create(dumchar_class, NULL, MKDEV(major, l), NULL, dumchar_devices[l].dumname); - } - if (IS_ERR(dumchar_device[l])) { - result = PTR_ERR(dumchar_device[l]); - printk("DumChar: fail in device_create name = %s minor = %d\n", dumchar_devices[l].dumname, l); - goto fail_create_device; - } - } - - -#ifdef CONFIG_MTK_EMMC_SUPPORT - emmc_create_symlink(); -#endif - -#ifdef CONFIG_MTK_MTD_NAND - mtd_create_symlink(); -#endif - - return 0; - -fail_create_device: - for (m = 0; m < l; m++) { - device_destroy(dumchar_class, MKDEV(major, m)); - } - class_destroy(dumchar_class); -fail_register_chrdev: - for (m = 0; m < i; m++) { - cdev_del(&dumchar_devices[m].cdev); - } - unregister_chrdev_region(MKDEV(major,0), PART_NUM); -fail_alloc_chrdev_region: - kfree(dumchar_devices); -fail_malloc: - return result; -} - -int dumchar_remove(struct platform_device * dev) -{ - int i; - printk("DumCharDebug: in dumchar_remove\n"); - for (i = 0; i < PART_NUM; i++) { - device_destroy(dumchar_class, MKDEV(major, i)); - cdev_del(&dumchar_devices[i].cdev); - } - - class_destroy(dumchar_class); - unregister_chrdev_region(MKDEV(major,0), PART_NUM); - return 0; -} - -static struct platform_driver dumchar_driver = { - .probe = dumchar_probe, - .remove = dumchar_remove, - .driver = { - .name = "dummy_char", - .owner = THIS_MODULE, - }, -}; - -#ifndef CONFIG_MTK_NEW_COMBO_EMMC_SUPPORT -static int dumchar_proc_show (struct seq_file *m,void *v) -{ - int i; - - seq_puts(m, "Part_Name\tSize\tStartAddr\tType\tMapTo\n"); - - for(i = 0; i < PART_NUM; i++) { - if (dumchar_devices[i].type == NAND) { - seq_printf(m, "%-10s 0x%016llx 0x%016llx 1 %s\n", - dumchar_devices[i].dumname, - dumchar_devices[i].size, - dumchar_devices[i].start_address, - /* "NAND",*/ - dumchar_devices[i].actname); - } else { - if (PartInfo[i].partition_idx == 0) { - seq_printf(m, "%-10s 0x%016llx 0x%016llx 2 %s\n", - dumchar_devices[i].dumname, - dumchar_devices[i].size, - dumchar_devices[i].start_address, - /*"EMMC",*/ - dumchar_devices[i].actname); - } else { - seq_printf(m, "%-10s 0x%016llx 0x%016llx 2 /dev/block/mmcblk0p%d\n", - dumchar_devices[i].dumname, - dumchar_devices[i].size, - dumchar_devices[i].start_address, - /* "EMMC",*/ - PartInfo[i].partition_idx); - } - } - } - - if (dumchar_devices[i].type == NAND) { - seq_printf(m, "Part_Name:Partition name you should open;\nSize:size of partition\nStartAddr:Index (MTD); \nType:Type of partition(MTD=1,EMMC=2);\nMapTo:actual device you operate\n"); - } else { - seq_printf(m, "Part_Name:Partition name you should open;\nSize:size of partition\nStartAddr:Start Address of partition;\nType:Type of partition(MTD=1,EMMC=2)\nMapTo:actual device you operate\n"); - } - - return 0; -} -#else -static int dumchar_proc_show (struct seq_file *m,void *v) -{ - int i; - char region[8]; - - strcpy(region, "NAND"); - seq_puts(m, "Part_Name\tSize\tStartAddr\tType\tMapTo\tRegion\n"); - - for(i = 0; i < PART_NUM; i++) { - if (dumchar_devices[i].type == NAND) { - seq_printf(m, "%-10s 0x%016llx 0x%016llx 1 %s\n", - dumchar_devices[i].dumname, - dumchar_devices[i].size, - dumchar_devices[i].start_address, - /* "NAND",*/ - dumchar_devices[i].actname); - } else { - switch (dumchar_devices[i].region) { - case EMMC_PART_BOOT1: - strcpy(region, "BOOT_1"); - break; - case EMMC_PART_BOOT2: - strcpy(region, "BOOT_2"); - break; - case EMMC_PART_RPMB: - strcpy(region, "RPMB"); - break; - case EMMC_PART_GP1: - strcpy(region, "GP_1"); - break; - case EMMC_PART_GP2: - strcpy(region, "GP_2"); - break; - case EMMC_PART_GP3: - strcpy(region, "GP_3"); - break; - case EMMC_PART_GP4: - strcpy(region, "GP_4"); - break; - case EMMC_PART_USER: - strcpy(region, "USER"); - break; - default : - strcpy(region, "ERROR"); - printk("ERROR, No such emmc region\n"); - break; - } - - if (PartInfo[i].partition_idx == 0) { - seq_printf(m, "%-10s 0x%016llx 0x%016llx 2 %s %s\n", - dumchar_devices[i].dumname, - dumchar_devices[i].size, - dumchar_devices[i].start_address, - /*"EMMC",*/ - dumchar_devices[i].actname, - region); - } else { - seq_printf(m, "%-10s 0x%016llx 0x%016llx 2 /dev/block/mmcblk0p%d %s\n", - dumchar_devices[i].dumname, - dumchar_devices[i].size, - dumchar_devices[i].start_address, - /* "EMMC",*/ - PartInfo[i].partition_idx, - region); - } - } - } - - if (dumchar_devices[i].type == NAND) { - seq_printf(m, "Part_Name:Partition name you should open;\nSize:size of partition\nStartAddr:Index (MTD); \nType:Type of partition(MTD=1,EMMC=2);\nMapTo:actual device you operate\n"); - } else { - seq_printf(m, "Part_Name:Partition name you should open;\nSize:size of partition\nStartAddr:Start Address of partition;\nType:Type of partition(MTD=1,EMMC=2)\nMapTo:actual device you operate\n"); - } - - return 0; -} -#endif - -static int dumchar_proc_open(struct inode * inode, struct file *file) -{ - return single_open(file, dumchar_proc_show, NULL); -} - -static const struct file_operations dumchar_proc_ops = { - .open = dumchar_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int __init dumchar_init(void) -{ - int result; - struct proc_dir_entry *dumchar_proc_entry = NULL; - - printk("dumchar_int\n"); - - dumchar_proc_entry = proc_create("dumchar_info", S_IFREG|S_IRUGO, NULL,&dumchar_proc_ops); - if (dumchar_proc_entry) { - printk( "dumchar: register /proc/dumchar_info success\n"); - } else { - printk( "dumchar: unable to register /proc/dumchar_info\n"); - result = -ENOMEM; - goto fail_create_proc; - } - - result= platform_driver_register(&dumchar_driver); - if (result) { - printk("DUMCHAR: Can't register driver\n"); - goto fail_driver_register; - } - - printk( "DumChar: init USIF Done!\n"); - - return 0; -fail_driver_register: - remove_proc_entry("dumchar_info", NULL); -fail_create_proc: - return result; -} - - -static void __exit dumchar_cleanup(void) -{ - remove_proc_entry("dumchar_info", NULL); - platform_driver_unregister(&dumchar_driver); - kfree(dumchar_devices); -} - - -module_init(dumchar_init); -module_exit(dumchar_cleanup); - - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("MediaTek Dummy Char Device Driver"); -MODULE_AUTHOR("Kai Zhu "); diff --git a/drivers/misc/mediatek/dum-char/mt8127/dumchar.h b/drivers/misc/mediatek/dum-char/mt8127/dumchar.h deleted file mode 100644 index c59c7dd7fe9..00000000000 --- a/drivers/misc/mediatek/dum-char/mt8127/dumchar.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef __DUMCHAR_H__ -#define __DUMCHAR_H__ - - -#include -#include -#include -#include -#include - -/* - * Macros to help debugging - */ -#define DUMCHAR_DEBUG -//#undef DUMCHAR_DEBUG /* undef it, just in case */ - -#ifdef DUMCHAR_DEBUG -#define DDEBUG(fmt, args...) printk( KERN_DEBUG "dumchar_debug: " fmt, ## args) -#else -#define DDEBUG(fmt, args...) -#endif - - -#define DUMCHAR_MAJOR 0 /* dynamic major by default */ -#define MAX_SD_BUFFER (512) -#define ALIE_LEN 512 - - -//#define PrintBuff 1 - -struct dumchar_dev { - char *dumname; //nvram boot userdata... - char actname[64]; //full act name /dev/mt6573_sd0 /dev/mtd/mtd1 - struct semaphore sem; /* Mutual exclusion */ - dev_type type; //nand device or emmc device? - unsigned long long size; //partition size - struct cdev cdev; - Region region; //for emmc - unsigned long long start_address; //for emmc - unsigned int mtd_index; //for nand -}; - -struct Region_Info { - Region region; - unsigned long long size_Byte; -}; - -struct file_obj { - struct file *act_filp; - int index; //index in dumchar_dev arry -}; - -#define REGION_NUM 8 -#define EXT_CSD_BOOT_SIZE_MULT 226 /* R */ -#define EXT_CSD_RPMB_SIZE_MULT 168 /* R */ - -#define MSDC_RAW_DEVICE "/dev/misc-sd" - -#ifdef CONFIG_MTK_MTD_NAND -extern u64 mtd_partition_start_address(struct mtd_info *mtd); -#endif - -#define mtd_for_each_device(mtd) \ - for ((mtd) = __mtd_next_device(0); \ - (mtd) != NULL; \ - (mtd) = __mtd_next_device(mtd->index + 1)) - -#ifndef CONFIG_MTK_NEW_COMBO_EMMC_SUPPORT -#define EMMC_PART_BOOT1 (BOOT_1) -#define EMMC_PART_BOOT2 (BOOT_2) -#define EMMC_PART_RPMB (RPMB) -#define EMMC_PART_GP1 (GP_1) -#define EMMC_PART_GP2 (GP_2) -#define EMMC_PART_GP3 (GP_3) -#define EMMC_PART_GP4 (GP_4) -#define EMMC_PART_USER (USER) -#define NAND_PART_USER (USER) - -#endif - -#endif /*__DUMCHAR_H__ */ diff --git a/drivers/misc/mediatek/dynamic_boost/Makefile b/drivers/misc/mediatek/dynamic_boost/Makefile new file mode 100644 index 00000000000..2cfb80c967c --- /dev/null +++ b/drivers/misc/mediatek/dynamic_boost/Makefile @@ -0,0 +1,2 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom +obj-y += dynamic_boost.o \ No newline at end of file diff --git a/drivers/misc/mediatek/dynamic_boost/dynamic_boost.c b/drivers/misc/mediatek/dynamic_boost/dynamic_boost.c new file mode 100644 index 00000000000..4e243865a08 --- /dev/null +++ b/drivers/misc/mediatek/dynamic_boost/dynamic_boost.c @@ -0,0 +1,476 @@ +/* + * drivers/dynamic_boost/dynamic_boost.c + * + * Copyright (C) 2010 MediaTek + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if 0 +#ifdef CONFIG_ARCH_MT8173 +#include +#include +#include +#else +#include +#include +#endif +#endif +#include +#include +#include +#include + +struct boost_state { + int active; + struct delayed_work work; +}; + +struct dynamic_boost { + spinlock_t boost_lock; + int last_req_mode; + wait_queue_head_t wq; + struct task_struct *thread; + struct boost_state state[PRIO_DEFAULT]; + atomic_t event; +}; + +static struct dynamic_boost dboost; + +struct dboost_input_handle { + struct input_handle handle; + int duration; + int prio_mode; +}; + +#define MAX_CORES_NUMBER nr_cpu_ids +#define MAX_FREQUENCY 1 +#define MAX_DURATION 10000 + +static ssize_t dynamic_boost_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t dynamic_boost_store(struct device *dev, struct device_attribute *attr, const char *buf, + size_t n); +static struct device_attribute dynamic_boost_attr = __ATTR(dynamic_boost, 0777, + dynamic_boost_show, dynamic_boost_store); +static bool isFirst = true; +//extern void hp_based_cpu_num(int num); + +static void dboost_disable_work(struct work_struct *work) +{ + unsigned long flags; + struct boost_state *state = container_of(work, struct boost_state, work.work); + + spin_lock_irqsave(&dboost.boost_lock, flags); + if (state->active > 0) + state->active--; + spin_unlock_irqrestore(&dboost.boost_lock, flags); + + atomic_inc(&dboost.event); + wake_up(&dboost.wq); +} + +/* + * Set up performance boost mode with requested duration + * @duration: How long the user want this mode to keep. Specify with ms. + * @mode: Request mode. +*/ +int set_dynamic_boost(int duration, int prio_mode) +{ + unsigned long flags; + struct boost_state *state; + + if (duration > MAX_DURATION || + prio_mode < 0 || prio_mode > PRIO_DEFAULT) + return -EINVAL; + + if (prio_mode == PRIO_DEFAULT || !duration) + return 0; + + spin_lock_irqsave(&dboost.boost_lock, flags); + + state = &dboost.state[prio_mode]; + if (duration == ON) + state->active++; + else if (duration == OFF) + state->active--; + else if (!mod_delayed_work(system_wq, &state->work, msecs_to_jiffies(duration))) + state->active++; + spin_unlock_irqrestore(&dboost.boost_lock, flags); + + atomic_inc(&dboost.event); + wake_up(&dboost.wq); + return 0; +} +EXPORT_SYMBOL(set_dynamic_boost); + +static int dboost_dvfs_hotplug_thread(void *ptr) +{ +#if 0 +#ifndef CONFIG_ARCH_MT8173 /* for 8135 */ + char cmd[128] = ""; + int l = 0; +#endif +#endif + int max_freq, cores_to_set_b, cores_to_set_l, cores_to_set_sum; + unsigned long flags; + + set_user_nice(current, -10); + + while (!kthread_should_stop()) { + int i, set_mode = PRIO_DEFAULT; + + spin_lock_irqsave(&dboost.boost_lock, flags); + for (i = PRIO_DEFAULT - 1; i >= 0; i--) { + if (dboost.state[i].active) { + set_mode = i; + break; + } + } + spin_unlock_irqrestore(&dboost.boost_lock, flags); + + /* there is no big core in mt8127 */ + cores_to_set_b = 0; + switch (set_mode) { + case PRIO_MAX_CORES_MAX_FREQ: + cores_to_set_l = num_possible_cpus(); + max_freq = MAX_FREQUENCY; + break; + case PRIO_MAX_CORES: + cores_to_set_l = num_possible_cpus(); + max_freq = 0; + break; + case PRIO_TWO_LITTLES_MAX_FREQ: + cores_to_set_l = 2; + max_freq = MAX_FREQUENCY; + break; + case PRIO_TWO_LITTLES: + cores_to_set_l = 2; + max_freq = 0; + break; + case PRIO_RESET: + for (i = PRIO_DEFAULT - 1; i >= 0; i--) + dboost.state[i].active = 0; + default: + cores_to_set_l = 1; + max_freq = 0; + break; + } + + if (max_freq) + mt_cpufreq_enable_boost(); + else + mt_cpufreq_disable_boost(); + + cores_to_set_sum = cores_to_set_b + cores_to_set_l; + if (cores_to_set_sum > num_possible_cpus()) + cores_to_set_sum = num_possible_cpus(); + if (isFirst) + isFirst = false; + else + hp_based_cpu_num(cores_to_set_sum); + + /* + printk("dynamic boost: Mode=%d cpu_min_num_sum=%d cpu_min_num_little=%d\n", + set_mode, cores_to_set_sum, cores_to_set_l); + */ + + dboost.last_req_mode = set_mode; + + while (!atomic_read(&dboost.event)) + wait_event(dboost.wq, atomic_read(&dboost.event)); + + atomic_dec(&dboost.event); + } + return 0; +} + +static ssize_t dynamic_boost_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i; + i = snprintf(buf, PAGE_SIZE, "Mode: %d\n", dboost.last_req_mode); + return i; +} + +static ssize_t dynamic_boost_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) +{ + int now_req_duration = 0; + int now_req_mode = 0; + + if ((n == 0) || (buf == NULL)) + return -EINVAL; + if (sscanf(buf, "%d %d", &now_req_duration, &now_req_mode) != 2) + return -EINVAL; + if (now_req_mode < 0) + return -EINVAL; + + set_dynamic_boost(now_req_duration, now_req_mode); + + return n; +} + +static int dynamic_boost_probe(struct platform_device *dev) +{ + int ret_device_file = 0; + + ret_device_file = device_create_file(&(dev->dev), &dynamic_boost_attr); + + return ret_device_file; +} + +struct platform_device dynamic_boost_device = { + .name = "dynamic_boost", + .id = -1, +}; + +int dboost_suspend(struct device *dev) +{ + unsigned long flags; + int i; + /* cancel all boost jobs if system suspend is requested */ + for (i = 0; i < ARRAY_SIZE(dboost.state); ++i) { + cancel_delayed_work_sync(&dboost.state[i].work); + spin_lock_irqsave(&dboost.boost_lock, flags); + dboost.state[i].active = 0; + spin_unlock_irqrestore(&dboost.boost_lock, flags); + } + atomic_inc(&dboost.event); + wake_up(&dboost.wq); + return 0; +} + +int dboost_resume(struct device *dev) +{ + return 0; +} + +static struct platform_driver dynamic_boost_driver = { + .probe = dynamic_boost_probe, + .driver = { + .name = "dynamic_boost", + .pm = &(const struct dev_pm_ops){ + .suspend = dboost_suspend, + .resume = dboost_resume, + }, + }, +}; + +#ifdef CONFIG_TOUCH_BOOST +static int flag = -1; /* flag to filter botton event */ +/****************************************************************************** + * Handle touch boost * + ******************************************************************************/ +static void dboost_input_event(struct input_handle *handle, unsigned int type, + unsigned int code, int value) +{ + struct dboost_input_handle *in = container_of(handle, struct dboost_input_handle, handle); + + if (flag == -1 || flag == 1) { + if (type == EV_KEY && code == BTN_TOUCH) { + flag = 1; + if (value == 1) /** for touch down */ + goto boost_on; + else + goto boost_off; + } + } else if (flag == -1 || flag == 2) { + if (type == EV_ABS && code == ABS_MT_TRACKING_ID) { + flag = 2; + if (value != -1) + goto boost_on; + else + goto boost_off; + } +} + return; + +boost_on: + set_dynamic_boost(ON, in->prio_mode); + return; +boost_off: + set_dynamic_boost(OFF, in->prio_mode); + set_dynamic_boost(in->duration, in->prio_mode); + return; +} + +static int dboost_input_connect(struct input_handler *handler, + struct input_dev *dev, const struct input_device_id *id) +{ + struct dboost_input_handle *in; + int error; + + in = kzalloc(sizeof(struct dboost_input_handle), GFP_KERNEL); + if (!in) + return -ENOMEM; + + in->handle.dev = dev; + in->handle.handler = handler; + in->handle.name = "dynamic_boost"; + + /* TODO: the following parameters should be configured through platform data */ + in->prio_mode = PRIO_MAX_CORES_MAX_FREQ; + in->duration = 150; + + error = input_register_handle(&in->handle); + if (error) + goto err2; + + error = input_open_device(&in->handle); + if (error) + goto err1; + + return 0; +err1: + input_unregister_handle(&in->handle); +err2: + kfree(&in->handle); + return error; +} + +static void dboost_input_disconnect(struct input_handle *handle) +{ + struct dboost_input_handle *in = container_of(handle, struct dboost_input_handle, handle); + input_close_device(handle); + input_unregister_handle(handle); + kfree(in); +} + +static const struct input_device_id dboost_ids[] = { + { .driver_info = 1 }, + { }, +}; + +static struct input_handler dboost_input_handler = { + .event = dboost_input_event, + .connect = dboost_input_connect, + .disconnect = dboost_input_disconnect, + .name = "touch_boost_ond", + .id_table = dboost_ids, +}; +#endif /* CONFIG_TOUCH_BOOST */ + +#ifdef CONFIG_HAS_EARLYSUSPEND + +static void dboost_early_suspend(struct early_suspend *h) +{ + unsigned long flags; + + /* Reset dynamic boost */ + spin_lock_irqsave(&dboost.boost_lock, flags); + dboost.state[PRIO_RESET].active = 1; + spin_unlock_irqrestore(&dboost.boost_lock, flags); + + atomic_inc(&dboost.event); + wake_up(&dboost.wq); + return; +} + +static void dboost_late_resume(struct early_suspend *h) +{ + unsigned long flags; + + /* make 2 A7 run all the time */ + spin_lock_irqsave(&dboost.boost_lock, flags); + dboost.state[PRIO_RESET].active = 0; + dboost.state[PRIO_TWO_LITTLES].active += 1; + spin_unlock_irqrestore(&dboost.boost_lock, flags); + + atomic_inc(&dboost.event); + wake_up(&dboost.wq); + return; +} + +static struct early_suspend dboost_early_suspend_handler = +{ + .level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 250, + .suspend = NULL, + .resume = NULL, +}; +#endif //#ifdef CONFIG_HAS_EARLYSUSPEND + +static int __init dynamic_boost_init(void) +{ + int ret = 0, i; + ret = platform_device_register(&dynamic_boost_device); + if (ret) + return ret; + ret = platform_driver_register(&dynamic_boost_driver); + if (ret) + return ret; + + spin_lock_init(&dboost.boost_lock); + dboost.last_req_mode = PRIO_DEFAULT; + atomic_set(&dboost.event, 0); + + for (i = 0; i < ARRAY_SIZE(dboost.state); ++i) { + INIT_DELAYED_WORK(&dboost.state[i].work, dboost_disable_work); + if (i == PRIO_TWO_LITTLES) + dboost.state[i].active = 1; + else + dboost.state[i].active = 0; + } + init_waitqueue_head(&dboost.wq); + + dboost.thread = kthread_run(dboost_dvfs_hotplug_thread, &dboost, "dynamic_boost"); + if (IS_ERR(dboost.thread)) + return -EINVAL; + +#ifdef CONFIG_HAS_EARLYSUSPEND + dboost_early_suspend_handler.suspend = dboost_early_suspend; + dboost_early_suspend_handler.resume = dboost_late_resume; + register_early_suspend(&dboost_early_suspend_handler); +#endif //#ifdef CONFIG_HAS_EARLYSUSPEND + +#ifdef CONFIG_TOUCH_BOOST + ret = input_register_handler(&dboost_input_handler); + if (ret) + return ret; +#endif + + return 0; +} +late_initcall(dynamic_boost_init); + +static void __exit dynamic_boost_exit(void) +{ +#ifdef CONFIG_TOUCH_BOOST + input_unregister_handler(&dboost_input_handler); +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&dboost_early_suspend_handler); +#endif + + kthread_stop(dboost.thread); +} + +module_exit(dynamic_boost_exit); + +MODULE_AUTHOR("MediaTek Inc."); +MODULE_DESCRIPTION("'dynamic boost' - provide performance boost"); +MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mediatek/ext_disp/mt8127/debug.c b/drivers/misc/mediatek/ext_disp/mt8127/debug.c index c2bb0c4873f..b50f6b0f515 100644 --- a/drivers/misc/mediatek/ext_disp/mt8127/debug.c +++ b/drivers/misc/mediatek/ext_disp/mt8127/debug.c @@ -53,8 +53,6 @@ static char STR_HELP[] = "\n"; extern void hdmi_log_enable(int enable); -extern void init_hdmi_mmp_events(void); - // TODO: this is a temp debug solution //extern void hdmi_cable_fake_plug_in(void); //extern int hdmi_drv_init(void); @@ -142,10 +140,6 @@ static void process_dbg_opt(const char *opt) { hdmi_mmp_enable(1); } - else if (0 == strncmp(opt + 8, "init", 4)) - { - init_hdmi_mmp_events(); - } else if (0 == strncmp(opt + 8, "off", 3)) { hdmi_mmp_enable(0); diff --git a/drivers/misc/mediatek/ext_disp/mt8127/hdmitx.c b/drivers/misc/mediatek/ext_disp/mt8127/hdmitx.c index 2f3236910a0..45d0e198c85 100644 --- a/drivers/misc/mediatek/ext_disp/mt8127/hdmitx.c +++ b/drivers/misc/mediatek/ext_disp/mt8127/hdmitx.c @@ -255,6 +255,9 @@ typedef struct bool is_enabled; // whether HDMI is enabled or disabled by user bool is_force_disable; //used for camera scenario. bool is_clock_on; // DPI is running or not +#if 1 //def monica_porting + bool is_rdma_clock_on; /*rdma1 clock is running or not*/ +#endif atomic_t state; // HDMI_POWER_STATE state int lcm_width; // LCD write buffer width int lcm_height; // LCD write buffer height @@ -1425,14 +1428,51 @@ static int hdmi_rdma_update_kthread(void *data) int remove_buffer_cnt = 0; int using_buf_cnt = 0; + unsigned long timeout_cnt = 0; sched_setscheduler(current, SCHED_RR, ¶m); for (;;) { remove_buffer_cnt = 0; - - wait_event_interruptible(hdmi_rdma_update_wq, atomic_read(&hdmi_rdma_update_event)); + + if (wait_event_interruptible_timeout(hdmi_rdma_update_wq, atomic_read(&hdmi_rdma_update_event), HZ / 4) == 0) + { + unsigned long sleep_cnt = 0; + + if ((timeout_cnt < 3) || (0 == (timeout_cnt % 10))) + { + printk("[hdmi] sw rdma update. early_suspend=%d, %d (%lu)\n", is_early_suspended, p->is_clock_on, timeout_cnt); + } + + /* If HDMI_Buffer_List is cleared*/ + while (list_empty(&HDMI_Buffer_List)) + { + sleep_cnt ++; + msleep(20); + + if (0 == (sleep_cnt % 500)) + { + printk("[hdmi] list empty %lu, sleeping\n", sleep_cnt); + } + } + + if (sleep_cnt > 0) + { + printk("[hdmi] after sleep %lu, early_suspend=%d, %d (%lu)\n", sleep_cnt, is_early_suspended, p->is_clock_on, timeout_cnt); + } + + timeout_cnt ++; + } + else + { + if (timeout_cnt > 0) + { + printk("[hdmi] hw rdma update after %lu.\n", timeout_cnt); + timeout_cnt = 0; + } + } + atomic_set(&hdmi_rdma_update_event, 0); MMProfileLogEx(HDMI_MMP_Events.BufferUpdate, MMProfileFlagStart, p->is_clock_on, 1); @@ -1871,6 +1911,9 @@ static HDMI_STATUS hdmi_drv_init(void) p->output_video_resolution = hdmi_params->init_config.vformat; p->output_audio_format = hdmi_params->init_config.aformat; p->scaling_factor = hdmi_params->scaling_factor < 10 ? hdmi_params->scaling_factor : 10; +#if 1 //def monica_porting + p->is_rdma_clock_on = false; +#endif ///if (p->lcm_is_video_mode) { @@ -2357,14 +2400,7 @@ int hdmi_rdma_address_config(bool enable, hdmi_video_buffer_info buffer_info) gRDMASecure = buffer_info.security; hdmi_config_m4u(buffer_info.security); //Config M4U normal or secure disp_path_config_(&config, dp_mutex_dst); //RDMA1 will not be started and setted buffer address in this function for SVP - if (buffer_info.security) - { - hdmi_set_rdma_addr(hdmiSourceAddr, buffer_size, buffer_info.security); - } - else - { - DISP_REG_SET(0xa000 + DISP_REG_RDMA_MEM_START_ADDR, hdmiSourceAddr); - } + hdmi_set_rdma_addr(hdmiSourceAddr, buffer_size, buffer_info.security); //Really setting frame buffer address disp_path_release_mutex_(dp_mutex_dst); DPI_CHECK_RET(HDMI_DPI(_EnableClk)()); RDMAStart(1); //Start RDMA1 for HDMI Path @@ -2562,10 +2598,9 @@ static int hdmi_video_config(HDMI_VIDEO_RESOLUTION vformat, HDMI_VIDEO_INPUT_FOR #else RETIF(IS_HDMI_NOT_ON(), 0); #endif -#if 0//for debug using + hdmi_allocate_hdmi_buffer(); -#endif - ///hdmi_dst_display_path_config(true); + ///hdmi_dst_display_path_config(true); hdmi_fps_control_overlay = 0; hdmi_fps_control_dpi = 0; @@ -2843,11 +2878,17 @@ void hdmi_cec_state_callback(HDMI_CEC_STATE state) // enable/disable pll must be couple //hdmi_dpi_power_switch(true); - enable_clock(MT_CG_DISP0_SMI_COMMON , "HDMITX"); - enable_clock(MT_CG_DISP0_SMI_LARB0 , "HDMITX"); - enable_clock(MT_CG_DISP0_MUTEX_32K , "HDMITX"); - enable_clock(MT_CG_DISP0_DISP_RMDA1, "HDMITX"); - hdmi_drv->power_on(); +#if 1 //def monica_porting + if (!p->is_rdma_clock_on) { + enable_clock(MT_CG_DISP0_SMI_COMMON , "HDMITX"); + enable_clock(MT_CG_DISP0_SMI_LARB0 , "HDMITX"); + enable_clock(MT_CG_DISP0_MUTEX_32K , "HDMITX"); + enable_clock(MT_CG_DISP0_DISP_RMDA1, "HDMITX"); + p->is_rdma_clock_on = true; + } +#endif + + hdmi_drv->power_on(); // When camera is open, the state will only be changed when camera exits. // So we bypass state_reset here, if camera is open. @@ -2912,10 +2953,15 @@ void hdmi_cec_state_callback(HDMI_CEC_STATE state) memset(&temp, 0, sizeof(temp)); hdmi_rdma_address_config(false, temp); - disable_clock(MT_CG_DISP0_DISP_RMDA1, "HDMITX"); - disable_clock(MT_CG_DISP0_MUTEX_32K , "HDMITX"); - disable_clock(MT_CG_DISP0_SMI_LARB0 , "HDMITX"); - disable_clock(MT_CG_DISP0_SMI_COMMON , "HDMITX"); +#if 1 //def monica_porting + if (p->is_rdma_clock_on) { + disable_clock(MT_CG_DISP0_DISP_RMDA1, "HDMITX"); + disable_clock(MT_CG_DISP0_MUTEX_32K , "HDMITX"); + disable_clock(MT_CG_DISP0_SMI_LARB0 , "HDMITX"); + disable_clock(MT_CG_DISP0_SMI_COMMON , "HDMITX"); + p->is_rdma_clock_on = false; + } +#endif HDMI_LOG("hdmi set power state(%d) off\n",atomic_read(&p->state)); @@ -2957,8 +3003,12 @@ void hdmi_cec_state_callback(HDMI_CEC_STATE state) hdmi_drv->suspend(); SET_HDMI_STANDBY(); - - disp_module_clock_off(DISP_MODULE_RDMA1, "HDMI"); +#if 1 //def monica_porting + if (p->is_rdma_clock_on) { + disp_module_clock_off(DISP_MODULE_RDMA1, "HDMI"); + p->is_rdma_clock_on = false; + } +#endif up(&hdmi_update_mutex); if (hdmi_bufferdump_on > 0) @@ -2992,8 +3042,12 @@ void hdmi_cec_state_callback(HDMI_CEC_STATE state) printk("[hdmi][HDMI] can't get semaphore in %s()\n", __func__); return; } - - disp_module_clock_on(DISP_MODULE_RDMA1, "HDMI"); +#if 1 //def monica_porting + if (!p->is_rdma_clock_on) { + disp_module_clock_on(DISP_MODULE_RDMA1, "HDMI"); + p->is_rdma_clock_on = true; + } +#endif hdmi_dpi_power_switch(true); hdmi_drv->resume(); @@ -3637,7 +3691,7 @@ static long hdmi_ioctl_ex(struct file *file, unsigned int cmd, unsigned long arg int r = 0; #if defined(MTK_MT8193_HDMI_SUPPORT)|| defined(CONFIG_MTK_INTERNAL_HDMI_SUPPORT) hdmi_device_write w_info; -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)&&defined(CONFIG_MTK_DRM_KEY_MNG_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)&&defined(MTK_DRM_KEY_MNG_SUPPORT)) hdmi_hdcp_drmkey key; #else hdmi_hdcp_key key; @@ -3666,7 +3720,7 @@ static long hdmi_ioctl_ex(struct file *file, unsigned int cmd, unsigned long arg unsigned char pdata[16]; MHL_3D_INFO_T pv_3d_info; hdmi_para_setting data_info; -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)&&defined(CONFIG_MTK_DRM_KEY_MNG_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)&&defined(MTK_DRM_KEY_MNG_SUPPORT)) hdmi_hdcp_drmkey key; #else hdmi_hdcp_key key; diff --git a/drivers/misc/mediatek/fmradio/Makefile b/drivers/misc/mediatek/fmradio/Makefile index 17db57b62de..19889dc142d 100755 --- a/drivers/misc/mediatek/fmradio/Makefile +++ b/drivers/misc/mediatek/fmradio/Makefile @@ -10,9 +10,9 @@ subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/mach/$(MTK_PLATFORM)/incl # MT6628 FM driver #ifeq ($(CONFIG_MTK_FM_CHIP), MT6628_FM) -#$(warning feature_option=$(CONFIG_MTK_FM_CHIP)) +$(warning feature_option=$(CONFIG_MTK_FM_CHIP)) ifeq ($(findstring MT6628_FM,$(CONFIG_MTK_FM_CHIP)),MT6628_FM) -#$(warning MT6628_FM) +$(warning MT6628_FM) FM_CHIP := mt6628 FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) ccflags-y += -I$(src)/inc \ @@ -35,7 +35,7 @@ obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o $(FM_CHIP_PATH)_fm_cmd.o \ $(FM_CHIP_PATH)_fm_config.o mtk_fm_drv-objs += $(mt6628-objs) -#$(warning $(mtk_fm_drv-objs)) +$(warning $(mtk_fm_drv-objs)) #obj-$(CONFIG_MTK_FM) += private/ endif @@ -43,7 +43,7 @@ endif #ifeq ($(CONFIG_MTK_FM_CHIP), MT6620_FM) ifeq ($(findstring MT6620_FM,$(CONFIG_MTK_FM_CHIP)),MT6620_FM) -#$(warning MT6620_FM) +$(warning MT6620_FM) FM_CHIP := mt6620 FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) ccflags-y += -I$(src)/inc \ @@ -66,7 +66,7 @@ ifeq ($(findstring MT6620_FM,$(CONFIG_MTK_FM_CHIP)),MT6620_FM) $(FM_CHIP_PATH)_fm_cmd.o \ $(FM_CHIP_PATH)_fm_config.o mtk_fm_drv-objs += $(mt6620-objs) -#$(warning $(mtk_fm_drv-objs)) +$(warning $(mtk_fm_drv-objs)) #obj-$(CONFIG_MTK_FM) += private/ endif #$(foreach each_chip, $(CONFIG_MTK_FM_CHIP),$(eval $(call build_speical_fm_driver,$(each_chip)))) @@ -75,7 +75,7 @@ endif # MT6627 FM driver ifeq ($(findstring MT6627_FM,$(CONFIG_MTK_FM_CHIP)),MT6627_FM) -#$(warning MT6627_FM) +$(warning MT6627_FM) FM_CHIP := mt6627 FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) ccflags-y += -DMT6627_FM @@ -99,18 +99,17 @@ ifeq ($(findstring MT6627_FM,$(CONFIG_MTK_FM_CHIP)),MT6627_FM) $(FM_CHIP_PATH)_fm_cmd.o \ $(FM_CHIP_PATH)_fm_config.o mtk_fm_drv-objs += $(mt6627-objs) -#$(warning $(mtk_fm_drv-objs)) +$(warning $(mtk_fm_drv-objs)) #obj-$(CONFIG_MTK_FM) += private/ endif # MT6625 FM driver ifeq ($(findstring MT6625_FM,$(CONFIG_MTK_FM_CHIP)),MT6625_FM) -#$(warning MT6627_FM) +$(warning MT6627_FM) FM_CHIP := mt6627 FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) ccflags-y += -DMT6627_FM - ccflags-y += -DMT6625_FM ccflags-y += -I$(src)/inc \ -I$(src)/$(FM_CHIP)/inc \ -I$(src)/../connectivity/conn_soc/common/include \ @@ -131,13 +130,13 @@ ifeq ($(findstring MT6625_FM,$(CONFIG_MTK_FM_CHIP)),MT6625_FM) $(FM_CHIP_PATH)_fm_cmd.o \ $(FM_CHIP_PATH)_fm_config.o mtk_fm_drv-objs += $(mt6627-objs) -#$(warning $(mtk_fm_drv-objs)) +$(warning $(mtk_fm_drv-objs)) #obj-$(CONFIG_MTK_FM) += private/ endif # MT6630 FM driver ifeq ($(findstring MT6630_FM,$(CONFIG_MTK_FM_CHIP)),MT6630_FM) -#$(warning MT6630_FM) +$(warning MT6630_FM) FM_CHIP := mt6630 FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP) ccflags-y += -DMT6630_FM @@ -161,7 +160,7 @@ ifeq ($(findstring MT6630_FM,$(CONFIG_MTK_FM_CHIP)),MT6630_FM) $(FM_CHIP_PATH)_fm_cmd.o \ $(FM_CHIP_PATH)_fm_config.o mtk_fm_drv-objs += $(mt6630-objs) -#$(warning $(mtk_fm_drv-objs)) +$(warning $(mtk_fm_drv-objs)) #obj-$(CONFIG_MTK_FM) += private/ endif diff --git a/drivers/misc/mediatek/fmradio/core/fm_main.c b/drivers/misc/mediatek/fmradio/core/fm_main.c index 509593ac02a..c153ff14e78 100644 --- a/drivers/misc/mediatek/fmradio/core/fm_main.c +++ b/drivers/misc/mediatek/fmradio/core/fm_main.c @@ -160,7 +160,7 @@ fm_s32 fm_set_stat(struct fm *fmp, int which, bool stat) if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK); - if(which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0]))) + if(which >= 0 && which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0]))) { g_fm_stat[which] = stat; WCN_DBG(FM_DBG | MAIN, "fm set stat object=%d, stat=%d\n", which, stat); @@ -182,7 +182,7 @@ fm_s32 fm_get_stat(struct fm *fmp, int which, bool *stat) FMR_ASSERT(stat); if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK); - if(which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0]))) + if(which >= 0 && which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0]))) { *stat = g_fm_stat[which]; WCN_DBG(FM_DBG | MAIN, "fm get stat object=%d, stat=%d\n", which, *stat); diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c index c0d5f6917af..077a65ae16a 100644 --- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c +++ b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c @@ -197,6 +197,7 @@ fm_s32 mt6627_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size) pkt_size = 4; /* 2,turn on top clock */ + pkt_size += fm_bop_top_write(0xC0, 0x38200000, &buf[pkt_size], buf_size - pkt_size); /* enable bgldo */ pkt_size += fm_bop_top_write(0xA10, 0xFFFFFFFF, &buf[pkt_size], buf_size - pkt_size); /* wr a10 ffffffff */ /* 3,enable MTCMOS */ pkt_size += fm_bop_top_write(0x60, 0x00000030, &buf[pkt_size], buf_size - pkt_size); /* wr 60 30 */ diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c index fa958cf32aa..e7e33ff153b 100644 --- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c +++ b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c @@ -673,9 +673,7 @@ static fm_s32 mt6627_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) fm_s32 ret = 0; fm_u16 pkt_size; fm_u16 tmp_reg = 0; -#if defined(MT6625_FM) fm_u32 host_reg = 0; -#endif const fm_s8 *path_patch = NULL; const fm_s8 *path_coeff = NULL; @@ -695,7 +693,7 @@ static fm_s32 mt6627_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) WCN_DBG(FM_ALT | CHIP, " pwrup set CSPI failed\n"); return ret; } -#if defined(MT6625_FM) + ret = mt6627_host_read(0x80101030,&host_reg); if (ret) { WCN_DBG(FM_ALT | CHIP, " pwrup read 0x80100030 failed\n"); @@ -706,19 +704,7 @@ static fm_s32 mt6627_PowerUp(fm_u16 *chip_id, fm_u16 *device_id) WCN_DBG(FM_ALT | CHIP, " pwrup enable top_ck_en_adie failed\n"); return ret; } - - /* enable bgldo */ - ret = mt6627_top_read(0x00c0, &tmp_reg); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "power up read top 0xc0 failed\n"); - return ret; - } - ret = mt6627_top_write(0x00c0, tmp_reg|(0x3<<27)); - if (ret) { - WCN_DBG(FM_ERR | CHIP, "power up write top 0xc0 failed\n"); - return ret; - } -#endif + if (FM_LOCK(cmd_buf_lock)) return (-FM_ELOCK); pkt_size = mt6627_pwrup_clock_on(cmd_buf, TX_BUF_SIZE); @@ -881,7 +867,7 @@ static fm_s32 mt6627_PowerDown(void) /* FIX_ME, disable ext interrupt */ mt6627_write(FM_MAIN_EXTINTRMASK, 0x00); -#if defined(MT6625_FM) + ret = mt6627_host_read(0x80101030,&host_reg); if (ret) { WCN_DBG(FM_ALT | CHIP, " pwroff read 0x80100030 failed\n"); @@ -892,7 +878,6 @@ static fm_s32 mt6627_PowerDown(void) WCN_DBG(FM_ALT | CHIP, " pwroff diable top_ck_en_adie failed\n"); return ret; } -#endif /* rssi_th_set = fm_false; */ return ret; @@ -984,10 +969,6 @@ static fm_bool mt6627_SetFreq(fm_u16 freq) return fm_false; } - /* enable connsys FM 2 wire RX */ - mt6627_write(0x9B, 0xF9AB); - mt6627_host_write(0x80101054, 0x00003f35); - if ((mt6627_hw_info.chip_id == 0x6625) && ((mtk_wcn_wmt_chipid_query() == 0x6592) || (mtk_wcn_wmt_chipid_query() == 0x6752))) { if (mt6627_I2S_hopping_check(freq)) { /* set i2s TX desense mode */ diff --git a/drivers/misc/mediatek/freqhopping/mt_freqhopping_drv.c b/drivers/misc/mediatek/freqhopping/mt_freqhopping_drv.c index b7c5b5fbdcf..5c0da031f3c 100644 --- a/drivers/misc/mediatek/freqhopping/mt_freqhopping_drv.c +++ b/drivers/misc/mediatek/freqhopping/mt_freqhopping_drv.c @@ -306,7 +306,6 @@ static ssize_t freqhopping_userdefine_proc_write(struct file *file, const char * if (fh_ctl.pll_id >= FH_PLL_COUNT) return -1; - if( p1 == FH_CMD_ENABLE){ ret = mt_fh_enable_usrdef(&fh_ctl); if(ret){ @@ -431,7 +430,7 @@ static ssize_t freqhopping_status_proc_write(struct file *file, const char *buff fh_ctl.ssc_setting.dt= 0; fh_ctl.ssc_setting.upbnd= 0; fh_ctl.ssc_setting.lowbnd= 0; - + /* Check validity of PLL ID */ if (fh_ctl.pll_id >= FH_PLL_COUNT) return -1; @@ -454,7 +453,7 @@ static int freqhopping_debug_proc_read(struct seq_file* m, void* v) arg.m = m; arg.v = v; arg.pll = g_fh_drv_pll; - //g_p_fh_hal_drv->ioctl(FH_IO_PROC_READ, &arg); + g_p_fh_hal_drv->ioctl(FH_IO_PROC_READ, &arg); return 0; #else FH_MSG("EN: %s",__func__); @@ -541,7 +540,6 @@ static ssize_t freqhopping_debug_proc_write(struct file *file, const char *buffe if (fh_ctl.pll_id >= FH_PLL_COUNT) return -1; - if (cmd < FH_CMD_INTERNAL_MAX_CMD) { mt_freqhopping_ioctl(NULL,cmd,(unsigned long)(&fh_ctl)); } @@ -1006,7 +1004,7 @@ int mt_freqhopping_devctl(unsigned int cmd, void* args) return 1; } - //g_p_fh_hal_drv->ioctl(cmd, args); + g_p_fh_hal_drv->ioctl(cmd, args); return 0; } diff --git a/drivers/misc/mediatek/gpio/mt8127/mt_gpio_debug.c b/drivers/misc/mediatek/gpio/mt8127/mt_gpio_debug.c index 0320771bdab..3d30fc4504e 100644 --- a/drivers/misc/mediatek/gpio/mt8127/mt_gpio_debug.c +++ b/drivers/misc/mediatek/gpio/mt8127/mt_gpio_debug.c @@ -673,7 +673,6 @@ ssize_t mt_gpio_store_pin(struct device* dev, struct device_attribute *attr, int pin; int mode, pullsel, dout, pullen, dir, ies; u32 num,src,div; - char md_str[128]="GPIO_MD_TEST"; //struct mt_gpio_obj *obj = (struct mt_gpio_obj*)dev_get_drvdata(dev); if (!strncmp(buf, "-h", 2)) { GPIOMSG("cat pin #show all pin setting\n"); @@ -736,10 +735,6 @@ ssize_t mt_gpio_store_pin(struct device* dev, struct device_attribute *attr, gpio_dump_regs(); }else if (!strncmp(buf, "-d", 2)) { mt_gpio_dump(); - } else if (!strncmp(buf, "-md", 3)) { - buf +=3; - sscanf(buf,"%s",md_str); - mt_get_md_gpio_debug(md_str); } else if (!strncmp(buf, "-k", 2)) { buf += 2; if (!strncmp(buf, "s", 1) && (3 == sscanf(buf+1, "%d %d %d", &num, &src, &div))) diff --git a/drivers/misc/mediatek/gps/gps.c b/drivers/misc/mediatek/gps/gps.c index 41faaefc6f6..1cc093774a0 100644 --- a/drivers/misc/mediatek/gps/gps.c +++ b/drivers/misc/mediatek/gps/gps.c @@ -820,6 +820,7 @@ static ssize_t mt3326_gps_write(struct file *file, const char __user *buf, size_ { struct gps_data *dev = file->private_data; ssize_t ret = 0; + size_t copy_size = 0; GPS_TRC(); @@ -835,7 +836,8 @@ static ssize_t mt3326_gps_write(struct file *file, const char __user *buf, size_ if (down_interruptible(&dev->sem)) return -ERESTARTSYS; - if (copy_from_user(dev->dat_buf, buf, count)) { + copy_size = min(count, sizeof(dev->dat_buf)); + if (copy_from_user(dev->dat_buf, buf, copy_size)) { GPS_DBG("copy_from_user error"); ret = -EFAULT; } else { diff --git a/drivers/misc/mediatek/gpu/ged/src/ged_main.c b/drivers/misc/mediatek/gpu/ged/src/ged_main.c index bca785bc4c5..3843d280b54 100644 --- a/drivers/misc/mediatek/gpu/ged/src/ged_main.c +++ b/drivers/misc/mediatek/gpu/ged/src/ged_main.c @@ -84,16 +84,10 @@ static long ged_dispatch(GED_BRIDGE_PACKAGE *psBridgePackageKM) typedef int (ged_bridge_func_type)(void*, void*); ged_bridge_func_type* pFunc = NULL; - /* We make sure the both size and the sum of them are GE 0 integer. - * The sum will not overflow to zero, because we will get zero from two GE 0 integers - * if and only if they are both zero in a 2's complement numeral system. - * That is: if overflow happen, the sum will be a negative number. - */ if (psBridgePackageKM->i32InBufferSize >= 0 && psBridgePackageKM->i32OutBufferSize >= 0 && psBridgePackageKM->i32InBufferSize + psBridgePackageKM->i32OutBufferSize >= 0 && psBridgePackageKM->i32InBufferSize + psBridgePackageKM->i32OutBufferSize - < GED_IOCTL_PARAM_BUF_SIZE) - { + < GED_IOCTL_PARAM_BUF_SIZE) { pvInt = gvIOCTLParamBuf; pvOut = (void*)((char*)pvInt + (uintptr_t)psBridgePackageKM->i32InBufferSize); if (psBridgePackageKM->i32InBufferSize > 0) diff --git a/drivers/misc/mediatek/gpu/mt8127/Makefile b/drivers/misc/mediatek/gpu/mt8127/Makefile old mode 100755 new mode 100644 index 38f7c3ef772..fe3b37e409c --- a/drivers/misc/mediatek/gpu/mt8127/Makefile +++ b/drivers/misc/mediatek/gpu/mt8127/Makefile @@ -1 +1,13 @@ +# +# Copyright (C) 2015 MediaTek 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# obj-y += mali/ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild old mode 100755 new mode 100644 index 7f6abae267c..f49e1944dcf --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild @@ -1,11 +1,11 @@ # -# This confidential and proprietary software may be used only as -# authorised by a licensing agreement from ARM Limited -# (C) COPYRIGHT 2007-2011 ARM Limited -# ALL RIGHTS RESERVED -# The entire notice above must be reproduced on all authorised -# copies and copies may only be made to the extent permitted -# by a licensing agreement from ARM Limited. +# Copyright (C) 2010-2011 ARM Limited. All rights reserved. +# +# This program is free software and is provided to you under the terms of the GNU General Public License version 2 +# as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. +# +# A copy of the licence is included with the program, and can also be obtained from Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # This file is called by the Linux build system. @@ -202,7 +202,7 @@ ccflags-y += -DSVN_REV_STRING=\"$(DRIVER_REV)\" ccflags-y += -I$(srctree)/drivers/staging/android VERSION_STRINGS := -VERSION_STRINGS += API_VERSION=$(shell grep "\#define _MALI_API_VERSION" $(srctree)/$(DRIVER_DIR)/include/linux/mali/mali_utgard_uk_types.h | cut -d' ' -f 3 ) +VERSION_STRINGS += API_VERSION=$(shell cd $(DRIVER_DIR); grep "\#define _MALI_API_VERSION" $(FILES_PREFIX)include/linux/mali/mali_utgard_uk_types.h | cut -d' ' -f 3 ) VERSION_STRINGS += REPO_URL=$(REPO_URL) VERSION_STRINGS += REVISION=$(DRIVER_REV) VERSION_STRINGS += CHANGED_REVISION=$(CHANGED_REVISION) diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-env b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-env old mode 100755 new mode 100644 index 1e4f3dba6f7..3c6d4c191af --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-env +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-env @@ -1,3 +1,15 @@ +# +# Copyright (C) 2015 MediaTek 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# #clouds add VER:=eng ifneq ($(strip $(TARGET_BUILD_VARIANT)),) @@ -28,8 +40,8 @@ endif #CONFIG_PM_RUNTIME := y CONFIG_DMA_SHARED_BUFFER := y #CONFIG_MALI400_UMP := y -#CONFIG_MALI400_PROFILING := y -#CONFIG_MALI400_INTERNAL_PROFILING := y +CONFIG_MALI400_PROFILING := y +CONFIG_MALI400_INTERNAL_PROFILING := y CONFIG_SYNC := y ccflags-y += -DCONFIG_SYNC diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-src b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-src old mode 100755 new mode 100644 index 85b00338d8a..6c6caaa36a7 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-src +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Kbuild-mtk-custom-src @@ -1,3 +1,15 @@ +# +# Copyright (C) 2015 MediaTek 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# #mtk custom port diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Makefile b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Makefile old mode 100755 new mode 100644 index 022ca53ac12..89f03767121 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/Makefile +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/Makefile @@ -1,11 +1,11 @@ # -# This confidential and proprietary software may be used only as -# authorised by a licensing agreement from ARM Limited -# (C) COPYRIGHT 2007-2013 ARM Limited -# ALL RIGHTS RESERVED -# The entire notice above must be reproduced on all authorised -# copies and copies may only be made to the extent permitted -# by a licensing agreement from ARM Limited. +# Copyright (C) 2010-2014 ARM Limited. All rights reserved. +# +# This program is free software and is provided to you under the terms of the GNU General Public License version 2 +# as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. +# +# A copy of the licence is included with the program, and can also be obtained from Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # USE_UMPV2=0 diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.c index c8f4887587a..a867ee915d0 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_broadcast.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.h index 472d9bc0540..6c7472ce32a 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_broadcast.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.c index 94cc5a7554f..7f4ea8cf1be 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_dlbu.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.h index 597a9088f54..66631e1fe66 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dlbu.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_DLBU_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.c index 2fb8750b543..e9aa9777fdd 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.h index e62b7b9f864..11da1a56e2f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_dma.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_DMA_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.c index 0572fded0ee..9a1e7fdbd90 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_gp.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.h index b9a2762df64..b309b306929 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_GP_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.c index 1e74d302326..c43be71bb0c 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_gp_job.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.h index b30bcfd589d..10cb5f0af63 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_job.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_GP_JOB_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.c index 2ade2c40c9f..0a679275011 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_gp_scheduler.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.h index 9a98f0aa0f9..84a096c1fac 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_gp_scheduler.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_GP_SCHEDULER_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.c index 94ce122f7ac..40dc037a736 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.h index ba86796711b..a16f3a2b158 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_group.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_GROUP_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.c index fcde1438e08..e2dda38304e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_hw_core.h" @@ -13,6 +13,9 @@ #include "mali_kernel_common.h" #include "mali_osk_mali.h" +#define MAX_RECORD_CORE 64 +static struct mali_hw_core * dump_core_list[MAX_RECORD_CORE] = {0}; +static int dump_core_idx = 0; _mali_osk_errcode_t mali_hw_core_create(struct mali_hw_core *core, const _mali_osk_resource_t *resource, u32 reg_size) { core->phys_addr = resource->base; @@ -25,6 +28,20 @@ _mali_osk_errcode_t mali_hw_core_create(struct mali_hw_core *core, const _mali_o if (_MALI_OSK_ERR_OK == _mali_osk_mem_reqregion(core->phys_addr, core->size, core->description)) { core->mapped_registers = _mali_osk_mem_mapioregion(core->phys_addr, core->size, core->description); if (NULL != core->mapped_registers) { + MALI_DEBUG_PRINT(2, ("SUCC map register for %s, Virt: %p, Size: 0x%x, Phy: %p\n", core->description, core->mapped_registers, reg_size, core->phys_addr)); + if(dump_core_idx < MAX_RECORD_CORE) { + dump_core_list[dump_core_idx] = core; + dump_core_idx++; + } else { + /* find a deleted item, normally cores are created once on probe */ + int i; + for(i = 0; i < MAX_RECORD_CORE; i++) { + if(dump_core_list[i] == NULL) { + dump_core_list[i] = core; + } + } + MALI_DEBUG_PRINT(2, ("Warnning, out of recorded cores %d\n", dump_core_idx )); + } return _MALI_OSK_ERR_OK; } else { MALI_PRINT_ERROR(("Failed to map memory region for core %s at phys_addr 0x%08X\n", core->description, core->phys_addr)); @@ -39,7 +56,35 @@ _mali_osk_errcode_t mali_hw_core_create(struct mali_hw_core *core, const _mali_o void mali_hw_core_delete(struct mali_hw_core *core) { + int i; + for(i = 0; i < dump_core_idx; i++){ + if(core == dump_core_list[i]) { + dump_core_list[i] = NULL; + break; + } + } _mali_osk_mem_unmapioregion(core->phys_addr, core->size, core->mapped_registers); core->mapped_registers = NULL; _mali_osk_mem_unreqregion(core->phys_addr, core->size); } + +void mali_hw_core_dump(){ + unsigned long addr; + u32 val; + int i; + for(i = 0; i < dump_core_idx; i ++) { + struct mali_hw_core * core = dump_core_list[i]; + if(core && core->mapped_registers) { + MALI_DEBUG_PRINT(2, ("Mali HW core dump : Start ---- %s \n", core->description)); + for(addr = (unsigned long)core->mapped_registers; addr - (unsigned long)core->mapped_registers < core->size; addr += 4) { + val = *(volatile u32 *)addr; + /*Only show none zero*/ + if(val) { + MALI_DEBUG_PRINT(2, ("[0x%08x] -> 0x%08x\n", addr - (unsigned long)core->mapped_registers + core->phys_addr, *(volatile u32 *)addr)); + } + } + MALI_DEBUG_PRINT(2, ("Mali HW core dump : End ----- %s \n", core->description)); + } + } +} + diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.h index 66e9b42fe0a..3eb5aa6d85a 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_hw_core.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_HW_CORE_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_common.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_common.h index ca5a34fd305..884d9a7d629 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_common.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_common.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_KERNEL_COMMON_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.c index 38b788485e6..9bce04e2a82 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" @@ -1294,6 +1294,12 @@ _mali_osk_errcode_t _mali_ukk_open(void **context) _MALI_OSK_INIT_LIST_HEAD(&session->pp_job_fb_lookup_list[i]); } + session->pid = _mali_osk_get_pid(); + session->comm = _mali_osk_get_comm(); + + session->max_mali_mem_allocated = 0; + _mali_osk_memset(session->mali_mem_array, 0, sizeof(size_t) * MALI_MEM_TYPE_MAX); + *context = (void*)session; /* Add session to the list of all sessions. */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.h index f0c0b0f69d7..442a11d43bd 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_core.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_KERNEL_CORE_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.c index a3f70262f13..0dbf05ccf58 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.c @@ -1,17 +1,19 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" #include "mali_kernel_descriptor_mapping.h" #include "mali_osk.h" #include "mali_osk_bitops.h" +#include "mali_memory_types.h" +#include "mali_session.h" #define MALI_PAD_INT(x) (((x) + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1)) @@ -63,6 +65,8 @@ _mali_osk_errcode_t mali_descriptor_mapping_allocate_mapping(mali_descriptor_map { _mali_osk_errcode_t err = _MALI_OSK_ERR_FAULT; int new_descriptor; + struct mali_session_data *session; + mali_mem_allocation *descriptor; MALI_DEBUG_ASSERT_POINTER(map); MALI_DEBUG_ASSERT_POINTER(odescriptor); @@ -89,6 +93,19 @@ _mali_osk_errcode_t mali_descriptor_mapping_allocate_mapping(mali_descriptor_map _mali_osk_set_nonatomic_bit(new_descriptor, map->table->usage); map->table->mappings[new_descriptor] = target; *odescriptor = new_descriptor; + + /* To calculate the mali mem usage for the session */ + descriptor = (mali_mem_allocation *)target; + session = descriptor->session; + + MALI_DEBUG_ASSERT_POINTER(session); + + session->mali_mem_array[descriptor->type] += descriptor->size; + if ((MALI_MEM_OS == descriptor->type || MALI_MEM_BLOCK == descriptor->type) && + (session->mali_mem_array[MALI_MEM_OS] + session->mali_mem_array[MALI_MEM_BLOCK] > session->max_mali_mem_allocated)) { + session->max_mali_mem_allocated = session->mali_mem_array[MALI_MEM_OS] + session->mali_mem_array[MALI_MEM_BLOCK]; + } + err = _MALI_OSK_ERR_OK; unlock_and_exit: @@ -141,16 +158,29 @@ _mali_osk_errcode_t mali_descriptor_mapping_set(mali_descriptor_mapping * map, i void *mali_descriptor_mapping_free(mali_descriptor_mapping * map, int descriptor) { void *old_value = NULL; + mali_mem_allocation *tmp_descriptor; + struct mali_session_data *session; _mali_osk_mutex_rw_wait(map->lock, _MALI_OSK_LOCKMODE_RW); - if ( (descriptor >= 0) && (descriptor < map->current_nr_mappings) && _mali_osk_test_bit(descriptor, map->table->usage) ) { + if ((descriptor >= 0) && (descriptor < map->current_nr_mappings) && _mali_osk_test_bit(descriptor, map->table->usage)) { old_value = map->table->mappings[descriptor]; map->table->mappings[descriptor] = NULL; _mali_osk_clear_nonatomic_bit(descriptor, map->table->usage); } + if (NULL != old_value) { + tmp_descriptor = (mali_mem_allocation *)old_value; + session = tmp_descriptor->session; + + MALI_DEBUG_ASSERT_POINTER(session); + + MALI_DEBUG_ASSERT(session->mali_mem_array[tmp_descriptor->type] >= tmp_descriptor->size); + + session->mali_mem_array[tmp_descriptor->type] -= tmp_descriptor->size; + } _mali_osk_mutex_rw_signal(map->lock, _MALI_OSK_LOCKMODE_RW); return old_value; + } static mali_descriptor_table * descriptor_table_alloc(int count) diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.h index 59115bdd9bf..50db72b501b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_descriptor_mapping.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.c index 4c3e85d3cdf..4254fd94580 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_utilization.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.h index 73e6a4bfbee..de279a22d4e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_utilization.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_KERNEL_UTILIZATION_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_vsync.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_vsync.c index e7dc3dd64dd..6e141bd4795 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_vsync.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_kernel_vsync.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.c index f7f91f85a79..3410a6f44e0 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" #include "mali_osk.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.h index 5d979ad3617..1e065290506 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_l2_cache.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_KERNEL_L2_CACHE_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.c index 159902fcdb7..55febb2722d 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_mem_validation.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.h index 4a247ae79e3..3f2898d719e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mem_validation.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_MEM_VALIDATION_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.c index 92b088835e5..c87bdb5b6da 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.h index d11748c93fb..85f4d45bd93 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_MMU_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.c index 1439d7b21c2..246c85eeda6 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.h index 0db8a76f2ff..69e0e5bd8b1 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_mmu_page_directory.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_MMU_PAGE_DIRECTORY_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk.h index a8a71d018e9..e05c08359a1 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** @@ -16,6 +16,7 @@ #ifndef __MALI_OSK_H__ #define __MALI_OSK_H__ +#include #include "mali_osk_types.h" #include "mali_osk_specific.h" /* include any per-os specifics */ #include "mali_osk_locks.h" @@ -1226,6 +1227,17 @@ void _mali_osk_dbgmsg( const char *fmt, ... ); */ u32 _mali_osk_snprintf( char *buf, u32 size, const char *fmt, ... ); +/** @brief Print fmt into print_ctx. + * + * The interpretation of \a fmt is the same as the \c format parameter in + * _mali_osu_vsnprintf(). + * + * @param print_ctx a pointer to the result file buffer + * @param fmt a _mali_osu_vsnprintf() style format string + * @param ... a variable-number of parameters suitable for \a fmt + */ +#define _mali_osk_ctxprintf seq_printf + /** @brief Abnormal process abort. * * Terminates the caller-process if this function is called. @@ -1255,6 +1267,13 @@ void _mali_osk_break(void); */ u32 _mali_osk_get_pid(void); +/** @brief Return an name for calling process. + * + * @return name for calling process. + */ +char *_mali_osk_get_comm(void); + + /** @brief Return an identificator for calling thread. * * @return Identificator for calling thread. diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_bitops.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_bitops.h index f1ddc2ca190..e177b09d660 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_bitops.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_bitops.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_list.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_list.h index c44013f6743..62e7b0a5028 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_list.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_list.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_mali.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_mali.h index b6e3c62e42a..5f8317423c1 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_mali.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_mali.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_profiling.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_profiling.h index a5136fd5273..bbc3652bd3e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_profiling.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_profiling.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_OSK_PROFILING_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_types.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_types.h index 313c49a48a0..5d3b3a2625c 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_types.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_osk_types.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.c index 58e7b622cd8..329226cc2f6 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_pm.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.h index 2c1063ab4a8..e43fc46a607 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PM_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.c index 486e8939f66..6e637876185 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.h index c5776dd01db..2e6137f3f9b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pm_domain.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PM_DOMAIN_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.c index 3f99465fe8e..b1cb55fc7c8 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.h index cdbd6742803..394e544a657 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pmu.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.c index bdfeb5cd016..2242c9fd823 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_pp_job.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.h index 839b43ebbf3..b093bbf58e3 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PP_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.c index 8e17ea13b7b..c90a4e564c4 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_pp.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.h index 7a259924181..f7567cd1dc0 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_job.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PP_JOB_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.c index 6b985d05ca8..5d7fe3663c3 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_pp_scheduler.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.h index 6167d8c25ac..dce4c6cf132 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_pp_scheduler.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PP_SCHEDULER_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.c index 2daa2e46946..ff0885dc8db 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_scheduler.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.h index 07252004b04..ef77114755f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_SCHEDULER_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler_types.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler_types.h index 5cbf598bfdc..060d976cdec 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler_types.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_scheduler_types.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_SCHEDULER_TYPES_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.c index 852f1e19539..512f00505c6 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.c @@ -1,16 +1,17 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_osk.h" #include "mali_osk_list.h" #include "mali_session.h" +#include "mali_ukk.h" _MALI_OSK_LIST_HEAD(mali_sessions); static u32 mali_session_count = 0; diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.h index ef8d5f5c9c8..16a2175e51d 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_session.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_SESSION_H__ @@ -15,6 +15,7 @@ #include "mali_kernel_descriptor_mapping.h" #include "mali_osk.h" #include "mali_osk_list.h" +#include "mali_memory_types.h" struct mali_timeline_system; struct mali_soft_system; @@ -46,6 +47,11 @@ struct mali_session_data { mali_bool is_aborting; /**< MALI_TRUE if the session is aborting, MALI_FALSE if not. */ mali_bool use_high_priority_job_queue; /**< If MALI_TRUE, jobs added from this session will use the high priority job queues. */ + u32 pid; + char *comm; + size_t mali_mem_array[MALI_MEM_TYPE_MAX]; /**< The array to record all mali mem types' usage for this session. */ + size_t max_mali_mem_allocated; /**< The past max mali memory usage for this session. */ + }; _mali_osk_errcode_t mali_session_initialize(void); @@ -91,4 +97,6 @@ MALI_STATIC_INLINE void mali_session_send_notification(struct mali_session_data u32 mali_session_max_window_num(void); #endif +void mali_session_memory_tracking(struct seq_file *print_ctx); + #endif /* __MALI_SESSION_H__ */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.c index b2bb8e389a9..ccbcc05e20e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_soft_job.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.h index 1a50dc168ad..9f31b6a1003 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_soft_job.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_SOFT_JOB_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.c index e11feee30b8..7772ee23193 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_spinlock_reentrant.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.h index 2dc7ab98670..634fa437125 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_spinlock_reentrant.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_SPINLOCK_REENTRANT_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.c index 651249fc20c..8c22f7c6f57 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_timeline.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.h index a5f16785335..fa45cbb60d8 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_TIMELINE_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.c index ab5cb00a40f..178d54fa34f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_timeline_fence_wait.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.h index 16d2f2c0cd4..5134578b7e3 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_fence_wait.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.c index bad18d35b8a..2839f595b59 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_timeline_sync_fence.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.h index 3d8e3a1cad8..e143ffc25ae 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_timeline_sync_fence.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_ukk.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_ukk.h index 5bc8e1b0491..2c0cb3abee6 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_ukk.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_ukk.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** @@ -601,6 +601,8 @@ _mali_osk_errcode_t _mali_ukk_sw_counters_report(_mali_uk_sw_counters_report_s * u32 _mali_ukk_report_memory_usage(void); +u32 _mali_ukk_report_total_memory_size(void); + u32 _mali_ukk_utilization_gp_pp(void); u32 _mali_ukk_utilization_gp(void); diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.c index c28a8d6317c..a38a45e3452 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.c @@ -1,11 +1,11 @@ -/** - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_osk.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.h index 547ffeeaf06..7b2f3df0523 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/common/mali_user_settings_db.h @@ -1,11 +1,11 @@ -/** - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_USER_SETTINGS_DB_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard.h index 4e457efca35..27efc2bde34 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_counters.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_counters.h index 7ea190ff87f..9b85fcd27ba 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_counters.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_counters.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _MALI_UTGARD_COUNTERS_H_ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_ioctl.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_ioctl.h index 08388683642..1c2fd5ad1bc 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_ioctl.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_ioctl.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_UTGARD_IOCTL_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_events.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_events.h index 0bc62d4279b..ac3a61cb8dc 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_events.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_events.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _MALI_UTGARD_PROFILING_EVENTS_H_ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_gator_api.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_gator_api.h index 918a3f32836..ce152a9fcd9 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_gator_api.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_profiling_gator_api.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_UTGARD_PROFILING_GATOR_API_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_uk_types.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_uk_types.h index 817f5a7b240..8bde0f9ea0c 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_uk_types.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/include/linux/mali/mali_utgard_uk_types.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/license/proprietary/mali_kernel_license.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/license/proprietary/mali_kernel_license.h deleted file mode 100644 index d3760d8056e..00000000000 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/license/proprietary/mali_kernel_license.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. - */ - -/** - * @file mali_kernel_license.h - * Defines for the macro MODULE_LICENSE. - */ - -#ifndef __MALI_KERNEL_LICENSE_H__ -#define __MALI_KERNEL_LICENSE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define MALI_KERNEL_LINUX_LICENSE "Proprietary" -#define MALI_LICENSE_IS_GPL 0 - -#ifdef __cplusplus -} -#endif - -#endif /* __MALI_KERNEL_LICENSE_H__ */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_device_pause_resume.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_device_pause_resume.c index 68a28f41aac..9bc813507b5 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_device_pause_resume.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_device_pause_resume.c @@ -1,11 +1,11 @@ -/** - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.c index bc2685d2388..53b94499124 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.c @@ -1,11 +1,11 @@ -/** - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.h index 149e4353f0e..35d6d785e02 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_linux.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_KERNEL_LINUX_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.c index 5bbbad3c986..54499c97fbd 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.c @@ -1,11 +1,11 @@ -/** - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ @@ -914,21 +914,31 @@ static const struct file_operations profiling_events_human_readable_fops = { #endif -static ssize_t memory_used_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +static int memory_debugfs_show(struct seq_file *s, void *private_data) { - char buf[64]; - size_t r; - u32 mem = _mali_ukk_report_memory_usage(); + /*seq_printf(s, "%-25s %-10s %-10s %-15s %-15s %-10s %-10s\n"\ + "==============================================================================================================\n", + "Name (:bytes)", "pid", "mali_mem", "max_mali_mem", + "external_mem", "ump_mem", "dma_mem"); + mali_session_memory_tracking(s);*/ + return 0; +} - r = snprintf(buf, 64, "%u\n", mem); - return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); + +static int memory_debugfs_open(struct inode *inode, struct file *file) +{ + return single_open(file, memory_debugfs_show, inode->i_private); } static const struct file_operations memory_usage_fops = { .owner = THIS_MODULE, - .read = memory_used_read, + .open = memory_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, }; + static ssize_t utilization_gp_pp_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) { char buf[64]; @@ -1371,7 +1381,7 @@ int mali_sysfs_register(const char *mali_dev_name) } } - debugfs_create_file("memory_usage", 0400, mali_debugfs_dir, NULL, &memory_usage_fops); + debugfs_create_file("gpu_memory", 0444, mali_debugfs_dir, NULL, &memory_usage_fops); debugfs_create_file("utilization_gp_pp", 0400, mali_debugfs_dir, NULL, &utilization_gp_pp_fops); debugfs_create_file("utilization_gp", 0400, mali_debugfs_dir, NULL, &utilization_gp_fops); diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.c.orig b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.c.orig new file mode 100644 index 00000000000..2afc7403c7f --- /dev/null +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.c.orig @@ -0,0 +1,1477 @@ +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + + +/** + * @file mali_kernel_sysfs.c + * Implementation of some sysfs data exports + */ + +#include +#include +#include +#include +#include "mali_kernel_license.h" +#include "mali_kernel_common.h" +#include "mali_ukk.h" + +#if MALI_LICENSE_IS_GPL + +#include +#include +#include +#include +#include +#include +#include "mali_kernel_sysfs.h" +#if defined(CONFIG_MALI400_INTERNAL_PROFILING) +#include +#include "mali_osk_profiling.h" +#endif + +#include +#include "mali_pm.h" +#include "mali_pmu.h" +#include "mali_group.h" +#include "mali_gp.h" +#include "mali_pp.h" +#include "mali_l2_cache.h" +#include "mali_hw_core.h" +#include "mali_kernel_core.h" +#include "mali_user_settings_db.h" +#include "mali_profiling_internal.h" +#include "mali_gp_job.h" +#include "mali_pp_job.h" +#include "mali_pp_scheduler.h" + +#define PRIVATE_DATA_COUNTER_MAKE_GP(src) (src) +#define PRIVATE_DATA_COUNTER_MAKE_PP(src) ((1 << 24) | src) +#define PRIVATE_DATA_COUNTER_MAKE_PP_SUB_JOB(src, sub_job) ((1 << 24) | (1 << 16) | (sub_job << 8) | src) +#define PRIVATE_DATA_COUNTER_IS_PP(a) ((((a) >> 24) & 0xFF) ? MALI_TRUE : MALI_FALSE) +#define PRIVATE_DATA_COUNTER_GET_SRC(a) (a & 0xFF) +#define PRIVATE_DATA_COUNTER_IS_SUB_JOB(a) ((((a) >> 16) & 0xFF) ? MALI_TRUE : MALI_FALSE) +#define PRIVATE_DATA_COUNTER_GET_SUB_JOB(a) (((a) >> 8) & 0xFF) + +#define POWER_BUFFER_SIZE 3 + +static struct dentry *mali_debugfs_dir = NULL; + +typedef enum { + _MALI_DEVICE_SUSPEND, + _MALI_DEVICE_RESUME, + _MALI_DEVICE_DVFS_PAUSE, + _MALI_DEVICE_DVFS_RESUME, + _MALI_MAX_EVENTS +} _mali_device_debug_power_events; + +static const char* const mali_power_events[_MALI_MAX_EVENTS] = { + [_MALI_DEVICE_SUSPEND] = "suspend", + [_MALI_DEVICE_RESUME] = "resume", + [_MALI_DEVICE_DVFS_PAUSE] = "dvfs_pause", + [_MALI_DEVICE_DVFS_RESUME] = "dvfs_resume", +}; + +static mali_bool power_always_on_enabled = MALI_FALSE; + +#ifdef CONFIG_PROC_FS +static struct proc_dir_entry *mali_pentry; + +static int proc_memoryusage_show(struct seq_file *m, void *v) +{ + seq_printf(m, "%u\n", _mali_ukk_report_memory_usage()); + + return 0; +} + +static int proc_memoryusage_open(struct inode *inode, struct file *file) +{ + return single_open(file, proc_memoryusage_show, NULL); +} + +static const struct file_operations proc_memoryusage_operations = { + .open = proc_memoryusage_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int proc_utilization_show(struct seq_file *m, void *v) +{ + unsigned long gpu, gp, pp; + + gpu = ((_mali_ukk_utilization_gp_pp()*100)/256); + gp = ((_mali_ukk_utilization_gp()*100)/256); + pp = ((_mali_ukk_utilization_pp()*100)/256); + + seq_printf(m, "gpu/gp/pp=%lu/%lu/%lu\n", gpu, gp, pp); + + return 0; +} + +static int proc_utilization_open(struct inode *inode, struct file *file) +{ + return single_open(file, proc_utilization_show, NULL); +} + +static const struct file_operations proc_utilization_operations = { + .open = proc_utilization_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void proc_mali_register(void) +{ + struct proc_dir_entry *mt_elsuspend_entry = NULL; + mali_pentry = proc_mkdir("mali", NULL); + MALI_DEBUG_PRINT(1, ("[%s] pentry=%p\n", __FUNCTION__, mali_pentry)); + + if (!mali_pentry) + return; + + proc_create("memory_usage", 0, mali_pentry, &proc_memoryusage_operations); + proc_create("utilization", 0, mali_pentry, &proc_utilization_operations); +} + + +static void proc_mali_unregister(void) +{ + if (!mali_pentry) + return; + + remove_proc_entry("memory_usage", mali_pentry); + remove_proc_entry("utilization", mali_pentry); + remove_proc_entry("mali", NULL); + mali_pentry = NULL; +} +#else +#define proc_mali_register() do{}while(0) +#define proc_mali_unregister() do{}while(0) +#endif + +static int open_copy_private_data(struct inode *inode, struct file *filp) +{ + filp->private_data = inode->i_private; + return 0; +} + +static ssize_t group_enabled_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) +{ + int r; + char buffer[64]; + struct mali_group *group; + + group = (struct mali_group *)filp->private_data; + MALI_DEBUG_ASSERT_POINTER(group); + + r = sprintf(buffer, "%u\n", mali_group_is_enabled(group) ? 1 : 0); + + return simple_read_from_buffer(buf, count, offp, buffer, r); +} + +static ssize_t group_enabled_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp) +{ + int r; + char buffer[64]; + unsigned long val; + struct mali_group *group; + + group = (struct mali_group *)filp->private_data; + MALI_DEBUG_ASSERT_POINTER(group); + + if (count >= sizeof(buffer)) { + return -ENOMEM; + } + + if (copy_from_user(&buffer[0], buf, count)) { + return -EFAULT; + } + buffer[count] = '\0'; + + r = strict_strtoul(&buffer[0], 10, &val); + if (0 != r) { + return -EINVAL; + } + + switch (val) { + case 1: + mali_group_enable(group); + break; + case 0: + mali_group_disable(group); + break; + default: + return -EINVAL; + break; + } + + *offp += count; + return count; +} + +static const struct file_operations group_enabled_fops = { + .owner = THIS_MODULE, + .open = open_copy_private_data, + .read = group_enabled_read, + .write = group_enabled_write, +}; + +static ssize_t hw_core_base_addr_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) +{ + int r; + char buffer[64]; + struct mali_hw_core *hw_core; + + hw_core = (struct mali_hw_core *)filp->private_data; + MALI_DEBUG_ASSERT_POINTER(hw_core); + + r = sprintf(buffer, "0x%08X\n", hw_core->phys_addr); + + return simple_read_from_buffer(buf, count, offp, buffer, r); +} + +static const struct file_operations hw_core_base_addr_fops = { + .owner = THIS_MODULE, + .open = open_copy_private_data, + .read = hw_core_base_addr_read, +}; + +static ssize_t profiling_counter_src_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + u32 is_pp = PRIVATE_DATA_COUNTER_IS_PP((u32)filp->private_data); + u32 src_id = PRIVATE_DATA_COUNTER_GET_SRC((u32)filp->private_data); + mali_bool is_sub_job = PRIVATE_DATA_COUNTER_IS_SUB_JOB((u32)filp->private_data); + u32 sub_job = PRIVATE_DATA_COUNTER_GET_SUB_JOB((u32)filp->private_data); + char buf[64]; + int r; + u32 val; + + if (MALI_TRUE == is_pp) { + /* PP counter */ + if (MALI_TRUE == is_sub_job) { + /* Get counter for a particular sub job */ + if (0 == src_id) { + val = mali_pp_job_get_pp_counter_sub_job_src0(sub_job); + } else { + val = mali_pp_job_get_pp_counter_sub_job_src1(sub_job); + } + } else { + /* Get default counter for all PP sub jobs */ + if (0 == src_id) { + val = mali_pp_job_get_pp_counter_global_src0(); + } else { + val = mali_pp_job_get_pp_counter_global_src1(); + } + } + } else { + /* GP counter */ + if (0 == src_id) { + val = mali_gp_job_get_gp_counter_src0(); + } else { + val = mali_gp_job_get_gp_counter_src1(); + } + } + + if (MALI_HW_CORE_NO_COUNTER == val) { + r = sprintf(buf, "-1\n"); + } else { + r = sprintf(buf, "%u\n", val); + } + + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static ssize_t profiling_counter_src_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + u32 is_pp = PRIVATE_DATA_COUNTER_IS_PP((u32)filp->private_data); + u32 src_id = PRIVATE_DATA_COUNTER_GET_SRC((u32)filp->private_data); + mali_bool is_sub_job = PRIVATE_DATA_COUNTER_IS_SUB_JOB((u32)filp->private_data); + u32 sub_job = PRIVATE_DATA_COUNTER_GET_SUB_JOB((u32)filp->private_data); + char buf[64]; + long val; + int ret; + + if (cnt >= sizeof(buf)) { + return -EINVAL; + } + + if (copy_from_user(&buf, ubuf, cnt)) { + return -EFAULT; + } + + buf[cnt] = 0; + + ret = strict_strtol(buf, 10, &val); + if (ret < 0) { + return ret; + } + + if (val < 0) { + /* any negative input will disable counter */ + val = MALI_HW_CORE_NO_COUNTER; + } + + if (MALI_TRUE == is_pp) { + /* PP counter */ + if (MALI_TRUE == is_sub_job) { + /* Set counter for a particular sub job */ + if (0 == src_id) { + mali_pp_job_set_pp_counter_sub_job_src0(sub_job, (u32)val); + } else { + mali_pp_job_set_pp_counter_sub_job_src1(sub_job, (u32)val); + } + } else { + /* Set default counter for all PP sub jobs */ + if (0 == src_id) { + mali_pp_job_set_pp_counter_global_src0((u32)val); + } else { + mali_pp_job_set_pp_counter_global_src1((u32)val); + } + } + } else { + /* GP counter */ + if (0 == src_id) { + mali_gp_job_set_gp_counter_src0((u32)val); + } else { + mali_gp_job_set_gp_counter_src1((u32)val); + } + } + + *ppos += cnt; + return cnt; +} + +static const struct file_operations profiling_counter_src_fops = { + .owner = THIS_MODULE, + .open = open_copy_private_data, + .read = profiling_counter_src_read, + .write = profiling_counter_src_write, +}; + +static ssize_t l2_l2x_counter_srcx_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos, u32 src_id) +{ + char buf[64]; + int r; + u32 val; + struct mali_l2_cache_core *l2_core = (struct mali_l2_cache_core *)filp->private_data; + + if (0 == src_id) { + val = mali_l2_cache_core_get_counter_src0(l2_core); + } else { + val = mali_l2_cache_core_get_counter_src1(l2_core); + } + + if (MALI_HW_CORE_NO_COUNTER == val) { + r = sprintf(buf, "-1\n"); + } else { + r = sprintf(buf, "%u\n", val); + } + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static ssize_t l2_l2x_counter_srcx_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos, u32 src_id) +{ + struct mali_l2_cache_core *l2_core = (struct mali_l2_cache_core *)filp->private_data; + char buf[64]; + long val; + int ret; + + if (cnt >= sizeof(buf)) { + return -EINVAL; + } + + if (copy_from_user(&buf, ubuf, cnt)) { + return -EFAULT; + } + + buf[cnt] = 0; + + ret = strict_strtol(buf, 10, &val); + if (ret < 0) { + return ret; + } + + if (val < 0) { + /* any negative input will disable counter */ + val = MALI_HW_CORE_NO_COUNTER; + } + + if (0 == src_id) { + mali_l2_cache_core_set_counter_src0(l2_core, (u32)val); + } else { + mali_l2_cache_core_set_counter_src1(l2_core, (u32)val); + } + + *ppos += cnt; + return cnt; +} + +static ssize_t l2_all_counter_srcx_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos, u32 src_id) +{ + char buf[64]; + long val; + int ret; + u32 l2_id; + struct mali_l2_cache_core *l2_cache; + + if (cnt >= sizeof(buf)) { + return -EINVAL; + } + + if (copy_from_user(&buf, ubuf, cnt)) { + return -EFAULT; + } + + buf[cnt] = 0; + + ret = strict_strtol(buf, 10, &val); + if (ret < 0) { + return ret; + } + + if (val < 0) { + /* any negative input will disable counter */ + val = MALI_HW_CORE_NO_COUNTER; + } + + l2_id = 0; + l2_cache = mali_l2_cache_core_get_glob_l2_core(l2_id); + while (NULL != l2_cache) { + if (0 == src_id) { + mali_l2_cache_core_set_counter_src0(l2_cache, (u32)val); + } else { + mali_l2_cache_core_set_counter_src1(l2_cache, (u32)val); + } + + /* try next L2 */ + l2_id++; + l2_cache = mali_l2_cache_core_get_glob_l2_core(l2_id); + } + + *ppos += cnt; + return cnt; +} + +static ssize_t l2_l2x_counter_src0_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + return l2_l2x_counter_srcx_read(filp, ubuf, cnt, ppos, 0); +} + +static ssize_t l2_l2x_counter_src1_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + return l2_l2x_counter_srcx_read(filp, ubuf, cnt, ppos, 1); +} + +static ssize_t l2_l2x_counter_src0_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + return l2_l2x_counter_srcx_write(filp, ubuf, cnt, ppos, 0); +} + +static ssize_t l2_l2x_counter_src1_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + return l2_l2x_counter_srcx_write(filp, ubuf, cnt, ppos, 1); +} + +static ssize_t l2_all_counter_src0_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + return l2_all_counter_srcx_write(filp, ubuf, cnt, ppos, 0); +} + +static ssize_t l2_all_counter_src1_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + return l2_all_counter_srcx_write(filp, ubuf, cnt, ppos, 1); +} + +static const struct file_operations l2_l2x_counter_src0_fops = { + .owner = THIS_MODULE, + .open = open_copy_private_data, + .read = l2_l2x_counter_src0_read, + .write = l2_l2x_counter_src0_write, +}; + +static const struct file_operations l2_l2x_counter_src1_fops = { + .owner = THIS_MODULE, + .open = open_copy_private_data, + .read = l2_l2x_counter_src1_read, + .write = l2_l2x_counter_src1_write, +}; + +static const struct file_operations l2_all_counter_src0_fops = { + .owner = THIS_MODULE, + .write = l2_all_counter_src0_write, +}; + +static const struct file_operations l2_all_counter_src1_fops = { + .owner = THIS_MODULE, + .write = l2_all_counter_src1_write, +}; + +static ssize_t power_always_on_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + unsigned long val; + int ret; + char buf[32]; + + cnt = min(cnt, sizeof(buf) - 1); + if (copy_from_user(buf, ubuf, cnt)) { + return -EFAULT; + } + buf[cnt] = '\0'; + + ret = strict_strtoul(buf, 10, &val); + if (0 != ret) { + return ret; + } + + /* Update setting (not exactly thread safe) */ + if (1 == val && MALI_FALSE == power_always_on_enabled) { + power_always_on_enabled = MALI_TRUE; + _mali_osk_pm_dev_ref_add(); + } else if (0 == val && MALI_TRUE == power_always_on_enabled) { + power_always_on_enabled = MALI_FALSE; + _mali_osk_pm_dev_ref_dec(); + } + + *ppos += cnt; + return cnt; +} + +static ssize_t power_always_on_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + if (MALI_TRUE == power_always_on_enabled) { + return simple_read_from_buffer(ubuf, cnt, ppos, "1\n", 2); + } else { + return simple_read_from_buffer(ubuf, cnt, ppos, "0\n", 2); + } +} + +static const struct file_operations power_always_on_fops = { + .owner = THIS_MODULE, + .read = power_always_on_read, + .write = power_always_on_write, +}; + +static ssize_t power_power_events_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + + if (!strncmp(ubuf,mali_power_events[_MALI_DEVICE_SUSPEND],strlen(mali_power_events[_MALI_DEVICE_SUSPEND]))) { + mali_pm_os_suspend(); + + } else if (!strncmp(ubuf,mali_power_events[_MALI_DEVICE_RESUME],strlen(mali_power_events[_MALI_DEVICE_RESUME]))) { + mali_pm_os_resume(); + } else if (!strncmp(ubuf,mali_power_events[_MALI_DEVICE_DVFS_PAUSE],strlen(mali_power_events[_MALI_DEVICE_DVFS_PAUSE]))) { + mali_dev_pause(); + } else if (!strncmp(ubuf,mali_power_events[_MALI_DEVICE_DVFS_RESUME],strlen(mali_power_events[_MALI_DEVICE_DVFS_RESUME]))) { + mali_dev_resume(); + } + *ppos += cnt; + return cnt; +} + +static loff_t power_power_events_seek(struct file *file, loff_t offset, int orig) +{ + file->f_pos = offset; + return 0; +} + +static const struct file_operations power_power_events_fops = { + .owner = THIS_MODULE, + .write = power_power_events_write, + .llseek = power_power_events_seek, +}; + +#if MALI_STATE_TRACKING +static int mali_seq_internal_state_show(struct seq_file *seq_file, void *v) +{ + u32 len = 0; + u32 size; + char *buf; + + size = seq_get_buf(seq_file, &buf); + + if(!size) { + return -ENOMEM; + } + + /* Create the internal state dump. */ + len = snprintf(buf+len, size-len, "Mali device driver %s\n", SVN_REV_STRING); + len += snprintf(buf+len, size-len, "License: %s\n\n", MALI_KERNEL_LINUX_LICENSE); + + len += _mali_kernel_core_dump_state(buf + len, size - len); + + seq_commit(seq_file, len); + + return 0; +} + +static int mali_seq_internal_state_open(struct inode *inode, struct file *file) +{ + return single_open(file, mali_seq_internal_state_show, NULL); +} + +static const struct file_operations mali_seq_internal_state_fops = { + .owner = THIS_MODULE, + .open = mali_seq_internal_state_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif /* MALI_STATE_TRACKING */ + +#if defined(CONFIG_MALI400_INTERNAL_PROFILING) +static ssize_t profiling_record_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + char buf[64]; + int r; + + r = sprintf(buf, "%u\n", _mali_internal_profiling_is_recording() ? 1 : 0); + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static ssize_t profiling_record_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + char buf[64]; + unsigned long val; + int ret; + + if (cnt >= sizeof(buf)) { + return -EINVAL; + } + + if (copy_from_user(&buf, ubuf, cnt)) { + return -EFAULT; + } + + buf[cnt] = 0; + + ret = strict_strtoul(buf, 10, &val); + if (ret < 0) { + return ret; + } + + if (val != 0) { + u32 limit = MALI_PROFILING_MAX_BUFFER_ENTRIES; /* This can be made configurable at a later stage if we need to */ + + /* check if we are already recording */ + if (MALI_TRUE == _mali_internal_profiling_is_recording()) { + MALI_DEBUG_PRINT(3, ("Recording of profiling events already in progress\n")); + return -EFAULT; + } + + /* check if we need to clear out an old recording first */ + if (MALI_TRUE == _mali_internal_profiling_have_recording()) { + if (_MALI_OSK_ERR_OK != _mali_internal_profiling_clear()) { + MALI_DEBUG_PRINT(3, ("Failed to clear existing recording of profiling events\n")); + return -EFAULT; + } + } + + /* start recording profiling data */ + if (_MALI_OSK_ERR_OK != _mali_internal_profiling_start(&limit)) { + MALI_DEBUG_PRINT(3, ("Failed to start recording of profiling events\n")); + return -EFAULT; + } + + MALI_DEBUG_PRINT(3, ("Profiling recording started (max %u events)\n", limit)); + } else { + /* stop recording profiling data */ + u32 count = 0; + if (_MALI_OSK_ERR_OK != _mali_internal_profiling_stop(&count)) { + MALI_DEBUG_PRINT(2, ("Failed to stop recording of profiling events\n")); + return -EFAULT; + } + + MALI_DEBUG_PRINT(2, ("Profiling recording stopped (recorded %u events)\n", count)); + } + + *ppos += cnt; + return cnt; +} + +static const struct file_operations profiling_record_fops = { + .owner = THIS_MODULE, + .read = profiling_record_read, + .write = profiling_record_write, +}; + +static void *profiling_events_start(struct seq_file *s, loff_t *pos) +{ + loff_t *spos; + + /* check if we have data avaiable */ + if (MALI_TRUE != _mali_internal_profiling_have_recording()) { + return NULL; + } + + spos = kmalloc(sizeof(loff_t), GFP_KERNEL); + if (NULL == spos) { + return NULL; + } + + *spos = *pos; + return spos; +} + +static void *profiling_events_next(struct seq_file *s, void *v, loff_t *pos) +{ + loff_t *spos = v; + + /* check if we have data avaiable */ + if (MALI_TRUE != _mali_internal_profiling_have_recording()) { + return NULL; + } + + /* check if the next entry actually is avaiable */ + if (_mali_internal_profiling_get_count() <= (u32)(*spos + 1)) { + return NULL; + } + + *pos = ++*spos; + return spos; +} + +static void profiling_events_stop(struct seq_file *s, void *v) +{ + kfree(v); +} + +static int profiling_events_show(struct seq_file *seq_file, void *v) +{ + loff_t *spos = v; + u32 index; + u64 timestamp; + u32 event_id; + u32 data[5]; + + index = (u32)*spos; + + /* Retrieve all events */ + if (_MALI_OSK_ERR_OK == _mali_internal_profiling_get_event(index, ×tamp, &event_id, data)) { + seq_printf(seq_file, "%llu %u %u %u %u %u %u\n", timestamp, event_id, data[0], data[1], data[2], data[3], data[4]); + return 0; + } + + return 0; +} + +static int profiling_events_show_human_readable(struct seq_file *seq_file, void *v) +{ +#define MALI_EVENT_ID_IS_HW(event_id) (((event_id & 0x00FF0000) >= MALI_PROFILING_EVENT_CHANNEL_GP0) && ((event_id & 0x00FF0000) <= MALI_PROFILING_EVENT_CHANNEL_PP7)) + + static u64 start_time = 0; + loff_t *spos = v; + u32 index; + u64 timestamp; + u32 event_id; + u32 data[5]; + + index = (u32)*spos; + + /* Retrieve all events */ + if (_MALI_OSK_ERR_OK == _mali_internal_profiling_get_event(index, ×tamp, &event_id, data)) { + seq_printf(seq_file, "%llu %u %u %u %u %u %u # ", timestamp, event_id, data[0], data[1], data[2], data[3], data[4]); + + if (0 == index) { + start_time = timestamp; + } + + seq_printf(seq_file, "[%06u] ", index); + + switch(event_id & 0x0F000000) { + case MALI_PROFILING_EVENT_TYPE_SINGLE: + seq_printf(seq_file, "SINGLE | "); + break; + case MALI_PROFILING_EVENT_TYPE_START: + seq_printf(seq_file, "START | "); + break; + case MALI_PROFILING_EVENT_TYPE_STOP: + seq_printf(seq_file, "STOP | "); + break; + case MALI_PROFILING_EVENT_TYPE_SUSPEND: + seq_printf(seq_file, "SUSPEND | "); + break; + case MALI_PROFILING_EVENT_TYPE_RESUME: + seq_printf(seq_file, "RESUME | "); + break; + default: + seq_printf(seq_file, "0x%01X | ", (event_id & 0x0F000000) >> 24); + break; + } + + switch(event_id & 0x00FF0000) { + case MALI_PROFILING_EVENT_CHANNEL_SOFTWARE: + seq_printf(seq_file, "SW | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_GP0: + seq_printf(seq_file, "GP0 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP0: + seq_printf(seq_file, "PP0 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP1: + seq_printf(seq_file, "PP1 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP2: + seq_printf(seq_file, "PP2 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP3: + seq_printf(seq_file, "PP3 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP4: + seq_printf(seq_file, "PP4 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP5: + seq_printf(seq_file, "PP5 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP6: + seq_printf(seq_file, "PP6 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_PP7: + seq_printf(seq_file, "PP7 | "); + break; + case MALI_PROFILING_EVENT_CHANNEL_GPU: + seq_printf(seq_file, "GPU | "); + break; + default: + seq_printf(seq_file, "0x%02X | ", (event_id & 0x00FF0000) >> 16); + break; + } + + if (MALI_EVENT_ID_IS_HW(event_id)) { + if (((event_id & 0x0F000000) == MALI_PROFILING_EVENT_TYPE_START) || ((event_id & 0x0F000000) == MALI_PROFILING_EVENT_TYPE_STOP)) { + switch(event_id & 0x0000FFFF) { + case MALI_PROFILING_EVENT_REASON_START_STOP_HW_PHYSICAL: + seq_printf(seq_file, "PHYSICAL | "); + break; + case MALI_PROFILING_EVENT_REASON_START_STOP_HW_VIRTUAL: + seq_printf(seq_file, "VIRTUAL | "); + break; + default: + seq_printf(seq_file, "0x%04X | ", event_id & 0x0000FFFF); + break; + } + } else { + seq_printf(seq_file, "0x%04X | ", event_id & 0x0000FFFF); + } + } else { + seq_printf(seq_file, "0x%04X | ", event_id & 0x0000FFFF); + } + + seq_printf(seq_file, "T0 + 0x%016llX\n", timestamp - start_time); + + return 0; + } + + return 0; +} + +static const struct seq_operations profiling_events_seq_ops = { + .start = profiling_events_start, + .next = profiling_events_next, + .stop = profiling_events_stop, + .show = profiling_events_show +}; + +static int profiling_events_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &profiling_events_seq_ops); +} + +static const struct file_operations profiling_events_fops = { + .owner = THIS_MODULE, + .open = profiling_events_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static const struct seq_operations profiling_events_human_readable_seq_ops = { + .start = profiling_events_start, + .next = profiling_events_next, + .stop = profiling_events_stop, + .show = profiling_events_show_human_readable +}; + +static int profiling_events_human_readable_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &profiling_events_human_readable_seq_ops); +} + +static const struct file_operations profiling_events_human_readable_fops = { + .owner = THIS_MODULE, + .open = profiling_events_human_readable_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +#endif + +static ssize_t memory_used_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + char buf[64]; + size_t r; + u32 mem = _mali_ukk_report_memory_usage(); + + r = snprintf(buf, 64, "%u\n", mem); + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static const struct file_operations memory_usage_fops = { + .owner = THIS_MODULE, + .read = memory_used_read, +}; + +static ssize_t utilization_gp_pp_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + char buf[64]; + size_t r; + u32 uval= _mali_ukk_utilization_gp_pp(); + + r = snprintf(buf, 64, "%u\n", uval); + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static ssize_t utilization_gp_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + char buf[64]; + size_t r; + u32 uval= _mali_ukk_utilization_gp(); + + r = snprintf(buf, 64, "%u\n", uval); + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static ssize_t utilization_pp_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + char buf[64]; + size_t r; + u32 uval= _mali_ukk_utilization_pp(); + + r = snprintf(buf, 64, "%u\n", uval); + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + + +static const struct file_operations utilization_gp_pp_fops = { + .owner = THIS_MODULE, + .read = utilization_gp_pp_read, +}; + +static const struct file_operations utilization_gp_fops = { + .owner = THIS_MODULE, + .read = utilization_gp_read, +}; + +static const struct file_operations utilization_pp_fops = { + .owner = THIS_MODULE, + .read = utilization_pp_read, +}; + +static ssize_t user_settings_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + unsigned long val; + int ret; + _mali_uk_user_setting_t setting; + char buf[32]; + + cnt = min(cnt, sizeof(buf) - 1); + if (copy_from_user(buf, ubuf, cnt)) { + return -EFAULT; + } + buf[cnt] = '\0'; + + ret = strict_strtoul(buf, 10, &val); + if (0 != ret) { + return ret; + } + + /* Update setting */ + setting = (_mali_uk_user_setting_t)(filp->private_data); + mali_set_user_setting(setting, val); + + *ppos += cnt; + return cnt; +} + +static ssize_t user_settings_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) +{ + char buf[64]; + size_t r; + u32 value; + _mali_uk_user_setting_t setting; + + setting = (_mali_uk_user_setting_t)(filp->private_data); + value = mali_get_user_setting(setting); + + r = snprintf(buf, 64, "%u\n", value); + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static const struct file_operations user_settings_fops = { + .owner = THIS_MODULE, + .open = open_copy_private_data, + .read = user_settings_read, + .write = user_settings_write, +}; + +static int mali_sysfs_user_settings_register(void) +{ + struct dentry *mali_user_settings_dir = debugfs_create_dir("userspace_settings", mali_debugfs_dir); + + if (mali_user_settings_dir != NULL) { + int i; + for (i = 0; i < _MALI_UK_USER_SETTING_MAX; i++) { + debugfs_create_file(_mali_uk_user_setting_descriptions[i], 0600, mali_user_settings_dir, (void*)i, &user_settings_fops); + } + } + + return 0; +} + +static ssize_t pmu_power_down_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp) +{ + int ret; + char buffer[32]; + unsigned long val; + struct mali_pmu_core *pmu; + _mali_osk_errcode_t err; + + if (count >= sizeof(buffer)) { + return -ENOMEM; + } + + if (copy_from_user(&buffer[0], buf, count)) { + return -EFAULT; + } + buffer[count] = '\0'; + + ret = strict_strtoul(&buffer[0], 10, &val); + if (0 != ret) { + return -EINVAL; + } + + pmu = mali_pmu_get_global_pmu_core(); + MALI_DEBUG_ASSERT_POINTER(pmu); + + err = mali_pmu_power_down(pmu, val); + if (_MALI_OSK_ERR_OK != err) { + return -EINVAL; + } + + *offp += count; + return count; +} + +static ssize_t pmu_power_up_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp) +{ + int ret; + char buffer[32]; + unsigned long val; + struct mali_pmu_core *pmu; + _mali_osk_errcode_t err; + + if (count >= sizeof(buffer)) { + return -ENOMEM; + } + + if (copy_from_user(&buffer[0], buf, count)) { + return -EFAULT; + } + buffer[count] = '\0'; + + ret = strict_strtoul(&buffer[0], 10, &val); + if (0 != ret) { + return -EINVAL; + } + + pmu = mali_pmu_get_global_pmu_core(); + MALI_DEBUG_ASSERT_POINTER(pmu); + + err = mali_pmu_power_up(pmu, val); + if (_MALI_OSK_ERR_OK != err) { + return -EINVAL; + } + + *offp += count; + return count; +} + +static const struct file_operations pmu_power_down_fops = { + .owner = THIS_MODULE, + .write = pmu_power_down_write, +}; + +static const struct file_operations pmu_power_up_fops = { + .owner = THIS_MODULE, + .write = pmu_power_up_write, +}; + +static ssize_t pp_num_cores_enabled_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp) +{ + int ret; + char buffer[32]; + unsigned long val; + + if (count >= sizeof(buffer)) { + return -ENOMEM; + } + + if (copy_from_user(&buffer[0], buf, count)) { + return -EFAULT; + } + buffer[count] = '\0'; + + ret = strict_strtoul(&buffer[0], 10, &val); + if (0 != ret) { + return -EINVAL; + } + + ret = mali_pp_scheduler_set_perf_level(val, MALI_TRUE); /* override even if core scaling is disabled */ + if (ret) { + return ret; + } + + *offp += count; + return count; +} + +static ssize_t pp_num_cores_enabled_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) +{ + int r; + char buffer[64]; + + r = sprintf(buffer, "%u\n", mali_pp_scheduler_get_num_cores_enabled()); + + return simple_read_from_buffer(buf, count, offp, buffer, r); +} + +static const struct file_operations pp_num_cores_enabled_fops = { + .owner = THIS_MODULE, + .write = pp_num_cores_enabled_write, + .read = pp_num_cores_enabled_read, + .llseek = default_llseek, +}; + +static ssize_t pp_num_cores_total_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) +{ + int r; + char buffer[64]; + + r = sprintf(buffer, "%u\n", mali_pp_scheduler_get_num_cores_total()); + + return simple_read_from_buffer(buf, count, offp, buffer, r); +} + +static const struct file_operations pp_num_cores_total_fops = { + .owner = THIS_MODULE, + .read = pp_num_cores_total_read, +}; + +static ssize_t pp_core_scaling_enabled_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp) +{ + int ret; + char buffer[32]; + unsigned long val; + + if (count >= sizeof(buffer)) { + return -ENOMEM; + } + + if (copy_from_user(&buffer[0], buf, count)) { + return -EFAULT; + } + buffer[count] = '\0'; + + ret = strict_strtoul(&buffer[0], 10, &val); + if (0 != ret) { + return -EINVAL; + } + + switch (val) { + case 1: + mali_pp_scheduler_core_scaling_enable(); + break; + case 0: + mali_pp_scheduler_core_scaling_disable(); + break; + default: + return -EINVAL; + break; + } + + *offp += count; + return count; +} + +static ssize_t pp_core_scaling_enabled_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) +{ + return simple_read_from_buffer(buf, count, offp, mali_pp_scheduler_core_scaling_is_enabled() ? "1\n" : "0\n", 2); +} +static const struct file_operations pp_core_scaling_enabled_fops = { + .owner = THIS_MODULE, + .write = pp_core_scaling_enabled_write, + .read = pp_core_scaling_enabled_read, + .llseek = default_llseek, +}; + +static ssize_t version_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) +{ + int r = 0; + char buffer[64]; + + switch (mali_kernel_core_get_product_id()) { + case _MALI_PRODUCT_ID_MALI200: + r = sprintf(buffer, "Mali-200\n"); + break; + case _MALI_PRODUCT_ID_MALI300: + r = sprintf(buffer, "Mali-300\n"); + break; + case _MALI_PRODUCT_ID_MALI400: + r = sprintf(buffer, "Mali-400 MP\n"); + break; + case _MALI_PRODUCT_ID_MALI450: + r = sprintf(buffer, "Mali-450 MP\n"); + break; + case _MALI_PRODUCT_ID_UNKNOWN: + return -EINVAL; + break; + }; + + return simple_read_from_buffer(buf, count, offp, buffer, r); +} + +static const struct file_operations version_fops = { + .owner = THIS_MODULE, + .read = version_read, +}; + +int mali_sysfs_register(const char *mali_dev_name) +{ + mali_debugfs_dir = debugfs_create_dir(mali_dev_name, NULL); + if(ERR_PTR(-ENODEV) == mali_debugfs_dir) { + /* Debugfs not supported. */ + mali_debugfs_dir = NULL; + } else { + /* {MTK add + * Add procfs + * }*/ + proc_mali_register(); + + if(NULL != mali_debugfs_dir) { + /* Debugfs directory created successfully; create files now */ + struct dentry *mali_pmu_dir; + struct dentry *mali_power_dir; + struct dentry *mali_gp_dir; + struct dentry *mali_pp_dir; + struct dentry *mali_l2_dir; + struct dentry *mali_profiling_dir; + + debugfs_create_file("version", 0400, mali_debugfs_dir, NULL, &version_fops); + + mali_pmu_dir = debugfs_create_dir("pmu", mali_debugfs_dir); + if (NULL != mali_pmu_dir) { + debugfs_create_file("power_down", 0200, mali_pmu_dir, NULL, &pmu_power_down_fops); + debugfs_create_file("power_up", 0200, mali_pmu_dir, NULL, &pmu_power_up_fops); + } + + mali_power_dir = debugfs_create_dir("power", mali_debugfs_dir); + if (mali_power_dir != NULL) { + debugfs_create_file("always_on", 0600, mali_power_dir, NULL, &power_always_on_fops); + debugfs_create_file("power_events", 0200, mali_power_dir, NULL, &power_power_events_fops); + } + + mali_gp_dir = debugfs_create_dir("gp", mali_debugfs_dir); + if (mali_gp_dir != NULL) { + u32 num_groups; + int i; + + num_groups = mali_group_get_glob_num_groups(); + for (i = 0; i < num_groups; i++) { + struct mali_group *group = mali_group_get_glob_group(i); + + struct mali_gp_core *gp_core = mali_group_get_gp_core(group); + if (NULL != gp_core) { + struct dentry *mali_gp_gpx_dir; + mali_gp_gpx_dir = debugfs_create_dir("gp0", mali_gp_dir); + if (NULL != mali_gp_gpx_dir) { + debugfs_create_file("base_addr", 0400, mali_gp_gpx_dir, &gp_core->hw_core, &hw_core_base_addr_fops); + debugfs_create_file("enabled", 0600, mali_gp_gpx_dir, group, &group_enabled_fops); + } + break; /* no need to look for any other GP cores */ + } + + } + } + + mali_pp_dir = debugfs_create_dir("pp", mali_debugfs_dir); + if (mali_pp_dir != NULL) { + u32 num_groups; + int i; + + debugfs_create_file("num_cores_total", 0400, mali_pp_dir, NULL, &pp_num_cores_total_fops); + debugfs_create_file("num_cores_enabled", 0600, mali_pp_dir, NULL, &pp_num_cores_enabled_fops); + debugfs_create_file("core_scaling_enabled", 0600, mali_pp_dir, NULL, &pp_core_scaling_enabled_fops); + + num_groups = mali_group_get_glob_num_groups(); + for (i = 0; i < num_groups; i++) { + struct mali_group *group = mali_group_get_glob_group(i); + + struct mali_pp_core *pp_core = mali_group_get_pp_core(group); + if (NULL != pp_core) { + char buf[16]; + struct dentry *mali_pp_ppx_dir; + _mali_osk_snprintf(buf, sizeof(buf), "pp%u", mali_pp_core_get_id(pp_core)); + mali_pp_ppx_dir = debugfs_create_dir(buf, mali_pp_dir); + if (NULL != mali_pp_ppx_dir) { + debugfs_create_file("base_addr", 0400, mali_pp_ppx_dir, &pp_core->hw_core, &hw_core_base_addr_fops); + if (!mali_group_is_virtual(group)) { + debugfs_create_file("enabled", 0600, mali_pp_ppx_dir, group, &group_enabled_fops); + } + } + } + } + } + + mali_l2_dir = debugfs_create_dir("l2", mali_debugfs_dir); + if (mali_l2_dir != NULL) { + struct dentry *mali_l2_all_dir; + u32 l2_id; + struct mali_l2_cache_core *l2_cache; + + mali_l2_all_dir = debugfs_create_dir("all", mali_l2_dir); + if (mali_l2_all_dir != NULL) { + debugfs_create_file("counter_src0", 0200, mali_l2_all_dir, NULL, &l2_all_counter_src0_fops); + debugfs_create_file("counter_src1", 0200, mali_l2_all_dir, NULL, &l2_all_counter_src1_fops); + } + + l2_id = 0; + l2_cache = mali_l2_cache_core_get_glob_l2_core(l2_id); + while (NULL != l2_cache) { + char buf[16]; + struct dentry *mali_l2_l2x_dir; + _mali_osk_snprintf(buf, sizeof(buf), "l2%u", l2_id); + mali_l2_l2x_dir = debugfs_create_dir(buf, mali_l2_dir); + if (NULL != mali_l2_l2x_dir) { + debugfs_create_file("counter_src0", 0600, mali_l2_l2x_dir, l2_cache, &l2_l2x_counter_src0_fops); + debugfs_create_file("counter_src1", 0600, mali_l2_l2x_dir, l2_cache, &l2_l2x_counter_src1_fops); + debugfs_create_file("base_addr", 0400, mali_l2_l2x_dir, &l2_cache->hw_core, &hw_core_base_addr_fops); + } + + /* try next L2 */ + l2_id++; + l2_cache = mali_l2_cache_core_get_glob_l2_core(l2_id); + } + } + + debugfs_create_file("memory_usage", 0400, mali_debugfs_dir, NULL, &memory_usage_fops); + + debugfs_create_file("utilization_gp_pp", 0400, mali_debugfs_dir, NULL, &utilization_gp_pp_fops); + debugfs_create_file("utilization_gp", 0400, mali_debugfs_dir, NULL, &utilization_gp_fops); + debugfs_create_file("utilization_pp", 0400, mali_debugfs_dir, NULL, &utilization_pp_fops); + + mali_profiling_dir = debugfs_create_dir("profiling", mali_debugfs_dir); + if (mali_profiling_dir != NULL) { + u32 max_sub_jobs; + int i; + struct dentry *mali_profiling_gp_dir; + struct dentry *mali_profiling_pp_dir; +#if defined(CONFIG_MALI400_INTERNAL_PROFILING) + struct dentry *mali_profiling_proc_dir; +#endif + /* + * Create directory where we can set GP HW counters. + */ + mali_profiling_gp_dir = debugfs_create_dir("gp", mali_profiling_dir); + if (mali_profiling_gp_dir != NULL) { + debugfs_create_file("counter_src0", 0600, mali_profiling_gp_dir, (void*)PRIVATE_DATA_COUNTER_MAKE_GP(0), &profiling_counter_src_fops); + debugfs_create_file("counter_src1", 0600, mali_profiling_gp_dir, (void*)PRIVATE_DATA_COUNTER_MAKE_GP(1), &profiling_counter_src_fops); + } + + /* + * Create directory where we can set PP HW counters. + * Possible override with specific HW counters for a particular sub job + * (Disable core scaling before using the override!) + */ + mali_profiling_pp_dir = debugfs_create_dir("pp", mali_profiling_dir); + if (mali_profiling_pp_dir != NULL) { + debugfs_create_file("counter_src0", 0600, mali_profiling_pp_dir, (void*)PRIVATE_DATA_COUNTER_MAKE_PP(0), &profiling_counter_src_fops); + debugfs_create_file("counter_src1", 0600, mali_profiling_pp_dir, (void*)PRIVATE_DATA_COUNTER_MAKE_PP(1), &profiling_counter_src_fops); + } + + max_sub_jobs = mali_pp_scheduler_get_num_cores_total(); + for (i = 0; i < max_sub_jobs; i++) { + char buf[16]; + struct dentry *mali_profiling_pp_x_dir; + _mali_osk_snprintf(buf, sizeof(buf), "%u", i); + mali_profiling_pp_x_dir = debugfs_create_dir(buf, mali_profiling_pp_dir); + if (NULL != mali_profiling_pp_x_dir) { + debugfs_create_file("counter_src0", 0600, mali_profiling_pp_x_dir, (void*)PRIVATE_DATA_COUNTER_MAKE_PP_SUB_JOB(0, i), &profiling_counter_src_fops); + debugfs_create_file("counter_src1", 0600, mali_profiling_pp_x_dir, (void*)PRIVATE_DATA_COUNTER_MAKE_PP_SUB_JOB(1, i), &profiling_counter_src_fops); + } + } + +#if defined(CONFIG_MALI400_INTERNAL_PROFILING) + mali_profiling_proc_dir = debugfs_create_dir("proc", mali_profiling_dir); + if (mali_profiling_proc_dir != NULL) { + struct dentry *mali_profiling_proc_default_dir = debugfs_create_dir("default", mali_profiling_proc_dir); + if (mali_profiling_proc_default_dir != NULL) { + debugfs_create_file("enable", 0600, mali_profiling_proc_default_dir, (void*)_MALI_UK_USER_SETTING_SW_EVENTS_ENABLE, &user_settings_fops); + } + } + debugfs_create_file("record", 0600, mali_profiling_dir, NULL, &profiling_record_fops); + debugfs_create_file("events", 0400, mali_profiling_dir, NULL, &profiling_events_fops); + debugfs_create_file("events_human_readable", 0400, mali_profiling_dir, NULL, &profiling_events_human_readable_fops); +#endif + } + +#if MALI_STATE_TRACKING + debugfs_create_file("state_dump", 0400, mali_debugfs_dir, NULL, &mali_seq_internal_state_fops); +#endif + + if (mali_sysfs_user_settings_register()) { + /* Failed to create the debugfs entries for the user settings DB. */ + MALI_DEBUG_PRINT(2, ("Failed to create user setting debugfs files. Ignoring...\n")); + } + } + } + + /* Success! */ + return 0; +} + +int mali_sysfs_unregister(void) +{ + /* {MTK add + * Remove procfs + * }*/ + proc_mali_unregister(); + + if(NULL != mali_debugfs_dir) { + debugfs_remove_recursive(mali_debugfs_dir); + } + return 0; +} + +#else /* MALI_LICENSE_IS_GPL */ + +/* Dummy implementations for non-GPL */ + +int mali_sysfs_register(struct mali_dev *device, dev_t dev, const char *mali_dev_name) +{ + return 0; +} + +int mali_sysfs_unregister(void) +{ + return 0; +} + +#endif /* MALI_LICENSE_IS_GPL */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.h index ab35087deed..323dab07599 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_kernel_sysfs.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_KERNEL_SYSFS_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_linux_trace.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_linux_trace.h index fcd7966de52..9234060b02d 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_linux_trace.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_linux_trace.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #if !defined (MALI_LINUX_TRACE_H) || defined (TRACE_HEADER_MULTI_READ) diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.c index ffa03d5bbd3..65a9ff841bd 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -28,6 +28,9 @@ #include "mali_memory_os_alloc.h" #include "mali_memory_block_alloc.h" +extern unsigned int mali_dedicated_mem_size; +extern unsigned int mali_shared_mem_size; + /* session->memory_lock must be held when calling this function */ static void mali_mem_release(mali_mem_allocation *descriptor) { @@ -56,6 +59,9 @@ static void mali_mem_release(mali_mem_allocation *descriptor) case MALI_MEM_BLOCK: mali_mem_block_release(descriptor); break; + default: + MALI_DEBUG_PRINT(1, ("mem type %d is not in the mali_mem_type enum.\n", descriptor->type)); + break; } } @@ -269,6 +275,12 @@ u32 _mali_ukk_report_memory_usage(void) return sum; } +u32 _mali_ukk_report_total_memory_size(void) +{ + return mali_dedicated_mem_size + mali_shared_mem_size; +} + + /** * Per-session memory descriptor mapping table sizes */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.c.orig b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.c.orig new file mode 100644 index 00000000000..d208db8968e --- /dev/null +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.c.orig @@ -0,0 +1,361 @@ +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mali_osk.h" +#include "mali_osk_mali.h" +#include "mali_kernel_linux.h" +#include "mali_scheduler.h" +#include "mali_kernel_descriptor_mapping.h" + +#include "mali_memory.h" +#include "mali_memory_dma_buf.h" +#include "mali_memory_os_alloc.h" +#include "mali_memory_block_alloc.h" + +/* session->memory_lock must be held when calling this function */ +static void mali_mem_release(mali_mem_allocation *descriptor) +{ + MALI_DEBUG_ASSERT_POINTER(descriptor); + MALI_DEBUG_ASSERT_LOCK_HELD(descriptor->session->memory_lock); + + MALI_DEBUG_ASSERT(MALI_MEM_ALLOCATION_VALID_MAGIC == descriptor->magic); + + switch (descriptor->type) { + case MALI_MEM_OS: + mali_mem_os_release(descriptor); + break; + case MALI_MEM_DMA_BUF: +#if defined(CONFIG_DMA_SHARED_BUFFER) + mali_mem_dma_buf_release(descriptor); +#endif + break; + case MALI_MEM_UMP: +#if defined(CONFIG_MALI400_UMP) + mali_mem_ump_release(descriptor); +#endif + break; + case MALI_MEM_EXTERNAL: + mali_mem_external_release(descriptor); + break; + case MALI_MEM_BLOCK: + mali_mem_block_release(descriptor); + break; + } +} + +static void mali_mem_vma_open(struct vm_area_struct * vma) +{ + mali_mem_allocation *descriptor = (mali_mem_allocation*)vma->vm_private_data; + MALI_DEBUG_PRINT(4, ("Open called on vma %p\n", vma)); + + descriptor->cpu_mapping.ref++; + + return; +} + +static void mali_mem_vma_close(struct vm_area_struct *vma) +{ + mali_mem_allocation *descriptor; + struct mali_session_data *session; + mali_mem_virt_cpu_mapping *mapping; + + MALI_DEBUG_PRINT(3, ("Close called on vma %p\n", vma)); + + descriptor = (mali_mem_allocation*)vma->vm_private_data; + BUG_ON(!descriptor); + + MALI_DEBUG_ASSERT(MALI_MEM_ALLOCATION_VALID_MAGIC == descriptor->magic); + + mapping = &descriptor->cpu_mapping; + BUG_ON(0 == mapping->ref); + + mapping->ref--; + if (0 != mapping->ref) { + MALI_DEBUG_PRINT(3, ("Ignoring this close, %d references still exists\n", mapping->ref)); + return; + } + + session = descriptor->session; + + mali_descriptor_mapping_free(session->descriptor_mapping, descriptor->id); + + _mali_osk_mutex_wait(session->memory_lock); + mali_mem_release(descriptor); + _mali_osk_mutex_signal(session->memory_lock); + + mali_mem_descriptor_destroy(descriptor); +} + +static int mali_kernel_memory_cpu_page_fault_handler(struct vm_area_struct *vma, struct vm_fault *vmf) +{ + void __user * address; + mali_mem_allocation *descriptor; + + address = vmf->virtual_address; + descriptor = (mali_mem_allocation *)vma->vm_private_data; + + MALI_DEBUG_ASSERT(MALI_MEM_ALLOCATION_VALID_MAGIC == descriptor->magic); + + /* + * We always fail the call since all memory is pre-faulted when assigned to the process. + * Only the Mali cores can use page faults to extend buffers. + */ + + MALI_DEBUG_PRINT(1, ("Page-fault in Mali memory region caused by the CPU.\n")); + MALI_DEBUG_PRINT(1, ("Tried to access %p (process local virtual address) which is not currently mapped to any Mali memory.\n", (void*)address)); + + MALI_IGNORE(address); + MALI_IGNORE(descriptor); + + return VM_FAULT_SIGBUS; +} + +struct vm_operations_struct mali_kernel_vm_ops = { + .open = mali_mem_vma_open, + .close = mali_mem_vma_close, + .fault = mali_kernel_memory_cpu_page_fault_handler +}; + +/** @note munmap handler is done by vma close handler */ +int mali_mmap(struct file *filp, struct vm_area_struct *vma) +{ + struct mali_session_data *session; + mali_mem_allocation *descriptor = NULL; + u32 size = vma->vm_end - vma->vm_start; + u32 mali_addr = vma->vm_pgoff << PAGE_SHIFT; + + session = (struct mali_session_data *)filp->private_data; + if (NULL == session) { + MALI_PRINT_ERROR(("mmap called without any session data available\n")); + return -EFAULT; + } + + MALI_DEBUG_PRINT(4, ("MMap() handler: start=0x%08X, phys=0x%08X, size=0x%08X vma->flags 0x%08x\n", + (unsigned int)vma->vm_start, (unsigned int)(vma->vm_pgoff << PAGE_SHIFT), + (unsigned int)(vma->vm_end - vma->vm_start), vma->vm_flags)); + + /* Set some bits which indicate that, the memory is IO memory, meaning + * that no paging is to be performed and the memory should not be + * included in crash dumps. And that the memory is reserved, meaning + * that it's present and can never be paged out (see also previous + * entry) + */ + vma->vm_flags |= VM_IO; + vma->vm_flags |= VM_DONTCOPY; + vma->vm_flags |= VM_PFNMAP; +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) + vma->vm_flags |= VM_RESERVED; +#else + vma->vm_flags |= VM_DONTDUMP; + vma->vm_flags |= VM_DONTEXPAND; +#endif + + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + vma->vm_ops = &mali_kernel_vm_ops; /* Operations used on any memory system */ + + /// since in ALPS project, especially low-memory segment, + /// it would be hard to allocate a 256KB(2^6 * 4K) physical continuous memory due to memory fragmentation + /// even 32KB conti. phy. might be hard to allocate. And it might cause ANR or KE + /// avoid using block allocate(256KB) directly + /// descriptor = mali_mem_block_alloc(mali_addr, size, vma, session); + if (NULL == descriptor) { + descriptor = mali_mem_os_alloc(mali_addr, size, vma, session); + if (NULL == descriptor) { + MALI_DEBUG_PRINT(3, ("MMAP failed\n")); + return -ENOMEM; + } + } + + MALI_DEBUG_ASSERT(MALI_MEM_ALLOCATION_VALID_MAGIC == descriptor->magic); + + vma->vm_private_data = (void*)descriptor; + + /* Put on descriptor map */ + if (_MALI_OSK_ERR_OK != mali_descriptor_mapping_allocate_mapping(session->descriptor_mapping, descriptor, &descriptor->id)) { + _mali_osk_mutex_wait(session->memory_lock); + mali_mem_os_release(descriptor); + _mali_osk_mutex_signal(session->memory_lock); + return -EFAULT; + } + + return 0; +} + + +/* Prepare memory descriptor */ +mali_mem_allocation *mali_mem_descriptor_create(struct mali_session_data *session, mali_mem_type type) +{ + mali_mem_allocation *descriptor; + + descriptor = (mali_mem_allocation*)kzalloc(sizeof(mali_mem_allocation), GFP_KERNEL); + if (NULL == descriptor) { + MALI_DEBUG_PRINT(3,("mali_ukk_mem_mmap: descriptor was NULL\n")); + return NULL; + } + + MALI_DEBUG_CODE(descriptor->magic = MALI_MEM_ALLOCATION_VALID_MAGIC); + + descriptor->flags = 0; + descriptor->type = type; + descriptor->session = session; + + return descriptor; +} + +void mali_mem_descriptor_destroy(mali_mem_allocation *descriptor) +{ + MALI_DEBUG_ASSERT(MALI_MEM_ALLOCATION_VALID_MAGIC == descriptor->magic); + MALI_DEBUG_CODE(descriptor->magic = MALI_MEM_ALLOCATION_FREED_MAGIC); + + kfree(descriptor); +} + +_mali_osk_errcode_t mali_mem_mali_map_prepare(mali_mem_allocation *descriptor) +{ + u32 size = descriptor->size; + struct mali_session_data *session = descriptor->session; + + MALI_DEBUG_ASSERT(MALI_MEM_ALLOCATION_VALID_MAGIC == descriptor->magic); + + /* Map dma-buf into this session's page tables */ + + if (descriptor->flags & MALI_MEM_FLAG_MALI_GUARD_PAGE) { + size += MALI_MMU_PAGE_SIZE; + } + + return mali_mmu_pagedir_map(session->page_directory, descriptor->mali_mapping.addr, size); +} + +void mali_mem_mali_map_free(mali_mem_allocation *descriptor) +{ + u32 size = descriptor->size; + struct mali_session_data *session = descriptor->session; + + MALI_DEBUG_ASSERT(MALI_MEM_ALLOCATION_VALID_MAGIC == descriptor->magic); + + if (descriptor->flags & MALI_MEM_FLAG_MALI_GUARD_PAGE) { + size += MALI_MMU_PAGE_SIZE; + } + + /* Umap and flush L2 */ + mali_mmu_pagedir_unmap(session->page_directory, descriptor->mali_mapping.addr, descriptor->size); + + mali_scheduler_zap_all_active(session); +} + +u32 _mali_ukk_report_memory_usage(void) +{ + u32 sum = 0; + + sum += mali_mem_block_allocator_stat(); + sum += mali_mem_os_stat(); + + return sum; +} + +/** + * Per-session memory descriptor mapping table sizes + */ +#define MALI_MEM_DESCRIPTORS_INIT 64 +#define MALI_MEM_DESCRIPTORS_MAX 65536 + +_mali_osk_errcode_t mali_memory_session_begin(struct mali_session_data * session_data) +{ + MALI_DEBUG_PRINT(5, ("Memory session begin\n")); + + /* Create descriptor mapping table */ + session_data->descriptor_mapping = mali_descriptor_mapping_create(MALI_MEM_DESCRIPTORS_INIT, MALI_MEM_DESCRIPTORS_MAX); + + if (NULL == session_data->descriptor_mapping) { + MALI_ERROR(_MALI_OSK_ERR_NOMEM); + } + + session_data->memory_lock = _mali_osk_mutex_init(_MALI_OSK_LOCKFLAG_ORDERED, + _MALI_OSK_LOCK_ORDER_MEM_SESSION); + + if (NULL == session_data->memory_lock) { + mali_descriptor_mapping_destroy(session_data->descriptor_mapping); + _mali_osk_free(session_data); + MALI_ERROR(_MALI_OSK_ERR_FAULT); + } + + MALI_DEBUG_PRINT(5, ("MMU session begin: success\n")); + MALI_SUCCESS; +} + +/** @brief Callback function that releases memory + * + * session->memory_lock must be held when calling this function. + */ +static void descriptor_table_cleanup_callback(int descriptor_id, void* map_target) +{ + mali_mem_allocation *descriptor; + + descriptor = (mali_mem_allocation*)map_target; + + MALI_DEBUG_ASSERT_LOCK_HELD(descriptor->session->memory_lock); + + MALI_DEBUG_PRINT(3, ("Cleanup of descriptor %d mapping to 0x%x in descriptor table\n", descriptor_id, map_target)); + MALI_DEBUG_ASSERT(descriptor); + + mali_mem_release(descriptor); + mali_mem_descriptor_destroy(descriptor); +} + +void mali_memory_session_end(struct mali_session_data *session) +{ + MALI_DEBUG_PRINT(3, ("MMU session end\n")); + + if (NULL == session) { + MALI_DEBUG_PRINT(1, ("No session data found during session end\n")); + return; + } + + /* Lock the session so we can modify the memory list */ + _mali_osk_mutex_wait(session->memory_lock); + + /* Free all allocations still in the descriptor map, and terminate the map */ + if (NULL != session->descriptor_mapping) { + mali_descriptor_mapping_call_for_each(session->descriptor_mapping, descriptor_table_cleanup_callback); + mali_descriptor_mapping_destroy(session->descriptor_mapping); + session->descriptor_mapping = NULL; + } + + _mali_osk_mutex_signal(session->memory_lock); + + /* Free the lock */ + _mali_osk_mutex_term(session->memory_lock); + + return; +} + + +extern unsigned int (*mtk_get_gpu_memory_usage_fp)(void); + +_mali_osk_errcode_t mali_memory_initialize(void) +{ + mtk_get_gpu_memory_usage_fp = _mali_ukk_report_memory_usage; + return mali_mem_os_init(); +} + +void mali_memory_terminate(void) +{ + mali_mem_os_term(); + mali_mem_block_allocator_destroy(NULL); +} diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.h index 95aeba4f171..da42a42a046 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_MEMORY_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.c index e8c890e9a16..8f4a84996b1 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" #include "mali_memory.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.h index c0d412dc801..8d22ab5c348 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_block_alloc.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_BLOCK_ALLOCATOR_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.c index 960531279f3..13e9bce355b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.h index c34edd8936b..7a109d37d4f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_dma_buf.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_MEMORY_DMA_BUF_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_external.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_external.c index 0f09eedafff..9a85328d8b4 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_external.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_external.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_osk.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.c index cf4727a8222..f6464fbeb43 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -427,10 +427,7 @@ static int mali_mem_os_shrink(struct shrinker *shrinker, struct shrink_control * #endif if (0 == nr) { - //[BUGFIX]-Mod-BEGIN by SCDTABLET.zhangku.guo@tcl.com,06/09/2015,1017702,mtk patch for fix ANR issue when TAT - //return mali_mem_os_allocator.pool_count + mali_mem_page_table_page_pool.count; - return mali_mem_os_allocator.pool_count; - //[BUGFIX]-Mod-END by SCDTABLET.zhangku.guo@tcl.com + return mali_mem_os_allocator.pool_count + mali_mem_page_table_page_pool.count; } if (0 == mali_mem_os_allocator.pool_count) { @@ -457,10 +454,8 @@ static int mali_mem_os_shrink(struct shrinker *shrinker, struct shrink_control * mali_mem_os_free_page(page); } - //[BUGFIX]-Del-BEGIN by SCDTABLET.zhangku.guo@tcl.com,06/09/2015,1017702,mtk patch for fix ANR issue when TAT /* Release some pages from page table page pool */ - //mali_mem_os_trim_page_table_page_pool(); - //[BUGFIX]-Del-END by SCDTABLET.zhangku.guo@tcl.com + mali_mem_os_trim_page_table_page_pool(); if (MALI_OS_MEMORY_KERNEL_BUFFER_SIZE_IN_PAGES > mali_mem_os_allocator.pool_count) { /* Pools are empty, stop timer */ @@ -468,10 +463,7 @@ static int mali_mem_os_shrink(struct shrinker *shrinker, struct shrink_control * cancel_delayed_work(&mali_mem_os_allocator.timed_shrinker); } - //[BUGFIX]-Mod-BEGIN by SCDTABLET.zhangku.guo@tcl.com,06/09/2015,1017702,mtk patch for fix ANR issue when TAT - //return mali_mem_os_allocator.pool_count + mali_mem_page_table_page_pool.count; - return mali_mem_os_allocator.pool_count; - //[BUGFIX]-Mod-END by SCDTABLET.zhangku.guo@tcl.com + return mali_mem_os_allocator.pool_count + mali_mem_page_table_page_pool.count; } static void mali_mem_os_trim_pool(struct work_struct *data) diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.h index 76f8ecfbfae..f1eb74a3384 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_os_alloc.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_MEMORY_OS_ALLOC_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_types.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_types.h index 97db7e981b2..4a022ae2fd2 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_types.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_types.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_MEMORY_TYPES_H__ @@ -23,6 +23,7 @@ typedef enum mali_mem_type { MALI_MEM_DMA_BUF, MALI_MEM_UMP, MALI_MEM_BLOCK, + MALI_MEM_TYPE_MAX, } mali_mem_type; typedef struct mali_mem_os_mem { diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_ump.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_ump.c index 2a95ae7403a..5f956da275e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_ump.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_memory_ump.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_ukk.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_atomics.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_atomics.c index a6231126f13..f22c086f8c9 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_atomics.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_atomics.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_irq.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_irq.c index f582b458554..a0edb5e8faf 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_irq.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_irq.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.c index c4d8a235bd4..17a72b0038c 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.h index 145313cc58f..82c137f564b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_locks.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_low_level_mem.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_low_level_mem.c index f600b540d29..5007044e6e6 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_low_level_mem.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_low_level_mem.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_mali.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_mali.c index f59d12ef9ed..df24e5a128b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_mali.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_mali.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_math.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_math.c index 08d4ced5e19..19c749a9201 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_math.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_math.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_memory.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_memory.c index 97742940d5a..745710c5264 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_memory.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_memory.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_misc.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_misc.c index 2721824fa38..9d9dc3f1b8e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_misc.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_misc.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** @@ -16,9 +16,12 @@ #include #include #include +#include #include #include "mali_osk.h" #include "mt_reg_base.h" +#include "mt_clkmgr.h" +#include "mt_spm.h" extern void smi_dumpDebugMsg(void); extern int m4u_dump_debug_registers(void);; @@ -42,19 +45,60 @@ u32 _mali_osk_snprintf( char *buf, u32 size, const char *fmt, ... ) va_end(args); return res; } - +#if 0 #define CLK_CFG_0 (INFRA_BASE + 0x0040) #define VENCPLL_CON0 (DDRPHY_BASE+0x800) #define MMPLL_CON0 (APMIXEDSYS_BASE + 0x0230) +void _mali_osk_ctxprintf(struct seq_file *print_ctx, const char *fmt, ...) +{ + va_list args; + char buf[512]; + + va_start(args, fmt); + vscnprintf(buf, 512, fmt, args); + seq_printf(print_ctx, buf); + va_end(args); + +} +#endif +extern void mali_hw_core_dump(); +void _mali_osk_dump_regs() { + unsigned long addr; + + MALI_DEBUG_PRINT(2, ("MALI START (Ignore 0) ------\n")); + + mali_hw_core_dump(); + + MALI_DEBUG_PRINT(2, ("MALI POWER DUMP ---------------\n")); + MALIK_MSG("MFG clock is %d and SMI clock is %d (From clkmgr view)\n", clock_is_on(MT_CG_MFG_G3D), clock_is_on(MT_CG_DISP0_SMI_COMMON)); + +#define SHOW_REG(name) MALI_DEBUG_PRINT(2, (" [%s]\t[%p] = 0x%08x\n",#name, name, *((volatile u32 *)name))) + SHOW_REG(CLK_CFG_1); + SHOW_REG(MMPLL_CON0); + SHOW_REG(MMPLL_CON1); + SHOW_REG(MMPLL_PWR_CON0); + SHOW_REG(UNIVPLL_CON0); + SHOW_REG(UNIVPLL_CON1); + SHOW_REG(UNIVPLL_PWR_CON0); + SHOW_REG(SPM_MFG_PWR_CON); + MALI_DEBUG_PRINT(2, ("MFG START ------------------\n")); + for(addr = G3D_CONFIG_BASE; addr < G3D_CONFIG_BASE + 0x19c; addr += 4) { + MALI_DEBUG_PRINT(2, ("MFG[0x%08x] -> 0x%08x \n", addr - G3D_CONFIG_BASE + 0x13000000, *(volatile u32 *)addr)); + } +} + void _mali_osk_abort(void) { +#if 0 int index; +#endif /* make a simple fault by dereferencing a NULL pointer */ dump_stack(); - - for (index = 0; index < 5; index++) + _mali_osk_dump_regs(); +#if 0 + for (index = 0; index < 5; index++) { MALI_DEBUG_PRINT(2, ("=== [MALI] PLL Dump %d ===\n", index)); MALI_DEBUG_PRINT(2, ("CLK_CFG_0: 0x%08x\n", *((volatile unsigned int*)CLK_CFG_0))); @@ -67,8 +111,10 @@ void _mali_osk_abort(void) MALI_DEBUG_PRINT(2, ("=== [MALI] 8127 m4u not provide API? M4U Dump %d ===\n", index)); /*m4u_dump_debug_registers();*/ } - +#endif +#if 1 *(int *)0 = 0; +#endif } void _mali_osk_break(void) @@ -82,6 +128,11 @@ u32 _mali_osk_get_pid(void) return (u32)current->tgid; } +char *_mali_osk_get_comm(void) +{ + return (char *)current->comm; +} + u32 _mali_osk_get_tid(void) { /* pid is actually identifying the thread on Linux */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_misc.c.orig b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_misc.c.orig new file mode 100644 index 00000000000..ed252cdfd56 --- /dev/null +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_misc.c.orig @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** + * @file mali_osk_misc.c + * Implementation of the OS abstraction layer for the kernel device driver + */ +#include +#include +#include +#include +#include +#include "mali_osk.h" +#include "mt_reg_base.h" + +extern void smi_dumpDebugMsg(void); +extern int m4u_dump_debug_registers(void);; + +void _mali_osk_dbgmsg( const char *fmt, ... ) +{ + va_list args; + va_start(args, fmt); + vprintk(fmt, args); + va_end(args); +} + +u32 _mali_osk_snprintf( char *buf, u32 size, const char *fmt, ... ) +{ + int res; + va_list args; + va_start(args, fmt); + + res = vscnprintf(buf, (size_t)size, fmt, args); + + va_end(args); + return res; +} + +#define CLK_CFG_0 (INFRA_BASE + 0x0040) +#define VENCPLL_CON0 (DDRPHY_BASE+0x800) +#define MMPLL_CON0 (APMIXEDSYS_BASE + 0x0230) + +void _mali_osk_abort(void) +{ + int index; + + /* make a simple fault by dereferencing a NULL pointer */ + dump_stack(); + + for (index = 0; index < 5; index++) + { + MALI_DEBUG_PRINT(2, ("=== [MALI] PLL Dump %d ===\n", index)); + MALI_DEBUG_PRINT(2, ("CLK_CFG_0: 0x%08x\n", *((volatile unsigned int*)CLK_CFG_0))); + MALI_DEBUG_PRINT(2, ("VENCPLL_CON0: 0x%08x\n", *((volatile unsigned int*)VENCPLL_CON0))); + MALI_DEBUG_PRINT(2, ("MMPLL_CON0: 0x%08x\n", *((volatile unsigned int*)MMPLL_CON0))); + + MALI_DEBUG_PRINT(2, ("=== [MALI] SMI Dump %d ===\n", index)); + smi_dumpDebugMsg(); + + MALI_DEBUG_PRINT(2, ("=== [MALI] 8127 m4u not provide API? M4U Dump %d ===\n", index)); + /*m4u_dump_debug_registers();*/ + } + + *(int *)0 = 0; +} + +void _mali_osk_break(void) +{ + _mali_osk_abort(); +} + +u32 _mali_osk_get_pid(void) +{ + /* Thread group ID is the process ID on Linux */ + return (u32)current->tgid; +} + +u32 _mali_osk_get_tid(void) +{ + /* pid is actually identifying the thread on Linux */ + u32 tid = current->pid; + + /* If the pid is 0 the core was idle. Instead of returning 0 we return a special number + * identifying which core we are on. */ + if (0 == tid) { + tid = -(1 + raw_smp_processor_id()); + } + + return tid; +} diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_notification.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_notification.c index 0afcb76318c..75ba05f791c 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_notification.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_notification.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_pm.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_pm.c index 16c1b579075..33a0b851437 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_pm.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_pm.c @@ -1,11 +1,11 @@ -/** - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_profiling.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_profiling.c index bb89be6bb4c..d6237dbbe7b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_profiling.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_profiling.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_specific.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_specific.h index c0d4f5d6dc6..d184b923c45 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_specific.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_specific.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_time.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_time.c index 3a0b354c958..945b008c484 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_time.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_time.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_timers.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_timers.c index e1f0df75f5c..6e852d80a31 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_timers.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_timers.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wait_queue.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wait_queue.c index fe2cc8bbe09..5a410dd77f0 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wait_queue.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wait_queue.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** @@ -44,7 +44,7 @@ void _mali_osk_wait_queue_wait_event( _mali_osk_wait_queue_t *queue, mali_bool ( { MALI_DEBUG_ASSERT_POINTER( queue ); MALI_DEBUG_PRINT(6, ("Adding to wait queue %p\n", queue)); - wait_event(queue->wait_queue, condition(data)); + wait_event_interruptible(queue->wait_queue, condition(data)); } void _mali_osk_wait_queue_wait_event_timeout( _mali_osk_wait_queue_t *queue, mali_bool (*condition)(void *), void *data, u32 timeout ) diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wq.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wq.c index 27babb4de74..85b7fc8fcd0 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wq.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_osk_wq.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_pmu_power_up_down.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_pmu_power_up_down.c index 7ad03de8b88..f076efa87ec 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_pmu_power_up_down.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_pmu_power_up_down.c @@ -1,11 +1,11 @@ -/** - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_events.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_events.h index 0164e8135f6..5b3924153e6 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_events.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_events.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PROFILING_EVENTS_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_gator_api.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_gator_api.h index 9736b4af4c4..c4e72108cf0 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_gator_api.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_gator_api.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PROFILING_GATOR_API_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.c index 90dce622f4e..62edca74e52 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.h index 07ffbb5026a..e97a73ac9b5 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_profiling_internal.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_PROFILING_INTERNAL_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.c index 19038649329..c57009491ba 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_sync.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.h index 45ae32b7052..a694fe9106a 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_sync.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_uk_types.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_uk_types.h index fac43ae4a84..3fa1575941e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_uk_types.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_uk_types.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2012 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_UK_TYPES_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_core.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_core.c index 281089b4e1b..e44bb1a726e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_core.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_core.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* memort allocation functions */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_gp.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_gp.c index d3992d1f8fa..573cabdda28 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_gp.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_gp.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* user space access */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_mem.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_mem.c index 6baf151a615..1b66f8f2be2 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_mem.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_mem.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* user space access */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_pp.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_pp.c index 1519230b8be..9ed9acff971 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_pp.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_pp.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* user space access */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_profiling.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_profiling.c index d77ca2517dd..f53ed469564 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_profiling.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_profiling.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* user space access */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_soft_job.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_soft_job.c index 4dd005dca25..7607f4926de 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_soft_job.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_soft_job.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* user space access */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_timeline.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_timeline.c index 40ef766c0fb..4d040d0e8f1 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_timeline.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_timeline.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* user space access */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_vsync.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_vsync.c index 18fdef68d78..50383e0b3bf 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_vsync.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_vsync.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2011-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* file system operations */ #include /* user space access */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_wrappers.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_wrappers.h index c28e554a56f..72b20ddb394 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_wrappers.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/linux/mali_ukk_wrappers.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.c index afb5427eb82..7148dda4b3e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.c @@ -1,3 +1,16 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program. +* If not, see . +*/ #include "mtk_debug.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.h index 6275ea16288..b22b2a341c4 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_debug.h @@ -1,3 +1,17 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program. +* If not, see . +*/ + #ifndef __MTK_DEBUG_H__ #define __MTK_DEBUG_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.c index 8eee1692d0e..c9cf66e73e3 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.c @@ -1,3 +1,17 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program. +* If not, see . +*/ + #include "mtk_mem_record.h" #include #include diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.h index 13f26355f9a..e54fa016094 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_mem_record.h @@ -1,3 +1,17 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program. +* If not, see . +*/ + #ifndef __MTK_MEM_RECORD_H__ #define __MTK_MEM_RECORD_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.c index 15240166fc2..08d97b845c5 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.c @@ -1,3 +1,17 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program. +* If not, see . +*/ + #include #include #include diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.h index 3c347f9c188..127ebbe870e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/mtk_common/mtk_pp.h @@ -1,3 +1,17 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program. +* If not, see . +*/ + #ifndef __MTK_PP_H__ #define __MTK_PP_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm.c index 314363af350..f93bb45d0dc 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.c index e9fcf80c645..5ef08e4531f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.h index bab8598b8d3..8ad6bceeec4 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/arm/arm_core_scaling.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform.c index f50e6de700f..26b20cfab33 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform.c @@ -1,3 +1,12 @@ +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ #include #include #include diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_met.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_met.c index 5238c5f65ef..6d5671c529e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_met.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_met.c @@ -1,3 +1,12 @@ +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ #include #include #include diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.c index 7779bec07e5..a8d0fa60cc5 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.c @@ -1,3 +1,12 @@ +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ #include #include "mali_kernel_common.h" #include "mali_osk.h" @@ -92,6 +101,10 @@ void mali_pmm_init(void) atomic_set((atomic_t *)&bPoweroff, 1); } mfg_pwr_unlock(flags); + + printk("MFG Clock issue: enable_pll UNIVPLL\n"); + enable_pll(UNIVPLL, "GPU"); + mali_platform_power_mode_change(MALI_POWER_MODE_ON); } diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.h index edd4b199f18..ecf13440b8f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/platform/platform_pmm.h @@ -1,3 +1,12 @@ +/* + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ #ifndef __PLATFORM_PMM_H__ #define __PLATFORM_PMM_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_200_regs.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_200_regs.h index 1aa67e74ba8..fb025b562c3 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_200_regs.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_200_regs.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _MALI200_REGS_H_ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_gp_regs.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_gp_regs.h index e865e13bbb8..37b8e8f0585 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_gp_regs.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/regs/mali_gp_regs.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _MALIGP2_CONROL_REGS_H_ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.c index dc44c4b16b0..b455dfcb97a 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_timestamp.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.h index 0b53257210a..861d6fb8e09 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-arm11-cc/mali_timestamp.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_TIMESTAMP_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.c b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.c index dc44c4b16b0..b455dfcb97a 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_timestamp.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.h b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.h index a059ebb7783..86e555f1fcb 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/mali/timestamp-default/mali_timestamp.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __MALI_TIMESTAMP_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/Kbuild b/drivers/misc/mediatek/gpu/mt8127/mali/ump/Kbuild old mode 100755 new mode 100644 index 644bfb9411b..4f62b785317 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/Kbuild +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/Kbuild @@ -1,11 +1,11 @@ # -# This confidential and proprietary software may be used only as -# authorised by a licensing agreement from ARM Limited -# (C) COPYRIGHT 2008-2012 ARM Limited -# ALL RIGHTS RESERVED -# The entire notice above must be reproduced on all authorised -# copies and copies may only be made to the extent permitted -# by a licensing agreement from ARM Limited. +# Copyright (C) 2010-2012 ARM Limited. All rights reserved. +# +# This program is free software and is provided to you under the terms of the GNU General Public License version 2 +# as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. +# +# A copy of the licence is included with the program, and can also be obtained from Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Set default configuration to use, if Makefile didn't provide one. diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile b/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile old mode 100755 new mode 100644 index 86b9711099e..778032ac260 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile @@ -1,11 +1,11 @@ # -# This confidential and proprietary software may be used only as -# authorised by a licensing agreement from ARM Limited -# (C) COPYRIGHT 2008-2012 ARM Limited -# ALL RIGHTS RESERVED -# The entire notice above must be reproduced on all authorised -# copies and copies may only be made to the extent permitted -# by a licensing agreement from ARM Limited. +# Copyright (C) 2010-2012, 2014 ARM Limited. All rights reserved. +# +# This program is free software and is provided to you under the terms of the GNU General Public License version 2 +# as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. +# +# A copy of the licence is included with the program, and can also be obtained from Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # For each arch check: CROSS_COMPILE , KDIR , CFLAGS += -DARCH diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile.common b/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile.common old mode 100755 new mode 100644 index 8e62aa05744..9bd2583c518 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile.common +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/Makefile.common @@ -1,11 +1,11 @@ # -# This confidential and proprietary software may be used only as -# authorised by a licensing agreement from ARM Limited -# (C) COPYRIGHT 2008-2011, 2013 ARM Limited -# ALL RIGHTS RESERVED -# The entire notice above must be reproduced on all authorised -# copies and copies may only be made to the extent permitted -# by a licensing agreement from ARM Limited. +# Copyright (C) 2010-2011, 2013-2014 ARM Limited. All rights reserved. +# +# This program is free software and is provided to you under the terms of the GNU General Public License version 2 +# as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. +# +# A copy of the licence is included with the program, and can also be obtained from Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # SRC = $(UMP_FILE_PREFIX)common/ump_kernel_common.c \ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/arch-pb-virtex5/config.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/arch-pb-virtex5/config.h index db140365a0a..99679cd13fb 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/arch-pb-virtex5/config.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/arch-pb-virtex5/config.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __ARCH_CONFIG_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_api.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_api.c index e77c822fb9f..d4b2a74ecee 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_api.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_api.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_osk.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.c index d57920c9a91..322d723e079 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.h index 59aee9ee1e1..ae0f26196ef 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_common.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __UMP_KERNEL_COMMON_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.c index 8863ff70399..e7bfe451757 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_kernel_common.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.h index 234c6fc51da..abbd4a8b1b7 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_descriptor_mapping.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_memory_backend.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_memory_backend.h index ad35b6f9185..2c4683b9f11 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_memory_backend.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_memory_backend.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_ref_drv.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_ref_drv.c index 30e04e8373a..b782013631f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_ref_drv.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_ref_drv.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "mali_osk.h" diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_types.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_types.h index 115c06ed27e..c6c1d8eda5f 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_types.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_kernel_types.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __UMP_KERNEL_TYPES_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_osk.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_osk.h index a146c5b555d..6409d4d30b5 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_osk.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_osk.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_ukk.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_ukk.h index fbc02be823c..217e74c5dbb 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_ukk.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/common/ump_ukk.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/license/proprietary/ump_kernel_license.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/license/proprietary/ump_kernel_license.h deleted file mode 100644 index 93ac8082bf1..00000000000 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/license/proprietary/ump_kernel_license.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2010-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. - */ - -/** - * @file ump_kernel_license.h - * Defines for the macro MODULE_LICENSE. - */ - -#ifndef __UMP_KERNEL_LICENSE_H__ -#define __UMP_KERNEL_LICENSE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define UMP_KERNEL_LINUX_LICENSE "Proprietary" -#define UMP_LICENSE_IS_GPL 0 - -#ifdef __cplusplus -} -#endif - -#endif /* __UMP_KERNEL_LICENSE_H__ */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ioctl.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ioctl.h index 326ff275975..b1b38409343 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ioctl.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ioctl.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __UMP_IOCTL_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.c index 8d15ecd7765..9e3d6e95f4b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* kernel module definitions */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.h index 5f302cf97d5..3cae7a15620 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_linux.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2007-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __UMP_KERNEL_LINUX_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.c index 4f41d1b24db..a26e3c62982 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* needed to detect kernel version specific code */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.h index dbd5356d413..cf66c332ac4 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_dedicated.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.c index 5e6fafd4929..56432b2a312 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2011, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* needed to detect kernel version specific code */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.h index 82b45c2435f..5bf9cd81408 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_kernel_memory_backend_os.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_memory_backend.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_memory_backend.c index 01c38e01442..d640b5f3185 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_memory_backend.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_memory_backend.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include /* kernel module definitions */ diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_atomics.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_atomics.c index 0d56ae08b5c..02193ba83e0 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_atomics.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_atomics.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2010 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_low_level_mem.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_low_level_mem.c index 4d5a7268416..376454de1f7 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_low_level_mem.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_low_level_mem.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2008-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_misc.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_misc.c index 6ed25d3447e..6b8dc0747e5 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_misc.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_osk_misc.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.c index f2b084efaf4..7d4072e70cf 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.h index ba028f2668f..12db54a494e 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_ref_wrappers.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2010, 2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.c b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.c index 64a62f69705..b054fd90e3d 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.c +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.c @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.h b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.h index 9b8c87df70b..521f7819fcf 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.h +++ b/drivers/misc/mediatek/gpu/mt8127/mali/ump/linux/ump_ukk_wrappers.h @@ -1,11 +1,11 @@ /* - * This confidential and proprietary software may be used only as - * authorised by a licensing agreement from ARM Limited - * (C) COPYRIGHT 2009-2010, 2012-2013 ARM Limited - * ALL RIGHTS RESERVED - * The entire notice above must be reproduced on all authorised - * copies and copies may only be made to the extent permitted - * by a licensing agreement from ARM Limited. + * Copyright (C) 2010, 2012-2014 ARM Limited. All rights reserved. + * + * This program is free software and is provided to you under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. + * + * A copy of the licence is included with the program, and can also be obtained from Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** diff --git a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.c b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.c index 752329bcb5d..de5667baf61 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.c +++ b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.c @@ -1,3 +1,16 @@ +/* + * Copyright (C) 2015 MediaTek 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #include "mtk_mali_kernel.h" #include "mali_kernel_common.h" /*for mali printf*/ #include /*For MFG sub-system clock control API*/ @@ -6,8 +19,10 @@ void MTKMALI_DumpRegister( void ) { +#if 0 #define DUMP_REG_INFO( addr ) MALIK_MSG("REG: %s = 0x%08x\n", #addr, M_READ32( addr, 0 )) unsigned long dummy; + unsigned long addr; MALIK_MSG("MTKMALI_DumpRegister-------:\n"); MALIK_MSG("MT_CG_MFG_G3D is %d\n", clock_is_on(MT_CG_MFG_G3D)); @@ -25,11 +40,15 @@ void MTKMALI_DumpRegister( void ) M_WRITE32( REG_MFG_DEBUG_SEL, 0x0, dummy ); DUMP_REG_INFO( REG_MFG_DEBUG_SEL ); + MALIK_MSG("---------------------------:\n"); + for(addr = G3D_CONFIG_BASE; addr < G3D_CONFIG_BASE + 0x19c; addr += 4) { + MALIK_MSG("%p, 0x%08x\n", (void *)addr, M_READ32(addr, 0)); + } MALIK_MSG("---------------------------:\n"); /*Dump Call stack*/ dump_stack(); - +#endif } diff --git a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.h b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.h index d481e553b00..b0673e62522 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.h +++ b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_kernel.h @@ -1,3 +1,16 @@ +/* + * Copyright (C) 2015 MediaTek 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef __MTK_MALI_KERNEL_H__ #define __MTK_MALI_KERNEL_H__ @@ -22,7 +35,7 @@ #define REG_MFG_CG_CON ( G3D_CONFIG_BASE + 0x0 ) #define REG_MFG_RESET ( G3D_CONFIG_BASE + 0xC ) -#define REG_MFG_DEBUG_SEL ( G3D_CONFIG_BASE + 0xF0 ) +#define REG_MFG_DEBUG_SEL ( G3D_CONFIG_BASE + 0x180 ) #define REG_SMI_CG_TEMP ( 0xF4000000 + 0x100 ) diff --git a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.c b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.c index fdc5f895380..1749d1a798b 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.c +++ b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.c @@ -1,3 +1,16 @@ +/* + * Copyright (C) 2015 MediaTek 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #include #include #include diff --git a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.h b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.h index e68bc1b5d4c..14c29fcdbca 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.h +++ b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_mali_trace.h @@ -1,3 +1,16 @@ +/* + * Copyright (C) 2015 MediaTek 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef __MTK_MALI_TRACE_H__ #define __MTK_MALI_TRACE_H__ diff --git a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_memory_if.c b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_memory_if.c index 13e5d6ab8f0..5d6f2990a6c 100644 --- a/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_memory_if.c +++ b/drivers/misc/mediatek/gpu/mt8127/mediatek/mtk_memory_if.c @@ -1 +1,14 @@ +/* + * Copyright (C) 2015 MediaTek 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + unsigned long diff --git a/drivers/misc/mediatek/hall/hall.c b/drivers/misc/mediatek/hall/hall.c deleted file mode 100644 index 8cbd15be890..00000000000 --- a/drivers/misc/mediatek/hall/hall.c +++ /dev/null @@ -1,180 +0,0 @@ -/* -* -*drivers/misc/mediatek/hall/hall.c -*Created by TCTSZ-WH,2014-6-17. Hall supported. -*Modified by TCTSZ falin.luo at 2015-4-17 -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "hall.h" - -#define CUST_EINT_POLARITY_LOW 0 - -static u8 hall_state = !CUST_EINT_POLARITY_LOW; -static struct input_dev *hall_input = NULL; -static struct hall_data *hall = NULL; -static struct class *hall_class = NULL; -static struct device *hall_dev = NULL; -static struct platform_device *hall_pdev = NULL; -extern unsigned int bl_brightness_hal; - - -static void do_hall_work(struct work_struct *work) -{ - u8 old_state = hall_state; - bool pressed; - - mt_eint_mask(CUST_EINT_MHALL_NUM); - - pr_info("%s",__func__); - - hall_state = !hall_state; - pressed = (hall_state == !!CUST_EINT_POLARITY_LOW); - - if((pressed == 1) && (bl_brightness_hal != 0)) { - input_report_key(hall_input, KEY_POWER, pressed); - input_sync(hall_input); - input_report_key(hall_input, KEY_POWER, !pressed); - input_sync(hall_input); - } - - if((pressed == 0) && (bl_brightness_hal == 0)) { - input_report_key(hall_input, KEY_POWER, !pressed); - input_sync(hall_input); - input_report_key(hall_input, KEY_POWER, pressed); - input_sync(hall_input); - } - - mt_eint_set_polarity(CUST_EINT_MHALL_NUM, old_state); - mt_eint_unmask(CUST_EINT_MHALL_NUM); -} - -static void interrupt_hall_irq(void) -{ -// pr_err("Hall sensor irq handled, gpio_value = %d\n", mt_get_gpio_in(GPIO_MHALL_EINT_PIN)); - queue_work(hall->hall_wq, &hall->hall_work); -} - - -int hall_probe(struct platform_device *pdev) -{ - int rc = 0; - - hall = kmalloc(sizeof(struct hall_data),GFP_KERNEL); - - if (hall == NULL) { - pr_err("%s:%d Unable to allocate memory\n",__func__, __LINE__); - return -ENOMEM; - } - - mt_set_gpio_mode(GPIO_MHALL_EINT_PIN, GPIO_MHALL_EINT_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_MHALL_EINT_PIN, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_MHALL_EINT_PIN, GPIO_PULL_ENABLE); - mt_set_gpio_pull_select(GPIO_MHALL_EINT_PIN, GPIO_PULL_UP); - - mt_eint_set_sens(CUST_EINT_MHALL_NUM, MT_LEVEL_SENSITIVE); - mt_eint_set_polarity(CUST_EINT_MHALL_NUM, CUST_EINT_POLARITY_LOW); - mt_eint_set_hw_debounce(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_DEBOUNCE_CN); - mt_eint_registration(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_TYPE, interrupt_hall_irq, 0); - mt_eint_unmask(CUST_EINT_MHALL_NUM); - - hall_input = input_allocate_device(); - if (!hall_input) { - pr_err("%s:%d Not enough memory!\n", __func__, __LINE__); - return -ENOMEM; - } - - hall_input->name = "hall"; - input_set_capability(hall_input, EV_KEY, KEY_POWER); - - rc = input_register_device(hall_input); - if (rc) - { - pr_err("Failed to register hall input device\n"); - return rc; - } - - hall->hall_wq = create_singlethread_workqueue("hall_wq"); - INIT_WORK(&hall->hall_work, do_hall_work); - - hall_class = class_create(THIS_MODULE, "hall"); - hall_dev = device_create(hall_class, NULL, 0, NULL, "cover"); - - pr_info("Hall Sensor Driver Probe Success!\n"); - - return 0; -} - -int hall_remove(struct platform_device *pdev) -{ - if (hall_dev) - device_del(hall_dev); - if (hall_class) - class_destroy(hall_class); - - input_unregister_device(hall_input); - - if (hall_input) - { - input_free_device(hall_input); - hall_input = NULL; - } - - kfree(hall); - - return 0; -} - -static struct platform_driver hall_driver = { - .probe = hall_probe, - .remove = hall_remove, - .driver = { - .name = "hall_sensor", - .owner = THIS_MODULE, - } -}; - -static int __init hall_init(void) -{ - int ret = platform_driver_register(&hall_driver); - - if (ret) - return ret; - - hall_pdev = platform_device_register_simple("hall_sensor", -1, NULL, 0); - - if (IS_ERR(hall_pdev)) { - platform_driver_unregister(&hall_driver); - return PTR_ERR(hall_pdev); - } - - pr_info("Hall Sensor Driver Initializ Success.\n"); - - return 0; -} - -static void __init hall_exit(void) -{ - platform_device_unregister(hall_pdev); - platform_driver_unregister(&hall_driver); -} - -module_init(hall_init); -module_exit(hall_exit); -MODULE_LICENSE("GPL"); - diff --git a/drivers/misc/mediatek/hall/hall.h b/drivers/misc/mediatek/hall/hall.h deleted file mode 100644 index cb321c7278e..00000000000 --- a/drivers/misc/mediatek/hall/hall.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __HALL_H__ -#define __HALL_H__ - -struct hall_data { - int irq_gpio; - int tp_is_suspend; - struct workqueue_struct *hall_wq; - struct work_struct hall_work; - void (*tp_set_sensitivity)(int); -}; - -#endif - diff --git a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.c b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.c index 9b6940c7a65..7b482641318 100644 --- a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.c +++ b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.c @@ -1,4 +1,4 @@ -#ifdef CONFIG_MTK_IN_HOUSE_TEE_SUPPORT +#ifdef MTK_IN_HOUSE_TEE_SUPPORT #include #include #include diff --git a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.h b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.h index c62b648f711..ea39ba2a2cd 100644 --- a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.h +++ b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_ca.h @@ -1,6 +1,6 @@ #ifndef _HDMI_CA_H_ #define _HDMI_CA_H_ -#ifdef CONFIG_MTK_IN_HOUSE_TEE_SUPPORT +#ifdef MTK_IN_HOUSE_TEE_SUPPORT bool fgCaHDMICreate(void); bool fgCaHDMIClose(void); diff --git a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_drv.c b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_drv.c index 3e2f57b0e80..88abb6ebdb2 100644 --- a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_drv.c +++ b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmi_drv.c @@ -56,7 +56,7 @@ #include "hdmicmd.h" #include -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) #include "hdmi_ca.h" #endif /*----------------------------------------------------------------------------*/ @@ -204,7 +204,7 @@ static void hdmi_get_params(HDMI_PARAMS *params) params->is_force_landscape = 1; params->scaling_factor = 0; - #ifndef CONFIG_MTK_HDMI_HDCP_SUPPORT + #ifndef MTK_HDMI_HDCP_SUPPORT params->NeedSwHDCP= 1; #endif } @@ -534,7 +534,7 @@ void hdmi_read(unsigned int u2Reg, unsigned int *p4Data) void hdmi_write(unsigned int u2Reg, unsigned int u4Data) { -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) if((u2Reg&0xFFFFF000)==0) { if(u2Reg < 0x100) @@ -614,7 +614,7 @@ static int hdmi_internal_init(void) register_early_suspend(&hdmi_hdmi_early_suspend_desc); #endif -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) printk("[HDMI]fgCaHDMICreate\n"); fgCaHDMICreate(); #endif diff --git a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmictrl.c b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmictrl.c index 46bf1d9f5bf..ef48e0f8bee 100644 --- a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmictrl.c +++ b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmictrl.c @@ -8,7 +8,7 @@ #include "hdmicec.h" #include -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) #include "hdmi_ca.h" #endif @@ -280,7 +280,7 @@ static const char* cSPDDeviceStr[16] = "reserved", }; -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) void ta_internal_hdmi_write(unsigned int u4Reg, unsigned int u4data) { vCaHDMIWriteReg(u4Reg,u4data); @@ -307,7 +307,7 @@ unsigned int hdmi_drv_read(unsigned short u2Reg) void hdmi_drv_write(unsigned short u2Reg, unsigned int u4Data) { -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) HDMI_DRV_LOG("[W]addr = 0x%04x, data = 0x%08x\n", u2Reg, u4Data); ta_internal_hdmi_write(HDMIDRV_BASE+u2Reg, u4Data); #else @@ -478,7 +478,7 @@ unsigned char bCheckPordHotPlug(unsigned char bMode) void MuteHDMIAudio(void) { -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) HDMI_AUDIO_FUNC(); fgCaHDMIAudioUnMute(FALSE); @@ -515,7 +515,7 @@ void hdmi_black_pattern_set(unsigned char cs) void vBlackHDMIOnly(void) { HDMI_DRV_FUNC(); -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) fgCaHDMIVideoUnMute(FALSE); #else //*(unsigned int*)(0xf4014f00) = 0x41; @@ -605,7 +605,7 @@ void vWriteHdmiIntMask(unsigned char bMask) void vUnBlackHDMIOnly(void) { HDMI_DRV_FUNC(); -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) fgCaHDMIVideoUnMute(TRUE); #else *(unsigned int*)(0xf4014f00) = 0x0; @@ -613,7 +613,7 @@ void vUnBlackHDMIOnly(void) } void UnMuteHDMIAudio(void) { -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) HDMI_AUDIO_FUNC(); fgCaHDMIAudioUnMute(TRUE); diff --git a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmihdcp.c b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmihdcp.c index 2265e6f5c63..fd9b213a3ab 100644 --- a/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmihdcp.c +++ b/drivers/misc/mediatek/hdmi/internal_hdmi/mt8127/hdmihdcp.c @@ -4,7 +4,7 @@ #include "hdmihdcp.h" #include "hdmi_ctrl.h" #include "hdmiddc.h" -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) #include "hdmi_ca.h" #endif #include @@ -41,7 +41,7 @@ static unsigned char bHdcpKeyExternalBuff[HDCP_KEY_RESERVE]= { extern HDMI_CTRL_STATE_T e_hdmi_ctrl_state; extern HDCP_CTRL_STATE_T e_hdcp_ctrl_state; -#ifdef CONFIG_MTK_HDMI_HDCP_SUPPORT +#ifdef MTK_HDMI_HDCP_SUPPORT unsigned char _bHdcpOff=0; #else unsigned char _bHdcpOff=1; @@ -62,7 +62,7 @@ unsigned char _bsvpaudiomute=FALSE; extern size_t hdmi_TmrValue[MAX_HDMI_TMR_NUMBER]; extern size_t hdmi_hdmiCmd; -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) static unsigned char u1CaHdcpAKsv[HDCP_AKSV_COUNT]; #endif void vShowHdcpRawData(void) @@ -119,8 +119,8 @@ void vShowHdcpRawData(void) void hdmi_hdcpkey(unsigned char *pbhdcpkey) { -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) -#ifdef CONFIG_MTK_DRM_KEY_MNG_SUPPORT +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) +#ifdef MTK_DRM_KEY_MNG_SUPPORT HDMI_HDCP_FUNC(); fgCaHDMIInstallHdcpKey(pbhdcpkey,384); fgCaHDMIGetAKsv(u1CaHdcpAKsv); @@ -218,7 +218,7 @@ void vHalHDCPReset(void) } vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp); -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) fgCaHDMIHDCPEncEn(FALSE); fgCaHDMIHDCPReset(TRUE); #endif @@ -232,7 +232,7 @@ void vHalHDCPReset(void) bTemp &= (~HDCP_CTL_CP_RSTB); vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp); -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) fgCaHDMIHDCPReset(FALSE); #endif @@ -329,7 +329,7 @@ void vReadAksvFromReg(BYTE *PrBuff) void vWriteAksvKeyMask(unsigned char *PrData) { -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) HDMI_HDCP_FUNC(); vWriteHdmiSYSMsk(HDMI_SYS_CFG1C,0, SYS_KEYMASK2); vWriteHdmiSYSMsk(HDMI_SYS_CFG1C,0, SYS_KEYMASK1); @@ -550,7 +550,7 @@ unsigned char fgCompareRi(void) void vEnableEncrpt(void) { -#if (defined(CONFIG_MTK_IN_HOUSE_TEE_SUPPORT) && defined(CONFIG_MTK_HDMI_HDCP_SUPPORT)) +#if (defined(MTK_IN_HOUSE_TEE_SUPPORT) && defined(MTK_HDMI_HDCP_SUPPORT)) HDMI_HDCP_FUNC(); fgCaHDMIHDCPEncEn(TRUE); #else @@ -815,7 +815,7 @@ void HdcpService(HDCP_CTRL_STATE_T e_hdcp_state) { for(bIndx=0; bIndx -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "I2C.h" -#include "tmNxCompId.h" -#include "tmdlHdmiTx_IW.h" -#include -#ifdef BUILD_UBOOT -#include -#else -#include -#include "mach/eint.h" -#include "mach/irqs.h" -#endif -#include "hdmi_drv.h" - -static size_t hdmi_i2c_log_on; -#define HDMI_I2C_LOG(fmt, arg...) \ - do { \ - if (hdmi_i2c_log_on) \ - { \ - pr_debug("[hdmi_i2c log], %s, #%d", __func__, __LINE__); \ - pr_debug(fmt, ##arg); \ - } \ - } while (0) - -#define HDMI_I2C_FUNC() \ - do { \ - if (hdmi_i2c_log_on) pr_debug("[hdmi_i2c func] %s\n", __func__); \ - } while (0) - -void hdmi_i2c_log_enable(int enable) -{ - pr_debug("hdmi_i2c log %s\n", enable ? "enabled" : "disabled"); - hdmi_i2c_log_on = enable; -} - -extern void I2C_ISR(void); - -unsigned char nb_byte[3]; -unsigned char slave[3]; -unsigned char *pt_mtd[3], *pt_mrd[3]; -volatile unsigned char transmission; -unsigned char rep_start_cntr; -unsigned char ptr[255]; - -/* Semaphore for I²C access */ -tmdlHdmiTxIWSemHandle_t gI2CSemaphore; - -/*===========================================================================* -* * -* FUNCTION NAME: I2C_Init * -* DESCRIPTION : I²C initialisation * -* * -* INPUT : none * -* OUTPUT : none * -* * -* RETURN : none * -* * -* CONTEXT : SYNCHRONOUS * -*============================================================================*/ -/* SW GPIO I2C */ -#if 0 - -/* 6589EVB */ -/* #define GPIO_HDMI_I2C_SDA GPIO74 */ -/* #define GPIO_HDMI_I2C_SCL GPIO73 */ - -#if defined GPIO_HDMI_I2C_SDA -#define GPIO_SDA GPIO_HDMI_I2C_SDA -#else -#error "GPIO_HDMI_I2C_SDA is not defined" -#endif - -#if defined GPIO_HDMI_I2C_SCL -#define GPIO_SCL GPIO_HDMI_I2C_SCL -#else -#error "GPIO_HDMI_I2C_SCL is not defined" -#endif - -#define SET_SCCB_CLK_OUTPUT mt_set_gpio_dir(GPIO_SCL, GPIO_DIR_OUT) -#define SET_SCCB_CLK_INPUT mt_set_gpio_dir(GPIO_SCL, GPIO_DIR_IN) -#define SET_SCCB_DATA_OUTPUT mt_set_gpio_dir(GPIO_SDA, GPIO_DIR_OUT) -#define SET_SCCB_DATA_INPUT mt_set_gpio_dir(GPIO_SDA, GPIO_DIR_IN) - -#define SET_SCCB_CLK_HIGH mt_set_gpio_out(GPIO_SCL, GPIO_OUT_ONE) -#define SET_SCCB_CLK_LOW mt_set_gpio_out(GPIO_SCL, GPIO_OUT_ZERO) -#define SET_SCCB_DATA_HIGH mt_set_gpio_out(GPIO_SDA, GPIO_OUT_ONE) -#define SET_SCCB_DATA_LOW mt_set_gpio_out(GPIO_SDA, GPIO_OUT_ZERO) - -#define GET_SCCB_DATA_BIT mt_get_gpio_in(GPIO_SDA) - -#define I2C_DELAY 2 - -static int i2c_delay(unsigned int n) -{ -#if 1 - udelay(n); -#else - unsigned int count = 1024 * n; - asm volatile ("1: \n\t" - "subs %[count], %[count], #1 \n\t" - "bge 1b \n\t":[count] "+r"(count) - : : "memory"); -#endif - return 0; -} - - -#define I2C_START_TRANSMISSION \ -{ \ - /*volatile unsigned char j;*/ \ - SET_SCCB_CLK_OUTPUT; \ - SET_SCCB_DATA_OUTPUT; \ - SET_SCCB_CLK_HIGH; \ - SET_SCCB_DATA_HIGH; \ - /*for(j=0;j= 0; i--) { /* data bit 7~0 */ - if (send_byte & (1 << i)) { - SET_SCCB_DATA_HIGH; - } else { - SET_SCCB_DATA_LOW; - } - i2c_delay(I2C_DELAY); - SET_SCCB_CLK_HIGH; - i2c_delay(I2C_DELAY); - SET_SCCB_CLK_LOW; - i2c_delay(I2C_DELAY); - } - /* don't care bit, 9th bit */ - SET_SCCB_DATA_LOW; - SET_SCCB_DATA_INPUT; - SET_SCCB_CLK_HIGH; - i2c_delay(I2C_DELAY); - SET_SCCB_CLK_LOW; - SET_SCCB_DATA_OUTPUT; -} /* SCCB_send_byte() */ - -static unsigned char SCCB_get_byte(void) -{ - volatile signed char i; - /* volatile unsigned char j; */ - unsigned char get_byte = 0; - - SET_SCCB_DATA_INPUT; - - for (i = 7; i >= 0; i--) { /* data bit 7~0 */ - SET_SCCB_CLK_HIGH; - /* for(j=0;j -DEFINE_SEMAPHORE(i2c_mutex); - -tmErrorCode_t Init_i2c(void) -{ - tmErrorCode_t errCode; -#if 1 - HDMI_I2C_LOG("hdmi, %s\n", __func__); - mt_set_gpio_mode(GPIO_SDA, GPIO_MODE_00); - mt_set_gpio_mode(GPIO_SCL, GPIO_MODE_00); - - mt_set_gpio_dir(GPIO_SDA, GPIO_DIR_OUT); - mt_set_gpio_dir(GPIO_SCL, GPIO_DIR_OUT); -#endif - -#if 0 - /* Initialize I²C */ - I2CONCLR = 0x6C; /* Clear Control Set Register */ - I2CONSET = 0x40; /* Enable I²C */ - - /* Maximum speed for TDA9984 is 400 Khz */ - /* 60 Khz = pclk / (I²CSCLH + I²CSCLL) with pclk = peripheral clock */ - /* according to VBPDIV Fpclk = Fcclk/4 = 60/4 = 15 Mhz */ - /* so I²CSCLH + I²CSCLL = 37 */ - I2SCLH = 0x7D; - I2SCLL = 0x7D; - - /* Initialize VIC for I²C use */ - VICIntEnable |= 0x200; /* Enable I²C interruption */ - VICVectCntl0 = 0x29; /* Enable I²C canal in IRQ Mode */ - VICVectAddr0 = (unsigned long)I2C_ISR; - -#endif - /* Create the semaphore to protect I²C access */ - /* errCode = tmdlHdmiTxIWSemaphoreCreate(&gI2CSemaphore); */ - - gI2CSemaphore = (unsigned long)(&i2c_mutex); - errCode = TM_OK; - - return errCode; -} - -/*===========================================================================* -* * -* FUNCTION NAME: I2C_write * -* DESCRIPTION : Write a series of bytes out the I2C bus to the given * -* slave address * -* * -* INPUT : unsigned char Address -- Address of slave * -* unsigned char nb_char -- Nb of data bytes to write * -* unsigned char *ptr -- Pointer to data to send * -* OUTPUT : unsigned char -- Status of I2C bus at * -* start of write. * -* * -* RETURN : none * -* * -* CONTEXT : SYNCHRONOUS * -*============================================================================*/ - -unsigned char Write_i2c(unsigned char address, unsigned char *ptr, unsigned char nb_char) -{ - /* unsigned char i; */ - int hConnection; - - HDMI_I2C_LOG("hdmi, %s, addr = 0x%08x, count = %d, data= 0x%08x, 0x%08x\n", __func__, - address, nb_char, ptr[0], ptr[1]); - - switch (address) { - case reg_TDA997X: - hConnection = (2 * slaveAddressTDA9975A); - break; - case reg_TDA998X: - hConnection = (2 * slaveAddressTDA9984); - break; - case reg_TDA8778: - hConnection = (2 * slaveAddressTDA8778); - break; - case reg_UDA1355H: - hConnection = (2 * slaveAddressUDA1355H); - break; - case reg_MAX4562: - hConnection = (2 * slaveAddressMAX4562); - break; - case reg_TDA9989_CEC: - case reg_TDA9950: - hConnection = (2 * slaveAddressDriverHdmiCEC); - break; - case reg_PCA9536: - hConnection = (2 * slaveAddressPCA9536); - break; - - default: - return (unsigned char)~TM_OK; /* TMBSL_ERR_INTEG_PARAMETER1; */ - } - - if (nb_char > 2) { - HDMI_I2C_LOG("hdmi, !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%s, nb_char=%d\n", __func__, - nb_char); - sccb_write_multi((hConnection), ptr, nb_char); - } else { - sccb_write((hConnection), ptr[0], ptr[1]); - } -#if 0 - - pt_mtd[0] = ptr; - nb_byte[0] = nb_char; - slave[0] = hConnection & 0xFE; /* SLA + W */ - rep_start_cntr = 0; /* No repeated starts - hence using element 0 in the arrays */ - - transmission = INIT; /* Start transmission */ - I2CONSET = 0x20; - - while (transmission == INIT) - i++; /* Wait free bus */ - while (transmission == START) - i++; /* Wait end of transmission */ -#endif - return 0; -} - - - - - -/*===========================================================================* -* * -* FUNCTION NAME: I2C_read * -* DESCRIPTION : Read a series of bytes out the I2C bus from the given * -* slave address * -* * -* INPUT : unsigned char address -- Address of slave * -* unsigned char pos -- offset in device * -* unsigned char nb_char -- Nb of data bytes to read * -* unsigned char *ptr -- Pointer to data to receive* -* OUTPUT : unsigned char -- Status of I2C bus at * -* start of write. * -* * -* RETURN : none * -* * -* CONTEXT : SYNCHRONOUS * -*============================================================================*/ - - -unsigned char Read_at_i2c(unsigned char address, unsigned char pos, unsigned char nb_char, - unsigned char *ptr) -{ - /* unsigned char i; */ - int hConnection; - switch (address) { - case reg_TDA997X: - hConnection = (2 * slaveAddressTDA9975A); - break; - case reg_TDA998X: - hConnection = (2 * slaveAddressTDA9984); - break; - case reg_TDA8778: - hConnection = (2 * slaveAddressTDA8778); - break; - case reg_UDA1355H: - hConnection = (2 * slaveAddressUDA1355H); - break; - case reg_MAX4562: - hConnection = (2 * slaveAddressMAX4562); - break; - case reg_TDA9989_CEC: - case reg_TDA9950: - hConnection = (2 * slaveAddressDriverHdmiCEC); - break; - case reg_PCA9536: - hConnection = (2 * slaveAddressPCA9536); - break; - default: - return (unsigned char)~TM_OK; /* TMBSL_ERR_INTEG_PARAMETER1; */ - } - *ptr = sccb_read((hConnection), pos); - HDMI_I2C_LOG("hdmi, %s, address=0x%08x, pos=0x%08x, nb_char=0x%08x, value=0x%08x\n", - __func__, address, pos, nb_char, *ptr); - - return 0; -#if 0 - - - - pt_mtd[1] = &pos; - pt_mrd[0] = ptr; - nb_byte[1] = 1; - nb_byte[0] = nb_char; - slave[1] = hConnection & 0xFE; /* SLA + W */ - slave[0] = hConnection | 0x01; /* SLA + R */ - rep_start_cntr = 1; /* One repeated start - element 1s in arrays for Write, element 0s for Read */ - - transmission = INIT; - I2CONSET = 0x20; /* Start transmission */ - while (transmission == INIT) - i++; /* Wait free bus */ - while (transmission == START) - i++; /* Wait end of transmission */ - return (transmission); -#endif -} - - -/*===========================================================================* -* * -* FUNCTION NAME: Read_edid * -* DESCRIPTION : Read a series of bytes out the I2C bus from the given * -* slave address * -* * -* INPUT : unsigned char seg_addr -- Address of slave * -* unsigned char seg_ptr -- offset in device * -* unsigned char data_addr -- Nb of data bytes to read * -* unsigned char word_offset -- Pointer to data to receive * -* unsigned char nb_char -- Pointer to data to receive * -* unsigned char *ptr -- Pointer to data to receive * -* OUTPUT : none * -* * -* RETURN : unsigned char -- Status of I2C bus -* * -* CONTEXT : SYNCHRONOUS * -*============================================================================*/ -/********************************************/ -/* R E A D _ E D I D */ -/* */ -/* Write segment pointer, repeated start, */ -/* write word offset, repeated start, */ -/* read no. bytes requested, stop. */ -/********************************************/ -unsigned char Read_edid(unsigned char seg_addr, unsigned char seg_ptr, unsigned char data_addr, - unsigned char word_offset, unsigned char nb_char, unsigned char *ptr) -{ - /* unsigned char i; */ - HDMI_I2C_LOG("hdmi, %s\n", __func__); -#if 0 - - pt_mtd[2] = &seg_ptr; - pt_mtd[1] = &word_offset; - pt_mrd[0] = ptr; - nb_byte[2] = 1; /* Single byte for Segment pointer */ - nb_byte[1] = 1; /* Single byte for Word offset */ - nb_byte[0] = nb_char; /* Number of EDID bytes to read */ - slave[2] = seg_addr & 0xFE; /* SLA + W, segment pointer */ - slave[1] = data_addr & 0xFE; /* SLA + W, data pointer */ - slave[0] = data_addr | 0x01; /* SLA + R, data pointer */ - if (seg_addr == 0) { /* If segptr address invalid, skip the segptr write - allows for quick block 0/1 reads */ - rep_start_cntr = 1; /* One repeated start. 1=Write word offset, 0=Read data */ - } else { - rep_start_cntr = 2; /* Two repeated starts. 2=Write segptr, 1=Write word offset, 0=Read data */ - } - - - transmission = INIT; - I2CONSET = 0x20; /* Start transmission */ - while (transmission == INIT) - i++; /* Wait free bus */ - while (transmission == START) - i++; /* Wait end of transmission */ -#endif - return (transmission); -} - - - -tmErrorCode_t i2cWrite(i2cRegisterType_t type_register, tmbslHdmiSysArgs_t *pSysArgs) -{ - - tmErrorCode_t errCode; - int i; - - /* Take the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreP(gI2CSemaphore); - if (errCode) { - return errCode; - } - - ptr[0] = pSysArgs->firstRegister; - - for (i = 1; i <= pSysArgs->lenData; i++) { - ptr[i] = (*pSysArgs->pData); - (pSysArgs->pData)++; - } - pSysArgs->lenData++; - - errCode = Write_i2c(type_register, ptr, pSysArgs->lenData); - if (errCode) { - /* Release the semaphore if an error is detected */ - tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - return errCode; - } - - /* Release the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - if (errCode) { - return errCode; - } - - return errCode; -} - - -tmErrorCode_t i2cRead(i2cRegisterType_t type_register, tmbslHdmiSysArgs_t *pSysArgs) -{ - tmErrorCode_t errCode; - - /* Take the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreP(gI2CSemaphore); - if (errCode) { - return errCode; - } - - errCode = - Read_at_i2c(type_register, pSysArgs->firstRegister, pSysArgs->lenData, pSysArgs->pData); - if (errCode) { - /* Release the semaphore if an error is detected */ - tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - return errCode; - } - - /* Release the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - if (errCode) { - return errCode; - } - - return errCode; -} - - - -/********************************************/ -/* i2cReadEdid */ -/* */ -/* For TDA 9983 only !!!! */ -/* */ -/* Write segment pointer, repeated start, */ -/* write word offset, repeated start, */ -/* read no. bytes requested, stop. */ -/********************************************/ -unsigned char i2cReadEdid(unsigned char seg_addr, unsigned char seg_ptr, unsigned char data_addr, - unsigned char word_offset, unsigned char nb_char, unsigned char *ptr) -{ - /* unsigned char i; */ - /* tmErrorCode_t errCode; */ - - HDMI_I2C_LOG("hdmi, %s\n", __func__); -#if 0 - /* Take the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreP(gI2CSemaphore); - if (errCode) { - return errCode; - } - - pt_mtd[2] = &seg_ptr; - pt_mtd[1] = &word_offset; - pt_mrd[0] = ptr; - nb_byte[2] = 1; /* Single byte for Segment pointer */ - nb_byte[1] = 1; /* Single byte for Word offset */ - nb_byte[0] = nb_char; /* Number of EDID bytes to read */ - slave[2] = seg_addr & 0xFE; /* SLA + W, segment pointer */ - slave[1] = data_addr & 0xFE; /* SLA + W, data pointer */ - slave[0] = data_addr | 0x01; /* SLA + R, data pointer */ - if (seg_addr == 0) { /* If segptr address invalid, skip the segptr write - allows for quick block 0/1 reads */ - rep_start_cntr = 1; /* One repeated start. 1=Write word offset, 0=Read data */ - } else { - rep_start_cntr = 2; /* Two repeated starts. 2=Write segptr, 1=Write word offset, 0=Read data */ - } - - - transmission = INIT; - I2CONSET = 0x20; /* Start transmission */ - while (transmission == INIT) - i++; /* Wait free bus */ - while (transmission == START) - i++; /* Wait end of transmission */ - - /* Release the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - if (errCode) { - return errCode; - } -#endif - - return (transmission); -} - -#else /* SW I2C */ - -#include -DEFINE_SEMAPHORE(i2c_mutex); - -/*----------------------------------------------------------------------------*/ -/* HDMI device information */ -/*----------------------------------------------------------------------------*/ -#define MAX_TRANSACTION_LENGTH 8 -#define HDMI_DEVICE_NAME "mtk-hdmi" -#define NXP19989_I2C_SLAVE_ADDR slaveAddressTDA9989 -/*----------------------------------------------------------------------------*/ -static int hdmi_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); -/* static int hdmi_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info); */ -static int hdmi_i2c_remove(struct i2c_client *client); -/*----------------------------------------------------------------------------*/ -static struct i2c_client *nxp19989_i2c_client; -static const struct i2c_device_id hdmi_i2c_id[] = { {HDMI_DEVICE_NAME, 0}, {} }; - -static struct i2c_board_info i2c_hdmi __initdata = { - I2C_BOARD_INFO(HDMI_DEVICE_NAME, (NXP19989_I2C_SLAVE_ADDR >> 1)), - /*I2C_BOARD_INFO(HDMI_DEVICE_NAME, (slaveAddressDriverHdmiCEC>>1)) */ -}; - -/*----------------------------------------------------------------------------*/ -struct i2c_driver hdmi_i2c_driver = { - .probe = hdmi_i2c_probe, - .remove = hdmi_i2c_remove, - /* .detect = hdmi_i2c_detect, */ - .driver = {.name = HDMI_DEVICE_NAME,}, - .id_table = hdmi_i2c_id, - /* .address_list = (const unsigned short*) forces, */ -}; - -struct nxp19989_i2c_data { - struct i2c_client *client; - uint16_t addr; - int use_reset; /* use RESET flag */ - int use_irq; /* use EINT flag */ - int retry; -}; - -static struct nxp19989_i2c_data *obj_i2c_data; - -tmErrorCode_t Init_i2c(void) -{ - tmErrorCode_t errCode; - HDMI_I2C_LOG("hdmi, %s\n", __func__); - - - i2c_register_board_info(0, &i2c_hdmi, 1); - - if (i2c_add_driver(&hdmi_i2c_driver)) { - HDMI_I2C_LOG("unable to add HDMI i2c driver.\n"); - return -1; - - } - gI2CSemaphore = (unsigned long)(&i2c_mutex); - errCode = TM_OK; - - return errCode; -} - - -#include "tda998x.h" -extern tda_instance our_instance; -/*----------------------------------------------------------------------------*/ - -static int hdmi_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - int ret = -1; - struct nxp19989_i2c_data *obj; - tda_instance *this; - - HDMI_I2C_LOG("MediaTek HDMI i2c probe\n"); - - obj = kzalloc(sizeof(*obj), GFP_KERNEL); - if (obj == NULL) { - ret = -ENOMEM; - HDMI_I2C_LOG(HDMI_DEVICE_NAME ": Allocate ts memory fail\n"); - return ret; - } - obj_i2c_data = obj; - obj->client = client; - - - this = &our_instance; - this->driver.i2c_client = client; - - - nxp19989_i2c_client = obj->client; - i2c_set_clientdata(client, obj); - - HDMI_I2C_LOG("MediaTek HDMI i2c probe success\n"); - - return 0; -} - -/*----------------------------------------------------------------------------*/ - -static int hdmi_i2c_remove(struct i2c_client *client) -{ - nxp19989_i2c_client = NULL; - i2c_unregister_device(client); - kfree(i2c_get_clientdata(client)); - i2c_del_driver(&hdmi_i2c_driver); - return 0; -} - -tmErrorCode_t suspend_i2c(void) -{ - return TM_OK; -} - -tmErrorCode_t resume_i2c(void) -{ - return TM_OK; -} - - - -static void sccb_write(unsigned char slave_addr, unsigned char addr, unsigned char data) -{ - - /* HDMI_I2C_LOG("%s:slave_addr = 0x%x, addr=0x%x, data=%d\n", __func__, slave_addr, addr, data); */ - - struct i2c_client *client = nxp19989_i2c_client; - u8 buf[2]; - int ret = 0; - u32 client_main_addr = client->addr; - - /* DevLib needs address control, so let it be */ - client->addr = slave_addr; - - buf[0] = addr; - buf[1] = data; - - ret = i2c_master_send(client, (const char *)buf, 2); - if (ret < 0) { - HDMI_I2C_LOG("send command error!!\n"); - return /*-EFAULT*/; - } - - /* restore default client address */ - client->addr = client_main_addr; - - return /*0 */; -} - -static void sccb_write_multi(unsigned char slave_addr, unsigned char *data, unsigned int len) -{ - /* HDMI_I2C_LOG("%s:slave_addr = 0x%x, data=0x%x, len=%d\n", __func__, slave_addr, *data, len); */ - - /*because address also occupies one byte, the maximum length for write is 7 bytes */ - int err, idx /*, num */; - char buf[MAX_TRANSACTION_LENGTH]; - struct i2c_client *client = nxp19989_i2c_client; - - u32 client_main_addr = client->addr; - - /* DevLib needs address control, so let it be */ - client->addr = slave_addr; - - - if (!client) { - return /*-EINVAL*/; - } -#if 0 - if (len >= MAX_TRANSACTION_LENGTH) { - HDMI_I2C_LOG(" length %d exceeds %d\n", len, MAX_TRANSACTION_LENGTH); - return -EINVAL; - } - - num = 0; - for (idx = 0; idx < len; idx++) { - buf[num++] = data[idx]; - } - - err = i2c_master_send(client, buf, num); - if (err < 0) { - HDMI_I2C_LOG("send command error!!\n"); - return -EFAULT; - } else { - err = 0; /*no error */ - } -#else - buf[0] = *data; - data++; - for (idx = len - 1; idx != 0; idx--) { - buf[1] = *data; - err = i2c_master_send(client, buf, 2); - if (err < 0) { - HDMI_I2C_LOG("send command error!!\n"); - return /*-EFAULT*/; - } - data++; - buf[0] = buf[0] + 1; /* ---------------------------------------------- */ - } -#endif - - /* restore default client address */ - client->addr = client_main_addr; - - - return /*err */; -} - - -static unsigned int sccb_read(unsigned char slave_addr, unsigned char addr) -{ - /* HDMI_I2C_LOG("enter sccb read, slave_addr = 0x%x\n, offset = 0x%x", slave_addr, addr); */ - - u8 buf; - int ret = 0; - struct i2c_client *client = nxp19989_i2c_client; - - - u32 client_main_addr = client->addr; - - /* DevLib needs address control, so let it be */ - client->addr = slave_addr; - - - - buf = addr; - ret = i2c_master_send(client, (const char *)&buf, 1); - if (ret < 0) { - HDMI_I2C_LOG("send command error!!\n"); - return -EFAULT; - } - ret = i2c_master_recv(client, (char *)&buf, 1); - if (ret < 0) { - HDMI_I2C_LOG("reads data error!!\n"); - return -EFAULT; - } - - - /* restore default client address */ - client->addr = client_main_addr; - - - /* HDMI_I2C_LOG("exit sccb_read, readed = %d", buf); */ - return buf; -} - - -unsigned char Write_i2c(unsigned char address, unsigned char *ptr, unsigned char nb_char) -{ - /* unsigned char i; */ - int hConnection; - /* HDMI_I2C_LOG("hdmi, %s, 0x%08x, 0x%08x, 0x%08x, %d bytes\n", __func__, address, ptr[0], ptr[1], nb_char); */ - switch (address) { - case reg_TDA997X: - hConnection = (2 * slaveAddressTDA9975A); - break; - case reg_TDA998X: - hConnection = (2 * slaveAddressTDA9984); - break; - case reg_TDA8778: - hConnection = (2 * slaveAddressTDA8778); - break; - case reg_UDA1355H: - hConnection = (2 * slaveAddressUDA1355H); - break; - case reg_MAX4562: - hConnection = (2 * slaveAddressMAX4562); - break; - case reg_TDA9989_CEC: - case reg_TDA9950: - hConnection = (2 * slaveAddressDriverHdmiCEC); - break; - case reg_PCA9536: - hConnection = (2 * slaveAddressPCA9536); - break; - - default: - return (unsigned char)~TM_OK; /* TMBSL_ERR_INTEG_PARAMETER1; */ - } - - - hConnection = hConnection >> 1; - - if (nb_char > 2) { - /* HDMI_I2C_LOG("hdmi, !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%s, nb_char=%d\n", __func__, nb_char); */ - sccb_write_multi((hConnection), ptr, nb_char); - } else { - sccb_write((hConnection), ptr[0], ptr[1]); - } - return 0; -} - - - -unsigned char Read_at_i2c(unsigned char address, unsigned char pos, unsigned char nb_char, - unsigned char *ptr) -{ - /* unsigned char i; */ - int hConnection; - switch (address) { - case reg_TDA997X: - hConnection = (2 * slaveAddressTDA9975A); - break; - case reg_TDA998X: - hConnection = (2 * slaveAddressTDA9984); - break; - case reg_TDA8778: - hConnection = (2 * slaveAddressTDA8778); - break; - case reg_UDA1355H: - hConnection = (2 * slaveAddressUDA1355H); - break; - case reg_MAX4562: - hConnection = (2 * slaveAddressMAX4562); - break; - case reg_TDA9989_CEC: - case reg_TDA9950: - hConnection = (2 * slaveAddressDriverHdmiCEC); - break; - case reg_PCA9536: - hConnection = (2 * slaveAddressPCA9536); - break; - default: - return (unsigned char)~TM_OK; /* TMBSL_ERR_INTEG_PARAMETER1; */ - } - - hConnection = hConnection >> 1; - - - *ptr = sccb_read((hConnection), pos); - /* HDMI_I2C_LOG("hdmi, %s, addr 0x%08x, pos=0x%08x, nb 0x%08x, value=0x%08x\n", __func__, address, pos, nb_char, *ptr); */ - - return 0; -} - -unsigned char Read_edid(unsigned char seg_addr, unsigned char seg_ptr, unsigned char data_addr, - unsigned char word_offset, unsigned char nb_char, unsigned char *ptr) -{ - HDMI_I2C_LOG("hdmi, %s\n", __func__); - return (transmission); -} - - - -tmErrorCode_t i2cWrite(i2cRegisterType_t type_register, tmbslHdmiSysArgs_t *pSysArgs) -{ - - /* HDMI_I2C_LOG("hdmi, %s\n", __func__); */ - tmErrorCode_t errCode; - int i; - - /* Take the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreP(gI2CSemaphore); - if (errCode) { - return errCode; - } - - ptr[0] = pSysArgs->firstRegister; - - for (i = 1; i <= pSysArgs->lenData; i++) { - ptr[i] = (*pSysArgs->pData); - (pSysArgs->pData)++; - } - pSysArgs->lenData++; - - errCode = Write_i2c(type_register, ptr, pSysArgs->lenData); - if (errCode) { - /* Release the semaphore if an error is detected */ - tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - return errCode; - } - - /* Release the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - if (errCode) { - return errCode; - } - - return errCode; -} - - - -tmErrorCode_t i2cRead(i2cRegisterType_t type_register, tmbslHdmiSysArgs_t *pSysArgs) -{ - tmErrorCode_t errCode; - - /* Take the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreP(gI2CSemaphore); - if (errCode) { - return errCode; - } - - errCode = - Read_at_i2c(type_register, pSysArgs->firstRegister, pSysArgs->lenData, pSysArgs->pData); - if (errCode) { - /* Release the semaphore if an error is detected */ - tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - return errCode; - } - - /* Release the semaphore for I²C */ - errCode = tmdlHdmiTxIWSemaphoreV(gI2CSemaphore); - if (errCode) { - return errCode; - } - - return errCode; -} - - - -unsigned char i2cReadEdid(unsigned char seg_addr, unsigned char seg_ptr, unsigned char data_addr, - unsigned char word_offset, unsigned char nb_char, unsigned char *ptr) -{ - - HDMI_I2C_LOG("hdmi, %s\n", __func__); - - return (transmission); -} - - -#endif /* end SW I2C */ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/Makefile b/drivers/misc/mediatek/hdmi/nxp_tda19989/Makefile deleted file mode 100755 index 1ffbfde11df..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -ifeq ($(CONFIG_MTK_HDMI_SUPPORT),y) -ifeq ($(CONFIG_CUSTOM_KERNEL_HDMI),nxp_tda19989) -ccflags-y += -DTMFL_TDA19989 -DTMFL_NO_RTOS -DTMFL_LINUX_OS_KERNEL_DRIVER - -obj-y += \ - hdmi_drv.o \ - tmbslTDA9989_HDCP.o \ - tmbslTDA9989_local.o \ - tmbslTDA9989_State.o \ - tmdlHdmiTx_local.o \ - tmbslTDA9989_Edid.o \ - tmbslTDA9989_InOut.o \ - tmbslTDA9989_Misc.o \ - tmdlHdmiTx.o \ - tmdlHdmiTx_cfg.o \ - I2C_api.o -endif -endif -obj-y += dummy.o diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/hdmi_drv.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/hdmi_drv.c deleted file mode 100644 index 1c0747c5efa..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/hdmi_drv.c +++ /dev/null @@ -1,2101 +0,0 @@ -#if defined(CONFIG_MTK_HDMI_SUPPORT) -#include - -#include -#include "mach/eint.h" -#include "mach/irqs.h" - -#include "hdmi_drv.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -/* HDMI DevLib */ -#include "tmNxCompId.h" -#include "tmdlHdmiTx_Types.h" -#include "tmdlHdmiTx_Functions.h" - -/* local */ -#include "tda998x_version.h" -#include "tda998x.h" -#include "tda998x_ioctl.h" -#include "I2C.h" - -#include "hdmi_drv.h" - -/* GPIO_HDMI_POWER_CONTROL */ -/* for EVB, power is always on, so no need for power control */ -#define USE_GPIO_HDMI_POWER_CONTROL 0 - -#define TDA_TRY(fct) { \ - err = (fct); \ - if (err) { \ - pr_debug("%s returned in %s line %d\n", hdmi_tx_err_string(err), __func__, __LINE__); \ - goto TRY_DONE; \ - } \ - } - -static size_t hdmi_log_on = true; -/* static struct switch_dev hdmi_switch_data; */ -#define HDMI_LOG(fmt, arg...) \ - do { \ - if (hdmi_log_on) pr_debug("[hdmi_drv]%s,%d ", __func__, __LINE__); pr_debug(fmt, ##arg); \ - } while (0) - -#define HDMI_FUNC() \ - do { \ - if (hdmi_log_on) pr_debug("[hdmi_drv] %s\n", __func__); \ - } while (0) - -/* --------------------------------------------------------------------------- */ -/* Local Constants */ -/* --------------------------------------------------------------------------- */ - -#define FRAME_WIDTH (480) -#define FRAME_HEIGHT (800) - -/* --------------------------------------------------------------------------- */ -/* Local Variables */ -/* --------------------------------------------------------------------------- */ - -/* static struct task_struct *hdmi_event_task = NULL; */ -static struct task_struct *hdmi_hpd_detect_task; - -wait_queue_head_t hdmi_event_wq; -atomic_t hdmi_event = ATOMIC_INIT(0); -/* static int hdmi_event_status = HDMI_STATE_NO_DEVICE; */ - -tda_instance our_instance, *g_inst; -static HDMI_UTIL_FUNCS hdmi_util = { 0 }; - -#define SET_RESET_PIN(v) (hdmi_util.set_reset_pin((v))) - -#define UDELAY(n) (hdmi_util.udelay(n)) -#define MDELAY(n) (hdmi_util.mdelay(n)) - - -#define CEC_SLAVE_ADDR 0x68 -#define HDMI_SLAVE_ADDR 0xE0 - -#define FRAME_PACKING 200 -#define NO_FP(x) ((x) % FRAME_PACKING) -#define IS_FP(x) ((x) > FRAME_PACKING) -#define WITH_FP(x) ((x) + FRAME_PACKING * (this->tda.setio.video_in.structure3D == TMDL_HDMITX_3D_FRAME_PACKING)) - -/* - * error handling - */ -char *hdmi_tx_err_string(int err) -{ - switch (err & 0x0FFF) { - case TM_ERR_COMPATIBILITY:{ - return "SW Interface compatibility"; - break; - } - case TM_ERR_MAJOR_VERSION:{ - return "SW Major Version error"; - break; - } - case TM_ERR_COMP_VERSION:{ - return "SW component version error"; - break; - } - case TM_ERR_BAD_UNIT_NUMBER:{ - return "Invalid device unit number"; - break; - } - case TM_ERR_BAD_INSTANCE:{ - return "Bad input instance value "; - break; - } - case TM_ERR_BAD_HANDLE:{ - return "Bad input handle"; - break; - } - case TM_ERR_BAD_PARAMETER:{ - return "Invalid input parameter"; - break; - } - case TM_ERR_NO_RESOURCES:{ - return "Resource is not available "; - break; - } - case TM_ERR_RESOURCE_OWNED:{ - return "Resource is already in use"; - break; - } - case TM_ERR_RESOURCE_NOT_OWNED:{ - return "Caller does not own resource"; - break; - } - case TM_ERR_INCONSISTENT_PARAMS:{ - return "Inconsistent input params"; - break; - } - case TM_ERR_NOT_INITIALIZED:{ - return "Component is not initialised"; - break; - } - case TM_ERR_NOT_SUPPORTED:{ - return "Function is not supported"; - break; - } - case TM_ERR_INIT_FAILED:{ - return "Initialization failed"; - break; - } - case TM_ERR_BUSY:{ - return "Component is busy"; - break; - } - case TMDL_ERR_DLHDMITX_I2C_READ:{ - return "Read error"; - break; - } - case TMDL_ERR_DLHDMITX_I2C_WRITE:{ - return "Write error"; - break; - } - case TM_ERR_FULL:{ - return "Queue is full"; - break; - } - case TM_ERR_NOT_STARTED:{ - return "Function is not started"; - break; - } - case TM_ERR_ALREADY_STARTED:{ - return "Function is already starte"; - break; - } - case TM_ERR_ASSERTION:{ - return "Assertion failure"; - break; - } - case TM_ERR_INVALID_STATE:{ - return "Invalid state for function"; - break; - } - case TM_ERR_OPERATION_NOT_PERMITTED:{ - return "Corresponds to posix EPERM"; - break; - } - case TMDL_ERR_DLHDMITX_RESOLUTION_UNKNOWN:{ - return "Bad format"; - break; - } - case TM_OK:{ - return "OK"; - break; - } - default:{ - pr_debug("(err:%x) ", err); - return "unknown"; - break; - } - } -} - -static char *tda_spy_event(int event) -{ - switch (event) { - case TMDL_HDMITX_HDCP_ACTIVE:{ - return "HDCP active"; - break; - } - case TMDL_HDMITX_HDCP_INACTIVE:{ - return "HDCP inactive"; - break; - } - case TMDL_HDMITX_HPD_ACTIVE:{ - return "HPD active"; - break; - } - case TMDL_HDMITX_HPD_INACTIVE:{ - return "HPD inactive"; - break; - } - case TMDL_HDMITX_RX_KEYS_RECEIVED:{ - return "Rx keys received"; - break; - } - case TMDL_HDMITX_RX_DEVICE_ACTIVE:{ - return "Rx device active"; - break; - } - case TMDL_HDMITX_RX_DEVICE_INACTIVE:{ - return "Rx device inactive"; - break; - } - case TMDL_HDMITX_EDID_RECEIVED:{ - return "EDID received"; - break; - } - case TMDL_HDMITX_VS_RPT_RECEIVED:{ - return "VS interrupt has been received"; - break; - } - /* case TMDL_HDMITX_B_STATUS: {return "TX received BStatus";break;} */ -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) - case TMDL_HDMITX_DEBUG_EVENT_1:{ - return "DEBUG_EVENT_1"; - break; - } -#endif - default:{ - return "Unkonwn event"; - break; - } - } -} - - -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) -static char *tda_spy_hsdc_fail_status(int fail) -{ - switch (fail) { - case TMDL_HDMITX_HDCP_OK:{ - return "ok"; - break; - } - case TMDL_HDMITX_HDCP_BKSV_RCV_FAIL:{ - return "Source does not receive Sink BKsv "; - break; - } - case TMDL_HDMITX_HDCP_BKSV_CHECK_FAIL:{ - return "BKsv does not contain 20 zeros and 20 ones"; - break; - } - case TMDL_HDMITX_HDCP_BCAPS_RCV_FAIL:{ - return "Source does not receive Sink Bcaps"; - break; - } - case TMDL_HDMITX_HDCP_AKSV_SEND_FAIL:{ - return "Source does not send AKsv"; - break; - } - case TMDL_HDMITX_HDCP_R0_RCV_FAIL:{ - return "Source does not receive R'0"; - break; - } - case TMDL_HDMITX_HDCP_R0_CHECK_FAIL:{ - return "R0 = R'0 check fail"; - break; - } - case TMDL_HDMITX_HDCP_BKSV_NOT_SECURE:{ - return "bksv not secure"; - break; - } - case TMDL_HDMITX_HDCP_RI_RCV_FAIL:{ - return "Source does not receive R'i"; - break; - } - case TMDL_HDMITX_HDCP_RPT_RI_RCV_FAIL:{ - return "Source does not receive R'i repeater mode"; - break; - } - case TMDL_HDMITX_HDCP_RI_CHECK_FAIL:{ - return "RI = R'I check fail"; - break; - } - case TMDL_HDMITX_HDCP_RPT_RI_CHECK_FAIL:{ - return "RI = R'I check fail repeater mode"; - break; - } - case TMDL_HDMITX_HDCP_RPT_BCAPS_RCV_FAIL:{ - return "Source does not receive Sink Bcaps repeater mode"; - break; - } - case TMDL_HDMITX_HDCP_RPT_BCAPS_READY_TIMEOUT:{ - return "bcaps ready timeout"; - break; - } - case TMDL_HDMITX_HDCP_RPT_V_RCV_FAIL:{ - return "Source does not receive V"; - break; - } - case TMDL_HDMITX_HDCP_RPT_BSTATUS_RCV_FAIL:{ - return "Source does not receive BSTATUS repeater mode"; - break; - } - case TMDL_HDMITX_HDCP_RPT_KSVLIST_RCV_FAIL:{ - return "Source does not receive Ksv list in repeater mode"; - break; - } - case TMDL_HDMITX_HDCP_RPT_KSVLIST_NOT_SECURE:{ - return "ksvlist not secure"; - break; - } - default:{ - return ""; - break; - } - } -} - -#if 0 -static char *tda_spy_hdcp_status(int status) -{ - switch (status) { - case TMDL_HDMITX_HDCP_CHECK_NOT_STARTED:{ - return "Check not started"; - break; - } - case TMDL_HDMITX_HDCP_CHECK_IN_PROGRESS:{ - return "No failures, more to do"; - break; - } - case TMDL_HDMITX_HDCP_CHECK_PASS:{ - return "Final check has passed"; - break; - } - case TMDL_HDMITX_HDCP_CHECK_FAIL_FIRST:{ - return "First check failure code\nDriver not AUTHENTICATED"; - break; - } - case TMDL_HDMITX_HDCP_CHECK_FAIL_DEVICE_T0:{ - return "A T0 interrupt occurred"; - break; - } - case TMDL_HDMITX_HDCP_CHECK_FAIL_DEVICE_RI:{ - return "Device RI changed"; - break; - } - case TMDL_HDMITX_HDCP_CHECK_FAIL_DEVICE_FSM:{ - return "Device FSM not 10h"; - break; - } - default:{ - return "Unknown hdcp status"; - break; - } - } - -} -#endif - -#endif - -static char *tda_spy_sink(int sink) -{ - switch (sink) { - case TMDL_HDMITX_SINK_DVI:{ - return "DVI"; - break; - } - case TMDL_HDMITX_SINK_HDMI:{ - return "HDMI"; - break; - } - case TMDL_HDMITX_SINK_EDID:{ - return "As currently defined in EDID"; - break; - } - default:{ - return "Unkonwn sink"; - break; - } - } -} - -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) -static char *tda_spy_aspect_ratio(int ar) -{ - switch (ar) { - case TMDL_HDMITX_P_ASPECT_RATIO_UNDEFINED:{ - return "Undefined picture aspect rati"; - break; - } - case TMDL_HDMITX_P_ASPECT_RATIO_6_5:{ - return "6:5 picture aspect ratio (PAR"; - break; - } - case TMDL_HDMITX_P_ASPECT_RATIO_5_4:{ - return "5:4 PA"; - break; - } - case TMDL_HDMITX_P_ASPECT_RATIO_4_3:{ - return "4:3 PA"; - break; - } - case TMDL_HDMITX_P_ASPECT_RATIO_16_10:{ - return "16:10 PA"; - break; - } - case TMDL_HDMITX_P_ASPECT_RATIO_5_3:{ - return "5:3 PA"; - break; - } - case TMDL_HDMITX_P_ASPECT_RATIO_16_9:{ - return "16:9 PA"; - break; - } - case TMDL_HDMITX_P_ASPECT_RATIO_9_5:{ - return "9:5 PA"; - break; - } - default:{ - return "Unknown aspect ratio"; - break; - } - } -} - -#if 0 /* no more used */ -static char *tda_spy_edid_status(int status) -{ - switch (status) { - case TMDL_HDMITX_EDID_READ:{ - return "All blocks read"; - break; - } - case TMDL_HDMITX_EDID_READ_INCOMPLETE:{ - return "All blocks read OK but buffer too small to return all of the"; - break; - } - case TMDL_HDMITX_EDID_ERROR_CHK_BLOCK_0:{ - return "Block 0 checksum erro"; - break; - } - case TMDL_HDMITX_EDID_ERROR_CHK:{ - return "Block 0 OK, checksum error in one or more other block"; - break; - } - case TMDL_HDMITX_EDID_NOT_READ:{ - return "EDID not read"; - break; - } - case TMDL_HDMITX_EDID_STATUS_INVALID:{ - return "Invalid "; - break; - } - default:{ - return "Unknown edid status"; - break; - } - } -} -#endif - -static char *tda_spy_vfmt(int fmt) -{ - switch (fmt) { - case TMDL_HDMITX_VFMT_NULL:{ - return "NOT a valid format..."; - break; - } - case TMDL_HDMITX_VFMT_01_640x480p_60Hz:{ - return "vic 01: 640x480p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_02_720x480p_60Hz:{ - return "vic 02: 720x480p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_03_720x480p_60Hz:{ - return "vic 03: 720x480p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_04_1280x720p_60Hz:{ - return "vic 04: 1280x720p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_05_1920x1080i_60Hz:{ - return "vic 05: 1920x1080i 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_06_720x480i_60Hz:{ - return "vic 06: 720x480i 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_07_720x480i_60Hz:{ - return "vic 07: 720x480i 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_08_720x240p_60Hz:{ - return "vic 08: 720x240p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_09_720x240p_60Hz:{ - return "vic 09: 720x240p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_10_720x480i_60Hz:{ - return "vic 10: 720x480i 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_11_720x480i_60Hz:{ - return "vic 11: 720x480i 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_12_720x240p_60Hz:{ - return "vic 12: 720x240p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_13_720x240p_60Hz:{ - return "vic 13: 720x240p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_14_1440x480p_60Hz:{ - return "vic 14: 1440x480p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_15_1440x480p_60Hz:{ - return "vic 15: 1440x480p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_16_1920x1080p_60Hz:{ - return "vic 16: 1920x1080p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_17_720x576p_50Hz:{ - return "vic 17: 720x576p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_18_720x576p_50Hz:{ - return "vic 18: 720x576p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_19_1280x720p_50Hz:{ - return "vic 19: 1280x720p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_20_1920x1080i_50Hz:{ - return "vic 20: 1920x1080i 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_21_720x576i_50Hz:{ - return "vic 21: 720x576i 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_22_720x576i_50Hz:{ - return "vic 22: 720x576i 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_23_720x288p_50Hz:{ - return "vic 23: 720x288p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_24_720x288p_50Hz:{ - return "vic 24: 720x288p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_25_720x576i_50Hz:{ - return "vic 25: 720x576i 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_26_720x576i_50Hz:{ - return "vic 26: 720x576i 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_27_720x288p_50Hz:{ - return "vic 27: 720x288p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_28_720x288p_50Hz:{ - return "vic 28: 720x288p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_29_1440x576p_50Hz:{ - return "vic 29: 1440x576p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_30_1440x576p_50Hz:{ - return "vic 30: 1440x576p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_31_1920x1080p_50Hz:{ - return "vic 31: 1920x1080p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_32_1920x1080p_24Hz:{ - return "vic 32: 1920x1080p 24Hz"; - break; - } - case TMDL_HDMITX_VFMT_33_1920x1080p_25Hz:{ - return "vic 33: 1920x1080p 25Hz"; - break; - } - case TMDL_HDMITX_VFMT_34_1920x1080p_30Hz:{ - return "vic 34: 1920x1080p 30Hz"; - break; - } - case TMDL_HDMITX_VFMT_35_2880x480p_60Hz:{ - return "vic 3: 2880x480p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_36_2880x480p_60Hz:{ - return "vic 3: 2880x480p 60Hz"; - break; - } - case TMDL_HDMITX_VFMT_37_2880x576p_50Hz:{ - return "vic 3: 2880x576p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_38_2880x576p_50Hz:{ - return "vic 3: 2880x576p 50Hz"; - break; - } - case TMDL_HDMITX_VFMT_60_1280x720p_24Hz:{ - return "vic 60: 1280x720p 24Hz"; - break; - } - case TMDL_HDMITX_VFMT_61_1280x720p_25Hz:{ - return "vic 61: 1280x720p 25Hz"; - break; - } - case TMDL_HDMITX_VFMT_62_1280x720p_30Hz:{ - return "vic 62: 1280x720p 30Hz"; - break; - } - case TMDL_HDMITX_VFMT_PC_800x600p_60Hz:{ - return "PC 129"; - break; - } - case TMDL_HDMITX_VFMT_PC_1152x960p_60Hz:{ - return "PC 130"; - break; - } - case TMDL_HDMITX_VFMT_PC_1024x768p_60Hz:{ - return "PC 131"; - break; - } - case TMDL_HDMITX_VFMT_PC_1280x768p_60Hz:{ - return "PC 132"; - break; - } - case TMDL_HDMITX_VFMT_PC_1280x1024p_60Hz:{ - return "PC 133"; - break; - } - case TMDL_HDMITX_VFMT_PC_1360x768p_60Hz:{ - return "PC 134"; - break; - } - case TMDL_HDMITX_VFMT_PC_1400x1050p_60Hz:{ - return "PC 135"; - break; - } - case TMDL_HDMITX_VFMT_PC_1600x1200p_60Hz:{ - return "PC 136"; - break; - } - case TMDL_HDMITX_VFMT_PC_1024x768p_70Hz:{ - return "PC 137"; - break; - } - case TMDL_HDMITX_VFMT_PC_640x480p_72Hz:{ - return "PC 138"; - break; - } - case TMDL_HDMITX_VFMT_PC_800x600p_72Hz:{ - return "PC 139"; - break; - } - case TMDL_HDMITX_VFMT_PC_640x480p_75Hz:{ - return "PC 140"; - break; - } - case TMDL_HDMITX_VFMT_PC_1024x768p_75Hz:{ - return "PC 141"; - break; - } - case TMDL_HDMITX_VFMT_PC_800x600p_75Hz:{ - return "PC 142"; - break; - } - case TMDL_HDMITX_VFMT_PC_1024x864p_75Hz:{ - return "PC 143"; - break; - } - case TMDL_HDMITX_VFMT_PC_1280x1024p_75Hz:{ - return "PC 144"; - break; - } - case TMDL_HDMITX_VFMT_PC_640x350p_85Hz:{ - return "PC 145"; - break; - } - case TMDL_HDMITX_VFMT_PC_640x400p_85Hz:{ - return "PC 146"; - break; - } - case TMDL_HDMITX_VFMT_PC_720x400p_85Hz:{ - return "PC 147"; - break; - } - case TMDL_HDMITX_VFMT_PC_640x480p_85Hz:{ - return "PC 148"; - break; - } - case TMDL_HDMITX_VFMT_PC_800x600p_85Hz:{ - return "PC 149"; - break; - } - case TMDL_HDMITX_VFMT_PC_1024x768p_85Hz:{ - return "PC 150"; - break; - } - case TMDL_HDMITX_VFMT_PC_1152x864p_85Hz:{ - return "PC 151"; - break; - } - case TMDL_HDMITX_VFMT_PC_1280x960p_85Hz:{ - return "PC 152"; - break; - } - case TMDL_HDMITX_VFMT_PC_1280x1024p_85Hz:{ - return "PC 153"; - break; - } - case TMDL_HDMITX_VFMT_PC_1024x768i_87Hz:{ - return "PC 154"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_02_720x480p_60Hz:{ - return "vic 02: 720x480p 60Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_17_720x576p_50Hz:{ - return "vic 17: 720x576p 50Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_60_1280x720p_24Hz:{ - return "vic 60: 1280x720p 24Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_61_1280x720p_25Hz:{ - return "vic 61: 1280x720p 25Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_62_1280x720p_30Hz:{ - return "vic 62: 1280x720p 30Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_19_1280x720p_50Hz:{ - return "vic 19: 1280x720p 50Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_04_1280x720p_60Hz:{ - return "vic 04: 1280x720p 60Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_32_1920x1080p_24Hz:{ - return "vic 32: 1920x1080p 24Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_33_1920x1080p_25Hz:{ - return "vic 33: 1920x1080p 25Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_34_1920x1080p_30Hz:{ - return "vic 34: 1920x1080p 30Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_31_1920x1080p_50Hz:{ - return "vic 31: 1920x1080p 50Hz frame packing"; - break; - } - case FRAME_PACKING + TMDL_HDMITX_VFMT_16_1920x1080p_60Hz:{ - return "vic 16: 1920x1080p 60Hz frame packing"; - break; - } - default:{ - return "unknown video format"; - break; - } - } -} -#endif - -#if 0 -static char *tda_spy_audio_fmt(int fmt) -{ - switch (fmt) { - case TMDL_HDMITX_AFMT_SPDIF:{ - return "SPDIF"; - break; - } - case TMDL_HDMITX_AFMT_I2S:{ - return "I2S"; - break; - } - case TMDL_HDMITX_AFMT_OBA:{ - return "OBA"; - break; - } - case TMDL_HDMITX_AFMT_DST:{ - return "DST"; - break; - } - case TMDL_HDMITX_AFMT_HBR:{ - return "HBR"; - break; - } - default:{ - return "Unknown audio format"; - break; - } - } -} - -static char *tda_spy_audio_freq(int freq) -{ - switch (freq) { - case TMDL_HDMITX_AFS_32K:{ - return "32k"; - break; - } - case TMDL_HDMITX_AFS_44K:{ - return "44k"; - break; - } - case TMDL_HDMITX_AFS_48K:{ - return "48k"; - break; - } - case TMDL_HDMITX_AFS_88K:{ - return "88k"; - break; - } - case TMDL_HDMITX_AFS_96K:{ - return "96k"; - break; - } - case TMDL_HDMITX_AFS_176K:{ - return "176k"; - break; - } - case TMDL_HDMITX_AFS_192K:{ - return "192k"; - break; - } - default:{ - return "Unknown audio freq"; - break; - } - } -} - -static char *tda_spy_audio_i2c(int bits) -{ - switch (bits) { - case TMDL_HDMITX_I2SQ_16BITS:{ - return "16 bits"; - break; - } - case TMDL_HDMITX_I2SQ_32BITS:{ - return "32 bits"; - break; - } - default:{ - return "Unknown audio i2c sampling"; - break; - } - } -} - -static char *tda_spy_audio_i2c4(int align) -{ - switch (align) { - case TMDL_HDMITX_I2SFOR_PHILIPS_L:{ - return "Philips Left"; - break; - } - case TMDL_HDMITX_I2SFOR_OTH_L:{ - return "other left"; - break; - } - case TMDL_HDMITX_I2SFOR_OTH_R:{ - return "other right"; - break; - } - default:{ - return "Unknown audio I2C alignement"; - break; - } - } -} - -static void tda_spy_audio(tmdlHdmiTxAudioInConfig_t *audio) -{ - pr_debug - "hdmitx audio input\n format:%d(%s) rate:%d(%s) i2c_format:%d(%s) i2c_qualif:%d(%s) dst_rate:%d channel:%d\n", - audio->format, tda_spy_audio_fmt(audio->format), audio->rate, - tda_spy_audio_freq(audio->rate), audio->i2sFormat, tda_spy_audio_i2c4(audio->i2sFormat), - audio->i2sQualifier, tda_spy_audio_i2c(audio->i2sQualifier), audio->dstRate, - audio->channelAllocation); -} -#endif -/* - * - */ -static int tda_spy(int verbose) { - tda_instance *this = &our_instance; - int i, err = 0; - - if (!verbose) { - return err; - } - - pr_debug "\n\n"); - this->tda.edid_video_caps.max = EXAMPLE_MAX_SVD; - TDA_TRY(tmdlHdmiTxGetEdidVideoCaps(this->tda.instance, - this->tda.edid_video_caps.desc, - this->tda.edid_video_caps.max, - &this->tda.edid_video_caps.written, - &this->tda.edid_video_caps.flags)); - pr_debug("written:%d\n", this->tda.edid_video_caps.written); - pr_debug("flags:0X%x\n", this->tda.edid_video_caps.flags); - if (this->tda.edid_video_caps.written > this->tda.edid_video_caps.max) { - pr_err("get %d video caps but was waiting for %d\n", - this->tda.edid_video_caps.written, this->tda.edid_video_caps.max); - this->tda.edid_video_caps.written = this->tda.edid_video_caps.max; - } - for (i = 0; i < this->tda.edid_video_caps.written; i++) { - pr_debug("videoFormat: %s\n", - (char *)tda_spy_vfmt((this->tda.edid_video_caps.desc[i].videoFormat))); - pr_debug("nativeVideoFormat:%s\n", - (this->tda.edid_video_caps.desc[i].nativeVideoFormat ? "yes" : "no")); - } - - pr_debug("\n\n"); - TDA_TRY(tmdlHdmiTxGetEdidVideoPreferred(this->tda.instance, &this->tda.edid_video_timings)); - pr_debug("Pixel Clock/10 000:%d\n", this->tda.edid_video_timings.pixelClock); - pr_debug("Horizontal Active Pixels:%d\n", this->tda.edid_video_timings.hActivePixels); - pr_debug("Horizontal Blanking Pixels:%d\n", this->tda.edid_video_timings.hBlankPixels); - pr_debug("Vertical Active Lines:%d\n", this->tda.edid_video_timings.vActiveLines); - pr_debug("Vertical Blanking Lines:%d\n", this->tda.edid_video_timings.vBlankLines); - pr_debug("Horizontal Sync Offset:%d\n", this->tda.edid_video_timings.hSyncOffset); - pr_debug("Horiz. Sync Pulse Width:%d\n", this->tda.edid_video_timings.hSyncWidth); - pr_debug("Vertical Sync Offset:%d\n", this->tda.edid_video_timings.vSyncOffset); - pr_debug("Vertical Sync Pulse Width:%d\n", this->tda.edid_video_timings.vSyncWidth); - pr_debug("Horizontal Image Size:%d\n", this->tda.edid_video_timings.hImageSize); - pr_debug("Vertical Image Size:%d\n", this->tda.edid_video_timings.vImageSize); - pr_debug("Horizontal Border:%d\n", this->tda.edid_video_timings.hBorderPixels); - pr_debug("Vertical Border:%d\n", this->tda.edid_video_timings.vBorderPixels); - pr_debug("Interlace/sync info:%x\n", this->tda.edid_video_timings.flags); - - pr_debug("\n\n"); - TDA_TRY(tmdlHdmiTxGetEdidSinkType(this->tda.instance, &this->tda.setio.sink)); - pr_debug("%s\n", tda_spy_sink(this->tda.setio.sink)); - pr_debug("\n\n"); - TDA_TRY(tmdlHdmiTxGetEdidSourceAddress(this->tda.instance, &this->tda.src_address)); - pr_debug("%x\n", this->tda.src_address); - pr_debug("\n\n"); - this->tda.edid_dtd.max = EXAMPLE_MAX_SVD; - TDA_TRY(tmdlHdmiTxGetEdidDetailledTimingDescriptors(this->tda.instance, - this->tda.edid_dtd.desc, - this->tda.edid_dtd.max, - &this->tda.edid_dtd.written)); - pr_debug("Interlace/sync info:%x\n", this->tda.edid_dtd.desc[i].flags); - pr_debug("written:%d\n", this->tda.edid_dtd.written); - if (this->tda.edid_dtd.written > this->tda.edid_dtd.max) { - pr_err("get %d video caps but was waiting for %d\n", - this->tda.edid_dtd.written, this->tda.edid_dtd.max); - this->tda.edid_dtd.written = this->tda.edid_dtd.max; - } - for (i = 0; i < this->tda.edid_dtd.written; i++) { - pr_debug("Pixel Clock/10 000:%d\n", this->tda.edid_dtd.desc[i].pixelClock); - pr_debug("Horizontal Active Pixels:%d\n", this->tda.edid_dtd.desc[i].hActivePixels); - pr_debug("Horizontal Blanking Pixels:%d\n", - this->tda.edid_dtd.desc[i].hBlankPixels); - pr_debug("Vertical Active Lines:%d\n", this->tda.edid_dtd.desc[i].vActiveLines); - pr_debug("Vertical Blanking Lines:%d\n", this->tda.edid_dtd.desc[i].vBlankLines); - pr_debug("Horizontal Sync Offset:%d\n", this->tda.edid_dtd.desc[i].hSyncOffset); - pr_debug("Horiz. Sync Pulse Width:%d\n", this->tda.edid_dtd.desc[i].hSyncWidth); - pr_debug("Vertical Sync Offset:%d\n", this->tda.edid_dtd.desc[i].vSyncOffset); - pr_debug("Vertical Sync Pulse Width:%d\n", this->tda.edid_dtd.desc[i].vSyncWidth); - pr_debug("Horizontal Image Size:%d\n", this->tda.edid_dtd.desc[i].hImageSize); - pr_debug("Vertical Image Size:%d\n", this->tda.edid_dtd.desc[i].vImageSize); - pr_debug("Horizontal Border:%d\n", this->tda.edid_dtd.desc[i].hBorderPixels); - pr_debug("Vertical Border:%d\n", this->tda.edid_dtd.desc[i].vBorderPixels); - } - - pr_debug("\n\n"); - this->tda.edid_md.max = EXAMPLE_MAX_SVD; - TDA_TRY(tmdlHdmiTxGetEdidMonitorDescriptors(this->tda.instance, - this->tda.edid_md.desc1, - this->tda.edid_md.desc2, - this->tda.edid_md.other, - this->tda.edid_md.max, - &this->tda.edid_md.written)); - pr_debug("written:%d\n", this->tda.edid_md.written); - if (this->tda.edid_md.written > this->tda.edid_md.max) { - pr_err("get %d video caps but was waiting for %d\n", - this->tda.edid_md.written, this->tda.edid_md.max); - this->tda.edid_md.written = this->tda.edid_md.max; - } - for (i = 0; i < this->tda.edid_md.written; i++) { - if (this->tda.edid_md.desc1[i].descRecord) { - this->tda.edid_md.desc1[i].monitorName[EDID_MONITOR_DESCRIPTOR_SIZE - 1] = - 0; - pr_debug("Monitor name:%s\n", this->tda.edid_md.desc1[i].monitorName); - } - if (this->tda.edid_md.desc1[i].descRecord) { - pr_debug("Min vertical rate in Hz:%d\n", - this->tda.edid_md.desc2[i].minVerticalRate); - pr_debug("Max vertical rate in Hz:%d\n", - this->tda.edid_md.desc2[i].maxVerticalRate); - pr_debug("Min horizontal rate in Hz:%d\n", - this->tda.edid_md.desc2[i].minHorizontalRate); - pr_debug("Max horizontal rate in Hz:%d\n", - this->tda.edid_md.desc2[i].maxHorizontalRate); - pr_debug("Max supported pixel clock rate in MHz:%d\n", - this->tda.edid_md.desc2[i].maxSupportedPixelClk); - } - } - - pr_debug("\n\n"); - TDA_TRY(tmdlHdmiTxGetEdidTVPictureRatio(this->tda.instance, - &this->tda.edid_tv_aspect_ratio)); - pr_debug("%s\n", tda_spy_aspect_ratio(this->tda.edid_tv_aspect_ratio)); - - pr_debug("\n\n"); - TDA_TRY(tmdlHdmiTxGetEdidLatencyInfo(this->tda.instance, &this->tda.edid_latency)); - if (this->tda.edid_latency.latency_available) { - pr_debug("Edid video:%d\n", this->tda.edid_latency.Edidvideo_latency); - pr_debug("Edid audio:%d\n", this->tda.edid_latency.Edidaudio_latency); - } - if (this->tda.edid_latency.Ilatency_available) { - pr_debug("Edid Ivideo:%d\n", this->tda.edid_latency.EdidIvideo_latency); - pr_debug("Edid Iaudio:%d\n", this->tda.edid_latency.EdidIaudio_latency); - } - TRY_DONE: - return err; -} - -#if 0 -static char *tda_ioctl(int io) { - switch (io) { - case TDA_VERBOSE_ON_CMD:{ - return "TDA_VERBOSE_ON_CMD"; - break; - } - case TDA_VERBOSE_OFF_CMD:{ - return "TDA_VERBOSE_OFF_CMD"; - break; - } - case TDA_BYEBYE_CMD:{ - return "TDA_BYEBYE_CMD"; - break; - } - case TDA_GET_SW_VERSION_CMD:{ - return "TDA_GET_SW_VERSION_CMD"; - break; - } - case TDA_SET_POWER_CMD:{ - return "TDA_SET_POWER_CMD"; - break; - } - case TDA_GET_POWER_CMD:{ - return "TDA_GET_POWER_CMD"; - break; - } - case TDA_SETUP_CMD:{ - return "TDA_SETUP_CMD"; - break; - } - case TDA_GET_SETUP_CMD:{ - return "TDA_GET_SETUP_CMD"; - break; - } - case TDA_WAIT_EVENT_CMD:{ - return "TDA_WAIT_EVENT_CMD"; - break; - } - case TDA_ENABLE_EVENT_CMD:{ - return "TDA_ENABLE_EVENT_CMD"; - break; - } - case TDA_DISABLE_EVENT_CMD:{ - return "TDA_DISABLE_EVENT_CMD"; - break; - } - case TDA_GET_VIDEO_SPEC_CMD:{ - return "TDA_GET_VIDEO_SPEC_CMD"; - break; - } - case TDA_SET_INPUT_OUTPUT_CMD:{ - return "TDA_SET_INPUT_OUTPUT_CMD"; - break; - } - case TDA_SET_AUDIO_INPUT_CMD:{ - return "TDA_SET_AUDIO_INPUT_CMD"; - break; - } - case TDA_SET_VIDEO_INFOFRAME_CMD:{ - return "TDA_SET_VIDEO_INFOFRAME_CMD"; - break; - } - case TDA_SET_AUDIO_INFOFRAME_CMD:{ - return "TDA_SET_AUDIO_INFOFRAME_CMD"; - break; - } - case TDA_SET_ACP_CMD:{ - return "TDA_SET_ACP_CMD"; - break; - } - case TDA_SET_GCP_CMD:{ - return "TDA_SET_GCP_CMD"; - break; - } - case TDA_SET_ISRC1_CMD:{ - return "TDA_SET_ISRC1_CMD"; - break; - } - case TDA_SET_ISRC2_CMD:{ - return "TDA_SET_ISRC2_CMD"; - break; - } - case TDA_SET_MPS_INFOFRAME_CMD:{ - return "TDA_SET_MPS_INFOFRAME_CMD"; - break; - } - case TDA_SET_SPD_INFOFRAME_CMD:{ - return "TDA_SET_SPD_INFOFRAME_CMD"; - break; - } - case TDA_SET_VS_INFOFRAME_CMD:{ - return "TDA_SET_VS_INFOFRAME_CMD"; - break; - } - case TDA_SET_AUDIO_MUTE_CMD:{ - return "TDA_SET_AUDIO_MUTE_CMD"; - break; - } - case TDA_RESET_AUDIO_CTS_CMD:{ - return "TDA_RESET_AUDIO_CTS_CMD"; - break; - } - case TDA_GET_EDID_STATUS_CMD:{ - return "TDA_GET_EDID_STATUS_CMD"; - break; - } - case TDA_GET_EDID_AUDIO_CAPS_CMD:{ - return "TDA_GET_EDID_AUDIO_CAPS_CMD"; - break; - } - case TDA_GET_EDID_VIDEO_CAPS_CMD:{ - return "TDA_GET_EDID_VIDEO_CAPS_CMD"; - break; - } - case TDA_GET_EDID_VIDEO_PREF_CMD:{ - return "TDA_GET_EDID_VIDEO_PREF_CMD"; - break; - } - case TDA_GET_EDID_SINK_TYPE_CMD:{ - return "TDA_GET_EDID_SINK_TYPE_CMD"; - break; - } - case TDA_GET_EDID_SOURCE_ADDRESS_CMD:{ - return "TDA_GET_EDID_SOURCE_ADDRESS_CMD"; - break; - } - case TDA_SET_GAMMUT_CMD:{ - return "TDA_SET_GAMMUT_CMD"; - break; - } - case TDA_GET_EDID_DTD_CMD:{ - return "TDA_GET_EDID_DTD_CMD"; - break; - } - case TDA_GET_EDID_MD_CMD:{ - return "TDA_GET_EDID_MD_CMD"; - break; - } - case TDA_GET_EDID_TV_ASPECT_RATIO_CMD:{ - return "TDA_GET_EDID_TV_ASPECT_RATIO_CMD"; - break; - } - case TDA_GET_EDID_LATENCY_CMD:{ - return "TDA_GET_EDID_LATENCY_CMD"; - break; - } - case TDA_GET_HPD_STATUS_CMD:{ - return "TDA_GET_HPD_STATUS_CMD"; - break; - } - default:{ - return "unknown"; - break; - } - } - - -} -#endif -/* - * On HDCP - */ -void _tda19989_hdcp_on(tda_instance *this) { - int err = 0; - HDMI_FUNC(); - - if (this->tda.hdcp_status != HDCP_IS_NOT_INSTALLED) { /* check HDCP is installed ... */ - if (this->tda.hdcp_enable) { /* ... but requested ! */ - TDA_TRY(tmdlHdmiTxSetHdcp(this->tda.instance, True)); /* switch if on */ -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) - /* hide video content until HDCP authentification is finished */ - if (!this->tda.setup.simplayHd) { - TDA_TRY(tmdlHdmiTxSetBScreen - (this->tda.instance, TMDL_HDMITX_PATTERN_BLUE)); - } -#endif - } - } - TRY_DONE: - (void)0; -} - -/* - * Off HDCP - */ -void _tda19989_hdcp_off(tda_instance *this) { - int err = 0; - HDMI_FUNC(); - - if (this->tda.hdcp_status != HDCP_IS_NOT_INSTALLED) { /* check HDCP is installed ... */ - - if (this->tda.hdcp_enable) { /* but no more requested */ - TDA_TRY(tmdlHdmiTxSetHdcp(this->tda.instance, False)); /* switch if off */ - } - } - TRY_DONE: - (void)0; -} - -/* - * Run video - */ -void _tda19989_show_video(tda_instance *this) { - - int err = 0; - - HDMI_FUNC(); -#if 1 - _tda19989_hdcp_off(this); - TDA_TRY(tmdlHdmiTxSetInputOutput(this->tda.instance, - this->tda.setio.video_in, - this->tda.setio.video_out, - this->tda.setio.audio_in, this->tda.setio.sink)); - _tda19989_hdcp_on(this); -#else - HDMI_LOG("%s, this->tda.rx_device_active=%d\n", __func__, this->tda.rx_device_active); - if (this->tda.rx_device_active) { /* check RxSens */ - HDMI_LOG("%s, this->tda.hot_plug_detect=%d\n", __func__, this->tda.hot_plug_detect); - - if (this->tda.hot_plug_detect == TMDL_HDMITX_HOTPLUG_ACTIVE) { /* should be useless, but legacy... */ - - HDMI_LOG("%s, this->tda.power=%d\n", __func__, this->tda.power); - - if (this->tda.power == tmPowerOn) { /* check CEC or DSS didn't switch it off */ - - HDMI_LOG("%s, this->tda.src_address=0x%08x\n", __func__, - this->tda.src_address); - if (this->tda.src_address != 0xFFFF) { /* check EDID has been received */ - hdcp_off(this); - TDA_TRY(tmdlHdmiTxSetInputOutput(this->tda.instance, - this->tda.setio.video_in, - this->tda.setio.video_out, - this->tda.setio.audio_in, - this->tda.setio.sink)); - hdcp_on(this); - /* - Mind that SetInputOutput disable the blue color matrix settings of tmdlHdmiTxSetBScreen ... - so put tmdlHdmiTxSetBScreen (or hdcp_on) always after - */ - } - } - } - } -#endif - TRY_DONE: - (void)0; -} - -/* - * TDA callback - */ -void _tda19989_eventCallbackTx(tmdlHdmiTxEvent_t event) { - tda_instance *this = &our_instance; - /* int err=0; */ - unsigned short new_addr; -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) - tda_hdcp_fail hdcp_fail; -#endif - HDMI_LOG("%s, event=0x%08x\n", __func__, event); - - this->tda.event = event; - if (TMDL_HDMITX_HDCP_INACTIVE != event) { - HDMI_LOG("hdmi %s\n", tda_spy_event(event)); - } - - switch (event) { - case TMDL_HDMITX_EDID_RECEIVED: - /* xuecheng */ - /* if EDID failed, still continue */ - if (tmdlHdmiTxGetEdidSourceAddress(this->tda.instance, &new_addr)) { - HDMI_LOG("tmdlHdmiTxGetEdidSourceAddress() failed\n"); - } - HDMI_LOG("hdmi,phy.@:%x\n", new_addr); - /* if (this->tda.src_address == new_addr) { */ - /* break; */ - /* } */ - this->tda.src_address = new_addr; - /* #if defined (TMFL_TDA19989) || defined (TMFL_TDA9984) */ - tda_spy(this->param.verbose > 1); - /* #endif */ - /* - Customer may add stuff to analyse EDID (see tda_spy()) - and select automatically some video/audio settings. - By default, let go on with next case and activate - default video/audio settings with tmdlHdmiTxSetInputOutput() - */ - - if (tmdlHdmiTxGetEdidSinkType(this->tda.instance, &this->tda.setio.sink)) { - HDMI_LOG("tmdlHdmiTxGetEdidSinkType failed\n"); - } - if (TMDL_HDMITX_SINK_HDMI != this->tda.setio.sink) { - HDMI_LOG("/!\\ CAUTION /!\\ sink is not HDMI but %s\n", - tda_spy_sink(this->tda.setio.sink)); - } - msleep(100); - - /* - /!\ WARNING /! \ - the core driver does not send any HPD nor RXSENS when HDMI was plugged after at boot time - and only EDID_RECEIVED is send, so rx_device_active shall be forced now. - Do not skip the next case nor add any break here please - */ - case TMDL_HDMITX_RX_DEVICE_ACTIVE: /* TV is ready to receive */ - - /* TODO: refine this */ - hdmi_util.state_callback(HDMI_STATE_ACTIVE); - this->tda.rx_device_active = 1; - /* _tda19989_show_video(this); */ - break; - case TMDL_HDMITX_RX_DEVICE_INACTIVE: /* TV is ignoring the source */ - - hdmi_util.state_callback(HDMI_STATE_NO_DEVICE); - this->tda.rx_device_active = 0; - break; - case TMDL_HDMITX_HPD_ACTIVE: /* HDMI is so funny u can get RxSens without being plugged !!! */ - - this->tda.hot_plug_detect = TMDL_HDMITX_HOTPLUG_ACTIVE; - hdmi_util.state_callback(HDMI_STATE_ACTIVE); - /* _tda19989_show_video(this); */ - break; - case TMDL_HDMITX_HPD_INACTIVE: /* unplug */ - - this->tda.hot_plug_detect = TMDL_HDMITX_HOTPLUG_INACTIVE; - this->tda.src_address = 0xFFFF; - hdmi_util.state_callback(HDMI_STATE_NO_DEVICE); - break; -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) - case TMDL_HDMITX_HDCP_INACTIVE: /* HDCP drops off */ - - tmdlHdmiTxGetHdcpFailStatus(this->tda.instance, - &hdcp_fail, &this->tda.hdcp_raw_status); - if (this->tda.hdcp_fail != hdcp_fail) { - if (this->tda.hdcp_fail) { - LOG(KERN_INFO, "%s (%d)\n", - tda_spy_hsdc_fail_status(this->tda.hdcp_fail), - this->tda.hdcp_raw_status); - } - this->tda.hdcp_fail = hdcp_fail; - tmdlHdmiTxSetBScreen(this->tda.instance, TMDL_HDMITX_PATTERN_BLUE); - } - break; - case TMDL_HDMITX_RX_KEYS_RECEIVED: /* end of HDCP authentification */ - - if (!this->tda.setup.simplayHd) { - tmdlHdmiTxRemoveBScreen(this->tda.instance); - } - break; -#endif - default: - - break; - } - - this->driver.poll_done = true; -/* TRY_DONE: */ - (void)0; -} - -void tda19989_cable_fake_plug_in(void) { - hdmi_util.state_callback(HDMI_STATE_ACTIVE); -} - - -static int _tda19989_tx_init(tda_instance *this) { - int err = 0; - HDMI_FUNC(); - /*Initialize HDMI Transmiter */ - TDA_TRY(tmdlHdmiTxOpen(&this->tda.instance)); - /* Register the HDMI TX events callbacks */ - TDA_TRY(tmdlHdmiTxRegisterCallbacks - (this->tda.instance, (ptmdlHdmiTxCallback_t) _tda19989_eventCallbackTx)); - /* EnableEvent, all by default */ - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_HDCP_ACTIVE)); - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_HDCP_INACTIVE)); - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_HPD_ACTIVE)); - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_HPD_INACTIVE)); - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_RX_KEYS_RECEIVED)); - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_RX_DEVICE_ACTIVE)); - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_RX_DEVICE_INACTIVE)); - TDA_TRY(tmdlHdmiTxEnableEvent(this->tda.instance, TMDL_HDMITX_EDID_RECEIVED)); - - /* Size of the application EDID buffer */ - this->tda.setup.edidBufferSize = EDID_BLOCK_COUNT * EDID_BLOCK_SIZE; - /* Buffer to store the application EDID data */ - this->tda.setup.pEdidBuffer = this->tda.raw_edid; - /* To Enable/disable repeater feature, nor relevant here */ - this->tda.setup.repeaterEnable = false; - /* To enable/disable simplayHD feature: blue screen when not authenticated */ -#ifdef SIMPLAYHD - this->tda.setup.simplayHd = (this->tda.hdcp_enable ? true : false); -#else - this->tda.setup.simplayHd = false; -#endif - /* Provides HDMI TX instance configuration */ - TDA_TRY(tmdlHdmiTxInstanceSetup(this->tda.instance, &this->tda.setup)); - /* Get IC version */ - TDA_TRY(tmdlHdmiTxGetCapabilities(&this->tda.capabilities)); - - - - - TRY_DONE: - return err; -} - -static int _tda19989_tx_exit(tda_instance *this) { - int err = 0; - HDMI_FUNC(); - /*Initialize HDMI Transmiter */ - TDA_TRY(tmdlHdmiTxClose(this->tda.instance)); - TRY_DONE: - return err; -} - -extern tmErrorCode_t tmdlHdmiTxHandleInterrupt(tmInstance_t instance); - -static void hdmi_drv_set_util_funcs(const HDMI_UTIL_FUNCS *util) { - memcpy(&hdmi_util, util, sizeof(HDMI_UTIL_FUNCS)); -} - -#define USING_720P -static void hdmi_drv_get_params(HDMI_PARAMS *params) { - memset(params, 0, sizeof(HDMI_PARAMS)); - HDMI_FUNC(); -#if defined(USING_720P) - HDMI_LOG("720p\n"); - params->init_config.vformat = HDMI_VIDEO_1280x720p_60Hz; -#else - HDMI_LOG("[hdmi_drv]480p\n"); - params->init_config.vformat = HDMI_VIDEO_720x480p_60Hz; -#endif - params->init_config.aformat = HDMI_AUDIO_PCM_16bit_44100; - - params->clk_pol = HDMI_POLARITY_FALLING; - params->de_pol = HDMI_POLARITY_RISING; - params->vsync_pol = HDMI_POLARITY_FALLING; - params->hsync_pol = HDMI_POLARITY_FALLING; - -#if defined(USING_720P) - HDMI_LOG("[hdmi_drv]720p\n"); -#if 1 - params->hsync_front_porch = 110; - params->hsync_pulse_width = 40; - params->hsync_back_porch = 220; - - params->vsync_front_porch = 5; - params->vsync_pulse_width = 5; - params->vsync_back_porch = 20; -#else - params->hsync_front_porch = 110; - params->hsync_pulse_width = 40; - params->hsync_back_porch = 220; - - params->vsync_front_porch = 5; - params->vsync_pulse_width = 5; - params->vsync_back_porch = 20; - - -#endif -#else - HDMI_LOG("[hdmi_drv]480p\n"); - params->hsync_front_porch = 16; - params->hsync_pulse_width = 62; - params->hsync_back_porch = 60; - - params->vsync_front_porch = 9; - params->vsync_pulse_width = 6; - params->vsync_back_porch = 30; -#endif - - params->rgb_order = HDMI_COLOR_ORDER_RGB; - - params->io_driving_current = IO_DRIVING_CURRENT_2MA; - params->intermediat_buffer_num = 4; - - params->output_mode = HDMI_OUTPUT_MODE_VIDEO_MODE; - params->is_force_awake = 0; - params->is_force_landscape = 0; - params->scaling_factor = 5; -} - -#if 0 -static void _tda19989_irq_handler(void) { - /* int ret = 0; */ - - HDMI_LOG("[hdmi_drv]hdmi detected!!!\n"); - atomic_set(&hdmi_event, 1); - wake_up_interruptible(&hdmi_event_wq); - - mt65xx_eint_unmask(8); - - -} -#endif - -extern tmErrorCode_t suspend_i2c(void); -extern tmErrorCode_t resume_i2c(void); - -void hdmi_drv_suspend(void) { - int err = 0; - tda_instance *this = g_inst; - HDMI_FUNC(); - - this->tda.power = tmPowerSuspend; - err = tmdlHdmiTxSetPowerState(this->tda.instance, this->tda.power); - - err &= 0xfff; - if (err == TM_ERR_NO_RESOURCES) { - HDMI_LOG("[hdmi]Busy...\n"); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - } - - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - - - TRY_DONE: - return /*err */; -} - -void hdmi_drv_resume(void) { - int err = 0; - tda_instance *this = g_inst; - HDMI_FUNC(); - - - this->tda.power = tmPowerOn; - err = tmdlHdmiTxSetPowerState(this->tda.instance, this->tda.power); - HDMI_LOG(", %s, err = %d,0x%08x\n", __func__, err, err); - err &= 0xfff; - if (err == TM_ERR_NO_RESOURCES) { - HDMI_LOG("[hdmi]Busy...\n"); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - } - - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - - - TRY_DONE: - return /*err */; -} - -tmdlHdmiTxVinMode_t tda19989_vin_format_convert(HDMI_VIDEO_INPUT_FORMAT vin) { - switch (vin) { - case HDMI_VIN_FORMAT_RGB565: - return TMDL_HDMITX_VINMODE_RGB444; - case HDMI_VIN_FORMAT_RGB666: - return TMDL_HDMITX_VINMODE_RGB444; - case HDMI_VIN_FORMAT_RGB888: - return TMDL_HDMITX_VINMODE_RGB444; - /* dafault: return TMDL_HDMITX_VINMODE_INVALID; */ - } - return TMDL_HDMITX_VINMODE_INVALID; /* avoid warning */ -} - -tmdlHdmiTxVoutMode_t tda19989_vout_format_convert(HDMI_VIDEO_OUTPUT_FORMAT vout) { - switch (vout) { - case HDMI_VOUT_FORMAT_RGB888: - return TMDL_HDMITX_VOUTMODE_RGB444; - case HDMI_VOUT_FORMAT_YUV422: - return TMDL_HDMITX_VOUTMODE_YUV422; - case HDMI_VOUT_FORMAT_YUV444: - return TMDL_HDMITX_VOUTMODE_YUV444; - /* dafault: return TMDL_HDMITX_VOUTMODE_INVALID; */ - } - return TMDL_HDMITX_VOUTMODE_INVALID; /* avoid warning */ -} - -/* TODO: */ -static int hdmi_drv_video_config(HDMI_VIDEO_RESOLUTION vformat, HDMI_VIDEO_INPUT_FORMAT vin, - HDMI_VIDEO_OUTPUT_FORMAT vout) { - int err = 0; - tda_instance *this = g_inst; - - HDMI_FUNC(); - - /* Main settings */ - this->tda.setio.video_out.mode = TMDL_HDMITX_VOUTMODE_RGB444; - this->tda.setio.video_out.colorDepth = TMDL_HDMITX_COLORDEPTH_24; -#ifdef TMFL_TDA19989 - this->tda.setio.video_out.dviVqr = TMDL_HDMITX_VQR_DEFAULT; /* Use HDMI rules for DVI output */ -#endif - /* this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_31_1920x1080p_50Hz; */ - /* this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_PC_640x480p_60Hz; */ - /* this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_PC_640x480p_72Hz; */ - /* this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_04_1280x720p_60Hz; */ - /* this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_19_1280x720p_50Hz; */ - if (vformat == HDMI_VIDEO_720x480p_60Hz) { - HDMI_LOG("[hdmi_drv]480p\n"); - this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_02_720x480p_60Hz; - } else if (vformat == HDMI_VIDEO_1280x720p_60Hz) { - HDMI_LOG("[hdmi_drv]720p\n"); - this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_04_1280x720p_60Hz; - } else if (vformat == HDMI_VIDEO_1920x1080p_30Hz) { - HDMI_LOG("[hdmi_drv]1080p\n"); - this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_34_1920x1080p_30Hz; - } else { - HDMI_LOG("%s, video format not support now\n", __func__); - } - - this->tda.setio.video_in.mode = TMDL_HDMITX_VINMODE_RGB444; - /* this->tda.setio.video_in.mode = TMDL_HDMITX_VINMODE_CCIR656; */ - /* this->tda.setio.video_in.mode = TMDL_HDMITX_VINMODE_YUV422; */ - this->tda.setio.video_in.format = this->tda.setio.video_out.format; - this->tda.setio.video_in.pixelRate = TMDL_HDMITX_PIXRATE_SINGLE; - this->tda.setio.video_in.syncSource = TMDL_HDMITX_SYNCSRC_EXT_VS; /* we use HS,VS as synchronisation source */ - - - - this->tda.setio.sink = TMDL_HDMITX_SINK_HDMI; /* skip edid reading */ - - - _tda19989_hdcp_off(this); - TDA_TRY(tmdlHdmiTxSetInputOutput(this->tda.instance, - this->tda.setio.video_in, - this->tda.setio.video_out, - this->tda.setio.audio_in, this->tda.setio.sink)); - _tda19989_hdcp_on(this); -#if 0 - /* this->tda.src_address = 0x1000; /\* debug *\/ */ - this->tda.src_address = NO_PHY_ADDR; /* it's unref */ - if (this->tda.rx_device_active) { /* check RxSens */ - if (this->tda.hot_plug_detect == TMDL_HDMITX_HOTPLUG_ACTIVE) { /* should be useless, but legacy... */ - if (this->tda.power == tmPowerOn) { /* check CEC or DSS didn't switch it off */ - /* if (this->tda.src_address != 0xFFFF) { /* check EDID has been received */ */ - _tda19989_hdcp_off(this); - TDA_TRY(tmdlHdmiTxSetInputOutput(this->tda.instance, - this->tda.setio.video_in, - this->tda.setio.video_out, - this->tda.setio.audio_in, - this->tda.setio.sink)); - _tda19989_hdcp_on(this); - /* - Mind that SetInputOutput disable the blue color matrix settings of tmdlHdmiTxSetBScreen ... - so put tmdlHdmiTxSetBScreen (or hdcp_on) always after - */ - /* } */ - } - } - } - tmdlHdmiTxSetBScreen(this->tda.instance, - TMDL_HDMITX_PATTERN_BLUE /*TMDL_HDMITX_PATTERN_CBAR8 */); -#endif - /* tda19989_colorbar(true); */ - /* return 0; */ - - TRY_DONE : - return 0; -} - -static int hdmi_drv_audio_config(HDMI_AUDIO_FORMAT aformat) { - /* int err = 0; */ - tda_instance *this = g_inst; - - HDMI_FUNC(); - - this->tda.setio.audio_in.format = TMDL_HDMITX_AFMT_I2S; - if (aformat == HDMI_AUDIO_PCM_16bit_48000) { - this->tda.setio.audio_in.rate = TMDL_HDMITX_AFS_48K; - } else if (aformat == HDMI_AUDIO_PCM_16bit_44100) { - this->tda.setio.audio_in.rate = TMDL_HDMITX_AFS_44K; - } else if (aformat == HDMI_AUDIO_PCM_16bit_32000) { - this->tda.setio.audio_in.rate = TMDL_HDMITX_AFS_32K; - } else { - HDMI_LOG("aformat is not support\n"); - } - - this->tda.setio.audio_in.i2sFormat = TMDL_HDMITX_I2SFOR_PHILIPS_L; - this->tda.setio.audio_in.i2sQualifier = TMDL_HDMITX_I2SQ_16BITS; - this->tda.setio.audio_in.dstRate = TMDL_HDMITX_DSTRATE_SINGLE; /* not relevant here */ - this->tda.setio.audio_in.channelAllocation = 0; /* audio channel allocation (Ref to CEA-861D p85) */ - /* audio channel allocation (Ref to CEA-861D p85) */ - this->tda.setio.audio_in.channelStatus.PcmIdentification = TMDL_HDMITX_AUDIO_DATA_PCM; - this->tda.setio.audio_in.channelStatus.CopyrightInfo = TMDL_HDMITX_CSCOPYRIGHT_UNPROTECTED; - this->tda.setio.audio_in.channelStatus.FormatInfo = TMDL_HDMITX_CSFI_PCM_2CHAN_NO_PRE; - this->tda.setio.audio_in.channelStatus.categoryCode = 0; - this->tda.setio.audio_in.channelStatus.clockAccuracy = TMDL_HDMITX_CSCLK_LEVEL_II; - this->tda.setio.audio_in.channelStatus.maxWordLength = TMDL_HDMITX_CSMAX_LENGTH_24; - this->tda.setio.audio_in.channelStatus.wordLength = TMDL_HDMITX_CSWORD_DEFAULT; - this->tda.setio.audio_in.channelStatus.origSampleFreq = TMDL_HDMITX_CSOFREQ_44_1k; - /* _tda19989_hdcp_off(this); */ - tmdlHdmiTxSetAudioInput(this->tda.instance, this->tda.setio.audio_in, this->tda.setio.sink); - /* _tda19989_hdcp_on(this); */ - -/* TRY_DONE: */ - return 0; -} - -static int hdmi_drv_video_enable(bool enable) { - int err = 0; - - tda_instance *this = g_inst; - HDMI_FUNC(); - LOG(KERN_INFO, "called\n"); - - - this->driver.omap_dss_hdmi_panel = true; - - if (enable) { - this->tda.power = tmPowerOn; - TDA_TRY(tmdlHdmiTxSetPowerState(this->tda.instance, this->tda.power)); - if (err == TM_ERR_NO_RESOURCES) { - HDMI_LOG("Busy...\n"); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - } - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - } else { - this->tda.power = tmPowerSuspend; - TDA_TRY(tmdlHdmiTxSetPowerState(this->tda.instance, this->tda.power)); - if (err == TM_ERR_NO_RESOURCES) { - HDMI_LOG("Busy...\n"); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - } - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - - } - - TRY_DONE: - return 0; -} - -static int hdmi_drv_audio_enable(bool enable) { - int err = 0; - - tda_instance *this = g_inst; - HDMI_FUNC(); - LOG(KERN_INFO, "called\n"); - - TDA_TRY(tmdlHdmiTxSetAudioMute(this->tda.instance, !enable)); - - - TRY_DONE: - return 0; -} - -static int last_hot_plug_detect_status; - -static int hdmi_hpd_detect_kthread(void *data) { - tda_instance *this = g_inst; - /* int ret = 0; */ - int hpd_result = 0; - struct sched_param param = { - .sched_priority = RTPM_PRIO_SCRN_UPDATE}; - - tmdlHdmiTxRxSense_t rx_sense_status = TMDL_HDMITX_RX_SENSE_INVALID; - HDMI_FUNC(); - - sched_setscheduler(current, SCHED_RR, ¶m); - - for (;;) { - /* ret =tmdlHdmiTxHandleInterrupt(this->tda.instance); */ - /* HDMI_LOG("%s, return %d\n", __func__, ret); */ - /* HDMI_LOG("%s, mdelay begin\n", __func__); */ - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - tmdlHdmiTxGetRXSenseStatus(this->tda.instance, &rx_sense_status); - this->tda.rx_device_active = - (rx_sense_status == TMDL_HDMITX_RX_SENSE_ACTIVE) ? true : false; - hpd_result = (this->tda.hot_plug_detect || this->tda.rx_device_active); - if (hpd_result != last_hot_plug_detect_status) { - HDMI_LOG("==============hdmi detect============\n"); - HDMI_LOG("this->tda.rx_device_active=%d, this->tda.hot_plug_detect=%d\n", - this->tda.rx_device_active, this->tda.hot_plug_detect); - HDMI_LOG("=====================================\n"); - /* tmdlHdmiTxHandleInterrupt(this->tda.instance); */ - } - - tmdlHdmiTxHandleInterrupt(this->tda.instance); - last_hot_plug_detect_status = hpd_result; - msleep(500); - - if (kthread_should_stop()) { - HDMI_LOG("%s, kthread stop\n", __func__); - break; - } - } - - return 0; -} - -static int hdmi_drv_init(void) { - HDMI_FUNC(); - memset((void *)&our_instance, 0, sizeof(tda_instance)); - - g_inst = &our_instance; - - Init_i2c(); - - return 0; -} - -static int hdmi_drv_enter(void) { - HDMI_FUNC(); - - return 0; -} - -static int hdmi_drv_exit(void) { - HDMI_FUNC(); - -#if 0 - mt_set_gpio_mode(GPIO60, GPIO_MODE_01); - mt_set_gpio_dir(GPIO60, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO60, true); - mt_set_gpio_pull_select(GPIO60, GPIO_PULL_UP); - - - mt65xx_eint_registration(8, 0, MT65XX_EINT_POL_NEG, NULL, 0); - mt65xx_eint_set_sens(8, MT65xx_EDGE_SENSITIVE); - mt65xx_eint_unmask(8); -#endif - return 0; -} - -int hdmi_drv_power_on(void) { - int err = 0; - tda_instance *this = g_inst; - tmdlHdmiTxRxSense_t rx_sense_status = TMDL_HDMITX_RX_SENSE_INVALID; - - HDMI_FUNC(); - - resume_i2c(); -#if USE_GPIO_HDMI_POWER_CONTROL - -#if defined GPIO_HDMI_POWER_CONTROL - mt_set_gpio_mode(GPIO_HDMI_POWER_CONTROL, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_HDMI_POWER_CONTROL, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_HDMI_POWER_CONTROL, 0); -#else - HDMI_LOG("FATAL ERROR!!!, HDMI GPIO is not defined -- GPIO_HDMI_POWER_CONTROL\n"); -#endif - -#endif - TDA_TRY(_tda19989_tx_init(g_inst)); - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - HDMI_LOG("%s, before enter standby, hot_plug_detect=%d\n", __func__, - this->tda.hot_plug_detect); - - this->tda.power = tmPowerSuspend; - TDA_TRY(tmdlHdmiTxSetPowerState(this->tda.instance, this->tda.power)); - if (err == TM_ERR_NO_RESOURCES) { - HDMI_LOG("Busy...\n"); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - } -#if USE_GPIO_HDMI_POWER_CONTROL - -#if defined GPIO_HDMI_POWER_CONTROL - mt_set_gpio_out(GPIO_HDMI_POWER_CONTROL, 1); -#else - HDMI_LOG("FATAL ERROR!!!, HDMI GPIO is not defined -- GPIO_HDMI_POWER_CONTROL\n"); -#endif - -#endif - - tmdlHdmiTxGetRXSenseStatus(this->tda.instance, &rx_sense_status); - this->tda.rx_device_active = - (rx_sense_status == TMDL_HDMITX_RX_SENSE_ACTIVE) ? true : false; - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - HDMI_LOG("this->tda.rx_device_active=%d, this->tda.hot_plug_detect=%d\n", - this->tda.rx_device_active, this->tda.hot_plug_detect); - -#if 0 - /* this is for HPD EINT setting. */ - /* please don't delete this, maybe we will use it one day. */ - mt_set_gpio_mode(GPIO60, GPIO_MODE_01); - mt_set_gpio_dir(GPIO60, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO60, true); - mt_set_gpio_pull_select(GPIO60, GPIO_PULL_UP); - - mt65xx_eint_set_sens(8, MT65xx_EDGE_SENSITIVE); - mt65xx_eint_registration(8, 0, MT65XX_EINT_POL_NEG, &_tda19989_irq_handler, 0); - - mt65xx_eint_unmask(8); -#endif - - hdmi_hpd_detect_task = - kthread_create(hdmi_hpd_detect_kthread, NULL, "hdmi_hpd_detect_kthread"); - wake_up_process(hdmi_hpd_detect_task); - - TRY_DONE: - return err; -} - - -void hdmi_drv_power_off(void) { - tda_instance *this = g_inst; - - int err = 0; - HDMI_FUNC(); - this->tda.power = tmPowerOff; - TDA_TRY(tmdlHdmiTxSetPowerState(this->tda.instance, this->tda.power)); - if (err == TM_ERR_NO_RESOURCES) { - LOG(KERN_INFO, "Busy...\n"); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - TDA_TRY(tmdlHdmiTxHandleInterrupt(this->tda.instance)); - } - kthread_stop(hdmi_hpd_detect_task); - _tda19989_tx_exit(g_inst); -#if USE_GPIO_HDMI_POWER_CONTROL - -#if defined GPIO_HDMI_POWER_CONTROL - mt_set_gpio_mode(GPIO_HDMI_POWER_CONTROL, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_HDMI_POWER_CONTROL, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_HDMI_POWER_CONTROL, 0); -#else - HDMI_LOG("FATAL ERROR!!!, HDMI GPIO is not defined -- GPIO_HDMI_POWER_CONTROL\n"); -#endif - -#endif - suspend_i2c(); - - last_hot_plug_detect_status = 0; - - TRY_DONE: - return; -} - -HDMI_STATE hdmi_drv_get_state(void) { - tda_instance *this = g_inst; - tmdlHdmiTxRxSense_t rx_sense_status = TMDL_HDMITX_RX_SENSE_INVALID; - HDMI_FUNC(); - - tmdlHdmiTxGetHPDStatus(this->tda.instance, &this->tda.hot_plug_detect); - tmdlHdmiTxGetRXSenseStatus(this->tda.instance, &rx_sense_status); - this->tda.rx_device_active = - (rx_sense_status == TMDL_HDMITX_RX_SENSE_ACTIVE) ? true : false; - - if (this->tda.hot_plug_detect || this->tda.rx_device_active) - return HDMI_STATE_ACTIVE; - else - return HDMI_STATE_NO_DEVICE; -} - -void hdmi_drv_log_enable(bool enable) { - hdmi_log_on = enable; -} - -const HDMI_DRIVER *HDMI_GetDriver(void) { - static const HDMI_DRIVER HDMI_DRV = { - .set_util_funcs = hdmi_drv_set_util_funcs, .get_params = hdmi_drv_get_params, .init = - hdmi_drv_init, .enter = hdmi_drv_enter, .exit = hdmi_drv_exit, .suspend = - hdmi_drv_suspend, .resume = hdmi_drv_resume, .video_config = - hdmi_drv_video_config, .audio_config = - hdmi_drv_audio_config, .video_enable = - hdmi_drv_video_enable, .audio_enable = hdmi_drv_audio_enable, .power_on = - hdmi_drv_power_on, .power_off = hdmi_drv_power_off, .get_state = - hdmi_drv_get_state, .log_enable = hdmi_drv_log_enable}; - - HDMI_FUNC(); - - return &HDMI_DRV; -} - - -#endif diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x.h deleted file mode 100644 index 66dac317566..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x.h +++ /dev/null @@ -1,145 +0,0 @@ -/*****************************************************************************/ -/* Copyright (c) 2009 NXP Semiconductors BV */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation, using version 2 of the License. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ -/* GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 */ -/* USA. */ -/* */ -/*****************************************************************************/ - -#ifndef __tx_h__ -#define __tx_h__ - - - -#include "tda998x_ioctl.h" - -#define HDMITX_NAME "hdmitx" - -#define POLLING_WQ_NAME "TDA_POLLING" -#define HDCP_CHECK_EVERY_MS 35 -#define CHECK_EVERY_XX_MS 200 -#define OMAP_LCD_GPIO 8 - -#define TDA_MAJOR 234 /* old-style interval of device numbers */ -#define MAX_MINOR 1 /* 1 minor but 2 access : 1 more for pooling */ - - -/* common I2C define with kernel */ -/* should be the same as arch/arm/mach-omap2/board-zoom2.c */ -#define TX_NAME "tda998X" -#define TDA998X_I2C_SLAVEADDRESS 0x70 - -#define TDA_IRQ_CALIB 107 - -#define EDID_BLOCK_COUNT 4 -#define EDID_BLOCK_SIZE 128 -#define MAX_EDID_TRIAL 5 -#define NO_PHY_ADDR 0xFFFF - -#define HDCP_IS_NOT_INSTALLED TMDL_HDMITX_HDCP_CHECK_NUM /* ugly is bad ! */ - -#define LOG(type, fmt, args...) {if (this->param.verbose) {printk(type HDMITX_NAME":%s:" fmt, __func__, ## args); } } -/* not found the kernel "strerror" one! If someone knows, please replace it */ -#define ERR_TO_STR(e)((e == -ENODATA)?"ENODATA, no data available" : \ - (e == -ENOMEM) ? "ENOMEM, no memory available" : \ - (e == -EINVAL) ? "EINVAL, invalid argument" : \ - (e == -EIO) ? "EIO, input/output error" : \ - (e == -ETIMEDOUT) ? "ETIMEOUT, timeout has expired" : \ - (e == -EBUSY) ? "EBUSY, device or resource busy" : \ - (e == -ENOENT) ? "ENOENT, no such file or directory" : \ - (e == -EACCES) ? "EACCES, permission denied" : \ - (e == 0) ? "" : \ - "!UNKNOWN!") - -#define TRY(fct) { \ - err = (fct); \ - if (err) { \ - pr_err("%s returned in %s line %d\n", hdmi_tx_err_string(err), __func__, __LINE__); \ - goto TRY_DONE; \ - } \ - } - -typedef void (*cec_callback_t) (struct work_struct *dummy); - -typedef struct { - /* module params */ - struct { - int verbose; - int major; - int minor; - } param; - /* driver */ - struct { - struct class *class; - struct device *dev; - int devno; - struct i2c_client *i2c_client; - struct semaphore sem; - int user_counter; - int minor; - wait_queue_head_t wait; - bool poll_done; -#ifndef IRQ - struct timer_list no_irq_timer; -#endif - struct timer_list hdcp_check; - cec_callback_t cec_callback; - bool omap_dss_hdmi_panel; - int gpio; - } driver; - /* HDMI */ - struct { - int instance; - tda_version version; - tda_setup setup; - tda_power power; - tmdlHdmiTxHotPlug_t hot_plug_detect; - bool rx_device_active; - tda_video_format video_fmt; - tda_set_in_out setio; - bool audio_mute; - tda_video_infoframe video_infoframe; - tda_audio_infoframe audio_infoframe; - tda_acp acp; - tda_gcp gcp; - tda_isrc1 isrc1; - tda_isrc2 isrc2; - tda_gammut gammut; - tda_mps_infoframe mps_infoframe; - tda_spd_infoframe spd_infoframe; - tda_vs_infoframe vs_infoframe; - tda_edid edid; - tda_edid_dtd edid_dtd; - tda_edid_md edid_md; - tda_edid_audio_caps edid_audio_caps; - tda_edid_video_caps edid_video_caps; - tda_edid_video_timings edid_video_timings; - tda_edid_tv_aspect_ratio edid_tv_aspect_ratio; -#ifdef TMFL_TDA19989 - tda_edid_latency edid_latency; -#endif - unsigned short src_address; - unsigned char raw_edid[EDID_BLOCK_COUNT * EDID_BLOCK_SIZE]; - tda_capabilities capabilities; - tda_event event; - tda_hdcp_status hdcp_status; - bool hdcp_enable; -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) - tda_hdcp_fail hdcp_fail; -#endif - unsigned char hdcp_raw_status; - } tda; -} tda_instance; - -#endif /* __tx_h__ */ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x_ioctl.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x_ioctl.h deleted file mode 100644 index 103ad54472b..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x_ioctl.h +++ /dev/null @@ -1,1154 +0,0 @@ -/** - * Copyright (C) 2006 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * Version Revision: 1.0 - * - * Date Date: 27/10/09 - * - * Brief API for the TDA1998x HDMI Transmitters - * - **/ - -#include - -#ifndef __tx_ioctl__ -#define __tx_ioctl__ - -#ifdef __tx_h__ - -#define TRANS_TYPE 1 - -#if TRANS_TYPE - -#define EXAMPLE_MAX_SVD 30 - -/* - trans-type -*/ -typedef tmSWVersion_t tda_version; -typedef tmPowerState_t tda_power; -typedef tmdlHdmiTxInstanceSetupInfo_t tda_setup; -typedef tmdlHdmiTxCapabilities_t tda_capabilities; -typedef tmdlHdmiTxVideoOutConfig_t tda_video_out; -typedef tmdlHdmiTxVideoInConfig_t tda_video_in; -typedef tmdlHdmiTxSinkType_t tda_sink; -typedef tmdlHdmiTxAudioInConfig_t tda_audio_in; -typedef tmdlHdmiTxEdidAudioDesc_t tda_edid_audio_desc; -typedef tmdlHdmiTxShortVidDesc_t tda_edid_video_desc; -typedef tmdlHdmiTxEvent_t tda_event; -typedef tmdlHdmiTxInstanceSetupInfo_t tda_setup_info; -typedef tmdlHdmiTxEdidVideoTimings_t tda_edid_video_timings; -typedef tmdlHdmiTxPictAspectRatio_t tda_edid_tv_aspect_ratio; -typedef tmdlHdmiTxHdcpCheck_t tda_hdcp_status; -#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984) -typedef tmdlHdmiTxHdcpStatus_t tda_hdcp_fail; -#endif -#ifdef TMFL_TDA19989 -typedef tmdlHdmiTxEdidLatency_t tda_edid_latency; -#endif - -typedef struct { - Bool enable; - tmdlHdmiTxGamutData_t data; -} tda_gammut; - -typedef struct { - Bool enable; - tmdlHdmiTxVsPktData_t data; -} tda_vs_infoframe; - -typedef struct { - Bool enable; - tmdlHdmiTxSpdIfData_t data; -} tda_spd_infoframe; - -typedef struct { - Bool enable; - tmdlHdmiTxMpsIfData_t data; -} tda_mps_infoframe; - -typedef struct { - Bool enable; - tmdlHdmiTxIsrc1PktData_t data; -} tda_isrc1; - -typedef struct { - Bool enable; - tmdlHdmiTxIsrc2PktData_t data; -} tda_isrc2; - -typedef struct { - Bool enable; - tmdlHdmiTxAcpPktData_t data; -} tda_acp; - -typedef struct { - Bool enable; - tmdlHdmiTxGcpPktData_t data; -} tda_gcp; - -typedef struct { - Bool enable; - tmdlHdmiTxAviIfData_t data; -} tda_video_infoframe; - -typedef struct { - Bool enable; - tmdlHdmiTxAudIfData_t data; -} tda_audio_infoframe; - -typedef struct { - tmdlHdmiTxVidFmt_t id; - tmdlHdmiTxVidFmtSpecs_t spec; -} tda_video_format; - -typedef struct { - tda_video_in video_in; - tda_video_out video_out; - tda_audio_in audio_in; /* Mind tda_set_audio_in if you change this */ - tda_sink sink; /* Mind tda_set_audio_in if you change this */ -} tda_set_in_out; - -typedef struct { - tda_audio_in audio_in; - tda_sink sink; -} tda_set_audio_in; - -typedef struct { - tda_edid_audio_desc desc[EXAMPLE_MAX_SVD]; - unsigned int max; - unsigned int written; - unsigned char flags; -} tda_edid_audio_caps; - -typedef struct { - tda_edid_video_desc desc[EXAMPLE_MAX_SVD]; - unsigned int max; - unsigned int written; - unsigned char flags; -} tda_edid_video_caps; - -typedef struct { - tmdlHdmiTxEdidStatus_t status; - unsigned char block_count; -} tda_edid; - -typedef struct { - tmdlHdmiTxEdidVideoTimings_t desc[EXAMPLE_MAX_SVD]; - unsigned char max; - unsigned char written; -} tda_edid_dtd; - -typedef struct { - tmdlHdmiTxEdidFirstMD_t desc1[EXAMPLE_MAX_SVD]; - tmdlHdmiTxEdidSecondMD_t desc2[EXAMPLE_MAX_SVD]; - tmdlHdmiTxEdidOtherMD_t other[EXAMPLE_MAX_SVD]; - unsigned char max; - unsigned char written; -} tda_edid_md; - -#else - -#error do not compiled this ! - -typedef enum { - TDA_HDCP_ACTIVE = 0, /**< HDCP encryption status switched to active */ - TDA_HDCP_INACTIVE = 1, /**< HDCP encryption status switched to inactive */ - TDA_HPD_ACTIVE = 2, /**< Hotplug status switched to active */ - TDA_HPD_INACTIVE = 3, /**< Hotplug status switched to inactive */ - TDA_RX_KEYS_RECEIVED = 4, /**< Receiver(s) key(s) received */ - TDA_RX_DEVICE_ACTIVE = 5, /**< Rx device is connected and active */ - TDA_RX_DEVICE_INACTIVE = 6, /**< Rx device is connected but inactive (standby) */ - TDA_EDID_RECEIVED = 7, /**< EDID has been received */ - TDA_VS_RPT_RECEIVED = 8, /**< VS interrupt has been received */ -#ifdef HDMI_TX_REPEATER_ISR_MODE - TDA_B_STATUS = 9, /**< TX received BStatus */ -#endif /* HDMI_TX_REPEATER_ISR_MODE */ - TDA_DEBUG_EVENT_1 = 10 /**< This is a debug event */ -} tda_event; - -typedef struct { - unsigned char format; /* EIA/CEA861 mode */ - unsigned char channels; /* number of channels */ - unsigned char supportedFreqs; /* bitmask of supported frequencies */ - unsigned char supportedRes; /* bitmask of supported resolutions (LPCM only) */ - unsigned char maxBitrate; /* Maximum bitrate divided by 8KHz (compressed formats only) */ -} tda_edid_audio_desc; - -typedef enum { - TDA_EDID_READ = 0, /**< All blocks read OK */ - TDA_EDID_READ_INCOMPLETE = 1, /**< All blocks read OK but buffer too small to return all of them */ - TDA_EDID_ERROR_CHK_BLOCK_0 = 2, /**< Block 0 checksum error */ - TDA_EDID_ERROR_CHK = 3, /**< Block 0 OK, checksum error in one or more other blocks */ - TDA_EDID_NOT_READ = 4, /**< EDID not read */ - TDA_EDID_STATUS_INVALID = 5 /**< Invalid */ -} tda_edid_status; - -typedef struct { - int HBR; /**< High Bitrate Audio packet */ - int DST; /**< Direct Stream Transport audio packet */ - int oneBitAudio; /**< One Bit Audio sample packet */ -} tda_audio_packet; - -typedef enum { - TDA_AFMT_SPDIF = 0, /**< SPDIF */ - TDA_AFMT_I2S = 1, /**< I2S */ - TDA_AFMT_OBA = 2, /**< One bit audio / DSD */ - TDA_AFMT_DST = 3, /**< DST */ - TDA_AFMT_HBR = 4 /**< HBR */ -} tda_audio_format; - -typedef enum { - TDA_AFS_32K = 0, /**< 32kHz */ - TDA_AFS_44K = 1, /**< 44.1kHz */ - TDA_AFS_48K = 2, /**< 48kHz */ - TDA_AFS_88K = 3, /**< 88.2kHz */ - TDA_AFS_96K = 4, /**< 96kHz */ - TDA_AFS_176K = 5, /**< 176.4kHz */ - TDA_AFS_192K = 6 /**< 192kHz */ -} tda_audio_rate; - -typedef enum { - TDA_I2SQ_16BITS = 16, /**< 16 bits */ - TDA_I2SQ_32BITS = 32, /**< 32 bits */ - TDA_I2SQ_OTHERS = 0 /**< for SPDIF and DSD */ -} tda_audio_I2S_qualifier; - -typedef enum { - TDA_I2SFOR_PHILIPS_L = 0, - /**< Philips like format */ - TDA_I2SFOR_OTH_L = 2, /**< Other non Philips left justified */ - TDA_I2SFOR_OTH_R = 3, /**< Other non Philips right justified */ - TDA_I2SFOR_INVALID = 4 /**< Invalid format */ -} tda_audio_I2S_format; - -typedef enum { - TDA_DSTRATE_SINGLE = 0, /**< Single transfer rate */ - TDA_DSTRATE_DOUBLE = 1 /**< Double data rate */ -} tda_dst_rate; - -typedef struct { - int simplayHd; /**< Enable simplayHD support */ - int repeaterEnable; /**< Enable repeater mode */ - unsigned char *pEdidBuffer; /**< Pointer to raw EDID data */ - unsigned long edidBufferSize; /**< Size of buffer for raw EDID data */ -} tda_instance_setup_info; - -typedef enum { - TDA_VFMT_NULL = 0, /**< Not a valid format... */ - TDA_VFMT_NO_CHANGE = 0, /**< ...or no change required */ - TDA_VFMT_MIN = 1, /**< Lowest valid format */ - TDA_VFMT_TV_MIN = 1, /**< Lowest valid TV format */ - TDA_VFMT_01_640x480p_60Hz = 1, /**< Format 01 640 x 480p 60Hz */ - TDA_VFMT_02_720x480p_60Hz = 2, /**< Format 02 720 x 480p 60Hz */ - TDA_VFMT_03_720x480p_60Hz = 3, /**< Format 03 720 x 480p 60Hz */ - TDA_VFMT_04_1280x720p_60Hz = 4, /**< Format 04 1280 x 720p 60Hz */ - TDA_VFMT_05_1920x1080i_60Hz = 5,/**< Format 05 1920 x 1080i 60Hz */ - TDA_VFMT_06_720x480i_60Hz = 6, /**< Format 06 720 x 480i 60Hz */ - TDA_VFMT_07_720x480i_60Hz = 7, /**< Format 07 720 x 480i 60Hz */ - TDA_VFMT_08_720x240p_60Hz = 8, /**< Format 08 720 x 240p 60Hz */ - TDA_VFMT_09_720x240p_60Hz = 9, /**< Format 09 720 x 240p 60Hz */ - TDA_VFMT_10_720x480i_60Hz = 10, /**< Format 10 720 x 480i 60Hz */ - TDA_VFMT_11_720x480i_60Hz = 11, /**< Format 11 720 x 480i 60Hz */ - TDA_VFMT_12_720x240p_60Hz = 12, /**< Format 12 720 x 240p 60Hz */ - TDA_VFMT_13_720x240p_60Hz = 13, /**< Format 13 720 x 240p 60Hz */ - TDA_VFMT_14_1440x480p_60Hz = 14,/**< Format 14 1440 x 480p 60Hz */ - TDA_VFMT_15_1440x480p_60Hz = 15,/**< Format 15 1440 x 480p 60Hz */ - TDA_VFMT_16_1920x1080p_60Hz = 16, - /**< Format 16 1920 x 1080p 60Hz */ - TDA_VFMT_17_720x576p_50Hz = 17, /**< Format 17 720 x 576p 50Hz */ - TDA_VFMT_18_720x576p_50Hz = 18, /**< Format 18 720 x 576p 50Hz */ - TDA_VFMT_19_1280x720p_50Hz = 19,/**< Format 19 1280 x 720p 50Hz */ - TDA_VFMT_20_1920x1080i_50Hz = 20, - /**< Format 20 1920 x 1080i 50Hz */ - TDA_VFMT_21_720x576i_50Hz = 21, /**< Format 21 720 x 576i 50Hz */ - TDA_VFMT_22_720x576i_50Hz = 22, /**< Format 22 720 x 576i 50Hz */ - TDA_VFMT_23_720x288p_50Hz = 23, /**< Format 23 720 x 288p 50Hz */ - TDA_VFMT_24_720x288p_50Hz = 24, /**< Format 24 720 x 288p 50Hz */ - TDA_VFMT_25_720x576i_50Hz = 25, /**< Format 25 720 x 576i 50Hz */ - TDA_VFMT_26_720x576i_50Hz = 26, /**< Format 26 720 x 576i 50Hz */ - TDA_VFMT_27_720x288p_50Hz = 27, /**< Format 27 720 x 288p 50Hz */ - TDA_VFMT_28_720x288p_50Hz = 28, /**< Format 28 720 x 288p 50Hz */ - TDA_VFMT_29_1440x576p_50Hz = 29,/**< Format 29 1440 x 576p 50Hz */ - TDA_VFMT_30_1440x576p_50Hz = 30,/**< Format 30 1440 x 576p 50Hz */ - TDA_VFMT_31_1920x1080p_50Hz = 31, - /**< Format 31 1920 x 1080p 50Hz */ - TDA_VFMT_32_1920x1080p_24Hz = 32, - /**< Format 32 1920 x 1080p 24Hz */ - TDA_VFMT_33_1920x1080p_25Hz = 33, - /**< Format 33 1920 x 1080p 25Hz */ - TDA_VFMT_34_1920x1080p_30Hz = 34, - /**< Format 34 1920 x 1080p 30Hz */ - TDA_VFMT_TV_MAX = 34, /**< Highest valid TV format */ - TDA_VFMT_TV_NO_REG_MIN = 32, /**< Lowest TV format without prefetched table */ - TDA_VFMT_TV_NUM = 35, /**< Number of TV formats & null */ - TDA_VFMT_PC_MIN = 128, /**< Lowest valid PC format */ - TDA_VFMT_PC_640x480p_60Hz = 128,/**< PC format 128 */ - TDA_VFMT_PC_800x600p_60Hz = 129,/**< PC format 129 */ - TDA_VFMT_PC_1152x960p_60Hz = 130, - /**< PC format 130 */ - TDA_VFMT_PC_1024x768p_60Hz = 131, - /**< PC format 131 */ - TDA_VFMT_PC_1280x768p_60Hz = 132, - /**< PC format 132 */ - TDA_VFMT_PC_1280x1024p_60Hz = 133, - /**< PC format 133 */ - TDA_VFMT_PC_1360x768p_60Hz = 134, - /**< PC format 134 */ - TDA_VFMT_PC_1400x1050p_60Hz = 135, - /**< PC format 135 */ - TDA_VFMT_PC_1600x1200p_60Hz = 136, - /**< PC format 136 */ - TDA_VFMT_PC_1024x768p_70Hz = 137, - /**< PC format 137 */ - TDA_VFMT_PC_640x480p_72Hz = 138,/**< PC format 138 */ - TDA_VFMT_PC_800x600p_72Hz = 139,/**< PC format 139 */ - TDA_VFMT_PC_640x480p_75Hz = 140,/**< PC format 140 */ - TDA_VFMT_PC_1024x768p_75Hz = 141, - /**< PC format 141 */ - TDA_VFMT_PC_800x600p_75Hz = 142,/**< PC format 142 */ - TDA_VFMT_PC_1024x864p_75Hz = 143, - /**< PC format 143 */ - TDA_VFMT_PC_1280x1024p_75Hz = 144, - /**< PC format 144 */ - TDA_VFMT_PC_640x350p_85Hz = 145,/**< PC format 145 */ - TDA_VFMT_PC_640x400p_85Hz = 146,/**< PC format 146 */ - TDA_VFMT_PC_720x400p_85Hz = 147,/**< PC format 147 */ - TDA_VFMT_PC_640x480p_85Hz = 148,/**< PC format 148 */ - TDA_VFMT_PC_800x600p_85Hz = 149,/**< PC format 149 */ - TDA_VFMT_PC_1024x768p_85Hz = 150, - /**< PC format 150 */ - TDA_VFMT_PC_1152x864p_85Hz = 151, - /**< PC format 151 */ - TDA_VFMT_PC_1280x960p_85Hz = 152, - /**< PC format 152 */ - TDA_VFMT_PC_1280x1024p_85Hz = 153, - /**< PC format 153 */ - TDA_VFMT_PC_1024x768i_87Hz = 154, - /**< PC format 154 */ - TDA_VFMT_PC_MAX = 154, /**< Highest valid PC format */ - TDA_VFMT_PC_NUM = (1 + 154 - 128) /**< Number of PC formats */ -} tda_video_fmt_id; - -typedef struct { - tda_video_fmt_id videoFormat; /**< Video format as defined by EIA/CEA 861-D */ - int nativeVideoFormat; /**< True if format is the preferred video format */ -} tda_edid_video_desc; - -typedef struct { - tda_video_fmt_id videoFormat; /**< Video format as defined by EIA/CEA 861-D */ - int nativeVideoFormat; /**< True if format is the preferred video format */ -} tda_short_video_desc; - -typedef enum { - TDA_P_ASPECT_RATIO_UNDEFINED = 0, /**< Undefined picture aspect ratio */ - TDA_P_ASPECT_RATIO_6_5 = 1, /**< 6:5 picture aspect ratio (PAR) */ - TDA_P_ASPECT_RATIO_5_4 = 2, /**< 5:4 PAR */ - TDA_P_ASPECT_RATIO_4_3 = 3, /**< 4:3 PAR */ - TDA_P_ASPECT_RATIO_16_10 = 4, /**< 16:10 PAR */ - TDA_P_ASPECT_RATIO_5_3 = 5, /**< 5:3 PAR */ - TDA_P_ASPECT_RATIO_16_9 = 6, /**< 16:9 PAR */ - TDA_P_ASPECT_RATIO_9_5 = 7 /**< 9:5 PAR */ -} tda_pict_aspect_ratio; - -typedef enum { - TDA_VFREQ_24Hz = 0, /**< 24Hz */ - TDA_VFREQ_25Hz = 1, /**< 25Hz */ - TDA_VFREQ_30Hz = 2, /**< 30Hz */ - TDA_VFREQ_50Hz = 3, /**< 50Hz */ - TDA_VFREQ_59Hz = 4, /**< 59.94Hz */ - TDA_VFREQ_60Hz = 5, /**< 60Hz */ - TDA_VFREQ_70Hz = 6, /**< 70Hz */ - TDA_VFREQ_72Hz = 7, /**< 72Hz */ - TDA_VFREQ_75Hz = 8, /**< 75Hz */ - TDA_VFREQ_85Hz = 9, /**< 85Hz */ - TDA_VFREQ_87Hz = 10, /**< 87Hz */ - TDA_VFREQ_INVALID = 11, /**< Invalid */ - TDA_VFREQ_NUM = 11 /**< No. of values */ -} tda_vfreq; - -typedef struct { - unsigned short width; /**< Width of the frame in pixels */ - unsigned short height; /**< Height of the frame in pixels */ - int interlaced; /**< Interlaced mode (True/False) */ - tda_vfreq vfrequency; /**< Vertical frequency in Hz */ - tda_pict_aspect_ratio aspectRatio; - /**< Picture aspect ratio (H:V) */ -} tda_video_fmt_specs; - -typedef enum { - TDA_VINMODE_CCIR656 = 0, /**< CCIR656 */ - TDA_VINMODE_RGB444 = 1, /**< RGB444 */ - TDA_VINMODE_YUV444 = 2, /**< YUV444 */ - TDA_VINMODE_YUV422 = 3, /**< YUV422 */ - TDA_VINMODE_NO_CHANGE = 4, /**< No change */ - TDA_VINMODE_INVALID = 5 /**< Invalid */ -} tda_vinmode; - -typedef enum { - TDA_SYNCSRC_EMBEDDED = 0, - /**< Embedded sync */ - TDA_SYNCSRC_EXT_VREF = 1, - /**< External sync Vref, Href, Fref */ - TDA_SYNCSRC_EXT_VS = 2/**< External sync Vs, Hs */ -} tda_sync_source; - -typedef enum { - TDA_PIXRATE_DOUBLE = 0, /**< Double pixel rate */ - TDA_PIXRATE_SINGLE = 1, /**< Single pixel rate */ - TDA_PIXRATE_SINGLE_REPEATED = 2 /**< Single pixel repeated */ -} tda_pix_rate; - -typedef struct { - tda_video_fmt_id format; /**< Video format as defined by EIA/CEA 861-D */ - tda_vinmode mode; /**< Video mode (CCIR, RGB, YUV, etc.) */ - tda_sync_source syncSource; - /**< Sync source type */ - tda_pix_rate pixelRate; /**< Pixel rate */ -} tda_video_in; - -typedef enum { - TDA_VOUTMODE_RGB444 = 0, /**< RGB444 */ - TDA_VOUTMODE_YUV422 = 1, /**< YUV422 */ - TDA_VOUTMODE_YUV444 = 2 /**< YUV444 */ -} tda_vout_mode; - -typedef enum { - TDA_VQR_DEFAULT = 0, /* Follow HDMI spec. */ - TDA_RGB_FULL = 1, /* Force RGB FULL , DVI only */ - TDA_RGB_LIMITED = 2 /* Force RGB LIMITED , DVI only */ -} tda_vqr; - -typedef enum { - TDA_COLORDEPTH_24 = 0, /**< 8 bits per color */ - TDA_COLORDEPTH_30 = 1, /**< 10 bits per color */ - TDA_COLORDEPTH_36 = 2, /**< 12 bits per color */ - TDA_COLORDEPTH_48 = 3 /**< 16 bits per color */ -} tda_color_depth; - -typedef struct { - tda_video_fmt_id format; /**< Video format as defined by EIA/CEA 861-D */ - tda_vout_mode mode; /**< Video mode (CCIR, RGB, YUV, etc.) */ - tda_color_depth colorDepth; - /**< Color depth */ - tda_vqr dviVqr; /**< VQR applied in DVI mode */ -} tda_video_out; - -typedef struct { - tda_audio_format format; /**< Audio format (I2S, SPDIF, etc.) */ - tda_audio_rate rate; /**< Audio sampling rate */ - tda_audio_I2S_format i2sFormat; /**< I2S format of the audio input */ - tda_audio_I2S_qualifier i2sQualifier; /**< I2S qualifier of the audio input (8,16,32 bits) */ - tda_dst_rate dstRate; /**< DST data transfer rate */ - unsigned char channelAllocation; /**< Ref to CEA-861D p85 */ -} tda_audio_in; - -typedef enum { - TDA_SINK_DVI = 0, - /**< DVI */ - TDA_SINK_HDMI = 1, - /**< HDMI */ - TDA_SINK_EDID = 2 - /**< As currently defined in EDID */ -} tda_sink; - -typedef enum { - TDA_DEVICE_UNKNOWN,/**< HW device is unknown */ - TDA_DEVICE_TDA9984,/**< HW device is IC TDA9984 */ - TDA_DEVICE_TDA9989,/**< HW device is IC TDA9989 */ - TDA_DEVICE_TDA9981,/**< HW device is IC TDA9981 */ - TDA_DEVICE_TDA9983,/**< HW device is IC TDA9983 */ - TDA_DEVICE_TDA19989/**< HW device is IC TDA19989 */ -} tda_device_version; - -typedef enum { - TDA_HDMI_VERSION_UNKNOWN, - /**< Unknown */ - TDA_HDMI_VERSION_1_1,/**< HDMI 1.1 */ - TDA_HDMI_VERSION_1_2a, - /**< HDMI 1.2a */ - TDA_HDMI_VERSION_1_3a/**< HDMI 1.3 */ -} tda_hdmi_version; - -typedef struct { - int HBR; /**< High Bitrate Audio packet */ - int DST; /**< Direct Stream Transport audio packet */ - int oneBitAudio; /**< One Bit Audio sample packet */ -} tda_audio_packet; - -typedef enum { - TDA_COLORDEPTH_24 = 0, /**< 8 bits per color */ - TDA_COLORDEPTH_30 = 1, /**< 10 bits per color */ - TDA_COLORDEPTH_36 = 2, /**< 12 bits per color */ - TDA_COLORDEPTH_48 = 3 /**< 16 bits per color */ -} tda_color_depth; - -typedef struct { - tda_device_version deviceVersion; - /**< HW device version */ - tda_hdmi_version hdmiVersion;/**< Supported HDMI standard version */ - tda_audio_packet audioPacket;/**< Supported audio packets */ - tda_color_depth colorDepth; /**< Supported color depth */ - int hdcp; /**< Supported Hdcp encryption (True/False) */ - int scaler; /**< Supported scaler (True/False) */ -} tda_capabilities; - -typedef struct { - unsigned long compatibilityNr; /* Interface compatibility number */ - unsigned long majorVersionNr; /* Interface major version number */ - unsigned long minorVersionNr; /* Interface minor version number */ -} tda_version; - -typedef enum { - PowerOn, /* Device powered on (D0 state) */ - PowerStandby, /* Device power standby (D1 state) */ - PowerSuspend, /* Device power suspended (D2 state) */ - PowerOff /* Device powered off (D3 state) */ -} tda_powerXXX; - -typedef struct { - unsigned int simplayHd; /**< Enable simplayHD support */ - unsigned int repeaterEnable; /**< Enable repeater mode */ - unsigned char *pEdidBuffer; /**< Pointer to raw EDID data */ - unsigned long edidBufferSize; /**< Size of buffer for raw EDID data */ -} tda_setup; - -typedef struct { - tda_video_fmt_id id; - tda_video_fmt_specs spec; -} tda_video_format; - -typedef struct { - tda_video_in video_in; - tda_video_out video_out; - tda_audio_in audio_in; -} tda_set_in_out; - -typedef struct { - tda_edid_audio_desc desc; - unsigned int max; - unsigned int written; - unsigned char flags; -} tda_edid_audio_caps; - -typedef struct { - tda_edid_video_desc desc; - unsigned int max; - unsigned int written; - unsigned char flags; -} tda_edid_video_caps; - -typedef struct { - tda_edid_status status; - unsigned char block_count; -} tda_edid; - -#endif - -#define TDA_IOCTL_BASE 0x40 -#define RELEASE 0xFF - -enum { - /* driver specific */ - TDA_VERBOSE_ON_CMD = 0, - TDA_VERBOSE_OFF_CMD, - TDA_BYEBYE_CMD, - /* HDMI Tx */ - TDA_GET_SW_VERSION_CMD, - TDA_SET_POWER_CMD, - TDA_GET_POWER_CMD, - TDA_SETUP_CMD, - TDA_GET_SETUP_CMD, - TDA_WAIT_EVENT_CMD, - TDA_ENABLE_EVENT_CMD, - TDA_DISABLE_EVENT_CMD, - TDA_GET_VIDEO_SPEC_CMD, - TDA_SET_INPUT_OUTPUT_CMD, - TDA_SET_AUDIO_INPUT_CMD, - TDA_SET_VIDEO_INFOFRAME_CMD, - TDA_SET_AUDIO_INFOFRAME_CMD, - TDA_SET_ACP_CMD, - TDA_SET_GCP_CMD, - TDA_SET_ISRC1_CMD, - TDA_SET_ISRC2_CMD, - TDA_SET_MPS_INFOFRAME_CMD, - TDA_SET_SPD_INFOFRAME_CMD, - TDA_SET_VS_INFOFRAME_CMD, - TDA_SET_AUDIO_MUTE_CMD, - TDA_RESET_AUDIO_CTS_CMD, - TDA_GET_EDID_STATUS_CMD, - TDA_GET_EDID_AUDIO_CAPS_CMD, - TDA_GET_EDID_VIDEO_CAPS_CMD, - TDA_GET_EDID_VIDEO_PREF_CMD, - TDA_GET_EDID_SINK_TYPE_CMD, - TDA_GET_EDID_SOURCE_ADDRESS_CMD, - TDA_SET_GAMMUT_CMD, - TDA_GET_EDID_DTD_CMD, - TDA_GET_EDID_MD_CMD, - TDA_GET_EDID_TV_ASPECT_RATIO_CMD, - TDA_GET_EDID_LATENCY_CMD, - TDA_SET_HDCP_CMD, - TDA_GET_HDCP_STATUS_CMD, - TDA_GET_HPD_STATUS_CMD, -}; - - -/* driver specific */ -#define TDA_IOCTL_VERBOSE_ON _IO(TDA_IOCTL_BASE, TDA_VERBOSE_ON_CMD) -#define TDA_IOCTL_VERBOSE_OFF _IO(TDA_IOCTL_BASE, TDA_VERBOSE_OFF_CMD) -#define TDA_IOCTL_BYEBYE _IO(TDA_IOCTL_BASE, TDA_BYEBYE_CMD) -/* HDMI Tx */ -#define TDA_IOCTL_GET_SW_VERSION _IOWR(TDA_IOCTL_BASE, TDA_GET_SW_VERSION_CMD, tda_version) -#define TDA_IOCTL_SET_POWER _IOWR(TDA_IOCTL_BASE, TDA_SET_POWER_CMD, tda_power) -#define TDA_IOCTL_GET_POWER _IOWR(TDA_IOCTL_BASE, TDA_GET_POWER_CMD, tda_power) -#define TDA_IOCTL_SETUP _IOWR(TDA_IOCTL_BASE, TDA_SETUP_CMD, tda_setup_info) -#define TDA_IOCTL_GET_SETUP _IOWR(TDA_IOCTL_BASE, TDA_GET_SETUP_CMD, tda_setup_info) -#define TDA_IOCTL_WAIT_EVENT _IOWR(TDA_IOCTL_BASE, TDA_WAIT_EVENT_CMD, tda_event) -#define TDA_IOCTL_ENABLE_EVENT _IOWR(TDA_IOCTL_BASE, TDA_ENABLE_EVENT_CMD, tda_event) -#define TDA_IOCTL_DISABLE_EVENT _IOWR(TDA_IOCTL_BASE, TDA_DISABLE_EVENT_CMD, tda_event) -#define TDA_IOCTL_GET_VIDEO_SPEC _IOWR(TDA_IOCTL_BASE, TDA_GET_VIDEO_SPEC_CMD, tda_video_format) -#define TDA_IOCTL_SET_INPUT_OUTPUT _IOWR(TDA_IOCTL_BASE, TDA_SET_INPUT_OUTPUT_CMD, tda_set_in_out) -#define TDA_IOCTL_SET_AUDIO_INPUT _IOWR(TDA_IOCTL_BASE, TDA_SET_AUDIO_INPUT_CMD, tda_audio_in) -#define TDA_IOCTL_SET_VIDEO_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_VIDEO_INFOFRAME_CMD, tda_video_infoframe) -#define TDA_IOCTL_SET_AUDIO_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_AUDIO_INFOFRAME_CMD, tda_audio_infoframe) -#define TDA_IOCTL_SET_ACP _IOWR(TDA_IOCTL_BASE, TDA_SET_ACP_CMD, tda_acp) -#define TDA_IOCTL_SET_GCP _IOWR(TDA_IOCTL_BASE, TDA_SET_GCP_CMD, tda_gcp) -#define TDA_IOCTL_SET_ISRC1 _IOWR(TDA_IOCTL_BASE, TDA_SET_ISRC1_CMD, tda_isrc1) -#define TDA_IOCTL_SET_ISRC2 _IOWR(TDA_IOCTL_BASE, TDA_SET_ISRC2_CMD, tda_isrc2) -#define TDA_IOCTL_SET_MPS_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_MPS_INFOFRAME_CMD, tda_mps_infoframe) -#define TDA_IOCTL_SET_SPD_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_SPD_INFOFRAME_CMD, tda_spd_infoframe) -#define TDA_IOCTL_SET_VS_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_VS_INFOFRAME_CMD, tda_vs_infoframe) -#define TDA_IOCTL_SET_AUDIO_MUTE _IOWR(TDA_IOCTL_BASE, TDA_SET_AUDIO_MUTE_CMD, bool) -#define TDA_IOCTL_RESET_AUDIO_CTS _IO(TDA_IOCTL_BASE, TDA_RESET_AUDIO_CTS_CMD) -#define TDA_IOCTL_GET_EDID_STATUS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_STATUS_CMD, tda_edid) -#define TDA_IOCTL_GET_EDID_AUDIO_CAPS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_AUDIO_CAPS_CMD, tda_edid_audio_caps) -#define TDA_IOCTL_GET_EDID_VIDEO_CAPS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_VIDEO_CAPS_CMD, tda_edid_video_caps) -#define TDA_IOCTL_GET_EDID_VIDEO_PREF _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_VIDEO_PREF_CMD, tda_edid_video_timings) -#define TDA_IOCTL_GET_EDID_SINK_TYPE _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_SINK_TYPE_CMD, tda_sink) -#define TDA_IOCTL_GET_EDID_SOURCE_ADDRESS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_SOURCE_ADDRESS_CMD, unsigned short) -#define TDA_IOCTL_SET_GAMMUT _IOWR(TDA_IOCTL_BASE, TDA_SET_GAMMUT_CMD, tda_gammut) -#define TDA_IOCTL_GET_EDID_DTD _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_DTD_CMD, tda_edid_dtd) -#define TDA_IOCTL_GET_EDID_MD _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_MD_CMD, tda_edid_md) -#define TDA_IOCTL_GET_EDID_TV_ASPECT_RATIO _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_TV_ASPECT_RATIO_CMD, tda_edid_tv_aspect_ratio) -#define TDA_IOCTL_GET_HPD_STATUS _IOWR(TDA_IOCTL_BASE, TDA_GET_HPD_STATUS_CMD, tmdlHdmiTxHotPlug_t) -#ifdef TMFL_TDA19989 -#define TDA_IOCTL_GET_EDID_LATENCY _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_LATENCY_CMD, tda_edid_latency) -#define TDA_IOCTL_SET_HDCP _IOWR(TDA_IOCTL_BASE, TDA_SET_HDCP_CMD, bool) -#define TDA_IOCTL_GET_HDCP_STATUS _IOWR(TDA_IOCTL_BASE, TDA_GET_HDCP_STATUS_CMD, tda_hdcp_status) -#endif - - -/* --- Full list --- */ - -/* legend: */ -/* ------- */ -/* [ ] : not supported */ -/* [x] : IOCTL */ -/* [i] : open, init... */ - -/* [x] tmdlHdmiTxGetSWVersion */ -/* [ ] tmdlHdmiTxGetNumberOfUnits */ -/* [i] tmdlHdmiTxGetCapabilities */ -/* [ ] tmdlHdmiTxGetCapabilitiesM */ -/* [i] tmdlHdmiTxOpen */ -/* [ ] tmdlHdmiTxOpenM */ -/* [i] tmdlHdmiTxClose */ -/* [x] tmdlHdmiTxSetPowerState */ -/* [x] tmdlHdmiTxGetPowerState */ -/* [ ] tmdlHdmiTxInstanceConfig */ -/* [xi] tmdlHdmiTxInstanceSetup */ -/* [x] tmdlHdmiTxGetInstanceSetup */ -/* [x] tmdlHdmiTxHandleInterrupt see IOCTL_WAIT_EVENT */ -/* [i] tmdlHdmiTxRegisterCallbacks */ -/* [x] tmdlHdmiTxEnableEvent */ -/* [x] tmdlHdmiTxDisableEvent */ -/* [x] tmdlHdmiTxGetVideoFormatSpecs */ -/* [x] tmdlHdmiTxSetInputOutput */ -/* [x] tmdlHdmiTxSetAudioInput */ -/* [x] tmdlHdmiTxSetVideoInfoframe */ -/* [x] tmdlHdmiTxSetAudioInfoframe */ -/* [x] tmdlHdmiTxSetACPPacket */ -/* [x] tmdlHdmiTxSetGeneralControlPacket */ -/* [x] tmdlHdmiTxSetISRC1Packet */ -/* [x] tmdlHdmiTxSetISRC2Packet */ -/* [x] tmdlHdmiTxSetMPSInfoframe */ -/* [x] tmdlHdmiTxSetSpdInfoframe */ -/* [x] tmdlHdmiTxSetVsInfoframe */ -/* [ ] tmdlHdmiTxDebugSetNullPacket */ -/* [ ] tmdlHdmiTxDebugSetSingleNullPacket */ -/* [x] tmdlHdmiTxSetAudioMute */ -/* [x] tmdlHdmiTxResetAudioCts */ -/* [x] tmdlHdmiTxGetEdidStatus */ -/* [x] tmdlHdmiTxGetEdidAudioCaps */ -/* [x] tmdlHdmiTxGetEdidVideoCaps */ -/* [x] tmdlHdmiTxGetEdidVideoPreferred */ -/* [x] tmdlHdmiTxGetEdidSinkType */ -/* [x] tmdlHdmiTxGetEdidSourceAddress */ -/* [ ] tmdlHdmiTxGetKsvList */ -/* [ ] tmdlHdmiTxGetDepth */ -/* [ ] tmdlHdmiTxGeneSHA_1_IT */ -/* [ ] tmdlHdmiTxSetHdcp */ -/* [ ] tmdlHdmiTxGetHdcpState */ -/* [ ] tmdlHdmiTxHdcpCheck */ -/* [x] tmdlHdmiTxSetGamutPacket */ -/* [x] tmdlHdmiTxGetEdidDetailledTimingDescriptors */ -/* [x] tmdlHdmiTxGetEdidMonitorDescriptors */ -/* [x] tmdlHdmiTxGetEdidTVPictureRatio */ -/* [ ] tmdlHdmiTxSetHDCPRevocationList */ -/* [ ] tmdlHdmiTxGetHdcpFailStatus */ -/* [x] tmdlHdmiTxGetEdidLatencyInfo */ -/* [ ] tmdlHdmiTxSetBScreen */ -/* [ ] tmdlHdmiTxRemoveBScreen */ - - -#endif /* __tx_h__ */ -#endif /* __tx_ioctl__ */ - -#ifndef __cec_ioctl__ -#define __cec_ioctl__ - -#ifdef __cec_h__ - -typedef struct { - UInt8 DayOfMonth; - UInt8 MonthOfYear; - UInt16 StartTime; - tmdlHdmiCECDuration_t Duration; - UInt8 RecordingSequence; - tmdlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType; - UInt16 AnalogueFrequency; - tmdlHdmiCECBroadcastSystem_t BroadcastSystem; -} cec_analogue_timer; - -typedef struct { - UInt8 DayOfMonth; - UInt8 MonthOfYear; - UInt16 StartTime; - tmdlHdmiCECDuration_t Duration; - UInt8 RecordingSequence; - tmdlHdmiCECDigitalServiceIdentification_t ServiceIdentification; -} cec_digital_timer; - -typedef struct { - UInt8 DayOfMonth; - UInt8 MonthOfYear; - UInt16 StartTime; - tmdlHdmiCECDuration_t Duration; - UInt8 RecordingSequence; - tmdlHdmiCECExternalPlug_t ExternalPlug; -} cec_ext_timer_with_ext_plug; - -typedef struct { - UInt8 DayOfMonth; - UInt8 MonthOfYear; - UInt16 StartTime; - tmdlHdmiCECDuration_t Duration; - UInt8 RecordingSequence; - tmdlHdmiCECExternalPhysicalAddress_t ExternalPhysicalAddress; -} cec_ext_timer_with_phy_addr; - -typedef struct { - tmdlHdmiCECFeatureOpcode_t FeatureOpcode; - tmdlHdmiCECAbortReason_t AbortReason; -} cec_feature_abort; - -typedef struct { - tmdlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType; - UInt16 AnalogueFrequency; - tmdlHdmiCECBroadcastSystem_t BroadcastSystem; -} cec_analogue_service; - -typedef struct { - UInt16 OriginalAddress; - UInt16 NewAddress; -} cec_routing_change; - -typedef struct { - char data[15]; - unsigned char length; -} cec_string; - -typedef struct { - tmdlHdmiCECDisplayControl_t DisplayControl; - char data[15]; - unsigned char length; -} cec_osd_string; - -typedef struct { - tmdlHdmiCECRecordingFlag_t RecordingFlag; - tmdlHdmiCECTunerDisplayInfo_t TunerDisplayInfo; - tmdlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType; - UInt16 AnalogueFrequency; - tmdlHdmiCECBroadcastSystem_t BroadcastSystem; -} cec_tuner_device_status_analogue; - -typedef struct { - tmdlHdmiCECRecordingFlag_t RecordingFlag; - tmdlHdmiCECTunerDisplayInfo_t TunerDisplayInfo; - tmdlHdmiCECDigitalServiceIdentification_t ServiceIdentification; -} cec_tuner_device_status_digital; - -typedef struct { - unsigned long VendorID; - cec_string cmd; -} cec_vendor_command_with_id; - -/* - typedef struct { - UInt8 *pData; - UInt16 lenData; - } cec_send_msg; -*/ - -typedef struct { - unsigned char count; - unsigned char service; - unsigned char addr; - unsigned char data[15]; -} cec_frame; -/* typedef tmdlHdmiCecFrameFormat_t cec_frame; */ - -typedef tmSWVersion_t cec_sw_version; -typedef tmPowerState_t cec_power; -typedef tmdlHdmiCecInstanceSetup_t cec_setup; -typedef tmdlHdmiCecEvent_t cec_event; -typedef tmdlHdmiCecClockSource_t cec_clock; -typedef tmdlHdmiCECSystemAudioStatus_t cec_sys_audio_status; -typedef tmdlHdmiCECAudioRate_t cec_audio_rate; -typedef tmdlHdmiCECDigitalServiceIdentification_t cec_digital_service; -typedef tmdlHdmiCECVersion_t cec_version; -typedef tmdlHdmiCECDecControlMode_t cec_deck_ctrl; -typedef tmdlHdmiCECDecInfo_t cec_deck_status; -typedef tmdlHdmiCECStatusRequest_t cec_status_request; -typedef tmdlHdmiCECMenuRequestType_t cec_menu_request; -typedef tmdlHdmiCECMenuState_t cec_menu_status; -typedef tmdlHdmiCECPlayMode_t cec_play; -typedef tmdlHdmiCECExternalPlug_t cec_ext_plug; -typedef tmdlHdmiCECRecordStatusInfo_t cec_rec_status; -typedef tmdlHdmiCECAudioStatus_t cec_audio_status; -typedef tmdlHdmiCECPowerStatus_t cec_power_status; -typedef tmdlHdmiCECTimerClearedStatusData_t cec_timer_cleared_status; -typedef tmdlHdmiCECTimerStatusData_t cec_timer_status; -typedef tmdlHdmiCECUserRemoteControlCommand_t cec_user_ctrl; -typedef tmdlHdmiCECChannelIdentifier_t cec_user_ctrl_tune; -typedef tmdlHdmiCECDeviceType_t cec_device_type; - -#define CEC_IOCTL_BASE 0x40 - -/* service */ -enum { - CEC_WAITING = 0x80, - CEC_RELEASE, - CEC_RX_DONE, - CEC_TX_DONE -}; - -enum { - /* driver specific */ - CEC_VERBOSE_ON_CMD = 0, - CEC_VERBOSE_OFF_CMD, - CEC_BYEBYE_CMD, - - /* CEC */ - CEC_IOCTL_RX_ADDR_CMD, /* receiver logical address selector */ - CEC_IOCTL_PHY_ADDR_CMD, /* physical address selector */ - CEC_IOCTL_WAIT_FRAME_CMD, - CEC_IOCTL_ABORT_MSG_CMD, - CEC_IOCTL_ACTIVE_SRC_CMD, - CEC_IOCTL_VERSION_CMD, - CEC_IOCTL_CLEAR_ANALOGUE_TIMER_CMD, - CEC_IOCTL_CLEAR_DIGITAL_TIMER_CMD, - CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG_CMD, - CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR_CMD, - CEC_IOCTL_DECK_CTRL_CMD, - CEC_IOCTL_DECK_STATUS_CMD, - CEC_IOCTL_DEVICE_VENDOR_ID_CMD, - CEC_IOCTL_FEATURE_ABORT_CMD, - CEC_IOCTL_GET_CEC_VERSION_CMD, - CEC_IOCTL_GET_MENU_LANGUAGE_CMD, - CEC_IOCTL_GIVE_AUDIO_STATUS_CMD, - CEC_IOCTL_GIVE_DECK_STATUS_CMD, - CEC_IOCTL_GIVE_DEVICE_POWER_STATUS_CMD, - CEC_IOCTL_GIVE_DEVICE_VENDOR_ID_CMD, - CEC_IOCTL_GIVE_OSD_NAME_CMD, - CEC_IOCTL_GIVE_PHY_ADDR_CMD, - CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS_CMD, - CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS_CMD, - CEC_IOCTL_IMAGE_VIEW_ON_CMD, - CEC_IOCTL_INACTIVE_SRC_CMD, - CEC_IOCTL_MENU_REQUEST_CMD, - CEC_IOCTL_MENU_STATUS_CMD, - CEC_IOCTL_PLAY_CMD, - CEC_IOCTL_POLLING_MSG_CMD, - CEC_IOCTL_REC_OFF_CMD, - CEC_IOCTL_REC_ON_ANALOGUE_SERVICE_CMD, - CEC_IOCTL_REC_ON_DIGITAL_SERVICE_CMD, - CEC_IOCTL_REC_ON_EXT_PHY_ADDR_CMD, - CEC_IOCTL_REC_ON_EXT_PLUG_CMD, - CEC_IOCTL_REC_ON_OWN_SRC_CMD, - CEC_IOCTL_REC_STATUS_CMD, - CEC_IOCTL_REC_TV_SCREEN_CMD, - CEC_IOCTL_REPORT_AUDIO_STATUS_CMD, - CEC_IOCTL_REPORT_PHY_ADDR_CMD, - CEC_IOCTL_REPORT_POWER_STATUS_CMD, - CEC_IOCTL_REQUEST_ACTIVE_SRC_CMD, - CEC_IOCTL_ROUTING_CHANGE_CMD, - CEC_IOCTL_ROUTING_INFORMATION_CMD, - CEC_IOCTL_SELECT_ANALOGUE_SERVICE_CMD, - CEC_IOCTL_SELECT_DIGITAL_SERVICE_CMD, - CEC_IOCTL_SET_ANALOGUE_TIMER_CMD, - CEC_IOCTL_SET_AUDIO_RATE_CMD, - CEC_IOCTL_SET_DIGITAL_TIMER_CMD, - CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG_CMD, - CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR_CMD, - CEC_IOCTL_SET_MENU_LANGUAGE_CMD, - CEC_IOCTL_SET_OSD_NAME_CMD, - CEC_IOCTL_SET_OSD_STRING_CMD, - CEC_IOCTL_SET_STREAM_PATH_CMD, - CEC_IOCTL_SET_SYS_AUDIO_MODE_CMD, - CEC_IOCTL_SET_TIMER_PROGRAM_TITLE_CMD, - CEC_IOCTL_STANDBY_CMD, - CEC_IOCTL_SYS_AUDIO_MODE_REQUEST_CMD, - CEC_IOCTL_SYS_AUDIO_MODE_STATUS_CMD, - CEC_IOCTL_TEXT_VIEW_ON_CMD, - CEC_IOCTL_TIMER_CLEARED_STATUS_CMD, - CEC_IOCTL_TIMER_STATUS_CMD, - CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE_CMD, - CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL_CMD, - CEC_IOCTL_TUNER_STEP_DECREMENT_CMD, - CEC_IOCTL_TUNER_STEP_INCREMENT_CMD, - CEC_IOCTL_USER_CTRL_CMD, - CEC_IOCTL_USER_CTRL_PLAY_CMD, - CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT_CMD, - CEC_IOCTL_USER_CTRL_SELECT_AVINPUT_CMD, - CEC_IOCTL_USER_CTRL_SELECT_MEDIA_CMD, - CEC_IOCTL_USER_CTRL_TUNE_CMD, - CEC_IOCTL_USER_CTRL_RELEASED_CMD, - CEC_IOCTL_VENDOR_COMMAND_CMD, - CEC_IOCTL_VENDOR_COMMAND_WITH_ID_CMD, - CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN_CMD, - CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP_CMD, - CEC_IOCTL_GET_SW_VERSION_CMD, - CEC_IOCTL_SET_POWER_STATE_CMD, - CEC_IOCTL_GET_POWER_STATE_CMD, - CEC_IOCTL_INSTANCE_CONFIG_CMD, - CEC_IOCTL_INSTANCE_SETUP_CMD, - CEC_IOCTL_GET_INSTANCE_SETUP_CMD, - CEC_IOCTL_ENABLE_EVENT_CMD, - CEC_IOCTL_DISABLE_EVENT_CMD, - CEC_IOCTL_ENABLE_CALIBRATION_CMD, - CEC_IOCTL_DISABLE_CALIBRATION_CMD, - CEC_IOCTL_SEND_MSG_CMD, - CEC_IOCTL_SET_REGISTER_CMD -}; - - -/* driver specific */ -#define CEC_IOCTL_VERBOSE_ON _IO(CEC_IOCTL_BASE, CEC_VERBOSE_ON_CMD) -#define CEC_IOCTL_VERBOSE_OFF _IO(CEC_IOCTL_BASE, CEC_VERBOSE_OFF_CMD) -#define CEC_IOCTL_BYEBYE _IO(CEC_IOCTL_BASE, CEC_BYEBYE_CMD) - -/* CEC */ -#define CEC_IOCTL_RX_ADDR _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_RX_ADDR_CMD, unsigned char) -#define CEC_IOCTL_PHY_ADDR _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_PHY_ADDR_CMD, unsigned short) -#define CEC_IOCTL_WAIT_FRAME _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_WAIT_FRAME_CMD, cec_frame) -#define CEC_IOCTL_ABORT_MSG _IO(CEC_IOCTL_BASE, CEC_IOCTL_ABORT_MSG_CMD) -#define CEC_IOCTL_ACTIVE_SRC _IO(CEC_IOCTL_BASE, CEC_IOCTL_ACTIVE_SRC_CMD) -#define CEC_IOCTL_VERSION _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_VERSION_CMD, cec_version) -#define CEC_IOCTL_CLEAR_ANALOGUE_TIMER _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_CLEAR_ANALOGUE_TIMER_CMD, cec_analogue_timer) -#define CEC_IOCTL_CLEAR_DIGITAL_TIMER _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_CLEAR_DIGITAL_TIMER_CMD, cec_digital_timer) -#define CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG_CMD, cec_ext_timer_with_ext_plug) -#define CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR_CMD, cec_ext_timer_with_phy_addr) -#define CEC_IOCTL_DECK_CTRL _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_DECK_CTRL_CMD, cec_deck_ctrl) -#define CEC_IOCTL_DECK_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_DECK_STATUS_CMD, cec_deck_status) -#define CEC_IOCTL_DEVICE_VENDOR_ID _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_DEVICE_VENDOR_ID_CMD, unsigned long) -#define CEC_IOCTL_FEATURE_ABORT _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_FEATURE_ABORT_CMD, cec_feature_abort) -#define CEC_IOCTL_GET_CEC_VERSION _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_GET_CEC_VERSION_CMD, unsigned char) -#define CEC_IOCTL_GET_MENU_LANGUAGE _IO(CEC_IOCTL_BASE, CEC_IOCTL_GET_MENU_LANGUAGE_CMD) -#define CEC_IOCTL_GIVE_AUDIO_STATUS _IO(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_AUDIO_STATUS_CMD) -#define CEC_IOCTL_GIVE_DECK_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_DECK_STATUS_CMD, cec_status_request) -#define CEC_IOCTL_GIVE_DEVICE_POWER_STATUS _IO(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_DEVICE_POWER_STATUS_CMD) -#define CEC_IOCTL_GIVE_DEVICE_VENDOR_ID _IO(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_DEVICE_VENDOR_ID_CMD) -#define CEC_IOCTL_GIVE_OSD_NAME _IO(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_OSD_NAME_CMD) -#define CEC_IOCTL_GIVE_PHY_ADDR _IO(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_PHY_ADDR_CMD) -#define CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS _IO(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS_CMD) -#define CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS_CMD, cec_status_request) -#define CEC_IOCTL_IMAGE_VIEW_ON _IO(CEC_IOCTL_BASE, CEC_IOCTL_IMAGE_VIEW_ON_CMD) -#define CEC_IOCTL_INACTIVE_SRC _IO(CEC_IOCTL_BASE, CEC_IOCTL_INACTIVE_SRC_CMD) -#define CEC_IOCTL_MENU_REQUEST _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_MENU_REQUEST_CMD, cec_menu_request) -#define CEC_IOCTL_MENU_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_MENU_STATUS_CMD, cec_menu_status) -#define CEC_IOCTL_PLAY _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_PLAY_CMD, cec_play) -#define CEC_IOCTL_POLLING_MSG _IO(CEC_IOCTL_BASE, CEC_IOCTL_POLLING_MSG_CMD) -#define CEC_IOCTL_REC_OFF _IO(CEC_IOCTL_BASE, CEC_IOCTL_REC_OFF_CMD) -#define CEC_IOCTL_REC_ON_ANALOGUE_SERVICE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_REC_ON_ANALOGUE_SERVICE_CMD, cec_analogue_service) -#define CEC_IOCTL_REC_ON_DIGITAL_SERVICE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_REC_ON_DIGITAL_SERVICE_CMD, cec_digital_service) -#define CEC_IOCTL_REC_ON_EXT_PHY_ADDR _IO(CEC_IOCTL_BASE, CEC_IOCTL_REC_ON_EXT_PHY_ADDR_CMD) -#define CEC_IOCTL_REC_ON_EXT_PLUG _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_REC_ON_EXT_PLUG_CMD, cec_ext_plug) -#define CEC_IOCTL_REC_ON_OWN_SRC _IO(CEC_IOCTL_BASE, CEC_IOCTL_REC_ON_OWN_SRC_CMD) -#define CEC_IOCTL_REC_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_REC_STATUS_CMD, cec_rec_status) -#define CEC_IOCTL_REC_TV_SCREEN _IO(CEC_IOCTL_BASE, CEC_IOCTL_REC_TV_SCREEN_CMD) -#define CEC_IOCTL_REPORT_AUDIO_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_REPORT_AUDIO_STATUS_CMD, cec_audio_status) -#define CEC_IOCTL_REPORT_PHY_ADDR _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_REPORT_PHY_ADDR_CMD, cec_device_type) -#define CEC_IOCTL_REPORT_POWER_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_REPORT_POWER_STATUS_CMD, cec_power_status) -#define CEC_IOCTL_REQUEST_ACTIVE_SRC _IO(CEC_IOCTL_BASE, CEC_IOCTL_REQUEST_ACTIVE_SRC_CMD) -#define CEC_IOCTL_ROUTING_CHANGE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_ROUTING_CHANGE_CMD, cec_routing_change) -#define CEC_IOCTL_ROUTING_INFORMATION _IO(CEC_IOCTL_BASE, CEC_IOCTL_ROUTING_INFORMATION_CMD) -#define CEC_IOCTL_SELECT_ANALOGUE_SERVICE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SELECT_ANALOGUE_SERVICE_CMD, cec_analogue_service) -#define CEC_IOCTL_SELECT_DIGITAL_SERVICE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SELECT_DIGITAL_SERVICE_CMD, cec_digital_service) -#define CEC_IOCTL_SET_ANALOGUE_TIMER _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_ANALOGUE_TIMER_CMD, cec_analogue_timer) -#define CEC_IOCTL_SET_AUDIO_RATE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_AUDIO_RATE_CMD, cec_audio_rate) -#define CEC_IOCTL_SET_DIGITAL_TIMER _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_DIGITAL_TIMER_CMD, cec_digital_timer) -#define CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG_CMD, cec_ext_timer_with_ext_plug) -#define CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR_CMD, cec_ext_timer_with_phy_addr) -#define CEC_IOCTL_SET_MENU_LANGUAGE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_MENU_LANGUAGE_CMD, cec_string) -#define CEC_IOCTL_SET_OSD_NAME _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_OSD_NAME_CMD, cec_string) -#define CEC_IOCTL_SET_OSD_STRING _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_OSD_STRING_CMD, cec_osd_string) -#define CEC_IOCTL_SET_STREAM_PATH _IO(CEC_IOCTL_BASE, CEC_IOCTL_SET_STREAM_PATH_CMD) -#define CEC_IOCTL_SET_SYS_AUDIO_MODE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_SYS_AUDIO_MODE_CMD, cec_sys_audio_status) -#define CEC_IOCTL_SET_TIMER_PROGRAM_TITLE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_TIMER_PROGRAM_TITLE_CMD, cec_string) -#define CEC_IOCTL_STANDBY _IO(CEC_IOCTL_BASE, CEC_IOCTL_STANDBY_CMD) -#define CEC_IOCTL_SYS_AUDIO_MODE_REQUEST _IO(CEC_IOCTL_BASE, CEC_IOCTL_SYS_AUDIO_MODE_REQUEST_CMD) -#define CEC_IOCTL_SYS_AUDIO_MODE_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SYS_AUDIO_MODE_STATUS_CMD, cec_sys_audio_status) -#define CEC_IOCTL_TEXT_VIEW_ON _IO(CEC_IOCTL_BASE, CEC_IOCTL_TEXT_VIEW_ON_CMD) -#define CEC_IOCTL_TIMER_CLEARED_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_TIMER_CLEARED_STATUS_CMD, cec_timer_cleared_status) -#define CEC_IOCTL_TIMER_STATUS _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_TIMER_STATUS_CMD, cec_timer_status) -#define CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE_CMD, cec_tuner_device_status_analogue) -#define CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL_CMD, cec_tuner_device_status_digital) -#define CEC_IOCTL_TUNER_STEP_DECREMENT _IO(CEC_IOCTL_BASE, CEC_IOCTL_TUNER_STEP_DECREMENT_CMD) -#define CEC_IOCTL_TUNER_STEP_INCREMENT _IO(CEC_IOCTL_BASE, CEC_IOCTL_TUNER_STEP_INCREMENT_CMD) -#define CEC_IOCTL_USER_CTRL_PRESSED _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_USER_CTRL_CMD, cec_user_ctrl) -#define CEC_IOCTL_USER_CTRL_PLAY _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_USER_CTRL_PLAY_CMD, cec_play) -#define CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT_CMD, unsigned char) -#define CEC_IOCTL_USER_CTRL_SELECT_AVINPUT _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_USER_CTRL_SELECT_AVINPUT_CMD, unsigned char) -#define CEC_IOCTL_USER_CTRL_SELECT_MEDIA _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_USER_CTRL_SELECT_MEDIA_CMD, unsigned char) -#define CEC_IOCTL_USER_CTRL_TUNE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_USER_CTRL_TUNE_CMD, cec_user_ctrl_tune) -#define CEC_IOCTL_USER_CTRL_RELEASED _IO(CEC_IOCTL_BASE, CEC_IOCTL_USER_CTRL_RELEASED_CMD) -#define CEC_IOCTL_VENDOR_COMMAND _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_VENDOR_COMMAND_CMD, cec_string) -#define CEC_IOCTL_VENDOR_COMMAND_WITH_ID _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_VENDOR_COMMAND_WITH_ID_CMD, cec_vendor_command_with_id) -#define CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN_CMD, cec_string) -#define CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP _IO(CEC_IOCTL_BASE, CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP_CMD) -#define CEC_IOCTL_GET_SW_VERSION _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_GET_SW_VERSION_CMD, cec_sw_version) -#define CEC_IOCTL_SET_POWER_STATE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_SET_POWER_STATE_CMD, cec_power) -#define CEC_IOCTL_GET_POWER_STATE _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_GET_POWER_STATE_CMD, cec_power) -#define CEC_IOCTL_INSTANCE_CONFIG _IO(CEC_IOCTL_BASE, CEC_IOCTL_INSTANCE_CONFIG_CMD) -#define CEC_IOCTL_INSTANCE_SETUP _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_INSTANCE_SETUP_CMD, cec_setup) -#define CEC_IOCTL_GET_INSTANCE_SETUP _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_GET_INSTANCE_SETUP_CMD, cec_setup) -#define CEC_IOCTL_ENABLE_EVENT _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_ENABLE_EVENT_CMD, cec_event) -#define CEC_IOCTL_DISABLE_EVENT _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_DISABLE_EVENT_CMD, cec_event) -#define CEC_IOCTL_ENABLE_CALIBRATION _IOWR(CEC_IOCTL_BASE, CEC_IOCTL_ENABLE_CALIBRATION_CMD, cec_clock) -#define CEC_IOCTL_DISABLE_CALIBRATION _IO(CEC_IOCTL_BASE, CEC_IOCTL_DISABLE_CALIBRATION_CMD) -/* #define CEC_IOCTL_SEND_MSG _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SEND_MSG_CMD,cec_send_msg) */ - -/* --- Full list --- */ - -/* legend: */ -/* ------- */ -/* [ ] : not supported */ -/* [x] : IOCTL */ -/* [i] : open, init... */ - -/* [ ] tmdlHdmiCecAbortMessage */ -/* [ ] tmdlHdmiCecActiveSource */ -/* [ ] tmdlHdmiCecVersion */ -/* [ ] tmdlHdmiCecClearAnalogueTimer */ -/* [ ] tmdlHdmiCecClearDigitalTimer */ -/* [ ] tmdlHdmiCecClearExternalTimerWithExternalPlug */ -/* [ ] tmdlHdmiCecClearExternalTimerWithPhysicalAddress */ -/* [ ] tmdlHdmiCecDeckControl */ -/* [ ] tmdlHdmiCecDeckStatus */ -/* [ ] tmdlHdmiCecDeviceVendorID */ -/* [ ] tmdlHdmiCecFeatureAbort */ -/* [ ] tmdlHdmiCecGetCecVersion */ -/* [ ] tmdlHdmiCecGetMenuLanguage */ -/* [ ] tmdlHdmiCecGiveAudioStatus */ -/* [ ] tmdlHdmiCecGiveDeckStatus */ -/* [ ] tmdlHdmiCecGiveDevicePowerStatus */ -/* [ ] tmdlHdmiCecGiveDeviceVendorID */ -/* [ ] tmdlHdmiCecGiveOsdName */ -/* [ ] tmdlHdmiCecGivePhysicalAddress */ -/* [ ] tmdlHdmiCecGiveSystemAudioModeStatus */ -/* [ ] tmdlHdmiCecGiveTunerDeviceStatus */ -/* [ ] tmdlHdmiCecImageViewOn */ -/* [ ] tmdlHdmiCecInactiveSource */ -/* [ ] tmdlHdmiCecMenuRequest */ -/* [ ] tmdlHdmiCecMenuStatus */ -/* [ ] tmdlHdmiCecPlay */ -/* [ ] tmdlHdmiCecPollingMessage */ -/* [ ] tmdlHdmiCecRecordOff */ -/* [ ] tmdlHdmiCecRecordOnAnalogueService */ -/* [ ] tmdlHdmiCecRecordOnDigitalService */ -/* [ ] tmdlHdmiCecRecordOnExternalPhysicalAddress */ -/* [ ] tmdlHdmiCecRecordOnExternalPlug */ -/* [ ] tmdlHdmiCecRecordOnOwnSource */ -/* [ ] tmdlHdmiCecRecordStatus */ -/* [ ] tmdlHdmiCecRecordTvScreen */ -/* [ ] tmdlHdmiCecReportAudioStatus */ -/* [ ] tmdlHdmiCecReportPhysicalAddress */ -/* [ ] tmdlHdmiCecReportPowerStatus */ -/* [ ] tmdlHdmiCecRequestActiveSource */ -/* [ ] tmdlHdmiCecRoutingChange */ -/* [ ] tmdlHdmiCecRoutingInformation */ -/* [ ] tmdlHdmiCecSelectAnalogueService */ -/* [ ] tmdlHdmiCecSelectDigitalService */ -/* [ ] tmdlHdmiCecSetAnalogueTimer */ -/* [ ] tmdlHdmiCecSetAudioRate */ -/* [ ] tmdlHdmiCecSetDigitalTimer */ -/* [ ] tmdlHdmiCecSetExternalTimerWithExternalPlug */ -/* [ ] tmdlHdmiCecSetExternalTimerWithPhysicalAddress */ -/* [ ] tmdlHdmiCecSetMenuLanguage */ -/* [ ] tmdlHdmiCecSetOsdName */ -/* [ ] tmdlHdmiCecSetOsdString */ -/* [ ] tmdlHdmiCecSetStreamPath */ -/* [ ] tmdlHdmiCecSetSystemAudioMode */ -/* [ ] tmdlHdmiCecSetTimerProgramTitle */ -/* [ ] tmdlHdmiCecStandby */ -/* [ ] tmdlHdmiCecSystemAudioModeRequest */ -/* [ ] tmdlHdmiCecSystemAudioModeStatus */ -/* [ ] tmdlHdmiCecTextViewOn */ -/* [ ] tmdlHdmiCecTimerClearedStatus */ -/* [ ] tmdlHdmiCecTimerStatus */ -/* [ ] tmdlHdmiCecTunerDeviceStatusAnalogue */ -/* [ ] tmdlHdmiCecTunerDeviceStatusDigital */ -/* [ ] tmdlHdmiCecTunerStepDecrement */ -/* [ ] tmdlHdmiCecTunerStepIncrement */ -/* [ ] tmdlHdmiCecUserControlPressed */ -/* [ ] tmdlHdmiCecUserControlPressedPlay */ -/* [ ] tmdlHdmiCecUserControlPressedSelectAudioInput */ -/* [ ] tmdlHdmiCecUserControlPressedSelectAVInput */ -/* [ ] tmdlHdmiCecUserControlPressedSelectMedia */ -/* [ ] tmdlHdmiCecUserControlPressedTune */ -/* [ ] tmdlHdmiCecUserControlReleased */ -/* [ ] tmdlHdmiCecVendorCommand */ -/* [ ] tmdlHdmiCecVendorCommandWithID */ -/* [ ] tmdlHdmiCecVendorRemoteButtonDown */ -/* [ ] tmdlHdmiCecVendorRemoteButtonUp */ -/* [ ] tmdlHdmiCecGetSWVersion */ -/* [ ] tmdlHdmiCecGetNumberOfUnits */ -/* [ ] tmdlHdmiCecGetCapabilities */ -/* [ ] tmdlHdmiCecGetCapabilitiesM */ -/* [ ] tmdlHdmiCecOpen */ -/* [ ] tmdlHdmiCecOpenM */ -/* [ ] tmdlHdmiCecClose */ -/* [ ] tmdlHdmiCecSetPowerState */ -/* [ ] tmdlHdmiCecGetPowerState */ -/* [ ] tmdlHdmiCecInstanceConfig */ -/* [ ] tmdlHdmiCecInstanceSetup */ -/* [ ] tmdlHdmiCecGetInstanceSetup */ -/* [ ] tmdlHdmiCecHandleInterrupt */ -/* [ ] tmdlHdmiCecRegisterCallbacks */ -/* [ ] tmdlHdmiCecSetAutoAnswer */ -/* [ ] tmdlHdmiCecSetLogicalAddress */ -/* [ ] tmdlHdmiCecEnableEvent */ -/* [ ] tmdlHdmiCecDisableEvent */ -/* [ ] tmdlHdmiCecEnableCalibration */ -/* [ ] tmdlHdmiCecDisableCalibration */ -/* [ ] tmdlHdmiCecSendMessage */ -/* [ ] tmdlHdmiCecSetRegister */ - - -#endif /* __cec_h__ */ -#endif /* __cec_ioctl__ */ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x_version.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x_version.h deleted file mode 100644 index 11233e0a0f3..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tda998x_version.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __tda_version__ -#define __tda_version__ - -/* version */ -#define TDA_VERSION_MAJOR 1 -#define TDA_VERSION_MINOR 3 -#define TDA_VERSION_PATCHLEVEL 0 -#define TDA_VERSION_EXTRA "-ioctl (2009-10-15)" - -/* TDA TX chip list */ -#define TDA19989 "tda19989" -#define TDA19988 "tda19989" -#define TDA9984 "tda9984" -#define TDA9983 "tda9983" -#define TDA9981 "tda9981" - -#endif diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmFlags.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmFlags.h deleted file mode 100644 index 2b1169c859d..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmFlags.h +++ /dev/null @@ -1,237 +0,0 @@ -/* MoReUse 2002-09-13 Continuus Version 2 */ -/* */ -/* Changes: made ansi compliant */ -/*-------------------------------------------------------------------------- */ - /* (C) Copyright 2002 Koninklijke Philips Electronics N.V., All Rights Reserved */ - /* */ - /* This source code and any compilation or derivative thereof is the sole */ - /* property of Philips Corporation and is provided pursuant to a Software */ - /* License Agreement. This code is the proprietary information of */ - /* Philips Corporation and is confidential in nature. Its use and */ - /* dissemination by any party other than Philips Corporation is strictly */ - /* limited by the confidential information provisions of the Agreement */ - /* referenced above. */ - /*------------------------------------------------------------------------- */ - /* FILENAME: tmFlags.h */ - /* */ - /* DESCRIPTION: Platform dependent build flags (typically generated by the */ - /* SDE build process if it doesn't already exist). */ - /* */ - /* DOCUMENT REF: DVP Build Process Specification */ - /* */ - /* NOTES: This file defines the TMFL_xxx build flags configuration. */ - /* It does not include specific component diversity flags that */ - /* are defined in the component makefiles (e.g., TMFL_SCOPE */ - /* defined in BSL board files) */ - /* */ - /* This file is based on SDE Version 1.2 generated output. */ - /*------------------------------------------------------------------------- */ - /* */ -#ifndef TM_FLAGS_H -#define TM_FLAGS_H - -/* Configurable build flags */ -/* NOTE: The following flags are configurable (typically generated by SDE */ -/* based on _TMXXX build environment variables). See individual flags */ -/* for comments about the settings and consistency requirements. */ - -/* TMFL_BUILD_VERSION: .. as decimal digits. This */ -/* number is product/release dependent and not standardized as of now. */ -/*#define TMFL_BUILD_VERSION 00.01.00*/ - -/* RIDE tool does not support . in define value */ -/* TMFL_BUILD_VERSION is not used to specify neither TDA9975_SW version not TDA9983_SW version */ -#define TMFL_BUILD_VERSION 00 - -/* TMFL_CPU: CPU type/model numbers: (TMFL_CPU_TYPE_XXX | TMFL_CPU_MODEL_XXX). */ -/* Example: (TMFL_CPU_TYPE_X86 | TMFL_CPU_MODEL_I486) or (TMFL_CPU_I486) for */ -/* an x86 i486 CPU. */ -#define TMFL_CPU (TMFL_CPU_TYPE_X86 | TMFL_CPU_MODEL_I486) - -/* TMFL_ENDIAN: CPU endianness: */ -#define TMFL_ENDIAN (TMFL_ENDIAN_LITTLE) - -/* TMFL_OS: Operating system type/version where the version number should be */ -/* included if defined: (TMFL_OS_[VVV]). Example: TMFL_OS_PSOS250 */ -/* indicates that the target OS is pSOS Version 2.50. */ -#define TMFL_OS (TMFL_OS_NULLOS) - -/* TMFL_CPU_IS_XXX: These are boolean flags that reflects the CPU type and */ -/* must be consistent with the TMFL_CPU setting (i.e., if TMFL_CPU = */ -/* TMFL_CPU_I486, then TMFL_CPU_IS_X86 = 1) and all other TMFL_CPU_IS_XXX */ -/* flags are 0. */ -#define TMFL_CPU_IS_X86 1 -#define TMFL_CPU_IS_MIPS 0 -#define TMFL_CPU_IS_HP 0 -#define TMFL_CPU_IS_TM 0 -#define TMFL_CPU_IS_ARM 0 -#define TMFL_CPU_IS_REAL 0 - -/* TMFL_OS_IS_XXX: These are boolean flags that reflects the OS type and */ -/* must be consistent with the TMFL_OS setting (i.e., if TMFL_OS = */ -/* TMFL_OS_PSOS250, then TMFL_OS_IS_PSOS = 1) and all other TMFL_OS_IS_XXX */ -/* flags are 0. */ -#define TMFL_OS_IS_BTM 0 -#define TMFL_OS_IS_CE 0 -#define TMFL_OS_IS_NT 0 -#define TMFL_OS_IS_PSOS 0 -#define TMFL_OS_IS_NULLOS 1 -#define TMFL_OS_IS_ECOS 0 -#define TMFL_OS_IS_VXWORKS 0 -#define TMFL_OS_IS_MTOS 0 - - -/* Non-configurable constants */ -/* NOTE: These values do not change and should not be modified ! */ -#define TMFL_CPU_TYPE_MASK 0xffff0000 -#define TMFL_CPU_TYPE_X86 0x00010000 -#define TMFL_CPU_TYPE_MIPS 0x00020000 -#define TMFL_CPU_TYPE_TM 0x00030000 -#define TMFL_CPU_TYPE_HP 0x00040000 -#define TMFL_CPU_TYPE_ARM 0x00050000 -#define TMFL_CPU_TYPE_REAL 0x00060000 -#define TMFL_CPU_MODEL_MASK 0x0000ffff -#define TMFL_CPU_MODEL_I486 0x00000001 -#define TMFL_CPU_MODEL_R3940 0x00000002 -#define TMFL_CPU_MODEL_R4300 0x00000003 -#define TMFL_CPU_MODEL_TM1100 0x00000004 -#define TMFL_CPU_MODEL_TM1300 0x00000005 -#define TMFL_CPU_MODEL_TM32 0x00000006 -#define TMFL_CPU_MODEL_HP 0x00000007 -#define TMFL_CPU_MODEL_R4640 0x00000008 -#define TMFL_CPU_MODEL_ARM7 0x00000009 -#define TMFL_CPU_MODEL_ARM920T 0x0000000a -#define TMFL_CPU_MODEL_ARM940T 0x0000000b -#define TMFL_CPU_MODEL_ARM10 0x0000000c -#define TMFL_CPU_MODEL_STRONGARM 0x0000000d -#define TMFL_CPU_MODEL_RD24120 0x0000000e -#define TMFL_CPU_MODEL_ARM926EJS 0x0000000f -#define TMFL_CPU_MODEL_ARM946 0x00000010 -#define TMFL_CPU_MODEL_R1910 0x00000011 -#define TMFL_CPU_MODEL_R4450 0x00000012 -#define TMFL_CPU_MODEL_TM3260 0x00000013 -#define TMFL_ENDIAN_BIG 1 -#define TMFL_ENDIAN_LITTLE 0 -#define TMFL_OS_MASK 0xff000000 -#define TMFL_OS_VERSION_MASK 0x00ffffff -#define TMFL_OS_BTM 0x00000000 -#define TMFL_OS_CE 0x01000000 -#define TMFL_OS_CE212 0x01020102 -#define TMFL_OS_CE300 0x01030000 -#define TMFL_OS_NT 0x02000000 -#define TMFL_OS_NT4 0x02040000 -#define TMFL_OS_PSOS 0x03000000 -#define TMFL_OS_PSOS250 0x03020500 -#define TMFL_OS_PSOS200 0x03020000 -#define TMFL_OS_NULLOS 0x04000000 -#define TMFL_OS_ECOS 0x05000000 -#define TMFL_OS_VXWORKS 0x06000000 -#define TMFL_OS_MTOS 0x07000000 -#define TMFL_SCOPE_SP 0 -#define TMFL_SCOPE_MP 1 -#define TMFL_REL_ASSERT 0x00000002 -#define TMFL_REL_DEBUG 0x00000001 -#define TMFL_REL_RETAIL 0x00000000 -#define TMFL_CPU_I486 0x00010001 -#define TMFL_CPU_R3940 0x00020002 -#define TMFL_CPU_R4300 0x00020003 -#define TMFL_CPU_TM1100 0x00030004 -#define TMFL_CPU_TM1300 0x00030005 -#define TMFL_CPU_TM32 0x00030006 -#define TMFL_CPU_HP 0x00040007 -#define TMFL_CPU_R4640 0x00020008 -#define TMFL_CPU_ARM7 0x00050009 -#define TMFL_CPU_ARM920T 0x0005000a -#define TMFL_CPU_ARM940T 0x0005000b -#define TMFL_CPU_ARM10 0x0005000c -#define TMFL_CPU_STRONGARM 0x0005000d -#define TMFL_CPU_RD24120 0x0006000e -#define TMFL_CPU_ARM926EJS 0x0005000f -#define TMFL_CPU_ARM946 0x00050010 -#define TMFL_CPU_R1910 0x00020011 -#define TMFL_CPU_R4450 0x00020012 -#define TMFL_CPU_TM3260 0x00030013 -#define TMFL_MODE_KERNEL 1 -#define TMFL_MODE_USER 0 - -/******************************************************************************/ -/* Components features defines */ -/******************************************************************************/ -#ifdef TMFL_TDA19988 -# ifndef TMFL_TDA19989 -# define TMFL_TDA19989 -# endif /* TMFL_TDA19989 */ -# define TMFL_RGB_DDR_12BITS -# define TMFL_HDCP_OPTIMIZED_POWER -#endif /* TMFL_TDA19988 */ - -#ifdef TMFL_TDA19989 -# ifndef TMFL_TDA9989 -# define TMFL_TDA9989 -# define SUPPORT_3D_FP -# endif /* TMFL_TDA9989 */ -#endif /* TMFL_TDA19989 */ -/******************************************************************************/ -/* Preprocessor checks for invalid settings (if file is manually modified) */ -/******************************************************************************/ -/* */ - -/* Check if TMFL_CPU flag changed from its default setting. */ -#if (TMFL_CPU == (TMFL_CPU_TYPE_MASK | TMFL_CPU_MODEL_MASK)) -#error ERROR: TMFL_CPU must be set (TMFL_CPU_TYPE_XXX | TMFL_CPU_MODEL_XXX) ! -#endif - -/* Check if TMFL_ENDIAN flag setting is valid. */ -#if ((TMFL_ENDIAN != TMFL_ENDIAN_BIG) && (TMFL_ENDIAN != TMFL_ENDIAN_LITTLE)) -#error ERROR: TMFL_ENDIAN must be set to a valid TMFL_ENDIAN_XXX value ! -#endif - -/* Check if TMFL_OS flag changed from its default setting. */ -#if (TMFL_OS == (TMFL_OS_MASK | TMFL_OS_VERSION_MASK)) -#error ERROR: TMFL_OS must be set to a valid value (TMFL_OS_[]) ! -#endif - -/* The TMFL_CPU_IS_XXX is a Boolean; one and only one flag can be true (=1). */ -#if ((TMFL_CPU_IS_X86 + TMFL_CPU_IS_MIPS + TMFL_CPU_IS_TM + TMFL_CPU_IS_HP + TMFL_CPU_IS_ARM + TMFL_CPU_IS_REAL) != 1) -#error ERROR: One or more TMFL_CPU_IS_XXX values are incorrect or missing ! -#endif - -/* TMFL_CPU and TMFL_CPU_IS_XXX must be consistent */ -#if (((TMFL_CPU & TMFL_CPU_TYPE_MASK) == TMFL_CPU_TYPE_X86) && (TMFL_CPU_IS_X86 != 1)) -#error ERROR: Inconsistent TMFL_CPU and TMFL_CPU_IS_X86 settings ! -#elif (((TMFL_CPU & TMFL_CPU_TYPE_MASK) == TMFL_CPU_TYPE_MIPS) && (TMFL_CPU_IS_MIPS != 1)) -#error ERROR: Inconsistent TMFL_CPU and TMFL_CPU_IS_MIPS settings ! -#elif (((TMFL_CPU & TMFL_CPU_TYPE_MASK) == TMFL_CPU_TYPE_TM) && (TMFL_CPU_IS_TM != 1)) -#error ERROR: Inconsistent TMFL_CPU and TMFL_CPU_IS_TM settings ! -#elif (((TMFL_CPU & TMFL_CPU_TYPE_MASK) == TMFL_CPU_TYPE_HP) && (TMFL_CPU_IS_HP != 1)) -#error ERROR: Inconsistent TMFL_CPU and TMFL_CPU_IS_HP settings ! -#elif (((TMFL_CPU & TMFL_CPU_TYPE_MASK) == TMFL_CPU_TYPE_ARM) && (TMFL_CPU_IS_ARM != 1)) -#error ERROR: Inconsistent TMFL_CPU and TMFL_CPU_IS_ARM settings ! -#elif (((TMFL_CPU & TMFL_CPU_TYPE_MASK) == TMFL_CPU_TYPE_REAL) && (TMFL_CPU_IS_REAL != 1)) -#error ERROR: Inconsistent TMFL_CPU and TMFL_CPU_IS_REAL settings ! -#endif /* (((TMFL_CPU & TMFL_CPU_TYPE_MASK) == TMFL_CPU_TYPE_X86) && ... */ - -/* The TMFL_OS_IS_XXX is a Boolean; one and only one flag can be true (=1). */ -#if ((TMFL_OS_IS_BTM + TMFL_OS_IS_CE + TMFL_OS_IS_NT + TMFL_OS_IS_PSOS + TMFL_OS_IS_NULLOS + TMFL_OS_IS_ECOS + TMFL_OS_IS_VXWORKS + TMFL_OS_IS_MTOS) != 1) -#error ERROR: One or more TMFL_OS_IS_XXX values are incorrect or missing ! -#endif - -#if (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_BTM) && (TMFL_OS_IS_BTM != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_BTM settings ! -#elif (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_CE) && (TMFL_OS_IS_CE != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_CE settings ! -#elif (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_NT) && (TMFL_OS_IS_NT != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_NT settings ! -#elif (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_PSOS) && (TMFL_OS_IS_PSOS != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_PSOS settings ! -#elif (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_NULLOS) && (TMFL_OS_IS_NULLOS != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_NULLOS settings ! -#elif (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_ECOS) && (TMFL_OS_IS_ECOS != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_ECOS settings ! -#elif (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_VXWORKS) && (TMFL_OS_IS_VXWORKS != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_VXWORKS settings ! -#elif (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_MTOS) && (TMFL_OS_IS_MTOS != 1)) -#error ERROR: Inconsistent TMFL_OS and TMFL_OS_IS_MTOS settings ! -#endif /* (((TMFL_OS & TMFL_OS_MASK) == TMFL_OS_XX) && (TMFL_OS_IS_XX != 1)) */ - -#endif /* TM_FLAGS_H */ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmNxCompId.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmNxCompId.h deleted file mode 100644 index 645a6bf6bfa..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmNxCompId.h +++ /dev/null @@ -1,1741 +0,0 @@ -/* -------------------------------------------------------------------------- */ -/* (C) Copyright 2000-2005 Koninklijke Philips Electronics N.V., */ -/* All rights reserved */ -/* */ -/* This source code and any compilation or derivative thereof is the */ -/* proprietary information of Konlinklijke Philips Electronics N.V. and is */ -/* Confidential in nature. */ -/* Under no circumstances is this software to be exposed to or placed under an*/ -/* Open Source License of any type without the expressed written permission of*/ -/* Koninklijke Philips Electronics N.V. */ -/* -------------------------------------------------------------------------- */ -/* */ -/* MoReUse - 2005-10-24 Version 118 */ -/* */ -/* Added: */ -/* CID_AACPENC */ -/* */ -/* */ -/* Changed: */ -/* */ -/* */ -/* */ -/* Removed: */ -/* */ -/* */ -/* */ -/* General Error Codes Added */ -/* */ -/* -------------------------------------------------------------------------- */ -/* FILE NAME: tmNxCompId.h */ -/* */ -/* DESCRIPTION: This header file identifies the standard component */ -/* identifiers (CIDs) and interface identifiers (IID) for */ -/* Nexperia platforms. */ -/* The objective of these identifiers is to enable unique */ -/* identification of software components and interfaces. */ -/* In addition, standard status values are also defined to make */ -/* determination of typical error cases much easier. */ -/* */ -/* Functional errors are not real errors in the sense of */ -/* unexpected behaviour but are part of the normal communication*/ -/* between a client an a server component. They are linked to */ -/* an interface, rather than to a component. All implementations*/ -/* of an interface must have the same behaviour with respect to */ -/* functional errors. Functional erros are all positive */ -/* One global functional error is defined: TM_OK 0x00000000 */ -/* */ -/* Non-functional errors (all negative numbers) indicate */ -/* unexpected behaviour. They are linked to concrete component */ -/* implementations */ -/* */ -/* NOTE: The current implementation is different from the prev. */ -/* component identifier implementation, based on classes, */ -/* types and layers. However, the new system is backward */ -/* compatitible with the old implementation. */ -/* */ -/* tmNxCompId.h defines a number of general error codes that can*/ -/* be used by all components. These error codes are concatenated*/ -/* to the CID or IID value in the local component headerfile of */ -/* the component that wants to (re-)use this general error code */ -/* General error codes can be used for both functional and */ -/* non-functional errors. They should only be used if they */ -/* semantically fully match (if not, defined a new component or */ -/* interface specific error code. */ -/* */ -/* General Rules: */ -/* A return value has a length of 32 bits. At the binary level, */ -/* 1 bit indicates the component or interface flag; 16 bits are */ -/* used for the actual component id (CID) or interface id (IID) */ -/* and 12 bits for the return status. */ -/* The component/interface flag is bit 31. */ -/* Bits 30--28 are all 0. */ -/* The component/interface id occupies bits 27--12. */ -/* The return status occupies bits 11--0. */ -/* */ -/* +--------+-----+-------+-----------+ */ -/* | flag:1 | 0:3 | id:16 | status:12 | */ -/* +--------+-----+-------+-----------+ */ -/* */ -/* Format of interface ids: */ -/* */ -/* +-----+-----+--------+-----------+ */ -/* | 0:1 | 0:3 | iid:16 | status:12 | */ -/* +-----+-----+--------+-----------+ */ -/* */ -/* Format of component ids: */ -/* */ -/* +-----+-----+--------+-----------+ */ -/* | 1:1 | 0:3 | cid:16 | status:12 | */ -/* +-----+-----+--------+-----------+ */ -/* */ -/* At the macro level, we use the prefix "CID_" for component */ -/* ids (previous version "CID_COMP_") and "IID_" for interface */ -/* ids. */ -/* */ -/* Each component id will be used by only one component; each */ -/* component will have its own component id. */ -/* Each interface id will be used by only one interface; each */ -/* interface will have its own interface id. */ -/* */ -/* In order to avoid problems when promoting a UNIQUE interface */ -/* to a SEPARATE interface, the ranges for CIDs and IIDS must */ -/* not overlap. */ -/* */ -/* Component names and component ids have to be registered */ -/* together; the same applies for interface names and ids. */ -/* */ -/* NOTE about Compatibility */ -/* In the previous implementation the first four bits were */ -/* reserved for class, and there were separate fields for */ -/* type and tag, like this: */ -/* */ -/* +---------+--------+-------+---------+-----------+ */ -/* | class:4 | type:4 | tag:8 | layer:4 | status:12 | */ -/* +---------+--------+-------+---------+-----------+ */ -/* */ -/* The values 0 or 8 are not valid classes, and this fact */ -/* can be used to distinguish a new-style IID (class == 0), */ -/* a new-style CID (class == 8), and an old-style CID */ -/* (otherwise). */ -/* */ -/* NOTE about error codes */ -/* The general error codes use the range 0x001 to 0x7FF. */ -/* The component specific error codes are defined in the */ -/* local component header file and can use 0x800 to 0xFFF. */ -/* TM_OK has the value 0x00000000. */ -/* The proposed error code ranges (general and specific) are */ -/* the same for functional and non-functional errors. */ -/* */ -/* The previously defined ranges for external customers, */ -/* assert errors and fatal errors have been dropped. */ -/* The previously defined range for general errors started */ -/* at 0x000 instead of 0x001 */ -/* */ -/* DOCUMENT REF: Nexperia/MoReUse Naming Conventions */ -/* */ -/* -------------------------------------------------------------------------- */ - -#ifndef TMNXCOMPID_H -#define TMNXCOMPID_H - -/* -------------------------------------------------------------------------- */ -/* */ -/* Standard include files: */ -/* */ -/* -------------------------------------------------------------------------- */ -#include "tmNxTypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* -------------------------------------------------------------------------- */ -/* */ -/* Types and defines: */ -/* */ -/* -------------------------------------------------------------------------- */ - -/* -------------------------------------------------------------------------- */ -/* */ -/* TM_OK is the 32 bit global status value used by all Nexperia components */ -/* to indicate successful function/operation status. If a non-zero value is*/ -/* returned as status, it should use the component ID formats defined. */ -/* */ -/* -------------------------------------------------------------------------- */ -#define TM_OK 0U /* Global success return status */ - -/* -------------------------------------------------------------------------- */ -/* */ -/* General Defines */ -/* */ -/* -------------------------------------------------------------------------- */ -#define CID_IID_FLAG_BITSHIFT 31 -#define CID_ID_BITSHIFT 12 -#define IID_ID_BITSHIFT 12 - -#define CID_FLAG (0x1U << CID_IID_FLAG_BITSHIFT) -#define IID_FLAG (0x0U << CID_IID_FLAG_BITSHIFT) - -#define CID_ID(number) ((number) << CID_ID_BITSHIFT) -#define CID_ID_BITMASK (0x7FFFFU << CID_ID_BITSHIFT) - -#define IID_ID(number) ((number) << IID_ID_BITSHIFT) -#define IID_ID_BITMASK (0x7FFFFU << IID_ID_BITSHIFT) - -/* -------------------------------------------------------------------------- */ -/* */ -/* Definition of the interface IDs */ -/* */ -/* -------------------------------------------------------------------------- */ -#define IID_IENUMUNKNOWN (IID_ID(0x001U) | IID_FLAG) -#define IID_IBIND (IID_ID(0x002U) | IID_FLAG) -#define IID_IBINDINFO (IID_ID(0x003U) | IID_FLAG) -#define IID_IMEM (IID_ID(0x004U) | IID_FLAG) -#define IID_IUNKNOWN (IID_ID(0x005U) | IID_FLAG) -#define IID_IIC (IID_ID(0x006U) | IID_FLAG) -#define IID_ACHAN (IID_ID(0x007U) | IID_FLAG) -#define IID_AFEAT (IID_ID(0x008U) | IID_FLAG) -#define IID_AMIX (IID_ID(0x009U) | IID_FLAG) -#define IID_ANAADEC (IID_ID(0x00aU) | IID_FLAG) -#define IID_ANAVENC (IID_ID(0x00bU) | IID_FLAG) -#define IID_ANAVENCRYPT (IID_ID(0x00cU) | IID_FLAG) -#define IID_ANAVDEC (IID_ID(0x00dU) | IID_FLAG) -#define IID_BBARDETEXT (IID_ID(0x00eU) | IID_FLAG) -#define IID_BLEVELDETEXT (IID_ID(0x00fU) | IID_FLAG) -#define IID_BLEVELMODEXT (IID_ID(0x010U) | IID_FLAG) -#define IID_BSLSPDI (IID_ID(0x011U) | IID_FLAG) -#define IID_BSLSPDO (IID_ID(0x012U) | IID_FLAG) -#define IID_BSL_AI (IID_ID(0x013U) | IID_FLAG) -#define IID_BSL_AO (IID_ID(0x014U) | IID_FLAG) -#define IID_BSL_AVI (IID_ID(0X015U) | IID_FLAG) -#define IID_BSL_AVO (IID_ID(0x016U) | IID_FLAG) -#define IID_BSL_EEPROM (IID_ID(0X017U) | IID_FLAG) -#define IID_BSL_IDE (IID_ID(0X018U) | IID_FLAG) -#define IID_BSL_NANDFLASH (IID_ID(0X019U) | IID_FLAG) -#define IID_BSL_NORFLASH (IID_ID(0X01aU) | IID_FLAG) -#define IID_BSL_PARPORT (IID_ID(0X01bU) | IID_FLAG) -#define IID_BSL_RTC (IID_ID(0X01cU) | IID_FLAG) -#define IID_COLENH (IID_ID(0x01dU) | IID_FLAG) -#define IID_COLENHEXT (IID_ID(0x01eU) | IID_FLAG) -#define IID_CONNMGR (IID_ID(0x01fU) | IID_FLAG) -#define IID_CRT (IID_ID(0x020U) | IID_FLAG) -#define IID_CTI (IID_ID(0X021U) | IID_FLAG) -#define IID_CTIEXT (IID_ID(0X022U) | IID_FLAG) -#define IID_DIGADEC (IID_ID(0X023U) | IID_FLAG) -#define IID_DIGVDEC (IID_ID(0X024U) | IID_FLAG) -#define IID_DMX (IID_ID(0X025U) | IID_FLAG) -#define IID_DNR (IID_ID(0X026U) | IID_FLAG) -#define IID_DNREXT (IID_ID(0X027U) | IID_FLAG) -#define IID_DVBSUBTDEC (IID_ID(0X028U) | IID_FLAG) -#define IID_FATERR (IID_ID(0X029U) | IID_FLAG) -#define IID_FREND (IID_ID(0X02aU) | IID_FLAG) -#define IID_GAMMAEXT (IID_ID(0X02bU) | IID_FLAG) -#define IID_HISTOMEASEXT (IID_ID(0X02cU) | IID_FLAG) -#define IID_HISTOMODEXT (IID_ID(0X02dU) | IID_FLAG) -#define IID_MML (IID_ID(0X02eU) | IID_FLAG) -#define IID_NOISEESTEXT (IID_ID(0X02fU) | IID_FLAG) -#define IID_OSAL (IID_ID(0X030U) | IID_FLAG) -#define IID_PIPSTORE (IID_ID(0X031U) | IID_FLAG) -#define IID_SCANRATECONV (IID_ID(0X032U) | IID_FLAG) -#define IID_SCANRATECONVEXT (IID_ID(0X033U) | IID_FLAG) -#define IID_SHARPENH (IID_ID(0X034U) | IID_FLAG) -#define IID_SHARPENHEXT (IID_ID(0X035U) | IID_FLAG) -#define IID_SHARPMEASEXT (IID_ID(0X036U) | IID_FLAG) -#define IID_SPDIFIN (IID_ID(0X037U) | IID_FLAG) -#define IID_SPDIFOUT (IID_ID(0X038U) | IID_FLAG) -#define IID_SPEAKER (IID_ID(0X039U) | IID_FLAG) -#define IID_STCDEC (IID_ID(0X03aU) | IID_FLAG) -#define IID_STREAMINJ (IID_ID(0X03bU) | IID_FLAG) -#define IID_SYNCTAG (IID_ID(0X03cU) | IID_FLAG) -#define IID_TSSACOM (IID_ID(0X03dU) | IID_FLAG) -#define IID_TXTDEC (IID_ID(0X03eU) | IID_FLAG) -#define IID_UTILCRYPT (IID_ID(0X03fU) | IID_FLAG) -#define IID_UVBWDETEXT (IID_ID(0X040U) | IID_FLAG) -#define IID_VBIINSERT (IID_ID(0X041U) | IID_FLAG) -#define IID_VBISLICE (IID_ID(0X042U) | IID_FLAG) -#define IID_VDCC (IID_ID(0X043U) | IID_FLAG) -#define IID_VDSTSCAN (IID_ID(0X044U) | IID_FLAG) -#define IID_VFEAT (IID_ID(0X045U) | IID_FLAG) -#define IID_VMIX (IID_ID(0X046U) | IID_FLAG) -#define IID_VSCALEEXT (IID_ID(0X047U) | IID_FLAG) -#define IID_VSRCPROP (IID_ID(0X048U) | IID_FLAG) -#define IID_VSRCSCANPROP (IID_ID(0X049U) | IID_FLAG) -#define IID_GENI2C (IID_ID(0X04aU) | IID_FLAG) -#define IID_PLFINSTVIN (IID_ID(0X04bU) | IID_FLAG) -#define IID_PLFINSTAIN (IID_ID(0X04cU) | IID_FLAG) -#define IID_PLFINSTAOUT (IID_ID(0X04dU) | IID_FLAG) -#define IID_PLFINSTGFX (IID_ID(0X04eU) | IID_FLAG) -#define IID_CONNMGRATV (IID_ID(0X04fU) | IID_FLAG) -#define IID_IAMALIVE (IID_ID(0X050U) | IID_FLAG) -#define IID_BBARDET (IID_ID(0X051U) | IID_FLAG) -#define IID_CONTRRESEXT (IID_ID(0X052U) | IID_FLAG) -#define IID_NOISEMEAS (IID_ID(0X053U) | IID_FLAG) -#define IID_SHARPMEAS (IID_ID(0X054U) | IID_FLAG) -#define IID_HISTOMOD (IID_ID(0X055U) | IID_FLAG) -#define IID_ANTIAGING (IID_ID(0X056U) | IID_FLAG) -#define IID_AMBIENTLEVEL (IID_ID(0X057U) | IID_FLAG) -#define IID_HAD_DRV_IIC (IID_ID(0X058U) | IID_FLAG) -#define IID_HAD_DRV_GPIO (IID_ID(0X059U) | IID_FLAG) -#define IID_HAD_DRV_CSM (IID_ID(0X05aU) | IID_FLAG) -#define IID_DRIVERHAL (IID_ID(0X05bU) | IID_FLAG) -#define IID_MUTISTR (IID_ID(0X05cU) | IID_FLAG) -#define IID_MUTIVEC (IID_ID(0X05dU) | IID_FLAG) -#define IID_MUTISTRX (IID_ID(0X05eU) | IID_FLAG) -#define IID_MUTICMD (IID_ID(0X05fU) | IID_FLAG) -#define IID_TASK_CONDITION (IID_ID(0X060U) | IID_FLAG) -#define IID_PACKET_POOL (IID_ID(0X061U) | IID_FLAG) -#define IID_PACKET_QUEUE (IID_ID(0X062U) | IID_FLAG) -#define IID_UDSDCD (IID_ID(0X063U) | IID_FLAG) -#define IID_DCSS_RL (IID_ID(0X064U) | IID_FLAG) -#define IID_DCSS_DD (IID_ID(0X065U) | IID_FLAG) -#define IID_DCSS_GD (IID_ID(0X066U) | IID_FLAG) -#define IID_DCSS_RSC (IID_ID(0X067U) | IID_FLAG) -#define IID_DCSS_P (IID_ID(0X068U) | IID_FLAG) -#define IID_DCSS (IID_ID(0X069U) | IID_FLAG) -#define IID_CC_BURST_CUTTING_AREA (IID_ID(0X06aU) | IID_FLAG) -#define IID_CC_CONFIGURATION (IID_ID(0X06bU) | IID_FLAG) -#define IID_CC_CONTROL (IID_ID(0X06cU) | IID_FLAG) -#define IID_CC_DEBUG (IID_ID(0X06dU) | IID_FLAG) -#define IID_CC_DECODER (IID_ID(0X06eU) | IID_FLAG) -#define IID_CC_ENCODER (IID_ID(0X06fU) | IID_FLAG) -#define IID_CC_HF_PROCESSING (IID_ID(0X070U) | IID_FLAG) -#define IID_CC_INTERFACE (IID_ID(0X071U) | IID_FLAG) -#define IID_CC_NATLAB (IID_ID(0X072U) | IID_FLAG) -#define IID_CC_PIC (IID_ID(0X073U) | IID_FLAG) -#define IID_CC_WOBBLE (IID_ID(0X074U) | IID_FLAG) -#define IID_CC_REGISTERMAP (IID_ID(0X075U) | IID_FLAG) -#define IID_CC_WOBBLE_REG (IID_ID(0X076U) | IID_FLAG) -#define IID_CC_PIC_REG (IID_ID(0X077U) | IID_FLAG) -#define IID_CC_NATLAB_REG (IID_ID(0X078U) | IID_FLAG) -#define IID_CC_INTERFACE_REG (IID_ID(0X079U) | IID_FLAG) -#define IID_CC_HF_PROCESSING_REG (IID_ID(0X07aU) | IID_FLAG) -#define IID_CC_ENCODER_REG (IID_ID(0X07bU) | IID_FLAG) -#define IID_CC_DECODER_REG (IID_ID(0X07cU) | IID_FLAG) -#define IID_CC_DEBUG_REG (IID_ID(0X07dU) | IID_FLAG) -#define IID_CC_CONTROL_REG (IID_ID(0X07eU) | IID_FLAG) -#define IID_CC_CONFIGURATION_REG (IID_ID(0X07fU) | IID_FLAG) -#define IID_CC_BURST_CUTTING_AREA_REG (IID_ID(0X080U) | IID_FLAG) -#define IID_CC_PHYSICAL_VALUES (IID_ID(0X081U) | IID_FLAG) -#define IID_CC_GENERAL_SETTINGS (IID_ID(0X082U) | IID_FLAG) -#define IID_CC_COEFFICIENTS (IID_ID(0X083U) | IID_FLAG) -#define IID_REMOTE_CONTROL (IID_ID(0X084U) | IID_FLAG) -#define IID_TUNER (IID_ID(0X085U) | IID_FLAG) -#define IID_MUTITST (IID_ID(0X086U) | IID_FLAG) -#define IID_CHIP_CONTEXT (IID_ID(0X087U) | IID_FLAG) -#define IID_API (IID_ID(0X088U) | IID_FLAG) -#define IID_CHANDEC (IID_ID(0X089U) | IID_FLAG) -#define IID_TUNING (IID_ID(0X08aU) | IID_FLAG) -#define IID_TUNINGAFC (IID_ID(0X08bU) | IID_FLAG) -#define IID_TUNINGAFCNTF (IID_ID(0X08cU) | IID_FLAG) -#define IID_TUNINGCHAN (IID_ID(0X08dU) | IID_FLAG) -#define IID_TUNINGSEARCHNTF (IID_ID(0X08eU) | IID_FLAG) -#define IID_ID3EXTR (IID_ID(0X08fU) | IID_FLAG) -#define IID_ANAAVDEM (IID_ID(0X090U) | IID_FLAG) -#define IID_ANAAVDEMNTF (IID_ID(0X091U) | IID_FLAG) -#define IID_CCEXTR (IID_ID(0X092U) | IID_FLAG) -#define IID_CHANDECDVBC (IID_ID(0X093U) | IID_FLAG) -#define IID_CHANDECDVBS (IID_ID(0X094U) | IID_FLAG) -#define IID_CHANDECDVBT (IID_ID(0X095U) | IID_FLAG) -#define IID_CHANDECNTF (IID_ID(0X096U) | IID_FLAG) -#define IID_OOB (IID_ID(0X097U) | IID_FLAG) -#define IID_RFAMP (IID_ID(0X098U) | IID_FLAG) -#define IID_SIGSTRENGTH (IID_ID(0X099U) | IID_FLAG) -#define IID_SIGSTRENGTHNTF (IID_ID(0X09aU) | IID_FLAG) -#define IID_IMAGEDEC (IID_ID(0X09bU) | IID_FLAG) -#define IID_TUNINGSEARCH (IID_ID(0X09cU) | IID_FLAG) -#define IID_PINOBJECTS (IID_ID(0X09dU) | IID_FLAG) -#define IID_URLSRC (IID_ID(0X09eU) | IID_FLAG) -#define IID_OSDKERNELAPP (IID_ID(0X09fU) | IID_FLAG) -#define IID_OSDKERNELMEM (IID_ID(0X0a0U) | IID_FLAG) -#define IID_OSDKERNELOSD (IID_ID(0X0a1U) | IID_FLAG) -#define IID_OSDKERNELOSDCONTROL (IID_ID(0X0a2U) | IID_FLAG) -#define IID_RTC (IID_ID(0X0a3U) | IID_FLAG) -#define IID_FS (IID_ID(0X0a4U) | IID_FLAG) -#define IID_BE (IID_ID(0X0a5U) | IID_FLAG) -#define IID_CD_LIB (IID_ID(0X0a6U) | IID_FLAG) -#define IID_DB (IID_ID(0X0a7U) | IID_FLAG) -#define IID_AVIN (IID_ID(0X0a8U) | IID_FLAG) -#define IID_AVOUT (IID_ID(0X0a9U) | IID_FLAG) -#define IID_INT (IID_ID(0X0aaU) | IID_FLAG) -#define IID_EVT (IID_ID(0X0abU) | IID_FLAG) -#define IID_DMA (IID_ID(0X0acU) | IID_FLAG) -#define IID_CLK (IID_ID(0X0adU) | IID_FLAG) -#define IID_VMIXBORDERPAINTER (IID_ID(0X0aeU) | IID_FLAG) -#define IID_CPROCTVFLOW (IID_ID(0X0afU) | IID_FLAG) -#define IID_VTRANTIAGING (IID_ID(0X0b0U) | IID_FLAG) -#define IID_VTRFADE (IID_ID(0X0b1U) | IID_FLAG) -#define IID_VTRSCALE (IID_ID(0X0b2U) | IID_FLAG) -#define IID_VTRSTROBE (IID_ID(0X0b3U) | IID_FLAG) -#define IID_HDMIIN (IID_ID(0X0b4U) | IID_FLAG) -#define IID_ACHANSEL (IID_ID(0X0b5U) | IID_FLAG) -#define IID_SSP (IID_ID(0X0b6U) | IID_FLAG) -#define IID_CONNMGR_STILL (IID_ID(0X0b7U) | IID_FLAG) -#define IID_CONNMGR_AUDIO (IID_ID(0X0b8U) | IID_FLAG) -#define IID_CONNMGR_MPEG2PS (IID_ID(0X0b9U) | IID_FLAG) -#define IID_SPI_SD (IID_ID(0X0baU) | IID_FLAG) -#define IID_DECODERHALCST (IID_ID(0X0bbU) | IID_FLAG) -#define IID_SOD (IID_ID(0X0bcU) | IID_FLAG) -#define IID_DCSS_AA (IID_ID(0X0bdU) | IID_FLAG) -#define IID_DCSS_AVI (IID_ID(0X0beU) | IID_FLAG) -#define IID_DCSS_BC (IID_ID(0X0bfU) | IID_FLAG) -#define IID_DCSS_CLUT (IID_ID(0X0c0U) | IID_FLAG) -#define IID_DCSS_COL (IID_ID(0X0c1U) | IID_FLAG) -#define IID_DCSS_DFC (IID_ID(0X0c2U) | IID_FLAG) -#define IID_DCSS_DOC (IID_ID(0X0c3U) | IID_FLAG) -#define IID_DCSS_GIO (IID_ID(0X0c4U) | IID_FLAG) -#define IID_DCSS_ISD (IID_ID(0X0c5U) | IID_FLAG) -#define IID_DCSS_KBI (IID_ID(0X0c6U) | IID_FLAG) -#define IID_DCSS_OSD (IID_ID(0X0c7U) | IID_FLAG) -#define IID_DCSS_PIF (IID_ID(0X0c8U) | IID_FLAG) -#define IID_DCSS_PVI (IID_ID(0X0c9U) | IID_FLAG) -#define IID_DCSS_SIS (IID_ID(0X0caU) | IID_FLAG) -#define IID_DCSS_TIG (IID_ID(0X0cbU) | IID_FLAG) -#define IID_DCSS_USC (IID_ID(0X0ccU) | IID_FLAG) -#define IID_DCSS_VCR (IID_ID(0X0cdU) | IID_FLAG) -#define IID_CONNMGR_MP4RTP_PLAYER (IID_ID(0X0ceU) | IID_FLAG) -#define IID_CONNMGR_AVIMP4_PLAYER (IID_ID(0X0cfU) | IID_FLAG) -#define IID_VDECANAEXT2 (IID_ID(0X0d0U) | IID_FLAG) -#define IID_STBCOMMON (IID_ID(0X0d1U) | IID_FLAG) -#define IID_AVSYNCCTRL (IID_ID(0X0d2U) | IID_FLAG) -#define IID_PRIVNETSCHEMECONFIG (IID_ID(0X0d3U) | IID_FLAG) -#define IID_SHAREDVARIABLE (IID_ID(0X0d4U) | IID_FLAG) -#define IID_NETSCHEMECONFIG (IID_ID(0X0d5U) | IID_FLAG) -#define IID_AVSYNCTRICK (IID_ID(0X0d6U) | IID_FLAG) -#define IID_SETINTF (IID_ID(0X0d7U) | IID_FLAG) -#define IID_URLDMXMONITOR (IID_ID(0X0d8U) | IID_FLAG) -#define IID_VDECMONITOR (IID_ID(0X0d9U) | IID_FLAG) -#define IID_STBVIDEOTYPES (IID_ID(0X0daU) | IID_FLAG) - -#define IID_RESERVED (CID_ID(0x7fffU) | CID_FLAG) -/* ************************************************************************** */ -/* Interface Id's reserved for external organizations */ -/* */ -/* None */ -/* */ -/* ************************************************************************** */ - -/* -------------------------------------------------------------------------- */ -/* */ -/* Definition of the component IDs */ -/* */ -/* -------------------------------------------------------------------------- */ -#define CID_MPMP1_GRINDER (CID_ID(0x8001U) | CID_FLAG) -#define CID_MUSB_GRINDER (CID_ID(0x8002U) | CID_FLAG) -#define CID_UOTGPFL (CID_ID(0x8003U) | CID_FLAG) -#define CID_CHIPBUILDER_GRINDER (CID_ID(0x8004U) | CID_FLAG) - -#define CID_AANALYZER (CID_ID(0x8009U) | CID_FLAG) -#define CID_ADEC_AAC4 (CID_ID(0x800aU) | CID_FLAG) -#define CID_ADEC_ATV (CID_ID(0x800bU) | CID_FLAG) -#define CID_ADEC_CELP4 (CID_ID(0x800cU) | CID_FLAG) -#define CID_ADEC_CORE (CID_ID(0x800dU) | CID_FLAG) -#define CID_ADEC_MP3PRO (CID_ID(0x800eU) | CID_FLAG) -#define CID_ADEC_PL2 (CID_ID(0x800fU) | CID_FLAG) -#define CID_ADEC_STB (CID_ID(0x8010U) | CID_FLAG) -#define CID_ADEEMPH (CID_ID(0x8011U) | CID_FLAG) -#define CID_AENCAAC4 (CID_ID(0x8012U) | CID_FLAG) -#define CID_AREND_AO_MUX (CID_ID(0x8013U) | CID_FLAG) -#define CID_ASP_IIRZ2 (CID_ID(0x8014U) | CID_FLAG) -#define CID_ASRC (CID_ID(0x8015U) | CID_FLAG) -#define CID_ASYS_CORE (CID_ID(0x8016U) | CID_FLAG) -#define CID_ATV_PLF_BASIC (CID_ID(0x8017U) | CID_FLAG) -#define CID_ATV_STUBS (CID_ID(0x8018U) | CID_FLAG) -#define CID_AVI_READ_DIVX (CID_ID(0x8019U) | CID_FLAG) -#define CID_BOOTINFO (CID_ID(0x801aU) | CID_FLAG) -#define CID_BROWSE_EIS (CID_ID(0x801bU) | CID_FLAG) -#define CID_BSL_7113 (CID_ID(0x801cU) | CID_FLAG) -#define CID_BSL_7113QT (CID_ID(0x801dU) | CID_FLAG) -#define CID_BSL_7114 (CID_ID(0x801eU) | CID_FLAG) -#define CID_BSL_7118 (CID_ID(0x801fU) | CID_FLAG) -#define CID_BSL_ANABEL (CID_ID(0x8020U) | CID_FLAG) -#define CID_BSL_ANABELQT (CID_ID(0x8021U) | CID_FLAG) -#define CID_BSL_AVIP (CID_ID(0x8022U) | CID_FLAG) -#define CID_BSL_BOARDS (CID_ID(0x8023U) | CID_FLAG) -#define CID_BSL_CORE (CID_ID(0x8024U) | CID_FLAG) -#define CID_BSL_DENC (CID_ID(0x8025U) | CID_FLAG) -#define CID_BSL_EEPROM_ATMEL (CID_ID(0x8026U) | CID_FLAG) -#define CID_BSL_IDEXIO (CID_ID(0x8027U) | CID_FLAG) -#define CID_BSL_NANDSAMSUNG (CID_ID(0x8028U) | CID_FLAG) -#define CID_BSL_NORINTEL (CID_ID(0x8029U) | CID_FLAG) -#define CID_BSL_RTCPCF8563 (CID_ID(0x802aU) | CID_FLAG) -#define CID_BSL_UART_HWAPI (CID_ID(0x802bU) | CID_FLAG) -#define CID_BSL_UDA1344 (CID_ID(0x802cU) | CID_FLAG) -#define CID_BT_1500 (CID_ID(0x802dU) | CID_FLAG) -#define CID_BT_API (CID_ID(0x802eU) | CID_FLAG) -#define CID_BT_CORE (CID_ID(0x802fU) | CID_FLAG) -#define CID_BT_CPU (CID_ID(0x8030U) | CID_FLAG) -#define CID_BT_MIPS (CID_ID(0x8031U) | CID_FLAG) -#define CID_BT_TRIMEDIA (CID_ID(0x8032U) | CID_FLAG) -#define CID_BT_V2PCI (CID_ID(0x8033U) | CID_FLAG) -#define CID_BT_VPCI (CID_ID(0x8034U) | CID_FLAG) -#define CID_BT_VSTB (CID_ID(0x8035U) | CID_FLAG) -#define CID_BUFFEREDREAD (CID_ID(0x8036U) | CID_FLAG) -#define CID_CONN_MGRAUDSYSSTB (CID_ID(0x8037U) | CID_FLAG) -#define CID_DEMUXMPEGTS_SW (CID_ID(0x8038U) | CID_FLAG) -#define CID_DIG_ADEC_AUDSYS_STB (CID_ID(0x8039U) | CID_FLAG) -#define CID_DL_AI (CID_ID(0x803aU) | CID_FLAG) -#define CID_DL_AICP (CID_ID(0x803bU) | CID_FLAG) -#define CID_DL_AO (CID_ID(0x803cU) | CID_FLAG) -#define CID_DL_AVFS (CID_ID(0x803dU) | CID_FLAG) -#define CID_DL_CLOCK (CID_ID(0x803eU) | CID_FLAG) -#define CID_DL_DFS (CID_ID(0x803fU) | CID_FLAG) -#define CID_DL_DISKSCHED (CID_ID(0x8040U) | CID_FLAG) -#define CID_DL_DMA (CID_ID(0x8041U) | CID_FLAG) -#define CID_DL_ETH_IP3902 (CID_ID(0x8042U) | CID_FLAG) -#define CID_DL_GPIO (CID_ID(0x8043U) | CID_FLAG) -#define CID_DL_I2C (CID_ID(0x8044U) | CID_FLAG) -#define CID_DL_IDE (CID_ID(0x8045U) | CID_FLAG) -#define CID_DL_IDESTUB (CID_ID(0x8046U) | CID_FLAG) -#define CID_DL_IIC (CID_ID(0x8047U) | CID_FLAG) -#define CID_DL_IR (CID_ID(0x8048U) | CID_FLAG) -#define CID_DL_MBS (CID_ID(0x8049U) | CID_FLAG) -#define CID_DL_MBS2 (CID_ID(0x804aU) | CID_FLAG) -#define CID_DL_NANDFLASH (CID_ID(0x804bU) | CID_FLAG) -#define CID_DL_NORFLASH (CID_ID(0x804cU) | CID_FLAG) -#define CID_DL_PCI (CID_ID(0x804dU) | CID_FLAG) -#define CID_DL_PROCESSOR (CID_ID(0x804eU) | CID_FLAG) -#define CID_DL_QTNR (CID_ID(0x804fU) | CID_FLAG) -#define CID_DL_QVCP (CID_ID(0x8050U) | CID_FLAG) -#define CID_DL_SEM (CID_ID(0x8051U) | CID_FLAG) -#define CID_DL_SPDI (CID_ID(0x8052U) | CID_FLAG) -#define CID_DL_SPDO (CID_ID(0x8053U) | CID_FLAG) -#define CID_DL_TIMER (CID_ID(0x8054U) | CID_FLAG) -#define CID_DL_TSDMA (CID_ID(0x8055U) | CID_FLAG) -#define CID_DL_TSIO (CID_ID(0x8056U) | CID_FLAG) -#define CID_DL_UDMA (CID_ID(0x8057U) | CID_FLAG) -#define CID_DL_VID_MEAS (CID_ID(0x8058U) | CID_FLAG) -#define CID_DL_VIP (CID_ID(0x8059U) | CID_FLAG) -#define CID_DL_VMPG (CID_ID(0x805aU) | CID_FLAG) -#define CID_DL_XIO (CID_ID(0x805bU) | CID_FLAG) -#define CID_DRAWTEXT (CID_ID(0x805cU) | CID_FLAG) -#define CID_DVPDEBUG (CID_ID(0x805dU) | CID_FLAG) -#define CID_FATALERROR (CID_ID(0x805eU) | CID_FLAG) -#define CID_FATALERROR_VT (CID_ID(0x805fU) | CID_FLAG) -#define CID_FREADAVPROP (CID_ID(0x8060U) | CID_FLAG) -#define CID_FWRITEAVPROP (CID_ID(0x8061U) | CID_FLAG) -#define CID_HELP (CID_ID(0x8062U) | CID_FLAG) -#define CID_HTTP_IO_DRIVER (CID_ID(0x8063U) | CID_FLAG) -#define CID_HW_AICP (CID_ID(0x8064U) | CID_FLAG) -#define CID_HW_CLOCK (CID_ID(0x8065U) | CID_FLAG) -#define CID_HW_DMA (CID_ID(0x8066U) | CID_FLAG) -#define CID_HW_DRAW (CID_ID(0x8067U) | CID_FLAG) -#define CID_HW_DRAWCOMMON (CID_ID(0x8068U) | CID_FLAG) -#define CID_HW_DRAWDE (CID_ID(0x8069U) | CID_FLAG) -#define CID_HW_DRAWREF (CID_ID(0x806aU) | CID_FLAG) -#define CID_HW_DRAWSHARED (CID_ID(0x806bU) | CID_FLAG) -#define CID_HW_DRAWTMH (CID_ID(0x806cU) | CID_FLAG) -#define CID_HW_DRAWTMT (CID_ID(0x806dU) | CID_FLAG) -#define CID_HW_DRAWTMTH (CID_ID(0x806eU) | CID_FLAG) -#define CID_HW_DSP (CID_ID(0x806fU) | CID_FLAG) -#define CID_HW_ETH_IP3902 (CID_ID(0x8070U) | CID_FLAG) -#define CID_HW_GIC (CID_ID(0x8071U) | CID_FLAG) -#define CID_HW_GPIO (CID_ID(0x8072U) | CID_FLAG) -#define CID_HW_I2C (CID_ID(0x8073U) | CID_FLAG) -#define CID_HW_IIC (CID_ID(0x8074U) | CID_FLAG) -#define CID_HW_MBS (CID_ID(0x8075U) | CID_FLAG) -#define CID_HW_MMIARB (CID_ID(0x8076U) | CID_FLAG) -#define CID_HW_MMIARB1010 (CID_ID(0x8077U) | CID_FLAG) -#define CID_HW_PCI (CID_ID(0x8078U) | CID_FLAG) -#define CID_HW_PIC (CID_ID(0x8079U) | CID_FLAG) -#define CID_HW_SMC (CID_ID(0x807aU) | CID_FLAG) -#define CID_HW_TSDMA (CID_ID(0x807bU) | CID_FLAG) -#define CID_HW_UART (CID_ID(0x807cU) | CID_FLAG) -#define CID_HW_UDMA (CID_ID(0x807dU) | CID_FLAG) -#define CID_HW_VIP (CID_ID(0x807eU) | CID_FLAG) -#define CID_HW_VMSP (CID_ID(0x807fU) | CID_FLAG) -#define CID_HW_XIO (CID_ID(0x8080U) | CID_FLAG) -#define CID_INFRA_MISC (CID_ID(0x8081U) | CID_FLAG) -#define CID_INTERRUPT (CID_ID(0x8082U) | CID_FLAG) -#define CID_IPC_DT (CID_ID(0x8083U) | CID_FLAG) -#define CID_IPC_READ (CID_ID(0x8084U) | CID_FLAG) -#define CID_IPC_RPC (CID_ID(0x8085U) | CID_FLAG) -#define CID_IPC_WRITE (CID_ID(0x8086U) | CID_FLAG) -#define CID_LIBLOAD_TM (CID_ID(0x8087U) | CID_FLAG) -#define CID_MEMDBG (CID_ID(0x8088U) | CID_FLAG) -#define CID_MENU (CID_ID(0x8089U) | CID_FLAG) -#define CID_MP4READ (CID_ID(0x808aU) | CID_FLAG) -#define CID_MPEGCOLORBAR (CID_ID(0x808bU) | CID_FLAG) -#define CID_NETSTACK_FUSION (CID_ID(0x808cU) | CID_FLAG) -#define CID_NETSTACK_TARGET_TCP (CID_ID(0x808dU) | CID_FLAG) -#define CID_NETSTACK_UPNP_ALLEGRO (CID_ID(0x808dU) | CID_FLAG) -#define CID_NETSTACK_UPNP_INTEL (CID_ID(0x808eU) | CID_FLAG) -#define CID_NETWORKREAD (CID_ID(0x8090U) | CID_FLAG) -#define CID_NM_COMMON (CID_ID(0x8091U) | CID_FLAG) -#define CID_NM_DEI (CID_ID(0x8092U) | CID_FLAG) -#define CID_NM_EST (CID_ID(0x8093U) | CID_FLAG) -#define CID_NM_QFD (CID_ID(0x8094U) | CID_FLAG) -#define CID_NM_UPC (CID_ID(0x8095U) | CID_FLAG) -#define CID_NM_UPC_SPIDER (CID_ID(0x8096U) | CID_FLAG) -#define CID_OS (CID_ID(0x8097U) | CID_FLAG) -#define CID_PROBE (CID_ID(0x8098U) | CID_FLAG) -#define CID_PSIUTIL (CID_ID(0x8099U) | CID_FLAG) -#define CID_REALNETWORKS_ENGINE (CID_ID(0x809aU) | CID_FLAG) -#define CID_SCAN_RATE_CONV_VSYS_TV (CID_ID(0x809bU) | CID_FLAG) -#define CID_SPOSAL (CID_ID(0x809cU) | CID_FLAG) -#define CID_TIMEDOCTOR (CID_ID(0x809dU) | CID_FLAG) -#define CID_TSA_CLOCK (CID_ID(0x809eU) | CID_FLAG) - -#define CID_TST_AVETC_SINK (CID_ID(0x80a0U) | CID_FLAG) -#define CID_TST_DEMUX (CID_ID(0x80a1U) | CID_FLAG) -#define CID_TST_DEMUX_FOR_MUX (CID_ID(0x80a2U) | CID_FLAG) -#define CID_TST_SPTS_SINK (CID_ID(0x80a3U) | CID_FLAG) -#define CID_TTI_UTIL (CID_ID(0x80a4U) | CID_FLAG) -#define CID_UART (CID_ID(0x80a5U) | CID_FLAG) -#define CID_UPCONV100MC (CID_ID(0x80a6U) | CID_FLAG) -#define CID_UTILCPIREC (CID_ID(0x80a7U) | CID_FLAG) -#define CID_UTILCRYPTRIJNDAEL (CID_ID(0x80a8U) | CID_FLAG) -#define CID_VATV (CID_ID(0x80a9U) | CID_FLAG) -#define CID_VATV_TR (CID_ID(0x80aaU) | CID_FLAG) -#define CID_VBI_INSERT_VSYS_TV (CID_ID(0x80abU) | CID_FLAG) -#define CID_VCAP_VIP2 (CID_ID(0x80acU) | CID_FLAG) -#define CID_VDEC_BMP (CID_ID(0x80adU) | CID_FLAG) -#define CID_VDEC_DIVX (CID_ID(0x80aeU) | CID_FLAG) -#define CID_VDEC_GIF (CID_ID(0x80afU) | CID_FLAG) -#define CID_VDEC_JPEG (CID_ID(0x80b0U) | CID_FLAG) -#define CID_VDEC_JPEG2K (CID_ID(0x80b1U) | CID_FLAG) -#define CID_VDEC_MP (CID_ID(0x80b2U) | CID_FLAG) -#define CID_VDECMPEG4 (CID_ID(0x80b3U) | CID_FLAG) -#define CID_VENC_MPEG4 (CID_ID(0x80b4U) | CID_FLAG) -#define CID_VENCMJPEG (CID_ID(0x80b5U) | CID_FLAG) -#define CID_VENCMPEG2 (CID_ID(0x80b6U) | CID_FLAG) -#define CID_VIDEOUTIL (CID_ID(0x80b7U) | CID_FLAG) -#define CID_VPACK (CID_ID(0x80b8U) | CID_FLAG) -#define CID_VPIP_REC_PLAY (CID_ID(0x80b9U) | CID_FLAG) -#define CID_VPOST_ICP (CID_ID(0x80baU) | CID_FLAG) -#define CID_VREND_VCP (CID_ID(0x80bbU) | CID_FLAG) -#define CID_VRENDVO (CID_ID(0x80bcU) | CID_FLAG) -#define CID_VSCHED (CID_ID(0x80bdU) | CID_FLAG) -#define CID_VTBLBASE (CID_ID(0x80beU) | CID_FLAG) -#define CID_VTRANS_MBS2 (CID_ID(0x80bfU) | CID_FLAG) -#define CID_VTRANS_QTNR (CID_ID(0x80c0U) | CID_FLAG) -#define CID_VXWORKS_BSP (CID_ID(0x80c1U) | CID_FLAG) -#define CID_WREAD (CID_ID(0x80c2U) | CID_FLAG) -#define CID_CONNMGR_ATV (CID_ID(0x80c3U) | CID_FLAG) -#define CID_DL_VPK (CID_ID(0x80c4U) | CID_FLAG) -#define CID_VTRANS_VPK (CID_ID(0x80c5U) | CID_FLAG) -#define CID_DL_VIP2 (CID_ID(0x80c6U) | CID_FLAG) -#define CID_VX_GEN_UART (CID_ID(0x80c7U) | CID_FLAG) -#define CID_VX_GPIO (CID_ID(0x80c8U) | CID_FLAG) -#define CID_VX_GEN_TIMER (CID_ID(0x80c9U) | CID_FLAG) -#define CID_M4VENC_DIS (CID_ID(0x80caU) | CID_FLAG) -#define CID_VENC_ANA (CID_ID(0x80cbU) | CID_FLAG) -#define CID_BSL_VENC_ANA (CID_ID(0x80ccU) | CID_FLAG) -#define CID_BSL_VENC_ANA_EXT (CID_ID(0x80cdU) | CID_FLAG) -#define CID_BSL_VENC_ANAVBI_EXT (CID_ID(0x80ceU) | CID_FLAG) -#define CID_CMDX (CID_ID(0x80cfU) | CID_FLAG) -#define CID_LL_GPIO (CID_ID(0x80d0U) | CID_FLAG) -#define CID_LL_KEYPAD (CID_ID(0x80d1U) | CID_FLAG) -#define CID_LL_TIMER (CID_ID(0x80d2U) | CID_FLAG) -#define CID_LL_SPI (CID_ID(0x80d3U) | CID_FLAG) -#define CID_LL_UART (CID_ID(0x80d4U) | CID_FLAG) -#define CID_LL_I2C (CID_ID(0x80d5U) | CID_FLAG) -#define CID_LL_TR (CID_ID(0x80d6U) | CID_FLAG) -#define CID_HW_KEYPAD (CID_ID(0x80d7U) | CID_FLAG) -#define CID_HW_TIMER (CID_ID(0x80d8U) | CID_FLAG) -#define CID_HW_SPI (CID_ID(0x80d9U) | CID_FLAG) -#define CID_HW_VATV_IOSYNC (CID_ID(0x80daU) | CID_FLAG) -#define CID_DL_VO (CID_ID(0x80dbU) | CID_FLAG) -#define CID_DL_LVDS (CID_ID(0x80dcU) | CID_FLAG) -#define CID_HW_DDR2031 (CID_ID(0x80ddU) | CID_FLAG) -#define CID_BSL_PHY (CID_ID(0x80deU) | CID_FLAG) -#define CID_ETH_TTCP (CID_ID(0x80dfU) | CID_FLAG) -#define CID_CDIGADEC_MP3PRO (CID_ID(0x80e0U) | CID_FLAG) -#define CID_CID3EXTR (CID_ID(0x80e1U) | CID_FLAG) -#define CID_IMAGEDEC_JPEG (CID_ID(0x80e2U) | CID_FLAG) -#define CID_CURLSRC_MP3PRO (CID_ID(0x80e3U) | CID_FLAG) -#define CID_CURLSRC_IMAGEDEC (CID_ID(0x80e4U) | CID_FLAG) -#define CID_DVP_MAIN (CID_ID(0x80e5U) | CID_FLAG) -#define CID_TMMAN32 (CID_ID(0x80e6U) | CID_FLAG) -#define CID_TMMAN_CRT (CID_ID(0x80e7U) | CID_FLAG) -#define CID_UHS_HAL_PCI (CID_ID(0x80e8U) | CID_FLAG) -#define CID_UHS_OSAL_VXWORKS (CID_ID(0x80e9U) | CID_FLAG) -#define CID_UHS_OSAL_PSOS (CID_ID(0x80eaU) | CID_FLAG) -#define CID_UHS_USBD (CID_ID(0x80ebU) | CID_FLAG) -#define CID_UHS_RBC (CID_ID(0x80ecU) | CID_FLAG) -#define CID_UHS_UFI (CID_ID(0x80edU) | CID_FLAG) -#define CID_UHS_SCSI (CID_ID(0x80eeU) | CID_FLAG) -#define CID_UHS_PRINTER (CID_ID(0x80efU) | CID_FLAG) -#define CID_UHS_MOUSE (CID_ID(0x80f0U) | CID_FLAG) -#define CID_UHS_KEYBOARD (CID_ID(0x80f1U) | CID_FLAG) -#define CID_UHS_HUB (CID_ID(0x80f2U) | CID_FLAG) -#define CID_UHS_HCD_1561 (CID_ID(0x80f3U) | CID_FLAG) -#define CID_CLEANUP (CID_ID(0x80f4U) | CID_FLAG) -#define CID_ALLOCATOR (CID_ID(0x80f5U) | CID_FLAG) -#define CID_TCS_CORE_LIBDEV (CID_ID(0x80f6U) | CID_FLAG) -#define CID_VDI_VDO_ROUTER (CID_ID(0x80f7U) | CID_FLAG) -#define CID_CONNMGR_ATSC (CID_ID(0x80f8U) | CID_FLAG) -#define CID_ASPDIF (CID_ID(0x80f9U) | CID_FLAG) -#define CID_APLL (CID_ID(0x80faU) | CID_FLAG) -#define CID_ATVPLFINSTVIN (CID_ID(0x80fbU) | CID_FLAG) -#define CID_ATV_PLF (CID_ID(0x80fcU) | CID_FLAG) -#define CID_DL_WATCHDOG (CID_ID(0x80fdU) | CID_FLAG) -#define CID_WMT_NET_READER (CID_ID(0x80feU) | CID_FLAG) -#define CID_DL_FGPO (CID_ID(0x80ffU) | CID_FLAG) -#define CID_DL_FGPI (CID_ID(0x8100U) | CID_FLAG) -#define CID_WMT_DECODER (CID_ID(0x8101U) | CID_FLAG) -#define CID_HAD_DRV_IIC (CID_ID(0x8102U) | CID_FLAG) -#define CID_HAD_DRV_GPIO (CID_ID(0x8103U) | CID_FLAG) -#define CID_HAD_GLOBAL (CID_ID(0x8104U) | CID_FLAG) -#define CID_HAD_SMM (CID_ID(0x8105U) | CID_FLAG) -#define CID_HAD_DRV_CSM (CID_ID(0x8106U) | CID_FLAG) -#define CID_CARACASWDOG (CID_ID(0x8107U) | CID_FLAG) -#define CID_CARACASADC (CID_ID(0x8108U) | CID_FLAG) -#define CID_CARACASDMA (CID_ID(0x8109U) | CID_FLAG) -#define CID_CARACASFLASHCTRL (CID_ID(0x810aU) | CID_FLAG) -#define CID_CARACASGPTIMER (CID_ID(0x810bU) | CID_FLAG) -#define CID_CARACASGPIO (CID_ID(0x810cU) | CID_FLAG) -#define CID_CARACASI2CMO (CID_ID(0x810dU) | CID_FLAG) -#define CID_CARACASI2CMS (CID_ID(0x810eU) | CID_FLAG) -#define CID_CARACASRTC (CID_ID(0x810fU) | CID_FLAG) -#define CID_CARACASSPI (CID_ID(0x8110U) | CID_FLAG) -#define CID_CARACASTIMER (CID_ID(0x8111U) | CID_FLAG) -#define CID_CARACASUART (CID_ID(0x8112U) | CID_FLAG) -#define CID_TSSA40 (CID_ID(0x8113U) | CID_FLAG) -#define CID_PACKET_POOL (CID_ID(0x8114U) | CID_FLAG) -#define CID_TSSA15_WRAPPER (CID_ID(0x8115U) | CID_FLAG) -#define CID_TASK_SYNC (CID_ID(0x8116U) | CID_FLAG) -#define CID_TASK_CONDITION (CID_ID(0x8117U) | CID_FLAG) -#define CID_PACKET_QUEUE (CID_ID(0x8118U) | CID_FLAG) -#define CID_CONNECTION_TOOLKIT (CID_ID(0x8119U) | CID_FLAG) -#define CID_TSSA16 (CID_ID(0x811aU) | CID_FLAG) -#define CID_UDSDFU (CID_ID(0x811bU) | CID_FLAG) -#define CID_BTH (CID_ID(0x811cU) | CID_FLAG) -#define CID_DCDIP9021 (CID_ID(0x811dU) | CID_FLAG) -#define CID_DCDIP3501V1X (CID_ID(0x811eU) | CID_FLAG) -#define CID_ISP1581 (CID_ID(0x811fU) | CID_FLAG) -#define CID_DCSS_TV (CID_ID(0x8120U) | CID_FLAG) -#define CID_DCSS_MON (CID_ID(0x8121U) | CID_FLAG) -#define CID_DCSS_RSC_PC (CID_ID(0x8122U) | CID_FLAG) -#define CID_DCSS_RSC_INT (CID_ID(0x8123U) | CID_FLAG) -#define CID_DCSS_RSC_EXT (CID_ID(0x8124U) | CID_FLAG) -#define CID_DCSS_LIT (CID_ID(0x8125U) | CID_FLAG) -#define CID_DCSS_LIT_C (CID_ID(0x8126U) | CID_FLAG) -#define CID_DCSS_45A (CID_ID(0x8127U) | CID_FLAG) -#define CID_UDSCORE (CID_ID(0x8128U) | CID_FLAG) -#define CID_HW_AUDIO7135 (CID_ID(0x8129U) | CID_FLAG) -#define CID_DL_AUDIO3X (CID_ID(0x812aU) | CID_FLAG) -#define CID_REGACC (CID_ID(0x812bU) | CID_FLAG) -#define CID_HW_MJPEG (CID_ID(0x812cU) | CID_FLAG) -#define CID_ISP1582 (CID_ID(0x812dU) | CID_FLAG) -#define CID_MUTI (CID_ID(0x812eU) | CID_FLAG) -#define CID_CHANNEL_DECODER_ENCODER (CID_ID(0x812fU) | CID_FLAG) -#define CID_RESMGR (CID_ID(0x8130U) | CID_FLAG) -#define CID_WIDGET (CID_ID(0x8131U) | CID_FLAG) -#define CID_FB (CID_ID(0x8132U) | CID_FLAG) -#define CID_GFX (CID_ID(0x8133U) | CID_FLAG) -#define CID_HPS_DISPATCHER (CID_ID(0x8134U) | CID_FLAG) -#define CID_DL_PLXGPIO (CID_ID(0x8135U) | CID_FLAG) -#define CID_HW_PLXGPIO (CID_ID(0x8136U) | CID_FLAG) -#define CID_DL_PLXPHI (CID_ID(0x8137U) | CID_FLAG) -#define CID_HW_PLXPHI_EVALUATOR (CID_ID(0x8138U) | CID_FLAG) -#define CID_DL_SCALER (CID_ID(0x8139U) | CID_FLAG) -#define CID_EFM (CID_ID(0x813aU) | CID_FLAG) -#define CID_HW_TUNER_FM1236MK3 (CID_ID(0x813bU) | CID_FLAG) -#define CID_HW_TUNER_FM1216MK3 (CID_ID(0x813cU) | CID_FLAG) -#define CID_HW_TUNER_FM1216MK2 (CID_ID(0x813dU) | CID_FLAG) -#define CID_ANALOG_CHANNEL_TABLE (CID_ID(0x813eU) | CID_FLAG) -#define CID_TUNER_CONTROL (CID_ID(0x813fU) | CID_FLAG) -#define CID_DL_UIMS (CID_ID(0x8140U) | CID_FLAG) -#define CID_DL_RCTRANSMITTER (CID_ID(0x8141U) | CID_FLAG) -#define CID_HW_CST_RCRECEIVER (CID_ID(0x8142U) | CID_FLAG) -#define CID_HW_CST_RCTRANSMITTER (CID_ID(0x8143U) | CID_FLAG) -#define CID_DCDIP3506 (CID_ID(0x8144U) | CID_FLAG) -#define CID_DCDIP3501V2X (CID_ID(0x8145U) | CID_FLAG) -#define CID_MTV_COORD (CID_ID(0x8146U) | CID_FLAG) -#define CID_MTV_IMG_ROT_CTRL (CID_ID(0x8147U) | CID_FLAG) -#define CID_TFE_TRACE (CID_ID(0x8148U) | CID_FLAG) -#define CID_TMCAL_SERVER (CID_ID(0x8149U) | CID_FLAG) -#define CID_BOOT_LOADER (CID_ID(0x814aU) | CID_FLAG) -#define CID_TD_SAVE_DATA (CID_ID(0x814bU) | CID_FLAG) -#define CID_TFE_TRACE_PROCESS_DATA (CID_ID(0x814cU) | CID_FLAG) -#define CID_VIDEOCTRL (CID_ID(0x814dU) | CID_FLAG) -#define CID_BOOT (CID_ID(0x814eU) | CID_FLAG) -#define CID_EVENT (CID_ID(0x814fU) | CID_FLAG) -#define CID_USERINPUT (CID_ID(0x8150U) | CID_FLAG) -#define CID_BSL_TUNER (CID_ID(0x8151U) | CID_FLAG) -#define CID_P5KIIC (CID_ID(0x8152U) | CID_FLAG) -#define CID_HW_PMANSECURITY (CID_ID(0x8153U) | CID_FLAG) -#define CID_DRM_DIVX (CID_ID(0x8154U) | CID_FLAG) -#define CID_TMHWVIDEODEC7136 (CID_ID(0x8155U) | CID_FLAG) -#define CID_TMDLVIDEODEC (CID_ID(0x8156U) | CID_FLAG) -#define CID_OSD_KERNEL (CID_ID(0x8157U) | CID_FLAG) -#define CID_HW_DCSNETWORK (CID_ID(0x8158U) | CID_FLAG) -#define CID_DL_RCRECEIVER (CID_ID(0x8159U) | CID_FLAG) -#define CID_INT (CID_ID(0x815aU) | CID_FLAG) -#define CID_RTC (CID_ID(0x815bU) | CID_FLAG) -#define CID_TIMER (CID_ID(0x815cU) | CID_FLAG) -#define CID_IPC (CID_ID(0x815dU) | CID_FLAG) -#define CID_P5KTELETEXT (CID_ID(0x815eU) | CID_FLAG) -#define CID_P5KAUDIOVIDEO (CID_ID(0x815fU) | CID_FLAG) -#define CID_P5KCONFIG (CID_ID(0x8160U) | CID_FLAG) -#define CID_HW_CST_TRANSPSTREAMIN (CID_ID(0x8161U) | CID_FLAG) -#define CID_HOMER_KERNEL (CID_ID(0x8162U) | CID_FLAG) -#define CID_HOMER_DRIVER (CID_ID(0x8163U) | CID_FLAG) -#define CID_CD_FILE_SYSTEM (CID_ID(0x8164U) | CID_FLAG) -#define CID_COBALT_APP (CID_ID(0x8165U) | CID_FLAG) -#define CID_COBALT_UI (CID_ID(0x8166U) | CID_FLAG) -#define CID_CD_SERVO (CID_ID(0x8167U) | CID_FLAG) -#define CID_CD_UTILS (CID_ID(0x8168U) | CID_FLAG) -#define CID_COBALT_SYSTEM (CID_ID(0x8169U) | CID_FLAG) -#define CID_CDSLIM (CID_ID(0x816aU) | CID_FLAG) -#define CID_CD_DATABASE (CID_ID(0x816bU) | CID_FLAG) -#define CID_CANAVENC (CID_ID(0x816cU) | CID_FLAG) -#define CID_CANTIAGING (CID_ID(0x816dU) | CID_FLAG) -#define CID_CAUTOPICTCTRL (CID_ID(0x816eU) | CID_FLAG) -#define CID_CBBARCTRL (CID_ID(0x816fU) | CID_FLAG) -#define CID_CBBARDET (CID_ID(0x8170U) | CID_FLAG) -#define CID_CBBARDETEXT (CID_ID(0x8171U) | CID_FLAG) -#define CID_CBLEVELDETEXT (CID_ID(0x8172U) | CID_FLAG) -#define CID_CCOLENH (CID_ID(0x8173U) | CID_FLAG) -#define CID_CCOLENHEXT (CID_ID(0x8174U) | CID_FLAG) -#define CID_CCONTRESEXT (CID_ID(0x8175U) | CID_FLAG) -#define CID_CCTI (CID_ID(0x8176U) | CID_FLAG) -#define CID_CCTIEXT (CID_ID(0x8177U) | CID_FLAG) -#define CID_CDNR (CID_ID(0x8178U) | CID_FLAG) -#define CID_CDNREXT (CID_ID(0x8179U) | CID_FLAG) -#define CID_CGAMMAEXT (CID_ID(0x817aU) | CID_FLAG) -#define CID_CHISTOMEASEXT (CID_ID(0x817bU) | CID_FLAG) -#define CID_CHISTOMOD (CID_ID(0x817cU) | CID_FLAG) -#define CID_CHISTOMODEXT (CID_ID(0x817dU) | CID_FLAG) -#define CID_CMBSXRAY (CID_ID(0x817eU) | CID_FLAG) -#define CID_CNOISE (CID_ID(0x817fU) | CID_FLAG) -#define CID_CNOISEESTEXT (CID_ID(0x8180U) | CID_FLAG) -#define CID_CPFSPD (CID_ID(0x8181U) | CID_FLAG) -#define CID_CQVCPXRAY (CID_ID(0x8182U) | CID_FLAG) -#define CID_CSCANRATECONV (CID_ID(0x8183U) | CID_FLAG) -#define CID_CSCANRATECONVEXT (CID_ID(0x8184U) | CID_FLAG) -#define CID_CSHARPENH (CID_ID(0x8185U) | CID_FLAG) -#define CID_CSHARPENHEXT (CID_ID(0x8186U) | CID_FLAG) -#define CID_CSHARPMEAS (CID_ID(0x8187U) | CID_FLAG) -#define CID_CSHARPMEASEXT (CID_ID(0x8188U) | CID_FLAG) -#define CID_CSYNCTAG (CID_ID(0x8189U) | CID_FLAG) -#define CID_CUVBWDETEXT (CID_ID(0x818aU) | CID_FLAG) -#define CID_CVBISLICE (CID_ID(0x818bU) | CID_FLAG) -#define CID_CVFEAT (CID_ID(0x818cU) | CID_FLAG) -#define CID_CVFEAT2 (CID_ID(0x818dU) | CID_FLAG) -#define CID_CVIPXRAY (CID_ID(0x818eU) | CID_FLAG) -#define CID_CVIPXRAYDITHER (CID_ID(0x818fU) | CID_FLAG) -#define CID_CVMIX (CID_ID(0x8190U) | CID_FLAG) -#define CID_CVTRSCALEEXT (CID_ID(0x8191U) | CID_FLAG) -#define CID_CVTRANTIAGING (CID_ID(0x8192U) | CID_FLAG) -#define CID_CVTRFADEVCP (CID_ID(0x8193U) | CID_FLAG) -#define CID_CVTRSCALEMBSVCP (CID_ID(0x8194U) | CID_FLAG) -#define CID_CVTRSTROBEMBS (CID_ID(0x8195U) | CID_FLAG) -#define CID_NM_UTILS (CID_ID(0x8196U) | CID_FLAG) -#define CID_VSEQSCHEDENGINE (CID_ID(0x8197U) | CID_FLAG) -#define CID_VCPSCHEDENGINE (CID_ID(0x8198U) | CID_FLAG) -#define CID_VGENTEST (CID_ID(0x8199U) | CID_FLAG) -#define CID_VMENU (CID_ID(0x819aU) | CID_FLAG) -#define CID_VPROCCOMMON (CID_ID(0x819bU) | CID_FLAG) -#define CID_VPROCTV (CID_ID(0x819cU) | CID_FLAG) -#define CID_VPROCTV505E (CID_ID(0x819dU) | CID_FLAG) -#define CID_SCHEDENGINE (CID_ID(0x819eU) | CID_FLAG) -#define CID_VSLNMCOMMON (CID_ID(0x819fU) | CID_FLAG) -#define CID_VSLVCAPVIP (CID_ID(0x81a0U) | CID_FLAG) -#define CID_VSLVCAPVIPVBI (CID_ID(0x81a1U) | CID_FLAG) -#define CID_VSLVINCONVERT (CID_ID(0x81a2U) | CID_FLAG) -#define CID_VSLIOSYNC (CID_ID(0x81a3U) | CID_FLAG) -#define CID_VSLVRENDVCP (CID_ID(0x81a4U) | CID_FLAG) -#define CID_VSLVRENDVCPVBI (CID_ID(0x81a5U) | CID_FLAG) -#define CID_VSLSYNCTAG (CID_ID(0x81a6U) | CID_FLAG) -#define CID_VSLVTRANSMBS (CID_ID(0x81a7U) | CID_FLAG) -#define CID_VSLVTRANSNM (CID_ID(0x81a8U) | CID_FLAG) -#define CID_VSLVTRANSQTNR (CID_ID(0x81a9U) | CID_FLAG) -#define CID_VSLVTRANSSWTNR (CID_ID(0x81aaU) | CID_FLAG) -#define CID_VTRANSSWTNR (CID_ID(0x81abU) | CID_FLAG) -#define CID_LL_DMA (CID_ID(0x81acU) | CID_FLAG) -#define CID_BSL_PNX8550 (CID_ID(0x81adU) | CID_FLAG) -#define CID_BSL_PNX1500 (CID_ID(0x81aeU) | CID_FLAG) -#define CID_BSL_NULL (CID_ID(0x81afU) | CID_FLAG) -#define CID_BSL_PNX2015 (CID_ID(0x81b0U) | CID_FLAG) -#define CID_HW_SCALER7136 (CID_ID(0x81b1U) | CID_FLAG) -#define CID_SPI_IP3409 (CID_ID(0x81b2U) | CID_FLAG) -#define CID_SPI_3409 (CID_ID(0x81b3U) | CID_FLAG) -#define CID_SPISD_3409 (CID_ID(0x81b4U) | CID_FLAG) -#define CID_CONNMGRMP4RTPPLAYER (CID_ID(0x81b5U) | CID_FLAG) -#define CID_DL_NANDFLASH2 (CID_ID(0x81b6U) | CID_FLAG) -#define CID_HW_HOSTIF (CID_ID(0x81b7U) | CID_FLAG) -#define CID_LL_HOSTIF (CID_ID(0x81b8U) | CID_FLAG) -#define CID_LL_MJPEG (CID_ID(0x81b9U) | CID_FLAG) -#define CID_HW_SENSORIF (CID_ID(0x81baU) | CID_FLAG) -#define CID_LL_SENSORIF (CID_ID(0x81bbU) | CID_FLAG) -#define CID_HW_ECSP (CID_ID(0x81bcU) | CID_FLAG) -#define CID_LL_ECSP (CID_ID(0x81bdU) | CID_FLAG) -#define CID_HW_DOWNSCALER (CID_ID(0x81beU) | CID_FLAG) -#define CID_LL_DOWNSCALER (CID_ID(0x81bfU) | CID_FLAG) -#define CID_HW_UPSCALER (CID_ID(0x81c0U) | CID_FLAG) -#define CID_LL_UPSCALER (CID_ID(0x81c1U) | CID_FLAG) -#define CID_HW_JITTEREX (CID_ID(0x81c2U) | CID_FLAG) -#define CID_LL_JITTEREX (CID_ID(0x81c3U) | CID_FLAG) -#define CID_HW_NOISERED (CID_ID(0x81c4U) | CID_FLAG) -#define CID_LL_NOISERED (CID_ID(0x81c5U) | CID_FLAG) -#define CID_HW_JPEGENCODER (CID_ID(0x81c6U) | CID_FLAG) -#define CID_LL_JPEGENCODER (CID_ID(0x81c7U) | CID_FLAG) -#define CID_HW_FLASHLIGHT (CID_ID(0x81c8U) | CID_FLAG) -#define CID_LL_FLASHLIGHT (CID_ID(0x81c9U) | CID_FLAG) -#define CID_HW_TVCONVERTER (CID_ID(0x81caU) | CID_FLAG) -#define CID_LL_TVCONVERTER (CID_ID(0x81cbU) | CID_FLAG) -#define CID_HW_DVDOMATRIX (CID_ID(0x81ccU) | CID_FLAG) -#define CID_LL_DVDOMATRIX (CID_ID(0x81cdU) | CID_FLAG) -#define CID_HW_CLCD (CID_ID(0x81ceU) | CID_FLAG) -#define CID_LL_CLCD (CID_ID(0x81cfU) | CID_FLAG) -#define CID_HW_VDE (CID_ID(0x81d0U) | CID_FLAG) -#define CID_LL_VDE (CID_ID(0x81d1U) | CID_FLAG) -#define CID_HW_MCSPI (CID_ID(0x81d2U) | CID_FLAG) -#define CID_LL_MCSPI (CID_ID(0x81d3U) | CID_FLAG) -#define CID_HW_PWM (CID_ID(0x81d4U) | CID_FLAG) -#define CID_LL_PWM (CID_ID(0x81d5U) | CID_FLAG) -#define CID_OSAL_NXM (CID_ID(0x81d6U) | CID_FLAG) -#define CID_MEMPROF (CID_ID(0x81d7U) | CID_FLAG) -#define CID_ALCONSTRETCH (CID_ID(0x81d8U) | CID_FLAG) -#define CID_AUTOFOCUS (CID_ID(0x81d9U) | CID_FLAG) -#define CID_LL_DVDO2DTL (CID_ID(0x81daU) | CID_FLAG) -#define CID_HW_DVDO2DTL (CID_ID(0x81dbU) | CID_FLAG) -#define CID_LL_DTL2DVDO (CID_ID(0x81dcU) | CID_FLAG) -#define CID_HW_DTL2DVDO (CID_ID(0x81ddU) | CID_FLAG) -#define CID_LL_COLORMATRIX (CID_ID(0x81deU) | CID_FLAG) -#define CID_HW_COLORMATRIX (CID_ID(0x81dfU) | CID_FLAG) -#define CID_UHSPDIFOUT_ASYSATV (CID_ID(0x81e0U) | CID_FLAG) -#define CID_DL_NANDFLASH1 (CID_ID(0x81e1U) | CID_FLAG) -#define CID_NANDBOOTFFS (CID_ID(0x81e2U) | CID_FLAG) -#define CID_CONNMGR_APROCTV (CID_ID(0x81e3U) | CID_FLAG) -#define CID_CONNMGRSTILLPLAYER (CID_ID(0x81e4U) | CID_FLAG) -#define CID_CONNMGRAUDIOPLAYER (CID_ID(0x81e5U) | CID_FLAG) -#define CID_DCDIP9028 (CID_ID(0x81e6U) | CID_FLAG) -#define CID_CURLSRC_AUDIO (CID_ID(0x81e7U) | CID_FLAG) -#define CID_CONNMGRAVIMP4PLAYER (CID_ID(0x81e8U) | CID_FLAG) -#define CID_AUDIOVIDEOSYNC (CID_ID(0x81e9U) | CID_FLAG) -#define CID_PACKETLIST (CID_ID(0x81eaU) | CID_FLAG) -#define CID_ASYNCSINK (CID_ID(0x81ebU) | CID_FLAG) -#define CID_VSYNCSINK (CID_ID(0x81ecU) | CID_FLAG) -#define CID_XSYNCSINK (CID_ID(0x81edU) | CID_FLAG) -#define CID_PCIEXP (CID_ID(0x81eeU) | CID_FLAG) -#define CID_SOD_KERNEL (CID_ID(0x81efU) | CID_FLAG) -#define CID_SOD_EMULATE (CID_ID(0x81f0U) | CID_FLAG) -#define CID_SOD_MGR (CID_ID(0x81f1U) | CID_FLAG) -#define CID_NANDPARTTABLE (CID_ID(0x81f2U) | CID_FLAG) -#define CID_HW_AUDIO7136 (CID_ID(0x81f3U) | CID_FLAG) -#define CID_SPI3409 (CID_ID(0x81f4U) | CID_FLAG) -#define CID_DCSS_MATH (CID_ID(0x81f5U) | CID_FLAG) -#define CID_DCSS_LIT_CSD (CID_ID(0x81f6U) | CID_FLAG) -#define CID_DCSS_LIT_M (CID_ID(0x81f7U) | CID_FLAG) -#define CID_ADT (CID_ID(0x81f8U) | CID_FLAG) -#define CID_ACS (CID_ID(0x81f9U) | CID_FLAG) -#define CID_ACB (CID_ID(0x81faU) | CID_FLAG) -#define CID_ACL (CID_ID(0x81fbU) | CID_FLAG) -#define CID_AVEPP (CID_ID(0x81fcU) | CID_FLAG) -#define CID_UDSSIC (CID_ID(0x81fdU) | CID_FLAG) -#define CID_PROXYI2C (CID_ID(0x81feU) | CID_FLAG) -#define CID_PL081DMA (CID_ID(0x81feU) | CID_FLAG) -#define CID_DD_CPIPE (CID_ID(0x81ffU) | CID_FLAG) -#define CID_DD_MBVP (CID_ID(0x8200U) | CID_FLAG) -#define CID_CARENDAOUT (CID_ID(0x8201U) | CID_FLAG) -#define CID_CADIGAIN (CID_ID(0x8202U) | CID_FLAG) -#define CID_CONNMGR_TV506E (CID_ID(0x8203U) | CID_FLAG) -#define CID_ASYNCHANDLER (CID_ID(0x8204U) | CID_FLAG) -#define CID_COMP_M4VENCPSC (CID_ID(0x8205U) | CID_FLAG) -#define CID_CONNMGRNETSCHEMECONFIG (CID_ID(0x8206U) | CID_FLAG) -#define CID_CARACASSPIAHB (CID_ID(0x8207U) | CID_FLAG) -#define CID_COMP_ADECLPCM (CID_ID(0x8208U) | CID_FLAG) -#define CID_CDIGADEC_MULTISTD (CID_ID(0x8209U) | CID_FLAG) -#define CID_ADB (CID_ID(0x820aU) | CID_FLAG) -#define CID_ADR (CID_ID(0x820bU) | CID_FLAG) -#define CID_AGN (CID_ID(0x820cU) | CID_FLAG) -#define CID_ANT (CID_ID(0x820dU) | CID_FLAG) -#define CID_APP (CID_ID(0x820eU) | CID_FLAG) -#define CID_ASC (CID_ID(0x820fU) | CID_FLAG) -#define CID_ASM (CID_ID(0x8210U) | CID_FLAG) -#define CID_ASS (CID_ID(0x8211U) | CID_FLAG) -#define CID_ATP (CID_ID(0x8212U) | CID_FLAG) -#define CID_VDEC_MJPEG (CID_ID(0x8213U) | CID_FLAG) -#define CID_MOV_READ (CID_ID(0x8214U) | CID_FLAG) -#define CID_EWIFI (CID_ID(0x8215U) | CID_FLAG) -#define CID_SCR (CID_ID(0x8216U) | CID_FLAG) -#define CID_AEPP (CID_ID(0x8217U) | CID_FLAG) -#define CID_VEPP (CID_ID(0x8218U) | CID_FLAG) -#define CID_MP3ENC (CID_ID(0x8219U) | CID_FLAG) -#define CID_TDFLOADER (CID_ID(0x821aU) | CID_FLAG) -#define CID_VIOSYNC (CID_ID(0x821bU) | CID_FLAG) -#define CID_STBDP (CID_ID(0x821cU) | CID_FLAG) -#define CID_STBEVENT (CID_ID(0x821dU) | CID_FLAG) -#define CID_STBFB (CID_ID(0x821eU) | CID_FLAG) -#define CID_STBDEMUX (CID_ID(0x821fU) | CID_FLAG) -#define CID_STBFILE (CID_ID(0x8220U) | CID_FLAG) -#define CID_STBGPIO (CID_ID(0x8221U) | CID_FLAG) -#define CID_STBI2C (CID_ID(0x8222U) | CID_FLAG) -#define CID_STBMMIOBUS (CID_ID(0x8223U) | CID_FLAG) -#define CID_STBPROC (CID_ID(0x8224U) | CID_FLAG) -#define CID_STBROOT (CID_ID(0x8225U) | CID_FLAG) -#define CID_STBRPC (CID_ID(0x8226U) | CID_FLAG) -#define CID_STBRTC (CID_ID(0x8227U) | CID_FLAG) -#define CID_STBTMLOAD (CID_ID(0x8228U) | CID_FLAG) -#define CID_STBSTREAMINGSYSTEM (CID_ID(0x8229U) | CID_FLAG) -#define CID_STBVIDEOSCALER (CID_ID(0x822aU) | CID_FLAG) -#define CID_STBANALOGBACKEND (CID_ID(0x822bU) | CID_FLAG) -#define CID_STBVIDEORENDERER (CID_ID(0x822cU) | CID_FLAG) -#define CID_DRV_MMU (CID_ID(0x822dU) | CID_FLAG) -#define CID_COMP_AINJECTOR (CID_ID(0x822eU) | CID_FLAG) -#define CID_VDEC_ANA (CID_ID(0x822fU) | CID_FLAG) -#define CID_STBAC3AUD (CID_ID(0x8230U) | CID_FLAG) -#define CID_STBAUDIO (CID_ID(0x8231U) | CID_FLAG) -#define CID_PHMODARM11WRAPPER (CID_ID(0x8232U) | CID_FLAG) -#define CID_GPIO_IP4004 (CID_ID(0x8233U) | CID_FLAG) -#define CID_TMCADIGSPDIFIN (CID_ID(0x8234U) | CID_FLAG) -#define CID_TMCARENDSPDIFOUT (CID_ID(0x8235U) | CID_FLAG) -#define CID_TMCPLFINSTAIN (CID_ID(0x8236U) | CID_FLAG) -#define CID_TMCPLFINSTAOUT (CID_ID(0x8237U) | CID_FLAG) -#define CID_TMCSPDIFIN (CID_ID(0x8238U) | CID_FLAG) -#define CID_TMCSPDIFOUT (CID_ID(0x8239U) | CID_FLAG) -#define CID_BSL_HDMIRX (CID_ID(0x823aU) | CID_FLAG) -#define CID_AACPENC (CID_ID(0x823bU) | CID_FLAG) -#define CID_DL_HDMIRX (CID_ID(0x823cU) | CID_FLAG) -#define CID_APP_HDMIRX (CID_ID(0x823dU) | CID_FLAG) -#define CID_INFRA_HDMI (CID_ID(0x823eU) | CID_FLAG) -#define CID_DL_HDMICEC (CID_ID(0x823fU) | CID_FLAG) -#define CID_BSL_HDMITX (CID_ID(0x8240U) | CID_FLAG) -#define CID_DL_HDMITX (CID_ID(0x8241U) | CID_FLAG) -#define CID_APP_HDMITX (CID_ID(0x8242U) | CID_FLAG) - -/*define CID_UART (CID_ID(0x80a5U) | CID_FLAG) already defined*/ -#define CID_CHIP (CID_ID(0x815bU) | CID_FLAG) - -#define CID_RESERVED (CID_ID(0xff80U) | CID_FLAG) -/* ************************************************************************** */ -/* Component Id's reserved for external organizations */ -/* */ -/* 0xff80 thru 0xffbf */ -/* Range of component ID's is reserved for the use of parties outside of */ -/* Philips that wish to use component ID's privately. */ -/* If a component is going to be exchanged in the 'PS Ecosystem', then a */ -/* public component ID should be registered with MoReUse. */ -/* */ -/* Range to be used by CE Television Systems */ -/* 0xffc0 thru 0xffff */ -/* */ -/* ************************************************************************** */ - -/* -------------------------------------------------------------------------- */ -/* */ -/* Component ID types are defined as unsigned 32 bit integers (UInt32) */ -/* Interface ID types are defined as unsigned 32 bit integers (UInt32) */ -/* */ -/* -------------------------------------------------------------------------- */ - -/* -------------------------------------------------------------------------- */ -/* */ -/* Obsolete Component ID values */ -/* */ -/* -------------------------------------------------------------------------- */ - -/* -------------------------------------------------------------------------- */ -/* Component Class definitions (bits 31:28, 4 bits) */ -/* NOTE: A class of 0x0 must not be defined to ensure that the overall 32 bit */ -/* component ID/status combination is always non-0 (no TM_OK conflict). */ -/* -------------------------------------------------------------------------- */ -#define CID_CLASS_BITSHIFT 28 -#define CID_CLASS_BITMASK (0xFU << CID_CLASS_BITSHIFT) -#define CID_GET_CLASS(compId) ((compId & CID_CLASS_BITMASK) >> CID_CLASS_BITSHIFT) - -#define CID_CLASS_NONE (0x1U << CID_CLASS_BITSHIFT) -#define CID_CLASS_VIDEO (0x2U << CID_CLASS_BITSHIFT) -#define CID_CLASS_AUDIO (0x3U << CID_CLASS_BITSHIFT) -#define CID_CLASS_GRAPHICS (0x4U << CID_CLASS_BITSHIFT) -#define CID_CLASS_BUS (0x5U << CID_CLASS_BITSHIFT) -#define CID_CLASS_INFRASTR (0x6U << CID_CLASS_BITSHIFT) - -#define CID_CLASS_CUSTOMER (0xFU << CID_CLASS_BITSHIFT) - -/* -------------------------------------------------------------------------- */ -/* Component Type definitions (bits 27:24, 4 bits) */ -/* -------------------------------------------------------------------------- */ -#define CID_TYPE_BITSHIFT 24 -#define CID_TYPE_BITMASK (0xFU << CID_TYPE_BITSHIFT) -#define CID_GET_TYPE(compId) ((compId & CID_TYPE_BITMASK) >> CID_TYPE_BITSHIFT) - -#define CID_TYPE_NONE (0x0U << CID_TYPE_BITSHIFT) -#define CID_TYPE_SOURCE (0x1U << CID_TYPE_BITSHIFT) -#define CID_TYPE_SINK (0x2U << CID_TYPE_BITSHIFT) -#define CID_TYPE_ENCODER (0x3U << CID_TYPE_BITSHIFT) -#define CID_TYPE_DECODER (0x4U << CID_TYPE_BITSHIFT) -#define CID_TYPE_MUX (0x5U << CID_TYPE_BITSHIFT) -#define CID_TYPE_DEMUX (0x6U << CID_TYPE_BITSHIFT) -#define CID_TYPE_DIGITIZER (0x7U << CID_TYPE_BITSHIFT) -#define CID_TYPE_RENDERER (0x8U << CID_TYPE_BITSHIFT) -#define CID_TYPE_FILTER (0x9U << CID_TYPE_BITSHIFT) -#define CID_TYPE_CONTROL (0xAU << CID_TYPE_BITSHIFT) -#define CID_TYPE_DATABASE (0xBU << CID_TYPE_BITSHIFT) -#define CID_TYPE_SUBSYSTEM (0xCU << CID_TYPE_BITSHIFT) -#define CID_TYPE_CUSTOMER (0xFU << CID_TYPE_BITSHIFT) - -/* -------------------------------------------------------------------------- */ -/* Component Tag definitions (bits 23:16, 8 bits) */ -/* NOTE: Component tags are defined in groups, dependent on the class and */ -/* type. */ -/* -------------------------------------------------------------------------- */ -#define CID_TAG_BITSHIFT 16 -#define CID_TAG_BITMASK (0xFFU << CID_TAG_BITSHIFT) - -#define CID_TAG_NONE (0x00U << CID_TAG_BITSHIFT) - -#define CID_TAG_CUSTOMER (0xE0U << CID_TAG_BITSHIFT) - -#define TAG(number) ((number) << CID_TAG_BITSHIFT) - -/* -------------------------------------------------------------------------- */ -/* General Component Layer definitions (bits 15:12, 4 bits) */ -/* -------------------------------------------------------------------------- */ -#define CID_LAYER_BITSHIFT 12 -#define CID_LAYER_BITMASK (0xF << CID_LAYER_BITSHIFT) -#define CID_GET_LAYER(compId) ((compId & CID_LAYER_BITMASK) >> CID_LAYER_BITSHIFT) - -#define CID_LAYER_NONE (0x0U << CID_LAYER_BITSHIFT) -#define CID_LAYER_BTM (0x1U << CID_LAYER_BITSHIFT) -#define CID_LAYER_HWAPI (0x2U << CID_LAYER_BITSHIFT) -#define CID_LAYER_BSL (0x3U << CID_LAYER_BITSHIFT) -#define CID_LAYER_DEVLIB (0x4U << CID_LAYER_BITSHIFT) -#define CID_LAYER_TMAL (0x5U << CID_LAYER_BITSHIFT) -#define CID_LAYER_TMOL (0x6U << CID_LAYER_BITSHIFT) -#define CID_LAYER_TMNL (0xEU << CID_LAYER_BITSHIFT) - -/* -------------------------------------------------------------------------- */ -/* "new" i.e. after 2002-01-31 layer definitions */ -/* "New" Component Layers depend on the component type and class */ -/* So we can have an identical layer value for each type/class combination */ -/* In order not to break existing code that assumes that layers are unique, */ -/* we start new layers at 0x7 */ -/* -------------------------------------------------------------------------- */ - -/*------------------ CTYP_BUS_NOTYPE dependent layer definitions -------------*/ -#define CID_LAYER_UDS (0x7U << CID_LAYER_BITSHIFT) /* USB Device Stack */ -#define CID_LAYER_UHS (0x8U << CID_LAYER_BITSHIFT) /* USB Host stack */ -#define CID_LAYER_UOTG (0x9U << CID_LAYER_BITSHIFT) /* USB OTG stack */ - -#define CID_LAYER_CUSTOMER (0xFU << CID_LAYER_BITSHIFT) /* Customer Defined */ - -/* -------------------------------------------------------------------------- */ -/* Component Identifier definitions (bits 31:12, 20 bits) */ -/* NOTE: These DVP platform component identifiers are designed to be unique */ -/* within the system. The component identifier encompasses the class */ -/* (CID_CLASS_XXX), type (CID_TYPE_XXX), tag, and layer (CID_LAYER_XXX) */ -/* fields to form the unique component identifier. This allows any */ -/* error/progress status value to be identified as to its original */ -/* source, whether or not the source component s header file is present.*/ -/* The standard error/progress status definitions should be used */ -/* whenever possible to ease status interpretation. No layer */ -/* information is defined at this point; it should be ORed into the API */ -/* status values defined in the APIs header file. */ -/* -------------------------------------------------------------------------- */ -#if (CID_LAYER_NONE != 0) -#error ERROR: DVP component identifiers require the layer type 'NONE' = 0 ! -#endif - -/* -------------------------------------------------------------------------- */ -/* Classless Types/Components (don t fit into other class categories) */ -/* -------------------------------------------------------------------------- */ -#define CTYP_NOCLASS_NOTYPE (CID_CLASS_NONE | CID_TYPE_NONE) -#define CTYP_NOCLASS_SOURCE (CID_CLASS_NONE | CID_TYPE_SOURCE) -#define CTYP_NOCLASS_SINK (CID_CLASS_NONE | CID_TYPE_SINK) -#define CTYP_NOCLASS_MUX (CID_CLASS_NONE | CID_TYPE_MUX) -#define CTYP_NOCLASS_DEMUX (CID_CLASS_NONE | CID_TYPE_DEMUX) -#define CTYP_NOCLASS_FILTER (CID_CLASS_NONE | CID_TYPE_FILTER) -#define CTYP_NOCLASS_CONTROL (CID_CLASS_NONE | CID_TYPE_CONTROL) -#define CTYP_NOCLASS_DATABASE (CID_CLASS_NONE | CID_TYPE_DATABASE) -#define CTYP_NOCLASS_SUBSYS (CID_CLASS_NONE | CID_TYPE_SUBSYSTEM) - -#define CID_COMP_CLOCK (TAG(0x01U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_DMA (TAG(0x02U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_PIC (TAG(0x03U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_NORFLASH (TAG(0x04U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_NANDFLASH (TAG(0x05U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_GPIO (TAG(0x06U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_SMARTCARD (TAG(0x07U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_UDMA (TAG(0x08U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_DSP (TAG(0x09U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_TIMER (TAG(0x0AU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_TSDMA (TAG(0x0BU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_MMIARB (TAG(0x0CU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_EEPROM (TAG(0x0DU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_PARPORT (TAG(0x0EU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_VSS (TAG(0x0FU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_TSIO (TAG(0x10U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_DBG (TAG(0x11U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_TTE (TAG(0x12U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_AVPROP (TAG(0x13U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_SERIAL_RAM (TAG(0x14U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_SMARTMEDIA (TAG(0x15U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_COMPACT_FLASH (TAG(0x16U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_CI (TAG(0x17U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_INT_ALARM (TAG(0x18U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_TASK_ALARM (TAG(0x19U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_XDMA (TAG(0x1AU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_ICC (TAG(0x1BU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_CONNMGR (TAG(0x1CU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_CONNMGRVSYSTV (TAG(0x1DU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_VBISLICERVSYSTV (TAG(0x1EU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_VMIXVSYSTV (TAG(0x1FU) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_NTF (TAG(0x20U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_NTY CID_COMP_NTF /* legacy */ -#define CID_COMP_FATERR (TAG(0x21U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_DVBTDEMOD (TAG(0x22U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_HYBRIDTUNER (TAG(0x23U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_VLD (TAG(0x24U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_GIC (TAG(0x25U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_WEB (TAG(0x26U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_ANAEPGDB (TAG(0x27U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_HWSEM (TAG(0x28U) | CTYP_NOCLASS_NOTYPE) -#define CID_COMP_MMON (TAG(0x29U) | CTYP_NOCLASS_NOTYPE) - -#define CID_COMP_FREAD (TAG(0x01U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_CDRREAD (TAG(0x02U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_VSB (TAG(0x03U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_ANALOGTVTUNER (TAG(0x04U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_TPINMPEG2 (TAG(0x05U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_DREAD (TAG(0x06U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_TREAD (TAG(0x07U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_RTC (TAG(0x08U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_TOUCHC (TAG(0x09U) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_KEYPAD (TAG(0x0AU) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_ADC (TAG(0x0BU) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_READLIST (TAG(0x0CU) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_FROMDISK (TAG(0x0DU) | CTYP_NOCLASS_SOURCE) -#define CID_COMP_SOURCE (TAG(0x0EU) | CTYP_NOCLASS_SOURCE) - -#define CID_COMP_FWRITE (TAG(0x01U) | CTYP_NOCLASS_SINK) -#define CID_COMP_CDWRITE (TAG(0x02U) | CTYP_NOCLASS_SINK) -#define CID_COMP_CHARLCD (TAG(0x03U) | CTYP_NOCLASS_SINK) -#define CID_COMP_PWM (TAG(0x04U) | CTYP_NOCLASS_SINK) -#define CID_COMP_DAC (TAG(0x05U) | CTYP_NOCLASS_SINK) -#define CID_COMP_TSDMAINJECTOR (TAG(0x06U) | CTYP_NOCLASS_SINK) -#define CID_COMP_TODISK (TAG(0x07U) | CTYP_NOCLASS_SINK) - -#define CID_COMP_MUXMPEGPS (TAG(0x01U) | CTYP_NOCLASS_MUX) -#define CID_COMP_MUXMPEG (TAG(0x02U) | CTYP_NOCLASS_MUX) - -#define CID_COMP_DEMUXMPEGTS (TAG(0x01U) | CTYP_NOCLASS_DEMUX) -#define CID_COMP_DEMUXMPEGPS (TAG(0x02U) | CTYP_NOCLASS_DEMUX) -#define CID_COMP_DEMUXDV (TAG(0x03U) | CTYP_NOCLASS_DEMUX) - -#define CID_COMP_COPYIO (TAG(0x01U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_COPYINPLACE (TAG(0x02U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_UART (TAG(0x03U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_SSI (TAG(0x04U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_MODEMV34 (TAG(0x05U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_MODEMV42 (TAG(0x06U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_HTMLPARSER (TAG(0x07U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_VMSP (TAG(0x08U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_X (TAG(0x09U) | CTYP_NOCLASS_FILTER) -#define CID_COMP_TXTSUBTDECEBU (TAG(0x0AU) | CTYP_NOCLASS_FILTER) -#define CID_COMP_CPI (TAG(0x0BU) | CTYP_NOCLASS_FILTER) -#define CID_COMP_TRICK (TAG(0x0CU) | CTYP_NOCLASS_FILTER) -#define CID_COMP_FWRITEFREAD (TAG(0x0DU) | CTYP_NOCLASS_FILTER) - -#define CID_COMP_REMCTL5 (TAG(0x01U) | CTYP_NOCLASS_CONTROL) -#define CID_COMP_INFRARED (TAG(0x02U) | CTYP_NOCLASS_CONTROL) - -#define CID_COMP_PSIP (TAG(0x01U) | CTYP_NOCLASS_DATABASE) -#define CID_COMP_IDE (TAG(0x02U) | CTYP_NOCLASS_DATABASE) -#define CID_COMP_DISKSCHED (TAG(0x03U) | CTYP_NOCLASS_DATABASE) -#define CID_COMP_AVFS (TAG(0x04U) | CTYP_NOCLASS_DATABASE) -#define CID_COMP_MDB (TAG(0x05U) | CTYP_NOCLASS_DATABASE) -#define CID_COMP_ATAPI_CMDS (TAG(0x06U) | CTYP_NOCLASS_DATABASE) - -#define CID_COMP_IRDMMPEG (TAG(0x01U) | CTYP_NOCLASS_SUBSYS) -#define CID_COMP_STORSYS (TAG(0x02U) | CTYP_NOCLASS_SUBSYS) -#define CID_COMP_PMU (TAG(0x03U) | CTYP_NOCLASS_SUBSYS) - -/* -------------------------------------------------------------------------- */ -/* Video Class Types/Components (video types handle video/graphics data) */ -/* -------------------------------------------------------------------------- */ -#define CTYP_VIDEO_SINK (CID_CLASS_VIDEO | CID_TYPE_SINK) -#define CTYP_VIDEO_SOURCE (CID_CLASS_VIDEO | CID_TYPE_SOURCE) -#define CTYP_VIDEO_ENCODER (CID_CLASS_VIDEO | CID_TYPE_ENCODER) -#define CTYP_VIDEO_DECODER (CID_CLASS_VIDEO | CID_TYPE_DECODER) -#define CTYP_VIDEO_DIGITIZER (CID_CLASS_VIDEO | CID_TYPE_DIGITIZER) -#define CTYP_VIDEO_RENDERER (CID_CLASS_VIDEO | CID_TYPE_RENDERER) -#define CTYP_VIDEO_FILTER (CID_CLASS_VIDEO | CID_TYPE_FILTER) -#define CTYP_VIDEO_SUBSYS (CID_CLASS_VIDEO | CID_TYPE_SUBSYSTEM) - -#define CID_COMP_LCD (TAG(0x01U) | CTYP_VIDEO_SINK) - -#define CID_COMP_VCAPVI (TAG(0x01U) | CTYP_VIDEO_SOURCE) -#define CID_COMP_VIP (TAG(0x02U) | CTYP_VIDEO_SOURCE) -#define CID_COMP_VI (TAG(0x03U) | CTYP_VIDEO_SOURCE) -#define CID_COMP_VSLICER (TAG(0x04U) | CTYP_VIDEO_SOURCE) -#define CID_COMP_FBREAD (TAG(0x05U) | CTYP_VIDEO_SOURCE) -#define CID_COMP_QVI (TAG(0x06U) | CTYP_VIDEO_SOURCE) -#define CID_COMP_CAMERA (TAG(0x07U) | CTYP_VIDEO_SOURCE) -#define CID_COMP_CAM_SENSOR (TAG(0x08U) | CTYP_VIDEO_SOURCE) - -#define CID_COMP_VENCM1 (TAG(0x01U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_VENCM2 (TAG(0x02U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_VENCMJ (TAG(0x03U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_VENCH263 (TAG(0x04U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_VENCH261 (TAG(0x05U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_M4VENC (TAG(0x06U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_M4VENCME (TAG(0x07U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_M4VENCTC (TAG(0x08U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_M4VENCBSG (TAG(0x09U) | CTYP_VIDEO_ENCODER) -#define CID_COMP_M4VENCJPEG (TAG(0x0AU) | CTYP_VIDEO_ENCODER) - -#define CID_COMP_VDECM1 (TAG(0x01U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECM2 (TAG(0x02U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECMPEG (TAG(0x03U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECMJ (TAG(0x04U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECSUBPICSVCD (TAG(0x05U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECH263 (TAG(0x06U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECH261 (TAG(0x07U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDEC (TAG(0x08U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECSUBPICDVD (TAG(0x09U) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECSUBPICBMPDVD (TAG(0x0AU) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECSUBPICRENDDVD (TAG(0x0BU) | CTYP_VIDEO_DECODER) -#define CID_COMP_M4PP (TAG(0x0CU) | CTYP_VIDEO_DECODER) -#define CID_COMP_M4MC (TAG(0x0DU) | CTYP_VIDEO_DECODER) -#define CID_COMP_M4CSC (TAG(0x0EU) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECTXT (TAG(0x0FU) | CTYP_VIDEO_DECODER) -#define CID_COMP_VDECDV (TAG(0x10U) | CTYP_VIDEO_DECODER) -#define CID_COMP_BACKANIM (TAG(0x11U) | CTYP_VIDEO_DECODER) - -#define CID_COMP_VDIG (TAG(0x01U) | CTYP_VIDEO_DIGITIZER) -#define CID_COMP_VDIGVIRAW (TAG(0x02U) | CTYP_VIDEO_DIGITIZER) -#define CID_COMP_VDIG_EXT (TAG(0x03U) | CTYP_VIDEO_DIGITIZER) -#define CID_COMP_VDIG_VBI (TAG(0x04U) | CTYP_VIDEO_DIGITIZER) -#define CID_COMP_VDIG_EXT_VBI (TAG(0x05U) | CTYP_VIDEO_DIGITIZER) - -#define CID_COMP_VREND (TAG(0x01U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_HDVO (TAG(0x02U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_VRENDGFXVO (TAG(0x03U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_AICP (TAG(0x04U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_VRENDVORAW (TAG(0x05U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_VO (TAG(0x06U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_VRENDVOICP (TAG(0x07U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_VMIX (TAG(0x08U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_QVCP (TAG(0x09U) | CTYP_VIDEO_RENDERER) -#define CID_COMP_VREND_EXT (TAG(0x0AU) | CTYP_VIDEO_RENDERER) -#define CID_COMP_VENCANA (TAG(0x0BU) | CTYP_VIDEO_RENDERER) -#define CID_COMP_QVO (TAG(0x0CU) | CTYP_VIDEO_RENDERER) - -#define CID_COMP_MBS (TAG(0x01U) | CTYP_VIDEO_FILTER) -#define CID_COMP_VTRANS (TAG(0x02U) | CTYP_VIDEO_FILTER) -#define CID_COMP_QNM (TAG(0x03U) | CTYP_VIDEO_FILTER) -#define CID_COMP_ICP (TAG(0x04U) | CTYP_VIDEO_FILTER) -#define CID_COMP_VTRANSNM (TAG(0x05U) | CTYP_VIDEO_FILTER) -#define CID_COMP_QFD (TAG(0x06U) | CTYP_VIDEO_FILTER) -#define CID_COMP_VTRANSDVD (TAG(0x07U) | CTYP_VIDEO_FILTER) -#define CID_COMP_VTRANSCRYSTAL (TAG(0x08U) | CTYP_VIDEO_FILTER) -#define CID_COMP_VTRANSUD (TAG(0x09U) | CTYP_VIDEO_FILTER) -/*#define CID_COMP_QTNR (TAG(0x0AU) | CTYP_VIDEO_FILTER) Removed v17: Replaced with CID_VTRANS_QTNR */ - -#define CID_COMP_VSYSMT3 (TAG(0x01U) | CTYP_VIDEO_SUBSYS) -#define CID_COMP_VSYSSTB (TAG(0x01U) | CTYP_VIDEO_SUBSYS) -#define CID_COMP_DVDVIDSYS (TAG(0x02U) | CTYP_VIDEO_SUBSYS) -#define CID_COMP_VDECUD (TAG(0x03U) | CTYP_VIDEO_SUBSYS) -#define CID_COMP_VIDSYS (TAG(0x04U) | CTYP_VIDEO_SUBSYS) -#define CID_COMP_VSYSTV (TAG(0x05U) | CTYP_VIDEO_SUBSYS) - -/* -------------------------------------------------------------------------- */ -/* Audio Class Types/Components (audio types primarily handle audio data) */ -/* -------------------------------------------------------------------------- */ -#define CTYP_AUDIO_NOTYPE (CID_CLASS_AUDIO | CID_TYPE_NONE) -#define CTYP_AUDIO_SINK (CID_CLASS_AUDIO | CID_TYPE_SINK) -#define CTYP_AUDIO_SOURCE (CID_CLASS_AUDIO | CID_TYPE_SOURCE) -#define CTYP_AUDIO_ENCODER (CID_CLASS_AUDIO | CID_TYPE_ENCODER) -#define CTYP_AUDIO_DECODER (CID_CLASS_AUDIO | CID_TYPE_DECODER) -#define CTYP_AUDIO_DIGITIZER (CID_CLASS_AUDIO | CID_TYPE_DIGITIZER) -#define CTYP_AUDIO_RENDERER (CID_CLASS_AUDIO | CID_TYPE_RENDERER) -#define CTYP_AUDIO_FILTER (CID_CLASS_AUDIO | CID_TYPE_FILTER) -#define CTYP_AUDIO_SUBSYS (CID_CLASS_AUDIO | CID_TYPE_SUBSYSTEM) - -#define CID_COMP_CODEC (TAG(0x01U) | CTYP_AUDIO_NOTYPE) - -#define CID_COMP_SDAC (TAG(0x01U) | CTYP_AUDIO_SINK) - -#define CID_COMP_ADIGAI (TAG(0x01U) | CTYP_AUDIO_DIGITIZER) -#define CID_COMP_ADIGSPDIF (TAG(0x02U) | CTYP_AUDIO_DIGITIZER) - -#define CID_COMP_ARENDAO (TAG(0x01U) | CTYP_AUDIO_RENDERER) -#define CID_COMP_ARENDSPDIF (TAG(0x02U) | CTYP_AUDIO_RENDERER) - -#define CID_COMP_NOISESEQ (TAG(0x03U) | CTYP_AUDIO_SOURCE) - -#define CID_COMP_AENCAC3 (TAG(0x01U) | CTYP_AUDIO_ENCODER) -#define CID_COMP_AENCMPEG1 (TAG(0x02U) | CTYP_AUDIO_ENCODER) -#define CID_COMP_AENCAAC (TAG(0x03U) | CTYP_AUDIO_ENCODER) -#define CID_COMP_AENCG723 (TAG(0x04U) | CTYP_AUDIO_ENCODER) -#define CID_COMP_AENCG728 (TAG(0x05U) | CTYP_AUDIO_ENCODER) -#define CID_COMP_AENCWMA (TAG(0x06U) | CTYP_AUDIO_ENCODER) -#define CID_COMP_AVENCMPEG (TAG(0x07U) | CTYP_AUDIO_ENCODER) -#define CID_COMP_AENCMP3 (TAG(0x08U) | CTYP_AUDIO_ENCODER) - -#define CID_COMP_ADECPROLOGIC (TAG(0x01U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECAC3 (TAG(0x02U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECMPEG1 (TAG(0x03U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECMP3 (TAG(0x04U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECAAC (TAG(0x05U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECG723 (TAG(0x06U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECG728 (TAG(0x07U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECWMA (TAG(0x08U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECTHRU (TAG(0x09U) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADEC (TAG(0x0AU) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECPCM (TAG(0x0BU) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECDV (TAG(0x0CU) | CTYP_AUDIO_DECODER) -#define CID_COMP_ADECDTS (TAG(0x0DU) | CTYP_AUDIO_DECODER) - -#define CID_COMP_ASPLIB (TAG(0x01U) | CTYP_AUDIO_FILTER) -#define CID_COMP_IIR (TAG(0x02U) | CTYP_AUDIO_FILTER) -#define CID_COMP_ASPEQ2 (TAG(0x03U) | CTYP_AUDIO_FILTER) -#define CID_COMP_ASPEQ5 (TAG(0x04U) | CTYP_AUDIO_FILTER) -#define CID_COMP_ASPBASSREDIR (TAG(0x05U) | CTYP_AUDIO_FILTER) -#define CID_COMP_ASPLAT2 (TAG(0x06U) | CTYP_AUDIO_FILTER) -#define CID_COMP_ASPPLUGIN (TAG(0x07U) | CTYP_AUDIO_FILTER) -#define CID_COMP_AMIXDTV (TAG(0x08U) | CTYP_AUDIO_FILTER) -#define CID_COMP_AMIXSIMPLE (TAG(0x09U) | CTYP_AUDIO_FILTER) -#define CID_COMP_AMIXSTB (TAG(0x0AU) | CTYP_AUDIO_FILTER) -#define CID_COMP_ASPEQ (TAG(0x0BU) | CTYP_AUDIO_FILTER) -#define CID_COMP_ATESTSIG (TAG(0x0CU) | CTYP_AUDIO_FILTER) -#define CID_COMP_APROC (TAG(0x0DU) | CTYP_AUDIO_FILTER) - -#define CID_COMP_AUDSUBSYS (TAG(0x01U) | CTYP_AUDIO_SUBSYS) -#define CID_COMP_AUDSYSSTB (TAG(0x02U) | CTYP_AUDIO_SUBSYS) -#define CID_COMP_AUDSYSDVD (TAG(0x03U) | CTYP_AUDIO_SUBSYS) -#define CID_COMP_MMC (TAG(0x04U) | CTYP_AUDIO_SUBSYS) -#define CID_COMP_COMP_MMC CID_COMP_MMC /* legacy */ -#define CID_COMP_ASYSATV (TAG(0x05U) | CTYP_AUDIO_SUBSYS) - -/* -------------------------------------------------------------------------- */ -/* Graphics Class Types/Components */ -/* -------------------------------------------------------------------------- */ -#define CTYP_GRAPHICS_RENDERER (CID_CLASS_GRAPHICS | CID_TYPE_SINK) - -#define CID_COMP_WM (TAG(0x01U) | CTYP_GRAPHICS_RENDERER) -#define CID_COMP_WIDGET (TAG(0x02U) | CTYP_GRAPHICS_RENDERER) -#define CID_COMP_OM (TAG(0x03U) | CTYP_GRAPHICS_RENDERER) -#define CID_COMP_HTMLRENDER (TAG(0x04U) | CTYP_GRAPHICS_RENDERER) -#define CID_COMP_VRENDEIA708 (TAG(0x05U) | CTYP_GRAPHICS_RENDERER) -#define CID_COMP_VRENDEIA608 (TAG(0x06U) | CTYP_GRAPHICS_RENDERER) - -#define CTYP_GRAPHICS_DRAW (CID_CLASS_GRAPHICS | CID_TYPE_NONE) - -#define CID_COMP_DRAW (TAG(0x10U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_DRAW_UT (TAG(0x11U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_DRAW_DE (TAG(0x12U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_DRAW_REF (TAG(0x13U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_DRAW_TMH (TAG(0x14U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_DRAW_TMT (TAG(0x15U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_DRAW_TMTH (TAG(0x16U) | CTYP_GRAPHICS_DRAW) - -#define CID_COMP_3D (TAG(0x30U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_JAWT (TAG(0x31U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_JINPUT (TAG(0x32U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_LWM (TAG(0x33U) | CTYP_GRAPHICS_DRAW) -#define CID_COMP_2D (TAG(0x34U) | CTYP_GRAPHICS_DRAW) - -/* -------------------------------------------------------------------------- */ -/* Bus Class Types/Components (busses connect hardware components together) */ -/* -------------------------------------------------------------------------- */ -#define CTYP_BUS_NOTYPE (CID_CLASS_BUS | CID_TYPE_NONE) - -#define CID_COMP_XIO (TAG(0x01U) | CTYP_BUS_NOTYPE) -#define CID_COMP_IIC (TAG(0x02U) | CTYP_BUS_NOTYPE) -#define CID_COMP_PCI (TAG(0x03U) | CTYP_BUS_NOTYPE) -#define CID_COMP_P1394 (TAG(0x04U) | CTYP_BUS_NOTYPE) -#define CID_COMP_ENET (TAG(0x05U) | CTYP_BUS_NOTYPE) -#define CID_COMP_ATA (TAG(0x06U) | CTYP_BUS_NOTYPE) -#define CID_COMP_CAN (TAG(0x07U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UCGDMA (TAG(0x08U) | CTYP_BUS_NOTYPE) -#define CID_COMP_I2S (TAG(0x09U) | CTYP_BUS_NOTYPE) -#define CID_COMP_SPI (TAG(0x0AU) | CTYP_BUS_NOTYPE) -#define CID_COMP_PCM (TAG(0x0BU) | CTYP_BUS_NOTYPE) -#define CID_COMP_L3 (TAG(0x0CU) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSPFL (TAG(0x0DU) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSRSL (TAG(0x0EU) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSMSBOT (TAG(0x0FU) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSMSCBI (TAG(0x10U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSAUDIO (TAG(0x11U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSHID (TAG(0x12U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSCDC (TAG(0x13U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSPRINTER (TAG(0x14U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSSCSI (TAG(0x15U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSMODEM (TAG(0x16U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UDSETHERNET (TAG(0x17U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UHSPFL (TAG(0x18U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UHSMS (TAG(0x19U) | CTYP_BUS_NOTYPE) -#define CID_COMP_UHSAUDIO (TAG(0x1AU) | CTYP_BUS_NOTYPE) -#define CID_COMP_UHSSCSI (TAG(0x1BU) | CTYP_BUS_NOTYPE) - -/* -------------------------------------------------------------------------- */ -/* Infrastructure Class Types/Components */ -/* -------------------------------------------------------------------------- */ -#define CTYP_INFRASTR_NOTYPE (CID_CLASS_INFRASTR | CID_TYPE_NONE) -#define CTYP_INFRASTR_DATABASE (CID_CLASS_INFRASTR | CID_TYPE_DATABASE) - -#define CID_COMP_OSAL (TAG(0x01U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_MML (TAG(0x02U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_TSSA_DEFAULTS (TAG(0x03U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_RPC (TAG(0x04U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_THI (TAG(0x05U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_REGISTRY (TAG(0x06U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_TMMAN (TAG(0x07U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_LDT (TAG(0x08U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_CPUCONN (TAG(0x09U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_COMMQUE (TAG(0x0AU) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_BSLMGR (TAG(0x0BU) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_CR (TAG(0x0CU) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_NODE (TAG(0x0DU) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_COM (TAG(0x0EU) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_UTIL (TAG(0x0FU) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_SGLIST (TAG(0x10U) | CTYP_INFRASTR_NOTYPE) -#define CID_COMP_ARITH (TAG(0x11U) | CTYP_INFRASTR_NOTYPE) - -#define CID_COMP_MULTIFS (TAG(0x01U) | CTYP_INFRASTR_DATABASE) -#define CID_COMP_SFS (TAG(0x02U) | CTYP_INFRASTR_DATABASE) - -/* -------------------------------------------------------------------------- */ -/* Component Standard Error/Progress Status definitions (bits 11:0, 12 bits) */ -/* NOTE: These status codes are ORed with the component identifier to create */ -/* component unique 32 bit status values. The component status values */ -/* should be defined in the header files where the APIs are defined. */ -/* -------------------------------------------------------------------------- */ -#define CID_ERR_BITMASK 0xFFFU -#define CID_ERR_BITSHIFT 0 -#define CID_GET_ERROR(compId) ((compId & CID_ERR_BITMASK) >> CID_ERR_BITSHIFT) - -#define TM_ERR_COMPATIBILITY 0x001U /* SW Interface compatibility */ -#define TM_ERR_MAJOR_VERSION 0x002U /* SW Major Version error */ -#define TM_ERR_COMP_VERSION 0x003U /* SW component version error */ -#define TM_ERR_BAD_MODULE_ID 0x004U /* SW - HW module ID error */ -#define TM_ERR_BAD_UNIT_NUMBER 0x005U /* Invalid device unit number */ -#define TM_ERR_BAD_INSTANCE 0x006U /* Bad input instance value */ -#define TM_ERR_BAD_HANDLE 0x007U /* Bad input handle */ -#define TM_ERR_BAD_INDEX 0x008U /* Bad input index */ -#define TM_ERR_BAD_PARAMETER 0x009U /* Invalid input parameter */ -#define TM_ERR_NO_INSTANCES 0x00AU /* No instances available */ -#define TM_ERR_NO_COMPONENT 0x00BU /* Component is not present */ -#define TM_ERR_NO_RESOURCES 0x00CU /* Resource is not available */ -#define TM_ERR_INSTANCE_IN_USE 0x00DU /* Instance is already in use */ -#define TM_ERR_RESOURCE_OWNED 0x00EU /* Resource is already in use */ -#define TM_ERR_RESOURCE_NOT_OWNED 0x00FU /* Caller does not own resource */ -#define TM_ERR_INCONSISTENT_PARAMS 0x010U /* Inconsistent input params */ -#define TM_ERR_NOT_INITIALIZED 0x011U /* Component is not initialized */ -#define TM_ERR_NOT_ENABLED 0x012U /* Component is not enabled */ -#define TM_ERR_NOT_SUPPORTED 0x013U /* Function is not supported */ -#define TM_ERR_INIT_FAILED 0x014U /* Initialization failed */ -#define TM_ERR_BUSY 0x015U /* Component is busy */ -#define TM_ERR_NOT_BUSY 0x016U /* Component is not busy */ -#define TM_ERR_READ 0x017U /* Read error */ -#define TM_ERR_WRITE 0x018U /* Write error */ -#define TM_ERR_ERASE 0x019U /* Erase error */ -#define TM_ERR_LOCK 0x01AU /* Lock error */ -#define TM_ERR_UNLOCK 0x01BU /* Unlock error */ -#define TM_ERR_OUT_OF_MEMORY 0x01CU /* Memory allocation failed */ -#define TM_ERR_BAD_VIRT_ADDRESS 0x01DU /* Bad virtual address */ -#define TM_ERR_BAD_PHYS_ADDRESS 0x01EU /* Bad physical address */ -#define TM_ERR_TIMEOUT 0x01FU /* Timeout error */ -#define TM_ERR_OVERFLOW 0x020U /* Data overflow/overrun error */ -#define TM_ERR_FULL 0x021U /* Queue (etc.) is full */ -#define TM_ERR_EMPTY 0x022U /* Queue (etc.) is empty */ -#define TM_ERR_NOT_STARTED 0x023U /* Streaming function failed */ -#define TM_ERR_ALREADY_STARTED 0x024U /* Start function failed */ -#define TM_ERR_NOT_STOPPED 0x025U /* Non-streaming function failed */ -#define TM_ERR_ALREADY_STOPPED 0x026U /* Stop function failed */ -#define TM_ERR_ALREADY_SETUP 0x027U /* Setup function failed */ -#define TM_ERR_NULL_PARAMETER 0x028U /* Null input parameter */ -#define TM_ERR_NULL_DATAINFUNC 0x029U /* Null data input function */ -#define TM_ERR_NULL_DATAOUTFUNC 0x02AU /* Null data output function */ -#define TM_ERR_NULL_CONTROLFUNC 0x02BU /* Null control function */ -#define TM_ERR_NULL_COMPLETIONFUNC 0x02CU /* Null completion function */ -#define TM_ERR_NULL_PROGRESSFUNC 0x02DU /* Null progress function */ -#define TM_ERR_NULL_ERRORFUNC 0x02EU /* Null error handler function */ -#define TM_ERR_NULL_MEMALLOCFUNC 0x02FU /* Null memory alloc function */ -#define TM_ERR_NULL_MEMFREEFUNC 0x030U /* Null memory free function */ -#define TM_ERR_NULL_CONFIGFUNC 0x031U /* Null configuration function */ -#define TM_ERR_NULL_PARENT 0x032U /* Null parent data */ -#define TM_ERR_NULL_IODESC 0x033U /* Null in/out descriptor */ -#define TM_ERR_NULL_CTRLDESC 0x034U /* Null control descriptor */ -#define TM_ERR_UNSUPPORTED_DATACLASS 0x035U /* Unsupported data class */ -#define TM_ERR_UNSUPPORTED_DATATYPE 0x036U /* Unsupported data type */ -#define TM_ERR_UNSUPPORTED_DATASUBTYPE 0x037U /* Unsupported data subtype */ -#define TM_ERR_FORMAT 0x038U /* Invalid/unsupported format */ -#define TM_ERR_INPUT_DESC_FLAGS 0x039U /* Bad input descriptor flags */ -#define TM_ERR_OUTPUT_DESC_FLAGS 0x03AU /* Bad output descriptor flags */ -#define TM_ERR_CAP_REQUIRED 0x03BU /* Capabilities required ??? */ -#define TM_ERR_BAD_TMALFUNC_TABLE 0x03CU /* Bad TMAL function table */ -#define TM_ERR_INVALID_CHANNEL_ID 0x03DU /* Invalid channel identifier */ -#define TM_ERR_INVALID_COMMAND 0x03EU /* Invalid command/request */ -#define TM_ERR_STREAM_MODE_CONFUSION 0x03FU /* Stream mode config conflict */ -#define TM_ERR_UNDERRUN 0x040U /* Data underflow/underrun */ -#define TM_ERR_EMPTY_PACKET_RECVD 0x041U /* Empty data packet received */ -#define TM_ERR_OTHER_DATAINOUT_ERR 0x042U /* Other data input/output err */ -#define TM_ERR_STOP_REQUESTED 0x043U /* Stop in progress */ -#define TM_ERR_ASSERTION 0x049U /* Assertion failure */ -#define TM_ERR_HIGHWAY_BANDWIDTH 0x04AU /* Highway bandwidth bus error */ -#define TM_ERR_HW_RESET_FAILED 0x04BU /* Hardware reset failed */ -#define TM_ERR_BAD_FLAGS 0x04DU /* Bad flags */ -#define TM_ERR_BAD_PRIORITY 0x04EU /* Bad priority */ -#define TM_ERR_BAD_REFERENCE_COUNT 0x04FU /* Bad reference count */ -#define TM_ERR_BAD_SETUP 0x050U /* Bad setup */ -#define TM_ERR_BAD_STACK_SIZE 0x051U /* Bad stack size */ -#define TM_ERR_BAD_TEE 0x052U /* Bad tee */ -#define TM_ERR_IN_PLACE 0x053U /* In place */ -#define TM_ERR_NOT_CACHE_ALIGNED 0x054U /* Not cache aligned */ -#define TM_ERR_NO_ROOT_TEE 0x055U /* No root tee */ -#define TM_ERR_NO_TEE_ALLOWED 0x056U /* No tee allowed */ -#define TM_ERR_NO_TEE_EMPTY_PACKET 0x057U /* No tee empty packet */ -#define TM_ERR_NULL_PACKET 0x059U /* Null packet */ -#define TM_ERR_FORMAT_FREED 0x05AU /* Format freed */ -#define TM_ERR_FORMAT_INTERNAL 0x05BU /* Format internal */ -#define TM_ERR_BAD_FORMAT 0x05CU /* Bad format */ -#define TM_ERR_FORMAT_NEGOTIATE_DATACLASS 0x05DU /* Format negotiate class */ -#define TM_ERR_FORMAT_NEGOTIATE_DATATYPE 0x05EU /* Format negotiate type */ -#define TM_ERR_FORMAT_NEGOTIATE_DATASUBTYPE 0x05FU /* Format negotiate subtype */ -#define TM_ERR_FORMAT_NEGOTIATE_DESCRIPTION 0x060U /* Format negotiate desc */ -#define TM_ERR_NULL_FORMAT 0x061U /* Null format */ -#define TM_ERR_FORMAT_REFERENCE_COUNT 0x062U /* Format reference count */ -#define TM_ERR_FORMAT_NOT_UNIQUE 0x063U /* Format not unique */ -#define TM_NEW_FORMAT 0x064U /* New format (not an error) */ -#define TM_ERR_FORMAT_NEGOTIATE_EXTENSION 0x065U /* Format negotiate extension */ -#define TM_ERR_INVALID_STATE 0x066U /* Invalid state for function */ -#define TM_ERR_NULL_CONNECTION 0x067U /* No connection to this pin */ -#define TM_ERR_OPERATION_NOT_PERMITTED 0x068U /* corresponds to posix EPERM */ -#define TM_ERR_NOT_CLOCKED 0x069U /* Power down - clocked off */ - - -#define PH_ERR_COMPATIBILITY 0x001U /* SW Interface compatibility */ -#define PH_ERR_MAJOR_VERSION 0x002U /* SW Major Version error */ -#define PH_ERR_COMP_VERSION 0x003U /* SW component version error */ -#define PH_ERR_BAD_MODULE_ID 0x004U /* SW - HW module ID error */ -#define PH_ERR_BAD_UNIT_NUMBER 0x005U /* Invalid device unit number */ -#define PH_ERR_BAD_INSTANCE 0x006U /* Bad input instance value */ -#define PH_ERR_BAD_HANDLE 0x007U /* Bad input handle */ -#define PH_ERR_BAD_INDEX 0x008U /* Bad input index */ -#define PH_ERR_BAD_PARAMETER 0x009U /* Invalid input parameter */ -#define PH_ERR_NO_INSTANCES 0x00AU /* No instances available */ -#define PH_ERR_NO_COMPONENT 0x00BU /* Component is not present */ -#define PH_ERR_NO_RESOURCES 0x00CU /* Resource is not available */ -#define PH_ERR_INSTANCE_IN_USE 0x00DU /* Instance is already in use */ -#define PH_ERR_RESOURCE_OWNED 0x00EU /* Resource is already in use */ -#define PH_ERR_RESOURCE_NOT_OWNED 0x00FU /* Caller does not own resource */ -#define PH_ERR_INCONSISTENT_PARAMS 0x010U /* Inconsistent input params */ -#define PH_ERR_NOT_INITIALIZED 0x011U /* Component is not initialized */ -#define PH_ERR_NOT_ENABLED 0x012U /* Component is not enabled */ -#define PH_ERR_NOT_SUPPORTED 0x013U /* Function is not supported */ -#define PH_ERR_INIT_FAILED 0x014U /* Initialization failed */ -#define PH_ERR_BUSY 0x015U /* Component is busy */ -#define PH_ERR_NOT_BUSY 0x016U /* Component is not busy */ -#define PH_ERR_READ 0x017U /* Read error */ -#define PH_ERR_WRITE 0x018U /* Write error */ -#define PH_ERR_ERASE 0x019U /* Erase error */ -#define PH_ERR_LOCK 0x01AU /* Lock error */ -#define PH_ERR_UNLOCK 0x01BU /* Unlock error */ -#define PH_ERR_OUT_OF_MEMORY 0x01CU /* Memory allocation failed */ -#define PH_ERR_BAD_VIRT_ADDRESS 0x01DU /* Bad virtual address */ -#define PH_ERR_BAD_PHYS_ADDRESS 0x01EU /* Bad physical address */ -#define PH_ERR_TIMEOUT 0x01FU /* Timeout error */ -#define PH_ERR_OVERFLOW 0x020U /* Data overflow/overrun error */ -#define PH_ERR_FULL 0x021U /* Queue (etc.) is full */ -#define PH_ERR_EMPTY 0x022U /* Queue (etc.) is empty */ -#define PH_ERR_NOT_STARTED 0x023U /* Streaming function failed */ -#define PH_ERR_ALREADY_STARTED 0x024U /* Start function failed */ -#define PH_ERR_NOT_STOPPED 0x025U /* Non-streaming function failed */ -#define PH_ERR_ALREADY_STOPPED 0x026U /* Stop function failed */ -#define PH_ERR_ALREADY_SETUP 0x027U /* Setup function failed */ -#define PH_ERR_NULL_PARAMETER 0x028U /* Null input parameter */ -#define PH_ERR_NULL_DATAINFUNC 0x029U /* Null data input function */ -#define PH_ERR_NULL_DATAOUTFUNC 0x02AU /* Null data output function */ -#define PH_ERR_NULL_CONTROLFUNC 0x02BU /* Null control function */ -#define PH_ERR_NULL_COMPLETIONFUNC 0x02CU /* Null completion function */ -#define PH_ERR_NULL_PROGRESSFUNC 0x02DU /* Null progress function */ -#define PH_ERR_NULL_ERRORFUNC 0x02EU /* Null error handler function */ -#define PH_ERR_NULL_MEMALLOCFUNC 0x02FU /* Null memory alloc function */ -#define PH_ERR_NULL_MEMFREEFUNC 0x030U /* Null memory free function */ -#define PH_ERR_NULL_CONFIGFUNC 0x031U /* Null configuration function */ -#define PH_ERR_NULL_PARENT 0x032U /* Null parent data */ -#define PH_ERR_NULL_IODESC 0x033U /* Null in/out descriptor */ -#define PH_ERR_NULL_CTRLDESC 0x034U /* Null control descriptor */ -#define PH_ERR_UNSUPPORTED_DATACLASS 0x035U /* Unsupported data class */ -#define PH_ERR_UNSUPPORTED_DATATYPE 0x036U /* Unsupported data type */ -#define PH_ERR_UNSUPPORTED_DATASUBTYPE 0x037U /* Unsupported data subtype */ -#define PH_ERR_FORMAT 0x038U /* Invalid/unsupported format */ -#define PH_ERR_INPUT_DESC_FLAGS 0x039U /* Bad input descriptor flags */ -#define PH_ERR_OUTPUT_DESC_FLAGS 0x03AU /* Bad output descriptor flags */ -#define PH_ERR_CAP_REQUIRED 0x03BU /* Capabilities required ??? */ -#define PH_ERR_BAD_TMALFUNC_TABLE 0x03CU /* Bad TMAL function table */ -#define PH_ERR_INVALID_CHANNEL_ID 0x03DU /* Invalid channel identifier */ -#define PH_ERR_INVALID_COMMAND 0x03EU /* Invalid command/request */ -#define PH_ERR_STREAM_MODE_CONFUSION 0x03FU /* Stream mode config conflict */ -#define PH_ERR_UNDERRUN 0x040U /* Data underflow/underrun */ -#define PH_ERR_EMPTY_PACKET_RECVD 0x041U /* Empty data packet received */ -#define PH_ERR_OTHER_DATAINOUT_ERR 0x042U /* Other data input/output err */ -#define PH_ERR_STOP_REQUESTED 0x043U /* Stop in progress */ -#define PH_ERR_ASSERTION 0x049U /* Assertion failure */ -#define PH_ERR_HIGHWAY_BANDWIDTH 0x04AU /* Highway bandwidth bus error */ -#define PH_ERR_HW_RESET_FAILED 0x04BU /* Hardware reset failed */ -#define PH_ERR_BAD_FLAGS 0x04DU /* Bad flags */ -#define PH_ERR_BAD_PRIORITY 0x04EU /* Bad priority */ -#define PH_ERR_BAD_REFERENCE_COUNT 0x04FU /* Bad reference count */ -#define PH_ERR_BAD_SETUP 0x050U /* Bad setup */ -#define PH_ERR_BAD_STACK_SIZE 0x051U /* Bad stack size */ -#define PH_ERR_BAD_TEE 0x052U /* Bad tee */ -#define PH_ERR_IN_PLACE 0x053U /* In place */ -#define PH_ERR_NOT_CACHE_ALIGNED 0x054U /* Not cache aligned */ -#define PH_ERR_NO_ROOT_TEE 0x055U /* No root tee */ -#define PH_ERR_NO_TEE_ALLOWED 0x056U /* No tee allowed */ -#define PH_ERR_NO_TEE_EMPTY_PACKET 0x057U /* No tee empty packet */ -#define PH_ERR_NULL_PACKET 0x059U /* Null packet */ -#define PH_ERR_FORMAT_FREED 0x05AU /* Format freed */ -#define PH_ERR_FORMAT_INTERNAL 0x05BU /* Format internal */ -#define PH_ERR_BAD_FORMAT 0x05CU /* Bad format */ -#define PH_ERR_FORMAT_NEGOTIATE_DATACLASS 0x05DU /* Format negotiate class */ -#define PH_ERR_FORMAT_NEGOTIATE_DATATYPE 0x05EU /* Format negotiate type */ -#define PH_ERR_FORMAT_NEGOTIATE_DATASUBTYPE 0x05FU /* Format negotiate subtype */ -#define PH_ERR_FORMAT_NEGOTIATE_DESCRIPTION 0x060U /* Format negotiate desc */ -#define PH_ERR_NULL_FORMAT 0x061U /* Null format */ -#define PH_ERR_FORMAT_REFERENCE_COUNT 0x062U /* Format reference count */ -#define PH_ERR_FORMAT_NOT_UNIQUE 0x063U /* Format not unique */ -#define PH_NEW_FORMAT 0x064U /* New format (not an error) */ -#define PH_ERR_FORMAT_NEGOTIATE_EXTENSION 0x065U /* Format negotiate extension */ -#define PH_ERR_INVALID_STATE 0x066U /* Invalid state for function */ -#define PH_ERR_NULL_CONNECTION 0x067U /* No connection to this pin */ -#define PH_ERR_OPERATION_NOT_PERMITTED 0x068U /* corresponds to posix EPERM */ -#define PH_ERR_NOT_CLOCKED 0x069U /* Power down - clocked off */ - -/* Add new standard error/progress status codes here */ - -#define TM_ERR_COMP_UNIQUE_START 0x800U /* 0x800-0xBFF: Component unique */ -#define PH_ERR_COMP_UNIQUE_START 0x800U /* 0x800-0xBFF: Component unique */ -#define TM_ERR_CUSTOMER_START 0xC00U /* 0xC00-0xDFF: Customer defined */ -#define PH_ERR_CUSTOMER_START 0xC00U /* 0xC00-0xDFF: Customer defined */ - -/* Legacy and withdrawn error codes */ -#define TM_ERR_FORMAT_NEGOTIATE_SUBCLASS TM_ERR_FORMAT_NEGOTIATE_DATACLASS -#define TM_ERR_NEW_FORMAT TM_NEW_FORMAT -#define TM_ERR_PAUSE_PIN_REQUESTED TM_ERR_STOP_REQUESTED -#define TM_ERR_PIN_ALREADY_STARTED TM_ERR_ALREADY_STARTED -#define TM_ERR_PIN_ALREADY_STOPPED TM_ERR_ALREADY_STOPPED -#define TM_ERR_PIN_NOT_STARTED TM_ERR_NOT_STARTED -#define TM_ERR_PIN_NOT_STOPPED TM_ERR_NOT_STOPPED -#define TM_ERR_PIN_PAUSED TM_ERR_NOT_STARTED - -/* -------------------------------------------------------------------------- */ -/* Standard assert error code start offset */ -/* NOTE: These ranges are FOR LEGACY CODE ONLY and must not be used in new */ -/* components */ -/* -------------------------------------------------------------------------- */ -#define TM_ERR_ASSERT_START 0xE00U /* 0xE00-0xEFF: Assert failures */ -#define TM_ERR_ASSERT_LAST 0xEFFU /* Last assert error range value */ -#define CID_IS_ASSERT_ERROR(compId) ((CID_GET_ERROR(compId) >= TM_ERR_ASSERT_START) && (CID_GET_ERROR(compId) <= TM_ERR_ASSERT_LAST)) - -/* -------------------------------------------------------------------------- */ -/* Standard fatal error code start offset */ -/* NOTE: These ranges are FOR LEGACY CODE ONLY and must not be used in new */ -/* components */ -/* -------------------------------------------------------------------------- */ - -#define TM_ERR_FATAL_START 0xF00U /* 0xF00-0xFFF: Fatal failures */ -#define TM_ERR_FATAL_LAST 0xFFFU /* Last fatal error range value */ -#define CID_IS_FATAL_ERROR(compId) ((CID_GET_ERROR(compId) >= TM_ERR_FATAL_START) && (CID_GET_ERROR(compId) <= TM_ERR_FATAL_LAST)) - -#ifdef __cplusplus -} -#endif -#endif /* TMNXCOMPID_H ----------------- */ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmNxTypes.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmNxTypes.h deleted file mode 100644 index 0463fddfb37..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmNxTypes.h +++ /dev/null @@ -1,360 +0,0 @@ -/*==========================================================================*/ -/* (Copyright (C) 2003 Koninklijke Philips Electronics N.V. */ -/* All rights reserved. */ -/* This source code and any compilation or derivative thereof is the */ -/* proprietary information of Koninklijke Philips Electronics N.V. */ -/* and is confidential in nature. */ -/* Under no circumstances is this software to be exposed to or placed */ -/* under an Open Source License of any type without the expressed */ -/* written permission of Koninklijke Philips Electronics N.V. */ -/*==========================================================================*/ -/* - * Copyright (C) 2000,2001 - * Koninklijke Philips Electronics N.V. - * All Rights Reserved. - * - * Copyright (C) 2000,2001 TriMedia Technologies, Inc. - * All Rights Reserved. - * - *############################################################ - * - * Module name : tmNxTypes.h %version: 7 % - * - * Last Update : %date_modified: Tue Jul 8 18:08:00 2003 % - * - * Description: TriMedia/MIPS global type definitions. - * - * Document Ref: DVP Software Coding Guidelines Specification - * DVP/MoReUse Naming Conventions specification - * DVP Software Versioning Specification - * DVP Device Library Architecture Specification - * DVP Board Support Library Architecture Specification - * DVP Hardware API Architecture Specification - * - * - *############################################################ - */ - -#ifndef TMNXTYPES_H -#define TMNXTYPES_H - -/* ----------------------------------------------------------------------------- */ -/* Standard include files: */ -/* ----------------------------------------------------------------------------- */ -/* */ - -/* ----------------------------------------------------------------------------- */ -/* Project include files: */ -/* ----------------------------------------------------------------------------- */ -/* */ -#include "tmFlags.h" /* DVP common build control flags */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* ----------------------------------------------------------------------------- */ -/* Types and defines: */ -/* ----------------------------------------------------------------------------- */ -/* */ - -/*Under the TCS, may have been included by our client. In - order to avoid errors, we take account of this possibility, but in order to - support environments where the TCS is not available, we do not include the - file by name.*/ - -#ifndef _TMtypes_h -#define _TMtypes_h - -#define False 0 -#define True 1 - -#ifdef __cplusplus -#define Null 0 -#else -#define Null ((Void *) 0) -#endif - -/* */ -/* Standard Types */ -/* */ - typedef signed char Int8; /* 8 bit signed integer */ - typedef signed short Int16; /* 16 bit signed integer */ - typedef signed long Int32; /* 32 bit signed integer */ - typedef unsigned char UInt8; /* 8 bit unsigned integer */ - typedef unsigned short UInt16; /* 16 bit unsigned integer */ - typedef unsigned long UInt32; /* 32 bit unsigned integer */ - typedef float Float; /* 32 bit floating point */ - typedef unsigned int Bool; /* Boolean (True/False) */ - typedef char Char; /* character, character array ptr */ - typedef int Int; /* machine-natural integer */ - typedef unsigned int UInt; /* machine-natural unsigned integer */ - typedef char *String; /* Null terminated 8 bit char str */ - -/* ----------------------------------------------------------------------------- */ -/* Legacy TM Types/Structures (Not necessarily DVP Coding Guideline compliant) */ -/* NOTE: For DVP Coding Gudeline compliant code, do not use these types. */ -/* */ - typedef char *Address; /* Ready for address-arithmetic */ - typedef char const *ConstAddress; - typedef unsigned char Byte; /* Raw byte */ - typedef float Float32; /* Single-precision float */ - typedef double Float64; /* Double-precision float */ - typedef void *Pointer; /* Pointer to anonymous object */ - typedef void const *ConstPointer; - typedef char const *ConstString; - - typedef Int Endian; -#define BigEndian 0 -#define LittleEndian 1 - - typedef UInt32 tmErrorCode_t; - typedef UInt32 tmProgressCode_t; - - - typedef struct tmVersion { - UInt8 majorVersion; - UInt8 minorVersion; - UInt16 buildVersion; - } tmVersion_t, *ptmVersion_t; -#endif /*ndef _TMtypes_h */ - -/*Define DVP types that are not TCS types.*/ -/* -** ===== Updated from SDE2/2.3_Beta/sde_template/inc/tmNxTypes.h ===== -** -** NOTE: IBits32/UBits32 types are defined for use with 32 bit bitfields. -** This is done because ANSI/ISO compliant compilers require bitfields -** to be of type "int" else a large number of compiler warnings will -** result. To avoid the risks associated with redefining Int32/UInt32 -** to type "int" instead of type "long" (which are the same size on 32 -** bit CPUs) separate 32bit signed/unsigned bitfield types are defined. -*/ - typedef signed int IBits32; /* 32 bit signed integer bitfields */ - typedef unsigned int UBits32; /* 32 bit unsigned integer bitfields */ - typedef IBits32 * pIBits32; /* 32 bit signed integer bitfield ptr */ - typedef UBits32 * pUBits32; /* 32 bit unsigned integer bitfield ptr */ - - typedef Int8 * pInt8; - typedef Int16 * pInt16; - typedef Int32 * pInt32; - typedef UInt8 *pUInt8; /* 8 bit unsigned integer */ - typedef UInt16 *pUInt16; /* 16 bit unsigned integer */ - typedef UInt32 * pUInt32; - typedef void Void, *pVoid; /* Void (typeless) */ - typedef Float * pFloat; - typedef double Double, *pDouble; /* 32/64 bit floating point */ - typedef Bool * pBool; - typedef Char * pChar; - typedef Int * pInt; - typedef UInt * pUInt; - typedef String * pString; - -/*Assume that 64-bit integers are supported natively by C99 compilers and Visual - C version 6.00 and higher. More discrimination in this area may be added - here as necessary.*/ -#if defined __STDC_VERSION__ && __STDC_VERSION__ > 199409L -/*This can be enabled only when all explicit references to the hi and lo - structure members are eliminated from client code.*/ -#define TMFL_NATIVE_INT64 1 - typedef signed long long int Int64, *pInt64; /* 64-bit integer */ - typedef unsigned long long int UInt64, *pUInt64; /* 64-bit bitmask */ -/* #elif defined _MSC_VER && _MSC_VER >= 1200 */ -/* /*This can be enabled only when all explicit references to the hi and lo */ -/* structure members are eliminated from client code.*/ */ -/* #define TMFL_NATIVE_INT64 1 */ -/* typedef signed __int64 Int64, *pInt64; // 64-bit integer */ -/* typedef unsigned __int64 UInt64, *pUInt64; // 64-bit bitmask */ -#else /*!(defined __STDC_VERSION__ && __STDC_VERSION__ > 199409L) */ -#define TMFL_NATIVE_INT64 0 - typedef - struct { - /*Get the correct endianness (this has no impact on any other part of - the system, but may make memory dumps easier to understand). */ -#if TMFL_ENDIAN == TMFL_ENDIAN_BIG - Int32 hi; - UInt32 lo; -#else - UInt32 lo; - Int32 hi; -#endif - } Int64, *pInt64; /* 64-bit integer */ - typedef - struct { -#if TMFL_ENDIAN == TMFL_ENDIAN_BIG - UInt32 hi; - UInt32 lo; -#else - UInt32 lo; - UInt32 hi; -#endif - } UInt64, *pUInt64; /* 64-bit bitmask */ -#endif /*defined __STDC_VERSION__ && __STDC_VERSION__ > 199409L */ - -/* Maximum length of device name in all BSP and capability structures */ -#define HAL_DEVICE_NAME_LENGTH 16 -/* timestamp definition */ - typedef UInt64 tmTimeStamp_t, *ptmTimeStamp_t; - -/* for backwards compatibility with the older tmTimeStamp_t definition */ -#define ticks lo -#define hiTicks hi - - typedef union tmColor3 /* 3 byte color structure */ - { - UBits32 u32; -#if (TMFL_ENDIAN == TMFL_ENDIAN_BIG) - struct { - UBits32:8; - UBits32 red:8; - UBits32 green:8; - UBits32 blue:8; - } rgb; - struct { - UBits32:8; - UBits32 y:8; - UBits32 u:8; - UBits32 v:8; - } yuv; - struct { - UBits32:8; - UBits32 u:8; - UBits32 m:8; - UBits32 l:8; - } uml; -#else - struct { - UBits32 blue:8; - UBits32 green:8; - UBits32 red:8; - UBits32:8; - } rgb; - struct { - UBits32 v:8; - UBits32 u:8; - UBits32 y:8; - UBits32:8; - } yuv; - struct { - UBits32 l:8; - UBits32 m:8; - UBits32 u:8; - UBits32:8; - } uml; -#endif - } tmColor3_t, *ptmColor3_t; - - typedef union tmColor4 /* 4 byte color structure */ - { - UBits32 u32; -#if (TMFL_ENDIAN == TMFL_ENDIAN_BIG) - struct { - UBits32 alpha:8; - UBits32 red:8; - UBits32 green:8; - UBits32 blue:8; - } argb; - struct { - UBits32 alpha:8; - UBits32 y:8; - UBits32 u:8; - UBits32 v:8; - } ayuv; - struct { - UBits32 alpha:8; - UBits32 u:8; - UBits32 m:8; - UBits32 l:8; - } auml; -#else - struct { - UBits32 blue:8; - UBits32 green:8; - UBits32 red:8; - UBits32 alpha:8; - } argb; - struct { - UBits32 v:8; - UBits32 u:8; - UBits32 y:8; - UBits32 alpha:8; - } ayuv; - struct { - UBits32 l:8; - UBits32 m:8; - UBits32 u:8; - UBits32 alpha:8; - } auml; -#endif - } tmColor4_t, *ptmColor4_t; - -/* ----------------------------------------------------------------------------- */ -/* Hardware device power states */ -/* */ - typedef enum tmPowerState { - tmPowerOn, /* Device powered on (D0 state) */ - tmPowerStandby, /* Device power standby (D1 state) */ - tmPowerSuspend, /* Device power suspended (D2 state) */ - tmPowerOff /* Device powered off (D3 state) */ - } tmPowerState_t, *ptmPowerState_t; - -/* ----------------------------------------------------------------------------- */ -/* Software Version Structure */ -/* */ - typedef struct tmSWVersion { - UInt32 compatibilityNr; /* Interface compatibility number */ - UInt32 majorVersionNr; /* Interface major version number */ - UInt32 minorVersionNr; /* Interface minor version number */ - - } tmSWVersion_t, *ptmSWVersion_t; - -/*Under the TCS, may have been included by our client. In - order to avoid errors, we take account of this possibility, but in order to - support environments where the TCS is not available, we do not include the - file by name.*/ -#ifndef _TMBOARDDEF_H_ -#define _TMBOARDDEF_H_ - -/* ----------------------------------------------------------------------------- */ -/* HW Unit Selection */ -/* */ - typedef Int tmUnitSelect_t, *ptmUnitSelect_t; - -#define tmUnitNone (-1) -#define tmUnit0 0 -#define tmUnit1 1 -#define tmUnit2 2 -#define tmUnit3 3 -#define tmUnit4 4 - -/*+compatibility*/ -#define unitSelect_t tmUnitSelect_t -#define unit0 tmUnit0 -#define unit1 tmUnit1 -#define unit2 tmUnit2 -#define unit3 tmUnit3 -#define unit4 tmUnit4 -#define DEVICE_NAME_LENGTH HAL_DEVICE_NAME_LENGTH -/*-compatibility*/ - -#endif /*ndef _TMBOARDDEF_H_ */ - -/* ----------------------------------------------------------------------------- */ -/* Instance handle */ -/* */ - typedef Int tmInstance_t, *ptmInstance_t; - -/* Callback function declaration */ - typedef Void(*ptmCallback_t) (UInt32 events, Void *pData, UInt32 userData); -#define tmCallback_t ptmCallback_t /*compatibility */ - -/* Kernel debugging function declaration */ -#ifdef TMFL_CFG_INTELCE4100 -#define KERN_INFO void -#define printk(fmt, args...) printf(fmt, ## args) -#endif - -#ifdef __cplusplus -} -#endif -#endif /* ndef TMNXTYPES_H */ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslHdmiTx_funcMapping.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslHdmiTx_funcMapping.h deleted file mode 100644 index 6d77e8d24d8..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslHdmiTx_funcMapping.h +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslHdmiTx_funcMapping.h - * - * \version $Revision: 2 $ - * -*/ - - - -#ifndef TMDLHDMITXTDA9989_CFG_H -#define TMDLHDMITXTDA9989_CFG_H - -#include "tmbslTDA9989_Functions.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define tmbslHdmiTxInit tmbslTDA9989Init -#define tmbslHdmiTxEdidRequestBlockData tmbslTDA9989EdidRequestBlockData -#define tmbslHdmiTxVideoOutSetConfig tmbslTDA9989VideoOutSetConfig -#define tmbslHdmiTxAudioInResetCts tmbslTDA9989AudioInResetCts -#define tmbslHdmiTxAudioInSetConfig tmbslTDA9989AudioInSetConfig -#define tmbslHdmiTxAudioInSetCts tmbslTDA9989AudioInSetCts -#define tmbslHdmiTxAudioOutSetChanStatus tmbslTDA9989AudioOutSetChanStatus -#define tmbslHdmiTxAudioOutSetChanStatusMapping tmbslTDA9989AudioOutSetChanStatusMapping -#define tmbslHdmiTxAudioOutSetMute tmbslTDA9989AudioOutSetMute -#define tmbslHdmiTxDeinit tmbslTDA9989Deinit -#define tmbslHdmiTxEdidGetAudioCapabilities tmbslTDA9989EdidGetAudioCapabilities -#define tmbslHdmiTxEdidGetBlockCount tmbslTDA9989EdidGetBlockCount -#define tmbslHdmiTxEdidGetStatus tmbslTDA9989EdidGetStatus -#define tmbslHdmiTxEdidGetSinkType tmbslTDA9989EdidGetSinkType -#define tmbslHdmiTxEdidGetSourceAddress tmbslTDA9989EdidGetSourceAddress -#define tmbslHdmiTxEdidGetVideoCapabilities tmbslTDA9989EdidGetVideoCapabilities -#define tmbslHdmiTxEdidGetVideoPreferred tmbslTDA9989EdidGetVideoPreferred -#define tmbslHdmiTxHdcpCheck tmbslTDA9989HdcpCheck -#define tmbslHdmiTxHdcpConfigure tmbslTDA9989HdcpConfigure -#define tmbslHdmiTxHdcpDownloadKeys tmbslTDA9989HdcpDownloadKeys -#define tmbslHdmiTxHdcpEncryptionOn tmbslTDA9989HdcpEncryptionOn -#define tmbslHdmiTxHdcpGetOtp tmbslTDA9989HdcpGetOtp -#define tmbslHdmiTxHdcpGetT0FailState tmbslTDA9989HdcpGetT0FailState -#define tmbslHdmiTxHdcpHandleBCAPS tmbslTDA9989HdcpHandleBCAPS -#define tmbslHdmiTxHdcpHandleBKSV tmbslTDA9989HdcpHandleBKSV -#define tmbslHdmiTxHdcpHandleBKSVResult tmbslTDA9989HdcpHandleBKSVResult -#define tmbslHdmiTxHdcpHandleBSTATUS tmbslTDA9989HdcpHandleBSTATUS -#define tmbslHdmiTxHdcpHandleENCRYPT tmbslTDA9989HdcpHandleENCRYPT -#define tmbslHdmiTxHdcpHandlePJ tmbslTDA9989HdcpHandlePJ -#define tmbslHdmiTxHdcpHandleSHA_1 tmbslTDA9989HdcpHandleSHA_1 -#define tmbslHdmiTxHdcpHandleSHA_1Result tmbslTDA9989HdcpHandleSHA_1Result -#define tmbslHdmiTxHdcpHandleT0 tmbslTDA9989HdcpHandleT0 -#define tmbslHdmiTxHdcpInit tmbslTDA9989HdcpInit -#define tmbslHdmiTxHdcpRun tmbslTDA9989HdcpRun -#define tmbslHdmiTxHdcpStop tmbslTDA9989HdcpStop -#define tmbslHdmiTxHotPlugGetStatus tmbslTDA9989HotPlugGetStatus -#define tmbslHdmiTxRxSenseGetStatus tmbslTDA9989RxSenseGetStatus -#define tmbslHdmiTxHwGetRegisters tmbslTDA9989HwGetRegisters -#define tmbslHdmiTxHwGetVersion tmbslTDA9989HwGetVersion -#define tmbslHdmiTxHwGetCapabilities tmbslTDA9989HwGetCapabilities -#define tmbslHdmiTxHwHandleInterrupt tmbslTDA9989HwHandleInterrupt -#define tmbslHdmiTxHwSetRegisters tmbslTDA9989HwSetRegisters -#define tmbslHdmiTxHwStartup tmbslTDA9989HwStartup -#define tmbslHdmiTxMatrixSetCoeffs tmbslTDA9989MatrixSetCoeffs -#define tmbslHdmiTxMatrixSetConversion tmbslTDA9989MatrixSetConversion -#define tmbslHdmiTxMatrixSetInputOffset tmbslTDA9989MatrixSetInputOffset -#define tmbslHdmiTxMatrixSetMode tmbslTDA9989MatrixSetMode -#define tmbslHdmiTxMatrixSetOutputOffset tmbslTDA9989MatrixSetOutputOffset -#define tmbslHdmiTxPktSetAclkRecovery tmbslTDA9989PktSetAclkRecovery -#define tmbslHdmiTxPktSetAcp tmbslTDA9989PktSetAcp -#define tmbslHdmiTxPktSetAudioInfoframe tmbslTDA9989PktSetAudioInfoframe -#define tmbslHdmiTxPktSetGeneralCntrl tmbslTDA9989PktSetGeneralCntrl -#define tmbslHdmiTxPktSetIsrc1 tmbslTDA9989PktSetIsrc1 -#define tmbslHdmiTxPktSetIsrc2 tmbslTDA9989PktSetIsrc2 -#define tmbslHdmiTxPktSetMpegInfoframe tmbslTDA9989PktSetMpegInfoframe -#define tmbslHdmiTxPktSetNullInsert tmbslTDA9989PktSetNullInsert -#define tmbslHdmiTxPktSetNullSingle tmbslTDA9989PktSetNullSingle -#define tmbslHdmiTxPktSetSpdInfoframe tmbslTDA9989PktSetSpdInfoframe -#define tmbslHdmiTxPktSetVideoInfoframe tmbslTDA9989PktSetVideoInfoframe -#define tmbslHdmiTxPktSetVsInfoframe tmbslTDA9989PktSetVsInfoframe -#define tmbslHdmiTxPktSetRawVideoInfoframe tmbslTDA9989PktSetRawVideoInfoframe -#define tmbslHdmiTxPowerGetState tmbslTDA9989PowerGetState -#define tmbslHdmiTxPowerSetState tmbslTDA9989PowerSetState -#define tmbslHdmiTxReset tmbslTDA9989Reset -#define tmbslHdmiTxScalerGet tmbslTDA9989ScalerGet -#define tmbslHdmiTxScalerGetMode tmbslTDA9989ScalerGetMode -#define tmbslHdmiTxScalerInDisable tmbslTDA9989ScalerInDisable -#define tmbslHdmiTxScalerSetCoeffs tmbslTDA9989ScalerSetCoeffs -#define tmbslHdmiTxScalerSetFieldOrder tmbslTDA9989ScalerSetFieldOrder -#define tmbslHdmiTxScalerSetFine tmbslTDA9989ScalerSetFine -#define tmbslHdmiTxScalerSetPhase tmbslTDA9989ScalerSetPhase -#define tmbslHdmiTxScalerSetLatency tmbslTDA9989ScalerSetLatency -#define tmbslHdmiTxScalerSetSync tmbslTDA9989ScalerSetSync -#define tmbslHdmiTxSwGetVersion tmbslTDA9989SwGetVersion -#define tmbslHdmiTxSysTimerWait tmbslTDA9989SysTimerWait -#define tmbslHdmiTxTmdsSetOutputs tmbslTDA9989TmdsSetOutputs -#define tmbslHdmiTxTmdsSetSerializer tmbslTDA9989TmdsSetSerializer -#define tmbslHdmiTxTestSetPattern tmbslTDA9989TestSetPattern -#define tmbslHdmiTxTestSetMode tmbslTDA9989TestSetMode -#define tmbslHdmiTxVideoInSetBlanking tmbslTDA9989VideoInSetBlanking -#define tmbslHdmiTxVideoInSetConfig tmbslTDA9989VideoInSetConfig -#define tmbslHdmiTxVideoInSetFine tmbslTDA9989VideoInSetFine -#define tmbslHdmiTxVideoInSetMapping tmbslTDA9989VideoInSetMapping -#define tmbslHdmiTxSetVideoPortConfig tmbslTDA9989SetVideoPortConfig -#define tmbslHdmiTxSetAudioPortConfig tmbslTDA9989SetAudioPortConfig -#define tmbslHdmiTxSetAudioClockPortConfig tmbslTDA9989SetAudioClockPortConfig -#define tmbslHdmiTxVideoInSetSyncAuto tmbslTDA9989VideoInSetSyncAuto -#define tmbslHdmiTxVideoInSetSyncManual tmbslTDA9989VideoInSetSyncManual -#define tmbslHdmiTxVideoOutDisable tmbslTDA9989VideoOutDisable -#define tmbslHdmiTxVideoOutSetSync tmbslTDA9989VideoOutSetSync -#define tmbslHdmiTxVideoSetInOut tmbslTDA9989VideoSetInOut -#define tmbslHdmiTxFlagSwInt tmbslTDA9989FlagSwInt -#define tmbslHdmiTxSet5vpower tmbslTDA9989Set5vpower -#define tmbslHdmiTxEnableCallback tmbslTDA9989EnableCallback -#define tmbslHdmiTxSetColorDepth tmbslTDA9989SetColorDepth -#define tmbslHdmiTxSetDefaultPhase tmbslTDA9989SetDefaultPhase -#define tmbslHdmiTxPktFillGamut tmbslTDA9989PktFillGamut -#define tmbslHdmiTxPktSendGamut tmbslTDA9989PktSendGamut -#define tmbslHdmiTxEdidGetMonitorDescriptors tmbslTDA9989EdidGetMonitorDescriptors -#define tmbslHdmiTxEdidGetDetailedTimingDescriptors tmbslTDA9989EdidGetDetailedTimingDescriptors -#define tmbslHdmiTxEdidGetBasicDisplayParam tmbslTDA9989EdidGetBasicDisplayParam -#define tmbslHdmiTxHdcpGetSinkCategory tmbslTDA9989HdcpGetSinkCategory -#define tmbslHdmiTxEdidGetLatencyInfo tmbslTDA9989EdidGetLatencyInfo -#define tmbslHdmiTxEdidGetExtraVsdbData tmbslTDA9989EdidGetExtraVsdbData -#ifdef TMFL_TDA19989 -#define tmbslHdmiTxHdcpPowerDown tmbslTDA9989HdcpPowerDown -#endif - -#ifdef __cplusplus -} -#endif -#endif /* TMDLHDMITXTDA9989_CFG_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslHdmiTx_types.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslHdmiTx_types.h deleted file mode 100644 index b243c4a6078..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslHdmiTx_types.h +++ /dev/null @@ -1,2037 +0,0 @@ -/** - * Copyright (C) 2007 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslHdmiTx_types.h - * - * \version $Revision: 18 $ - * - * \date $Date: 17/03/08 $ - * - * \brief HDMI Transmitter common types - * - * \section refs Reference Documents - * - * \section info Change Information - * - * \verbatim - - $History: tmbslHdmiTx_types.h $ - * - * - * **************** Version 18 ****************** - * User: G.Burnouf Date: 01/04/08 - * Updated in $/Source/tmbslHdmiTx/inc - * PR1468 : add new function tmbslTDA9984GetSinkCategory - * - * - * **************** Version 17 ****************** - * User: G.Burnouf Date: 17/03/08 - * Updated in $/Source/tmbslHdmiTx/inc - * PR1430 : Increase size of table for - * Short Audio Descriptor - * - * **************** Version 16 ****************** - * User: G.Burnouf Date: 06/03/08 - * Updated in $/Source/tmbslHdmiTx/inc - * PR1406 : new reset audio fifo sequence - * - * **************** Version 15 ****************** - * User: G.Burnouf Date: 05/02/08 - * Updated in $/Source/tmbslHdmiTx/inc - * PR1251 : add new type for function - * tmbslTDA9984EdidGetBasicDisplayParam - * - ****************** Version 14 ****************** - * User: G.Burnouf Date: 14/01/08 - * Updated in $/Source/tmbslHdmiTx/inc - * PR580 - Change BSL error base address - * - ****************** Version 13 ****************** - * User: G.Burnouf Date: 10/01/08 - * Updated in $/Source/tmbslHdmiTx/inc - * PR606 - Apply audio port config in function - * of audio format - * - * **************** Version 12 ****************** - * User: G.Burnouf Date: 10/12/07 Time: 08:30 - * Updated in $/Source/tmbslHdmiTx/inc - * PR1145 : return DTD and monitor description - * - * ***************** Version 11 ***************** - * User: G.Burnouf Date: 04/12/07 - * Updated in $/Source/tmbslHdmiTx/inc - * PR948 : add new formats, 1080p24/25/30 - * - * ***************** Version 10 ***************** - * User: C. Diehl Date: 27/11/07 - * Updated in $/Source/tmbslHdmiTx/inc - * PR1030 : - Align with the common interface - * reworked for the LIPP4200 - * - * ***************** Version 9 ***************** - * User: J.Lamotte Date: 23/11/07 Time: 09:35 - * Updated in $/Source/tmbslHdmiTx/src - * PR1078 : - update HDMI_TX_SVD_MAX_CNT from 30 - * to 113 - * - * ***************** Version 8 ***************** - * User: G.Burnouf Date: 13/11/07 Time: 09:29 - * Updated in $/Source/tmbslHdmiTx/src - * PR1008 : - update type tmbslHdmiTxHwFeature_t - * - * ***************** Version 7 ***************** - * User: G.Burnouf Date: 16/10/07 Time: 14:32 - * Updated in $/Source/tmbslHdmiTx/src - * PR882 : - add type tmbslHdmiTxPowerState_t - * - add type tmbslHdmiTxPktGmt_t for gamut - * - add new interrupt callback for VS - * - * ***************** Version 6 ***************** - * User: G.Burnouf Date: 05/10/07 Time: 14:32 - * Updated in $/Source/tmbslHdmiTx/src - * PR824 : add type for enum _tmbslHdmiTxCallbackInt - * - * ***************** Version 5 ***************** - * User: J.Turpin Date: 13/09/07 Time: 14:32 - * Updated in $/Source/tmbslHdmiTx/src - * PR693 : add black pattern functionality - * - add HDMITX_PATTERN_BLACK in - * enum tmbslHdmiTxTestPattern_t - * - * ***************** Version 4 ***************** - * User: G.Burnouf Date: 06/09/07 Time: 17:22 - * Updated in $/Source/tmbslTDA9984/Inc - * PR656 : - add HBR format - * - add format I2s Philips left and right justified - * - * ***************** Version 3 ***************** - * User: G. Burnouf Date: 07/08/07 Time: 10:30 - * Updated in $/Source/tmbslTDA9984/Inc - * PR572 - change type name of tmbslTDA9984_ to tmbslHdmiTx_ - * - * ***************** Version 2 ***************** - * User: B.Vereecke Date: 07/08/07 Time: 10:30 - * Updated in $/Source/tmbslTDA9984/Inc - * PR551 - Add a new Pattern type in tmbslHdmiTxTestPattern_t - * it is used for set the bluescreen - * - * ***************** Version 1 ***************** - * User: G. Burnouf Date: 05/07/07 Time: 17:00 - * Updated in $/Source/tmbslTDA9984/Inc - * PR 414 : Add new edid management - * - \endverbatim - * -*/ - -#ifndef TMBSLHDMITX_TYPES_H -#define TMBSLHDMITX_TYPES_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#include "tmNxCompId.h" - - - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - -/** - * The maximum number of supported HDMI Transmitter units - */ -#define HDMITX_UNITS_MAX 2 - -/** \name Errors - * The group of error codes returned by all API and internal functions - */ -/*@{*/ -/** The base offset for all error codes. - * This needs defining as non-zero if this component is integrated with others - * and all component error ranges are to be kept separate. - */ -#define TMBSL_ERR_HDMI_BASE CID_BSL_HDMITX - -/** Define the OK code if not defined already */ -#ifndef TM_OK -#define TM_OK 0 -#endif - -/** SW interface compatibility error */ -#define TMBSL_ERR_HDMI_COMPATIBILITY (TMBSL_ERR_HDMI_BASE + 0x001U) - -/** SW major version error */ -#define TMBSL_ERR_HDMI_MAJOR_VERSION (TMBSL_ERR_HDMI_BASE + 0x002U) - -/** SW component version error */ -#define TMBSL_ERR_HDMI_COMP_VERSION (TMBSL_ERR_HDMI_BASE + 0x003U) - -/** Invalid device unit number */ -#define TMBSL_ERR_HDMI_BAD_UNIT_NUMBER (TMBSL_ERR_HDMI_BASE + 0x005U) - -/** Invalid input parameter other than unit number */ -#define TMBSL_ERR_HDMI_BAD_PARAMETER (TMBSL_ERR_HDMI_BASE + 0x009U) - -/* Ressource not available */ -#define TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE (TMBSL_ERR_HDMI_BASE + 0x00CU) - -/** Inconsistent input parameters */ -#define TMBSL_ERR_HDMI_INCONSISTENT_PARAMS (TMBSL_ERR_HDMI_BASE + 0x010U) - -/** Component is not initialized */ -#define TMBSL_ERR_HDMI_NOT_INITIALIZED (TMBSL_ERR_HDMI_BASE + 0x011U) - -/** Command not supported for current device */ -#define TMBSL_ERR_HDMI_NOT_SUPPORTED (TMBSL_ERR_HDMI_BASE + 0x013U) - -/** Initialization failed */ -#define TMBSL_ERR_HDMI_INIT_FAILED (TMBSL_ERR_HDMI_BASE + 0x014U) - -/** Component is busy and cannot do a new operation */ -#define TMBSL_ERR_HDMI_BUSY (TMBSL_ERR_HDMI_BASE + 0x015U) - -/** I2C read error */ -#define TMBSL_ERR_HDMI_I2C_READ (TMBSL_ERR_HDMI_BASE + 0x017U) - -/** I2C write error */ -#define TMBSL_ERR_HDMI_I2C_WRITE (TMBSL_ERR_HDMI_BASE + 0x018U) - -/** Assertion failure */ -#define TMBSL_ERR_HDMI_ASSERTION (TMBSL_ERR_HDMI_BASE + 0x049U) - -/** Bad EDID block checksum */ -#define TMBSL_ERR_HDMI_INVALID_STATE (TMBSL_ERR_HDMI_BASE + 0x066U) -#define TMBSL_ERR_HDMI_INVALID_CHECKSUM TMBSL_ERR_HDMI_INVALID_STATE - -/** No connection to HPD pin */ -#define TMBSL_ERR_HDMI_NULL_CONNECTION (TMBSL_ERR_HDMI_BASE + 0x067U) - -/** Not allowed in DVI mode */ -#define TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED (TMBSL_ERR_HDMI_BASE + 0x068U) - -/** Maximum error code defined */ -#define TMBSL_ERR_HDMI_MAX TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED - -/*============================================================================*/ - -#define HDMITX_ENABLE_VP_TABLE_LEN 3 -#define HDMITX_GROUND_VP_TABLE_LEN 3 - -/** EDID block size */ -#define EDID_BLOCK_SIZE 128 - -/** size descriptor block of monitor descriptor */ -#define EDID_MONITOR_DESCRIPTOR_SIZE 13 - -/*@}*/ - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - -/** -* \brief TX IP/IC versions -*/ - typedef enum { - BSLHDMITX_UNKNOWN = 0x00, - /**< IC/IP is not recognized */ - BSLHDMITX_TDA9984, - /**< IC is a TDA9984 */ - BSLHDMITX_TDA9989, - /**< IC is a TDA9989 (TDA9989N2 64 balls) */ - BSLHDMITX_TDA9981, - /**< IC is a TDA9981 */ - BSLHDMITX_TDA9983, - /**< IC is a TDA9983 */ - BSLHDMITX_TDA19989, - /**< IC is a TDA19989 */ - BSLHDMITX_TDA19988, - /**< ok, u got it, it's a 19988 :p */ - } tmbslHdmiTxVersion_t; - - -/** - * \brief System function pointer type, to call user I2C read/write functions - * \param slaveAddr The I2C slave address - * \param firstRegister The first device register address to read or write - * \param lenData Length of data to read or write (i.e. no. of registers) - * \param pData Pointer to data to write, or to buffer to receive data - * \return The call result: - * - TM_OK: the call was successful - * - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing - * - TMBSL_ERR_HDMI_I2C_READ: failed when reading - */ - typedef struct _tmbslHdmiTxSysArgs_t { - UInt8 slaveAddr; - UInt8 firstRegister; - UInt8 lenData; - UInt8 *pData; - } tmbslHdmiTxSysArgs_t; - typedef tmErrorCode_t(*ptmbslHdmiTxSysFunc_t) (tmbslHdmiTxSysArgs_t *pSysArgs); - -/** - * \brief System function pointer type, to call user I2C EDID read function - * \param segPtrAddr The EDID segment pointer address 0 to 7Fh - * \param segPtr The EDID segment pointer 0 to 7Fh - * \param dataRegAddr The EDID data register address 0 to 7Fh - * \param wordOffset The first word offset 0 to FFh to read - * \param lenData Length of data to read (i.e. number of registers), - 1 to max starting at wordOffset - * \param pData Pointer to buffer to receive lenData data bytes - * \return The call result: - * - TM_OK: the call was successful - * - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing - * - TMBSL_ERR_HDMI_I2C_READ: failed when reading - */ - typedef struct _tmbslHdmiTxSysArgsEdid_t { - UInt8 segPtrAddr; - UInt8 segPtr; - UInt8 dataRegAddr; - UInt8 wordOffset; - UInt8 lenData; - UInt8 *pData; - } tmbslHdmiTxSysArgsEdid_t; - - -/** - * \brief EDID function pointer type, to call application EDID read function - * \param pSysArgs pointer to the structure containing necessary information to read EDID - */ - typedef tmErrorCode_t(*ptmbslHdmiTxSysFuncEdid_t) - (tmbslHdmiTxSysArgsEdid_t *pSysArgs); - -/** - * \brief Timer function pointer type, to call an application timer - * \param ms delay in milliseconds - */ - typedef Void(*ptmbslHdmiTxSysFuncTimer_t) (UInt16 ms); - -/*============================================================================*/ -/** - * \brief Callback function pointer type, to call a user interrupt handler - * \param txUnit: The transmitter unit that interrupted, 0 to max - */ - typedef Void(*ptmbslHdmiTxCallback_t) (tmUnitSelect_t txUnit); - -/*============================================================================*/ -/** - * EIA/CEA-861B video format type - */ - typedef enum { - HDMITX_VFMT_NULL = 0, /**< Not a valid format... */ - HDMITX_VFMT_NO_CHANGE = 0, /**< ...or no change required */ - HDMITX_VFMT_TV_MIN = 1, /**< Lowest valid TV format */ - HDMITX_VFMT_01_640x480p_60Hz = 1, - /**< Format 01 640 x 480p 60Hz */ - HDMITX_VFMT_02_720x480p_60Hz = 2, - /**< Format 02 720 x 480p 60Hz */ - HDMITX_VFMT_03_720x480p_60Hz = 3, - /**< Format 03 720 x 480p 60Hz */ - HDMITX_VFMT_04_1280x720p_60Hz = 4, - /**< Format 04 1280 x 720p 60Hz */ - HDMITX_VFMT_05_1920x1080i_60Hz = 5, - /**< Format 05 1920 x 1080i 60Hz */ - HDMITX_VFMT_06_720x480i_60Hz = 6, - /**< Format 06 720 x 480i 60Hz */ - HDMITX_VFMT_07_720x480i_60Hz = 7, - /**< Format 07 720 x 480i 60Hz */ - HDMITX_VFMT_08_720x240p_60Hz = 8, - /**< Format 08 720 x 240p 60Hz */ - HDMITX_VFMT_09_720x240p_60Hz = 9, - /**< Format 09 720 x 240p 60Hz */ - HDMITX_VFMT_10_720x480i_60Hz = 10, - /**< Format 10 720 x 480i 60Hz */ - HDMITX_VFMT_11_720x480i_60Hz = 11, - /**< Format 11 720 x 480i 60Hz */ - HDMITX_VFMT_12_720x240p_60Hz = 12, - /**< Format 12 720 x 240p 60Hz */ - HDMITX_VFMT_13_720x240p_60Hz = 13, - /**< Format 13 720 x 240p 60Hz */ - HDMITX_VFMT_14_1440x480p_60Hz = 14, - /**< Format 14 1440 x 480p 60Hz */ - HDMITX_VFMT_15_1440x480p_60Hz = 15, - /**< Format 15 1440 x 480p 60Hz */ - HDMITX_VFMT_16_1920x1080p_60Hz = 16, - /**< Format 16 1920 x 1080p 60Hz */ - HDMITX_VFMT_17_720x576p_50Hz = 17, - /**< Format 17 720 x 576p 50Hz */ - HDMITX_VFMT_18_720x576p_50Hz = 18, - /**< Format 18 720 x 576p 50Hz */ - HDMITX_VFMT_19_1280x720p_50Hz = 19, - /**< Format 19 1280 x 720p 50Hz */ - HDMITX_VFMT_20_1920x1080i_50Hz = 20, - /**< Format 20 1920 x 1080i 50Hz */ - HDMITX_VFMT_21_720x576i_50Hz = 21, - /**< Format 21 720 x 576i 50Hz */ - HDMITX_VFMT_22_720x576i_50Hz = 22, - /**< Format 22 720 x 576i 50Hz */ - HDMITX_VFMT_23_720x288p_50Hz = 23, - /**< Format 23 720 x 288p 50Hz */ - HDMITX_VFMT_24_720x288p_50Hz = 24, - /**< Format 24 720 x 288p 50Hz */ - HDMITX_VFMT_25_720x576i_50Hz = 25, - /**< Format 25 720 x 576i 50Hz */ - HDMITX_VFMT_26_720x576i_50Hz = 26, - /**< Format 26 720 x 576i 50Hz */ - HDMITX_VFMT_27_720x288p_50Hz = 27, - /**< Format 27 720 x 288p 50Hz */ - HDMITX_VFMT_28_720x288p_50Hz = 28, - /**< Format 28 720 x 288p 50Hz */ - HDMITX_VFMT_29_1440x576p_50Hz = 29, - /**< Format 29 1440 x 576p 50Hz */ - HDMITX_VFMT_30_1440x576p_50Hz = 30, - /**< Format 30 1440 x 576p 50Hz */ - HDMITX_VFMT_31_1920x1080p_50Hz = 31, - /**< Format 31 1920 x 1080p 50Hz */ - HDMITX_VFMT_32_1920x1080p_24Hz = 32, - /**< Format 32 1920 x 1080p 24Hz */ - - HDMITX_VFMT_TV_NO_REG_MIN = 32, - /**< Lowest TV format without prefetched table */ - - HDMITX_VFMT_33_1920x1080p_25Hz = 33, - /**< Format 33 1920 x 1080p 25Hz */ - HDMITX_VFMT_34_1920x1080p_30Hz = 34, - /**< Format 34 1920 x 1080p 30Hz */ - HDMITX_VFMT_35_2880x480p_60Hz = 35, - /**< Format 35 2880 x 480p 60Hz 4:3 */ - HDMITX_VFMT_36_2880x480p_60Hz = 36, - /**< Format 36 2880 x 480p 60Hz 16:9 */ - HDMITX_VFMT_37_2880x576p_50Hz = 37, - /**< Format 37 2880 x 576p 50Hz 4:3 */ - HDMITX_VFMT_38_2880x576p_50Hz = 38, - /**< Format 38 2880 x 576p 50Hz 16:9 */ - - HDMITX_VFMT_INDEX_60_1280x720p_24Hz = 39, - /**< Index of HDMITX_VFMT_60_1280x720p_24Hz */ - HDMITX_VFMT_60_1280x720p_24Hz = 60, - /**< Format 60 1280 x 720p 23.97/24Hz 16:9 */ - HDMITX_VFMT_61_1280x720p_25Hz = 61, - /**< Format 61 1280 x 720p 25Hz 16:9 */ - HDMITX_VFMT_62_1280x720p_30Hz = 62, - /**< Format 60 1280 x 720p 29.97/30Hz 16:9 */ - - HDMITX_VFMT_TV_MAX = 62, /**< Highest valid TV format value */ - HDMITX_VFMT_TV_NUM = 42, /**< Number of TV formats + null, it is also the Index of PC_MIN */ - - HDMITX_VFMT_PC_MIN = 128, /**< Lowest valid PC format */ - HDMITX_VFMT_PC_640x480p_60Hz = 128, - /**< PC format 128 */ - HDMITX_VFMT_PC_800x600p_60Hz = 129, - /**< PC format 129 */ - HDMITX_VFMT_PC_1152x960p_60Hz = 130, - /**< PC format 130 */ - HDMITX_VFMT_PC_1024x768p_60Hz = 131, - /**< PC format 131 */ - HDMITX_VFMT_PC_1280x768p_60Hz = 132, - /**< PC format 132 */ - HDMITX_VFMT_PC_1280x1024p_60Hz = 133, - /**< PC format 133 */ - HDMITX_VFMT_PC_1360x768p_60Hz = 134, - /**< PC format 134 */ - HDMITX_VFMT_PC_1400x1050p_60Hz = 135, - /**< PC format 135 */ - HDMITX_VFMT_PC_1600x1200p_60Hz = 136, - /**< PC format 136 */ - HDMITX_VFMT_PC_1024x768p_70Hz = 137, - /**< PC format 137 */ - HDMITX_VFMT_PC_640x480p_72Hz = 138, - /**< PC format 138 */ - HDMITX_VFMT_PC_800x600p_72Hz = 139, - /**< PC format 139 */ - HDMITX_VFMT_PC_640x480p_75Hz = 140, - /**< PC format 140 */ - HDMITX_VFMT_PC_1024x768p_75Hz = 141, - /**< PC format 141 */ - HDMITX_VFMT_PC_800x600p_75Hz = 142, - /**< PC format 142 */ - HDMITX_VFMT_PC_1024x864p_75Hz = 143, - /**< PC format 143 */ - HDMITX_VFMT_PC_1280x1024p_75Hz = 144, - /**< PC format 144 */ - HDMITX_VFMT_PC_640x350p_85Hz = 145, - /**< PC format 145 */ - HDMITX_VFMT_PC_640x400p_85Hz = 146, - /**< PC format 146 */ - HDMITX_VFMT_PC_720x400p_85Hz = 147, - /**< PC format 147 */ - HDMITX_VFMT_PC_640x480p_85Hz = 148, - /**< PC format 148 */ - HDMITX_VFMT_PC_800x600p_85Hz = 149, - /**< PC format 149 */ - HDMITX_VFMT_PC_1024x768p_85Hz = 150, - /**< PC format 150 */ - HDMITX_VFMT_PC_1152x864p_85Hz = 151, - /**< PC format 151 */ - HDMITX_VFMT_PC_1280x960p_85Hz = 152, - /**< PC format 152 */ - HDMITX_VFMT_PC_1280x1024p_85Hz = 153, - /**< PC format 153 */ - HDMITX_VFMT_PC_1024x768i_87Hz = 154, - /**< PC format 154 */ - HDMITX_VFMT_PC_MAX = 154, /**< Highest valid PC format */ - HDMITX_VFMT_PC_NUM = (1 + 154 - 128) - /**< Number of PC formats */ - } tmbslHdmiTxVidFmt_t; - -/*============================================================================*/ -/** - * tmbslTDA9984AudioInSetConfig() parameter types - */ -/** Audio input formats */ - typedef enum { - HDMITX_AFMT_SPDIF = 0, /**< SPDIF */ - HDMITX_AFMT_I2S = 1, /**< I2S */ - HDMITX_AFMT_OBA = 2, /**< One bit audio / DSD */ - HDMITX_AFMT_DST = 3, /**< DST */ - HDMITX_AFMT_HBR = 4, /**< HBR */ - HDMITX_AFMT_NUM = 5, /**< Number of Audio input format */ - HDMITX_AFMT_INVALID = 5 /**< Invalid format */ - } tmbslHdmiTxaFmt_t; - -/** I2s formats */ - typedef enum { - HDMITX_I2SFOR_PHILIPS_L = 0, - /**< Philips like format */ - HDMITX_I2SFOR_OTH_L = 2,/**< Other non Philips left justified */ - HDMITX_I2SFOR_OTH_R = 3,/**< Other non Philips right justified */ - HDMITX_I2SFOR_INVALID = 4 - /**< Invalid format*/ - } tmbslHdmiTxI2sFor_t; - -/** DSD clock polarities */ - typedef enum { - HDMITX_CLKPOLDSD_ACLK = 0, - /**< Same as ACLK */ - HDMITX_CLKPOLDSD_NACLK = 1, - /**< Not ACLK, i.e. inverted */ - HDMITX_CLKPOLDSD_NO_CHANGE = 2, - /**< No change */ - HDMITX_CLKPOLDSD_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxClkPolDsd_t; - -/** DSD data swap values */ - typedef enum { - HDMITX_SWAPDSD_OFF = 0, /**< No swap */ - HDMITX_SWAPDSD_ON = 1, /**< Swap */ - HDMITX_SWAPDSD_NO_CHANGE = 2, - /**< No change */ - HDMITX_SWAPDSD_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxSwapDsd_t; - -/** DST data transfer rates */ - typedef enum { - HDMITX_DSTRATE_SINGLE = 0, - /**< Single transfer rate */ - HDMITX_DSTRATE_DOUBLE = 1, - /**< Double data rate */ - HDMITX_DSTRATE_NO_CHANGE = 2, - /**< No change */ - HDMITX_DSTRATE_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxDstRate_t; - -/** I2S, SPDIF and DSD channel allocation values */ - enum _tmbslHdmiTxChan { - HDMITX_CHAN_MIN = 0, - HDMITX_CHAN_MAX = 31, - HDMITX_CHAN_NO_CHANGE = 32, - HDMITX_CHAN_INVALID = 33 - }; - -/** Audio layout values */ - enum _tmbslHdmiTxLayout { - HDMITX_LAYOUT_MIN = 0, - HDMITX_LAYOUT_MAX = 1, - HDMITX_LAYOUT_NO_CHANGE = 2, - HDMITX_LAYOUT_INVALID = 3 - }; - -/** Audio FIFO read latency values */ - enum _tmbslHdmiTxlatency_rd { - HDMITX_LATENCY_MIN = 0x000, - HDMITX_LATENCY_CURRENT = 0x080, - HDMITX_LATENCY_MAX = 0x0FF, - HDMITX_LATENCY_NO_CHANGE = 0x100, - HDMITX_LATENCY_INVALID = 0x101 - }; - -/*============================================================================*/ -/** - * tmbslTDA9984AudioInSetCts() parameter types - */ -/** Clock Time Stamp reference source */ - typedef enum { - HDMITX_CTSREF_ACLK = 0, - /**< Clock input pin for I2S */ - HDMITX_CTSREF_MCLK = 1, - /**< Clock input pin for EXTREF */ - HDMITX_CTSREF_FS64SPDIF = 2, - /**< 64xsample rate, for SPDIF */ - HDMITX_CTSREF_INVALID = 3 - /**< Invalid value */ - } tmbslHdmiTxctsRef_t; - -/** Audio sample rate kHz indexes */ - typedef enum { - HDMITX_AFS_32k = 0, /**< 32kHz */ - HDMITX_AFS_44_1k = 1, /**< 44.1kHz */ - HDMITX_AFS_48K = 2, /**< 48kHz */ - HDMITX_AFS_88_2K = 3, /**< 88.2kHz */ - HDMITX_AFS_96K = 4, /**< 96kHz */ - HDMITX_AFS_176_4K = 5,/**< 176.4kHz */ - HDMITX_AFS_192K = 6, /**< 192kHz */ - HDMITX_AFS_768K = 7, /**< 768kHz */ - HDMITX_AFS_NOT_INDICATED = 8, - /**< Not Indicated (Channel Status) */ - HDMITX_AFS_INVALID = 8, - /**< Invalid */ - HDMITX_AFS_NUM = 8 /**< # rates */ - } tmbslHdmiTxafs_t; - -/** Vertical output frequencies */ - typedef enum { - HDMITX_VFREQ_24Hz = 0, - /**< 24Hz */ - HDMITX_VFREQ_25Hz = 1, /**< 25Hz */ - HDMITX_VFREQ_30Hz = 2, /**< 30Hz */ - HDMITX_VFREQ_50Hz = 3, - /**< 50Hz */ - HDMITX_VFREQ_59Hz = 4, - /**< 59.94Hz */ - HDMITX_VFREQ_60Hz = 5, - /**< 60Hz */ -#ifndef FORMAT_PC - HDMITX_VFREQ_INVALID = 6, - /**< Invalid */ - HDMITX_VFREQ_NUM = 6/**< No. of values */ -#else /* FORMAT_PC */ - HDMITX_VFREQ_70Hz = 6, - /**< 70Hz */ - HDMITX_VFREQ_72Hz = 7, - /**< 72Hz */ - HDMITX_VFREQ_75Hz = 8, - /**< 75Hz */ - HDMITX_VFREQ_85Hz = 9, - /**< 85Hz */ - HDMITX_VFREQ_87Hz = 10, - /**< 87Hz */ - HDMITX_VFREQ_INVALID = 11, - /**< Invalid */ - HDMITX_VFREQ_NUM = 11 - /**< No. of values */ -#endif /* FORMAT_PC */ - } tmbslHdmiTxVfreq_t; - -/** Clock Time Stamp predivider - scales N */ - typedef enum { - HDMITX_CTSK1 = 0, /**< k=1 */ - HDMITX_CTSK2 = 1, /**< k=2 */ - HDMITX_CTSK3 = 2, /**< k=3 */ - HDMITX_CTSK4 = 3, /**< k=4 */ - HDMITX_CTSK8 = 4, /**< k=8 */ - HDMITX_CTSK_USE_CTSX = 5, - /**< Calculate from ctsX factor */ - HDMITX_CTSK_INVALID = 6 - /**< Invalid */ - } tmbslHdmiTxctsK_t; - -/** Clock Time Stamp postdivider measured time stamp */ - typedef enum { - HDMITX_CTSMTS = 0, /**< =mts */ - HDMITX_CTSMTS2 = 1, /**< =mts%2 */ - HDMITX_CTSMTS4 = 2, /**< =mts%4 */ - HDMITX_CTSMTS8 = 3, /**< =mts%8 */ - HDMITX_CTSMTS_USE_CTSX = 4, - /**< Calculate from ctsX factor */ - HDMITX_CTSMTS_INVALID = 5 - /**< Invalid */ - } tmbslHdmiTxctsM_t; - -/** Cycle Time Stamp values */ - enum _tmbslHdmiTxCts { - HDMITX_CTS_AUTO = 0, - HDMITX_CTS_MIN = 0x000001 - }; - -/** Cycle Time Stamp X factors */ - enum _tmbslHdmiTxCtsX { - HDMITX_CTSX_16 = 0, - HDMITX_CTSX_32 = 1, - HDMITX_CTSX_48 = 2, - HDMITX_CTSX_64 = 3, - HDMITX_CTSX_128 = 4, - HDMITX_CTSX_NUM = 5, - HDMITX_CTSX_UNUSED = 5, - /**< CTX value unused when K and Mts used */ - HDMITX_CTSX_INVALID = 6 - }; - - -/*============================================================================*/ -/** - * tmbslTDA9984AudioOutSetChanStatus() parameter types - */ - - typedef enum { - HDMITX_AUDIO_DATA_PCM = 0, - /**< Main data field represents linear PCM samples. */ - HDMITX_AUDIO_DATA_OTHER = 1, - /**< Main data field used for purposes other purposes. */ - HDMITX_AUDIO_DATA_INVALID = 2 - /**< Invalid value */ - } tmbslHdmiTxAudioData_t; - -/** BYTE 0: Channel Status Format information */ - typedef enum { - HDMITX_CSFI_PCM_2CHAN_NO_PRE = 0, - /**< PCM 2 channels without pre-emphasis */ - HDMITX_CSFI_PCM_2CHAN_PRE = 1, - /**< PCM 2 channels with 50us/15us pre-emphasis */ - HDMITX_CSFI_PCM_2CHAN_PRE_RSVD1 = 2, - /**< PCM Reserved for 2 channels with pre-emphasis */ - HDMITX_CSFI_PCM_2CHAN_PRE_RSVD2 = 3, - /**< PCM Reserved for 2 channels with pre-emphasis */ - HDMITX_CSFI_NOTPCM_DEFAULT = 4, - /**< Non-PCM Default state */ - HDMITX_CSFI_INVALID = 5 /**< Invalid value */ - } tmbslHdmiTxCSformatInfo_t; - -/** BYTE 0: Channel Status Copyright assertion */ - typedef enum { - HDMITX_CSCOPYRIGHT_PROTECTED = 0, - /**< Copyright protected */ - HDMITX_CSCOPYRIGHT_UNPROTECTED = 1, - /**< Not copyright protected */ - HDMITX_CSCOPYRIGHT_INVALID = 2 - /**< Invalid value */ - } tmbslHdmiTxCScopyright_t; - -/** BYTE 3: Channel Status Clock Accuracy */ - typedef enum { - HDMITX_CSCLK_LEVEL_II = 0, - /**< Level II */ - HDMITX_CSCLK_LEVEL_I = 1, - /**< Level I */ - HDMITX_CSCLK_LEVEL_III = 2, - /**< Level III */ - HDMITX_CSCLK_NOT_MATCHED = 3, - /**< Not matched to sample freq. */ - HDMITX_CSCLK_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxCSclkAcc_t; - -/** BYTE 4: Channel Status Maximum sample word length */ - typedef enum { - HDMITX_CSMAX_LENGTH_20 = 0, - /**< Max word length is 20 bits */ - HDMITX_CSMAX_LENGTH_24 = 1, - /**< Max word length is 24 bits */ - HDMITX_CSMAX_INVALID = 2 - /**< Invalid value */ - } tmbslHdmiTxCSmaxWordLength_t; - - -/** BYTE 4: Channel Status Sample word length */ - typedef enum { - HDMITX_CSWORD_DEFAULT = 0, /**< Word length is not indicated */ - HDMITX_CSWORD_20_OF_24 = 1, /**< Sample length is 20 bits out of max 24 possible */ - HDMITX_CSWORD_16_OF_20 = 1, /**< Sample length is 16 bits out of max 20 possible */ - HDMITX_CSWORD_22_OF_24 = 2, /**< Sample length is 22 bits out of max 24 possible */ - HDMITX_CSWORD_18_OF_20 = 2, /**< Sample length is 18 bits out of max 20 possible */ - HDMITX_CSWORD_RESVD = 3, /**< Reserved - shall not be used */ - HDMITX_CSWORD_23_OF_24 = 4, /**< Sample length is 23 bits out of max 24 possible */ - HDMITX_CSWORD_19_OF_20 = 4, /**< Sample length is 19 bits out of max 20 possible */ - HDMITX_CSWORD_24_OF_24 = 5, /**< Sample length is 24 bits out of max 24 possible */ - HDMITX_CSWORD_20_OF_20 = 5, /**< Sample length is 20 bits out of max 20 possible */ - HDMITX_CSWORD_21_OF_24 = 6, /**< Sample length is 21 bits out of max 24 possible */ - HDMITX_CSWORD_17_OF_20 = 6, /**< Sample length is 17 bits out of max 20 possible */ - HDMITX_CSWORD_INVALID = 7 /**< Invalid */ - } tmbslHdmiTxCSwordLength_t; - -/** BYTE 4: Channel Status Original sample frequency */ - typedef enum { - HDMITX_CSOFREQ_NOT_INDICATED = 0, - /**< Not Indicated */ - HDMITX_CSOFREQ_192k = 1,/**< 192kHz */ - HDMITX_CSOFREQ_12k = 2, /**< 12kHz */ - HDMITX_CSOFREQ_176_4k = 3, - /**< 176.4kHz */ - HDMITX_CSOFREQ_RSVD1 = 4, - /**< Reserved */ - HDMITX_CSOFREQ_96k = 5, /**< 96kHz */ - HDMITX_CSOFREQ_8k = 6, /**< 8kHz */ - HDMITX_CSOFREQ_88_2k = 7, - /**< 88.2kHz */ - HDMITX_CSOFREQ_16k = 8, /**< 16kHz */ - HDMITX_CSOFREQ_24k = 9, /**< 24kHz */ - HDMITX_CSOFREQ_11_025k = 10, - /**< 11.025kHz */ - HDMITX_CSOFREQ_22_05k = 11, - /**< 22.05kHz */ - HDMITX_CSOFREQ_32k = 12,/**< 32kHz */ - HDMITX_CSOFREQ_48k = 13,/**< 48kHz */ - HDMITX_CSOFREQ_RSVD2 = 14, - /**< Reserved */ - HDMITX_CSOFREQ_44_1k = 15, - /**< 44.1kHz */ - HDMITX_CSAFS_INVALID = 16 - /**< Invalid value */ - } tmbslHdmiTxCSorigAfs_t; - -/*============================================================================*/ -/** - * tmbslTDA9984AudioOutSetChanStatusMapping() parameter types - */ -/** Channel Status source/channel number limits */ - enum _tmbslHdmiTxChanStatusChanLimits { - HDMITX_CS_CHANNELS_MAX = 0x0F, - HDMITX_CS_SOURCES_MAX = 0x0F - }; - -/*============================================================================*/ -/** - * tmbslTDA9984AudioOutSetMute() parameter type - */ -/** Audio mute state */ - typedef enum { - HDMITX_AMUTE_OFF = 0, - /**< Mute off */ - HDMITX_AMUTE_ON = 1, - /**< Mute on */ - HDMITX_AMUTE_INVALID = 2 - /**< Invalid */ - } tmbslHdmiTxaMute_t; - -/** Number of 3 byte Short Audio Descriptors stored in pEdidAFmts */ -#define HDMI_TX_SAD_MAX_CNT 30 - -/*============================================================================*/ -/** - * tmbslTDA9984EdidGetBlockData() parameter types - */ -/** An enum to represent the current EDID status */ - enum _tmbslHdmiTxEdidSta_t { - HDMITX_EDID_READ = 0, /* All blocks read OK */ - HDMITX_EDID_READ_INCOMPLETE = 1, /* All blocks read OK but buffer too - small to return all of them */ - HDMITX_EDID_ERROR_CHK_BLOCK_0 = 2, /* Block 0 checksum error */ - - HDMITX_EDID_ERROR_CHK = 3, /* Block 0 OK, checksum error in one - or more other blocks */ - HDMITX_EDID_NOT_READ = 4, /* EDID not read */ - - HDMITX_EDID_STATUS_INVALID = 5 - /**< Invalid */ - }; - -/*============================================================================*/ -/** - * tmbslTDA9984EdidGetSinkType() parameter types - */ -/** Sink device type */ - typedef enum { - HDMITX_SINK_DVI = 0, /**< DVI */ - HDMITX_SINK_HDMI = 1, /**< HDMI */ - HDMITX_SINK_EDID = 2, /**< As currently defined in EDID */ - HDMITX_SINK_INVALID = 3 /**< Invalid */ - } tmbslHdmiTxSinkType_t; - -/*============================================================================*/ -/** - * \brief The tmbslTDA9984EdidGetVideoPreferred() parameter type - * Detailed timining description structure - */ - typedef struct _tmbslHdmiTxEdidDtd_t { - UInt16 uPixelClock; - /**< Pixel Clock/10,000 */ - UInt16 uHActivePixels; - /**< Horizontal Active Pixels */ - UInt16 uHBlankPixels; - /**< Horizontal Blanking Pixels */ - UInt16 uVActiveLines; - /**< Vertical Active Lines */ - UInt16 uVBlankLines; - /**< Vertical Blanking Lines */ - UInt16 uHSyncOffset; - /**< Horizontal Sync Offset */ - UInt16 uHSyncWidth; - /**< Horiz. Sync Pulse Width */ - UInt16 uVSyncOffset; - /**< Vertical Sync Offset */ - UInt16 uVSyncWidth; - /**< Vertical Sync Pulse Width */ - UInt16 uHImageSize; - /**< Horizontal Image Size */ - UInt16 uVImageSize; - /**< Vertical Image Size */ - UInt16 uHBorderPixels; - /**< Horizontal Border */ - UInt16 uVBorderPixels; - /**< Vertical Border */ - UInt8 Flags; /**< Interlace/sync info */ - } tmbslHdmiTxEdidDtd_t; - - -/*============================================================================*/ -/** - * First monitor descriptor structure - */ - typedef struct _tmbslHdmiTxEdidFirstMD_t { - Bool bDescRecord; /**< True when parameters of struct are available */ - UInt8 uMonitorName[EDID_MONITOR_DESCRIPTOR_SIZE]; - /**< Monitor Name */ - } tmbslHdmiTxEdidFirstMD_t; - -/*============================================================================*/ -/** - * Second monitor descriptor structure - */ - typedef struct _tmbslHdmiTxEdidSecondMD_t { - Bool bDescRecord; /**< True when parameters of struct are available */ - UInt8 uMinVerticalRate; /**< Min vertical rate in Hz */ - UInt8 uMaxVerticalRate; /**< Max vertical rate in Hz */ - UInt8 uMinHorizontalRate; /**< Min horizontal rate in Hz */ - UInt8 uMaxHorizontalRate; /**< Max horizontal rate in Hz */ - UInt8 uMaxSupportedPixelClk; /**< Max suuported pixel clock rate in MHz */ - } tmbslHdmiTxEdidSecondMD_t; - -/*============================================================================*/ -/** - * Other monitor descriptor structure - */ - typedef struct _tmbslHdmiTxEdidOtherMD_t { - Bool bDescRecord; /**< True when parameters of struct are available */ - UInt8 uOtherDescriptor[EDID_MONITOR_DESCRIPTOR_SIZE]; - /**< Other monitor Descriptor */ - } tmbslHdmiTxEdidOtherMD_t; - -/*============================================================================*/ -/** - * basic display parameters structure - */ - typedef struct _tmbslHdmiTxEdidBDParam_t { - UInt8 uVideoInputDef; - /**< Video Input Definition */ - UInt8 uMaxHorizontalSize; - /**< Max. Horizontal Image Size in cm */ - UInt8 uMaxVerticalSize; - /**< Max. Vertical Image Size in cm */ - UInt8 uGamma; /**< Gamma */ - UInt8 uFeatureSupport; - /**< Feature support */ - } tmbslHdmiTxEdidBDParam_t; - -/*============================================================================*/ -/** - * \brief The tmbslTDA9984EdidGetAudioCapabilities() parameter type - */ - typedef struct _tmbslHdmiTxEdidSad_t { - UInt8 ModeChans; /* Bits[6:3]: EIA/CEA861 mode; Bits[2:0]: channels */ - UInt8 Freqs; /* Bits for each supported frequency */ - UInt8 Byte3; /* EIA/CEA861B p83: data depending on audio mode */ - } tmbslHdmiTxEdidSad_t; - -/*============================================================================*/ -/** - * \brief struc to store parameter provide by function tmbslTDA9984EdidRequestBlockData() - */ - typedef struct _tmbslHdmiTxEdidToApp_t { - UInt8 *pRawEdid; /* pointer on a tab to store edid requested by application */ - Int numBlocks; /* number of edid block requested by application */ - } tmbslHdmiTxEdidToApp_t; - -/*============================================================================*/ -/** - * tmbslTDA9984EdidGetVideoCapabilities() parameter types - */ -/** Number of 1 byte Short Video Descriptors stored in pEdidVFmts */ -#define HDMI_TX_SVD_MAX_CNT 113 - -/** number of detailed timing descriptor stored in BSL */ -#define NUMBER_DTD_STORED 10 - - - -/** Flag set in Short Video Descriptor to indicate native format */ -#define HDMI_TX_SVD_NATIVE_MASK 0x80 -#define HDMI_TX_SVD_NATIVE_NOT 0x7F - -/** Video capability flags */ - enum _tmbslHdmiTxVidCap_t { - HDMITX_VIDCAP_UNDERSCAN = 0x80, - /**< Underscan supported */ - HDMITX_VIDCAP_YUV444 = 0x40, - /**< YCbCr 4:4:4 supported */ - HDMITX_VIDCAP_YUV422 = 0x20, - /**< YCbCr 4:2:2 supported */ - HDMITX_VIDCAP_UNUSED = 0x1F - /**< Unused flags */ - }; - -/*============================================================================*/ -/** - * tmbslTDA9984HdcpCheck() parameter type - */ -/** HDCP check result */ - typedef enum { - HDMITX_HDCP_CHECK_NOT_STARTED = 0, - /**< Check not started */ - HDMITX_HDCP_CHECK_IN_PROGRESS = 1, - /**< No failures, more to do */ - HDMITX_HDCP_CHECK_PASS = 2, /**< Final check has passed */ - HDMITX_HDCP_CHECK_FAIL_FIRST = 3, - /**< First check failure code */ - HDMITX_HDCP_CHECK_FAIL_DRIVER_STATE = 3, - /**< Driver not AUTHENTICATED */ - HDMITX_HDCP_CHECK_FAIL_DEVICE_T0 = 4, - /**< A T0 interrupt occurred */ - HDMITX_HDCP_CHECK_FAIL_DEVICE_RI = 5, - /**< Device RI changed */ - HDMITX_HDCP_CHECK_FAIL_DEVICE_FSM = 6, - /**< Device FSM not 10h */ - HDMITX_HDCP_CHECK_NUM = 7 /**< Number of check results */ - } tmbslHdmiTxHdcpCheck_t; - -/*============================================================================*/ -/** - * tmbslTDA9984HdcpConfigure() parameter type - */ -/** HDCP DDC slave addresses */ - enum _tmbslHdmiTxHdcpSlaveAddress { - HDMITX_HDCP_SLAVE_PRIMARY = 0x74, - HDMITX_HDCP_SLAVE_SECONDARY = 0x76 - }; - -/** HDCP transmitter modes */ - typedef enum { - HDMITX_HDCP_TXMODE_NOT_SET = 0, - HDMITX_HDCP_TXMODE_REPEATER = 1, - HDMITX_HDCP_TXMODE_TOP_LEVEL = 2, - HDMITX_HDCP_TXMODE_MAX = 2 - } tmbslHdmiTxHdcpTxMode_t; - -/** HDCP option flags */ - typedef enum { - HDMITX_HDCP_OPTION_FORCE_PJ_IGNORED = 0x01, /* Not set: obey PJ result */ - HDMITX_HDCP_OPTION_FORCE_SLOW_DDC = 0x02, /* Not set: obey BCAPS setting */ - HDMITX_HDCP_OPTION_FORCE_NO_1_1 = 0x04, /* Not set: obey BCAPS setting */ - HDMITX_HDCP_OPTION_FORCE_REPEATER = 0x08, /* Not set: obey BCAPS setting */ - HDMITX_HDCP_OPTION_FORCE_NO_REPEATER = 0x10, /* Not set: obey BCAPS setting */ - HDMITX_HDCP_OPTION_FORCE_V_EQU_VBAR = 0x20, /* Not set: obey V=V' result */ - HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC = 0x40, /* Set: 50kHz DDC */ - HDMITX_HDCP_OPTION_DEFAULT = 0x00, /* All the above Not Set vals */ - HDMITX_HDCP_OPTION_MASK = 0x7F, /* Only these bits are allowed */ - HDMITX_HDCP_OPTION_MASK_BAD = 0x80 /* These bits are not allowed */ - } tmbslHdmiTxHdcpOptions_t; - -/*============================================================================*/ -/** - * tmbslTDA9984HdcpDownloadKeys() parameter type - */ -/** HDCP decryption mode */ - typedef enum { - HDMITX_HDCP_DECRYPT_DISABLE = 0, - HDMITX_HDCP_DECRYPT_ENABLE = 1, - HDMITX_HDCP_DECRYPT_MAX = 1 - } tmbslHdmiTxDecrypt_t; - -/*============================================================================*/ -/** - * tmbslTDA9984HdcpHandleBSTATUS() parameter type - */ -/** BSTATUS bit fields */ - enum _tmbslHdmiTxHdcpHandleBSTATUS { - HDMITX_HDCP_BSTATUS_HDMI_MODE = 0x1000, - HDMITX_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED = 0x0800, - HDMITX_HDCP_BSTATUS_CASCADE_DEPTH = 0x0700, - HDMITX_HDCP_BSTATUS_MAX_DEVS_EXCEEDED = 0x0080, - HDMITX_HDCP_BSTATUS_DEVICE_COUNT = 0x007F - }; - -/*============================================================================*/ -/** - * tmbslTDA9984HdcpHandleSHA_1() parameter types - */ -/** KSV list sizes */ - enum _tmbslHdmiTxHdcpHandleSHA_1 { - HDMITX_KSV_LIST_MAX_DEVICES = 128, - HDMITX_KSV_BYTES_PER_DEVICE = 5 - }; - -/*============================================================================*/ -/** - * tmbslTDA9984HotPlugGetStatus() parameter type - */ -/** Current hotplug status */ - typedef enum { - HDMITX_HOTPLUG_INACTIVE = 0, - /**< Hotplug inactive */ - HDMITX_HOTPLUG_ACTIVE = 1, - /**< Hotplug active */ - HDMITX_HOTPLUG_INVALID = 2 - /**< Invalid Hotplug */ - } tmbslHdmiTxHotPlug_t; - -/*============================================================================*/ -/** - * tmbslTDA9984RxSenseGetStatus() parameter type - */ -/** Current RX Sense status */ - typedef enum { - HDMITX_RX_SENSE_INACTIVE = 0, - /**< RxSense inactive */ - HDMITX_RX_SENSE_ACTIVE = 1, - /**< RxSense active */ - HDMITX_RX_SENSE_INVALID = 2 - /**< Invalid RxSense */ - } tmbslHdmiTxRxSense_t; - -/*============================================================================*/ -/** - * tmbslTDA9984HwGetCapabilities() parameter type - */ -/** List of HW features that may be supported by HW */ - typedef enum { - HDMITX_FEATURE_HW_HDCP = 0, /**< HDCP feature */ - HDMITX_FEATURE_HW_SCALER = 1,/**< Scaler feature */ - HDMITX_FEATURE_HW_AUDIO_OBA = 2, - /**< One Bit Audio feature */ - HDMITX_FEATURE_HW_AUDIO_DST = 3, - /**< DST Audio feature */ - HDMITX_FEATURE_HW_AUDIO_HBR = 4, - /**< HBR Audio feature */ - HDMITX_FEATURE_HW_HDMI_1_1 = 5, - /**< HDMI 1.1 feature */ - HDMITX_FEATURE_HW_HDMI_1_2A = 6, - /**< HDMI 1.2a feature */ - HDMITX_FEATURE_HW_HDMI_1_3A = 7, - /**< HDMI 1.3a feature */ - HDMITX_FEATURE_HW_DEEP_COLOR_30 = 8, - /**< 30 bits deep color support */ - HDMITX_FEATURE_HW_DEEP_COLOR_36 = 9, - /**< 36 bits deep color support */ - HDMITX_FEATURE_HW_DEEP_COLOR_48 = 11, - /**< 48 bits deep color support */ - HDMITX_FEATURE_HW_UPSAMPLER = 12, - /**< Up sampler feature */ - HDMITX_FEATURE_HW_DOWNSAMPLER = 13, - /**< Down sampler feature */ - HDMITX_FEATURE_HW_COLOR_CONVERSION = 14 - /**< Color conversion matrix */ - } tmbslHdmiTxHwFeature_t; - -/*============================================================================*/ -/** - * tmbslTDA9984Init() parameter types - */ -/** Supported range of I2C slave addresses */ - enum _tmbslHdmiTxSlaveAddress { - HDMITX_SLAVE_ADDRESS_MIN = 1, - HDMITX_SLAVE_ADDRESS_MAX = 127 - }; - -/** - * Indexes into the funcCallback[] array of interrupt callback function pointers - */ - typedef enum _tmbslHdmiTxCallbackInt { - HDMITX_CALLBACK_INT_SECURITY = 0, - /**< HDCP encryption switched off */ - HDMITX_CALLBACK_INT_ENCRYPT = 0, - /**< HDCP encrypt as above (Obsolete) */ - HDMITX_CALLBACK_INT_HPD = 1, /**< Transition on HPD input */ - HDMITX_CALLBACK_INT_T0 = 2, /**< HDCP state machine in state T0 */ - HDMITX_CALLBACK_INT_BCAPS = 3,/**< BCAPS available */ - HDMITX_CALLBACK_INT_BSTATUS = 4, - /**< BSTATUS available */ - HDMITX_CALLBACK_INT_SHA_1 = 5,/**< sha-1(ksv,bstatus,m0)=V' */ - HDMITX_CALLBACK_INT_PJ = 6, /**< pj=pj' check fails */ - HDMITX_CALLBACK_INT_R0 = 7, /**< R0 interrupt */ - HDMITX_CALLBACK_INT_SW_INT = 8, - /**< SW DEBUG interrupt */ - HDMITX_CALLBACK_INT_RX_SENSE = 9, - /**< RX SENSE interrupt */ - HDMITX_CALLBACK_INT_EDID_BLK_READ = 10, - /**< EDID BLK READ interrupt */ - HDMITX_CALLBACK_INT_PLL_LOCK = 11, - /**< Pll Lock (Serial or Formatter) */ - HDMITX_CALLBACK_INT_VS_RPT = 12, - /**< VS Interrupt for Gamut packets */ - HDMITX_CALLBACK_INT_NUM = 13 /**< Number of callbacks */ - } tmbslHdmiTxCallbackInt_t; - -/** Pixel rate */ - typedef enum { - HDMITX_PIXRATE_DOUBLE = 0, /**< Double pixel rate */ - HDMITX_PIXRATE_SINGLE = 1, /**< Single pixel rate */ - HDMITX_PIXRATE_SINGLE_REPEATED = 2, /**< Single pixel repeated */ - HDMITX_PIXRATE_NO_CHANGE = 3, /**< No Change */ - HDMITX_PIXRATE_INVALID = 4 /**< Invalid */ - } tmbslHdmiTxPixRate_t; - -/** - * \brief The tmbslTDA9984Init() parameter structure - */ - typedef struct _tmbslHdmiTxCallbackList_t { - /** Interrupt callback function pointers (each ptr if null = not used) */ - ptmbslHdmiTxCallback_t funcCallback[HDMITX_CALLBACK_INT_NUM]; - - } tmbslHdmiTxCallbackList_t; - -/*============================================================================*/ -/** - * tmbslTDA9984MatrixSetCoeffs() parameter type - */ -/** Parameter structure array size */ - enum _tmbslHdmiTxMatCoeff { - HDMITX_MAT_COEFF_NUM = 9 - }; - - -/** \brief The tmbslTDA9984MatrixSetCoeffs() parameter structure */ -/** Array of coefficients (values -1024 to +1023) */ - typedef struct _tmbslHdmiTxMatCoeff_t { - /** Array of coefficients (values -1024 to +1023) */ - Int16 Coeff[HDMITX_MAT_COEFF_NUM]; - } tmbslHdmiTxMatCoeff_t; - -/*============================================================================*/ -/** - * tmbslTDA9984MatrixSetConversion() parameter type - */ -/** Video input mode */ - typedef enum { - HDMITX_VINMODE_CCIR656 = 0, - /**< ccir656 */ - HDMITX_VINMODE_RGB444 = 1, - /**< RGB444 */ - HDMITX_VINMODE_YUV444 = 2, - /**< YUV444 */ - HDMITX_VINMODE_YUV422 = 3, - /**< YUV422 */ - HDMITX_VINMODE_NO_CHANGE = 4, - /**< No change */ - HDMITX_VINMODE_INVALID = 5 - /**< Invalid */ - } tmbslHdmiTxVinMode_t; - -/** Video output mode */ - typedef enum { - HDMITX_VOUTMODE_RGB444 = 0, - /**< RGB444 */ - HDMITX_VOUTMODE_YUV422 = 1, - /**< YUV422 */ - HDMITX_VOUTMODE_YUV444 = 2, - /**< YUV444 */ - HDMITX_VOUTMODE_NO_CHANGE = 3, - /**< No change */ - HDMITX_VOUTMODE_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxVoutMode_t; - -/*============================================================================*/ -/** - * tmbslTDA9984MatrixSetMode() parameter types - */ -/** Matrix control values */ - typedef enum { - HDMITX_MCNTRL_ON = 0, - /**< Matrix on */ - HDMITX_MCNTRL_OFF = 1, - /**< Matrix off */ - HDMITX_MCNTRL_NO_CHANGE = 2, - /**< Matrix unchanged */ - HDMITX_MCNTRL_MAX = 2, - /**< Max value */ - HDMITX_MCNTRL_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxmCntrl_t; - -/** Matrix scale values */ - typedef enum { - HDMITX_MSCALE_256 = 0, - /**< Factor 1/256 */ - HDMITX_MSCALE_512 = 1, - /**< Factor 1/512 */ - HDMITX_MSCALE_1024 = 2, - /**< Factor 1/1024 */ - HDMITX_MSCALE_NO_CHANGE = 3, - /**< Factor unchanged */ - HDMITX_MSCALE_MAX = 3, - /**< Max value */ - HDMITX_MSCALE_INVALID = 4 - /**< Invalid value */ - } tmbslHdmiTxmScale_t; - -/*============================================================================*/ -/** - * Data Island Packet structure - */ -/** Parameter structure array sizes */ - enum _tmbslHdmiTxPkt { - HDMITX_PKT_DATA_BYTE_CNT = 28 - }; - -/** \brief The parameter structure for tmbslTDA9984Pkt*() APIs */ - typedef struct _tmbslHdmiTxPkt_t { - UInt8 dataByte[HDMITX_PKT_DATA_BYTE_CNT]; - /**< Packet Data */ - } tmbslHdmiTxPkt_t; - -/*============================================================================*/ -/** - * \brief The Audio Infoframe Parameter structure - */ - typedef struct _tmbslHdmiTxPktAif_t { - UInt8 CodingType; - /**< Coding Type 0 to 0Fh */ - UInt8 ChannelCount; - /**< Channel Count 0 to 07h */ - UInt8 SampleFreq; - /**< Sample Frequency 0 to 07h */ - UInt8 SampleSize; - /**< Sample Size 0 to 03h */ - UInt8 ChannelAlloc; - /**< Channel Allocation 0 to FFh */ - Bool DownMixInhibit; - /**< Downmix inhibit flag 0/1 */ - UInt8 LevelShift; - /**< Level Shift 0 to 0Fh */ - } tmbslHdmiTxPktAif_t; - -/*============================================================================*/ -/** - * tmbslTDA9984PktSetMpegInfoframe() parameter types - */ -/** MPEG frame types */ - typedef enum { - HDMITX_MPEG_FRAME_UNKNOWN = 0, - /**< Unknown */ - HDMITX_MPEG_FRAME_I = 1,/**< i-frame */ - HDMITX_MPEG_FRAME_B = 2,/**< b-frame */ - HDMITX_MPEG_FRAME_P = 3,/**< p-frame */ - HDMITX_MPEG_FRAME_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxMpegFrame_t; - -/** \brief The MPEG Infoframe Parameter structure */ - typedef struct _tmbslHdmiTxPktMpeg_t { - UInt32 bitRate; /**< MPEG bit rate in Hz */ - tmbslHdmiTxMpegFrame_t frameType; - /**< MPEG frame type */ - Bool bFieldRepeat; /**< 0: new field, 1:repeated field */ - } tmbslHdmiTxPktMpeg_t; - -/*============================================================================*/ -/** - * Source Product Description Infoframe Parameter types - */ -/** SDI frame types */ - typedef enum { - HDMITX_SPD_INFO_UNKNOWN = 0, - HDMITX_SPD_INFO_DIGITAL_STB = 1, - HDMITX_SPD_INFO_DVD = 2, - HDMITX_SPD_INFO_DVHS = 3, - HDMITX_SPD_INFO_HDD_VIDEO = 4, - HDMITX_SPD_INFO_DVC = 5, - HDMITX_SPD_INFO_DSC = 6, - HDMITX_SPD_INFO_VIDEO_CD = 7, - HDMITX_SPD_INFO_GAME = 8, - HDMITX_SPD_INFO_PC = 9, - HDMITX_SPD_INFO_INVALID = 10 - } tmbslHdmiTxSourceDev_t; - -#define HDMI_TX_SPD_VENDOR_SIZE 8 -#define HDMI_TX_SPD_DESCR_SIZE 16 -#define HDMI_TX_SPD_LENGTH 25 - -/** \brief The Source Product Description Infoframe Parameter structure */ - typedef struct _tmbslHdmiTxPktSpd_t { - UInt8 VendorName[HDMI_TX_SPD_VENDOR_SIZE]; /**< Vendor name */ - UInt8 ProdDescr[HDMI_TX_SPD_DESCR_SIZE]; /**< Product Description */ - tmbslHdmiTxSourceDev_t SourceDevInfo; /**< Source Device Info */ - } tmbslHdmiTxPktSpd_t; - -/*============================================================================*/ -/** - * \brief The Video Infoframe Parameter structure - */ - typedef struct _tmbslHdmiTxPktVif_t { - UInt8 Colour; /**< 0 to 03h */ - Bool ActiveInfo; /**< 0/1 */ - UInt8 BarInfo; /**< 0 to 03h */ - UInt8 ScanInfo; /**< 0 to 03h */ - UInt8 Colorimetry; - /**< 0 to 03h */ - UInt8 PictureAspectRatio; - /**< 0 to 03h */ - UInt8 ActiveFormatRatio; - /**< 0 to 0Fh */ - UInt8 Scaling; /**< 0 to 03h */ - UInt8 VidFormat; /**< 0 to 7Fh */ - UInt8 PixelRepeat; - /**< 0 to 0Fh */ - UInt16 EndTopBarLine; - UInt16 StartBottomBarLine; - UInt16 EndLeftBarPixel; - UInt16 StartRightBarPixel; - } tmbslHdmiTxPktVif_t; - -/*============================================================================*/ -/** - * tmbslTDA9984ScalerGetMode() parameter types - */ -/** Scaler modes */ - typedef enum { - HDMITX_SCAMODE_OFF = 0, - /**< Off */ - HDMITX_SCAMODE_ON = 1, - /**< On */ - HDMITX_SCAMODE_AUTO = 2, - /**< Auto */ - HDMITX_SCAMODE_NO_CHANGE = 3, - /**< No change */ - HDMITX_SCAMODE_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxScaMode_t; - -/*============================================================================*/ -/** - * \brief The tmbslTDA9984ScalerGet() parameter type - */ - typedef struct _tmbslHdmiTxScalerDiag_t { - UInt16 maxBuffill_p; - /**< Filling primary video buffer */ - UInt16 maxBuffill_d; - /**< Filling video deinterlaced buffer */ - UInt8 maxFifofill_pi; - /**< Filling primary video input FIFO */ - UInt8 minFifofill_po1; - /**< Filling primary video output FIFO #1 */ - UInt8 minFifofill_po2; - /**< Filling primary video output FIFO #2 */ - UInt8 minFifofill_po3; - /**< Filling primary video output FIFO #3 */ - UInt8 minFifofill_po4; - /**< Filling primary video output FIFO #4 */ - UInt8 maxFifofill_di; - /**< Filling deinterlaced video input FIFO */ - UInt8 maxFifofill_do; - /**< Filling deinterlaced video output FIFO */ - } tmbslHdmiTxScalerDiag_t; - -/*============================================================================*/ -/** - * tmbslTDA9984ScalerSetCoeffs() parameter types - */ -/** Scaler lookup table selection */ - typedef enum { - HDMITX_SCALUT_DEFAULT_TAB1 = 0, - /**< Use default table 1 */ - HDMITX_SCALUT_DEFAULT_TAB2 = 1, - /**< Use default table 2 */ - HDMITX_SCALUT_USE_VSLUT = 2, - /**< Use vsLut parameter */ - HDMITX_SCALUT_INVALID = 3 /**< Invalid value */ - } tmbslHdmiTxScaLut_t; - -/** Scaler control parameter structure array size */ - enum _tmbslHdmiTxvsLut { - HDMITX_VSLUT_COEFF_NUM = 45 - }; -/*============================================================================*/ -/** - * tmbslTDA9984ScalerSetFieldOrder() parameter types - */ -/** IntExt values */ - typedef enum { - HDMITX_INTEXT_INTERNAL = 0,/**< Internal */ - HDMITX_INTEXT_EXTERNAL = 1,/**< External */ - HDMITX_INTEXT_NO_CHANGE = 2, - /**< No change */ - HDMITX_INTEXT_INVALID = 3 /**< Invalid */ - } tmbslHdmiTxIntExt_t; - -/** TopSel values */ - typedef enum { - HDMITX_TOPSEL_INTERNAL = 0,/**< Internal */ - HDMITX_TOPSEL_VRF = 1, /**< VRF */ - HDMITX_TOPSEL_NO_CHANGE = 2, - /**< No change */ - HDMITX_TOPSEL_INVALID = 3 /**< Invalid */ - } tmbslHdmiTxTopSel_t; - -/** TopTgl values */ - typedef enum { - HDMITX_TOPTGL_NO_ACTION = 0, - /**< NO action */ - HDMITX_TOPTGL_TOGGLE = 1, /**< Toggle */ - HDMITX_TOPTGL_NO_CHANGE = 2, - /**< No change */ - HDMITX_TOPTGL_INVALID = 3 /**< Invalid */ - } tmbslHdmiTxTopTgl_t; - -/*============================================================================*/ -/** - * tmbslTDA9984ScalerSetPhase() parameter types - */ -/** Phases_h values */ - typedef enum { - HDMITX_H_PHASES_16 = 0, - /**< 15 horizontal phases */ - HDMITX_H_PHASES_15 = 1, - /**< 16 horizontal phases */ - HDMITX_H_PHASES_INVALID = 2 - /**< Invalid */ - } tmbslHdmiTxHPhases_t; - -/*============================================================================*/ -/** - * tmbslTDA9984ScalerSetFine() parameter types - */ -/** Reference pixel values */ - enum _tmbslHdmiTxScalerFinePixelLimits { - HDMITX_SCALER_FINE_PIXEL_MIN = 0x0000, - HDMITX_SCALER_FINE_PIXEL_MAX = 0x1FFF, - HDMITX_SCALER_FINE_PIXEL_NO_CHANGE = 0x2000, - HDMITX_SCALER_FINE_PIXEL_INVALID = 0x2001 - }; - -/** Reference line values */ - enum _tmbslHdmiTxScalerFineLineLimits { - HDMITX_SCALER_FINE_LINE_MIN = 0x0000, - HDMITX_SCALER_FINE_LINE_MAX = 0x07FF, - HDMITX_SCALER_FINE_LINE_NO_CHANGE = 0x0800, - HDMITX_SCALER_FINE_LINE_INVALID = 0x0801 - }; -/*============================================================================*/ -/** - * tmbslTDA9984ScalerSetSync() parameter types - */ -/** Video sync method */ - typedef enum { - HDMITX_VSMETH_V_H = 0, /**< V and H */ - HDMITX_VSMETH_V_XDE = 1, - /**< V and X-DE */ - HDMITX_VSMETH_NO_CHANGE = 2, - /**< No change */ - HDMITX_VSMETH_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxVsMeth_t; - -/** Line/pixel counters sync */ - typedef enum { - HDMITX_VSONCE_EACH_FRAME = 0, - /**< Sync on each frame */ - HDMITX_VSONCE_ONCE = 1,/**< Sync once only */ - HDMITX_VSONCE_NO_CHANGE = 2, - /**< No change */ - HDMITX_VSONCE_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxVsOnce_t; - -/*============================================================================*/ -/** - * tmbslTDA9984TmdsSetOutputs() parameter types - */ -/** TMDS output mode */ - typedef enum { - HDMITX_TMDSOUT_NORMAL = 0, - /**< Normal outputs */ - HDMITX_TMDSOUT_NORMAL1 = 1, - /**< Normal outputs, same as 0 */ - HDMITX_TMDSOUT_FORCED0 = 2, - /**< Forced 0 outputs */ - HDMITX_TMDSOUT_FORCED1 = 3, - /**< Forced 1 outputs */ - HDMITX_TMDSOUT_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxTmdsOut_t; - -/*============================================================================*/ -/** - * tmbslTDA9984TmdsSetSerializer() parameter types - */ -/** Serializer phase limits */ - enum _tmbslHdmiTxTmdsPhase { - HDMITX_TMDSPHASE_MIN = 0, - HDMITX_TMDSPHASE_MAX = 15, - HDMITX_TMDSPHASE_INVALID = 16 - }; - -/*============================================================================*/ -/** - * tmbslTDA9984TestSetPattern() parameter types - */ -/** Test pattern types */ - typedef enum { - HDMITX_PATTERN_OFF = 0, - /**< Insert test pattern */ - HDMITX_PATTERN_CBAR4 = 1, - /**< Insert 4-bar colour bar */ - HDMITX_PATTERN_CBAR8 = 2, - /**< Insert 8-bar colour bar */ - HDMITX_PATTERN_BLUE = 3,/**< Insert Blue screen */ - HDMITX_PATTERN_BLACK = 4, - /**< Insert Blue screen */ - HDMITX_PATTERN_INVALID = 5 - /**< Invalid pattern */ - } tmbslHdmiTxTestPattern_t; - -/*============================================================================*/ -/** - * tmbslTDA9984TestSetMode() parameter types - */ -/** Test modes */ - typedef enum { - HDMITX_TESTMODE_PAT = 0, - /**< Insert test pattern */ - HDMITX_TESTMODE_656 = 1, - /**< Inject CCIR-656 video via audio port */ - HDMITX_TESTMODE_SERPHOE = 2, - /**< Activate srl_tst_ph2_o & srl_tst_ph3_o */ - HDMITX_TESTMODE_NOSC = 3, - /**< Input nosc predivider = PLL-ref input */ - HDMITX_TESTMODE_HVP = 4, - /**< Test high voltage protection cells */ - HDMITX_TESTMODE_PWD = 5, - /**< Test PLLs in sleep mode */ - HDMITX_TESTMODE_DIVOE = 6, - /**< Enable scaler PLL divider test output */ - HDMITX_TESTMODE_INVALID = 7 - /**< Invalid test */ - } tmbslHdmiTxTestMode_t; - -/** Test states */ - typedef enum { - HDMITX_TESTSTATE_OFF = 0, - /**< Disable the selected test */ - HDMITX_TESTSTATE_ON = 1, - /**< Enable the selected test */ - HDMITX_TESTSTATE_INVALID = 2 - /**< Invalid value */ - } tmbslHdmiTxTestState_t; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoInSetBlanking() parameter types - */ -/** Blankit Source */ - typedef enum { - HDMITX_BLNKSRC_NOT_DE = 0, /**< Source=Not DE */ - HDMITX_BLNKSRC_VS_HS = 1, /**< Source=VS And HS */ - HDMITX_BLNKSRC_VS_NOT_HS = 2, - /**< Source=VS And Not HS */ - HDMITX_BLNKSRC_VS_HEMB_VEMB = 3, - /**< Source=Hemb And Vemb */ - HDMITX_BLNKSRC_NO_CHANGE = 4, - /**< No change */ - HDMITX_BLNKSRC_INVALID = 5 /**< Invalid */ - } tmbslHdmiTxBlnkSrc_t; - -/** Blanking Codes */ - typedef enum { - HDMITX_BLNKCODE_ALL_0 = 0, /**< Code=All Zero */ - HDMITX_BLNKCODE_RGB444 = 1,/**< Code=RGB444 */ - HDMITX_BLNKCODE_YUV444 = 2,/**< Code=YUV444 */ - HDMITX_BLNKCODE_YUV422 = 3,/**< Code=YUV422 */ - HDMITX_BLNKCODE_NO_CHANGE = 4, - /**< No change */ - HDMITX_BLNKCODE_INVALID = 5/**< Invalid */ - } tmbslHdmiTxBlnkCode_t; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoInSetConfig() parameter types - */ -/** Sample edge */ - typedef enum { - HDMITX_PIXEDGE_CLK_POS = 0, /**< Pixel Clock Positive Edge */ - HDMITX_PIXEDGE_CLK_NEG = 1, /**< Pixel Clock Negative Edge */ - HDMITX_PIXEDGE_NO_CHANGE = 2, - /**< No Change */ - HDMITX_PIXEDGE_INVALID = 3 /**< Invalid */ - } tmbslHdmiTxPixEdge_t; - -/** Upsample modes */ - typedef enum { - HDMITX_UPSAMPLE_BYPASS = 0, /**< Bypass */ - HDMITX_UPSAMPLE_COPY = 1, /**< Copy */ - HDMITX_UPSAMPLE_INTERPOLATE = 2, - /**< Interpolate */ - HDMITX_UPSAMPLE_AUTO = 3, /**< Auto: driver chooses best value */ - HDMITX_UPSAMPLE_NO_CHANGE = 4, - /**< No Change */ - HDMITX_UPSAMPLE_INVALID = 5 /**< Invalid */ - } tmbslHdmiTxUpsampleMode_t; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoInSetFine() parameter types - */ -/** Subpacket count */ - typedef enum { - HDMITX_PIXSUBPKT_FIX_0 = 0, /**< Fix At 0 */ - HDMITX_PIXSUBPKT_FIX_1 = 1, /**< Fix At 1 */ - HDMITX_PIXSUBPKT_FIX_2 = 2, /**< Fix At 2 */ - HDMITX_PIXSUBPKT_FIX_3 = 3, /**< Fix At 3 */ - HDMITX_PIXSUBPKT_SYNC_FIRST = 4, - /**< First Sync value */ - HDMITX_PIXSUBPKT_SYNC_HEMB = 4, - /**< Sync By Hemb */ - HDMITX_PIXSUBPKT_SYNC_DE = 5, - /**< Sync By Rising Edge DE */ - HDMITX_PIXSUBPKT_SYNC_HS = 6, - /**< Sync By Rising Edge HS */ - HDMITX_PIXSUBPKT_NO_CHANGE = 7, - /**< No Change */ - HDMITX_PIXSUBPKT_INVALID = 8, - /**< Invalid */ - HDMITX_PIXSUBPKT_SYNC_FIXED = 3 - /**< Not used as a parameter value, - * but used internally when - * Fix at 0/1/2/3 values are set */ - } tmbslHdmiTxPixSubpkt_t; - -/** Toggling */ - typedef enum { - HDMITX_PIXTOGL_NO_ACTION = 0, - /**< No Action */ - HDMITX_PIXTOGL_ENABLE = 1, /**< Toggle */ - HDMITX_PIXTOGL_NO_CHANGE = 2, - /**< No Change */ - HDMITX_PIXTOGL_INVALID = 3 /**< Invalid */ - } tmbslHdmiTxPixTogl_t; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoInSetMapping() parameter types - */ -/** Video input port parameter structure array size and limits */ - enum _tmbslHdmiTxVinPortMap { - HDMITX_VIN_PORT_MAP_TABLE_LEN = 6, - - HDMITX_VIN_PORT_SWAP_NO_CHANGE = 6, - HDMITX_VIN_PORT_SWAP_INVALID = 7, - - HDMITX_VIN_PORT_MIRROR_NO_CHANGE = 2, - HDMITX_VIN_PORT_MIRROR_INVALID = 3 - }; - - -/*============================================================================*/ -/** - * tmbslTDA9984VideoInSetSyncAuto() parameter types - */ -/** Sync source - was Embedded sync HDMITX_PIXEMBSYNC_ */ - typedef enum { - HDMITX_SYNCSRC_EMBEDDED = 0, - /**< Embedded sync */ - HDMITX_SYNCSRC_EXT_VREF = 1, - /**< External sync Vref, Href, Fref */ - HDMITX_SYNCSRC_EXT_VS = 2, - /**< External sync Vs, Hs */ - HDMITX_SYNCSRC_NO_CHANGE = 3, - /**< No Change */ - HDMITX_SYNCSRC_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxSyncSource_t; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoInSetSyncManual() parameter types - */ -/** Video output frame pixel values */ - enum _tmbslHdmiTxVoutFinePixelLimits { - HDMITX_VOUT_FINE_PIXEL_MIN = 0x0000, - HDMITX_VOUT_FINE_PIXEL_MAX = 0x1FFF, - HDMITX_VOUT_FINE_PIXEL_NO_CHANGE = 0x2000, - HDMITX_VOUT_FINE_PIXEL_INVALID = 0x2001 - }; - -/** Video output frame line values */ - enum _tmbslHdmiTxVoutFineLineLimits { - HDMITX_VOUT_FINE_LINE_MIN = 0x0000, - HDMITX_VOUT_FINE_LINE_MAX = 0x07FF, - HDMITX_VOUT_FINE_LINE_NO_CHANGE = 0x0800, - HDMITX_VOUT_FINE_LINE_INVALID = 0x0801 - }; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoOutSetConfig() parameter types - */ -/** Prefilter */ - typedef enum { - HDMITX_VOUT_PREFIL_OFF = 0,/**< Off */ - HDMITX_VOUT_PREFIL_121 = 1,/**< 121 */ - HDMITX_VOUT_PREFIL_109 = 2,/**< 109 */ - HDMITX_VOUT_PREFIL_CCIR601 = 3, - /**< CCIR601 */ - HDMITX_VOUT_PREFIL_NO_CHANGE = 4, - /**< No Change */ - HDMITX_VOUT_PREFIL_INVALID = 5 - /**< Invalid */ - } tmbslHdmiTxVoutPrefil_t; - -/** YUV blanking */ - typedef enum { - HDMITX_VOUT_YUV_BLNK_16 = 0, - /**< 16 */ - HDMITX_VOUT_YUV_BLNK_0 = 1,/**< 0 */ - HDMITX_VOUT_YUV_BLNK_NO_CHANGE = 2, - /**< No Change */ - HDMITX_VOUT_YUV_BLNK_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxVoutYuvBlnk_t; - -/** Video quantization range */ - typedef enum { - HDMITX_VOUT_QRANGE_FS = 0, /**< Full Scale */ - HDMITX_VOUT_QRANGE_RGB_YUV = 1, - /**< RGB Or YUV */ - HDMITX_VOUT_QRANGE_YUV = 2,/**< YUV */ - HDMITX_VOUT_QRANGE_NO_CHANGE = 3, - /**< No Change */ - HDMITX_VOUT_QRANGE_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxVoutQrange_t; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoOutSetSync() parameter types - */ -/** Video sync source */ - typedef enum { - HDMITX_VSSRC_INTERNAL = 0, - /**< Internal */ - HDMITX_VSSRC_EXTERNAL = 1, - /**< External */ - HDMITX_VSSRC_NO_CHANGE = 2, - /**< No change */ - HDMITX_VSSRC_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxVsSrc_t; - -/** Video sync toggle */ - typedef enum { - HDMITX_VSTGL_TABLE = 0,/**< Vs/Hs polarity from table */ - HDMITX_VSTGL_UNUSED_1 = 1, - /**< Unused */ - HDMITX_VSTGL_UNUSED_2 = 2, - /**< Unused */ - HDMITX_VSTGL_UNUSED_3 = 3, - /**< Unused */ - HDMITX_VSTGL_NO_ACTION = 4, - /**< No toggle */ - HDMITX_VSTGL_HS = 5, /**< Toggle Hs */ - HDMITX_VSTGL_VS = 6, /**< Toggle Vs */ - HDMITX_VSTGL_HS_VS = 7,/**< Toggle Hs & Vs */ - HDMITX_VSTGL_NO_CHANGE = 8, - /**< No change */ - HDMITX_VSTGL_INVALID = 9 - /**< Invalid */ - } tmbslHdmiTxVsTgl_t; - -/*============================================================================*/ -/** - * tmbslTDA9984VideoSetInOut() parameter types - */ -/** Pixel repetition values */ - enum _tmbslHdmiTxPixRepeat { - HDMITX_PIXREP_NONE = 0, - /**< No repetition */ - HDMITX_PIXREP_MIN = 0, - /**< 1 repetition */ - - HDMITX_PIXREP_0 = 0, - HDMITX_PIXREP_1 = 1, - HDMITX_PIXREP_2 = 2, - HDMITX_PIXREP_3 = 3, - HDMITX_PIXREP_4 = 4, - HDMITX_PIXREP_5 = 5, - HDMITX_PIXREP_6 = 6, - HDMITX_PIXREP_7 = 7, - HDMITX_PIXREP_8 = 8, - HDMITX_PIXREP_9 = 9, - - HDMITX_PIXREP_MAX = 9, - /**< 10 repetitions */ - HDMITX_PIXREP_DEFAULT = 10, - /**< Default repetitions for output format */ - HDMITX_PIXREP_NO_CHANGE = 11, - /**< No change */ - HDMITX_PIXREP_INVALID = 12 - /**< Invalid */ - }; - -/** Matrix modes */ - typedef enum { - HDMITX_MATMODE_OFF = 0, - /**< Off */ - HDMITX_MATMODE_AUTO = 1, - /**< Auto */ - HDMITX_MATMODE_NO_CHANGE = 2, - /**< No change */ - HDMITX_MATMODE_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxMatMode_t; - -/** Datapath bitwidth */ - typedef enum { - HDMITX_VOUT_DBITS_12 = 0, /**< 12 bits */ - HDMITX_VOUT_DBITS_8 = 1, /**< 8 bits */ - HDMITX_VOUT_DBITS_10 = 2, /**< 10 bits */ - HDMITX_VOUT_DBITS_NO_CHANGE = 3, - /**< No change */ - HDMITX_VOUT_DBITS_INVALID = 4 - /**< Invalid */ - } tmbslHdmiTxVoutDbits_t; - -/** Color depth */ - typedef enum { - HDMITX_COLORDEPTH_24 = 0, /**< 24 bits per pixel */ - HDMITX_COLORDEPTH_30 = 1, /**< 30 bits per pixel */ - HDMITX_COLORDEPTH_36 = 2, /**< 36 bits per pixel */ - HDMITX_COLORDEPTH_48 = 3, /**< 48 bits per pixel */ - HDMITX_COLORDEPTH_NO_CHANGE = 4, - /**< No change */ - HDMITX_COLORDEPTH_INVALID = 5 - /**< Invalid */ - } tmbslHdmiTxColorDepth; - -/** the supported transmission formats of 3D video data */ - typedef enum { - HDMITX_3D_NONE = 0, /**< 3D video data not present */ - HDMITX_3D_FRAME_PACKING = 1, - /**< 3D video data Frame Packing structure */ - HDMITX_3D_TOP_AND_BOTTOM = 2, - /**< 3D video data Top and Bottom structure */ - HDMITX_3D_SIDE_BY_SIDE_HALF = 3, - /**< 3D video data Side by Side Half structure */ - HDMITX_3D_INVALID = 4 /**< Invalid */ - } tmbslHdmiTx3DStructure_t; - -/*============================================================================*/ -/** - * tmbslTDA9984MatrixSetInputOffset() parameter type - */ -/** Parameter structure array size */ - enum _tmbslHdmiTxMatOffset { - HDMITX_MAT_OFFSET_NUM = 3 - }; - -/** \brief The tmbslTDA9984MatrixSetInputOffset() parameter structure */ - typedef struct _tmbslHdmiTxMatOffset_t { - /** Offset array (values -1024 to +1023) */ - Int16 Offset[HDMITX_MAT_OFFSET_NUM]; - } tmbslHdmiTxMatOffset_t; - -/** Matrix numeric limits */ - enum _tmbslHdmiTxMatLimits { - HDMITX_MAT_OFFSET_MIN = -1024, - HDMITX_MAT_OFFSET_MAX = 1023 - }; - -/*============================================================================*/ -/** - * tmbslTDA9989PowerSetState() and tmbslTDA9989PowerGetState() parameter types - */ - typedef enum { - HDMITX_POWER_STATE_STAND_BY = 0, /**< Stand by mode */ - HDMITX_POWER_STATE_SLEEP_MODE = 1, /**< Sleep mode */ - HDMITX_POWER_STATE_ON = 2, /**< On mode */ - HDMITX_POWER_STATE_INVALID = 3 /**< Invalid format */ - } tmbslHdmiTxPowerState_t; - -/** - * \brief Structure describing gamut metadata packet (P0 or P1 profiles) - */ - typedef struct { - UInt8 HB[3]; - /**< Header bytes (HB0, HB1 & HB2) */ - UInt8 PB[28]; - /**< Payload bytes 0..27 */ - } tmbslHdmiTxPktGamut_t; - - -/** - * \brief Structure describing RAW AVI infoframe - */ - typedef struct { - UInt8 HB[3]; - /**< Header bytes (HB0, HB1 & HB2) */ - UInt8 PB[28]; - /**< Payload bytes 0..27 */ - } tmbslHdmiTxPktRawAvi_t; - - -/** Sink category */ - typedef enum { - HDMITX_SINK_CAT_NOT_REPEATER = 0, - /**< Not repeater */ - HDMITX_SINK_CAT_REPEATER = 1, - /**< repeater */ - HDMITX_SINK_CAT_INVALID = 3 - /**< Invalid */ - } tmbslHdmiTxSinkCategory_t; - - - typedef struct { - Bool latency_available; - Bool Ilatency_available; - UInt8 Edidvideo_latency; - UInt8 Edidaudio_latency; - UInt8 EdidIvideo_latency; - UInt8 EdidIaudio_latency; - - } tmbslHdmiTxEdidLatency_t; - -/** - * \brief Structure defining additional VSDB data - */ - typedef struct { - UInt8 maxTmdsClock; /* maximum supported TMDS clock */ - UInt8 cnc0; /* content type Graphics (text) */ - UInt8 cnc1; /* content type Photo */ - UInt8 cnc2; /* content type Cinema */ - UInt8 cnc3; /* content type Game */ - UInt8 hdmiVideoPresent; /* additional video format */ - UInt8 h3DPresent; /* 3D support by the HDMI Sink */ - UInt8 h3DMultiPresent; /* 3D multi strctures present */ - UInt8 imageSize; /* additional info for the values in the image size area */ - UInt8 hdmi3DLen; /* total length of 3D video formats */ - UInt8 hdmiVicLen; /* total length of extended video formats */ - UInt8 ext3DData[21]; /* max_len-10, ie: 31-10=21 */ - } tmbslHdmiTxEdidExtraVsdbData_t; - -/** - * \brief Enum defining possible quantization range - */ - typedef enum { - HDMITX_VQR_DEFAULT = 0, /* Follow HDMI spec. */ - HDMITX_RGB_FULL = 1, /* Force RGB FULL , DVI only */ - HDMITX_RGB_LIMITED = 2 /* Force RGB LIMITED , DVI only */ - } tmbslHdmiTxVQR_t; - - - - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLHDMITX_TYPES_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Edid.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Edid.c deleted file mode 100644 index d782521d30a..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Edid.c +++ /dev/null @@ -1,1470 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_edid.c - * - * \version $Revision: 2 $ - * -*/ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#include "tmbslHdmiTx_types.h" -#include "tmbslTDA9989_Functions.h" -#include "tmbslTDA9989_local.h" -#include "tmbslTDA9989_State_l.h" -#include "tmbslTDA9989_Edid_l.h" -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS */ -/*============================================================================*/ -#define EDID_NUMBER_MAX_DTD_BLK_1 6 -/** EDID block 0 parse start point */ -#define EDID_BLK0_BASE_DTD 0x36 - -#define EDID_BLK1_OFFSET_BASE_DTD 2 - -/** EDID block 0 extension block count */ -#define EDID_BLK0_EXT_CNT 0x7E - -/** EDID extension block parse start point */ -#define EDID_BLK_EXT_BASE 0x04 - -/** CEA extension block type */ -#define EDID_CEA_EXTENSION 0x02 - -/** CEA Block Map */ -#define EDID_BLOCK_MAP 0xF0 - -/** NB Max of descriptor DTD or monitor in block 0 */ -#define EDID_NB_MAX_DESCRIP_BLK_IN_BLK_0 4 - -#define EDID_MONITOR_NAME_DESC_DATA_TYPE 252 - -#define EDID_MONITOR_RANGE_DESC_DATA_TYPE 253 - -/*============================================================================*/ -/* DEFINES DECLARATIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* VARIABLES DECLARATIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* FUNCTION PROTOTYPES */ -/*============================================================================*/ - -static tmErrorCode_t requestEdidBlock(tmHdmiTxobject_t *pDis); - -static tmErrorCode_t parseEdidBlock(tmHdmiTxobject_t *pDis, Int blockNumber); -static Bool storeDtdBlock(tmHdmiTxobject_t *pDis, UInt8 blockPtr); - -static Bool storeMonitorDescriptor(tmHdmiTxobject_t *pDis, UInt8 blockPtr); - - - -/*============================================================================*/ -/* tmbslTDA9989HwGetCapabilities */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989HwGetCapabilities - (tmUnitSelect_t txUnit, tmbslHdmiTxHwFeature_t deviceCapability, Bool *pFeatureSupported) { - tmHdmiTxobject_t *pDis; - tmErrorCode_t err = TM_OK; - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - RETIF_BADPARAM(pFeatureSupported == Null) - - * pFeatureSupported = False; - - - switch (deviceCapability) { - case HDMITX_FEATURE_HW_HDCP: - if ((pDis->uDeviceFeatures & E_MASKREG_P00_VERSION_not_h) == 0) { - *pFeatureSupported = True; - } - break; - case HDMITX_FEATURE_HW_SCALER: - if ((pDis->uDeviceFeatures & E_MASKREG_P00_VERSION_not_s) == 0) { - *pFeatureSupported = True; - } - break; - case HDMITX_FEATURE_HW_AUDIO_OBA: - *pFeatureSupported = True; - break; - case HDMITX_FEATURE_HW_AUDIO_DST: - *pFeatureSupported = False; - break; - case HDMITX_FEATURE_HW_AUDIO_HBR: - *pFeatureSupported = False; - break; - case HDMITX_FEATURE_HW_HDMI_1_1: - *pFeatureSupported = True; - break; - case HDMITX_FEATURE_HW_HDMI_1_2A: - *pFeatureSupported = True; - break; - case HDMITX_FEATURE_HW_HDMI_1_3A: - *pFeatureSupported = False; - break; - - case HDMITX_FEATURE_HW_DEEP_COLOR_30: - *pFeatureSupported = False; - break; - - case HDMITX_FEATURE_HW_DEEP_COLOR_36: - *pFeatureSupported = False; - break; - - case HDMITX_FEATURE_HW_DEEP_COLOR_48: - *pFeatureSupported = False; - break; - - case HDMITX_FEATURE_HW_UPSAMPLER: - *pFeatureSupported = True; - break; - - case HDMITX_FEATURE_HW_DOWNSAMPLER: - *pFeatureSupported = True; - break; - - case HDMITX_FEATURE_HW_COLOR_CONVERSION: - *pFeatureSupported = True; - break; - - default: - *pFeatureSupported = False; - break; - } - - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetAudioCapabilities */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989EdidGetAudioCapabilities - (tmUnitSelect_t txUnit, - tmbslHdmiTxEdidSad_t *pEdidAFmts, UInt aFmtLength, UInt *pAFmtsAvail, UInt8 *pAudioFlags) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt i; /* Loop index */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pEdidAFmts == Null) - RETIF_BADPARAM(aFmtLength < 1) - RETIF_BADPARAM(pAFmtsAvail == Null) - RETIF_BADPARAM(pAudioFlags == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - - /* Copy the Device Instance Structure EdidAFmts descriptors to - * pEdidAFmts until we run out or no more space in structure. - */ - if (pDis->EdidSadCnt > 0) { - for (i = 0; (i < (UInt) pDis->EdidSadCnt) && (i < aFmtLength); i++) { - pEdidAFmts[i].ModeChans = pDis->EdidAFmts[i].ModeChans; - pEdidAFmts[i].Freqs = pDis->EdidAFmts[i].Freqs; - pEdidAFmts[i].Byte3 = pDis->EdidAFmts[i].Byte3; - } - } else { - /* No pEdidAFmts to copy so set a zero format to be safe */ - pEdidAFmts[0].ModeChans = 0; - pEdidAFmts[0].Freqs = 0; - pEdidAFmts[0].Byte3 = 0; - } - - /* Fill Audio Flags parameter */ - *pAudioFlags = ((pDis->EdidCeaFlags & 0x40) << 1); /* Basic audio */ - if (pDis->EdidSinkAi == True) { - *pAudioFlags += 0x40; /* Mask in AI support */ - } - - /* Fill number of SADs available parameter */ - *pAFmtsAvail = pDis->EdidSadCnt; - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989EdidGetBlockCount */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989EdidGetBlockCount(tmUnitSelect_t txUnit, UInt8 *puEdidBlockCount) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(puEdidBlockCount == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - *puEdidBlockCount = pDis->EdidBlockCnt; - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetStatus */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989EdidGetStatus(tmUnitSelect_t txUnit, UInt8 *puEdidStatus) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(puEdidStatus == Null) - - if (puEdidStatus) { - *puEdidStatus = pDis->EdidStatus; - } - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989EdidRequestBlockData */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989EdidRequestBlockData(tmUnitSelect_t txUnit, UInt8 *pRawEdid, Int numBlocks, /* Only relevant if pRawEdid valid */ - Int lenRawEdid /* Only relevant if pRawEdid valid */ - ) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regval; /* Byte value write to register */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - if ((pDis->vinFmt == HDMITX_VFMT_16_1920x1080p_60Hz) - || (pDis->vinFmt == HDMITX_VFMT_31_1920x1080p_50Hz)) { - - err = setHwRegisterField(pDis, - E_REG_P02_PLL_SERIAL_3_RW, - E_MASKREG_P02_PLL_SERIAL_3_srl_ccir, 0x01); - RETIF_REG_FAIL(err) - - } -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - -#ifdef TMFL_RGB_DDR_12BITS - /* RAM on */ - setHwRegisterField(pDis, E_REG_P12_TX4_RW, E_MASKREG_P12_TX4_pd_ram, 0); -#endif - - /* enable edid read */ - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_2_RW, E_MASKREG_P00_INT_FLAGS_2_edid_blk_rd); - - /* Check remaining parameter(s) - * We do allow a null pRawEdid pointer, in which case buffer length is - * irrelevant. If pRawEdid pointer is valid, there is no point in - * continuing if insufficient space for at least one block. - */ - RETIF_BADPARAM((pRawEdid != Null) && (lenRawEdid < EDID_BLOCK_SIZE)) - /* Sensible value of numBlocks? */ - RETIF((pRawEdid != Null) && ((numBlocks < 1) || (numBlocks > 255)), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - /* Enough space for the data requested? */ - RETIF((pRawEdid != Null) && (lenRawEdid < (numBlocks * EDID_BLOCK_SIZE)), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - - /* Read the HPD pin via the hpd_in flag in the first interrupt status - * register and return a TMBSL_ERR_HDMI_NULL_CONNECTION error if it is - * not set. - * We must use the flag in the Device Instance Structure to avoid - * clearing pending interrupt flags. - */ - RETIF(pDis->hotPlugStatus != HDMITX_HOTPLUG_ACTIVE, TMBSL_ERR_HDMI_NULL_CONNECTION) - - if (pDis->EdidReadStarted == False) { - - /* Reset the EdidStatus in the Device Instance Structure */ - pDis->EdidStatus = HDMITX_EDID_NOT_READ; - - pDis->EdidReadStarted = True; - - /* Reset stored parameters from EDID in the Device Instance Structure */ - pDis->EdidSinkType = HDMITX_SINK_DVI; - pDis->EdidSinkAi = False; - pDis->EdidCeaFlags = 0; - pDis->EdidCeaXVYCCFlags = 0; - pDis->EdidSvdCnt = 0; - pDis->EdidSadCnt = 0; - pDis->EdidSourceAddress = 0; /* 0.0.0.0 */ - pDis->NbDTDStored = 0; - pDis->EdidFirstMonitorDescriptor.bDescRecord = False; - pDis->EdidSecondMonitorDescriptor.bDescRecord = False; - pDis->EdidOtherMonitorDescriptor.bDescRecord = False; - - pDis->EdidLatency.latency_available = False; - pDis->EdidLatency.Ilatency_available = False; - - pDis->EdidExtraVsdbData.hdmiVideoPresent = False; - - - pDis->EdidToApp.pRawEdid = pRawEdid; - pDis->EdidToApp.numBlocks = numBlocks; - - /* Enable the T0 interrupt for detecting the Read_EDID failure */ - regval = E_MASKREG_P00_INT_FLAGS_0_t0; - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_0_RW, regval); - RETIF(err != TM_OK, err); - - - /* Launch the read of first EDID block into Device Instance workspace */ - pDis->EdidBlockRequested = 0; - err = requestEdidBlock(pDis); - } else { - /* Not allowed if read edid is on going */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - - return err; -} - - -/*============================================================================*/ -/* EdidBlockAvailable */ -/*============================================================================*/ - -tmErrorCode_t EdidBlockAvailable(tmUnitSelect_t txUnit, Bool *pSendEDIDCallback) -{ - - tmErrorCode_t err; /* Error code */ - UInt8 chksum; /* Checksum value */ - UInt8 LoopIndex; /* Loop index */ - UInt8 extBlockCnt; - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - - err = TM_OK; - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pSendEDIDCallback == Null) - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - if (pDis->EdidReadStarted == True) { - - err = tmbslTDA9989HwGetRegisters(txUnit, kPageIndexToPage[E_PAGE_09], - SPA2ADDR(E_REG_P09_EDID_DATA_0_R), pDis->EdidBlock, - EDID_BLOCK_SIZE); - RETIF(err != TM_OK, err) - - if (pSendEDIDCallback) { - *pSendEDIDCallback = False; - } - - if (pDis->EdidStatus == HDMITX_EDID_NOT_READ) { - err = getHwRegisters(pDis, E_REG_P09_EDID_DATA_0_R, pDis->EdidBlock, - EDID_BLOCK_SIZE); - RETIF_REG_FAIL(err) - - /* Add up all the values of the EDID block bytes, including the - * checksum byte - */ - chksum = 0; - for (LoopIndex = 0; LoopIndex < EDID_BLOCK_SIZE; LoopIndex++) { - chksum = chksum + pDis->EdidBlock[LoopIndex]; - } - - /* IF the EDID block does not yield a checksum of zero - */ - if (chksum != 0) { - if (pDis->EdidBlockRequested == 0) { - /* THEN return a HDMITX_EDID_ERROR error. */ - pDis->EdidStatus = HDMITX_EDID_ERROR_CHK_BLOCK_0; - } else { - /* THEN return a HDMITX_EDID_ERROR_CHK error. */ - pDis->EdidStatus = HDMITX_EDID_ERROR_CHK; - } - } - } - - if (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK_BLOCK_0) { - /* PR11 : On i2c error or bad checksum in block 0 */ - /* allow driver to go in state CONNECTED */ - /* On the other block, we also accept INVALID_CHECKSUM which means - * there was a checksum error */ - - if (pSendEDIDCallback) { - *pSendEDIDCallback = True; - } - - setState(pDis, EV_GETBLOCKDATA); - if (pDis->rxSenseStatus == HDMITX_RX_SENSE_ACTIVE) { - setState(pDis, EV_SINKON); - } - pDis->EdidReadStarted = False; - return err; - } - - /* Check if block 0 */ - if (pDis->EdidBlockRequested == 0) { - /* Could check block 0 header (0x00,6 x 0xFF,0x00) here but not - * certain to be future proof [CEA861C A.2.3] - */ - - /* Read block count from penultimate byte of block and store in DIS */ - extBlockCnt = pDis->EdidBlock[EDID_BLK0_EXT_CNT]; - - pDis->EdidBlockCnt = extBlockCnt + 1; /* Total = Block 0 + extensions */ - - } - - /* If pointer was supplied, copy block from DIS to buffer */ - if (pDis->EdidToApp.pRawEdid != Null) { - /* Check if we've copied as many as requested yet? */ - if (pDis->EdidBlockRequested < pDis->EdidToApp.numBlocks) { - lmemcpy(pDis->EdidToApp.pRawEdid + - (pDis->EdidBlockRequested * EDID_BLOCK_SIZE), - pDis->EdidBlock, EDID_BLOCK_SIZE); - } - } - parseEdidBlock(pDis, pDis->EdidBlockRequested); - - /* If extension blocks are present, process them */ - if ((pDis->EdidBlockRequested + 1) < pDis->EdidBlockCnt) { - pDis->EdidBlockRequested = pDis->EdidBlockRequested + 1; - /* Launch an edid block read */ - err = requestEdidBlock(pDis); - } else { - if (pDis->EdidStatus == HDMITX_EDID_NOT_READ) { - pDis->EdidStatus = HDMITX_EDID_READ; - -#ifdef TMFL_RGB_DDR_12BITS - /* RAM off */ - setHwRegisterField(pDis, E_REG_P12_TX4_RW, E_MASKREG_P12_TX4_pd_ram, - 1); -#endif - } - - if (pSendEDIDCallback) { - *pSendEDIDCallback = True; - } - - setState(pDis, EV_GETBLOCKDATA); - - if (pDis->rxSenseStatus == HDMITX_RX_SENSE_ACTIVE) { - setState(pDis, EV_SINKON); - } - pDis->EdidReadStarted = False; - } - } else { - /* function called in an invalid state */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - - return err; - -} - -/*============================================================================*/ -/* ClearEdidRequest */ -/*============================================================================*/ - -tmErrorCode_t ClearEdidRequest(tmUnitSelect_t txUnit) -{ - - tmErrorCode_t err; /* Error code */ - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - - err = TM_OK; - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - - /* Reset the EdidStatus in the Device Instance Structure */ - pDis->EdidStatus = HDMITX_EDID_NOT_READ; - - pDis->EdidReadStarted = False; - - /* Reset stored parameters from EDID in the Device Instance Structure */ - pDis->EdidSinkType = HDMITX_SINK_DVI; - pDis->EdidSinkAi = False; - pDis->EdidCeaFlags = 0; - pDis->EdidCeaXVYCCFlags = 0; - pDis->EdidSvdCnt = 0; - pDis->EdidSadCnt = 0; - pDis->EdidSourceAddress = 0; /* 0.0.0.0 */ - pDis->NbDTDStored = 0; - pDis->EdidFirstMonitorDescriptor.bDescRecord = False; - pDis->EdidSecondMonitorDescriptor.bDescRecord = False; - pDis->EdidOtherMonitorDescriptor.bDescRecord = False; - - pDis->EdidLatency.latency_available = False; - pDis->EdidLatency.Ilatency_available = False; - - pDis->EdidExtraVsdbData.hdmiVideoPresent = False; - - /* Launch the read of first EDID block into Device Instance workspace */ - pDis->EdidBlockRequested = 0; - - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetSinkType */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989EdidGetSinkType(tmUnitSelect_t txUnit, tmbslHdmiTxSinkType_t *pSinkType) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pSinkType == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - - *pSinkType = pDis->EdidSinkType; - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - return err; - -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetSourceAddress */ -/*============================================================================*/ - -tmErrorCode_t tmbslTDA9989EdidGetSourceAddress(tmUnitSelect_t txUnit, UInt16 *pSourceAddress) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pSourceAddress == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - - *pSourceAddress = pDis->EdidSourceAddress; - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - return err; - -} - - -/*============================================================================*/ -/* tmbslTDA9989EdidGetDetailedTimingDescriptors */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989EdidGetDetailedTimingDescriptors - (tmUnitSelect_t txUnit, tmbslHdmiTxEdidDtd_t *pEdidDTD, UInt8 nb_size, UInt8 *pDTDAvail) { - - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pEdidDTD == Null) - RETIF_BADPARAM(pDTDAvail == Null) - RETIF_BADPARAM(nb_size == 0) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - if (nb_size > pDis->NbDTDStored) { - *pDTDAvail = pDis->NbDTDStored; - } else { - *pDTDAvail = nb_size; - } - - lmemcpy(pEdidDTD, pDis->EdidDTD, sizeof(tmbslHdmiTxEdidDtd_t) * (*pDTDAvail)); - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetMonitorDescriptors */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989EdidGetMonitorDescriptors - (tmUnitSelect_t txUnit, - tmbslHdmiTxEdidFirstMD_t *pEdidFirstMD, - tmbslHdmiTxEdidSecondMD_t *pEdidSecondMD, - tmbslHdmiTxEdidOtherMD_t *pEdidOtherMD, UInt8 sizeOtherMD, UInt8 *pOtherMDAvail) { - - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pEdidFirstMD == Null) - RETIF_BADPARAM(pEdidSecondMD == Null) - RETIF_BADPARAM(pEdidOtherMD == Null) - - DUMMY_ACCESS(pOtherMDAvail); - DUMMY_ACCESS(sizeOtherMD); - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - *pOtherMDAvail = 1; - lmemcpy(pEdidFirstMD, &(pDis->EdidFirstMonitorDescriptor), - sizeof(tmbslHdmiTxEdidFirstMD_t)); - lmemcpy(pEdidSecondMD, &(pDis->EdidSecondMonitorDescriptor), - sizeof(tmbslHdmiTxEdidSecondMD_t)); - lmemcpy(pEdidOtherMD, &(pDis->EdidOtherMonitorDescriptor), - sizeof(tmbslHdmiTxEdidOtherMD_t)); - } else { - /* Not allowed if EdidStatus value is not valid */ - *pOtherMDAvail = 0; - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - - return TM_OK; - -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetBasicDisplayParam */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989EdidGetBasicDisplayParam - (tmUnitSelect_t txUnit, tmbslHdmiTxEdidBDParam_t *pEdidBDParam) { - - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pEdidBDParam == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - lmemcpy(pEdidBDParam, &(pDis->EDIDBasicDisplayParam), - sizeof(tmbslHdmiTxEdidBDParam_t)); - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetVideoCapabilities */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989EdidGetVideoCapabilities - (tmUnitSelect_t txUnit, - UInt8 *pEdidVFmts, UInt vFmtLength, UInt *pVFmtsAvail, UInt8 *pVidFlags) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt i; /* Loop index */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pEdidVFmts == Null) - RETIF_BADPARAM(vFmtLength < 1) - RETIF_BADPARAM(pVFmtsAvail == Null) - RETIF_BADPARAM(pVidFlags == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - - /* Copy the Device Instance Structure EdidVFmts descriptors to - * pEdidVFmts until we run out or no more space in structure. - */ - if (pDis->EdidSvdCnt > 0) { - for (i = 0; (i < (UInt) pDis->EdidSvdCnt) && (i < vFmtLength); i++) { - pEdidVFmts[i] = pDis->EdidVFmts[i]; - } - } else { - /* No pEdidVFmts to copy so set a zero format to be safe */ - pEdidVFmts[0] = HDMITX_VFMT_NULL; - } - - /* Fill Video Flags parameter */ - *pVidFlags = ((pDis->EdidCeaFlags & 0x80) | /* Underscan */ - ((pDis->EdidCeaFlags & 0x30) << 1)); /* YUV444, YUV422 */ - - - /* Add info regarding xvYCC support */ - *pVidFlags = *pVidFlags | (pDis->EdidCeaXVYCCFlags & 0x03); - - /* Fill number of SVDs available parameter */ - *pVFmtsAvail = pDis->EdidSvdCnt; - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetVideoPreferred */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989EdidGetVideoPreferred(tmUnitSelect_t txUnit, tmbslHdmiTxEdidDtd_t *pEdidDTD) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pEdidDTD == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - - /* Populate the Detailed Timing Descriptor structure pEdidDTD from - * EdidDtd in the Device Instance Structure. - */ - lmemcpy(pEdidDTD, &pDis->EdidDTD, sizeof(tmbslHdmiTxEdidDtd_t)); - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - return err; - -} - - -/*============================================================================*/ -/* STATIC FUNCTION */ -/*============================================================================*/ - -/*============================================================================*/ -/* requestEdidBlock - reads an entire edid block */ -/*============================================================================*/ -static tmErrorCode_t requestEdidBlock(tmHdmiTxobject_t *pDis /* Device instance strucure to use */ - ) { - tmErrorCode_t err; /* Error code */ - UInt8 segptr; /* Segment ptr value */ - UInt8 offset; /* Word offset value */ - - /* Check block number is valid [CEA861C A.2.1] */ - RETIF_BADPARAM(pDis->EdidBlockRequested >= 255) - - err = setHwRegister(pDis, E_REG_P09_DDC_ADDR_RW, DDC_EDID_ADDRESS); - RETIF_REG_FAIL(err) - - /* For even blocks we need an offset of 0, odd blocks we need 128 */ - offset = (((UInt8) pDis->EdidBlockRequested & 1) == 1) ? 128 : 0; - - err = setHwRegister(pDis, E_REG_P09_DDC_OFFS_RW, offset); - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P09_DDC_SEGM_ADDR_RW, DDC_SGMT_PTR_ADDRESS); - RETIF_REG_FAIL(err) - - /* Calculate which segment of the EDID we need (2 blocks per segment) */ - segptr = (UInt8) pDis->EdidBlockRequested / 2; - - err = setHwRegister(pDis, E_REG_P09_DDC_SEGM_RW, segptr); - RETIF_REG_FAIL(err) - - /* Enable reading EDID */ - err = setHwRegister(pDis, E_REG_P09_EDID_CTRL_RW, 0x1); - RETIF_REG_FAIL(err) - - /* The flag to start the EDID reading must cleared by software */ - err = setHwRegister(pDis, E_REG_P09_EDID_CTRL_RW, 0x0); - RETIF_REG_FAIL(err) - - return err; -} - -/*============================================================================*/ -/* parseEdidBlock */ -/*============================================================================*/ -static tmErrorCode_t parseEdidBlock(tmHdmiTxobject_t *pDis, /* Device instance strucure holding block */ - Int blockNumber /* Block number */ - ) { - UInt8 i; /* Loop index */ - UInt8 blockPtr, endPtr; /* Parsing pointers */ - UInt8 blockType, blockLength; - Bool dtdFound; - UInt8 NbBlkRead, offset3D = 0; - - /* Check block number is valid [CEA861C A.2.1] */ - RETIF_BADPARAM(blockNumber >= 255) - - NbBlkRead = 0; - dtdFound = True; - blockPtr = 0; - - if (blockNumber == 0) { - pDis->EDIDBasicDisplayParam.uVideoInputDef = pDis->EdidBlock[0x14]; - pDis->EDIDBasicDisplayParam.uMaxHorizontalSize = pDis->EdidBlock[0x15]; - pDis->EDIDBasicDisplayParam.uMaxVerticalSize = pDis->EdidBlock[0x16]; - pDis->EDIDBasicDisplayParam.uGamma = pDis->EdidBlock[0x17]; - pDis->EDIDBasicDisplayParam.uFeatureSupport = pDis->EdidBlock[0x18]; - - /* Block 0 - contains DTDs but no video data block (SVDs) */ - for (i = 0; (i < 2) && (dtdFound); i++) { /* search 2 possible DTD blocks in block 0 */ - blockPtr = (UInt8) (EDID_BLK0_BASE_DTD + (i * EDID_DTD_BLK_SIZE)); - if ((blockPtr + EDID_DTD_BLK_SIZE - 1) < EDID_BLOCK_SIZE) { - dtdFound = storeDtdBlock(pDis, blockPtr); - if (dtdFound) { - NbBlkRead++; - } - } - } - - dtdFound = True; - - /* Parse monitor descriptor */ - for (i = NbBlkRead; (i < EDID_NB_MAX_DESCRIP_BLK_IN_BLK_0) && (dtdFound); i++) { - blockPtr = (UInt8) (EDID_BLK0_BASE_DTD + (i * EDID_DTD_BLK_SIZE)); - if ((blockPtr + EDID_DTD_BLK_SIZE - 1) < EDID_BLOCK_SIZE) { - dtdFound = storeMonitorDescriptor(pDis, blockPtr); - } - } - } else if (blockNumber >= 1) { - switch (pDis->EdidBlock[0]) { - /* CEA EXTENSION */ - case EDID_CEA_EXTENSION: - /* Read CEA flag bits here - lockout when read once??? */ - pDis->EdidCeaFlags = pDis->EdidBlock[3]; - - blockPtr = EDID_BLK_EXT_BASE; /* data block start always fixed */ - endPtr = pDis->EdidBlock[2]; /* byte after end of data blocks */ - if (endPtr >= (EDID_BLK_EXT_BASE + 2) && (endPtr <= EDID_BLOCK_SIZE)) - /* Only try reading if data blocks take up 2 bytes or more, since - * a video data block must be at least 2 bytes - */ - { - while (blockPtr < endPtr) { - blockType = - (UInt8) ((pDis->EdidBlock[blockPtr] & 0xE0) >> 5); - blockLength = (pDis->EdidBlock[blockPtr] & 0x1F); - - switch ((Int) blockType) { - case E_CEA_VIDEO_BLOCK: /* We have a video data block */ - for (i = 1; i <= blockLength; i++) { - if ((blockPtr + i) < (EDID_BLOCK_SIZE)) { - /* If space, store non-zero SVDs */ - if ((pDis-> - EdidBlock[blockPtr + i] != 0) - && (pDis->EdidSvdCnt < - HDMI_TX_SVD_MAX_CNT)) { - pDis->EdidVFmts[pDis-> - EdidSvdCnt] - = - pDis-> - EdidBlock[blockPtr + i]; - pDis->EdidSvdCnt++; - } - } else { - /* do nothing */ - } - } - break; - case E_CEA_AUDIO_BLOCK: /* We have an audio data block */ - for (i = 1; (i + 2) <= blockLength; i += 3) { /* Must loop in steps of 3 (SAD size) */ - /* If space, store non-zero SADs */ - if ((blockPtr) < - (EDID_BLOCK_SIZE - (i + 2))) { - if (((pDis-> - EdidBlock[blockPtr + - i] & 0x78) != 0) - && (pDis->EdidSadCnt < - HDMI_TX_SAD_MAX_CNT)) { - pDis->EdidAFmts[pDis-> - EdidSadCnt]. - ModeChans = - pDis-> - EdidBlock[blockPtr + i]; - pDis->EdidAFmts[pDis-> - EdidSadCnt]. - Freqs = - pDis-> - EdidBlock[blockPtr + i + - 1]; - pDis->EdidAFmts[pDis-> - EdidSadCnt]. - Byte3 = - pDis-> - EdidBlock[blockPtr + i + - 2]; - pDis->EdidSadCnt++; - } - } else { - /* do nothing */ - } - } - break; - case E_CEA_VSDB: /* We have a VSDB */ - /* 5 bytes expected, but this is EDID land so double check */ - if (blockLength >= 5) { - if ((blockPtr) < (EDID_BLOCK_SIZE - 5)) { - if ((pDis-> - EdidBlock[blockPtr + 1] == - 0x03) - && (pDis-> - EdidBlock[blockPtr + 2] == - 0x0C) - && (pDis-> - EdidBlock[blockPtr + 3] == - 0x00)) { - pDis->EdidSinkType = - HDMITX_SINK_HDMI; - if ((blockPtr) < - (EDID_BLOCK_SIZE - 5)) { - pDis-> - EdidSourceAddress - = - ((UInt16) pDis-> - EdidBlock - [blockPtr + - 4] << 8) + - pDis-> - EdidBlock - [blockPtr + 5]; - } else { - /* do nothing */ - } - } else { - pDis->EdidSinkType = - HDMITX_SINK_DVI; - } - } else { - /* do nothing */ - } - } - - if (blockLength >= 6) { /* Space for byte with AI flag *//* Mask AI bit */ - if ((blockPtr) < (EDID_BLOCK_SIZE - 6)) { - if ((pDis-> - EdidBlock[blockPtr + - 6] & 0x80) == 0x80) { - pDis->EdidSinkAi = True; - } - } else { - /* do nothing */ - } - } - - /* Read Max_TMDS_Clock */ - if (blockLength >= 7) - pDis->EdidExtraVsdbData.maxTmdsClock = - pDis->EdidBlock[blockPtr + 7]; - else - pDis->EdidExtraVsdbData.maxTmdsClock = 0; - - - /* latency, HDMI Video present and content type fields */ - if (blockLength >= 8) { - if ((blockPtr) < (EDID_BLOCK_SIZE - 10)) { - /* Read CNC0~3 */ - pDis->EdidExtraVsdbData.cnc0 = pDis->EdidBlock[blockPtr + 8] & 0x01; /* 1=True, 0=False */ - pDis->EdidExtraVsdbData.cnc1 = - (pDis-> - EdidBlock[blockPtr + - 8] & 0x02) >> 1; - pDis->EdidExtraVsdbData.cnc2 = - (pDis-> - EdidBlock[blockPtr + - 8] & 0x04) >> 2; - pDis->EdidExtraVsdbData.cnc3 = - (pDis-> - EdidBlock[blockPtr + - 8] & 0x08) >> 3; - - if ((pDis-> - EdidBlock[blockPtr + - 8] & 0xC0) == 0xC0) { - /* Read video_latency, audio_latency, I_video_latency, I_audio_latency */ - - if ((blockPtr) < - (EDID_BLOCK_SIZE - - 12)) { - pDis->EdidLatency. - Edidvideo_latency - = - pDis-> - EdidBlock - [blockPtr + 9]; - pDis->EdidLatency. - Edidaudio_latency - = - pDis-> - EdidBlock - [blockPtr + 10]; - pDis->EdidLatency. - EdidIvideo_latency - = - pDis-> - EdidBlock - [blockPtr + 11]; - pDis->EdidLatency. - EdidIaudio_latency - = - pDis-> - EdidBlock - [blockPtr + 12]; - - pDis->EdidLatency. - latency_available - = True; - pDis->EdidLatency. - Ilatency_available - = True; - - offset3D = 13; /* offset to the '3D_present' field */ - - } else { - /* do nothing */ - } - } else - if ((pDis-> - EdidBlock[blockPtr + - 8] & 0x80) == - 0x80) { - /* Read video_latency, audio_latency */ - - pDis->EdidLatency. - Edidvideo_latency = - pDis-> - EdidBlock[blockPtr + 9]; - pDis->EdidLatency. - Edidaudio_latency = - pDis-> - EdidBlock[blockPtr + - 10]; - - pDis->EdidLatency. - latency_available = - True; - - offset3D = 11; - } else { - pDis->EdidLatency. - latency_available = - False; - pDis->EdidLatency. - Ilatency_available = - False; - offset3D = 9; - } - - /* Read HDMI_Video_present */ - pDis->EdidExtraVsdbData. - hdmiVideoPresent = - (pDis-> - EdidBlock[blockPtr + - 8] & 0x20) >> 5; - - } else { - /* do nothing */ - } - } else { - pDis->EdidLatency.latency_available = False; - pDis->EdidLatency.Ilatency_available = - False; - pDis->EdidExtraVsdbData.hdmiVideoPresent = - False; - pDis->EdidExtraVsdbData.cnc0 = False; - pDis->EdidExtraVsdbData.cnc1 = False; - pDis->EdidExtraVsdbData.cnc2 = False; - pDis->EdidExtraVsdbData.cnc3 = False; - } - - - /* 3D data fields according to HDMI 1.4a standard */ - if (pDis->EdidExtraVsdbData.hdmiVideoPresent) { - - /* read 3D_present */ - pDis->EdidExtraVsdbData.h3DPresent = - (pDis-> - EdidBlock[blockPtr + - offset3D] & 0x80) >> 7; - /* read 3D_Multi_present */ - pDis->EdidExtraVsdbData.h3DMultiPresent = - (pDis-> - EdidBlock[blockPtr + - offset3D] & 0x60) >> 5; - /* read image_Size */ - pDis->EdidExtraVsdbData.imageSize = - (pDis-> - EdidBlock[blockPtr + - offset3D] & 0x18) >> 3; - - /* read HDMI_3D_LEN and HDMI_XX_LEN */ - offset3D += 1; - pDis->EdidExtraVsdbData.hdmi3DLen = - pDis->EdidBlock[blockPtr + - offset3D] & 0x1F; - pDis->EdidExtraVsdbData.hdmiVicLen = - (pDis-> - EdidBlock[blockPtr + - offset3D] & 0xE0) >> 5; - - if ((pDis->EdidExtraVsdbData.hdmi3DLen + - pDis->EdidExtraVsdbData.hdmiVicLen) > - 0) { - /* copy the rest of the bytes */ - lmemcpy(pDis->EdidExtraVsdbData. - ext3DData, - &(pDis-> - EdidBlock[blockPtr + - offset3D + 1]), - blockLength - offset3D); - } - } else { - pDis->EdidExtraVsdbData.h3DPresent = False; - pDis->EdidExtraVsdbData.h3DMultiPresent = 0; - pDis->EdidExtraVsdbData.imageSize = 0; - pDis->EdidExtraVsdbData.hdmi3DLen = 0; - pDis->EdidExtraVsdbData.hdmiVicLen = 0; - } - - - break; - - - case E_CEA_EXTENDED: /* Use extended Tag */ - - /* we need to read the extended tag code */ - - if ((blockPtr) < (EDID_BLOCK_SIZE - 2)) { - switch (pDis->EdidBlock[blockPtr + 1]) { - case EXT_CEA_COLORIMETRY_DB: - - /* look at xvYCC709 and xvYCC601 support */ - pDis->EdidCeaXVYCCFlags = - pDis->EdidBlock[blockPtr + 2]; - - break; - } - } else { - /* do nothing */ - } - break; /* E_CEA_EXTENDED */ - - - - default: - break; - } - blockPtr += (blockLength + 1); /* Point to next block */ - } - } - dtdFound = True; - - for (i = 0; (i < EDID_NUMBER_MAX_DTD_BLK_1) && (dtdFound); i++) { /* search possible DTD blocks in block 1 */ - blockPtr = - ((UInt8) pDis->EdidBlock[EDID_BLK1_OFFSET_BASE_DTD]) + - ((UInt8) (i * EDID_DTD_BLK_SIZE)); - if ((blockPtr + EDID_DTD_BLK_SIZE - 1) < EDID_BLOCK_SIZE) { - dtdFound = storeDtdBlock(pDis, blockPtr); - } - } - - break; - - - case EDID_BLOCK_MAP: - /* BLOCK MAP */ - - if (pDis->EdidBlockCnt > 1) { - if ((pDis->EdidBlockCnt - 1) < EDID_BLOCK_SIZE) { - if (pDis->EdidBlock[pDis->EdidBlockCnt - 1] == - EDID_CEA_EXTENSION) { - /* Some devices have been incorrectly designed so that the block map is not counted in the */ - /* extension count. Design of compliant devices should take compatibility with those non-compliant */ - /* devices into consideration. */ - pDis->EdidBlockCnt = pDis->EdidBlockCnt + 1; - } - } else { - /* do nothing */ - } - } - - - break; - - - } - - } - - return TM_OK; -} - -/*============================================================================*/ -/* storeDtdBlock */ -/*============================================================================*/ -static Bool storeDtdBlock(tmHdmiTxobject_t *pDis, /* Device instance strucure holding block */ - UInt8 blockPtr) { - - Bool dtdFound = False; - - if (blockPtr >= (EDID_BLOCK_SIZE - 17)) { - /* do nothing */ - return dtdFound; - } - - /* First, select blocks that are DTDs [CEA861C A.2.10] */ - if (((pDis->EdidBlock[blockPtr + 0] != 0) || - (pDis->EdidBlock[blockPtr + 1] != 0) || - (pDis->EdidBlock[blockPtr + 2] != 0) || (pDis->EdidBlock[blockPtr + 4] != 0)) - && (pDis->NbDTDStored < NUMBER_DTD_STORED)) { /* Store the first DTD we find, others will be skipped */ - pDis->EdidDTD[pDis->NbDTDStored].uPixelClock = - ((UInt16) pDis->EdidBlock[blockPtr + 1] << 8) | - (UInt16) pDis->EdidBlock[blockPtr + 0]; - - pDis->EdidDTD[pDis->NbDTDStored].uHActivePixels = - (((UInt16) pDis->EdidBlock[blockPtr + 4] & 0x00F0) << 4) | - (UInt16) pDis->EdidBlock[blockPtr + 2]; - - pDis->EdidDTD[pDis->NbDTDStored].uHBlankPixels = - (((UInt16) pDis->EdidBlock[blockPtr + 4] & 0x000F) << 8) | - (UInt16) pDis->EdidBlock[blockPtr + 3]; - - pDis->EdidDTD[pDis->NbDTDStored].uVActiveLines = - (((UInt16) pDis->EdidBlock[blockPtr + 7] & 0x00F0) << 4) | - (UInt16) pDis->EdidBlock[blockPtr + 5]; - - pDis->EdidDTD[pDis->NbDTDStored].uVBlankLines = - (((UInt16) pDis->EdidBlock[blockPtr + 7] & 0x000F) << 8) | - (UInt16) pDis->EdidBlock[blockPtr + 6]; - - pDis->EdidDTD[pDis->NbDTDStored].uHSyncOffset = - (((UInt16) pDis->EdidBlock[blockPtr + 11] & 0x00C0) << 2) | - (UInt16) pDis->EdidBlock[blockPtr + 8]; - - pDis->EdidDTD[pDis->NbDTDStored].uHSyncWidth = - (((UInt16) pDis->EdidBlock[blockPtr + 11] & 0x0030) << 4) | - (UInt16) pDis->EdidBlock[blockPtr + 9]; - - pDis->EdidDTD[pDis->NbDTDStored].uVSyncOffset = - (((UInt16) pDis->EdidBlock[blockPtr + 11] & 0x000C) << 2) | - (((UInt16) pDis->EdidBlock[blockPtr + 10] & 0x00F0) >> 4); - - pDis->EdidDTD[pDis->NbDTDStored].uVSyncWidth = - (((UInt16) pDis->EdidBlock[blockPtr + 11] & 0x0003) << 4) | - ((UInt16) pDis->EdidBlock[blockPtr + 10] & 0x000F); - - pDis->EdidDTD[pDis->NbDTDStored].uHImageSize = - (((UInt16) pDis->EdidBlock[blockPtr + 14] & 0x00F0) << 4) | - (UInt16) pDis->EdidBlock[blockPtr + 12]; - - pDis->EdidDTD[pDis->NbDTDStored].uVImageSize = - (((UInt16) pDis->EdidBlock[blockPtr + 14] & 0x000F) << 8) | - (UInt16) pDis->EdidBlock[blockPtr + 13]; - - pDis->EdidDTD[pDis->NbDTDStored].uHBorderPixels = - (UInt16) pDis->EdidBlock[blockPtr + 15]; - - pDis->EdidDTD[pDis->NbDTDStored].uVBorderPixels = - (UInt16) pDis->EdidBlock[blockPtr + 16]; - - pDis->EdidDTD[pDis->NbDTDStored].Flags = pDis->EdidBlock[blockPtr + 17]; - - pDis->NbDTDStored++; - - dtdFound = True; /* Stop any more DTDs being parsed */ - } - - return (dtdFound); -} - - -/*============================================================================*/ -/* storeMonitorBlock */ -/*============================================================================*/ -static Bool storeMonitorDescriptor(tmHdmiTxobject_t *pDis, /* Device instance strucure holding block */ - UInt8 blockPtr) { - - Bool dtdFound = False; - - if (blockPtr >= (EDID_BLOCK_SIZE - 5)) { - /* do nothing */ - return dtdFound; - } - - /* First, select blocks that are DTDs [CEA861C A.2.10] */ - if ((pDis->EdidBlock[blockPtr + 0] == 0) && - (pDis->EdidBlock[blockPtr + 1] == 0) && (pDis->EdidBlock[blockPtr + 2] == 0) - ) { - if (pDis->EdidBlock[blockPtr + 3] == EDID_MONITOR_NAME_DESC_DATA_TYPE) { - if (pDis->EdidFirstMonitorDescriptor.bDescRecord == False) { - pDis->EdidFirstMonitorDescriptor.bDescRecord = True; - lmemcpy(&(pDis->EdidFirstMonitorDescriptor.uMonitorName), - &(pDis->EdidBlock[blockPtr + 5]), - EDID_MONITOR_DESCRIPTOR_SIZE); - dtdFound = True; - } else if ((pDis->EdidOtherMonitorDescriptor.bDescRecord == False)) { - pDis->EdidOtherMonitorDescriptor.bDescRecord = True; - lmemcpy(&(pDis->EdidOtherMonitorDescriptor.uOtherDescriptor), - &(pDis->EdidBlock[blockPtr + 5]), - EDID_MONITOR_DESCRIPTOR_SIZE); - dtdFound = True; - } - } else if (pDis->EdidBlock[blockPtr + 3] == EDID_MONITOR_RANGE_DESC_DATA_TYPE) { - if (pDis->EdidSecondMonitorDescriptor.bDescRecord == False) { - if (blockPtr < (EDID_BLOCK_SIZE - 9)) { - pDis->EdidSecondMonitorDescriptor.bDescRecord = True; - pDis->EdidSecondMonitorDescriptor.uMinVerticalRate = - pDis->EdidBlock[blockPtr + 5]; - pDis->EdidSecondMonitorDescriptor.uMaxVerticalRate = - pDis->EdidBlock[blockPtr + 6]; - pDis->EdidSecondMonitorDescriptor.uMinHorizontalRate = - pDis->EdidBlock[blockPtr + 7]; - pDis->EdidSecondMonitorDescriptor.uMaxHorizontalRate = - pDis->EdidBlock[blockPtr + 8]; - pDis->EdidSecondMonitorDescriptor.uMaxSupportedPixelClk = - pDis->EdidBlock[blockPtr + 9]; - dtdFound = True; - } else { - /* do nothing */ - } - } - } - } - - return (dtdFound); - -} - - -/*============================================================================*/ -/* tmbslTDA9989EdidGetLatencyInfo */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989EdidGetLatencyInfo(tmUnitSelect_t txUnit, tmbslHdmiTxEdidLatency_t *pEdidLatency) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pEdidLatency == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - - *pEdidLatency = pDis->EdidLatency; - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - return err; - -} - -/*============================================================================*/ -/* tmbslTDA9989EdidGetExtraVsdbData */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989EdidGetExtraVsdbData - (tmUnitSelect_t txUnit, tmbslHdmiTxEdidExtraVsdbData_t **pExtraVsdbData) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pExtraVsdbData == Null) - - if ((pDis->EdidStatus == HDMITX_EDID_READ) || - (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { - /* allow if edid are read or if there are a chk error on an other block than block 0 */ - *pExtraVsdbData = &(pDis->EdidExtraVsdbData); - } else { - /* Not allowed if EdidStatus value is not valid */ - err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; - } - return err; -} - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Edid_l.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Edid_l.h deleted file mode 100644 index 99dc580407b..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Edid_l.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2009 Koninklijke Philips Electronics N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of Koninklijke Philips Electronics N.V. and is confidential in - * nature. Under no circumstances is this software to be exposed to or placed - * under an Open Source License of any type without the expressed written - * permission of Koninklijke Philips Electronics N.V. - * - * \file tmbslTDA9989_Edid_l.h - * - * \version $Revision: 2 $ - * - * \date $Date: 04/07/07 17:00 $ - * - * -*/ - -#ifndef TMBSLTDA9989_EDID_L_H -#define TMBSLTDA9989_EDID_L_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* EXTERN DATA DEFINITION */ -/*============================================================================*/ - - extern tmErrorCode_t EdidBlockAvailable(tmUnitSelect_t txUnit, Bool * pSendEDIDCallback); - - extern tmErrorCode_t ClearEdidRequest(tmUnitSelect_t txUnit); - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - - - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLTDA9989_EDID_L_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Functions.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Functions.h deleted file mode 100644 index f8dcd7cd850..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Functions.h +++ /dev/null @@ -1,2608 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_functions.h - * - * \version $Revision: 2 $ - * - * -*/ - -#ifndef TMBSLTDA9989_FUNCTIONS_H -#define TMBSLTDA9989_FUNCTIONS_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#include "tmNxCompId.h" -#include "tmbslHdmiTx_types.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - -/*============================================================================*/ -/** - \brief Reset the Clock Time Stamp generator in HDMI mode only - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode - */ - tmErrorCode_t tmbslTDA9989AudioInResetCts(tmUnitSelect_t txUnit); - -/** - \brief Set audio input configuration in HDMI mode only - - \param[in] txUnit Transmitter unit number - \param[in] aFmt Audio input format - \param[in] i2sFormat I2s format type - \param[in] chanI2s I2S channel allocation - \param[in] chanDsd DSD channel allocation - \param[in] clkPolDsd DSD clock polarity - \param[in] swapDsd DSD data swap - \param[in] layout Sample layout - \param[in] latency_rd Audio FIFO read latency - \param[in] dstRate Dst rate (not used) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode - */ - tmErrorCode_t - tmbslTDA9989AudioInSetConfig - (tmUnitSelect_t txUnit, - tmbslHdmiTxaFmt_t aFmt, - tmbslHdmiTxI2sFor_t i2sFormat, - UInt8 chanI2s, - UInt8 chanDsd, - tmbslHdmiTxClkPolDsd_t clkPolDsd, - tmbslHdmiTxSwapDsd_t swapDsd, - UInt8 layout, UInt16 latency_rd, tmbslHdmiTxDstRate_t dstRate); - - -/** - \brief Set the Clock Time Stamp generator in HDMI mode only - - \param[in] txUnit Transmitter unit number - \param[in] ctsRef Clock Time Stamp reference source - \param[in] afs Audio input sample frequency - \param[in] voutFmt Video output format - \param[in] voutFreq Vertical output frequency - \param[in] uCts Manual Cycle Time Stamp - \param[in] uCtsX Clock Time Stamp factor x - \param[in] ctsK Clock Time Stamp predivider k - \param[in] ctsM Clock Time Stamp postdivider m - \param[in] dstRate Dst rate (not used) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode - */ - tmErrorCode_t - tmbslTDA9989AudioInSetCts - (tmUnitSelect_t txUnit, - tmbslHdmiTxctsRef_t ctsRef, - tmbslHdmiTxafs_t afs, - tmbslHdmiTxVidFmt_t voutFmt, - tmbslHdmiTxVfreq_t voutFreq, - UInt32 uCts, - UInt16 uCtsX, - tmbslHdmiTxctsK_t ctsK, tmbslHdmiTxctsM_t ctsM, tmbslHdmiTxDstRate_t dstRate); - -/** - \brief Set the Channel Status Bytes 0,1,3 & 4 - - \param[in] txUnit Transmitter unit number - \param[in] copyright Byte 0 Copyright bit (bit2) - \param[in] formatInfo Byte 0 Audio sample format (bit1) and additional info (bit345) - \param[in] categoryCode Byte 1 Category code (bits8-15) - \param[in] sampleFreq Byte 3 Sample Frequency (bits24-27) - \param[in] clockAccuracy Byte 3 Clock Accuracy (bits38-31) - \param[in] maxWordLength Byte 4 Maximum word length (bit32) - \param[in] wordLength Byte 4 Word length (bits33-35) - \param[in] origSampleFreq Byte 4 Original Sample Frequency (bits36-39) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode - - \note The consumer use bit (bit0) and Mode bits (bits6-7) are forced to zero. - Use tmbslTDA9989AudioOutSetChanStatusMapping to set CS Byte 2. - - */ - tmErrorCode_t - tmbslTDA9989AudioOutSetChanStatus - (tmUnitSelect_t txUnit, - tmbslHdmiTxAudioData_t pcmIdentification, - tmbslHdmiTxCSformatInfo_t formatInfo, - tmbslHdmiTxCScopyright_t copyright, - UInt8 categoryCode, - tmbslHdmiTxafs_t sampleFreq, - tmbslHdmiTxCSclkAcc_t clockAccuracy, - tmbslHdmiTxCSmaxWordLength_t maxWordLength, - tmbslHdmiTxCSwordLength_t wordLength, tmbslHdmiTxCSorigAfs_t origSampleFreq); - -/** - \brief Set the Channel Status Byte2 for Audio Port 0 - - \param[in] txUnit Transmitter unit number - \param[in] sourceLeft L Source Number: 0 don't take into account, 1-15 - \param[in] channelLeft L Channel Number: 0 don't take into account, 1-15 - \param[in] sourceRight R Source Number: 0 don't take into account, 1-15 - \param[in] channelRight R Channel Number: 0 don't take into account, 1-15 - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode - - \note Use tmbslTDA9989AudioOutSetChanStatus to set all other CS bytes - This function only sets the mapping for Audio Port 0. - - */ - tmErrorCode_t - tmbslTDA9989AudioOutSetChanStatusMapping - (tmUnitSelect_t txUnit, - UInt8 sourceLeft[4], UInt8 channelLeft[4], UInt8 sourceRight[4], UInt8 channelRight[4] - ); - -/** - \brief Mute or un-mute the audio output by controlling the audio FIFO, - in HDMI mode only - - \param[in] txUnit Transmitter unit number - \param[in] aMute Audio mute: On, Off - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode - - \note tmbslTDA9989PktSetGeneralCntrl must be used to control the audio - mute in outgoing data island packets - - */ - tmErrorCode_t tmbslTDA9989AudioOutSetMute(tmUnitSelect_t txUnit, tmbslHdmiTxaMute_t aMute); - - -/*============================================================================*/ -/** - \brief Disable an HDMI Transmitter output and destroy its driver - instance - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: the unit is not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t tmbslTDA9989Deinit(tmUnitSelect_t txUnit); - - -/** - \brief Get supported audio format(s) from previously read EDID - - \param[in] txUnit Transmitter unit number - \param[out] pEdidAFmts Pointer to the array of structures to receive the - supported Short Audio Descriptors - \param[in] aFmtLength Number of SADs supported in buffer pEdidAFmts, - up to HDMI_TX_SAD_MAX_CNT - \param[out] pAFmtsAvail Pointer to receive the number of SADs available - \param[out] pAudioFlags Pointer to the byte to receive the Audio Capability - Flags - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - \note \verbatim - Supported Short Audio Descriptors array: - EdidAFmts[0].ModeChans SAD 1 - Mode byte - EdidAFmts[0].Freqs SAD 1 - Frequencies byte - EdidAFmts[0].Byte3 SAD 1 - Byte 3 - ... - EdidAFmts[n-1].ModeChans SAD n - Mode byte - EdidAFmts[n-1].Freqs SAD n - Frequencies byte - EdidAFmts[n-1].Byte3 SAD n - Byte 3 - (Where n is the smaller of aFmtLength and pAFmtAvail) - \endverbatim - */ - tmErrorCode_t - tmbslTDA9989EdidGetAudioCapabilities - (tmUnitSelect_t txUnit, - tmbslHdmiTxEdidSad_t *pEdidAFmts, - UInt aFmtLength, UInt *pAFmtsAvail, UInt8 *pAudioFlags); - -/*============================================================================*/ -/** - \brief Get the EDID block count - - \param[in] txUnit Transmitter unit number - \param[out] puEdidBlockCount Pointer to data byte in which to return the - block count - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t - tmbslTDA9989EdidGetBlockCount(tmUnitSelect_t txUnit, UInt8 *puEdidBlockCount); - -/*============================================================================*/ -/** - \brief Get the EDID status - - \param[in] txUnit Transmitter unit number - \param[out] puEdidBlockCount Pointer to data byte in which to return the - edid status - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t tmbslTDA9989EdidGetStatus(tmUnitSelect_t txUnit, UInt8 *puEdidStatus); - -/** - \brief Request read of EDID blocks from the sink device via DDC - function not synchronous edid will available on - EDID_BLK_READ callback - - - \param[in] txUnit Transmitter unit number - \param[out] pRawEdid Pointer to a buffer supplied by the caller to accept - the raw EDID data. - \param[in] numBlocks Number of blocks to read - \param[in] lenRawEdid Length in bytes of the supplied buffer - \param[out] pEdidStatus Pointer to status value E_EDID_READ or E_EDID_ERROR - valid only when the return value is TM_OK - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE: EDID not read - - \note NA - - */ - - tmErrorCode_t tmbslTDA9989EdidRequestBlockData(tmUnitSelect_t txUnit, UInt8 *pRawEdid, Int numBlocks, /* Only relevant if pRawEdid valid */ - Int lenRawEdid /* Only relevant if pRawEdid valid */ - ); - - -/** - \brief Get Sink Type by analysis of EDID content - - \param[in] txUnit Transmitter unit number - \param[out] pSinkType Pointer to returned Sink Type: DVI or HDMI - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : edid not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NULL_CONNECTION: HPD pin is inactive - - \sa tmbslTDA9989EdidGetBlockData - */ - tmErrorCode_t - tmbslTDA9989EdidGetSinkType(tmUnitSelect_t txUnit, tmbslHdmiTxSinkType_t *pSinkType); - -/*============================================================================*/ -/** - \brief Get Source Physical Address by analysis of EDID content - - \param[in] txUnit Transmitter unit number - \param[out] pSourceAddress Pointer to returned Source Physical Address (ABCDh) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - \sa tmbslTDA9989EdidGetBlockData - */ - tmErrorCode_t - tmbslTDA9989EdidGetSourceAddress(tmUnitSelect_t txUnit, UInt16 *pSourceAddress); - -/** - \brief Get supported video format(s) from previously read EDID - - \param[in] txUnit Transmitter unit number - \param[out] pEdidVFmts Pointer to the array to receive the supported Short - Video Descriptors - \param[in] vFmtLength Number of SVDs supported in buffer pEdidVFmts, - up to HDMI_TX_SVD_MAX_CNT - \param[out] pVFmtsAvail Pointer to receive the number of SVDs available - \param[out] pVidFlags Ptr to the byte to receive Video Capability Flags - b7: underscan supported - b6: YCbCr 4:4:4 supported - b5: YCbCr 4:2:2 supported - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NULL_CONNECTION: HPD pin is inactive - - \note \verbatim - Supported Short Video Descriptors array: - (HDMI_TX_SVD_NATIVE_MASK bit set to indicate native format) - EdidVFmts[0] EIA/CEA Short Video Descriptor 1, or 0 - ... - EdidVFmts[n-1] EIA/CEA Short Video Descriptor 32, or 0 - (Where n is the smaller of vFmtLength and pVFmtAvail) - \endverbatim - \sa tmbslTDA9989EdidGetBlockData - */ - tmErrorCode_t - tmbslTDA9989EdidGetVideoCapabilities - (tmUnitSelect_t txUnit, - UInt8 *pEdidVFmts, UInt vFmtLength, UInt *pVFmtsAvail, UInt8 *pVidFlags); -/** - \brief Get detailed timing descriptor from previously read EDID - - \param[in] txUnit Transmitter unit number - \param[out] pEdidDTD Pointer to the array to receive the Detailed timing descriptor - - \param[in] nb_size Number of DTD supported in buffer pEdidDTD - - \param[out] pDTDAvail Pointer to receive the number of DTD available - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized -*/ - tmErrorCode_t - tmbslTDA9989EdidGetDetailedTimingDescriptors - (tmUnitSelect_t txUnit, - tmbslHdmiTxEdidDtd_t *pEdidDTD, UInt8 nb_size, UInt8 *pDTDAvail); - -/** - \brief Get detailed Monitor descriptor from previously read EDID - - \param[in] txUnit Transmitter unit number - \param[out] pEdidFirstMD Pointer to the First Monitor descriptor - \param[out] pEdidSecondMD Pointer to the Second Monitor descriptor - \param[out] pEdidOtherMD Pointer to the Other Monitor descriptor - \param[in] sizeOtherMD Not used - \param[out] pOtherMDAvail Not used - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized -*/ - tmErrorCode_t - tmbslTDA9989EdidGetMonitorDescriptors - (tmUnitSelect_t txUnit, - tmbslHdmiTxEdidFirstMD_t *pEdidFirstMD, - tmbslHdmiTxEdidSecondMD_t *pEdidSecondMD, - tmbslHdmiTxEdidOtherMD_t *pEdidOtherMD, UInt8 sizeOtherMD, UInt8 *pOtherMDAvail); - -/** - \brief Get basic display parameters from previously read EDID - - \param[in] txUnit Transmitter unit number - \param[out] pEdidBDParam Pointer to the Basic Display Parameters - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized -*/ - tmErrorCode_t - tmbslTDA9989EdidGetBasicDisplayParam - (tmUnitSelect_t txUnit, tmbslHdmiTxEdidBDParam_t *pEdidBDParam); - - -/** - \brief Get preferred video format from previously read EDID - - \param[in] txUnit Transmitter unit number - \param[out] pEdidDTD Pointer to the structure to receive the Detailed - Timing Descriptor parameters of the preferred video - format - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NULL_CONNECTION: HPD pin is inactive - - \note \verbatim - Detailed Timing Descriptor parameters output structure: - UInt16 uPixelClock Pixel Clock (MHz/10,000) - UInt16 uHActivePixels Horizontal Active Pixels - UInt16 uHBlankPixels Horizontal Blanking Pixels - UInt16 uVActiveLines Vertical Active Lines - UInt16 uVBlankLines Vertical Blanking Lines - UInt16 uHSyncOffset Horizontal Sync Offset (Pixels) - UInt16 uHSyncWidth Horizontal Sync Pulse Width (Pixels) - UInt16 uVSyncOffset Vertical Sync Offset (Lines) - UInt16 uVSyncWidth Vertical Sync Pulse Width (Lines) - UInt16 uHImageSize Horizontal Image Size (mm) - UInt16 uVImageSize Vertical Image Size (mm) - UInt16 uHBorderPixels Horizontal Border (Pixels) - UInt16 uVborderPixels Vertical Border (Pixels) - UInt8 Flags Interlace/sync info - \endverbatim - \sa tmbslTDA9989EdidGetBlockData - */ - tmErrorCode_t - tmbslTDA9989EdidGetVideoPreferred - (tmUnitSelect_t txUnit, tmbslHdmiTxEdidDtd_t *pEdidDTD); - -/** - \brief Check the result of an HDCP encryption attempt, called at - intervals (set by uTimeSinceLastCallMs) after tmbslTDA9989HdcpRun - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] uTimeSinceLastCallMs Time in ms since this was last called - \param[out] pResult The outcome of the check - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - */ - tmErrorCode_t - tmbslTDA9989HdcpCheck - (tmUnitSelect_t txUnit, UInt16 uTimeSinceLastCallMs, tmbslHdmiTxHdcpCheck_t *pResult); - -/** - \brief Configure various HDCP parameters - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] slaveAddress DDC I2C slave address - \param[in] txMode Mode of our transmitter device - \param[in] options Options flags to control behaviour of HDCP - \param[in] uCheckIntervalMs HDCP check interval in milliseconds - \param[in] uChecksToDo Number of HDCP checks to do after HDCP starts - A value of 2 or more is valid for checking - May be set to 0 to disabling checking - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - - \note Must be called before all other HDCP APIs - */ - tmErrorCode_t - tmbslTDA9989HdcpConfigure - (tmUnitSelect_t txUnit, - UInt8 slaveAddress, - tmbslHdmiTxHdcpTxMode_t txMode, - tmbslHdmiTxHdcpOptions_t options, UInt16 uCheckIntervalMs, UInt8 uChecksToDo); - -/** - \brief Download keys and AKSV data from OTP memory to the device - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - \param[in] seed Seed value - \param[in] keyDecryption State of key decryption 0 to 1 (disabled, enabled) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - */ - tmErrorCode_t - tmbslTDA9989HdcpDownloadKeys - (tmUnitSelect_t txUnit, UInt16 seed, tmbslHdmiTxDecrypt_t keyDecryption); - -/*============================================================================*/ -/** - \brief Switch HDCP encryption on or off without disturbing Infoframes - (Not normally used) - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] bOn Encryption state: 1=on, 0=off - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP -*/ - tmErrorCode_t tmbslTDA9989HdcpEncryptionOn(tmUnitSelect_t txUnit, Bool bOn); - -/*============================================================================*/ -/** - \brief Get HDCP OTP registers - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] otpAddress OTP start address 0-FF - \param[out] pOtpData Ptr to a three-byte array to hold the data read: - [0] = OTP_DATA_MSB - [1] = OTP_DATA_ISB - [2] = OTP_DATA_LSB - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP -*/ - tmErrorCode_t - tmbslTDA9989HdcpGetOtp(tmUnitSelect_t txUnit, UInt8 otpAddress, UInt8 *pOtpData); - -/*============================================================================*/ -/** - \brief Return the failure state that caused the last T0 interrupt - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[out] pFailState Ptr to the unit's last T0 fail state - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP -*/ - tmErrorCode_t tmbslTDA9989HdcpGetT0FailState(tmUnitSelect_t txUnit, UInt8 *pFailState); - -/*============================================================================*/ -/** - \brief Handle BCAPS interrupt - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note The user BCAPS interrupt handler (registered with - tmbslTDA9989Init) calls this API before calling - tmbslTDA9989HdcpHandleBKSV -*/ - tmErrorCode_t tmbslTDA9989HdcpHandleBCAPS(tmUnitSelect_t txUnit); - -/*============================================================================*/ -/** - \brief Read BKSV registers - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[out] pBksv Pointer to 5-byte BKSV array returned to caller - (1st byte is MSB) - \param[out] pbCheckRequired Pointer to a result variable to tell the caller - whether to check for BKSV in a revocation list: - 0 or 1 (check not required, check required) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note The user BCAPS interrupt handler (registered with - tmbslTDA9989Init) calls this API after calling - tmbslTDA9989HdcpHandleBCAPS -*/ - tmErrorCode_t - tmbslTDA9989HdcpHandleBKSV - (tmUnitSelect_t txUnit, UInt8 *pBksv, Bool *pbCheckRequired); - -/*============================================================================*/ -/** - \brief Declare BKSV result to be secure or not secure - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - \param[in] bSecure Result of user's check of BKSV against a - revocation list: - 0 (not secure: BKSV found in revocation list) - 1 (secure: BKSV not found in revocation list) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note The user BCAPS interrupt handler (registered with - tmbslTDA9989Init) calls this API after calling - tmbslTDA9989HdcpHandleBKSV -*/ - tmErrorCode_t tmbslTDA9989HdcpHandleBKSVResult(tmUnitSelect_t txUnit, Bool bSecure); - -/** - \brief Handle BSTATUS interrupt - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - \param[out] pBstatus Pointer to 16-bit BSTATUS value returned to caller - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note Called by user's BSTATUS interrupt handler registered with - tmbslTDA9989Init -*/ - tmErrorCode_t tmbslTDA9989HdcpHandleBSTATUS(tmUnitSelect_t txUnit, UInt16 *pBstatus); - -/*============================================================================*/ -/** - \brief Handle ENCRYPT interrupt - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note Called by user's ENCRYPT interrupt handler registered with - tmbslTDA9989Init -*/ - tmErrorCode_t tmbslTDA9989HdcpHandleENCRYPT(tmUnitSelect_t txUnit); - -/*============================================================================*/ -/** - \brief Handle PJ interrupt - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note Called by user's PJ interrupt handler registered with - tmbslTDA9989Init -*/ - tmErrorCode_t tmbslTDA9989HdcpHandlePJ(tmUnitSelect_t txUnit); - -/** - \brief Handle SHA-1 interrupt - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - \param[in] maxKsvDevices Maximum number of 5-byte devices that will fit - in *pKsvList: 0 to 128 devices - If 0, no KSV read is done and it is treated as - secure - \param[out] pKsvList Pointer to KSV list array supplied by caller: - Sets of 5-byte KSVs, 1 per device, 1st byte is - LSB of 1st device - May be null if maxKsvDevices is 0 - \param[out] pnKsvDevices Pointer to number of KSV devices copied to - *pKsvList: 0 to 128 - If 0, no KSV check is needed and it is treated - as secure - May be null if maxKsvDevices is 0 - \param[out] pDepth Connection tree depth - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: two parameters disagree - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note Called by user's SHA-1 interrupt handler registered with - tmbslTDA9989Init -*/ - tmErrorCode_t - tmbslTDA9989HdcpHandleSHA_1 - (tmUnitSelect_t txUnit, - UInt8 maxKsvDevices, UInt8 *pKsvList, UInt8 *pnKsvDevices, UInt8 *pDepth); - -/*============================================================================*/ -/** - \brief Declare KSV list result to be secure or not secure - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - \param[in] bSecure Result of user's check of KSV list against a - revocation list: - 0 (not secure: one or more KSVs are in r.list) - 1 (secure: no KSV found in revocation list) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note The user SHA_1 interrupt handler (registered with - tmbslTDA9989Init) calls this API after calling - tmbslTDA9989HdcpHandleSHA_1 -*/ - tmErrorCode_t tmbslTDA9989HdcpHandleSHA_1Result(tmUnitSelect_t txUnit, Bool bSecure); - -/*============================================================================*/ -/** - \brief Handle T0 interrupt - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - \note Called by user's T0 interrupt handler registered with - tmbslTDA9989Init -*/ - tmErrorCode_t tmbslTDA9989HdcpHandleT0(tmUnitSelect_t txUnit); - -/*============================================================================*/ -/** - \brief Prepare for HDCP operation - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] voutFmt Video output format - \param[in] voutFreq Vertical output frequency - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - - \note Must be called before tmbslTDA9989HdcpRun -*/ - tmErrorCode_t - tmbslTDA9989HdcpInit - (tmUnitSelect_t txUnit, tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTxVfreq_t voutFreq); - -/*============================================================================*/ -/** - \brief Start HDCP operation - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - - \note Must be called after tmbslTDA9989HdcpInit -*/ - tmErrorCode_t tmbslTDA9989HdcpRun(tmUnitSelect_t txUnit); - -/*============================================================================*/ -/** - \brief Stop HDCP operation, and cease encrypting the output - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - - \note This will trigger an Encrypt interrupt -*/ - tmErrorCode_t tmbslTDA9989HdcpStop(tmUnitSelect_t txUnit); -/** - \brief Get the hot plug input status last read by tmbslTDA9989Init - or tmbslTDA9989HwHandleInterrupt - - \param[in] txUnit Transmitter unit number - \param[out] pHotPlugStatus Pointer to returned Hot Plug Detect status - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t tmbslTDA9989HotPlugGetStatus(tmUnitSelect_t txUnit, tmbslHdmiTxHotPlug_t *pHotPlugStatus, Bool client /* Used to determine whether the request comes from the application */ - ); - -/** - \brief Get the rx sense input status last read by tmbslTDA9989Init - or tmbslTDA9989HwHandleInterrupt - - \param[in] txUnit Transmitter unit number - \param[out] pRxSenseStatus Pointer to returned Rx Sense Detect status - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t tmbslTDA9989RxSenseGetStatus(tmUnitSelect_t txUnit, tmbslHdmiTxRxSense_t *pRxSenseStatus, Bool client /* Used to determine whether the request comes from the application */ - ); - -/*============================================================================*/ -/** - \brief Get one or more hardware I2C register values - - \param[in] txUnit Transmitter unit number - \param[in] regPage The device register's page: 00h, 01h, 02h, 11h, 12h - \param[in] regAddr The starting register address on the page: 0 to FFh - \param[out] pRegBuf Pointer to buffer to receive the register data - \param[in] nRegs Number of contiguous registers to read: 1 to 254 - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - */ - tmErrorCode_t - tmbslTDA9989HwGetRegisters - (tmUnitSelect_t txUnit, Int regPage, Int regAddr, UInt8 *pRegBuf, Int nRegs); - -/*============================================================================*/ -/** - \brief Get the transmitter device version read at initialization - - \param[in] txUnit Transmitter unit number - \param[out] puDeviceVersion Pointer to returned hardware version - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t tmbslTDA9989HwGetVersion(tmUnitSelect_t txUnit, UInt8 *puDeviceVersion); - - -/** - \brief Get the transmitter device feature read at initialization - - \param[in] txUnit Transmitter unit number - \param[in] deviceFeature Hardware feature to check - \param[out] pFeatureSupported Hardware feature supported or not - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - */ - tmErrorCode_t - tmbslTDA9989HwGetCapabilities - (tmUnitSelect_t txUnit, - tmbslHdmiTxHwFeature_t deviceCapability, Bool *pFeatureSupported); - - -/*============================================================================*/ -/** - \brief Handle all hardware interrupts from a transmitter unit - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - \note This function must be called at task level not interrupt level, - as I2C access is required - */ - tmErrorCode_t tmbslTDA9989HwHandleInterrupt(tmUnitSelect_t txUnit); - - -/*============================================================================*/ -/** - \brief Set one or more hardware I2C registers - - \param[in] txUnit Transmitter unit number - \param[in] regPage The device register's page: 00h, 01h, 02h, 11h, 12h - \param[in] regAddr The starting register address on the page: 0 to FFh - \param[in] pRegBuf Ptr to buffer from which to write the register data - \param[in] nRegs Number of contiguous registers to write: 0 to 254. - The page register (255) may not be written - it is - written to automatically here. If nRegs is 0, the - page register is the only register written. - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989HwSetRegisters - (tmUnitSelect_t txUnit, Int regPage, Int regAddr, UInt8 *pRegBuf, Int nRegs); - - -/*============================================================================*/ -/** - \brief Handle hardware startup by resetting Device Instance Data - */ - void - tmbslTDA9989HwStartup(void - ); - -/** - \brief Create an instance of an HDMI Transmitter: initialize the - driver, reset the transmitter device and get the current - Hot Plug state - - \param[in] txUnit Transmitter unit number - \param[in] uHwAddress Device I2C slave address - \param[in] sysFuncWrite System function to write I2C - \param[in] sysFuncRead System function to read I2C - \param[in] sysFuncEdidRead System function to read EDID blocks via I2C - \param[in] sysFuncTimer System function to run a timer - \param[in] funcIntCallbacks Pointer to interrupt callback function list - The list pointer is null for no callbacks; - each pointer in the list may also be null. - \param[in] bEdidAltAddr Use alternative i2c address for EDID data - register between Driver and TDA9983/2: - 0 - use default address (A0) - 1 - use alternative address (A2) - \param[in] vinFmt EIA/CEA Video input format: 1 to 31, 0 = No Change - \param[in] pixRate Single data (repeated or not) or double data rate - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or - the transmitter instance is already initialised - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_INIT_FAILED: the unit instance is already - initialised - - TMBSL_ERR_HDMI_COMPATIBILITY: the driver is not compatiable - with the internal device version code - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - */ - tmErrorCode_t - tmbslTDA9989Init - (tmUnitSelect_t txUnit, - UInt8 uHwAddress, - ptmbslHdmiTxSysFunc_t sysFuncWrite, - ptmbslHdmiTxSysFunc_t sysFuncRead, - ptmbslHdmiTxSysFuncEdid_t sysFuncEdidRead, - ptmbslHdmiTxSysFuncTimer_t sysFuncTimer, - tmbslHdmiTxCallbackList_t *funcIntCallbacks, - Bool bEdidAltAddr, tmbslHdmiTxVidFmt_t vinFmt, tmbslHdmiTxPixRate_t pixRate); - -/** - \brief Set colour space converter matrix coefficients - - \param[in] txUnit Transmitter unit number - \param[in] pMatCoeff Pointer to Matrix Coefficient structure - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note Matrix Coefficient parameter structure: - Int16 Coeff[9]: Array of coefficients (values -1024 to +1023) - */ - tmErrorCode_t - tmbslTDA9989MatrixSetCoeffs(tmUnitSelect_t txUnit, tmbslHdmiTxMatCoeff_t *pMatCoeff); - -/** - \brief Set colour space conversion using preset values - - \param[in] txUnit Transmitter unit number - \param[in] vinFmt Input video format - \param[in] vinMode Input video mode - \param[in] voutFmt Output video format - \param[in] voutMode Output video mode - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t - tmbslTDA9989MatrixSetConversion - (tmUnitSelect_t txUnit, - tmbslHdmiTxVidFmt_t vinFmt, - tmbslHdmiTxVinMode_t vinMode, - tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTxVoutMode_t voutMode, tmbslHdmiTxVQR_t dviVqr); - -/** - \brief Set colour space converter matrix offset at input - - \param[in] txUnit Transmitter unit number - \param[in] pMatOffset Pointer to Matrix Offset structure - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - \note Matrix Offset structure parameter structure: - Int16 Offset[3]: Offset array (values -1024 to +1023) - */ - tmErrorCode_t - tmbslTDA9989MatrixSetInputOffset - (tmUnitSelect_t txUnit, tmbslHdmiTxMatOffset_t *pMatOffset); - -/** - \brief Set colour space converter matrix mode - - \param[in] txUnit Transmitter unit number - \param[in] mControl Matrix Control: On, Off, No change - \param[in] mScale Matrix Scale Factor: 1/256, 1/512, 1/1024, No change - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - \note NA - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989MatrixSetMode - (tmUnitSelect_t txUnit, tmbslHdmiTxmCntrl_t mControl, tmbslHdmiTxmScale_t mScale); - -/*============================================================================*/ -/** - \brief Set colour space converter matrix offset at output - - \param[in] txUnit Transmitter unit number - \param[in] pMatOffset Pointer to Matrix Offset structure - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - \note Matrix Offset parameter structure: - nt16 Offset[3]: Offset array (values -1024 to +1023) - */ - tmErrorCode_t - tmbslTDA9989MatrixSetOutputOffset - (tmUnitSelect_t txUnit, tmbslHdmiTxMatOffset_t *pMatOffset); - -/*============================================================================*/ -/** - \brief Enable audio clock recovery packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: when in DVI mode - - \note tmbslTDA9989AudioInSetCts sets CTS and N values - */ - tmErrorCode_t tmbslTDA9989PktSetAclkRecovery(tmUnitSelect_t txUnit, Bool bEnable); - -/** - \brief Set audio content protection packet & enable/disable packet - insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to Data Island Packet structure - \param[in] byteCnt Packet buffer byte count - \param[in] uAcpType Content protection type - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NOT_SUPPORTED: not possible with this device - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Data Island Packet parameter structure: - UInt8 dataByte[28] Packet Data - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989PktSetAcp - (tmUnitSelect_t txUnit, - tmbslHdmiTxPkt_t *pPkt, UInt byteCnt, UInt8 uAcpType, Bool bEnable); - -/** - \brief Set audio info frame packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to Audio Infoframe structure - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Audio Infoframe structure: - UInt8 CodingType - UInt8 ChannelCount - UInt8 SampleFreq - UInt8 SampleSize - UInt8 ChannelAlloc - Bool DownMixInhibit - UInt8 LevelShift - */ - tmErrorCode_t - tmbslTDA9989PktSetAudioInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktAif_t *pPkt, Bool bEnable); - - -/*============================================================================*/ -/** - \brief Set contents of general control packet & enable/disable - packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] paMute Pointer to Audio Mute; if Null, no change to packet - contents is made - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note tmbslTDA9989AudioOutSetMute must be used to mute the audio output - */ - tmErrorCode_t - tmbslTDA9989PktSetGeneralCntrl - (tmUnitSelect_t txUnit, tmbslHdmiTxaMute_t *paMute, Bool bEnable); - -/*============================================================================*/ -/** - \brief Set ISRC1 packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to Data Island Packet structure - \param[in] byteCnt Packet buffer byte count - \param[in] bIsrcCont ISRC continuation flag - \param[in] bIsrcValid ISRC valid flag - \param[in] uIsrcStatus ISRC Status - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NOT_SUPPORTED: not possible with this device - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Data Island Packet parameter structure: - UInt8 dataByte[28] Packet Data - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989PktSetIsrc1 - (tmUnitSelect_t txUnit, - tmbslHdmiTxPkt_t *pPkt, - UInt byteCnt, Bool bIsrcCont, Bool bIsrcValid, UInt8 uIsrcStatus, Bool bEnable); - -/*============================================================================*/ -/** - \brief Set ISRC2 packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to Data Island Packet structure - \param[in] byteCnt Packet buffer byte count - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NOT_SUPPORTED: not possible with this device - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Data Island Packet parameter structure: - UInt8 dataByte[28] Packet Data - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989PktSetIsrc2 - (tmUnitSelect_t txUnit, tmbslHdmiTxPkt_t *pPkt, UInt byteCnt, Bool bEnable); - -/** - \brief Set MPEG infoframe packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to MPEG Infoframe structure - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NOT_SUPPORTED: not possible with this device - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note MPEG Infoframe structure: - UInt32 bitRate - tmbslHdmiTxMpegFrame_t frameType - Bool bFieldRepeat - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989PktSetMpegInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktMpeg_t *pPkt, Bool bEnable); - -/*============================================================================*/ -/** - \brief Enable NULL packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - */ - tmErrorCode_t tmbslTDA9989PktSetNullInsert(tmUnitSelect_t txUnit, Bool bEnable); - -/*============================================================================*/ -/** - \brief Set single Null packet insertion (flag auto-resets after - transmission) - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Operation resets after single transmission - */ - tmErrorCode_t tmbslTDA9989PktSetNullSingle(tmUnitSelect_t txUnit); - -/** - \brief Set audio info frame packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to Audio Infoframe structure - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NOT_SUPPORTED: not possible with this device - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Audio Infoframe structure: - UInt8 VendorName[8] - UInt8 ProdDescr[16] - tmbslHdmiTxSourceDev_t SourceDevInfo - */ - tmErrorCode_t - tmbslTDA9989PktSetSpdInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktSpd_t *pPkt, Bool bEnable); - -/** - \brief Set video infoframe packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to Video Infoframe structure - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Video Infoframe structure: - UInt8 Colour - Bool ActiveInfo - UInt8 BarInfo - UInt8 ScanInfo - UInt8 Colorimetry - UInt8 PictureAspectRatio - UInt8 ActiveFormatRatio - UInt8 Scaling - UInt8 VidFormat - UInt8 PixelRepeat - UInt16 EndTopBarLine - UInt16 StartBottomBarLine - UInt16 EndLeftBarPixel - UInt16 StartRightBarPixel (incorrectly named in [HDMI1.2]) - */ - tmErrorCode_t - tmbslTDA9989PktSetVideoInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktVif_t *pPkt, Bool bEnable); - -/*============================================================================*/ -/** - \brief Set Vendor Specific Infoframe packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to Data Island Packet structure - \param[in] byteCnt Packet buffer byte count - \param[in] uVersion Version number for packet header - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_NOT_SUPPORTED: not possible with this device - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Data Island Packet parameter structure: - UInt8 dataByte[28] Packet Data (only use 27 bytes max) - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989PktSetVsInfoframe - (tmUnitSelect_t txUnit, - tmbslHdmiTxPkt_t *pPkt, UInt byteCnt, UInt8 uVersion, Bool bEnable); - -/*============================================================================*/ -/** - \brief Set raw video Infoframe packet & enable/disable packet insertion - - \param[in] txUnit Transmitter unit number - \param[in] pPkt Pointer to raw Packet structure - \param[in] bEnable Enable or disable packet insertion - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - \note Data Island Packet parameter structure: - UInt8 dataByte[28] Packet Data - - \sa NA - */ - tmErrorCode_t tmbslTDA9989PktSetRawVideoInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktRawAvi_t *pPkt, Bool bEnable); - - -/*============================================================================*/ -/** - \brief Get the power state of the transmitter - - \param[in] txUnit Transmitter unit number - \param[out] pePowerState Pointer to the power state of the device now - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - \note Power states: - - tmPowerOn - - tmPowerStandby - */ - tmErrorCode_t - tmbslTDA9989PowerGetState(tmUnitSelect_t txUnit, tmPowerState_t *pePowerState); - -/*============================================================================*/ -/** - \brief Set the power state of the transmitter - - \param[in] txUnit Transmitter unit number - \param[in] ePowerState Power state to set - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note Power states (Off and Suspend are treated the same as Standby): - - tmPowerOn - - tmPowerStandby - - tmPowerSuspend - - tmPowerOff - */ - tmErrorCode_t tmbslTDA9989PowerSetState(tmUnitSelect_t txUnit, tmPowerState_t ePowerState); - - -/*============================================================================*/ -/** - \brief Reset the HDMI transmitter - - \param[in] txUnit Transmitter unit number - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note NA - - \sa tmbslTDA9989Init - */ - tmErrorCode_t tmbslTDA9989Reset(tmUnitSelect_t txUnit); - -/** - \brief Get diagnostic counters from the scaler - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[out] pScalerDiag Pointer to structure to receive scaler diagnostic - registers - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - \note scaler diagnostic registers structure: - UInt16 maxBuffill_p Filling primary video buffer - UInt16 maxBuffill_d Filling video deinterlaced buffer - UInt8 maxFifofill_pi Filling primary video input FIFO - UInt8 minFifofill_po1 Filling primary video output FIFO #1 - UInt8 minFifofill_po2 Filling primary video output FIFO #2 - UInt8 minFifofill_po3 Filling primary video output FIFO #3 - UInt8 minFifofill_po4 Filling primary video output FIFO #4 - UInt8 maxFifofill_di Filling deinterlaced video input FIFO - UInt8 maxFifofill_do Filling deinterlaced video output FIFO - */ - tmErrorCode_t - tmbslTDA9989ScalerGet(tmUnitSelect_t txUnit, tmbslHdmiTxScalerDiag_t *pScalerDiag); - - - -/** - \brief Get the current scaler mode - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - \param[out] pScalerMode Pointer to variable to receive scaler mode - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized -*/ - tmErrorCode_t - tmbslTDA9989ScalerGetMode(tmUnitSelect_t txUnit, tmbslHdmiTxScaMode_t *pScalerMode); - - -/*============================================================================*/ -/** - \brief Enable or disable scaler input frame - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - - \param[in] txUnit Transmitter unit number - \param[in] bDisable Enable or disable scaler input - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t tmbslTDA9989ScalerInDisable(tmUnitSelect_t txUnit, Bool bDisable); - -/** - \brief Set the active coefficient lookup table for the vertical scaler - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] lutSel Coefficient lookup table selection - \param[in] pVsLut Table of HDMITX_VSLUT_COEFF_NUM coefficient values - (may be null if lutSel not HDMITX_SCALUT_USE_VSLUT) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: two parameters disagree - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989ScalerSetCoeffs - (tmUnitSelect_t txUnit, tmbslHdmiTxScaLut_t lutSel, UInt8 *pVsLut); - -/** - \brief Set scaler field positions - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] topExt Internal, External, No Change - \param[in] deExt Internal, External, No Change - \param[in] topSel Internal, VRF, No Change - \param[in] topTgl No Action, Toggle, No Change - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989ScalerSetFieldOrder - (tmUnitSelect_t txUnit, - tmbslHdmiTxIntExt_t topExt, - tmbslHdmiTxIntExt_t deExt, tmbslHdmiTxTopSel_t topSel, tmbslHdmiTxTopTgl_t topTgl); - -/** - \brief Set scaler fine adjustment options - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] uRefPix Ref. pixel preset 0 to 1FFFh (2000h = No Change) - \param[in] uRefLine Ref. line preset 0 to 7FFh (800h = No Change) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989ScalerSetFine(tmUnitSelect_t txUnit, UInt16 uRefPix, UInt16 uRefLine); - -/** - \brief Set scaler phase for scaling 1080p - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] tmbslHdmiTxHPhases_t Ref. 0 to 15_horizontal_phases 1 to 16_horizontal_phases - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - - tmErrorCode_t - tmbslTDA9989ScalerSetPhase - (tmUnitSelect_t txUnit, tmbslHdmiTxHPhases_t horizontalPhases); - -/** - \brief configure scaler latency to set run in run out - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] UInt8 Ref. 0 to 255 - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t tmbslTDA9989ScalerSetLatency(tmUnitSelect_t txUnit, UInt8 scaler_latency); - -/** - \brief Set scaler synchronization options - On a TDA9989 this function is not supported and - return result TMBSL_ERR_HDMI_NOT_SUPPORTED - - \param[in] txUnit Transmitter unit number - \param[in] method Sync. combination method - \param[in] once Line/pixel counters sync once or each frame - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989ScalerSetSync - (tmUnitSelect_t txUnit, tmbslHdmiTxVsMeth_t method, tmbslHdmiTxVsOnce_t once); - - -/*============================================================================*/ -/** - \brief Get the driver software version and compatibility numbers - - \param[out] pSWVersion Pointer to the software version structure returned - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t tmbslTDA9989SwGetVersion(ptmSWVersion_t pSWVersion); - - -/*============================================================================*/ -/** - \brief Get the driver software version and compatibility numbers - - \param[in] txUnit Transmitter unit number - \param[in] waitMs Period in milliseconds to wait - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t tmbslTDA9989SysTimerWait(tmUnitSelect_t txUnit, UInt16 waitMs); - -/** - \brief Set the TMDS outputs to normal active operation or to a forced - state - - \param[in] txUnit Transmitter unit number - \param[in] tmdsOut TMDS output mode - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t - tmbslTDA9989TmdsSetOutputs(tmUnitSelect_t txUnit, tmbslHdmiTxTmdsOut_t tmdsOut); - -/** - \brief Fine-tune the TMDS serializer - - \param[in] txUnit Transmitter unit number - \param[in] uPhase2 Serializer phase 2 - \param[in] uPhase3 Serializer phase 3 - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - */ - tmErrorCode_t - tmbslTDA9989TmdsSetSerializer(tmUnitSelect_t txUnit, UInt8 uPhase2, UInt8 uPhase3); - -/** - \brief Set a colour bar test pattern - - \param[in] txUnit Transmitter unit number - \param[in] pattern Test pattern - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989TestSetPattern(tmUnitSelect_t txUnit, tmbslHdmiTxTestPattern_t pattern); - -/** - \brief Set or clear one or more simultaneous test modes - - \param[in] txUnit Transmitter unit number - \param[in] testMode Mode: tst_pat, tst_656, tst_serphoe, tst_nosc, - tst_hvp, tst_pwd, tst_divoe - \param[in] testState State: 1=On, 0=Off - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989TestSetMode - (tmUnitSelect_t txUnit, - tmbslHdmiTxTestMode_t testMode, tmbslHdmiTxTestState_t testState); - -/** - \brief Enable blanking between active data - - \param[in] txUnit Transmitter unit number - \param[in] blankitSource Blankit Source: Not DE, VS And HS, - VS And Not HS, Hemb And Vemb, No Change - \param[in] blankingCodes Blanking Codes: All Zero, RGB444, YUV444, - YUV422, No Change - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note NA - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989VideoInSetBlanking - (tmUnitSelect_t txUnit, - tmbslHdmiTxBlnkSrc_t blankitSource, tmbslHdmiTxBlnkCode_t blankingCodes); - -/** - \brief Configure video input options and control the upsampler - - \param[in] txUnit Transmitter unit number - \param[in] vinMode Video input mode - \param[in] voutFmt EIA/CEA Video output format: 1 to 31, 0 = No Change - \param[in] sampleEdge Sample edge: - Pixel Clock Positive Edge, - Pixel Clock Negative Edge, No Change - \param[in] pixRate Single data or double data rate - \param[in] upsampleMode Upsample mode - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989VideoInSetConfig - (tmUnitSelect_t txUnit, - tmbslHdmiTxVinMode_t vinMode, - tmbslHdmiTxVidFmt_t voutFmt, - tmbslHdmiTx3DStructure_t structure3D, - tmbslHdmiTxPixEdge_t sampleEdge, - tmbslHdmiTxPixRate_t pixRate, tmbslHdmiTxUpsampleMode_t upsampleMode); - -/** - \brief Set fine image position - - \param[in] txUnit Transmitter unit number - \param[in] subpacketCount Subpacket Count fixed values and sync options - \param[in] toggleClk1 Toggle clock 1 phase w.r.t. clock 2 - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note NA - - \sa NA - */ - tmErrorCode_t - tmbslTDA9989VideoInSetFine - (tmUnitSelect_t txUnit, - tmbslHdmiTxPixSubpkt_t subpacketCount, tmbslHdmiTxPixTogl_t toggleClk1); - -/** - \brief Set video input port swapping and mirroring - - \param[in] txUnit Transmitter unit number - \param[in] pSwapTable Pointer to 6-byte port swap table - \param[in] pMirrorTable Pointer to 6-byte port mirror table - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note UInt8 pSwapTable[6] - - Each table position 0 to 5 represents a group of 4 port bits: - [0]=23:20, [1]=16:19, [2]=15:12, [3]=11:8, [4]=4:7, [5]=0:3 - Table position values are 0 to 6, denoting the group of 4 port - bits to swap to: 0=23:20, 1=16:19, 2=15:12, 3=11:8, 4=4:7, 5=0:3. - For example, to swap port bits 15:12 to bits 4:7: pSwapTable[2]=4 - - UInt8 pMirrorTable[6] - - Each table position 0 to 5 represents a group of 4 port bits: - [0]=23:20, [1]=16:19, [2]=15:12, [3]=11:8, [4]=4:7, [5]=0:3. - Cell values are 0 to 2 (Not Mirrored, Mirrored, No Change). - For example, to mirror port bits 11:8 to bits 8:11: - pMirrorTable[3]=1. - */ - tmErrorCode_t tmbslTDA9989VideoInSetMapping -#ifdef TMFL_RGB_DDR_12BITS - (tmUnitSelect_t txUnit, UInt8 *pSwapTable, UInt8 *pMirrorTable, UInt8 *pMux); -#else - (tmUnitSelect_t txUnit, UInt8 *pSwapTable, UInt8 *pMirrorTable); -#endif -/** - \brief Set video input port (enable, ground) - - \param[in] txUnit Transmitter unit number - \param[in] pEnaVideoPortTable Pointer to 3-byte video port enable table - \param[in] pGndVideoPortTable Pointer to 3-byte video port ground table - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note UInt8 pEnaVideoPortTable[3] - - Each table position 0 to 2 represents a group of 8 port bits: - [0]=7:0, [1]=15:8, [2]=23:16 - bitn = '1' means enable port n - bitn = '0' means disable port n - For example, to enable port 0 to 7 only : pEnaVideoPortTable[0]= 0xFF - pEnaVideoPortTable[1]= 0x00, pEnaVideoPortTable[2]= 0x00 - - UInt8 pGndVideoPortTable[3] - - Each table position 0 to 2 represents a group of 8 port bits: - [0]=7:0, [1]=15:8, [2]=23:16 - bitn = '1' means pulldown port n - bitn = '0' means not pulldown port n - For example, to pulldown port 8 to 15 only : pEnaVideoPortTable[0]= 0x00 - pEnaVideoPortTable[1]= 0xFF, pEnaVideoPortTable[2]= 0x00 - */ - tmErrorCode_t - tmbslTDA9989SetVideoPortConfig - (tmUnitSelect_t txUnit, UInt8 *pEnaVideoPortTable, UInt8 *pGndVideoPortTable); - -/*============================================================================*/ -/** - \brief Set audio input port (enable, ground) - - \param[in] txUnit Transmitter unit number - \param[in] pEnaAudioPortTable Pointer to 1-byte audio port enable configuration - \param[in] pGndAudioPortTable Pointer to 1-byte audio port ground configuration - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note UInt8 pEnaAudioPortTable[1] - bitn = '1' means enable port n - bitn = '0' means disable port n - For example, to enable all audio port (0:7) : pEnaAudioPortTable[0]= 0xFF - - UInt8 pGndAudioPortTable[1] - bitn = '1' means pulldown port n - bitn = '0' means not pulldown port n - For example, to pulldown audio port (0:7) : pEnaAudioPortTable[0]= 0xFF -*/ - tmErrorCode_t - tmbslTDA9989SetAudioPortConfig - (tmUnitSelect_t txUnit, UInt8 *pEnaAudioPortTable, UInt8 *pGndAudioPortTable); - -/*============================================================================*/ -/** - \brief Set audio input Clock port (enable, ground) - - \param[in] txUnit Transmitter unit number - \param[in] pEnaAudioClockPortTable Pointer to 1-byte audio Clock port enable configuration - \param[in] pGndAudioClockPortTable Pointer to 1-byte audio Clock port ground configuration - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - \note UInt8 pEnaAudioClockPortTable[1] - bitn = '1' means enable port n - bitn = '0' means disable port n - For example, to enable all audio Clock port (0) : pEnaAudioPortTable[0]= 0x01 - - UInt8 pGndAudioClockPortTable[1] - bitn = '1' means pulldown port n - bitn = '0' means not pulldown port n - For example, to pulldown audio Clock port (0:7) : pEnaAudioPortTable[0]= 0x01 -*/ - tmErrorCode_t - tmbslTDA9989SetAudioClockPortConfig - (tmUnitSelect_t txUnit, - UInt8 *pEnaAudioClockPortTable, UInt8 *pGndAudioClockPortTable); - -/** - \brief Configure video input sync automatically - - \param[in] txUnit Transmitter unit number - \param[in] syncSource Sync Source: - Embedded, External Vref, External Vs - No Change - \param[in] vinFmt EIA/CEA Video input format: 1 to 31, 0 = No Change - \param[in] vinMode Input video mode - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989VideoInSetSyncAuto - (tmUnitSelect_t txUnit, - tmbslHdmiTxSyncSource_t syncSource, - tmbslHdmiTxVidFmt_t vinFmt, - tmbslHdmiTxVinMode_t vinMode, tmbslHdmiTx3DStructure_t structure3D); - -/** - \brief Configure video input sync with manual parameters - - \param[in] txUnit Transmitter unit number - \param[in] syncSource Sync Source: - Embedded, External Vref, External Vs - No Change - \param[in] syncMethod Sync method: V And H, V And X-DE, No Change - \param[in] toggleV VS Toggle: - No Action, Toggle VS/Vref, No Change - \param[in] toggleH HS Toggle: - No Action, Toggle HS/Href, No Change - \param[in] toggleX DE/FREF Toggle: - No Action, Toggle DE/Fref, No Change - \param[in] uRefPix Ref. pixel preset 0 to 1FFFh (2000h = No Change) - \param[in] uRefLine Ref. line preset 0 to 7FFh (800h = No Change) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989VideoInSetSyncManual - (tmUnitSelect_t txUnit, - tmbslHdmiTxSyncSource_t syncSource, - tmbslHdmiTxVsMeth_t syncMethod, - tmbslHdmiTxPixTogl_t toggleV, - tmbslHdmiTxPixTogl_t toggleH, - tmbslHdmiTxPixTogl_t toggleX, UInt16 uRefPix, UInt16 uRefLine); - - -/*============================================================================*/ -/** - \brief Enable or disable output video frame - - \param[in] txUnit Transmitter unit number - \param[in] bDisable Enable or disable scaler input - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t tmbslTDA9989VideoOutDisable(tmUnitSelect_t txUnit, Bool bDisable); - -/** - \brief Configure sink type, configure video output colour and - quantization, control the downsampler, and force RGB output - and mute audio in DVI mode - - \param[in] txUnit Transmitter unit number: - \param[in] sinkType Sink device type: DVI or HDMI or copy from EDID - \param[in] voutMode Video output mode - \param[in] preFilter Prefilter: Off, 121, 109, CCIR601, No Change - \param[in] yuvBlank YUV blanking: 16, 0, No Change - \param[in] quantization Video quantization range: - Full Scale, RGB Or YUV, YUV, No Change - - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989VideoOutSetConfig - (tmUnitSelect_t txUnit, - tmbslHdmiTxSinkType_t sinkType, - tmbslHdmiTxVoutMode_t voutMode, - tmbslHdmiTxVoutPrefil_t preFilter, - tmbslHdmiTxVoutYuvBlnk_t yuvBlank, tmbslHdmiTxVoutQrange_t quantization); - -/** - \brief Set video synchronization - - \param[in] txUnit Transmitter unit number - \param[in] srcH Horizontal sync source: Internal, Exter'l, No Change - \param[in] srcV Vertical sync source: Internal, Exter'l, No Change - \param[in] srcX X sync source: Internal, Exter'l, No Change - \param[in] toggle Sync toggle: Hs, Vs, Off, No Change - \param[in] once Line/pixel counters sync once or each frame - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989VideoOutSetSync - (tmUnitSelect_t txUnit, - tmbslHdmiTxVsSrc_t srcH, - tmbslHdmiTxVsSrc_t srcV, - tmbslHdmiTxVsSrc_t srcX, tmbslHdmiTxVsTgl_t toggle, tmbslHdmiTxVsOnce_t once); - -/** - \brief Set main video input and output parameters - - \param[in] txUnit Transmitter unit number - \param[in] vinFmt EIA/CEA Video input format: 1 to 31, 0 = No Change - \param[in] scaMode Scaler mode: Off, On, Auto, No Change - On TDA9989, only scaler mode off is possible - \param[in] voutFmt EIA/CEA Video output format: 1 to 31, 0 = No Change - \param[in] uPixelRepeat Pixel repetition factor: 0 to 9, 10 = default, - 11 = no change - \param[in] matMode Matrix mode: 0 = off, 1 = auto - \param[in] datapathBits Datapath bitwidth: 0 to 3 (8, 10, 12, No Change) - \param[in] Desired VQR in dvi mode - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: params are inconsistent - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t - tmbslTDA9989VideoSetInOut - (tmUnitSelect_t txUnit, - tmbslHdmiTxVidFmt_t vinFmt, - tmbslHdmiTx3DStructure_t structure3D, - tmbslHdmiTxScaMode_t scaMode, - tmbslHdmiTxVidFmt_t voutFmt, - UInt8 uPixelRepeat, - tmbslHdmiTxMatMode_t matMode, - tmbslHdmiTxVoutDbits_t datapathBits, tmbslHdmiTxVQR_t dviVqr); - -/** - \brief Use only for debug to flag the software debug interrupt - - \param[in] txUnit Transmitter unit number - \param[in] uSwInt Interrupt to be generated (not relevant) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - tmErrorCode_t tmbslTDA9989FlagSwInt(tmUnitSelect_t txUnit, UInt32 uSwInt); - - -/** - \brief Enable or disable 5v power - - \param[in] txUnit Transmitter unit number - \param[in] pwrEnable 5v Power enable(True)/disable(False) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: functionnality not supported by this device - */ - tmErrorCode_t tmbslTDA9989Set5vpower(tmUnitSelect_t txUnit, Bool pwrEnable); - -/** - \brief Enable or disable a callback source - - \param[in] txUnit Transmitter unit number - \param[in] callbackSource Callback source - \param[in] enable Callback source enable(True)/disable(False) - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: impossible to disable this interrupt - */ - tmErrorCode_t - tmbslTDA9989EnableCallback - (tmUnitSelect_t txUnit, tmbslHdmiTxCallbackInt_t callbackSource, Bool enable); - -/** - \brief Configure the deep color mode - - \param[in] txUnit Transmitter unit number - \param[in] colorDepth Number of bits per pixel to be processed - \param[in] termEnable Enable transmitter termination - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: mode not supported - */ - tmErrorCode_t - tmbslTDA9989SetColorDepth - (tmUnitSelect_t txUnit, tmbslHdmiTxColorDepth colorDepth, Bool termEnable); - -/** - \brief Configure the default phase for a specific deep color mode - - \param[in] txUnit Transmitter unit number - \param[in] bEnable Enable(true)/disable(False) default phase - \param[in] colorDepth Concerned deepcolor mode - \param[in] videoFormat Number of bits per pixel to be processed - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: functionnality not supported by this device - */ - tmErrorCode_t - tmbslTDA9989SetDefaultPhase - (tmUnitSelect_t txUnit, - Bool bEnable, tmbslHdmiTxColorDepth colorDepth, UInt8 videoFormat); - - - -/** - \brief Control (Enable/Disable) VS interrupt - - \param[in] txUnit Transmitter unit number - \param[in] uIntFlag Enable/Disable VS interrupt - - \return The call result: - - TM_OK: the call was successful - - Else a problem has been detected: - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - */ - - tmErrorCode_t tmbslTDA9989CtlVsInterrupt(tmUnitSelect_t txUnit, Bool uIntFlag); - -/*============================================================================*/ -/** - \brief Fill Gamut metadata packet into one of the gamut HW buffer. this - function is not sending any gamut metadata into the HDMI stream, - it is only loading data into the HW. - - \param txUnit Transmitter unit number - \param pPkt pointer to the gamut packet structure - \param bufSel number of the gamut buffer to fill - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C - bus - - ******************************************************************************/ - tmErrorCode_t tmbslTDA9989PktFillGamut - (tmUnitSelect_t txUnit, tmbslHdmiTxPktGamut_t *pPkt, UInt8 bufSel); - -/*============================================================================*/ -/** - \brief Enable transmission of gamut metadata packet. Calling this function - tells HW which gamut buffer to send into the HDMI stream. HW will - only take into account this command at the next VS, not during the - current one. - - \param txUnit Transmitter unit number - \param bufSel Number of the gamut buffer to be sent - \param enable Enable/disable gamut packet transmission - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C - bus - - ******************************************************************************/ - tmErrorCode_t tmbslTDA9989PktSendGamut(tmUnitSelect_t txUnit, UInt8 bufSel, Bool bEnable); - - -/** - \brief Return the category of equipement connected - - \param txUnit Transmitter unit number - \param category return category type - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: params are inconsistent - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE hdcp not started - -*/ - tmErrorCode_t tmbslTDA9989HdcpGetSinkCategory - (tmUnitSelect_t txUnit, tmbslHdmiTxSinkCategory_t *category); - - -/** - \brief Return the sink latency information if any - - \param txUnit Transmitter unit number - \param pEdidLatency latency data structure to return - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: params are inconsistent - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE hdcp not started - -*/ - tmErrorCode_t tmbslTDA9989EdidGetLatencyInfo - (tmUnitSelect_t txUnit, tmbslHdmiTxEdidLatency_t *pEdidLatency); - - -/** - \brief Return the sink additional VSDB data information if any - - \param txUnit Transmitter unit number - \param p3Ddata 3D data structure to return - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: params are inconsistent - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE hdcp not started - -*/ - tmErrorCode_t tmbslTDA9989EdidGetExtraVsdbData - (tmUnitSelect_t txUnit, tmbslHdmiTxEdidExtraVsdbData_t **pExtraVsdbData); - - -#ifdef TMFL_HDCP_OPTIMIZED_POWER -/** - \brief Optimized power by frozing useless clocks related to HDCP - - \param txUnit Transmitter unit number - \param request power down request - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS: params are inconsistent - -*/ - tmErrorCode_t tmbslTDA9989HdcpPowerDown(tmUnitSelect_t txUnit, Bool requested); -#endif - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLTDA9989_FUNCTIONS_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_HDCP.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_HDCP.c deleted file mode 100644 index 34a108be68e..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_HDCP.c +++ /dev/null @@ -1,424 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_HDCP.c - * - * \version $Revision: 2 $ - * - */ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#include "tmbslHdmiTx_types.h" -#include "tmbslTDA9989_Functions.h" -#include "tmbslTDA9989_local.h" -#include "tmbslTDA9989_State_l.h" -#include "tmbslTDA9989_InOut_l.h" -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS EXPORTED */ -/*============================================================================*/ - -/** - * Table of registers to switch HDMI HDCP mode off for DVI - */ - -tmHdmiTxRegMaskVal_t kVoutHdcpOff[] = { - {E_REG_P00_TBG_CNTRL_1_W, E_MASKREG_P00_TBG_CNTRL_1_dwin_dis, 1}, - {E_REG_P12_TX33_RW, E_MASKREG_P12_TX33_hdmi, 0}, - {0, 0, 0} -}; - -/** - * Table of registers to switch HDMI HDCP mode on for HDMI - */ -tmHdmiTxRegMaskVal_t kVoutHdcpOn[] = { - {E_REG_P00_TBG_CNTRL_1_W, E_MASKREG_P00_TBG_CNTRL_1_dwin_dis, 0}, - {E_REG_P11_ENC_CNTRL_RW, E_MASKREG_P11_ENC_CNTRL_ctl_code, 1}, - {E_REG_P12_TX33_RW, E_MASKREG_P12_TX33_hdmi, 1}, - {0, 0, 0} -}; - -#ifdef __LINUX_ARM_ARCH__ - -#include - -typedef struct { - tmErrorCode_t(*tmbslTDA9989HdcpCheck) - (tmUnitSelect_t txUnit, UInt16 uTimeSinceLastCallMs, tmbslHdmiTxHdcpCheck_t *pResult); - tmErrorCode_t(*tmbslTDA9989HdcpConfigure) - (tmUnitSelect_t txUnit, - UInt8 slaveAddress, - tmbslHdmiTxHdcpTxMode_t txMode, - tmbslHdmiTxHdcpOptions_t options, UInt16 uCheckIntervalMs, UInt8 uChecksToDo); - tmErrorCode_t(*tmbslTDA9989HdcpDownloadKeys) - (tmUnitSelect_t txUnit, UInt16 seed, tmbslHdmiTxDecrypt_t keyDecryption); - tmErrorCode_t(*tmbslTDA9989HdcpEncryptionOn) - (tmUnitSelect_t txUnit, Bool bOn); - tmErrorCode_t(*tmbslTDA9989HdcpGetOtp) - (tmUnitSelect_t txUnit, UInt8 otpAddress, UInt8 *pOtpData); - tmErrorCode_t(*tmbslTDA9989HdcpGetT0FailState) - (tmUnitSelect_t txUnit, UInt8 *pFailState); - tmErrorCode_t(*tmbslTDA9989HdcpHandleBCAPS) - (tmUnitSelect_t txUnit); - tmErrorCode_t(*tmbslTDA9989HdcpHandleBKSV) - (tmUnitSelect_t txUnit, UInt8 *pBksv, Bool *pbCheckRequired /* May be null, but only for testing */ - ); - tmErrorCode_t(*tmbslTDA9989HdcpHandleBKSVResult) - (tmUnitSelect_t txUnit, Bool bSecure); - tmErrorCode_t(*tmbslTDA9989HdcpHandleBSTATUS) - (tmUnitSelect_t txUnit, UInt16 *pBstatus /* May be null */ - ); - tmErrorCode_t(*tmbslTDA9989HdcpHandleENCRYPT) - (tmUnitSelect_t txUnit); - tmErrorCode_t(*tmbslTDA9989HdcpHandlePJ) - (tmUnitSelect_t txUnit); - tmErrorCode_t(*tmbslTDA9989HdcpHandleSHA_1) - (tmUnitSelect_t txUnit, UInt8 maxKsvDevices, UInt8 *pKsvList, /* May be null if maxKsvDevices is 0 */ - UInt8 *pnKsvDevices, /* May be null if maxKsvDevices is 0 */ - UInt8 *pDepth /* Connection tree depth returned with KSV list */ - ); - tmErrorCode_t(*tmbslTDA9989HdcpHandleSHA_1Result) - (tmUnitSelect_t txUnit, Bool bSecure); - tmErrorCode_t(*tmbslTDA9989HdcpHandleT0) - (tmUnitSelect_t txUnit); - tmErrorCode_t(*tmbslTDA9989HdcpInit) - (tmUnitSelect_t txUnit, tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTxVfreq_t voutFreq); - tmErrorCode_t(*tmbslTDA9989HdcpRun) - (tmUnitSelect_t txUnit); - tmErrorCode_t(*tmbslTDA9989HdcpStop) - (tmUnitSelect_t txUnit); - tmErrorCode_t(*tmbslTDA9989HdcpGetSinkCategory) - (tmUnitSelect_t txUnit, tmbslHdmiTxSinkCategory_t *category); - tmErrorCode_t(*tmbslTDA9989handleBKSVResultSecure) - (tmUnitSelect_t txUnit); - tmErrorCode_t(*f1) (tmHdmiTxobject_t *pDis); - int (*f2) (tmHdmiTxobject_t *pDis); -} hdcp_private_t; - -#include /* need for EXPORT_SYMBOL */ - -hdcp_private_t *h; - -void register_hdcp_private(hdcp_private_t *hdcp) -{ - h = hdcp; -} -EXPORT_SYMBOL(register_hdcp_private); - -tmErrorCode_t rej_f1(tmHdmiTxobject_t *pDis) -{ - return (h ? h->f1(pDis) : 0); -} - -int rej_f2(tmHdmiTxobject_t *pDis) -{ - return (h ? h->f2(pDis) : 0); -} - -tmErrorCode_t rej_f3(tmUnitSelect_t txUnit) -{ - return (h ? h->tmbslTDA9989handleBKSVResultSecure(txUnit) : TM_OK); -} - -#endif - -/*============================================================================*/ -/* tmbslTDA9989HdcpCheck */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989HdcpCheck - (tmUnitSelect_t txUnit, UInt16 uTimeSinceLastCallMs, tmbslHdmiTxHdcpCheck_t *pResult) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpCheck(txUnit, uTimeSinceLastCallMs, pResult); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpConfigure */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989HdcpConfigure - (tmUnitSelect_t txUnit, - UInt8 slaveAddress, - tmbslHdmiTxHdcpTxMode_t txMode, - tmbslHdmiTxHdcpOptions_t options, UInt16 uCheckIntervalMs, UInt8 uChecksToDo) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpConfigure - (txUnit, slaveAddress, txMode, options, uCheckIntervalMs, uChecksToDo); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpDownloadKeys */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989HdcpDownloadKeys - (tmUnitSelect_t txUnit, UInt16 seed, tmbslHdmiTxDecrypt_t keyDecryption) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpDownloadKeys(txUnit, seed, keyDecryption); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpEncryptionOn */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpEncryptionOn(tmUnitSelect_t txUnit, Bool bOn) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpEncryptionOn(txUnit, bOn); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - - -/*============================================================================*/ -/* tmbslTDA9989HdcpGetOtp */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpGetOtp(tmUnitSelect_t txUnit, UInt8 otpAddress, UInt8 *pOtpData) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpGetOtp(txUnit, otpAddress, pOtpData); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpGetT0FailState */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpGetT0FailState(tmUnitSelect_t txUnit, UInt8 *pFailState) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpGetT0FailState(txUnit, pFailState); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleBCAPS */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleBCAPS(tmUnitSelect_t txUnit) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleBCAPS(txUnit); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleBKSV */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleBKSV(tmUnitSelect_t txUnit, UInt8 *pBksv, Bool *pbCheckRequired /* May be null, but only for testing */ - ) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleBKSV(txUnit, pBksv, pbCheckRequired /* May be null, but only for testing */ - ); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleBKSVResult */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleBKSVResult(tmUnitSelect_t txUnit, Bool bSecure) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleBKSVResult(txUnit, bSecure); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleBSTATUS */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleBSTATUS(tmUnitSelect_t txUnit, UInt16 *pBstatus /* May be null */ - ) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleBSTATUS(txUnit, pBstatus /* May be null */ - ); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleENCRYPT */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleENCRYPT(tmUnitSelect_t txUnit) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleENCRYPT(txUnit); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandlePJ */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandlePJ(tmUnitSelect_t txUnit) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandlePJ(txUnit); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleSHA_1 */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleSHA_1(tmUnitSelect_t txUnit, UInt8 maxKsvDevices, UInt8 *pKsvList, /* May be null if maxKsvDevices is 0 */ - UInt8 *pnKsvDevices, /* May be null if maxKsvDevices is 0 */ - UInt8 *pDepth /* Connection tree depth returned with KSV list */ - ) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleSHA_1(txUnit, maxKsvDevices, pKsvList, /* May be null if maxKsvDevices is 0 */ - pnKsvDevices, /* May be null if maxKsvDevices is 0 */ - pDepth /* Connection tree depth returned with KSV list */ - ); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleSHA_1Result */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleSHA_1Result(tmUnitSelect_t txUnit, Bool bSecure) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleSHA_1Result(txUnit, bSecure); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpHandleT0 */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpHandleT0(tmUnitSelect_t txUnit) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpHandleT0(txUnit); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpInit */ -/* RETIF_REG_FAIL NOT USED HERE AS ALL ERRORS SHOULD BE TRAPPED IN ALL BUILDS */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989HdcpInit - (tmUnitSelect_t txUnit, tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTxVfreq_t voutFreq) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpInit(txUnit, voutFmt, voutFreq); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpRun */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpRun(tmUnitSelect_t txUnit) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpRun(txUnit); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpStop */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpStop(tmUnitSelect_t txUnit) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpStop(txUnit); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989HdcpGetSinkCategory */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989HdcpGetSinkCategory(tmUnitSelect_t txUnit, tmbslHdmiTxSinkCategory_t *category) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989HdcpGetSinkCategory(txUnit, category); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - - - - -/*============================================================================*/ -/* tmbslTDA9989handleBKSVResultSecure */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989handleBKSVResultSecure(tmUnitSelect_t txUnit) { -#ifdef __LINUX_ARM_ARCH__ - if (h) - return h->tmbslTDA9989handleBKSVResultSecure(txUnit); -/* else {pr_debug("%s is empty\n",__func__);}*/ -#endif - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_HDCP_l.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_HDCP_l.h deleted file mode 100644 index 7113ca33f82..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_HDCP_l.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (C) 2008 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_HDCP_l.h - * - * \version %version: 2 % - * - * \date %date_modified: % - * - * \brief BSL driver component local definitions for the TDA998x - * HDMI Transmitter. - * - * \section info Change Information - * - * -*/ - -#ifndef TMBSLTDA9989_HDCP_L_H -#define TMBSLTDA9989_HDCP_L_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __LINUX_ARM_ARCH__ - -#define HDCP_F1 { \ - int rej_f2(tmHdmiTxobject_t *pDis); \ - regVal = rej_f2(pDis); \ - } - -#define HDCP_F2 { \ - tmErrorCode_t rej_f1(tmHdmiTxobject_t *pDis); \ - err = rej_f1(pDis); \ - RETIF(err != TM_OK, err); \ -} - -#define HDCP_F3 { \ - if (fInterruptStatus & (1 << HDMITX_CALLBACK_INT_R0)) \ - { \ - tmErrorCode_t rej_f3(tmUnitSelect_t txUnit); \ - err = rej_f3(txUnit); \ - RETIF(err != TM_OK, err); \ - } \ -} - -#else - -#define HDCP_F1 {regVal = 0; } - -#define HDCP_F2 {} - -#define HDCP_F3 {} - -#endif /*TMFL_HDCP_SUPPORT */ - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLTDA9989_HDCP_L_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_InOut.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_InOut.c deleted file mode 100644 index fd742c6e3f4..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_InOut.c +++ /dev/null @@ -1,4353 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_InOut.c - * - * \version %version: 3 % - * - * -*/ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#include -#include -#endif - -#include "tmbslHdmiTx_types.h" -#include "tmbslTDA9989_Functions.h" -#include "tmbslTDA9989_local.h" -#include "tmbslTDA9989_HDCP_l.h" -#include "tmbslTDA9989_State_l.h" -#include "tmbslTDA9989_Misc_l.h" -#include "tmbslTDA9989_InOut_l.h" - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - -#define SSD_UNUSED_VALUE 0xF0 - -#ifdef FORMAT_PC -#define DEPTH_COLOR_PC 1 /* PC_FORMAT only 8 bits available */ -#endif /* FORMAT_PC */ - -#define REG_VAL_SEL_AIP_SPDIF 0 -#define REG_VAL_SEL_AIP_I2S 1 -#define REG_VAL_SEL_AIP_OBA 2 -#define REG_VAL_SEL_AIP_DST 3 -#define REG_VAL_SEL_AIP_HBR 5 - -struct vic2reg { - unsigned char vic; - unsigned char reg; -}; - -struct sync_desc { - UInt16 Vs2; - UInt8 pix_rep; - UInt8 v_toggle; - UInt8 h_toggle; - UInt16 hfp; /* Output values for Vs/Hs input sync */ - UInt16 vfp; - UInt16 href; /* Output values for all other input sync sources */ - UInt16 vref; -}; - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS EXPORTED */ -/*============================================================================*/ - -extern tmHdmiTxRegMaskVal_t kVoutHdcpOff[]; -extern tmHdmiTxRegMaskVal_t kVoutHdcpOn[]; - -/** - * Lookup table of input port control registers and their swap and mirror masks - */ -tmbslTDA9989RegVip kRegVip[HDMITX_VIN_PORT_MAP_TABLE_LEN] = { - { - E_REG_P00_VIP_CNTRL_0_W, E_MASKREG_P00_VIP_CNTRL_0_swap_a, E_MASKREG_P00_VIP_CNTRL_0_mirr_a}, /* Port group 0 */ - { - E_REG_P00_VIP_CNTRL_0_W, E_MASKREG_P00_VIP_CNTRL_0_swap_b, E_MASKREG_P00_VIP_CNTRL_0_mirr_b}, /* Port group 1 */ - { - E_REG_P00_VIP_CNTRL_1_W, E_MASKREG_P00_VIP_CNTRL_1_swap_c, E_MASKREG_P00_VIP_CNTRL_1_mirr_c}, /* Port group 2 */ - { - E_REG_P00_VIP_CNTRL_1_W, E_MASKREG_P00_VIP_CNTRL_1_swap_d, E_MASKREG_P00_VIP_CNTRL_1_mirr_d}, /* Port group 3 */ - { - E_REG_P00_VIP_CNTRL_2_W, E_MASKREG_P00_VIP_CNTRL_2_swap_e, E_MASKREG_P00_VIP_CNTRL_2_mirr_e}, /* Port group 4 */ - { - E_REG_P00_VIP_CNTRL_2_W, E_MASKREG_P00_VIP_CNTRL_2_swap_f, E_MASKREG_P00_VIP_CNTRL_2_mirr_f} /* Port group 5 */ -}; - -/** - * Table of PLL settings registers to configure for all video input format (vinFmt) - */ -tmHdmiTxRegMaskVal_t kCommonPllCfg[] = { - {E_REG_P02_PLL_SERIAL_1_RW, E_MASKREG_ALL, 0x00}, - {E_REG_P02_PLL_SERIAL_2_RW, E_MASKREG_ALL, 0x01}, - {E_REG_P02_PLL_SERIAL_3_RW, E_MASKREG_ALL, 0x00}, - {E_REG_P02_SERIALIZER_RW, E_MASKREG_ALL, 0x00}, - {E_REG_P02_BUFFER_OUT_RW, E_MASKREG_ALL, 0x00}, - {E_REG_P02_PLL_SCG1_RW, E_MASKREG_ALL, 0x00}, - {E_REG_P02_AUDIO_DIV_RW, E_MASKREG_ALL, 0x03}, - /*{E_REG_P02_TEST2_RW, E_MASKREG_ALL, 0x00}, */ - {E_REG_P02_SEL_CLK_RW, E_MASKREG_ALL, 0x09}, - {0, 0, 0} -}; - -/** - * Table of PLL settings registers to configure double mode pixel rate, - * vinFmt other than 480i or 576i - */ -tmHdmiTxRegMaskVal_t kDoublePrateVfmtOtherPllCfg[] = { - {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x00}, - {0, 0, 0} -}; - -/** - * Table of PLL settings registers to configure for single mode pixel rate, - * vinFmt 480i or 576i only - */ -tmHdmiTxRegMaskVal_t kSinglePrateVfmt480i576iPllCfg[] = { - {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x11}, - {0, 0, 0} -}; - -/** - * Table of PLL settings registers to configure single mode pixel rate, - * vinFmt other than 480i or 576i - */ -tmHdmiTxRegMaskVal_t kSinglePrateVfmtOtherPllCfg[] = { - {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x10}, - {0, 0, 0} -}; - -/** - * Table of PLL settings registers to configure for single repeated mode pixel rate, - * vinFmt 480i or 576i only - */ -tmHdmiTxRegMaskVal_t kSrepeatedPrateVfmt480i576iPllCfg[] = { - {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x01}, - {0, 0, 0} -}; - -/** - * Table of PLL settings registers to configure for 480i and 576i vinFmt - */ -tmHdmiTxRegMaskVal_t kVfmt480i576iPllCfg[] = { - {E_REG_P02_PLL_SCGN1_RW, E_MASKREG_ALL, 0x14}, - {E_REG_P02_PLL_SCGN2_RW, E_MASKREG_ALL, 0x00}, - {E_REG_P02_PLL_SCGR1_RW, E_MASKREG_ALL, 0x0A}, - {E_REG_P02_PLL_SCGR2_RW, E_MASKREG_ALL, 0x00}, - {0, 0, 0} -}; - -/** - * Table of PLL settings registers to configure for other vinFmt than 480i and 576i - */ -tmHdmiTxRegMaskVal_t kVfmtOtherPllCfg[] = { - {E_REG_P02_PLL_SCGN1_RW, E_MASKREG_ALL, 0xFA}, - {E_REG_P02_PLL_SCGN2_RW, E_MASKREG_ALL, 0x00}, - {E_REG_P02_PLL_SCGR1_RW, E_MASKREG_ALL, 0x5B}, - {E_REG_P02_PLL_SCGR2_RW, E_MASKREG_ALL, 0x00}, - {0, 0, 0} -}; - -/** - * Lookup table to convert from EIA/CEA TV video formats used in the EDID and - * in API parameters to pixel clock frequencies, according to SCS Table - * "HDMI Pixel Clock Frequencies per EIA/CEA-861B Video Output Format". - * The other index is the veritical frame frequency. - */ - -UInt8 kVfmtToPixClk_TV[HDMITX_VFMT_TV_MAX][HDMITX_VFREQ_NUM] = { - /* HDMITX_VFREQ_24Hz HDMITX_VFREQ_25Hz HDMITX_VFREQ_30Hz HDMITX_VFREQ_50Hz HDMITX_VFREQ_59Hz HDMITX_VFREQ_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_25175, E_PIXCLK_25200}, /* HDMITX_VFMT_01_640x480p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027}, /* HDMITX_VFMT_02_720x480p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027}, /* HDMITX_VFMT_03_720x480p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74175, E_PIXCLK_74250}, /* HDMITX_VFMT_04_1280x720p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74175, E_PIXCLK_74250}, /* HDMITX_VFMT_05_1920x1080i_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027}, /* HDMITX_VFMT_06_720x480i_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027}, /* HDMITX_VFMT_07_720x480i_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027}, /* HDMITX_VFMT_08_720x240p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027}, /* HDMITX_VFMT_09_720x240p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054}, /* HDMITX_VFMT_10_720x480i_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054}, /* HDMITX_VFMT_11_720x480i_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054}, /* HDMITX_VFMT_12_720x240p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054}, /* HDMITX_VFMT_13_720x240p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054}, /* HDMITX_VFMT_14_1440x480p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054}, /* HDMITX_VFMT_15_1440x480p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_148350, E_PIXCLK_148500}, /* HDMITX_VFMT_16_1920x1080p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_17_720x576p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_18_720x576p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_19_1280x720p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_20_1920x1080i_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_21_720x576i_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_22_720x576i_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_23_720x288p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_24_720x288p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_25_720x576i_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_26_720x576i_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_27_720x288p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_28_720x288p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_29_1440x576p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_30_1440x576p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_148500, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_31_1920x1080p_50Hz */ - {E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_32_1920x1080p_24Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_33_1920x1080p_25Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_34_1920x1080p_30Hz */ - - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_108000, E_PIXCLK_108108}, /* HDMITX_VFMT_35_2880x480p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_108000, E_PIXCLK_108108}, /* HDMITX_VFMT_36_2880x480p_60Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_108000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_37_2880x576p_50Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_108000, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_38_2880x576p_50Hz */ - - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_39_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_40_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_41_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_42_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_43_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_44_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_45_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_46_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_47_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_48_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_49_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_50_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_51_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_52_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_53_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_54_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_55_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_56_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_57_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_58_ */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_59_ */ - - {E_PIXCLK_59400, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_60_1280x720p_24Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}, /* HDMITX_VFMT_61_1280x720p_25Hz */ - {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID} /* HDMITX_VFMT_62_1280x720p_30Hz */ -}; - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS */ -/*============================================================================*/ - - -/** - * Lookup table to convert PC formats used in API parameters to pixel clock - * frequencies. - * The other index is the veritical frame frequency. - */ -#ifdef FORMAT_PC -UInt8 kVfmtToPixClk_PC[HDMITX_VFMT_PC_NUM] = { - /* HDMITX_VFREQ_60Hz HDMITX_VFREQ_70Hz HDMITX_VFREQ_72Hz HDMITX_VFREQ_75Hz HDMITX_VFREQ_85Hz HDMITX_VFREQ_87Hz */ - E_PIXCLK_25175, /* HDMITX_VFMT_PC_640x480p_60Hz */ - E_PIXCLK_40000, /* HDMITX_VFMT_PC_800x600p_60Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1152x960p_60Hz */ - E_PIXCLK_65000, /* HDMITX_VFMT_PC_1024x768p_60Hz */ - E_PIXCLK_79500, /* HDMITX_VFMT_PC_1280x768p_60Hz */ - E_PIXCLK_108000, /* HDMITX_VFMT_PC_1280x1024p_60Hz */ - E_PIXCLK_85500, /* HDMITX_VFMT_PC_1360x768p_60Hz */ - E_PIXCLK_121750, /* HDMITX_VFMT_PC_1400x1050p_60Hz */ - E_PIXCLK_162000, /* HDMITX_VFMT_PC_1600x1200p_60Hz */ - E_PIXCLK_75000, /* HDMITX_VFMT_PC_1024x768p_70Hz */ - E_PIXCLK_31500, /* HDMITX_VFMT_PC_640x480p_72Hz */ - E_PIXCLK_50000, /* HDMITX_VFMT_PC_800x600p_72Hz */ - E_PIXCLK_31500, /* HDMITX_VFMT_PC_640x480p_75Hz */ - E_PIXCLK_78750, /* HDMITX_VFMT_PC_1024x768p_75Hz */ - E_PIXCLK_49500, /* HDMITX_VFMT_PC_800x600p_75Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1024x864p_75Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1280x1024p_75Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_640x350p_85Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_640x400p_85Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_720x400p_85Hz */ - E_PIXCLK_36000, /* HDMITX_VFMT_PC_640x480p_85Hz */ - E_PIXCLK_56250, /* HDMITX_VFMT_PC_800x600p_85Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1024x768p_85Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1152x864p_85Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1280x960p_85Hz */ - E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1280x1024p_85Hz *//* PR1570 FIXED */ - E_PIXCLK_INVALID /* HDMITX_VFMT_PC_1024x768i_87Hz */ -}; -#endif - -/** - * Lookup table to convert from EIA/CEA TV video formats used in the EDID and in - * API parameters to the format used in the E_REG_P00_VIDFORMAT_W register - */ - -#ifdef TMFL_RGB_DDR_12BITS -static struct vic2reg vic2reg_TV[] = { - {HDMITX_VFMT_01_640x480p_60Hz, E_REGVFMT_640x480p_60Hz}, - {HDMITX_VFMT_02_720x480p_60Hz, E_REGVFMT_720x480p_60Hz}, - {HDMITX_VFMT_03_720x480p_60Hz, E_REGVFMT_720x480p_60Hz}, - {HDMITX_VFMT_04_1280x720p_60Hz, E_REGVFMT_1280x720p_60Hz}, - {HDMITX_VFMT_05_1920x1080i_60Hz, E_REGVFMT_1920x1080i_60Hz}, - {HDMITX_VFMT_06_720x480i_60Hz, E_REGVFMT_720x480i_60Hz}, - {HDMITX_VFMT_07_720x480i_60Hz, E_REGVFMT_720x480i_60Hz}, - {HDMITX_VFMT_08_720x240p_60Hz, E_REGVFMT_720x240p_60Hz}, - {HDMITX_VFMT_09_720x240p_60Hz, E_REGVFMT_720x240p_60Hz}, - {HDMITX_VFMT_10_720x480i_60Hz, E_REGVFMT_2880x480i_60Hz_PR4}, - {HDMITX_VFMT_11_720x480i_60Hz, E_REGVFMT_2880x480i_60Hz_PR4}, - {HDMITX_VFMT_14_1440x480p_60Hz, E_REGVFMT_1440x480p_60Hz}, - {HDMITX_VFMT_15_1440x480p_60Hz, E_REGVFMT_1440x480p_60Hz}, - {HDMITX_VFMT_16_1920x1080p_60Hz, E_REGVFMT_1920x1080p_60Hz}, - {HDMITX_VFMT_17_720x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_18_720x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_19_1280x720p_50Hz, E_REGVFMT_1280x720p_50Hz}, - {HDMITX_VFMT_20_1920x1080i_50Hz, E_REGVFMT_1920x1080i_50Hz}, - {HDMITX_VFMT_21_720x576i_50Hz, E_REGVFMT_720x576i_50Hz}, - {HDMITX_VFMT_22_720x576i_50Hz, E_REGVFMT_720x576i_50Hz}, - {HDMITX_VFMT_23_720x288p_50Hz, E_REGVFMT_720x288p_50Hz}, - {HDMITX_VFMT_24_720x288p_50Hz, E_REGVFMT_720x288p_50Hz}, - {HDMITX_VFMT_25_720x576i_50Hz, E_REGVFMT_2880x576i_50Hz}, /* FIXME PR 2 */ - {HDMITX_VFMT_26_720x576i_50Hz, E_REGVFMT_2880x576i_50Hz}, /* FIXME PR 2 */ - {HDMITX_VFMT_29_1440x576p_50Hz, E_REGVFMT_1440x576p_50Hz}, - {HDMITX_VFMT_30_1440x576p_50Hz, E_REGVFMT_1440x576p_50Hz}, - {HDMITX_VFMT_31_1920x1080p_50Hz, E_REGVFMT_1920x1080p_50Hz}, - {HDMITX_VFMT_32_1920x1080p_24Hz, E_REGVFMT_1920x1080p_24Hz}, - {HDMITX_VFMT_33_1920x1080p_25Hz, E_REGVFMT_1920x1080p_25Hz}, - {HDMITX_VFMT_34_1920x1080p_30Hz, E_REGVFMT_1920x1080p_30Hz}, - {HDMITX_VFMT_35_2880x480p_60Hz, E_REGVFMT_2880x480p_60Hz}, - {HDMITX_VFMT_36_2880x480p_60Hz, E_REGVFMT_2880x480p_60Hz}, - {HDMITX_VFMT_37_2880x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_38_2880x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_60_1280x720p_24Hz, E_REGVFMT_1280x720p_24Hz}, - {HDMITX_VFMT_61_1280x720p_25Hz, E_REGVFMT_1280x720p_25Hz}, - {HDMITX_VFMT_62_1280x720p_30Hz, E_REGVFMT_1280x720p_30Hz} -}; - -static struct vic2reg vic2reg_TV_FP[] = { - {HDMITX_VFMT_01_640x480p_60Hz, E_REGVFMT_720x480p_60Hz_FP}, - {HDMITX_VFMT_02_720x480p_60Hz, E_REGVFMT_720x480p_60Hz_FP}, - {HDMITX_VFMT_03_720x480p_60Hz, E_REGVFMT_720x480p_60Hz_FP}, - {HDMITX_VFMT_04_1280x720p_60Hz, E_REGVFMT_1280x720p_60Hz_FP}, - {HDMITX_VFMT_05_1920x1080i_60Hz, E_REGVFMT_1920x1080i_60Hz_FP}, - {HDMITX_VFMT_17_720x576p_50Hz, E_REGVFMT_720x576p_50Hz_FP}, - {HDMITX_VFMT_18_720x576p_50Hz, E_REGVFMT_720x576p_50Hz_FP}, - {HDMITX_VFMT_19_1280x720p_50Hz, E_REGVFMT_1280x720p_50Hz_FP}, - {HDMITX_VFMT_20_1920x1080i_50Hz, E_REGVFMT_1920x1080i_50Hz_FP}, - {HDMITX_VFMT_32_1920x1080p_24Hz, E_REGVFMT_1920x1080p_24Hz_FP}, - {HDMITX_VFMT_33_1920x1080p_25Hz, E_REGVFMT_1920x1080p_25Hz_FP}, - {HDMITX_VFMT_34_1920x1080p_30Hz, E_REGVFMT_1920x1080p_30Hz_FP}, - {HDMITX_VFMT_60_1280x720p_24Hz, E_REGVFMT_1280x720p_24Hz_FP}, - {HDMITX_VFMT_61_1280x720p_25Hz, E_REGVFMT_1280x720p_25Hz_FP}, - {HDMITX_VFMT_62_1280x720p_30Hz, E_REGVFMT_1280x720p_30Hz_FP} -}; -#else -static struct vic2reg vic2reg_TV[] = { - {HDMITX_VFMT_01_640x480p_60Hz, E_REGVFMT_640x480p_60Hz}, - {HDMITX_VFMT_02_720x480p_60Hz, E_REGVFMT_720x480p_60Hz}, - {HDMITX_VFMT_03_720x480p_60Hz, E_REGVFMT_720x480p_60Hz}, - {HDMITX_VFMT_04_1280x720p_60Hz, E_REGVFMT_1280x720p_60Hz}, - {HDMITX_VFMT_05_1920x1080i_60Hz, E_REGVFMT_1920x1080i_60Hz}, - {HDMITX_VFMT_06_720x480i_60Hz, E_REGVFMT_720x480i_60Hz}, - {HDMITX_VFMT_07_720x480i_60Hz, E_REGVFMT_720x480i_60Hz}, - {HDMITX_VFMT_08_720x240p_60Hz, E_REGVFMT_720x240p_60Hz}, - {HDMITX_VFMT_09_720x240p_60Hz, E_REGVFMT_720x240p_60Hz}, - {HDMITX_VFMT_16_1920x1080p_60Hz, E_REGVFMT_1920x1080p_60Hz}, - {HDMITX_VFMT_17_720x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_18_720x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_19_1280x720p_50Hz, E_REGVFMT_1280x720p_50Hz}, - {HDMITX_VFMT_20_1920x1080i_50Hz, E_REGVFMT_1920x1080i_50Hz}, - {HDMITX_VFMT_21_720x576i_50Hz, E_REGVFMT_720x576i_50Hz}, - {HDMITX_VFMT_22_720x576i_50Hz, E_REGVFMT_720x576i_50Hz}, - {HDMITX_VFMT_23_720x288p_50Hz, E_REGVFMT_720x288p_50Hz}, - {HDMITX_VFMT_24_720x288p_50Hz, E_REGVFMT_720x288p_50Hz}, - {HDMITX_VFMT_31_1920x1080p_50Hz, E_REGVFMT_1920x1080p_50Hz}, - {HDMITX_VFMT_32_1920x1080p_24Hz, E_REGVFMT_1920x1080p_24Hz}, - {HDMITX_VFMT_33_1920x1080p_25Hz, E_REGVFMT_1920x1080p_25Hz}, - {HDMITX_VFMT_34_1920x1080p_30Hz, E_REGVFMT_1920x1080p_30Hz}, - {HDMITX_VFMT_35_2880x480p_60Hz, E_REGVFMT_720x480p_60Hz}, - {HDMITX_VFMT_36_2880x480p_60Hz, E_REGVFMT_720x480p_60Hz}, - {HDMITX_VFMT_37_2880x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_38_2880x576p_50Hz, E_REGVFMT_720x576p_50Hz}, - {HDMITX_VFMT_60_1280x720p_24Hz, E_REGVFMT_1280x720p_24Hz}, - {HDMITX_VFMT_61_1280x720p_25Hz, E_REGVFMT_1280x720p_25Hz}, - {HDMITX_VFMT_62_1280x720p_30Hz, E_REGVFMT_1280x720p_30Hz} -}; - -static struct vic2reg vic2reg_TV_FP[] = { - {HDMITX_VFMT_04_1280x720p_60Hz, E_REGVFMT_1280x720p_60Hz_FP}, - {HDMITX_VFMT_05_1920x1080i_60Hz, E_REGVFMT_1920x1080i_60Hz_FP}, - {HDMITX_VFMT_19_1280x720p_50Hz, E_REGVFMT_1280x720p_50Hz_FP}, - {HDMITX_VFMT_20_1920x1080i_50Hz, E_REGVFMT_1920x1080i_50Hz_FP}, - {HDMITX_VFMT_32_1920x1080p_24Hz, E_REGVFMT_1920x1080p_24Hz_FP}, - {HDMITX_VFMT_33_1920x1080p_25Hz, E_REGVFMT_1920x1080p_25Hz_FP}, - {HDMITX_VFMT_34_1920x1080p_30Hz, E_REGVFMT_1920x1080p_30Hz_FP}, - {HDMITX_VFMT_60_1280x720p_24Hz, E_REGVFMT_1280x720p_24Hz_FP}, - {HDMITX_VFMT_61_1280x720p_25Hz, E_REGVFMT_1280x720p_25Hz_FP}, - {HDMITX_VFMT_62_1280x720p_30Hz, E_REGVFMT_1280x720p_30Hz_FP} -}; -#endif - -#ifdef FORMAT_PC -static struct vic2reg vic2reg_PC[HDMITX_VFMT_PC_NUM] = { - {HDMITX_VFMT_PC_640x480p_60Hz, E_REGVFMT_640x480p_60Hz}, - {HDMITX_VFMT_PC_800x600p_60Hz, E_REGVFMT_800x600p_60Hz}, - {HDMITX_VFMT_PC_1024x768p_60Hz, E_REGVFMT_1024x768p_60Hz}, - {HDMITX_VFMT_PC_1280x768p_60Hz, E_REGVFMT_1280x768p_60Hz}, - {HDMITX_VFMT_PC_1280x1024p_60Hz, E_REGVFMT_1280x1024p_60Hz}, - {HDMITX_VFMT_PC_1360x768p_60Hz, E_REGVFMT_1360x768p_60Hz}, - {HDMITX_VFMT_PC_1400x1050p_60Hz, E_REGVFMT_1400x1050p_60Hz}, - {HDMITX_VFMT_PC_1600x1200p_60Hz, E_REGVFMT_1600x1200p_60Hz}, - {HDMITX_VFMT_PC_1024x768p_70Hz, E_REGVFMT_1024x768p_70Hz}, - {HDMITX_VFMT_PC_640x480p_72Hz, E_REGVFMT_640x480p_72Hz}, - {HDMITX_VFMT_PC_800x600p_72Hz, E_REGVFMT_800x600p_72Hz}, - {HDMITX_VFMT_PC_640x480p_75Hz, E_REGVFMT_640x480p_75Hz}, - {HDMITX_VFMT_PC_1024x768p_75Hz, E_REGVFMT_1024x768p_75Hz}, - {HDMITX_VFMT_PC_800x600p_75Hz, E_REGVFMT_800x600p_75Hz}, - {HDMITX_VFMT_PC_640x480p_85Hz, E_REGVFMT_640x480p_85Hz}, - {HDMITX_VFMT_PC_800x600p_85Hz, E_REGVFMT_800x600p_85Hz}, - {HDMITX_VFMT_PC_1280x1024p_85Hz, E_REGVFMT_1280x1024p_85Hz} -}; -#endif /* FORMAT PC */ - - -/** - * Lookup table to convert from video format codes used in the - * E_REG_P00_VIDFORMAT_W register to corresponding VS_PIX_STRT_2 - * register values, to correct the output window for interlaced - * output formats, with or without the scaler. - * - * The correction is VS_PIX_STRT_2=VS_PIX_STRT_2+VS_PIX_STRT_1. - * The same value is also applied to VS_PIX_END_2. - */ - -/** - * Lookup table to convert from video format codes used in the - * E_REG_P00_VIDFORMAT_W register to corresponding - * pixel repetition values in the PLL_SERIAL_2 register. - * 0=no repetition (pixel sent once) - * 1=one repetition (pixel sent twice) etc - */ - -/** - * Lookup table to convert from video format codes used in the - * E_REG_P00_VIDFORMAT_W register to corresponding - * trios of 2-bit values in the srl_nosc, scg_nosc and de_nosc - * PLL control registers - * - * Rational for dummies by André ;) - * ----------------------------- - * the TMDS serializer multiply x10 the pixclk (this is a PLL;) - * --> --> -->
- * 576i or 480i 13.5 Mhz (*2) 270 Mhz 4 - * 576p 27 Mhz 270 Mhz 4 - * 720p or 1080i 74.25 Mhz 742 Mhz 2 - * 1080p 148.5 Mhz 1485 Mhz 1 - * - */ - -static UInt8 pll[] = { - /* prefetch */ - 2, /* E_REGVFMT_640x480p_60Hz */ - 2, /* E_REGVFMT_720x480p_60Hz */ - 1, /* E_REGVFMT_1280x720p_60Hz */ - 1, /* E_REGVFMT_1920x1080i_60Hz */ - 3, /* E_REGVFMT_720x480i_60Hz */ - 0, /* E_REGVFMT_720x240p_60Hz *//** \todo Need nosc PLL value */ - 0, /* E_REGVFMT_1920x1080p_60Hz */ - 2, /* E_REGVFMT_720x576p_50Hz */ - 1, /* E_REGVFMT_1280x720p_50Hz */ - 1, /* E_REGVFMT_1920x1080i_50Hz */ - 3, /* E_REGVFMT_720x576i_50Hz */ - 0, /* E_REGVFMT_720x288p_50Hz *//** \todo Need nosc PLL value */ - 0, /* E_REGVFMT_1920x1080p_50Hz */ -#ifdef TMFL_RGB_DDR_12BITS - 0, /* E_REGVFMT_1920x1080p_24Hz */ - 1, /* E_REGVFMT_1440x576p_50Hz */ - 1, /* E_REGVFMT_1440x480p_50Hz */ - 0, /* E_REGVFMT_2880x480p_50Hz */ - 0, /* E_REGVFMT_2880x576p_50Hz */ - 1, /* E_REGVFMT_2880x480i_60Hz */ - 2, /* E_REGVFMT_2880x480i_60Hz_PR2 */ - 2, /* E_REGVFMT_2880x480i_60Hz_PR4 */ - 1, /* E_REGVFMT_2880x576i_50Hz */ - 2, /* E_REGVFMT_2880x576i_50Hz_PR2 */ - 1, /* E_REGVFMT_720x480p_60Hz_FP */ - 0, /* E_REGVFMT_1280x720p_60Hz_FP */ - 1, /* E_REGVFMT_720x576p_50Hz_FP */ - 0, /* E_REGVFMT_1280x720p_50Hz_FP */ - 0, /* E_REGVFMT_1920x1080p_23Hz_FP */ - 0, /* E_REGVFMT_1920x1080p_25Hz_FP */ - 0, /* E_REGVFMT_1920x1080p_29Hz_FP */ - 0, /* E_REGVFMT_1920x1080i_60Hz_FP */ - 0, /* E_REGVFMT_1920x1080i_50Hz_FP */ -#endif - /* extra list */ -#ifndef TMFL_RGB_DDR_12BITS - 1, /* E_REGVFMT_1920x1080p_24Hz */ -#endif - 1, /* E_REGVFMT_1920x1080p_25Hz */ - 1, /* E_REGVFMT_1920x1080p_30Hz */ - 1, /* E_REGVFMT_1280x720p_24Hz */ - 1, /* E_REGVFMT_1280x720p_25Hz */ - 1, /* E_REGVFMT_1280x720p_30Hz */ -#ifndef TMFL_RGB_DDR_12BITS - 0, /* E_REGVFMT_1280x720p_60Hz_FP */ - 0, /* E_REGVFMT_1920x1080i_60Hz_FP */ - 0, /* E_REGVFMT_1280x720p_50Hz_FP */ - 0, /* E_REGVFMT_1920x1080i_50Hz_FP */ - 0, /* E_REGVFMT_1920x1080p_24Hz_FP */ - 0, /* E_REGVFMT_1920x1080p_25Hz_FP */ - 0, /* E_REGVFMT_1920x1080p_30Hz_FP */ -#endif - 0, /* E_REGVFMT_1280x720p_24Hz_FP */ - 0, /* E_REGVFMT_1280x720p_25Hz_FP */ - 0, /* E_REGVFMT_1280x720p_30Hz_FP */ -#ifdef FORMAT_PC - 2, /* E_REGVFMT_640x480p_72Hz */ - 2, /* E_REGVFMT_640x480p_75Hz */ - 2, /* E_REGVFMT_640x480p_85Hz */ - 1, /* E_REGVFMT_800x600p_60Hz */ - 1, /* E_REGVFMT_800x600p_72Hz */ - 1, /* E_REGVFMT_800x600p_75Hz */ - 1, /* E_REGVFMT_800x600p_85Hz */ - 1, /* E_REGVFMT_1024x768p_60Hz */ - 1, /* E_REGVFMT_1024x768p_70Hz */ - 1, /* E_REGVFMT_1024x768p_75Hz */ - 0, /* E_REGVFMT_1280x768p_60Hz */ - 0, /* E_REGVFMT_1280x1024p_60Hz */ - 0, /* E_REGVFMT_1360x768p_60Hz */ - 0, /* E_REGVFMT_1400x1050p_60Hz */ - 0, /* E_REGVFMT_1600x1200p_60Hz */ - 1 /* E_REGVFMT_1280x1024p_85Hz */ -#endif /* FORMAT_PC */ -}; - - - -/** - * Lokup table to convert from video format codes used in the - * E_REG_P00_VIDFORMAT_W register to RefPix and RefLine values - * according to sync source - */ -/* prefetch list */ -static struct sync_desc ref_sync[] = { - /* - designer world <==> CEA-861 reader world - ---------------------------------------- - t_hs_s : hfp+1 - t_vsl_s1 : vfp+1 - t_de_s : href+1 - t_vw_s1 : vref+1 - - For the story, designer have defined VsPixRef and VsLineRef concept - that are the position of VSync in pixel and line starting from the top - of the frame. - So we have in fact : VSync that is hfp + vfp*total_h_active away from top - - */ - /* Vs2 PR Vtg Htg HFP VFP HREF VREF */ - {0, 0, 1, 1, 17, 2, 161, 36}, /* E_REGVFMT_640x480p_60Hz */ - {0, 0, 1, 1, 17, 8, 139, 43}, /* E_REGVFMT_720x480p_60Hz */ - {0, 0, 0, 0, 111, 2, 371, 26}, /* E_REGVFMT_1280x720p_60Hz */ - {1100 + 88, 0, 0, 0, 89, 2, 281, 21}, /* E_REGVFMT_1920x1080i_60Hz */ - {429 + 19, 1, 1, 1, 20, 5, 139, 22}, /* E_REGVFMT_720x480i_60Hz */ - {0, 1, 1, 1, 20, 5, 139, 22}, /* E_REGVFMT_720x240p_60Hz */ - {0, 0, 0, 0, 89, 2, 281, 42}, /* E_REGVFMT_1920x1080p_60Hz */ - {0, 0, 1, 1, 13, 2, 145, 45}, /* E_REGVFMT_720x576p_50Hz */ - {0, 0, 0, 0, 441, 2, 701, 26}, /* E_REGVFMT_1280x720p_50Hz */ - {1320 + 528, 0, 0, 0, 529, 2, 721, 21}, /* E_REGVFMT_1920x1080i_50Hz */ - {432 + 12, 1, 1, 1, 13, 2, 145, 23}, /* E_REGVFMT_720x576i_50Hz */ - {0, 1, 1, 1, 13, 2, 145, 23}, /* E_REGVFMT_720x288p_50Hz */ - {0, 0, 0, 0, 529, 2, 721, 42}, /* E_REGVFMT_1920x1080p_50Hz */ -#ifdef TMFL_RGB_DDR_12BITS - {0, 0, 0, 0, 639, 2, 831, 42}, /* E_REGVFMT_1920x1080p_24Hz */ - {0, 0, 1, 1, 25, 2, 289, 45}, /* E_REGVFMT_1440x576p_50Hz */ - {0, 0, 1, 1, 33, 8, 277, 43}, /* E_REGVFMT_1440x480p_50Hz */ - {0, 0, 1, 1, 65, 8, 553, 43}, /* E_REGVFMT_2880x480p_50Hz */ - {0, 0, 1, 1, 49, 2, 577, 45}, /* E_REGVFMT_2880x576p_50Hz */ - {1716 + 76, 0, 1, 1, 77, 5, 553, 22}, /* E_REGVFMT_2880x480i_60Hz */ - {858 + 38, 1, 1, 1, 39, 5, 277, 22}, /* E_REGVFMT_2880x480i_60Hz_PR2 */ - {429 + 19, 2, 1, 1, 20, 5, 139, 22}, /* E_REGVFMT_2880x480i_60Hz_PR4 */ - {1728 + 48, 0, 1, 1, 49, 2, 577, 23}, /* E_REGVFMT_2880x576i_50Hz */ - {864 + 24, 1, 1, 1, 25, 2, 289, 23} /* E_REGVFMT_2880x576i_50Hz_PR */ -#endif -}; - -/* extra list */ -static struct sync_desc ref_sync_extra[] = { - /* Vs2 PR Vtg Htg HFP VFP HREF VREF */ -#ifndef TMFL_RGB_DDR_12BITS - {0, 0, 0, 0, 639, 2, 831, 42}, /* E_REGVFMT_1920x1080p_24Hz */ -#endif - {0, 0, 0, 0, 529, 2, 721, 42}, /* E_REGVFMT_1920x1080p_25Hz */ - {0, 0, 0, 0, 89, 2, 281, 42}, /* E_REGVFMT_1920x1080p_30Hz */ - {0, 0, 0, 0, 1761, 2, 2021, 26}, /* E_REGVFMT_1280x720p_24Hz */ - {0, 0, 0, 0, 2421, 2, 2681, 26}, /* E_REGVFMT_1280x720p_25Hz */ - {0, 0, 0, 0, 1761, 2, 2021, 26} /* E_REGVFMT_1280x720p_30Hz */ -}; - -#ifdef FORMAT_PC - /* PC list */ -static struct sync_desc ref_sync_PC[] = { - /* Vs2 PR Vtg Htg HFP VFP HREF VREF */ - {0, 0, 1, 1, 25, 2, 195, 32}, /* E_REGVFMT_640x480p_72Hz */ - {0, 0, 1, 1, 17, 2, 203, 20}, /* E_REGVFMT_640x480p_75Hz */ - {0, 0, 1, 1, 57, 2, 195, 29}, /* E_REGVFMT_640x480p_85Hz */ - {0, 0, 0, 0, 41, 2, 259, 28}, /* E_REGVFMT_800x600p_60Hz */ - {0, 0, 0, 0, 57, 2, 243, 30}, /* E_REGVFMT_800x600p_72Hz */ - {0, 0, 0, 0, 17, 2, 259, 25}, /* E_REGVFMT_800x600p_75Hz */ - {0, 0, 0, 0, 33, 2, 251, 31}, /* E_REGVFMT_800x600p_85Hz */ - {0, 0, 1, 1, 25, 2, 323, 36}, /* E_REGVFMT_1024x768p_60Hz */ - {0, 0, 1, 1, 25, 2, 307, 36}, /* E_REGVFMT_1024x768p_70Hz */ - {0, 0, 0, 0, 17, 2, 291, 32}, /* E_REGVFMT_1024x768p_75Hz */ - {0, 0, 0, 1, 65, 2, 387, 28}, /* E_REGVFMT_1280x768p_60Hz */ - {0, 0, 0, 0, 49, 2, 411, 42}, /* E_REGVFMT_1280x1024p_60Hz */ - {0, 0, 0, 0, 65, 2, 435, 25}, /* E_REGVFMT_1360x768p_60Hz */ - {0, 0, 0, 1, 89, 2, 467, 37}, /* E_REGVFMT_1400x1050p_60Hz */ - {0, 0, 0, 0, 65, 2, 563, 50}, /* E_REGVFMT_1600x1200p_60Hz */ - {0, 0, 0, 0, 65, 2, 451, 48} /* E_REGVFMT_1280x1024p_85Hz */ -}; -#endif /* FORMAT_PC */ - -static tmHdmiTxVidReg_t format_param_extra[] = { - /* NPIX NLINE VsLineStart VsPixStart VsLineEnd VsPixEnd HsStart HsEnd ActiveVideoStart ActiveVideoEnd DeStart DeEnd */ - /* npix nline vsl_s1 vsp_s1 vsl_e1 vsp_e1 hs_e hs_e vw_s1 vw_e1 de_s de_e */ -#ifndef TMFL_RGB_DDR_12BITS - {2750, 1125, 1, 638, 6, 638, 638, 682, 41, 1121, 830, 2750, 0, 0}, /* E_REGVFMT_1920x1080p_24Hz */ -#endif - {2640, 1125, 1, 528, 6, 528, 528, 572, 41, 1121, 720, 2640, 0, 0}, /* E_REGVFMT_1920x1080p_25Hz */ - {2200, 1125, 1, 88, 6, 88, 88, 132, 41, 1121, 280, 2200, 0, 0}, /* E_REGVFMT_1920x1080p_30Hz */ - {3300, 750, 1, 1760, 6, 1760, 1760, 1800, 25, 745, 2020, 3300, 0, 0}, /* E_REGVFMT_1280x720p_24Hz */ - {3960, 750, 1, 2420, 6, 2420, 2420, 2460, 25, 745, 2680, 3960, 0, 0}, /* E_REGVFMT_1280x720p_25Hz */ - {3300, 750, 1, 1760, 6, 1760, 1760, 1800, 25, 745, 2020, 3300, 0, 0}, /* E_REGVFMT_1280x720p_30Hz */ -#ifndef TMFL_RGB_DDR_12BITS - {1650, 1500, 1, 110, 6, 110, 110, 150, 25, 1495, 370, 1650, 746, 776}, /* E_REGVFMT_1280x720p_60Hz_FP */ - {2200, 2250, 1, 88, 6, 88, 88, 132, 20, 2248, 280, 2200, 0, 0}, /* E_REGVFMT_1920x1080i_60Hz_FP */ - {1980, 1500, 1, 440, 6, 440, 440, 480, 25, 1495, 700, 1980, 746, 776}, /* E_REGVFMT_1280x720p_50Hz_FP */ - {2640, 2250, 1, 528, 6, 528, 528, 572, 20, 2248, 720, 2640, 0, 0}, /* E_REGVFMT_1920x1080i_50Hz_FP */ - {2750, 2250, 1, 638, 6, 638, 638, 682, 41, 2246, 830, 2750, 1122, 1167}, /* E_REGVFMT_1920x1080p_24Hz_FP */ - {2640, 2250, 1, 528, 6, 528, 528, 572, 41, 2246, 720, 2640, 1122, 1167}, /* E_REGVFMT_1920x1080p_25Hz_FP */ - {2200, 2250, 1, 88, 6, 88, 88, 132, 41, 2246, 280, 2200, 1122, 1167}, /* E_REGVFMT_1920x1080p_30Hz_FP */ -#endif - {3300, 1500, 1, 1760, 6, 1760, 1760, 1800, 25, 1495, 2020, 3300, 0, 0}, /* E_REGVFMT_1280x720p_24Hz_FP */ - {3960, 1500, 1, 2420, 6, 2420, 2420, 2460, 25, 1495, 2680, 3960, 0, 0}, /* E_REGVFMT_1280x720p_25Hz_FP */ - {3300, 1500, 1, 1760, 6, 1760, 1760, 1800, 25, 1495, 2020, 3300, 0, 0}, /* E_REGVFMT_1280x720p_30Hz_FP */ -}; - -#ifdef FORMAT_PC -static tmHdmiTxVidReg_t format_param_PC[HDMITX_VFMT_PC_NUM] = { - /* NPIX NLINE VsLineStart VsPixStart VsLineEnd VsPixEnd HsStart HsEnd ActiveVideoStart ActiveVideoEnd DeStart DeEnd */ - /* npix nline vsl_s1 vsp_s1 vsl_e1 vsp_e1 hs_e hs_e vw_s1 vw_e1 de_s de_e */ - {832, 520, 1, 24, 4, 24, 24, 64, 31, 511, 192, 832, 0, 0}, /* E_REGVFMT_640x480p_72Hz */ - {840, 500, 1, 16, 4, 16, 16, 80, 19, 499, 200, 840, 0, 0}, /* E_REGVFMT_640x480p_75Hz */ - {832, 509, 1, 56, 4, 56, 56, 112, 28, 508, 192, 832, 0, 0}, /* E_REGVFMT_640x480p_85Hz */ - {1056, 628, 1, 40, 5, 40, 40, 168, 27, 627, 256, 1056, 0, 0}, /* E_REGVFMT_800x600p_60Hz */ - {1040, 666, 1, 56, 7, 56, 56, 176, 29, 619, 240, 1040, 0, 0}, /* E_REGVFMT_800x600p_72Hz */ - {1056, 625, 1, 16, 4, 16, 16, 96, 24, 624, 256, 1056, 0, 0}, /* E_REGVFMT_800x600p_75Hz */ - {1048, 631, 1, 32, 4, 32, 32, 96, 30, 630, 248, 1048, 0, 0}, /* E_REGVFMT_800x600p_85Hz */ - {1344, 806, 1, 24, 7, 24, 24, 160, 35, 803, 320, 1344, 0, 0}, /* E_REGVFMT_1024x768p_60Hz */ - {1328, 806, 1, 24, 7, 24, 24, 160, 35, 803, 304, 1328, 0, 0}, /* E_REGVFMT_1024x768p_70Hz */ - {1312, 800, 1, 16, 4, 16, 16, 112, 31, 799, 288, 1312, 0, 0}, /* E_REGVFMT_1024x768p_75Hz */ - {1664, 798, 1, 64, 8, 64, 64, 192, 27, 795, 384, 1664, 0, 0}, /* E_REGVFMT_1280x768p_60Hz */ - {1688, 1066, 1, 48, 4, 48, 48, 160, 41, 1065, 408, 1688, 0, 0}, /* E_REGVFMT_1280x1024p_60Hz */ - {1792, 795, 1, 64, 7, 64, 64, 176, 24, 792, 432, 1792, 0, 0}, /* E_REGVFMT_1360x768p_60Hz */ - {1864, 1089, 1, 88, 5, 88, 88, 232, 36, 1086, 464, 1864, 0, 0}, /* E_REGVFMT_1400x1050p_60Hz */ - {2160, 1250, 1, 64, 4, 64, 64, 256, 49, 1249, 560, 2160, 0, 0}, /* E_REGVFMT_1600x1200p_60Hz */ - {1728, 1072, 1, 64, 4, 64, 64, 224, 47, 1071, 448, 1728, 0, 0} /* E_REGVFMT_1280x1024p_85Hz */ -}; -#endif /* FORMAT_PC */ - - /** - * Lookup table for each pixel clock frequency's CTS value in kHz - * according to SCS table "Audio Clock Recovery CTS Values" - */ -static UInt32 kPixClkToAcrCts[E_PIXCLK_NUM][HDMITX_AFS_NUM] = { - /* HDMITX_AFS_32k _AFS_48K _AFS_96K _AFS_192K */ - /* _AFS_44_1k _AFS_88_2K _AFS_176_4K */ - {28125, 31250, 28125, 31250, 28125, 31250, 28125}, /* E_PIXCLK_25175 */ - {25200, 28000, 25200, 28000, 25200, 28000, 25200}, /* E_PIXCLK_25200 */ - {27000, 30000, 27000, 30000, 27000, 30000, 27000}, /* E_PIXCLK_27000 */ - {27027, 30030, 27027, 30030, 27027, 30030, 27027}, /* E_PIXCLK_27027 */ - {54000, 60000, 54000, 60000, 54000, 60000, 54000}, /* E_PIXCLK_54000 */ - {54054, 60060, 54054, 60060, 54054, 60060, 54054}, /* E_PIXCLK_54054 */ - {59400, 65996, 59400, 65996, 59400, 65996, 59400}, /* E_PIXCLK_59400 */ - {210937, 234375, 140625, 234375, 140625, 234375, 140625}, /* E_PIXCLK_74175 */ - {74250, 82500, 74250, 82500, 74250, 82500, 74250}, /* E_PIXCLK_74250 */ - {421875, 234375, 140625, 234375, 140625, 234375, 140625}, /* E_PIXCLK_148350 */ - {148500, 165000, 148500, 165000, 148500, 165000, 148500} /* E_PIXCLK_148500 */ -#ifdef FORMAT_PC - , {31500, 35000, 31500, 35000, 31500, 35000, 31500}, /* E_PIXCLK_31500 */ - {36000, 40000, 36000, 40000, 36000, 40000, 36000}, /* E_PIXCLK_36000 */ - {40000, 44444, 40000, 44444, 40000, 44444, 40000}, /* E_PIXCLK_40000 */ - {49500, 55000, 49500, 55000, 49500, 55000, 49500}, /* E_PIXCLK_49500 */ - {50000, 55556, 50000, 55556, 50000, 55556, 50000}, /* E_PIXCLK_50000 */ - {56250, 62500, 56250, 62500, 56250, 62500, 56250}, /* E_PIXCLK_56250 */ - {65000, 72222, 65000, 72222, 65000, 72222, 65000}, /* E_PIXCLK_65000 */ - {75000, 83333, 75000, 83333, 75000, 83333, 75000}, /* E_PIXCLK_75000 */ - {78750, 87500, 78750, 87500, 78750, 87500, 78750}, /* E_PIXCLK_78750 */ - {162000, 180000, 162000, 180000, 162000, 180000, 162000}, /* E_PIXCLK_162000 */ - {157500, 175000, 157500, 175000, 157500, 175000, 157500} /* E_PIXCLK_157500 */ -#endif /* FORMAT_PC */ -}; - -/** - * Lookup table for each pixel clock frequency's Audio Clock Regeneration N, - * according to SCS Table "Audio Clock Recovery N Values" - */ -static UInt32 kPixClkToAcrN[E_PIXCLK_NUM][HDMITX_AFS_NUM] = { - /* HDMITX_AFS_32k _AFS_48K _AFS_96K _AFS_192K */ - /* _AFS_44_1k _AFS_88_2K _AFS_176_4K */ - {4576, 7007, 6864, 14014, 13728, 28028, 27456}, /* E_PIXCLK_25175 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_25200 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_27000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_27027 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_54000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_54054 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_59400 */ - {11648, 17836, 11648, 35672, 23296, 71344, 46592}, /* E_PIXCLK_74175 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_74250 */ - {11648, 8918, 5824, 17836, 11648, 35672, 23296}, /* E_PIXCLK_148350 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576} /* E_PIXCLK_148500 */ -#ifdef FORMAT_PC - , {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_31500 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_36000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_40000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_49500 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_50000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_56250 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_65000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_75000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_78750 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_162000 */ - {4096, 6272, 6144, 12544, 12288, 25088, 24576} /* E_PIXCLK_157500 */ -#endif /* FORMAT_PC */ -}; - -/** - * Lookup table for each pixel clock frequency's Audio Divider, according to - * SCS Table "Audio Clock Recovery Divider Values" - */ -static UInt8 kPixClkToAdiv[E_PIXCLK_NUM][HDMITX_AFS_NUM] = { - /* HDMITX_AFS_32k _AFS_48K _AFS_96K _AFS_192K */ - /* _AFS_44_1k _AFS_88_2K _AFS_176_4K */ - {2, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_25175 */ - {2, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_25200 */ - {2, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_27000 */ - {2, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_27027 */ - {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_54000 */ - {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_54054 */ - {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_59400 */ - {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_74175 */ - {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_74250 */ - {5, 4, 4, 3, 3, 2, 2}, /* E_PIXCLK_148350 */ - {5, 4, 4, 3, 3, 2, 2} /* E_PIXCLK_148500 */ -#ifdef FORMAT_PC - , {2, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_31500 */ - {3, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_36000 */ - {3, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_40000 */ - {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_49500 */ - {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_50000 */ - {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_56250 */ - {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_65000 */ - {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_75000 */ - {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_78750 */ - {5, 4, 4, 3, 3, 2, 2}, /* E_PIXCLK_162000 */ - {5, 4, 4, 3, 3, 2, 2} /* E_PIXCLK_157500 */ -#endif /* FORMAT_PC */ - -}; - -/** - * Lookup table for converting a sampling frequency into the values - * required in channel status byte 3 according to IEC60958-3 - */ -static UInt8 kAfsToCSbyte3[HDMITX_AFS_NUM + 1] = { - 3, /* HDMITX_AFS_32k */ - 0, /* HDMITX_AFS_44_1k */ - 2, /* HDMITX_AFS_48k */ - 8, /* HDMITX_AFS_88_2k */ - 10, /* HDMITX_AFS_96k */ - 12, /* HDMITX_AFS_176_4k */ - 14, /* HDMITX_AFS_192k */ - 9, /* HDMITX_AFS_768k */ - 1, /* HDMITX_AFS_NOT_INDICATED */ -}; - - - -/** - * Lookup table for each CTS X factor's k and m register values - */ -static UInt8 kCtsXToMK[HDMITX_CTSX_NUM][2] = { -/* Register values Actual values */ -/* m k m, k */ - {3, 0}, /* 8, 1 */ - {3, 1}, /* 8, 2 */ - {3, 2}, /* 8, 3 */ - {3, 3}, /* 8, 4 */ - {0, 0} /* 1, 1 */ -}; - -/** - * Table of registers to reset and release the CTS generator - */ -static tmHdmiTxRegMaskVal_t kResetCtsGenerator[] = { - {E_REG_P11_AIP_CNTRL_0_RW, E_MASKREG_P11_AIP_CNTRL_0_rst_cts, 1}, - {E_REG_P11_AIP_CNTRL_0_RW, E_MASKREG_P11_AIP_CNTRL_0_rst_cts, 0}, - {0, 0, 0} -}; - -/** - * Table of registers to bypass colour processing (up/down sampler & matrix) - */ -static tmHdmiTxRegMaskVal_t kBypassColourProc[] = { - /* Bypass upsampler for RGB colourbars */ - {E_REG_P00_HVF_CNTRL_0_W, E_MASKREG_P00_HVF_CNTRL_0_intpol, 0}, - /* Bypass matrix for RGB colourbars */ - {E_REG_P00_MAT_CONTRL_W, E_MASKREG_P00_MAT_CONTRL_mat_bp, 1}, - /* Bypass downsampler for RGB colourbars */ - {E_REG_P00_HVF_CNTRL_1_W, E_MASKREG_P00_HVF_CNTRL_1_for, 0}, - {0, 0, 0} -}; - -/** - * Table of registers to configure video input mode CCIR656*/ -static tmHdmiTxRegMaskVal_t kVinModeCCIR656[] = { - {E_REG_P00_VIP_CNTRL_4_W, E_MASKREG_P00_VIP_CNTRL_4_ccir656, 1}, - {E_REG_P00_HVF_CNTRL_1_W, E_MASKREG_P00_HVF_CNTRL_1_semi_planar, 1}, - /*{E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_clk1, 1}, */ - {E_REG_P02_PLL_SERIAL_3_RW, E_MASKREG_P02_PLL_SERIAL_3_srl_ccir, 1}, - {E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_vrf_clk, 1}, - {0, 0, 0} -}; - - /* Table of registers to configure video input mode for CCIR656 DDR with 1280*720p and 1920*1080i formats */ -static tmHdmiTxRegMaskVal_t kVinModeCCIR656_DDR_above720p[] = { - {E_REG_P00_VIP_CNTRL_4_W, E_MASKREG_P00_VIP_CNTRL_4_ccir656, 1}, - {E_REG_P00_HVF_CNTRL_1_W, E_MASKREG_P00_HVF_CNTRL_1_semi_planar, 1}, /*To be defined */ - /*{E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_clk1, 0},To be defined */ - {E_REG_P02_PLL_SERIAL_3_RW, E_MASKREG_P02_PLL_SERIAL_3_srl_ccir, 0}, - {E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_vrf_clk, 0}, - {0, 0, 0} -}; - -/** - * Table of registers to configure video input mode RGB444 or YUV444 - */ -static tmHdmiTxRegMaskVal_t kVinMode444[] = { - {E_REG_P00_VIP_CNTRL_4_W, E_MASKREG_P00_VIP_CNTRL_4_ccir656, 0}, - {E_REG_P00_HVF_CNTRL_1_W, E_MASKREG_P00_HVF_CNTRL_1_semi_planar, 0}, - /* {E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_clk1, 0}, */ - {E_REG_P02_PLL_SERIAL_3_RW, E_MASKREG_P02_PLL_SERIAL_3_srl_ccir, 0}, - {E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_vrf_clk, 0}, - {0, 0, 0} -}; - -/** - * Table of registers to configure video input mode YUV422 - */ -static tmHdmiTxRegMaskVal_t kVinModeYUV422[] = { - {E_REG_P00_VIP_CNTRL_4_W, E_MASKREG_P00_VIP_CNTRL_4_ccir656, 0}, - {E_REG_P00_HVF_CNTRL_1_W, E_MASKREG_P00_HVF_CNTRL_1_semi_planar, 1}, - /*{E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_clk1, 0}, */ - {E_REG_P02_PLL_SERIAL_3_RW, E_MASKREG_P02_PLL_SERIAL_3_srl_ccir, 0}, - {E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_sel_vrf_clk, 0}, - {0, 0, 0} -}; - - -/** - * Lookup table for colour space conversion matrix register sets. - * Each array consists of 31 register values from MAT_CONTROL through - * to MAT_OO3_LSB - */ -static UInt8 kMatrixPreset[MATRIX_PRESET_QTY][MATRIX_PRESET_SIZE] = { - {0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6F, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x6F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0x6F, 0x0, 0x40, 0x0, 0x40, 0x0, 0x40}, /* RGB Full to RGB Limited */ - - {0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x4, 0x1, 0x7, 0x0, - 0x64, 0x6, 0x88, 0x1, 0xC2, 0x7, 0xB7, 0x6, 0xD6, 0x7, 0x68, 0x1, - 0xC2, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0}, /* RGB Full to BT601 */ - - {0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x75, 0x0, 0xBB, 0x0, - 0x3F, 0x6, 0x68, 0x1, 0xC2, 0x7, 0xD7, 0x6, 0xA6, 0x7, 0x99, 0x1, - 0xC2, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0}, /* RGB Full to BT709 */ - - {0x1, 0x7, 0xC0, 0x7, 0xC0, 0x7, 0xC0, 0x2, 0x54, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* RGB Limited to RGB Full */ - - {0x2, 0x7, 0xC0, 0x7, 0xC0, 0x7, 0xC0, 0x2, 0x59, 0x1, 0x32, 0x0, - 0x75, 0x6, 0x4A, 0x2, 0x0C, 0x7, 0xAB, 0x6, 0xA5, 0x7, 0x4F, 0x2, - 0x0C, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0}, /* RGB Limited to BT601 */ - - {0x2, 0x7, 0xC0, 0x7, 0xC0, 0x7, 0xC0, 0x2, 0xDC, 0x0, 0xDA, 0x0, - 0x4A, 0x6, 0x24, 0x2, 0x0C, 0x7, 0xD0, 0x6, 0x6C, 0x7, 0x88, 0x2, - 0x0C, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0}, /* RGB Limited to BT709 */ - - {0x0, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x1, 0x2A, 0x7, 0x30, 0x7, - 0x9C, 0x1, 0x2A, 0x1, 0x99, 0x0, 0x0, 0x1, 0x2A, 0x0, 0x0, 0x2, - 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* BT601 to RGB Full */ - - {0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x6, 0x9A, 0x7, - 0x54, 0x2, 0x0, 0x2, 0xBE, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, - 0x77, 0x0, 0x40, 0x0, 0x40, 0x0, 0x40}, /* BT601 to RGB Limited */ - - {0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x7, 0x96, 0x7, - 0xC5, 0x0, 0x0, 0x2, 0x0D, 0x0, 0x26, 0x0, 0x0, 0x0, 0x3B, 0x2, - 0x0A, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0}, /* BT601 to BT709 */ - - {0x0, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x1, 0x2A, 0x7, 0x77, 0x7, - 0xC9, 0x1, 0x2A, 0x1, 0xCB, 0x0, 0x0, 0x1, 0x2A, 0x0, 0x0, 0x2, - 0x1D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* BT709 to RGB Full */ - - {0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x7, 0x16, 0x7, - 0xA2, 0x2, 0x0, 0x3, 0x14, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, - 0xA1, 0x0, 0x40, 0x0, 0x40, 0x0, 0x40}, /* BT709 to RGB Limited */ - - {0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x0, 0x62, 0x0, - 0x33, 0x0, 0x0, 0x1, 0xF7, 0x7, 0xDB, 0x0, 0x0, 0x7, 0xC7, 0x1, - 0xFB, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0} /* BT709 to BT601 */ -}; - -/** - * This table gives us the index into the kMatrixPreset array, based - * on the input and output colourspaces. - * The co-ordinates into this array are tmbslTDA9989Colourspace_t enums. - * The value of -1 is returned for matching input/output colourspaces. - */ -static Int kMatrixIndex[HDMITX_CS_NUM][HDMITX_CS_NUM] = { - {-1, E_MATRIX_RGBF_2_RGBL, E_MATRIX_RGBF_2_BT601, E_MATRIX_RGBF_2_BT709}, - {E_MATRIX_RGBL_2_RGBF, -1, E_MATRIX_RGBL_2_BT601, E_MATRIX_RGBL_2_BT709}, - {E_MATRIX_BT601_2_RGBF, E_MATRIX_BT601_2_RGBL, -1, E_MATRIX_BT601_2_BT709}, - {E_MATRIX_BT709_2_RGBF, E_MATRIX_BT709_2_RGBL, E_MATRIX_BT709_2_BT601, -1} -}; - -/** - * Blue filter Lookup table for colour space conversion. - * Each array consists of 31 register values from MAT_CONTROL through - * to MAT_OO3_LSB - */ -static UInt8 MatrixCoeffBlueScreen[][MATRIX_PRESET_SIZE] = { - {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0}, /* blue screen for RGB output color space */ - - {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0}, /* blue screen for YCbCr422 output color space */ - - {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0}, /* blue screen for YCbCr444 output color space */ -}; - -/** - * Black filter Lookup table for colour space conversion. - * Each array consists of 31 register values from MAT_CONTROL through - * to MAT_OO3_LSB - */ -static UInt8 MatrixCoeffBlackScreen[][MATRIX_PRESET_SIZE] = { - {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* black screen for RGB output color space */ - - {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0}, /* black screen for YCbCr422 output color space */ - - {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0}, /* black screen for YCbCr444 output color space */ -}; - - -/*============================================================================*/ -/* DEFINES DECLARATIONS */ -/*============================================================================*/ -#define HDMITX_LAT_SCO_MAX_VAL 40 -#define HDMITX_LAT_SCO_MIN_VAL 34 - -/*============================================================================*/ -/* VARIABLES DECLARATIONS */ -/*============================================================================*/ - -/* Register values per device to restore colour processing after test pattern */ -static UInt8 gMatContrl[HDMITX_UNITS_MAX]; -static UInt8 gHvfCntrl0[HDMITX_UNITS_MAX]; -static UInt8 gHvfCntrl1[HDMITX_UNITS_MAX]; - -/*============================================================================*/ -/* FUNCTION PROTOTYPES */ -/*============================================================================*/ - -static tmErrorCode_t setDeVs(tmHdmiTxobject_t *pDis, - tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTx3DStructure_t structure3D); -static tmErrorCode_t setPixelRepeat(tmHdmiTxobject_t *pDis, - tmbslHdmiTxVidFmt_t voutFmt, - UInt8 uPixelRepeat, tmbslHdmiTx3DStructure_t structure3D); -static tmErrorCode_t setSampling(tmHdmiTxobject_t *pDis); -static UInt8 calculateChecksum(UInt8 *pData, Int numBytes); -static UInt8 reg_vid_fmt(tmbslHdmiTxVidFmt_t fmt, - tmbslHdmiTx3DStructure_t structure3D, - UInt8 *idx, UInt8 *idx3d, struct sync_desc **sync); -UInt8 pix_clk(tmbslHdmiTxVidFmt_t fmt, tmbslHdmiTxVfreq_t freq, UInt8 *pclk); -static tmErrorCode_t InputConfig(tmHdmiTxobject_t *pDis, - tmbslHdmiTxVinMode_t vinMode, - tmbslHdmiTxPixEdge_t sampleEdge, - tmbslHdmiTxPixRate_t pixRate, - tmbslHdmiTxUpsampleMode_t upsampleMode, - UInt8 uPixelRepeat, - tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTx3DStructure_t structure3D); -/*============================================================================*/ -/* tmbslTDA9989AudioInResetCts */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989AudioInResetCts(tmUnitSelect_t txUnit) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return if sink is not an HDMI device */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Reset and release the CTS generator */ - err = setHwRegisterFieldTable(pDis, &kResetCtsGenerator[0]); - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989AudioInSetConfig */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989AudioInSetConfig - (tmUnitSelect_t txUnit, - tmbslHdmiTxaFmt_t aFmt, - tmbslHdmiTxI2sFor_t i2sFormat, - UInt8 chanI2s, - UInt8 chanDsd, - tmbslHdmiTxClkPolDsd_t clkPolDsd, - tmbslHdmiTxSwapDsd_t swapDsd, UInt8 layout, UInt16 uLatency_rd, tmbslHdmiTxDstRate_t dstRate) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; /* Value to write in register */ - - DUMMY_ACCESS(dstRate); - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return if sink is not an HDMI device */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameters */ -#ifdef TMFL_HBR_SUPPORT - RETIF_BADPARAM((aFmt != HDMITX_AFMT_SPDIF) && - (aFmt != HDMITX_AFMT_I2S) && - (aFmt != HDMITX_AFMT_OBA) && (aFmt != HDMITX_AFMT_HBR)) -#else /* TMFL_HBR_SUPPORT */ - RETIF_BADPARAM((aFmt != HDMITX_AFMT_SPDIF) && - (aFmt != HDMITX_AFMT_I2S) && (aFmt != HDMITX_AFMT_OBA)) - -#endif /* TMFL_HBR_SUPPORT */ - RETIF_BADPARAM(chanI2s >= HDMITX_CHAN_INVALID) - RETIF_BADPARAM(chanDsd >= HDMITX_CHAN_INVALID) - RETIF_BADPARAM(clkPolDsd >= HDMITX_CLKPOLDSD_INVALID) - RETIF_BADPARAM(swapDsd >= HDMITX_SWAPDSD_INVALID) - RETIF_BADPARAM(layout >= HDMITX_LAYOUT_INVALID) - RETIF_BADPARAM(uLatency_rd >= HDMITX_LATENCY_INVALID) - - if ((aFmt == HDMITX_AFMT_I2S) -#ifdef TMFL_HBR_SUPPORT - || (aFmt == HDMITX_AFMT_HBR) -#endif /* TMFL_HBR_SUPPORT */ - ) { - RETIF_BADPARAM((i2sFormat != HDMITX_I2SFOR_PHILIPS_L) && - (i2sFormat != HDMITX_I2SFOR_OTH_L) && - (i2sFormat != HDMITX_I2SFOR_OTH_R) - ) - } -#ifdef TMFL_HDCP_OPTIMIZED_POWER - /* - power management : - freeze/wakeup SPDIF clock - */ - err = setHwRegisterField(pDis, E_REG_FEAT_POWER_DOWN, - E_MASKREG_FEAT_POWER_DOWN_spdif, (aFmt != HDMITX_AFMT_SPDIF)); - RETIF_REG_FAIL(err); -#endif - - switch (aFmt) { - case HDMITX_AFMT_SPDIF: - regVal = (UInt8) REG_VAL_SEL_AIP_SPDIF; - /* configure MUX_AP */ - err = setHwRegister(pDis, E_REG_P00_MUX_AP_RW, TDA19989_MUX_AP_SELECT_SPDIF); - RETIF_REG_FAIL(err) - break; - - case HDMITX_AFMT_I2S: - regVal = (UInt8) REG_VAL_SEL_AIP_I2S; - /* configure MUX_AP */ - err = setHwRegister(pDis, E_REG_P00_MUX_AP_RW, TDA19989_MUX_AP_SELECT_I2S); - RETIF_REG_FAIL(err) - break; - - case HDMITX_AFMT_OBA: - regVal = (UInt8) REG_VAL_SEL_AIP_OBA; - break; - - case HDMITX_AFMT_HBR: - regVal = (UInt8) REG_VAL_SEL_AIP_HBR; - break; - - default: - return TMBSL_ERR_HDMI_BAD_PARAMETER; - } - - - /* Set the audio input processor format to aFmt. */ - err = setHwRegisterField(pDis, - E_REG_P00_AIP_CLKSEL_W, E_MASKREG_P00_AIP_CLKSEL_sel_aip, regVal); - RETIF_REG_FAIL(err) - - /* Channel status on 1 channel */ - err = setHwRegisterField(pDis, - E_REG_P11_CA_I2S_RW, E_MASKREG_P11_CA_I2S_hbr_chstat_4, 0); - RETIF_REG_FAIL(err) - - /* Select the audio format */ - if ((aFmt == HDMITX_AFMT_I2S) -#ifdef TMFL_HBR_SUPPORT - || (aFmt == HDMITX_AFMT_HBR) -#endif /* TMFL_HBR_SUPPORT */ - ) { - if (chanI2s != HDMITX_CHAN_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P11_CA_I2S_RW, - E_MASKREG_P11_CA_I2S_ca_i2s, (UInt8) chanI2s); - } - - /* Select the I2S format */ - err = setHwRegisterField(pDis, - E_REG_P00_I2S_FORMAT_RW, - E_MASKREG_P00_I2S_FORMAT_i2s_format, (UInt8) i2sFormat); - RETIF_REG_FAIL(err) -/* #ifdef TMFL_HBR_SUPPORT */ - /* if (aFmt == HDMITX_AFMT_HBR) */ - /* { */ - /* Channel status on 1 channel */ - /* err = setHwRegisterField(pDis, */ - /* E_REG_P11_CA_I2S_RW, */ - /* E_MASKREG_P11_CA_I2S_hbr_chstat_4, */ - /* 1); */ - /* RETIF_REG_FAIL(err) */ - /* } */ -/* #endif /* TMFL_HBR_SUPPORT */ */ - } else if (aFmt == HDMITX_AFMT_OBA) { - if (chanDsd != HDMITX_CHAN_NO_CHANGE) { - err = setHwRegister(pDis, E_REG_P11_CA_DSD_RW, chanDsd); - RETIF_REG_FAIL(err) - } - if (clkPolDsd != HDMITX_CLKPOLDSD_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_AIP_CLKSEL_W, - E_MASKREG_P00_AIP_CLKSEL_sel_pol_clk, - (UInt8) clkPolDsd); - RETIF_REG_FAIL(err) - } - if (swapDsd != HDMITX_SWAPDSD_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P11_AIP_CNTRL_0_RW, - E_MASKREG_P11_AIP_CNTRL_0_swap, (UInt8) swapDsd); - RETIF_REG_FAIL(err) - } - } - - /* Set layout and latency */ - if (layout != HDMITX_LAYOUT_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P11_AIP_CNTRL_0_RW, - E_MASKREG_P11_AIP_CNTRL_0_layout, layout); - RETIF_REG_FAIL(err) - } - if (uLatency_rd != HDMITX_LATENCY_NO_CHANGE) { - err = setHwRegister(pDis, E_REG_P11_LATENCY_RD_RW, (UInt8) uLatency_rd); - RETIF_REG_FAIL(err) - } - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989AudioInSetCts */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989AudioInSetCts - (tmUnitSelect_t txUnit, - tmbslHdmiTxctsRef_t ctsRef, - tmbslHdmiTxafs_t afs, - tmbslHdmiTxVidFmt_t voutFmt, - tmbslHdmiTxVfreq_t voutFreq, - UInt32 uCts, - UInt16 uCtsX, tmbslHdmiTxctsK_t ctsK, tmbslHdmiTxctsM_t ctsM, tmbslHdmiTxDstRate_t dstRate) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; /* Register value */ - UInt8 pixClk; /* Pixel clock index */ - UInt32 acrN; /* Audio clock recovery N */ - - DUMMY_ACCESS(dstRate); - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return if sink is not an HDMI device */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameters */ - RETIF_BADPARAM(ctsRef >= HDMITX_CTSREF_INVALID) - RETIF_BADPARAM(afs >= HDMITX_AFS_INVALID) - RETIF_BADPARAM(!IS_VALID_FMT(voutFmt)) - RETIF_BADPARAM(voutFreq >= HDMITX_VFREQ_INVALID) - RETIF_BADPARAM(uCtsX >= HDMITX_CTSX_INVALID) - RETIF_BADPARAM(ctsK >= HDMITX_CTSK_INVALID) - RETIF_BADPARAM(ctsM >= HDMITX_CTSMTS_INVALID) - - - if (IS_TV(voutFmt)) { - if (voutFreq == HDMITX_VFREQ_50Hz) { - RETIF(((voutFmt < HDMITX_VFMT_17_720x576p_50Hz) - || (voutFmt > HDMITX_VFMT_31_1920x1080p_50Hz)), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS); - } else if (voutFreq == HDMITX_VFREQ_24Hz) { - RETIF((voutFmt != HDMITX_VFMT_32_1920x1080p_24Hz) - && (voutFmt != HDMITX_VFMT_60_1280x720p_24Hz), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS); - } else if (voutFreq == HDMITX_VFREQ_25Hz) { - RETIF((voutFmt != HDMITX_VFMT_33_1920x1080p_25Hz) - && (voutFmt != HDMITX_VFMT_20_1920x1080i_50Hz) - && (voutFmt != HDMITX_VFMT_61_1280x720p_25Hz), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS); - } else if (voutFreq == HDMITX_VFREQ_30Hz) { - RETIF((voutFmt != HDMITX_VFMT_34_1920x1080p_30Hz) - && (voutFmt != HDMITX_VFMT_05_1920x1080i_60Hz) - && (voutFmt != HDMITX_VFMT_62_1280x720p_30Hz), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS); - } else { - RETIF(voutFmt >= HDMITX_VFMT_17_720x576p_50Hz, - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS); - } - } -#ifdef FORMAT_PC - if (IS_PC(voutFmt)) { - if (voutFreq == HDMITX_VFREQ_60Hz) { - RETIF(voutFmt > HDMITX_VFMT_PC_1600x1200p_60Hz, - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - } else if (voutFreq == HDMITX_VFREQ_70Hz) { - RETIF(voutFmt != HDMITX_VFMT_PC_1024x768p_70Hz, - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - } else if (voutFreq == HDMITX_VFREQ_72Hz) { - RETIF(((voutFmt < HDMITX_VFMT_PC_640x480p_72Hz) || - (voutFmt > HDMITX_VFMT_PC_800x600p_72Hz)), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - } else if (voutFreq == HDMITX_VFREQ_75Hz) { - RETIF(((voutFmt < HDMITX_VFMT_PC_640x480p_75Hz) || - (voutFmt > HDMITX_VFMT_PC_1280x1024p_75Hz)), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - } else if (voutFreq == HDMITX_VFREQ_85Hz) { - RETIF(((voutFmt < HDMITX_VFMT_PC_640x350p_85Hz) || - (voutFmt > HDMITX_VFMT_PC_1280x1024p_85Hz)), - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - } else { - RETIF(voutFmt != HDMITX_VFMT_PC_1024x768i_87Hz, - TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - } - } -#endif /* FORMAT_PC */ - - /* Check for auto or manual CTS */ - if (uCts == HDMITX_CTS_AUTO) { - /* Auto */ - err = setHwRegisterField(pDis, - E_REG_P11_AIP_CNTRL_0_RW, - E_MASKREG_P11_AIP_CNTRL_0_acr_man, 0); - RETIF_REG_FAIL(err) - } else { - /* Manual */ - err = setHwRegisterField(pDis, - E_REG_P11_AIP_CNTRL_0_RW, - E_MASKREG_P11_AIP_CNTRL_0_acr_man, 1); - RETIF_REG_FAIL(err) - } - - /* Derive M and K from X? */ - if ((ctsM == HDMITX_CTSMTS_USE_CTSX) || (ctsK == HDMITX_CTSK_USE_CTSX)) { - RETIF_BADPARAM(uCtsX == HDMITX_CTSX_UNUSED) - ctsM = (tmbslHdmiTxctsM_t) kCtsXToMK[uCtsX][0]; - ctsK = (tmbslHdmiTxctsK_t) kCtsXToMK[uCtsX][1]; - } - - /* Set the Post-divider measured timestamp factor */ - regVal = (UInt8) ctsM; - err = setHwRegisterField(pDis, E_REG_P11_CTS_N_RW, E_MASKREG_P11_CTS_N_m_sel, regVal); - RETIF_REG_FAIL(err) - - /* Set the Pre-divider scale */ - regVal = (UInt8) ctsK; - err = setHwRegisterField(pDis, E_REG_P11_CTS_N_RW, E_MASKREG_P11_CTS_N_k_sel, regVal); - RETIF_REG_FAIL(err); - - /* Use voutFmt and voutFreq to index into a lookup table to get - * the current pixel clock value. */ - pix_clk(voutFmt, voutFreq, &pixClk); - - if (pixClk != E_PIXCLK_INVALID) { - /* Set the Audio Clock Recovery N multiplier based on the audio sample - * frequency afs and current pixel clock. */ - acrN = kPixClkToAcrN[pixClk][afs]; - - /* Set ACR N multiplier [19 to 16] */ - regVal = (UInt8) (acrN >> 16); - err = setHwRegister(pDis, E_REG_P11_ACR_N_2_RW, regVal); - RETIF_REG_FAIL(err) - /* Set ACR N multiplier [15 to 8] */ - regVal = (UInt8) (acrN >> 8); - err = setHwRegister(pDis, E_REG_P11_ACR_N_1_RW, regVal); - RETIF_REG_FAIL(err) - /* Set ACR N multiplier [7 to 0] */ - regVal = (UInt8) acrN; - err = setHwRegister(pDis, E_REG_P11_ACR_N_0_RW, regVal); - RETIF_REG_FAIL(err) - - /* Set the CDC Audio Divider register based on the audio sample frequency - * afs and current pixel clock. */ - regVal = kPixClkToAdiv[pixClk][afs]; - err = setHwRegister(pDis, E_REG_P02_AUDIO_DIV_RW, regVal); - RETIF_REG_FAIL(err) - - /* If auto CTS, get CTS value based on the audio sample - * frequency afs and current pixel clock. */ - if (uCts == HDMITX_CTS_AUTO) { - uCts = kPixClkToAcrCts[pixClk][afs]; - } - } - - /* Set manual or pixel clock CTS */ - if (uCts != HDMITX_CTS_AUTO) { - /* Set manual ACR CTS [19 to 16 */ - regVal = (UInt8) (uCts >> 16); - err = setHwRegister(pDis, E_REG_P11_ACR_CTS_2_RW, regVal); - RETIF_REG_FAIL(err) - /* Set manual ACR CTS [15 to 8] */ - regVal = (UInt8) (uCts >> 8); - err = setHwRegister(pDis, E_REG_P11_ACR_CTS_1_RW, regVal); - RETIF_REG_FAIL(err) - /* Set manual ACR CTS [7 to 0] */ - regVal = (UInt8) uCts; - err = setHwRegister(pDis, E_REG_P11_ACR_CTS_0_RW, regVal); - RETIF_REG_FAIL(err) - } - - /* Set the CTS clock reference register according to ctsRef */ - regVal = (UInt8) ctsRef; - err = setHwRegisterField(pDis, - E_REG_P00_AIP_CLKSEL_W, E_MASKREG_P00_AIP_CLKSEL_sel_fs, regVal); - RETIF_REG_FAIL(err) - - /* Reset and release the CTS generator */ - err = setHwRegisterFieldTable(pDis, &kResetCtsGenerator[0]); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989AudioOutSetChanStatus */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989AudioOutSetChanStatus - (tmUnitSelect_t txUnit, - tmbslHdmiTxAudioData_t pcmIdentification, - tmbslHdmiTxCSformatInfo_t formatInfo, - tmbslHdmiTxCScopyright_t copyright, - UInt8 categoryCode, - tmbslHdmiTxafs_t sampleFreq, - tmbslHdmiTxCSclkAcc_t clockAccuracy, - tmbslHdmiTxCSmaxWordLength_t maxWordLength, - tmbslHdmiTxCSwordLength_t wordLength, tmbslHdmiTxCSorigAfs_t origSampleFreq) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[4]; /* Buffer to hold channel status data */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return if sink is not an HDMI device */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameters */ - RETIF_BADPARAM(formatInfo >= HDMITX_CSFI_INVALID) - RETIF_BADPARAM(copyright >= HDMITX_CSCOPYRIGHT_INVALID) - RETIF_BADPARAM(sampleFreq > HDMITX_AFS_NOT_INDICATED) - RETIF_BADPARAM(clockAccuracy >= HDMITX_CSCLK_INVALID) - RETIF_BADPARAM(maxWordLength >= HDMITX_CSMAX_INVALID) - RETIF_BADPARAM(wordLength >= HDMITX_CSWORD_INVALID) - RETIF_BADPARAM(wordLength == HDMITX_CSWORD_RESVD) - RETIF_BADPARAM(origSampleFreq >= HDMITX_CSAFS_INVALID) - RETIF_BADPARAM(pcmIdentification >= HDMITX_AUDIO_DATA_INVALID) - - /* Prepare Byte 0 */ - buf[0] = - ((UInt8) formatInfo << 3) | ((UInt8) copyright << 2) | ((UInt8) pcmIdentification << 1); - - /* Prepare Byte 1 */ - buf[1] = categoryCode; - - /* Prepare Byte 3 - note Byte 2 not in sequence in TDA9983 register map */ - buf[2] = ((UInt8) clockAccuracy << 4) | kAfsToCSbyte3[sampleFreq]; - - /* Prepare Byte 4 */ - buf[3] = ((UInt8) origSampleFreq << 4) | ((UInt8) wordLength << 1) | (UInt8) maxWordLength; - - /* Write 4 Channel Status bytes */ - err = setHwRegisters(pDis, E_REG_P11_CH_STAT_B_0_RW, &buf[0], 4); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989AudioOutSetChanStatusMapping */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989AudioOutSetChanStatusMapping - (tmUnitSelect_t txUnit, - UInt8 sourceLeft[4], UInt8 channelLeft[4], UInt8 sourceRight[4], UInt8 channelRight[4] - ) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[2]; /* Buffer to hold channel status data */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return if sink is not an HDMI device */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameters */ - RETIF_BADPARAM(sourceLeft[0] > HDMITX_CS_SOURCES_MAX) - RETIF_BADPARAM(channelLeft[0] > HDMITX_CS_CHANNELS_MAX) - RETIF_BADPARAM(sourceRight[0] > HDMITX_CS_SOURCES_MAX) - RETIF_BADPARAM(channelRight[0] > HDMITX_CS_CHANNELS_MAX) - - /* Prepare Left byte */ - buf[0] = ((UInt8) channelLeft[0] << 4) | (UInt8) sourceLeft[0]; - - /* Prepare Right byte */ - buf[1] = ((UInt8) channelRight[0] << 4) | (UInt8) sourceRight[0]; - - /* Write 2 Channel Status bytes */ - err = setHwRegisters(pDis, E_REG_P11_CH_STAT_B_2_ap0_l_RW, &buf[0], 2); - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989AudioOutSetMute */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989AudioOutSetMute(tmUnitSelect_t txUnit, tmbslHdmiTxaMute_t aMute) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return if sink is not an HDMI device */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameters */ - RETIF_BADPARAM(aMute >= HDMITX_AMUTE_INVALID) - - /* audio mute workaround, un-map audio input before muting */ - if (aMute == HDMITX_AMUTE_ON) { - err = setHwRegisterField(pDis, - E_REG_P00_SR_REG_W, - E_MASKREG_P00_SR_REG_sr_audio, (UInt8) aMute); - RETIF(err != TM_OK, err) - - - err = setHwRegisterField(pDis, - E_REG_P00_SR_REG_W, - E_MASKREG_P00_SR_REG_sr_audio, (UInt8) !aMute); - RETIF(err != TM_OK, err) - - } - - /* Reset the audio FIFO to mute audio */ - err = setHwRegisterField(pDis, - E_REG_P11_AIP_CNTRL_0_RW, - E_MASKREG_P11_AIP_CNTRL_0_rst_fifo, (UInt8) aMute); - RETIF(err != TM_OK, err) - - - return TM_OK; - -} - -/*============================================================================*/ -/* tmbslTDA9989ScalerGet */ -/*============================================================================*/ - -tmErrorCode_t tmbslTDA9989ScalerGet(tmUnitSelect_t txUnit, tmbslHdmiTxScalerDiag_t *pScalerDiag) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(pScalerDiag); /* else not referenced */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - - -/*============================================================================*/ -/* tmbslTDA9989ScalerGetMode */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989ScalerGetMode(tmUnitSelect_t txUnit, tmbslHdmiTxScaMode_t *pScalerMode) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(pScalerMode); /* else is declared but not used */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989ScalerInDisable */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989ScalerInDisable(tmUnitSelect_t txUnit, Bool bDisable) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(bDisable); - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989ScalerSetCoeffs */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989ScalerSetCoeffs(tmUnitSelect_t txUnit, tmbslHdmiTxScaLut_t lutSel, UInt8 *pVsLut) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(lutSel); /* else is declared but not used */ - DUMMY_ACCESS(pVsLut); /* else is declared but not used */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - - -/*============================================================================*/ -/* tmbslTDA9989ScalerSetFieldOrder */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989ScalerSetFieldOrder - (tmUnitSelect_t txUnit, - tmbslHdmiTxIntExt_t topExt, - tmbslHdmiTxIntExt_t deExt, tmbslHdmiTxTopSel_t topSel, tmbslHdmiTxTopTgl_t topTgl) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(deExt); /* else is declared but not used */ - DUMMY_ACCESS(topExt); /* else is declared but not used */ - DUMMY_ACCESS(topSel); /* else is declared but not used */ - DUMMY_ACCESS(topTgl); /* else is declared but not used */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989ScalerSetPhase */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989ScalerSetPhase(tmUnitSelect_t txUnit, tmbslHdmiTxHPhases_t horizontalPhases) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(horizontalPhases); /* else is declared but not used */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989ScalerSetLatency */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989ScalerSetLatency(tmUnitSelect_t txUnit, UInt8 scaler_latency) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(scaler_latency); /* else is declared but not used */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989ScalerSetFine */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989ScalerSetFine(tmUnitSelect_t txUnit, UInt16 uRefPix, UInt16 uRefLine) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(uRefPix); /* else is declared but not used */ - DUMMY_ACCESS(uRefLine); /* else is declared but not used */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989ScalerSetSync */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989ScalerSetSync - (tmUnitSelect_t txUnit, tmbslHdmiTxVsMeth_t method, tmbslHdmiTxVsOnce_t once) { - DUMMY_ACCESS(txUnit); /* else not referenced */ - DUMMY_ACCESS(method); /* else is declared but not used */ - DUMMY_ACCESS(once); /* else is declared but not used */ - return TMBSL_ERR_HDMI_NOT_SUPPORTED; - -} - -/*============================================================================*/ -/* tmbslTDA9989TmdsSetOutputs */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989TmdsSetOutputs(tmUnitSelect_t txUnit, tmbslHdmiTxTmdsOut_t tmdsOut) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(tmdsOut >= HDMITX_TMDSOUT_INVALID) - - /* Set the TMDS output mode */ - err = setHwRegisterField(pDis, - E_REG_P02_BUFFER_OUT_RW, - E_MASKREG_P02_BUFFER_OUT_srl_force, (UInt8) tmdsOut); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989TmdsSetSerializer */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989TmdsSetSerializer(tmUnitSelect_t txUnit, UInt8 uPhase2, UInt8 uPhase3) { - - DUMMY_ACCESS(txUnit); - DUMMY_ACCESS(uPhase2); - DUMMY_ACCESS(uPhase3); - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989TestSetPattern */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989TestSetPattern(tmUnitSelect_t txUnit, tmbslHdmiTxTestPattern_t pattern) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 serviceMode; /* Register value */ - UInt8 bars8; /* Register value */ - UInt8 buf[MATRIX_PRESET_SIZE]; /* Temp buffer */ - UInt8 i; /* Loop index */ - UInt8 *MatrixCoeff = Null; - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check pattern parameters */ - switch (pattern) { - case HDMITX_PATTERN_CBAR4: - serviceMode = 1; - bars8 = 0; - break; - case HDMITX_PATTERN_BLUE: - MatrixCoeff = (UInt8 *) &MatrixCoeffBlueScreen[pDis->voutMode][0]; - serviceMode = 1; - bars8 = 1; - break; - case HDMITX_PATTERN_BLACK: - MatrixCoeff = (UInt8 *) &MatrixCoeffBlackScreen[pDis->voutMode][0]; - case HDMITX_PATTERN_CBAR8: - serviceMode = 1; - bars8 = 1; - break; - case HDMITX_PATTERN_OFF: - serviceMode = 0; - bars8 = 0; - break; - default: - return TMBSL_ERR_HDMI_BAD_PARAMETER; - } - - if (serviceMode) { - if (!pDis->prevPattern) { /* if a pattern is on, registers are already saved */ - /* The kBypassColourProc registers are saved in tmbslTDA9989VideoSetInOut API */ - /* Bypass up/down sampler and matrix for RGB colourbars */ - setHwRegisterFieldTable(pDis, &kBypassColourProc[0]); - } - if ((pattern == HDMITX_PATTERN_BLUE) || (pattern == HDMITX_PATTERN_BLACK)) { /* blue or black screen pattern */ - - /* To create blue or black screen, we use the internal color bar 8 on which we apply a matrix to change it to blue or black */ - /* Set the first block byte separately, as it is shadowed and can't - * be set by setHwRegisters */ - - /* Set the first block byte separately, as it is shadowed and can't - * be set by setHwRegisters */ - err = setHwRegister(pDis, E_REG_P00_MAT_CONTRL_W, MatrixCoeff[0]); - RETIF_REG_FAIL(err) - - for (i = 0; i < MATRIX_PRESET_SIZE; i++) { - buf[i] = MatrixCoeff[i]; - } - - /* Set the rest of the block */ - err = setHwRegisters(pDis, - E_REG_P00_MAT_OI1_MSB_W, - &buf[1], MATRIX_PRESET_SIZE - 1); - RETIF_REG_FAIL(err) - pDis->prevFilterPattern = True; - } else { /* colour bars patterns */ - - /* Set number of colour bars */ - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_0_W, - E_MASKREG_P00_HVF_CNTRL_0_rwb, bars8); - RETIF_REG_FAIL(err) - - /* Bypass up/down sampler and matrix for RGB colourbars */ - setHwRegisterFieldTable(pDis, &kBypassColourProc[0]); - } - pDis->prevPattern = True; - } else { /* serviceMode == 0 */ - - if (pDis->prevFilterPattern) { - /* Restore the previous Matrix when pattern goes off */ - err = - tmbslTDA9989MatrixSetConversion(txUnit, pDis->vinFmt, pDis->vinMode, - pDis->voutFmt, pDis->voutMode, - pDis->dviVqr); - RETIF_REG_FAIL(err) - - pDis->prevFilterPattern = False; - } - /* Restore kBypassColourProc registers when pattern goes off */ - setHwRegister(pDis, E_REG_P00_MAT_CONTRL_W, gMatContrl[txUnit]); - setHwRegister(pDis, E_REG_P00_HVF_CNTRL_0_W, gHvfCntrl0[txUnit]); - setHwRegister(pDis, E_REG_P00_HVF_CNTRL_1_W, gHvfCntrl1[txUnit]); - pDis->prevPattern = False; - } - - /* Set Service Mode on or off */ - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_0_W, - E_MASKREG_P00_HVF_CNTRL_0_sm, serviceMode); -#ifdef TMFL_HDCP_SUPPORT - pDis->HDCPIgnoreEncrypt = True; /* Skip the next encrypt IT */ -#endif /* TMFL_HDCP_SUPPORT */ - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoInSetBlanking */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoInSetBlanking - (tmUnitSelect_t txUnit, - tmbslHdmiTxBlnkSrc_t blankitSource, tmbslHdmiTxBlnkCode_t blankingCodes) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(blankitSource >= HDMITX_BLNKSRC_INVALID) - RETIF_BADPARAM(blankingCodes >= HDMITX_BLNKCODE_INVALID) - - /* For each parameter that is not No Change, set its register */ - if (blankitSource != HDMITX_BLNKSRC_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_blankit, (UInt8) blankitSource); - RETIF_REG_FAIL(err) - } - if (blankingCodes != HDMITX_BLNKCODE_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_blc, (UInt8) blankingCodes); - RETIF_REG_FAIL(err) - } - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoInSetConfig */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoInSetConfig - (tmUnitSelect_t txUnit, - tmbslHdmiTxVinMode_t vinMode, - tmbslHdmiTxVidFmt_t voutFmt, - tmbslHdmiTx3DStructure_t structure3D, - tmbslHdmiTxPixEdge_t sampleEdge, - tmbslHdmiTxPixRate_t pixRate, tmbslHdmiTxUpsampleMode_t upsampleMode) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(vinMode >= HDMITX_VINMODE_INVALID) - RETIF_BADPARAM(sampleEdge >= HDMITX_PIXEDGE_INVALID) - RETIF_BADPARAM(pixRate >= HDMITX_PIXRATE_INVALID) - RETIF_BADPARAM(upsampleMode >= HDMITX_UPSAMPLE_INVALID) - - err = InputConfig(pDis, - vinMode, - sampleEdge, - pixRate, upsampleMode, HDMITX_PIXREP_NO_CHANGE, voutFmt, structure3D); - RETIF_REG_FAIL(err) - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoInSetFine */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoInSetFine - (tmUnitSelect_t txUnit, - tmbslHdmiTxPixSubpkt_t subpacketCount, tmbslHdmiTxPixTogl_t toggleClk1) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(subpacketCount >= HDMITX_PIXSUBPKT_INVALID) - RETIF_BADPARAM(toggleClk1 >= HDMITX_PIXTOGL_INVALID) - - /* IF subpacketCount is Fix at 0/1/2/3 THEN set subpacket count register - * to 0/1/2/3 and set subpacket sync register to 3 - */ - if (subpacketCount <= HDMITX_PIXSUBPKT_FIX_3) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_5_W, - E_MASKREG_P00_VIP_CNTRL_5_sp_cnt, (UInt8) subpacketCount); - RETIF_REG_FAIL(err) - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_sp_sync, - HDMITX_PIXSUBPKT_SYNC_FIXED); - RETIF_REG_FAIL(err) - } - /* ELSE IF subpacketCount is Sync by Hemb/ Sync by Rising Edge DE/ - * Sync by Rising Edge HS THEN set the unused subpacket count to zero and - * set subpacket sync register to 0/1/2 - */ - else if (subpacketCount != HDMITX_PIXSUBPKT_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_5_W, - E_MASKREG_P00_VIP_CNTRL_5_sp_cnt, HDMITX_PIXSUBPKT_FIX_0); - RETIF_REG_FAIL(err) - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_sp_sync, - (UInt8) (subpacketCount - - HDMITX_PIXSUBPKT_SYNC_FIRST)); - RETIF_REG_FAIL(err) - } - - /* IF toggleClk1 is not No Change THEN set ckcase bitfield */ - if (toggleClk1 != HDMITX_PIXTOGL_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_5_W, - E_MASKREG_P00_VIP_CNTRL_5_ckcase, (UInt8) toggleClk1); - RETIF_REG_FAIL(err) - } - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoInSetMapping */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989VideoInSetMapping -#ifdef TMFL_RGB_DDR_12BITS - (tmUnitSelect_t txUnit, UInt8 *pSwapTable, UInt8 *pMirrorTable, UInt8 *pMux) -#else - (tmUnitSelect_t txUnit, UInt8 *pSwapTable, UInt8 *pMirrorTable) -#endif -{ - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - Int i; /* Loop counter */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(pSwapTable == Null) - RETIF_BADPARAM(pMirrorTable == Null) - for (i = 0; i < HDMITX_VIN_PORT_MAP_TABLE_LEN; i++) { - RETIF_BADPARAM(pSwapTable[i] >= HDMITX_VIN_PORT_SWAP_INVALID) - RETIF_BADPARAM(pMirrorTable[i] >= HDMITX_VIN_PORT_MIRROR_INVALID) - } - - /* IF pswapTable[n] is not No Change THEN set the port swap registers from - * pswapTable[n] - */ - for (i = 0; i < HDMITX_VIN_PORT_MAP_TABLE_LEN; i++) { - if (pSwapTable[0] < HDMITX_VIN_PORT_SWAP_NO_CHANGE) { - err = setHwRegisterField(pDis, - kRegVip[i].Register, - kRegVip[i].MaskSwap, pSwapTable[i]); - RETIF_REG_FAIL(err) - } - } - - /* IF pMirrorTable[n] is not No Change THEN set the port mirror registers - * from pMirrorTable[n] - */ - for (i = 0; i < HDMITX_VIN_PORT_MAP_TABLE_LEN; i++) { - if (pMirrorTable[0] < HDMITX_VIN_PORT_MIRROR_NO_CHANGE) { - err = setHwRegisterField(pDis, - kRegVip[i].Register, - kRegVip[i].MaskMirror, pMirrorTable[i]); - RETIF_REG_FAIL(err) - } - } - -#ifdef TMFL_RGB_DDR_12BITS - /* - mux for RGB_DDR_12bits - */ - err = setHwRegister(pDis, E_REG_P00_MUX_VP_VIP_OUT_RW, *pMux); - RETIF_REG_FAIL(err); -#endif - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989SetVideoPortConfig */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989SetVideoPortConfig - (tmUnitSelect_t txUnit, UInt8 *pEnaVideoPortTable, UInt8 *pGndVideoPortTable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(pEnaVideoPortTable == Null) - RETIF_BADPARAM(pGndVideoPortTable == Null) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_0_RW, pEnaVideoPortTable[0]); - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_1_RW, pEnaVideoPortTable[1]); - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_2_RW, pEnaVideoPortTable[2]); - RETIF_REG_FAIL(err) - - /* err = setHwRegister(pDis, - E_REG_P00_GND_VP_0_RW, - pGndVideoPortTable[0]); - RETIF_REG_FAIL(err) */ - /* err = setHwRegister(pDis, - E_REG_P00_GND_VP_1_RW, - pGndVideoPortTable[1]); - RETIF_REG_FAIL(err) */ - /* err = setHwRegister(pDis, - E_REG_P00_GND_VP_2_RW, - pGndVideoPortTable[2]); - RETIF_REG_FAIL(err) */ - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989SetAudioPortConfig */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989SetAudioPortConfig - (tmUnitSelect_t txUnit, UInt8 *pEnaAudioPortTable, UInt8 *pGndAudioPortTable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(pEnaAudioPortTable == Null) - RETIF_BADPARAM(pGndAudioPortTable == Null) - - err = setHwRegister(pDis, E_REG_P00_ENA_AP_RW, pEnaAudioPortTable[0]); - RETIF_REG_FAIL(err) - - /* err = setHwRegister(pDis, - E_REG_P00_GND_AP_RW, - pGndAudioPortTable[0]); - RETIF_REG_FAIL(err) */ - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989SetAudioClockPortConfig */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989SetAudioClockPortConfig - (tmUnitSelect_t txUnit, UInt8 *pEnaAudioClockPortTable, UInt8 *pGndAudioClockPortTable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(pEnaAudioClockPortTable == Null) - RETIF_BADPARAM(pGndAudioClockPortTable == Null) - - err = setHwRegister(pDis, E_REG_P00_ENA_ACLK_RW, pEnaAudioClockPortTable[0]); - RETIF_REG_FAIL(err) - - /*err = setHwRegister(pDis, - E_REG_P00_GND_ACLK_RW, - pGndAudioClockPortTable[0]); - RETIF_REG_FAIL(err) */ - return TM_OK; -} - -/*============================================================================*/ -/* set_video replace E_REG_P00_VIDFORMAT_W register */ -/* use it for new video format */ -/*============================================================================*/ -tmErrorCode_t set_video(tmHdmiTxobject_t *pDis, tmbslHdmiTxVidFmt_t reg_idx, - tmHdmiTxVidReg_t *format_param) -{ - tmErrorCode_t err; - UInt8 regVal; - - regVal = 0x00; /* PR1570 FIXED */ - err = setHwRegister(pDis, E_REG_P00_VIDFORMAT_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].nPix; - err = setHwRegister(pDis, E_REG_P00_NPIX_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].nPix >> 8); - err = setHwRegister(pDis, E_REG_P00_NPIX_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].nLine; - err = setHwRegister(pDis, E_REG_P00_NLINE_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].nLine >> 8); - err = setHwRegister(pDis, E_REG_P00_NLINE_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].VsLineStart; - err = setHwRegister(pDis, E_REG_P00_VS_LINE_STRT_1_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].VsPixStart; - err = setHwRegister(pDis, E_REG_P00_VS_PIX_STRT_1_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].VsPixStart >> 8); - err = setHwRegister(pDis, E_REG_P00_VS_PIX_STRT_1_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].VsLineEnd; - err = setHwRegister(pDis, E_REG_P00_VS_LINE_END_1_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].VsPixEnd; - err = setHwRegister(pDis, E_REG_P00_VS_PIX_END_1_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].VsPixEnd >> 8); - err = setHwRegister(pDis, E_REG_P00_VS_PIX_END_1_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].HsStart; - err = setHwRegister(pDis, E_REG_P00_HS_PIX_START_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].HsStart >> 8); - err = setHwRegister(pDis, E_REG_P00_HS_PIX_START_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].HsEnd; - err = setHwRegister(pDis, E_REG_P00_HS_PIX_STOP_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].HsEnd >> 8); - err = setHwRegister(pDis, E_REG_P00_HS_PIX_STOP_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].ActiveVideoStart; - err = setHwRegister(pDis, E_REG_P00_VWIN_START_1_LSB_W, regVal); - RETIF_REG_FAIL(err); - err = setHwRegister(pDis, E_REG_P00_VWIN_START_1_MSB_W, 0); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].ActiveVideoEnd; - err = setHwRegister(pDis, E_REG_P00_VWIN_END_1_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].ActiveVideoEnd >> 8); - err = setHwRegister(pDis, E_REG_P00_VWIN_END_1_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].DeStart; - err = setHwRegister(pDis, E_REG_P00_DE_START_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].DeStart >> 8); - err = setHwRegister(pDis, E_REG_P00_DE_START_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].DeEnd; - err = setHwRegister(pDis, E_REG_P00_DE_STOP_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) (format_param[reg_idx].DeEnd >> 8); - err = setHwRegister(pDis, E_REG_P00_DE_STOP_MSB_W, regVal); - RETIF_REG_FAIL(err); - -#ifdef TMFL_RGB_DDR_12BITS - if (format_param[reg_idx].ActiveSpaceStart) { - /* enable active space */ - err = setHwRegisterField(pDis, E_REG_P00_ENABLE_SPACE_W, 0x01, 0x01); - RETIF_REG_FAIL(err); - - /* set active space to black */ - err = setHwRegister(pDis, E_REG_P00_VSPACE_Y_DATA_W, 0x00); - RETIF_REG_FAIL(err); - - err = setHwRegister(pDis, E_REG_P00_VSPACE_U_DATA_W, 0x80); - RETIF_REG_FAIL(err); - - err = setHwRegister(pDis, E_REG_P00_VSPACE_V_DATA_W, 0x80); - RETIF_REG_FAIL(err); - - /* active space definition */ - regVal = (UInt8) format_param[reg_idx].ActiveSpaceStart; - err = setHwRegister(pDis, E_REG_P00_VSPACE_START_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) ((format_param[reg_idx].ActiveSpaceStart >> 8) & 0x0F); - err = setHwRegister(pDis, E_REG_P00_VSPACE_START_MSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) format_param[reg_idx].ActiveSpaceEnd; - err = setHwRegister(pDis, E_REG_P00_VSPACE_END_LSB_W, regVal); - RETIF_REG_FAIL(err); - - regVal = (UInt8) ((format_param[reg_idx].ActiveSpaceEnd >> 8) & 0x0F); - err = setHwRegister(pDis, E_REG_P00_VSPACE_END_MSB_W, regVal); - RETIF_REG_FAIL(err); - } else { - /* let incoming pixels feel the active space (if any) */ - err = setHwRegisterField(pDis, E_REG_P00_ENABLE_SPACE_W, 0x01, 0x00); - RETIF_REG_FAIL(err); - } -#endif - - return TM_OK; -} - - -/*============================================================================*/ -/* tmbslTDA9989VideoInSetSyncAuto */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoInSetSyncAuto - (tmUnitSelect_t txUnit, - tmbslHdmiTxSyncSource_t syncSource, - tmbslHdmiTxVidFmt_t vinFmt, - tmbslHdmiTxVinMode_t vinMode, tmbslHdmiTx3DStructure_t structure3D) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 reg_idx, reg_idx3D; /* Video i/p fmt value used for comparison */ - UInt8 embedded; /* Register value */ - UInt8 syncMethod; /* Sync method */ - UInt8 toggleV; /* V toggle */ - UInt8 toggleH; /* H toggle */ - UInt8 toggleX; /* X toggle */ - UInt16 uRefPix; /* Output refpix */ - UInt16 uRefLine; /* Output refline */ -#ifdef FORMAT_PC - UInt8 regVal; /* PR1570 FIXED */ -#endif /* FORMAT_PC */ - struct sync_desc *sync; - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err); - - /* Check parameters - syncSource must be specified */ - RETIF_BADPARAM(syncSource >= HDMITX_SYNCSRC_NO_CHANGE); - RETIF_BADPARAM(!IS_VALID_FMT(vinFmt)); - - /* Look up the VIDFORMAT register format from the register format table */ - /* Quit if the input format does not map to the register format */ - RETIF_BADPARAM(reg_vid_fmt(vinFmt, structure3D, ®_idx, ®_idx3D, &sync)); - - /* Select values according to sync source */ - embedded = 0; - switch (syncSource) { - case HDMITX_SYNCSRC_EXT_VS: - syncMethod = 0; - toggleV = sync[BASE(reg_idx)].v_toggle; - toggleH = sync[BASE(reg_idx)].h_toggle; - toggleX = 0; - uRefPix = sync[BASE(reg_idx)].hfp; - uRefLine = sync[BASE(reg_idx)].vfp; - break; - case HDMITX_SYNCSRC_EMBEDDED: - embedded++; - /* fall thru */ - case HDMITX_SYNCSRC_EXT_VREF: - default: - syncMethod = 1; - toggleV = 1; - toggleH = 1; - toggleX = 1; - uRefPix = sync[BASE(reg_idx)].href; - uRefLine = sync[BASE(reg_idx)].vref; - break; - } - /* Table has +1 added to refpix values which are not needed in - RGB444, YUV444 and YUV422 modes, but +2 is required in those cases */ - if (vinMode != HDMITX_VINMODE_CCIR656) { - uRefPix = uRefPix + 2; - } - - /* ---------------------------------------------------------- */ - /* Synchronicity software workaround issue number 106 */ - /* ---------------------------------------------------------- */ - if (vinMode == HDMITX_VINMODE_CCIR656) { - if (syncSource == HDMITX_SYNCSRC_EXT_VS) { - if (pDis->pixRate == HDMITX_PIXRATE_DOUBLE) { - - switch (reg_idx) { - case E_REGVFMT_720x480p_60Hz: - case E_REGVFMT_720x480i_60Hz: - case E_REGVFMT_720x576p_50Hz: - case E_REGVFMT_720x576i_50Hz: - uRefPix = uRefPix + 1; - break; - default: - /* do nothing... well I would say : FIXME */ - break; - } - - } - } - } - - - /* Set embedded sync */ - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, E_MASKREG_P00_VIP_CNTRL_3_emb, embedded); - RETIF_REG_FAIL(err) - - /* Set sync method */ - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_0_W, - E_MASKREG_P00_TBG_CNTRL_0_sync_mthd, syncMethod); - RETIF_REG_FAIL(err) - -/* pr_debug("DBG auto toggle X:%d V:%d H:%d\n",toggleX,toggleV,toggleH); */ - /* Set VH toggle */ - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_v_tgl, toggleV); - RETIF_REG_FAIL(err) - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_h_tgl, toggleH); - RETIF_REG_FAIL(err) - - /* Set X toggle */ - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_x_tgl, toggleX); - RETIF_REG_FAIL(err); - -#ifdef TMFL_RGB_DDR_12BITS - if (syncSource == HDMITX_SYNCSRC_EXT_VREF) { - if (structure3D == HDMITX_3D_FRAME_PACKING) { - /* - stereo sync signaling : - ----------------------- - - When there is a positive sync at the input pins, therefore a negative sync - at input of the TBG, then 3d_neg_vs signal has to be set at 1 (OR-function) - to create the correct VS to preset the line and pixel counters - - case Vs > 0: - ----------- - Vs : __/¨¨\__ - Vs(TBG): ¨¨\__/¨¨ where Vs(TBG)=NOT(Vs) - 3D : ¨¨\_____ - Stereo : ¨¨\__/¨¨ where Stereo = Vs(TBG) OR 3D because 3d_neg_vs = 1 - - case Vs < 0: - ----------- - Vs : ¨¨\__/¨¨ - Vs(TBG): __/¨¨\__ where Vs(TBG)=NOT(Vs) - 3D : ¨¨\_____ - Stereo : __/¨¨\__ where Stereo = Vs(TBG) AND NOT(3D) because 3d_neg_vs = 0 - - - It is possible to invert the incoming VS, HS and DE. In case of 3D format - the DE input will be the 3D signal. This signal will only be used to remove - 1 of the VS depending on the polarity of the 3D signal. When there is a need - to switch the Left or Right it is possible to invert the 3D signal with an - already existing register. - - */ - - err = setHwRegisterField(pDis, - E_REG_P00_VIDFORMAT_W, - E_MASKREG_P00_VIDFORMAT_3d_neg_vs, toggleV); - RETIF_REG_FAIL(err); - } - err = setHwRegisterField(pDis, - E_REG_P00_VIDFORMAT_W, - E_MASKREG_P00_VIDFORMAT_3d, - (structure3D == HDMITX_3D_FRAME_PACKING)); - RETIF_REG_FAIL(err); - } -#endif - - - if (EXTRA(reg_idx) && (structure3D != HDMITX_3D_FRAME_PACKING)) { - /* 2d extra video format */ - RETIF_REG_FAIL(set_video - (pDis, BASE(reg_idx), (tmHdmiTxVidReg_t *) format_param_extra)); - } else if (EXTRA(reg_idx3D) && (structure3D == HDMITX_3D_FRAME_PACKING)) { - /* 3d extra frame packing */ - RETIF_REG_FAIL(set_video - (pDis, BASE(reg_idx3D), (tmHdmiTxVidReg_t *) format_param_extra)); - } else { - /* see video set up using E_REG_P00_VIDFORMAT_W */ - } - - -#ifdef FORMAT_PC - - if (IS_PC(vinFmt)) { - RETIF_REG_FAIL(set_video(pDis, reg_idx, (tmHdmiTxVidReg_t *) format_param_PC)); - - regVal = DEPTH_COLOR_PC; - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_1_W, - E_MASKREG_P00_HVF_CNTRL_1_pad, regVal); - RETIF_REG_FAIL(err); - } -#endif /* FORMAT_PC */ - - /* Set refpix, refline */ - err = setHwRegisterMsbLsb(pDis, E_REG_P00_REFPIX_MSB_W, uRefPix); - RETIF_REG_FAIL(err) - err = setHwRegisterMsbLsb(pDis, E_REG_P00_REFLINE_MSB_W, uRefLine); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoInSetSyncManual */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoInSetSyncManual - (tmUnitSelect_t txUnit, - tmbslHdmiTxSyncSource_t syncSource, - tmbslHdmiTxVsMeth_t syncMethod, - tmbslHdmiTxPixTogl_t toggleV, - tmbslHdmiTxPixTogl_t toggleH, tmbslHdmiTxPixTogl_t toggleX, UInt16 uRefPix, UInt16 uRefLine) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 embedded; /* Register value */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(syncSource >= HDMITX_SYNCSRC_INVALID) - RETIF_BADPARAM(syncMethod >= HDMITX_VSMETH_INVALID) - RETIF_BADPARAM(toggleV >= HDMITX_PIXTOGL_INVALID) - RETIF_BADPARAM(toggleH >= HDMITX_PIXTOGL_INVALID) - RETIF_BADPARAM(toggleX >= HDMITX_PIXTOGL_INVALID) - RETIF_BADPARAM(uRefPix >= HDMITX_VOUT_FINE_PIXEL_INVALID) - RETIF_BADPARAM(uRefLine >= HDMITX_VOUT_FINE_LINE_INVALID) - - if (syncSource != HDMITX_SYNCSRC_NO_CHANGE) { - if (syncSource == HDMITX_SYNCSRC_EMBEDDED) { - embedded = 1; - } else { - embedded = 0; - } - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_emb, embedded); - RETIF_REG_FAIL(err) - } - if (syncMethod != HDMITX_VSMETH_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_0_W, - E_MASKREG_P00_TBG_CNTRL_0_sync_mthd, (UInt8) syncMethod); - RETIF_REG_FAIL(err) - } -/* pr_debug("DBG manual toggle X:%d V:%d H:%d\n",toggleX,toggleV,toggleH); */ - if (toggleV != HDMITX_PIXTOGL_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_v_tgl, (UInt8) toggleV); - RETIF_REG_FAIL(err) - } - if (toggleH != HDMITX_PIXTOGL_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_h_tgl, (UInt8) toggleH); - RETIF_REG_FAIL(err) - } - if (toggleX != HDMITX_PIXTOGL_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_x_tgl, (UInt8) toggleX); - RETIF_REG_FAIL(err) - } - if (uRefPix < HDMITX_VOUT_FINE_PIXEL_NO_CHANGE) { - err = setHwRegisterMsbLsb(pDis, E_REG_P00_REFPIX_MSB_W, uRefPix); - RETIF_REG_FAIL(err) - } - if (uRefLine < HDMITX_VOUT_FINE_LINE_NO_CHANGE) { - err = setHwRegisterMsbLsb(pDis, E_REG_P00_REFLINE_MSB_W, uRefLine); - RETIF_REG_FAIL(err) - } - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoOutDisable */ -/*============================================================================*/ - -tmErrorCode_t tmbslTDA9989VideoOutDisable(tmUnitSelect_t txUnit, Bool bDisable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(bDisable > True) - - /* Set or clear frame_dis in the scaler Timebase Control 0 register - * according to bDisable - */ - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_0_W, - E_MASKREG_P00_TBG_CNTRL_0_frame_dis, (UInt8) bDisable); - if (bDisable) { - setState(pDis, EV_OUTDISABLE); - } - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989VideoOutSetConfig */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoOutSetConfig - (tmUnitSelect_t txUnit, - tmbslHdmiTxSinkType_t sinkType, - tmbslHdmiTxVoutMode_t voutMode, - tmbslHdmiTxVoutPrefil_t preFilter, - tmbslHdmiTxVoutYuvBlnk_t yuvBlank, tmbslHdmiTxVoutQrange_t quantization) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; /* Register value */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(sinkType >= HDMITX_SINK_INVALID) - RETIF_BADPARAM(voutMode >= HDMITX_VOUTMODE_INVALID) - RETIF_BADPARAM(preFilter >= HDMITX_VOUT_PREFIL_INVALID) - RETIF_BADPARAM(yuvBlank >= HDMITX_VOUT_YUV_BLNK_INVALID) - RETIF_BADPARAM(quantization >= HDMITX_VOUT_QRANGE_INVALID) - - if (sinkType == HDMITX_SINK_EDID) { - if (pDis->EdidStatus == HDMITX_EDID_NOT_READ) { - /* EDID has not been read so assume simplest sink */ - pDis->sinkType = HDMITX_SINK_DVI; - } else { - /* EDID has been read so set sink to the type that was read */ - pDis->sinkType = pDis->EdidSinkType; - } - } else { - /* Set demanded sink type */ - pDis->sinkType = sinkType; - } - - /* Is DVI sink required? */ - if (pDis->sinkType == HDMITX_SINK_DVI) { - /* Mute the audio FIFO */ - err = setHwRegisterField(pDis, - E_REG_P11_AIP_CNTRL_0_RW, - E_MASKREG_P11_AIP_CNTRL_0_rst_fifo, 1); - RETIF_REG_FAIL(err) - - /* Force RGB mode for DVI sink */ - voutMode = HDMITX_VOUTMODE_RGB444; - - /* Set HDMI HDCP mode off for DVI */ - err = setHwRegisterFieldTable(pDis, &kVoutHdcpOff[0]); - RETIF_REG_FAIL(err); - - HDCP_F1; - - err = setHwRegisterField(pDis, - E_REG_P11_ENC_CNTRL_RW, - E_MASKREG_P11_ENC_CNTRL_ctl_code, regVal); - RETIF_REG_FAIL(err) - } else { - /* Unmute the audio FIFO */ - err = setHwRegisterField(pDis, - E_REG_P11_AIP_CNTRL_0_RW, - E_MASKREG_P11_AIP_CNTRL_0_rst_fifo, 0); - RETIF_REG_FAIL(err) - - /* Set HDMI HDCP mode on for HDMI */ - /* Also sets E_MASKREG_P11_ENC_CNTRL_ctl_code */ - err = setHwRegisterFieldTable(pDis, &kVoutHdcpOn[0]); - RETIF_REG_FAIL(err) - } - - /* For each parameter that is not No Change, set its register */ - if (voutMode != HDMITX_VOUTMODE_NO_CHANGE) { - /* Save the output mode for later use by the matrix & downsampler */ - pDis->voutMode = voutMode; - } - if (preFilter < HDMITX_VOUT_PREFIL_NO_CHANGE) { -#ifdef TMFL_HDCP_OPTIMIZED_POWER - /* - power management : - freeze/wakeup SPDIF clock - */ - err = setHwRegisterField(pDis, E_REG_FEAT_POWER_DOWN, - E_MASKREG_FEAT_POWER_DOWN_prefilt, - (preFilter == HDMITX_VOUT_PREFIL_OFF)); - RETIF_REG_FAIL(err); -#endif - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_0_W, - E_MASKREG_P00_HVF_CNTRL_0_prefil, (UInt8) preFilter); - RETIF_REG_FAIL(err) - } - if (yuvBlank < HDMITX_VOUT_YUV_BLNK_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_1_W, - E_MASKREG_P00_HVF_CNTRL_1_yuvblk, (UInt8) yuvBlank); - RETIF_REG_FAIL(err) - } - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoOutSetSync */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoOutSetSync - (tmUnitSelect_t txUnit, - tmbslHdmiTxVsSrc_t srcH, - tmbslHdmiTxVsSrc_t srcV, - tmbslHdmiTxVsSrc_t srcX, tmbslHdmiTxVsTgl_t toggle, tmbslHdmiTxVsOnce_t once) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 reg_idx; - struct sync_desc *sync; - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(srcH >= HDMITX_VSSRC_INVALID) - RETIF_BADPARAM(srcV >= HDMITX_VSSRC_INVALID) - RETIF_BADPARAM(srcX >= HDMITX_VSSRC_INVALID) - RETIF_BADPARAM(toggle >= HDMITX_VSTGL_INVALID) - RETIF_BADPARAM(once >= HDMITX_VSONCE_INVALID) - - /* For each parameter that is not No Change, set its register */ - if (srcH != HDMITX_VSSRC_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_1_W, - E_MASKREG_P00_TBG_CNTRL_1_vhx_ext_hs, (UInt8) srcH); - RETIF_REG_FAIL(err) - } - if (srcV != HDMITX_VSSRC_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_1_W, - E_MASKREG_P00_TBG_CNTRL_1_vhx_ext_vs, (UInt8) srcV); - RETIF_REG_FAIL(err) - } - if (srcX != HDMITX_VSSRC_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_1_W, - E_MASKREG_P00_TBG_CNTRL_1_vhx_ext_de, (UInt8) srcX); - RETIF_REG_FAIL(err) - } - { - /* Hs Vs polarity fix */ - /* set polarity back when VIDFORMAT_TABLE (E_REG_P00_VIDFORMAT_W) is not used */ - RETIF_BADPARAM(reg_vid_fmt(pDis->vinFmt, 0, ®_idx, 0, &sync)); - if (EXTRA(reg_idx)) { - toggle = E_MASKREG_P00_TBG_CNTRL_1_vh_tgl & - (0x04 | sync[BASE(reg_idx)].v_toggle | sync[BASE(reg_idx)].h_toggle); - } - } - - - if (toggle != HDMITX_VSTGL_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_1_W, - E_MASKREG_P00_TBG_CNTRL_1_vh_tgl, (UInt8) toggle); -/* pr_debug("DBG toogl CNTRL1:%d\n",toggle); */ - RETIF_REG_FAIL(err) - } - if (once != HDMITX_VSONCE_NO_CHANGE) { - /* Must be last register set */ - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_0_W, - E_MASKREG_P00_TBG_CNTRL_0_sync_once, (UInt8) once); - RETIF_REG_FAIL(err) - } - - /* Toggle TMDS serialiser force flags - stability fix */ - err = setHwRegisterField(pDis, - E_REG_P02_BUFFER_OUT_RW, - E_MASKREG_P02_BUFFER_OUT_srl_force, - (UInt8) HDMITX_TMDSOUT_FORCED0); - RETIF_REG_FAIL(err) - err = setHwRegisterField(pDis, - E_REG_P02_BUFFER_OUT_RW, - E_MASKREG_P02_BUFFER_OUT_srl_force, - (UInt8) HDMITX_TMDSOUT_NORMAL); - RETIF_REG_FAIL(err) - - - if (once == HDMITX_VSONCE_ONCE) { - /* Toggle output Sync Once flag for settings to take effect */ - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_0_W, - E_MASKREG_P00_TBG_CNTRL_0_sync_once, - (UInt8) HDMITX_VSONCE_EACH_FRAME); - RETIF_REG_FAIL(err) - err = setHwRegisterField(pDis, - E_REG_P00_TBG_CNTRL_0_W, - E_MASKREG_P00_TBG_CNTRL_0_sync_once, - (UInt8) HDMITX_VSONCE_ONCE); - RETIF_REG_FAIL(err) - } - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989VideoSetInOut */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989VideoSetInOut - (tmUnitSelect_t txUnit, - tmbslHdmiTxVidFmt_t vinFmt, - tmbslHdmiTx3DStructure_t structure3D, - tmbslHdmiTxScaMode_t scaModeRequest, - tmbslHdmiTxVidFmt_t voutFmt, - UInt8 uPixelRepeat, - tmbslHdmiTxMatMode_t matMode, tmbslHdmiTxVoutDbits_t datapathBits, tmbslHdmiTxVQR_t dviVqr) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - tmbslHdmiTxScaMode_t scaMode; /* Scaler mode */ - UInt8 reg_idx, reg_idx3D; /* Video o/p format value used for register */ - UInt8 regVal; - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(!IS_VALID_FMT(vinFmt)) - RETIF_BADPARAM(!IS_VALID_FMT(voutFmt)) - - RETIF_BADPARAM(scaModeRequest >= HDMITX_SCAMODE_INVALID) - RETIF_BADPARAM(uPixelRepeat >= HDMITX_PIXREP_INVALID) - RETIF_BADPARAM(matMode >= HDMITX_MATMODE_INVALID) - RETIF_BADPARAM(datapathBits >= HDMITX_VOUT_DBITS_INVALID) - - scaMode = HDMITX_SCAMODE_OFF; - pDis->scaMode = HDMITX_SCAMODE_OFF; - - /* Get current input format if it must not change */ - if (vinFmt == HDMITX_VFMT_NO_CHANGE) { - RETIF(pDis->vinFmt == HDMITX_VFMT_NULL, TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - vinFmt = pDis->vinFmt; - } else { - pDis->vinFmt = vinFmt; - pDis->h3dFpOn = (structure3D == HDMITX_3D_FRAME_PACKING); - -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - - if (IS_TV(pDis->vinFmt)) { - - err = setHwRegister(pDis, E_REG_P00_TIMER_H_W, 0); - RETIF(err != TM_OK, err); - - err = setHwRegister(pDis, E_REG_P00_NDIV_IM_W, kndiv_im[vinFmt]); - RETIF(err != TM_OK, err); - - err = setHwRegister(pDis, E_REG_P12_TX3_RW, kclk_div[vinFmt]); - RETIF(err != TM_OK, err); - - } else { - - err = - setHwRegister(pDis, E_REG_P00_TIMER_H_W, - E_MASKREG_P00_TIMER_H_im_clksel); - RETIF(err != TM_OK, err); - err = setHwRegister(pDis, E_REG_P12_TX3_RW, 17); - RETIF(err != TM_OK, err); - } -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - - - } - - /* Get current output format if it must not change */ - if (voutFmt == HDMITX_VFMT_NO_CHANGE) { - RETIF(pDis->voutFmt == HDMITX_VFMT_NULL, TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - voutFmt = pDis->voutFmt; - } else { - pDis->voutFmt = voutFmt; - } - if (pDis->voutMode == HDMITX_VOUTMODE_RGB444) { - if ((pDis->voutFmt >= HDMITX_VFMT_02_720x480p_60Hz) && (IS_TV(pDis->voutFmt))) { - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_1_W, - E_MASKREG_P00_HVF_CNTRL_1_vqr, - (UInt8) HDMITX_VOUT_QRANGE_RGB_YUV); - RETIF_REG_FAIL(err) - } else { /*Format PC or VGA */ - - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_1_W, - E_MASKREG_P00_HVF_CNTRL_1_vqr, - (UInt8) HDMITX_VOUT_QRANGE_FS); - RETIF_REG_FAIL(err) - } - } else { - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_1_W, - E_MASKREG_P00_HVF_CNTRL_1_vqr, - (UInt8) HDMITX_VOUT_QRANGE_YUV); - RETIF_REG_FAIL(err); - } - - /* Set pixel repetition - sets pixelRepeatCount, used by setScalerFormat */ - err = setPixelRepeat(pDis, voutFmt, uPixelRepeat, structure3D); - RETIF(err != TM_OK, err); - - /* If scaler mode is auto then set mode based on input and output format */ - if (scaMode != HDMITX_SCAMODE_NO_CHANGE) { - /* Set scaler clock */ - regVal = 0; - if ((pDis->pixelRepeatCount > HDMITX_PIXREP_MIN) && - (pDis->pixelRepeatCount <= HDMITX_PIXREP_MAX)) { - regVal = 2; - } else if (pDis->vinMode == HDMITX_VINMODE_CCIR656) { - regVal = (UInt8) ((pDis->scaMode == HDMITX_SCAMODE_ON) ? 0 : 1); - - if (pDis->pixRate == HDMITX_PIXRATE_DOUBLE) { - regVal = 0; - } - } - - err = setHwRegisterField(pDis, - E_REG_P02_SEL_CLK_RW, - E_MASKREG_P02_SEL_CLK_sel_vrf_clk, regVal); - RETIF_REG_FAIL(err); - - /* Look up the VIDFORMAT register format from the register format table */ - RETIF_BADPARAM(reg_vid_fmt(vinFmt, structure3D, ®_idx, ®_idx3D, 0)); - - /* Set format register for the selected output format voutFmt */ - if (PREFETCH(reg_idx3D) && (structure3D == HDMITX_3D_FRAME_PACKING)) { - /* embedded 3D video format */ - err = setHwRegister(pDis, E_REG_P00_VIDFORMAT_W, reg_idx3D); - } else if (PREFETCH(reg_idx) && (structure3D != HDMITX_3D_FRAME_PACKING)) { - /* embedded 2D video format */ -/* pr_debug("DBG %s E_REG_P00_VIDFORMAT_W used\n",__func__); */ - err = setHwRegister(pDis, E_REG_P00_VIDFORMAT_W, reg_idx); - } else { - /* see video set up using set_video() */ - } - RETIF_REG_FAIL(err); - - } - - /* Set VS and optional DE */ - err = setDeVs(pDis, voutFmt, structure3D); - RETIF(err != TM_OK, err); - - /* If matrix mode is auto then set mode based on input and output format */ - if (matMode != HDMITX_MATMODE_NO_CHANGE) { - if (matMode == HDMITX_MATMODE_AUTO) { - err = tmbslTDA9989MatrixSetConversion(txUnit, vinFmt, - pDis->vinMode, voutFmt, - pDis->voutMode, pDis->dviVqr); - } else { - err = tmbslTDA9989MatrixSetMode(txUnit, HDMITX_MCNTRL_OFF, - HDMITX_MSCALE_NO_CHANGE); - } - RETIF(err != TM_OK, err) - } - - /* Set upsampler and downsampler */ - err = setSampling(pDis); - RETIF(err != TM_OK, err) - - /* Set colour component bit depth */ - if (datapathBits != HDMITX_VOUT_DBITS_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_1_W, - E_MASKREG_P00_HVF_CNTRL_1_pad, (UInt8) datapathBits); - RETIF_REG_FAIL(err) - } - - /* Save kBypassColourProc registers before pattern goes on */ - getHwRegister(pDis, E_REG_P00_MAT_CONTRL_W, &gMatContrl[txUnit]); - getHwRegister(pDis, E_REG_P00_HVF_CNTRL_0_W, &gHvfCntrl0[txUnit]); - getHwRegister(pDis, E_REG_P00_HVF_CNTRL_1_W, &gHvfCntrl1[txUnit]); - - setState(pDis, EV_SETINOUT); - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989MatrixSetCoeffs */ -/*============================================================================*/ - -tmErrorCode_t tmbslTDA9989MatrixSetCoeffs(tmUnitSelect_t txUnit, tmbslHdmiTxMatCoeff_t *pMatCoeff) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - Int i; /* Loop index */ - UInt8 buf[HDMITX_MAT_COEFF_NUM * 2]; /* Temp buffer */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pMatCoeff == (tmbslHdmiTxMatCoeff_t *) 0) - for (i = 0; i < HDMITX_MAT_COEFF_NUM; i++) { - RETIF_BADPARAM((pMatCoeff->Coeff[i] < HDMITX_MAT_OFFSET_MIN) || - (pMatCoeff->Coeff[i] > HDMITX_MAT_OFFSET_MAX)) - } - - /* Convert signed 11 bit values from Coeff array to pairs of MSB-LSB - * register values, and write to register pairs - */ - for (i = 0; i < HDMITX_MAT_COEFF_NUM; i++) { - /* Mask & copy MSB */ - buf[i * 2] = (UInt8) (((UInt16) pMatCoeff->Coeff[i] & 0x0700) >> 8); - /* Copy LSB */ - buf[(i * 2) + 1] = (UInt8) ((UInt16) pMatCoeff->Coeff[i] & 0x00FF); - } - err = setHwRegisters(pDis, E_REG_P00_MAT_P11_MSB_W, &buf[0], HDMITX_MAT_COEFF_NUM * 2); - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989MatrixSetConversion */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989MatrixSetConversion - (tmUnitSelect_t txUnit, - tmbslHdmiTxVidFmt_t vinFmt, - tmbslHdmiTxVinMode_t vinMode, - tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTxVoutMode_t voutMode, tmbslHdmiTxVQR_t dviVqr) { - tmHdmiTxobject_t *pDis; /* Ptr to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - tmbslTDA9989Colourspace_t cspace_in; /* Input colourspaces */ - tmbslTDA9989Colourspace_t cspace_out; /* Output colourspaces */ - Int matrixIndex; /* Index into matrix preset array */ - UInt8 buf[MATRIX_PRESET_SIZE]; /* Temp buffer */ - UInt8 i; /* Loop index */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(!IS_VALID_FMT(vinFmt)) - RETIF_BADPARAM(!IS_VALID_FMT(voutFmt)) - /* NB: NO_CHANGE is not valid for this function, so limit to actual values */ - RETIF_BADPARAM(vinMode >= HDMITX_VINMODE_NO_CHANGE) - /* NB: NO_CHANGE is not valid for this function, so limit to actual values */ - RETIF_BADPARAM(voutMode >= HDMITX_VOUTMODE_NO_CHANGE) - - /* Since vinMode and voutMode are different types, we don't use a local - function to do this and use inline code twice */ - /* Calculate input colour space */ - switch (vinFmt) { /* Catch the HD modes */ - case HDMITX_VFMT_04_1280x720p_60Hz: - case HDMITX_VFMT_05_1920x1080i_60Hz: - case HDMITX_VFMT_16_1920x1080p_60Hz: - case HDMITX_VFMT_19_1280x720p_50Hz: - case HDMITX_VFMT_20_1920x1080i_50Hz: - case HDMITX_VFMT_31_1920x1080p_50Hz: - case HDMITX_VFMT_32_1920x1080p_24Hz: - case HDMITX_VFMT_33_1920x1080p_25Hz: - case HDMITX_VFMT_34_1920x1080p_30Hz: - case HDMITX_VFMT_60_1280x720p_24Hz: - case HDMITX_VFMT_61_1280x720p_25Hz: - case HDMITX_VFMT_62_1280x720p_30Hz: - - if (vinMode == HDMITX_VINMODE_RGB444) { /* RGB */ - cspace_in = HDMITX_CS_RGB_LIMITED; - } else { /* CCIR656, YUV444, YU422 */ - - cspace_in = HDMITX_CS_YUV_ITU_BT709; - } - break; - default: /* Now all the SD modes */ - if (vinMode == HDMITX_VINMODE_RGB444) { /* we're RGB */ - cspace_in = HDMITX_CS_RGB_LIMITED; - } else { /* CCIR656, YUV444, YU422 */ - - cspace_in = HDMITX_CS_YUV_ITU_BT601; - } - break; - } - -/* } */ - - /* Calculate output colour space */ -#ifdef FORMAT_PC - if (IS_PC(voutFmt)) { - /* Catch the PC formats */ - cspace_in = HDMITX_CS_RGB_FULL; /* PR1570 FIXED */ - cspace_out = HDMITX_CS_RGB_FULL; - } else { -#endif - switch (voutFmt) { /* Catch the HD modes */ - case HDMITX_VFMT_04_1280x720p_60Hz: - case HDMITX_VFMT_05_1920x1080i_60Hz: - case HDMITX_VFMT_16_1920x1080p_60Hz: - case HDMITX_VFMT_19_1280x720p_50Hz: - case HDMITX_VFMT_20_1920x1080i_50Hz: - case HDMITX_VFMT_31_1920x1080p_50Hz: - case HDMITX_VFMT_32_1920x1080p_24Hz: - case HDMITX_VFMT_33_1920x1080p_25Hz: - case HDMITX_VFMT_34_1920x1080p_30Hz: - case HDMITX_VFMT_60_1280x720p_24Hz: - case HDMITX_VFMT_61_1280x720p_25Hz: - case HDMITX_VFMT_62_1280x720p_30Hz: - - if (voutMode == HDMITX_VOUTMODE_RGB444) { /* RGB */ - cspace_out = HDMITX_CS_RGB_LIMITED; - } else { /* YUV444 or YUV422 */ - - cspace_out = HDMITX_CS_YUV_ITU_BT709; - } - break; - default: /* Now all the SD modes */ - if (voutMode == HDMITX_VOUTMODE_RGB444) { /* RGB */ - cspace_out = HDMITX_CS_RGB_LIMITED; - } else { /* YUV444 or YUV422 */ - - cspace_out = HDMITX_CS_YUV_ITU_BT601; - } - break; - } -#ifdef FORMAT_PC - } -#endif - -#ifdef TMFL_HDCP_OPTIMIZED_POWER - /* - power management : - freeze/wakeup color space conversion clock - */ - err = setHwRegisterField(pDis, E_REG_FEAT_POWER_DOWN, - E_MASKREG_FEAT_POWER_DOWN_csc, (cspace_in == cspace_out)); - RETIF_REG_FAIL(err); -#endif - - if (cspace_in == cspace_out) { - /* Switch off colour matrix by setting bypass flag */ - err = setHwRegisterField(pDis, - E_REG_P00_MAT_CONTRL_W, - E_MASKREG_P00_MAT_CONTRL_mat_bp, 1); - } else { - /* Load appropriate values into matrix - we have preset blocks of - * 31 register vales in a table, just need to work out which set to use - */ - matrixIndex = kMatrixIndex[cspace_in][cspace_out]; - - /* Set the first block byte separately, as it is shadowed and can't - * be set by setHwRegisters */ - err = setHwRegister(pDis, E_REG_P00_MAT_CONTRL_W, kMatrixPreset[matrixIndex][0]); - RETIF_REG_FAIL(err) - - for (i = 0; i < MATRIX_PRESET_SIZE; i++) { - buf[i] = kMatrixPreset[matrixIndex][i]; - } - - /* Set the rest of the block */ - err = setHwRegisters(pDis, - E_REG_P00_MAT_OI1_MSB_W, &buf[1], MATRIX_PRESET_SIZE - 1); - } - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989MatrixSetInputOffset */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989MatrixSetInputOffset(tmUnitSelect_t txUnit, tmbslHdmiTxMatOffset_t *pMatOffset) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - Int i; /* Loop index */ - UInt8 buf[HDMITX_MAT_OFFSET_NUM * 2]; /* Temp buffer */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pMatOffset == (tmbslHdmiTxMatOffset_t *) 0) - for (i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) { - RETIF_BADPARAM((pMatOffset->Offset[i] < HDMITX_MAT_OFFSET_MIN) || - (pMatOffset->Offset[i] > HDMITX_MAT_OFFSET_MAX)) - } - - /* Convert signed 11 bit values from Offset array to pairs of MSB-LSB - * register values, and write to register pairs - */ - for (i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) { - /* Mask & copy MSB */ - buf[i * 2] = (UInt8) (((UInt16) pMatOffset->Offset[i] & 0x0700) >> 8); - /* Copy LSB */ - buf[(i * 2) + 1] = (UInt8) ((UInt16) pMatOffset->Offset[i] & 0x00FF); - } - err = setHwRegisters(pDis, E_REG_P00_MAT_OI1_MSB_W, &buf[0], HDMITX_MAT_OFFSET_NUM * 2); - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989MatrixSetMode */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989MatrixSetMode - (tmUnitSelect_t txUnit, tmbslHdmiTxmCntrl_t mControl, tmbslHdmiTxmScale_t mScale) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM((mControl > HDMITX_MCNTRL_MAX) || (mScale > HDMITX_MSCALE_MAX)) - - /* For each value that is not NoChange, update the appropriate register */ - if (mControl != HDMITX_MCNTRL_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_MAT_CONTRL_W, - E_MASKREG_P00_MAT_CONTRL_mat_bp, (UInt8) mControl); - RETIF_REG_FAIL(err) - } - - if (mScale != HDMITX_MSCALE_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_MAT_CONTRL_W, - E_MASKREG_P00_MAT_CONTRL_mat_sc, (UInt8) mScale); - RETIF_REG_FAIL(err) - } - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989MatrixSetOutputOffset */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989MatrixSetOutputOffset(tmUnitSelect_t txUnit, tmbslHdmiTxMatOffset_t *pMatOffset) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - Int i; /* Loop index */ - UInt8 buf[HDMITX_MAT_OFFSET_NUM * 2]; /* Temp buffer */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM(pMatOffset == (tmbslHdmiTxMatOffset_t *) 0) - for (i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) { - RETIF_BADPARAM((pMatOffset->Offset[i] < HDMITX_MAT_OFFSET_MIN) || - (pMatOffset->Offset[i] > HDMITX_MAT_OFFSET_MAX)) - } - - /* Convert signed 11 bit values from Offset array to pairs of MSB-LSB - * register values, and write to register pairs - */ - for (i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) { - /* Mask & copy MSB */ - buf[i * 2] = (UInt8) (((UInt16) pMatOffset->Offset[i] & 0x0700) >> 8); - /* Copy LSB */ - buf[(i * 2) + 1] = (UInt8) ((UInt16) pMatOffset->Offset[i] & 0x00FF); - } - err = setHwRegisters(pDis, E_REG_P00_MAT_OO1_MSB_W, &buf[0], HDMITX_MAT_OFFSET_NUM * 2); - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989PktSetAclkRecovery */ -/*============================================================================*/ - -tmErrorCode_t tmbslTDA9989PktSetAclkRecovery(tmUnitSelect_t txUnit, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - /* Write the ACR packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_acr, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetAcp */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989PktSetAcp - (tmUnitSelect_t txUnit, tmbslHdmiTxPkt_t *pPkt, UInt byteCnt, UInt8 uAcpType, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[3]; /* Temp buffer to hold header bytes */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Only supported for device N4 or later */ - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - RETIF_BADPARAM(byteCnt > HDMITX_PKT_DATA_BYTE_CNT) - RETIF(byteCnt == 0, TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - - /* Data to change, start by clearing ACP packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_acp, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare ACP header */ - buf[0] = 0x04; /* ACP packet */ - buf[1] = uAcpType; - buf[2] = 0; /* Reserved [HDMI 1.2] */ - - - /* Write 3 header bytes to registers */ - err = setHwRegisters(pDis, E_REG_P11_ACP_HB0_RW, &buf[0], 3); - RETIF_REG_FAIL(err) - - /* Write "byteCnt" bytes of data to registers */ - err = setHwRegisters(pDis, - E_REG_P11_ACP_PB0_RW, - &pPkt->dataByte[0], (UInt16) byteCnt); - RETIF_REG_FAIL(err) - } - - /* Write the ACP packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_acp, (UInt8) bEnable); - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989PktSetAudioInfoframe */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989PktSetAudioInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktAif_t *pPkt, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[9]; /* Temp buffer to hold header/packet bytes */ - UInt16 bufReg; /* Base register used for writing InfoFrame */ - UInt16 flagReg; /* Flag register to be used */ - UInt8 flagMask; /* Mask used for writing flag register */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - RETIF_BADPARAM(pPkt->CodingType > 0x0F) - RETIF_BADPARAM(pPkt->ChannelCount > 0x07) - RETIF_BADPARAM(pPkt->SampleFreq > 0x07) - RETIF_BADPARAM(pPkt->SampleSize > 0x03) - /* No need to check ChannelAlloc - all values are allowed */ - RETIF_BADPARAM((pPkt->DownMixInhibit != True) && - (pPkt->DownMixInhibit != False)) - RETIF_BADPARAM(pPkt->LevelShift > 0x0F) - } - - /* Only supported for device N4 or later */ - - /* We're using n4 or later, use IF4 buffer for Audio InfoFrame */ - bufReg = E_REG_P10_IF4_HB0_RW; - flagReg = E_REG_P11_DIP_IF_FLAGS_RW; - flagMask = E_MASKREG_P11_DIP_IF_FLAGS_if4; - - if (pPkt != Null) { - /* Data to change, start by clearing AIF packet insertion flag */ - err = setHwRegisterField(pDis, flagReg, flagMask, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare AIF header */ - buf[0] = 0x84; /* Audio InfoFrame */ - buf[1] = 0x01; /* Version 1 [HDMI 1.2] */ - buf[2] = 0x0A; /* Length [HDMI 1.2] */ - - /* Prepare AIF packet (byte numbers offset by 3) */ - buf[0 + 3] = 0; /* Preset checksum to zero so calculation works! */ - buf[1 + 3] = ((pPkt->CodingType & 0x0F) << 4) | (pPkt->ChannelCount & 0x07); /* CT3-0, CC2-0 */ - buf[2 + 3] = ((pPkt->SampleFreq & 0x07) << 2) | (pPkt->SampleSize & 0x03); /* SF2-0, SS1-0 */ - buf[3 + 3] = 0; /* [HDMI 1.2] */ - buf[4 + 3] = pPkt->ChannelAlloc; /* CA7-0 */ - buf[5 + 3] = ((pPkt->LevelShift & 0x0F) << 3); /* LS3-0 */ - if (pPkt->DownMixInhibit == True) { - buf[5 + 3] += 0x80; /* DMI bit */ - } - - /* Calculate checksum - this is worked out on "Length" bytes of the - * packet, the checksum (which we've preset to zero), and the three - * header bytes. We exclude bytes PB6 to PB10 (which we - * are not writing) since they are zero. - */ - buf[0 + 3] = calculateChecksum(&buf[0], 0x0A + 1 + 3 - 5); - - /* Write header and packet bytes in one operation */ - err = setHwRegisters(pDis, bufReg, &buf[0], 9); - RETIF_REG_FAIL(err) - } - - /* Write AIF packet insertion flag */ - err = setHwRegisterField(pDis, flagReg, flagMask, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetGeneralCntrl */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989PktSetGeneralCntrl - (tmUnitSelect_t txUnit, tmbslHdmiTxaMute_t *paMute, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - if (paMute != Null) { - RETIF_BADPARAM((*paMute != HDMITX_AMUTE_OFF) && (*paMute != HDMITX_AMUTE_ON)) - - if (*paMute == HDMITX_AMUTE_ON) { - err = setHwRegister(pDis, E_REG_P11_GC_AVMUTE_RW, 0x02); - RETIF_REG_FAIL(err) - } else { - err = setHwRegister(pDis, E_REG_P11_GC_AVMUTE_RW, 0x01); - RETIF_REG_FAIL(err) - } - } - - /* Set or clear GC packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_gc, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetIsrc1 */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989PktSetIsrc1 - (tmUnitSelect_t txUnit, - tmbslHdmiTxPkt_t *pPkt, - UInt byteCnt, Bool bIsrcCont, Bool bIsrcValid, UInt8 uIsrcStatus, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[3]; /* Temp buffer to hold header bytes */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Only supported for device N4 or later */ - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - RETIF_BADPARAM((bIsrcCont != True) && (bIsrcCont != False)) - RETIF_BADPARAM((bIsrcValid != True) && (bIsrcValid != False)) - RETIF_BADPARAM(uIsrcStatus > 7) /* 3 bits */ - RETIF_BADPARAM(byteCnt > HDMITX_PKT_DATA_BYTE_CNT) - RETIF(byteCnt == 0, TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - - /* Data to change, start by clearing ISRC1 packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_isrc1, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare ISRC1 header */ - buf[0] = 0x05; /* ISRC1 packet */ - buf[1] = (uIsrcStatus & 0x07); - if (bIsrcValid == True) { - buf[1] += 0x40; - } - if (bIsrcCont == True) { - buf[1] += 0x80; - } - buf[2] = 0; /* Reserved [HDMI 1.2] */ - - /* Write 3 header bytes to registers */ - err = setHwRegisters(pDis, E_REG_P11_ISRC1_HB0_RW, &buf[0], 3); - RETIF_REG_FAIL(err) - - /* Write "byteCnt" bytes of data to registers */ - err = setHwRegisters(pDis, - E_REG_P11_ISRC1_PB0_RW, - &pPkt->dataByte[0], (UInt16) byteCnt); - RETIF_REG_FAIL(err) - } - - /* Write the ISRC1 packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_isrc1, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetIsrc2 */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989PktSetIsrc2 - (tmUnitSelect_t txUnit, tmbslHdmiTxPkt_t *pPkt, UInt byteCnt, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[3]; /* Temp buffer to hold header bytes */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Only supported for device N4 or later */ - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - RETIF_BADPARAM(byteCnt > HDMITX_PKT_DATA_BYTE_CNT) - RETIF(byteCnt == 0, TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - - /* Data to change, start by clearing ISRC2 packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_isrc2, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare ISRC2 header */ - buf[0] = 0x06; /* ISRC2 packet */ - buf[1] = 0; /* Reserved [HDMI 1.2] */ - buf[2] = 0; /* Reserved [HDMI 1.2] */ - - /* Write 3 header bytes to registers */ - err = setHwRegisters(pDis, E_REG_P11_ISRC2_HB0_RW, &buf[0], 3); - RETIF_REG_FAIL(err) - - /* Write "byteCnt" bytes of data to registers */ - err = setHwRegisters(pDis, - E_REG_P11_ISRC2_PB0_RW, - &pPkt->dataByte[0], (UInt16) byteCnt); - RETIF_REG_FAIL(err) - } - - /* Write the ISRC2 packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_isrc2, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetMpegInfoframe */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989PktSetMpegInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktMpeg_t *pPkt, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[9]; /* Temp buffer to hold packet */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Only supported for device N4 or later */ - /* Check remaining parameter(s) */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - RETIF_BADPARAM((pPkt->bFieldRepeat != True) && (pPkt->bFieldRepeat != False)) - RETIF_BADPARAM(pPkt->frameType >= HDMITX_MPEG_FRAME_INVALID) - - /* Data to change, start by clearing MPEG packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if5, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare MPEG header */ - buf[0] = 0x85; /* MPEG Source InfoFrame */ - buf[1] = 0x01; /* Version 1 [HDMI 1.2] */ - buf[2] = 0x0A; /* Length [HDMI 1.2] */ - - /* Prepare MPEG packet (byte numbers offset by 3) */ - buf[0 + 3] = 0; /* Preset checksum to zero so calculation works! */ - buf[1 + 3] = (UInt8) (pPkt->bitRate & 0x000000FF); - buf[2 + 3] = (UInt8) ((pPkt->bitRate & 0x0000FF00) >> 8); - buf[3 + 3] = (UInt8) ((pPkt->bitRate & 0x00FF0000) >> 16); - buf[4 + 3] = (UInt8) ((pPkt->bitRate & 0xFF000000) >> 24); - buf[5 + 3] = pPkt->frameType; /* MF1-0 */ - if (pPkt->bFieldRepeat == True) { - buf[5 + 3] += 0x10; /* FR0 bit */ - } - - /* Calculate checksum - this is worked out on "Length" bytes of the - * packet, the checksum (which we've preset to zero), and the three - * header bytes. We exclude bytes PB6 to PB10 (which we - * are not writing) since they are zero. - */ - buf[0 + 3] = calculateChecksum(&buf[0], 0x0A + 1 + 3 - 5); - - /* Write header and packet bytes in one operation */ - err = setHwRegisters(pDis, E_REG_P10_IF5_HB0_RW, &buf[0], 9); - RETIF_REG_FAIL(err) - } - - /* Write the MPEG packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if5, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetNullInsert */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989PktSetNullInsert(tmUnitSelect_t txUnit, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameter(s) */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - /* Set or clear FORCE_NULL packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, - E_MASKREG_P11_DIP_FLAGS_force_null, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetNullSingle */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989PktSetNullSingle(tmUnitSelect_t txUnit) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Set NULL packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_FLAGS_RW, E_MASKREG_P11_DIP_FLAGS_null, 0x01); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetSpdInfoframe */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989PktSetSpdInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktSpd_t *pPkt, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[29]; /* Temp buffer to hold packet */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Only supported for device N4 or later */ - /* Check remaining parameter(s) */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - RETIF_BADPARAM(pPkt->SourceDevInfo >= HDMITX_SPD_INFO_INVALID) - - /* Data to change, start by clearing SPD packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if3, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare SPD header */ - buf[0] = 0x83; /* Source. Product Descriptor InfoFrame */ - buf[1] = 0x01; /* Version 1 [CEA 861B] */ - buf[2] = 0x19; /* Length [HDMI 1.2] */ - - /* Prepare SPD packet (byte numbers offset by 3) */ - buf[0 + 3] = 0; /* Preset checksum to zero so calculation works! */ - lmemcpy(&buf[1 + 3], &pPkt->VendorName[0], HDMI_TX_SPD_VENDOR_SIZE); - lmemcpy(&buf[1 + 3 + HDMI_TX_SPD_VENDOR_SIZE], &pPkt->ProdDescr[0], - HDMI_TX_SPD_DESCR_SIZE); - - - buf[HDMI_TX_SPD_LENGTH + 3] = pPkt->SourceDevInfo; - - /* Calculate checksum - this is worked out on "Length" bytes of the - * packet, the checksum (which we've preset to zero), and the three - * header bytes. - */ - buf[0 + 3] = calculateChecksum(&buf[0], HDMI_TX_SPD_LENGTH + 1 + 3); - - /* Write header and packet bytes in one operation */ - err = setHwRegisters(pDis, E_REG_P10_IF3_HB0_RW, &buf[0], 29); - RETIF_REG_FAIL(err) - } - - /* Write the SPD packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if3, (UInt8) bEnable); - return err; -} - - -/*============================================================================*/ -/* tmbslTDA9989PktSetVideoInfoframe */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989PktSetVideoInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktVif_t *pPkt, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[17]; /* Temp buffer to hold header/packet bytes */ - UInt16 bufReg; /* Base register used for writing InfoFrame */ - UInt16 flagReg; /* Flag register to be used */ - UInt8 flagMask; /* Mask used for writing flag register */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - RETIF_BADPARAM(pPkt->Colour > 0x03) - RETIF_BADPARAM((pPkt->ActiveInfo != True) && (pPkt->ActiveInfo != False)) - RETIF_BADPARAM(pPkt->BarInfo > 0x03) - RETIF_BADPARAM(pPkt->ScanInfo > 0x03) - RETIF_BADPARAM(pPkt->Colorimetry > 0x03) - RETIF_BADPARAM(pPkt->PictureAspectRatio > 0x03) - RETIF_BADPARAM(pPkt->ActiveFormatRatio > 0x0F) - RETIF_BADPARAM(pPkt->Scaling > 0x03) - RETIF_BADPARAM(pPkt->VidFormat > 0x7F) - RETIF_BADPARAM(pPkt->PixelRepeat > 0x0F) - } - - /* Only supported for device N4 or later */ - - /* We're using n4 or later, use IF2 buffer for Video InfoFrame */ - bufReg = E_REG_P10_IF2_HB0_RW; - flagReg = E_REG_P11_DIP_IF_FLAGS_RW; - flagMask = E_MASKREG_P11_DIP_IF_FLAGS_if2; - - if (pPkt != Null) { - /* Data to change, start by clearing VIF packet insertion flag */ - err = setHwRegisterField(pDis, flagReg, flagMask, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare VIF header */ - buf[0] = 0x82; /* Video InfoFrame */ - buf[1] = 0x02; /* Version 2 [HDMI 1.2] */ - buf[2] = 0x0D; /* Length [HDMI 1.2] */ - - /* Prepare VIF packet (byte numbers offset by 3) */ - buf[0 + 3] = 0; /* Preset checksum to zero so calculation works! */ - buf[1 + 3] = ((pPkt->Colour & 0x03) << 5) | /* Y1-0, B1-0,S1-0 */ - ((pPkt->BarInfo & 0x03) << 2) | (pPkt->ScanInfo & 0x03); - if (pPkt->ActiveInfo == True) { - buf[1 + 3] += 0x10; /* AI bit */ - } - buf[2 + 3] = ((pPkt->Colorimetry & 0x03) << 6) | /* C1-0, M1-0, R3-0 */ - ((pPkt->PictureAspectRatio & 0x03) << 4) | (pPkt->ActiveFormatRatio & 0x0F); - buf[3 + 3] = (pPkt->Scaling & 0x03); /* SC1-0 *//* [HDMI 1.2] */ - buf[4 + 3] = (pPkt->VidFormat & 0x7F); /* VIC6-0 */ - buf[5 + 3] = (pPkt->PixelRepeat & 0x0F); /* PR3-0 */ - buf[6 + 3] = (UInt8) (pPkt->EndTopBarLine & 0x00FF); - buf[7 + 3] = (UInt8) ((pPkt->EndTopBarLine & 0xFF00) >> 8); - buf[8 + 3] = (UInt8) (pPkt->StartBottomBarLine & 0x00FF); - buf[9 + 3] = (UInt8) ((pPkt->StartBottomBarLine & 0xFF00) >> 8); - buf[10 + 3] = (UInt8) (pPkt->EndLeftBarPixel & 0x00FF); - buf[11 + 3] = (UInt8) ((pPkt->EndLeftBarPixel & 0xFF00) >> 8); - buf[12 + 3] = (UInt8) (pPkt->StartRightBarPixel & 0x00FF); - buf[13 + 3] = (UInt8) ((pPkt->StartRightBarPixel & 0xFF00) >> 8); - - /* Calculate checksum - this is worked out on "Length" bytes of the - * packet, the checksum (which we've preset to zero), and the three - * header bytes. - */ - buf[0 + 3] = calculateChecksum(&buf[0], 0x0D + 1 + 3); - - /* Write header and packet bytes in one operation */ - err = setHwRegisters(pDis, bufReg, &buf[0], 17); - RETIF_REG_FAIL(err) - } - - /* Write VIF packet insertion flag */ - err = setHwRegisterField(pDis, flagReg, flagMask, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetRawVideoInfoframe */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989PktSetRawVideoInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPktRawAvi_t *pPkt, Bool bEnable) { - - - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - /* use IF2 buffer */ - if (pPkt != Null) { - /* Data to change, start by clearing VIF packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if2, 0x00); - RETIF_REG_FAIL(err) - - - /* Write VIF raw header bytes 0-2 */ - err = setHwRegisters(pDis, E_REG_P10_IF2_HB0_RW, pPkt->HB, 3); - RETIF_REG_FAIL(err) - - /* Write VIF raw payload bytes 0-27 */ - err = setHwRegisters(pDis, E_REG_P10_IF2_PB0_RW, pPkt->PB, 28); - - RETIF_REG_FAIL(err) - - } - - /* Write VIF packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if2, (UInt8) bEnable); - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PktSetVsInfoframe */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989PktSetVsInfoframe - (tmUnitSelect_t txUnit, tmbslHdmiTxPkt_t *pPkt, UInt byteCnt, UInt8 uVersion, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 buf[31]; /* Temp buffer to hold packet */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED error if the - * sinkType is not HDMI - */ - RETIF(pDis->sinkType != HDMITX_SINK_HDMI, TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) - - /* Only supported for device N4 or later */ - /* Check remaining parameter(s) - NULL pointer allowed */ - RETIF_BADPARAM((bEnable != True) && (bEnable != False)) - - if (pPkt != Null) { - /* Pointer to structure provided so check parameters */ - /* InfoFrame needs a checksum, so 1 usable byte less than full pkt */ - RETIF_BADPARAM(byteCnt > (HDMITX_PKT_DATA_BYTE_CNT - 1)) - RETIF(byteCnt == 0, TMBSL_ERR_HDMI_INCONSISTENT_PARAMS) - - /* Data to change, start by clearing VS_IF packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if1, 0x00); - RETIF_REG_FAIL(err) - - /* Prepare VS_IF header */ - lmemset(&buf[0], 0, 31); /* Clear buffer as user may vary length used */ - buf[0] = 0x81; /* Vendor Specific InfoFrame */ - buf[1] = uVersion; /* Vendor defined version */ - buf[2] = (UInt8) byteCnt; /* Length [HDMI 1.2] */ - - /* Prepare VS_IF packet (byte numbers offset by 3) */ - buf[0 + 3] = 0; /* Preset checksum to zero so calculation works! */ - lmemcpy(&buf[1 + 3], &pPkt->dataByte[0], byteCnt); - - /* Calculate checksum - this is worked out on "Length" bytes of the - * packet, the checksum (which we've preset to zero), and the three - * header bytes. - */ - buf[0 + 3] = calculateChecksum(&buf[0], byteCnt + 1 + 3); - - /* Write header and packet bytes in one operation - write entire - * buffer even though we may not be using it all so that zeros - * are placed in the unused registers. */ - err = setHwRegisters(pDis, E_REG_P10_IF1_HB0_RW, &buf[0], 31); - RETIF_REG_FAIL(err) - } - - /* Write the VS_IF packet insertion flag */ - err = setHwRegisterField(pDis, - E_REG_P11_DIP_IF_FLAGS_RW, - E_MASKREG_P11_DIP_IF_FLAGS_if1, (UInt8) bEnable); - return err; -} - -/*============================================================================*/ -/* STATIC FUNCTIONS */ -/*============================================================================*/ - -/*===============================================================================*/ -/* reg_vid_fmt(): get register index for normal and 3D, plus sync table */ -/*===============================================================================*/ -static UInt8 reg_vid_fmt(tmbslHdmiTxVidFmt_t fmt, - tmbslHdmiTx3DStructure_t structure3D, - UInt8 *idx, UInt8 *idx3d, struct sync_desc **sync) -{ - struct vic2reg *hash; - int i; - - (*idx) = REGVFMT_INVALID; - if (idx3d) - (*idx3d) = REGVFMT_INVALID; - if (IS_TV(fmt)) { - VIC2REG_LOOP(vic2reg_TV, idx); - if (idx3d) { - if (structure3D == HDMITX_3D_FRAME_PACKING) { - /* any 3D FP prefetch ? */ - VIC2REG_LOOP(vic2reg_TV_FP, idx3d); - } - } - } -#ifdef FORMAT_PC - else { - VIC2REG_LOOP(vic2reg_PC, idx); - } -#endif - /* PR1570 FIXED */ - if (sync) { - if PREFETCH - (*idx) { - *sync = (struct sync_desc *)ref_sync; - } -#ifdef FORMAT_PC - else if PCFORMAT - (*idx) { - *sync = (struct sync_desc *)ref_sync_PC; - *idx = *idx - E_REGVFMT_MAX_EXTRA; - } -#endif /* FORMAT_PC */ - else { - *sync = (struct sync_desc *)ref_sync_extra; - } - } - return ((*idx) == REGVFMT_INVALID); -} - -/*===============================================================================*/ -/* pix_clk(): get pixel clock */ -/*===============================================================================*/ -UInt8 pix_clk(tmbslHdmiTxVidFmt_t fmt, tmbslHdmiTxVfreq_t freq, UInt8 *pclk) -{ - - (*pclk) = REGVFMT_INVALID; -#ifdef FORMAT_PC - if (IS_PC(fmt)) { - (*pclk) = kVfmtToPixClk_PC[fmt - HDMITX_VFMT_PC_MIN]; - } -#endif - if (IS_TV(fmt)) { - (*pclk) = kVfmtToPixClk_TV[fmt - HDMITX_VFMT_TV_MIN][freq]; - } - return ((*pclk) == REGVFMT_INVALID); -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(pix_clk); -#endif - -/*===============================================================================*/ -/* calculateVidFmtIndex(): Calculate table index according to video format value */ -/*===============================================================================*/ -tmbslHdmiTxVidFmt_t calculateVidFmtIndex(tmbslHdmiTxVidFmt_t vidFmt) -{ - tmbslHdmiTxVidFmt_t vidFmtIndex = vidFmt; - - /* Hanlde VIC or table index discontinuity */ - if ((vidFmt >= HDMITX_VFMT_60_1280x720p_24Hz) && (vidFmt <= HDMITX_VFMT_62_1280x720p_30Hz)) { - vidFmtIndex = - (tmbslHdmiTxVidFmt_t) (HDMITX_VFMT_INDEX_60_1280x720p_24Hz + - (vidFmt - HDMITX_VFMT_60_1280x720p_24Hz)); - } -#ifdef FORMAT_PC - else if (IS_PC(vidFmt)) { - vidFmtIndex = - (tmbslHdmiTxVidFmt_t) (HDMITX_VFMT_TV_NUM + (vidFmt - HDMITX_VFMT_PC_MIN)); - } -#endif /* FORMAT_PC */ - return (vidFmtIndex); -} - -/*============================================================================*/ -/* setDeVs */ -/*============================================================================*/ -static tmErrorCode_t - setDeVs - (tmHdmiTxobject_t *pDis, tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTx3DStructure_t structure3D) { - tmErrorCode_t err; /* Error code */ - UInt16 vsPixStrt2; /* VS pixel number for start pulse in field 2 */ - UInt8 reg_idx; /* Video format value used for register */ - struct sync_desc *sync; - - /* IF voutFmt = No Change THEN return TM_OK */ - RETIF(voutFmt == HDMITX_VFMT_NO_CHANGE, TM_OK); - - /* Quit if the output format does not map to the register format */ - RETIF_BADPARAM(reg_vid_fmt(voutFmt, structure3D, ®_idx, 0, &sync)); - - /* DE_START & DE_STOP no longer set because N2 device no longer supported */ - - /* Adjust VS_PIX_STRT_2 and VS_PIX_END_2 for interlaced output formats */ - vsPixStrt2 = sync[BASE(reg_idx)].Vs2; - err = setHwRegisterMsbLsb(pDis, E_REG_P00_VS_PIX_STRT_2_MSB_W, vsPixStrt2); - RETIF_REG_FAIL(err) - err = setHwRegisterMsbLsb(pDis, E_REG_P00_VS_PIX_END_2_MSB_W, vsPixStrt2); -/* pr_debug("DBG %s vs2:%d\n",__func__,vsPixStrt2); */ - - return err; -} - -/*============================================================================*/ -/* setPixelRepeat */ -/*============================================================================*/ -static tmErrorCode_t - setPixelRepeat - (tmHdmiTxobject_t *pDis, - tmbslHdmiTxVidFmt_t voutFmt, UInt8 uPixelRepeat, tmbslHdmiTx3DStructure_t structure3D) { - tmErrorCode_t err = TM_OK; /* Error code */ - - RETIF(voutFmt == HDMITX_VFMT_NO_CHANGE, TM_OK) - - err = InputConfig(pDis, - HDMITX_VINMODE_NO_CHANGE, - HDMITX_PIXEDGE_NO_CHANGE, - HDMITX_PIXRATE_NO_CHANGE, - HDMITX_UPSAMPLE_NO_CHANGE, uPixelRepeat, voutFmt, structure3D); - - return err; -} - -/*============================================================================*/ -/* setSampling */ -/*============================================================================*/ -static tmErrorCode_t setSampling(tmHdmiTxobject_t *pDis) { - tmErrorCode_t err; /* Error code */ - UInt8 upSample; /* 1 if upsampler must be enabled */ - UInt8 downSample; /* 1 if downsampler must be enabled */ - UInt8 matrixBypass; /*>0 if matrix has been bypassed */ - - if ((pDis->vinMode == HDMITX_VINMODE_YUV422) - || (pDis->vinMode == HDMITX_VINMODE_CCIR656)) { - if (pDis->voutMode == HDMITX_VOUTMODE_YUV422) { - /* Input 422/656, output 422 */ - err = getHwRegister(pDis, E_REG_P00_MAT_CONTRL_W, &matrixBypass); - RETIF_REG_FAIL(err) - matrixBypass &= E_MASKREG_P00_MAT_CONTRL_mat_bp; - /* Has matrix been bypassed? */ - if (matrixBypass > 0) { - upSample = 0; - downSample = 0; - } else { - upSample = 1; - downSample = 1; - } - } else { - /* Input 422/656, output not 422 */ - upSample = 1; - downSample = 0; - } - } else { - if (pDis->voutMode == HDMITX_VOUTMODE_YUV422) { - /* Input not 422/656, output 422 */ - upSample = 0; - downSample = 1; - } else { - /* Input not 422/656, output not 422 */ - upSample = 0; - downSample = 0; - } - } - - /* Check upsample mode saved by tmbslTDA9989VideoInSetConfig */ - if (pDis->upsampleMode != HDMITX_UPSAMPLE_AUTO) { - /* Saved upsample mode overrides local one */ - upSample = pDis->upsampleMode; - } - - /* Set upsampler */ - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_0_W, - E_MASKREG_P00_HVF_CNTRL_0_intpol, upSample); - RETIF_REG_FAIL(err) - - /* Set downsampler */ - err = setHwRegisterField(pDis, - E_REG_P00_HVF_CNTRL_1_W, - E_MASKREG_P00_HVF_CNTRL_1_for, downSample); - return err; -} - - -/*============================================================================*/ -/* calculateChecksum - returns the byte needed to yield a checksum of zero */ -/*============================================================================*/ -static UInt8 calculateChecksum(UInt8 *pData, /* Pointer to checksum data */ - Int numBytes /* Number of bytes over which to calculate */ - ) { - UInt8 checksum = 0; /* Working checksum calculation */ - UInt8 result = 0; /* Value to be returned */ - Int i; - - if ((pData != Null) && (numBytes > 0)) { - for (i = 0; i < numBytes; i++) { - checksum = checksum + (*(pData + i)); - } - result = (255 - checksum) + 1; - } - return result; /* returns 0 in the case of null ptr or 0 bytes */ -} - -/*============================================================================*/ -/* InputConfig */ -/*============================================================================*/ -static tmErrorCode_t - InputConfig - (tmHdmiTxobject_t *pDis, - tmbslHdmiTxVinMode_t vinMode, - tmbslHdmiTxPixEdge_t sampleEdge, - tmbslHdmiTxPixRate_t pixRate, - tmbslHdmiTxUpsampleMode_t upsampleMode, - UInt8 uPixelRepeat, tmbslHdmiTxVidFmt_t voutFmt, tmbslHdmiTx3DStructure_t structure3D) { - tmErrorCode_t err = TM_OK; /* Error code */ - UInt8 reg_idx, reg_idx3D; /* Video format value used for register */ - UInt8 ssd = 0; /* Packed srl, scg and de */ - struct sync_desc *sync; - - /****************Check Parameters********************/ - /* Check parameters */ - RETIF_BADPARAM(vinMode >= HDMITX_VINMODE_INVALID); - RETIF_BADPARAM(sampleEdge >= HDMITX_PIXEDGE_INVALID); - RETIF_BADPARAM(pixRate >= HDMITX_PIXRATE_INVALID); - RETIF_BADPARAM(upsampleMode >= HDMITX_UPSAMPLE_INVALID); - - RETIF(voutFmt == HDMITX_VFMT_NO_CHANGE, TM_OK); - RETIF_BADPARAM(!IS_VALID_FMT(voutFmt)); - - /* Quit if the output format does not map to the register format */ - RETIF_BADPARAM(reg_vid_fmt(voutFmt, structure3D, ®_idx, ®_idx3D, &sync)); - -/****************Set the VinMode************************ -- P00_VIP_CNTRL_4_ccir656 -- P00_HVF_CNTRL_1_semi_planar -- P02_PLL_SERIAL_3_srl_ccir -- P02_SEL_CLK_sel_vrf_clk -*/ - if (vinMode != HDMITX_VINMODE_NO_CHANGE) { - pDis->vinMode = vinMode; - } -/****************Set the sampleEdge*********************** --P00_VIP_CNTRL_3_edge*/ - - if (sampleEdge != HDMITX_PIXEDGE_NO_CHANGE) { - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_3_W, - E_MASKREG_P00_VIP_CNTRL_3_edge, (UInt8) sampleEdge); - RETIF_REG_FAIL(err) - } - -/****************Set the Pixel Rate*********************** --P02_CCIR_DIV_refdiv2 --P02_P02_PLL_SCG2_selpllclkin --P02_P02_PLL_DE_bypass_pllde --P00_VIP_CNTRL_4_656_alt */ - - if (pixRate != HDMITX_PIXRATE_NO_CHANGE) { - pDis->pixRate = pixRate; - } - - if ((pixRate != HDMITX_PIXRATE_NO_CHANGE) || (vinMode != HDMITX_VINMODE_NO_CHANGE)) { - switch (pDis->vinMode) { - case HDMITX_VINMODE_RGB444: - case HDMITX_VINMODE_YUV444: - - if (pDis->pixRate == HDMITX_PIXRATE_SINGLE) { - err = setHwRegisterFieldTable(pDis, &kVinMode444[0]); - - RETIF_REG_FAIL(err) - - - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - RETIF_REG_FAIL(err) - - } else if (pDis->pixRate == HDMITX_PIXRATE_SINGLE_REPEATED) { - err = setHwRegisterFieldTable(pDis, &kVinMode444[0]); - - RETIF_REG_FAIL(err) - - - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - RETIF_REG_FAIL(err) - - } else { - /* Not supported */ - } - break; - case HDMITX_VINMODE_YUV422: - if (pDis->pixRate == HDMITX_PIXRATE_SINGLE) { - err = setHwRegisterFieldTable(pDis, &kVinModeYUV422[0]); - - RETIF_REG_FAIL(err) - - - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - RETIF_REG_FAIL(err) - - } else if (pDis->pixRate == HDMITX_PIXRATE_SINGLE_REPEATED) { - err = setHwRegisterFieldTable(pDis, &kVinModeYUV422[0]); - - RETIF_REG_FAIL(err) - - - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - RETIF_REG_FAIL(err) - - } else { - /* Not supported */ - return TMBSL_ERR_HDMI_BAD_PARAMETER; - } - break; - case HDMITX_VINMODE_CCIR656: - if (pDis->pixRate == HDMITX_PIXRATE_SINGLE) { - - err = setHwRegisterFieldTable(pDis, &kVinModeCCIR656[0]); - - RETIF_REG_FAIL(err) - - - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - RETIF_REG_FAIL(err) - - } else if (pDis->pixRate == HDMITX_PIXRATE_SINGLE_REPEATED) { - err = setHwRegisterFieldTable(pDis, &kVinModeCCIR656[0]); - - RETIF_REG_FAIL(err) - - - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - RETIF_REG_FAIL(err) - - } else if (pDis->pixRate == HDMITX_PIXRATE_DOUBLE) { - err = - setHwRegisterFieldTable(pDis, - &kVinModeCCIR656_DDR_above720p[0]); - - RETIF_REG_FAIL(err) - - - - - err = setHwRegisterField(pDis, - E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 1); - RETIF_REG_FAIL(err) - - } - break; - default: - err = setHwRegisterFieldTable(pDis, &kVinMode444[0]); - - RETIF_REG_FAIL(err) - break; - } - - } - /****************Update the Sample Mode***********************/ - - if (upsampleMode != HDMITX_UPSAMPLE_NO_CHANGE) { - pDis->upsampleMode = upsampleMode; - } - -/****************Set the Pixel repeat PLL Value *********************** -- P02_PLL_SERIAL_2_srl_nosc -- P02_PLL_DE_pllde_nosc */ - - if ((structure3D == HDMITX_3D_FRAME_PACKING) && (reg_idx3D != REGVFMT_INVALID)) { - /* embedded 3D video format */ - ssd = pll[reg_idx3D]; - } else { - /* embedded 2D video format */ - ssd = pll[reg_idx]; - } - - if (ssd < SSD_UNUSED_VALUE) { - err = setHwRegisterField(pDis, E_REG_P02_PLL_SERIAL_2_RW, - E_MASKREG_P02_PLL_SERIAL_2_srl_nosc, ssd); -/* pr_debug("DBG nosc:%d\n",ssd); */ - } - -/*****************Set the Pixel Repetition*********************** -- P02_PLL_SERIAL_2_srl_pr*/ - - /* Set pixel repetition */ - if (uPixelRepeat != HDMITX_PIXREP_NO_CHANGE) { - if (uPixelRepeat == HDMITX_PIXREP_DEFAULT) { - /* Look up default pixel repeat value for this output format */ - uPixelRepeat = sync[BASE(reg_idx)].pix_rep; - } - - /* Update current pixel repetition count */ - pDis->pixelRepeatCount = uPixelRepeat; - - err = setHwRegisterField(pDis, - E_REG_P02_PLL_SERIAL_2_RW, - E_MASKREG_P02_PLL_SERIAL_2_srl_pr, uPixelRepeat); - RETIF_REG_FAIL(err) - /* Set pixel repetition count for Repetitor module */ - err = setHwRegister(pDis, E_REG_P00_RPT_CNTRL_W, uPixelRepeat); - } - -/*******************Fixe other settings********************* -- P02_PLL_SERIAL_1_srl_man_iz = 0 -- P02_PLL_SERIAL_3_srl_de = 0 -- Pol Clk Sel = P02_SERIALIZER_RW = 0 -- P02_BUFFER_OUT_srl_force = 0 -- P02_BUFFER_OUT_srl_clk = 0 -- P02_PLL_DE_pllde_iz = 0 -*/ - - err = setHwRegisterField(pDis, - E_REG_P02_PLL_SERIAL_1_RW, - E_MASKREG_P02_PLL_SERIAL_1_srl_man_iz, 0); - - - RETIF_REG_FAIL(err) - - err = setHwRegisterField(pDis, - E_REG_P02_PLL_SERIAL_3_RW, - E_MASKREG_P02_PLL_SERIAL_3_srl_de, 0); - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P02_SERIALIZER_RW, 0); - RETIF_REG_FAIL(err) - - return err; -} - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_InOut_l.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_InOut_l.h deleted file mode 100644 index 0a6e1eb7d85..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_InOut_l.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright (C) 2009 Koninklijke Philips Electronics N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of Koninklijke Philips Electronics N.V. and is confidential in - * nature. Under no circumstances is this software to be exposed to or placed - * under an Open Source License of any type without the expressed written - * permission of Koninklijke Philips Electronics N.V. - * - * \file tmbslTDA9989_InOut_l.h - * - * \version $Revision: 2 $ - * - * -*/ - -#ifndef TMBSLTDA9989_INOUT_L_H -#define TMBSLTDA9989_INOUT_L_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - -#define IS_TV(fmt) (fmt >= HDMITX_VFMT_TV_MIN && fmt <= HDMITX_VFMT_TV_MAX) -#define IS_VALID_FMT(fmt) IS_TV(fmt) -#ifdef FORMAT_PC -#define IS_PC(fmt) (fmt >= HDMITX_VFMT_PC_MIN && fmt <= HDMITX_VFMT_PC_MAX) -#define IS_VALID_FMT(fmt) (IS_TV(fmt) || IS_PC(fmt)) -#endif -#define VIC2REG_LOOP(array, idx) do { \ - hash = (struct vic2reg *)(array); \ - for (i = 0; i < (sizeof(array)/sizeof(struct vic2reg)); i++) { \ - if (hash[i].vic == fmt) { \ - (*idx) = hash[i].reg; \ - break; \ - } \ - } \ -} while (0); - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - - typedef struct { - UInt16 Register; - UInt8 MaskSwap; - UInt8 MaskMirror; - } tmbslTDA9989RegVip; - -/*============================================================================*/ -/* EXTERN DATA DEFINITION */ -/*============================================================================*/ - - extern tmHdmiTxRegMaskVal_t kCommonPllCfg[]; - -/** - * Table of PLL settings registers to configure for 480i and 576i vinFmt - */ - extern tmHdmiTxRegMaskVal_t kVfmt480i576iPllCfg[]; - -/** - * Table of PLL settings registers to configure for single mode pixel rate, - * vinFmt 480i or 576i only - */ - extern tmHdmiTxRegMaskVal_t kSinglePrateVfmt480i576iPllCfg[]; - -/** - * Table of PLL settings registers to configure for single repeated mode pixel rate, - * vinFmt 480i or 576i only - */ - extern tmHdmiTxRegMaskVal_t kSrepeatedPrateVfmt480i576iPllCfg[]; - -/** - * Table of PLL settings registers to configure for other vinFmt than 480i and 576i - */ - extern tmHdmiTxRegMaskVal_t kVfmtOtherPllCfg[]; - -/** - * Table of PLL settings registers to configure single mode pixel rate, - * vinFmt other than 480i or 576i - */ - extern tmHdmiTxRegMaskVal_t kSinglePrateVfmtOtherPllCfg[]; - -/** - * Table of PLL settings registers to configure double mode pixel rate, - * vinFmt other than 480i or 576i - */ - extern tmHdmiTxRegMaskVal_t kDoublePrateVfmtOtherPllCfg[]; - - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - extern tmbslHdmiTxVidFmt_t calculateVidFmtIndex(tmbslHdmiTxVidFmt_t vidFmt); - - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLTDA9989_INOUT_L_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Misc.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Misc.c deleted file mode 100644 index 9cbc6b102d6..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Misc.c +++ /dev/null @@ -1,2251 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_misc.c - * - * \version %version: 3 % - * - * -*/ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#include -#endif - -#include "tmbslHdmiTx_types.h" -#include "tmbslTDA9989_Functions.h" -#include "tmbslTDA9989_local.h" -#include "tmbslTDA9989_HDCP_l.h" -#include "tmbslTDA9989_State_l.h" -#include "tmbslTDA9989_InOut_l.h" -#include "tmbslTDA9989_Edid_l.h" -#include "tmbslTDA9989_Misc_l.h" - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS EXPORTED */ -/*============================================================================*/ - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS */ -/*============================================================================*/ - -/** Preset default values for an object instance */ -static tmHdmiTxobject_t kHdmiTxInstanceDefault = { - ST_UNINITIALIZED, /* state */ - 0, /* nIgnoredEvents */ - tmUnit0, /* txUnit */ - 0, /* uHwAddress */ - (ptmbslHdmiTxSysFunc_t) 0, /* sysFuncWrite */ - (ptmbslHdmiTxSysFunc_t) 0, /* sysFuncRead */ - (ptmbslHdmiTxSysFuncEdid_t) 0, /* sysFuncEdidRead */ - (ptmbslHdmiTxSysFuncTimer_t) 0, /* sysFuncTimer */ - { /* funcIntCallbacks[] */ - (ptmbslHdmiTxCallback_t) 0}, - 0, /* InterruptsEnable */ - { /* uSupportedVersions[] */ - E_DEV_VERSION_N2, - E_DEV_VERSION_TDA19989, - E_DEV_VERSION_TDA19989_N2, - E_DEV_VERSION_TDA19988, - E_DEV_VERSION_LIST_END}, - E_DEV_VERSION_LIST_END, /* uDeviceVersion */ - E_DEV_VERSION_LIST_END, /* uDeviceFeatures */ - (tmbslHdmiTxPowerState_t) tmPowerOff, /* ePowerState */ - False, /* EdidAlternateAddr */ - HDMITX_SINK_DVI, /* sinkType */ - HDMITX_SINK_DVI, /* EdidSinkType */ - False, /* EdidSinkAi */ - 0, /* EdidCeaFlags */ - - 0, /* EdidCeaXVYCCFlags */ - { - False, /* latency_available */ - False, /* Ilatency_available */ - 0, /* Edidvideo_latency */ - 0, /* Edidaudio_latency */ - 0, /* EdidIvideo_latency */ - 0}, /* EdidIaudio_latency */ - - { - 0, /* maximum supported TMDS clock */ - 0, /* content type Graphics (text) */ - 0, /* content type Photo */ - 0, /* content type Cinema */ - 0, /* content type Game */ - 0, /* additional video format */ - 0, /* 3D support by the HDMI Sink */ - 0, /* 3D multi strctures present */ - 0, /* additional info for the values in the image size area */ - 0, /* total length of 3D video formats */ - 0, /* total length of extended video formats */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* max_len-10, ie: 31-10=21 */ - }, - - HDMITX_EDID_NOT_READ, /* EdidStatus */ - 0, /* NbDTDStored */ - { /* EdidDTD: *//* * NUMBER_DTD_STORED */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*1 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*2 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*3 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*4 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*5 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*6 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*7 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*8 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*9 */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /*10 */ - }, - { /* EdidMonitorDescriptor */ - False, /* bDescRecord */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* uMonitorName[EDID_MONITOR_DESCRIPTOR_SIZE] */ - }, - { - False, /* bDescRecord */ - 0, /* uMinVerticalRate */ - 0, /* uMaxVerticalRate */ - 0, /* uMinHorizontalRate */ - 0, /* uMaxHorizontalRate */ - 0 /* uMaxSupportedPixelClk */ - }, - { - False, /* bDescRecord */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* uOtherDescriptor[EDID_MONITOR_DESCRIPTOR_SIZE] */ - }, - { /* EdidVFmts[] */ - HDMITX_VFMT_NULL}, - 0, /* EdidSvdCnt */ - { /* EdidAFmts[]. */ - {0, 0, 0} /* {ModeChans, Freqs, Byte3} */ - }, - 0, /* EdidSadCnt */ - { - 0 /* EdidBlock[ ] */ - }, - 0, /* EdidBlockCnt */ - 0, /* EdidSourceAddress */ - 0, /* EdidBlockRequested */ - False, /* EdidReadStarted */ - { /* EdidToApp */ - 0, /* pRawEdid */ - 0 /* numBlocks */ - }, - { /* EDIDBasicDisplayParam */ - 0, /* uVideoInputDef */ - 0, /* uMaxHorizontalSize */ - 0, /* uMaxVerticalSize */ - 0, /* uGamma */ - 0, /* uFeatureSupport */ - }, -#ifdef TMFL_HDCP_SUPPORT - False, /* HDCPIgnoreEncrypt */ - 0, /* HdcpPortAddress */ - HDMITX_HDCP_TXMODE_NOT_SET, /* HdcpTxMode */ - HDMITX_HDCP_OPTION_DEFAULT, /* HdcpOptions */ - 0, /* HdcpBcaps */ - 0, /* HdcpBstatus */ - 0, /* HdcpRi */ - 0, /* HdcpFsmState */ - 0, /* HdcpT0FailState */ - 0, /* HdcpSeed */ - {0, 0, 0, 0, 0}, /* HdcpAksv */ - (ptmHdmiTxFunc_t) 0, /* HdcpFuncScheduled */ - 0, /* HdcpFuncRemainingMs */ - 0, /* HdcpCheckIntervalMs */ - 0, /* HdcpCheckRemainingMs */ - 0, /* HdcpCheckNum */ - 0, /* HdcpChecksToDo */ -#endif /* TMFL_HDCP_SUPPORT */ - HDMITX_VFMT_NULL, /* vinFmt */ - HDMITX_VFMT_NULL, /* voutFmt */ - HDMITX_PIXRATE_DOUBLE, /* pixRate */ - HDMITX_VINMODE_RGB444, /* vinMode */ - HDMITX_VOUTMODE_RGB444, /* voutMode */ - HDMITX_VFREQ_INVALID, /* voutFreq */ - HDMITX_SCAMODE_OFF, /* scaMode */ - HDMITX_UPSAMPLE_AUTO, /* upsampleMode */ - HDMITX_PIXREP_MIN, /* pixelRepeatCount */ - HDMITX_HOTPLUG_INVALID, /* hotPlugStatus */ - HDMITX_RX_SENSE_INVALID, /* rxSenseStatus */ - E_PAGE_INVALID, /* curRegPage */ - { - /* These match power-up defaults. shadowReg[]: */ - 0x00, /* E_SP00_INT_FLAGS_0 */ - 0x00, /* E_SP00_INT_FLAGS_1 */ - 0x00, /* E_SP00_INT_FLAGS_2 */ - 0x01, /* E_SP00_VIP_CNTRL_0 */ - 0x24, /* E_SP00_VIP_CNTRL_1 */ - 0x56, /* E_SP00_VIP_CNTRL_2 */ - 0x17, /* E_SP00_VIP_CNTRL_3 */ - 0x01, /* E_SP00_VIP_CNTRL_4 */ - 0x00, /* E_SP00_VIP_CNTRL_5 */ - 0x05, /* E_SP00_MAT_CONTRL */ - 0x00, /* E_SP00_TBG_CNTRL_0 */ - 0x00, /* E_SP00_TBG_CNTRL_1 */ - 0x00, /* E_SP00_HVF_CNTRL_0 */ - 0x00, /* E_SP00_HVF_CNTRL_1 */ - 0x00, /* E_SP00_TIMER_H */ - 0x00, /* E_SP00_DEBUG_PROBE */ - 0x00 /* E_SP00_AIP_CLKSEL */ - , 0x00 /* E_SP01_SC_VIDFORMAT */ - , 0x00 /* E_SP01_SC_CNTRL */ - , 0x00 /* E_SP01_TBG_CNTRL_0 */ -#ifdef TMFL_HDCP_SUPPORT - , 0x00 /* E_SP12_CTRL */ - , 0x00 /* E_SP12_BCAPS */ -#endif /* TMFL_HDCP_SUPPORT */ - }, - False, /* Init prevFilterPattern to false */ - False, /* Init prevPattern to false */ - False, /* bInitialized */ - HDMITX_VQR_DEFAULT -}; - - -/** - * Table of shadow registers, as packed Shad/Page/Addr codes. - * This allows shadow index values to be searched for using register page - * and address values. - */ -static UInt16 kShadowReg[E_SNUM] = { /* Shadow Index Packed Shad/Page/Addr */ - E_REG_P00_INT_FLAGS_0_RW, /* E_SP00_INT_FLAGS_0 */ - E_REG_P00_INT_FLAGS_1_RW, /* E_SP00_INT_FLAGS_1 */ - E_REG_P00_INT_FLAGS_2_RW, /* E_SP00_INT_FLAGS_2 */ - E_REG_P00_VIP_CNTRL_0_W, /* E_SP00_VIP_CNTRL_0 */ - E_REG_P00_VIP_CNTRL_1_W, /* E_SP00_VIP_CNTRL_1 */ - E_REG_P00_VIP_CNTRL_2_W, /* E_SP00_VIP_CNTRL_2 */ - E_REG_P00_VIP_CNTRL_3_W, /* E_SP00_VIP_CNTRL_3 */ - E_REG_P00_VIP_CNTRL_4_W, /* E_SP00_VIP_CNTRL_4 */ - E_REG_P00_VIP_CNTRL_5_W, /* E_SP00_VIP_CNTRL_5 */ - E_REG_P00_MAT_CONTRL_W, /* E_SP00_MAT_CONTRL */ - E_REG_P00_TBG_CNTRL_0_W, /* E_SP00_TBG_CNTRL_0 */ - E_REG_P00_TBG_CNTRL_1_W, /* E_SP00_TBG_CNTRL_1 */ - E_REG_P00_HVF_CNTRL_0_W, /* E_SP00_HVF_CNTRL_0 */ - E_REG_P00_HVF_CNTRL_1_W, /* E_SP00_HVF_CNTRL_1 */ - E_REG_P00_TIMER_H_W, /* E_SP00_TIMER_H */ - E_REG_P00_DEBUG_PROBE_W, /* E_SP00_DEBUG_PROBE */ - E_REG_P00_AIP_CLKSEL_W, /* E_SP00_AIP_CLKSEL */ - E_REG_P01_SC_VIDFORMAT_W, /* E_SP01_SC_VIDFORMAT */ - E_REG_P01_SC_CNTRL_W, /* E_SP01_SC_CNTRL */ - E_REG_P01_TBG_CNTRL_0_W /* E_SP01_TBG_CNTRL_0 */ -#ifdef TMFL_HDCP_SUPPORT - , E_REG_P12_CTRL_W /* E_SP12_CTRL */ - , E_REG_P12_BCAPS_W /* E_SP12_BCAPS */ -#endif /* TMFL_HDCP_SUPPORT */ -}; - - -/** - * Table of registers to switch to low power (standby) - -static tmHdmiTxRegMaskVal_t kPowerOff[] = -{ - {E_REG_P02_TEST2_RW, E_MASKREG_P02_TEST2_pwd1v8, 1}, - {E_REG_P02_PLL_SCG1_RW, E_MASKREG_P02_PLL_SCG1_scg_fdn, 1}, - {E_REG_P02_PLL_SERIAL_1_RW, E_MASKREG_P02_PLL_SERIAL_1_srl_fdn, 1}, - {E_REG_P02_PLL_DE_RW, E_MASKREG_P02_PLL_DE_pllde_fdn, 1}, - {E_REG_P02_BUFFER_OUT_RW, E_MASKREG_P02_BUFFER_OUT_srl_force, 2}, - {E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_ena_sc_clk, 0}, - {E_REG_P00_CCLK_ON_RW, E_MASKREG_P00_CCLK_ON_cclk_on, 0}, - {0,0,0} -}; -*/ -/** - * Table of registers to switch to normal power (resume) - -static tmHdmiTxRegMaskVal_t kPowerOn[] = -{ - {E_REG_P02_TEST2_RW, E_MASKREG_P02_TEST2_pwd1v8, 0}, - {E_REG_P02_PLL_SERIAL_1_RW, E_MASKREG_P02_PLL_SERIAL_1_srl_fdn, 0}, - {E_REG_P02_PLL_DE_RW, E_MASKREG_P02_PLL_DE_pllde_fdn, 0}, - {E_REG_P02_PLL_SCG1_RW, E_MASKREG_P02_PLL_SCG1_scg_fdn, 0}, - {E_REG_P02_SEL_CLK_RW, E_MASKREG_P02_SEL_CLK_ena_sc_clk, 1}, - {E_REG_P02_BUFFER_OUT_RW, E_MASKREG_P02_BUFFER_OUT_srl_force, 0}, - {E_REG_P00_TBG_CNTRL_0_W, E_MASKREG_P00_TBG_CNTRL_0_sync_once,0}, - {E_REG_P00_CCLK_ON_RW, E_MASKREG_P00_CCLK_ON_cclk_on, 1}, - {0,0,0} -}; -*/ - -static tmbslHdmiTxCallbackInt_t kITCallbackPriority[HDMITX_CALLBACK_INT_NUM] = { - HDMITX_CALLBACK_INT_R0, /**< R0 interrupt */ - HDMITX_CALLBACK_INT_ENCRYPT, /**< HDCP encryption switched off */ - HDMITX_CALLBACK_INT_HPD, /**< Transition on HPD input */ - HDMITX_CALLBACK_INT_T0, /**< HDCP state machine in state T0 */ - HDMITX_CALLBACK_INT_BCAPS, /**< BCAPS available */ - HDMITX_CALLBACK_INT_BSTATUS, /**< BSTATUS available */ - HDMITX_CALLBACK_INT_SHA_1, /**< sha-1(ksv,bstatus,m0)=V' */ - HDMITX_CALLBACK_INT_PJ, /**< pj=pj' check fails */ - HDMITX_CALLBACK_INT_SW_INT, /**< SW DEBUG interrupt */ - HDMITX_CALLBACK_INT_RX_SENSE, /**< RX SENSE interrupt */ - HDMITX_CALLBACK_INT_EDID_BLK_READ, - /**< EDID BLK READ interrupt */ - HDMITX_CALLBACK_INT_VS_RPT, /**< VS interrupt */ - HDMITX_CALLBACK_INT_PLL_LOCK /** PLL LOCK not present on TDA9984 */ -}; - - - -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - -UInt8 kndiv_im[] = { - 0, /* HDMITX_VFMT_NO_CHANGE */ - 4, /* HDMITX_VFMT_01_640x480p_60Hz */ - 4, /* HDMITX_VFMT_02_720x480p_60Hz */ - 4, /* HDMITX_VFMT_03_720x480p_60Hz */ - 12, /* HDMITX_VFMT_04_1280x720p_60Hz */ - 12, /* HDMITX_VFMT_05_1920x1080i_60Hz */ - 4, /* HDMITX_VFMT_06_720x480i_60Hz */ - 4, /* HDMITX_VFMT_07_720x480i_60Hz */ - 4, /* HDMITX_VFMT_08_720x240p_60Hz */ - 4, /* HDMITX_VFMT_09_720x240p_60Hz */ - 4, /* HDMITX_VFMT_10_720x480i_60Hz */ - 4, /* HDMITX_VFMT_11_720x480i_60Hz */ - 4, /* HDMITX_VFMT_12_720x240p_60Hz */ - 4, /* HDMITX_VFMT_13_720x240p_60Hz */ - 4, /* HDMITX_VFMT_14_1440x480p_60Hz */ - 4, /* HDMITX_VFMT_15_1440x480p_60Hz */ - 12, /* HDMITX_VFMT_16_1920x1080p_60Hz */ - 4, /* HDMITX_VFMT_17_720x576p_50Hz */ - 4, /* HDMITX_VFMT_18_720x576p_50Hz */ - 12, /* HDMITX_VFMT_19_1280x720p_50Hz */ - 12, /* HDMITX_VFMT_20_1920x1080i_50Hz */ - 4, /* HDMITX_VFMT_21_720x576i_50Hz */ - 4, /* HDMITX_VFMT_22_720x576i_50Hz */ - 4, /* HDMITX_VFMT_23_720x288p_50Hz */ - 4, /* HDMITX_VFMT_24_720x288p_50Hz */ - 4, /* HDMITX_VFMT_25_720x576i_50Hz */ - 4, /* HDMITX_VFMT_26_720x576i_50Hz */ - 4, /* HDMITX_VFMT_27_720x288p_50Hz */ - 4, /* HDMITX_VFMT_28_720x288p_50Hz */ - 4, /* HDMITX_VFMT_29_1440x576p_50Hz */ - 4, /* HDMITX_VFMT_30_1440x576p_50Hz */ - 12, /* HDMITX_VFMT_31_1920x1080p_50Hz */ - 12, /* HDMITX_VFMT_32_1920x1080p_24Hz */ - 12, /* HDMITX_VFMT_33_1920x1080p_25Hz */ - 12, /* HDMITX_VFMT_34_1920x1080p_30Hz */ - -}; - -UInt8 kclk_div[] = { - 0, /* HDMITX_VFMT_NO_CHANGE */ - 44, /* HDMITX_VFMT_01_640x480p_60Hz */ - 44, /* HDMITX_VFMT_02_720x480p_60Hz */ - 44, /* HDMITX_VFMT_03_720x480p_60Hz */ - 44, /* HDMITX_VFMT_04_1280x720p_60Hz */ - 44, /* HDMITX_VFMT_05_1920x1080i_60Hz */ - 44, /* HDMITX_VFMT_06_720x480i_60Hz */ - 44, /* HDMITX_VFMT_07_720x480i_60Hz */ - 44, /* HDMITX_VFMT_08_720x240p_60Hz */ - 44, /* HDMITX_VFMT_09_720x240p_60Hz */ - 44, /* HDMITX_VFMT_10_720x480i_60Hz */ - 44, /* HDMITX_VFMT_11_720x480i_60Hz */ - 44, /* HDMITX_VFMT_12_720x240p_60Hz */ - 44, /* HDMITX_VFMT_13_720x240p_60Hz */ - 44, /* HDMITX_VFMT_14_1440x480p_60Hz */ - 44, /* HDMITX_VFMT_15_1440x480p_60Hz */ - 44, /* HDMITX_VFMT_16_1920x1080p_60Hz */ - 44, /* HDMITX_VFMT_17_720x576p_50Hz */ - 44, /* HDMITX_VFMT_18_720x576p_50Hz */ - 44, /* HDMITX_VFMT_19_1280x720p_50Hz */ - 44, /* HDMITX_VFMT_20_1920x1080i_50Hz */ - 44, /* HDMITX_VFMT_21_720x576i_50Hz */ - 44, /* HDMITX_VFMT_22_720x576i_50Hz */ - 44, /* HDMITX_VFMT_23_720x288p_50Hz */ - 44, /* HDMITX_VFMT_24_720x288p_50Hz */ - 44, /* HDMITX_VFMT_25_720x576i_50Hz */ - 44, /* HDMITX_VFMT_26_720x576i_50Hz */ - 44, /* HDMITX_VFMT_27_720x288p_50Hz */ - 44, /* HDMITX_VFMT_28_720x288p_50Hz */ - 44, /* HDMITX_VFMT_29_1440x576p_50Hz */ - 44, /* HDMITX_VFMT_30_1440x576p_50Hz */ - 44, /* HDMITX_VFMT_31_1920x1080p_50Hz */ - 44, /* HDMITX_VFMT_32_1920x1080p_24Hz */ - 44, /* HDMITX_VFMT_33_1920x1080p_25Hz */ - 44, /* HDMITX_VFMT_34_1920x1080p_30Hz */ -}; - -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - - -/*============================================================================*/ -/* FUNCTIONS DECLARATIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* VARIABLES DECLARATIONS */ -/*============================================================================*/ - -#ifdef TMFL_HDCP_SUPPORT -static UInt32 sgBcapsCounter; -#endif /* TMFL_HDCP_SUPPORT */ - -#define TDA19989_DDC_SPEED_FACTOR 39 - -static Bool gMiscInterruptHpdRxEnable = False; /* Enable HPD and RX sense IT after */ - /* first call done by init function */ -static UInt8 int_level = 0xFF; -/*============================================================================*/ -/* FUNCTION PROTOTYPES */ -/*============================================================================*/ - -/*============================================================================*/ -/* tmbslTDA9989Deinit */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989Deinit(tmUnitSelect_t txUnit) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 EnableModeMask = 0; /* Local Variable */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* patch to get successfull soft reset even if powerstate has been set to standby mode */ - /*Write data in ENAMODS CEC Register */ - EnableModeMask = 0x40; - EnableModeMask |= E_MASKREG_CEC_ENAMODS_ena_hdmi; /*Enable HDMI Mode */ - EnableModeMask &= ~E_MASKREG_CEC_ENAMODS_dis_fro; /* Enable FRO */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, EnableModeMask); - RETIF_REG_FAIL(err) - - /* Hold the device in reset to disable it */ - err = setHwRegisterField(pDis, E_REG_P00_MAIN_CNTRL0_RW, - E_MASKREG_P00_MAIN_CNTRL0_sr, 1); - RETIF_REG_FAIL(err) - - /* patch to get successfull soft reset even if powerstate has been set to standby mode */ - EnableModeMask &= ~E_MASKREG_CEC_ENAMODS_ena_hdmi; /* Disable HDMI Mode */ - EnableModeMask &= ~E_MASKREG_CEC_ENAMODS_ena_rxs; /* Reset RxSense Mode */ - EnableModeMask |= E_MASKREG_CEC_ENAMODS_dis_fro; /* Disable FRO */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, EnableModeMask); - RETIF_REG_FAIL(err) - - /* Clear the Initialized flag to destroy the device instance */ - pDis->bInitialized = False; - - setState(pDis, EV_DEINIT); - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989HotPlugGetStatus */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HotPlugGetStatus(tmUnitSelect_t txUnit, tmbslHdmiTxHotPlug_t *pHotPlugStatus, Bool client /* Used to determine whether the request comes from the application */ - ) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; /* Register value */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameters */ - RETIF_BADPARAM(pHotPlugStatus == (tmbslHdmiTxHotPlug_t *) 0) - - /* Read HPD RXS level */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, ®Val); - RETIF(err != TM_OK, err) - - /* Read Hot Plug input status to know the actual level that caused the interrupt */ - if (client) { - *pHotPlugStatus = (regVal & E_MASKREG_CEC_RXSHPDLEV_hpd_level) ? - HDMITX_HOTPLUG_ACTIVE : HDMITX_HOTPLUG_INACTIVE; - } else { - - *pHotPlugStatus = pDis->hotPlugStatus; - - } - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989RxSenseGetStatus */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989RxSenseGetStatus(tmUnitSelect_t txUnit, tmbslHdmiTxRxSense_t *pRxSenseStatus, Bool client /* Used to determine whether the request comes from the application */ - ) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; /* Register value */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameters */ - RETIF_BADPARAM(pRxSenseStatus == (tmbslHdmiTxRxSense_t *) 0) - - - /* Read HPD RXS level */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, ®Val); - RETIF(err != TM_OK, err) - - - /*Read RXS_FIL status to know the actual level that caused the interrupt */ - if (client) { - *pRxSenseStatus = (regVal & E_MASKREG_CEC_RXSHPDLEV_rxs_level) ? - HDMITX_RX_SENSE_ACTIVE : HDMITX_RX_SENSE_INACTIVE; - } else { - *pRxSenseStatus = pDis->rxSenseStatus; - } - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989HwGetRegisters */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989HwGetRegisters - (tmUnitSelect_t txUnit, Int regPage, Int regAddr, UInt8 *pRegBuf, Int nRegs) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - Int i; /* Loop index */ - UInt8 newRegPage; /* The register's new page number */ - UInt8 regShad; /* Index to the register's shadow copy */ - UInt16 regShadPageAddr; /* Packed shadowindex/page/address */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameters */ - RETIF_BADPARAM((regPage < kPageIndexToPage[E_PAGE_00]) - || ((regPage > kPageIndexToPage[E_PAGE_02]) - && (regPage < kPageIndexToPage[E_PAGE_09])) - || ((regPage > kPageIndexToPage[E_PAGE_09]) - && (regPage < kPageIndexToPage[E_PAGE_11])) - || (regPage > kPageIndexToPage[E_PAGE_12])) - RETIF_BADPARAM((regAddr < E_REG_MIN_ADR) || (regAddr >= E_REG_CURPAGE_ADR_W)) - RETIF_BADPARAM(pRegBuf == (pUInt8) 0) - RETIF_BADPARAM((nRegs < 1) || ((nRegs + regAddr) > E_REG_CURPAGE_ADR_W)) - - /* Set page register if required */ - newRegPage = (UInt8) regPage; - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - /* Read each register in the range. nRegs must start at 1 or more */ - for (; nRegs > 0; pRegBuf++, regAddr++, nRegs--) { - /* Find shadow register index. - * This loop is not very efficient, but it is assumed that this API - * will not be used often. The alternative is to use a huge sparse - * array indexed by page and address and containing the shadow index. - */ - regShad = E_SNONE; - for (i = 0; i < E_SNUM; i++) { - /* Check lookup table for match with page and address */ - regShadPageAddr = kShadowReg[i]; - if ((SPA2PAGE(regShadPageAddr) == newRegPage) - && (SPA2ADDR(regShadPageAddr) == regAddr)) { - /* Found page and address - look up the shadow index */ - regShad = SPA2SHAD(regShadPageAddr); - break; - } - } - /* Read the shadow register if available, as device registers that - * are shadowed cannot be read directly */ - if (regShad != E_SNONE) { - *pRegBuf = pDis->shadowReg[regShad]; - } else { - /* Read the device register - all non-OK results are errors. - * Note that some non-shadowed registers are also write-only and - * cannot be read. */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = (UInt8) regAddr; - sysArgs.lenData = 1; - sysArgs.pData = pRegBuf; - err = pDis->sysFuncRead(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_READ) - } - } - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989HwGetVersion */ -/*============================================================================*/ - -tmErrorCode_t tmbslTDA9989HwGetVersion(tmUnitSelect_t txUnit, pUInt8 pHwVersion) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameters */ - RETIF_BADPARAM(pHwVersion == (pUInt8) 0) - - /* Get MSB version Value */ - err = getHwRegister(pDis, E_REG_P00_VERSION_MSB_RW, ®Val); - RETIF(err != TM_OK, err) - - switch (regVal) { - case 0x01: - *pHwVersion = (UInt8) (BSLHDMITX_TDA9989); - break; - case 0x02: - *pHwVersion = (UInt8) (BSLHDMITX_TDA19989); - break; - case 0x03: - *pHwVersion = (UInt8) (BSLHDMITX_TDA19988); - break; - default: - *pHwVersion = (UInt8) (BSLHDMITX_UNKNOWN); - break; - } - - return TM_OK; -} - - -/*============================================================================*/ -/* tmbslTDA9989HwHandleInterrupt */ -/* RETIF_REG_FAIL NOT USED HERE AS ALL ERRORS SHOULD BE TRAPPED IN ALL BUILDS */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HwHandleInterrupt(tmUnitSelect_t txUnit) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; /* Register value */ - UInt8 regVal1; /* Register value */ - UInt16 fInterruptStatus; /* Interrupt flags */ - UInt16 fInterruptMask; /* Mask to test each interrupt bit */ - tmbslHdmiTxRxSense_t newRxs_fil; /* Latest copy of rx_sense */ - Int i; /* Loop counter */ - tmbslHdmiTxHotPlug_t newHpdIn; /* Latest copy of hpd input */ - Bool sendEdidCallback; - Bool hpdOrRxsLevelHasChanged = False; - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - fInterruptStatus = 0; - sendEdidCallback = False; - - - - /* Read HPD RXS int status */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDINT_R, ®Val); - RETIF(err != TM_OK, err); - - /* Read HPD RXS level */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, ®Val1); - RETIF(err != TM_OK, err); - - if (int_level != 0xFF) { /* init should be done */ - /* check multi-transition */ - if ((regVal == 0) && (int_level != regVal1)) { -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER - pr_debug("HDMI Int multi-transition\n"); -#endif - err = setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, 0x00); - err += setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, - E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int | - E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int); - err += getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, ®Val1); - RETIF(err != TM_OK, err) - } - } - int_level = regVal1; - - /* Read Hot Plug input status to know the actual level that caused the interrupt */ - newHpdIn = (regVal1 & E_MASKREG_CEC_RXSHPDLEV_hpd_level) ? - HDMITX_HOTPLUG_ACTIVE : HDMITX_HOTPLUG_INACTIVE; - - /*Read RXS_FIL status to know the actual level that caused the interrupt */ - newRxs_fil = (regVal1 & E_MASKREG_CEC_RXSHPDLEV_rxs_level) ? - HDMITX_RX_SENSE_ACTIVE : HDMITX_RX_SENSE_INACTIVE; - - /*Fill fInterruptStatus with HPD Interrupt flag */ - - if (newHpdIn != pDis->hotPlugStatus) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_HPD); - /* Yes: save new HPD level */ - pDis->hotPlugStatus = newHpdIn; - hpdOrRxsLevelHasChanged = True; - } - - /*Fill fInterruptStatus with RX Sense Interrupt flag */ - if (newRxs_fil != pDis->rxSenseStatus) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_RX_SENSE); - /* Yes: save new rxSense level */ - pDis->rxSenseStatus = newRxs_fil; - hpdOrRxsLevelHasChanged = True; - } - - - - /* is it HDMI interrupt ? */ - err = getCECHwRegister(pDis, E_REG_CEC_INTERRUPTSTATUS_R, ®Val); - RETIF(err != TM_OK, err) - - /* there is no HDMI int to handle, give up */ - if ((regVal & E_MASKREG_CEC_INTERRUPTSTATUS_hdmi_int) == 0x00) { - - if (hpdOrRxsLevelHasChanged == True) { - } else { - return TM_OK; - } - } - - - - /************************************************************************************************/ - /***********************************End of Temporary code****************************************/ - /************************************************************************************************/ - - /* Do only if HDMI is On */ - if (pDis->ePowerState == tmPowerOn) { - /* Read the main interrupt flags register to determine the source(s) - * of the interrupt. (The device resets these register flags after they - * have been read.) - */ - err = getHwRegister(pDis, E_REG_P00_INT_FLAGS_0_RW, ®Val); - RETIF(err != TM_OK, err) -#ifdef TMFL_HDCP_SUPPORT - /* encrypt */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_0_encrypt) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_ENCRYPT); - } -#endif /* TMFL_HDCP_SUPPORT */ - - /* get TO interrupt Flag */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_0_t0) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_T0); - } -#ifdef TMFL_HDCP_SUPPORT - /* bcaps */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_0_bcaps) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_BCAPS); - - /* TDA19989 N1 only */ - if (pDis->uDeviceVersion == E_DEV_VERSION_TDA19989) { - - /* WA: HDCP ATC Test 1B_03 */ - - sgBcapsCounter++; - - if (sgBcapsCounter == 49) { - sgBcapsCounter = 0; - /* force a T0 interrupt */ - fInterruptStatus = - fInterruptStatus | (1 << HDMITX_CALLBACK_INT_T0); - } - - } - /* TDA19989 N1 only */ - } - - /* bstatus */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_0_bstatus) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_BSTATUS); - - /* TDA19989 N1 only */ - if (pDis->uDeviceVersion == E_DEV_VERSION_TDA19989) { - - /* WA: HDCP ATC Test 1B_03 */ - sgBcapsCounter = 0; - - } - /* TDA19989 N1 only */ - } - - /* sha_1 */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_0_sha_1) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_SHA_1); - } - - /* pj */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_0_pj) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_PJ); - } - - /* r0 */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_0_r0) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_R0); - - /* TDA19989 N1 only */ - if (pDis->uDeviceVersion == E_DEV_VERSION_TDA19989) { - - /* WA: HDCP ATC Test 1B_03 */ - sgBcapsCounter = 0; - - } - /* TDA19989 N1 only */ - } -#endif /* TMFL_HDCP_SUPPORT */ - - - err = getHwRegister(pDis, E_REG_P00_INT_FLAGS_1_RW, ®Val); - RETIF(err != TM_OK, err) - - - /* Read the software interrupt flag */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_1_sw_int) != 0) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_SW_INT); - } - - /* Read the VS_rpt interrupt flag */ - if (((pDis->InterruptsEnable & E_MASKREG_P00_INT_FLAGS_1_vs_rpt) != 0) && - ((regVal & E_MASKREG_P00_INT_FLAGS_1_vs_rpt) != 0) - ) { - fInterruptStatus = fInterruptStatus | (1 << HDMITX_CALLBACK_INT_VS_RPT); - } - - /* Read INT_FLAGS_2 interrupt flag register. - *(The device resets these register flags after they - * have been read.) */ - err = getHwRegister(pDis, E_REG_P00_INT_FLAGS_2_RW, ®Val); - RETIF(err != TM_OK, err) - - /* Has the EDID_blk_rd interrupt occurs */ - if ((regVal & E_MASKREG_P00_INT_FLAGS_2_edid_blk_rd) != 0) { - fInterruptStatus = - fInterruptStatus | (1 << HDMITX_CALLBACK_INT_EDID_BLK_READ); - } - } - - - /* Handle the HPD Interrupt */ - if ((fInterruptStatus & (1 << HDMITX_CALLBACK_INT_HPD)) != 0) { - /* Callback disable on first tmbslTDA9989HwHandleInterrupt call */ - if (gMiscInterruptHpdRxEnable) { - /* Reset EDID status */ - err = ClearEdidRequest(txUnit); - - /* Reset all simultaneous HDCP interrupts on hot plug, - * preserving only the high-priority hpd interrupt rx_sense and sw interrupt for debug*/ - fInterruptStatus &= (1 << HDMITX_CALLBACK_INT_HPD) | - (1 << HDMITX_CALLBACK_INT_RX_SENSE) | (1 << HDMITX_CALLBACK_INT_SW_INT); - - if (pDis->ePowerState == tmPowerOn) { - if ((pDis->hotPlugStatus == HDMITX_HOTPLUG_ACTIVE)) { - - /* TDA19989 N1 only */ - if (pDis->uDeviceVersion == E_DEV_VERSION_TDA19989) { - - err = tmbslTDA9989Reset(txUnit); - RETIF(err != TM_OK, err) - - err = hotPlugRestore(txUnit); - RETIF(err != TM_OK, err) - - } - /* TDA19989 N1 only */ - else { /* TDA19989 N2 */ - - HDCP_F2; - } - -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - - err = tmbslTDA9989Reset(txUnit); - RETIF(err != TM_OK, err) - - err = hotPlugRestore(txUnit); - RETIF(err != TM_OK, err) -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - setState(pDis, EV_PLUGGEDIN); - } else { - setState(pDis, EV_UNPLUGGED); - } - } - } - } else { - /* Clear HPD status if level has not changed */ - fInterruptStatus &= ~(1 << HDMITX_CALLBACK_INT_HPD); - - if (fInterruptStatus & (1 << HDMITX_CALLBACK_INT_EDID_BLK_READ)) { - err = EdidBlockAvailable(txUnit, &sendEdidCallback); - RETIF(err != TM_OK, err) - if (sendEdidCallback == False) { - /* Read EDID not finished clear callback */ - fInterruptStatus &= ~(1 << HDMITX_CALLBACK_INT_EDID_BLK_READ); - } else { -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - - if ((pDis->vinFmt == HDMITX_VFMT_16_1920x1080p_60Hz) - || (pDis->vinFmt == HDMITX_VFMT_31_1920x1080p_50Hz)) { - - err = setHwRegisterField(pDis, - E_REG_P02_PLL_SERIAL_3_RW, - E_MASKREG_P02_PLL_SERIAL_3_srl_ccir, - 0x00); - RETIF_REG_FAIL(err) - } -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - } - - - } - } - - /*Handle RxSense Interrupt */ - if ((fInterruptStatus & (1 << HDMITX_CALLBACK_INT_RX_SENSE)) != 0) { - /* Callback disable on first tmbslTDA9989HwHandleInterrupt call */ - if (gMiscInterruptHpdRxEnable) { - - - fInterruptStatus &= (1 << HDMITX_CALLBACK_INT_HPD) | - (1 << HDMITX_CALLBACK_INT_RX_SENSE) | (1 << HDMITX_CALLBACK_INT_SW_INT); - - if (pDis->rxSenseStatus == HDMITX_RX_SENSE_ACTIVE) { - setState(pDis, EV_SINKON); - } else { - setState(pDis, EV_SINKOFF); - } - } - } else { - /* Clear RX_sense IT if level has not changed */ - fInterruptStatus &= ~(1 << HDMITX_CALLBACK_INT_RX_SENSE); - } - - /* Ignore other simultaneous HDCP interrupts if T0 interrupt, - * preserving any hpd interrupt */ - - if (fInterruptStatus & (1 << HDMITX_CALLBACK_INT_T0)) { - if (pDis->EdidReadStarted) { - -#ifdef TMFL_HDCP_SUPPORT - err = getHwRegister(pDis, E_REG_P12_TX0_RW, ®Val); - RETIF(err != TM_OK, err) - - /* EDID read failure */ - if ((regVal & E_MASKREG_P12_TX0_sr_hdcp) != 0) { - -#endif /* TMFL_HDCP_SUPPORT */ - - - /* Reset EDID status */ - err = ClearEdidRequest(txUnit); - RETIF(err != TM_OK, err) - - /* enable EDID callback */ - fInterruptStatus = - (UInt16) (fInterruptStatus & (~(1 << HDMITX_CALLBACK_INT_T0))); - fInterruptStatus = - fInterruptStatus | (1 << HDMITX_CALLBACK_INT_EDID_BLK_READ); - -#ifdef TMFL_HDCP_SUPPORT - } -#endif /* TMFL_HDCP_SUPPORT */ - - } else { - fInterruptStatus &= ((1 << HDMITX_CALLBACK_INT_HPD) - | (1 << HDMITX_CALLBACK_INT_T0) - | (1 << HDMITX_CALLBACK_INT_RX_SENSE) - | (1 << HDMITX_CALLBACK_INT_SW_INT) - ); - } - } - - HDCP_F3; - - /* For each interrupt flag that is set, check the corresponding registered - * callback function pointer in the Device Instance Structure - * funcIntCallbacks array. - */ - fInterruptMask = 1; - for (i = 0; i < HDMITX_CALLBACK_INT_NUM; i++) { - if (i != HDMITX_CALLBACK_INT_PLL_LOCK) { /* PLL LOCK not present on TDA9989 */ - - fInterruptMask = 1; - fInterruptMask = fInterruptMask << ((UInt16) kITCallbackPriority[i]); - - if (fInterruptStatus & fInterruptMask) { - /* IF a registered callback pointer is non-null THEN call it. */ - if (pDis->funcIntCallbacks[kITCallbackPriority[i]] != - (ptmbslHdmiTxCallback_t) 0) { - pDis->funcIntCallbacks[kITCallbackPriority[i]] (txUnit); - } - } - - } - } - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989FlagSwInt */ -/* Use only for debug to flag the software debug interrupt */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989FlagSwInt(tmUnitSelect_t txUnit, UInt32 uSwInt) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - DUMMY_ACCESS(uSwInt); - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - err = setHwRegister(pDis, E_REG_P00_SW_INT_W, E_MASKREG_P00_SW_INT_sw_int); - - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989HwSetRegisters */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989HwSetRegisters - (tmUnitSelect_t txUnit, Int regPage, Int regAddr, UInt8 *pRegBuf, Int nRegs) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - Int i; /* Loop index */ - UInt8 newRegPage; /* The register's new page number */ - UInt8 regShad; /* Index to the register's shadow copy */ - UInt16 regShadPageAddr; /* Packed shadowindex/page/address */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameters */ - RETIF_BADPARAM((regPage < kPageIndexToPage[E_PAGE_00]) - || ((regPage > kPageIndexToPage[E_PAGE_02]) - && (regPage < kPageIndexToPage[E_PAGE_11])) - || (regPage > kPageIndexToPage[E_PAGE_12])) - RETIF_BADPARAM((regAddr < E_REG_MIN_ADR) || (regAddr >= E_REG_CURPAGE_ADR_W)) - RETIF_BADPARAM(pRegBuf == (pUInt8) 0) - RETIF_BADPARAM((nRegs < 0) || ((nRegs + regAddr) > E_REG_CURPAGE_ADR_W)) - - /* Set page register if required */ - newRegPage = (UInt8) regPage; - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - /* Write each register in the range. nRegs = 0 is ok, to allow only - * the page register to be written if required (above) - */ - for (; nRegs > 0; pRegBuf++, regAddr++, nRegs--) { - /* Find shadow register index. - * This loop is not very efficient, but it is assumed that this API - * will not be used often. The alternative is to use a huge sparse - * array indexed by page and address and containing the shadow index. - */ - for (i = 0; i < E_SNUM; i++) { - /* Check lookup table for match with page and address */ - regShadPageAddr = kShadowReg[i]; - if ((SPA2PAGE(regShadPageAddr) == newRegPage) - && (SPA2ADDR(regShadPageAddr) == regAddr)) { - /* Found index - write the shadow register */ - regShad = SPA2SHAD(regShadPageAddr); - pDis->shadowReg[regShad] = *pRegBuf; - break; - } - } - /* Write the device register - all non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = (UInt8) regAddr; - sysArgs.lenData = 1; - sysArgs.pData = pRegBuf; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - } - - return TM_OK; -} - - -/*============================================================================*/ -/* tmbslTDA9989HwStartup */ -/*============================================================================*/ -void - tmbslTDA9989HwStartup(void - ) { - pr_debug("%s\n", __func__); - /* Reset device instance data for when compiler doesn't do it */ - lmemset(&gHdmiTxInstance, 0, sizeof(gHdmiTxInstance)); -} - -/*============================================================================*/ -/* tmbslTDA9989Init */ -/* RETIF_REG_FAIL NOT USED HERE AS ALL ERRORS SHOULD BE TRAPPED IN ALL BUILDS */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989Init - (tmUnitSelect_t txUnit, - UInt8 uHwAddress, - ptmbslHdmiTxSysFunc_t sysFuncWrite, - ptmbslHdmiTxSysFunc_t sysFuncRead, - ptmbslHdmiTxSysFuncEdid_t sysFuncEdidRead, - ptmbslHdmiTxSysFuncTimer_t sysFuncTimer, - tmbslHdmiTxCallbackList_t *funcIntCallbacks, - Bool bEdidAltAddr, tmbslHdmiTxVidFmt_t vinFmt, tmbslHdmiTxPixRate_t pixRate) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - Int i; /* Loop index */ - Bool bFound; /* T=found, F=not found */ - UInt8 EnableIntMask = 0; /* Mask used to enable HPD and RX Sense interrupt */ - UInt8 EnableModeMask; /* Mask used to Set HDMI and RxSense modes */ - UInt16 val16Bits; /* Value on 16 bit */ - UInt8 regVal; /* Register value */ - - pr_debug("%s\n", __func__); - /* Check unit parameter and point to its object */ - RETIF(txUnit < tmUnit0, TMBSL_ERR_HDMI_BAD_UNIT_NUMBER) - RETIF(txUnit >= HDMITX_UNITS_MAX, TMBSL_ERR_HDMI_BAD_UNIT_NUMBER) - pDis = &gHdmiTxInstance[txUnit]; - - /* IF the bInitialized flag is set THEN return (only Init does this) */ - RETIF(pDis->bInitialized, TMBSL_ERR_HDMI_INIT_FAILED) - - /* Check remaining parameters */ - RETIF_BADPARAM(uHwAddress < HDMITX_SLAVE_ADDRESS_MIN) - RETIF_BADPARAM(uHwAddress > HDMITX_SLAVE_ADDRESS_MAX) - RETIF_BADPARAM(sysFuncWrite == (ptmbslHdmiTxSysFunc_t) 0) - RETIF_BADPARAM(sysFuncRead == (ptmbslHdmiTxSysFunc_t) 0) - /*RETIF_BADPARAM(sysFuncEdidRead == (ptmbslHdmiTxSysFuncEdid_t)0) *//*Previously on TDA9983 */ - /*RETIF_BADPARAM(sysFuncTimer == (ptmbslHdmiTxSysFuncTimer_t)0) */ - RETIF_BADPARAM((bEdidAltAddr != True) && (bEdidAltAddr != False)) - RETIF_BADPARAM(!IS_VALID_FMT(vinFmt)) - RETIF_BADPARAM(pixRate >= HDMITX_PIXRATE_INVALID) - - /* Set all Device Instance Structure members to default values */ - lmemcpy(pDis, &kHdmiTxInstanceDefault, sizeof(*pDis)); - - /* Copy txUnit, uHwAddress, sysFuncWrite and sysFuncRead values to - * the defaulted Device Instance Structure BEFORE FIRST DEVICE ACCESS. - */ - pDis->txUnit = txUnit; -#ifdef UNIT_TEST - /* Unit test build can't support 127 device sets of dummy registers, so use - * smaller range instead, indexed by unit number not I2C address */ - pDis->uHwAddress = (UInt8) txUnit; -#else - /* Store actual I2C address */ - pDis->uHwAddress = uHwAddress; -#endif - pDis->sysFuncWrite = sysFuncWrite; - pDis->sysFuncRead = sysFuncRead; - pDis->sysFuncEdidRead = sysFuncEdidRead; - pDis->sysFuncTimer = sysFuncTimer; - - /* IF the funcIntCallbacks array pointer is defined - * THEN for each funcIntCallbacks pointer that is not null: - * - Copy the pointer to the Device Instance Structure - * funcIntCallbacks array. - */ - - for (i = 0; i < HDMITX_CALLBACK_INT_NUM; i++) { - if ((funcIntCallbacks != (tmbslHdmiTxCallbackList_t *) 0) - && (funcIntCallbacks->funcCallback[i] != (ptmbslHdmiTxCallback_t) 0)) { - pDis->funcIntCallbacks[i] = funcIntCallbacks->funcCallback[i]; - } else { - pDis->funcIntCallbacks[i] = (ptmbslHdmiTxCallback_t) 0; - } - } - - /* Set the EDID alternate address flag if needed */ - pDis->bEdidAlternateAddr = bEdidAltAddr; - -/* *****************************************************************************************// */ -/* *****************************************************************************************// */ -/* **********************Enable HDMI and RxSense************************/// */ - - /* reset ENAMODS */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, 0x40); - RETIF_REG_FAIL(err) - - - - - - /*Read data out of ENAMODS CEC Register */ - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &EnableModeMask); - - /*Enable required modes */ - EnableModeMask |= E_MASKREG_CEC_ENAMODS_ena_hdmi; /*Enable HDMI Mode */ - EnableModeMask |= E_MASKREG_CEC_ENAMODS_ena_rxs; /*Enable RxSense Mode */ - EnableModeMask &= ~E_MASKREG_CEC_ENAMODS_dis_fro; /* Enable FRO */ - - /*Write data in ENAMODS CEC Register */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, EnableModeMask); - - pDis->ePowerState = (tmbslHdmiTxPowerState_t) tmPowerOn; - - /* Set the bInitialized flag to enable other APIs */ - pDis->bInitialized = True; - - /* Reset the device */ - err = tmbslTDA9989Reset(txUnit); - RETIF(err != TM_OK, err) -/* ***************************************************************************************// */ -/* ****************Get Device Version and Capabilities************************************// */ - /* Read the device version register to uDeviceVersion in the - * Device Instance Structure - */ - err = getHwRegister(pDis, E_REG_P00_VERSION_R, ®Val); - RETIF(err != TM_OK, err) - - /* Copy N4 features bits to DIS */ - pDis->uDeviceFeatures = regVal & - (E_MASKREG_P00_VERSION_not_h | E_MASKREG_P00_VERSION_not_s); - - pDis->uDeviceVersion = regVal; - - /* Get MSB version Value */ - err = getHwRegister(pDis, E_REG_P00_VERSION_MSB_RW, ®Val); - RETIF(err != TM_OK, err) - - /* Build Device Version Info */ - val16Bits = regVal; - pDis->uDeviceVersion = pDis->uDeviceVersion | (val16Bits << 8); - val16Bits = pDis->uDeviceFeatures; - pDis->uDeviceVersion &= ~val16Bits; - - if (pDis->uDeviceVersion != E_DEV_VERSION_LIST_END) { - /* Search for the device version in the Supported Version - * List in the Device Instance Structure. - */ - for (i = 0, bFound = False; i < E_DEV_VERSION_LIST_NUM; i++) { - if (pDis->uDeviceVersion == pDis->uSupportedVersions[i]) { - bFound = True; - } - } - if (bFound == False) { - /* IF the device version is not found in the Supported Version List THEN - * this driver component is not compatible with the device.*/ - err = tmbslTDA9989Deinit(txUnit); - RETIF(err != TM_OK, err) - return TMBSL_ERR_HDMI_COMPATIBILITY; - } - } else { - /* Quit if version reads zero */ - err = tmbslTDA9989Deinit(txUnit); - RETIF(err != TM_OK, err) - return TMBSL_ERR_HDMI_COMPATIBILITY; - } - -/***************************************************************************************/ -/************Set the BIAS_tmds Value (general control for Analogu module)***************/ - regVal = HDMI_TX_VSWING_VALUE; - - err = setHwRegister(pDis, E_REG_P02_ANA_GENERAL_RW, regVal); - RETIF(err != TM_OK, err) - -/*****************************************************************************************/ -/*****************************************************************************************/ - /* Set the PLL before resetting the device */ - /* PLL registers common configuration */ - err = setHwRegisterFieldTable(pDis, &kCommonPllCfg[0]); - RETIF_REG_FAIL(err) - - /*Reset 656_Alt bit in VIP_CONTROL_4 Register */ - err = - setHwRegisterField(pDis, E_REG_P00_VIP_CNTRL_4_W, E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - - switch (vinFmt) { - /* 480i or 576i video input format */ - case HDMITX_VFMT_06_720x480i_60Hz: - case HDMITX_VFMT_07_720x480i_60Hz: - case HDMITX_VFMT_21_720x576i_50Hz: - case HDMITX_VFMT_22_720x576i_50Hz: - err = setHwRegisterFieldTable(pDis, &kVfmt480i576iPllCfg[0]); - RETIF_REG_FAIL(err) - - switch (pixRate) { - case HDMITX_PIXRATE_SINGLE: - /* Single edge mode, vinFmt 480i or 576i */ - err = setHwRegisterFieldTable(pDis, &kSinglePrateVfmt480i576iPllCfg[0]); - RETIF_REG_FAIL(err) - - break; - case HDMITX_PIXRATE_SINGLE_REPEATED: - /* Single repeated edge mode, vinFmt 480i or 576i */ - err = setHwRegisterFieldTable(pDis, &kSrepeatedPrateVfmt480i576iPllCfg[0]); - RETIF_REG_FAIL(err) - - break; - default: - /* Double edge mode doesn't exist for vinFmt 480i or 576i */ - return (TMBSL_ERR_HDMI_INCONSISTENT_PARAMS); - } - - break; - - - /* Others video input format */ - default: - err = setHwRegisterFieldTable(pDis, &kVfmtOtherPllCfg[0]); - RETIF_REG_FAIL(err) - - switch (pixRate) { - case HDMITX_PIXRATE_SINGLE: - /* Single edge mode, vinFmt other than 480i or 576i */ - err = setHwRegisterFieldTable(pDis, &kSinglePrateVfmtOtherPllCfg[0]); - RETIF_REG_FAIL(err) - break; - case HDMITX_PIXRATE_DOUBLE: - /* Double edge mode, vinFmt other than 480i or 576i */ - err = setHwRegisterFieldTable(pDis, &kDoublePrateVfmtOtherPllCfg[0]); - RETIF_REG_FAIL(err) - break; - default: - /* Single repeated edge mode doesn't exist for other vinFmt */ - return (TMBSL_ERR_HDMI_INCONSISTENT_PARAMS); - } - break; - - } - - /* DDC interface is disable for TDA9989 after reset, enable it */ - err = setHwRegister(pDis, E_REG_P00_DDC_DISABLE_RW, 0x00); - RETIF(err != TM_OK, err) - - /* Set clock speed of the DDC channel */ - err = setHwRegister(pDis, E_REG_P12_TX3_RW, TDA19989_DDC_SPEED_FACTOR); - RETIF(err != TM_OK, err) - - /* TDA19989 N1 only */ - if (pDis->uDeviceVersion == E_DEV_VERSION_TDA19989) { - - err = setHwRegisterField(pDis, E_REG_P00_I2C_MASTER_RW, E_MASKREG_P00_I2C_MASTER_dis_mm, 0); /* 0: enable multi master mode */ - RETIF_REG_FAIL(err) - - } - - /* TDA19989 N1 only */ - err = - setCECHwRegister(pDis, E_REG_CEC_FRO_IM_CLK_CTRL_RW, - E_MASKREG_CEC_FRO_IM_CLK_CTRL_ghost_dis | - E_MASKREG_CEC_FRO_IM_CLK_CTRL_imclk_sel); - RETIF_REG_FAIL(err) - - /* The DIS hotplug status is HDMITX_HOTPLUG_INVALID, so call the main - * interrupt handler to read the current Hot Plug status and run any - * registered HPD callback before interrupts are enabled below */ - /* err = tmbslTDA9989HwHandleInterrupt(txUnit); */ - RETIF(err != TM_OK, err) - - /* enable sw _interrupt and VS_interrupt for debug */ - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_1_RW, E_MASKREG_P00_INT_FLAGS_1_sw_int); - - /* enable edid read */ - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_2_RW, E_MASKREG_P00_INT_FLAGS_2_edid_blk_rd); - - - /* Read HPD RXS level */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, ®Val); - RETIF(err != TM_OK, err) - - /* Read Hot Plug input status to know the actual level that caused the interrupt */ - pDis->hotPlugStatus = (regVal & E_MASKREG_CEC_RXSHPDLEV_hpd_level) ? - HDMITX_HOTPLUG_ACTIVE : HDMITX_HOTPLUG_INACTIVE; - - /*Read RXS_FIL status to know the actual level that caused the interrupt */ - pDis->rxSenseStatus = (regVal & E_MASKREG_CEC_RXSHPDLEV_rxs_level) ? - HDMITX_RX_SENSE_ACTIVE : HDMITX_RX_SENSE_INACTIVE; - - /*Disable required Interrupts */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, &EnableIntMask); - EnableIntMask |= E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int; /* Enable RxSense Interrupt */ - EnableIntMask |= E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int; /* Enable HPD Interrupt */ - - /* Switch BSL State machine into UNINITIALIZED State */ - setState(pDis, EV_INIT); - - /*Write data in RXSHPD Register */ - err += setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, EnableIntMask); - err += getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, &int_level); - - /* Enable HPD and RX sense IT after first call done by init function */ - gMiscInterruptHpdRxEnable = True; - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989PowerGetState */ -/*============================================================================*/ - -tmErrorCode_t tmbslTDA9989PowerGetState(tmUnitSelect_t txUnit, tmPowerState_t *pePowerState) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check remaining parameters */ - RETIF_BADPARAM(pePowerState == (tmPowerState_t) 0) - - /*return parameter */ - * pePowerState = (tmPowerState_t) pDis->ePowerState; - - return TM_OK; -} - - -/*============================================================================*/ -/* tmbslTDA9989PowerSetState */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989PowerSetState(tmUnitSelect_t txUnit, tmPowerState_t ePowerState) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 RegVal = 0; /* Local Variable */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - if (ePowerState == tmPowerOff) { - ePowerState = tmPowerStandby; - } - - - /* Check remaining parameters */ - RETIF_BADPARAM((ePowerState != tmPowerStandby) - && (ePowerState != tmPowerSuspend) - && (ePowerState != tmPowerOn) - ) - - if ((ePowerState == tmPowerStandby) && (pDis->ePowerState != tmPowerStandby)) { - /*Disable HPD and RxSense Interrupts */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, &RegVal); - RegVal &= ~E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int; - RegVal &= ~E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int; - err += setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, RegVal); - err += getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, &int_level); - RETIF_REG_FAIL(err) - - /* Disable if coming from ACTIVE */ - if (pDis->ePowerState == tmPowerOn) { - - /* Disable audio and video ports */ - err = setHwRegister(pDis, E_REG_P00_ENA_AP_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err) - - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_0_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_1_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_2_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err) - - /* Disable DDC */ - err = setHwRegisterField(pDis, E_REG_P00_DDC_DISABLE_RW, E_MASKREG_P00_DDC_DISABLE_ddc_dis, 1); /* 1: disable */ - RETIF_REG_FAIL(err); - -#ifdef TMFL_HDCP_OPTIMIZED_POWER - /* power down clocks */ - tmbslTDA9989HdcpPowerDown(txUnit, True); - err = setHwRegisterField(pDis, E_REG_FEAT_POWER_DOWN, - E_MASKREG_FEAT_POWER_DOWN_all, 0x0F); -#endif - } - - /*Disable HDMI and RxSense Modes AND FRO if required */ - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &RegVal); - RegVal &= ~E_MASKREG_CEC_ENAMODS_ena_hdmi; /* Reset HDMI Mode */ - - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, RegVal); - RETIF_REG_FAIL(err) - - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &RegVal); - RETIF_REG_FAIL(err) - RegVal |= E_MASKREG_CEC_ENAMODS_ena_hdmi; /* Set HDMI Mode */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, RegVal); - RETIF_REG_FAIL(err) - - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &RegVal); - RegVal &= ~E_MASKREG_CEC_ENAMODS_ena_hdmi; /* Reset HDMI Mode */ - - RegVal &= ~E_MASKREG_CEC_ENAMODS_ena_rxs; /* Reset RxSense Mode */ - - - /* disable FRO */ - RegVal |= E_MASKREG_CEC_ENAMODS_dis_fro; - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, RegVal); - RETIF_REG_FAIL(err) - - - /*Send STANDBY event to the BSL State Machine */ - setState(pDis, EV_STANDBY); - } else if ((ePowerState == tmPowerSuspend) && (pDis->ePowerState != tmPowerSuspend)) { - - /* Disable if coming from ACTIVE */ - if (pDis->ePowerState == tmPowerOn) { - /* Disable audio and video ports */ - err = setHwRegister(pDis, E_REG_P00_ENA_AP_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err) - - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_0_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_1_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_2_RW, 0x00); /* 0: disable */ - RETIF_REG_FAIL(err); - - /* Disable DDC */ - err = setHwRegisterField(pDis, E_REG_P00_DDC_DISABLE_RW, E_MASKREG_P00_DDC_DISABLE_ddc_dis, 1); /* 1: disable */ - RETIF_REG_FAIL(err); - -#ifdef TMFL_HDCP_OPTIMIZED_POWER - /* power down clocks */ - tmbslTDA9989HdcpPowerDown(txUnit, True); - err = setHwRegisterField(pDis, E_REG_FEAT_POWER_DOWN, - E_MASKREG_FEAT_POWER_DOWN_all, 0x0F); -#endif - } - - /*Enable RxSense Mode and Disable HDMI Mode */ - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &RegVal); - RegVal &= ~E_MASKREG_CEC_ENAMODS_ena_hdmi; /* Reset HDMI Mode */ - RegVal |= E_MASKREG_CEC_ENAMODS_ena_rxs; /* Set RxSense Mode */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, RegVal); - RETIF_REG_FAIL(err) - - /*Enable HPD and RxS Interupt in case of the current Device Power States is STANDBY */ - /*In other cases, those interrupts have already been enabled */ - if (pDis->ePowerState == tmPowerStandby) { - /* Enable FRO if coming from STANDBY */ - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &RegVal); - RegVal &= ~E_MASKREG_CEC_ENAMODS_dis_fro; /* Enable FRO */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, RegVal); - RETIF_REG_FAIL(err) - - /*Enable HPD and RxS Interupt */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, &RegVal); - RegVal |= E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int; /* Enable HPD Interrupt */ - RegVal |= E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int; /* Enable RxSense Interrupt */ - err += setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, RegVal); - err += getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, &int_level); - RETIF_REG_FAIL(err) - - /* force interrupt HPD and RXS level reading */ - err = tmbslTDA9989HwHandleInterrupt(txUnit); - RETIF(err != TM_OK, err) - - - } - - /*Send the SLEEP event to the BSL State Machine */ - setState(pDis, EV_SLEEP); - - } - - else if ((ePowerState == tmPowerOn) && (pDis->ePowerState != tmPowerOn)) { - - /* Enable RxSense HDMI Modes */ - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &RegVal); - RegVal |= E_MASKREG_CEC_ENAMODS_ena_hdmi; /* Set HDMI Mode */ - RegVal |= E_MASKREG_CEC_ENAMODS_ena_rxs; /* Set RxSense Mode */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, RegVal); - RETIF_REG_FAIL(err) - - /*Enable HPD and RxS Interupt in case of the current Device Power States is STANDBY */ - /*In other cases, those interrupts have already been enabled */ - if (pDis->ePowerState == tmPowerStandby) { - /* Enable FRO if coming from STANDBY */ - err = getCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, &RegVal); - RegVal &= ~E_MASKREG_CEC_ENAMODS_dis_fro; /* Enable FRO */ - err = setCECHwRegister(pDis, E_REG_CEC_ENAMODS_RW, RegVal); - RETIF_REG_FAIL(err) - - - /*Apply the required mode, Reset RxS and HDMI bits */ - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, &RegVal); - RegVal |= E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int; /* Enable HPD Interrupt */ - RegVal |= E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int; /* Enable RxSense Interrupt */ - err += setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, RegVal); - err += getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, &int_level); - RETIF_REG_FAIL(err) - } - - - /* Restore BIAS TMDS */ - RegVal = HDMI_TX_VSWING_VALUE; - err = setHwRegister(pDis, E_REG_P02_ANA_GENERAL_RW, RegVal); - RETIF(err != TM_OK, err) - - - err = tmbslTDA9989Reset(txUnit); - RETIF(err != TM_OK, err) - - - err = - setHwRegisterField(pDis, E_REG_P00_VIP_CNTRL_4_W, - E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - - err = setHwRegister(pDis, E_REG_P12_TX3_RW, TDA19989_DDC_SPEED_FACTOR); - RETIF(err != TM_OK, err) - - /* TDA19989 N1 only */ - if (pDis->uDeviceVersion == E_DEV_VERSION_TDA19989) { - - err = setHwRegisterField(pDis, - E_REG_P00_I2C_MASTER_RW, - E_MASKREG_P00_I2C_MASTER_dis_mm, 0); - RETIF_REG_FAIL(err) - - } - /* TDA19989 N1 only */ - err = - setCECHwRegister(pDis, E_REG_CEC_FRO_IM_CLK_CTRL_RW, - E_MASKREG_CEC_FRO_IM_CLK_CTRL_ghost_dis | - E_MASKREG_CEC_FRO_IM_CLK_CTRL_imclk_sel); - RETIF_REG_FAIL(err) -#ifdef TMFL_HDCP_SUPPORT - if (pDis->HdcpSeed) { - err = - tmbslTDA9989HdcpDownloadKeys(txUnit, pDis->HdcpSeed, - HDMITX_HDCP_DECRYPT_ENABLE); - } -#endif /* TMFL_HDCP_SUPPORT */ - - - /* Enable DDC */ - err = setHwRegisterField(pDis, E_REG_P00_DDC_DISABLE_RW, E_MASKREG_P00_DDC_DISABLE_ddc_dis, 0); /* 0: enable */ - RETIF_REG_FAIL(err) - - /* Enable audio and video ports */ - err = setHwRegister(pDis, E_REG_P00_ENA_AP_RW, 0xFF); /* 1: enable */ - RETIF_REG_FAIL(err) - - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_0_RW, 0xFF); /* 1: enable */ - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_1_RW, 0xFF); /* 1: enable */ - RETIF_REG_FAIL(err) - - err = setHwRegister(pDis, E_REG_P00_ENA_VP_2_RW, 0xFF); /* 1: enable */ - RETIF_REG_FAIL(err) - - - /*Send the Hot Plug detection status event to the BSL State Machine */ - if (pDis->hotPlugStatus == HDMITX_HOTPLUG_ACTIVE) { - setState(pDis, EV_PLUGGEDIN); - } else { - setState(pDis, EV_UNPLUGGED); - } - - } - - /* Set the current Device Power status to the required Power Status */ - pDis->ePowerState = (tmbslHdmiTxPowerState_t) ePowerState; - - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989Reset */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989Reset(tmUnitSelect_t txUnit) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to its object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Reset I2C master and Audio */ - (void)setHwRegisterField(pDis, E_REG_P00_SR_REG_W, - E_MASKREG_P00_SR_REG_sr_i2c_ms | - E_MASKREG_P00_SR_REG_sr_audio, 1); - - pDis->sysFuncTimer(50); /* ms */ - - (void)setHwRegisterField(pDis, E_REG_P00_SR_REG_W, - E_MASKREG_P00_SR_REG_sr_i2c_ms | E_MASKREG_P00_SR_REG_sr_audio, 0); - - pDis->sysFuncTimer(50); /* ms */ - - /* Write to the transmitter to do a soft reset. Don't abort after any - * error here, to ensure full reset. - */ - (void)setHwRegisterField(pDis, E_REG_P00_MAIN_CNTRL0_RW, E_MASKREG_P00_MAIN_CNTRL0_sr, 1); - /* pDis->sysFuncTimer(50); *//* ms */ - (void)setHwRegisterField(pDis, E_REG_P00_MAIN_CNTRL0_RW, E_MASKREG_P00_MAIN_CNTRL0_sr, 0); - /* pDis->sysFuncTimer(50); *//* ms */ - /* Clear any colourbars */ - (void)setHwRegisterField(pDis, E_REG_P00_HVF_CNTRL_0_W, E_MASKREG_P00_HVF_CNTRL_0_sm, 0); - -#ifdef TMFL_HDCP_SUPPORT - /* Disable any scheduled function and HDCP check timer */ - pDis->HdcpFuncRemainingMs = 0; - pDis->HdcpCheckNum = 0; -#endif /* TMFL_HDCP_SUPPORT */ - - /* Switch BSL State machine into UNINITIALIZED State */ - setState(pDis, EV_DEINIT); - /* Switch Power State into STAND_BY State */ - /* pDis->ePowerState = tmPowerStandby; */ - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989SwGetVersion */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989SwGetVersion(ptmSWVersion_t pSWVersion) { - /* Check parameters */ - RETIF_BADPARAM(pSWVersion == (ptmSWVersion_t) 0) - - /* Get the version details of the component. */ - pSWVersion->compatibilityNr = HDMITX_BSL_COMP_NUM; - pSWVersion->majorVersionNr = HDMITX_BSL_MAJOR_VER; - pSWVersion->minorVersionNr = HDMITX_BSL_MINOR_VER; - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989SysTimerWait */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989SysTimerWait(tmUnitSelect_t txUnit, UInt16 waitMs) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Return if this device timer is not set up */ - RETIF(!pDis->sysFuncTimer, TMBSL_ERR_HDMI_NOT_INITIALIZED) - - /* Wait for the requested time */ - pDis->sysFuncTimer(waitMs); - - return TM_OK; -} - -/*============================================================================*/ -/* tmbslTDA9989TestSetMode */ -/*============================================================================*/ - -tmErrorCode_t - tmbslTDA9989TestSetMode - (tmUnitSelect_t txUnit, tmbslHdmiTxTestMode_t testMode, tmbslHdmiTxTestState_t testState) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - /* Register used to activate a test */ - UInt16 testReg = E_REG_P00_VIP_CNTRL_4_W; - /* Register bitfield mask used */ - UInt8 testMask = E_MASKREG_P00_VIP_CNTRL_4_tst_pat; - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(testMode >= HDMITX_TESTMODE_INVALID) - RETIF_BADPARAM(testState >= HDMITX_TESTSTATE_INVALID) - - /* Set the mode selected by testMode to the state indicated by testState */ - switch (testMode) { - case HDMITX_TESTMODE_PAT: - testReg = E_REG_P00_VIP_CNTRL_4_W; - testMask = E_MASKREG_P00_VIP_CNTRL_4_tst_pat; - break; - case HDMITX_TESTMODE_656: - testReg = E_REG_P00_VIP_CNTRL_4_W; - testMask = E_MASKREG_P00_VIP_CNTRL_4_tst_656; - break; - case HDMITX_TESTMODE_SERPHOE: - /*testReg = E_REG_P02_TEST1_RW; - testMask = E_MASKREG_P02_TEST1_tstserphoe; */ - break; - case HDMITX_TESTMODE_NOSC: - testReg = E_REG_P02_TEST1_RW; - testMask = E_MASKREG_P02_TEST1_tst_nosc; - break; - case HDMITX_TESTMODE_HVP: - /*testReg = E_REG_P02_TEST1_RW; - testMask = E_MASKREG_P02_TEST1_tst_hvp; */ - break; - case HDMITX_TESTMODE_PWD: - /*testReg = E_REG_P02_TEST2_RW; - testMask = E_MASKREG_P02_TEST2_pwd1v8; */ - break; - case HDMITX_TESTMODE_DIVOE: - /*testReg = E_REG_P02_TEST2_RW; - testMask = E_MASKREG_P02_TEST2_divtestoe; */ - break; - case HDMITX_TESTMODE_INVALID: - break; - } - err = setHwRegisterField(pDis, testReg, testMask, (UInt8) testState); - return err; -} - -/*============================================================================*/ -/** - \brief Fill Gamut metadata packet into one of the gamut HW buffer. this - function is not sending any gamut metadata into the HDMI stream, - it is only loading data into the HW. - - \param txUnit Transmitter unit number - \param pPkt pointer to the gamut packet structure - \param bufSel number of the gamut buffer to fill - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_BSLHDMIRX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_BSLHDMIRX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_BSLHDMIRX_I2C_WRITE: failed when writing to the I2C - bus - - ******************************************************************************/ -tmErrorCode_t tmbslTDA9989PktFillGamut - (tmUnitSelect_t txUnit, tmbslHdmiTxPktGamut_t *pPkt, UInt8 bufSel) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM((bufSel != 0) && (bufSel != 1)) - - /* Fill Gamut registers */ - /*Fill buffer 0 */ - if (bufSel == 0) { - /*Write Header */ - err = setHwRegisters(pDis, E_REG_P13_GMD_0_HB0_RW, &pPkt->HB[0], 3); - RETIF(err != TM_OK, err) - /*Write Payload */ - err = setHwRegisters(pDis, E_REG_P13_GMD_0_PB0_RW, &pPkt->PB[0], 28); - RETIF(err != TM_OK, err) - } - - /*Fill buffer 1 */ - else { - /*Write Header */ - err = setHwRegisters(pDis, E_REG_P13_GMD_1_HB0_RW, &pPkt->HB[0], 3); - RETIF(err != TM_OK, err) - /*Write Payload */ - err = setHwRegisters(pDis, E_REG_P13_GMD_1_PB0_RW, &pPkt->PB[0], 28); - RETIF(err != TM_OK, err) - } - - return err; -} - -/*============================================================================*/ -/** - \brief Enable transmission of gamut metadata packet. Calling this function - tells HW which gamut buffer to send into the HDMI stream. HW will - only take into account this command at the next VS, not during the - current one. - - \param txUnit Transmitter unit number - \param bufSel Number of the gamut buffer to be sent - \param enable Enable/disable gamut packet transmission - - \return The call result: - - TM_OK: the call was successful - - TMBSL_ERR_BSLHDMIRX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMBSL_ERR_BSLHDMIRX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_BSLHDMIRX_I2C_WRITE: failed when writing to the I2C - bus - - ******************************************************************************/ -tmErrorCode_t tmbslTDA9989PktSendGamut(tmUnitSelect_t txUnit, UInt8 bufSel, Bool bEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 GMD_Ctrl_Val; /*GMD control Value */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM((bufSel != 0) && (bufSel != 1)) - - /*Init Value */ - GMD_Ctrl_Val = 0x00; - - /*Enable Send of Gamut MetaData */ - if (bEnable) { - /*Send Buffer 0 */ - if (bufSel == 0) { - GMD_Ctrl_Val |= E_MASKREG_P13_GMD_CONTROL_enable; - GMD_Ctrl_Val &= ~E_MASKREG_P13_GMD_CONTROL_buf_sel; - err = setHwRegister(pDis, E_REG_P13_GMD_CONTROL_RW, GMD_Ctrl_Val); - RETIF(err != TM_OK, err) - } - /*Send Buffer 1 */ - else { - GMD_Ctrl_Val |= E_MASKREG_P13_GMD_CONTROL_enable; - GMD_Ctrl_Val |= E_MASKREG_P13_GMD_CONTROL_buf_sel; - err = setHwRegister(pDis, E_REG_P13_GMD_CONTROL_RW, GMD_Ctrl_Val); - RETIF(err != TM_OK, err) - } - } - /*Disable Send of Gamut MetaData */ - else { - GMD_Ctrl_Val &= ~E_MASKREG_P13_GMD_CONTROL_enable; - GMD_Ctrl_Val &= ~E_MASKREG_P13_GMD_CONTROL_buf_sel; - err = setHwRegister(pDis, E_REG_P13_GMD_CONTROL_RW, GMD_Ctrl_Val); - RETIF(err != TM_OK, err) - } - - return err; -} - - - - -/*============================================================================*/ -/* tmbslTDA9989EnableCallback */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989EnableCallback - (tmUnitSelect_t txUnit, tmbslHdmiTxCallbackInt_t callbackSource, Bool enable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err = TM_OK; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(callbackSource >= HDMITX_CALLBACK_INT_NUM) - - switch (callbackSource) { - case HDMITX_CALLBACK_INT_VS_RPT: - /* Enable or disable VS Interrupt */ - err = setHwRegisterField(pDis, - E_REG_P00_INT_FLAGS_1_RW, - E_MASKREG_P00_INT_FLAGS_1_vs_rpt, (UInt8) enable); - if (enable) { - pDis->InterruptsEnable |= (1 << callbackSource); - } else { - pDis->InterruptsEnable &= ~(1 << callbackSource); - } - break; - default: - err = TMBSL_ERR_HDMI_NOT_SUPPORTED; - break; - } - - return err; -} - -/*============================================================================*/ -/* tmbslTDA9989SetColorDepth */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989SetColorDepth - (tmUnitSelect_t txUnit, tmbslHdmiTxColorDepth colorDepth, Bool termEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err = TM_OK; /* Error code */ - - DUMMY_ACCESS(termEnable); - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Check parameters */ - RETIF_BADPARAM(colorDepth >= HDMITX_COLORDEPTH_INVALID) - - switch (colorDepth) { - case HDMITX_COLORDEPTH_NO_CHANGE: - break; - - case HDMITX_COLORDEPTH_24: - - break; - - default: - err = TMBSL_ERR_HDMI_NOT_SUPPORTED; - break; - } - - return err; - -} - - -/*============================================================================*/ -/* tmbslTDA9989Set5vpower */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989Set5vpower(tmUnitSelect_t txUnit, Bool pwrEnable) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - DUMMY_ACCESS(pwrEnable); - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - -/*============================================================================*/ -/* tmbslTDA9989SetDefaultPhase */ -/*============================================================================*/ -tmErrorCode_t - tmbslTDA9989SetDefaultPhase - (tmUnitSelect_t txUnit, Bool bEnable, tmbslHdmiTxColorDepth colorDepth, UInt8 videoFormat) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - DUMMY_ACCESS(bEnable); - DUMMY_ACCESS(colorDepth); - DUMMY_ACCESS(videoFormat); - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - return TMBSL_ERR_HDMI_NOT_SUPPORTED; -} - - - -/*============================================================================*/ -/* tmbslDebugWriteFakeRegPage */ -/*============================================================================*/ -tmErrorCode_t tmbslDebugWriteFakeRegPage(tmUnitSelect_t txUnit) -{ - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - err = checkUnitSetDis(txUnit, &pDis); - - pDis->curRegPage = 0x20; - - return err; -} - - -/*============================================================================*/ -/* hotPlugRestore */ -/*============================================================================*/ -tmErrorCode_t hotPlugRestore(tmUnitSelect_t txUnit) -{ - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; - UInt8 EnableIntMask = 0; /* Mask used to enable HPD and RX Sense interrupt */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Set the BIAS_tmds Value */ - regVal = HDMI_TX_VSWING_VALUE; - err = setHwRegister(pDis, E_REG_P02_ANA_GENERAL_RW, regVal); - RETIF(err != TM_OK, err) - - /* PLL registers common configuration */ - err = setHwRegisterFieldTable(pDis, &kCommonPllCfg[0]); - RETIF_REG_FAIL(err) - - /*Reset 656_Alt bit in VIP_CONTROL_4 Register */ - err = - setHwRegisterField(pDis, E_REG_P00_VIP_CNTRL_4_W, E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - - /* DDC interface is disable for TDA9989 after reset, enable it */ - err = setHwRegister(pDis, E_REG_P00_DDC_DISABLE_RW, 0x00); - RETIF(err != TM_OK, err) - - err = setHwRegister(pDis, E_REG_P12_TX3_RW, TDA19989_DDC_SPEED_FACTOR); - RETIF(err != TM_OK, err) - - /* TDA19989 N1 only */ - if (pDis->uDeviceVersion == E_DEV_VERSION_TDA19989) { - - err = setHwRegisterField(pDis, E_REG_P00_I2C_MASTER_RW, E_MASKREG_P00_I2C_MASTER_dis_mm, 0); /* 0: enable multi master mode */ - RETIF_REG_FAIL(err) - - } - - /* TDA19989 N1 only */ - err = - setCECHwRegister(pDis, E_REG_CEC_FRO_IM_CLK_CTRL_RW, - E_MASKREG_CEC_FRO_IM_CLK_CTRL_ghost_dis | - E_MASKREG_CEC_FRO_IM_CLK_CTRL_imclk_sel); - RETIF_REG_FAIL(err) - - - - - /* enable sw_interrupt for debug */ - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_1_RW, E_MASKREG_P00_INT_FLAGS_1_sw_int); - - /* enable edid read */ - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_2_RW, E_MASKREG_P00_INT_FLAGS_2_edid_blk_rd); - - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, &EnableIntMask); - EnableIntMask |= E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int; /* Enable RxSense Interrupt */ - EnableIntMask |= E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int; /* Enable HPD Interrupt */ - err += setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, EnableIntMask); - err += getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, &int_level); - -#ifdef TMFL_HDCP_SUPPORT - - if (pDis->HdcpSeed) { - err = - tmbslTDA9989HdcpDownloadKeys(txUnit, pDis->HdcpSeed, - HDMITX_HDCP_DECRYPT_ENABLE); - } -#endif /* TMFL_HDCP_SUPPORT */ - - setState(pDis, EV_INIT); - - return err; -} - -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - -tmErrorCode_t hotPlugRestore(tmUnitSelect_t txUnit) -{ - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - UInt8 regVal; - UInt8 EnableIntMask = 0; /* Mask used to enable HPD and RX Sense interrupt */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err) - - /* Set the BIAS_tmds Value */ - regVal = HDMI_TX_VSWING_VALUE; - err = setHwRegister(pDis, E_REG_P02_ANA_GENERAL_RW, regVal); - RETIF(err != TM_OK, err) - - /* PLL registers common configuration */ - err = setHwRegisterFieldTable(pDis, &kCommonPllCfg[0]); - RETIF_REG_FAIL(err) - - /*Reset 656_Alt bit in VIP_CONTROL_4 Register */ - err = - setHwRegisterField(pDis, E_REG_P00_VIP_CNTRL_4_W, E_MASKREG_P00_VIP_CNTRL_4_656_alt, 0); - - /* DDC interface is disable for TDA9989 after reset, enable it */ - err = setHwRegister(pDis, E_REG_P00_DDC_DISABLE_RW, 0x00); - RETIF(err != TM_OK, err) - - - - if ((pDis->vinFmt != HDMITX_VFMT_NO_CHANGE) && (pDis->vinFmt <= HDMITX_VFMT_TV_MAX)) { - - err = setHwRegister(pDis, E_REG_P00_TIMER_H_W, 0); - RETIF(err != TM_OK, err) - - err = setHwRegister(pDis, E_REG_P00_NDIV_IM_W, kndiv_im[pDis->vinFmt]); - RETIF(err != TM_OK, err) - - err = setHwRegister(pDis, E_REG_P12_TX3_RW, kclk_div[pDis->vinFmt]); - RETIF(err != TM_OK, err) - - } else if (pDis->vinFmt > HDMITX_VFMT_TV_MAX) { - - err = setHwRegister(pDis, E_REG_P00_TIMER_H_W, E_MASKREG_P00_TIMER_H_im_clksel); - RETIF(err != TM_OK, err) - err = setHwRegister(pDis, E_REG_P12_TX3_RW, 17); - RETIF(err != TM_OK, err) - } - - - - - - /* enable sw_interrupt for debug */ - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_1_RW, E_MASKREG_P00_INT_FLAGS_1_sw_int); - - /* enable edid read */ - err = setHwRegister(pDis, E_REG_P00_INT_FLAGS_2_RW, E_MASKREG_P00_INT_FLAGS_2_edid_blk_rd); - - err = getCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, &EnableIntMask); - EnableIntMask |= E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int; /* Enable RxSense Interrupt */ - EnableIntMask |= E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int; /* Enable HPD Interrupt */ - err += setCECHwRegister(pDis, E_REG_CEC_RXSHPDINTENA_RW, EnableIntMask); - err += getCECHwRegister(pDis, E_REG_CEC_RXSHPDLEV_R, &int_level); - - return err; -} - -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - -#ifdef TMFL_HDCP_OPTIMIZED_POWER -/*============================================================================*/ -/* tmbslTDA9989HdcpPowerDown */ -/* RETIF_REG_FAIL NOT USED HERE AS ALL ERRORS SHOULD BE TRAPPED IN ALL BUILDS */ -/*============================================================================*/ -tmErrorCode_t tmbslTDA9989HdcpPowerDown(tmUnitSelect_t txUnit, Bool requested) { - tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ - tmErrorCode_t err; /* Error code */ - - /* Check unit parameter and point to TX unit object */ - err = checkUnitSetDis(txUnit, &pDis); - RETIF(err != TM_OK, err); - - err = setHwRegisterField(pDis, E_REG_P12_TX4_RW, - E_MASKREG_P12_TX4_pd_all, (requested ? 0x07 : 0x00)); - return err; - -} -#endif - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Misc_l.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Misc_l.h deleted file mode 100644 index 3e36517e8dd..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_Misc_l.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (C) 2009 Koninklijke Philips Electronics N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of Koninklijke Philips Electronics N.V. and is confidential in - * nature. Under no circumstances is this software to be exposed to or placed - * under an Open Source License of any type without the expressed written - * permission of Koninklijke Philips Electronics N.V. - * - * \file tmbslTDA9989_Misc_l.h - * - * \version $Revision: 2 $ - * -*/ - -#ifndef TMBSLTDA9989_MISC_L_H -#define TMBSLTDA9989_MISC_L_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* EXTERN DATA DEFINITION */ -/*============================================================================*/ - -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - extern CONST_DAT UInt8 kndiv_im[]; - extern CONST_DAT UInt8 kclk_div[]; -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - - tmErrorCode_t hotPlugRestore(tmUnitSelect_t txUnit); - -#ifdef TMFL_TDA9989_PIXEL_CLOCK_ON_DDC - tmErrorCode_t hotPlugRestore(tmUnitSelect_t txUnit); -#endif /* TMFL_TDA9989_PIXEL_CLOCK_ON_DDC */ - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLTDA9989_MISC_L_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_State.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_State.c deleted file mode 100644 index 56371764fe4..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_State.c +++ /dev/null @@ -1,403 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_state.c - * - * \version $Revision: 2 $ - * -*/ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#include -#include -#endif - -#include "tmbslTDA9989_Functions.h" -#include "tmbslTDA9989_local.h" -#include "tmbslTDA9989_State_l.h" - - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* DEFINES DECLARATIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* VARIABLES DECLARATIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* FUNCTION PROTOTYPES */ -/*============================================================================*/ - -/*============================================================================*/ -/* setState */ -/*============================================================================*/ -tmErrorCode_t setState(tmHdmiTxobject_t *pDis, tmbslTDA9989Event_t event) { - tmbslTDA9989State_t state = pDis->state; - UInt8 nIgnoredEvents = pDis->nIgnoredEvents; - - switch (state) { - case ST_UNINITIALIZED: - switch (event) { - case EV_INIT: - state = ST_STANDBY; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_PLUGGEDIN: - state = ST_AWAIT_EDID; - break; - default: - nIgnoredEvents++; - break; - } - break; - - case ST_STANDBY: - switch (event) { - case EV_UNPLUGGED: - state = ST_DISCONNECTED; - break; /*Only when PowerSetState(ON) */ - case EV_PLUGGEDIN: - state = ST_AWAIT_EDID; - break; /*Only when PowerSetState(ON) */ - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_SETINOUT: - state = ST_VIDEO_NO_HDCP; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - - default: - nIgnoredEvents++; - break; - } - break; - case ST_SLEEP: - switch (event) { - case EV_UNPLUGGED: - state = ST_DISCONNECTED; - break; /*Only when PowerSetState(ON) */ - case EV_PLUGGEDIN: - state = ST_AWAIT_EDID; - break; /*Only when PowerSetState(ON) */ - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - default: - nIgnoredEvents++; - break; - } - break; - - case ST_DISCONNECTED: - switch (event) { - case EV_PLUGGEDIN: - state = ST_AWAIT_EDID; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - case ST_AWAIT_EDID: - switch (event) { - case EV_GETBLOCKDATA: - state = ST_AWAIT_RX_SENSE; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - - case ST_AWAIT_RX_SENSE: - switch (event) { - case EV_SINKON: - state = ST_SINK_CONNECTED; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - - case ST_SINK_CONNECTED: - switch (event) { - case EV_SETINOUT: - state = ST_VIDEO_NO_HDCP; - break; - case EV_SINKOFF: - state = ST_AWAIT_RX_SENSE; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - case ST_VIDEO_NO_HDCP: - switch (event) { - case EV_OUTDISABLE: - state = ST_SINK_CONNECTED; - break; - case EV_HDCP_RUN: - state = ST_HDCP_WAIT_RX; - break; - case EV_SINKOFF: - state = ST_AWAIT_RX_SENSE; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - case ST_HDCP_WAIT_RX: - switch (event) { - case EV_HDCP_BKSV_NREPEAT: - state = ST_HDCP_AUTHENTICATED; - break; - case EV_HDCP_BKSV_REPEAT: - state = ST_HDCP_WAIT_BSTATUS; - break; - case EV_HDCP_BKSV_NSECURE: - state = ST_HDCP_WAIT_RX; - break; - case EV_HDCP_T0: - state = ST_HDCP_WAIT_RX; - break; - case EV_HDCP_STOP: - state = ST_VIDEO_NO_HDCP; - break; - case EV_SINKOFF: - state = ST_AWAIT_RX_SENSE; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - case ST_HDCP_WAIT_BSTATUS: - switch (event) { - case EV_HDCP_BSTATUS_GOOD: - state = ST_HDCP_WAIT_SHA_1; - break; - case EV_HDCP_T0: - state = ST_HDCP_WAIT_RX; - break; - case EV_HDCP_STOP: - state = ST_VIDEO_NO_HDCP; - break; - case EV_SINKOFF: - state = ST_AWAIT_RX_SENSE; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - case ST_HDCP_WAIT_SHA_1: - switch (event) { - case EV_HDCP_KSV_SECURE: - state = ST_HDCP_AUTHENTICATED; - break; - case EV_HDCP_T0: - state = ST_HDCP_WAIT_RX; - break; - case EV_HDCP_STOP: - state = ST_VIDEO_NO_HDCP; - break; - case EV_SINKOFF: - state = ST_AWAIT_RX_SENSE; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - case ST_HDCP_AUTHENTICATED: - switch (event) { - case EV_HDCP_T0: - state = ST_HDCP_WAIT_RX; - break; - case EV_HDCP_STOP: - state = ST_VIDEO_NO_HDCP; - break; - case EV_SINKOFF: - state = ST_AWAIT_RX_SENSE; - break; - case EV_DEINIT: - state = ST_UNINITIALIZED; - break; - case EV_STANDBY: - state = ST_STANDBY; - break; - case EV_SLEEP: - state = ST_SLEEP; - break; - case EV_UNPLUGGED: - state = ST_SLEEP; - break; - default: - nIgnoredEvents++; - break; - } - break; - - case ST_INVALID: - nIgnoredEvents++; - break; - - default: - break; - } - - pDis->state = state; - pDis->nIgnoredEvents = nIgnoredEvents; - - if (nIgnoredEvents) { - /* int cbeDebug = 1; */ - } - - return TM_OK; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(setState); -#endif - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_State_l.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_State_l.h deleted file mode 100644 index 05adf400dd0..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_State_l.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (C) 2009 Koninklijke Philips Electronics N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of Koninklijke Philips Electronics N.V. and is confidential in - * nature. Under no circumstances is this software to be exposed to or placed - * under an Open Source License of any type without the expressed written - * permission of Koninklijke Philips Electronics N.V. - * - * \file tmbslTDA9989_State.h - * - * \version $Revision: 2 $ - * - * -*/ - -#ifndef TMBSLTDA9989_STATE_L_H -#define TMBSLTDA9989_STATE_L_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - - - -/*============================================================================*/ -/* EXTERN DATA DEFINITION */ -/*============================================================================*/ - - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - - tmErrorCode_t setState(tmHdmiTxobject_t *pDis, tmbslTDA9989Event_t event); - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLTDA9989_STATE_L_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local.c deleted file mode 100644 index c1175ed1442..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local.c +++ /dev/null @@ -1,591 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_local.c - * - * \version $Revision: 2 $ - * - * -*/ - -/*============================================================================*/ -/* FILE CONFIGURATION */ -/*============================================================================*/ - -/* Defining this symbol on the compiler command line excludes some API checks */ -/* #define NO_RETIF_BADPARAM */ - -/*============================================================================*/ -/* STANDARD INCLUDE FILES */ -/*============================================================================*/ - - -/*============================================================================*/ -/* PROJECT INCLUDE FILES */ -/*============================================================================*/ -#include "tmbslHdmiTx_types.h" -#include "tmbslTDA9989_Functions.h" -#include "tmbslTDA9989_local.h" -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* TYPE DEFINITIONS */ -/*============================================================================*/ - - -/*============================================================================*/ -/* PUBLIC VARIABLE DEFINITIONS */ -/*============================================================================*/ - -/** The array of object instances for all concurrently supported HDMI - * Transmitter units - */ -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#ifdef USE_SHARED_HDMI_INSTANCE -extern tmHdmiTxobject_t gHdmiTxInstance[HDMITX_UNITS_MAX]; -#else -#include -#include -tmHdmiTxobject_t gHdmiTxInstance[HDMITX_UNITS_MAX]; -EXPORT_SYMBOL(gHdmiTxInstance); -#endif -#else -tmHdmiTxobject_t gHdmiTxInstance[HDMITX_UNITS_MAX]; -#endif - -/** - * Lookup table to map register page index to actual page number - */ -UInt8 kPageIndexToPage[E_PAGE_NUM] = { - 0x00, /* E_PAGE_00 */ - 0x01, /* E_PAGE_01 */ - 0x02, /* E_PAGE_02 */ - 0x09, /* E_PAGE_09 */ - 0x10, /* E_PAGE_10 */ - 0x11, /* E_PAGE_11 */ - 0x12, /* E_PAGE_12 */ - 0x13 /* E_PAGE_13 */ -}; - - -/*============================================================================*/ -/* STATIC VARIABLE DECLARATIONS */ -/*============================================================================*/ - -/** - * Lookup table to map an 8-bit mask to a number of left shifts - * needed to shift a value starting at bit 0 onto the mask. - * Indexed by mask 0-255. For example, mask 0x00 and 0x01 need - * no shift, mask 0x02 needs one shift, mask 0x03 needs no shift, - * mask 0x04 needs 2 shifts, etc. - * Rows were formatted by "HDMI Driver - Register List.xls" and pasted here - */ -static UInt8 kMaskToShift[256] = { /* Mask index: */ - /*x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 1x */ - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 2x */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 3x */ - 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 4x */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 5x */ - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 6x */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 7x */ - 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 8x */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 9x */ - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Ax */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Bx */ - 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Cx */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Dx */ - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Ex */ - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* Fx */ -}; - -/*============================================================================*/ -/* STATIC FUNCTION DECLARATIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* PUBLIC FUNCTION DEFINITIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* checkUnitSetDis */ -/*============================================================================*/ -tmErrorCode_t checkUnitSetDis(tmUnitSelect_t txUnit, tmHdmiTxobject_t **ppDis) { - /* Return error if unit numbr is out of range */ - RETIF(txUnit < tmUnit0, TMBSL_ERR_HDMI_BAD_UNIT_NUMBER) - RETIF(txUnit >= HDMITX_UNITS_MAX, TMBSL_ERR_HDMI_BAD_UNIT_NUMBER) - - /* Point to unit's Device Instance Structure */ - * ppDis = &gHdmiTxInstance[txUnit]; - - /* Return if this device instance is not initialised */ - if (!(*ppDis)->bInitialized) { - return TMBSL_ERR_HDMI_NOT_INITIALIZED; - } - - return TM_OK; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(checkUnitSetDis); -#endif - -/*============================================================================*/ -/* getHwRegisters */ -/*============================================================================*/ -tmErrorCode_t - getHwRegisters(tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 *pData, UInt16 lenData) { - tmErrorCode_t err; /* Error code */ - UInt8 regShad; /* The index to the register's shadow copy */ - UInt8 regPage; /* The index to the register's page */ - UInt8 regAddr; /* The register's address on the page */ - UInt8 newRegPage; /* The register's new page number */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Unpack 1st register's shadow index, page index and address */ - regShad = SPA2SHAD(regShadPageAddr); - regPage = SPA2PAGE(regShadPageAddr); - regAddr = SPA2ADDR(regShadPageAddr); - newRegPage = kPageIndexToPage[regPage]; - - /* Check length does not overflow page */ - RETIF_BADPARAM((regAddr + lenData) > E_REG_CURPAGE_ADR_W) - - /* Check 1st reg does not have a shadow - whole range assumed likewise */ - RETIF_BADPARAM(regShad != E_SNONE) - - /* Set page register if required */ - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - /* Get I2C register range - all non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = regAddr; - sysArgs.lenData = (UInt8) lenData; - sysArgs.pData = pData; - err = pDis->sysFuncRead(&sysArgs); - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_READ; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(getHwRegisters); -#endif - -/*============================================================================*/ -/* getHwRegister */ -/*============================================================================*/ -tmErrorCode_t getHwRegister(tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 *pRegValue) { - tmErrorCode_t err; /* Error code */ - UInt8 regShad; /* The index to the register's shadow copy */ - UInt8 regPage; /* The index to the register's page */ - UInt8 regAddr; /* The register's address on the page */ - UInt8 newRegPage; /* The register's new page number */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Unpack register shadow index, page index and address */ - regShad = SPA2SHAD(regShadPageAddr); - regPage = SPA2PAGE(regShadPageAddr); - regAddr = SPA2ADDR(regShadPageAddr); - newRegPage = kPageIndexToPage[regPage]; - - /* Set page register if required */ - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - if ((regShad != E_SNONE) - && (regShadPageAddr != E_REG_P00_INT_FLAGS_0_RW) - && (regShadPageAddr != E_REG_P00_INT_FLAGS_1_RW) - && (regShadPageAddr != E_REG_P00_INT_FLAGS_2_RW)) { - /* Get shadow copy - shadowed registers can't be read */ - /* Don't read shadow copy of interrupt status flags! */ - *pRegValue = pDis->shadowReg[regShad]; - return TM_OK; - } else { - /* Get I2C register - all non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = regAddr; - sysArgs.lenData = 1; - sysArgs.pData = pRegValue; - err = pDis->sysFuncRead(&sysArgs); - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_READ; - } -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(getHwRegister); -#endif - -/*============================================================================*/ -/* setHwRegisters */ -/*============================================================================*/ -tmErrorCode_t - setHwRegisters(tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 *pData, UInt16 lenData) { - tmErrorCode_t err; /* Error code */ - UInt8 regShad; /* The index to the register's shadow copy */ - UInt8 regPage; /* The index to the register's page */ - UInt8 regAddr; /* The register's address on the page */ - UInt8 newRegPage; /* The register's new page number */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Unpack 1st register's shadow index, page index and address */ - regShad = SPA2SHAD(regShadPageAddr); - regPage = SPA2PAGE(regShadPageAddr); - regAddr = SPA2ADDR(regShadPageAddr); - newRegPage = kPageIndexToPage[regPage]; - - /* Check length does not overflow page */ - RETIF_BADPARAM((regAddr + lenData) > E_REG_CURPAGE_ADR_W) - - /* Check 1st reg does not have a shadow - whole range assumed likewise */ - RETIF_BADPARAM(regShad != E_SNONE) - - /* Set page register if required - whole range is on same page */ - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - /* Write to I2C register range - all non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = regAddr; - sysArgs.lenData = (UInt8) lenData; - sysArgs.pData = pData; - err = pDis->sysFuncWrite(&sysArgs); - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_WRITE; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(setHwRegisters); -#endif - - -/*============================================================================*/ -/* setHwRegisterMsbLsb */ -/*============================================================================*/ -tmErrorCode_t setHwRegisterMsbLsb(tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt16 regWord) { - tmErrorCode_t err; /* Error code */ - UInt8 regPage; /* The index to the register's page */ - UInt8 regAddr; /* The register's address on the page */ - UInt8 newRegPage; /* The register's new page number */ - UInt8 msbLsb[2]; /* The bytes from regWord */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Unpack register shadow index, page index and address */ - regPage = SPA2PAGE(regShadPageAddr); - regAddr = SPA2ADDR(regShadPageAddr); - newRegPage = kPageIndexToPage[regPage]; - - /* Unpack regWord bytes, MSB first */ - msbLsb[0] = (UInt8) (regWord >> 8); - msbLsb[1] = (UInt8) (regWord & 0xFF); - - /* Set page register if required */ - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - /* No word registers are shadowed */ - - /* Write to I2C - all non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = regAddr; - sysArgs.lenData = 2; - sysArgs.pData = &msbLsb[0]; - err = pDis->sysFuncWrite(&sysArgs); - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_WRITE; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(setHwRegisterMsbLsb); -#endif - -/*============================================================================*/ -/* setHwRegister */ -/*============================================================================*/ -tmErrorCode_t setHwRegister(tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 regValue) { - tmErrorCode_t err; /* Error code */ - UInt8 regShad; /* The index to the register's shadow copy */ - UInt8 regPage; /* The index to the register's page */ - UInt8 regAddr; /* The register's address on the page */ - UInt8 newRegPage; /* The register's new page number */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Unpack register shadow index, page index and address */ - regShad = SPA2SHAD(regShadPageAddr); - regPage = SPA2PAGE(regShadPageAddr); - regAddr = SPA2ADDR(regShadPageAddr); - newRegPage = kPageIndexToPage[regPage]; - - /* Set page register if required */ - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - /* Set shadow copy */ - if (regShad != E_SNONE) { - pDis->shadowReg[regShad] = regValue; - } - - /* Write to I2C - all non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = regAddr; - sysArgs.lenData = 1; - sysArgs.pData = ®Value; - err = pDis->sysFuncWrite(&sysArgs); - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_WRITE; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(setHwRegister); -#endif - -/*============================================================================*/ -/* setHwRegisterField */ -/*============================================================================*/ -tmErrorCode_t - setHwRegisterField - (tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 fieldMask, UInt8 fieldValue) { - tmErrorCode_t err; /* Error code */ - UInt8 regShad; /* The index to the register's shadow copy */ - UInt8 regPage; /* The index to the register's page */ - UInt8 regAddr; /* The register's address on the page */ - UInt8 newRegPage; /* The register's new page number */ - UInt8 regValue; /* The register's current value */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - - /* Unpack register shadow index, page index and address */ - regShad = SPA2SHAD(regShadPageAddr); - regPage = SPA2PAGE(regShadPageAddr); - regAddr = SPA2ADDR(regShadPageAddr); - newRegPage = kPageIndexToPage[regPage]; - - /* Set page register if required */ - if (pDis->curRegPage != newRegPage) { - /* All non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; - sysArgs.lenData = 1; - sysArgs.pData = &newRegPage; - err = pDis->sysFuncWrite(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) - pDis->curRegPage = newRegPage; - } - - if (regShad != E_SNONE) { - /* Get shadow copy */ - regValue = pDis->shadowReg[regShad]; - } else { - /* Read I2C register value. - * All bitfield registers are either shadowed or can be read. - */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = regAddr; - sysArgs.lenData = 1; - sysArgs.pData = ®Value; - err = pDis->sysFuncRead(&sysArgs); - RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_READ) - } - - /* Reset register bits that are set in the mask */ - regValue = regValue & (UInt8) (~fieldMask); - - /* Shift the field value left to align its bits with the mask */ - fieldValue <<= kMaskToShift[fieldMask]; - - /* Reset shifted field bits that are not set in the mask */ - fieldValue &= fieldMask; - - /* Set the shifted bitfield */ - regValue |= fieldValue; - - /* Set shadow copy */ - if (regShad != E_SNONE) { - pDis->shadowReg[regShad] = regValue; - } - - /* Write to I2C - all non-OK results are errors */ - sysArgs.slaveAddr = pDis->uHwAddress; - sysArgs.firstRegister = regAddr; - sysArgs.lenData = 1; - sysArgs.pData = ®Value; - err = pDis->sysFuncWrite(&sysArgs); - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_WRITE; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(setHwRegisterField); -#endif - -/*============================================================================*/ -/* getCECHwRegister */ -/*============================================================================*/ -tmErrorCode_t getCECHwRegister(tmHdmiTxobject_t *pDis, UInt16 regAddr, UInt8 *pRegValue) { - tmErrorCode_t err; /* Error code */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - UInt8 CECAddress; /* CEC Address deduced from uHwAddress */ - - /*Convert HwAddress into CEC Address */ - CECAddress = pDis->uHwAddress; - CECAddress = CECAddress ^ 0x44; /*Convert address to obtain the correspondance in CEC */ - /*CECAddress = ((~CECAddress & 0x44)||(CECAddress & 0xBB)); */ - /*Prepare Write operation */ - sysArgs.slaveAddr = CECAddress; - sysArgs.firstRegister = (UInt8) regAddr; - sysArgs.lenData = 1; - sysArgs.pData = pRegValue; - - /*Read data in Chip */ - err = pDis->sysFuncRead(&sysArgs); /* Call IC Read function */ - - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_READ; - -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(getCECHwRegister); -#endif - -/*============================================================================*/ -/* setCECHwRegister */ -/*============================================================================*/ -tmErrorCode_t setCECHwRegister(tmHdmiTxobject_t *pDis, UInt16 regAddr, UInt8 regValue) { - tmErrorCode_t err; /* Error code */ - tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ - UInt8 CECAddress; /* CEC Address deduced from uHwAddress */ - - /*Convert HwAddress into CEC Address */ - CECAddress = pDis->uHwAddress; - CECAddress = CECAddress ^ 0x44; /*Convert address to obtain the correspondance in CEC */ - - /*Prepare Write operation */ - sysArgs.slaveAddr = CECAddress; - sysArgs.firstRegister = (UInt8) regAddr; - sysArgs.lenData = 1; - sysArgs.pData = ®Value; - - /*Write data in Chip */ - err = pDis->sysFuncWrite(&sysArgs); /* Call IC Write function */ - - return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_WRITE; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(setCECHwRegister); -#endif - -/*============================================================================*/ -/* setHwRegisterFieldTable */ -/*============================================================================*/ -tmErrorCode_t setHwRegisterFieldTable(tmHdmiTxobject_t *pDis, const tmHdmiTxRegMaskVal_t *pTable) { - tmErrorCode_t err; /* Error code */ - Int i; /* Table index */ - - /* Set register, mask and value from table until terminator is reached */ - for (i = 0; pTable[i].Reg > 0; i++) { - err = setHwRegisterField(pDis, pTable[i].Reg, pTable[i].Mask, pTable[i].Val); - RETIF(err != TM_OK, err) - } - return TM_OK; -} - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -EXPORT_SYMBOL(setHwRegisterFieldTable); -#endif - - -/*============================================================================*/ -/* lmemcpy */ -/*============================================================================*/ -tmErrorCode_t lmemcpy(void *pTable1, const void *pTable2, UInt Size) { - char *ptrSource = (char *)pTable1; - char *endSource = (char *)pTable1 + Size; - char *ptrDest = (char *)pTable2; - - RETIF_BADPARAM(pTable1 == Null) - RETIF_BADPARAM(pTable2 == Null) - - while (endSource > ptrSource) { - *(ptrSource++) = *(ptrDest++); - } - return TM_OK; -} - -/*============================================================================*/ -/* lmemset */ -/*============================================================================*/ -tmErrorCode_t lmemset(void *pTable1, const UInt8 value, UInt Size) { - char *ptrSource = (char *)pTable1; - char *endSource = (char *)pTable1 + Size; - - RETIF_BADPARAM(pTable1 == Null) - - while (endSource > ptrSource) { - *(ptrSource++) = value; - } - return TM_OK; -} - -/*============================================================================*/ -/* STATIC FUNCTION DEFINTIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local.h deleted file mode 100644 index 8eaaba42185..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local.h +++ /dev/null @@ -1,2021 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_local.h - * - * \version %version: 3 % - * -*/ - -#ifndef TMBSLTDA9989_LOCAL_H -#define TMBSLTDA9989_LOCAL_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ -#ifndef DUMMY_ACCESS -#ifdef _WINDOWS -#define DUMMY_ACCESS(x) x -#else -#define DUMMY_ACCESS(x) -#endif -#endif /* DUMMY_ACCESS */ - -/** \name Versions - * A group of macros to set the software component number and version - */ -/*@{*/ -/** Compatibility number */ -#define HDMITX_BSL_COMP_NUM 1 - -/** Major software version 1 to 255 */ -#define HDMITX_BSL_MAJOR_VER 5 - -/** Minor software version 0 to 9 */ -#define HDMITX_BSL_MINOR_VER 4 -/*@}*/ - -/** \name ErrorChecks - * A group of checks ensuring that public error codes match DVP standard errors - */ -/*@{*/ -/** SW interface compatibility error */ -#if TMBSL_ERR_HDMI_COMPATIBILITY != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_COMPATIBILITY) -#error -#endif - -/** SW major version error */ -#if TMBSL_ERR_HDMI_MAJOR_VERSION != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_MAJOR_VERSION) -#error -#endif - -/** SW component version error */ -#if TMBSL_ERR_HDMI_COMP_VERSION != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_COMP_VERSION) -#error -#endif - -/** Invalid device unit number */ -#if TMBSL_ERR_HDMI_BAD_UNIT_NUMBER != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_BAD_UNIT_NUMBER) -#error -#endif - -/** Invalid input parameter other than unit number */ -#if TMBSL_ERR_HDMI_BAD_PARAMETER != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_BAD_PARAMETER) -#error -#endif - -/** Inconsistent input parameters */ -#if TMBSL_ERR_HDMI_INCONSISTENT_PARAMS != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_INCONSISTENT_PARAMS) -#error -#endif - -/** Component is not initialized */ -#if TMBSL_ERR_HDMI_NOT_INITIALIZED != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_NOT_INITIALIZED) -#error -#endif - -/** Command not supported for current device */ -#if TMBSL_ERR_HDMI_NOT_SUPPORTED != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_NOT_SUPPORTED) -#error -#endif - -/** Initialization failed */ -#if TMBSL_ERR_HDMI_INIT_FAILED != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_INIT_FAILED) -#error -#endif - -/** Component is busy and cannot do a new operation */ -#if TMBSL_ERR_HDMI_BUSY != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_BUSY) -#error -#endif - -/** I2C read error */ -#if TMBSL_ERR_HDMI_I2C_READ != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_READ) -#error -#endif - -/** I2C write error */ -#if TMBSL_ERR_HDMI_I2C_WRITE != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_WRITE) -#error -#endif - -/** Assertion failure */ -#if TMBSL_ERR_HDMI_ASSERTION != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_ASSERTION) -#error -#endif - -/** Bad EDID block checksum */ -#if TMBSL_ERR_HDMI_INVALID_CHECKSUM != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_INVALID_STATE) -#error -#endif - -/** No connection to HPD pin */ -#if TMBSL_ERR_HDMI_NULL_CONNECTION != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_NULL_CONNECTION) -#error -#endif - -/** Not allowed in DVI mode */ -#if TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_OPERATION_NOT_PERMITTED) -#error -#endif - -/** Ressource not available*/ -#if TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE != \ -(TMBSL_ERR_HDMI_BASE + TM_ERR_NO_RESOURCES) -#error -#endif - - -/*@}*/ - -/** - * A macro to check a condition and if true return a result - */ -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#include -#define RETIF(cond, rslt) if ((cond)) {pr_debug("%s %d\n", __func__, __LINE__); return (rslt); } -#else -#define RETIF(cond, rslt) if ((cond)) {return (rslt); } -#endif - -/** - * A macro to check a condition and if true return - * TMBSL_ERR_HDMI_BAD_PARAMETER. - * To save code space, it can be compiled out by defining NO_RETIF_BADPARAM on - * the compiler command line. - */ -#ifdef NO_RETIF_BADPARAM -#define RETIF_BADPARAM(cond) -#else -#define RETIF_BADPARAM(cond) if ((cond)) {return TMBSL_ERR_HDMI_BAD_PARAMETER; } -#endif - -/** - * A macro to check the result of a register API and if not TM_OK to return it. - * To save code space, it can be compiled out by defining NO_RETIF_REG_FAIL on - * the compiler command line. - */ -#ifdef NO_RETIF_REG_FAIL -#define RETIF_REG_FAIL(result) -#else -#define RETIF_REG_FAIL(result) if ((result) != TM_OK) {return (result); } -#endif - -/** - * Check the consistancy of BSL structure - */ -/* #define BSL_CONSISTANCY(_x_,_y_) do { \ */ -/* #if ((_x_) != (_y_) * (_x_)[0]) \ */ -/* #error "BSL HAS WRONG ARRAY SIZE" \ */ -/* #endif \ */ -/* } while (0) */ - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - -/** - * Driver events and states used for diagnosis - */ - typedef enum _tmbslTDA9989Event { - EV_DEINIT = 0, - EV_INIT = 1, - EV_STANDBY = 2, - EV_SLEEP = 3, - EV_ON = 4, - EV_UNPLUGGED = 5, - EV_PLUGGEDIN = 6, - EV_RESUME_UNPLUGGED = 7, - EV_RESUME_PLUGGEDIN = 8, - EV_GETBLOCKDATA = 9, - EV_SETINOUT = 10, - EV_OUTDISABLE = 11, - EV_HDCP_RUN = 12, - EV_HDCP_BKSV_NREPEAT = 13, - EV_HDCP_BKSV_NSECURE = 14, - EV_HDCP_BKSV_REPEAT = 15, - EV_HDCP_BSTATUS_GOOD = 16, - EV_HDCP_KSV_SECURE = 17, - EV_HDCP_T0 = 18, - EV_HDCP_STOP = 19, - EV_SINKON = 20, - EV_SINKOFF = 21, - EV_INVALID = 22 - } tmbslTDA9989Event_t; - - typedef enum _tmbslTDA9989State { - ST_UNINITIALIZED = 0, - ST_STANDBY = 1, - ST_SLEEP = 2, - ST_DISCONNECTED = 3, - ST_AWAIT_EDID = 4, - ST_SINK_CONNECTED = 5, - ST_VIDEO_NO_HDCP = 6, - ST_HDCP_WAIT_RX = 7, - ST_HDCP_WAIT_BSTATUS = 8, - ST_HDCP_WAIT_SHA_1 = 9, - ST_HDCP_AUTHENTICATED = 10, - ST_AWAIT_RX_SENSE = 11, - ST_INVALID = 12, - ST_NUM = 13 - } tmbslTDA9989State_t; - -/** - * An enum to index into the Device Instance Data shadowReg array - */ - enum _eShad { - E_SP00_INT_FLAGS_0 = 0, - E_SP00_INT_FLAGS_1 = 1, - E_SP00_INT_FLAGS_2 = 2, - E_SP00_VIP_CNTRL_0 = 3, - E_SP00_VIP_CNTRL_1 = 4, - E_SP00_VIP_CNTRL_2 = 5, - E_SP00_VIP_CNTRL_3 = 6, - E_SP00_VIP_CNTRL_4 = 7, - E_SP00_VIP_CNTRL_5 = 8, - E_SP00_MAT_CONTRL = 9, - E_SP00_TBG_CNTRL_0 = 10, - E_SP00_TBG_CNTRL_1 = 11, - E_SP00_HVF_CNTRL_0 = 12, - E_SP00_HVF_CNTRL_1 = 13, - E_SP00_TIMER_H = 14, - E_SP00_DEBUG_PROBE = 15, - E_SP00_AIP_CLKSEL = 16, - E_SP01_SC_VIDFORMAT = 17, - E_SP01_SC_CNTRL = 18, - E_SP01_TBG_CNTRL_0 = 19, -#ifdef TMFL_HDCP_SUPPORT - E_SP12_CTRL = 20, - E_SP12_BCAPS = 21, - E_SNUM = 22, /* Number of shadow registers */ - E_SNONE = 22 /* Index value indicating no shadow register */ -#else /* TMFL_HDCP_SUPPORT */ - E_SNUM = 20, /* Number of shadow registers */ - E_SNONE = 20 /* Index value indicating no shadow register */ -#endif /* TMFL_HDCP_SUPPORT */ - }; - -/** - * Page list - * These are indexes to the allowed register page numbers - */ - enum _ePage { - E_PAGE_00 = 0, - E_PAGE_01 = 1, - E_PAGE_02 = 2, - E_PAGE_09 = 3, - E_PAGE_10 = 4, - E_PAGE_11 = 5, - E_PAGE_12 = 6, - E_PAGE_13 = 7, - E_PAGE_NUM = 8, /* Number of pages */ - E_PAGE_INVALID = 8 /* Index value indicating invalid page */ - }; - -/** - * Macros to initialize and access the following register list enum _eReg - */ -/* Pack shadow index s, page index p and register address a into UInt16 */ -#define SPA(s, p, a) (UInt16)(((s)<<11)|((p)<<8)|(a)) -/* Unpacks shadow index s from UInt16 */ -#define SPA2SHAD(spa) (UInt8)((spa)>>11) -/* Unpacks page index p from UInt16 */ -#define SPA2PAGE(spa) (UInt8)(((spa)>>8)&0x0007) -/* Unpacks register address a from UInt16 */ -#define SPA2ADDR(spa) (UInt8)((spa)&0x00FF) - -/** - * Register list - * - * Each register symbol has these fields: E_REG_page_register_access - * - * The symbols have a 16-bit value as follows, including an index to - * the Device Instance Data shadowReg[] array: - * - * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ - * |15 |14 |13 |12 |11 |10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | - * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ - * | Shadow Index |Page Index | Register Address | - * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ - * - */ - enum _eReg { - /*************************************************************************/ - /** Rows formatted in "HDMI Driver - Register List.xls" and pasted here **/ - /*************************************************************************/ - E_REG_MIN_ADR = 0x00, /* First register on all pages */ - E_REG_CURPAGE_ADR_W = 0xFF, /* Address register on all pages */ - /*CEC Registers */ - - E_REG_CEC_INTERRUPTSTATUS_R = 0xEE, - E_REG_CEC_RXSHPDINTENA_RW = 0xFC, - E_REG_CEC_RXSHPDINT_R = 0xFD, - E_REG_CEC_RXSHPDLEV_R = 0xFE, - E_REG_CEC_ENAMODS_RW = 0xFF, - E_REG_CEC_FRO_IM_CLK_CTRL_RW = 0xFB, - - E_REG_P00_VERSION_R = SPA(E_SNONE, E_PAGE_00, 0x00), - E_REG_P00_MAIN_CNTRL0_RW = SPA(E_SNONE, E_PAGE_00, 0x01), - E_REG_P00_VERSION_MSB_RW = SPA(E_SNONE, E_PAGE_00, 0x02), - E_REG_P00_PACKAGE_TYPE_R = SPA(E_SNONE, E_PAGE_00, 0x03), - E_REG_P00_SR_REG_W = SPA(E_SNONE, E_PAGE_00, 0x0A), - E_REG_P00_DDC_DISABLE_RW = SPA(E_SNONE, E_PAGE_00, 0x0B), - E_REG_P00_CCLK_ON_RW = SPA(E_SNONE, E_PAGE_00, 0x0C), - E_REG_P00_I2C_MASTER_RW = SPA(E_SNONE, E_PAGE_00, 0x0D), -#ifdef TMFL_HDCP_OPTIMIZED_POWER - E_REG_FEAT_POWER_DOWN = SPA(E_SNONE, E_PAGE_00, 0x0E), -#endif - - E_REG_P00_INT_FLAGS_0_RW = SPA(E_SP00_INT_FLAGS_0, E_PAGE_00, 0x0F), - E_REG_P00_INT_FLAGS_1_RW = SPA(E_SP00_INT_FLAGS_1, E_PAGE_00, 0x10), - E_REG_P00_INT_FLAGS_2_RW = SPA(E_SP00_INT_FLAGS_2, E_PAGE_00, 0x11), - /*E_REG_P00_INT_FLAGS_3_R = SPA(E_SNONE , E_PAGE_00, 0x12), */ - E_REG_P00_SW_INT_W = SPA(E_SNONE, E_PAGE_00, 0x15), - E_REG_P00_ENA_ACLK_RW = SPA(E_SNONE, E_PAGE_00, 0x16), - E_REG_P00_ENA_VP_0_RW = SPA(E_SNONE, E_PAGE_00, 0x18), - E_REG_P00_ENA_VP_1_RW = SPA(E_SNONE, E_PAGE_00, 0x19), - E_REG_P00_ENA_VP_2_RW = SPA(E_SNONE, E_PAGE_00, 0x1A), - E_REG_P00_ENA_AP_RW = SPA(E_SNONE, E_PAGE_00, 0x1E), - E_REG_P00_VIP_CNTRL_0_W = SPA(E_SP00_VIP_CNTRL_0, E_PAGE_00, 0x20), - E_REG_P00_VIP_CNTRL_1_W = SPA(E_SP00_VIP_CNTRL_1, E_PAGE_00, 0x21), - E_REG_P00_VIP_CNTRL_2_W = SPA(E_SP00_VIP_CNTRL_2, E_PAGE_00, 0x22), - E_REG_P00_VIP_CNTRL_3_W = SPA(E_SP00_VIP_CNTRL_3, E_PAGE_00, 0x23), - E_REG_P00_VIP_CNTRL_4_W = SPA(E_SP00_VIP_CNTRL_4, E_PAGE_00, 0x24), - E_REG_P00_VIP_CNTRL_5_W = SPA(E_SP00_VIP_CNTRL_5, E_PAGE_00, 0x25), - E_REG_P00_MUX_AP_RW = SPA(E_SNONE, E_PAGE_00, 0x26), - E_REG_P00_MUX_VP_VIP_OUT_RW = SPA(E_SNONE, E_PAGE_00, 0x27), - E_REG_P00_MAT_CONTRL_W = SPA(E_SP00_MAT_CONTRL, E_PAGE_00, 0x80), - E_REG_P00_MAT_OI1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x81), - E_REG_P00_MAT_OI1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x82), - E_REG_P00_MAT_OI2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x83), - E_REG_P00_MAT_OI2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x84), - E_REG_P00_MAT_OI3_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x85), - E_REG_P00_MAT_OI3_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x86), - E_REG_P00_MAT_P11_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x87), - E_REG_P00_MAT_P11_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x88), - E_REG_P00_MAT_P12_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x89), - E_REG_P00_MAT_P12_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x8A), - E_REG_P00_MAT_P13_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x8B), - E_REG_P00_MAT_P13_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x8C), - E_REG_P00_MAT_P21_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x8D), - E_REG_P00_MAT_P21_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x8E), - E_REG_P00_MAT_P22_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x8F), - E_REG_P00_MAT_P22_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x90), - E_REG_P00_MAT_P23_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x91), - E_REG_P00_MAT_P23_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x92), - E_REG_P00_MAT_P31_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x93), - E_REG_P00_MAT_P31_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x94), - E_REG_P00_MAT_P32_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x95), - E_REG_P00_MAT_P32_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x96), - E_REG_P00_MAT_P33_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x97), - E_REG_P00_MAT_P33_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x98), - E_REG_P00_MAT_OO1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x99), - E_REG_P00_MAT_OO1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x9A), - E_REG_P00_MAT_OO2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x9B), - E_REG_P00_MAT_OO2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x9C), - E_REG_P00_MAT_OO3_MSB_W = SPA(E_SNONE, E_PAGE_00, 0x9D), - E_REG_P00_MAT_OO3_LSB_W = SPA(E_SNONE, E_PAGE_00, 0x9E), - E_REG_P00_VIDFORMAT_W = SPA(E_SNONE, E_PAGE_00, 0xA0), - E_REG_P00_REFPIX_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xA1), - E_REG_P00_REFPIX_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xA2), - E_REG_P00_REFLINE_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xA3), - E_REG_P00_REFLINE_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xA4), - E_REG_P00_NPIX_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xA5), - E_REG_P00_NPIX_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xA6), - E_REG_P00_NLINE_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xA7), - E_REG_P00_NLINE_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xA8), - E_REG_P00_VS_LINE_STRT_1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xA9), - E_REG_P00_VS_LINE_STRT_1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xAA), - E_REG_P00_VS_PIX_STRT_1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xAB), - E_REG_P00_VS_PIX_STRT_1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xAC), - E_REG_P00_VS_LINE_END_1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xAD), - E_REG_P00_VS_LINE_END_1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xAE), - E_REG_P00_VS_PIX_END_1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xAF), - E_REG_P00_VS_PIX_END_1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xB0), - E_REG_P00_VS_LINE_STRT_2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xB1), - E_REG_P00_VS_LINE_STRT_2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xB2), - E_REG_P00_VS_PIX_STRT_2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xB3), - E_REG_P00_VS_PIX_STRT_2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xB4), - E_REG_P00_VS_LINE_END_2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xB5), - E_REG_P00_VS_LINE_END_2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xB6), - E_REG_P00_VS_PIX_END_2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xB7), - E_REG_P00_VS_PIX_END_2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xB8), - E_REG_P00_HS_PIX_START_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xB9), - E_REG_P00_HS_PIX_START_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xBA), - E_REG_P00_HS_PIX_STOP_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xBB), - E_REG_P00_HS_PIX_STOP_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xBC), - E_REG_P00_VWIN_START_1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xBD), - E_REG_P00_VWIN_START_1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xBE), - E_REG_P00_VWIN_END_1_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xBF), - E_REG_P00_VWIN_END_1_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xC0), - E_REG_P00_VWIN_START_2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xC1), - E_REG_P00_VWIN_START_2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xC2), - E_REG_P00_VWIN_END_2_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xC3), - E_REG_P00_VWIN_END_2_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xC4), - E_REG_P00_DE_START_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xC5), - E_REG_P00_DE_START_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xC6), - E_REG_P00_DE_STOP_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xC7), - E_REG_P00_DE_STOP_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xC8), - E_REG_P00_COLBAR_WIDTH_W = SPA(E_SNONE, E_PAGE_00, 0xC9), - E_REG_P00_TBG_CNTRL_0_W = SPA(E_SP00_TBG_CNTRL_0, E_PAGE_00, 0xCA), - E_REG_P00_TBG_CNTRL_1_W = SPA(E_SP00_TBG_CNTRL_1, E_PAGE_00, 0xCB), - E_REG_P00_VBL_OFFSET_START_W = SPA(E_SNONE, E_PAGE_00, 0xCC), - E_REG_P00_VBL_OFFSET_END_W = SPA(E_SNONE, E_PAGE_00, 0xCD), - E_REG_P00_HBL_OFFSET_START_W = SPA(E_SNONE, E_PAGE_00, 0xCE), - E_REG_P00_HBL_OFFSET_END_W = SPA(E_SNONE, E_PAGE_00, 0xCF), - E_REG_P00_DWIN_RE_DE_W = SPA(E_SNONE, E_PAGE_00, 0xD0), - E_REG_P00_DWIN_FE_DE_W = SPA(E_SNONE, E_PAGE_00, 0xD1), -#ifdef TMFL_RGB_DDR_12BITS - E_REG_P00_VSPACE_START_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xD2), - E_REG_P00_VSPACE_START_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xD3), - E_REG_P00_VSPACE_END_MSB_W = SPA(E_SNONE, E_PAGE_00, 0xD4), - E_REG_P00_VSPACE_END_LSB_W = SPA(E_SNONE, E_PAGE_00, 0xD5), - E_REG_P00_ENABLE_SPACE_W = SPA(E_SNONE, E_PAGE_00, 0xD6), - E_REG_P00_VSPACE_Y_DATA_W = SPA(E_SNONE, E_PAGE_00, 0xD7), - E_REG_P00_VSPACE_U_DATA_W = SPA(E_SNONE, E_PAGE_00, 0xD8), - E_REG_P00_VSPACE_V_DATA_W = SPA(E_SNONE, E_PAGE_00, 0xD9), -#endif - - E_REG_P00_TIMER_RI_PJ_RW = SPA(E_SNONE, E_PAGE_00, 0xE1), - E_REG_P00_BCAPS_POLL_RW = SPA(E_SNONE, E_PAGE_00, 0xE2), - E_REG_P00_100us_RW = SPA(E_SNONE, E_PAGE_00, 0xE3), - - E_REG_P00_HVF_CNTRL_0_W = SPA(E_SP00_HVF_CNTRL_0, E_PAGE_00, 0xE4), - E_REG_P00_HVF_CNTRL_1_W = SPA(E_SP00_HVF_CNTRL_1, E_PAGE_00, 0xE5), - - E_REG_P00_TIMER_H_W = SPA(E_SP00_TIMER_H, E_PAGE_00, 0xE8), - E_REG_P00_TIMER_M_W = SPA(E_SNONE, E_PAGE_00, 0xE9), - E_REG_P00_TIMER_L_W = SPA(E_SNONE, E_PAGE_00, 0xEA), - E_REG_P00_TIMER_2SEC_W = SPA(E_SNONE, E_PAGE_00, 0xEB), - E_REG_P00_TIMER_5SEC_W = SPA(E_SNONE, E_PAGE_00, 0xEC), - E_REG_P00_NDIV_IM_W = SPA(E_SNONE, E_PAGE_00, 0xEE), - E_REG_P00_NDIV_PF_W = SPA(E_SNONE, E_PAGE_00, 0xEF), - E_REG_P00_RPT_CNTRL_W = SPA(E_SNONE, E_PAGE_00, 0xF0), - E_REG_P00_LEAD_OFF_W = SPA(E_SNONE, E_PAGE_00, 0xF1), - E_REG_P00_TRAIL_OFF_W = SPA(E_SNONE, E_PAGE_00, 0xF2), - E_REG_P00_MISR_EXP_0_RW = SPA(E_SNONE, E_PAGE_00, 0xF3), - E_REG_P00_MISR_EXP_1_RW = SPA(E_SNONE, E_PAGE_00, 0xF4), - E_REG_P00_MISR_EXP_2_RW = SPA(E_SNONE, E_PAGE_00, 0xF5), - E_REG_P00_MISR_0_R = SPA(E_SNONE, E_PAGE_00, 0xF6), - E_REG_P00_MISR_1_R = SPA(E_SNONE, E_PAGE_00, 0xF7), - E_REG_P00_DEBUG_PROBE_W = SPA(E_SP00_DEBUG_PROBE, E_PAGE_00, 0xF8), - E_REG_P00_GHOST_XADDR_W = SPA(E_SNONE, E_PAGE_00, 0xF9), - E_REG_P00_MISR_2_R = SPA(E_SNONE, E_PAGE_00, 0xFA), - E_REG_P00_I2S_FORMAT_RW = SPA(E_SNONE, E_PAGE_00, 0xFC), - E_REG_P00_AIP_CLKSEL_W = SPA(E_SP00_AIP_CLKSEL, E_PAGE_00, 0xFD), - E_REG_P00_GHOST_ADDR_W = SPA(E_SNONE, E_PAGE_00, 0xFE), - E_REG_P01_SC_VIDFORMAT_W = SPA(E_SP01_SC_VIDFORMAT, E_PAGE_01, 0x00), - - E_REG_P01_SC_CNTRL_W = SPA(E_SP01_SC_CNTRL, E_PAGE_01, 0x01), - E_REG_P01_SC_DELTA_PHASE_V_W = SPA(E_SNONE, E_PAGE_01, 0x02), - E_REG_P01_SC_DELTA_PHASE_H_W = SPA(E_SNONE, E_PAGE_01, 0x03), - E_REG_P01_SC_START_PHASE_H_W = SPA(E_SNONE, E_PAGE_01, 0x04), - E_REG_P01_SC_NPIX_IN_LSB_W = SPA(E_SNONE, E_PAGE_01, 0x05), - E_REG_P01_SC_NPIX_IN_MSB_W = SPA(E_SNONE, E_PAGE_01, 0x06), - E_REG_P01_SC_NPIX_OUT_LSB_W = SPA(E_SNONE, E_PAGE_01, 0x07), - E_REG_P01_SC_NPIX_OUT_MSB_W = SPA(E_SNONE, E_PAGE_01, 0x08), - E_REG_P01_SC_NLINE_IN_LSB_W = SPA(E_SNONE, E_PAGE_01, 0x09), - E_REG_P01_SC_NLINE_IN_MSB_W = SPA(E_SNONE, E_PAGE_01, 0x0A), - E_REG_P01_SC_NLINE_OUT_LSB_W = SPA(E_SNONE, E_PAGE_01, 0x0B), - E_REG_P01_SC_NLINE_OUT_MSB_W = SPA(E_SNONE, E_PAGE_01, 0x0C), - E_REG_P01_SC_NLINE_SKIP_W = SPA(E_SNONE, E_PAGE_01, 0x0D), - E_REG_P01_SC_SAMPLE_BUFFILL_R = SPA(E_SNONE, E_PAGE_01, 0x0E), - E_REG_P01_SC_MAX_BUFFILL_P_0_R = SPA(E_SNONE, E_PAGE_01, 0x0F), - E_REG_P01_SC_MAX_BUFFILL_P_1_R = SPA(E_SNONE, E_PAGE_01, 0x10), - E_REG_P01_SC_MAX_BUFFILL_D_0_R = SPA(E_SNONE, E_PAGE_01, 0x11), - E_REG_P01_SC_MAX_BUFFILL_D_1_R = SPA(E_SNONE, E_PAGE_01, 0x12), - E_REG_P01_SC_SAMPLE_FIFOFILL_R = SPA(E_SNONE, E_PAGE_01, 0x13), - E_REG_P01_SC_MAX_FIFOFILL_PI_R = SPA(E_SNONE, E_PAGE_01, 0x14), - E_REG_P01_SC_MIN_FIFOFILL_PO1_R = SPA(E_SNONE, E_PAGE_01, 0x15), - E_REG_P01_SC_MIN_FIFOFILL_PO2_R = SPA(E_SNONE, E_PAGE_01, 0x16), - E_REG_P01_SC_MIN_FIFOFILL_PO3_R = SPA(E_SNONE, E_PAGE_01, 0x17), - E_REG_P01_SC_MIN_FIFOFILL_PO4_R = SPA(E_SNONE, E_PAGE_01, 0x18), - E_REG_P01_SC_MAX_FIFOFILL_DI_R = SPA(E_SNONE, E_PAGE_01, 0x19), - E_REG_P01_SC_MAX_FIFOFILL_DO_R = SPA(E_SNONE, E_PAGE_01, 0x1A), - E_REG_P01_SC_VS_LUT_0_W = SPA(E_SNONE, E_PAGE_01, 0x1B), - E_REG_P01_SC_VS_LUT_1_W = SPA(E_SNONE, E_PAGE_01, 0x1C), - E_REG_P01_SC_VS_LUT_2_W = SPA(E_SNONE, E_PAGE_01, 0x1D), - E_REG_P01_SC_VS_LUT_3_W = SPA(E_SNONE, E_PAGE_01, 0x1E), - E_REG_P01_SC_VS_LUT_4_W = SPA(E_SNONE, E_PAGE_01, 0x1F), - E_REG_P01_SC_VS_LUT_5_W = SPA(E_SNONE, E_PAGE_01, 0x20), - E_REG_P01_SC_VS_LUT_6_W = SPA(E_SNONE, E_PAGE_01, 0x21), - E_REG_P01_SC_VS_LUT_7_W = SPA(E_SNONE, E_PAGE_01, 0x22), - E_REG_P01_SC_VS_LUT_8_W = SPA(E_SNONE, E_PAGE_01, 0x23), - E_REG_P01_SC_VS_LUT_9_W = SPA(E_SNONE, E_PAGE_01, 0x24), - E_REG_P01_SC_VS_LUT_10_W = SPA(E_SNONE, E_PAGE_01, 0x25), - E_REG_P01_SC_VS_LUT_11_W = SPA(E_SNONE, E_PAGE_01, 0x26), - E_REG_P01_SC_VS_LUT_12_W = SPA(E_SNONE, E_PAGE_01, 0x27), - E_REG_P01_SC_VS_LUT_13_W = SPA(E_SNONE, E_PAGE_01, 0x28), - E_REG_P01_SC_VS_LUT_14_W = SPA(E_SNONE, E_PAGE_01, 0x29), - E_REG_P01_SC_VS_LUT_15_W = SPA(E_SNONE, E_PAGE_01, 0x2A), - E_REG_P01_SC_VS_LUT_16_W = SPA(E_SNONE, E_PAGE_01, 0x2B), - E_REG_P01_SC_VS_LUT_17_W = SPA(E_SNONE, E_PAGE_01, 0x2C), - E_REG_P01_SC_VS_LUT_18_W = SPA(E_SNONE, E_PAGE_01, 0x2D), - E_REG_P01_SC_VS_LUT_19_W = SPA(E_SNONE, E_PAGE_01, 0x2E), - E_REG_P01_SC_VS_LUT_20_W = SPA(E_SNONE, E_PAGE_01, 0x2F), - E_REG_P01_SC_VS_LUT_21_W = SPA(E_SNONE, E_PAGE_01, 0x30), - E_REG_P01_SC_VS_LUT_22_W = SPA(E_SNONE, E_PAGE_01, 0x31), - E_REG_P01_SC_VS_LUT_23_W = SPA(E_SNONE, E_PAGE_01, 0x32), - E_REG_P01_SC_VS_LUT_24_W = SPA(E_SNONE, E_PAGE_01, 0x33), - E_REG_P01_SC_VS_LUT_25_W = SPA(E_SNONE, E_PAGE_01, 0x34), - E_REG_P01_SC_VS_LUT_26_W = SPA(E_SNONE, E_PAGE_01, 0x35), - E_REG_P01_SC_VS_LUT_27_W = SPA(E_SNONE, E_PAGE_01, 0x36), - E_REG_P01_SC_VS_LUT_28_W = SPA(E_SNONE, E_PAGE_01, 0x37), - E_REG_P01_SC_VS_LUT_29_W = SPA(E_SNONE, E_PAGE_01, 0x38), - E_REG_P01_SC_VS_LUT_30_W = SPA(E_SNONE, E_PAGE_01, 0x39), - E_REG_P01_SC_VS_LUT_31_W = SPA(E_SNONE, E_PAGE_01, 0x3A), - E_REG_P01_SC_VS_LUT_32_W = SPA(E_SNONE, E_PAGE_01, 0x3B), - E_REG_P01_SC_VS_LUT_33_W = SPA(E_SNONE, E_PAGE_01, 0x3C), - E_REG_P01_SC_VS_LUT_34_W = SPA(E_SNONE, E_PAGE_01, 0x3D), - E_REG_P01_SC_VS_LUT_35_W = SPA(E_SNONE, E_PAGE_01, 0x3E), - E_REG_P01_SC_VS_LUT_36_W = SPA(E_SNONE, E_PAGE_01, 0x3F), - E_REG_P01_SC_VS_LUT_37_W = SPA(E_SNONE, E_PAGE_01, 0x40), - E_REG_P01_SC_VS_LUT_38_W = SPA(E_SNONE, E_PAGE_01, 0x41), - E_REG_P01_SC_VS_LUT_39_W = SPA(E_SNONE, E_PAGE_01, 0x42), - E_REG_P01_SC_VS_LUT_40_W = SPA(E_SNONE, E_PAGE_01, 0x43), - E_REG_P01_SC_VS_LUT_41_W = SPA(E_SNONE, E_PAGE_01, 0x44), - E_REG_P01_SC_VS_LUT_42_W = SPA(E_SNONE, E_PAGE_01, 0x45), - E_REG_P01_SC_VS_LUT_43_W = SPA(E_SNONE, E_PAGE_01, 0x46), - E_REG_P01_SC_VS_LUT_44_W = SPA(E_SNONE, E_PAGE_01, 0x47), - E_REG_P01_SC_LAT_SCO_RW = SPA(E_SNONE, E_PAGE_01, 0x48), - E_REG_P01_VIDFORMAT_W = SPA(E_SNONE, E_PAGE_01, 0xA0), - E_REG_P01_REFPIX_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xA1), - E_REG_P01_REFPIX_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xA2), - E_REG_P01_REFLINE_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xA3), - E_REG_P01_REFLINE_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xA4), - E_REG_P01_NPIX_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xA5), - E_REG_P01_NPIX_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xA6), - E_REG_P01_NLINE_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xA7), - E_REG_P01_NLINE_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xA8), - E_REG_P01_VWIN_START_1_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xBD), - E_REG_P01_VWIN_START_1_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xBE), - E_REG_P01_VWIN_END_1_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xBF), - E_REG_P01_VWIN_END_1_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xC0), - E_REG_P01_VWIN_START_2_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xC1), - E_REG_P01_VWIN_START_2_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xC2), - E_REG_P01_VWIN_END_2_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xC3), - E_REG_P01_VWIN_END_2_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xC4), - E_REG_P01_DE_START_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xC5), - E_REG_P01_DE_START_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xC6), - E_REG_P01_DE_STOP_MSB_W = SPA(E_SNONE, E_PAGE_01, 0xC7), - E_REG_P01_DE_STOP_LSB_W = SPA(E_SNONE, E_PAGE_01, 0xC8), - E_REG_P01_TBG_CNTRL_0_W = SPA(E_SP01_TBG_CNTRL_0, E_PAGE_01, 0xCA), - E_REG_P02_PLL_SERIAL_1_RW = SPA(E_SNONE, E_PAGE_02, 0x00), - E_REG_P02_PLL_SERIAL_2_RW = SPA(E_SNONE, E_PAGE_02, 0x01), - E_REG_P02_PLL_SERIAL_3_RW = SPA(E_SNONE, E_PAGE_02, 0x02), - E_REG_P02_SERIALIZER_RW = SPA(E_SNONE, E_PAGE_02, 0x03), - E_REG_P02_BUFFER_OUT_RW = SPA(E_SNONE, E_PAGE_02, 0x04), - E_REG_P02_PLL_SCG1_RW = SPA(E_SNONE, E_PAGE_02, 0x05), - E_REG_P02_PLL_SCG2_RW = SPA(E_SNONE, E_PAGE_02, 0x06), - E_REG_P02_PLL_SCGN1_RW = SPA(E_SNONE, E_PAGE_02, 0x07), - E_REG_P02_PLL_SCGN2_RW = SPA(E_SNONE, E_PAGE_02, 0x08), - E_REG_P02_PLL_SCGR1_RW = SPA(E_SNONE, E_PAGE_02, 0x09), - E_REG_P02_PLL_SCGR2_RW = SPA(E_SNONE, E_PAGE_02, 0x0A), - E_REG_P02_VAI_PLL_R = SPA(E_SNONE, E_PAGE_02, 0x0D), - E_REG_P02_AUDIO_DIV_RW = SPA(E_SNONE, E_PAGE_02, 0x0E), - E_REG_P02_TEST1_RW = SPA(E_SNONE, E_PAGE_02, 0x0F), - /*E_REG_P02_TEST2_RW = SPA(E_SNONE , E_PAGE_02, 0x10), */ - E_REG_P02_SEL_CLK_RW = SPA(E_SNONE, E_PAGE_02, 0x11), - E_REG_P02_ANA_GENERAL_RW = SPA(E_SNONE, E_PAGE_02, 0x12), - E_REG_P02_BUFFER_OUT2_RW = SPA(E_SNONE, E_PAGE_02, 0x13), - E_REG_P02_SRL_TSTPAT0_RW = SPA(E_SNONE, E_PAGE_02, 0x14), - E_REG_P02_SRL_TSTPAT1_RW = SPA(E_SNONE, E_PAGE_02, 0x15), - E_REG_P02_SRL_TSTPAT2_RW = SPA(E_SNONE, E_PAGE_02, 0x16), - E_REG_P02_SRL_TSTPAT3_RW = SPA(E_SNONE, E_PAGE_02, 0x17), - - E_REG_P09_EDID_DATA_0_R = SPA(E_SNONE, E_PAGE_09, 0x00), - E_REG_P09_EDID_DATA_1_R = SPA(E_SNONE, E_PAGE_09, 0x01), - E_REG_P09_EDID_DATA_2_R = SPA(E_SNONE, E_PAGE_09, 0x02), - E_REG_P09_EDID_DATA_3_R = SPA(E_SNONE, E_PAGE_09, 0x03), - E_REG_P09_EDID_DATA_4_R = SPA(E_SNONE, E_PAGE_09, 0x04), - E_REG_P09_EDID_DATA_5_R = SPA(E_SNONE, E_PAGE_09, 0x05), - E_REG_P09_EDID_DATA_6_R = SPA(E_SNONE, E_PAGE_09, 0x06), - E_REG_P09_EDID_DATA_7_R = SPA(E_SNONE, E_PAGE_09, 0x07), - E_REG_P09_EDID_DATA_8_R = SPA(E_SNONE, E_PAGE_09, 0x08), - E_REG_P09_EDID_DATA_9_R = SPA(E_SNONE, E_PAGE_09, 0x09), - E_REG_P09_EDID_DATA_10_R = SPA(E_SNONE, E_PAGE_09, 0x0A), - E_REG_P09_EDID_DATA_11_R = SPA(E_SNONE, E_PAGE_09, 0x0B), - E_REG_P09_EDID_DATA_12_R = SPA(E_SNONE, E_PAGE_09, 0x0C), - E_REG_P09_EDID_DATA_13_R = SPA(E_SNONE, E_PAGE_09, 0x0D), - E_REG_P09_EDID_DATA_14_R = SPA(E_SNONE, E_PAGE_09, 0x0E), - E_REG_P09_EDID_DATA_15_R = SPA(E_SNONE, E_PAGE_09, 0x0F), - E_REG_P09_EDID_DATA_16_R = SPA(E_SNONE, E_PAGE_09, 0x10), - E_REG_P09_EDID_DATA_17_R = SPA(E_SNONE, E_PAGE_09, 0x11), - E_REG_P09_EDID_DATA_18_R = SPA(E_SNONE, E_PAGE_09, 0x12), - E_REG_P09_EDID_DATA_19_R = SPA(E_SNONE, E_PAGE_09, 0x13), - E_REG_P09_EDID_DATA_20_R = SPA(E_SNONE, E_PAGE_09, 0x14), - E_REG_P09_EDID_DATA_21_R = SPA(E_SNONE, E_PAGE_09, 0x15), - E_REG_P09_EDID_DATA_22_R = SPA(E_SNONE, E_PAGE_09, 0x16), - E_REG_P09_EDID_DATA_23_R = SPA(E_SNONE, E_PAGE_09, 0x17), - E_REG_P09_EDID_DATA_24_R = SPA(E_SNONE, E_PAGE_09, 0x18), - E_REG_P09_EDID_DATA_25_R = SPA(E_SNONE, E_PAGE_09, 0x19), - E_REG_P09_EDID_DATA_26_R = SPA(E_SNONE, E_PAGE_09, 0x1A), - E_REG_P09_EDID_DATA_27_R = SPA(E_SNONE, E_PAGE_09, 0x1B), - E_REG_P09_EDID_DATA_28_R = SPA(E_SNONE, E_PAGE_09, 0x1C), - E_REG_P09_EDID_DATA_29_R = SPA(E_SNONE, E_PAGE_09, 0x1D), - E_REG_P09_EDID_DATA_30_R = SPA(E_SNONE, E_PAGE_09, 0x1E), - E_REG_P09_EDID_DATA_31_R = SPA(E_SNONE, E_PAGE_09, 0x1F), - E_REG_P09_EDID_DATA_32_R = SPA(E_SNONE, E_PAGE_09, 0x20), - E_REG_P09_EDID_DATA_33_R = SPA(E_SNONE, E_PAGE_09, 0x21), - E_REG_P09_EDID_DATA_34_R = SPA(E_SNONE, E_PAGE_09, 0x22), - E_REG_P09_EDID_DATA_35_R = SPA(E_SNONE, E_PAGE_09, 0x23), - E_REG_P09_EDID_DATA_36_R = SPA(E_SNONE, E_PAGE_09, 0x24), - E_REG_P09_EDID_DATA_37_R = SPA(E_SNONE, E_PAGE_09, 0x25), - E_REG_P09_EDID_DATA_38_R = SPA(E_SNONE, E_PAGE_09, 0x26), - E_REG_P09_EDID_DATA_39_R = SPA(E_SNONE, E_PAGE_09, 0x27), - E_REG_P09_EDID_DATA_40_R = SPA(E_SNONE, E_PAGE_09, 0x28), - E_REG_P09_EDID_DATA_41_R = SPA(E_SNONE, E_PAGE_09, 0x29), - E_REG_P09_EDID_DATA_42_R = SPA(E_SNONE, E_PAGE_09, 0x2A), - E_REG_P09_EDID_DATA_43_R = SPA(E_SNONE, E_PAGE_09, 0x2B), - E_REG_P09_EDID_DATA_44_R = SPA(E_SNONE, E_PAGE_09, 0x2C), - E_REG_P09_EDID_DATA_45_R = SPA(E_SNONE, E_PAGE_09, 0x2D), - E_REG_P09_EDID_DATA_46_R = SPA(E_SNONE, E_PAGE_09, 0x2E), - E_REG_P09_EDID_DATA_47_R = SPA(E_SNONE, E_PAGE_09, 0x2F), - E_REG_P09_EDID_DATA_48_R = SPA(E_SNONE, E_PAGE_09, 0x30), - E_REG_P09_EDID_DATA_49_R = SPA(E_SNONE, E_PAGE_09, 0x31), - E_REG_P09_EDID_DATA_50_R = SPA(E_SNONE, E_PAGE_09, 0x32), - E_REG_P09_EDID_DATA_51_R = SPA(E_SNONE, E_PAGE_09, 0x33), - E_REG_P09_EDID_DATA_52_R = SPA(E_SNONE, E_PAGE_09, 0x34), - E_REG_P09_EDID_DATA_53_R = SPA(E_SNONE, E_PAGE_09, 0x35), - E_REG_P09_EDID_DATA_54_R = SPA(E_SNONE, E_PAGE_09, 0x36), - E_REG_P09_EDID_DATA_55_R = SPA(E_SNONE, E_PAGE_09, 0x37), - E_REG_P09_EDID_DATA_56_R = SPA(E_SNONE, E_PAGE_09, 0x38), - E_REG_P09_EDID_DATA_57_R = SPA(E_SNONE, E_PAGE_09, 0x39), - E_REG_P09_EDID_DATA_58_R = SPA(E_SNONE, E_PAGE_09, 0x3A), - E_REG_P09_EDID_DATA_59_R = SPA(E_SNONE, E_PAGE_09, 0x3B), - E_REG_P09_EDID_DATA_60_R = SPA(E_SNONE, E_PAGE_09, 0x3C), - E_REG_P09_EDID_DATA_61_R = SPA(E_SNONE, E_PAGE_09, 0x3D), - E_REG_P09_EDID_DATA_62_R = SPA(E_SNONE, E_PAGE_09, 0x3E), - E_REG_P09_EDID_DATA_63_R = SPA(E_SNONE, E_PAGE_09, 0x3F), - E_REG_P09_EDID_DATA_64_R = SPA(E_SNONE, E_PAGE_09, 0x40), - E_REG_P09_EDID_DATA_65_R = SPA(E_SNONE, E_PAGE_09, 0x41), - E_REG_P09_EDID_DATA_66_R = SPA(E_SNONE, E_PAGE_09, 0x42), - E_REG_P09_EDID_DATA_67_R = SPA(E_SNONE, E_PAGE_09, 0x43), - E_REG_P09_EDID_DATA_68_R = SPA(E_SNONE, E_PAGE_09, 0x44), - E_REG_P09_EDID_DATA_69_R = SPA(E_SNONE, E_PAGE_09, 0x45), - E_REG_P09_EDID_DATA_70_R = SPA(E_SNONE, E_PAGE_09, 0x46), - E_REG_P09_EDID_DATA_71_R = SPA(E_SNONE, E_PAGE_09, 0x47), - E_REG_P09_EDID_DATA_72_R = SPA(E_SNONE, E_PAGE_09, 0x48), - E_REG_P09_EDID_DATA_73_R = SPA(E_SNONE, E_PAGE_09, 0x49), - E_REG_P09_EDID_DATA_74_R = SPA(E_SNONE, E_PAGE_09, 0x4A), - E_REG_P09_EDID_DATA_75_R = SPA(E_SNONE, E_PAGE_09, 0x4B), - E_REG_P09_EDID_DATA_76_R = SPA(E_SNONE, E_PAGE_09, 0x4C), - E_REG_P09_EDID_DATA_77_R = SPA(E_SNONE, E_PAGE_09, 0x4D), - E_REG_P09_EDID_DATA_78_R = SPA(E_SNONE, E_PAGE_09, 0x4E), - E_REG_P09_EDID_DATA_79_R = SPA(E_SNONE, E_PAGE_09, 0x4F), - E_REG_P09_EDID_DATA_80_R = SPA(E_SNONE, E_PAGE_09, 0x50), - E_REG_P09_EDID_DATA_81_R = SPA(E_SNONE, E_PAGE_09, 0x51), - E_REG_P09_EDID_DATA_82_R = SPA(E_SNONE, E_PAGE_09, 0x52), - E_REG_P09_EDID_DATA_83_R = SPA(E_SNONE, E_PAGE_09, 0x53), - E_REG_P09_EDID_DATA_84_R = SPA(E_SNONE, E_PAGE_09, 0x54), - E_REG_P09_EDID_DATA_85_R = SPA(E_SNONE, E_PAGE_09, 0x55), - E_REG_P09_EDID_DATA_86_R = SPA(E_SNONE, E_PAGE_09, 0x56), - E_REG_P09_EDID_DATA_87_R = SPA(E_SNONE, E_PAGE_09, 0x57), - E_REG_P09_EDID_DATA_88_R = SPA(E_SNONE, E_PAGE_09, 0x58), - E_REG_P09_EDID_DATA_89_R = SPA(E_SNONE, E_PAGE_09, 0x59), - E_REG_P09_EDID_DATA_90_R = SPA(E_SNONE, E_PAGE_09, 0x5A), - E_REG_P09_EDID_DATA_91_R = SPA(E_SNONE, E_PAGE_09, 0x5B), - E_REG_P09_EDID_DATA_92_R = SPA(E_SNONE, E_PAGE_09, 0x5C), - E_REG_P09_EDID_DATA_93_R = SPA(E_SNONE, E_PAGE_09, 0x5D), - E_REG_P09_EDID_DATA_94_R = SPA(E_SNONE, E_PAGE_09, 0x5E), - E_REG_P09_EDID_DATA_95_R = SPA(E_SNONE, E_PAGE_09, 0x5F), - E_REG_P09_EDID_DATA_96_R = SPA(E_SNONE, E_PAGE_09, 0x60), - E_REG_P09_EDID_DATA_97_R = SPA(E_SNONE, E_PAGE_09, 0x61), - E_REG_P09_EDID_DATA_98_R = SPA(E_SNONE, E_PAGE_09, 0x62), - E_REG_P09_EDID_DATA_99_R = SPA(E_SNONE, E_PAGE_09, 0x63), - E_REG_P09_EDID_DATA_100_R = SPA(E_SNONE, E_PAGE_09, 0x64), - E_REG_P09_EDID_DATA_101_R = SPA(E_SNONE, E_PAGE_09, 0x65), - E_REG_P09_EDID_DATA_102_R = SPA(E_SNONE, E_PAGE_09, 0x66), - E_REG_P09_EDID_DATA_103_R = SPA(E_SNONE, E_PAGE_09, 0x67), - E_REG_P09_EDID_DATA_104_R = SPA(E_SNONE, E_PAGE_09, 0x68), - E_REG_P09_EDID_DATA_105_R = SPA(E_SNONE, E_PAGE_09, 0x69), - E_REG_P09_EDID_DATA_106_R = SPA(E_SNONE, E_PAGE_09, 0x6A), - E_REG_P09_EDID_DATA_107_R = SPA(E_SNONE, E_PAGE_09, 0x6B), - E_REG_P09_EDID_DATA_108_R = SPA(E_SNONE, E_PAGE_09, 0x6C), - E_REG_P09_EDID_DATA_109_R = SPA(E_SNONE, E_PAGE_09, 0x6D), - E_REG_P09_EDID_DATA_110_R = SPA(E_SNONE, E_PAGE_09, 0x6E), - E_REG_P09_EDID_DATA_111_R = SPA(E_SNONE, E_PAGE_09, 0x6F), - E_REG_P09_EDID_DATA_112_R = SPA(E_SNONE, E_PAGE_09, 0x70), - E_REG_P09_EDID_DATA_113_R = SPA(E_SNONE, E_PAGE_09, 0x71), - E_REG_P09_EDID_DATA_114_R = SPA(E_SNONE, E_PAGE_09, 0x72), - E_REG_P09_EDID_DATA_115_R = SPA(E_SNONE, E_PAGE_09, 0x73), - E_REG_P09_EDID_DATA_116_R = SPA(E_SNONE, E_PAGE_09, 0x74), - E_REG_P09_EDID_DATA_117_R = SPA(E_SNONE, E_PAGE_09, 0x75), - E_REG_P09_EDID_DATA_118_R = SPA(E_SNONE, E_PAGE_09, 0x76), - E_REG_P09_EDID_DATA_119_R = SPA(E_SNONE, E_PAGE_09, 0x77), - E_REG_P09_EDID_DATA_120_R = SPA(E_SNONE, E_PAGE_09, 0x78), - E_REG_P09_EDID_DATA_121_R = SPA(E_SNONE, E_PAGE_09, 0x79), - E_REG_P09_EDID_DATA_122_R = SPA(E_SNONE, E_PAGE_09, 0x7A), - E_REG_P09_EDID_DATA_123_R = SPA(E_SNONE, E_PAGE_09, 0x7B), - E_REG_P09_EDID_DATA_124_R = SPA(E_SNONE, E_PAGE_09, 0x7C), - E_REG_P09_EDID_DATA_125_R = SPA(E_SNONE, E_PAGE_09, 0x7D), - E_REG_P09_EDID_DATA_126_R = SPA(E_SNONE, E_PAGE_09, 0x7E), - E_REG_P09_EDID_DATA_127_R = SPA(E_SNONE, E_PAGE_09, 0x7F), - E_REG_P09_EDID_CTRL_RW = SPA(E_SNONE, E_PAGE_09, 0xFA), - E_REG_P09_DDC_ADDR_RW = SPA(E_SNONE, E_PAGE_09, 0xFB), - E_REG_P09_DDC_OFFS_RW = SPA(E_SNONE, E_PAGE_09, 0xFC), - E_REG_P09_DDC_SEGM_ADDR_RW = SPA(E_SNONE, E_PAGE_09, 0xFD), - E_REG_P09_DDC_SEGM_RW = SPA(E_SNONE, E_PAGE_09, 0xFE), - - E_REG_P10_IF1_HB0_RW = SPA(E_SNONE, E_PAGE_10, 0x20), - E_REG_P10_IF1_HB1_RW = SPA(E_SNONE, E_PAGE_10, 0x21), - E_REG_P10_IF1_HB2_RW = SPA(E_SNONE, E_PAGE_10, 0x22), - E_REG_P10_IF1_PB0_RW = SPA(E_SNONE, E_PAGE_10, 0x23), - E_REG_P10_IF1_PB1_RW = SPA(E_SNONE, E_PAGE_10, 0x24), - E_REG_P10_IF1_PB2_RW = SPA(E_SNONE, E_PAGE_10, 0x25), - E_REG_P10_IF1_PB3_RW = SPA(E_SNONE, E_PAGE_10, 0x26), - E_REG_P10_IF1_PB4_RW = SPA(E_SNONE, E_PAGE_10, 0x27), - E_REG_P10_IF1_PB5_RW = SPA(E_SNONE, E_PAGE_10, 0x28), - E_REG_P10_IF1_PB6_RW = SPA(E_SNONE, E_PAGE_10, 0x29), - E_REG_P10_IF1_PB7_RW = SPA(E_SNONE, E_PAGE_10, 0x2A), - E_REG_P10_IF1_PB8_RW = SPA(E_SNONE, E_PAGE_10, 0x2B), - E_REG_P10_IF1_PB9_RW = SPA(E_SNONE, E_PAGE_10, 0x2C), - E_REG_P10_IF1_PB10_RW = SPA(E_SNONE, E_PAGE_10, 0x2D), - E_REG_P10_IF1_PB11_RW = SPA(E_SNONE, E_PAGE_10, 0x2E), - E_REG_P10_IF1_PB12_RW = SPA(E_SNONE, E_PAGE_10, 0x2F), - E_REG_P10_IF1_PB13_RW = SPA(E_SNONE, E_PAGE_10, 0x30), - E_REG_P10_IF1_PB14_RW = SPA(E_SNONE, E_PAGE_10, 0x31), - E_REG_P10_IF1_PB15_RW = SPA(E_SNONE, E_PAGE_10, 0x32), - E_REG_P10_IF1_PB16_RW = SPA(E_SNONE, E_PAGE_10, 0x33), - E_REG_P10_IF1_PB17_RW = SPA(E_SNONE, E_PAGE_10, 0x34), - E_REG_P10_IF1_PB18_RW = SPA(E_SNONE, E_PAGE_10, 0x35), - E_REG_P10_IF1_PB19_RW = SPA(E_SNONE, E_PAGE_10, 0x36), - E_REG_P10_IF1_PB20_RW = SPA(E_SNONE, E_PAGE_10, 0x37), - E_REG_P10_IF1_PB21_RW = SPA(E_SNONE, E_PAGE_10, 0x38), - E_REG_P10_IF1_PB22_RW = SPA(E_SNONE, E_PAGE_10, 0x39), - E_REG_P10_IF1_PB23_RW = SPA(E_SNONE, E_PAGE_10, 0x3A), - E_REG_P10_IF1_PB24_RW = SPA(E_SNONE, E_PAGE_10, 0x3B), - E_REG_P10_IF1_PB25_RW = SPA(E_SNONE, E_PAGE_10, 0x3C), - E_REG_P10_IF1_PB26_RW = SPA(E_SNONE, E_PAGE_10, 0x3D), - E_REG_P10_IF1_PB27_RW = SPA(E_SNONE, E_PAGE_10, 0x3E), - E_REG_P10_IF2_HB0_RW = SPA(E_SNONE, E_PAGE_10, 0x40), - E_REG_P10_IF2_HB1_RW = SPA(E_SNONE, E_PAGE_10, 0x41), - E_REG_P10_IF2_HB2_RW = SPA(E_SNONE, E_PAGE_10, 0x42), - E_REG_P10_IF2_PB0_RW = SPA(E_SNONE, E_PAGE_10, 0x43), - E_REG_P10_IF2_PB1_RW = SPA(E_SNONE, E_PAGE_10, 0x44), - E_REG_P10_IF2_PB2_RW = SPA(E_SNONE, E_PAGE_10, 0x45), - E_REG_P10_IF2_PB3_RW = SPA(E_SNONE, E_PAGE_10, 0x46), - E_REG_P10_IF2_PB4_RW = SPA(E_SNONE, E_PAGE_10, 0x47), - E_REG_P10_IF2_PB5_RW = SPA(E_SNONE, E_PAGE_10, 0x48), - E_REG_P10_IF2_PB6_RW = SPA(E_SNONE, E_PAGE_10, 0x49), - E_REG_P10_IF2_PB7_RW = SPA(E_SNONE, E_PAGE_10, 0x4A), - E_REG_P10_IF2_PB8_RW = SPA(E_SNONE, E_PAGE_10, 0x4B), - E_REG_P10_IF2_PB9_RW = SPA(E_SNONE, E_PAGE_10, 0x4C), - E_REG_P10_IF2_PB10_RW = SPA(E_SNONE, E_PAGE_10, 0x4D), - E_REG_P10_IF2_PB11_RW = SPA(E_SNONE, E_PAGE_10, 0x4E), - E_REG_P10_IF2_PB12_RW = SPA(E_SNONE, E_PAGE_10, 0x4F), - E_REG_P10_IF2_PB13_RW = SPA(E_SNONE, E_PAGE_10, 0x50), - E_REG_P10_IF2_PB14_RW = SPA(E_SNONE, E_PAGE_10, 0x51), - E_REG_P10_IF2_PB15_RW = SPA(E_SNONE, E_PAGE_10, 0x52), - E_REG_P10_IF2_PB16_RW = SPA(E_SNONE, E_PAGE_10, 0x53), - E_REG_P10_IF2_PB17_RW = SPA(E_SNONE, E_PAGE_10, 0x54), - E_REG_P10_IF2_PB18_RW = SPA(E_SNONE, E_PAGE_10, 0x55), - E_REG_P10_IF2_PB19_RW = SPA(E_SNONE, E_PAGE_10, 0x56), - E_REG_P10_IF2_PB20_RW = SPA(E_SNONE, E_PAGE_10, 0x57), - E_REG_P10_IF2_PB21_RW = SPA(E_SNONE, E_PAGE_10, 0x58), - E_REG_P10_IF2_PB22_RW = SPA(E_SNONE, E_PAGE_10, 0x59), - E_REG_P10_IF2_PB23_RW = SPA(E_SNONE, E_PAGE_10, 0x5A), - E_REG_P10_IF2_PB24_RW = SPA(E_SNONE, E_PAGE_10, 0x5B), - E_REG_P10_IF2_PB25_RW = SPA(E_SNONE, E_PAGE_10, 0x5C), - E_REG_P10_IF2_PB26_RW = SPA(E_SNONE, E_PAGE_10, 0x5D), - E_REG_P10_IF2_PB27_RW = SPA(E_SNONE, E_PAGE_10, 0x5E), - E_REG_P10_IF3_HB0_RW = SPA(E_SNONE, E_PAGE_10, 0x60), - E_REG_P10_IF3_HB1_RW = SPA(E_SNONE, E_PAGE_10, 0x61), - E_REG_P10_IF3_HB2_RW = SPA(E_SNONE, E_PAGE_10, 0x62), - E_REG_P10_IF3_PB0_RW = SPA(E_SNONE, E_PAGE_10, 0x63), - E_REG_P10_IF3_PB1_RW = SPA(E_SNONE, E_PAGE_10, 0x64), - E_REG_P10_IF3_PB2_RW = SPA(E_SNONE, E_PAGE_10, 0x65), - E_REG_P10_IF3_PB3_RW = SPA(E_SNONE, E_PAGE_10, 0x66), - E_REG_P10_IF3_PB4_RW = SPA(E_SNONE, E_PAGE_10, 0x67), - E_REG_P10_IF3_PB5_RW = SPA(E_SNONE, E_PAGE_10, 0x68), - E_REG_P10_IF3_PB6_RW = SPA(E_SNONE, E_PAGE_10, 0x69), - E_REG_P10_IF3_PB7_RW = SPA(E_SNONE, E_PAGE_10, 0x6A), - E_REG_P10_IF3_PB8_RW = SPA(E_SNONE, E_PAGE_10, 0x6B), - E_REG_P10_IF3_PB9_RW = SPA(E_SNONE, E_PAGE_10, 0x6C), - E_REG_P10_IF3_PB10_RW = SPA(E_SNONE, E_PAGE_10, 0x6D), - E_REG_P10_IF3_PB11_RW = SPA(E_SNONE, E_PAGE_10, 0x6E), - E_REG_P10_IF3_PB12_RW = SPA(E_SNONE, E_PAGE_10, 0x6F), - E_REG_P10_IF3_PB13_RW = SPA(E_SNONE, E_PAGE_10, 0x70), - E_REG_P10_IF3_PB14_RW = SPA(E_SNONE, E_PAGE_10, 0x71), - E_REG_P10_IF3_PB15_RW = SPA(E_SNONE, E_PAGE_10, 0x72), - E_REG_P10_IF3_PB16_RW = SPA(E_SNONE, E_PAGE_10, 0x73), - E_REG_P10_IF3_PB17_RW = SPA(E_SNONE, E_PAGE_10, 0x74), - E_REG_P10_IF3_PB18_RW = SPA(E_SNONE, E_PAGE_10, 0x75), - E_REG_P10_IF3_PB19_RW = SPA(E_SNONE, E_PAGE_10, 0x76), - E_REG_P10_IF3_PB20_RW = SPA(E_SNONE, E_PAGE_10, 0x77), - E_REG_P10_IF3_PB21_RW = SPA(E_SNONE, E_PAGE_10, 0x78), - E_REG_P10_IF3_PB22_RW = SPA(E_SNONE, E_PAGE_10, 0x79), - E_REG_P10_IF3_PB23_RW = SPA(E_SNONE, E_PAGE_10, 0x7A), - E_REG_P10_IF3_PB24_RW = SPA(E_SNONE, E_PAGE_10, 0x7B), - E_REG_P10_IF3_PB25_RW = SPA(E_SNONE, E_PAGE_10, 0x7C), - E_REG_P10_IF3_PB26_RW = SPA(E_SNONE, E_PAGE_10, 0x7D), - E_REG_P10_IF3_PB27_RW = SPA(E_SNONE, E_PAGE_10, 0x7E), - E_REG_P10_IF4_HB0_RW = SPA(E_SNONE, E_PAGE_10, 0x80), - E_REG_P10_IF4_HB1_RW = SPA(E_SNONE, E_PAGE_10, 0x81), - E_REG_P10_IF4_HB2_RW = SPA(E_SNONE, E_PAGE_10, 0x82), - E_REG_P10_IF4_PB0_RW = SPA(E_SNONE, E_PAGE_10, 0x83), - E_REG_P10_IF4_PB1_RW = SPA(E_SNONE, E_PAGE_10, 0x84), - E_REG_P10_IF4_PB2_RW = SPA(E_SNONE, E_PAGE_10, 0x85), - E_REG_P10_IF4_PB3_RW = SPA(E_SNONE, E_PAGE_10, 0x86), - E_REG_P10_IF4_PB4_RW = SPA(E_SNONE, E_PAGE_10, 0x87), - E_REG_P10_IF4_PB5_RW = SPA(E_SNONE, E_PAGE_10, 0x88), - E_REG_P10_IF4_PB6_RW = SPA(E_SNONE, E_PAGE_10, 0x89), - E_REG_P10_IF4_PB7_RW = SPA(E_SNONE, E_PAGE_10, 0x8A), - E_REG_P10_IF4_PB8_RW = SPA(E_SNONE, E_PAGE_10, 0x8B), - E_REG_P10_IF4_PB9_RW = SPA(E_SNONE, E_PAGE_10, 0x8C), - E_REG_P10_IF4_PB10_RW = SPA(E_SNONE, E_PAGE_10, 0x8D), - E_REG_P10_IF4_PB11_RW = SPA(E_SNONE, E_PAGE_10, 0x8E), - E_REG_P10_IF4_PB12_RW = SPA(E_SNONE, E_PAGE_10, 0x8F), - E_REG_P10_IF4_PB13_RW = SPA(E_SNONE, E_PAGE_10, 0x90), - E_REG_P10_IF4_PB14_RW = SPA(E_SNONE, E_PAGE_10, 0x91), - E_REG_P10_IF4_PB15_RW = SPA(E_SNONE, E_PAGE_10, 0x92), - E_REG_P10_IF4_PB16_RW = SPA(E_SNONE, E_PAGE_10, 0x93), - E_REG_P10_IF4_PB17_RW = SPA(E_SNONE, E_PAGE_10, 0x94), - E_REG_P10_IF4_PB18_RW = SPA(E_SNONE, E_PAGE_10, 0x95), - E_REG_P10_IF4_PB19_RW = SPA(E_SNONE, E_PAGE_10, 0x96), - E_REG_P10_IF4_PB20_RW = SPA(E_SNONE, E_PAGE_10, 0x97), - E_REG_P10_IF4_PB21_RW = SPA(E_SNONE, E_PAGE_10, 0x98), - E_REG_P10_IF4_PB22_RW = SPA(E_SNONE, E_PAGE_10, 0x99), - E_REG_P10_IF4_PB23_RW = SPA(E_SNONE, E_PAGE_10, 0x9A), - E_REG_P10_IF4_PB24_RW = SPA(E_SNONE, E_PAGE_10, 0x9B), - E_REG_P10_IF4_PB25_RW = SPA(E_SNONE, E_PAGE_10, 0x9C), - E_REG_P10_IF4_PB26_RW = SPA(E_SNONE, E_PAGE_10, 0x9D), - E_REG_P10_IF4_PB27_RW = SPA(E_SNONE, E_PAGE_10, 0x9E), - E_REG_P10_IF5_HB0_RW = SPA(E_SNONE, E_PAGE_10, 0xA0), - E_REG_P10_IF5_HB1_RW = SPA(E_SNONE, E_PAGE_10, 0xA1), - E_REG_P10_IF5_HB2_RW = SPA(E_SNONE, E_PAGE_10, 0xA2), - E_REG_P10_IF5_PB0_RW = SPA(E_SNONE, E_PAGE_10, 0xA3), - E_REG_P10_IF5_PB1_RW = SPA(E_SNONE, E_PAGE_10, 0xA4), - E_REG_P10_IF5_PB2_RW = SPA(E_SNONE, E_PAGE_10, 0xA5), - E_REG_P10_IF5_PB3_RW = SPA(E_SNONE, E_PAGE_10, 0xA6), - E_REG_P10_IF5_PB4_RW = SPA(E_SNONE, E_PAGE_10, 0xA7), - E_REG_P10_IF5_PB5_RW = SPA(E_SNONE, E_PAGE_10, 0xA8), - E_REG_P10_IF5_PB6_RW = SPA(E_SNONE, E_PAGE_10, 0xA9), - E_REG_P10_IF5_PB7_RW = SPA(E_SNONE, E_PAGE_10, 0xAA), - E_REG_P10_IF5_PB8_RW = SPA(E_SNONE, E_PAGE_10, 0xAB), - E_REG_P10_IF5_PB9_RW = SPA(E_SNONE, E_PAGE_10, 0xAC), - E_REG_P10_IF5_PB10_RW = SPA(E_SNONE, E_PAGE_10, 0xAD), - E_REG_P10_IF5_PB11_RW = SPA(E_SNONE, E_PAGE_10, 0xAE), - E_REG_P10_IF5_PB12_RW = SPA(E_SNONE, E_PAGE_10, 0xAF), - E_REG_P10_IF5_PB13_RW = SPA(E_SNONE, E_PAGE_10, 0xB0), - E_REG_P10_IF5_PB14_RW = SPA(E_SNONE, E_PAGE_10, 0xB1), - E_REG_P10_IF5_PB15_RW = SPA(E_SNONE, E_PAGE_10, 0xB2), - E_REG_P10_IF5_PB16_RW = SPA(E_SNONE, E_PAGE_10, 0xB3), - E_REG_P10_IF5_PB17_RW = SPA(E_SNONE, E_PAGE_10, 0xB4), - E_REG_P10_IF5_PB18_RW = SPA(E_SNONE, E_PAGE_10, 0xB5), - E_REG_P10_IF5_PB19_RW = SPA(E_SNONE, E_PAGE_10, 0xB6), - E_REG_P10_IF5_PB20_RW = SPA(E_SNONE, E_PAGE_10, 0xB7), - E_REG_P10_IF5_PB21_RW = SPA(E_SNONE, E_PAGE_10, 0xB8), - E_REG_P10_IF5_PB22_RW = SPA(E_SNONE, E_PAGE_10, 0xB9), - E_REG_P10_IF5_PB23_RW = SPA(E_SNONE, E_PAGE_10, 0xBA), - E_REG_P10_IF5_PB24_RW = SPA(E_SNONE, E_PAGE_10, 0xBB), - E_REG_P10_IF5_PB25_RW = SPA(E_SNONE, E_PAGE_10, 0xBC), - E_REG_P10_IF5_PB26_RW = SPA(E_SNONE, E_PAGE_10, 0xBD), - E_REG_P10_IF5_PB27_RW = SPA(E_SNONE, E_PAGE_10, 0xBE), - E_REG_P11_AIP_CNTRL_0_RW = SPA(E_SNONE, E_PAGE_11, 0x00), - E_REG_P11_CA_I2S_RW = SPA(E_SNONE, E_PAGE_11, 0x01), - E_REG_P11_CA_DSD_RW = SPA(E_SNONE, E_PAGE_11, 0x02), - E_REG_P11_OBA_PH_RW = SPA(E_SNONE, E_PAGE_11, 0x03), - E_REG_P11_LATENCY_RD_RW = SPA(E_SNONE, E_PAGE_11, 0x04), - E_REG_P11_ACR_CTS_0_RW = SPA(E_SNONE, E_PAGE_11, 0x05), - E_REG_P11_ACR_CTS_1_RW = SPA(E_SNONE, E_PAGE_11, 0x06), - E_REG_P11_ACR_CTS_2_RW = SPA(E_SNONE, E_PAGE_11, 0x07), - E_REG_P11_ACR_N_0_RW = SPA(E_SNONE, E_PAGE_11, 0x08), - E_REG_P11_ACR_N_1_RW = SPA(E_SNONE, E_PAGE_11, 0x09), - E_REG_P11_ACR_N_2_RW = SPA(E_SNONE, E_PAGE_11, 0x0A), - E_REG_P11_GC_AVMUTE_RW = SPA(E_SNONE, E_PAGE_11, 0x0B), - E_REG_P11_CTS_N_RW = SPA(E_SNONE, E_PAGE_11, 0x0C), - E_REG_P11_ENC_CNTRL_RW = SPA(E_SNONE, E_PAGE_11, 0x0D), - E_REG_P11_DIP_FLAGS_RW = SPA(E_SNONE, E_PAGE_11, 0x0E), - E_REG_P11_DIP_IF_FLAGS_RW = SPA(E_SNONE, E_PAGE_11, 0x0F), - E_REG_P11_CH_STAT_B_0_RW = SPA(E_SNONE, E_PAGE_11, 0x14), - E_REG_P11_CH_STAT_B_1_RW = SPA(E_SNONE, E_PAGE_11, 0x15), - E_REG_P11_CH_STAT_B_3_RW = SPA(E_SNONE, E_PAGE_11, 0x16), - E_REG_P11_CH_STAT_B_4_RW = SPA(E_SNONE, E_PAGE_11, 0x17), - E_REG_P11_CH_STAT_B_2_ap0_l_RW = SPA(E_SNONE, E_PAGE_11, 0x18), - E_REG_P11_CH_STAT_B_2_ap0_r_RW = SPA(E_SNONE, E_PAGE_11, 0x19), - E_REG_P11_CH_STAT_B_2_ap1_l_RW = SPA(E_SNONE, E_PAGE_11, 0x1A), - E_REG_P11_CH_STAT_B_2_ap1_r_RW = SPA(E_SNONE, E_PAGE_11, 0x1B), - E_REG_P11_CH_STAT_B_2_ap2_l_RW = SPA(E_SNONE, E_PAGE_11, 0x1C), - E_REG_P11_CH_STAT_B_2_ap2_r_RW = SPA(E_SNONE, E_PAGE_11, 0x1D), - E_REG_P11_CH_STAT_B_2_ap3_l_RW = SPA(E_SNONE, E_PAGE_11, 0x1E), - E_REG_P11_CH_STAT_B_2_ap3_r_RW = SPA(E_SNONE, E_PAGE_11, 0x1F), - E_REG_P11_ISRC1_HB0_RW = SPA(E_SNONE, E_PAGE_11, 0x20), - E_REG_P11_ISRC1_HB1_RW = SPA(E_SNONE, E_PAGE_11, 0x21), - E_REG_P11_ISRC1_HB2_RW = SPA(E_SNONE, E_PAGE_11, 0x22), - E_REG_P11_ISRC1_PB0_RW = SPA(E_SNONE, E_PAGE_11, 0x23), - E_REG_P11_ISRC1_PB1_RW = SPA(E_SNONE, E_PAGE_11, 0x24), - E_REG_P11_ISRC1_PB2_RW = SPA(E_SNONE, E_PAGE_11, 0x25), - E_REG_P11_ISRC1_PB3_RW = SPA(E_SNONE, E_PAGE_11, 0x26), - E_REG_P11_ISRC1_PB4_RW = SPA(E_SNONE, E_PAGE_11, 0x27), - E_REG_P11_ISRC1_PB5_RW = SPA(E_SNONE, E_PAGE_11, 0x28), - E_REG_P11_ISRC1_PB6_RW = SPA(E_SNONE, E_PAGE_11, 0x29), - E_REG_P11_ISRC1_PB7_RW = SPA(E_SNONE, E_PAGE_11, 0x2A), - E_REG_P11_ISRC1_PB8_RW = SPA(E_SNONE, E_PAGE_11, 0x2B), - E_REG_P11_ISRC1_PB9_RW = SPA(E_SNONE, E_PAGE_11, 0x2C), - E_REG_P11_ISRC1_PB10_RW = SPA(E_SNONE, E_PAGE_11, 0x2D), - E_REG_P11_ISRC1_PB11_RW = SPA(E_SNONE, E_PAGE_11, 0x2E), - E_REG_P11_ISRC1_PB12_RW = SPA(E_SNONE, E_PAGE_11, 0x2F), - E_REG_P11_ISRC1_PB13_RW = SPA(E_SNONE, E_PAGE_11, 0x30), - E_REG_P11_ISRC1_PB14_RW = SPA(E_SNONE, E_PAGE_11, 0x31), - E_REG_P11_ISRC1_PB15_RW = SPA(E_SNONE, E_PAGE_11, 0x32), - E_REG_P11_ISRC1_PB16_RW = SPA(E_SNONE, E_PAGE_11, 0x33), - E_REG_P11_ISRC1_PB17_RW = SPA(E_SNONE, E_PAGE_11, 0x34), - E_REG_P11_ISRC1_PB18_RW = SPA(E_SNONE, E_PAGE_11, 0x35), - E_REG_P11_ISRC1_PB19_RW = SPA(E_SNONE, E_PAGE_11, 0x36), - E_REG_P11_ISRC1_PB20_RW = SPA(E_SNONE, E_PAGE_11, 0x37), - E_REG_P11_ISRC1_PB21_RW = SPA(E_SNONE, E_PAGE_11, 0x38), - E_REG_P11_ISRC1_PB22_RW = SPA(E_SNONE, E_PAGE_11, 0x39), - E_REG_P11_ISRC1_PB23_RW = SPA(E_SNONE, E_PAGE_11, 0x3A), - E_REG_P11_ISRC1_PB24_RW = SPA(E_SNONE, E_PAGE_11, 0x3B), - E_REG_P11_ISRC1_PB25_RW = SPA(E_SNONE, E_PAGE_11, 0x3C), - E_REG_P11_ISRC1_PB26_RW = SPA(E_SNONE, E_PAGE_11, 0x3D), - E_REG_P11_ISRC1_PB27_RW = SPA(E_SNONE, E_PAGE_11, 0x3E), - E_REG_P11_ISRC2_HB0_RW = SPA(E_SNONE, E_PAGE_11, 0x40), - E_REG_P11_ISRC2_HB1_RW = SPA(E_SNONE, E_PAGE_11, 0x41), - E_REG_P11_ISRC2_HB2_RW = SPA(E_SNONE, E_PAGE_11, 0x42), - E_REG_P11_ISRC2_PB0_RW = SPA(E_SNONE, E_PAGE_11, 0x43), - E_REG_P11_ISRC2_PB1_RW = SPA(E_SNONE, E_PAGE_11, 0x44), - E_REG_P11_ISRC2_PB2_RW = SPA(E_SNONE, E_PAGE_11, 0x45), - E_REG_P11_ISRC2_PB3_RW = SPA(E_SNONE, E_PAGE_11, 0x46), - E_REG_P11_ISRC2_PB4_RW = SPA(E_SNONE, E_PAGE_11, 0x47), - E_REG_P11_ISRC2_PB5_RW = SPA(E_SNONE, E_PAGE_11, 0x48), - E_REG_P11_ISRC2_PB6_RW = SPA(E_SNONE, E_PAGE_11, 0x49), - E_REG_P11_ISRC2_PB7_RW = SPA(E_SNONE, E_PAGE_11, 0x4A), - E_REG_P11_ISRC2_PB8_RW = SPA(E_SNONE, E_PAGE_11, 0x4B), - E_REG_P11_ISRC2_PB9_RW = SPA(E_SNONE, E_PAGE_11, 0x4C), - E_REG_P11_ISRC2_PB10_RW = SPA(E_SNONE, E_PAGE_11, 0x4D), - E_REG_P11_ISRC2_PB11_RW = SPA(E_SNONE, E_PAGE_11, 0x4E), - E_REG_P11_ISRC2_PB12_RW = SPA(E_SNONE, E_PAGE_11, 0x4F), - E_REG_P11_ISRC2_PB13_RW = SPA(E_SNONE, E_PAGE_11, 0x50), - E_REG_P11_ISRC2_PB14_RW = SPA(E_SNONE, E_PAGE_11, 0x51), - E_REG_P11_ISRC2_PB15_RW = SPA(E_SNONE, E_PAGE_11, 0x52), - E_REG_P11_ISRC2_PB16_RW = SPA(E_SNONE, E_PAGE_11, 0x53), - E_REG_P11_ISRC2_PB17_RW = SPA(E_SNONE, E_PAGE_11, 0x54), - E_REG_P11_ISRC2_PB18_RW = SPA(E_SNONE, E_PAGE_11, 0x55), - E_REG_P11_ISRC2_PB19_RW = SPA(E_SNONE, E_PAGE_11, 0x56), - E_REG_P11_ISRC2_PB20_RW = SPA(E_SNONE, E_PAGE_11, 0x57), - E_REG_P11_ISRC2_PB21_RW = SPA(E_SNONE, E_PAGE_11, 0x58), - E_REG_P11_ISRC2_PB22_RW = SPA(E_SNONE, E_PAGE_11, 0x59), - E_REG_P11_ISRC2_PB23_RW = SPA(E_SNONE, E_PAGE_11, 0x5A), - E_REG_P11_ISRC2_PB24_RW = SPA(E_SNONE, E_PAGE_11, 0x5B), - E_REG_P11_ISRC2_PB25_RW = SPA(E_SNONE, E_PAGE_11, 0x5C), - E_REG_P11_ISRC2_PB26_RW = SPA(E_SNONE, E_PAGE_11, 0x5D), - E_REG_P11_ISRC2_PB27_RW = SPA(E_SNONE, E_PAGE_11, 0x5E), - E_REG_P11_ACP_HB0_RW = SPA(E_SNONE, E_PAGE_11, 0x60), - E_REG_P11_ACP_HB1_RW = SPA(E_SNONE, E_PAGE_11, 0x61), - E_REG_P11_ACP_HB2_RW = SPA(E_SNONE, E_PAGE_11, 0x62), - E_REG_P11_ACP_PB0_RW = SPA(E_SNONE, E_PAGE_11, 0x63), - E_REG_P11_ACP_PB1_RW = SPA(E_SNONE, E_PAGE_11, 0x64), - E_REG_P11_ACP_PB2_RW = SPA(E_SNONE, E_PAGE_11, 0x65), - E_REG_P11_ACP_PB3_RW = SPA(E_SNONE, E_PAGE_11, 0x66), - E_REG_P11_ACP_PB4_RW = SPA(E_SNONE, E_PAGE_11, 0x67), - E_REG_P11_ACP_PB5_RW = SPA(E_SNONE, E_PAGE_11, 0x68), - E_REG_P11_ACP_PB6_RW = SPA(E_SNONE, E_PAGE_11, 0x69), - E_REG_P11_ACP_PB7_RW = SPA(E_SNONE, E_PAGE_11, 0x6A), - E_REG_P11_ACP_PB8_RW = SPA(E_SNONE, E_PAGE_11, 0x6B), - E_REG_P11_ACP_PB9_RW = SPA(E_SNONE, E_PAGE_11, 0x6C), - E_REG_P11_ACP_PB10_RW = SPA(E_SNONE, E_PAGE_11, 0x6D), - E_REG_P11_ACP_PB11_RW = SPA(E_SNONE, E_PAGE_11, 0x6E), - E_REG_P11_ACP_PB12_RW = SPA(E_SNONE, E_PAGE_11, 0x6F), - E_REG_P11_ACP_PB13_RW = SPA(E_SNONE, E_PAGE_11, 0x70), - E_REG_P11_ACP_PB14_RW = SPA(E_SNONE, E_PAGE_11, 0x71), - E_REG_P11_ACP_PB15_RW = SPA(E_SNONE, E_PAGE_11, 0x72), - E_REG_P11_ACP_PB16_RW = SPA(E_SNONE, E_PAGE_11, 0x73), - E_REG_P11_ACP_PB17_RW = SPA(E_SNONE, E_PAGE_11, 0x74), - E_REG_P11_ACP_PB18_RW = SPA(E_SNONE, E_PAGE_11, 0x75), - E_REG_P11_ACP_PB19_RW = SPA(E_SNONE, E_PAGE_11, 0x76), - E_REG_P11_ACP_PB20_RW = SPA(E_SNONE, E_PAGE_11, 0x77), - E_REG_P11_ACP_PB21_RW = SPA(E_SNONE, E_PAGE_11, 0x78), - E_REG_P11_ACP_PB22_RW = SPA(E_SNONE, E_PAGE_11, 0x79), - E_REG_P11_ACP_PB23_RW = SPA(E_SNONE, E_PAGE_11, 0x7A), - E_REG_P11_ACP_PB24_RW = SPA(E_SNONE, E_PAGE_11, 0x7B), - E_REG_P11_ACP_PB25_RW = SPA(E_SNONE, E_PAGE_11, 0x7C), - E_REG_P11_ACP_PB26_RW = SPA(E_SNONE, E_PAGE_11, 0x7D), - E_REG_P11_ACP_PB27_RW = SPA(E_SNONE, E_PAGE_11, 0x7E), - E_REG_P13_GMD_0_HB0_RW = SPA(E_SNONE, E_PAGE_13, 0x00), - E_REG_P13_GMD_0_HB1_RW = SPA(E_SNONE, E_PAGE_13, 0x01), - E_REG_P13_GMD_0_HB2_RW = SPA(E_SNONE, E_PAGE_13, 0x02), - E_REG_P13_GMD_0_PB0_RW = SPA(E_SNONE, E_PAGE_13, 0x03), - E_REG_P13_GMD_0_PB1_RW = SPA(E_SNONE, E_PAGE_13, 0x04), - E_REG_P13_GMD_0_PB2_RW = SPA(E_SNONE, E_PAGE_13, 0x05), - E_REG_P13_GMD_0_PB3_RW = SPA(E_SNONE, E_PAGE_13, 0x06), - E_REG_P13_GMD_0_PB4_RW = SPA(E_SNONE, E_PAGE_13, 0x07), - E_REG_P13_GMD_0_PB5_RW = SPA(E_SNONE, E_PAGE_13, 0x08), - E_REG_P13_GMD_0_PB6_RW = SPA(E_SNONE, E_PAGE_13, 0x09), - E_REG_P13_GMD_0_PB7_RW = SPA(E_SNONE, E_PAGE_13, 0x0A), - E_REG_P13_GMD_0_PB8_RW = SPA(E_SNONE, E_PAGE_13, 0x0B), - E_REG_P13_GMD_0_PB9_RW = SPA(E_SNONE, E_PAGE_13, 0x0C), - E_REG_P13_GMD_0_PB10_RW = SPA(E_SNONE, E_PAGE_13, 0x0D), - E_REG_P13_GMD_0_PB11_RW = SPA(E_SNONE, E_PAGE_13, 0x0E), - E_REG_P13_GMD_0_PB12_RW = SPA(E_SNONE, E_PAGE_13, 0x0F), - E_REG_P13_GMD_0_PB13_RW = SPA(E_SNONE, E_PAGE_13, 0x10), - E_REG_P13_GMD_0_PB14_RW = SPA(E_SNONE, E_PAGE_13, 0x11), - E_REG_P13_GMD_0_PB15_RW = SPA(E_SNONE, E_PAGE_13, 0x12), - E_REG_P13_GMD_0_PB16_RW = SPA(E_SNONE, E_PAGE_13, 0x13), - E_REG_P13_GMD_0_PB17_RW = SPA(E_SNONE, E_PAGE_13, 0x14), - E_REG_P13_GMD_0_PB18_RW = SPA(E_SNONE, E_PAGE_13, 0x15), - E_REG_P13_GMD_0_PB19_RW = SPA(E_SNONE, E_PAGE_13, 0x16), - E_REG_P13_GMD_0_PB20_RW = SPA(E_SNONE, E_PAGE_13, 0x17), - E_REG_P13_GMD_0_PB21_RW = SPA(E_SNONE, E_PAGE_13, 0x18), - E_REG_P13_GMD_0_PB22_RW = SPA(E_SNONE, E_PAGE_13, 0x19), - E_REG_P13_GMD_0_PB23_RW = SPA(E_SNONE, E_PAGE_13, 0x1A), - E_REG_P13_GMD_0_PB24_RW = SPA(E_SNONE, E_PAGE_13, 0x1B), - E_REG_P13_GMD_0_PB25_RW = SPA(E_SNONE, E_PAGE_13, 0x1C), - E_REG_P13_GMD_0_PB26_RW = SPA(E_SNONE, E_PAGE_13, 0x1D), - E_REG_P13_GMD_0_PB27_RW = SPA(E_SNONE, E_PAGE_13, 0x1E), - E_REG_P13_GMD_CONTROL_RW = SPA(E_SNONE, E_PAGE_13, 0x1F), - E_REG_P13_GMD_1_HB0_RW = SPA(E_SNONE, E_PAGE_13, 0x20), - E_REG_P13_GMD_1_HB1_RW = SPA(E_SNONE, E_PAGE_13, 0x21), - E_REG_P13_GMD_1_HB2_RW = SPA(E_SNONE, E_PAGE_13, 0x22), - E_REG_P13_GMD_1_PB0_RW = SPA(E_SNONE, E_PAGE_13, 0x23), - E_REG_P13_GMD_1_PB1_RW = SPA(E_SNONE, E_PAGE_13, 0x24), - E_REG_P13_GMD_1_PB2_RW = SPA(E_SNONE, E_PAGE_13, 0x25), - E_REG_P13_GMD_1_PB3_RW = SPA(E_SNONE, E_PAGE_13, 0x26), - E_REG_P13_GMD_1_PB4_RW = SPA(E_SNONE, E_PAGE_13, 0x27), - E_REG_P13_GMD_1_PB5_RW = SPA(E_SNONE, E_PAGE_13, 0x28), - E_REG_P13_GMD_1_PB6_RW = SPA(E_SNONE, E_PAGE_13, 0x29), - E_REG_P13_GMD_1_PB7_RW = SPA(E_SNONE, E_PAGE_13, 0x2A), - E_REG_P13_GMD_1_PB8_RW = SPA(E_SNONE, E_PAGE_13, 0x2B), - E_REG_P13_GMD_1_PB9_RW = SPA(E_SNONE, E_PAGE_13, 0x2C), - E_REG_P13_GMD_1_PB10_RW = SPA(E_SNONE, E_PAGE_13, 0x2D), - E_REG_P13_GMD_1_PB11_RW = SPA(E_SNONE, E_PAGE_13, 0x2E), - E_REG_P13_GMD_1_PB12_RW = SPA(E_SNONE, E_PAGE_13, 0x2F), - E_REG_P13_GMD_1_PB13_RW = SPA(E_SNONE, E_PAGE_13, 0x30), - E_REG_P13_GMD_1_PB14_RW = SPA(E_SNONE, E_PAGE_13, 0x31), - E_REG_P13_GMD_1_PB15_RW = SPA(E_SNONE, E_PAGE_13, 0x32), - E_REG_P13_GMD_1_PB16_RW = SPA(E_SNONE, E_PAGE_13, 0x33), - E_REG_P13_GMD_1_PB17_RW = SPA(E_SNONE, E_PAGE_13, 0x34), - E_REG_P13_GMD_1_PB18_RW = SPA(E_SNONE, E_PAGE_13, 0x35), - E_REG_P13_GMD_1_PB19_RW = SPA(E_SNONE, E_PAGE_13, 0x36), - E_REG_P13_GMD_1_PB20_RW = SPA(E_SNONE, E_PAGE_13, 0x37), - E_REG_P13_GMD_1_PB21_RW = SPA(E_SNONE, E_PAGE_13, 0x38), - E_REG_P13_GMD_1_PB22_RW = SPA(E_SNONE, E_PAGE_13, 0x39), - E_REG_P13_GMD_1_PB23_RW = SPA(E_SNONE, E_PAGE_13, 0x3A), - E_REG_P13_GMD_1_PB24_RW = SPA(E_SNONE, E_PAGE_13, 0x3B), - E_REG_P13_GMD_1_PB25_RW = SPA(E_SNONE, E_PAGE_13, 0x3C), - E_REG_P13_GMD_1_PB26_RW = SPA(E_SNONE, E_PAGE_13, 0x3D), - E_REG_P13_GMD_1_PB27_RW = SPA(E_SNONE, E_PAGE_13, 0x3E) - }; -#undef SPR - -/** - * Register bitfield masks, with a macro to allow binary initializers. - * Enum names are derived directly from TDA998x register and bitfield names. - */ -#define BINARY(d7, d6, d5, d4, d3, d2, d1, d0) \ - (((d7)<<7)|((d6)<<6)|((d5)<<5)|((d4)<<4)|((d3)<<3)|((d2)<<2)|((d1)<<1)|(d0)) - - enum _eMaskReg { - E_MASKREG_NONE = BINARY(0, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_ALL = BINARY(1, 1, 1, 1, 1, 1, 1, 1), - - /* N4 features flags read from version register: - * not_h = no HDCP support - * not_s = no scaler support - * - * N5 = a flag that is not a register bit, but is derived by the - * driver from the new N5 registers DWIN_RE_DE and DWIN_FE_DE, - * because the N5 device still uses the N4 version register value. - * This bit position would clash with version register, so is not - * present in the driver's copy (uDeviceVersion) of the version - * register, but only in the driver's features byte (uDeviceFeatures). - */ - - /* CEC Masks */ - - E_MASKREG_CEC_INTERRUPTSTATUS_hdmi_int = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_CEC_INTERRUPTSTATUS_cec_int = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_CEC_RXSHPDINTENA_ena_hpd_int = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_CEC_RXSHPDINTENA_ena_rxs_int = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_CEC_RXSHPDINT_hpd_int = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_CEC_RXSHPDINT_rxs_int = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_CEC_RXSHPDLEV_hpd_level = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_CEC_RXSHPDLEV_rxs_level = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_CEC_ENAMODS_dis_fro = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_CEC_ENAMODS_dis_cclk = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_CEC_ENAMODS_ena_rxs = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_CEC_ENAMODS_ena_hdmi = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_CEC_ENAMODS_ena_cec = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_CEC_FRO_IM_CLK_CTRL_ghost_dis = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_CEC_FRO_IM_CLK_CTRL_ena_otp = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_CEC_FRO_IM_CLK_CTRL_imclk_sel = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_CEC_FRO_IM_CLK_CTRL_fro_div = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - /* HDMI Masks */ - E_MASKREG_P00_VERSION_not_h = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_VERSION_not_s = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_FEATURE_N5 = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_MAIN_CNTRL0_scaler = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_MAIN_CNTRL0_cehs = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_MAIN_CNTRL0_cecs = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_MAIN_CNTRL0_dehs = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_MAIN_CNTRL0_decs = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_MAIN_CNTRL0_sr = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_SR_REG_sr_i2c_ms = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_SR_REG_sr_audio = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_DDC_DISABLE_ddc_dis = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_CCLK_ON_cclk_ddc_on = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_I2C_MASTER_app_strt_lat = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_I2C_MASTER_dis_filt = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_I2C_MASTER_dis_mm = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - -#ifdef TMFL_TDA19989 - E_MASKREG_FEAT_POWER_DOWN_spdif = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_FEAT_POWER_DOWN_otp = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_FEAT_POWER_DOWN_csc = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_FEAT_POWER_DOWN_prefilt = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - E_MASKREG_FEAT_POWER_DOWN_all = BINARY(0, 0, 0, 0, 1, 1, 1, 1), -#endif - - E_MASKREG_P00_INT_FLAGS_0_r0 = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_0_pj = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_0_sha_1 = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_0_bstatus = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_0_bcaps = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_0_t0 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - /*E_MASKREG_P00_INT_FLAGS_0_hpd = BINARY(0,0,0,0, 0,0,1,0), */ - E_MASKREG_P00_INT_FLAGS_0_encrypt = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - /*E_MASKREG_P00_INT_FLAGS_1_hpd_in = BINARY(1,0,0,0, 0,0,0,0), */ - E_MASKREG_P00_INT_FLAGS_1_sw_int = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_1_sc_deil = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_1_sc_vid = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_1_sc_out = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_INT_FLAGS_1_sc_in = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_INT_FLAGS_1_otp = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_INT_FLAGS_1_vs_rpt = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - /*E_MASKREG_P00_INT_FLAGS_2_rx_sense = BINARY(0,0,0,0, 0,0,0,1), */ - E_MASKREG_P00_INT_FLAGS_2_edid_blk_rd = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - - /*E_MASKREG_P00_INT_FLAGS_3_rxs_fil = BINARY(0,0,0,0, 0,0,0,1), */ - - E_MASKREG_P00_SW_INT_sw_int = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_ENA_ACLK_ena_aclk = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_GND_ACLK_gnd_aclk = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_ENA_VP_0_ena_vp7 = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_0_ena_vp6 = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_0_ena_vp5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_0_ena_vp4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_0_ena_vp3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_ENA_VP_0_ena_vp2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_ENA_VP_0_ena_vp1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_ENA_VP_0_ena_vp0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_ENA_VP_1_ena_vp15 = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_1_ena_vp14 = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_1_ena_vp13 = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_1_ena_vp12 = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_1_ena_vp11 = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_ENA_VP_1_ena_vp10 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_ENA_VP_1_ena_vp9 = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_ENA_VP_1_ena_vp8 = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_ENA_VP_2_ena_vp23 = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_2_ena_vp22 = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_2_ena_vp21 = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_2_ena_vp20 = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_ENA_VP_2_ena_vp19 = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_ENA_VP_2_ena_vp18 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_ENA_VP_2_ena_vp17 = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_ENA_VP_2_ena_vp16 = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_ENA_AP_ena_ap7 = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_AP_ena_ap6 = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_AP_ena_ap5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_ENA_AP_ena_ap4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_ENA_AP_ena_ap3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_ENA_AP_ena_ap2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_ENA_AP_ena_ap1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_ENA_AP_ena_ap0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_VIP_CNTRL_0_mirr_a = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_0_swap_a = BINARY(0, 1, 1, 1, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_0_mirr_b = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_0_swap_b = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - - E_MASKREG_P00_VIP_CNTRL_1_mirr_c = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_1_swap_c = BINARY(0, 1, 1, 1, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_1_mirr_d = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_1_swap_d = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - - E_MASKREG_P00_VIP_CNTRL_2_mirr_e = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_2_swap_e = BINARY(0, 1, 1, 1, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_2_mirr_f = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_2_swap_f = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - -#ifdef TMFL_TDA19989 - E_MASKREG_P00_MUX_VP_VIP_OUT_red = BINARY(0, 0, 1, 1, 0, 0, 0, 0), - E_MASKREG_P00_MUX_VP_VIP_OUT_green = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - E_MASKREG_P00_MUX_VP_VIP_OUT_blue = BINARY(0, 0, 0, 0, 0, 0, 1, 1), -#endif - - E_MASKREG_P00_VIP_CNTRL_3_edge = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_3_de_int = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_3_sp_sync = BINARY(0, 0, 1, 1, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_3_emb = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_3_v_tgl = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_VIP_CNTRL_3_h_tgl = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_VIP_CNTRL_3_x_tgl = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_VIP_CNTRL_4_tst_pat = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_4_tst_656 = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_4_656_alt = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_4_ccir656 = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_VIP_CNTRL_4_blankit = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - E_MASKREG_P00_VIP_CNTRL_4_blc = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P00_VIP_CNTRL_5_sp_cnt = BINARY(0, 0, 0, 0, 0, 1, 1, 0), - E_MASKREG_P00_VIP_CNTRL_5_ckcase = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_MAT_CONTRL_mat_bp = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_MAT_CONTRL_mat_sc = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - -#ifdef TMFL_TDA19989 - E_MASKREG_P00_VIDFORMAT_3d = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_VIDFORMAT_3d_neg_vs = BINARY(0, 1, 0, 0, 0, 0, 0, 0), -#endif - E_MASKREG_P00_VIDFORMAT_vidformat = BINARY(0, 0, 0, 1, 1, 1, 1, 1), - - E_MASKREG_P00_TBG_CNTRL_0_sync_once = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_TBG_CNTRL_0_sync_mthd = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_TBG_CNTRL_0_frame_dis = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - - E_MASKREG_P00_TBG_CNTRL_1_dwin_dis = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_TBG_CNTRL_1_vhx_ext = BINARY(0, 0, 1, 1, 1, 0, 0, 0), - E_MASKREG_P00_TBG_CNTRL_1_vhx_ext_vs = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P00_TBG_CNTRL_1_vhx_ext_hs = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P00_TBG_CNTRL_1_vhx_ext_de = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_TBG_CNTRL_1_vh_tgl = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - E_MASKREG_P00_TBG_CNTRL_1_vh_tgl_2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_TBG_CNTRL_1_vh_tgl_1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_TBG_CNTRL_1_vh_tgl_0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_I2C_TIMER_RI = BINARY(0, 0, 0, 0, 1, 1, 1, 1), - E_MASKREG_P00_I2C_TIMER_PJ = BINARY(1, 1, 1, 1, 0, 0, 0, 0), - - E_MASKREG_P00_HVF_CNTRL_0_sm = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_HVF_CNTRL_0_rwb = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_HVF_CNTRL_0_prefil = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - E_MASKREG_P00_HVF_CNTRL_0_intpol = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P00_HVF_CNTRL_1_semi_planar = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_HVF_CNTRL_1_pad = BINARY(0, 0, 1, 1, 0, 0, 0, 0), - E_MASKREG_P00_HVF_CNTRL_1_vqr = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - E_MASKREG_P00_HVF_CNTRL_1_yuvblk = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_HVF_CNTRL_1_for = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_TIMER_H_wd_clksel = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_TIMER_H_tim_h = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P00_DEBUG_PROBE_sel = BINARY(0, 0, 1, 1, 0, 0, 0, 0), - E_MASKREG_P00_DEBUG_PROBE_bypass = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P00_DEBUG_PROBE_vid_de = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_DEBUG_PROBE_di_de = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P00_DEBUG_PROBE_woo_en = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P00_I2S_FORMAT_i2s_format = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P00_I2S_FORMAT_i2s_data_size = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - - E_MASKREG_P00_AIP_CLKSEL_dst_rate = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P00_AIP_CLKSEL_sel_aip_SHIFT = 3, - E_MASKREG_P00_AIP_CLKSEL_sel_aip = BINARY(0, 0, 1, 1, 1, 0, 0, 0), - E_MASKREG_P00_AIP_CLKSEL_sel_pol_clk = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P00_AIP_CLKSEL_sel_fs = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - E_MASKREG_P01_SC_VIDFORMAT_lut_sel = BINARY(1, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P01_SC_VIDFORMAT_vid_format_o = BINARY(0, 0, 1, 1, 1, 0, 0, 0), - E_MASKREG_P01_SC_VIDFORMAT_vid_format_i = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - - E_MASKREG_P01_SC_CNTRL_phases_h = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P01_SC_CNTRL_il_out_on = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P01_SC_CNTRL_phases_v = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P01_SC_CNTRL_vs_on = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P01_SC_CNTRL_deil_on = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P01_VIDFORMAT_vidformat = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - - E_MASKREG_P01_TBG_CNTRL_0_sync_once = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P01_TBG_CNTRL_0_sync_mthd = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P01_TBG_CNTRL_0_frame_dis = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P01_TBG_CNTRL_0_top_ext = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P01_TBG_CNTRL_0_de_ext = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P01_TBG_CNTRL_0_top_sel = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P01_TBG_CNTRL_0_top_tgl = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P02_PLL_SERIAL_1_srl_man_iz = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P02_PLL_SERIAL_1_srl_iz = BINARY(0, 0, 0, 0, 0, 1, 1, 0), - E_MASKREG_P02_PLL_SERIAL_1_srl_fdn = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P02_PLL_SERIAL_2_srl_pr = BINARY(1, 1, 1, 1, 0, 0, 0, 0), - E_MASKREG_P02_PLL_SERIAL_2_srl_nosc = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P02_PLL_SERIAL_3_srl_pxin_sel = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P02_PLL_SERIAL_3_srl_de = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P02_PLL_SERIAL_3_srl_ccir = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P02_SERIALIZER_srl_phase3 = BINARY(1, 1, 1, 1, 0, 0, 0, 0), - E_MASKREG_P02_SERIALIZER_srl_phase2 = BINARY(0, 0, 0, 0, 1, 1, 1, 1), - - E_MASKREG_P02_BUFFER_OUT_srl_force = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - E_MASKREG_P02_BUFFER_OUT_srl_clk = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P02_PLL_SCG1_scg_fdn = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P02_PLL_SCG2_bypass_scg = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P02_PLL_SCG2_selpllclkin = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P02_PLL_SCG2_scg_nosc = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P02_VAI_PLL_pllde_hvp = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P02_VAI_PLL_pllscg_hvp = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P02_VAI_PLL_pllsrl_hvp = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P02_VAI_PLL_pllscg_lock = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P02_VAI_PLL_pllsrl_lock = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P02_AUDIO_DIV_audio_div = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - - E_MASKREG_P02_TEST1_srldat = BINARY(1, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P02_TEST1_tst_nosc = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P02_TEST1_tst_enahvp = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - /* E_MASKREG_P02_TEST2_pwd1v8 = BINARY(0,0,0,0, 0,0,1,0), */ - /* E_MASKREG_P02_TEST2_divtestoe = BINARY(0,0,0,0, 0,0,0,1), */ - - E_MASKREG_P02_SEL_CLK_ena_sc_clk = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P02_SEL_CLK_sel_vrf_clk = BINARY(0, 0, 0, 0, 0, 1, 1, 0), - E_MASKREG_P02_SEL_CLK_sel_clk1 = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P02_BUFF_OUT2_force_dat2 = BINARY(0, 0, 1, 1, 0, 0, 0, 0), - E_MASKREG_P02_BUFF_OUT2_force_dat1 = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - E_MASKREG_P02_BUFF_OUT2_force_dat0 = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P09_EDID_CTRL_edid_rd = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P11_AIP_CNTRL_0_rst_cts = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P11_AIP_CNTRL_0_acr_man = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P11_AIP_CNTRL_0_layout = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P11_AIP_CNTRL_0_swap = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P11_AIP_CNTRL_0_rst_fifo = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P11_CA_I2S_hbr_chstat_4 = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P11_CA_I2S_ca_i2s = BINARY(0, 0, 0, 1, 1, 1, 1, 1), - - E_MASKREG_P11_GC_AVMUTE_set_mute = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P11_GC_AVMUTE_clr_mute = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - E_MASKREG_P11_GC_AVMUTE_setclr_mute = BINARY(0, 0, 0, 0, 0, 0, 1, 1), - - E_MASKREG_P11_CTS_N_m_sel = BINARY(0, 0, 1, 1, 0, 0, 0, 0), - E_MASKREG_P11_CTS_N_k_sel = BINARY(0, 0, 0, 0, 0, 1, 1, 1), - - E_MASKREG_P11_ENC_CNTRL_ctl_code = BINARY(0, 0, 0, 0, 1, 1, 0, 0), - E_MASKREG_P11_ENC_CNTRL_rst_sel = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P11_ENC_CNTRL_rst_enc = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - E_MASKREG_P11_DIP_FLAGS_force_null = BINARY(1, 0, 0, 0, 0, 0, 0, 0), - E_MASKREG_P11_DIP_FLAGS_null = BINARY(0, 1, 0, 0, 0, 0, 0, 0), - E_MASKREG_P11_DIP_FLAGS_acp = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P11_DIP_FLAGS_isrc2 = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P11_DIP_FLAGS_isrc1 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P11_DIP_FLAGS_gc = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P11_DIP_FLAGS_acr = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - - E_MASKREG_P11_DIP_IF_FLAGS_if5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0), - E_MASKREG_P11_DIP_IF_FLAGS_if4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0), - E_MASKREG_P11_DIP_IF_FLAGS_if3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0), - E_MASKREG_P11_DIP_IF_FLAGS_if2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P11_DIP_IF_FLAGS_if1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - - E_MASKREG_P13_GMD_CONTROL_buf_sel = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P13_GMD_CONTROL_enable = BINARY(0, 0, 0, 0, 0, 0, 0, 1) - }; -#undef BINARY - -/** - * 3 enum for the video formats : - * - 1 used in the E_REG_P00_VIDFORMAT_W register - * - 1 for new format that are not prefetch - * - 1 for PC - */ -#define REGVFMT_INVALID 0xFF - - enum _eRegVfmt { - E_REGVFMT_640x480p_60Hz = 0, /* 1 */ - E_REGVFMT_720x480p_60Hz, /* 2/3 */ - E_REGVFMT_1280x720p_60Hz, /* 4 */ - E_REGVFMT_1920x1080i_60Hz, /* 5 */ - E_REGVFMT_720x480i_60Hz, /* 6/4 */ - E_REGVFMT_720x240p_60Hz, /*NT 8/9 */ - E_REGVFMT_1920x1080p_60Hz, /* 16 */ - E_REGVFMT_720x576p_50Hz, /* 17/18 */ - E_REGVFMT_1280x720p_50Hz, /* 19 */ - E_REGVFMT_1920x1080i_50Hz, /* 20 */ - E_REGVFMT_720x576i_50Hz, /* 21/22 */ - E_REGVFMT_720x288p_50Hz, /* 23/24 */ - E_REGVFMT_1920x1080p_50Hz, /* 31 */ -#ifdef TMFL_RGB_DDR_12BITS - E_REGVFMT_1920x1080p_24Hz, /* 32 */ - E_REGVFMT_1440x576p_50Hz, /* 29/30 */ - E_REGVFMT_1440x480p_60Hz, /* 14/15 */ - E_REGVFMT_2880x480p_60Hz, /* 35/36 */ - E_REGVFMT_2880x576p_50Hz, /* 37/38 */ - E_REGVFMT_2880x480i_60Hz, /* 10/11 */ - E_REGVFMT_2880x480i_60Hz_PR2, /* 10/11 */ - E_REGVFMT_2880x480i_60Hz_PR4, /* 10/11 */ - E_REGVFMT_2880x576i_50Hz, /* 25/26 */ - E_REGVFMT_2880x576i_50Hz_PR2, /* 25/26 */ - E_REGVFMT_720x480p_60Hz_FP, /* 2/3 FP */ - E_REGVFMT_1280x720p_60Hz_FP, /* 4 FP */ - E_REGVFMT_720x576p_50Hz_FP, /* 17/18 FP */ - E_REGVFMT_1280x720p_50Hz_FP, /* 19 FP */ - E_REGVFMT_1920x1080p_24Hz_FP, /* 32 FP */ - E_REGVFMT_1920x1080p_25Hz_FP, /* 33 FP */ - E_REGVFMT_1920x1080p_30Hz_FP, /* 34 FP */ - E_REGVFMT_1920x1080i_60Hz_FP, /* 5 FP */ - E_REGVFMT_1920x1080i_50Hz_FP, /* 20 FP */ -#endif - E_REGVFMT_MAX_PREFETCH, - E_REGVFMT_NUM_PREFETCH = E_REGVFMT_MAX_PREFETCH - }; - - enum _eRegVfmtExtra { -#ifndef TMFL_RGB_DDR_12BITS - E_REGVFMT_1920x1080p_24Hz = E_REGVFMT_MAX_PREFETCH, /* 32 */ - E_REGVFMT_1920x1080p_25Hz, /* 33 */ -#else - E_REGVFMT_1920x1080p_25Hz = E_REGVFMT_MAX_PREFETCH, -#endif - E_REGVFMT_1920x1080p_30Hz, /* 34 */ - E_REGVFMT_1280x720p_24Hz, /* 60 */ - E_REGVFMT_1280x720p_25Hz, /* 61 */ - E_REGVFMT_1280x720p_30Hz, /* 62 */ -#ifndef TMFL_RGB_DDR_12BITS - E_REGVFMT_1280x720p_60Hz_FP, - E_REGVFMT_1920x1080i_60Hz_FP, - E_REGVFMT_1280x720p_50Hz_FP, - E_REGVFMT_1920x1080i_50Hz_FP, - E_REGVFMT_1920x1080p_24Hz_FP, - E_REGVFMT_1920x1080p_25Hz_FP, - E_REGVFMT_1920x1080p_30Hz_FP, -#endif - E_REGVFMT_1280x720p_24Hz_FP, - E_REGVFMT_1280x720p_25Hz_FP, - E_REGVFMT_1280x720p_30Hz_FP, - E_REGVFMT_MAX_EXTRA, - E_REGVFMT_NUM_EXTRA = E_REGVFMT_MAX_EXTRA - E_REGVFMT_MAX_PREFETCH - }; - -#ifdef FORMAT_PC - enum _eRegVfmtPC { - E_REGVFMT_640x480p_72Hz = E_REGVFMT_MAX_EXTRA, - E_REGVFMT_640x480p_75Hz, - E_REGVFMT_640x480p_85Hz, - E_REGVFMT_800x600p_60Hz, - E_REGVFMT_800x600p_72Hz, - E_REGVFMT_800x600p_75Hz, - E_REGVFMT_800x600p_85Hz, - E_REGVFMT_1024x768p_60Hz, - E_REGVFMT_1024x768p_70Hz, - E_REGVFMT_1024x768p_75Hz, - E_REGVFMT_1280x768p_60Hz, - E_REGVFMT_1280x1024p_60Hz, - E_REGVFMT_1360x768p_60Hz, - E_REGVFMT_1400x1050p_60Hz, - E_REGVFMT_1600x1200p_60Hz, - E_REGVFMT_1280x1024p_85Hz, - E_REGVFMT_MAX_PC, - E_REGVFMT_NUM_PC = E_REGVFMT_MAX_PC - E_REGVFMT_MAX_EXTRA - }; -#define E_REGVFMT_MAX E_REGVFMT_MAX_PC -#else -#define E_REGVFMT_MAX E_REGVFMT_MAX_EXTRA -#endif /*FORMAT_PC */ - -#define PREFETCH(fmt) ((fmt) < E_REGVFMT_MAX_PREFETCH) -#define EXTRA(fmt) (!PREFETCH(fmt)) -#define PCFORMAT(fmt) ((fmt) >= E_REGVFMT_MAX_EXTRA) /* PR1570 FIXED */ -#define BASE(fmt) (PREFETCH(fmt)?(fmt):(fmt)-E_REGVFMT_MAX_PREFETCH) - - -/** - * An enum for the video input formats used in the E_REG_P01_SC_VIDFORMAT_W - * register - */ - enum _eRegVfmtScIn { - E_REGVFMT_SCIN_480i_60Hz = 0, - E_REGVFMT_SCIN_576i_50Hz = 1, - E_REGVFMT_SCIN_480p_60Hz = 2, - E_REGVFMT_SCIN_576p_50Hz = 3, - E_REGVFMT_SCIN_720p_50Hz_60Hz = 4, - E_REGVFMT_SCIN_1080i_50Hz_60Hz = 5, - E_REGVFMT_SCIN_MAX = 5, - E_REGVFMT_SCIN_NUM = 6, - E_REGVFMT_SCIN_INVALID = 6 - }; - -/** - * An enum to list all supported pixel clock frequencies in kHz - */ - enum _ePixClk { - E_PIXCLK_25175 = 0, - E_PIXCLK_25200 = 1, - E_PIXCLK_27000 = 2, - E_PIXCLK_27027 = 3, - E_PIXCLK_54000 = 4, - E_PIXCLK_54054 = 5, - E_PIXCLK_59400 = 6, - E_PIXCLK_74175 = 7, - E_PIXCLK_74250 = 8, - E_PIXCLK_148350 = 9, - E_PIXCLK_148500 = 10, - E_PIXCLK_108000 = 11, - E_PIXCLK_108108 = 12, -#ifndef FORMAT_PC - E_PIXCLK_MAX = 12, - E_PIXCLK_INVALID = 13, - E_PIXCLK_NUM = 13 -#else /* FORMAT_PC */ - E_PIXCLK_31500 = 13, - E_PIXCLK_36000 = 14, - E_PIXCLK_40000 = 15, - E_PIXCLK_49500 = 16, - E_PIXCLK_50000 = 17, - E_PIXCLK_56250 = 18, - E_PIXCLK_65000 = 19, - E_PIXCLK_75000 = 20, - E_PIXCLK_78750 = 21, - E_PIXCLK_79500 = 22, - E_PIXCLK_85500 = 23, - E_PIXCLK_PC_108000 = 24, - E_PIXCLK_121750 = 25, - E_PIXCLK_162000 = 26, - E_PIXCLK_MAX = 26, - E_PIXCLK_INVALID = 27, - E_PIXCLK_NUM = 27 -#endif /* FORMAT_PC */ - }; - -/** - * An enum to list all device version codes supported by this driver. - * The values form a list, with non-zero version codes first in any order. - * The E_DEV_VERSION_END_LIST must be the last value in the list. - */ - enum _eDevVersion { - E_DEV_VERSION_N2 = 0x101, /**< TDA9989 n2 */ - E_DEV_VERSION_TDA19989 = 0x201, - /**< TDA19989 */ - E_DEV_VERSION_TDA19989_N2 = 0x202, - /**< TDA19989 N2 */ - E_DEV_VERSION_TDA19988 = 0x301, - /**< TDA19988 */ - E_DEV_VERSION_LIST_END = 0x00, - E_DEV_VERSION_LIST_NUM = 5 /**< Number of items in list */ - }; - -/** - * An enum to list all CEA Data Block Tag Codes we may find in EDID. - */ - enum _eCeaBlockTags { - E_CEA_RESERVED_0 = 0x00, - E_CEA_AUDIO_BLOCK = 0x01, - E_CEA_VIDEO_BLOCK = 0x02, - E_CEA_VSDB = 0x03, - E_CEA_SPEAKER_ALLOC = 0x04, - E_CEA_VESA_DTC = 0x05, - E_CEA_RESERVED_6 = 0x06, - E_CEA_EXTENDED = 0x07 - }; - -/** - * An enum to list all CEA Data Block Extended Tag Codes we may find in EDID. - */ - enum _eCeaExtendedBlockTags { - EXT_CEA_MISC_VIDEO_FIELDS = 0x00, - EXT_CEA_VS_VIDEO_DB = 0x01, - EXT_CEA_COLORIMETRY_DB = 0x05, - EXT_CEA_MISC_AUDIO_FIELDS = 0x10, - EXT_CEA_VS_AUDIO_DB = 0x11 - }; - -/** A typedef for colourspace values */ - typedef enum { - HDMITX_CS_RGB_FULL = 0, /**< RGB Full (PC) */ - HDMITX_CS_RGB_LIMITED = 1, /**< RGB Limited (TV) */ - HDMITX_CS_YUV_ITU_BT601 = 2,/**< YUV ITUBT601 (SDTV) */ - HDMITX_CS_YUV_ITU_BT709 = 3,/**< YUV ITUBT709 (HDTV) */ - HDMITX_CS_NUM = 4 /**< Number Cspaces we support */ - } tmbslTDA9989Colourspace_t; - -/** Matrix register block size */ -#define MATRIX_PRESET_SIZE 31 - -/** Matrix register block size */ -#define MATRIX_PRESET_QTY 12 - -/** The enum that vectors us into the MatrixPreset table */ - enum _eMatrixPresetIndex { - E_MATRIX_RGBF_2_RGBL = 0, - E_MATRIX_RGBF_2_BT601 = 1, - E_MATRIX_RGBF_2_BT709 = 2, - E_MATRIX_RGBL_2_RGBF = 3, - E_MATRIX_RGBL_2_BT601 = 4, - E_MATRIX_RGBL_2_BT709 = 5, - E_MATRIX_BT601_2_RGBF = 6, - E_MATRIX_BT601_2_RGBL = 7, - E_MATRIX_BT601_2_BT709 = 8, - E_MATRIX_BT709_2_RGBF = 9, - E_MATRIX_BT709_2_RGBL = 10, - E_MATRIX_BT709_2_BT601 = 11 - }; - -/** EDID i2c address */ -#define DDC_EDID_ADDRESS 0xA0 - -/** EDID alternate i2c address */ -#define DDC_EDID_ADDRESS_ALT 0xA2 - -/** EDID Segment Pointer address */ -#define DDC_SGMT_PTR_ADDRESS 0x60 - -/** EDID DTD block descriptor size */ -#define EDID_DTD_BLK_SIZE 0x12 - -/** number of detailed timing descriptor stored in pDis */ -#define NUMBER_DTD_STORED 10 - -/** MUX_AP audio selection values */ -#define MUX_AP_SELECT_I2S 0xE4 -#define MUX_AP_SELECT_SPDIF 0x27 - -#define TDA19989_MUX_AP_SELECT_I2S 0x64 -#define TDA19989_MUX_AP_SELECT_SPDIF 0x24 - -/** VSWING default value */ -#define HDMI_TX_VSWING_VALUE 0x09 - - -/** - * \brief A structure type to form arrays that hold a series of registers and - * values - */ - typedef struct _tmHdmiTxRegVal_t { - UInt16 Reg; - UInt8 Val; - } tmHdmiTxRegVal_t; - -/** - * \brief A structure type to form arrays that hold a series of registers, - * bitfield masks and bitfield values - */ - typedef struct _tmHdmiTxRegMaskVal_t { - UInt16 Reg; - UInt8 Mask; - UInt8 Val; - } tmHdmiTxRegMaskVal_t; - -/** - * \brief A function pointer type to call a function and return a result - */ - typedef tmErrorCode_t(*ptmHdmiTxFunc_t) (tmUnitSelect_t txUnit); - -/** - * \brief The structure of a TM998x object, one per device unit - **************************************************************************** - ** Copy changes to kTestDisNames tab in "HDMI Driver - Register List.xls" ** - **************************************************************************** - */ - - typedef struct _tmHdmiTxobject_t { - /** Component State */ - tmbslTDA9989State_t state; - - /** Count of events ignored by setState() */ - UInt8 nIgnoredEvents; - - /** Device unit number */ - tmUnitSelect_t txUnit; - - /** Device I2C slave address */ - UInt8 uHwAddress; - - /** System function to write to the I2C driver */ - ptmbslHdmiTxSysFunc_t sysFuncWrite; - - /** System function to read from the I2C driver */ - ptmbslHdmiTxSysFunc_t sysFuncRead; - - /** System function to read EDID blocks via the I2C driver */ - ptmbslHdmiTxSysFuncEdid_t sysFuncEdidRead; - - /** System function to run a timer */ - ptmbslHdmiTxSysFuncTimer_t sysFuncTimer; - - /** Array of registered interrupt handler callback functions */ - ptmbslHdmiTxCallback_t funcIntCallbacks[HDMITX_CALLBACK_INT_NUM]; - - /** Flags to store disable or enable of interrupts */ - UInt16 InterruptsEnable; /* At moment used only for VS Interrupt */ - - /** Device version(s) supported by this component */ - UInt16 uSupportedVersions[E_DEV_VERSION_LIST_NUM]; - - /** Device version read from register, with features flags masked out */ - UInt16 uDeviceVersion; - - /** Device features flags read from version register */ - UInt8 uDeviceFeatures; - - /** The device's power state */ - tmbslHdmiTxPowerState_t ePowerState; - - /*=== E D I D ===*/ - - /** EDID Use alternative i2c address flag */ - Bool bEdidAlternateAddr; - - /** The sink type set by the user (may or may not match EdidSinkType) */ - tmbslHdmiTxSinkType_t sinkType; - - /** EDID Sink Type for receiver */ - tmbslHdmiTxSinkType_t EdidSinkType; - - /** EDID AI_Support from HDMI VSDB */ - Bool EdidSinkAi; - - /** EDID CEA flags from extension block */ - UInt8 EdidCeaFlags; - - /** EDID CEA flags from colorimetry block */ - UInt8 EdidCeaXVYCCFlags; - - /** EDID latency information */ - tmbslHdmiTxEdidLatency_t EdidLatency; - - /** EDID 3D data structure */ - tmbslHdmiTxEdidExtraVsdbData_t EdidExtraVsdbData; - - /** EDID Read Status */ - UInt8 EdidStatus; - - /** NB DTD stored in EdidDTD */ - UInt8 NbDTDStored; - - /** EDID Detailed Timing Descriptor */ - tmbslHdmiTxEdidDtd_t EdidDTD[NUMBER_DTD_STORED]; - - /** EDID First Moniteur descriptor */ - tmbslHdmiTxEdidFirstMD_t EdidFirstMonitorDescriptor; - - /** EDID Second Moniteur descriptor */ - tmbslHdmiTxEdidSecondMD_t EdidSecondMonitorDescriptor; - - /** EDID Other Moniteur descriptor */ - tmbslHdmiTxEdidOtherMD_t EdidOtherMonitorDescriptor; - - /** EDID supported Short Video Descriptors */ - UInt8 EdidVFmts[HDMI_TX_SVD_MAX_CNT]; - - /** Counter for supported short video descriptors */ - UInt8 EdidSvdCnt; - - /** EDID supported Short Audio Descriptors */ - tmbslHdmiTxEdidSad_t EdidAFmts[HDMI_TX_SAD_MAX_CNT]; - - /** Counter for supported short audio descriptors */ - UInt8 EdidSadCnt; - - /** EDID block workspace */ - UInt8 EdidBlock[EDID_BLOCK_SIZE]; - - /** EDID Block Count */ - UInt8 EdidBlockCnt; - - /** CEC Source Address read from EDID as "A.B.C.D" nibbles */ - UInt16 EdidSourceAddress; - - /** EDID block number which is reading */ - UInt8 EdidBlockRequested; - - /** EDID read on going*/ - Bool EdidReadStarted; - - /** Parameter for return edid block requested by application */ - tmbslHdmiTxEdidToApp_t EdidToApp; - - /** EDID Basic Display Parameters */ - tmbslHdmiTxEdidBDParam_t EDIDBasicDisplayParam; - -#ifdef TMFL_HDCP_SUPPORT - /*=== H D C P === */ - - Bool HDCPIgnoreEncrypt; - - /** Configured DDC I2C slave address */ - UInt8 HdcpSlaveAddress; - - /** Configured mode of our transmitter device */ - tmbslHdmiTxHdcpTxMode_t HdcpTxMode; - - /** Configured HDCP options */ - tmbslHdmiTxHdcpOptions_t HdcpOptions; - - /** BCAPS read from sink */ - UInt8 HdcpBcaps; - - /** BSTATUS read from sink */ - UInt16 HdcpBstatus; - - /** Device value generated for Ri=Ri' comparison */ - UInt16 HdcpRi; - - /** Device HDCP FSM state */ - UInt8 HdcpFsmState; - - /** Device failure state that caused T0 interrupt */ - UInt8 HdcpT0FailState; - - /** Otp Seed key from user*/ - UInt16 HdcpSeed; - - /* Key Selection Vector for transmitter */ - UInt8 HdcpAksv[HDMITX_KSV_BYTES_PER_DEVICE]; - - /** Local callback scheduled to be called after HdcpFuncRemainingMs */ - ptmHdmiTxFunc_t HdcpFuncScheduled; - - /** Period in ms after which to call HdcpFuncScheduled; 0=disabled */ - UInt16 HdcpFuncRemainingMs; - - /** Configured period in ms after which to do HDCP check */ - UInt16 HdcpCheckIntervalMs; - - /** Period in ms until next HDCP check */ - UInt16 HdcpCheckRemainingMs; - - /** Number of the HDCP check since HDCP was started; 0=disabled */ - UInt8 HdcpCheckNum; - - /** Configured number of HDCP checks to do after HDCP is started */ - UInt8 HdcpChecksToDo; -#endif /* TMFL_HDCP_SUPPORT */ - - /*=== V I D E O ===*/ - - /** Current EIA/CEA video input format */ - tmbslHdmiTxVidFmt_t vinFmt; - - /** Current EIA/CEA video output format */ - tmbslHdmiTxVidFmt_t voutFmt; - - /** Current pix Rate*/ - tmbslHdmiTxPixRate_t pixRate; - - /** Video input mode */ - tmbslHdmiTxVinMode_t vinMode; - - /** Video output mode */ - tmbslHdmiTxVoutMode_t voutMode; - - /** Vertical output frequency */ - tmbslHdmiTxVfreq_t voutFreq; - - /** Current scaler mode */ - tmbslHdmiTxScaMode_t scaMode; - - /** Current upsampler mode */ - tmbslHdmiTxUpsampleMode_t upsampleMode; - - /** Current pixel repetition count */ - UInt8 pixelRepeatCount; - - /** Status of hot plug detect pin last read at interrupt */ - tmbslHdmiTxHotPlug_t hotPlugStatus; - - /** Status of rx sense detect pin last read at interrupt */ - tmbslHdmiTxRxSense_t rxSenseStatus; - - /** Current register page */ - UInt8 curRegPage; - - /** Shadow copies of write-only registers with bitfields */ - UInt8 shadowReg[E_SNUM]; - - /** TRUE: Blue screen is the previous test pattern ; FALSE: is not */ - Bool prevFilterPattern; - - /** TRUE: last screen is test pattern ; FALSE: is not */ - Bool prevPattern; - - /** TRUE: Unit has been initialized; FALSE: not initialized */ - Bool bInitialized; - - tmbslHdmiTxVQR_t dviVqr; - - /** TRUE: 3D Frame Packing video is ongoing */ - Bool h3dFpOn; - - } tmHdmiTxobject_t; - -/** - * \The structure of registers for video format , - * used by PC_formats and chip_unknown formats - */ - - typedef struct _tmHdmiTxVidReg_t { - UInt16 nPix; - UInt16 nLine; - UInt8 VsLineStart; - UInt16 VsPixStart; - UInt8 VsLineEnd; - UInt16 VsPixEnd; - UInt16 HsStart; - UInt16 HsEnd; - UInt8 ActiveVideoStart; - UInt16 ActiveVideoEnd; - UInt16 DeStart; - UInt16 DeEnd; - UInt16 ActiveSpaceStart; - UInt16 ActiveSpaceEnd; - } tmHdmiTxVidReg_t; - - -/*============================================================================*/ -/* EXTERN DATA DEFINITION */ -/*============================================================================*/ - -#include "tmbslTDA9989_local_otp.h" - - extern tmHdmiTxobject_t gHdmiTxInstance[HDMITX_UNITS_MAX]; - extern UInt8 kPageIndexToPage[E_PAGE_NUM]; - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - - tmErrorCode_t checkUnitSetDis(tmUnitSelect_t txUnit, tmHdmiTxobject_t **ppDis); - tmErrorCode_t getHwRegisters(tmHdmiTxobject_t *pDis, - UInt16 regShadPageAddr, UInt8 *pData, UInt16 lenData); - tmErrorCode_t getHwRegister(tmHdmiTxobject_t *pDis, - UInt16 regShadPageAddr, UInt8 *pRegValue); - tmErrorCode_t setHwRegisters(tmHdmiTxobject_t *pDis, - UInt16 regShadPageAddr, UInt8 *pData, UInt16 lenData); - tmErrorCode_t setHwRegisterMsbLsb(tmHdmiTxobject_t *pDis, - UInt16 regShadPageAddr, UInt16 regWord); - tmErrorCode_t setHwRegister(tmHdmiTxobject_t *pDis, - UInt16 regShadPageAddr, UInt8 regValue); - tmErrorCode_t setHwRegisterField(tmHdmiTxobject_t *pDis, - UInt16 regShadPageAddr, UInt8 fieldMask, UInt8 fieldValue); - tmErrorCode_t setHwRegisterFieldTable(tmHdmiTxobject_t *pDis, - const tmHdmiTxRegMaskVal_t *pTable); - tmErrorCode_t getCECHwRegister(tmHdmiTxobject_t *pDis, UInt16 regAddr, UInt8 *pRegValue); - tmErrorCode_t setCECHwRegister(tmHdmiTxobject_t *pDis, UInt16 regAddr, UInt8 regValue); - - tmErrorCode_t lmemcpy(void *pTable1, const void *pTable2, UInt Size); - tmErrorCode_t lmemset(void *pTable1, const UInt8 value, UInt Size); - - -#ifdef __cplusplus -} -#endif -#endif /* TMBSLTDA9989_LOCAL_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local_otp.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local_otp.h deleted file mode 100644 index 534c9a3fee2..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmbslTDA9989_local_otp.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (C) 2009 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmbslTDA9989_local_otp.h - * - * \version %version: 1 % - * -*/ - -#ifndef TMBSLTDA9989_LOCAL_OTP_H -#define TMBSLTDA9989_LOCAL_OTP_H - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - -#define BINARY(d7, d6, d5, d4, d3, d2, d1, d0) \ - (((d7)<<7)|((d6)<<6)|((d5)<<5)|((d4)<<4)|((d3)<<3)|((d2)<<2)|((d1)<<1)|(d0)) - -enum _eRegOtp { -#ifdef TMFL_HDCP_SUPPORT - E_REG_P12_CTRL_W = SPA(E_SP12_CTRL, E_PAGE_12, 0x40), -#ifdef BCAPS_REPEATER - E_REG_P12_BCAPS_W = SPA(E_SP12_BCAPS, E_PAGE_12, 0x49), -#else - E_REG_P12_BCAPS_W = SPA(E_SNONE, E_PAGE_12, 0x49), -#endif /* BCAPS_REPEATER */ -#endif - E_REG_P12_TX0_RW = SPA(E_SNONE, E_PAGE_12, 0x97), - E_REG_P12_TX3_RW = SPA(E_SNONE, E_PAGE_12, 0x9A), -#ifdef TMFL_HDCP_OPTIMIZED_POWER - E_REG_P12_TX4_RW = SPA(E_SNONE, E_PAGE_12, 0x9B), -#endif - E_REG_P12_TX33_RW = SPA(E_SNONE, E_PAGE_12, 0xB8), -}; - -enum _eMaskRegOtp { - E_MASKREG_P12_TX33_hdmi = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P12_TX0_sr_hdcp = BINARY(0, 0, 0, 0, 0, 0, 0, 1), -#ifdef TMFL_HDCP_OPTIMIZED_POWER - E_MASKREG_P12_TX4_pd_rg = BINARY(0, 0, 0, 0, 0, 1, 0, 0), - E_MASKREG_P12_TX4_pd_ram = BINARY(0, 0, 0, 0, 0, 0, 1, 0), - E_MASKREG_P12_TX4_pd_hdcp = BINARY(0, 0, 0, 0, 0, 0, 0, 1), - E_MASKREG_P12_TX4_pd_all = BINARY(0, 0, 0, 0, 0, 1, 1, 1), -#endif -}; - -#endif /* TMBSLTDA9989_LOCAL_OTP_H */ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx.c deleted file mode 100644 index 66916464f24..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx.c +++ /dev/null @@ -1,6909 +0,0 @@ -/** - * Copyright (C) 2006 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx.c - * - * \version Revision: 1 - * - * \date Date: 10/08/07 10:00 - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * - * \section info Change Information - * - * \verbatim - - History: tmdlHdmiTx.c - * - * ***************** Version 1 ***************** - * User: J. Lamotte Date: 10/08/07 Time: 10:00 - * Updated in $/Source/tmdlHdmiTx/inc - * initial version - - \endverbatim - * -*/ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -#include "tmdlHdmiTx_IW.h" -#include "tmdlHdmiTx.h" -#include "tmdlHdmiTx_local.h" -#include "tmdlHdmiTx_cfg.h" -#include "tmbslHdmiTx_funcMapping.h" - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - -/* Macro to avoid compilation warnings */ -#ifdef TMFL_OS_WINDOWS -#define DUMMY_ACCESS(x) x -#else -#define DUMMY_ACCESS(x) -#endif - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS */ -/*============================================================================*/ - - - -/*============================================================================*/ -/* FUNCTION PROTOTYPES */ -/*============================================================================*/ - -/* Prototypes of internal functions */ -/* Task functions */ -#ifndef TMFL_NO_RTOS -static void CommandTaskUnit0(void); -static void HdcpTaskUnit0(void); -#endif /* TMFL_NO_RTOS */ - -/* Interrupt callback functions */ -static void dlHdmiTxHandleENCRYPT(tmInstance_t instance); -static void dlHdmiTxHandleHPD(tmInstance_t instance); -static void dlHdmiTxHandleT0(tmInstance_t instance); -static void dlHdmiTxHandleBCAPS(tmInstance_t instance); -static void dlHdmiTxHandleBSTATUS(tmInstance_t instance); -static void dlHdmiTxHandleSHA_1(tmInstance_t instance); -static void dlHdmiTxHandlePJ(tmInstance_t instance); -static void dlHdmiTxHandleR0(tmInstance_t instance); -static void dlHdmiTxHandleSW_INT(tmInstance_t instance); -static void dlHdmiTxHandleRX_SENSE(tmInstance_t instance); -static void dlHdmiTxHandleEDID_READ(tmInstance_t instance); -static void dlHdmiTxHandleVS_RPT(tmInstance_t instance); - -/* Devlib internal color bar management functions */ -#ifndef NO_HDCP -static void dlHdmiTxCheckColorBar(tmInstance_t instance); -static void dlHdmiTxCheckHdcpColorBar(tmInstance_t instance); -#endif - -#ifndef NO_HDCP -static void dlHdmiTxFindHdcpSeed(tmInstance_t instance); -#endif /* NO_HDCP */ - -/* Set the state machine of device library */ -static void dlHdmiTxSetState(tmInstance_t instance, tmdlHdmiTxDriverState_t state); - -/* Get the event status (enable or disable) in order to known - if event should be signaled */ -static tmdlHdmiTxEventStatus_t dlHdmiTxGetEventStatus - (tmInstance_t instance, tmdlHdmiTxEvent_t event); - -/* Use by tmdlHdmiTxSetInputOutput in scaler mode */ -static Bool dlHdmiTxGetReflineRefpix - (tmdlHdmiTxVidFmt_t vinFmt, - tmdlHdmiTxVinMode_t vinMode, - tmdlHdmiTxVidFmt_t voutFmt, - UInt8 syncIn, - tmdlHdmiTxPixRate_t pixRate, - UInt16 *pRefPix, - UInt16 *pRefLine, UInt16 *pScRefPix, UInt16 *pScRefLine, Bool *pbVerified); - -/* Use by tmdlHdmiTxSetInputOutput to set AVI infoframe */ -static tmErrorCode_t dlHdmiTxSetVideoInfoframe - (tmInstance_t instance, tmdlHdmiTxVidFmt_t voutFmt, tmdlHdmiTxVoutMode_t voutMode); - -/* Use to set AVI infoframe with raw data */ -static tmErrorCode_t dlHdmiTxSetRawVideoInfoframe - (tmInstance_t instance, tmdlHdmiTxAviIfData_t *pContentVif, Bool enable); - -/* Calculate Checksum for info frame */ -static UInt8 dlHdmiTxcalculateCheksumIF(tmbslHdmiTxPktRawAvi_t *pData /* Pointer to checksum data */ - ); - -/* IMPORTANT: The 3 functions define below should not be declared in static - in order to allow applicative API to call them. Those functions are not - in tmdlHdmiTx_Functions.h but are in tmdlHdmiTxCore.def */ - -/* Get the device library state */ -tmdlHdmiTxDriverState_t dlHdmiTxGetState(tmInstance_t instance); - -/* Set pattern ON (Blue screen or color bar) */ -tmErrorCode_t dlHdmiTxSetTestPatternOn - (tmInstance_t instance, - tmdlHdmiTxVidFmt_t voutFmt, tmdlHdmiTxVoutMode_t voutMode, tmdlHdmiTxTestPattern_t pattern); - -/* Set pattern OFF */ -tmErrorCode_t dlHdmiTxSetTestPatternOff - (tmInstance_t instance, tmdlHdmiTxVidFmt_t voutFmt, tmdlHdmiTxVoutMode_t voutMode); - -/* Get DTD from BSL */ -static tmErrorCode_t dlHdmiTxEdidGetDTD - (tmInstance_t instance, - tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, UInt8 maxDTDesc, UInt8 *pWrittenDTDesc); - -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_640HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors); - -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_720HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, tmdlHdmiTxPictAspectRatio_t pictureAspectRatio); - -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_1280HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors); - -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_1920HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, Bool formatInterlaced); - -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_1440HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, - tmdlHdmiTxPictAspectRatio_t pictureAspectRatio, Bool formatInterlaced); - -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_2880HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, - tmdlHdmiTxPictAspectRatio_t pictureAspectRatio, Bool formatInterlaced); - -static tmdlHdmiTxPictAspectRatio_t dlHdmiTxCalcAspectRatio(UInt16 HImageSize, UInt16 VImageSize); - -#ifndef NO_HDCP -static void dlHdmiTxCheckHdcpBksv - (tmInstance_t instance, UInt8 *pHdcpBksvTested, Bool *pbBksvSecure, Bool bBigEndian); -#endif - -/* Calculate table index according to video format value */ -static tmdlHdmiTxVidFmt_t dlHdmiTxCalcVidFmtIndex(tmdlHdmiTxVidFmt_t vidFmt); - -extern tmErrorCode_t tmbslDebugWriteFakeRegPage(tmUnitSelect_t txUnit); - -/*============================================================================*/ -/* VARIABLES DECLARATIONS */ -/*============================================================================*/ - -tmdlHdmiTxIWSemHandle_t dlHdmiTxItSemaphore[MAX_UNITS]; - -/* Unit configuration structure (device library system configuration) */ -unitConfig_t unitTableTx[MAX_UNITS] = { - { - False, - False, - (tmdlHdmiTxHdcpOptions_t) HDCP_OPT_DEFAULT, - False, - False, - TMDL_HDMITX_DEVICE_UNKNOWN, - 0, - 0, - (tmdlHdmiTxIWTaskHandle_t) 0, - (tmdlHdmiTxIWQueueHandle_t) 0, - (tmdlHdmiTxIWTaskHandle_t) 0, - STATE_NOT_INITIALIZED, - (ptmdlHdmiTxCallback_t) 0, - {Null, 0,}, - } -}; - -#ifndef TMFL_NO_RTOS - -tmdlHdmiTxIWFuncPtr_t commandTaskTableTx[MAX_UNITS] = { - CommandTaskUnit0 -}; - -tmdlHdmiTxIWFuncPtr_t hdcpTaskTableTx[MAX_UNITS] = { - HdcpTaskUnit0 -}; - -#endif /* TMFL_NO_RTOS */ - -tmbslHdmiTxCallbackList_t callbackFuncTableTx; - -/* Device library configuration structure completed by dlHdmiTxGetConfig with - informations contained in config file */ -tmdlHdmiTxDriverConfigTable_t gtmdlHdmiTxDriverConfigTable[MAX_UNITS] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TMDL_HDMITX_PATTERN_OFF, 0}, -}; - -/* Video info (see instanceStatusInfoTx) */ -tmdlHdmiTxVideoInfo_t videoInfoListTx = { - False, - {TMDL_HDMITX_VFMT_03_720x480p_60Hz, TMDL_HDMITX_VINMODE_YUV422, TMDL_HDMITX_SYNCSRC_EXT_VS, - TMDL_HDMITX_PIXRATE_SINGLE, TMDL_HDMITX_3D_NONE}, - {TMDL_HDMITX_VFMT_03_720x480p_60Hz, TMDL_HDMITX_VOUTMODE_YUV422, TMDL_HDMITX_COLORDEPTH_24, - TMDL_HDMITX_VQR_DEFAULT} -}; - -/* Audio info (see instanceStatusInfoTx) */ -tmdlHdmiTxAudioInfo_t audioInfoListTx = { - False, - {TMDL_HDMITX_AFMT_SPDIF, TMDL_HDMITX_AFS_48K, TMDL_HDMITX_I2SFOR_PHILIPS_L, - TMDL_HDMITX_I2SQ_16BITS, TMDL_HDMITX_DSTRATE_SINGLE, 0x00} -}; - -/* Event state (see instanceStatusInfoTx) */ -tmdlHdmiTxEventState_t eventStateListTx[EVENT_NB] = { - {TMDL_HDMITX_HDCP_ACTIVE, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_HDCP_INACTIVE, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_HPD_ACTIVE, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_HPD_INACTIVE, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_RX_KEYS_RECEIVED, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_RX_DEVICE_ACTIVE, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_RX_DEVICE_INACTIVE, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_EDID_RECEIVED, TMDL_HDMITX_EVENT_DISABLED}, - {TMDL_HDMITX_VS_RPT_RECEIVED, TMDL_HDMITX_EVENT_DISABLED} -#ifdef HDMI_TX_REPEATER_ISR_MODE - , {TMDL_HDMITX_B_STATUS, TMDL_HDMITX_EVENT_DISABLED} -#endif /* HDMI_TX_REPEATER_ISR_MODE */ -}; - -/* Color bars state (see instanceStatusInfoTx) */ -tmdlHdmiTxColBarState_t colorBarStateTx = { - False, - True, - True, - False, - False, - True, - False -}; - -tmdlHdmiTxGamutState_t gamutStateTx = { - False, - 0, - TMDL_HDMITX_EXT_COLORIMETRY_XVYCC601, - False, - TMDL_HDMITX_YQR_LIMITED -}; - - -/* Instance status (save the actual configuration) */ -instanceStatus_t instanceStatusInfoTx[MAX_UNITS] = { - {(ptmdlHdmiTxVideoInfo_t) &videoInfoListTx, - (ptmdlHdmiTxAudioInfo_t) &audioInfoListTx, - (ptmdlHdmiTxEventState_t) eventStateListTx, - (ptmdlHdmiTxColBarState_t) &colorBarStateTx, - (ptmdlHdmiTxGamutState_t) &gamutStateTx} -}; - -/* HDCP seed table, arranged as pairs of 16-bit integers: lookup value, seed value. - * If no table is programmed and if KEY_SEED in config file is null, HDCP will be disabled */ -#define SEED_TABLE_LEN 10 -static const UInt16 kSeedTable[SEED_TABLE_LEN][2] = { - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0} -}; - -#ifndef NO_HDCP -tmdlHdmiTxHdcpInfo_t hdcpInfoListTx[MAX_UNITS]; -#endif /* NO_HDCP */ - - -static Bool gI2CDebugAccessesEnabled = True; /* For debug purpose only, used to manage underlying I2C accessed */ - -#ifdef HDMI_TX_REPEATER_ISR_MODE -static Bool gIgnoreNextSha1 = False; -#endif /*HDMI_TX_REPEATER_ISR_MODE */ - -/*============================================================================*/ -/* FUNCTIONS */ -/*============================================================================*/ - -/****************************************************************************** - \brief Get the software version of the driver. - - \param pSWVersion Pointer to the version structure. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetSWVersion(tmSWVersion_t *pSWVersion) { - /* Check if SWVersion pointer is Null */ - RETIF(pSWVersion == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Copy SW version */ - pSWVersion->compatibilityNr = VERSION_COMPATIBILITY; - pSWVersion->majorVersionNr = VERSION_MAJOR; - pSWVersion->minorVersionNr = VERSION_MINOR; - - return TM_OK; -} - -/****************************************************************************** - \brief Get the number of available HDMI transmitters devices in the system. - A unit directly represents a physical device. - - \param pUnitCount Pointer to the number of available units. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetNumberOfUnits(UInt32 *pUnitCount) { - /* Check if UnitCount pointer is Null */ - RETIF(pUnitCount == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Copy the maximum number of units */ - * pUnitCount = MAX_UNITS; - - return TM_OK; -} - -/****************************************************************************** - \brief Get the capabilities of unit 0. Capabilities are stored into a - dedicated structure and are directly read from the HW device. - - \param pCapabilities Pointer to the capabilities structure. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetCapabilities(tmdlHdmiTxCapabilities_t *pCapabilities) { - /* Directly call GetCapabilitiesM function for unit 0 and return the result */ - return (tmdlHdmiTxGetCapabilitiesM((tmUnitSelect_t) 0, pCapabilities)); -} - -/****************************************************************************** - \brief Get the capabilities of a specific unit. Capabilities are stored - into a dedicated structure and are directly read from the HW - device. - - \param unit Unit to be probed. - \param pCapabilities Pointer to the capabilities structure. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetCapabilitiesM - (tmUnitSelect_t unit, tmdlHdmiTxCapabilities_t *pCapabilities) { - tmErrorCode_t errCode = TM_OK; - Bool featureSupported; - - /* Check if unit number is in range */ - RETIF((unit < 0) || (unit >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER) - - /* Check if Capalities pointer is Null */ - RETIF(pCapabilities == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Device version */ - pCapabilities->deviceVersion = unitTableTx[unit].deviceVersion; - - /* Retrieve the capabilities from the BSL layer */ - - /* HDCP support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_HDCP, - &featureSupported)) != TM_OK, errCode) - - pCapabilities->hdcp = featureSupported; - - /* Scaler support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_SCALER, - &featureSupported)) != TM_OK, errCode) - - pCapabilities->scaler = featureSupported; - - /* Audio HBR support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_AUDIO_HBR, - &featureSupported)) != TM_OK, errCode) - - pCapabilities->audioPacket.HBR = featureSupported; - - /* Audio OBA support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_AUDIO_OBA, - &featureSupported)) != TM_OK, errCode) - - pCapabilities->audioPacket.oneBitAudio = featureSupported; - - /* Audio DST support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_AUDIO_DST, - &featureSupported)) != TM_OK, errCode) - - pCapabilities->audioPacket.DST = featureSupported; - - /* HDMI version 1.1 support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_HDMI_1_1, - &featureSupported)) != TM_OK, errCode) - - if (featureSupported) { - pCapabilities->hdmiVersion = TMDL_HDMITX_HDMI_VERSION_1_1; - } - - /* HDMI version 1.2A support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_HDMI_1_2A, - &featureSupported)) != TM_OK, errCode) - - if (featureSupported) { - pCapabilities->hdmiVersion = TMDL_HDMITX_HDMI_VERSION_1_2a; - } - - /* HDMI version 1.3 support */ - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_HDMI_1_3A, - &featureSupported)) != TM_OK, errCode) - - if (featureSupported) { - pCapabilities->hdmiVersion = TMDL_HDMITX_HDMI_VERSION_1_3a; - } - - /* Deep Color support */ - /* By default */ - pCapabilities->colorDepth = TMDL_HDMITX_COLORDEPTH_24; - - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_DEEP_COLOR_30, - &featureSupported)) != TM_OK, errCode) - - if (featureSupported) { - pCapabilities->colorDepth = TMDL_HDMITX_COLORDEPTH_30; - } - - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_DEEP_COLOR_36, - &featureSupported)) != TM_OK, errCode) - - if (featureSupported) { - pCapabilities->colorDepth = TMDL_HDMITX_COLORDEPTH_36; - } - - RETIF((errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_DEEP_COLOR_48, - &featureSupported)) != TM_OK, errCode) - - if (featureSupported) { - pCapabilities->colorDepth = TMDL_HDMITX_COLORDEPTH_48; - } - - return errCode; -} - -/****************************************************************************** - \brief Open unit 0 of HdmiTx driver and provides the instance number to - the caller. Note that one unit of HdmiTx represents one physical - HDMI transmitter and that only one instance per unit can be opened. - - \param pInstance Pointer to the variable that will receive the instance - identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the transmitter instance is not initialised - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_INIT_FAILED: the unit instance is already - initialised or something wrong happened at lower level. - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: the unit is not initialized - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_INIT_FAILED: the unit instance is already - initialised - - TMBSL_ERR_HDMI_COMPATIBILITY: the driver is not compatiable - with the internal device version code - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxOpen(tmInstance_t *pInstance) { - /* Directly call OpenM function for unit 0 and return the result */ - return (tmdlHdmiTxOpenM(pInstance, (tmUnitSelect_t) 0)); -} - -/****************************************************************************** - \brief Open a specific unit of HdmiTx driver and provides the instance - number to the caller. Note that one unit of HdmiTx represents one - physical HDMI transmitter and that only one instance per unit can be - opened. This function switches driver's state machine to - "initialized" state. - - \param pInstance Pointer to the structure that will receive the instance - identifier. - \param unit Unit number to be opened. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the transmitter instance is not initialised - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_INIT_FAILED: the unit instance is already - initialised or something wrong happened at lower level. - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: the unit is not initialized - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_INIT_FAILED: the unit instance is already - initialised - - TMBSL_ERR_HDMI_COMPATIBILITY: the driver is not compatiable - with the internal device version code - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - -******************************************************************************/ - -#include -DEFINE_SEMAPHORE(hdmitx_mutex); - -tmErrorCode_t tmdlHdmiTxOpenM(tmInstance_t *pInstance, tmUnitSelect_t unit) { - tmErrorCode_t errCode; - tmErrorCode_t errCodeSem; - UInt16 i; - UInt8 deviceVersion; - Bool featureSupported; - - /* Check if unit number is in range */ - RETIF((unit < 0) || (unit >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER) - - /* Check if Instance pointer is Null */ - RETIF(pInstance == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Create the semaphore to protect variables modified under interruption */ - /* RETIF( (errCode = tmdlHdmiTxIWSemaphoreCreate(&dlHdmiTxItSemaphore[unit]) ) != TM_OK, errCode) */ - dlHdmiTxItSemaphore[unit] = (tmdlHdmiTxIWSemHandle_t) (&hdmitx_mutex); - - /* Take the sempahore */ - RETIF((errCodeSem = tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[unit])) != TM_OK, errCodeSem) - - /* Check if unit is already instanciated */ - RETIF_SEM(dlHdmiTxItSemaphore[unit], - unitTableTx[unit].opened == True, TMDL_ERR_DLHDMITX_RESOURCE_OWNED) - - /* Check the state */ - RETIF_SEM(dlHdmiTxItSemaphore[unit], - dlHdmiTxGetState(unit) != STATE_NOT_INITIALIZED, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Instanciate unit and return corresponding instance number */ - /* Since HW unit are only instanciable once, instance = unit */ - unitTableTx[unit].opened = True; - unitTableTx[unit].hdcpEnable = False; - unitTableTx[unit].repeaterEnable = False; - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_UNKNOWN; - unitTableTx[unit].simplayHd = False; - unitTableTx[unit].pCallback = Null; - unitTableTx[unit].revocationList.pList = Null; - unitTableTx[unit].revocationList.length = 0; - - /* Recover the configuration of the device library */ - RETIF_SEM(dlHdmiTxItSemaphore[unit], - dlHdmiTxGetConfig(unit, >mdlHdmiTxDriverConfigTable[unit]) != TM_OK, - TMDL_ERR_DLHDMITX_INIT_FAILED) -#ifndef TMFL_NO_RTOS - /* Create message queue associated to this instance/unit */ - RETIF_SEM(dlHdmiTxItSemaphore[unit], - tmdlHdmiTxIWQueueCreate(gtmdlHdmiTxDriverConfigTable[unit]. - commandTaskQueueSize, - &(unitTableTx[unit].queueHandle)) != TM_OK, - TMDL_ERR_DLHDMITX_NO_RESOURCES) - - /* Create the command task associated to this instance/unit */ - RETIF_SEM(dlHdmiTxItSemaphore[unit], - tmdlHdmiTxIWTaskCreate(commandTaskTableTx[unit], - gtmdlHdmiTxDriverConfigTable[unit].commandTaskPriority, - gtmdlHdmiTxDriverConfigTable[unit]. - commandTaskStackSize, - &(unitTableTx[unit].commandTaskHandle)) != TM_OK, - TMDL_ERR_DLHDMITX_NO_RESOURCES) - - RETIF_SEM(dlHdmiTxItSemaphore[unit], - tmdlHdmiTxIWTaskStart(unitTableTx[unit].commandTaskHandle) != TM_OK, - TMDL_ERR_DLHDMITX_NO_RESOURCES) - - /* Create the hdcp check task associated to this instance/unit */ -#ifndef NO_HDCP - RETIF_SEM(dlHdmiTxItSemaphore[unit], - tmdlHdmiTxIWTaskCreate(hdcpTaskTableTx[unit], - gtmdlHdmiTxDriverConfigTable[unit].hdcpTaskPriority, - gtmdlHdmiTxDriverConfigTable[unit].hdcpTaskStackSize, - &(unitTableTx[unit].hdcpTaskHandle)) != TM_OK, - TMDL_ERR_DLHDMITX_NO_RESOURCES) -#endif /* NO_HDCP */ -#endif /* TMFL_NO_RTOS */ - * pInstance = (tmInstance_t) unit; - -#ifndef NO_HDCP - hdcpInfoListTx[unit].bKsvSecure = False; - hdcpInfoListTx[unit].hdcpKsvDevices = 0; - for (i = 0; i < TMDL_HDMITX_KSV_BYTES_PER_DEVICE; i++) { - hdcpInfoListTx[unit].hdcpBksv[i] = 0; - } - hdcpInfoListTx[unit].hdcpDeviceDepth = 0; -#endif /* NO_HDCP */ - - /* Init the BSL */ - /* Make sure all events are disabled */ - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_HDCP_ACTIVE].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_HDCP_INACTIVE].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_HPD_ACTIVE].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_HPD_INACTIVE].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_RX_KEYS_RECEIVED].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_RX_DEVICE_ACTIVE].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_RX_DEVICE_INACTIVE].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_EDID_RECEIVED].status = - TMDL_HDMITX_EVENT_DISABLED; - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_VS_RPT_RECEIVED].status = - TMDL_HDMITX_EVENT_DISABLED; -#ifdef HDMI_TX_REPEATER_ISR_MODE - instanceStatusInfoTx[unit].pEventState[TMDL_HDMITX_B_STATUS].status = - TMDL_HDMITX_EVENT_DISABLED; -#endif /* HDMI_TX_REPEATER_ISR_MODE */ - instanceStatusInfoTx[unit].pColBarState->disableColorBarOnR0 = False; - instanceStatusInfoTx[unit].pColBarState->hdcpColbarChange = False; - instanceStatusInfoTx[unit].pColBarState->hdcpEncryptOrT0 = True; - instanceStatusInfoTx[unit].pColBarState->hdcpSecureOrT0 = False; - instanceStatusInfoTx[unit].pColBarState->inOutFirstSetDone = False; - instanceStatusInfoTx[unit].pColBarState->colorBarOn = False; - instanceStatusInfoTx[unit].pColBarState->changeColorBarNow = False; - - instanceStatusInfoTx[unit].pGamutState->gamutOn = False; - instanceStatusInfoTx[unit].pGamutState->gamutBufNum = 0; /* use buffer 0 by default */ - instanceStatusInfoTx[unit].pGamutState->wideGamutColorSpace = - TMDL_HDMITX_EXT_COLORIMETRY_XVYCC601; - instanceStatusInfoTx[unit].pGamutState->extColOn = False; - instanceStatusInfoTx[unit].pGamutState->yccQR = TMDL_HDMITX_YQR_LIMITED; - - - instanceStatusInfoTx[unit].pAudioInfo->audioMuteState = False; /* Initially audio is not muted */ - - - - /* The funcCallback is not the same between BSL, so fill it dynamically */ - for (i = 0; i < HDMITX_CALLBACK_INT_NUM; i++) { - callbackFuncTableTx.funcCallback[i] = Null; - } - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_ENCRYPT] = dlHdmiTxHandleENCRYPT; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_HPD] = dlHdmiTxHandleHPD; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_T0] = dlHdmiTxHandleT0; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_BCAPS] = dlHdmiTxHandleBCAPS; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_BSTATUS] = dlHdmiTxHandleBSTATUS; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_SHA_1] = dlHdmiTxHandleSHA_1; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_PJ] = dlHdmiTxHandlePJ; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_R0] = dlHdmiTxHandleR0; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_SW_INT] = dlHdmiTxHandleSW_INT; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_RX_SENSE] = dlHdmiTxHandleRX_SENSE; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_EDID_BLK_READ] = - dlHdmiTxHandleEDID_READ; - callbackFuncTableTx.funcCallback[HDMITX_CALLBACK_INT_VS_RPT] = dlHdmiTxHandleVS_RPT; - - /* Prepare static TDA9984 driver data as the compiler doesn't seem to */ - - tmbslHdmiTxHwStartup(); - errCode = tmbslHdmiTxInit(*pInstance, gtmdlHdmiTxDriverConfigTable[unit].i2cAddress, gtmdlHdmiTxDriverConfigTable[unit].i2cWriteFunction, gtmdlHdmiTxDriverConfigTable[unit].i2cReadFunction, (ptmbslHdmiTxSysFuncEdid_t) 0, /* Not used for TDA9984 */ - (ptmbslHdmiTxSysFuncTimer_t) tmdlHdmiTxIWWait, &callbackFuncTableTx, False, /* Alternate EDID address not used */ - (tmbslHdmiTxVidFmt_t) instanceStatusInfoTx[unit].pVideoInfo-> - videoInConfig.format, - (tmbslHdmiTxPixRate_t) instanceStatusInfoTx[unit].pVideoInfo-> - videoInConfig.pixelRate); - if (errCode != TM_OK) { - /* Init failed */ - tmbslHdmiTxDeinit(unit); - - /* Release the sempahore */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[unit])) != TM_OK, errCodeSem) - - return errCode; - } else { - /* Init passed, continue */ - - /* Start by forcing the TMDS ouputs off */ - errCode = tmbslHdmiTxTmdsSetOutputs(unit, HDMITX_TMDSOUT_FORCED0); - RETIF_SEM(dlHdmiTxItSemaphore[unit], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode) - - RETIF_SEM(dlHdmiTxItSemaphore[unit], - (errCode = tmbslHdmiTxHwGetCapabilities(unit, - HDMITX_FEATURE_HW_HDCP, - &featureSupported)) != TM_OK, - errCode) -#ifndef NO_HDCP - if (featureSupported == True) { - dlHdmiTxFindHdcpSeed(unit); - } -#endif /* NO_HDCP */ - -#ifdef TMFL_HDCP_OPTIMIZED_POWER - tmbslHdmiTxHdcpPowerDown(unit, True); -#endif - /* Retrieve the hardware device version from the BSL layer */ - RETIF_SEM(dlHdmiTxItSemaphore[unit], - (errCode = tmbslHdmiTxHwGetVersion(unit, &deviceVersion)) - != TM_OK, errCode); - - /* Store the hardware device version in the global variable */ - switch (deviceVersion) { - case BSLHDMITX_TDA9984: - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_TDA9984; - break; - - case BSLHDMITX_TDA9989: - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_TDA9989; - break; - - case BSLHDMITX_TDA9981: - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_TDA9981; - break; - - case BSLHDMITX_TDA9983: - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_TDA9983; - break; - - case BSLHDMITX_TDA19989: - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_TDA19989; - break; - - case BSLHDMITX_TDA19988: - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_TDA19988; - break; - - default: - unitTableTx[unit].deviceVersion = TMDL_HDMITX_DEVICE_UNKNOWN; - break; - } - } - - -#ifndef TMFL_NO_RTOS - /* Start HDCP check task */ - -#ifndef NO_HDCP - RETIF_SEM(dlHdmiTxItSemaphore[unit], - tmdlHdmiTxIWTaskStart(unitTableTx[unit].hdcpTaskHandle) != TM_OK, - TMDL_ERR_DLHDMITX_NO_RESOURCES) -#endif /* NO_HDCP */ -#endif /* TMFL_NO_RTOS */ - /* Set the state machine to initialized */ - dlHdmiTxSetState(unit, STATE_INITIALIZED); - - /* Release the sempahore */ - RETIF((errCodeSem = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[unit])) != TM_OK, errCodeSem) - - return TM_OK; -} - -/****************************************************************************** - \brief Close an instance of HdmiTx driver. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxClose(tmInstance_t instance) { - tmErrorCode_t errCode = TM_OK; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check if unit corresponding to instance is opened */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - unitTableTx[instance].opened == False, TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED) - - /* Close instance */ - unitTableTx[instance].opened = False; - - /* Set the state machine */ - dlHdmiTxSetState(instance, STATE_NOT_INITIALIZED); - - /* Destroy resources allocated for this instance/unit */ - -#ifndef TMFL_NO_RTOS - -#ifndef NO_HDCP - tmdlHdmiTxIWTaskDestroy(unitTableTx[instance].hdcpTaskHandle); -#endif /* NO_HDCP */ - - tmdlHdmiTxIWTaskDestroy(unitTableTx[instance].commandTaskHandle); - tmdlHdmiTxIWQueueDestroy(unitTableTx[instance].queueHandle); - -#endif /* TMFL_NO_RTOS */ - - /* Reset an instance of an HDMI transmitter */ - tmbslHdmiTxDeinit(instance); - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Close the handle to the semaphore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreDestroy(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Set the power state of an instance of the HDMI transmitter. - - \param instance Instance identifier. - \param powerState Power state to set. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetPowerState(tmInstance_t instance, tmPowerState_t powerState) { - tmErrorCode_t errCode; - tmbslHdmiTxHotPlug_t hpdStatus; /* HPD status */ - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (unitTableTx[instance].deviceVersion == TMDL_HDMITX_DEVICE_TDA9984) { - if (powerState == tmPowerSuspend) { - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; - } - } - - - - - /* Switch off HDCP */ - if (((powerState == tmPowerOff) && (unitTableTx[instance].hdcpEnable == True)) - || ((powerState == tmPowerStandby) && (unitTableTx[instance].hdcpEnable == True)) - || ((powerState == tmPowerSuspend) && (unitTableTx[instance].hdcpEnable == True)) - ) { - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - /* Switch off HDCP */ - RETIF((errCode = tmdlHdmiTxSetHdcp(instance, False)) != TM_OK, errCode) - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - } - - - /* TDA9989, TDA19989 and TDA19988 only */ - if ((unitTableTx[instance].deviceVersion == TMDL_HDMITX_DEVICE_TDA9989) - || (unitTableTx[instance].deviceVersion == TMDL_HDMITX_DEVICE_TDA19989) - || (unitTableTx[instance].deviceVersion == TMDL_HDMITX_DEVICE_TDA19988)) - { - if ((powerState != tmPowerOn) && (powerState != tmPowerSuspend)) { - dlHdmiTxSetState(instance, STATE_INITIALIZED); - } - - if ((powerState == tmPowerOn) && (unitTableTx[instance].simplayHd == True)) { - - instanceStatusInfoTx[0].pColBarState->disableColorBarOnR0 = False; - instanceStatusInfoTx[0].pColBarState->hdcpColbarChange = False; - instanceStatusInfoTx[0].pColBarState->hdcpEncryptOrT0 = True; - instanceStatusInfoTx[0].pColBarState->hdcpSecureOrT0 = False; - instanceStatusInfoTx[0].pColBarState->inOutFirstSetDone = False; - instanceStatusInfoTx[0].pColBarState->colorBarOn = True; - instanceStatusInfoTx[0].pColBarState->changeColorBarNow = True; - - } - - } - - /* Set the power state of the transmitter */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPowerSetState(instance, powerState)) != TM_OK, errCode) - - /* Get Hot Plug status */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHotPlugGetStatus(instance, - &hpdStatus, False)) != TM_OK, errCode) - - if (powerState == tmPowerOn) { - if ((hpdStatus == HDMITX_HOTPLUG_ACTIVE) - && (dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE)) { - /* Yes: Wait for DDC line to settle before reading EDID */ - tmbslHdmiTxSysTimerWait(instance, 500); /* ms */ - - /* Request EDID read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidRequestBlockData(instance, - unitTableTx[instance]. - pEdidBuffer, - (Int) ((unitTableTx - [instance]. - edidBufferSize) - >> 7), - (Int) (unitTableTx - [instance]. - edidBufferSize))) - != TM_OK, errCode) - } - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Get the power state of an instance of the HDMI transmitter. - - \param instance Instance identifier. - \param pPowerState Pointer to the power state. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetPowerState(tmInstance_t instance, tmPowerState_t *pPowerState) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if PowerState pointer is Null */ - RETIF(pPowerState == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Get the power state of the transmitter */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPowerGetState(instance, pPowerState)) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Set the configuration of instance attributes. This function is - required by DVP architecture rules but actually does nothing in this - driver. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxInstanceConfig(tmInstance_t instance) { - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - return TM_OK; -} - -/****************************************************************************** - \brief Setup the instance with its configuration parameters. This function - allows basic instance configuration like enabling HDCP, choosing - HDCP encryption mode or enabling HDCP repeater mode. - - \param instance Instance identifier. - \param pSetupInfo Pointer to the structure containing all setup parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxInstanceSetup - (tmInstance_t instance, tmdlHdmiTxInstanceSetupInfo_t *pSetupInfo) { - tmErrorCode_t errCode; -#ifndef NO_HDCP - UInt16 i; -#endif - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if SetupInfo pointer is NULL */ - RETIF(pSetupInfo == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check if unit corresponding to instance is opened */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - unitTableTx[instance].opened == False, TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED) - - /* Check the state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_INITIALIZED, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - unitTableTx[instance].repeaterEnable = pSetupInfo->repeaterEnable; - unitTableTx[instance].simplayHd = pSetupInfo->simplayHd; - unitTableTx[instance].pEdidBuffer = pSetupInfo->pEdidBuffer; - unitTableTx[instance].edidBufferSize = pSetupInfo->edidBufferSize; - -#ifndef NO_HDCP - /* Reset HDCP DevLib data */ - hdcpInfoListTx[instance].hdcpCheckState = TMDL_HDMITX_HDCP_CHECK_NOT_STARTED; - hdcpInfoListTx[instance].hdcpErrorState = 0; - hdcpInfoListTx[instance].hdcpKsvDevices = 0; - hdcpInfoListTx[instance].bKsvSecure = False; - for (i = 0; i < TMDL_HDMITX_KSV_BYTES_PER_DEVICE; i++) { - hdcpInfoListTx[instance].hdcpBksv[i] = 0; - } - hdcpInfoListTx[instance].hdcpDeviceDepth = 0; - - hdcpInfoListTx[instance].hdcpMaxCascExceeded = False; - hdcpInfoListTx[instance].hdcpMaxDevsExceeded = False; -#endif /* NO_HDCP */ - - /* Set state machine to Unplugged */ - dlHdmiTxSetState(instance, STATE_UNPLUGGED); - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Get instance setup parameters. - - \param instance Instance identifier. - \param pSetupInfo Pointer to the structure that will receive setup - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetInstanceSetup - (tmInstance_t instance, tmdlHdmiTxInstanceSetupInfo_t *pSetupInfo) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if SetupInfo pointer is NULL */ - RETIF(pSetupInfo == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check if unit corresponding to instance is opened */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - unitTableTx[instance].opened == False, TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED) - - pSetupInfo->simplayHd = unitTableTx[instance].simplayHd; - pSetupInfo->repeaterEnable = unitTableTx[instance].repeaterEnable; - /* JL, TODO */ - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Make device library handle an incoming interrupt. This function is - used by application to tell the device library that the hardware - sent an interrupt. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_FULL: the queue is full - - ******************************************************************************/ -tmErrorCode_t tmdlHdmiTxHandleInterrupt(tmInstance_t instance) { -#ifndef TMFL_NO_RTOS - tmErrorCode_t errCode; - UInt8 message = 0; -#else - tmErrorCode_t err = TM_OK; -#endif /* TMFL_NO_RTOS */ - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) -#ifndef TMFL_NO_RTOS - RETIF((errCode = - tmdlHdmiTxIWQueueSend(unitTableTx[instance].queueHandle, message)) != TM_OK, - errCode) - - /* Disable interrupts for Tx until the callbacks have been done by the command task */ - switch (instance) { - case INSTANCE_0: - tmdlHdmiTxIWDisableInterrupts(TMDL_HDMI_IW_TX_1); - break; - case INSTANCE_1: - tmdlHdmiTxIWDisableInterrupts(TMDL_HDMI_IW_TX_2); - break; - default: - return TMDL_ERR_DLHDMITX_BAD_INSTANCE; - } -#else - /* Clear T0 flag before polling for interrupts */ - instanceStatusInfoTx[0].pColBarState->hdcpSecureOrT0 = False; - - if (gI2CDebugAccessesEnabled == True) { - - err = tmbslHdmiTxHwHandleInterrupt(0); - - if ((err == TMBSL_ERR_HDMI_I2C_WRITE) || (err == TMBSL_ERR_HDMI_I2C_READ)) { - - unitTableTx[0].pCallback(TMDL_HDMITX_DEBUG_EVENT_1); - } - - } - - /* (gI2CDebugAccessesEnabled == True) */ -#endif /* TMFL_NO_RTOS */ - - return TM_OK; -} - -/****************************************************************************** - \brief Register event callbacks. Only one callback is registered through - this API. This callback will received the type of event that - occured throug a dedicated parameter and will be called as many - times as there is pending events. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param pCallback Pointer to the callback function that will handle events - from the devlib. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxRegisterCallbacks(tmInstance_t instance, ptmdlHdmiTxCallback_t pCallback) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check if unit corresponding to instance is opened */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - unitTableTx[instance].opened == False, TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED) - - /* Check if instance state is correct */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_INITIALIZED, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Store callback pointers */ - unitTableTx[instance].pCallback = pCallback; - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief This function allows enabling a specific event. By default, all - events are disabled, except input lock. - - \param instance Instance identifier. - \param event Event to enable. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxEnableEvent(tmInstance_t instance, tmdlHdmiTxEvent_t event) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if the event exists */ - RETIF_BADPARAM(event >= EVENT_NB) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Protect the access to this ressource */ - instanceStatusInfoTx[instance].pEventState[event].status = TMDL_HDMITX_EVENT_ENABLED; - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief This function allows disabling a specific event. By default, all - events are disabled, except input lock. - - \param instance Instance identifier. - \param event Event to disable. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxDisableEvent(tmInstance_t instance, tmdlHdmiTxEvent_t event) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if the event exists */ - RETIF_BADPARAM(event >= EVENT_NB) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Protect the access to this ressource */ - instanceStatusInfoTx[instance].pEventState[event].status = TMDL_HDMITX_EVENT_DISABLED; - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Get specifications of a given video format. Application can use - this function to retreives all specifications (frequencies, - resolution, etc.) of a given IA/CEA 861-D video format. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param resolutionID ID of the resolution to retrieve specs from. - \param pResolutionSpecs Pointer to the structure receiving specs. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetVideoFormatSpecs - (tmInstance_t instance, - tmdlHdmiTxVidFmt_t resolutionID, tmdlHdmiTxVidFmtSpecs_t *pResolutionSpecs) { - UInt8 i; - Bool find = False; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if ResolutionSpecs pointer is Null */ - RETIF(pResolutionSpecs == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - for (i = 0; i < RESOLUTION_NB; i++) { - if (resolutionID == - gtmdlHdmiTxDriverConfigTable[instance].pResolutionInfo[i].resolutionID) { - find = True; - pResolutionSpecs->height = - gtmdlHdmiTxDriverConfigTable[instance].pResolutionInfo[i].height; - pResolutionSpecs->width = - gtmdlHdmiTxDriverConfigTable[instance].pResolutionInfo[i].width; - pResolutionSpecs->interlaced = - gtmdlHdmiTxDriverConfigTable[instance].pResolutionInfo[i].interlaced; - pResolutionSpecs->vfrequency = - gtmdlHdmiTxDriverConfigTable[instance].pResolutionInfo[i].vfrequency; - pResolutionSpecs->aspectRatio = - gtmdlHdmiTxDriverConfigTable[instance].pResolutionInfo[i].aspectRatio; - - /* Transformation of 2D-interlaced formats into 3DFP-progressif formats */ - if ((instanceStatusInfoTx[instance].pVideoInfo->videoInConfig.structure3D == - TMDL_HDMITX_3D_FRAME_PACKING) - && pResolutionSpecs->interlaced - && ((resolutionID == TMDL_HDMITX_VFMT_20_1920x1080i_50Hz) - || (resolutionID == TMDL_HDMITX_VFMT_05_1920x1080i_60Hz))) { - pResolutionSpecs->interlaced = False; - if (pResolutionSpecs->vfrequency == TMDL_HDMITX_VFREQ_50Hz) { - pResolutionSpecs->vfrequency = TMDL_HDMITX_VFREQ_25Hz; - } else if ((pResolutionSpecs->vfrequency == TMDL_HDMITX_VFREQ_60Hz) - || (pResolutionSpecs->vfrequency == - TMDL_HDMITX_VFREQ_59Hz)) { - pResolutionSpecs->vfrequency = TMDL_HDMITX_VFREQ_30Hz; - } - } - - break; - } - } - - /* Resolution not found in table */ - RETIF(find == False, TMDL_ERR_DLHDMITX_RESOLUTION_UNKNOWN) - - return TM_OK; -} - -/****************************************************************************** - \brief Configures all input and output parameters : format, modes, rates, - etc. This is the main configuration function of the driver. Here - are transmitted all crucial input and output parameters of the - device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param videoInputConfig Configuration of the input video. - \param videoOutputConfig Configuration of the output video. - \param audioInputConfig Configuration of the input audio. - \param sinkType Type of sink connected to the output of the Tx. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetInputOutput - (tmInstance_t instance, - tmdlHdmiTxVideoInConfig_t videoInputConfig, - tmdlHdmiTxVideoOutConfig_t videoOutputConfig, - tmdlHdmiTxAudioInConfig_t audioInputConfig, tmdlHdmiTxSinkType_t sinkType) { - tmErrorCode_t errCode; - UInt8 pixRepeat; /* Pixel repetition */ - tmbslHdmiTxVoutDbits_t pathBits; /* Data path bit width */ - tmbslHdmiTxPixEdge_t pixelEdge; /* Pixel sampling edge */ - tmbslHdmiTxVsMeth_t syncMethod; /* Sync method */ - tmbslHdmiTxPixTogl_t toggle; /* Toggling */ - UInt8 syncIn; /* Embedded or external */ - tmbslHdmiTxPixSubpkt_t spSync; /* Subpacket sync */ - tmbslHdmiTxBlnkSrc_t blankit; /* Blanking */ - tmbslHdmiTxPixRate_t pixRateSingleDouble; /* HDMITX_PIXRATE_SINGLE */ - UInt16 uRefPix; /* REFPIX for output */ - UInt16 uRefLine; /* REFLINE for output */ - UInt16 uScRefPix = 0; /* REFPIX for scaler */ - UInt16 uScRefLine = 0; /* REFLINE for scaler */ - Bool bVerified; /* Scaler setting verified */ - tmbslHdmiTxTopSel_t topSel; /* Adjustment for interlaced output */ - tmbslHdmiTxHPhases_t phasesH; /* Horizontal phase */ - tmbslHdmiTxVsOnce_t once; /* Line/pixel counters sync */ - tmbslHdmiTxScaMode_t scalerMode; /* Current scaler mode */ - Bool OBASupported; /* OBA supported or not */ - Bool DSTSupported; /* DST supported or not */ - Bool HBRSupported; /* HBR supporeted or not */ - - UInt8 *pSwapTable = Null; /* Initialized after (depend on video mode used) */ - UInt8 *pMirrorTable = Null; /* Initialized after (depend on video mode used) */ -#ifdef TMFL_RGB_DDR_12BITS - UInt8 *pMux = Null; /* Initialized after (depend on video mode used) */ -#endif - UInt8 *pEnaVideoPortTable = Null; /* Initialized after (depend on video mode used) */ - UInt8 *pGndVideoPortTable = Null; /* Initialized after (depend on video mode used) */ - tmdlHdmiTxVidFmt_t vinFmtIndex; /* index in table kVfmtToShortFmt_TV */ - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Update the instance status information */ - instanceStatusInfoTx[instance].pVideoInfo->videoInConfig.format = - videoInputConfig.format; - instanceStatusInfoTx[instance].pVideoInfo->videoInConfig.mode = videoInputConfig.mode; - instanceStatusInfoTx[instance].pVideoInfo->videoInConfig.syncSource = - videoInputConfig.syncSource; - instanceStatusInfoTx[instance].pVideoInfo->videoInConfig.pixelRate = - videoInputConfig.pixelRate; - instanceStatusInfoTx[instance].pVideoInfo->videoInConfig.structure3D = - videoInputConfig.structure3D; - - instanceStatusInfoTx[instance].pVideoInfo->videoOutConfig.format = videoOutputConfig.format; - instanceStatusInfoTx[instance].pVideoInfo->videoOutConfig.mode = videoOutputConfig.mode; - instanceStatusInfoTx[instance].pVideoInfo->videoOutConfig.colorDepth = - videoOutputConfig.colorDepth; - - /* TODO */ - /*instanceStatusInfoTx[instance].pVideoInfo->videoMuteState = */ - - /* Audio OBA support */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHwGetCapabilities(instance, - HDMITX_FEATURE_HW_AUDIO_OBA, - &OBASupported)) != TM_OK, errCode) - - /* Audio DST support */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHwGetCapabilities(instance, - HDMITX_FEATURE_HW_AUDIO_DST, - &DSTSupported)) != TM_OK, errCode) - - /* Audio HBR support */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHwGetCapabilities(instance, - HDMITX_FEATURE_HW_AUDIO_HBR, - &HBRSupported)) != TM_OK, errCode) - - /* Test if audio input format is supported */ - if (((audioInputConfig.format == TMDL_HDMITX_AFMT_OBA) && (OBASupported == False)) || - ((audioInputConfig.format == TMDL_HDMITX_AFMT_DST) && (DSTSupported == False)) || - ((audioInputConfig.format == TMDL_HDMITX_AFMT_HBR) && (HBRSupported == False))) { - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; - } - - instanceStatusInfoTx[instance].pAudioInfo->audioInCfg.format = audioInputConfig.format; - instanceStatusInfoTx[instance].pAudioInfo->audioInCfg.i2sFormat = - audioInputConfig.i2sFormat; - instanceStatusInfoTx[instance].pAudioInfo->audioInCfg.i2sQualifier = - audioInputConfig.i2sQualifier; - instanceStatusInfoTx[instance].pAudioInfo->audioInCfg.rate = audioInputConfig.rate; - instanceStatusInfoTx[instance].pAudioInfo->audioInCfg.channelAllocation = - audioInputConfig.channelAllocation; - - - if (sinkType == TMDL_HDMITX_SINK_EDID) { - /* Change sink type with the currently defined in EDID */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetSinkType(instance, - (tmbslHdmiTxSinkType_t *) & - sinkType)) != TM_OK, errCode) - } - - /* forbid format with pixel repetition in DVI */ - if (sinkType == TMDL_HDMITX_SINK_DVI) { - if (((videoOutputConfig.format >= TMDL_HDMITX_VFMT_06_720x480i_60Hz) - && (videoOutputConfig.format <= TMDL_HDMITX_VFMT_15_1440x480p_60Hz)) - || ((videoOutputConfig.format >= TMDL_HDMITX_VFMT_21_720x576i_50Hz) - && (videoOutputConfig.format <= TMDL_HDMITX_VFMT_30_1440x576p_50Hz)) - || ((videoOutputConfig.format >= TMDL_HDMITX_VFMT_35_2880x480p_60Hz) - && (videoOutputConfig.format <= TMDL_HDMITX_VFMT_38_2880x576p_50Hz)) - ) { - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, - errCode) - - return TMDL_ERR_DLHDMITX_BAD_PARAMETER; - } - } - - /* Set color depth according to output config, transmitter termination is disable */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxSetColorDepth(instance, - (tmbslHdmiTxColorDepth) (videoOutputConfig. - colorDepth), - False)) != TM_OK, errCode) - - /* Set the TMDS outputs to a forced state */ - errCode = tmbslHdmiTxTmdsSetOutputs(instance, HDMITX_TMDSOUT_FORCED0); - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode) - - /* Fine-tune the TMDS serializer */ - errCode = tmbslHdmiTxTmdsSetSerializer(instance, 4, 8); - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode) - - /* Set video output configuration */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxVideoOutSetConfig(instance, - (tmbslHdmiTxSinkType_t) sinkType, - (tmbslHdmiTxVoutMode_t) - videoOutputConfig.mode, - HDMITX_VOUT_PREFIL_OFF, - HDMITX_VOUT_YUV_BLNK_16, - HDMITX_VOUT_QRANGE_FS)) != TM_OK, - errCode) - - /* Set default config */ - pixRepeat = HDMITX_PIXREP_DEFAULT; - pathBits = HDMITX_VOUT_DBITS_12; - pixelEdge = HDMITX_PIXEDGE_CLK_POS; - syncMethod = HDMITX_VSMETH_V_H; - toggle = HDMITX_PIXTOGL_ENABLE; - - /* Set sync details */ - if (videoInputConfig.syncSource == TMDL_HDMITX_SYNCSRC_EMBEDDED) { - /* Embedded sync */ - syncIn = EMB; - spSync = HDMITX_PIXSUBPKT_SYNC_HEMB; - blankit = HDMITX_BLNKSRC_VS_HEMB_VEMB; - syncMethod = HDMITX_VSMETH_V_XDE; - } else { - /* External sync */ - syncIn = EXT; - - - if (gtmdlHdmiTxDriverConfigTable[instance].dataEnableSignalAvailable == 1) { - /* DE is available */ - spSync = HDMITX_PIXSUBPKT_SYNC_DE; - } else { - /* DE is NOT available */ - spSync = HDMITX_PIXSUBPKT_SYNC_HS; - } - - - - blankit = HDMITX_BLNKSRC_NOT_DE; - } - - -#ifdef TMFL_RGB_DDR_12BITS - /* by default, mux is not used */ - pMux = >mdlHdmiTxDriverConfigTable[instance].pNoMux[0]; -#endif - - /* Port swap table */ - switch (videoInputConfig.mode) { - case TMDL_HDMITX_VINMODE_CCIR656: - pathBits = HDMITX_VOUT_DBITS_8; - pixelEdge = HDMITX_PIXEDGE_CLK_NEG; - pSwapTable = gtmdlHdmiTxDriverConfigTable[instance].pSwapTableCCIR656; - pMirrorTable = gtmdlHdmiTxDriverConfigTable[instance].pMirrorTableCCIR656; -#ifdef TMFL_RGB_DDR_12BITS - pMux = >mdlHdmiTxDriverConfigTable[instance].pMux_RGB_DDR_12bits[0]; -#endif - pEnaVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pEnableVideoPortCCIR656; - pGndVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pGroundVideoPortCCIR656; - break; - - case TMDL_HDMITX_VINMODE_RGB444: - pSwapTable = gtmdlHdmiTxDriverConfigTable[instance].pSwapTableRGB444; - pMirrorTable = gtmdlHdmiTxDriverConfigTable[instance].pMirrorTableRGB444; - pEnaVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pEnableVideoPortRGB444; - pGndVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pGroundVideoPortRGB444; - break; - - case TMDL_HDMITX_VINMODE_YUV444: - pSwapTable = gtmdlHdmiTxDriverConfigTable[instance].pSwapTableYUV444; - pMirrorTable = gtmdlHdmiTxDriverConfigTable[instance].pMirrorTableYUV444; - pEnaVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pEnableVideoPortYUV444; - pGndVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pGroundVideoPortYUV444; - break; - - case TMDL_HDMITX_VINMODE_YUV422: - pSwapTable = gtmdlHdmiTxDriverConfigTable[instance].pSwapTableYUV422; - pMirrorTable = gtmdlHdmiTxDriverConfigTable[instance].pMirrorTableYUV422; -#ifdef TMFL_RGB_DDR_12BITS - pMux = >mdlHdmiTxDriverConfigTable[instance].pMux_RGB_DDR_12bits[0]; -#endif - pEnaVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pEnableVideoPortYUV422; - pGndVideoPortTable = gtmdlHdmiTxDriverConfigTable[instance].pGroundVideoPortYUV422; - break; - -#ifdef TMFL_RGB_DDR_12BITS - case TMDL_HDMITX_VINMODE_RGB_DDR_12BITS: - pSwapTable = gtmdlHdmiTxDriverConfigTable[instance].pSwapTableRGB_DDR_12bits; - pMirrorTable = gtmdlHdmiTxDriverConfigTable[instance].pMirrorTableRGB_DDR_12bits; - pMux = >mdlHdmiTxDriverConfigTable[instance].pMux_RGB_DDR_12bits[0]; - pEnaVideoPortTable = - gtmdlHdmiTxDriverConfigTable[instance].pEnableVideoPortRGB_DDR_12bits; - pGndVideoPortTable = - gtmdlHdmiTxDriverConfigTable[instance].pGroundVideoPortRGB_DDR_12bits; - break; -#endif - default: - break; - } - - /* Set the audio and video input port configuration */ - errCode = tmbslHdmiTxSetVideoPortConfig(instance, pEnaVideoPortTable, pGndVideoPortTable); - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode); - -#ifdef TMFL_RGB_DDR_12BITS - errCode = tmbslHdmiTxVideoInSetMapping(instance, pSwapTable, pMirrorTable, pMux); -#else - errCode = tmbslHdmiTxVideoInSetMapping(instance, pSwapTable, pMirrorTable); -#endif - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode); - - /* Set fine image position */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - tmbslHdmiTxVideoInSetFine(instance, spSync, HDMITX_PIXTOGL_NO_ACTION)) != TM_OK, - errCode); - - /* Set input blanking */ - errCode = tmbslHdmiTxVideoInSetBlanking(instance, blankit, HDMITX_BLNKCODE_ALL_0); - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode); - - /* Configure video input options and control the upsampler */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxVideoInSetConfig(instance, - (tmbslHdmiTxVinMode_t) videoInputConfig. - mode, - (tmbslHdmiTxVidFmt_t) videoOutputConfig. - format, - (tmbslHdmiTx3DStructure_t) - videoInputConfig.structure3D, pixelEdge, - (tmbslHdmiTxPixRate_t) videoInputConfig. - pixelRate, HDMITX_UPSAMPLE_AUTO)) != TM_OK, - errCode); - - - /* Set input ouput - may give NOT_SUPPORTED error */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - tmbslHdmiTxVideoSetInOut(instance, (tmbslHdmiTxVidFmt_t) videoInputConfig.format, - (tmbslHdmiTx3DStructure_t) videoInputConfig.structure3D, - HDMITX_SCAMODE_AUTO, - (tmbslHdmiTxVidFmt_t) videoOutputConfig.format, - pixRepeat, HDMITX_MATMODE_AUTO, pathBits, - (tmbslHdmiTxVQR_t) videoOutputConfig.dviVqr)) != TM_OK, - errCode); - - - /* Only set audio for HDMI, not DVI */ - if (sinkType == TMDL_HDMITX_SINK_HDMI) { - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - /* Set audio parameters */ - RETIF((errCode = - tmdlHdmiTxSetAudioInput(instance, audioInputConfig, sinkType)) != TM_OK, - errCode) - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - } - - /* Output fine adjustment */ - pixRateSingleDouble = (tmbslHdmiTxPixRate_t) videoInputConfig.pixelRate; - if (videoInputConfig.pixelRate == HDMITX_PIXRATE_SINGLE_REPEATED) { - pixRateSingleDouble = HDMITX_PIXRATE_SINGLE; - } - - - if ((videoInputConfig.structure3D != HDMITX_3D_FRAME_PACKING) && - dlHdmiTxGetReflineRefpix(videoInputConfig.format, videoInputConfig.mode, - videoOutputConfig.format, syncIn, - (tmdlHdmiTxPixRate_t) pixRateSingleDouble, &uRefPix, &uRefLine, - &uScRefPix, &uScRefLine, &bVerified) > 0) { - /* From 720p50/60 or 1080i50/60 up-scaling to 1080p50/60, when external sync, - toggleV, toggleH and toggleX need to be set to 0 */ - if (syncIn == EXT) { - switch (videoInputConfig.format) { - case TMDL_HDMITX_VFMT_04_1280x720p_60Hz: - case TMDL_HDMITX_VFMT_19_1280x720p_50Hz: - case TMDL_HDMITX_VFMT_05_1920x1080i_60Hz: - case TMDL_HDMITX_VFMT_20_1920x1080i_50Hz: - if ((videoOutputConfig.format == - TMDL_HDMITX_VFMT_16_1920x1080p_60Hz) - || (videoOutputConfig.format == - TMDL_HDMITX_VFMT_31_1920x1080p_50Hz)) { - toggle = HDMITX_PIXTOGL_NO_ACTION; - } - break; - default: - toggle = HDMITX_PIXTOGL_ENABLE; - break; - } - } - - /* Combination found in table for scaler: configure input manually */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxVideoInSetSyncManual(instance, - (tmbslHdmiTxSyncSource_t) - videoInputConfig.syncSource, - syncMethod, toggle, toggle, - toggle, uRefPix, - uRefLine)) != TM_OK, errCode) - } else { - /* Not found so assume non-scaler and auto-configure input */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxVideoInSetSyncAuto(instance, - (tmbslHdmiTxSyncSource_t) - videoInputConfig.syncSource, - (tmbslHdmiTxVidFmt_t) - videoInputConfig.format, - (tmbslHdmiTxVinMode_t) - videoInputConfig.mode, - (tmbslHdmiTx3DStructure_t) - videoInputConfig.structure3D)) != - TM_OK, errCode) - } - - /* Only set infoframes for HDMI, not DVI */ - if (sinkType == TMDL_HDMITX_SINK_HDMI) { - /* Set avi infoframe */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - dlHdmiTxSetVideoInfoframe(instance, videoOutputConfig.format, - videoOutputConfig.mode)) != TM_OK, errCode) - } - - errCode = tmbslHdmiTxScalerGetMode(instance, &scalerMode); - - /* Ignore scaler TMBSL_ERR_HDMI_NOT_SUPPORTED error */ - if ((errCode == TM_OK) && (scalerMode == HDMITX_SCAMODE_ON)) { - /* Enable scaler mode */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxScalerInDisable(instance, False)) != TM_OK, errCode) - - /* Correction to interlace */ - topSel = HDMITX_TOPSEL_INTERNAL; - if ((videoOutputConfig.format == TMDL_HDMITX_VFMT_05_1920x1080i_60Hz) - || (videoOutputConfig.format == TMDL_HDMITX_VFMT_20_1920x1080i_50Hz)) { - /* video input format is range-checked by tmbslHdmiTxVideoSetInOut above */ - vinFmtIndex = dlHdmiTxCalcVidFmtIndex(videoInputConfig.format); - if ((kVfmtToShortFmt_TV[vinFmtIndex] == TV_480p_60Hz) - || (kVfmtToShortFmt_TV[vinFmtIndex] == TV_576p_50Hz)) { - /* Correct for 1080i output for p->i conversion only */ - topSel = HDMITX_TOPSEL_VRF; - } - } - - /* Set scaler field positions */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxScalerSetFieldOrder(instance, - HDMITX_INTEXT_NO_CHANGE, - HDMITX_INTEXT_NO_CHANGE, topSel, - HDMITX_TOPTGL_NO_CHANGE)) != - TM_OK, errCode) - - /* Scaler fine adjustment */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxScalerSetFine(instance, - uScRefPix, uScRefLine)) != TM_OK, - errCode) - - if ((videoOutputConfig.format == TMDL_HDMITX_VFMT_16_1920x1080p_60Hz) - || (videoOutputConfig.format == TMDL_HDMITX_VFMT_31_1920x1080p_50Hz)) { - phasesH = HDMITX_H_PHASES_16; - } else { - phasesH = HDMITX_H_PHASES_15; - } - - /* Set scaler phase */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxScalerSetPhase(instance, - phasesH)) != TM_OK, errCode) - - /* Set scaler latency */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxScalerSetLatency(instance, - 0x22)) != TM_OK, errCode) - - /* Set scaler synchronisation option */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxScalerSetSync(instance, - syncMethod, - HDMITX_VSONCE_EACH_FRAME)) != - TM_OK, errCode) - - /* With scaler, use Only Once setting for tmbslHdmiTxVideoOutSetSync */ - once = HDMITX_VSONCE_ONCE; - } else { - once = HDMITX_VSONCE_EACH_FRAME; - } - - /* Set video synchronisation */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxVideoOutSetSync(instance, - HDMITX_VSSRC_INTERNAL, - HDMITX_VSSRC_INTERNAL, - HDMITX_VSSRC_INTERNAL, HDMITX_VSTGL_TABLE, - once)) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - instanceStatusInfoTx[instance].pColBarState->inOutFirstSetDone = True; - - /* Test if pattern is already on */ - if (instanceStatusInfoTx[instance].pColBarState->colorBarOn == True) { - /* If pattern is On, apply new settings */ - instanceStatusInfoTx[instance].pColBarState->changeColorBarNow = True; - } - - return TM_OK; -} - -/*****************************************************************************/ -/** - \brief Configures audio input parameters : format, rate, etc. - This function is similar to tmdlHdmiTxSetInputOutput except that - video is not reconfigured. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param audioInputConfig Configuration of the input audio. - \param sinkType Type of sink connected to the output of the Tx. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetAudioInput - (tmInstance_t instance, - tmdlHdmiTxAudioInConfig_t audioInputConfig, tmdlHdmiTxSinkType_t sinkType) { - tmErrorCode_t errCode; - tmdlHdmiTxVidFmtSpecs_t resolutionSpecs; /* Used to convert video format to video frequency */ - UInt8 layout; /* 0 or 1 */ - UInt8 aifChannelCountCode = 0; /* audio info frame channels */ - tmbslHdmiTxVfreq_t vOutFreq; /* Vertical output frequency */ - tmbslHdmiTxctsRef_t ctsRef; /* CTS ref source */ - UInt16 uCtsX; /* CtsX value */ - tmbslHdmiTxPktAif_t pktAif; /* Audio infoframe packet */ - Bool OBASupported; /* OBA supported or not */ - Bool DSTSupported; /* DST supported or not */ - Bool HBRSupported; /* HBR supporeted or not */ - UInt8 *pEnaAudioPortCfg; - UInt8 *pGndAudioPortCfg; - UInt8 *pEnaAudioClockPortCfg; - UInt8 *pGndAudioClockPortCfg; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the semaphore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Audio OBA support */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHwGetCapabilities(instance, - HDMITX_FEATURE_HW_AUDIO_OBA, - &OBASupported)) != TM_OK, errCode) - - /* Audio DST support */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHwGetCapabilities(instance, - HDMITX_FEATURE_HW_AUDIO_DST, - &DSTSupported)) != TM_OK, errCode) - - /* Audio HBR support */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHwGetCapabilities(instance, - HDMITX_FEATURE_HW_AUDIO_HBR, - &HBRSupported)) != TM_OK, errCode) - - /* Test if audio input format is supported */ - if (((audioInputConfig.format == TMDL_HDMITX_AFMT_OBA) && (OBASupported == False)) || - ((audioInputConfig.format == TMDL_HDMITX_AFMT_DST) && (DSTSupported == False)) || - ((audioInputConfig.format == TMDL_HDMITX_AFMT_HBR) && (HBRSupported == False))) { - /* Release the semaphore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; - } - - if (sinkType == TMDL_HDMITX_SINK_EDID) { - /* Change sink type with the currently defined in EDID */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetSinkType(instance, - (tmbslHdmiTxSinkType_t *) & - sinkType)) != TM_OK, errCode) - } - - if (sinkType == TMDL_HDMITX_SINK_HDMI) { - /* Set audio layout */ - layout = 1; - if (audioInputConfig.channelAllocation == 0x00) { - layout = 0; - } - aifChannelCountCode = kChanAllocChanNum[audioInputConfig.channelAllocation] - 1; - - /* Port audio configuration */ - switch (audioInputConfig.format) { - case TMDL_HDMITX_AFMT_SPDIF: - pEnaAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioPortSPDIF; - pGndAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioPortSPDIF; - pEnaAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioClockPortSPDIF; - pGndAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioClockPortSPDIF; - break; - - case TMDL_HDMITX_AFMT_I2S: - pEnaAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioClockPortI2S; - pGndAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioClockPortI2S; - - if (audioInputConfig.channelAllocation >= 1) { /* For Multi channels */ - pEnaAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioPortI2S8C; - pGndAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioPortI2S8C; - } else { - pEnaAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioPortI2S; - pGndAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioPortI2S; - } - break; - - case TMDL_HDMITX_AFMT_OBA: - pEnaAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioPortOBA; - pGndAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioPortOBA; - pEnaAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioClockPortOBA; - pGndAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioClockPortOBA; - break; - - case TMDL_HDMITX_AFMT_DST: - pEnaAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioPortDST; - pGndAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioPortDST; - pEnaAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioClockPortDST; - pGndAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioClockPortDST; - break; - - case TMDL_HDMITX_AFMT_HBR: - pEnaAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioPortHBR; - pGndAudioPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioPortHBR; - pEnaAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pEnableAudioClockPortHBR; - pGndAudioClockPortCfg = - gtmdlHdmiTxDriverConfigTable[instance].pGroundAudioClockPortHBR; - break; - - default: - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, - errCode) - - return TMDL_ERR_DLHDMITX_BAD_PARAMETER; - } - - errCode = tmbslHdmiTxSetAudioPortConfig(instance, - pEnaAudioPortCfg, pGndAudioPortCfg); - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode) - - errCode = tmbslHdmiTxSetAudioClockPortConfig(instance, - pEnaAudioClockPortCfg, - pGndAudioClockPortCfg); - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode != TM_OK) - && (errCode != TMBSL_ERR_HDMI_NOT_SUPPORTED), errCode) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxAudioInSetConfig(instance, - (tmbslHdmiTxaFmt_t) - audioInputConfig.format, - (tmbslHdmiTxI2sFor_t) - audioInputConfig.i2sFormat, - audioInputConfig. - channelAllocation, - HDMITX_CHAN_NO_CHANGE, - HDMITX_CLKPOLDSD_NO_CHANGE, - HDMITX_SWAPDSD_NO_CHANGE, - layout, HDMITX_LATENCY_CURRENT, - (tmbslHdmiTxDstRate_t) - audioInputConfig.dstRate)) != - TM_OK, errCode) - - /* Find output vertical frequency from output format */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - tmdlHdmiTxGetVideoFormatSpecs(instance, - instanceStatusInfoTx[instance]. - pVideoInfo->videoOutConfig.format, - &resolutionSpecs)) != TM_OK, errCode) - vOutFreq = (tmbslHdmiTxVfreq_t) resolutionSpecs.vfrequency; - - if ((audioInputConfig.format == TMDL_HDMITX_AFMT_SPDIF) - || (audioInputConfig.format == TMDL_HDMITX_AFMT_OBA)) { - ctsRef = HDMITX_CTSREF_FS64SPDIF; - uCtsX = HDMITX_CTSX_64; - } else { /* I2S */ - - ctsRef = HDMITX_CTSREF_ACLK; - if (audioInputConfig.i2sQualifier == TMDL_HDMITX_I2SQ_32BITS) { - uCtsX = HDMITX_CTSX_64; - } else { - uCtsX = HDMITX_CTSX_32; - } - } - - /* Set the Clock Time Stamp generator in HDMI mode only */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxAudioInSetCts(instance, - ctsRef, - (tmbslHdmiTxafs_t) audioInputConfig. - rate, - (tmbslHdmiTxVidFmt_t) - instanceStatusInfoTx[instance]. - pVideoInfo->videoOutConfig.format, - vOutFreq, HDMITX_CTS_AUTO, uCtsX, - HDMITX_CTSK_USE_CTSX, - HDMITX_CTSMTS_USE_CTSX, - (tmbslHdmiTxDstRate_t) - audioInputConfig.dstRate)) != TM_OK, - errCode) - - /* Set Channel Status registers - No need to call tmbslTDA9984AudioOutSetChanStatusMapping, since default Byte 2 - values of "Do not take into account" are adequate */ - if (audioInputConfig.format != TMDL_HDMITX_AFMT_SPDIF) { /* channel status automatically copied from SPDIF */ - - if (audioInputConfig.format != TMDL_HDMITX_AFMT_HBR) { - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxAudioOutSetChanStatus(instance, - (tmbslHdmiTxAudioData_t) - audioInputConfig. - channelStatus. - PcmIdentification, - (tmbslHdmiTxCSformatInfo_t) - audioInputConfig. - channelStatus. - FormatInfo, - (tmbslHdmiTxCScopyright_t) - audioInputConfig. - channelStatus. - CopyrightInfo, - audioInputConfig. - channelStatus. - categoryCode, - (tmbslHdmiTxafs_t) - audioInputConfig. - rate, - (tmbslHdmiTxCSclkAcc_t) - audioInputConfig. - channelStatus. - clockAccuracy, - (tmbslHdmiTxCSmaxWordLength_t) - audioInputConfig. - channelStatus. - maxWordLength, - (tmbslHdmiTxCSwordLength_t) - audioInputConfig. - channelStatus. - wordLength, - (tmbslHdmiTxCSorigAfs_t) - audioInputConfig. - channelStatus. - origSampleFreq)) - != TM_OK, errCode) - } else { - - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxAudioOutSetChanStatus(instance, - (tmbslHdmiTxAudioData_t) - audioInputConfig. - channelStatus. - PcmIdentification, - (tmbslHdmiTxCSformatInfo_t) - audioInputConfig. - channelStatus. - FormatInfo, - (tmbslHdmiTxCScopyright_t) - audioInputConfig. - channelStatus. - CopyrightInfo, - audioInputConfig. - channelStatus. - categoryCode, - HDMITX_AFS_768K, - (tmbslHdmiTxCSclkAcc_t) - audioInputConfig. - channelStatus. - clockAccuracy, - (tmbslHdmiTxCSmaxWordLength_t) - audioInputConfig. - channelStatus. - maxWordLength, - (tmbslHdmiTxCSwordLength_t) - audioInputConfig. - channelStatus. - wordLength, - (tmbslHdmiTxCSorigAfs_t) - audioInputConfig. - channelStatus. - origSampleFreq)) - != TM_OK, errCode) - - - } - - } - - - /* Set reset_fifo to 1 */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxAudioOutSetMute(instance, - HDMITX_AMUTE_ON)) != TM_OK, errCode) - - /* UN Mute audio only if previously not muted */ - if (instanceStatusInfoTx[instance].pAudioInfo->audioMuteState == False) { - - /* Wait for 20 ms */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmdlHdmiTxIWWait(20)) != TM_OK, errCode) - /* Set reset_fifo to 0 */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxAudioOutSetMute(instance, - HDMITX_AMUTE_OFF)) != - TM_OK, errCode) - - } - - - /* Set audio infoframe */ - pktAif.ChannelCount = aifChannelCountCode; - pktAif.CodingType = 0; /* refer to stream header */ - pktAif.SampleSize = 0; /* refer to stream header */ - pktAif.ChannelAlloc = audioInputConfig.channelAllocation; - pktAif.LevelShift = 0; /* 0dB level shift */ - pktAif.DownMixInhibit = 0; /* down-mix stereo permitted */ - pktAif.SampleFreq = AIF_SF_REFER_TO_STREAM_HEADER; /* refer to stream header */ - - /* SampleFreq parameter need to be set for OBA and DST audio stream */ - if ((audioInputConfig.format == TMDL_HDMITX_AFMT_OBA) || - (audioInputConfig.format == TMDL_HDMITX_AFMT_DST)) { - switch (audioInputConfig.rate) { - case TMDL_HDMITX_AFS_32K: - pktAif.SampleFreq = AIF_SF_32K; /* see table 18 of CEA-861 */ - break; - case TMDL_HDMITX_AFS_44K: - pktAif.SampleFreq = AIF_SF_44K; - break; - case TMDL_HDMITX_AFS_48K: - pktAif.SampleFreq = AIF_SF_48K; - break; - case TMDL_HDMITX_AFS_88K: - pktAif.SampleFreq = AIF_SF_88K; - break; - case TMDL_HDMITX_AFS_96K: - pktAif.SampleFreq = AIF_SF_96K; - break; - case TMDL_HDMITX_AFS_176K: - pktAif.SampleFreq = AIF_SF_176K; - break; - case TMDL_HDMITX_AFS_192K: - pktAif.SampleFreq = AIF_SF_192K; - break; - default: - pktAif.SampleFreq = AIF_SF_REFER_TO_STREAM_HEADER; /* refer to stream header */ - break; - } - } - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetAudioInfoframe(instance, - &pktAif, True)) != TM_OK, - errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of AVI infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pAviIfData Pointer to the structure containing AVI infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetVideoInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxAviIfData_t *pAviIfData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if AviIfData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pAviIfData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - errCode = dlHdmiTxSetRawVideoInfoframe(instance, pAviIfData, enable); - } else { - errCode = dlHdmiTxSetRawVideoInfoframe(instance, Null, enable); - } - - /* Ignore infoframe interlock in DVI mode */ - if (errCode == TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) { - errCode = TM_OK; - } - - RETIF_SEM(dlHdmiTxItSemaphore[instance], errCode != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of AUD infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pAudIfData Pointer to the structure containing AUD infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetAudioInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxAudIfData_t *pAudIfData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if AudIfData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pAudIfData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetAudioInfoframe(instance, - (tmbslHdmiTxPktAif_t *) - pAudIfData, - enable)) != TM_OK, errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetAudioInfoframe(instance, - Null, enable)) != TM_OK, - errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of the audio content protection packet to be - sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pAcpPktData Pointer to the structure containing ACP infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetACPPacket - (tmInstance_t instance, Bool enable, tmdlHdmiTxAcpPktData_t *pAcpPktData) { - tmErrorCode_t errCode; - tmbslHdmiTxPkt_t pkt; - UInt8 i; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if AcpPktData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pAcpPktData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - switch (pAcpPktData->acpType) { - /* Make sure bytes reserved are 0 */ - case 0: /* Generic audio */ - for (i = 0; i < 28; i++) { - pkt.dataByte[i] = 0; - } - break; - - case 1: /* IEC 60958 identified audio */ - for (i = 0; i < 28; i++) { - pkt.dataByte[i] = 0; - } - break; - - case 2: /* DVD Audio */ - for (i = 0; i < 2; i++) { - pkt.dataByte[i] = pAcpPktData->acpData[i]; - } - for (i = 2; i < 28; i++) { - pkt.dataByte[i] = 0; - } - break; - - case 3: /* SuperAudio CD */ - for (i = 0; i < 17; i++) { - pkt.dataByte[i] = pAcpPktData->acpData[i]; - } - for (i = 17; i < 28; i++) { - pkt.dataByte[i] = 0; - } - break; - - default: - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, - errCode) - return TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS; - } - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetAcp(instance, - &pkt, 28, pAcpPktData->acpType, - enable)) != TM_OK, errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetAcp(instance, - Null, 0, 0, enable)) != TM_OK, errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of the General Control packet to be sent by Tx - device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pGcpPktData Pointer to the structure containing GCP packet parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetGeneralControlPacket - (tmInstance_t instance, Bool enable, tmdlHdmiTxGcpPktData_t *pGcpPktData) { - tmErrorCode_t errCode; - tmbslHdmiTxaMute_t aMute; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if GcpPktData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pGcpPktData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - if (pGcpPktData->avMute == False) { - aMute = HDMITX_AMUTE_OFF; - } else { - aMute = HDMITX_AMUTE_ON; - } - - /* Set contents of general control packet & enable/disable packet insertion */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetGeneralCntrl(instance, - &aMute, enable)) != TM_OK, - errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetGeneralCntrl(instance, - Null, enable)) != TM_OK, errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of ISRC1 packet to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pIsrc1PktData Pointer to the structure containing GCP packet parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetISRC1Packet - (tmInstance_t instance, Bool enable, tmdlHdmiTxIsrc1PktData_t *pIsrc1PktData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if Isrc1PktData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pIsrc1PktData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetIsrc1(instance, - (tmbslHdmiTxPkt_t *) pIsrc1PktData-> - UPC_EAN_ISRC, 16, - pIsrc1PktData->isrcCont, - pIsrc1PktData->isrcValid, - pIsrc1PktData->isrcStatus, - enable)) != TM_OK, errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetIsrc1(instance, - Null, 0, 0, 0, 0, enable)) != TM_OK, - errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of ISRC2 packet to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pIsrc2PktData Pointer to the structure containing GCP packet parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetISRC2Packet - (tmInstance_t instance, Bool enable, tmdlHdmiTxIsrc2PktData_t *pIsrc2PktData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if Isrc1PktData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pIsrc2PktData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetIsrc2(instance, - (tmbslHdmiTxPkt_t *) pIsrc2PktData-> - UPC_EAN_ISRC, 16, enable)) != TM_OK, - errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetIsrc2(instance, - Null, 0, enable)) != TM_OK, errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of MPS infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pMpsIfData Pointer to the structure containing MPS infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetMPSInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxMpsIfData_t *pMpsIfData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if MpsIfData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pMpsIfData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetMpegInfoframe(instance, - (tmbslHdmiTxPktMpeg_t *) - pMpsIfData, - enable)) != TM_OK, errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetMpegInfoframe(instance, - Null, enable)) != TM_OK, - errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of SPD infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pSpdIfData Pointer to the structure containing SPD infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetSpdInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxSpdIfData_t *pSpdIfData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if SpdIfData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pSpdIfData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetSpdInfoframe(instance, - (tmbslHdmiTxPktSpd_t *) - pSpdIfData, - enable)) != TM_OK, errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetSpdInfoframe(instance, - Null, enable)) != TM_OK, errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Defines the content of VS infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pVsIfData Pointer to the structure containing VS infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetVsInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxVsPktData_t *pVsIfData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - if (enable == True) { - /* Check if VsIfData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pVsIfData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetVsInfoframe(instance, - (tmbslHdmiTxPkt_t *) - pVsIfData->vsData, - HDMITX_PKT_DATA_BYTE_CNT - 1, - pVsIfData->version, - enable)) != TM_OK, errCode) - } else { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetVsInfoframe(instance, - Null, 0, pVsIfData->version, - enable)) != TM_OK, errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Enables/disables NULL packet sending (only used for debug purpose). - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable packet insertion. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxDebugSetNullPacket(tmInstance_t instance, Bool enable) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetNullInsert(instance, enable)) != TM_OK, errCode) - - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Send one single NULL packet (only used for debug purpose). - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxDebugSetSingleNullPacket(tmInstance_t instance) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSetNullSingle(instance)) - != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Set the audio output mute status. This function can be used to mute - audio output, without muting video. This can be typically used when - reconfiguring the audio HW after a sample rate change. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param muteStatus Mute status (True/False). - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetAudioMute(tmInstance_t instance, Bool audioMute) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Mute or Un-mute the audio output */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxAudioOutSetMute(instance, - (tmbslHdmiTxaMute_t) audioMute)) != - TM_OK, errCode) - - /* Store current audio mute status */ - instanceStatusInfoTx[instance].pAudioInfo->audioMuteState = audioMute; - - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Reset audio CTS. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxResetAudioCts(tmInstance_t instance) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Reset the audio Clock Time Stamp generator */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode = tmbslHdmiTxAudioInResetCts(instance) - ) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Retrieve EDID Status from driver. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param pEdidStatus Pointer to the array that will receive the EDID Status. - \param pEdidBlkCount Pointer to the integer that will receive the number of - read EDID block. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidStatus - (tmInstance_t instance, tmdlHdmiTxEdidStatus_t *pEdidStatus, UInt8 *pEdidBlkCount) { - tmErrorCode_t errCode; - UInt8 edidStatus; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if EdidStatus and pReadBytesNumber pointers are Null */ - RETIF(pEdidStatus == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pEdidBlkCount == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Get the EDID status from BSL driver */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetStatus(instance, - (UInt8 *) &edidStatus)) != TM_OK, - errCode) - - if (edidStatus >= TMDL_HDMITX_EDID_STATUS_INVALID) { - *pEdidStatus = TMDL_HDMITX_EDID_STATUS_INVALID; - } else { - *pEdidStatus = (tmdlHdmiTxEdidStatus_t) edidStatus; - } - - if ((*pEdidStatus == TMDL_HDMITX_EDID_READ) || (*pEdidStatus == TMDL_HDMITX_EDID_ERROR_CHK)) { - /* Get the read EDID block number from BSL driver */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetBlockCount(instance, - pEdidBlkCount)) != TM_OK, errCode) - } - - if (errCode != TM_OK) { - /* Error during read EDID, number of read block is 0 */ - *pEdidBlkCount = 0; - - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - - return errCode; - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Retrieves audio descriptors from receiver's EDID. This function - parses the EDID of Tx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - - \param instance Instance identifier. - \param pAudioDescs Pointer to the array that will receive audio - descriptors. - \param maxAudioDescs Size of the array. - \param pWrittenAudioDescs Pointer to the integer that will receive the actual - number of written descriptors. - \param pAudioFlags Pointer to the byte to receive Audio Capabilities Flags. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidAudioCaps - (tmInstance_t instance, - tmdlHdmiTxEdidAudioDesc_t *pAudioDescs, - UInt maxAudioDescs, UInt *pWrittenAudioDescs, UInt8 *pAudioFlags) { - tmErrorCode_t errCode; - tmbslHdmiTxEdidSad_t edidSad[HDMI_TX_SAD_MAX_CNT]; - UInt i; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if AudioDescs, WrittenAudioDescs and AudioFlags pointers are Null */ - RETIF(pAudioDescs == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pWrittenAudioDescs == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pAudioFlags == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Get video capabilities from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetAudioCapabilities(instance, - edidSad, maxAudioDescs, - pWrittenAudioDescs, - pAudioFlags)) != TM_OK, - errCode) - - for (i = 0; i < *pWrittenAudioDescs; i++) { - pAudioDescs[i].format = (edidSad[i].ModeChans & 0x78) >> 3; /* Bits[6:3]: EIA/CEA861 mode */ - pAudioDescs[i].channels = edidSad[i].ModeChans & 0x07; /* Bits[2:0]: channels */ - pAudioDescs[i].supportedFreqs = edidSad[i].Freqs; /* Supported frequencies */ - - if (pAudioDescs[i].format == 1) { /* LPCM format */ - pAudioDescs[i].supportedRes = edidSad[i].Byte3 & 0x07; - pAudioDescs[i].maxBitrate = 0x00; - } else if ((pAudioDescs[i].format >= 2) && /* Compressed format */ - (pAudioDescs[i].format <= 8)) { - pAudioDescs[i].supportedRes = 0x00; - pAudioDescs[i].maxBitrate = edidSad[i].Byte3; - } else { - pAudioDescs[i].supportedRes = 0x00; - pAudioDescs[i].maxBitrate = 0x00; - } - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Retrieves supported video formats (short descriptors) from - receiver's EDID. This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pVideoDesc Pointer to the structure that will receive short - video descriptors. - \param maxVideoFormats Size of the array. - \param pWrittenVideoFormats Pointer to the integer that will receive the actual - number of written descriptors. - \param pVideoFlags Pointer to the byte to receive Video Capability Flags. - b7: underscan supported - b6: YCbCr 4:4:4 supported - b5: YCbCr 4:2:2 supported - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidVideoCaps - (tmInstance_t instance, - tmdlHdmiTxShortVidDesc_t *pVideoDesc, - UInt maxVideoFormats, UInt *pWrittenVideoFormats, UInt8 *pVideoFlags) { - tmErrorCode_t errCode; - UInt8 edidVFmtsBuffer[HDMI_TX_SVD_MAX_CNT]; - tmdlHdmiTxEdidVideoTimings_t edidDTDBuffer[NUMBER_DTD_STORED]; - UInt8 i; - UInt8 writtenDTD = 0; - UInt8 dtdCounter = 0; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if Videoformats, WrittenVideoFormats and VideoFlags pointers are Null */ - RETIF(pVideoDesc == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pWrittenVideoFormats == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pVideoFlags == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(maxVideoFormats == 0, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Get video capabilities from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetVideoCapabilities(instance, - edidVFmtsBuffer, - HDMI_TX_SVD_MAX_CNT, - pWrittenVideoFormats, - pVideoFlags)) != TM_OK, - errCode) - - /* Get detailled descriptors from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - dlHdmiTxEdidGetDTD(instance, edidDTDBuffer, NUMBER_DTD_STORED, - &writtenDTD)) != TM_OK, errCode) - - dtdCounter = 0; - if (writtenDTD > 0) { - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Write first DTD in first position of table video desc */ - pVideoDesc[0].videoFormat = - tmdlHdmiTxConvertDTDtoCEA(instance, &(edidDTDBuffer[dtdCounter])); - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - dtdCounter++; - - pVideoDesc[0].nativeVideoFormat = False; - } - - /* Start with i = 1 keep the first position for the first DTD */ - for (i = dtdCounter; i < maxVideoFormats; i++) { - if ((i < (HDMI_TX_SVD_MAX_CNT + dtdCounter)) - && (i < ((*pWrittenVideoFormats) + dtdCounter))) { - /* Store SVD */ - pVideoDesc[i].videoFormat = - (tmdlHdmiTxVidFmt_t) ((Int) edidVFmtsBuffer[i - dtdCounter] & 0x7F); - /* if bit 7 is true, it means that is a preferred video format */ - if ((edidVFmtsBuffer[i - dtdCounter] & 0x80) == 0x80) { - pVideoDesc[i].nativeVideoFormat = True; - } else { - pVideoDesc[i].nativeVideoFormat = False; - } - } else { - if ((dtdCounter < NUMBER_DTD_STORED) && (dtdCounter < writtenDTD)) { - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != - TM_OK, errCode) - /* Store DTD except first DTD */ - pVideoDesc[i].videoFormat = - tmdlHdmiTxConvertDTDtoCEA(instance, - &(edidDTDBuffer[dtdCounter])); - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != - TM_OK, errCode) - - dtdCounter++; - - pVideoDesc[i].nativeVideoFormat = False; - } else { - /* VGA is always supported */ - pVideoDesc[i].videoFormat = TMDL_HDMITX_VFMT_01_640x480p_60Hz; - pVideoDesc[i].nativeVideoFormat = False; - /* Last format supported exit from loop for */ - break; - } - } - } - - *pWrittenVideoFormats = *pWrittenVideoFormats + dtdCounter + 1; /* + 1 for VGA format */ - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Retrieves supported video formats (short descriptors) from - receiver's EDID. This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pNativeVideoFormat Pointer to the array that will receive video - timing descriptor. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidVideoPreferred - (tmInstance_t instance, tmdlHdmiTxEdidVideoTimings_t *pNativeVideoFormat) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if NativeVideoFormat pointer is Null */ - RETIF(pNativeVideoFormat == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Get preferred video format from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetVideoPreferred(instance, - (tmbslHdmiTxEdidDtd_t *) - pNativeVideoFormat)) != TM_OK, - errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/*****************************************************************************/ -/** - \brief Retrieves supported detailled video descriptors from - receiver's EDID. This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pDTDescriptors Pointer to the array that will receive detailled - timing descriptors. - \param maxDTDesc Size of the array. - \param pWrittenDesc Pointer to the integer that will receive the actual - number of written descriptors. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidDetailledTimingDescriptors - (tmInstance_t instance, - tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, UInt8 maxDTDesc, UInt8 *pWrittenDTDesc) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if DTDescriptors, WrittenDTDesc pointers are Null */ - RETIF(pDTDescriptors == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pWrittenDTDesc == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Get detailled descriptors from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - dlHdmiTxEdidGetDTD(instance, pDTDescriptors, maxDTDesc, - pWrittenDTDesc)) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/*****************************************************************************/ -/** - \brief Retrieves supported monitor descriptor from receiver's EDID. - This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pEdidFirstMD Pointer to the array that will receive the first monitor - descriptors. - \param pEdidSecondMD Pointer to the array that will receive the second monitor - descriptors. - \param pEdidOtherMD Pointer to the array that will receive the other monitor - descriptors. - \param maxOtherMD Size of the array. - \param pWrittenOtherMD Pointer to the integer that will receive the actual - number of written descriptors. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidMonitorDescriptors - (tmInstance_t instance, - tmdlHdmiTxEdidFirstMD_t *pEdidFirstMD, - tmdlHdmiTxEdidSecondMD_t *pEdidSecondMD, - tmdlHdmiTxEdidOtherMD_t *pEdidOtherMD, UInt8 maxOtherMD, UInt8 *pWrittenOtherMD) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if DTDescriptors, WrittenDTDesc pointers are Null */ - RETIF(pEdidFirstMD == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pEdidSecondMD == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pEdidOtherMD == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Get monitor descriptors from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetMonitorDescriptors(instance, - (tmbslHdmiTxEdidFirstMD_t *) - pEdidFirstMD, - (tmbslHdmiTxEdidSecondMD_t *) - pEdidSecondMD, - (tmbslHdmiTxEdidOtherMD_t *) - pEdidOtherMD, maxOtherMD, - pWrittenOtherMD)) != TM_OK, - errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/*****************************************************************************/ -/** - \brief Retrieves TV picture ratio from receiver's EDID. - This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pEdidTvPictureRatio Pointer to the array that will receive the TV picture - ratio. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidTVPictureRatio - (tmInstance_t instance, tmdlHdmiTxPictAspectRatio_t *pEdidTvPictureRatio) { - tmErrorCode_t errCode; - tmbslHdmiTxEdidBDParam_t edidBDParam; - UInt16 horizontalSize; - UInt16 verticalSize; - tmbslHdmiTxEdidDtd_t edidDTDBuffer; - UInt8 writtenDTD = 0; - Bool bDataAvailable = False; /* Data available in EDID for calcul TV picture ratio */ - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if DTDescriptors, WrittenDTDesc pointers are Null */ - RETIF(pEdidTvPictureRatio == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Get Basic Display Parameter from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetBasicDisplayParam(instance, - &edidBDParam)) != TM_OK, - errCode) - - horizontalSize = (UInt16) edidBDParam.uMaxHorizontalSize; - verticalSize = (UInt16) edidBDParam.uMaxVerticalSize; - - if ((horizontalSize == 0) && (verticalSize == 0)) { - /* Get Basic Display Parameter from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetDetailedTimingDescriptors - (instance, &edidDTDBuffer, 1, &writtenDTD)) != TM_OK, errCode); - - if (writtenDTD == 1) { - horizontalSize = edidDTDBuffer.uHImageSize; - verticalSize = edidDTDBuffer.uVImageSize; - bDataAvailable = True; - } else { - *pEdidTvPictureRatio = TMDL_HDMITX_P_ASPECT_RATIO_UNDEFINED; - } - } else { - bDataAvailable = True; - } - - if (bDataAvailable == True) { - *pEdidTvPictureRatio = dlHdmiTxCalcAspectRatio(horizontalSize, verticalSize); - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; - - -} - -/****************************************************************************** - \brief Retrieves the sink type from receiver's EDID (HDMI or DVI). This - function parses the EDID of Rx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pSinkType Pointer to the array that will receive sink type. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidSinkType(tmInstance_t instance, tmdlHdmiTxSinkType_t *pSinkType) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if SinkType pointer is Null */ - RETIF(pSinkType == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Read the source address from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetSinkType(instance, - (tmbslHdmiTxSinkType_t *) pSinkType)) != - TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Retrieves source address from receivers's EDID. This - function parses the EDID of Rx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pSourceAddress Pointer to the integer that will receive the EDID source - address. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidSourceAddress(tmInstance_t instance, UInt16 *pSourceAddress) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if SourceAddress pointer is Null */ - RETIF(pSourceAddress == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Read the source address from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxEdidGetSourceAddress(instance, - pSourceAddress)) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief Retreives KSV list received by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pKsv Pointer to the array that will receive the KSV list. - \param maxKsv Maximum number of KSV that the array can store. - \param pWrittenKsv Actual number of KSV written into the array. - \param pDepth Connection tree depth returned with KSV list. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetKsvList - (tmInstance_t instance, - UInt8 *pKsv, - UInt8 maxKsv, UInt8 *pWrittenKsv, UInt8 *pDepth, Bool *pMaxCascExd, Bool *pMaxDevsExd) { - tmErrorCode_t errCode; -#ifndef NO_HDCP - UInt16 i, j; -#endif - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if pDepth, Ksv and WrittenKsv pointers are Null */ - RETIF(pKsv == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pWrittenKsv == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pDepth == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pMaxCascExd == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pMaxDevsExd == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Maximum Ksv is HDMITX_KSV_LIST_MAX_DEVICES, 128 devices */ - RETIF_BADPARAM(maxKsv > HDMITX_KSV_LIST_MAX_DEVICES) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Make sure that *pWrittenKsv is 0 */ - * pWrittenKsv = 0; - - /* Make sure that *pDepth is 0 */ - *pDepth = 0; - -#ifndef NO_HDCP - - *pMaxCascExd = hdcpInfoListTx[instance].hdcpMaxCascExceeded; - *pMaxDevsExd = hdcpInfoListTx[instance].hdcpMaxDevsExceeded; - - - /* Copy the bKsv */ - if (maxKsv) { - - for (j = 0; j < 5; j++) { - pKsv[j] = hdcpInfoListTx[instance].hdcpBksv[4 - j]; - } - *pWrittenKsv = *pWrittenKsv + 1; - - } - - - /* maxKsv */ - /* Copy the Ksv list */ - for (i = 1; i <= hdcpInfoListTx[instance].hdcpKsvDevices; i++) { - if (i < maxKsv) { - for (j = 0; j < 5; j++) { - pKsv[(5 * i) + j] = - hdcpInfoListTx[instance].hdcpKsvList[(5 * (i - 1)) + j]; - } - *pWrittenKsv = *pWrittenKsv + 1; - } - } - - *pDepth = hdcpInfoListTx[instance].hdcpDeviceDepth; - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -#else - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; -#endif /* NO_HDCP */ -} - -#ifdef HDMI_TX_REPEATER_ISR_MODE -/****************************************************************************** - \brief Retreives HDCP depth received by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pDepth Connection tree depth returned with KSV list. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetDepth(tmInstance_t instance, UInt8 *pDepth) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if pDepth, is Null */ - RETIF(pDepth == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Make sure that *pDepth is 0 */ - * pDepth = 0; - -#ifndef NO_HDCP - - - *pDepth = hdcpInfoListTx[instance].hdcpDeviceDepth; - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -#else - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief Generate SHA_1 interrupt if not occured. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGeneSHA_1_IT(tmInstance_t instance) { - tmErrorCode_t errCode; - - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - dlHdmiTxHandleSHA_1(instance); - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} -#endif /* HDMI_TX_REPEATER_ISR_MODE */ -/****************************************************************************** - \brief Enable/Disable HDCP encryption. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param hdcpEnable HDCP On/Off (true = On, False = Off). - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetHdcp(tmInstance_t instance, Bool hdcpEnable) { - tmErrorCode_t errCode; -#ifndef NO_HDCP - tmdlHdmiTxVidFmtSpecs_t resolutionSpecs; - tmbslHdmiTxVfreq_t voutFreq; - tmbslHdmiTxVidFmt_t voutFmt; - tmbslHdmiTxHdcpTxMode_t txMode; - tmbslHdmiTxHdcpOptions_t options; - UInt8 slaveAddress; - UInt16 i; -#endif - tmbslHdmiTxRxSense_t rxSenseStatus; /* Rx Sense status */ - tmbslHdmiTxHotPlug_t hpdStatus; /* HPD status */ - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Hdcp is not supported if keySeed is null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - gtmdlHdmiTxDriverConfigTable[instance].keySeed == HDCP_SEED_NULL, - TMDL_ERR_DLHDMITX_NOT_SUPPORTED) - - /* Read rxSenseStatus and hpdStatus to authorize HDCP only if active */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxRxSenseGetStatus(instance, - &rxSenseStatus, False)) != TM_OK, - errCode) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHotPlugGetStatus(instance, - &hpdStatus, False)) != TM_OK, errCode) -#ifndef NO_HDCP - if (hdcpEnable == True) { /* HDCP ON */ - if ((rxSenseStatus == HDMITX_RX_SENSE_ACTIVE) - && (hpdStatus == HDMITX_HOTPLUG_ACTIVE)) { - -#ifdef TMFL_HDCP_OPTIMIZED_POWER - tmbslHdmiTxHdcpPowerDown(instance, False); -#endif - /* Reset HDCP DevLib data to ensure that new values are used */ - hdcpInfoListTx[instance].hdcpCheckState = - TMDL_HDMITX_HDCP_CHECK_IN_PROGRESS; - hdcpInfoListTx[instance].hdcpErrorState = 0; - hdcpInfoListTx[instance].hdcpKsvDevices = 0; - hdcpInfoListTx[instance].bKsvSecure = True; - for (i = 0; i < TMDL_HDMITX_KSV_BYTES_PER_DEVICE; i++) { - hdcpInfoListTx[instance].hdcpBksv[i] = 0; - } - hdcpInfoListTx[instance].hdcpDeviceDepth = 0; - - hdcpInfoListTx[instance].hdcpMaxCascExceeded = False; - hdcpInfoListTx[instance].hdcpMaxDevsExceeded = False; - - /* Current used video output format */ - voutFmt = - (tmbslHdmiTxVidFmt_t) instanceStatusInfoTx[instance].pVideoInfo-> - videoOutConfig.format; - - /* Find output vertical frequency from output format */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - tmdlHdmiTxGetVideoFormatSpecs(instance, - (tmdlHdmiTxVidFmt_t) voutFmt, - &resolutionSpecs)) != TM_OK, - errCode) - voutFreq = (tmbslHdmiTxVfreq_t) resolutionSpecs.vfrequency; - - /* Configure HDCP */ - - /* HDCP DDC Slave address */ - slaveAddress = HDMITX_HDCP_SLAVE_PRIMARY; - - /* Top level or repeater HDCP mode */ - if (unitTableTx[instance].repeaterEnable == True) { - txMode = HDMITX_HDCP_TXMODE_REPEATER; - } else { - txMode = HDMITX_HDCP_TXMODE_TOP_LEVEL; - } - - instanceStatusInfoTx[instance].pColBarState->changeColorBarNow = True; - instanceStatusInfoTx[instance].pColBarState->colorBarOn = True; - dlHdmiTxCheckColorBar(instance); - - /* HDCP options */ - options = (tmbslHdmiTxHdcpOptions_t) unitTableTx[instance].hdcpOptions; - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHdcpConfigure(instance, - slaveAddress, txMode, options, - HDCP_CHECK_INTERVAL_MS, - HDCP_NUM_CHECKS)) != TM_OK, - errCode) - - /* Start HDCP */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHdcpInit(instance, - voutFmt, voutFreq)) != TM_OK, - errCode) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHdcpRun(instance) - ) != TM_OK, errCode) - - unitTableTx[instance].hdcpEnable = True; - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, - errCode) - - return errCode; - } - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_INVALID_STATE; - } else { /* HDCP OFF */ - - RETIF_SEM(dlHdmiTxItSemaphore[instance], (errCode = tmbslHdmiTxHdcpStop(instance) - ) != TM_OK, errCode) - - unitTableTx[instance].hdcpEnable = False; - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_HDCP_INACTIVE) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_HDCP_INACTIVE); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode); - -#ifdef TMFL_HDCP_OPTIMIZED_POWER - tmbslHdmiTxHdcpPowerDown(instance, True); -#endif - return TM_OK; - } -#else - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief Get the driver HDCP state. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pHdcpCheckState Pointer to the integer that will receive the HDCP check state. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetHdcpState(tmInstance_t instance, tmdlHdmiTxHdcpCheck_t *pHdcpCheckState) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check if HdcpCheckState pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pHdcpCheckState == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) -#ifndef NO_HDCP - /* Result of tmbslHdmiTxHdcpCheck */ - * pHdcpCheckState = hdcpInfoListTx[instance].hdcpCheckState; - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -#else - * pHdcpCheckState = TMDL_HDMITX_HDCP_CHECK_NOT_STARTED; - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief Check the result of an HDCP encryption attempt, called at - intervals (set by timeSinceLastCall) after tmdlHdmiTxSetHdcp(true). - This API must be used only in case of No Operating System. if OS, - this is manage internally of this device library. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param timeSinceLastCall Time passed in milliseconds since last call, - must be shorter than 600 ms. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxHdcpCheck(tmInstance_t instance, UInt16 timeSinceLastCall) { - tmErrorCode_t errCode; - Bool featureSupported; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHwGetCapabilities(instance, - HDMITX_FEATURE_HW_HDCP, - &featureSupported)) != TM_OK, errCode) -#ifndef NO_HDCP - dlHdmiTxCheckColorBar(instance); - dlHdmiTxCheckHdcpColorBar(instance); - - if (featureSupported == True) { - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxHdcpCheck(instance, - timeSinceLastCall, - (tmbslHdmiTxHdcpCheck_t *) & - (hdcpInfoListTx[instance]. - hdcpCheckState))) != TM_OK, errCode) - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -#else - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TMDL_ERR_DLHDMITX_NOT_SUPPORTED; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief This function loads a gamut metadata packet into the HW. HW will - actually send it at the beginning of next VS, during the vertical - blanking. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable gamut metadata packet insertion. - \param pGamutData Pointer to the structure containing gamut metadata - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetGamutPacket - (tmInstance_t instance, Bool enable, tmdlHdmiTxGamutData_t *pGamutData) { - tmErrorCode_t errCode; - tmbslHdmiTxPktGamut_t pkt; - UInt8 i; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - if (enable == True) { - /* Check if GamutData pointer is Null */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], pGamutData == Null, - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Fill data */ - pkt.HB[0] = 0x0A; - - pkt.HB[1] = 0x00; - pkt.HB[1] = (UInt8) (pkt.HB[1] | ((pGamutData->nextField & 0x01) << 7)); - pkt.HB[1] |= (pGamutData->GBD_Profile & 0x07) << 4; - pkt.HB[1] |= (pGamutData->affectedGamutSeqNum & 0x0F); - - pkt.HB[2] = 0x00; - pkt.HB[2] = (UInt8) (pkt.HB[2] | ((pGamutData->noCurrentGBD & 0x01) << 7)); - pkt.HB[2] |= (pGamutData->packetSequence & 0x03) << 4; - pkt.HB[2] |= (pGamutData->currentGamutSeqNum & 0x0F); - - for (i = 0; i < 28; i++) { - pkt.PB[i] = pGamutData->payload[i]; - } - - /* Store GBD color space */ - if (((pGamutData->payload[0]) & 0x03) == 2) { - instanceStatusInfoTx[instance].pGamutState->wideGamutColorSpace = - TMDL_HDMITX_EXT_COLORIMETRY_XVYCC709; - } else { - instanceStatusInfoTx[instance].pGamutState->wideGamutColorSpace = - TMDL_HDMITX_EXT_COLORIMETRY_XVYCC601; - } - - /* Fill Gamut metadata packet */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktFillGamut(instance, - &pkt, - instanceStatusInfoTx[instance]. - pGamutState->gamutBufNum)) != TM_OK, - errCode) - - /* Enable Gamut metadata transmission */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSendGamut(instance, - instanceStatusInfoTx[instance]. - pGamutState->gamutBufNum, - enable)) != TM_OK, errCode) - - /* Use next buffer for next time */ - if (instanceStatusInfoTx[instance].pGamutState->gamutBufNum == 0) { - instanceStatusInfoTx[instance].pGamutState->gamutBufNum = 1; - } else { - instanceStatusInfoTx[instance].pGamutState->gamutBufNum = 0; - } - } else { - /* Disable Gamut metadata transmission */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSendGamut(instance, - 0, enable)) != TM_OK, errCode) - } - - /* Store gamut status */ - instanceStatusInfoTx[instance].pGamutState->gamutOn = enable; - if (enable) - instanceStatusInfoTx[instance].pGamutState->extColOn = False; - - /* Set avi infoframe */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = dlHdmiTxSetVideoInfoframe(instance, - instanceStatusInfoTx[instance].pVideoInfo-> - videoOutConfig.format, - instanceStatusInfoTx[instance].pVideoInfo-> - videoOutConfig.mode)) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief This function set the extended colorimetry with one of the following - extended colorimetries(bits EC2-0): xvYCC601, xvYCC709, sYCC601, - AdobeYCC601, AdobeRGB. When the parameter extendedColorimetry is - xvYCC601 or xvYCC70, this function calls the API tmdlHdmiTxSetGamutPacket - to send Gamut Packet Data that does not exist for all other types of - extended colorimetries for which pointer pGamutData can be set to NULL. - This function also allows to set YCC Quantization Range (YQ1-0) - - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/Disable extended colorimetry. - \param extendedColorimetry value of the extended colorimetry (bits EC2 EC1 EC0). - \param yccQR YCC quantisation range - \param pGamutData Pointer to the structure containing gamut metadata - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter was out of range - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxSetExtendedColorimetry - (tmInstance_t instance, - Bool enable, - tmdlHdmiTxExtColorimetry_t extendedColorimetry, - tmdlHdmiTxYCCQR_t yccQR, tmdlHdmiTxGamutData_t *pGamutData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check if extendedColorimetry & yccQR values are in the correct range */ - if (enable) /* no need to check them for disable handling */ - { - RETIF(extendedColorimetry >= TMDL_HDMITX_EXT_COLORIMETRY_INVALID, - TMDL_ERR_DLHDMITX_BAD_PARAMETER) - RETIF(yccQR >= TMDL_HDMITX_YQR_INVALID, TMDL_ERR_DLHDMITX_BAD_PARAMETER) - } - - /* Take the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Store YCC quantisation range value for later AVI InfoFrame insertion */ - if (enable) - instanceStatusInfoTx[instance].pGamutState->yccQR = yccQR; - - /* Extended colorimetries that need to send Gamut Packet Data */ - if (((enable == True) && ((extendedColorimetry == TMDL_HDMITX_EXT_COLORIMETRY_XVYCC601) || - (extendedColorimetry == TMDL_HDMITX_EXT_COLORIMETRY_XVYCC709))) - || ((enable == False) && (instanceStatusInfoTx[instance].pGamutState->gamutOn == True))) { - /* can not have two different types of extended colorimeties enabled in the same time */ - if (enable) - instanceStatusInfoTx[instance].pGamutState->extColOn = False; - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Call the API that handles Gamut MetaData */ - RETIF((errCode = - tmdlHdmiTxSetGamutPacket(instance, enable, pGamutData)) != TM_OK, - errCode) - - return TM_OK; - } - - /* Extended colorimetries that do not need to send Gamut Packet Data */ - if (instanceStatusInfoTx[instance].pGamutState->gamutOn == True) { - /* Disable Gamut metadata transmission */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = tmbslHdmiTxPktSendGamut(instance, 0, False)) != TM_OK, errCode) - - instanceStatusInfoTx[instance].pGamutState->gamutOn = False; - } - - /* Store the extended colorimetry that does not need sending Gamut Packet Data */ - if (enable) - instanceStatusInfoTx[instance].pGamutState->wideGamutColorSpace = - extendedColorimetry; - instanceStatusInfoTx[instance].pGamutState->extColOn = enable; - - /* Set avi infoframe */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = dlHdmiTxSetVideoInfoframe(instance, - instanceStatusInfoTx[instance].pVideoInfo-> - videoOutConfig.format, - instanceStatusInfoTx[instance].pVideoInfo-> - videoOutConfig.mode)) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief This function set the revocation list use for HDCP - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param listPtr Pointer on revocation list provide by application. - \param length length of revocation list. - - \return The call result: - - TM_OK: the call was successful, however RX keys have - not been checked with provided revocation list - because they are not available. - - TMDL_DLHDMITX_HDCP_SECURE: the call was successful, RX keys are secure - - TMDL_DLHDMITX_HDCP_NOT_SECURE: the call was successful, RX keys are NOT secure - - TMDL_ERR_DLHDMITX_INVALID_STATE: we are a repeater - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - -tmErrorCode_t tmdlHdmiTxSetHDCPRevocationList(tmInstance_t instance, void *listPtr, UInt32 length) -{ - tmErrorCode_t errCode = TM_OK; -#ifndef NO_HDCP - tmErrorCode_t errCodeSem = TM_OK; - UInt8 aCounter = 0; - UInt8 indexKSVList = 0; - UInt8 i; - Bool bIsSecure = True; -#endif - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check parameters */ - RETIF((listPtr == Null) || (length == 0), TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) -#ifndef NO_HDCP - /* --------------------- */ - /* Take the semaphore */ - /* --------------------- */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) - - /* Register revocation list */ - unitTableTx[instance].revocationList.pList = (UInt8 *) listPtr; - unitTableTx[instance].revocationList.length = length; - - /* Look if hdcpBksv is filled in */ - for (i = 0; i < TMDL_HDMITX_KSV_BYTES_PER_DEVICE; i++) { - if (hdcpInfoListTx[instance].hdcpBksv[i] == 0) - aCounter++; - } - - /* If it the case ,check bksv */ - if (aCounter != TMDL_HDMITX_KSV_BYTES_PER_DEVICE) { - - dlHdmiTxCheckHdcpBksv(instance, hdcpInfoListTx[instance].hdcpBksv, &bIsSecure, - True); - - /* bksv is secure */ - if (bIsSecure == True) { - - /* if HDMI TX is at top level */ - if (unitTableTx[instance].repeaterEnable == False) { - - /* if present, check ksv list */ - if (hdcpInfoListTx[instance].hdcpKsvDevices) { - - while ((indexKSVList < TMDL_HDMITX_KSV_LIST_MAX_DEVICES) && - (indexKSVList < - hdcpInfoListTx[instance].hdcpKsvDevices) - && (bIsSecure == True)) { - - dlHdmiTxCheckHdcpBksv(instance, - &(hdcpInfoListTx[instance]. - hdcpKsvList[indexKSVList * - TMDL_HDMITX_KSV_BYTES_PER_DEVICE]), - &bIsSecure, False); - indexKSVList++; - } - - if (bIsSecure == True) { - errCode = TMDL_DLHDMITX_HDCP_SECURE; - } else { - errCode = TMDL_DLHDMITX_HDCP_NOT_SECURE; - } - } else { /* ksv list does NOT exist */ - - /* we suppose that application calls the API after RX_KEYS_RECEIVED */ - errCode = TMDL_DLHDMITX_HDCP_SECURE; - } - - } else { /* we are a repeater */ - errCode = TMDL_ERR_DLHDMITX_INVALID_STATE; - } - - } else { /* bksv NOT secure */ - - errCode = TMDL_DLHDMITX_HDCP_NOT_SECURE; - } - - } else { - /* bksv is not read, could not be tested */ - errCode = TM_OK; - } - - /* --------------------------- */ - /* Release the sempahore */ - /* --------------------------- */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) -#else - (void)instance; /* Remove compiler warning */ -#endif /* NO_HDCP */ - return errCode; -} - -/****************************************************************************** - \brief This function set the B... screen - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful, however RX keys have - not been checked with provided revocation list - because they are not available. - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - -******************************************************************************/ - -tmErrorCode_t tmdlHdmiTxSetBScreen(tmInstance_t instance, tmdlHdmiTxTestPattern_t pattern) -{ - - tmErrorCode_t errCodeSem = TM_OK; - tmErrorCode_t errCode = TM_OK; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* --------------------- */ - /* Take the semaphore */ - /* --------------------- */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) - - gtmdlHdmiTxDriverConfigTable[instance].pattern = pattern; - - /* Set service mode colour bar on/off (also used as HDCP logo pattern) */ - (void)dlHdmiTxSetTestPatternOn(instance, - instanceStatusInfoTx[instance].pVideoInfo->videoOutConfig. - format, - instanceStatusInfoTx[instance].pVideoInfo->videoOutConfig. - mode, gtmdlHdmiTxDriverConfigTable[instance].pattern); - - /* --------------------------- */ - /* Release the sempahore */ - /* --------------------------- */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) - - return errCode; - -} - -/****************************************************************************** - \brief This function set the Remove B.... screen - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful, however RX keys have - not been checked with provided revocation list - because they are not available. - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - -******************************************************************************/ - -tmErrorCode_t tmdlHdmiTxRemoveBScreen(tmInstance_t instance) -{ - - tmErrorCode_t errCodeSem = TM_OK; - tmErrorCode_t errCode = TM_OK; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* --------------------- */ - /* Take the semaphore */ - /* --------------------- */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) - - /* Restore last output format and mode */ - (void)dlHdmiTxSetTestPatternOff(instance, - instanceStatusInfoTx[instance].pVideoInfo-> - videoOutConfig.format, - instanceStatusInfoTx[instance].pVideoInfo-> - videoOutConfig.mode); - - /* --------------------------- */ - /* Release the sempahore */ - /* --------------------------- */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) - - return errCode; - -} - -/****************************************************************************** - \brief tmdlHdmiTxConvertDTDtoCEA . - - \param DTDescriptors DTD to convert. - - \return NA. - -******************************************************************************/ -tmdlHdmiTxVidFmt_t tmdlHdmiTxConvertDTDtoCEA - (tmInstance_t instance, tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors) { - - tmdlHdmiTxVidFmt_t codeCEA; - tmdlHdmiTxPictAspectRatio_t pictureAspectRatio; - Bool formatInterlaced; - - /* --------------------- */ - /* Take the semaphore */ - /* --------------------- */ - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - - formatInterlaced = False; - - if ((pDTDescriptors->flags) & 0x80) { - formatInterlaced = True; - } - - pictureAspectRatio = - dlHdmiTxCalcAspectRatio(pDTDescriptors->hImageSize, pDTDescriptors->vImageSize); - - switch (pDTDescriptors->hActivePixels) { - case 640: - codeCEA = dlHdmiTxConvertDTDtoCEA_640HAP(pDTDescriptors); - break; - - case 720: - codeCEA = dlHdmiTxConvertDTDtoCEA_720HAP(pDTDescriptors, pictureAspectRatio); - break; - - case 1280: - codeCEA = dlHdmiTxConvertDTDtoCEA_1280HAP(pDTDescriptors); - break; - - case 1920: - codeCEA = dlHdmiTxConvertDTDtoCEA_1920HAP(pDTDescriptors, formatInterlaced); - break; - - case 1440: - codeCEA = - dlHdmiTxConvertDTDtoCEA_1440HAP(pDTDescriptors, pictureAspectRatio, - formatInterlaced); - break; - - case 2880: - codeCEA = - dlHdmiTxConvertDTDtoCEA_2880HAP(pDTDescriptors, pictureAspectRatio, - formatInterlaced); - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - - /* --------------------------- */ - /* Release the sempahore */ - /* --------------------------- */ - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - - return codeCEA; - -} - -/*============================================================================*/ -/* INTERNAL FUNCTION */ -/*============================================================================*/ - -/****************************************************************************** - \brief Get the REFPIX and REFLINE for output and scaler - for the current settings. - - \param vinFmt Video input format. - \param vinMode Video input mode. - \param voutFmt Video output format. - \param syncIn Type of synchro (ext or emb). - \param pixRate Video pixel rate. - \param pRefPix RefPix for output. - \param pRefLine RefLine for output. - \param pScRefPix RefPix for scaler. - \param pScRefLine RefLine for scaler. - \param pbVerified Pointer to the boolean that will receive the fact that - this scaler setting was verified. - - \return True (Found) or False (Not found). - -******************************************************************************/ -static Bool dlHdmiTxGetReflineRefpix - (tmdlHdmiTxVidFmt_t vinFmt, - tmdlHdmiTxVinMode_t vinMode, - tmdlHdmiTxVidFmt_t voutFmt, - UInt8 syncIn, - tmdlHdmiTxPixRate_t pixRate, - UInt16 *pRefPix, - UInt16 *pRefLine, UInt16 *pScRefPix, UInt16 *pScRefLine, Bool *pbVerified) { - UInt8 shortVinFmt; - UInt8 shortVoutFmt; - int i; - Bool bFound; - tmdlHdmiTxVidFmt_t vinFmtIndex, voutFmtIndex; - - /* Search for all values to match in table, until table end is reached - * when both refPix values are zero */ - *pRefPix = 0; - *pRefLine = 0; - *pScRefPix = 0; - *pScRefLine = 0; - - /* If match is not found in table, we can assume a verified non-scaler - * combination */ - *pbVerified = 1; - bFound = False; - - if ((voutFmt < TMDL_HDMITX_VFMT_TV_NO_REG_MIN) - || ((voutFmt >= HDMITX_VFMT_35_2880x480p_60Hz) - && (voutFmt <= HDMITX_VFMT_38_2880x576p_50Hz))) { - vinFmtIndex = dlHdmiTxCalcVidFmtIndex(vinFmt); - voutFmtIndex = dlHdmiTxCalcVidFmtIndex(voutFmt); - shortVinFmt = kVfmtToShortFmt_TV[vinFmtIndex]; - shortVoutFmt = kVfmtToShortFmt_TV[voutFmtIndex]; - - for (i = 0; kRefpixRefline[i].shortVinFmt != TV_INVALID; i++) { - if ((kRefpixRefline[i].shortVinFmt == shortVinFmt) - && (UNPKMODE(kRefpixRefline[i].modeRateSyncVerf) == vinMode) - && (kRefpixRefline[i].shortVoutFmt == shortVoutFmt) - && (UNPKRATE(kRefpixRefline[i].modeRateSyncVerf) == pixRate) - && (UNPKSYNC(kRefpixRefline[i].modeRateSyncVerf) == syncIn)) { - *pRefPix = kRefpixRefline[i].refPix; - *pRefLine = kRefpixRefline[i].refLine; - *pScRefPix = kRefpixRefline[i].scRefPix; - *pScRefLine = kRefpixRefline[i].scRefLine; - *pbVerified = UNPKVERF(kRefpixRefline[i].modeRateSyncVerf); - bFound = True; - break; - } - } - } - - return bFound; -} - -/****************************************************************************** - \brief Set the video infoframe. - - \param instance Instance identifier. - \param voutFmt Video output format. - \param voutMode Video output mode. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -static tmErrorCode_t dlHdmiTxSetVideoInfoframe - (tmInstance_t instance, tmdlHdmiTxVidFmt_t voutFmt, tmdlHdmiTxVoutMode_t voutMode) { - tmErrorCode_t errCode; - tmdlHdmiTxAviIfData_t contentVif; - tmdlHdmiTxVidFmt_t voutFmtIndex; - - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - contentVif.colorIndicator = voutMode; /* 3rd api_set_avi_infoframe param */ - contentVif.activeInfoPresent = 0; - contentVif.barInformationDataValid = 0; - contentVif.scanInformation = 0; - - voutFmtIndex = dlHdmiTxCalcVidFmtIndex(voutFmt); - contentVif.pictureAspectRatio = kVfmtToAspect_TV[voutFmtIndex]; - - contentVif.activeFormatAspectRatio = 8; - contentVif.nonUniformPictureScaling = 0; - -#ifdef FORMAT_PC - if (voutFmt >= TMDL_HDMITX_VFMT_PC_MIN) { - if (voutFmt == TMDL_HDMITX_VFMT_PC_640x480p_60Hz) { - contentVif.videoFormatIdentificationCode = - (tmbslHdmiTxVidFmt_t) TMDL_HDMITX_VFMT_01_640x480p_60Hz; - } else { - /* Format PC not Valid in EIA861b */ - contentVif.videoFormatIdentificationCode = - (tmbslHdmiTxVidFmt_t) TMDL_HDMITX_VFMT_NULL; - } - } else { -#endif /* FORMAT_PC */ - - contentVif.videoFormatIdentificationCode = (tmbslHdmiTxVidFmt_t) voutFmt; - -#ifdef FORMAT_PC - } -#endif /* FORMAT_PC */ - - - if (((voutFmt >= TMDL_HDMITX_VFMT_06_720x480i_60Hz) - && (voutFmt <= TMDL_HDMITX_VFMT_09_720x240p_60Hz)) - || ((voutFmt >= TMDL_HDMITX_VFMT_21_720x576i_50Hz) - && (voutFmt <= TMDL_HDMITX_VFMT_24_720x288p_50Hz))) { - /* Force pixel repeat for formats where it's mandatory (Pixel Frequency < 20 Mpix/s) */ - contentVif.pixelRepetitionFactor = 1; - } else if ((voutFmt == TMDL_HDMITX_VFMT_10_720x480i_60Hz) - || (voutFmt == TMDL_HDMITX_VFMT_11_720x480i_60Hz) - || (voutFmt == TMDL_HDMITX_VFMT_25_720x576i_50Hz) - || (voutFmt == TMDL_HDMITX_VFMT_26_720x576i_50Hz)) { - contentVif.pixelRepetitionFactor = HDMITX_PIXREP_3; /* pixel sent 1 or 10 times, here 4 times */ - } else if ((voutFmt == TMDL_HDMITX_VFMT_14_1440x480p_60Hz) - || (voutFmt == TMDL_HDMITX_VFMT_15_1440x480p_60Hz) - || (voutFmt == TMDL_HDMITX_VFMT_29_1440x576p_50Hz) - || (voutFmt == TMDL_HDMITX_VFMT_30_1440x576p_50Hz)) { - contentVif.pixelRepetitionFactor = HDMITX_PIXREP_1; /* pixel sent 1 or 2 times, here 2 times */ - } else if ((voutFmt >= TMDL_HDMITX_VFMT_35_2880x480p_60Hz) - && (voutFmt <= TMDL_HDMITX_VFMT_38_2880x576p_50Hz)) { - contentVif.pixelRepetitionFactor = HDMITX_PIXREP_3; - } else { /* Default to no repeat for all other formats */ - - contentVif.pixelRepetitionFactor = HDMITX_PIXREP_NONE; - } - - if ((instanceStatusInfoTx[instance].pGamutState->gamutOn == True) || - (instanceStatusInfoTx[instance].pGamutState->extColOn == True)) { - contentVif.colorimetry = (UInt8) TMDL_HDMITX_COLORIMETRY_EXTENDED; - } else { - switch (voutFmt) { - case TMDL_HDMITX_VFMT_04_1280x720p_60Hz: - case TMDL_HDMITX_VFMT_05_1920x1080i_60Hz: - case TMDL_HDMITX_VFMT_16_1920x1080p_60Hz: - case TMDL_HDMITX_VFMT_19_1280x720p_50Hz: - case TMDL_HDMITX_VFMT_20_1920x1080i_50Hz: - case TMDL_HDMITX_VFMT_31_1920x1080p_50Hz: - contentVif.colorimetry = (UInt8) TMDL_HDMITX_COLORIMETRY_ITU709; - break; - - default: - contentVif.colorimetry = (UInt8) TMDL_HDMITX_COLORIMETRY_ITU601; - break; - } - } - - contentVif.lineNumberEndTopBar = 0; - contentVif.lineNumberStartBottomBar = 0; - contentVif.lineNumberEndLeftBar = 0; - contentVif.lineNumberStartRightBar = 0; - - errCode = dlHdmiTxSetRawVideoInfoframe(instance, &contentVif, True); - - /* Ignore infoframe interlock in DVI mode */ - if (errCode == TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED) { - errCode = TM_OK; - } - - return errCode; -} - -/****************************************************************************** - \brief Set the video infoframe. - - \param instance Instance identifier. - \param voutFmt Video output format. - \param voutMode Video output mode. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ -static tmErrorCode_t dlHdmiTxSetRawVideoInfoframe - (tmInstance_t instance, tmdlHdmiTxAviIfData_t *pContentVif, Bool enable) { - - tmErrorCode_t errCode; - tmbslHdmiTxPktRawAvi_t PktInfoFrame; - UInt8 i; - - if (pContentVif != Null) { - - for (i = 0; i < sizeof(PktInfoFrame.PB); i++) { - PktInfoFrame.PB[i] = 0; - } - - /* Prepare VIF header */ - PktInfoFrame.HB[0] = 0x82; /* Video InfoFrame */ - PktInfoFrame.HB[1] = 0x02; /* Version 2 [HDMI 1.2] */ - PktInfoFrame.HB[2] = 0x0D; /* Length [HDMI 1.2] */ - - /* Prepare VIF packet (byte numbers offset by 3) */ - PktInfoFrame.PB[0] = 0; /* Preset checksum to zero so calculation works! */ - PktInfoFrame.PB[1] = ((pContentVif->colorIndicator & 0x03) << 5) | /* Y1-0, B1-0,S1-0 */ - ((pContentVif->barInformationDataValid & 0x03) << 2) | - (pContentVif->scanInformation & 0x03); - if (pContentVif->activeInfoPresent == True) { - PktInfoFrame.PB[1] += 0x10; /* A0 bit */ - } - - PktInfoFrame.PB[2] = ((pContentVif->colorimetry & 0x03) << 6) | /* C1-0, M1-0, R3-0 */ - ((pContentVif->pictureAspectRatio & 0x03) << 4) | - (pContentVif->activeFormatAspectRatio & 0x0F); - - PktInfoFrame.PB[3] = (pContentVif->nonUniformPictureScaling & 0x03); /* SC1-0 *//* [HDMI 1.2] */ - - /* Q1-0 = 00 => RGB Quantization Range depends on video format (CEA-861) */ - /* Limited Range for all video formats except PC formats which requires Full Range */ - - if (pContentVif->colorimetry == TMDL_HDMITX_COLORIMETRY_EXTENDED) { - PktInfoFrame.PB[3] = - ((((UInt8) instanceStatusInfoTx[instance].pGamutState-> - wideGamutColorSpace) & 0x07) << 4) - | PktInfoFrame.PB[3]; - } - - /* Bit ITC = 0 => No Content Type ; Bit ITC = 1 => Content Type (see CN1-0) */ - /* Today ITC = 0 => No Content Type */ - - PktInfoFrame.PB[4] = (pContentVif->videoFormatIdentificationCode & 0x7F); /* VIC6-0 */ - - PktInfoFrame.PB[5] = (pContentVif->pixelRepetitionFactor & 0x0F); /* PR3-0 */ - - /* CN1-0 => Content Type */ - /* Today CN1-0 = 00 => No Data */ - - /* YQ1-0 => YCC Quantization Range, only managed for those extended colorimetries */ - if (pContentVif->colorimetry == TMDL_HDMITX_COLORIMETRY_EXTENDED) { - PktInfoFrame.PB[5] |= - (((UInt8) instanceStatusInfoTx[instance].pGamutState-> - yccQR) & 0x03) << 6; - } - PktInfoFrame.PB[6] = (UInt8) (pContentVif->lineNumberEndTopBar & 0x00FF); - PktInfoFrame.PB[7] = (UInt8) ((pContentVif->lineNumberEndTopBar & 0xFF00) >> 8); - PktInfoFrame.PB[8] = (UInt8) (pContentVif->lineNumberStartBottomBar & 0x00FF); - PktInfoFrame.PB[9] = - (UInt8) ((pContentVif->lineNumberStartBottomBar & 0xFF00) >> 8); - PktInfoFrame.PB[10] = (UInt8) (pContentVif->lineNumberEndLeftBar & 0x00FF); - PktInfoFrame.PB[11] = (UInt8) ((pContentVif->lineNumberEndLeftBar & 0xFF00) >> 8); - PktInfoFrame.PB[12] = (UInt8) (pContentVif->lineNumberStartRightBar & 0x00FF); - PktInfoFrame.PB[13] = - (UInt8) ((pContentVif->lineNumberStartRightBar & 0xFF00) >> 8); - - /* Calculate checksum - this is worked out on "Length" bytes of the - * packet, the checksum (which we've preset to zero), and the three - * header bytes. - */ - PktInfoFrame.PB[0] = dlHdmiTxcalculateCheksumIF(&PktInfoFrame); - - errCode = tmbslHdmiTxPktSetRawVideoInfoframe(instance, &PktInfoFrame, enable); - } else { - errCode = tmbslHdmiTxPktSetVideoInfoframe(instance, Null, enable); - } - - return errCode; - -} - -/*============================================================================*/ -/* calculateChecksum - returns the byte needed to yield a checksum of zero */ -/*============================================================================*/ -static UInt8 dlHdmiTxcalculateCheksumIF(tmbslHdmiTxPktRawAvi_t *pData /* Pointer to checksum data */ - ) { - UInt8 checksum = 0; /* Working checksum calculation */ - UInt8 result = 0; /* Value to be returned */ - UInt8 numBytes = 0; - Int i; - - if (pData != Null) { - - numBytes = sizeof(pData->HB); - - for (i = 0; i < numBytes; i++) { - checksum = checksum + pData->HB[i]; - } - - numBytes = sizeof(pData->PB); - - for (i = 0; i < numBytes; i++) { - checksum = checksum + pData->PB[i]; - } - - result = (UInt8) ((255 - checksum) + 1); - } - return result; /* returns 0 in the case of null ptr or 0 bytes */ -} - -/****************************************************************************** - \brief Set colourbar test pattern on with RGB infoframe - - \param instance Instance identifier. - \param voutFmt Video output format. - \param voutMode Video output mode. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - -******************************************************************************/ -tmErrorCode_t dlHdmiTxSetTestPatternOn - (tmInstance_t instance, - tmdlHdmiTxVidFmt_t voutFmt, tmdlHdmiTxVoutMode_t voutMode, tmdlHdmiTxTestPattern_t pattern) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - RETIF((errCode = tmbslHdmiTxTestSetPattern(instance, - (tmbslHdmiTxTestPattern_t) pattern)) != - TM_OK, errCode) - - if (pattern > TMDL_HDMITX_PATTERN_CBAR8) { - RETIF((errCode = - dlHdmiTxSetVideoInfoframe(instance, voutFmt, voutMode)) != TM_OK, errCode) - } else { - /* For TMDL_HDMITX_PATTERN_CBAR8 and TMDL_HDMITX_PATTERN_CBAR4, video mode in infoframe should be RGB */ - RETIF((errCode = - dlHdmiTxSetVideoInfoframe(instance, voutFmt, - TMDL_HDMITX_VOUTMODE_RGB444)) != TM_OK, errCode) - } - return TM_OK; -} - -/****************************************************************************** - \brief Set colourbar test pattern off with previous infoframe - - \param instance Instance identifier. - \param voutFmt Video output format. - \param voutMode Video output mode. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - -******************************************************************************/ -tmErrorCode_t dlHdmiTxSetTestPatternOff - (tmInstance_t instance, tmdlHdmiTxVidFmt_t voutFmt, tmdlHdmiTxVoutMode_t voutMode) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - RETIF((errCode = tmbslHdmiTxTestSetPattern(instance, - (tmbslHdmiTxTestPattern_t) - TMDL_HDMITX_PATTERN_OFF)) != TM_OK, errCode) - - /* Restore video infoframe */ - RETIF((errCode = - dlHdmiTxSetVideoInfoframe(instance, voutFmt, voutMode)) != TM_OK, errCode) - - return TM_OK; -} - -/****************************************************************************** - \brief HDCP ENCRYPT interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleENCRYPT(tmInstance_t instance) { -#ifndef NO_HDCP - - tmbslHdmiTxHdcpHandleENCRYPT(instance); - - if (instanceStatusInfoTx[instance].pColBarState->disableColorBarOnR0 == False) { - instanceStatusInfoTx[instance].pColBarState->hdcpColbarChange = False; - instanceStatusInfoTx[instance].pColBarState->hdcpEncryptOrT0 = True; - } - instanceStatusInfoTx[instance].pColBarState->disableColorBarOnR0 = False; -#else - (void)instance; /* Remove compiler warning */ -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief HPD interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleHPD(tmInstance_t instance) { - tmErrorCode_t errCode; - tmbslHdmiTxHotPlug_t hpdStatus; /* HPD status */ - tmPowerState_t powerState; /* Power state of transmitter */ - - hpdStatus = HDMITX_HOTPLUG_INVALID; - - /* Get Hot Plug status */ - errCode = tmbslHdmiTxHotPlugGetStatus(instance, &hpdStatus, False); - - if (errCode != TM_OK) - return; - - /* Get the power state of the transmitter */ - errCode = tmbslHdmiTxPowerGetState(instance, &powerState); - - if (errCode != TM_OK) - return; - - /* Has hot plug changed to Active? */ - if (hpdStatus == HDMITX_HOTPLUG_ACTIVE) { - /* Set state machine to Plugged */ - dlHdmiTxSetState(instance, STATE_PLUGGED); - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_HPD_ACTIVE) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_HPD_ACTIVE); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - - if (powerState == tmPowerOn) { - /* Yes: Wait for DDC line to settle before reading EDID */ - tmbslHdmiTxSysTimerWait(instance, 500); /* ms */ - - /* Request EDID read */ - errCode = tmbslHdmiTxEdidRequestBlockData(instance, - unitTableTx[instance].pEdidBuffer, - (Int) ((unitTableTx[instance]. - edidBufferSize) >> 7), - (Int) (unitTableTx[instance]. - edidBufferSize)); - - if (errCode != TM_OK) - return; - } - } else { -#ifndef NO_HDCP - if (unitTableTx[instance].hdcpEnable == True) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - /* Switch off HDCP */ - (void)tmdlHdmiTxSetHdcp(instance, False); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } -#endif /* NO_HDCP */ - - /* Set state machine to Unplugged */ - dlHdmiTxSetState(instance, STATE_UNPLUGGED); - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_HPD_INACTIVE) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_HPD_INACTIVE); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - } -} - -/****************************************************************************** - \brief T0 interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleT0(tmInstance_t instance) { -#ifndef NO_HDCP - tmErrorCode_t errCode; - - errCode = tmbslHdmiTxHdcpHandleT0(instance); - - if (errCode != TM_OK) - return; - - tmbslHdmiTxHdcpGetT0FailState(instance, &(hdcpInfoListTx[instance].hdcpErrorState)); - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_HDCP_INACTIVE) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_HDCP_INACTIVE); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - - instanceStatusInfoTx[instance].pColBarState->hdcpColbarChange = False; - instanceStatusInfoTx[instance].pColBarState->hdcpEncryptOrT0 = True; - instanceStatusInfoTx[instance].pColBarState->hdcpSecureOrT0 = True; -#else - (void)instance; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief BCAPS interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleBCAPS(tmInstance_t instance) { -#ifndef NO_HDCP - Bool bCheckRequired; - tmErrorCode_t errCode; - - /* Handle BCAPS interrupt immediately */ - errCode = tmbslHdmiTxHdcpHandleBCAPS(instance); - - if (errCode != TM_OK) - return; - - /* Wait for TDA9984 to read BKSV from B device */ - tmbslHdmiTxSysTimerWait(instance, 10); - - /* Handle BKSV read */ - errCode = tmbslHdmiTxHdcpHandleBKSV(instance, - hdcpInfoListTx[instance].hdcpBksv, &bCheckRequired); - - if (errCode != TM_OK) - return; - - if (bCheckRequired) { - /* check HdcpBksv against a revocation list */ - dlHdmiTxCheckHdcpBksv(instance, hdcpInfoListTx[instance].hdcpBksv, - &(hdcpInfoListTx[instance].bKsvSecure), True); - } else { - /* Result is always secure if no check required */ - hdcpInfoListTx[instance].bKsvSecure = True; - } - - /* Handle BKSV result */ - errCode = tmbslHdmiTxHdcpHandleBKSVResult(instance, hdcpInfoListTx[instance].bKsvSecure); - - if (errCode != TM_OK) - return; - - -#else - (void)instance; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief BSTATUS interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleBSTATUS(tmInstance_t instance) { -#ifndef NO_HDCP - UInt16 bstatus = 0; - - tmbslHdmiTxHdcpHandleBSTATUS(instance, &bstatus); - -#ifdef HDMI_TX_REPEATER_ISR_MODE - gIgnoreNextSha1 = False; -#endif /*HDMI_TX_REPEATER_ISR_MODE */ - - if (((bstatus & HDMITX_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED) > 0) - || ((bstatus & HDMITX_HDCP_BSTATUS_MAX_DEVS_EXCEEDED) > 0)) { - - hdcpInfoListTx[instance].hdcpDeviceDepth = - (UInt8) ((bstatus & HDMITX_HDCP_BSTATUS_CASCADE_DEPTH) >> 8); - - /* The KsvList length is limited by the smaller of the list array - * length and the number of devices returned in BSTATUS */ - hdcpInfoListTx[instance].hdcpKsvDevices = - (UInt8) (bstatus & HDMITX_HDCP_BSTATUS_DEVICE_COUNT); - - if (HDMITX_KSV_LIST_MAX_DEVICES < hdcpInfoListTx[instance].hdcpKsvDevices) { - hdcpInfoListTx[instance].hdcpKsvDevices = HDMITX_KSV_LIST_MAX_DEVICES; - } - - if ((bstatus & HDMITX_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED) > 0) { - hdcpInfoListTx[instance].hdcpMaxCascExceeded = True; - } - - if ((bstatus & HDMITX_HDCP_BSTATUS_MAX_DEVS_EXCEEDED) > 0) { - hdcpInfoListTx[instance].hdcpMaxDevsExceeded = True; - } - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_RX_KEYS_RECEIVED) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_RX_KEYS_RECEIVED); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - } else { - -#ifdef HDMI_TX_REPEATER_ISR_MODE - /* Call SHA_1 otherwise this ISR is missed */ - hdcpInfoListTx[instance].hdcpDeviceDepth = - (UInt8) ((bstatus & HDMITX_HDCP_BSTATUS_CASCADE_DEPTH) >> 8); - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_B_STATUS) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_B_STATUS); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - -#endif /* HDMI_TX_REPEATER_ISR_MODE */ - } - - -#else - (void)instance; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief SHA_1 interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleSHA_1(tmInstance_t instance) { -#ifndef NO_HDCP - tmErrorCode_t errCode; - UInt8 indexKSVList; - -#ifdef HDMI_TX_REPEATER_ISR_MODE - if (gIgnoreNextSha1 == False) { - gIgnoreNextSha1 = True; -#endif /*HDMI_TX_REPEATER_ISR_MODE */ - - errCode = tmbslHdmiTxHdcpHandleSHA_1(instance, - HDMITX_KSV_LIST_MAX_DEVICES, - hdcpInfoListTx[instance].hdcpKsvList, - &(hdcpInfoListTx[instance].hdcpKsvDevices), - &(hdcpInfoListTx[instance].hdcpDeviceDepth)); - if (errCode != TM_OK) - return; - - /* Top level or repeater HDCP mode */ - if (unitTableTx[instance].repeaterEnable == False) { - /* check HdcpKsvList against revocation list */ - - indexKSVList = 0; - while ((indexKSVList < TMDL_HDMITX_KSV_LIST_MAX_DEVICES) && - (indexKSVList < hdcpInfoListTx[instance].hdcpKsvDevices) && - (hdcpInfoListTx[instance].bKsvSecure == True) - ) { - dlHdmiTxCheckHdcpBksv(instance, - &(hdcpInfoListTx[instance]. - hdcpKsvList[indexKSVList * - TMDL_HDMITX_KSV_BYTES_PER_DEVICE]), - &(hdcpInfoListTx[instance].bKsvSecure), - False); - indexKSVList++; - } - } else { - hdcpInfoListTx[instance].bKsvSecure = True; - } - - /* Handle SHA_1 result */ - errCode = tmbslHdmiTxHdcpHandleSHA_1Result(instance, - hdcpInfoListTx[instance].bKsvSecure); - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_RX_KEYS_RECEIVED) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_RX_KEYS_RECEIVED); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - - if (!hdcpInfoListTx[instance].bKsvSecure) { - instanceStatusInfoTx[instance].pColBarState->changeColorBarNow = True; - instanceStatusInfoTx[instance].pColBarState->colorBarOn = True; - dlHdmiTxCheckColorBar(instance); - } -#ifdef HDMI_TX_REPEATER_ISR_MODE - } -#endif /*HDMI_TX_REPEATER_ISR_MODE */ - - -#else - (void)instance; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief PJ interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandlePJ(tmInstance_t instance) { -#ifndef NO_HDCP - tmbslHdmiTxHdcpHandlePJ(instance); -#else - (void)instance; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief R0 interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleR0(tmInstance_t instance) { -#ifndef NO_HDCP - tmErrorCode_t errCode; - tmbslHdmiTxSinkCategory_t category; - - - - if (hdcpInfoListTx[instance].bKsvSecure == True) { - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_HDCP_ACTIVE) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_HDCP_ACTIVE); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - - instanceStatusInfoTx[instance].pColBarState->hdcpSecureOrT0 = False; - } - - - errCode = tmbslHdmiTxHdcpGetSinkCategory(instance, &category); - if (errCode != TM_OK) - return; - - if (category == HDMITX_SINK_CAT_NOT_REPEATER) { - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_RX_KEYS_RECEIVED) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_RX_KEYS_RECEIVED); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - } - - instanceStatusInfoTx[instance].pColBarState->disableColorBarOnR0 = True; - instanceStatusInfoTx[instance].pColBarState->hdcpColbarChange = True; -#else - (void)instance; -#endif /* NO_HDCP */ -} - -/****************************************************************************** - \brief SW_INT interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleSW_INT(tmInstance_t instance) { - DUMMY_ACCESS(instance); -} - -/****************************************************************************** - \brief RX_SENSE interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleRX_SENSE(tmInstance_t instance) { - tmErrorCode_t errCode; - tmbslHdmiTxRxSense_t rxSenseStatus; /* Rx Sense status */ - tmbslHdmiTxHotPlug_t hpdStatus; /* HPD status */ - - errCode = tmbslHdmiTxRxSenseGetStatus(instance, &rxSenseStatus, False); - - if (errCode != TM_OK) - return; - - errCode = tmbslHdmiTxHotPlugGetStatus(instance, &hpdStatus, False); - - if (errCode != TM_OK) - return; - -/* if (hpdStatus == HDMITX_HOTPLUG_ACTIVE) */ -/* { */ - if (rxSenseStatus == HDMITX_RX_SENSE_ACTIVE) { - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_RX_DEVICE_ACTIVE) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_RX_DEVICE_ACTIVE); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - } else if (rxSenseStatus == HDMITX_RX_SENSE_INACTIVE) { - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_RX_DEVICE_INACTIVE) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_RX_DEVICE_INACTIVE); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } -#ifndef NO_HDCP - if (unitTableTx[instance].hdcpEnable == True) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - /* Switch off HDCP */ - (void)tmdlHdmiTxSetHdcp(instance, False); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } -#endif /* NO_HDCP */ - } -/* } */ -} - -/****************************************************************************** - \brief EDID_READ interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleEDID_READ(tmInstance_t instance) { - tmErrorCode_t errCode; - UInt8 edidStatus = TMDL_HDMITX_EDID_NOT_READ; - - /* Get the edid status and read the connected device's EDID */ - - /* Get Edid status */ - errCode = tmbslHdmiTxEdidGetStatus(instance, &edidStatus); - - if (errCode != TM_OK) { - /* Set state machine to Plugged */ - dlHdmiTxSetState(instance, STATE_PLUGGED); - return; - } - - /* Has hot plug changed to Active? */ - if ((edidStatus == TMDL_HDMITX_EDID_READ) || (edidStatus == TMDL_HDMITX_EDID_ERROR_CHK)) { - /* Set state machine to EDID available */ - dlHdmiTxSetState(instance, STATE_EDID_AVAILABLE); - } else { - /* Set state machine to Plugged */ - dlHdmiTxSetState(instance, STATE_PLUGGED); - } - - - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_EDID_RECEIVED) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_EDID_RECEIVED); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } - - -} - -/****************************************************************************** - \brief VS_RPT interrupt callback. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxHandleVS_RPT(tmInstance_t instance) { - if (dlHdmiTxGetEventStatus(instance, TMDL_HDMITX_VS_RPT_RECEIVED) == - TMDL_HDMITX_EVENT_ENABLED) { - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance]); - unitTableTx[instance].pCallback(TMDL_HDMITX_VS_RPT_RECEIVED); - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance]); - } -} - -/****************************************************************************** - \brief dlHdmiTxConvertDTDtoCEA_640HAP . - - \param pDTDescriptors DTD to convert. - pictureAspectRatio aspect ratio of DTD - formatInterlaced DTD Interlaced or progressif - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_640HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors) { - tmdlHdmiTxVidFmt_t codeCEA; - - switch (pDTDescriptors->vActiveLines) { - case 480: - codeCEA = TMDL_HDMITX_VFMT_01_640x480p_60Hz; - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - - return codeCEA; - -} - -/****************************************************************************** - \brief dlHdmiTxConvertDTDtoCEA_720HAP . - - \param pDTDescriptors DTD to convert. - pictureAspectRatio aspect ratio of DTD - formatInterlaced DTD Interlaced or progressif - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_720HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, - tmdlHdmiTxPictAspectRatio_t pictureAspectRatio) { - tmdlHdmiTxVidFmt_t codeCEA; - - switch (pDTDescriptors->vActiveLines) { - case 480: - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_02_720x480p_60Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_03_720x480p_60Hz; - } - break; - - case 576: - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_17_720x576p_50Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_18_720x576p_50Hz; - } - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - - return codeCEA; - -} - -/****************************************************************************** - \brief dlHdmiTxConvertDTDtoCEA_1280HAP . - - \param pDTDescriptors DTD to convert. - pictureAspectRatio aspect ratio of DTD - formatInterlaced DTD Interlaced or progressif - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_1280HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors) { - tmdlHdmiTxVidFmt_t codeCEA; - - switch (pDTDescriptors->vActiveLines) { - case 720: - switch (pDTDescriptors->hBlankPixels) { - case 370: - codeCEA = TMDL_HDMITX_VFMT_04_1280x720p_60Hz; - break; - - case 700: - codeCEA = TMDL_HDMITX_VFMT_19_1280x720p_50Hz; - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - - - return codeCEA; -} - -/****************************************************************************** - \brief dlHdmiTxConvertDTDtoCEA_1920HAP . - - \param pDTDescriptors DTD to convert. - pictureAspectRatio aspect ratio of DTD - formatInterlaced DTD Interlaced or progressif - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_1920HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, Bool formatInterlaced) { - tmdlHdmiTxVidFmt_t codeCEA; - - switch (pDTDescriptors->hBlankPixels) { - case 280: - if (formatInterlaced) { - codeCEA = TMDL_HDMITX_VFMT_05_1920x1080i_60Hz; - } else { - if (pDTDescriptors->pixelClock == 14850) { - codeCEA = TMDL_HDMITX_VFMT_16_1920x1080p_60Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_34_1920x1080p_30Hz; - } - } - break; - - case 720: - if (formatInterlaced) { - codeCEA = TMDL_HDMITX_VFMT_20_1920x1080i_50Hz; - } else { - switch (pDTDescriptors->pixelClock) { - case 14850: - codeCEA = TMDL_HDMITX_VFMT_31_1920x1080p_50Hz; - break; - - case 7425: - codeCEA = TMDL_HDMITX_VFMT_33_1920x1080p_25Hz; - break; - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - } - break; - - case 830: - codeCEA = TMDL_HDMITX_VFMT_32_1920x1080p_24Hz; - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - - - return codeCEA; -} - -/****************************************************************************** - \brief dlHdmiTxConvertDTDtoCEA_1440HAP . - - \param pDTDescriptors DTD to convert. - pictureAspectRatio aspect ratio of DTD - formatInterlaced DTD Interlaced or progressif - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_1440HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, - tmdlHdmiTxPictAspectRatio_t pictureAspectRatio, Bool formatInterlaced) { - tmdlHdmiTxVidFmt_t codeCEA; - - switch (pDTDescriptors->vActiveLines) { - case 240: - if (formatInterlaced) { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_06_720x480i_60Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_07_720x480i_60Hz; - } - } else { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_08_720x240p_60Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_09_720x240p_60Hz; - } - } - break; - - case 288: - if (formatInterlaced) { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_21_720x576i_50Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_22_720x576i_50Hz; - } - } else { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_23_720x288p_50Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_24_720x288p_50Hz; - } - } - break; - - case 480: - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_14_1440x480p_60Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_15_1440x480p_60Hz; - } - break; - - case 576: - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_29_1440x576p_50Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_30_1440x576p_50Hz; - } - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - - return codeCEA; -} - -/****************************************************************************** - \brief dlHdmiTxConvertDTDtoCEA_2880HAP . - - \param pDTDescriptors DTD to convert. - pictureAspectRatio aspect ratio of DTD - formatInterlaced DTD Interlaced or progressif - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxVidFmt_t dlHdmiTxConvertDTDtoCEA_2880HAP - (tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, - tmdlHdmiTxPictAspectRatio_t pictureAspectRatio, Bool formatInterlaced) { - tmdlHdmiTxVidFmt_t codeCEA; - - switch (pDTDescriptors->vActiveLines) { - case 240: - if (formatInterlaced) { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_10_720x480i_60Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_11_720x480i_60Hz; - } - } else { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_12_720x240p_60Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_13_720x240p_60Hz; - } - } - break; - - case 288: - if (formatInterlaced) { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_25_720x576i_50Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_26_720x576i_50Hz; - } - } else { - if (pictureAspectRatio == TMDL_HDMITX_P_ASPECT_RATIO_4_3) { - codeCEA = TMDL_HDMITX_VFMT_27_720x288p_50Hz; - } else { - codeCEA = TMDL_HDMITX_VFMT_28_720x288p_50Hz; - } - } - break; - - default: - /* Not a valid format */ - codeCEA = TMDL_HDMITX_VFMT_NULL; - break; - } - - return codeCEA; -} - -/****************************************************************************** - \brief EdidGetDTD . - - \param . - - \return NA. - -******************************************************************************/ -tmErrorCode_t dlHdmiTxEdidGetDTD - (tmInstance_t instance, - tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, UInt8 maxDTDesc, UInt8 *pWrittenDTDesc) { - tmErrorCode_t errCode; - - /* Check the current state */ - RETIF(dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, TMDL_ERR_DLHDMITX_INVALID_STATE) - - /* Get detailled descriptors from EDID, return TMDL_ERR_DLHDMITX_NO_RESOURCES if EDID are not read */ - RETIF((errCode = - tmbslHdmiTxEdidGetDetailedTimingDescriptors(instance, - (tmbslHdmiTxEdidDtd_t *) - pDTDescriptors, maxDTDesc, - pWrittenDTDesc)) != TM_OK, errCode); - - return TM_OK; -} - - -/****************************************************************************** - \brief Command processing task, dedicated to unit/instance 0. - - \param NA. - - \return NA. - -******************************************************************************/ - -#ifndef TMFL_NO_RTOS -static void CommandTaskUnit0(void) -{ - UInt8 command; - Bool loop = True; /* Just to avoid compiler warning */ - tmErrorCode_t err = TM_OK; - - while (loop) { - tmdlHdmiTxIWQueueReceive(unitTableTx[0].queueHandle, &command); - - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[0]); - - /* Clear T0 flag before polling for interrupts */ - instanceStatusInfoTx[0].pColBarState->hdcpSecureOrT0 = False; - - if (gI2CDebugAccessesEnabled == True) { - - err = tmbslHdmiTxHwHandleInterrupt(0); - - if ((err == TMBSL_ERR_HDMI_I2C_WRITE) || (err == TMBSL_ERR_HDMI_I2C_READ)) { - - unitTableTx[0].pCallback(TMDL_HDMITX_DEBUG_EVENT_1); - } - - } - - /* (gI2CDebugAccessesEnabled == True) */ - /* Enable interrupts for Tx (interrupts are disabled in the HandleInterrupt function) */ - tmdlHdmiTxIWEnableInterrupts(TMDL_HDMI_IW_TX_1); - - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[0]); - }; -} -#endif /* TMFL_NO_RTOS */ - -/****************************************************************************** - \brief Hdcp check task, dedicated to unit/instance 0. - - \param NA. - - \return NA. - -******************************************************************************/ -#ifndef TMFL_NO_RTOS -static void HdcpTaskUnit0(void) -{ - Bool loop = True; /* Just to avoid compiler warning */ - Bool featureSupported; - - tmbslHdmiTxHwGetCapabilities(0, HDMITX_FEATURE_HW_HDCP, &featureSupported); - -#ifndef NO_HDCP - while (loop) { - (void)tmdlHdmiTxIWWait(35); - - /* Take the sempahore */ - (void)tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[0]); - - if (gI2CDebugAccessesEnabled == True) { - - dlHdmiTxCheckColorBar(0); - dlHdmiTxCheckHdcpColorBar(0); - - if (featureSupported == True) { - tmbslHdmiTxHdcpCheck(0, 35, - (tmbslHdmiTxHdcpCheck_t *) & - (hdcpInfoListTx[0].hdcpCheckState)); - } - - } - - /* gI2CDebugAccessesEnabled == True */ - /* Release the sempahore */ - (void)tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[0]); - }; -#else - (void)loop; -#endif /* NO_HDCP */ -} -#endif /* TMFL_NO_RTOS */ - -#ifndef NO_HDCP -/****************************************************************************** - \brief Check hdcp state to manage color bar. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxCheckHdcpColorBar(tmInstance_t instance) { - /* Use HDCP check result to control HDCP colour bars */ - if ((instanceStatusInfoTx[instance].pColBarState->disableColorBarOnR0 == True) - && (instanceStatusInfoTx[instance].pColBarState->hdcpColbarChange == True) - && (instanceStatusInfoTx[instance].pColBarState->hdcpSecureOrT0 == False)) { - /* Remove test pattern once if Authenticated with no error interrupts */ - if (instanceStatusInfoTx[instance].pColBarState->colorBarOn != False) { - instanceStatusInfoTx[instance].pColBarState->colorBarOn = False; - instanceStatusInfoTx[instance].pColBarState->changeColorBarNow = True; - - if (unitTableTx[instance].simplayHd == True) { - - /* Mute or Un-mute the audio output */ - tmbslHdmiTxAudioOutSetMute(instance, - (tmbslHdmiTxaMute_t) HDMITX_AMUTE_OFF); - - /* Store current audio mute status */ - instanceStatusInfoTx[instance].pAudioInfo->audioMuteState = False; - } - - - } - /* Reset state flags */ - instanceStatusInfoTx[instance].pColBarState->hdcpColbarChange = False; - instanceStatusInfoTx[instance].pColBarState->hdcpSecureOrT0 = True; - -#ifdef TMFL_TDA19989 - instanceStatusInfoTx[instance].pColBarState->disableColorBarOnR0 = False; -#endif /* TMFL_TDA19989 */ - - - - } - - if ((instanceStatusInfoTx[instance].pColBarState->hdcpEncryptOrT0 == True) - && (instanceStatusInfoTx[instance].pColBarState->inOutFirstSetDone == True)) { - /* Set test pattern once if not Authenticated, to mask HDCP failure */ - if (instanceStatusInfoTx[instance].pColBarState->colorBarOn != True) { - instanceStatusInfoTx[instance].pColBarState->colorBarOn = True; - instanceStatusInfoTx[instance].pColBarState->changeColorBarNow = True; - - if (unitTableTx[instance].simplayHd == True) { - - /* Mute or Un-mute the audio output */ - tmbslHdmiTxAudioOutSetMute(instance, - (tmbslHdmiTxaMute_t) HDMITX_AMUTE_ON); - - /* Store current audio mute status */ - instanceStatusInfoTx[instance].pAudioInfo->audioMuteState = True; - } - - } - /* Reset state flag */ - instanceStatusInfoTx[instance].pColBarState->hdcpEncryptOrT0 = False; - } -} -#endif - -#ifndef NO_HDCP -/****************************************************************************** - \brief Show color bars or restore the last video format. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxCheckColorBar(tmInstance_t instance) { - if ((instanceStatusInfoTx[instance].pColBarState->inOutFirstSetDone == True) - && (instanceStatusInfoTx[instance].pColBarState->changeColorBarNow == True)) { - instanceStatusInfoTx[instance].pColBarState->changeColorBarNow = False; - - if (unitTableTx[instance].simplayHd == True) { - if (instanceStatusInfoTx[instance].pColBarState->colorBarOn == True) { - /* Set service mode colour bar on/off (also used as HDCP logo pattern) */ - (void)dlHdmiTxSetTestPatternOn(instance, - instanceStatusInfoTx[instance]. - pVideoInfo->videoOutConfig.format, - instanceStatusInfoTx[instance]. - pVideoInfo->videoOutConfig.mode, - gtmdlHdmiTxDriverConfigTable - [instance].pattern); - } else { - /* Restore last output format and mode */ - (void)dlHdmiTxSetTestPatternOff(instance, - instanceStatusInfoTx[instance]. - pVideoInfo->videoOutConfig.format, - instanceStatusInfoTx[instance]. - pVideoInfo->videoOutConfig.mode); - } - } - } -} -#endif - -#ifndef NO_HDCP -/****************************************************************************** - \brief Get hdcp seed. - - \param instance Instance identifier. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxFindHdcpSeed(tmInstance_t instance) { -#if HDCP_SEED_DEFAULT == HDCP_SEED_NULL - UInt8 otp[3]; -#endif - - /* If no seed is coded in this file then find it somewhere else */ -#if HDCP_SEED_DEFAULT == HDCP_SEED_NULL - /* See if a seed table has been programmed in flash */ - if (kSeedTable[0][0] != 0xFFFF) { - /* Read OTP LSB at address 0x00 and try to match in flash table */ - if ((tmbslHdmiTxHdcpGetOtp(instance, 0x00, otp)) == TM_OK) { - int i; - for (i = 0; i < SEED_TABLE_LEN; i++) { - if (kSeedTable[i][0] == otp[2]) { /* OTP_DATA_LSB */ - /* Found seed! */ - gtmdlHdmiTxDriverConfigTable[instance].keySeed = - kSeedTable[i][1]; - break; - } - } - } - } -#endif /* HDCP_SEED_DEFAULT != HDCP_SEED_NULL */ - - /* Initialise the TDA9984 HDCP keys */ - if (gtmdlHdmiTxDriverConfigTable[instance].keySeed != HDCP_SEED_NULL) { - /* Initialise the HDMI Transmitter HDCP keys */ - tmbslHdmiTxHdcpDownloadKeys(instance, - gtmdlHdmiTxDriverConfigTable[instance].keySeed, - HDMITX_HDCP_DECRYPT_ENABLE); - } -} -#endif /* NO_HDCP */ - -/****************************************************************************** - \brief Set the state of the state machine. - - \param instance Instance identifier. - \param state State of the state machine. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxSetState(tmInstance_t instance, tmdlHdmiTxDriverState_t state) { - /* Set the state */ - unitTableTx[instance].state = state; -} - -/****************************************************************************** - \brief Get the state of the state machine. - - \param instance Instance identifier. - - \return tmdlHdmiTxDriverState_t Current State of the state machine. - -******************************************************************************/ -tmdlHdmiTxDriverState_t dlHdmiTxGetState(tmInstance_t instance) { - tmdlHdmiTxDriverState_t state; - - /* Get the state */ - state = unitTableTx[instance].state; - - return (state); -} - -/****************************************************************************** - \brief Get the state of the event (enabled or disabled). - - \param instance Instance identifier. - \param event Event to give the state. - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxEventStatus_t dlHdmiTxGetEventStatus - (tmInstance_t instance, tmdlHdmiTxEvent_t event) { - tmdlHdmiTxEventStatus_t eventStatus; - - /* Get the event status */ - eventStatus = instanceStatusInfoTx[instance].pEventState[event].status; - - return (eventStatus); -} - -/****************************************************************************** - \brief Caculation of aspect ratio. - - \param HImageSize Horizontal image size. - \param VImageSize Vertical image size. - - \return NA. - -******************************************************************************/ -static tmdlHdmiTxPictAspectRatio_t dlHdmiTxCalcAspectRatio(UInt16 HImageSize, UInt16 VImageSize) -{ - tmdlHdmiTxPictAspectRatio_t pictureAspectRatio; - UInt16 calcPictureAspectRatio; - - /* Define picture Aspect Ratio */ - /* 16/9 = 1.77777 so the result approach is 2 */ - /* 4/3 = 1.33333 so the result approach is 1 */ - /* operation : */ - /* ImageSize + (vImageSize/2) */ - /* -------------------------- > vImageSize ->True 16/9 False 4/3 */ - /* 2 */ - - calcPictureAspectRatio = ((UInt16) (HImageSize + ((VImageSize) >> 1))) >> 1; - - if (calcPictureAspectRatio > VImageSize) { - pictureAspectRatio = TMDL_HDMITX_P_ASPECT_RATIO_16_9; - } else { - pictureAspectRatio = TMDL_HDMITX_P_ASPECT_RATIO_4_3; - } - - return pictureAspectRatio; - -} - -#ifndef NO_HDCP -/****************************************************************************** - \brief dlHdmiTxCheckHdcpBksv . - - \param pHdcpBksvTested ksv To test. - \param pbBksvSecure Test result. - \param bBigEndian ksv provide by hardware are in little or big endian. - - \return NA. - -******************************************************************************/ -static void dlHdmiTxCheckHdcpBksv - (tmInstance_t instance, UInt8 *pHdcpBksvTested, Bool *pbBksvSecure, Bool bBigEndian) { - - UInt32 NbInRevocationList; - - NbInRevocationList = 0; - - /* CBE: force secure, otherwise we will not look at anything */ - *pbBksvSecure = True; - - if ((unitTableTx[instance].revocationList.pList != Null) - && (unitTableTx[instance].revocationList.length > 0)) { - while ((*pbBksvSecure == True) - && (NbInRevocationList < unitTableTx[instance].revocationList.length)) { - if (bBigEndian) { - if ((pHdcpBksvTested[0] == - unitTableTx[instance].revocationList.pList[NbInRevocationList * - HDMITX_KSV_BYTES_PER_DEVICE]) - && (pHdcpBksvTested[1] == - unitTableTx[instance].revocationList.pList[1 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - && (pHdcpBksvTested[2] == - unitTableTx[instance].revocationList.pList[2 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - && (pHdcpBksvTested[3] == - unitTableTx[instance].revocationList.pList[3 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - && (pHdcpBksvTested[4] == - unitTableTx[instance].revocationList.pList[4 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - ) { - *pbBksvSecure = False; - } - } else { - if ((pHdcpBksvTested[4] == - unitTableTx[instance].revocationList.pList[NbInRevocationList * - HDMITX_KSV_BYTES_PER_DEVICE]) - && (pHdcpBksvTested[3] == - unitTableTx[instance].revocationList.pList[1 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - && (pHdcpBksvTested[2] == - unitTableTx[instance].revocationList.pList[2 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - && (pHdcpBksvTested[1] == - unitTableTx[instance].revocationList.pList[3 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - && (pHdcpBksvTested[0] == - unitTableTx[instance].revocationList.pList[4 + - (NbInRevocationList - * - HDMITX_KSV_BYTES_PER_DEVICE)]) - ) { - *pbBksvSecure = False; - } - } - NbInRevocationList++; - } - - } - - -} -#endif - -/****************************************************************************** - \brief dlHdmiTxCalcVidFmtIndex. - - \param vidFmt video format. - - \return table index. - -******************************************************************************/ -static tmdlHdmiTxVidFmt_t dlHdmiTxCalcVidFmtIndex(tmdlHdmiTxVidFmt_t vidFmt) -{ - tmdlHdmiTxVidFmt_t vidFmtIndex = vidFmt; - - /* Hanlde VIC or table index discontinuity */ - if ((vidFmt >= TMDL_HDMITX_VFMT_60_1280x720p_24Hz) - && (vidFmt <= TMDL_HDMITX_VFMT_62_1280x720p_30Hz)) { - vidFmtIndex = - (tmdlHdmiTxVidFmt_t) (TMDL_HDMITX_VFMT_INDEX_60_1280x720p_24Hz + - (vidFmt - TMDL_HDMITX_VFMT_60_1280x720p_24Hz)); - } -#ifdef FORMAT_PC - else if (vidFmt >= TMDL_HDMITX_VFMT_PC_MIN) { - vidFmtIndex = - (tmdlHdmiTxVidFmt_t) (TMDL_HDMITX_VFMT_TV_NUM + - (vidFmt - TMDL_HDMITX_VFMT_PC_MIN)); - } -#endif /* FORMAT_PC */ - return (vidFmtIndex); -} - - -tmErrorCode_t tmdlHdmiTxDebugEnableI2CAccesses(tmInstance_t instance, Bool enableI2C) -{ - tmErrorCode_t errCode = TM_OK; - - /* Check if instance number is in range */ - if ((instance < 0) || (instance >= MAX_UNITS)) { - errCode = TMDL_ERR_DLHDMITX_BAD_INSTANCE; - return errCode; - } - - if (enableI2C == True) { - errCode = tmbslDebugWriteFakeRegPage(instance); - gI2CDebugAccessesEnabled = True; - } else { - gI2CDebugAccessesEnabled = False; - } - - - return errCode; - -} /* tmdlHdmiTxDebugManageI2CAccesses */ - -/*****************************************************************************/ -/** - \brief Retreives current HDCP link status. This function is typically used - when an "HDCP INACTIVE" event is received to know why HDCP - is INACTIVE. - - \param instance Instance identifier. - \param pHdcpStatus Pointer to the enum describing the status. - \param pRawStatus Pointer to the byte with the raw error code from HW. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMDL_ERR_DLHDMITX_NOT_INITIALIZED: the transmitter is not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetHdcpFailStatus - (tmInstance_t instance, tmdlHdmiTxHdcpStatus_t *pHdcpStatus, UInt8 *pRawStatus) { - tmErrorCode_t errCode = TM_OK; - -#ifndef NO_HDCP - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - RETIF(pHdcpStatus == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - RETIF(pRawStatus == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - * pRawStatus = hdcpInfoListTx[instance].hdcpErrorState; - - switch (hdcpInfoListTx[instance].hdcpErrorState) { - - case 0: - *pHdcpStatus = TMDL_HDMITX_HDCP_OK; - break; - - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - *pHdcpStatus = TMDL_HDMITX_HDCP_BKSV_RCV_FAIL; - break; - - case 0x08: - *pHdcpStatus = TMDL_HDMITX_HDCP_BKSV_CHECK_FAIL; - break; - - case 0x0C: - *pHdcpStatus = TMDL_HDMITX_HDCP_BCAPS_RCV_FAIL; - break; - - case 0x0F: - case 0x10: - case 0x11: - *pHdcpStatus = TMDL_HDMITX_HDCP_AKSV_SEND_FAIL; - break; - - case 0x23: - case 0x24: - case 0x25: - *pHdcpStatus = TMDL_HDMITX_HDCP_R0_RCV_FAIL; - break; - - case 0x26: - *pHdcpStatus = TMDL_HDMITX_HDCP_R0_CHECK_FAIL; - break; - - case 0x27: - *pHdcpStatus = TMDL_HDMITX_HDCP_BKSV_NOT_SECURE; - break; - - case 0x2B: - case 0x2C: - case 0x2D: - *pHdcpStatus = TMDL_HDMITX_HDCP_RI_RCV_FAIL; - break; - - case 0x77: - case 0x78: - case 0x79: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_RI_RCV_FAIL; - break; - - case 0x2E: - *pHdcpStatus = TMDL_HDMITX_HDCP_RI_CHECK_FAIL; - break; - - case 0x7A: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_RI_CHECK_FAIL; - break; - - case 0x66: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_BCAPS_RCV_FAIL; - break; - - case 0x67: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_BCAPS_READY_TIMEOUT; - break; - - case 0x6A: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_V_RCV_FAIL; - break; - - case 0x6C: - case 0x6D: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_BSTATUS_RCV_FAIL; - break; - - case 0x6F: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_KSVLIST_RCV_FAIL; - break; - - case 0x74: - *pHdcpStatus = TMDL_HDMITX_HDCP_RPT_KSVLIST_NOT_SECURE; - break; - - default: - *pHdcpStatus = TMDL_HDMITX_HDCP_UNKNOWN_STATUS; - break; - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) -#else - (void)instance; /* Remove compiler warning */ -#endif /* NO_HDCP */ - - return errCode; -} - - -tmErrorCode_t tmdlHdmiTxGetEdidLatencyInfo - (tmInstance_t instance, tmdlHdmiTxEdidLatency_t *pLatency) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check pointer is Null */ - RETIF(pLatency == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - tmbslHdmiTxEdidGetLatencyInfo(instance, - (tmbslHdmiTxEdidLatency_t *) pLatency)) != - TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} /* tmdlHdmiTxGetEdidLatencyInfo */ - -/****************************************************************************** - \brief Retrieves additional data from receiver's EDID VSDB. This function - parses the EDID of Rx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pExtraVsdbData Pointer to the structure of additional VSDB data - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxGetEdidExtraVsdbData - (tmInstance_t instance, tmdlHdmiTxEdidExtraVsdbData_t **pExtraVsdbData) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - /* Check pointer is Null */ - RETIF(pExtraVsdbData == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Check the current state */ - RETIF_SEM(dlHdmiTxItSemaphore[instance], - dlHdmiTxGetState(instance) != STATE_EDID_AVAILABLE, - TMDL_ERR_DLHDMITX_INVALID_STATE) - - RETIF_SEM(dlHdmiTxItSemaphore[instance], - (errCode = - tmbslHdmiTxEdidGetExtraVsdbData(instance, - (tmbslHdmiTxEdidExtraVsdbData_t **) - pExtraVsdbData)) != TM_OK, errCode) - - /* Release the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; -} /* tmdlHdmiTxGetEdidExtraVsdbData */ - - -tmErrorCode_t tmdlHdmiTxGetHPDStatus(tmInstance_t instance, tmdlHdmiTxHotPlug_t *pHPDStatus) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - RETIF(pHPDStatus == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Get the HPD status from BSL driver */ - errCode = - tmbslHdmiTxHotPlugGetStatus(instance, (tmbslHdmiTxHotPlug_t *) pHPDStatus, True); - - if (errCode == TM_OK) { - /* do nothing */ - } else { - *pHPDStatus = TMDL_HDMITX_HOTPLUG_INVALID; - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; - -} /* tmdlHdmiTxGetHPDStatus */ - - - -tmErrorCode_t tmdlHdmiTxGetRXSenseStatus - (tmInstance_t instance, tmdlHdmiTxRxSense_t *pRXSenseStatus) { - tmErrorCode_t errCode; - - /* Check if instance number is in range */ - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - RETIF(pRXSenseStatus == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - - /* Take the sempahore */ - RETIF((errCode = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - /* Get the RXS sense status from BSL driver */ - errCode = - tmbslHdmiTxRxSenseGetStatus(instance, (tmbslHdmiTxRxSense_t *) pRXSenseStatus, True); - - if (errCode == TM_OK) { - /* do nothing */ - } else { - *pRXSenseStatus = TMDL_HDMITX_RX_SENSE_INVALID; - } - - /* Release the sempahore */ - RETIF((errCode = tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCode) - - return TM_OK; - -} /* tmdlHdmiTxGetRXSenseStatus */ - - -/****************************************************************************** - \brief Mute or unmute the TMDS outputs. - - \param instance Instance identifier. - \param muteTmdsOut Mute or unmute indication. - - \return NA. - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxTmdsSetOutputsMute(tmInstance_t instance, Bool muteTmdsOut) { - tmErrorCode_t errCode; - tmErrorCode_t errCodeSem; - tmbslHdmiTxTmdsOut_t tmdsOut; - - RETIF((instance < 0) || (instance >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_INSTANCE) - - if (muteTmdsOut) - tmdsOut = HDMITX_TMDSOUT_FORCED0; /* forced 0 outputs */ - else - tmdsOut = HDMITX_TMDSOUT_NORMAL; /* normal outputs */ - - /* Take the sempahore */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreP(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) - - errCode = tmbslHdmiTxTmdsSetOutputs(instance, tmdsOut); - - /* Release the sempahore */ - RETIF((errCodeSem = - tmdlHdmiTxIWSemaphoreV(dlHdmiTxItSemaphore[instance])) != TM_OK, errCodeSem) - - - return errCode; -} - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx.h deleted file mode 100644 index 436a4d63db7..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (C) 2007 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx.h - * - * \version $Revision: 1 $ - * - * \date $Date: 02/08/07 08:32 $ - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * HDMI Tx Driver - tmdlHdmiTx - SCS.doc - * - * \section info Change Information - * - * \verbatim - - $History: tmdlHdmiTx.h $ - * - * ***************** Version 13 ***************** - * User: Demoment Date: 02/08/07 Time: 08:32 - * Updated in $/Source/tmdlHdmiTx/inc - * initial version - * - - \endverbatim - * -*/ - -#ifndef TMDLHDMITX_H -#define TMDLHDMITX_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ -#include "tmNxCompId.h" -#include "tmdlHdmiTx_Types.h" -#include "tmdlHdmiTx_Functions.h" - - -#endif /* TMDLHDMITX_H */ - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_Functions.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_Functions.h deleted file mode 100644 index 085755c514a..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_Functions.h +++ /dev/null @@ -1,1598 +0,0 @@ -/** - * Copyright (C) 2007 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx_Functions.h - * - * \version $Revision: 1 $ - * - * \date $Date: 02/08/07 8:32 $ - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * HDMI Tx Driver - tmdlHdmiTx - SCS.doc - * - * \section info Change Information - * - * \verbatim - - $History: tmdlHdmiTx_Functions.h $ - * - * ***************** Version 1 ***************** - * User: Demoment Date: 02/08/07 Time: 8:32 - * Updated in $/Source/tmdlHdmiTx/inc - * initial version - * - - \endverbatim - * -*/ - -#ifndef TMDLHDMITX_FUNCTIONS_H -#define TMDLHDMITX_FUNCTIONS_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#include "tmNxTypes.h" -#include "tmdlHdmiTx_Types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - -/*****************************************************************************/ -/** - \brief Get the software version of the driver. - - \param pSWVersion Pointer to the version structure. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetSWVersion(tmSWVersion_t *pSWVersion); - -/*****************************************************************************/ -/** - \brief Get the number of available HDMI transmitters devices in the system. - A unit directly represents a physical device. - - \param pUnitCount Pointer to the number of available units. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetNumberOfUnits(UInt32 *pUnitCount); - -/*****************************************************************************/ -/** - \brief Get the capabilities of unit 0. Capabilities are stored into a - dedicated structure and are directly read from the HW device. - - \param pCapabilities Pointer to the capabilities structure. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetCapabilities(tmdlHdmiTxCapabilities_t *pCapabilities); - -/*****************************************************************************/ -/** - \brief Get the capabilities of a specific unit. Capabilities are stored - into a dedicated structure and are directly read from the HW - device. - - \param unit Unit to be probed. - \param pCapabilities Pointer to the capabilities structure. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetCapabilitiesM - (tmUnitSelect_t unit, tmdlHdmiTxCapabilities_t *pCapabilities); - -/*****************************************************************************/ -/** - \brief Open unit 0 of HdmiTx driver and provides the instance number to - the caller. Note that one unit of HdmiTx represents one physical - HDMI transmitter and that only one instance per unit can be opened. - - \param pInstance Pointer to the variable that will receive the instance - identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the transmitter instance is not initialised - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_INIT_FAILED: the unit instance is already - initialised or something wrong happened at lower level. - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: the unit is not initialized - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_INIT_FAILED: the unit instance is already - initialised - - TMBSL_ERR_HDMI_COMPATIBILITY: the driver is not compatiable - with the internal device version code - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxOpen(tmInstance_t *pInstance); - -/*****************************************************************************/ -/** - \brief Open a specific unit of HdmiTx driver and provides the instance - number to the caller. Note that one unit of HdmiTx represents one - physical HDMI transmitter and that only one instance per unit can be - opened. This function switches driver's state machine to - "initialized" state. - - \param pInstance Pointer to the structure that will receive the instance - identifier. - \param unit Unit number to be opened. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the transmitter instance is not initialised - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_INIT_FAILED: the unit instance is already - initialised or something wrong happened at lower level. - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: the unit is not initialized - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out - of range - - TMBSL_ERR_HDMI_INIT_FAILED: the unit instance is already - initialised - - TMBSL_ERR_HDMI_COMPATIBILITY: the driver is not compatiable - with the internal device version code - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxOpenM(tmInstance_t *pInstance, tmUnitSelect_t unit); - -/*****************************************************************************/ -/** - \brief Close an instance of HdmiTx driver. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxClose(tmInstance_t instance); - -/*****************************************************************************/ -/** - \brief Set the power state of an instance of the HDMI transmitter. - - \param instance Instance identifier. - \param powerState Power state to set. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetPowerState(tmInstance_t instance, tmPowerState_t powerState); - -/*****************************************************************************/ -/** - \brief Get the power state of an instance of the HDMI transmitter. - - \param instance Instance identifier. - \param pPowerState Pointer to the power state. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetPowerState(tmInstance_t instance, tmPowerState_t *pPowerState); - -/*****************************************************************************/ -/** - \brief Set the configuration of instance attributes. This function is - required by DVP architecture rules but actually does nothing in this - driver - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxInstanceConfig(tmInstance_t instance); - -/*****************************************************************************/ -/** - \brief Setup the instance with its configuration parameters. This function - allows basic instance configuration like enabling HDCP, choosing - HDCP encryption mode or enabling HDCP repeater mode. - - \param instance Instance identifier. - \param pSetupInfo Pointer to the structure containing all setup parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxInstanceSetup - (tmInstance_t instance, tmdlHdmiTxInstanceSetupInfo_t *pSetupInfo); - -/*****************************************************************************/ -/** - \brief Get instance setup parameters. - - \param instance Instance identifier. - \param pSetupInfo Pointer to the structure that will receive setup - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetInstanceSetup - (tmInstance_t instance, tmdlHdmiTxInstanceSetupInfo_t *pSetupInfo); - -/*****************************************************************************/ -/** - \brief Make device library handle an incoming interrupt. This function is - used by application to tell the device library that the hardware - sent an interrupt. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_FULL: the queue is full - - ******************************************************************************/ - tmErrorCode_t tmdlHdmiTxHandleInterrupt(tmInstance_t instance); - -/*****************************************************************************/ -/** - \brief Register event callbacks. Only one callback is registered through - this API. This callback will received the type of event that - occured throug a dedicated parameter and will be called as many - times as there is pending events. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param pCallback Pointer to the callback function that will handle events - from the devlib. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxRegisterCallbacks - (tmInstance_t instance, ptmdlHdmiTxCallback_t pCallback); - -/*****************************************************************************/ -/** - \brief This function allows enabling a specific event. By default, all - events are disabled, except input lock. - - \param instance Instance identifier. - \param event Event to enable. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxEnableEvent(tmInstance_t instance, tmdlHdmiTxEvent_t event); - -/*****************************************************************************/ -/** - \brief This function allows disabling a specific event. By default, all - events are disabled, except input lock. - - \param instance Instance identifier. - \param event Event to disable. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxDisableEvent(tmInstance_t instance, tmdlHdmiTxEvent_t event); - -/*****************************************************************************/ -/** - \brief Get specifications of a given video format. Application can use - this function to retreives all specifications (frequencies, - resolution, etc.) of a given IA/CEA 861-D video format. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param resolutionID ID of the resolution to retrieve specs from. - \param pResolutionSpecs Pointer to the structure receiving specs. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetVideoFormatSpecs - (tmInstance_t instance, - tmdlHdmiTxVidFmt_t resolutionID, tmdlHdmiTxVidFmtSpecs_t *pResolutionSpecs); - -/*****************************************************************************/ -/** - \brief Configures all input and output parameters : format, modes, rates, - etc. This is the main configuration function of the driver. Here - are transmitted all crucial input and output parameters of the - device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param videoInputConfig Configuration of the input video. - \param videoOutputConfig Configuration of the output video. - \param audioInputConfig Configuration of the input audio. - \param sinkType Type of sink connected to the output of the Tx. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetInputOutput - (tmInstance_t instance, - tmdlHdmiTxVideoInConfig_t videoInputConfig, - tmdlHdmiTxVideoOutConfig_t videoOutputConfig, - tmdlHdmiTxAudioInConfig_t audioInputConfig, tmdlHdmiTxSinkType_t sinkType); - -/*****************************************************************************/ -/** - \brief Configures audio input parameters : format, rate, etc. - This function is similar to tmdlHdmiTxSetInputOutput except that - video is not reconfigured. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param audioInputConfig Configuration of the input audio. - \param sinkType Type of sink connected to the output of the Tx. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetAudioInput - (tmInstance_t instance, - tmdlHdmiTxAudioInConfig_t audioInputConfig, tmdlHdmiTxSinkType_t sinkType); - -/*****************************************************************************/ -/** - \brief Defines the content of AVI infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pAviIfData Pointer to the structure containing AVI infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetVideoInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxAviIfData_t *pAviIfData); - -/*****************************************************************************/ -/** - \brief Defines the content of AUD infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pAudIfData Pointer to the structure containing AUD infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetAudioInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxAudIfData_t *pAudIfData); - -/*****************************************************************************/ -/** - \brief Defines the content of the audio content protection packet to be - sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pAcpPktData Pointer to the structure containing ACP infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetACPPacket - (tmInstance_t instance, Bool enable, tmdlHdmiTxAcpPktData_t *pAcpPktData); - -/*****************************************************************************/ -/** - \brief Defines the content of the General Control packet to be sent by Tx - device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pGcpPktData Pointer to the structure containing GCP packet parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetGeneralControlPacket - (tmInstance_t instance, Bool enable, tmdlHdmiTxGcpPktData_t *pGcpPktData); - -/*****************************************************************************/ -/** - \brief Defines the content of ISRC1 packet to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pIsrc1PktData Pointer to the structure containing GCP packet parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetISRC1Packet - (tmInstance_t instance, Bool enable, tmdlHdmiTxIsrc1PktData_t *pIsrc1PktData); - -/*****************************************************************************/ -/** - \brief Defines the content of ISRC2 packet to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pIsrc2PktData Pointer to the structure containing GCP packet parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetISRC2Packet - (tmInstance_t instance, Bool enable, tmdlHdmiTxIsrc2PktData_t *pIsrc2PktData); - -/*****************************************************************************/ -/** - \brief Defines the content of MPS infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pMpsIfData Pointer to the structure containing MPS infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetMPSInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxMpsIfData_t *pMpsIfData); - -/*****************************************************************************/ -/** - \brief Defines the content of SPD infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pSpdIfData Pointer to the structure containing SPD infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetSpdInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxSpdIfData_t *pSpdIfData); - -/*****************************************************************************/ -/** - \brief Defines the content of VS infoframe to be sent by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable infoframe insertion. - \param pVsIfData Pointer to the structure containing VS infoframe - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetVsInfoframe - (tmInstance_t instance, Bool enable, tmdlHdmiTxVsPktData_t *pVsIfData); - -/*****************************************************************************/ -/** - \brief Enables/disables NULL packet sending (only used for debug purpose). - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable packet insertion. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxDebugSetNullPacket(tmInstance_t instance, Bool enable); - -/*****************************************************************************/ -/** - \brief Send one single NULL packet (only used for debug purpose). - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxDebugSetSingleNullPacket(tmInstance_t instance); - -/*****************************************************************************/ -/** - \brief Set the audio output mute status. This function can be used to mute - audio output, without muting video. This can be typically used when - reconfiguring the audio HW after a sample rate change. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param muteStatus Mute status (True/False). - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetAudioMute(tmInstance_t instance, Bool audioMute); - -/*****************************************************************************/ -/** - \brief Reset audio CTS. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxResetAudioCts(tmInstance_t instance); - -/*****************************************************************************/ -/** - \brief Retrieve EDID Status from driver. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param pEdidStatus Pointer to the array that will receive the EDID Status. - \param pEdidBlkCount Pointer to the integer that will receive the number of - read EDID block. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidStatus - (tmInstance_t instance, tmdlHdmiTxEdidStatus_t *pEdidStatus, UInt8 *pEdidBlkCount); - -/*****************************************************************************/ -/** - \brief Retrieves audio descriptors from receiver's EDID. This function - parses the EDID of Tx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - - \param instance Instance identifier. - \param pAudioDescs Pointer to the array that will receive audio - descriptors. - \param maxAudioDescs Size of the array. - \param pWrittenAudioDescs Pointer to the integer that will receive the actual - number of written descriptors. - \param pAudioFlags Pointer to the byte to receive Audio Capabilities Flags. - This byte is filled as such: - b7 is the Basic audio bit from CEA Extension Version 3. - If this bit is set to 1 this means that the sink handles "Basic audio" i.e. - two channel L-PCM audio at sample rates of 32kHz, 44.1kHz, and 48kHz. - b6 is the Supports_AI bit from the VSDB - This bit set to 1 if the sink supports at least one function that uses - information carried by the ACP, ISRC1, or ISRC2 packets. - b5-b0 0 - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidAudioCaps - (tmInstance_t instance, - tmdlHdmiTxEdidAudioDesc_t *pAudioDescs, - UInt maxAudioDescs, UInt *pWrittenAudioDescs, UInt8 *pAudioFlags); - -/*****************************************************************************/ -/** - \brief Retrieves supported video formats (short descriptors) from - receiver's EDID. This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pVideoDesc Pointer to the structure that will receive short - video descriptors. - \param maxVideoFormats Size of the array. - \param pWrittenVideoFormats Pointer to the integer that will receive the actual - number of written descriptors. - \param pVideoFlags Pointer to the byte to receive Video Capability Flags. - b7: underscan supported - b6: YCbCr 4:4:4 supported - b5: YCbCr 4:2:2 supported - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidVideoCaps - (tmInstance_t instance, - tmdlHdmiTxShortVidDesc_t *pVideoDesc, - UInt maxVideoFormats, UInt *pWrittenVideoFormats, UInt8 *pVideoFlags); - -/*****************************************************************************/ -/** - \brief Retrieves supported video formats (short descriptors) from - receiver's EDID. This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pNativeVideoFormat Pointer to the array that will receive video - timing descriptor. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidVideoPreferred - (tmInstance_t instance, tmdlHdmiTxEdidVideoTimings_t *pNativeVideoFormat); - -/*****************************************************************************/ -/** - \brief Retrieves the sink type from receiver's EDID (HDMI or DVI). This - function parses the EDID of Rx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pSinkType Pointer to the array that will receive sink type. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: bad transmitter unit number - - TMDL_ERR_DLHDMITX_NOT_INITIALIZED: the transmitter is not initialized - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidSinkType - (tmInstance_t instance, tmdlHdmiTxSinkType_t *pSinkType); - -/*****************************************************************************/ -/** - \brief Retrieves source address from receivers's EDID. This - function parses the EDID of Rx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pSourceAddress Pointer to the integer that will receive the EDID source - address. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidSourceAddress - (tmInstance_t instance, UInt16 *pSourceAddress); - - - -/*****************************************************************************/ -/** - \brief Retreives KSV list received by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pKsv Pointer to the array that will receive the KSV list. - \param maxKsv Maximum number of KSV that the array can store. - \param pWrittenKsv Actual number of KSV written into the array. - \param pDepth Connection tree depth. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetKsvList - (tmInstance_t instance, - UInt8 *pKsv, - UInt8 maxKsv, - UInt8 *pWrittenKsv, UInt8 *pDepth, Bool *pMaxCascExd, Bool *pMaxDevsExd); -#ifdef HDMI_TX_REPEATER_ISR_MODE -/****************************************************************************** - \brief Retreives HDCP depth received by Tx device. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pDepth Connection tree depth returned with KSV list. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetDepth(tmInstance_t instance, UInt8 *pDepth); - -/****************************************************************************** - \brief Generate SHA_1 interrupt if not occured. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGeneSHA_1_IT(tmInstance_t instance); -#endif /* HDMI_TX_REPEATER_ISR_MODE */ -/*****************************************************************************/ -/** - \brief Enable/Disable HDCP encryption. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param hdcpEnable HDCP On/Off (true = On, False = Off). - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetHdcp(tmInstance_t instance, Bool hdcpEnable); - -/*****************************************************************************/ -/** - \brief Get the driver HDCP state. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pHdcpCheckState Pointer to the integer that will receive the HDCP check state. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetHdcpState - (tmInstance_t instance, tmdlHdmiTxHdcpCheck_t *pHdcpCheckState); - -/*****************************************************************************/ -/** - \brief Check the result of an HDCP encryption attempt, called at - intervals (set by timeSinceLastCall) after tmdlHdmiTxSetHdcp(true). - This API must be used only in case of No Operating System. if OS, - this is manage internally of this device library. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param timeSinceLastCall Time passed in milliseconds since last call, - must be shorter than 600 ms. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_I2C_READ: failed when reading the I2C bus - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing the I2C bus - - TMBSL_ERR_HDMI_NOT_SUPPORTED: device does not support HDCP - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxHdcpCheck(tmInstance_t instance, UInt16 timeSinceLastCall); - -/*****************************************************************************/ -/** - \brief This function loads a gamut metadata packet into the HW. HW will - actually send it at the beginning of next VS, during the vertical - blanking. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/disable gamut metadata packet insertion. - \param pGamutData Pointer to the structure containing gamut metadata - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetGamutPacket - (tmInstance_t instance, Bool enable, tmdlHdmiTxGamutData_t *pGamutData); - -/*****************************************************************************/ -/** - \brief This function set the extended colorimetry with one of the following - extended colorimetries(bits EC2-0): xvYCC601, xvYCC709, sYCC601, - AdobeYCC601, AdobeRGB. When the parameter extendedColorimetry is - xvYCC601 or xvYCC70, this function calls the API tmdlHdmiTxSetGamutPacket - to send Gamut Packet Data that does not exist for all other types of - extended colorimetries for which pointer pGamutData can be set to NULL. - This function also allows to set YCC Quantization Range (YQ1-0) - - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param enable Enable/Disable extended colorimetry. - \param extendedColorimetry value of the extended colorimetry (bits EC2 EC1 EC0). - \param yccQR YCC quantisation range - \param pGamutData Pointer to the structure containing gamut metadata - parameters. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter was out of range - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus - - TMBSL_ERR_HDMI_I2C_READ: failed when reading to the I2C bus - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - - TMBSL_ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxSetExtendedColorimetry - (tmInstance_t instance, - Bool enable, - tmdlHdmiTxExtColorimetry_t extendedColorimetry, - tmdlHdmiTxYCCQR_t yccQR, tmdlHdmiTxGamutData_t *pGamutData); - -/*****************************************************************************/ -/** - \brief Retrieves supported detailled video descriptors from - receiver's EDID. This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pDTDescriptors Pointer to the array that will receive detailled - timing descriptors. - \param maxDTDesc Size of the array. - \param pWrittenDesc Pointer to the integer that will receive the actual - number of written descriptors. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidDetailledTimingDescriptors - (tmInstance_t instance, - tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors, - UInt8 maxDTDesc, UInt8 *pWrittenDTDesc); - -/*****************************************************************************/ -/** - \brief Retrieves supported monitor descriptor from receiver's EDID. - This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pEdidFirstMD Pointer to the array that will receive the first monitor - descriptors. - \param pEdidSecondMD Pointer to the array that will receive the second monitor - descriptors. - \param pEdidOtherMD Pointer to the array that will receive the other monitor - descriptors. - \param maxOtherMD Size of the array. - \param pWrittenOtherMD Pointer to the integer that will receive the actual - number of written descriptors. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidMonitorDescriptors - (tmInstance_t instance, - tmdlHdmiTxEdidFirstMD_t *pEdidFirstMD, - tmdlHdmiTxEdidSecondMD_t *pEdidSecondMD, - tmdlHdmiTxEdidOtherMD_t *pEdidOtherMD, UInt8 maxOtherMD, UInt8 *pWrittenOtherMD); - -/*****************************************************************************/ -/** - \brief Retrieves TV picture ratio from receiver's EDID. - This function parses the EDID of Rx device to get - the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pEdidTvPictureRatio Pointer to the variable that will receive TV picture ratio - value. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidTVPictureRatio - (tmInstance_t instance, tmdlHdmiTxPictAspectRatio_t *pEdidTvPictureRatio); - -/****************************************************************************** - \brief This function set the revocation list use for HDCP - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param listPtr Pointer on revocation list provide by application. - \param length length of revocation list. - - \return The call result: - - TM_OK: the call was successful, however RX keys have - not been checked with provided revocation list - because they are not available. - - TMDL_DLHDMITX_HDCP_SECURE: the call was successful, RX keys are secure - - TMDL_DLHDMITX_HDCP_NOT_SECURE: the call was successful, RX keys are NOT secure - - TMDL_ERR_DLHDMITX_INVALID_STATE: we are a repeater - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - -******************************************************************************/ - - tmErrorCode_t tmdlHdmiTxSetHDCPRevocationList(tmInstance_t instance, - void *listPtr, UInt32 length); - - -/*****************************************************************************/ -/** - \brief Retreives current HDCP link status. This function is typically used - when an "HDCP INACTIVE" event is received to know why HDCP - is INACTIVE. - - \param instance Instance identifier. - \param pHdcpStatus Pointer to the enum describing the status. - \param pRawStatus Pointer to the byte with the raw error code from HW. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out - of range - - TMDL_ERR_DLHDMITX_NOT_INITIALIZED: the transmitter is not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetHdcpFailStatus - (tmInstance_t instance, tmdlHdmiTxHdcpStatus_t *pHdcpStatus, UInt8 *pRawStatus); - - -/*****************************************************************************/ -/** - \brief Retrieves latency information from receiver's EDID. - This function is synchronous. - This function is not ISR friendly. - - - \param instance Instance identifier. - \param pLatency Pointer to the data structure that receive latency - information. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidLatencyInfo - (tmInstance_t instance, tmdlHdmiTxEdidLatency_t *pLatency); - - -/****************************************************************************** - \brief Retrieves additional data from receiver's EDID VSDB. This function - parses the EDID of Rx device to get the relevant data. - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pExtraVsdbData Pointer to the structure of additional VSDB data - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_INVALID_STATE: the state is invalid for - the function - - TMBSL_ERR_HDMI_BAD_PARAMETER: a parameter was out of range - - TMBSL_ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number - - TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read - - TMBSL_ERR_HDMI_NOT_INITIALIZED: transmitter not initialized - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetEdidExtraVsdbData - (tmInstance_t instance, tmdlHdmiTxEdidExtraVsdbData_t **pExtraVsdbData); - - -/****************************************************************************** - \brief This function set the B... screen - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful, however RX keys have - not been checked with provided revocation list - because they are not available. - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - -******************************************************************************/ - - tmErrorCode_t tmdlHdmiTxSetBScreen(tmInstance_t instance, tmdlHdmiTxTestPattern_t pattern); - -/****************************************************************************** - \brief This function set the Remove B.... screen - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - - \return The call result: - - TM_OK: the call was successful, however RX keys have - not been checked with provided revocation list - because they are not available. - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - -******************************************************************************/ - - tmErrorCode_t tmdlHdmiTxRemoveBScreen(tmInstance_t instance); - -/****************************************************************************** - \brief This function Convert DTD to CEA - This function is synchronous. - This function is not ISR friendly. - - \param instance Instance identifier. - \param pDTDescriptors Pointer on one DTD - \return The call result: - - CEA code - - -******************************************************************************/ - tmdlHdmiTxVidFmt_t tmdlHdmiTxConvertDTDtoCEA - (tmInstance_t instance, tmdlHdmiTxEdidVideoTimings_t *pDTDescriptors); - - -/*****************************************************************************/ -/** - \brief Retrieve HPD status from driver. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param pHPDStatus Pointer to the variable that will receive the HPD Status. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetHPDStatus - (tmInstance_t instance, tmdlHdmiTxHotPlug_t *pHPDStatus); - - -/*****************************************************************************/ -/** - \brief Retrieve RXSense status from driver. - This function is synchronous. - This function is ISR friendly. - - \param instance Instance identifier. - \param pRXSenseStatus Pointer to the variable that will receive the RXSense Status. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or - out of range - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxGetRXSenseStatus - (tmInstance_t instance, tmdlHdmiTxRxSense_t *pRXSenseStatus); - - -/****************************************************************************** - \brief Mute or unmute the TMDS outputs. - - \param instance Instance identifier. - \param muteTmdsOut Mute or unmute indication. - - \return NA. - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxTmdsSetOutputsMute(tmInstance_t instance, Bool muteTmdsOut); - -#ifdef __cplusplus -} -#endif -#endif /* TMDLHDMITX_FUNCTIONS_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_IW.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_IW.h deleted file mode 100644 index bb93ba567ba..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_IW.h +++ /dev/null @@ -1,287 +0,0 @@ -/** - * Copyright (C) 2007 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx_IW.h - * - * \version $Revision: 1 $ - * - * \date $Date: 07/08/07 16:00 $ - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * TDA998x Driver - FRS.doc, - * TDA998x Driver - tmdlHdmiTx - SCS.doc - * - * \section info Change Information - * - * \verbatim - - $History: tmdlHdmiTx_IW.h $ - * - * ***************** Version 1 ***************** - * User: J. Lamotte Date: 07/08/07 Time: 16:00 - * Updated in $/Source/tmdlHdmiTx/inc - * initial version - * - - \endverbatim - * -*/ - -#ifndef TMDLHDMITX_IW_H -#define TMDLHDMITX_IW_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifdef TMFL_OS_WINDOWS -#define _WIN32_WINNT 0x0500 -#include "windows.h" -#endif - -#include "tmNxTypes.h" -#include "tmdlHdmiTx_Types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* TYPE DEFINITIONS */ -/*============================================================================*/ - typedef void (*tmdlHdmiTxIWFuncPtr_t) (void); - typedef UInt8 tmdlHdmiTxIWTaskHandle_t; - typedef UInt8 tmdlHdmiTxIWQueueHandle_t; -#ifdef TMFL_OS_WINDOWS -#error - typedef HANDLE tmdlHdmiTxIWSemHandle_t; -#else -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER - typedef unsigned long tmdlHdmiTxIWSemHandle_t; -#else -#error "platform error" - typedef UInt8 tmdlHdmiTxIWSemHandle_t; -#endif -#endif - -/** - * \brief Enum listing all available devices for enable/disable interrupts - */ - typedef enum { - TMDL_HDMI_IW_RX_1, - TMDL_HDMI_IW_RX_2, - TMDL_HDMI_IW_TX_1, - TMDL_HDMI_IW_TX_2, - TMDL_HDMI_IW_CEC_1, - TMDL_HDMI_IW_CEC_2 - } tmdlHdmiIWDeviceInterrupt_t; - -/*============================================================================*/ -/* EXTERN FUNCTION PROTOTYPES */ -/*============================================================================*/ - -/****************************************************************************** - \brief This function creates a task and allocates all the necessary - resources. Note that creating a task do not start it automatically, - an explicit call to tmdlHdmiTxIWTaskStart must be made. - - \param pFunc Pointer to the function that will be executed in the task context. - \param Priority Priority of the task. The minimum priority is 0, the maximum is 255. - \param StackSize Size of the stack to allocate for this task. - \param pHandle Pointer to the handle buffer. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWTaskCreate(tmdlHdmiTxIWFuncPtr_t pFunc, UInt8 priority, - UInt16 stackSize, tmdlHdmiTxIWTaskHandle_t *pHandle); - -/****************************************************************************** - \brief This function destroys an existing task and frees resources used by it. - - \param Handle Handle of the task to be destroyed, as returned by tmdlHdmiTxIWTaskCreate. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWTaskDestroy(tmdlHdmiTxIWTaskHandle_t handle); - -/****************************************************************************** - \brief This function start an existing task. - - \param Handle Handle of the task to be started. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_ALREADY_STARTED: the function is already started - - TMDL_ERR_DLHDMITX_NOT_STARTED: the function is not started - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWTaskStart(tmdlHdmiTxIWTaskHandle_t handle); - -/****************************************************************************** - \brief This function blocks the current task for the specified amount time. This is a passive wait. - - \param Duration Duration of the task blocking in milliseconds. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWWait(UInt16 duration); - -/****************************************************************************** - \brief This function creates a message queue. - - \param QueueSize Maximum number of messages in the message queue. - \param pHandle Pointer to the handle buffer. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWQueueCreate(UInt8 queueSize, tmdlHdmiTxIWQueueHandle_t *pHandle); - -/****************************************************************************** - \brief This function destroys an existing message queue. - - \param Handle Handle of the queue to be destroyed. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWQueueDestroy(tmdlHdmiTxIWQueueHandle_t handle); - -/****************************************************************************** - \brief This function sends a message into the specified message queue. - - \param Handle Handle of the queue that will receive the message. - \param Message Message to be sent. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_FULL: the queue is full - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWQueueSend(tmdlHdmiTxIWQueueHandle_t handle, UInt8 message); - -/****************************************************************************** - \brief This function reads a message from the specified message queue. - - \param Handle Handle of the queue from which to read the message. - \param pMessage Pointer to the message buffer. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - - TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own - the resource - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWQueueReceive(tmdlHdmiTxIWQueueHandle_t handle, UInt8 *pMessage); - -/****************************************************************************** - \brief This function creates a semaphore. - - \param pHandle Pointer to the handle buffer. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWSemaphoreCreate(tmdlHdmiTxIWSemHandle_t *pHandle); - -/****************************************************************************** - \brief This function destroys an existing semaphore. - - \param Handle Handle of the semaphore to be destroyed. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWSemaphoreDestroy(tmdlHdmiTxIWSemHandle_t handle); - -/****************************************************************************** - \brief This function acquires the specified semaphore. - - \param Handle Handle of the semaphore to be acquired. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWSemaphoreP(tmdlHdmiTxIWSemHandle_t handle); - -/****************************************************************************** - \brief This function releases the specified semaphore. - - \param Handle Handle of the semaphore to be released. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ - tmErrorCode_t tmdlHdmiTxIWSemaphoreV(tmdlHdmiTxIWSemHandle_t handle); - -/****************************************************************************** - \brief This function disables the interrupts for a specific device. - - \param - - \return The call result: - - TM_OK: the call was successful - -******************************************************************************/ - void tmdlHdmiTxIWDisableInterrupts(tmdlHdmiIWDeviceInterrupt_t device); - -/****************************************************************************** - \brief This function enables the interrupts for a specific device. - - \param - - \return The call result: - - TM_OK: the call was successful - -******************************************************************************/ - void tmdlHdmiTxIWEnableInterrupts(tmdlHdmiIWDeviceInterrupt_t device); - -#ifdef __cplusplus -} -#endif -#endif /* TMDLHDMITX_IW_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_Types.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_Types.h deleted file mode 100644 index 632edd991d0..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_Types.h +++ /dev/null @@ -1,1259 +0,0 @@ -/** - * Copyright (C) 2007 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx_Types.h - * - * \version $Revision: 1 $ - * - * \date $Date: 02/08/07 08:32 $ - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * HDMI Tx Driver - tmdlHdmiTx - SCS.doc - * - * \section info Change Information - * - * \verbatim - - $History: tmdlHdmiTx_Types.h $ - * - * ***************** Version 1 ***************** - * User: Demoment Date: 02/08/07 Time: 08:32 - * Updated in $/Source/tmdlHdmiTx/inc - * initial version - - \endverbatim - * -*/ - -#ifndef TMDLHDMITX_TYPES_H -#define TMDLHDMITX_TYPES_H - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#include "tmNxTypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - -/*============================================================================*/ -/* DEFINES */ -/*============================================================================*/ - -/**< Error Codes */ -#define TMDL_ERR_DLHDMITX_BASE CID_DL_HDMITX -#define TMDL_ERR_DLHDMITX_COMP (TMDL_ERR_DLHDMITX_BASE | TM_ERR_COMP_UNIQUE_START) - -#define TMDL_ERR_DLHDMITX_COMPATIBILITY (TMDL_ERR_DLHDMITX_BASE + TM_ERR_COMPATIBILITY) /**< SW Interface compatibility */ -#define TMDL_ERR_DLHDMITX_MAJOR_VERSION (TMDL_ERR_DLHDMITX_BASE + TM_ERR_MAJOR_VERSION) /**< SW Major Version error */ -#define TMDL_ERR_DLHDMITX_COMP_VERSION (TMDL_ERR_DLHDMITX_BASE + TM_ERR_COMP_VERSION) /**< SW component version error */ -#define TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER (TMDL_ERR_DLHDMITX_BASE + TM_ERR_BAD_UNIT_NUMBER) /**< Invalid device unit number */ -#define TMDL_ERR_DLHDMITX_BAD_INSTANCE (TMDL_ERR_DLHDMITX_BASE + TM_ERR_BAD_INSTANCE) /**< Bad input instance value */ -#define TMDL_ERR_DLHDMITX_BAD_HANDLE (TMDL_ERR_DLHDMITX_BASE + TM_ERR_BAD_HANDLE) /**< Bad input handle */ -#define TMDL_ERR_DLHDMITX_BAD_PARAMETER (TMDL_ERR_DLHDMITX_BASE + TM_ERR_BAD_PARAMETER) /**< Invalid input parameter */ -#define TMDL_ERR_DLHDMITX_NO_RESOURCES (TMDL_ERR_DLHDMITX_BASE + TM_ERR_NO_RESOURCES) /**< Resource is not available */ -#define TMDL_ERR_DLHDMITX_RESOURCE_OWNED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_RESOURCE_OWNED) /**< Resource is already in use */ -#define TMDL_ERR_DLHDMITX_RESOURCE_NOT_OWNED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_RESOURCE_NOT_OWNED) /**< Caller does not own resource */ -#define TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS (TMDL_ERR_DLHDMITX_BASE + TM_ERR_INCONSISTENT_PARAMS) /**< Inconsistent input params */ -#define TMDL_ERR_DLHDMITX_NOT_INITIALIZED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_NOT_INITIALIZED) /**< Component is not initialized */ -#define TMDL_ERR_DLHDMITX_NOT_SUPPORTED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_NOT_SUPPORTED) /**< Function is not supported */ -#define TMDL_ERR_DLHDMITX_INIT_FAILED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_INIT_FAILED) /**< Initialization failed */ -#define TMDL_ERR_DLHDMITX_BUSY (TMDL_ERR_DLHDMITX_BASE + TM_ERR_BUSY) /**< Component is busy */ -#define TMDL_ERR_DLHDMITX_I2C_READ (TMDL_ERR_DLHDMITX_BASE + TM_ERR_READ) /**< Read error */ -#define TMDL_ERR_DLHDMITX_I2C_WRITE (TMDL_ERR_DLHDMITX_BASE + TM_ERR_WRITE) /**< Write error */ -#define TMDL_ERR_DLHDMITX_FULL (TMDL_ERR_DLHDMITX_BASE + TM_ERR_FULL) /**< Queue is full */ -#define TMDL_ERR_DLHDMITX_NOT_STARTED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_NOT_STARTED) /**< Function is not started */ -#define TMDL_ERR_DLHDMITX_ALREADY_STARTED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_ALREADY_STARTED) /**< Function is already started */ -#define TMDL_ERR_DLHDMITX_ASSERTION (TMDL_ERR_DLHDMITX_BASE + TM_ERR_ASSERTION) /**< Assertion failure */ -#define TMDL_ERR_DLHDMITX_INVALID_STATE (TMDL_ERR_DLHDMITX_BASE + TM_ERR_INVALID_STATE) /**< Invalid state for function */ -#define TMDL_ERR_DLHDMITX_OPERATION_NOT_PERMITTED (TMDL_ERR_DLHDMITX_BASE + TM_ERR_OPERATION_NOT_PERMITTED) /**< Corresponds to posix EPERM */ -#define TMDL_ERR_DLHDMITX_RESOLUTION_UNKNOWN (TMDL_ERR_DLHDMITX_BASE + TM_ERR_BAD_FORMAT) /**< Bad format */ - -#define TMDL_DLHDMITX_HDCP_SECURE (TMDL_ERR_DLHDMITX_COMP + 0x0001) /**< Revocation list is secure */ -#define TMDL_DLHDMITX_HDCP_NOT_SECURE (TMDL_ERR_DLHDMITX_COMP + 0x0002) /**< Revocation list is NOT secure */ - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ - -/** - * \brief Enum listing all events that can be signalled to application - */ - typedef enum { - TMDL_HDMITX_HDCP_ACTIVE = 0,/**< HDCP encryption status switched to active */ - TMDL_HDMITX_HDCP_INACTIVE = 1, - /**< HDCP encryption status switched to inactive */ - TMDL_HDMITX_HPD_ACTIVE = 2, /**< Hotplug status switched to active */ - TMDL_HDMITX_HPD_INACTIVE = 3, - /**< Hotplug status switched to inactive */ - TMDL_HDMITX_RX_KEYS_RECEIVED = 4, - /**< Receiver(s) key(s) received */ - TMDL_HDMITX_RX_DEVICE_ACTIVE = 5, - /**< Rx device is connected and active */ - TMDL_HDMITX_RX_DEVICE_INACTIVE = 6, - /**< Rx device is connected but inactive (standby) */ - TMDL_HDMITX_EDID_RECEIVED = 7, - /**< EDID has been received */ - TMDL_HDMITX_VS_RPT_RECEIVED = 8, - /**< VS interrupt has been received */ -#ifdef HDMI_TX_REPEATER_ISR_MODE - TMDL_HDMITX_B_STATUS = 9, /**< TX received BStatus */ -#endif /* HDMI_TX_REPEATER_ISR_MODE */ - TMDL_HDMITX_DEBUG_EVENT_1 = 10 - /**< This is a debug event */ - } tmdlHdmiTxEvent_t; - -/** - * \brief Enum listing all available event status - */ - typedef enum { - TMDL_HDMITX_EVENT_ENABLED, - /**< Event is enabled */ - TMDL_HDMITX_EVENT_DISABLED - /**< Event is disabled */ - } tmdlHdmiTxEventStatus_t; - -/** - * \brief Callback function pointer type, used to allow driver to callback - application when activity status is changing at input. - * \param Event Identifier of the source event. - */ - typedef void (*ptmdlHdmiTxCallback_t) (tmdlHdmiTxEvent_t event); - -/** - * \brief Enum listing all supported device versions - */ - typedef enum { - TMDL_HDMITX_DEVICE_UNKNOWN, - /**< HW device is unknown */ - TMDL_HDMITX_DEVICE_TDA9984, - /**< HW device is IC TDA9984 */ - TMDL_HDMITX_DEVICE_TDA9989, - /**< HW device is IC TDA9989 */ - TMDL_HDMITX_DEVICE_TDA9981, - /**< HW device is IC TDA9981 */ - TMDL_HDMITX_DEVICE_TDA9983, - /**< HW device is IC TDA9983 */ - TMDL_HDMITX_DEVICE_TDA19989, - /**< HW device is IC TDA19989 */ - TMDL_HDMITX_DEVICE_TDA19988 - /**< ok, u got it, it's a TDA19988 */ - } tmdlHdmiTxDeviceVersion_t; - -/** - * \brief Enum defining the supported HDMI standard version - */ - typedef enum { - TMDL_HDMITX_HDMI_VERSION_UNKNOWN, - /**< Unknown */ - TMDL_HDMITX_HDMI_VERSION_1_1, - /**< HDMI 1.1 */ - TMDL_HDMITX_HDMI_VERSION_1_2a, - /**< HDMI 1.2a */ - TMDL_HDMITX_HDMI_VERSION_1_3a - /**< HDMI 1.3 */ - } tmdlHdmiTxHdmiVersion_t; - -/** - * \brief Enum listing all color depth (8 bits/color, 10 bits/color, etc.) - */ - typedef enum { - TMDL_HDMITX_COLORDEPTH_24 = 0, - /**< 8 bits per color */ - TMDL_HDMITX_COLORDEPTH_30 = 1, - /**< 10 bits per color */ - TMDL_HDMITX_COLORDEPTH_36 = 2, - /**< 12 bits per color */ - TMDL_HDMITX_COLORDEPTH_48 = 3 - /**< 16 bits per color */ - } tmdlHdmiTxColorDepth_t; - -/** - * \brief Enum defining the EDID Status - */ - typedef enum { - TMDL_HDMITX_EDID_READ = 0, /**< All blocks read OK */ - TMDL_HDMITX_EDID_READ_INCOMPLETE = 1, - /**< All blocks read OK but buffer too small to return all of them */ - TMDL_HDMITX_EDID_ERROR_CHK_BLOCK_0 = 2, - /**< Block 0 checksum error */ - TMDL_HDMITX_EDID_ERROR_CHK = 3, /**< Block 0 OK, checksum error in one or more other blocks */ - TMDL_HDMITX_EDID_NOT_READ = 4, /**< EDID not read */ - TMDL_HDMITX_EDID_STATUS_INVALID = 5 - /**< Invalid */ - } tmdlHdmiTxEdidStatus_t; - -/** - * \brief Structure defining the supported audio packets - */ - typedef struct { - Bool HBR; /**< High Bitrate Audio packet */ - Bool DST; /**< Direct Stream Transport audio packet */ - Bool oneBitAudio; - /**< One Bit Audio sample packet */ - } tmdlHdmiTxAudioPacket_t; - -/** - * \brief Enum listing all possible audio input formats - */ - typedef enum { - TMDL_HDMITX_AFMT_SPDIF = 0, - /**< SPDIF */ - TMDL_HDMITX_AFMT_I2S = 1, - /**< I2S */ - TMDL_HDMITX_AFMT_OBA = 2, - /**< One bit audio / DSD */ - TMDL_HDMITX_AFMT_DST = 3, - /**< DST */ - TMDL_HDMITX_AFMT_HBR = 4 - /**< HBR */ - } tmdlHdmiTxAudioFormat_t; - -/** - * \brief Enum listing all possible audio input sample rates - */ - typedef enum { - TMDL_HDMITX_AFS_32K = 0, - /**< 32kHz */ - TMDL_HDMITX_AFS_44K = 1, - /**< 44.1kHz */ - TMDL_HDMITX_AFS_48K = 2, - /**< 48kHz */ - TMDL_HDMITX_AFS_88K = 3, - /**< 88.2kHz */ - TMDL_HDMITX_AFS_96K = 4, - /**< 96kHz */ - TMDL_HDMITX_AFS_176K = 5, - /**< 176.4kHz */ - TMDL_HDMITX_AFS_192K = 6 - /**< 192kHz */ - } tmdlHdmiTxAudioRate_t; - -/** - * \brief Enum listing all possible audio input sample rates - */ - typedef enum { - TMDL_HDMITX_I2SQ_16BITS = 16, - /**< 16 bits */ - TMDL_HDMITX_I2SQ_32BITS = 32, - /**< 32 bits */ - TMDL_HDMITX_I2SQ_OTHERS = 0 - /**< for SPDIF and DSD */ - } tmdlHdmiTxAudioI2SQualifier_t; - -/** - * \brief Enum listing all possible audio I2S formats - */ - typedef enum { - TMDL_HDMITX_I2SFOR_PHILIPS_L = 0, - /**< Philips like format */ - TMDL_HDMITX_I2SFOR_OTH_L = 2, - /**< Other non Philips left justified */ - TMDL_HDMITX_I2SFOR_OTH_R = 3, - /**< Other non Philips right justified */ - TMDL_HDMITX_I2SFOR_INVALID = 4 - /**< Invalid format */ - } tmdlHdmiTxAudioI2SFormat_t; - -/** - * \brief Enum listing all possible DST data transfer rates - */ - typedef enum { - TMDL_HDMITX_DSTRATE_SINGLE = 0, - /**< Single transfer rate */ - TMDL_HDMITX_DSTRATE_DOUBLE = 1 - /**< Double data rate */ - } tmdlHdmiTxDstRate_t; - -/** - * \brief Structure describing unit capabilities - */ - typedef struct { - tmdlHdmiTxDeviceVersion_t deviceVersion; - /**< HW device version */ - tmdlHdmiTxHdmiVersion_t hdmiVersion; - /**< Supported HDMI standard version */ - tmdlHdmiTxAudioPacket_t audioPacket; - /**< Supported audio packets */ - tmdlHdmiTxColorDepth_t colorDepth; - /**< Supported color depth */ - Bool hdcp; /**< Supported Hdcp encryption (True/False) */ - Bool scaler; /**< Supported scaler (True/False) */ - } tmdlHdmiTxCapabilities_t; - -/** - * \brief Structure gathering all instance setup parameters - */ - typedef struct { - Bool simplayHd; /**< Enable simplayHD support */ - Bool repeaterEnable; - /**< Enable repeater mode */ - UInt8 *pEdidBuffer; - /**< Pointer to raw EDID data */ - UInt32 edidBufferSize; - /**< Size of buffer for raw EDID data */ - } tmdlHdmiTxInstanceSetupInfo_t; - -/** - * \brief Enum listing all IA/CEA 861-D video formats - */ - typedef enum { - TMDL_HDMITX_VFMT_NULL = 0, /**< Not a valid format... */ - TMDL_HDMITX_VFMT_NO_CHANGE = 0, /**< ...or no change required */ - TMDL_HDMITX_VFMT_MIN = 1, /**< Lowest valid format */ - TMDL_HDMITX_VFMT_TV_MIN = 1, /**< Lowest valid TV format */ - TMDL_HDMITX_VFMT_01_640x480p_60Hz = 1, /**< Format 01 640 x 480p 60Hz */* /4:3 */ - TMDL_HDMITX_VFMT_02_720x480p_60Hz = 2, /**< Format 02 720 x 480p 60Hz */* /4:3 */ - TMDL_HDMITX_VFMT_03_720x480p_60Hz = 3, /**< Format 03 720 x 480p 60Hz */* /16:9 */ - TMDL_HDMITX_VFMT_04_1280x720p_60Hz = 4, - /**< Format 04 1280 x 720p 60Hz */ - TMDL_HDMITX_VFMT_05_1920x1080i_60Hz = 5, - /**< Format 05 1920 x 1080i 60Hz */ - TMDL_HDMITX_VFMT_06_720x480i_60Hz = 6, - /**< Format 06 720 x 480i 60Hz */ - TMDL_HDMITX_VFMT_07_720x480i_60Hz = 7, - /**< Format 07 720 x 480i 60Hz */ - TMDL_HDMITX_VFMT_08_720x240p_60Hz = 8, - /**< Format 08 720 x 240p 60Hz */ - TMDL_HDMITX_VFMT_09_720x240p_60Hz = 9, - /**< Format 09 720 x 240p 60Hz */ - TMDL_HDMITX_VFMT_10_720x480i_60Hz = 10, - /**< Format 10 720 x 480i 60Hz */ - TMDL_HDMITX_VFMT_11_720x480i_60Hz = 11, - /**< Format 11 720 x 480i 60Hz */ - TMDL_HDMITX_VFMT_12_720x240p_60Hz = 12, - /**< Format 12 720 x 240p 60Hz */ - TMDL_HDMITX_VFMT_13_720x240p_60Hz = 13, - /**< Format 13 720 x 240p 60Hz */ - TMDL_HDMITX_VFMT_14_1440x480p_60Hz = 14, - /**< Format 14 1440 x 480p 60Hz */ - TMDL_HDMITX_VFMT_15_1440x480p_60Hz = 15, - /**< Format 15 1440 x 480p 60Hz */ - TMDL_HDMITX_VFMT_16_1920x1080p_60Hz = 16, - /**< Format 16 1920 x 1080p 60Hz */ - TMDL_HDMITX_VFMT_17_720x576p_50Hz = 17, - /**< Format 17 720 x 576p 50Hz */ - TMDL_HDMITX_VFMT_18_720x576p_50Hz = 18, - /**< Format 18 720 x 576p 50Hz */ - TMDL_HDMITX_VFMT_19_1280x720p_50Hz = 19, - /**< Format 19 1280 x 720p 50Hz */ - TMDL_HDMITX_VFMT_20_1920x1080i_50Hz = 20, - /**< Format 20 1920 x 1080i 50Hz */ - TMDL_HDMITX_VFMT_21_720x576i_50Hz = 21, - /**< Format 21 720 x 576i 50Hz */ - TMDL_HDMITX_VFMT_22_720x576i_50Hz = 22, - /**< Format 22 720 x 576i 50Hz */ - TMDL_HDMITX_VFMT_23_720x288p_50Hz = 23, - /**< Format 23 720 x 288p 50Hz */ - TMDL_HDMITX_VFMT_24_720x288p_50Hz = 24, - /**< Format 24 720 x 288p 50Hz */ - TMDL_HDMITX_VFMT_25_720x576i_50Hz = 25, - /**< Format 25 720 x 576i 50Hz */ - TMDL_HDMITX_VFMT_26_720x576i_50Hz = 26, - /**< Format 26 720 x 576i 50Hz */ - TMDL_HDMITX_VFMT_27_720x288p_50Hz = 27, - /**< Format 27 720 x 288p 50Hz */ - TMDL_HDMITX_VFMT_28_720x288p_50Hz = 28, - /**< Format 28 720 x 288p 50Hz */ - TMDL_HDMITX_VFMT_29_1440x576p_50Hz = 29, - /**< Format 29 1440 x 576p 50Hz */ - TMDL_HDMITX_VFMT_30_1440x576p_50Hz = 30, - /**< Format 30 1440 x 576p 50Hz */ - TMDL_HDMITX_VFMT_31_1920x1080p_50Hz = 31, - /**< Format 31 1920 x 1080p 50Hz */ - TMDL_HDMITX_VFMT_32_1920x1080p_24Hz = 32, - /**< Format 32 1920 x 1080p 24Hz */ - TMDL_HDMITX_VFMT_33_1920x1080p_25Hz = 33, - /**< Format 33 1920 x 1080p 25Hz */ - TMDL_HDMITX_VFMT_34_1920x1080p_30Hz = 34, - /**< Format 34 1920 x 1080p 30Hz */ - TMDL_HDMITX_VFMT_35_2880x480p_60Hz = 35, - /**< Format 35 2880 x 480p 60Hz 4:3 */ - TMDL_HDMITX_VFMT_36_2880x480p_60Hz = 36, - /**< Format 36 2880 x 480p 60Hz 16:9 */ - TMDL_HDMITX_VFMT_37_2880x576p_50Hz = 37, - /**< Format 37 2880 x 576p 50Hz 4:3 */ - TMDL_HDMITX_VFMT_38_2880x576p_50Hz = 38, - /**< Format 38 2880 x 576p 50Hz 16:9 */ - - TMDL_HDMITX_VFMT_INDEX_60_1280x720p_24Hz = 39, - /**< Index of HDMITX_VFMT_60_1280x720p_24Hz */ - TMDL_HDMITX_VFMT_60_1280x720p_24Hz = 60, - /**< Format 60 1280 x 720p 23.97/24Hz 16:9 */ - TMDL_HDMITX_VFMT_61_1280x720p_25Hz = 61, - /**< Format 61 1280 x 720p 25Hz 16:9 */ - TMDL_HDMITX_VFMT_62_1280x720p_30Hz = 62, - /**< Format 60 1280 x 720p 29.97/30Hz 16:9 */ - - TMDL_HDMITX_VFMT_TV_MAX = 62, /**< Highest valid TV format */ - TMDL_HDMITX_VFMT_TV_NO_REG_MIN = 32, - /**< Lowest TV format without prefetched table */ - TMDL_HDMITX_VFMT_TV_NUM = 42, /**< Number of TV formats & null */ - - TMDL_HDMITX_VFMT_PC_MIN = 128, /**< Lowest valid PC format */ - TMDL_HDMITX_VFMT_PC_640x480p_60Hz = 128, - /**< PC format 128 */ - TMDL_HDMITX_VFMT_PC_800x600p_60Hz = 129, - /**< PC format 129 */ - TMDL_HDMITX_VFMT_PC_1152x960p_60Hz = 130, - /**< PC format 130 */ - TMDL_HDMITX_VFMT_PC_1024x768p_60Hz = 131, - /**< PC format 131 */ - TMDL_HDMITX_VFMT_PC_1280x768p_60Hz = 132, - /**< PC format 132 */ - TMDL_HDMITX_VFMT_PC_1280x1024p_60Hz = 133, - /**< PC format 133 */ - TMDL_HDMITX_VFMT_PC_1360x768p_60Hz = 134, - /**< PC format 134 */ - TMDL_HDMITX_VFMT_PC_1400x1050p_60Hz = 135, - /**< PC format 135 */ - TMDL_HDMITX_VFMT_PC_1600x1200p_60Hz = 136, - /**< PC format 136 */ - TMDL_HDMITX_VFMT_PC_1024x768p_70Hz = 137, - /**< PC format 137 */ - TMDL_HDMITX_VFMT_PC_640x480p_72Hz = 138, - /**< PC format 138 */ - TMDL_HDMITX_VFMT_PC_800x600p_72Hz = 139, - /**< PC format 139 */ - TMDL_HDMITX_VFMT_PC_640x480p_75Hz = 140, - /**< PC format 140 */ - TMDL_HDMITX_VFMT_PC_1024x768p_75Hz = 141, - /**< PC format 141 */ - TMDL_HDMITX_VFMT_PC_800x600p_75Hz = 142, - /**< PC format 142 */ - TMDL_HDMITX_VFMT_PC_1024x864p_75Hz = 143, - /**< PC format 143 */ - TMDL_HDMITX_VFMT_PC_1280x1024p_75Hz = 144, - /**< PC format 144 */ - TMDL_HDMITX_VFMT_PC_640x350p_85Hz = 145, - /**< PC format 145 */ - TMDL_HDMITX_VFMT_PC_640x400p_85Hz = 146, - /**< PC format 146 */ - TMDL_HDMITX_VFMT_PC_720x400p_85Hz = 147, - /**< PC format 147 */ - TMDL_HDMITX_VFMT_PC_640x480p_85Hz = 148, - /**< PC format 148 */ - TMDL_HDMITX_VFMT_PC_800x600p_85Hz = 149, - /**< PC format 149 */ - TMDL_HDMITX_VFMT_PC_1024x768p_85Hz = 150, - /**< PC format 150 */ - TMDL_HDMITX_VFMT_PC_1152x864p_85Hz = 151, - /**< PC format 151 */ - TMDL_HDMITX_VFMT_PC_1280x960p_85Hz = 152, - /**< PC format 152 */ - TMDL_HDMITX_VFMT_PC_1280x1024p_85Hz = 153, - /**< PC format 153 */ - TMDL_HDMITX_VFMT_PC_1024x768i_87Hz = 154, - /**< PC format 154 */ - TMDL_HDMITX_VFMT_PC_MAX = 154, /**< Highest valid PC format */ - TMDL_HDMITX_VFMT_PC_NUM = (TMDL_HDMITX_VFMT_PC_MAX - TMDL_HDMITX_VFMT_PC_MIN + 1) /**< Number of PC formats */ - } tmdlHdmiTxVidFmt_t; - -/** - * \brief Structure defining the EDID short video descriptor - */ - typedef struct { - tmdlHdmiTxVidFmt_t videoFormat; /**< Video format as defined by EIA/CEA 861-D */ - Bool nativeVideoFormat; /**< True if format is the preferred video format */ - } tmdlHdmiTxShortVidDesc_t; - -/** - * \brief Enum listing all picture aspect ratio (H:V) (4:3, 16:9) - */ - typedef enum { - TMDL_HDMITX_P_ASPECT_RATIO_UNDEFINED = 0, - /**< Undefined picture aspect ratio */ - TMDL_HDMITX_P_ASPECT_RATIO_6_5 = 1, /**< 6:5 picture aspect ratio (PAR) */ - TMDL_HDMITX_P_ASPECT_RATIO_5_4 = 2, /**< 5:4 PAR */ - TMDL_HDMITX_P_ASPECT_RATIO_4_3 = 3, /**< 4:3 PAR */ - TMDL_HDMITX_P_ASPECT_RATIO_16_10 = 4, - /**< 16:10 PAR */ - TMDL_HDMITX_P_ASPECT_RATIO_5_3 = 5, /**< 5:3 PAR */ - TMDL_HDMITX_P_ASPECT_RATIO_16_9 = 6,/**< 16:9 PAR */ - TMDL_HDMITX_P_ASPECT_RATIO_9_5 = 7 /**< 9:5 PAR */ - } tmdlHdmiTxPictAspectRatio_t; - -/** - * \brief Enum listing all vertical frequency - */ - typedef enum { - TMDL_HDMITX_VFREQ_24Hz = 0, - /**< 24Hz */ - TMDL_HDMITX_VFREQ_25Hz = 1, - /**< 25Hz */ - TMDL_HDMITX_VFREQ_30Hz = 2, - /**< 30Hz */ - TMDL_HDMITX_VFREQ_50Hz = 3, - /**< 50Hz */ - TMDL_HDMITX_VFREQ_59Hz = 4, - /**< 59.94Hz */ - TMDL_HDMITX_VFREQ_60Hz = 5, - /**< 60Hz */ -#ifndef FORMAT_PC - TMDL_HDMITX_VFREQ_INVALID = 6, - /**< Invalid */ - TMDL_HDMITX_VFREQ_NUM = 6 - /**< No. of values */ -#else /* FORMAT_PC */ - TMDL_HDMITX_VFREQ_70Hz = 6, - /**< 70Hz */ - TMDL_HDMITX_VFREQ_72Hz = 7, - /**< 72Hz */ - TMDL_HDMITX_VFREQ_75Hz = 8, - /**< 75Hz */ - TMDL_HDMITX_VFREQ_85Hz = 9, - /**< 85Hz */ - TMDL_HDMITX_VFREQ_87Hz = 10, - /**< 87Hz */ - TMDL_HDMITX_VFREQ_INVALID = 11, - /**< Invalid */ - TMDL_HDMITX_VFREQ_NUM = 11 - /**< No. of values */ -#endif /* FORMAT_PC */ - } tmdlHdmiTxVfreq_t; - -/** - * \brief Structure storing specifications of a video resolution - */ - typedef struct { - UInt16 width; /**< Width of the frame in pixels */ - UInt16 height; /**< Height of the frame in pixels */ - Bool interlaced; /**< Interlaced mode (True/False) */ - tmdlHdmiTxVfreq_t vfrequency; /**< Vertical frequency in Hz */ - tmdlHdmiTxPictAspectRatio_t aspectRatio; - /**< Picture aspect ratio (H:V) */ - } tmdlHdmiTxVidFmtSpecs_t; - -/** - * \brief Enum listing all video input modes (CCIR, RGB, etc.) - */ - typedef enum { - TMDL_HDMITX_VINMODE_CCIR656 = 0, - /**< CCIR656 */ - TMDL_HDMITX_VINMODE_RGB444, - /**< RGB444 */ - TMDL_HDMITX_VINMODE_YUV444, - /**< YUV444 */ - TMDL_HDMITX_VINMODE_YUV422, - /**< YUV422 */ -#ifdef TMFL_RGB_DDR_12BITS - TMDL_HDMITX_VINMODE_RGB_DDR_12BITS, - /**< RGB24 bits on a 12 bits bus using double data rate clocking */ -#endif - TMDL_HDMITX_VINMODE_NO_CHANGE, - /**< No change */ - TMDL_HDMITX_VINMODE_INVALID - /**< Invalid */ - } tmdlHdmiTxVinMode_t; - -/** - * \brief Enum listing all possible sync sources - */ - typedef enum { - TMDL_HDMITX_SYNCSRC_EMBEDDED = 0, - /**< Embedded sync */ - TMDL_HDMITX_SYNCSRC_EXT_VREF = 1, - /**< External sync Vref, Href, Fref */ - TMDL_HDMITX_SYNCSRC_EXT_VS = 2 - /**< External sync Vs, Hs */ - } tmdlHdmiTxSyncSource_t; - -/** - * \brief Enum listing all output pixel rate (Single, Double, etc.) - */ - typedef enum { - TMDL_HDMITX_PIXRATE_DOUBLE = 0, /**< Double pixel rate */ - TMDL_HDMITX_PIXRATE_SINGLE = 1, /**< Single pixel rate */ - TMDL_HDMITX_PIXRATE_SINGLE_REPEATED = 2 - /**< Single pixel repeated */ - } tmdlHdmiTxPixRate_t; - -/** - * \brief Enum listing the supported transmission formats of 3D video data - */ - typedef enum { - TMDL_HDMITX_3D_NONE = 0, /**< 3D video data not present */ - TMDL_HDMITX_3D_FRAME_PACKING = 1, /**< 3D video data Frame Packing structure */ - TMDL_HDMITX_3D_TOP_AND_BOTTOM = 2, /**< 3D video data Top and Bottom structure */ - TMDL_HDMITX_3D_SIDE_BY_SIDE_HALF = 3, - /**< 3D video data Side by Side Half structure */ - TMDL_HDMITX_3D_INVALID = 4 /**< Invalid */ - } tmdlHdmiTx3DStructure_t; - -/** - * \brief Structure defining the video input configuration - */ - typedef struct { - tmdlHdmiTxVidFmt_t format;/**< Video format as defined by EIA/CEA 861-D */ - tmdlHdmiTxVinMode_t mode; /**< Video mode (CCIR, RGB, YUV, etc.) */ - tmdlHdmiTxSyncSource_t syncSource; - /**< Sync source type */ - tmdlHdmiTxPixRate_t pixelRate; - /**< Pixel rate */ - tmdlHdmiTx3DStructure_t structure3D; - /**< 3D structure as defined in HDMI1.4a */ - } tmdlHdmiTxVideoInConfig_t; - -/** - * \brief Enum listing all video output modes (YUV, RGB, etc.) - */ - typedef enum { - TMDL_HDMITX_VOUTMODE_RGB444 = 0, - /**< RGB444 */ - TMDL_HDMITX_VOUTMODE_YUV422 = 1, - /**< YUV422 */ - TMDL_HDMITX_VOUTMODE_YUV444 = 2, - /**< YUV444 */ - TMDL_HDMITX_VOUTMODE_INVALID = 0xff - } tmdlHdmiTxVoutMode_t; - -/** - * \brief Enum defining possible quantization range - */ - typedef enum { - TMDL_HDMITX_VQR_DEFAULT = 0, /* Follow HDMI spec. */ - TMDL_HDMITX_RGB_FULL = 1, /* Force RGB FULL , DVI only */ - TMDL_HDMITX_RGB_LIMITED = 2 /* Force RGB LIMITED , DVI only */ - } tmdlHdmiTxVQR_t; - - -/** - * \brief Enum defining possible YCC Quantization Range - */ - typedef enum { - TMDL_HDMITX_YQR_LIMITED = 0, /* LIMITED range */ - TMDL_HDMITX_YQR_FULL = 1, /* FULL range */ - TMDL_HDMITX_YQR_INVALID = 2 /* Invalid range */ - } tmdlHdmiTxYCCQR_t; - - -/** - * \brief Structure defining the video output configuration - */ - typedef struct { - tmdlHdmiTxVidFmt_t format; - /**< Video format as defined by EIA/CEA 861-D */ - tmdlHdmiTxVoutMode_t mode; - /**< Video mode (CCIR, RGB, YUV, etc.) */ - tmdlHdmiTxColorDepth_t colorDepth; - /**< Color depth */ - tmdlHdmiTxVQR_t dviVqr; /**< VQR applied in DVI mode */ - } tmdlHdmiTxVideoOutConfig_t; - - - typedef enum { - TMDL_HDMITX_AUDIO_DATA_PCM = 0, - /**< Main data field represents linear PCM samples. */ - TMDL_HDMITX_AUDIO_DATA_OTHER = 1, - /**< Main data field used for purposes other purposes. */ - TMDL_HDMITX_AUDIO_DATA_INVALID = 2 - /**< Invalid value */ - } tmdlHdmiTxAudioData_t; - - - typedef enum { - TMDL_HDMITX_CSCOPYRIGHT_PROTECTED = 0, - /**< Copyright protected */ - TMDL_HDMITX_CSCOPYRIGHT_UNPROTECTED = 1, - /**< Not copyright protected */ - TMDL_HDMITX_CSCOPYRIGHT_INVALID = 2 - /**< Invalid value */ - } tmdlHdmiTxCScopyright_t; - - typedef enum { - TMDL_HDMITX_CSFI_PCM_2CHAN_NO_PRE = 0, - /**< PCM 2 channels without pre-emphasis or NON Linear PCM */ - TMDL_HDMITX_CSFI_PCM_2CHAN_PRE = 1, - /**< PCM 2 channels with 50us/15us pre-emphasis */ - TMDL_HDMITX_CSFI_PCM_2CHAN_PRE_RSVD1 = 2, - /**< PCM Reserved for 2 channels with pre-emphasis */ - TMDL_HDMITX_CSFI_PCM_2CHAN_PRE_RSVD2 = 3, - /**< PCM Reserved for 2 channels with pre-emphasis */ - TMDL_HDMITX_CSFI_INVALID = 4 /**< Invalid value */ - } tmdlHdmiTxCSformatInfo_t; - - - typedef enum { - TMDL_HDMITX_CSCLK_LEVEL_II = 0, - /**< Level II */ - TMDL_HDMITX_CSCLK_LEVEL_I = 1, - /**< Level I */ - TMDL_HDMITX_CSCLK_LEVEL_III = 2, - /**< Level III */ - TMDL_HDMITX_CSCLK_NOT_MATCHED = 3, - /**< Not matched to sample freq. */ - TMDL_HDMITX_CSCLK_INVALID = 4 - /**< Invalid */ - } tmdlHdmiTxCSclkAcc_t; - - - typedef enum { - TMDL_HDMITX_CSMAX_LENGTH_20 = 0, - /**< Max word length is 20 bits */ - TMDL_HDMITX_CSMAX_LENGTH_24 = 1, - /**< Max word length is 24 bits */ - TMDL_HDMITX_CSMAX_INVALID = 2 - /**< Invalid value */ - } tmdlHdmiTxCSmaxWordLength_t; - - - - typedef enum { - TMDL_HDMITX_CSWORD_DEFAULT = 0, /**< Word length is not indicated */ - TMDL_HDMITX_CSWORD_20_OF_24 = 1, /**< Sample length is 20 bits out of max 24 possible */ - TMDL_HDMITX_CSWORD_16_OF_20 = 1, /**< Sample length is 16 bits out of max 20 possible */ - TMDL_HDMITX_CSWORD_22_OF_24 = 2, /**< Sample length is 22 bits out of max 24 possible */ - TMDL_HDMITX_CSWORD_18_OF_20 = 2, /**< Sample length is 18 bits out of max 20 possible */ - TMDL_HDMITX_CSWORD_RESVD = 3, /**< Reserved - shall not be used */ - TMDL_HDMITX_CSWORD_23_OF_24 = 4, /**< Sample length is 23 bits out of max 24 possible */ - TMDL_HDMITX_CSWORD_19_OF_20 = 4, /**< Sample length is 19 bits out of max 20 possible */ - TMDL_HDMITX_CSWORD_24_OF_24 = 5, /**< Sample length is 24 bits out of max 24 possible */ - TMDL_HDMITX_CSWORD_20_OF_20 = 5, /**< Sample length is 20 bits out of max 20 possible */ - TMDL_HDMITX_CSWORD_21_OF_24 = 6, /**< Sample length is 21 bits out of max 24 possible */ - TMDL_HDMITX_CSWORD_17_OF_20 = 6, /**< Sample length is 17 bits out of max 20 possible */ - TMDL_HDMITX_CSWORD_INVALID = 7 /**< Invalid */ - } tmdlHdmiTxCSwordLength_t; - - - typedef enum { - TMDL_HDMITX_CSOFREQ_NOT_INDICATED = 0, - /**< Not Indicated */ - TMDL_HDMITX_CSOFREQ_192k = 1,/**< 192kHz */ - TMDL_HDMITX_CSOFREQ_12k = 2, /**< 12kHz */ - TMDL_HDMITX_CSOFREQ_176_4k = 3, - /**< 176.4kHz */ - TMDL_HDMITX_CSOFREQ_RSVD1 = 4, - /**< Reserved */ - TMDL_HDMITX_CSOFREQ_96k = 5, /**< 96kHz */ - TMDL_HDMITX_CSOFREQ_8k = 6, /**< 8kHz */ - TMDL_HDMITX_CSOFREQ_88_2k = 7, - /**< 88.2kHz */ - TMDL_HDMITX_CSOFREQ_16k = 8, /**< 16kHz */ - TMDL_HDMITX_CSOFREQ_24k = 9, /**< 24kHz */ - TMDL_HDMITX_CSOFREQ_11_025k = 10, - /**< 11.025kHz */ - TMDL_HDMITX_CSOFREQ_22_05k = 11, - /**< 22.05kHz */ - TMDL_HDMITX_CSOFREQ_32k = 12,/**< 32kHz */ - TMDL_HDMITX_CSOFREQ_48k = 13,/**< 48kHz */ - TMDL_HDMITX_CSOFREQ_RSVD2 = 14, - /**< Reserved */ - TMDL_HDMITX_CSOFREQ_44_1k = 15, - /**< 44.1kHz */ - TMDL_HDMITX_CSAFS_INVALID = 16 - /**< Invalid value */ - } tmdlHdmiTxCSorigAfs_t; - - - - typedef struct { - tmdlHdmiTxAudioData_t PcmIdentification; - tmdlHdmiTxCScopyright_t CopyrightInfo; - tmdlHdmiTxCSformatInfo_t FormatInfo; - UInt8 categoryCode; - tmdlHdmiTxCSclkAcc_t clockAccuracy; - tmdlHdmiTxCSmaxWordLength_t maxWordLength; - tmdlHdmiTxCSwordLength_t wordLength; - tmdlHdmiTxCSorigAfs_t origSampleFreq; - } tmdlHdmiTxAudioInChannelStatus; - - -/** - * \brief Structure defining the audio input configuration - */ - typedef struct { - tmdlHdmiTxAudioFormat_t format; /**< Audio format (I2S, SPDIF, etc.) */ - tmdlHdmiTxAudioRate_t rate; /**< Audio sampling rate */ - tmdlHdmiTxAudioI2SFormat_t i2sFormat; /**< I2S format of the audio input */ - tmdlHdmiTxAudioI2SQualifier_t i2sQualifier; - /**< I2S qualifier of the audio input (8,16,32 bits) */ - tmdlHdmiTxDstRate_t dstRate; /**< DST data transfer rate */ - UInt8 channelAllocation; /**< Ref to CEA-861D p85 */ - tmdlHdmiTxAudioInChannelStatus channelStatus; - /**< Ref to IEC 60958-3 */ - } tmdlHdmiTxAudioInConfig_t; - -/** - * \brief Enum listing all the type of sunk - */ - typedef enum { - TMDL_HDMITX_SINK_DVI = 0, - /**< DVI */ - TMDL_HDMITX_SINK_HDMI = 1, - /**< HDMI */ - TMDL_HDMITX_SINK_EDID = 2 - /**< As currently defined in EDID */ - } tmdlHdmiTxSinkType_t; - -/** - * \brief Structure defining the content of a gamut packet - */ - typedef struct { - Bool nextField; /**< Gamut relevant for field following packet insertion */ - UInt8 GBD_Profile; - /**< Profile of the gamut packet : 0 = P0, 1 = P1 */ - UInt8 affectedGamutSeqNum; - /**< Gamut sequence number of the field that have to be affected by this gamut packet */ - Bool noCurrentGBD; - /**< Current field not using specific gamut */ - UInt8 currentGamutSeqNum; - /**< Gamut sequence number of the current field */ - UInt8 packetSequence; - /**< Sequence of the packet inside a multiple packet gamut */ - UInt8 payload[28]; - /**< Payload of the gamut packet */ - } tmdlHdmiTxGamutData_t; - -/** - * \brief Type defining the content of a generic packet - */ - typedef UInt8 tmdlHdmiTxGenericPacket[28]; - -/** - * \brief Structure defining the content of an ACP packet - */ - typedef struct { - UInt8 acpType; - UInt8 acpData[28]; - } tmdlHdmiTxAcpPktData_t; - -/** - * \brief Structure defining the content of an AVI infoframe - */ - typedef struct { - UInt8 colorIndicator; /**< RGB or YCbCr indicator. See CEA-861-B table 8 for details */ - UInt8 activeInfoPresent; /**< Active information present. Indicates if activeFormatAspectRatio field is valid */ - UInt8 barInformationDataValid; - /**< Bar information data valid */ - UInt8 scanInformation; /**< Scan information. See CEA-861-B table 8 for details */ - UInt8 colorimetry; /**< Colorimetry. See CEA-861-B table 9 for details */ - UInt8 pictureAspectRatio; /**< Picture aspect ratio. See CEA-861-B table 9 for details */ - UInt8 activeFormatAspectRatio; - /**< Active Format aspect ratio. See CEA-861-B table 10 and Annex H for details */ - UInt8 nonUniformPictureScaling; - /**< Non-uniform picture scaling. See CEA-861-B table 11 for details */ - UInt8 videoFormatIdentificationCode; - /**< Video format indentification code. See CEA-861-B section 6.3 for details */ - UInt8 pixelRepetitionFactor; - /**< Pixel repetition factor. See CEA-861-B table 11 for details */ - UInt16 lineNumberEndTopBar; - UInt16 lineNumberStartBottomBar; - UInt16 lineNumberEndLeftBar; - UInt16 lineNumberStartRightBar; - } tmdlHdmiTxAviIfData_t; - -/** - * \brief Structure defining the content of an ACP packet - */ - typedef struct { - Bool avMute; - } tmdlHdmiTxGcpPktData_t; - -/** - * \brief Structure defining the content of an AUD infoframe - */ - typedef struct { - UInt8 codingType; - /**< Coding type (always set to zero) */ - UInt8 channelCount; - /**< Channel count. See CEA-861-B table 17 for details */ - UInt8 samplefrequency; - /**< Sample frequency. See CEA-861-B table 18 for details */ - UInt8 sampleSize; - /**< Sample frequency. See CEA-861-B table 18 for details */ - UInt8 channelAllocation; - /**< Channel allocation. See CEA-861-B section 6.3.2 for details */ - Bool downmixInhibit; - /**< Downmix inhibit. See CEA-861-B section 6.3.2 for details */ - UInt8 levelShiftValue; - /**< level shift value for downmixing. See CEA-861-B section 6.3.2 and table 23 for details */ - } tmdlHdmiTxAudIfData_t; - -/** - * \brief Structure defining the content of an ISRC1 packet - */ - typedef struct { - Bool isrcCont; - /**< ISRC packet continued in next packet */ - Bool isrcValid; - /**< Set to one when ISRCStatus and UPC_EAN_ISRC_xx are valid */ - UInt8 isrcStatus; - /**< ISRC status */ - UInt8 UPC_EAN_ISRC[16]; - /**< ISRC packet data */ - } tmdlHdmiTxIsrc1PktData_t; - -/** - * \brief Structure defining the content of an ISRC2 packet - */ - typedef struct { - UInt8 UPC_EAN_ISRC[16]; - /**< ISRC packet data */ - } tmdlHdmiTxIsrc2PktData_t; - -/** - * \brief Structure defining the content of an MPS infoframe - */ - typedef struct { - UInt32 bitRate; - /**< MPEG bit rate in Hz */ - UInt32 frameType; - /**< MPEG frame type */ - Bool fieldRepeat; - /**< 0: new field, 1:repeated field */ - } tmdlHdmiTxMpsIfData_t; - -/** - * \brief Structure defining the content of an SPD infoframe - */ - typedef struct { - UInt8 vendorName[8]; - /**< Vendor name */ - UInt8 productDesc[16]; - /**< Product Description */ - UInt32 sourceDevInfo; - /**< Source Device Info */ - } tmdlHdmiTxSpdIfData_t; - - -/** - * \brief Structure defining the content of a VS infoframe packet according to HDMI 1.4a standard - */ - -/* HDMI version */ -#define TMDL_HDMITX_VERSION 0x01 - -/* HDMI video format [3bits] */ -#define TMDL_HDMITX_VIDEO_FORMAT_SHIFT 5 -#define TMDL_HDMITX_FORMAT_EXTENDED (0x01 << TMDL_HDMITX_VIDEO_FORMAT_SHIFT) -#define TMDL_HDMITX_3D (0x02 << TMDL_HDMITX_VIDEO_FORMAT_SHIFT) - -/* IEEE registration identifier (0x000C03) with least significant byte first */ -#define TMDL_HDMITX_HDMI_IEEE_BYTE0 0x03 -#define TMDL_HDMITX_HDMI_IEEE_BYTE1 0x0C -#define TMDL_HDMITX_HDMI_IEEE_BYTE2 0x00 - -/* 3D structure [4bits] */ -#define TMDL_HDMITX_3D_STRUCTURE_SHIFT 4 -#define TMDL_HDMITX_FRAME_PACKING (0x00 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) -#define TMDL_HDMITX_FIELD_ALTERNATIVE (0x01 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) -#define TMDL_HDMITX_LINE_ALTERNATIVE (0x02 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) -#define TMDL_HDMITX_SIDE_BY_SIDE_FULL (0x03 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) -#define TMDL_HDMITX_L_DEPTH (0x04 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) -#define TMDL_HDMITX_L_DEPTH_GFX (0x05 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) -#define TMDL_HDMITX_TOP_AND_BOTTOM (0x06 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) -#define TMDL_HDMITX_SIDE_BY_SIDE_HALF (0x08 << TMDL_HDMITX_3D_STRUCTURE_SHIFT) - -/* 3D EXT Data [4bits] */ -#define TMDL_HDMITX_3D_EXT_DATA_SHIFT 4 -#define TMDL_HDMITX_HORIZONTAL_SUB (0x00 << TMDL_HDMITX_3D_EXT_DATA_SHIFT) /* Horizontal sub-sampling */ -#define TMDL_HDMITX_QUINCUNX_OLOR (0x04 << TMDL_HDMITX_3D_EXT_DATA_SHIFT) /* Odd/Left picture, Odd/Right picture */ -#define TMDL_HDMITX_QUINCUNX_OLER (0x05 << TMDL_HDMITX_3D_EXT_DATA_SHIFT) /* Odd/Left picture, Even/Right picture */ -#define TMDL_HDMITX_QUINCUNX_ELOR (0x06 << TMDL_HDMITX_3D_EXT_DATA_SHIFT) /* Even/Left picture, Odd/Right picture */ -#define TMDL_HDMITX_QUINCUNX_ELER (0x07 << TMDL_HDMITX_3D_EXT_DATA_SHIFT) /* Even/Left picture, Even/Right picture */ - -/* 3D Meta field */ -#define TMDL_HDMITX_3D_META_TYPE_SHIFT 5 -#define TMDL_HDMITX_3D_META_PRESENT (0x01 << 3) -#define TMDL_HDMITX_3D_META_PARALLAX (0x00 << TMDL_HDMITX_3D_META_TYPE_SHIFT) - -#define TMDL_HDMITX_VS_PKT_DATA_LEN 27 - typedef struct { - UInt8 version; - /* - Packet Byte # 7 6 5 4 3 2 1 0 - - PB1 24bit IEEE Registration Identifier (0x000C03) - PB2 ( least significant byte first ) - PB3 - PB4 (HDMI_Video_Format ) (0) (0) (0) (0) (0) - PB5 (3D_Structure ) +Meta (0) (0) (0) - PB6 (3D_Ext_Data ) (0) (0) (0) (0) - PB7 (3D_Metadata_type ) (3D_Metadata_Length (= N)) - PB8 (3D_Metadata_1 ) - ... ... - PB [7+N] (3D_Metadata_N ) - PB[8+N]~[Nv] (Reserved (0) ) - */ - UInt8 vsData[TMDL_HDMITX_VS_PKT_DATA_LEN]; - - } tmdlHdmiTxVsPktData_t; - -/** - * \brief Structure defining the additional Edid VSDB data according to HDMI 1.4a standard - */ - typedef struct { - UInt8 maxTmdsClock; /* maximum supported TMDS clock */ - UInt8 cnc0; /* content type Graphics (text) */ - UInt8 cnc1; /* content type Photo */ - UInt8 cnc2; /* content type Cinema */ - UInt8 cnc3; /* content type Game */ - UInt8 hdmiVideoPresent; /* additional video format */ - UInt8 h3DPresent; /* 3D support by the HDMI Sink */ - UInt8 h3DMultiPresent; /* 3D multi strctures present */ - UInt8 imageSize; /* additional info for the values in the image size area */ - UInt8 hdmi3DLen; /* total length of 3D video formats */ - UInt8 hdmiVicLen; /* total length of extended video formats */ - UInt8 ext3DData[21]; /* max_len-10, ie: 31-10=21 */ - } tmdlHdmiTxEdidExtraVsdbData_t; - -/** - * \brief Structure defining the Edid audio descriptor - */ - typedef struct { - UInt8 format; /* EIA/CEA861 mode */ - UInt8 channels; /* number of channels */ - UInt8 supportedFreqs; /* bitmask of supported frequencies */ - UInt8 supportedRes; /* bitmask of supported resolutions (LPCM only) */ - UInt8 maxBitrate; /* Maximum bitrate divided by 8KHz (compressed formats only) */ - } tmdlHdmiTxEdidAudioDesc_t; - -/** - * \brief Structure defining detailed timings of a video format - */ - typedef struct { - UInt16 pixelClock; - /**< Pixel Clock/10 000 */ - UInt16 hActivePixels; - /**< Horizontal Active Pixels */ - UInt16 hBlankPixels; - /**< Horizontal Blanking Pixels */ - UInt16 vActiveLines; - /**< Vertical Active Lines */ - UInt16 vBlankLines; - /**< Vertical Blanking Lines */ - UInt16 hSyncOffset; - /**< Horizontal Sync Offset */ - UInt16 hSyncWidth; - /**< Horiz. Sync Pulse Width */ - UInt16 vSyncOffset; - /**< Vertical Sync Offset */ - UInt16 vSyncWidth; - /**< Vertical Sync Pulse Width */ - UInt16 hImageSize; - /**< Horizontal Image Size */ - UInt16 vImageSize; - /**< Vertical Image Size */ - UInt16 hBorderPixels; - /**< Horizontal Border */ - UInt16 vBorderPixels; - /**< Vertical Border */ - UInt8 flags; /**< Interlace/sync info */ - } tmdlHdmiTxEdidVideoTimings_t; - -/** size descriptor block of monitor descriptor */ -#define EDID_MONITOR_DESCRIPTOR_SIZE 13 - -/** - * \brief Structure defining the first monitor descriptor - */ - typedef struct { - Bool descRecord; /**< True when parameters of struct are available */ - UInt8 monitorName[EDID_MONITOR_DESCRIPTOR_SIZE]; - /**< Monitor Name */ - } tmdlHdmiTxEdidFirstMD_t; - -/** - * \brief Structure defining the second monitor descriptor - */ - typedef struct { - Bool descRecord; /**< True when parameters of struct are available */ - UInt8 minVerticalRate; - /**< Min vertical rate in Hz */ - UInt8 maxVerticalRate; - /**< Max vertical rate in Hz */ - UInt8 minHorizontalRate; - /**< Min horizontal rate in Hz */ - UInt8 maxHorizontalRate; - /**< Max horizontal rate in Hz */ - UInt8 maxSupportedPixelClk; - /**< Max suuported pixel clock rate in MHz */ - } tmdlHdmiTxEdidSecondMD_t; - -/** - * \brief Structure defining the other monitor descriptor - */ - typedef struct { - Bool descRecord; /**< True when parameters of struct are available */ - UInt8 otherDescriptor[EDID_MONITOR_DESCRIPTOR_SIZE]; - /**< Other monitor Descriptor */ - } tmdlHdmiTxEdidOtherMD_t; - -/** - * \brief Test pattern types - */ - typedef enum { - TMDL_HDMITX_PATTERN_OFF = 0, - /**< Insert test pattern */ - TMDL_HDMITX_PATTERN_CBAR4 = 1, - /**< Insert 4-bar colour bar */ - TMDL_HDMITX_PATTERN_CBAR8 = 2, - /**< Insert 8-bar colour bar */ - TMDL_HDMITX_PATTERN_BLUE = 3, - /**< Insert Blue screen */ - TMDL_HDMITX_PATTERN_BLACK = 4, - /**< Insert Black screen */ - TMDL_HDMITX_PATTERN_INVALID = 5 - /**< Invalid pattern */ - } tmdlHdmiTxTestPattern_t; - -/** - * \brief Enum listing all hdcp state - */ - typedef enum { - TMDL_HDMITX_HDCP_CHECK_NOT_STARTED = 0, - /**< Check not started */ - TMDL_HDMITX_HDCP_CHECK_IN_PROGRESS = 1, - /**< No failures, more to do */ - TMDL_HDMITX_HDCP_CHECK_PASS = 2, /**< Final check has passed */ - TMDL_HDMITX_HDCP_CHECK_FAIL_FIRST = 3, - /**< First check failure code */ - TMDL_HDMITX_HDCP_CHECK_FAIL_DRIVER_STATE = 3, - /**< Driver not AUTHENTICATED */ - TMDL_HDMITX_HDCP_CHECK_FAIL_DEVICE_T0 = 4, - /**< A T0 interrupt occurred */ - TMDL_HDMITX_HDCP_CHECK_FAIL_DEVICE_RI = 5, - /**< Device RI changed */ - TMDL_HDMITX_HDCP_CHECK_FAIL_DEVICE_FSM = 6, - /**< Device FSM not 10h */ - TMDL_HDMITX_HDCP_CHECK_NUM = 7 /**< Number of check results */ - } tmdlHdmiTxHdcpCheck_t; - -/** - * \brief Enum listing all hdcp option flags - */ - typedef enum { - TMDL_HDMITX_HDCP_OPTION_FORCE_PJ_IGNORED = 0x01, /* Not set: obey PJ result */ - TMDL_HDMITX_HDCP_OPTION_FORCE_SLOW_DDC = 0x02, /* Not set: obey BCAPS setting */ - TMDL_HDMITX_HDCP_OPTION_FORCE_NO_1_1 = 0x04, /* Not set: obey BCAPS setting */ - TMDL_HDMITX_HDCP_OPTION_FORCE_REPEATER = 0x08, /* Not set: obey BCAPS setting */ - TMDL_HDMITX_HDCP_OPTION_FORCE_NO_REPEATER = 0x10, /* Not set: obey BCAPS setting */ - TMDL_HDMITX_HDCP_OPTION_FORCE_V_EQU_VBAR = 0x20, /* Not set: obey V=V' result */ - TMDL_HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC = 0x40, /* Set: 50kHz DDC */ - TMDL_HDMITX_HDCP_OPTION_DEFAULT = 0x00, /* All the above Not Set vals */ - TMDL_HDMITX_HDCP_OPTION_MASK = 0x7F, /* Only these bits are allowed */ - TMDL_HDMITX_HDCP_OPTION_MASK_BAD = 0x80 /* These bits are not allowed */ - } tmdlHdmiTxHdcpOptions_t; - -#ifndef NO_HDCP -/** KSV list sizes */ - typedef enum { - TMDL_HDMITX_KSV_LIST_MAX_DEVICES = 128, - TMDL_HDMITX_KSV_BYTES_PER_DEVICE = 5 - } tmdlHdmiTxHdcpHandleSHA_1; - -/** - * \brief Structure defining information about hdcp - */ - typedef struct { - tmdlHdmiTxHdcpCheck_t hdcpCheckState; /* Hdcp check state */ - UInt8 hdcpErrorState; /* Error State when T0 occured */ - Bool bKsvSecure; /* BKSV is secured */ - UInt8 hdcpBksv[TMDL_HDMITX_KSV_BYTES_PER_DEVICE]; /* BKSV read from B sink */ - UInt8 hdcpKsvList[TMDL_HDMITX_KSV_BYTES_PER_DEVICE * TMDL_HDMITX_KSV_LIST_MAX_DEVICES]; /* KSV list read from B sink during - SHA-1 interrupt */ - UInt8 hdcpKsvDevices; /* Number of devices read from - B sink during SHA-1 interrupt */ - UInt8 hdcpDeviceDepth; /* Connection tree depth */ - Bool hdcpMaxCascExceeded; - Bool hdcpMaxDevsExceeded; - } tmdlHdmiTxHdcpInfo_t; -#endif /* NO_HDCP */ - -/** - * \brief Enum defining possible HDCP - */ - typedef enum { - TMDL_HDMITX_HDCP_OK = 0, - TMDL_HDMITX_HDCP_BKSV_RCV_FAIL, /* Source does not receive Sink BKsv */ - TMDL_HDMITX_HDCP_BKSV_CHECK_FAIL, /* BKsv does not contain 20 zeros and 20 ones */ - TMDL_HDMITX_HDCP_BCAPS_RCV_FAIL, /* Source does not receive Sink Bcaps */ - TMDL_HDMITX_HDCP_AKSV_SEND_FAIL, /* Source does not send AKsv */ - TMDL_HDMITX_HDCP_R0_RCV_FAIL, /* Source does not receive R'0 */ - TMDL_HDMITX_HDCP_R0_CHECK_FAIL, /* R0 = R'0 check fail */ - TMDL_HDMITX_HDCP_BKSV_NOT_SECURE, - TMDL_HDMITX_HDCP_RI_RCV_FAIL, /* Source does not receive R'i */ - TMDL_HDMITX_HDCP_RPT_RI_RCV_FAIL, /* Source does not receive R'i repeater mode */ - TMDL_HDMITX_HDCP_RI_CHECK_FAIL, /* RI = R'I check fail */ - TMDL_HDMITX_HDCP_RPT_RI_CHECK_FAIL, /* RI = R'I check fail repeater mode */ - TMDL_HDMITX_HDCP_RPT_BCAPS_RCV_FAIL, /* Source does not receive Sink Bcaps repeater mode */ - TMDL_HDMITX_HDCP_RPT_BCAPS_READY_TIMEOUT, - TMDL_HDMITX_HDCP_RPT_V_RCV_FAIL, /* Source does not receive V' */ - TMDL_HDMITX_HDCP_RPT_BSTATUS_RCV_FAIL, /* Source does not receive BSTATUS repeater mode */ - TMDL_HDMITX_HDCP_RPT_KSVLIST_RCV_FAIL, /* Source does not receive Ksv list in repeater mode */ - TMDL_HDMITX_HDCP_RPT_KSVLIST_NOT_SECURE, - TMDL_HDMITX_HDCP_UNKNOWN_STATUS - } tmdlHdmiTxHdcpStatus_t; - - -/** - * \brief EDID information about sink latency - */ - typedef struct { - Bool latency_available; - Bool Ilatency_available; - UInt8 Edidvideo_latency; - UInt8 Edidaudio_latency; - UInt8 EdidIvideo_latency; - UInt8 EdidIaudio_latency; - - } tmdlHdmiTxEdidLatency_t; - - -/** - * \brief Enum defining possible HotPlug status - */ - typedef enum { - TMDL_HDMITX_HOTPLUG_INACTIVE = 0, - /**< Hotplug inactive */ - TMDL_HDMITX_HOTPLUG_ACTIVE = 1, - /**< Hotplug active */ - TMDL_HDMITX_HOTPLUG_INVALID = 2 - /**< Invalid Hotplug */ - } tmdlHdmiTxHotPlug_t; - - -/** - * \brief Enum defining possible RxSense status - */ - typedef enum { - TMDL_HDMITX_RX_SENSE_INACTIVE = 0, - /**< RxSense inactive */ - TMDL_HDMITX_RX_SENSE_ACTIVE = 1, - /**< RxSense active */ - TMDL_HDMITX_RX_SENSE_INVALID = 2 - /**< Invalid RxSense */ - } tmdlHdmiTxRxSense_t; - - -/** - * \brief Enum listing all the types of extented colorimetries - */ - typedef enum { - TMDL_HDMITX_EXT_COLORIMETRY_XVYCC601 = 0, - TMDL_HDMITX_EXT_COLORIMETRY_XVYCC709 = 1, - TMDL_HDMITX_EXT_COLORIMETRY_SYCC601 = 2, - TMDL_HDMITX_EXT_COLORIMETRY_ADOBEYCC601 = 3, - TMDL_HDMITX_EXT_COLORIMETRY_ADOBERGB = 4, - TMDL_HDMITX_EXT_COLORIMETRY_INVALID = 5 - } tmdlHdmiTxExtColorimetry_t; - -#ifdef __cplusplus -} -#endif -#endif /* TMDLHDMITX_TYPES_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_cfg.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_cfg.c deleted file mode 100644 index d334f8e8b58..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_cfg.c +++ /dev/null @@ -1,840 +0,0 @@ -/** - * Copyright (C) 2006 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx_cfg.c - * - * \version Revision: 1 - * - * \date Date: 25/03/11 11:00 - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * - * \section info Change Information - * - * \verbatim - - History: tmdlHdmiTx_cfg.c - * - * ***************** Version 2 ***************** - * User: V. Vrignaud Date: March 25th, 2011 - * - * ***************** Version 1 ***************** - * User: J. Lamotte Date: 08/08/07 Time: 11:00 - * initial version - * - - \endverbatim - * -*/ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ - -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "tmNxCompId.h" -#include "tmdlHdmiTx_Types.h" -#include "tmdlHdmiTx_Functions.h" - - - -#include "tmNxTypes.h" -#include "tmbslHdmiTx_types.h" -#include "tmdlHdmiTx_cfg.h" -#include "tmdlHdmiTx_IW.h" -/* macro for quick error handling */ -#define RETIF(cond, rslt) if ((cond)) {return (rslt); } -#define I2C_M_WR 0 - -/*============================================================================*/ -/* STATIC FUNCTION DECLARATIONS */ -/*============================================================================*/ -tmErrorCode_t TxI2cReadFunction(tmbslHdmiTxSysArgs_t *pSysArgs); -tmErrorCode_t TxI2cWriteFunction(tmbslHdmiTxSysArgs_t *pSysArgs); - -/****************************************************************************** - ****************************************************************************** - * THIS PART CAN BE MODIFIED BY CUSTOMER * - ****************************************************************************** - *****************************************************************************/ -struct i2c_client *GetThisI2cClient(void); -unsigned char my_i2c_data[255]; - -/* The following includes are used by I2C access function. If */ -/* you need to rewrite these functions for your own SW infrastructure, then */ -/* it can be removed */ -# include -# include -# include -# include -# include -# include - -/* I2C adress of the unit */ -/* Put there the I2C slave adress of the Tx transmitter IC */ -#define UNIT_I2C_ADDRESS_0 0x70 - -/* Intel CE 4100 I2C bus number */ -/* Put there the number of I2C bus handling the Rx transmitter IC */ -#define I2C_BUS_NUMBER_0 0 /* initial:0 */ - -/* I2C Number of bytes in the data buffer. */ -#define SUB_ADDR_BYTE_COUNT_0 1 - -/* Priority of the command task */ -/* Command task is an internal task that handles incoming event from the IC */ -/* put there a value that will ensure a response time of ~20ms in your system */ -#define COMMAND_TASK_PRIORITY_0 250 -#define COMMAND_TASK_PRIORITY_1 250 - -#include "tmdlHdmiTx_IW.h" -#include "tmdlHdmiTx.h" -#include "tmdlHdmiTx_cfg.h" -#include "I2C.h" - -#ifdef TMFL_CEC_AVAILABLE -#include "tmdlHdmiCEC_functions.h" -#define CEC_UNIT_I2C_ADDRESS_0 0x34 -#define CEC_UNIT_I2C_ADDRESS_1 0x34 -#endif - -/* #ifdef TMFL_LINUX_OS_KERNEL_DRIVER */ -#if defined(TMFL_CFG_ZOOMII) /* OMAP Zoom II */ -# include "tmdlHdmiTx_Linux_cfg.c" -#elif defined(TMFL_CFG_INTELCE4100) /* Intel CE 4100 */ -# include "tmdlHdmiTx_IntelCE4100_cfg.c" -#elif defined(TMFL_OS_WINDOWS) /* Windows demo application */ -# include "tmdlHdmiTx_Win_cfg.c" -#else /* Section to be modified by customer - Default configuration for NXP evalkit */ - -/*============================================================================*/ -/* MACRO */ -/*============================================================================*/ - -/*============================================================================*/ -/* STATIC FUNCTION DECLARATIONS */ -/*============================================================================*/ -tmErrorCode_t TxI2cReadFunction(tmbslHdmiTxSysArgs_t *pSysArgs); -tmErrorCode_t TxI2cWriteFunction(tmbslHdmiTxSysArgs_t *pSysArgs); - -/****************************************************************************** - ****************************************************************************** - * THIS PART CAN BE MODIFIED BY CUSTOMER * - ****************************************************************************** - *****************************************************************************/ -/* The following includes are used by I2C access function for ARM7. If */ -/* you need to rewrite these functions for your own SW infrastructure, then */ -/* it can be removed */ -/* #include "I2C.h" */ -/* #include */ - -/* I2C adress of the unit */ -/* Put there the I2C slave adress of the Tx transmitter IC */ -#define UNIT_I2C_ADDRESS_0 0x70 - -/* Priority of the command task */ -/* Command task is an internal task that handles incoming event from the IC */ -/* put there a value that will ensure a response time of ~20ms in your system */ -#define COMMAND_TASK_PRIORITY_0 250 -#define COMMAND_TASK_PRIORITY_1 250 - -/* Priority of the hdcp check tasks */ -/* HDCP task is an internal task that handles periodical HDCP processing */ -/* put there a value that will ensure a response time of ~20ms in your system */ -#define HDCP_CHECK_TASK_PRIORITY_0 250 - -/* Stack size of the command tasks */ -/* This value depends of the type of CPU used, and also from the length of */ -/* the customer callbacks. Increase this value if you are making a lot of */ -/* processing (function calls & local variables) and that you experience */ -/* stack overflows */ -#define COMMAND_TASK_STACKSIZE_0 128 -#define COMMAND_TASK_STACKSIZE_1 128 - -/* stack size of the hdcp check tasks */ -/* This value depends of the type of CPU used, default value should be enough */ -/* for all configuration */ -#define HDCP_CHECK_TASK_STACKSIZE_0 128 - -/* Size of the message queues for command tasks */ -/* This value defines the size of the message queue used to link the */ -/* the tmdlHdmiTxHandleInterrupt function and the command task. The default */ -/* value below should fit any configuration */ -#define COMMAND_TASK_QUEUESIZE_0 128 -#define COMMAND_TASK_QUEUESIZE_1 128 - -/* HDCP key seed */ -/* HDCP key are stored encrypted into the IC, this value allows the IC to */ -/* decrypt them. This value is provided to the customer by NXP customer */ -/* support team. */ -#define KEY_SEED 0x1234 - -/* Video port configuration for YUV444 input */ -/* You can specify in this table how are connected video ports in case of */ -/* YUV444 input signal. Each line of the array corresponds to a quartet of */ -/* pins of one video port (see comment on the left to identify them). Just */ -/* change the enum to specify which signal you connected to it. See file */ -/* tmdlHdmiTx_cfg.h to get the list of possible values */ -const tmdlHdmiTxCfgVideoSignal444 videoPortMapping_YUV444[MAX_UNITS][6] = { - { - TMDL_HDMITX_VID444_GY_0_TO_3, /* Signals connected to VPB[0..3] */ - TMDL_HDMITX_VID444_GY_4_TO_7, /* Signals connected to VPB[4..7] */ - TMDL_HDMITX_VID444_BU_0_TO_3, /* Signals connected to VPA[0..3] */ - TMDL_HDMITX_VID444_BU_4_TO_7, /* Signals connected to VPA[4..7] */ - TMDL_HDMITX_VID444_VR_0_TO_3, /* Signals connected to VPC[0..3] */ - TMDL_HDMITX_VID444_VR_4_TO_7 /* Signals connected to VPC[4..7] */ - } -}; - -/* Video port configuration for RGB444 input */ -/* You can specify in this table how are connected video ports in case of */ -/* RGB444 input signal. Each line of the array corresponds to a quartet of */ -/* pins of one video port (see comment on the left to identify them). Just */ -/* change the enum to specify which signal you connected to it. See file */ -/* tmdlHdmiTx_cfg.h to get the list of possible values */ -const tmdlHdmiTxCfgVideoSignal444 videoPortMapping_RGB444[MAX_UNITS][6] = { - { - TMDL_HDMITX_VID444_VR_0_TO_3, /* Signals connected to VPC[0..3] */ - TMDL_HDMITX_VID444_VR_4_TO_7, /* Signals connected to VPC[4..7] */ - - TMDL_HDMITX_VID444_BU_0_TO_3, /* Signals connected to VPA[0..3] */ - TMDL_HDMITX_VID444_BU_4_TO_7, /* Signals connected to VPA[4..7] */ - TMDL_HDMITX_VID444_GY_0_TO_3, /* Signals connected to VPB[0..3] */ - TMDL_HDMITX_VID444_GY_4_TO_7, /* Signals connected to VPB[4..7] */ - - - } -}; - -/* Video port configuration for YUV422 input */ -/* You can specify in this table how are connected video ports in case of */ -/* YUV422 input signal. Each line of the array corresponds to a quartet of */ -/* pins of one video port (see comment on the left to identify them). Just */ -/* change the enum to specify which signal you connected to it. See file */ -/* tmdlHdmiTx_cfg.h to get the list of possible values */ -const tmdlHdmiTxCfgVideoSignal422 videoPortMapping_YUV422[MAX_UNITS][6] = { - { - TMDL_HDMITX_VID422_NOT_CONNECTED, /* Signals connected to VPC[0..3] */ - TMDL_HDMITX_VID422_NOT_CONNECTED, /* Signals connected to VPB[4..7] */ - TMDL_HDMITX_VID422_UV_4_TO_7, /* Signals connected to VPC[4..7] */ - TMDL_HDMITX_VID422_UV_8_TO_11, /* Signals connected to VPB[0..3] */ - TMDL_HDMITX_VID422_Y_4_TO_7, /* Signals connected to VPA[0..3] */ - TMDL_HDMITX_VID422_Y_8_TO_11 /* Signals connected to VPA[4..7] */ - } -}; - -/* Video port configuration for CCIR656 input */ -/* You can specify in this table how are connected video ports in case of */ -/* CCIR656 input signal. Each line of the array corresponds to a quartet of */ -/* pins of one video port (see comment on the left to identify them). Just */ -/* change the enum to specify which signal you connected to it. See file */ -/* tmdlHdmiTx_cfg.h to get the list of possible values */ -const tmdlHdmiTxCfgVideoSignalCCIR656 videoPortMapping_CCIR656[MAX_UNITS][6] = { - { - TMDL_HDMITX_VIDCCIR_NOT_CONNECTED, /* Signals connected to VPB[0..3] */ - TMDL_HDMITX_VIDCCIR_NOT_CONNECTED, /* Signals connected to VPB[4..7] */ - TMDL_HDMITX_VIDCCIR_NOT_CONNECTED, /* Signals connected to VPC[0..3] */ - TMDL_HDMITX_VIDCCIR_NOT_CONNECTED, /* Signals connected to VPC[4..7] */ - TMDL_HDMITX_VIDCCIR_4_TO_7, /* Signals connected to VPA[4..7] */ - TMDL_HDMITX_VIDCCIR_8_TO_11 /* Signals connected to VPA[0..3] */ - } -}; - -/* The following function must be rewritten by the customer to fit its own */ -/* SW infrastructure. This function allows reading through I2C bus. */ -/* tmbslHdmiTxSysArgs_t definition is located into tmbslHdmiTx_type.h file. */ -tmErrorCode_t TxI2cReadFunction(tmbslHdmiTxSysArgs_t *pSysArgs) -{ - tmErrorCode_t errCode = TM_OK; - - if (pSysArgs->slaveAddr == 0x70) { - errCode = i2cRead(reg_TDA998X, (tmbslHdmiSysArgs_t *) pSysArgs); - } else if (pSysArgs->slaveAddr == 0x34) { - errCode = i2cRead(reg_TDA9989_CEC, (tmbslHdmiSysArgs_t *) pSysArgs); - } else { - errCode = ~TM_OK; - } - - return errCode; -} - -/* The following function must be rewritten by the customer to fit its own */ -/* SW infrastructure. This function allows writing through I2C bus. */ -/* tmbslHdmiTxSysArgs_t definition is located into tmbslHdmiTx_type.h file. */ -tmErrorCode_t TxI2cWriteFunction(tmbslHdmiTxSysArgs_t *pSysArgs) -{ - tmErrorCode_t errCode = TM_OK; - - if (pSysArgs->slaveAddr == 0x70) { - errCode = i2cWrite(reg_TDA998X, (tmbslHdmiSysArgs_t *) pSysArgs); - - } else if (pSysArgs->slaveAddr == 0x34) { - errCode = i2cWrite(reg_TDA9989_CEC, (tmbslHdmiSysArgs_t *) pSysArgs); - } else { - errCode = ~TM_OK; - } - - return errCode; -} - -#endif - -#ifdef TMFL_RGB_DDR_12BITS - -/* Video port configuration for RGB 24 bits input received with only 12 bits */ -/* using the double data rate */ -/* - The main difference between RGB12 bits and CCIR 656 formats is that for the new format - RGB888 the“Green� data is separated on rising and on falling edge. This is in principle - no problem only the result is that the colors RGB will be swabbed. - After the Video Input Processing (VIP) module there will be a multiplexer structure - implemented which can swab all colors and combinations. - - Extra information on request - - P:\Partages\BCT_TV_FE\Product_Development\Project folders\TDA19988 \ - 14_Design\Video_pipe_Schematic_RGB888.pdf - - but ok, let's give it a try... - - In DDR, VIP input latches on failing and raising clock edge, - so VIP internal input is doubled from 24 to 48 bits - - VIP input ------>[ T ]---[ T ]--------------------> VIP internal input - /24 | | ° /24 | /48 - | | | | - | pclk----------- | - | | | - | ° | - ------>[ T ]------------------ - /24 - - But in the 24 VIP input, only 12 bits are used : - - ------------------------------------------------------------------- - | | | | | | | - | Vpc[7:4] | Vpc[3:0] | Vpb[7:4] | Vpb[3:0] | Vpa[7:4] | Vpa[3:0] | - | | | ........ | | ........ | ........ | - ------------------------------------------------------------------- - ^ ^ ^ - | | | - | | | - location of valid data ------------------------------------- - - So we get first RGB 12 bits on bits 24 to 47 of VIP internal input - and second RGB 12 bits on bits 0 to 23 of VIP internal input - - 1)first edge (failing) R[7:4] R[3:0] G[7:4] - | | | - | | | - V V V - --------------------------------------------------------------------.. - | | | | | | | - | 47...44 | 43...40 | 39...36 | 35...32 | 31...28 | 27...24 | - | | | | | | | - --------------------------------------------------------------------.. - - 2)2nd edge (raising) G[3:0] B[7:3] B[3:0] - | | | - | | | - V V V -..------------------------------------------------------------------- - | | | | | | | - | 23...20 | 19...16 | 15...12 | 11...8 | 7...4 | 3...0 | - | | | | | | | -..------------------------------------------------------------------- - - - - - - - After port swaping, internal video bus goes back from 48 to 24 bits - - VIP internal ------------>[ swap ]-------[ T ]----------> - /48 | | /24 - | | - i2c_swap_a/f ------ pclk --- - - ------------------------------------------------------------------- - | | | | | | | - | 23...20 | 19...16 | 15...12 | 11...8 | 7...4 | 3...0 | - | | | | | | | - ------------------------------------------------------------------- - R[7:4] R[3:0] G[7:4] G[3:0] B[7:3] B[3:0] - - Here is the swapping code : - -IF i2c_swap_a = "000" THEN vp_alt_d2(11 downto 8) <= vp_alt_i_r(23 downto 20); vp_alt_d2(23 downto 20) <= vp_alt_i_r(47 downto 44); -ELSIF i2c_swap_a = "001" THEN vp_alt_d2(11 downto 8) <= vp_alt_i_r(19 downto 16); vp_alt_d2(23 downto 20) <= vp_alt_i_r(43 downto 40); -ELSIF i2c_swap_a = "010" THEN vp_alt_d2(11 downto 8) <= vp_alt_i_r(15 downto 12); vp_alt_d2(23 downto 20) <= vp_alt_i_r(39 downto 36); -ELSIF i2c_swap_a = "011" THEN vp_alt_d2(11 downto 8) <= vp_alt_i_r(11 downto 8 ); vp_alt_d2(23 downto 20) <= vp_alt_i_r(35 downto 32); -ELSIF i2c_swap_a = "100" THEN vp_alt_d2(11 downto 8) <= vp_alt_i_r( 7 downto 4 ); vp_alt_d2(23 downto 20) <= vp_alt_i_r(31 downto 28); -ELSE vp_alt_d2(11 downto 8) <= vp_alt_i_r( 3 downto 0 ); vp_alt_d2(23 downto 20) <= vp_alt_i_r(27 downto 24); END IF; - -IF i2c_swap_b = "000" THEN vp_alt_d2( 7 downto 4) <= vp_alt_i_r(23 downto 20); vp_alt_d2(19 downto 16) <= vp_alt_i_r(47 downto 44); -ELSIF i2c_swap_b = "001" THEN vp_alt_d2( 7 downto 4) <= vp_alt_i_r(19 downto 16); vp_alt_d2(19 downto 16) <= vp_alt_i_r(43 downto 40); -ELSIF i2c_swap_b = "010" THEN vp_alt_d2( 7 downto 4) <= vp_alt_i_r(15 downto 12); vp_alt_d2(19 downto 16) <= vp_alt_i_r(39 downto 36); -ELSIF i2c_swap_b = "011" THEN vp_alt_d2( 7 downto 4) <= vp_alt_i_r(11 downto 8 ); vp_alt_d2(19 downto 16) <= vp_alt_i_r(35 downto 32); -ELSIF i2c_swap_b = "100" THEN vp_alt_d2( 7 downto 4) <= vp_alt_i_r( 7 downto 4 ); vp_alt_d2(19 downto 16) <= vp_alt_i_r(31 downto 28); -ELSE vp_alt_d2( 7 downto 4) <= vp_alt_i_r( 3 downto 0 ); vp_alt_d2(19 downto 16) <= vp_alt_i_r(27 downto 24); END IF; - -IF i2c_swap_c = "000" THEN vp_alt_d2( 3 downto 0) <= vp_alt_i_r(23 downto 20); vp_alt_d2(15 downto 12) <= vp_alt_i_r(47 downto 44); -ELSIF i2c_swap_c = "001" THEN vp_alt_d2( 3 downto 0) <= vp_alt_i_r(19 downto 16); vp_alt_d2(15 downto 12) <= vp_alt_i_r(43 downto 40); -ELSIF i2c_swap_c = "010" THEN vp_alt_d2( 3 downto 0) <= vp_alt_i_r(15 downto 12); vp_alt_d2(15 downto 12) <= vp_alt_i_r(39 downto 36); -ELSIF i2c_swap_c = "011" THEN vp_alt_d2( 3 downto 0) <= vp_alt_i_r(11 downto 8 ); vp_alt_d2(15 downto 12) <= vp_alt_i_r(35 downto 32); -ELSIF i2c_swap_c = "100" THEN vp_alt_d2( 3 downto 0) <= vp_alt_i_r( 7 downto 4 ); vp_alt_d2(15 downto 12) <= vp_alt_i_r(31 downto 28); -ELSE vp_alt_d2( 3 downto 0) <= vp_alt_i_r( 3 downto 0 ); vp_alt_d2(15 downto 12) <= vp_alt_i_r(27 downto 24); END IF; - - in case of RGB DDR 12 bits, we get : - . i2c_swap_a = "010" - . i2c_swap_b = "011" - . i2c_swap_c > "100" - - ;) - -*/ - -const tmdlHdmiTxCfgVideoSignal_RGB_DDR_12bits VideoPortMapping_RGB_DDR_12bits[MAX_UNITS][6] = { - { - TMDL_HDMITX_VID_B_0_3_G_4_7, /* Signals connected to VPA[0..3] */ - TMDL_HDMITX_VID_DDR_NOT_CONNECTED, /* Signals connected to VPA[4..7] */ - TMDL_HDMITX_VID_B_4_7_R_0_3, /* Signals connected to VPB[0..3] */ - TMDL_HDMITX_VID_G_0_3_R_4_7, /* Signals connected to VPB[4..7] */ - TMDL_HDMITX_VID_DDR_NOT_CONNECTED, /* Signals connected to VPC[0..3] */ - TMDL_HDMITX_VID_DDR_NOT_CONNECTED /* Signals connected to VPC[4..7] */ - } -}; - -/* - - Then VIP targeted order is not RGB but BGR - so we use a new register for TDA19988 MUX_VP_VIP_OUT - with VIP_OUTPUT_RGB_GBR as defined in cfg.h file - - ------------------------------------------------------------------- - | | | | | | | - | 23...20 | 19...16 | 15...12 | 11...8 | 7...4 | 3...0 | - | | | | | | | - ------------------------------------------------------------------- - R[7:4] R[3:0] G[7:4] G[3:0] B[7:3] B[3:0] - - . . - - . . - - . . - - . . - . - . - . - . - . - . - . - - . . - - . . - - . . - - - G[7:4] G[3:0] B[7:4] B[3:0] R[7:3] R[3:0] - -*/ - -const UInt8 VideoPortMux_RGB_DDR_12bits[MAX_UNITS] = { - VIP_MUX_R_R | VIP_MUX_G_G | VIP_MUX_B_B -}; - -const UInt8 VideoPortNoMux[MAX_UNITS] = { - VIP_MUX_G_B | VIP_MUX_B_R | VIP_MUX_R_G -}; - -#endif /* TMFL_RGB_DDR_12BITS */ - -/* Audio port configuration for SPDIF */ -/* Here you can specify the audio port routing configuration for SPDIF input. */ -/* enableAudioPortSPDIF and groundAudioPortSPDIF should be filled with a */ -/* value build as follows : each bit represent an audio port, LSB is port 0. */ -/* enableAudioClockPortSPDIF and groundAudioClockPortSPDIF can be configured */ -/* with the corresponding enums (See file tmdlHdmiTx_cfg.h for more details). */ -UInt8 enableAudioPortSPDIF[MAX_UNITS] = { 0x02 }; -UInt8 enableAudioClockPortSPDIF[MAX_UNITS] = { DISABLE_AUDIO_CLOCK_PORT }; -UInt8 groundAudioPortSPDIF[MAX_UNITS] = { 0xFD }; -UInt8 groundAudioClockPortSPDIF[MAX_UNITS] = { ENABLE_AUDIO_CLOCK_PORT_PULLDOWN }; - -/* Audio port configuration for I2S */ -/* Here you can specify the audio port routing configuration for SPDIF input. */ -/* enableAudioPortI2S and groundAudioPortI2S should be filled with a */ -/* value build as follows : each bit represent an audio port, LSB is port 0. */ -/* enableAudioClockPortI2S and groundAudioClockPortI2S can be configured */ -/* with the corresponding enums (See file tmdlHdmiTx_cfg.h for more details). */ -UInt8 enableAudioPortI2S[MAX_UNITS] = { 0x03 }; -UInt8 enableAudioPortI2S8C[MAX_UNITS] = { 0x1f }; -UInt8 enableAudioClockPortI2S[MAX_UNITS] = { ENABLE_AUDIO_CLOCK_PORT }; -UInt8 groundAudioPortI2S[MAX_UNITS] = { 0xfc }; -UInt8 groundAudioPortI2S8C[MAX_UNITS] = { 0xe0 }; -UInt8 groundAudioClockPortI2S[MAX_UNITS] = { DISABLE_AUDIO_CLOCK_PORT_PULLDOWN }; - -/* Audio port configuration for OBA */ -/* Here you can specify the audio port routing configuration for SPDIF input. */ -/* enableAudioPortOBA and groundAudioPortOBA should be filled with a */ -/* value build as follows : each bit represent an audio port, LSB is port 0. */ -/* enableAudioClockPortOBA and groundAudioClockPortOBA can be configured */ -/* with the corresponding enums (See file tmdlHdmiTx_cfg.h for more details). */ -UInt8 enableAudioPortOBA[MAX_UNITS] = { 0xFF }; -UInt8 enableAudioClockPortOBA[MAX_UNITS] = { ENABLE_AUDIO_CLOCK_PORT }; -UInt8 groundAudioPortOBA[MAX_UNITS] = { 0x00 }; -UInt8 groundAudioClockPortOBA[MAX_UNITS] = { DISABLE_AUDIO_CLOCK_PORT_PULLDOWN }; - -/* Audio port configuration for DST */ -/* Here you can specify the audio port routing configuration for SPDIF input. */ -/* enableAudioPortDST and groundAudioPortDST should be filled with a */ -/* value build as follows : each bit represent an audio port, LSB is port 0. */ -/* enableAudioClockPortDST and groundAudioClockPortDST can be configured */ -/* with the corresponding enums (See file tmdlHdmiTx_cfg.h for more details). */ -UInt8 enableAudioPortDST[MAX_UNITS] = { 0xFF }; -UInt8 enableAudioClockPortDST[MAX_UNITS] = { ENABLE_AUDIO_CLOCK_PORT }; -UInt8 groundAudioPortDST[MAX_UNITS] = { 0x00 }; -UInt8 groundAudioClockPortDST[MAX_UNITS] = { DISABLE_AUDIO_CLOCK_PORT_PULLDOWN }; - -/* Audio port configuration for HBR */ -/* Here you can specify the audio port routing configuration for SPDIF input. */ -/* enableAudioPortHBR and groundAudioPortHBR should be filled with a */ -/* value build as follows : each bit represent an audio port, LSB is port 0. */ -/* enableAudioClockPortHBR and groundAudioClockPortHBR can be configured */ -/* with the corresponding enums (See file tmdlHdmiTx_cfg.h for more details). */ -UInt8 enableAudioPortHBR[MAX_UNITS] = { 0x1f }; -UInt8 enableAudioClockPortHBR[MAX_UNITS] = { ENABLE_AUDIO_CLOCK_PORT }; -UInt8 groundAudioPortHBR[MAX_UNITS] = { 0xe0 }; -UInt8 groundAudioClockPortHBR[MAX_UNITS] = { DISABLE_AUDIO_CLOCK_PORT_PULLDOWN }; - -/***************************************************************************** -****************************************************************************** -* THIS PART MUST NOT BE MODIFIED BY CUSTOMER * -****************************************************************************** -*****************************************************************************/ - -/* DO NOT MODIFY, those tables are filled dynamically by */ -/* dlHdmiTxGenerateCfgVideoPortTables API */ -UInt8 mirrorTableCCIR656[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 swapTableCCIR656[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 enableVideoPortCCIR656[MAX_UNITS][3] = { {0x00, 0x00, 0x00} }; -UInt8 groundVideoPortCCIR656[MAX_UNITS][3] = { {0xFF, 0xFF, 0xFF} }; -UInt8 mirrorTableYUV422[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 swapTableYUV422[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 enableVideoPortYUV422[MAX_UNITS][3] = { {0x00, 0x00, 0x00} }; -UInt8 groundVideoPortYUV422[MAX_UNITS][3] = { {0xFF, 0xFF, 0xFF} }; -UInt8 mirrorTableYUV444[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 swapTableYUV444[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 enableVideoPortYUV444[MAX_UNITS][3] = { {0x00, 0x00, 0x00} }; -UInt8 groundVideoPortYUV444[MAX_UNITS][3] = { {0xFF, 0xFF, 0xFF} }; -UInt8 mirrorTableRGB444[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 swapTableRGB444[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 enableVideoPortRGB444[MAX_UNITS][3] = { {0x00, 0x00, 0x00} }; -UInt8 groundVideoPortRGB444[MAX_UNITS][3] = { {0xFF, 0xFF, 0xFF} }; - -#ifdef TMFL_RGB_DDR_12BITS -UInt8 mirrorTableRGB_DDR_12bits[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 swapTableRGB_DDR_12bits[MAX_UNITS][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; -UInt8 enableVideoPortRGB_DDR_12bits[MAX_UNITS][3] = { {0x00, 0x00, 0x00} }; -UInt8 groundVideoPortRGB_DDR_12bits[MAX_UNITS][3] = { {0xFF, 0xFF, 0xFF} }; -UInt8 NoMux[MAX_UNITS] = { 0x00 }; -UInt8 Mux_RGB_DDR_12bits[MAX_UNITS] = { 0x00 }; -#endif - -/* DO NOT MODIFY, this table is used for transmission of the configuration to */ -/* the core driver */ -tmdlHdmiTxDriverConfigTable_t driverConfigTableTx[MAX_UNITS] = { - { - COMMAND_TASK_PRIORITY_0, - COMMAND_TASK_STACKSIZE_0, - COMMAND_TASK_QUEUESIZE_0, - HDCP_CHECK_TASK_PRIORITY_0, - HDCP_CHECK_TASK_STACKSIZE_0, - UNIT_I2C_ADDRESS_0, - TxI2cReadFunction, - TxI2cWriteFunction, - Null, /* filled dynamically, do not modify */ - &mirrorTableCCIR656[0][0], /* filled dynamically, do not modify */ - &swapTableCCIR656[0][0], /* filled dynamically, do not modify */ - &enableVideoPortCCIR656[0][0], /* filled dynamically, do not modify */ - &groundVideoPortCCIR656[0][0], /* filled dynamically, do not modify */ - &mirrorTableYUV422[0][0], /* filled dynamically, do not modify */ - &swapTableYUV422[0][0], /* filled dynamically, do not modify */ - &enableVideoPortYUV422[0][0], /* filled dynamically, do not modify */ - &groundVideoPortYUV422[0][0], /* filled dynamically, do not modify */ - &mirrorTableYUV444[0][0], /* filled dynamically, do not modify */ - &swapTableYUV444[0][0], /* filled dynamically, do not modify */ - &enableVideoPortYUV444[0][0], /* filled dynamically, do not modify */ - &groundVideoPortYUV444[0][0], /* filled dynamically, do not modify */ - &mirrorTableRGB444[0][0], /* filled dynamically, do not modify */ - &swapTableRGB444[0][0], /* filled dynamically, do not modify */ - &enableVideoPortRGB444[0][0], /* filled dynamically, do not modify */ - &groundVideoPortRGB444[0][0], /* filled dynamically, do not modify */ -#ifdef TMFL_RGB_DDR_12BITS - &mirrorTableRGB_DDR_12bits[0][0], - &swapTableRGB_DDR_12bits[0][0], - &NoMux[0], - &Mux_RGB_DDR_12bits[0], - &enableVideoPortRGB_DDR_12bits[0][0], - &groundVideoPortRGB_DDR_12bits[0][0], -#endif - &enableAudioPortSPDIF[0], - &groundAudioPortSPDIF[0], - &enableAudioClockPortSPDIF[0], - &groundAudioClockPortSPDIF[0], - &enableAudioPortI2S[0], - &groundAudioPortI2S[0], - &enableAudioPortI2S8C[0], - &groundAudioPortI2S8C[0], - &enableAudioClockPortI2S[0], - &groundAudioClockPortI2S[0], - &enableAudioPortOBA[0], - &groundAudioPortOBA[0], - &enableAudioClockPortOBA[0], - &groundAudioClockPortOBA[0], - &enableAudioPortDST[0], - &groundAudioPortDST[0], - &enableAudioClockPortDST[0], - &groundAudioClockPortDST[0], - &enableAudioPortHBR[0], - &groundAudioPortHBR[0], - &enableAudioClockPortHBR[0], - &groundAudioClockPortHBR[0], - KEY_SEED, - TMDL_HDMITX_PATTERN_BLUE, - 1 /* DE signal is available */ - } -}; - -#ifdef TMFL_CEC_AVAILABLE - -tmdlHdmiCecCapabilities_t CeccapabilitiesList = { TMDL_HDMICEC_DEVICE_UNKNOWN, CEC_VERSION_1_3a }; - -/** - * \brief Configuration Tables. This table can be modified by the customer - to choose its prefered configuration - */ - -tmdlHdmiCecDriverConfigTable_t CecdriverConfigTable[MAX_UNITS] = { - { - COMMAND_TASK_PRIORITY_0, - COMMAND_TASK_STACKSIZE_0, - COMMAND_TASK_QUEUESIZE_0, - CEC_UNIT_I2C_ADDRESS_0, - TxI2cReadFunction, - TxI2cWriteFunction, - &CeccapabilitiesList} -}; - - -/****************************************************************************** -****************************************************************************** -* THIS PART MUST NOT BE MODIFIED BY CUSTOMER * -****************************************************************************** -*****************************************************************************/ - -/** - \brief This function allows to the main driver to retrieve its - configuration parameters. - - \param pConfig Pointer to the config structure - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMDL_ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ -tmErrorCode_t tmdlHdmiCecCfgGetConfig(tmUnitSelect_t unit, tmdlHdmiCecDriverConfigTable_t *pConfig) { - /* check if unit number is in range */ - if ((unit < 0) || (unit >= MAX_UNITS)) - return TMDL_ERR_DLHDMICEC_BAD_UNIT_NUMBER; - - /* check if pointer is Null */ - if (pConfig == Null) - return TMDL_ERR_DLHDMICEC_INCONSISTENT_PARAMS; - - *pConfig = CecdriverConfigTable[unit]; - - return TM_OK; -} - - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ - -#endif -/****************************************************************************** - \brief This function blocks the current task for the specified amount time. - This is a passive wait. - - \param Duration Duration of the task blocking in milliseconds. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxIWWait(UInt16 duration) { - msleep((unsigned long)duration); - - return (TM_OK); -} - -/****************************************************************************** - \brief This function creates a semaphore. - - \param pHandle Pointer to the handle buffer. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_NO_RESOURCES: the resource is not available - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ -/* -tmErrorCode_t tmdlHdmiTxIWSemaphoreCreate -( - tmdlHdmiTxIWSemHandle_t *pHandle -) -{ - struct semaphore * mutex; - - // check that input pointer is not NULL - RETIF(pHandle == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - mutex = (struct semaphore *)kmalloc(sizeof(struct semaphore),GFP_KERNEL); - if (!mutex) { - pr_err( "malloc failed in %s\n",__func__); - return TMDL_ERR_DLHDMITX_NO_RESOURCES; - } - //pr_debug("%s, mutex=0x%08x\n", __func__, (unsigned int)mutex); - - mutex_init(mutex); - *pHandle = (tmdlHdmiTxIWSemHandle_t)mutex; - - RETIF(pHandle == NULL, TMDL_ERR_DLHDMITX_NO_RESOURCES) - - return(TM_OK); -} -*/ - -DEFINE_SEMAPHORE(mutex0); -DEFINE_SEMAPHORE(mutex1); -DEFINE_SEMAPHORE(mutex2); - -tmErrorCode_t tmdlHdmiTxIWSemaphoreCreate(tmdlHdmiTxIWSemHandle_t *pHandle) -{ - - - static int i; - struct semaphore *mutex[3]; - /* check that input pointer is not NULL */ - RETIF(pHandle == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - mutex[0] = &mutex0; - mutex[1] = &mutex1; - mutex[2] = &mutex2; - - if (i > 2 || i < 0) { - pr_debug("%s,create semphore error\n", __func__); - return -1; - } - *pHandle = (tmdlHdmiTxIWSemHandle_t) mutex[i]; - i++; - - RETIF(pHandle == NULL, TMDL_ERR_DLHDMITX_NO_RESOURCES) - - return (TM_OK); -} - - -/****************************************************************************** - \brief This function destroys an existing semaphore. - - \param Handle Handle of the semaphore to be destroyed. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxIWSemaphoreDestroy(tmdlHdmiTxIWSemHandle_t handle) { - RETIF(handle == False, TMDL_ERR_DLHDMITX_BAD_HANDLE); - /* - if (atomic_read((atomic_t*)&((struct semaphore *)handle)->count) < 1) { - pr_debug("release catched semaphore"); - } - - //kfree((void*)handle); - */ - return (TM_OK); -} - -/****************************************************************************** - \brief This function acquires the specified semaphore. - - \param Handle Handle of the semaphore to be acquired. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxIWSemaphoreP(tmdlHdmiTxIWSemHandle_t handle) { - /* pr_debug("%s, handle=0x%08x\n", __func__, (unsigned int)handle); */ - down((struct semaphore *)handle); - - return (TM_OK); -} - -/****************************************************************************** - \brief This function releases the specified semaphore. - - \param Handle Handle of the semaphore to be released. - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong - -******************************************************************************/ -tmErrorCode_t tmdlHdmiTxIWSemaphoreV(tmdlHdmiTxIWSemHandle_t handle) { - /* pr_debug("%s, handle=0x%08x\n", __func__, (unsigned int)handle); */ - up((struct semaphore *)handle); - - return (TM_OK); -} - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_cfg.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_cfg.h deleted file mode 100644 index 1b5287ecc4c..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_cfg.h +++ /dev/null @@ -1,323 +0,0 @@ -/** - * Copyright (C) 2006 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx_cfg.h - * - * \version $Revision: 1 $ - * - * \date $Date: 08/08/07 11:00 $ - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * - * \section info Change Information - * - * \verbatim - - $History: tmbslHdmiTx_cfg.h $ - * - * ***************** Version 1 ***************** - * User: J. Lamotte Date: 08/08/07 Time: 11:00 - * initial version - * - - \endverbatim - * -*/ - -/*****************************************************************************/ -/*****************************************************************************/ -/* THIS FILE MUST NOT BE MODIFIED BY CUSTOMER */ -/* Customer specific configuration is set in tmdlHdmiTx_cfg.c file */ -/*****************************************************************************/ -/*****************************************************************************/ - -#ifndef TMDLHDMITX_CFG_H -#define TMDLHDMITX_CFG_H - -#include "tmNxTypes.h" -#include "tmbslHdmiTx_types.h" -#include "tmdlHdmiTx_Types.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - -/** - * \brief Video signals that can be input to video ports in RGB/YUV 4:4:4 mode - */ - typedef enum { - TMDL_HDMITX_VID444_GY_4_TO_7 = 0x00, - /**< Video signal G/Y, bits 4 to 7 */ - TMDL_HDMITX_VID444_GY_0_TO_3 = 0x01, - /**< Video signal G/Y, bits 0 to 3 */ - TMDL_HDMITX_VID444_BU_4_TO_7 = 0x02, - /**< Video signal B/U, bits 4 to 7 */ - TMDL_HDMITX_VID444_BU_0_TO_3 = 0x03, - /**< Video signal B/U, bits 0 to 3 */ - TMDL_HDMITX_VID444_VR_4_TO_7 = 0x04, - /**< Video signal V/R, bits 4 to 7 */ - TMDL_HDMITX_VID444_VR_0_TO_3 = 0x05, - /**< Video signal V/R, bits 0 to 3 */ - TMDL_HDMITX_VID444_GY_7_TO_4 = 0x80, - /**< Video signal G/Y, bits 7 to 4 (mirrored) */ - TMDL_HDMITX_VID444_GY_3_TO_0 = 0x81, - /**< Video signal G/Y, bits 3 to 0 (mirrored) */ - TMDL_HDMITX_VID444_BU_7_TO_4 = 0x82, - /**< Video signal B/U, bits 7 to 4 (mirrored) */ - TMDL_HDMITX_VID444_BU_3_TO_0 = 0x83, - /**< Video signal B/U, bits 3 to 0 (mirrored) */ - TMDL_HDMITX_VID444_VR_7_TO_4 = 0x84, - /**< Video signal V/R, bits 7 to 4 (mirrored) */ - TMDL_HDMITX_VID444_VR_3_TO_0 = 0x85, - /**< Video signal V/R, bits 3 to 0 (mirrored) */ - TMDL_HDMITX_VID444_NOT_CONNECTED = 0x100 - /**< No signal connected */ - } tmdlHdmiTxCfgVideoSignal444; - -/** - * \brief Video signals that can be input to video ports in semi-planar YUV 4:2:2 mode - */ - typedef enum { - TMDL_HDMITX_VID422_Y_8_TO_11 = 0x00, - /**< Video signal G/Y, bits 8 to 11 */ - TMDL_HDMITX_VID422_Y_4_TO_7 = 0x01, - /**< Video signal G/Y, bits 4 to 7 */ - TMDL_HDMITX_VID422_Y_0_TO_3 = 0x02, - /**< Video signal G/Y, bits 0 to 3 */ - TMDL_HDMITX_VID422_UV_8_TO_11 = 0x03, - /**< Video signal B/U, bits 8 to 11 */ - TMDL_HDMITX_VID422_UV_4_TO_7 = 0x04, - /**< Video signal B/U, bits 4 to 7 */ - TMDL_HDMITX_VID422_UV_0_TO_3 = 0x05, - /**< Video signal B/U, bits 0 to 3 */ - TMDL_HDMITX_VID422_Y_11_TO_8 = 0x80, - /**< Video signal G/Y, bits 11 to 8 (mirrored) */ - TMDL_HDMITX_VID422_Y_7_TO_4 = 0x81, - /**< Video signal G/Y, bits 7 to 4 (mirrored) */ - TMDL_HDMITX_VID422_Y_3_TO_0 = 0x82, - /**< Video signal G/Y, bits 3 to 0 (mirrored) */ - TMDL_HDMITX_VID422_UV_11_TO_8 = 0x83, - /**< Video signal B/U, bits 11 to 8 (mirrored) */ - TMDL_HDMITX_VID422_UV_7_TO_4 = 0x84, - /**< Video signal B/U, bits 7 to 4 (mirrored) */ - TMDL_HDMITX_VID422_UV_3_TO_0 = 0x85, - /**< Video signal B/U, bits 3 to 0 (mirrored) */ - TMDL_HDMITX_VID422_NOT_CONNECTED = 0x100 - /**< No signal connected */ - } tmdlHdmiTxCfgVideoSignal422; - -/** - * \brief Video signals that can be input to video ports in semi-planar CCIR 656 mode - */ - typedef enum { - TMDL_HDMITX_VIDCCIR_8_TO_11 = 0x00, - /**< Video signal CCIR, bits 8 to 11 */ - TMDL_HDMITX_VIDCCIR_4_TO_7 = 0x01, - /**< Video signal CCIR, bits 4 to 7 */ - TMDL_HDMITX_VIDCCIR_0_TO_3 = 0x02, - /**< Video signal CCIR, bits 0 to 3 */ - TMDL_HDMITX_VIDCCIR_11_TO_8 = 0x80, - /**< Video signal CCIR, bits 11 to 8 (mirrored) */ - TMDL_HDMITX_VIDCCIR_7_TO_4 = 0x81, - /**< Video signal CCIR, bits 7 to 4 (mirrored) */ - TMDL_HDMITX_VIDCCIR_3_TO_0 = 0x82, - /**< Video signal CCIR, bits 3 to 0 (mirrored) */ - TMDL_HDMITX_VIDCCIR_NOT_CONNECTED = 0x100 - /**< No signal connected */ - } tmdlHdmiTxCfgVideoSignalCCIR656; - -#ifdef TMFL_RGB_DDR_12BITS -/** - * \brief Video signals that can be input to video ports in semi-planar CCIR 656 mode - */ - typedef enum { - TMDL_HDMITX_VID_B_0_3_G_4_7 = 0x00, - /**< Video signal blue 0 to 3 then green 4 to 7 */ - TMDL_HDMITX_VID_B_4_7_R_0_3 = 0x01, - /**< Video signal blue 4 to 7 then red 0 to 3 */ - TMDL_HDMITX_VID_G_0_3_R_4_7 = 0x02, - /**< Video signal green 0 to 3 then red 4 to 7 */ - TMDL_HDMITX_VID_DDR_NOT_CONNECTED = 0x100 - /**< No signal connected */ - } tmdlHdmiTxCfgVideoSignal_RGB_DDR_12bits; - -/** - * \brief Video signals can be mux each others using register 0x27 (MUX_VP_MIX_OUT) - * Whatch out that VIP output shall be GBR: green on [23:16], blue on [15:8] and red in [7:0] - * this is done by default for all video mode but RGB_DDR_12bits where some extra mux is needed - */ - typedef enum { - VIP_MUX_R_B = 0x00, /**< internal vp_r = vp blue */ - VIP_MUX_R_G = 0x10, /**< internal vp_r = vp green */ - VIP_MUX_R_R = 0x20, /**< internal vp_r = vp red */ - VIP_MUX_G_B = 0x00, /**< internal vp_g = vp blue */ - VIP_MUX_G_G = 0x04, /**< internal vp_g = vp green */ - VIP_MUX_G_R = 0x08, /**< internal vp_g = vp red */ - VIP_MUX_B_B = 0x00, /**< internal vp_b = vp blue */ - VIP_MUX_B_G = 0x01, /**< internal vp_b = vp green */ - VIP_MUX_B_R = 0x02, /**< internal vp_b = vp red */ - } tmdlHdmiTxCfgVideoSignal_VIP_OUTPUT_MUX; -#endif - -/* Audio port configuration, bitn = 1 to enable port n, = 0 to disable port n */ -#define ENABLE_ALL_AUDIO_PORT 0xFF -/* Audio clock port configuration */ -#define ENABLE_AUDIO_CLOCK_PORT 1 -#define DISABLE_AUDIO_CLOCK_PORT 0 -/* Audio port configuration, bitn = 1 to pulldown port n*/ -#define DISABLE_ALL_AUDIO_PORT_PULLDOWN 0x00 -/* Audio clock port pulldown configuration */ -#define ENABLE_AUDIO_CLOCK_PORT_PULLDOWN 1 -#define DISABLE_AUDIO_CLOCK_PORT_PULLDOWN 0 - -/** - * \brief Structure defining a video mode - */ - typedef struct _tmdlHdmiTxCfgResolution_t { - tmdlHdmiTxVidFmt_t resolutionID; - UInt16 width; - UInt16 height; - Bool interlaced; - tmdlHdmiTxVfreq_t vfrequency; - tmdlHdmiTxPictAspectRatio_t aspectRatio; - } tmdlHdmiTxCfgResolution_t, *ptmdlHdmiTxCfgResolution_t; - -/** - * \brief Structure gathering all configuration parameters - */ - typedef struct { - UInt8 commandTaskPriority; - UInt8 commandTaskStackSize; - UInt8 commandTaskQueueSize; - UInt8 hdcpTaskPriority; - UInt8 hdcpTaskStackSize; - UInt8 i2cAddress; - ptmbslHdmiTxSysFunc_t i2cReadFunction; - ptmbslHdmiTxSysFunc_t i2cWriteFunction; - ptmdlHdmiTxCfgResolution_t pResolutionInfo; - UInt8 *pMirrorTableCCIR656; - UInt8 *pSwapTableCCIR656; - UInt8 *pEnableVideoPortCCIR656; - UInt8 *pGroundVideoPortCCIR656; - UInt8 *pMirrorTableYUV422; - UInt8 *pSwapTableYUV422; - UInt8 *pEnableVideoPortYUV422; - UInt8 *pGroundVideoPortYUV422; - UInt8 *pMirrorTableYUV444; - UInt8 *pSwapTableYUV444; - UInt8 *pEnableVideoPortYUV444; - UInt8 *pGroundVideoPortYUV444; - UInt8 *pMirrorTableRGB444; - UInt8 *pSwapTableRGB444; - UInt8 *pEnableVideoPortRGB444; - UInt8 *pGroundVideoPortRGB444; -#ifdef TMFL_RGB_DDR_12BITS - UInt8 *pMirrorTableRGB_DDR_12bits; - UInt8 *pSwapTableRGB_DDR_12bits; - UInt8 *pNoMux; - UInt8 *pMux_RGB_DDR_12bits; - UInt8 *pEnableVideoPortRGB_DDR_12bits; - UInt8 *pGroundVideoPortRGB_DDR_12bits; -#endif - UInt8 *pEnableAudioPortSPDIF; - UInt8 *pGroundAudioPortSPDIF; - UInt8 *pEnableAudioClockPortSPDIF; - UInt8 *pGroundAudioClockPortSPDIF; - UInt8 *pEnableAudioPortI2S; - UInt8 *pGroundAudioPortI2S; - UInt8 *pEnableAudioPortI2S8C; - UInt8 *pGroundAudioPortI2S8C; - UInt8 *pEnableAudioClockPortI2S; - UInt8 *pGroundAudioClockPortI2S; - UInt8 *pEnableAudioPortOBA; - UInt8 *pGroundAudioPortOBA; - UInt8 *pEnableAudioClockPortOBA; - UInt8 *pGroundAudioClockPortOBA; - UInt8 *pEnableAudioPortDST; - UInt8 *pGroundAudioPortDST; - UInt8 *pEnableAudioClockPortDST; - UInt8 *pGroundAudioClockPortDST; - UInt8 *pEnableAudioPortHBR; - UInt8 *pGroundAudioPortHBR; - UInt8 *pEnableAudioClockPortHBR; - UInt8 *pGroundAudioClockPortHBR; - UInt16 keySeed; - tmdlHdmiTxTestPattern_t pattern; - UInt8 dataEnableSignalAvailable; /* 0 DE is NOT available, 1 DE is there */ - } tmdlHdmiTxDriverConfigTable_t; - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS */ -/*============================================================================*/ - -/* Number of HW units supported by SW driver */ -#define MAX_UNITS 1 - -#ifdef TMFL_OS_WINDOWS /* OS Windows */ - extern tmdlHdmiTxCfgVideoSignalCCIR656 videoPortMapping_CCIR656[MAX_UNITS][6]; - extern tmdlHdmiTxCfgVideoSignal422 videoPortMapping_YUV422[MAX_UNITS][6]; - extern tmdlHdmiTxCfgVideoSignal444 videoPortMapping_YUV444[MAX_UNITS][6]; - extern tmdlHdmiTxCfgVideoSignal444 videoPortMapping_RGB444[MAX_UNITS][6]; -#ifdef TMFL_RGB_DDR_12BITS - extern tmdlHdmiTxCfgVideoSignal_RGB_DDR_12bits - VideoPortMapping_RGB_DDR_12bits[MAX_UNITS][6]; - extern UInt8 VideoPortMux_RGB_DDR_12bits[MAX_UNITS]; - extern UInt8 VideoPortNoMux[MAX_UNITS]; -#endif -#else /* TMFL_OS_WINDOWS */ - extern const tmdlHdmiTxCfgVideoSignalCCIR656 videoPortMapping_CCIR656[MAX_UNITS][6]; - extern const tmdlHdmiTxCfgVideoSignal422 videoPortMapping_YUV422[MAX_UNITS][6]; - extern const tmdlHdmiTxCfgVideoSignal444 videoPortMapping_YUV444[MAX_UNITS][6]; - extern const tmdlHdmiTxCfgVideoSignal444 videoPortMapping_RGB444[MAX_UNITS][6]; -#ifdef TMFL_RGB_DDR_12BITS - extern const tmdlHdmiTxCfgVideoSignal_RGB_DDR_12bits - VideoPortMapping_RGB_DDR_12bits[MAX_UNITS][6]; - extern const UInt8 VideoPortMux_RGB_DDR_12bits[MAX_UNITS]; - extern const UInt8 VideoPortNoMux[MAX_UNITS]; -#endif -#endif /* TMFL_OS_WINDOWS */ - -/*============================================================================*/ -/* VARIABLES DECLARATIONS */ -/*============================================================================*/ - extern tmdlHdmiTxDriverConfigTable_t driverConfigTableTx[MAX_UNITS]; - - -/*============================================================================*/ -/* FUNCTIONS DECLARATIONS */ -/*============================================================================*/ -#ifdef TMFL_CEC_AVAILABLE - -#include "tmdlHdmiCEC_Types.h" - - typedef struct { - UInt8 commandTaskPriority; - UInt8 commandTaskStackSize; - UInt8 commandTaskQueueSize; - UInt8 i2cAddress; - ptmdlHdmiCecSysFunc_t i2cReadFunction; - ptmdlHdmiCecSysFunc_t i2cWriteFunction; - tmdlHdmiCecCapabilities_t *pCapabilitiesList; - } tmdlHdmiCecDriverConfigTable_t; - - tmErrorCode_t tmdlHdmiCecCfgGetConfig - (tmUnitSelect_t unit, tmdlHdmiCecDriverConfigTable_t *pConfig); -#endif - -#ifdef __cplusplus -} -#endif -#endif /* TMDLHDMITX_CFG_H */ -/*============================================================================*//* END OF FILE *//*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_local.c b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_local.c deleted file mode 100644 index 1885843cfbf..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_local.c +++ /dev/null @@ -1,411 +0,0 @@ -/** - * Copyright (C) 2006 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx_local.c - * - * \version Revision: 1 - * - * \date Date: 21/02/08 - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * - * \section info Change Information - * - * \verbatim - - History: tmdlHdmiTx_local.c - * - * ***************** Version 1 ***************** - * User: G. Burnouf Date: 21/02/08 - * Updated in $/Source/tmdlHdmiTx/src - * initial version - - \endverbatim - * -*/ - -/*============================================================================*/ -/* INCLUDE FILES */ -/*============================================================================*/ -#ifndef TMFL_TDA19989 -#define TMFL_TDA19989 -#endif - -#ifndef TMFL_NO_RTOS -#define TMFL_NO_RTOS -#endif - -#ifndef TMFL_LINUX_OS_KERNEL_DRIVER -#define TMFL_LINUX_OS_KERNEL_DRIVER -#endif - - -#include "tmdlHdmiTx_local.h" -#include "tmdlHdmiTx_cfg.h" -#include "tmdlHdmiTx.h" - -/*============================================================================*/ -/* TYPES DECLARATIONS */ -/*============================================================================*/ - -typedef struct _dlHdmiTxResolution_t { - tmdlHdmiTxVidFmt_t resolutionID; - UInt16 width; - UInt16 height; - Bool interlaced; - tmdlHdmiTxVfreq_t vfrequency; - tmdlHdmiTxPictAspectRatio_t aspectRatio; -} dlHdmiTxResolution_t, *pdlHdmiTxResolution_t; - - -/*============================================================================*/ -/* CONSTANTS DECLARATIONS */ -/*============================================================================*/ -/* macro for quick error handling */ -#ifndef RETIF -#define RETIF(cond, rslt) if ((cond)) {return (rslt); } -#endif - -/*============================================================================*/ -/* FUNCTION PROTOTYPES */ -/*============================================================================*/ - -/******************************************************************************/ -/* DO NOT MODIFY */ -/******************************************************************************/ - -static void dlHdmiTxGenerateVideoPortTables - (tmUnitSelect_t unit, tmdlHdmiTxDriverConfigTable_t *pConfig); - - -/*============================================================================*/ -/* VARIABLES DECLARATIONS */ -/*============================================================================*/ - -/** - * \brief List of the resolution to be detected by the device library - */ - -#ifdef TMFL_OS_WINDOWS /* OS Windows */ -dlHdmiTxResolution_t resolutionInfoTx[RESOLUTION_NB] = { -#else /* OS ARM7 */ -const dlHdmiTxResolution_t resolutionInfoTx[RESOLUTION_NB] = { -#endif /* endif TMFL_OS_WINDOWS */ - /* TV Formats */ - /* 60 HZ */ - {TMDL_HDMITX_VFMT_01_640x480p_60Hz, 640, 480, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_02_720x480p_60Hz, 720, 480, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_03_720x480p_60Hz, 720, 480, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_04_1280x720p_60Hz, 1280, 720, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_05_1920x1080i_60Hz, 1920, 1080, True, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_06_720x480i_60Hz, 720, 480, True, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_07_720x480i_60Hz, 720, 480, True, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_08_720x240p_60Hz, 720, 240, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_09_720x240p_60Hz, 720, 240, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_10_720x480i_60Hz, 720, 480, True, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_11_720x480i_60Hz, 720, 480, True, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_12_720x240p_60Hz, 720, 240, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_13_720x240p_60Hz, 720, 240, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_14_1440x480p_60Hz, 1440, 480, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_15_1440x480p_60Hz, 1440, 480, False, TMDL_HDMITX_VFREQ_59Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_16_1920x1080p_60Hz, 1920, 1080, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_35_2880x480p_60Hz, 2880, 480, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_36_2880x480p_60Hz, 2880, 480, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - - /* 50 HZ */ - {TMDL_HDMITX_VFMT_17_720x576p_50Hz, 720, 576, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_18_720x576p_50Hz, 720, 576, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_19_1280x720p_50Hz, 1280, 720, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_20_1920x1080i_50Hz, 1920, 1080, True, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_21_720x576i_50Hz, 720, 576, True, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_22_720x576i_50Hz, 720, 576, True, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_23_720x288p_50Hz, 720, 288, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_24_720x288p_50Hz, 720, 288, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_25_720x576i_50Hz, 720, 576, True, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_26_720x576i_50Hz, 720, 576, True, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_27_720x288p_50Hz, 720, 288, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_28_720x288p_50Hz, 720, 288, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_29_1440x576p_50Hz, 1440, 576, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_30_1440x576p_50Hz, 1440, 576, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_31_1920x1080p_50Hz, 1920, 1080, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_37_2880x576p_50Hz, 2880, 576, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_38_2880x576p_50Hz, 2880, 576, False, TMDL_HDMITX_VFREQ_50Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - - /* Low Tv */ - {TMDL_HDMITX_VFMT_32_1920x1080p_24Hz, 1920, 1080, False, TMDL_HDMITX_VFREQ_24Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_33_1920x1080p_25Hz, 1920, 1080, False, TMDL_HDMITX_VFREQ_25Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_34_1920x1080p_30Hz, 1920, 1080, False, TMDL_HDMITX_VFREQ_30Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_60_1280x720p_24Hz, 1280, 720, False, TMDL_HDMITX_VFREQ_24Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_61_1280x720p_25Hz, 1280, 720, False, TMDL_HDMITX_VFREQ_25Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_62_1280x720p_30Hz, 1280, 720, False, TMDL_HDMITX_VFREQ_30Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9} - -#ifdef FORMAT_PC - /* PC Formats */ - /* 60 HZ */ - , {TMDL_HDMITX_VFMT_PC_640x480p_60Hz, 640, 480, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_800x600p_60Hz, 800, 600, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1152x960p_60Hz, 1152, 960, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_6_5}, - {TMDL_HDMITX_VFMT_PC_1024x768p_60Hz, 1024, 768, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1280x768p_60Hz, 1280, 768, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_5_3}, - {TMDL_HDMITX_VFMT_PC_1280x1024p_60Hz, 1280, 1024, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_5_4}, - {TMDL_HDMITX_VFMT_PC_1360x768p_60Hz, 1360, 768, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_9}, - {TMDL_HDMITX_VFMT_PC_1400x1050p_60Hz, 1400, 1050, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1600x1200p_60Hz, 1600, 1200, False, TMDL_HDMITX_VFREQ_60Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - /* 70 HZ */ - {TMDL_HDMITX_VFMT_PC_1024x768p_70Hz, 1024, 768, False, TMDL_HDMITX_VFREQ_70Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - /* 72 HZ */ - {TMDL_HDMITX_VFMT_PC_640x480p_72Hz, 640, 480, False, TMDL_HDMITX_VFREQ_72Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_800x600p_72Hz, 800, 600, False, TMDL_HDMITX_VFREQ_72Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - /* 75 HZ */ - {TMDL_HDMITX_VFMT_PC_640x480p_75Hz, 640, 480, False, TMDL_HDMITX_VFREQ_75Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1024x768p_75Hz, 1024, 768, False, TMDL_HDMITX_VFREQ_75Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_800x600p_75Hz, 800, 600, False, TMDL_HDMITX_VFREQ_75Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1024x864p_75Hz, 1024, 864, False, TMDL_HDMITX_VFREQ_75Hz, - TMDL_HDMITX_P_ASPECT_RATIO_UNDEFINED}, - {TMDL_HDMITX_VFMT_PC_1280x1024p_75Hz, 1280, 1024, False, TMDL_HDMITX_VFREQ_75Hz, - TMDL_HDMITX_P_ASPECT_RATIO_5_4}, - /* 85 HZ */ - {TMDL_HDMITX_VFMT_PC_640x350p_85Hz, 640, 350, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_UNDEFINED}, - {TMDL_HDMITX_VFMT_PC_640x400p_85Hz, 640, 400, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_16_10}, - {TMDL_HDMITX_VFMT_PC_720x400p_85Hz, 720, 400, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_9_5}, - {TMDL_HDMITX_VFMT_PC_640x480p_85Hz, 640, 480, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_800x600p_85Hz, 800, 600, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1024x768p_85Hz, 1024, 768, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1152x864p_85Hz, 1152, 864, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1280x960p_85Hz, 1280, 960, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3}, - {TMDL_HDMITX_VFMT_PC_1280x1024p_85Hz, 1280, 1024, False, TMDL_HDMITX_VFREQ_85Hz, - TMDL_HDMITX_P_ASPECT_RATIO_5_4}, - /* 87 HZ */ - {TMDL_HDMITX_VFMT_PC_1024x768i_87Hz, 1024, 768, True, TMDL_HDMITX_VFREQ_87Hz, - TMDL_HDMITX_P_ASPECT_RATIO_4_3} -#endif /* FORMAT_PC */ -}; - - -/*============================================================================*/ -/* FUNCTION */ -/*============================================================================*/ - -/******************************************************************************/ -/* DO NOT MODIFY */ -/****************************************************************************** - \brief This function allows to the main driver to retrieve its - configuration parameters. - - \param pConfig Pointer to the config structure - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ -tmErrorCode_t dlHdmiTxGetConfig(tmUnitSelect_t unit, tmdlHdmiTxDriverConfigTable_t *pConfig) { - /* Check if unit number is in range */ - RETIF((unit < 0) || (unit >= MAX_UNITS), TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER) - - /* Check if pointer is Null */ - RETIF(pConfig == Null, TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS) - - * pConfig = driverConfigTableTx[unit]; - - /* Done here because of const declaration of tables in ARM7 case */ - pConfig->pResolutionInfo = (ptmdlHdmiTxCfgResolution_t) resolutionInfoTx; - - /* Generate swap and mirror tables in function of video port mapping tables */ - dlHdmiTxGenerateVideoPortTables(unit, pConfig); - - return TM_OK; -} - - -/*============================================================================*/ -/* INTERNAL FUNCTION */ -/*============================================================================*/ -/******************************************************************************/ -/* DO NOT MODIFY */ -/******************************************************************************/ -static void dlHdmiTxGenerateVideoPortTables - (tmUnitSelect_t unit, tmdlHdmiTxDriverConfigTable_t *pConfig) { - UInt8 i; - - for (i = 0; i < 6; i++) { - /* CCIR656 */ - if (videoPortMapping_CCIR656[unit][i] != TMDL_HDMITX_VIDCCIR_NOT_CONNECTED) { - pConfig->pSwapTableCCIR656[videoPortMapping_CCIR656[unit][i] & 0x07F] = - 5 - i; - pConfig->pMirrorTableCCIR656[videoPortMapping_CCIR656[unit][i] & 0x07F] = - (UInt8) (videoPortMapping_CCIR656[unit][i] >> 7); - /* Enable port and disable ground port */ - if (((5 - i) % 2) == 0) { - pConfig->pEnableVideoPortCCIR656[i / 2] |= 0x0F; - pConfig->pGroundVideoPortCCIR656[i / 2] = - (UInt8) (pConfig->pGroundVideoPortCCIR656[i / 2] & 0xF0); - } else { - pConfig->pEnableVideoPortCCIR656[i / 2] = - (UInt8) (pConfig->pEnableVideoPortCCIR656[i / 2] | 0xF0); - pConfig->pGroundVideoPortCCIR656[i / 2] &= 0x0F; - } - } - - /* YUV422 */ - if (videoPortMapping_YUV422[unit][i] != TMDL_HDMITX_VID422_NOT_CONNECTED) { - pConfig->pSwapTableYUV422[videoPortMapping_YUV422[unit][i] & 0x07F] = 5 - i; - pConfig->pMirrorTableYUV422[videoPortMapping_YUV422[unit][i] & 0x07F] = - (UInt8) (videoPortMapping_YUV422[unit][i] >> 7); - /* Enable port and disable ground port */ - if (((5 - i) % 2) == 0) { - pConfig->pEnableVideoPortYUV422[i / 2] |= 0x0F; - pConfig->pGroundVideoPortYUV422[i / 2] = - (UInt8) (pConfig->pGroundVideoPortYUV422[i / 2] & 0xF0); - } else { - pConfig->pEnableVideoPortYUV422[i / 2] = - (UInt8) (pConfig->pEnableVideoPortYUV422[i / 2] | 0xF0); - pConfig->pGroundVideoPortYUV422[i / 2] &= 0x0F; - } - } - - /* YUV444 */ - if (videoPortMapping_YUV444[unit][i] != TMDL_HDMITX_VID444_NOT_CONNECTED) { - pConfig->pSwapTableYUV444[videoPortMapping_YUV444[unit][i] & 0x07F] = 5 - i; - pConfig->pMirrorTableYUV444[videoPortMapping_YUV444[unit][i] & 0x07F] = - (UInt8) (videoPortMapping_YUV444[unit][i] >> 7); - /* Enable port and disable ground port */ - if (((5 - i) % 2) == 0) { - pConfig->pEnableVideoPortYUV444[i / 2] |= 0x0F; - pConfig->pGroundVideoPortYUV444[i / 2] = - (UInt8) (pConfig->pGroundVideoPortYUV444[i / 2] & 0xF0); - } else { - pConfig->pEnableVideoPortYUV444[i / 2] = - (UInt8) (pConfig->pEnableVideoPortYUV444[i / 2] | 0xF0); - pConfig->pGroundVideoPortYUV444[i / 2] &= 0x0F; - } - } - - pr_debug("videoPortMapping_RGB444[%d][%d] = %d\n", unit, i, - videoPortMapping_RGB444[unit][i]); - /* RGB444 */ - if (videoPortMapping_RGB444[unit][i] != TMDL_HDMITX_VID444_NOT_CONNECTED) { - pConfig->pSwapTableRGB444[videoPortMapping_RGB444[unit][i] & 0x07F] = 5 - i; - pConfig->pMirrorTableRGB444[videoPortMapping_RGB444[unit][i] & 0x07F] = - (UInt8) (videoPortMapping_RGB444[unit][i] >> 7); - /* Enable port and disable ground port */ - if (((5 - i) % 2) == 0) { - pConfig->pEnableVideoPortRGB444[i / 2] |= 0x0F; - pConfig->pGroundVideoPortRGB444[i / 2] = - (UInt8) (pConfig->pGroundVideoPortRGB444[i / 2] & 0xF0); - } else { - pConfig->pEnableVideoPortRGB444[i / 2] = - (UInt8) (pConfig->pEnableVideoPortRGB444[i / 2] | 0xF0); - pConfig->pGroundVideoPortRGB444[i / 2] &= 0x0F; - } - } - -#ifdef TMFL_RGB_DDR_12BITS - /* RGB DDR 12bits */ - if (VideoPortMapping_RGB_DDR_12bits[unit][i] != TMDL_HDMITX_VID_DDR_NOT_CONNECTED) { - pConfig-> - pSwapTableRGB_DDR_12bits[VideoPortMapping_RGB_DDR_12bits[unit][i] & - 0x07F] = 5 - i; - pConfig-> - pMirrorTableRGB_DDR_12bits[VideoPortMapping_RGB_DDR_12bits[unit][i] & - 0x07F] = - (UInt8) (VideoPortMapping_RGB_DDR_12bits[unit][i] >> 7); - /* Enable port and disable ground port */ - if (((5 - i) % 2) == 0) { - pConfig->pEnableVideoPortRGB_DDR_12bits[i / 2] |= 0x0F; - pConfig->pGroundVideoPortRGB_DDR_12bits[i / 2] = - (UInt8) (pConfig->pGroundVideoPortRGB_DDR_12bits[i / 2] & 0xF0); - } else { - pConfig->pEnableVideoPortRGB_DDR_12bits[i / 2] = - (UInt8) (pConfig->pEnableVideoPortRGB_DDR_12bits[i / 2] | 0xF0); - pConfig->pGroundVideoPortRGB_DDR_12bits[i / 2] &= 0x0F; - } - } -#endif - } - -#ifdef TMFL_RGB_DDR_12BITS - /* VIP internal mux for RGB DDR */ - pConfig->pNoMux = (UInt8 *) &VideoPortNoMux[unit]; - pConfig->pMux_RGB_DDR_12bits = (UInt8 *) &VideoPortMux_RGB_DDR_12bits[unit]; -#endif - -} - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_local.h b/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_local.h deleted file mode 100644 index 37244aa7c78..00000000000 --- a/drivers/misc/mediatek/hdmi/nxp_tda19989/tmdlHdmiTx_local.h +++ /dev/null @@ -1,885 +0,0 @@ -/** - * Copyright (C) 2006 NXP N.V., All Rights Reserved. - * This source code and any compilation or derivative thereof is the proprietary - * information of NXP N.V. and is confidential in nature. Under no circumstances - * is this software to be exposed to or placed under an Open Source License of - * any type without the expressed written permission of NXP N.V. - * - * \file tmdlHdmiTx_local.h - * - * \version $Revision: 1 $ - * - * \date $Date: 02/08/07 08:32 $ - * - * \brief devlib driver component API for the TDA998x HDMI Transmitters - * - * \section refs Reference Documents - * HDMI Tx Driver - FRS.doc, - * - * \section info Change Information - * - * \verbatim - - $History: tmdlHdmiTx_local.h $ - * - * ***************** Version 13 ***************** - * User: J. Lamotte Date: 02/08/07 Time: 08:32 - * Updated in $/Source/tmdlHdmiTx/inc - * initial version - * - - \endverbatim - * -*/ - -#ifndef TMDLHDMITX_LOCAL_H -#define TMDLHDMITX_LOCAL_H - -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#include -#endif - -#include "tmdlHdmiTx_IW.h" -#include "tmNxTypes.h" -#include "tmdlHdmiTx_Types.h" -#include "tmdlHdmiTx_cfg.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*============================================================================*/ -/* MACRO DEFINITIONS */ -/*============================================================================*/ - -/* Version of the SW driver */ -#define VERSION_COMPATIBILITY 0 -#define VERSION_MAJOR 5 -#define VERSION_MINOR 3 - -/* Invalid HDCP seed */ -#define HDCP_SEED_NULL 0 - -/* A default seed value may be defined here, or set to HDCP_SEED_NULL. - * If HDCP_SEED_NULL, a table of seeds may instead be programmed separately - * into flash at the location of kSeedTable, below */ -#define HDCP_SEED_DEFAULT HDCP_SEED_NULL - -/* Default SHA-1 test handling */ -#define HDCP_OPT_DEFAULT (TMDL_HDMITX_HDCP_OPTION_FORCE_PJ_IGNORED \ - | TMDL_HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC \ - | TMDL_HDMITX_HDCP_OPTION_FORCE_NO_1_1) - -/** - * A macro to check a condition and if true return a result - */ -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#define RETIF(cond, rslt) if ((cond)) { \ - pr_debug("%s %d\n", __func__, __LINE__); \ - return (rslt); } -#else -#define RETIF(cond, rslt) if ((cond)) {return (rslt); } -#endif - -/** - * A macro to check a condition and if true return - * TMDL_ERR_DLHDMITX_BAD_PARAMETER. - * To save code space, it can be compiled out by defining NO_RETIF_BADPARAM on - * the compiler command line. - */ -#ifdef NO_RETIF_BADPARAM -#define RETIF_BADPARAM(cond) -#else -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#define RETIF_BADPARAM(cond) if ((cond)) { \ - pr_debug("%s %d\n", __func__, __LINE__); \ - return TMDL_ERR_DLHDMITX_BAD_PARAMETER; } -#else -#define RETIF_BADPARAM(cond) if ((cond)) {return TMDL_ERR_DLHDMITX_BAD_PARAMETER; } -#endif -#endif - -/** - * A macro to check a condition and if true, release the semaphore describe by handle and return a result - */ -#ifdef TMFL_LINUX_OS_KERNEL_DRIVER -#define RETIF_SEM(handle, cond, rslt) if ((cond)) { \ - tmdlHdmiTxIWSemaphoreV(handle); \ - pr_debug("%s %d\n", __func__, __LINE__); \ - return (rslt); } -#else -#define RETIF_SEM(handle, cond, rslt) if ((cond)) {tmdlHdmiTxIWSemaphoreV(handle); return (rslt); } -#endif - - /* Resolution supported */ -#ifndef FORMAT_PC -#define RESOLUTION_NB 41 -#else -#define RESOLUTION_NB 68 -#endif /* FORMAT_PC */ - -/* Instance number */ -#define INSTANCE_0 0 -#define INSTANCE_1 1 - -#ifdef HDMI_TX_REPEATER_ISR_MODE -/* Number of event */ -#define EVENT_NB 10 -#else /* HDMI_TX_REPEATER_ISR_MODE */ -/* Number of event */ -#define EVENT_NB 9 -#endif /* HDMI_TX_REPEATER_ISR_MODE */ - -/* Size of a KSV is five bytes */ -#define KSV_SIZE 5 - -/* Arbitrary short TV format values */ -#define TV_INVALID 0 -#define TV_VGA_60Hz 1 -#define TV_240p_60Hz 2 -#define TV_480p_60Hz 3 -#define TV_480i_60Hz 4 -#define TV_720p_60Hz 5 -#define TV_1080p_60Hz 6 -#define TV_1080i_60Hz 7 -#define TV_288p_50Hz 8 -#define TV_576p_50Hz 9 -#define TV_576i_50Hz 10 -#define TV_720p_50Hz 11 -#define TV_1080p_50Hz 12 -#define TV_1080i_50Hz 13 - -/* Shorthands for vinMode values in tmbslTDA9984.h */ -#define iINVALID TMDL_HDMITX_VINMODE_INVALID -#define iCCIR656 TMDL_HDMITX_VINMODE_CCIR656 -#define iRGB444 TMDL_HDMITX_VINMODE_RGB444 -#define iYUV444 TMDL_HDMITX_VINMODE_YUV444 -#define iYUV422 TMDL_HDMITX_VINMODE_YUV422 - -/* Shorthands for input sync */ -#define EMB 1 -#define EXT 0 - -/* Shorthands for single/double pixel rate in tmbslTDA9984.h */ -#define SINGLE TMDL_HDMITX_PIXRATE_SINGLE -#define DOUBLE TMDL_HDMITX_PIXRATE_DOUBLE - -/* Shorthands for sampling frequency in tmdlHdmiTxSetAudioInput API */ -#define AIF_SF_REFER_TO_STREAM_HEADER 0 -#define AIF_SF_32K 1 -#define AIF_SF_44K 2 -#define AIF_SF_48K 3 -#define AIF_SF_88K 4 -#define AIF_SF_96K 5 -#define AIF_SF_176K 6 -#define AIF_SF_192K 7 - -/* HDCP check interval in milliseconds */ -#define HDCP_CHECK_INTERVAL_MS 2500 - -/* Number of HDCP checks to carry out after HDCP is started */ -#define HDCP_NUM_CHECKS 5 - -#define TMDL_HDMITX_CHANNELALLOC_LUT_SIZE 32 - - - static UInt8 kChanAllocChanNum[TMDL_HDMITX_CHANNELALLOC_LUT_SIZE] __maybe_unused = - { 2, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 6, 5, 6, 6, 7, 6, 7, 7, 8, 4, 5, 5, 6, 5, 6, 6, 7, 6, -7, 7, 8 }; - - -/** - * Lookup table to convert from EIA/CEA TV video format to - * aspect ratio used in video infoframe: - * Aspect ratio 1=4:3, 2=16:9 - */ -#ifndef FORMAT_PC - static UInt8 kVfmtToAspect_TV[TMDL_HDMITX_VFMT_TV_NUM] __maybe_unused = -#else /* FORMAT_PC */ - static UInt8 kVfmtToAspect_TV[TMDL_HDMITX_VFMT_TV_NUM + TMDL_HDMITX_VFMT_PC_NUM] = -#endif /* FORMAT_PC */ - { - 0, /* HDMITX_VFMT_NULL */ - 1, /* HDMITX_VFMT_01_640x480p_60Hz */ - 1, /* HDMITX_VFMT_02_720x480p_60Hz */ - 2, /* HDMITX_VFMT_03_720x480p_60Hz */ - 2, /* HDMITX_VFMT_04_1280x720p_60Hz */ - 2, /* HDMITX_VFMT_05_1920x1080i_60Hz */ - 1, /* HDMITX_VFMT_06_720x480i_60Hz */ - 2, /* HDMITX_VFMT_07_720x480i_60Hz */ - 1, /* HDMITX_VFMT_08_720x240p_60Hz */ - 2, /* HDMITX_VFMT_09_720x240p_60Hz */ - 1, /* HDMITX_VFMT_10_720x480i_60Hz */ - 2, /* HDMITX_VFMT_11_720x480i_60Hz */ - 1, /* HDMITX_VFMT_12_720x240p_60Hz */ - 2, /* HDMITX_VFMT_13_720x240p_60Hz */ - 1, /* HDMITX_VFMT_14_1440x480p_60Hz */ - 2, /* HDMITX_VFMT_15_1440x480p_60Hz */ - 2, /* HDMITX_VFMT_16_1920x1080p_60Hz */ - 1, /* HDMITX_VFMT_17_720x576p_50Hz */ - 2, /* HDMITX_VFMT_18_720x576p_50Hz */ - 2, /* HDMITX_VFMT_19_1280x720p_50Hz */ - 2, /* HDMITX_VFMT_20_1920x1080i_50Hz */ - 1, /* HDMITX_VFMT_21_720x576i_50Hz */ - 2, /* HDMITX_VFMT_22_720x576i_50Hz */ - 1, /* HDMITX_VFMT_23_720x288p_50Hz */ - 2, /* HDMITX_VFMT_24_720x288p_50Hz */ - 1, /* HDMITX_VFMT_25_720x576i_50Hz */ - 2, /* HDMITX_VFMT_26_720x576i_50Hz */ - 1, /* HDMITX_VFMT_27_720x288p_50Hz */ - 2, /* HDMITX_VFMT_28_720x288p_50Hz */ - 1, /* HDMITX_VFMT_29_1440x576p_50Hz */ - 2, /* HDMITX_VFMT_30_1440x576p_50Hz */ - 2, /* HDMITX_VFMT_31_1920x1080p_50Hz */ - 2, /* HDMITX_VFMT_32_1920x1080p_24Hz */ - 2, /* HDMITX_VFMT_33_1920x1080p_25Hz */ - 2, /* HDMITX_VFMT_34_1920x1080p_30Hz */ - - 1, /* TMDL_HDMITX_VFMT_35_2880x480p_60Hz */ - 2, /* TMDL_HDMITX_VFMT_36_2880x480p_60Hz */ - 1, /* TMDL_HDMITX_VFMT_37_2880x576p_50Hz */ - 2, /* TMDL_HDMITX_VFMT_38_2880x576p_50Hz */ - - 2, /* TMDL_HDMITX_VFMT_60_1280x720p_24HZ */ - 2, /* TMDL_HDMITX_VFMT_61_1280_720p_25HZ */ - 2 /* TMDL_HDMITX_VFMT_62_1280_720p_30HZ */ -#ifdef FORMAT_PC - , 1, /* HDMITX_VFMT_PC_640x480p_60Hz */ - 1, /* HDMITX_VFMT_PC_800x600p_60Hz */ - 1, /* HDMITX_VFMT_PC_1152x960p_60Hz */ - 1, /* HDMITX_VFMT_PC_1024x768p_60Hz */ - 1, /* HDMITX_VFMT_PC_1280x768p_60Hz */ - 1, /* HDMITX_VFMT_PC_1280x1024p_60Hz */ - 1, /* HDMITX_VFMT_PC_1360x768p_60Hz */ - 1, /* HDMITX_VFMT_PC_1400x1050p_60Hz */ - 1, /* HDMITX_VFMT_PC_1600x1200p_60Hz */ - 1, /* HDMITX_VFMT_PC_1024x768p_70Hz */ - 1, /* HDMITX_VFMT_PC_640x480p_72Hz */ - 1, /* HDMITX_VFMT_PC_800x600p_72Hz */ - 1, /* HDMITX_VFMT_PC_640x480p_75Hz */ - 1, /* HDMITX_VFMT_PC_1024x768p_75Hz */ - 1, /* HDMITX_VFMT_PC_800x600p_75Hz */ - 1, /* HDMITX_VFMT_PC_1024x864p_75Hz */ - 1, /* HDMITX_VFMT_PC_1280x1024p_75Hz */ - 1, /* HDMITX_VFMT_PC_640x350p_85Hz */ - 1, /* HDMITX_VFMT_PC_640x400p_85Hz */ - 1, /* HDMITX_VFMT_PC_720x400p_85Hz */ - 1, /* HDMITX_VFMT_PC_640x480p_85Hz */ - 1, /* HDMITX_VFMT_PC_800x600p_85Hz */ - 1, /* HDMITX_VFMT_PC_1024x768p_85Hz */ - 1, /* HDMITX_VFMT_PC_1152x864p_85Hz */ - 1, /* HDMITX_VFMT_PC_1280x960p_85Hz */ - 1, /* HDMITX_VFMT_PC_1280x1024p_85Hz */ - 1 /* HDMITX_VFMT_PC_1024x768i_87Hz */ -#endif /* FORMAT_PC */ - }; - -/** - * Lookup table to convert from EIA/CEA TV video format to - * the short format of resolution/interlace/frequency - */ - static UInt8 kVfmtToShortFmt_TV[TMDL_HDMITX_VFMT_TV_NUM] __maybe_unused = { - TV_INVALID, /* HDMITX_VFMT_NULL */ - TV_VGA_60Hz, /* HDMITX_VFMT_01_640x480p_60Hz */ - TV_480p_60Hz, /* HDMITX_VFMT_02_720x480p_60Hz */ - TV_480p_60Hz, /* HDMITX_VFMT_03_720x480p_60Hz */ - TV_720p_60Hz, /* HDMITX_VFMT_04_1280x720p_60Hz */ - TV_1080i_60Hz, /* HDMITX_VFMT_05_1920x1080i_60Hz */ - TV_480i_60Hz, /* HDMITX_VFMT_06_720x480i_60Hz */ - TV_480i_60Hz, /* HDMITX_VFMT_07_720x480i_60Hz */ - TV_240p_60Hz, /* HDMITX_VFMT_08_720x240p_60Hz */ - TV_240p_60Hz, /* HDMITX_VFMT_09_720x240p_60Hz */ - TV_480i_60Hz, /* HDMITX_VFMT_10_720x480i_60Hz */ - TV_480i_60Hz, /* HDMITX_VFMT_11_720x480i_60Hz */ - TV_240p_60Hz, /* HDMITX_VFMT_12_720x240p_60Hz */ - TV_240p_60Hz, /* HDMITX_VFMT_13_720x240p_60Hz */ - TV_480p_60Hz, /* HDMITX_VFMT_14_1440x480p_60Hz */ - TV_480p_60Hz, /* HDMITX_VFMT_15_1440x480p_60Hz */ - TV_1080p_60Hz, /* HDMITX_VFMT_16_1920x1080p_60Hz */ - TV_576p_50Hz, /* HDMITX_VFMT_17_720x576p_50Hz */ - TV_576p_50Hz, /* HDMITX_VFMT_18_720x576p_50Hz */ - TV_720p_50Hz, /* HDMITX_VFMT_19_1280x720p_50Hz */ - TV_1080i_50Hz, /* HDMITX_VFMT_20_1920x1080i_50Hz */ - TV_576i_50Hz, /* HDMITX_VFMT_21_720x576i_50Hz */ - TV_576i_50Hz, /* HDMITX_VFMT_22_720x576i_50Hz */ - TV_288p_50Hz, /* HDMITX_VFMT_23_720x288p_50Hz */ - TV_288p_50Hz, /* HDMITX_VFMT_24_720x288p_50Hz */ - TV_576i_50Hz, /* HDMITX_VFMT_25_720x576i_50Hz */ - TV_576i_50Hz, /* HDMITX_VFMT_26_720x576i_50Hz */ - TV_288p_50Hz, /* HDMITX_VFMT_27_720x288p_50Hz */ - TV_288p_50Hz, /* HDMITX_VFMT_28_720x288p_50Hz */ - TV_576p_50Hz, /* HDMITX_VFMT_29_1440x576p_50Hz */ - TV_576p_50Hz, /* HDMITX_VFMT_30_1440x576p_50Hz */ - TV_1080p_50Hz, /* HDMITX_VFMT_31_1920x1080p_50Hz */ - TV_INVALID, /* HDMITX_VFMT_NULL */ - TV_INVALID, /* HDMITX_VFMT_NULL */ - TV_INVALID, /* HDMITX_VFMT_NULL */ - TV_480p_60Hz, /* HDMITX_VFMT_35_2880x480p_60Hz */ - TV_480p_60Hz, /* HDMITX_VFMT_36_2880x480p_60Hz */ - TV_576p_50Hz, /* HDMITX_VFMT_37_2880x576p_50Hz */ - TV_576p_50Hz, /* HDMITX_VFMT_38_2880x576p_50Hz */ - TV_INVALID, /* HDMITX_VFMT_NULL */ - TV_INVALID, /* HDMITX_VFMT_NULL */ - TV_INVALID /* HDMITX_VFMT_NULL */ - }; - -/** - * Macro to pack vinMode(0-5), pixRate(0-1), syncIn(0-1) and bVerified(0-1) - * into a byte - */ -#define PKBYTE(mode, rate, sync, verf) (((rate)<<7)|((sync)<<6)|((verf)<<5)|((mode)&0x1F)) - -/** - * Macros to unpack vinMode(0-5), pixRate(0-1), syncIn(0-1) and bVerified(0-1) - * from a byte - */ -#define UNPKRATE(byte) (((byte)>>7)&1) -#define UNPKSYNC(byte) (((byte)>>6)&1) -#define UNPKVERF(byte) (((byte)>>5)&1) -#define UNPKMODE(byte) ((byte)&0x1F) - -/** - * Lookup table to match main video settings and look up sets of - * Refpix and Refline values - */ - static struct { - /* Values to match */ - UInt8 modeRateSyncVerf; /* Packed vinMode, pixRate, syncIn, bVerified */ - UInt8 shortVinFmt; - UInt8 shortVoutFmt; - /* Values to look up */ - UInt16 refPix; /* Output values */ - UInt16 refLine; - UInt16 scRefPix; /* Scaler values */ - UInt16 scRefLine; - } kRefpixRefline[] __maybe_unused = { - /*************************************************************/ - /** Rows formatted in "Refpix_Refline.xls" and pasted here **/ - /** DO NOT DELETE ANY ROWS, to keep all scaler combinations **/ - /*************************************************************/ - /* mode_____Rate___Sync_Verf shortVinFmt shortVoutFmt refPix refLine scRefPix scRefLine Test ID */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60Hz, TV_480p_60Hz, 0x08b, 0x024, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60Hz, TV_720p_60Hz, 0x08b, 0x012, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60Hz, TV_1080i_60Hz, 0x08b, 0x00e, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60Hz, TV_1080p_60Hz, 0x08b, 0x021, 0x078, 0x017}, /* */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480p_60Hz, TV_720p_60Hz, 0x08b, 0x017, 0x078, 0x02c}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480p_60Hz, TV_1080i_60Hz, 0x08b, 0x013, 0x078, 0x02c}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480p_60Hz, TV_1080p_60Hz, 0x08b, 0x027, 0x07A, 0x02c}, /* */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50Hz, TV_576p_50Hz, 0x091, 0x026, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50Hz, TV_720p_50Hz, 0x091, 0x013, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50Hz, TV_1080i_50Hz, 0x091, 0x00f, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50Hz, TV_1080p_50Hz, 0x091, 0x022, 0x085, 0x018}, /* */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576p_50Hz, TV_720p_50Hz, 0x091, 0x019, 0x085, 0x02e}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576p_50Hz, TV_1080i_50Hz, 0x091, 0x014, 0x085, 0x02e}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576p_50Hz, TV_1080p_50Hz, 0x091, 0x028, 0x087, 0x02e}, /* */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60Hz, TV_480p_60Hz, 0x014, 0x20d, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60Hz, TV_720p_60Hz, 0x014, 0x2cb, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60Hz, TV_1080i_60Hz, 0x014, 0x44c, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60Hz, TV_1080p_60Hz, 0x014, 0x436, 0x359, 0x004}, /* */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480p_60Hz, TV_720p_60Hz, 0x011, 0x2d3, 0x358, 0x007}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480p_60Hz, TV_1080i_60Hz, 0x011, 0x452, 0x358, 0x007}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480p_60Hz, TV_1080p_60Hz, 0x011, 0x43e, 0x358, 0x007}, /* */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50Hz, TV_576p_50Hz, 0x00d, 0x26b, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50Hz, TV_720p_50Hz, 0x00d, 0x2cb, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50Hz, TV_1080i_50Hz, 0x00d, 0x44b, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50Hz, TV_1080p_50Hz, 0x00d, 0x435, 0x35f, 0x001}, /* */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576p_50Hz, TV_720p_50Hz, 0x00d, 0x2d1, 0x35f, 0x001}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576p_50Hz, TV_1080i_50Hz, 0x00d, 0x451, 0x35f, 0x001}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576p_50Hz, TV_1080p_50Hz, 0x00d, 0x43d, 0x35f, 0x001}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60Hz, TV_480p_60Hz, 0x08b, 0x024, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60Hz, TV_720p_60Hz, 0x08b, 0x012, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60Hz, TV_1080i_60Hz, 0x08b, 0x00e, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60Hz, TV_1080p_60Hz, 0x08b, 0x021, 0x078, 0x017}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480p_60Hz, TV_720p_60Hz, 0x08b, 0x017, 0x078, 0x02c}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480p_60Hz, TV_1080i_60Hz, 0x08b, 0x013, 0x078, 0x02c}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480p_60Hz, TV_1080p_60Hz, 0x08b, 0x027, 0x07A, 0x02c}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50Hz, TV_576p_50Hz, 0x091, 0x026, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50Hz, TV_720p_50Hz, 0x091, 0x013, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50Hz, TV_1080i_50Hz, 0x091, 0x00f, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50Hz, TV_1080p_50Hz, 0x091, 0x022, 0x085, 0x018}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576p_50Hz, TV_720p_50Hz, 0x091, 0x019, 0x085, 0x02e}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576p_50Hz, TV_1080i_50Hz, 0x091, 0x014, 0x085, 0x02e}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576p_50Hz, TV_1080p_50Hz, 0x091, 0x028, 0x087, 0x02e}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60Hz, TV_480p_60Hz, 0x014, 0x20d, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60Hz, TV_720p_60Hz, 0x014, 0x2cb, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60Hz, TV_1080i_60Hz, 0x014, 0x44c, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60Hz, TV_1080p_60Hz, 0x014, 0x436, 0x359, 0x004}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480p_60Hz, TV_720p_60Hz, 0x011, 0x2d3, 0x358, 0x007}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480p_60Hz, TV_1080i_60Hz, 0x011, 0x452, 0x358, 0x007}, /* VID_F_01 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480p_60Hz, TV_1080p_60Hz, 0x011, 0x43e, 0x358, 0x007}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50Hz, TV_576p_50Hz, 0x00d, 0x26b, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50Hz, TV_720p_50Hz, 0x00d, 0x2cb, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50Hz, TV_1080i_50Hz, 0x00d, 0x44b, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50Hz, TV_1080p_50Hz, 0x00d, 0x435, 0x35f, 0x001}, /* */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576p_50Hz, TV_720p_50Hz, 0x00d, 0x2d1, 0x35f, 0x001}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576p_50Hz, TV_1080i_50Hz, 0x00d, 0x451, 0x35f, 0x001}, /* VID_F_06 */ - { - PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576p_50Hz, TV_1080p_50Hz, 0x00d, 0x43d, 0x35f, 0x001}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60Hz, TV_480p_60Hz, 0x08d, 0x028, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60Hz, TV_720p_60Hz, 0x08d, 0x014, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60Hz, TV_1080i_60Hz, 0x08d, 0x010, 0x078, 0x017}, /* VID_F_04 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60Hz, TV_1080p_60Hz, 0x08d, 0x021, 0x078, 0x017}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480p_60Hz, TV_720p_60Hz, 0x08d, 0x017, 0x078, 0x02c}, /* VID_F_01 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480p_60Hz, TV_1080i_60Hz, 0x08d, 0x014, 0x078, 0x02c}, /* VID_F_01 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480p_60Hz, TV_1080p_60Hz, 0x08d, 0x027, 0x07C, 0x02c}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50Hz, TV_576p_50Hz, 0x093, 0x02a, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50Hz, TV_720p_50Hz, 0x093, 0x013, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50Hz, TV_1080i_50Hz, 0x093, 0x00e, 0x085, 0x018}, /* VID_F_09 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50Hz, TV_1080p_50Hz, 0x093, 0x022, 0x085, 0x018}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576p_50Hz, TV_720p_50Hz, 0x093, 0x019, 0x085, 0x02e}, /* VID_F_06 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576p_50Hz, TV_1080i_50Hz, 0x093, 0x014, 0x085, 0x02e}, /* VID_F_06 */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576p_50Hz, TV_1080p_50Hz, 0x093, 0x028, 0x089, 0x02e}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_720p_50Hz, TV_1080p_50Hz, 0x2bf, 0x024, 0x105, 0x019}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_720p_60Hz, TV_1080p_60Hz, 0x175, 0x024, 0x105, 0x019}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_1080i_50Hz, TV_1080p_50Hz, 0x2d3, 0x023, 0x0c3, 0x014}, /* */ - { - PKBYTE(iYUV422, SINGLE, EMB, 1), TV_1080i_60Hz, TV_1080p_60Hz, 0x11b, 0x023, 0x0c3, 0x014}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60Hz, TV_480p_60Hz, 0x016, 0x20d, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60Hz, TV_720p_60Hz, 0x016, 0x2cb, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60Hz, TV_1080i_60Hz, 0x016, 0x44c, 0x359, 0x004}, /* VID_F_04 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60Hz, TV_1080p_60Hz, 0x016, 0x436, 0x359, 0x004}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480p_60Hz, TV_720p_60Hz, 0x013, 0x2d3, 0x358, 0x007}, /* VID_F_01 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480p_60Hz, TV_1080i_60Hz, 0x013, 0x452, 0x358, 0x007}, /* VID_F_01 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480p_60Hz, TV_1080p_60Hz, 0x013, 0x43e, 0x358, 0x007}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50Hz, TV_576p_50Hz, 0x00f, 0x26b, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50Hz, TV_720p_50Hz, 0x00f, 0x2cb, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50Hz, TV_1080i_50Hz, 0x00f, 0x44b, 0x35f, 0x001}, /* VID_F_09 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50Hz, TV_1080p_50Hz, 0x00f, 0x435, 0x35f, 0x001}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576p_50Hz, TV_720p_50Hz, 0x00f, 0x2d1, 0x35f, 0x001}, /* VID_F_06 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576p_50Hz, TV_1080i_50Hz, 0x00f, 0x451, 0x35f, 0x001}, /* VID_F_06 */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576p_50Hz, TV_1080p_50Hz, 0x00f, 0x43d, 0x35f, 0x001}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_720p_50Hz, TV_1080p_50Hz, 0x1bb, 0x463, 0x7bb, 0x000}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_720p_60Hz, TV_1080p_60Hz, 0x071, 0x463, 0x671, 0x000}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_1080i_50Hz, TV_1080p_50Hz, 0x213, 0x460, 0xa4f, 0x000}, /* */ - { - PKBYTE(iYUV422, SINGLE, EXT, 1), TV_1080i_60Hz, TV_1080p_60Hz, 0x05b, 0x460, 0x897, 0x000}, /* */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480p_60Hz, TV_VGA_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480i_60Hz, TV_480p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480i_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480i_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_04 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480p_60Hz, TV_720p_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480p_60Hz, TV_1080i_60Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_01 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576i_50Hz, TV_576p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576i_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576i_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_09 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576p_50Hz, TV_720p_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576p_50Hz, TV_1080i_50Hz, 0x000, 0x000, 0x000, 0x000}, /* VID_F_06 */ - { - PKBYTE(iINVALID, DOUBLE, EMB, 0), TV_INVALID, TV_INVALID, 0x000, 0x000, 0x000, 0x000} /* EndTable */ - }; - - -/*============================================================================*/ -/* ENUM OR TYPE DEFINITIONS */ -/*============================================================================*/ -/* Enum listing all the type of colorimetry */ - typedef enum { - TMDL_HDMITX_COLORIMETRY_NO_DATA = 0, - TMDL_HDMITX_COLORIMETRY_ITU601 = 1, - TMDL_HDMITX_COLORIMETRY_ITU709 = 2, - TMDL_HDMITX_COLORIMETRY_EXTENDED = 3 - } tmdlHdmiTxColorimetry_t; - -/* Possible states of the state machine */ - typedef enum { - STATE_NOT_INITIALIZED, - /**< Driver is not initialized */ - STATE_INITIALIZED, - /**< Driver is initialized */ - STATE_UNPLUGGED, - /**< Receiver device not connected */ - STATE_PLUGGED, - /**< Receiver device connected, clock lock */ - STATE_EDID_AVAILABLE - /**< Managed to read receiver's EDID */ - } tmdlHdmiTxDriverState_t; - -/* revocation list structure */ - typedef struct { - UInt8 *pList; - UInt32 length; - } revocationList_t; - - -/* unit configuration structure */ - typedef struct { - Bool opened; /**< Is unit instanciated ? */ - Bool hdcpEnable; /**< Is HDCP enabled ? */ - tmdlHdmiTxHdcpOptions_t hdcpOptions; /**< HDCP options */ - Bool repeaterEnable; /**< Is repeater enabled ? */ - Bool simplayHd; /**< Enable simplayHD support */ - tmdlHdmiTxDeviceVersion_t deviceVersion; /**< Version of the HW device */ - UInt8 *pEdidBuffer; /**< Pointer to raw EDID data */ - UInt32 edidBufferSize; /**< Size of buffer for raw EDID data */ - tmdlHdmiTxIWTaskHandle_t commandTaskHandle; /**< Handle of the command task associated to this unit */ - tmdlHdmiTxIWQueueHandle_t queueHandle; /**< Handle of the message queue associated to this unit */ - tmdlHdmiTxIWTaskHandle_t hdcpTaskHandle; /**< Handle of the hdcp check task associated to this unit */ - tmdlHdmiTxDriverState_t state; /**< Current state of the driver */ - ptmdlHdmiTxCallback_t pCallback; /**< Data callback */ - revocationList_t revocationList; /**< Revolation List */ - } unitConfig_t; - - -/* Instance status */ - -/* Video information structure */ - typedef struct _tmdlHdmiTxVideoInfo_t { - Bool videoMuteState; /* Video mute state: on/off */ - tmdlHdmiTxVideoInConfig_t videoInConfig; /* Video input configuration */ - tmdlHdmiTxVideoOutConfig_t videoOutConfig; /* Video output configuration */ - } tmdlHdmiTxVideoInfo_t, *ptmdlHdmiTxVideoInfo_t; - -/* Audio information structure */ - typedef struct _tmdlHdmiTxAudioInfo_t { - Bool audioMuteState; /* Audio mute state: on/off */ - tmdlHdmiTxAudioInConfig_t audioInCfg; /* Audio input configuration */ - } tmdlHdmiTxAudioInfo_t, *ptmdlHdmiTxAudioInfo_t; - -/* Event state structure */ - typedef struct _tmdlHdmiTxEventState_t { - tmdlHdmiTxEvent_t event; /* Event */ - tmdlHdmiTxEventStatus_t status; /* Event status: enabled or disabled */ - } tmdlHdmiTxEventState_t, *ptmdlHdmiTxEventState_t; - -/* Color bars state structure */ - typedef struct _tmdlHdmiTxColBarState_t { - Bool disableColorBarOnR0; /* To be able to disable colorBar on R0 */ - Bool hdcpColbarChange; /* Used to auto-reset colour bars */ - Bool hdcpEncryptOrT0; /* True when ENCRYPT or T0 interrupt */ - Bool hdcpSecureOrT0; /* True when BKSV secure or T0 */ - Bool inOutFirstSetDone; /* API tmdlHdmiTxSetInputOutput call at least one time */ - Bool colorBarOn; - Bool changeColorBarNow; - } tmdlHdmiTxColBarState_t, *ptmdlHdmiTxColBarState_t; - -/* Gamut state structure */ - typedef struct _tmdlHdmiTxGamutState_t { - Bool gamutOn; /* Gamut status : able or disable */ - UInt8 gamutBufNum; /* Numero of the buffer used for Gamut metadata (0 or 1) */ - tmdlHdmiTxExtColorimetry_t wideGamutColorSpace; /* Store extended colorimetry */ - Bool extColOn; /* extended colorimetry status : enabled or disabled */ - tmdlHdmiTxYCCQR_t yccQR; /* Store YCC quantisation range */ - } tmdlHdmiTxGamutState_t, *ptmdlHdmiTxGamutState_t; - - -/* instance status structure */ - typedef struct { - ptmdlHdmiTxVideoInfo_t pVideoInfo; /* Video information: current mode and format... */ - ptmdlHdmiTxAudioInfo_t pAudioInfo; /* Audio information: current mode and format... */ - ptmdlHdmiTxEventState_t pEventState; /* Event state: enabled or disabled */ - ptmdlHdmiTxColBarState_t pColBarState; /* Color bars state */ - ptmdlHdmiTxGamutState_t pGamutState; /* Gamut state */ - } instanceStatus_t; - -/*============================================================================*/ -/* FUNCTION PROTOTYPES */ -/*============================================================================*/ - - -/****************************************************************************** - \brief This function allows to the main driver to retrieve its - configuration parameters. - - \param pConfig Pointer to the config structure - - \return The call result: - - TM_OK: the call was successful - - TMDL_ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or - the receiver instance is not initialised - - TMDL_ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is - inconsistent - -******************************************************************************/ - tmErrorCode_t dlHdmiTxGetConfig - (tmUnitSelect_t unit, tmdlHdmiTxDriverConfigTable_t *pConfig); - - -#ifdef __cplusplus -} -#endif - -#endif /* TMDLHDMITX_LOCAL_H */ - -/*============================================================================*/ -/* END OF FILE */ -/*============================================================================*/ diff --git a/drivers/misc/mediatek/hwinfo/Makefile b/drivers/misc/mediatek/hwinfo/Makefile new file mode 100755 index 00000000000..bbe3692b846 --- /dev/null +++ b/drivers/misc/mediatek/hwinfo/Makefile @@ -0,0 +1,6 @@ +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += hw_interface.o + + + diff --git a/drivers/misc/mediatek/hwinfo/hw_interface.c b/drivers/misc/mediatek/hwinfo/hw_interface.c new file mode 100755 index 00000000000..5cea7aba18c --- /dev/null +++ b/drivers/misc/mediatek/hwinfo/hw_interface.c @@ -0,0 +1,435 @@ +/* +* Copyright (C) 2011-2014 Huaqin 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/****************************************************************************** + **** Global Marco +******************************************************************************/ +#define ADC_BOARD_ID (15) /* ADC_BORRD_ID is AUX_IN5 and in ADC the channel is 15 */ +#define BUILD_VARIANT_GPIO_NUM (50) + +/****************************************************************************** + **** Some struct defenition +******************************************************************************/ +struct board_id_information { + int initialized; + int adc_channel; + int voltage; + char *built_name; + char *id; +}; + +static struct board_id_information board_id; +extern struct msdc_host *mtk_msdc_host[3]; + +/****************************************************************************** +**** build variant attribute group +*******************************************************************************/ + +static int get_build_variant_gpio_level(void) +{ + mt_set_gpio_mode(BUILD_VARIANT_GPIO_NUM, GPIO_MODE_GPIO); + mt_set_gpio_dir(BUILD_VARIANT_GPIO_NUM, GPIO_DIR_IN); + return mt_get_gpio_in(BUILD_VARIANT_GPIO_NUM); +} + +static ssize_t show_gpio_num(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret_value = 1; + ret_value = sprintf(buf, "%d\n", BUILD_VARIANT_GPIO_NUM); + return ret_value; +} + +static ssize_t show_gpio_level(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret_value = 1; + ret_value = sprintf(buf, "%d\n", get_build_variant_gpio_level()); + return ret_value; +} + +static ssize_t show_build_variant(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret_value = 1; + int gpio_level = get_build_variant_gpio_level(); + ret_value = sprintf(buf, "%s\n", gpio_level ? "SHIP" : "ENG"); + return ret_value; +} + +static DEVICE_ATTR(gpio_num, 0644, show_gpio_num, NULL); +static DEVICE_ATTR(gpio_level, 0644, show_gpio_level, NULL); +static DEVICE_ATTR(build_variant, 0644, show_build_variant, NULL); + +static struct attribute *build_variant_sysfs_entries[] = { + &dev_attr_gpio_num.attr, + &dev_attr_gpio_level.attr, + &dev_attr_build_variant.attr, + NULL +}; + +static struct attribute_group build_variant_attribute_group = { + .name = "build_variant", + .attrs = build_variant_sysfs_entries, +}; + +/****************************************************************************** +**** board_id attribute group +*******************************************************************************/ + +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int *rawdata); + +static int init_board_id(void) +{ + if (1 == board_id.initialized) + return 1; + else { + int data[4]; + int voltage = 0; + int ret = 0; + board_id.adc_channel = ADC_BOARD_ID; /* ADC_BORRD_ID is AUX_IN5 and in ADC the channel is 15 */ + + ret = + IMM_GetOneChannelValue(board_id.adc_channel, data, + &voltage); + if (0 != ret) { + printk(KERN_WARNING + "init_board_id get ADC error: %d\n", ret); + return 0; + } + + board_id.voltage = (voltage * 1500) / 4096; + /* MTK's suggestion we convert to a valid voltage */ + +#ifdef CONFIG_AUSTIN_PROJECT + if (board_id.voltage < 150) { /* HVT 0V */ + board_id.built_name = "HVT"; + board_id.id = "0037001010000017"; + } else if (board_id.voltage < 322) { /* EVT1.0 0.224V */ + board_id.built_name = "EVT1.0"; + board_id.id = "0037001020000017"; + } else if (board_id.voltage < 570) { /* EVT1.1 0.42V */ + board_id.built_name = "EVT1.1"; + board_id.id = "0037001030000017"; + } else if (board_id.voltage < 810) { /* EVT1.2 0.72V */ + board_id.built_name = "EVT1.2"; + board_id.id = "0037001040000017"; + } else if (board_id.voltage < 1005) { /* DVT1.0 0.9V */ + board_id.built_name = "DVT1.0"; + board_id.id = "0037001050000017"; + } else if (board_id.voltage < 1230) { /* DVT1.1 1.11V */ + board_id.built_name = "DVT1.1"; + board_id.id = "0037001060000017"; + } else if (board_id.voltage < 1575) { /* PVT 1.35V */ + board_id.built_name = "PVT"; + board_id.id = "0037001070000017"; + } else { + board_id.built_name = "unknow stage"; + board_id.id = "0037001000000017"; + } +#else + if (board_id.voltage < 300) { /* HVT 0V */ + board_id.built_name = "HVT"; + board_id.id = "0025001010000015"; + } else if (board_id.voltage < 570) { /* EVT1 0.42V */ + board_id.built_name = "EVT1"; + board_id.id = "0025001020000015"; + } else if (board_id.voltage < 810) { /* EVT2 0.72V */ + board_id.built_name = "EVT2"; + board_id.id = "0025001020000015"; + } else if (board_id.voltage < 1005) { /* DVT1 0.9V */ + board_id.built_name = "DVT1"; + board_id.id = "0025001030000015"; + } else if (board_id.voltage < 1230) { /* DVT2 1.11V */ + board_id.built_name = "DVT2"; + board_id.id = "0025001030000015"; + } else if (board_id.voltage < 1500) { /* EVT 1.35V */ + board_id.built_name = "PVT"; + board_id.id = "0025001040000015"; + } else { + board_id.built_name = "unknow stage"; + board_id.id = "0025001000000015"; + } +#endif + board_id.initialized = 1; + return 1; + } +} + +static ssize_t show_adc_channel(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret_value = 1; + ret_value = sprintf(buf, "%d\n", ADC_BOARD_ID); + return ret_value; +} + +static ssize_t show_voltage(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret_value = 1; + init_board_id(); + ret_value = sprintf(buf, "%d\n", board_id.voltage); + return ret_value; +} + +static ssize_t show_built_name(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret_value = 1; + init_board_id(); + ret_value = sprintf(buf, "%s\n", board_id.built_name); + return ret_value; +} + +static ssize_t show_id(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret_value = 1; + init_board_id(); + ret_value = sprintf(buf, "%s\n", board_id.id); + return ret_value; +} + +static DEVICE_ATTR(adc_channel, 0644, show_adc_channel, NULL); +static DEVICE_ATTR(voltage, 0644, show_voltage, NULL); +static DEVICE_ATTR(built_name, 0644, show_built_name, NULL); +static DEVICE_ATTR(id, 0644, show_id, NULL); + +static struct attribute *board_id_sysfs_entries[] = { + &dev_attr_adc_channel.attr, + &dev_attr_voltage.attr, + &dev_attr_built_name.attr, + &dev_attr_id.attr, + NULL +}; + +static struct attribute_group board_id_attribute_group = { + .name = "board_id", + .attrs = board_id_sysfs_entries, +}; + + +/****************************************************************************** +**** device informations +*******************************************************************************/ + +extern unsigned int msdc_get_capacity(int get_emmc_total); +unsigned int round_kbytes_to_readable_mbytes(unsigned int k) +{ + unsigned int r_size_m = 0; + if (k > 64 * 1024 * 1024) + r_size_m = 128 * 1024; + else if (k > 32 * 1024 * 1024) + r_size_m = 64 * 1024; + else if (k > 16 * 1024 * 1024) + r_size_m = 32 * 1024; + else if (k > 8 * 1024 * 1024) + r_size_m = 16 * 1024; + else if (k > 4 * 1024 * 1024) + r_size_m = 8 * 1024; + else if (k > 2 * 1024 * 1024) + r_size_m = 4 * 1024; + else if (k > 1 * 1024 * 1024) + r_size_m = 2 * 1024; + else if (k > 512 * 1024) + r_size_m = 1024; + else if (k > 256 * 1024) + r_size_m = 512; + else if (k > 128 * 1024) + r_size_m = 256; + else + k = 0; + return r_size_m; +} + +static ssize_t show_ram_size(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret_value = 1; +#define K(x) ((x) << (PAGE_SHIFT - 10)) + struct sysinfo i; + si_meminfo(&i); + + if (round_kbytes_to_readable_mbytes(K(i.totalram)) >= 1024) { + ret_value = + sprintf(buf, "%dGB", + round_kbytes_to_readable_mbytes(K(i.totalram)) / + 1024); + } else { + ret_value = + sprintf(buf, "%dMB", + round_kbytes_to_readable_mbytes(K(i.totalram))); + } + + return ret_value; +} + +static ssize_t show_emmc_size(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret_value = 1; + + ret_value = + sprintf(buf, "%dGB", + round_kbytes_to_readable_mbytes(msdc_get_capacity(1) / 2) / + 1024); + return ret_value; + +} + +static DEVICE_ATTR(ram_size, 0644, show_ram_size, NULL); +static DEVICE_ATTR(emmc_size, 0644, show_emmc_size, NULL); + +static struct attribute *device_information_sysfs_entries[] = { + &dev_attr_ram_size.attr, + &dev_attr_emmc_size.attr, + NULL +}; + +static struct attribute_group device_information_attribute_group = { + .name = "device_information", + .attrs = device_information_sysfs_entries, +}; + +/****************************************************************************************** +******************************************************************************************* +*******************************************************************************************/ +static int hw_interface_driver_probe(struct platform_device *dev) +{ + int error = 0; + + error = sysfs_create_group(&dev->dev.kobj, &board_id_attribute_group); + if (error) { + printk + (KERN_WARNING + "failed to create sysfs device attributes board_id_attribute_group\n"); + goto exit_error; + } + + error = + sysfs_create_group(&dev->dev.kobj, &build_variant_attribute_group); + if (error) { + printk + (KERN_WARNING + "failed to create sysfs device attributes build_variant_attribute_group\n"); + goto error_2; + } + + error = + sysfs_create_group(&dev->dev.kobj, + &device_information_attribute_group); + if (error) { + printk + (KERN_WARNING + "failed to create sysfs device attributes device_information_attribute_group\n"); + goto error_1; + } + goto exit_error; + +error_1: + sysfs_remove_group(&dev->dev.kobj, &build_variant_attribute_group); +error_2: + sysfs_remove_group(&dev->dev.kobj, &board_id_attribute_group); +exit_error: + return error; +} + +static int hw_interface_driver_remove(struct platform_device *dev) +{ + printk(KERN_WARNING "** hw_interface_drvier_remove!! **"); + + sysfs_remove_group(&dev->dev.kobj, &board_id_attribute_group); + sysfs_remove_group(&dev->dev.kobj, &build_variant_attribute_group); + sysfs_remove_group(&dev->dev.kobj, &device_information_attribute_group); + + return 0; +} + +static struct platform_driver hw_interface_driver = { + .probe = hw_interface_driver_probe, + .remove = hw_interface_driver_remove, + .driver = { + .name = "hw_interface", + }, +}; + +static struct platform_device hw_interface_device = { + .name = "hw_interface", + .id = -1, +}; + +static int __init hw_interface_mod_init(void) +{ + int ret = 0; + ret = platform_device_register(&hw_interface_device); + if (ret) { + printk + (KERN_WARNING + "**hw_interface_mod_init Unable to driver register(%d)\n", + ret); + goto fail_2; + } + + ret = platform_driver_register(&hw_interface_driver); + if (ret) { + printk + (KERN_WARNING + "**hw_interface_mod_init Unable to driver register(%d)\n", + ret); + goto fail_1; + } + + goto ok_result; + +fail_1: + platform_driver_unregister(&hw_interface_driver); +fail_2: + platform_device_unregister(&hw_interface_device); +ok_result: + return ret; +} + +/*****************************************************************************/ +static void __exit hw_interface_mod_exit(void) +{ + platform_driver_unregister(&hw_interface_driver); + platform_device_unregister(&hw_interface_device); +} + +/*****************************************************************************/ +module_init(hw_interface_mod_init); +module_exit(hw_interface_mod_exit); +/*****************************************************************************/ diff --git a/drivers/misc/mediatek/hwmon/hwmsen/hwmsen_dev.c b/drivers/misc/mediatek/hwmon/hwmsen/hwmsen_dev.c old mode 100644 new mode 100755 index 82ff11f9145..41ac36a43dd --- a/drivers/misc/mediatek/hwmon/hwmsen/hwmsen_dev.c +++ b/drivers/misc/mediatek/hwmon/hwmsen/hwmsen_dev.c @@ -35,7 +35,12 @@ #include //add for fix resume issue #include +#ifdef CONFIG_PM_WAKELOCKS +#include +#else #include +#endif + //add for fix resume issue end #include @@ -118,7 +123,11 @@ struct hwmdev_object { #if defined(CONFIG_HAS_EARLYSUSPEND) //add for fix resume issue struct early_suspend early_drv; - struct wake_lock read_data_wake_lock; + #ifdef CONFIG_PM_WAKELOCKS + struct wakeup_source read_data_wake_lock; + #else + struct wake_lock read_data_wake_lock; + #endif atomic_t early_suspend; //add for fix resume end #endif //#if defined(CONFIG_HAS_EARLYSUSPEND) @@ -144,7 +153,7 @@ int hwmsen_aal_enable(int en) { struct hwmsen_context *cxt = NULL; int err = 0; - int enable = 0; + if(!hwm_obj) { @@ -188,12 +197,11 @@ int hwmsen_aal_get_data() { struct hwmsen_context *cxt = NULL; int err = 0; - int enable = 0; int out_size; hwm_sensor_data sensor_data; int als_data = 0; - //HWM_LOG("hwmsen_aal_get_data1\n"); + HWM_LOG("hwmsen_aal_get_data1\n"); if(!hwm_obj) { HWM_ERR("AAL hwmdev obj pointer is NULL!\n"); @@ -207,7 +215,7 @@ int hwmsen_aal_get_data() mutex_lock(&hwm_obj->dc->lock); cxt = hwm_obj->dc->cxt[ID_LIGHT]; - //HWM_LOG("hwmsen_aal_get_data2\n"); + HWM_LOG("hwmsen_aal_get_data2\n"); err = cxt->obj.sensor_operate(cxt->obj.self,SENSOR_GET_DATA, NULL, 0, &sensor_data, sizeof(hwm_sensor_data), &out_size); if(err) @@ -221,7 +229,7 @@ int hwmsen_aal_get_data() als_data = sensor_data.values[0]; } mutex_unlock(&hwm_obj->dc->lock); - //HWM_LOG("hwmsen_aal_get_data3\n"); + HWM_LOG("hwmsen_aal_get_data3\n"); return als_data; } @@ -265,7 +273,7 @@ static void hwmsen_work_func(struct work_struct *work) memset(&sensor_data, 0, sizeof(sensor_data)); time.tv_sec = time.tv_nsec = 0; - get_monotonic_boottime(&time); + time = get_monotonic_coarse(); nt = time.tv_sec*1000000000LL+time.tv_nsec; //mutex_lock(&obj_data.lock); for(idx = 0; idx < MAX_ANDROID_SENSOR_NUM; idx++) @@ -287,7 +295,11 @@ static void hwmsen_work_func(struct work_struct *work) obj_data.data_updata[idx] = 0; mutex_unlock(&obj_data.lock); } - continue; + //Evne if interrupt mode, try to take the initiative in querying a valid sensor data. + else if (obj_data.sensors_data[idx].values[0] != SENSOR_INVALID_VALUE) + { + continue; + } } @@ -340,12 +352,12 @@ static void hwmsen_work_func(struct work_struct *work) if((sensor_data.values[0] != obj_data.sensors_data[idx].values[0]) || (sensor_data.values[1] != obj_data.sensors_data[idx].values[1]) || (sensor_data.values[2] != obj_data.sensors_data[idx].values[2]) - || (idx == ID_MAGNETIC) || (idx == ID_ACCELEROMETER)) + || (idx == ID_MAGNETIC) || (idx == ID_ACCELEROMETER) + || (idx == ID_GYROSCOPE) || (idx == ID_ORIENTATION)) { - if( 0 == sensor_data.values[0] && 0==sensor_data.values[1] - && 0 == sensor_data.values[2]) + if((0 == sensor_data.values[0] && 0==sensor_data.values[1] + && 0 == sensor_data.values[2]) && (idx != ID_GYROSCOPE)) { - continue; } mutex_lock(&obj_data.lock); @@ -443,7 +455,7 @@ int hwmsen_get_interrupt_data(int sensor, hwm_sensor_data *data) else { time.tv_sec = time.tv_nsec = 0; - get_monotonic_boottime(&time); + time = get_monotonic_coarse(); nt = time.tv_sec*1000000000LL+time.tv_nsec; if((sensor == ID_LIGHT) ||(sensor == ID_PRESSURE) ||(sensor == ID_PROXIMITY) || (sensor == ID_TEMPRERATURE)) @@ -602,11 +614,11 @@ static int hwmsen_enable(struct hwmdev_object *obj, int sensor, int enable) uint32_t sensor_type; sensor_type = 1 << sensor; - - if (sensor > MAX_ANDROID_SENSOR_NUM || sensor < 0) { - HWM_ERR("handle %d!\n", sensor); - return -EINVAL; - } + + if (sensor > MAX_ANDROID_SENSOR_NUM || sensor < 0) { + HWM_ERR("handle %d!\n", sensor); + return -EINVAL; + } if(!obj) { @@ -618,6 +630,7 @@ static int hwmsen_enable(struct hwmdev_object *obj, int sensor, int enable) HWM_ERR("the sensor (%d) is not attached!!\n", sensor); return -ENODEV; } + mutex_lock(&obj->dc->lock); cxt = obj->dc->cxt[sensor]; @@ -728,10 +741,10 @@ static int hwmsen_enable_nodata(struct hwmdev_object *obj, int sensor, int enabl HWM_FUN(f); sensor_type = 1 << sensor; - if (sensor > MAX_ANDROID_SENSOR_NUM || sensor < 0) { - HWM_ERR("handle %d!\n", sensor); - return -EINVAL; - } + if (sensor > MAX_ANDROID_SENSOR_NUM || sensor < 0) { + HWM_ERR("handle %d!\n", sensor); + return -EINVAL; + } if(NULL == obj) { @@ -743,6 +756,7 @@ static int hwmsen_enable_nodata(struct hwmdev_object *obj, int sensor, int enabl HWM_ERR("the sensor (%d) is not attached!!\n", sensor); return -ENODEV; } + mutex_lock(&obj->dc->lock); cxt = obj->dc->cxt[sensor]; @@ -792,10 +806,11 @@ static int hwmsen_set_delay(int delay, int handle ) int err = 0; struct hwmsen_context *cxt = NULL; - if (handle > MAX_ANDROID_SENSOR_NUM || handle < 0) { - HWM_ERR("handle %d!\n", handle); - return -EINVAL; - } + if (handle > MAX_ANDROID_SENSOR_NUM || handle < 0) { + HWM_ERR("handle %d!\n", handle); + return -EINVAL; + } + cxt = hwm_obj->dc->cxt[handle]; if(NULL == cxt ||(cxt->obj.sensor_operate == NULL)) { @@ -987,9 +1002,9 @@ static ssize_t hwmsen_store_trace(struct device* dev, HWM_ERR("set trace level fail!!\n"); } return count; -} +} /*----------------------------------------------------------------------------*/ -static ssize_t hwmsen_show_sensordevnum(struct device *dev, +static ssize_t hwmsen_show_sensordevnum(struct device *dev, struct device_attribute *attr, char *buf) { const char *devname = NULL; @@ -997,12 +1012,20 @@ static ssize_t hwmsen_show_sensordevnum(struct device *dev, return snprintf(buf, PAGE_SIZE, "%s\n", devname+5); } +/*----------------------------------------------------------------------------*/ +static ssize_t hwmsen_show_gsensor_name(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, sizeof(gsensor_name), "%s\n", gsensor_name); +} + DEVICE_ATTR(hwmdev, S_IRUGO, hwmsen_show_hwmdev, NULL); DEVICE_ATTR(active, S_IWUSR | S_IRUGO, hwmsen_show_hwmdev, hwmsen_store_active); DEVICE_ATTR(delay, S_IWUSR | S_IRUGO, hwmsen_show_delay, hwmsen_store_delay); DEVICE_ATTR(wake, S_IWUSR | S_IRUGO, hwmsen_show_wake, hwmsen_store_wake); DEVICE_ATTR(trace, S_IWUSR | S_IRUGO, hwmsen_show_trace, hwmsen_store_trace); DEVICE_ATTR(hwmsensordevnum, S_IRUGO, hwmsen_show_sensordevnum, NULL); +DEVICE_ATTR(gsensor_name, S_IRUGO, hwmsen_show_gsensor_name, NULL); /*----------------------------------------------------------------------------*/ static struct device_attribute *hwmsen_attr_list[] = { @@ -1012,11 +1035,12 @@ static struct device_attribute *hwmsen_attr_list[] = &dev_attr_wake, &dev_attr_trace, &dev_attr_hwmsensordevnum, + &dev_attr_gsensor_name, }; /*----------------------------------------------------------------------------*/ -static int hwmsen_create_attr(struct device *dev) +static int hwmsen_create_attr(struct device *dev) { int idx, err = 0; int num = (int)(sizeof(hwmsen_attr_list)/sizeof(hwmsen_attr_list[0])); @@ -1024,13 +1048,13 @@ static int hwmsen_create_attr(struct device *dev) if(!dev) { return -EINVAL; - } + } for(idx = 0; idx < num; idx++) { if((err = device_create_file(dev, hwmsen_attr_list[idx]))) - { - HWM_ERR("device_create_file (%s) = %d\n", hwmsen_attr_list[idx]->attr.name, err); + { + HWM_ERR("device_create_file (%s) = %d\n", hwmsen_attr_list[idx]->attr.name, err); break; } } @@ -1040,7 +1064,7 @@ static int hwmsen_create_attr(struct device *dev) /*----------------------------------------------------------------------------*/ static int hwmsen_delete_attr(struct device *dev) { - + int idx ,err = 0; int num = (int)(sizeof(hwmsen_attr_list)/sizeof(hwmsen_attr_list[0])); HWM_FUN(f); @@ -1048,12 +1072,12 @@ static int hwmsen_delete_attr(struct device *dev) { return -EINVAL; } - + for (idx = 0; idx < num; idx++) { device_remove_file(dev, hwmsen_attr_list[idx]); - } + } return err; } @@ -1063,13 +1087,13 @@ static int init_static_data(void) { int i = 0; // memset(&obj_data, 0, sizeof(struct hwmsen_data)); -// obj_data.lock = __MUTEX_INITIALIZER(obj_data.lock); +// obj_data.lock = __MUTEX_INITIALIZER(obj_data.lock); for(i=0; i < MAX_ANDROID_SENSOR_NUM; i++) { - dev_cxt.cxt[i] = NULL; + //dev_cxt.cxt[i] = NULL; memset(&obj_data.sensors_data[i], SENSOR_INVALID_VALUE, sizeof(hwm_sensor_data)); obj_data.sensors_data[i].sensor = i; - + } return 0; } @@ -1336,14 +1360,18 @@ static int hwmsen_probe(struct platform_device *pdev) HWM_ERR("unable to create attributes!!\n"); goto exit_hwmsen_create_attr_failed; } -#if defined(CONFIG_HAS_EARLYSUSPEND) +#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(CONFIG_EARLYSUSPEND) // add for fix resume bug atomic_set(&(hwm_obj->early_suspend), 0); hwm_obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1, hwm_obj->early_drv.suspend = hwmsen_early_suspend, hwm_obj->early_drv.resume = hwmsen_late_resume, register_early_suspend(&hwm_obj->early_drv); + #ifdef CONFIG_PM_WAKELOCKS + wakeup_source_init(&(hwm_obj->read_data_wake_lock),"read_data_wake_lock"); + #else wake_lock_init(&(hwm_obj->read_data_wake_lock),WAKE_LOCK_SUSPEND,"read_data_wake_lock"); + #endif // add for fix resume bug end #endif //#if defined(CONFIG_HAS_EARLYSUSPEND) return 0; @@ -1737,8 +1765,9 @@ static void __exit hwmsen_exit(void) platform_driver_unregister(&hwmsen_driver); } /*----------------------------------------------------------------------------*/ -module_init(hwmsen_init); -module_exit(hwmsen_exit); +late_initcall(hwmsen_init); +//module_init(hwmsen_init); +//module_exit(hwmsen_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("sensor device driver"); MODULE_AUTHOR("Chunlei Wangmsg_buf = msg->buf; i2c->msg_len = msg->len; + + #ifdef TRANS_LEN_EXCEED_255BYTES + if ((!(msg->ext_flag & I2C_DMA_FLAG)) + && (((msg->len & 0xFF) > 8) + || (((msg->len >> 8) & 0xFF) > 8))) { + I2CLOG("I2C transfer len > 255 bytes.\n"); + i2c->ext_flag |= I2C_DMA_FLAG; + } + #endif + if(msg->ext_flag & I2C_RS_FLAG) i2c->st_rs = I2C_TRANS_REPEATED_START; else diff --git a/drivers/misc/mediatek/i2c/mt8127/i2c_common.c b/drivers/misc/mediatek/i2c/mt8127/i2c_common.c index 49a764a604e..b2e2e52d932 100644 --- a/drivers/misc/mediatek/i2c/mt8127/i2c_common.c +++ b/drivers/misc/mediatek/i2c/mt8127/i2c_common.c @@ -43,11 +43,11 @@ int string2hex(const char * buffer, int cnt){ return c; } -char * get_hexbuffer(char *data_buffer, char *hex_buffer) +char * get_hexbuffer(char *data_buffer, char *hex_buffer, int str_len) { char * ptr = data_buffer; int index = 0; - while (*ptr && *++ptr) { + while (*ptr && *++ptr && str_len--) { *(hex_buffer + index++) = string2hex(ptr-1, 2); ptr++; } @@ -189,7 +189,7 @@ static ssize_t set_config(struct device *dev, struct device_attribute *attr, con int timing; int trans_num; int trans_auxlen; - int dir=0; + int data_len; int number = 0; int length = 0; @@ -202,9 +202,10 @@ static ssize_t set_config(struct device *dev, struct device_attribute *attr, con unsigned char tmpbuffer[128]; printk("%s\n", buf); //if ( sscanf(buf, "%d %d %d %d %d %d %d %d %d %d %d %d %s", &bus_id, &address, &operation, &trans_mode, &trans_stop, &speed_mode, &pushpull_mode, &query_mode, &timing, &trans_num, &trans_auxlen,&dir, data_buffer) ) { - if ( sscanf(buf, "%d %x %d %d %d %d %d %d %d %d %d %1023s", &bus_id, &address, &operation, &trans_mode, &trans_stop, &speed_mode, &pushpull_mode, &query_mode, &timing, &trans_num, &trans_auxlen,data_buffer) ) { + if ( sscanf(buf, "%d %x %d %d %d %d %d %d %d %d %d %d %1023s", &bus_id, &address, &operation, &trans_mode, &trans_stop, &speed_mode, &pushpull_mode, &query_mode, &timing, &trans_num, &trans_auxlen, &data_len, data_buffer) ) { if((address != 0)&&(operation<=2)){ - length = strlen(data_buffer); + /* data_len is transfer bytes, offset address + write data */ + length = 2 * data_len; if (operation == 0){ ext_flag |= I2C_WR_FLAG; number = (trans_auxlen << 8 ) | (length >> 1); @@ -219,8 +220,6 @@ static ssize_t set_config(struct device *dev, struct device_attribute *attr, con printk("invalid operation\n"); goto err; } - if(dir > 0) - ext_flag |= I2C_DIRECTION_FLAG; if (trans_mode == 0){ //default is fifo @@ -289,7 +288,7 @@ static ssize_t set_config(struct device *dev, struct device_attribute *attr, con } } - get_hexbuffer(data_buffer, vir_addr); + get_hexbuffer(data_buffer, vir_addr, length); printk(KERN_ALERT"bus_id:%d,address:%x,count:%x,ext_flag:0x%x,timing:%d\n", bus_id,address,number,ext_flag,timing); printk(KERN_ALERT"data_buffer:%s\n", data_buffer); @@ -306,24 +305,24 @@ static ssize_t set_config(struct device *dev, struct device_attribute *attr, con if ( operation == 1 ) { hex2string(vir_addr, tmpbuffer, length >> 1); - sprintf(data_buffer, "1 %s", tmpbuffer); + snprintf(data_buffer, sizeof(data_buffer), "1 %s", tmpbuffer); } else if ( operation == 0 ){ hex2string(vir_addr, tmpbuffer, trans_auxlen); - sprintf(data_buffer, "1 %s", tmpbuffer); + snprintf(data_buffer, sizeof(data_buffer), "1 %s", tmpbuffer); } else { - sprintf(data_buffer, "1 %s", "00"); + snprintf(data_buffer, sizeof(data_buffer), "1 %s", "00"); } printk("Actual return Value:%d %p\n",ret, vir_addr); } else if ( ret < 0 ) { if ( ret == -EINVAL) { - sprintf(data_buffer, "0 %s", "Invalid Parameter"); + snprintf(data_buffer, sizeof(data_buffer), "0 %s", "Invalid Parameter"); } else if ( ret == -ETIMEDOUT ) { - sprintf(data_buffer, "0 %s", "Transfer Timeout"); + snprintf(data_buffer, sizeof(data_buffer), "0 %s", "Transfer Timeout"); } else if ( ret == -EREMOTEIO ) { - sprintf(data_buffer, "0 %s", "Ack Error"); + snprintf(data_buffer, sizeof(data_buffer), "0 %s", "Ack Error"); } else { - sprintf(data_buffer, "0 %s", "unknow error"); + snprintf(data_buffer, sizeof(data_buffer), "0 %s", "unknow error"); } printk("Actual return Value:%d %p\n",ret, vir_addr); } diff --git a/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h b/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h index d7200215172..cb97b4bf1b1 100644 --- a/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h +++ b/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h @@ -233,7 +233,8 @@ #define OV9726MIPI_SENSOR_ID 0x9726 #define OV9760MIPI_SENSOR_ID 0x9760 #define A5141MIPI_SENSOR_ID 0x4800 -#define SP0A19_YUV_SENSOR_ID 0xA6 +#define SP0A19_SENSOR_ID 0xA6 +#define SP2509MIPI_SENSOR_ID 0x2509 #define A5142MIPI_SENSOR_ID 0x4800 #define GC0313MIPI_YUV_SENSOR_ID 0xD0 #define IMX219_SENSOR_ID 0x0219//0x0119// @@ -242,7 +243,14 @@ #define OV2680MIPI_SENSOR_ID 0x2680 #define IMX214_SENSOR_ID 0x0214 #define IMX220_SENSOR_ID 0x0220 +#define GC2355_SENSOR_ID 0x2355 +#define GC2355MIPI_SENSOR_ID 0x2355 +#define GC2356MIPI_SENSOR_ID 0x2356 +#define GC2355MIPI_SENSOR_ID_HUAQUAN 0x2355 #define GC2035_SENSOR_ID 0x2035 +#define GC0312MIPI_SENSOR_ID 0xb310 +#define GC0312_SENSOR_ID 0xb310 +#define GC0312_SENSOR_ID_BLX 0xb310 #define GC0329_SENSOR_ID 0xC0 #define GC0330_SENSOR_ID 0xC1 #define S5K4H5YX_2LANE_SENSOR_ID 0x485B @@ -254,7 +262,6 @@ #define T8EV5_SENSOR_ID 0x1011 #define GC2235_SENSOR_ID 0x2235 #define OV8865_SENSOR_ID 0x8865 -#define GC2355MIPI_SENSOR_ID 0x2355 #define HI551_SENSOR_ID 0x0551 #define HI841_SENSOR_ID 0x0841 @@ -268,13 +275,6 @@ #define HI544MIPI_SENSOR_ID 0x0544 #define HI707_SENSOR_ID 0x00b8 #define MN34152_SENSOR_ID 0x01 - -#define GC2355_SENSOR_ID 0x2355 -#define OV2680MIPI_SENSOR_ID 0x2680 -#define HI708_SENSOR_ID 0x96 -#define S5K5E2YA_SENSOR_ID 0x5e20 -#define OV5670_SENSOR_ID 0x5670 - /* CAMERA DRIVER NAME */ #define CAMERA_HW_DEVNAME "kd_camera_hw" @@ -302,8 +302,7 @@ #define SENSOR_DRVNAME_OV5647_RAW "ov5647" #define SENSOR_DRVNAME_OV5648_MIPI_RAW "ov5648mipi" -#define SENSOR_DRVNAME_OV5670_MIPI_RAW "ov5670mipiraw" -#define SENSOR_DRVNAME_OV56702ND_MIPI_RAW "ov56702ndmipiraw" +#define SENSOR_DRVNAME_OV5670_MIPI_RAW "ov5670mipi" #define SENSOR_DRVNAME_OV5693_MIPI_RAW "ov5693mipi" #define SENSOR_DRVNAME_OV5642_MIPI_YUV "ov5642mipiyuv" #define SENSOR_DRVNAME_OV5642_MIPI_RGB "ov5642mipirgb" @@ -349,7 +348,8 @@ #define SENSOR_DRVNAME_OV9740_MIPI_YUV "ov9740mipiyuv" #define SENSOR_DRVNAME_S5K3H2YX_MIPI_RAW "s5k3h2yxmipiraw" #define SENSOR_DRVNAME_S5K2P8_MIPI_RAW "s5k2p8mipiraw" -#define SENSOR_DRVNAME_SP0A19_YUV "sp0a19yuv" +#define SENSOR_DRVNAME_SP0A19_RAW "sp0a19raw" +#define SENSOR_DRVNAME_SP2509_MIPI_RAW "sp2509mipiraw" #define SENSOR_DRVNAME_IMX219_MIPI_RAW "imx219mipiraw" #define SENSOR_DRVNAME_IMX135_MIPI_RAW "imx135mipiraw" #define SENSOR_DRVNAME_IMX214_MIPI_RAW "imx214mipiraw" @@ -361,8 +361,13 @@ #define SENSOR_DRVNAME_S5K4H5YX_2LANE_MIPI_RAW "s5k4h5yx2lanemipiraw" #define SENSOR_DRVNAME_S5K5E2YA_MIPI_RAW "s5k5e2yamipiraw" #define SENSOR_DRVNAME_GC2235_RAW "gc2235_raw" -#define SENSOR_DRVNAME_OV8865_MIPI_RAW "ov8865mipiraw" +#define SENSOR_DRVNAME_GC2355_RAW "gc2355raw" #define SENSOR_DRVNAME_GC2355_MIPI_RAW "gc2355mipiraw" +#define SENSOR_DRVNAME_GC0312_RAW "gc0312mipiraw" + +#define SENSOR_DRVNAME_GC2356_MIPI_RAW "gc2355mipiraw_qunhui" +#define SENSOR_DRVNAME_GC2355_MIPI_RAW_HUAQUAN "gc2355mipiraw_huaquan" +#define SENSOR_DRVNAME_OV8865_MIPI_RAW "ov8865mipiraw" #define SENSOR_DRVNAME_HI551_MIPI_RAW "hi551mipiraw" #define SENSOR_DRVNAME_HI841_MIPI_RAW "hi841mipiraw" @@ -370,6 +375,8 @@ #define SENSOR_DRVNAME_OV8858_MIPI_RAW "ov8858mipiraw" #define SENSOR_DRVNAME_OV13850_MIPI_RAW "ov13850mipiraw" #define SENSOR_DRVNAME_T8EV5_YUV "t8ev5_yuv" +#define SENSOR_DRVNAME_GC0312_YUV "gc0312yuv" +#define SENSOR_DRVNAME_GC0312_YUV_BLX "gc0312yuvblx" #define SENSOR_DRVNAME_GC0329_YUV "gc0329yuv" #define SENSOR_DRVNAME_OV5645_MIPI_YUV "ov5645_mipi_yuv" #define SENSOR_DRVNAME_IMX132_MIPI_RAW "imx132mipiraw" @@ -378,11 +385,6 @@ #define SENSOR_DRVNAME_HI544_MIPI_RAW "hi544mipiraw" #define SENSOR_DRVNAME_HI707_YUV "hi707yuv" #define SENSOR_DRVNAME_MN34152_MIPI_RAW "mn34152mipiraw" - -#define SENSOR_DRVNAME_GC2355_RAW "gc2355raw" -#define SENSOR_DRVNAME_OV2680_RAW "ov2680_raw" -#define SENSOR_DRVNAME_HI708_YUV "hi708_yuv" -#define SENSOR_DRVNAME_S5K5E2YA_MIPI_RAW "s5k5e2yamipiraw" /******************************************************************************* * ********************************************************************************/ diff --git a/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor_define.h b/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor_define.h index dce92ccdd4c..5fb659a345d 100644 --- a/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor_define.h +++ b/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor_define.h @@ -163,6 +163,7 @@ typedef enum { SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE, SENSOR_FEATURE_GET_TEMPERATURE_VALUE, SENSOR_FEATURE_GET_SENSOR_CURRENT_TEMPERATURE, + SENSOR_FEATURE_GET_SENSOR_CURRENT_MID, //cuirui add for MID SENSOR_FEATURE_GET_AE_FLASHLIGHT_INFO, SENSOR_FEATURE_GET_TRIGGER_FLASHLIGHT_INFO, /* Trigger flashlight or not */ SENSOR_FEATURE_SET_YUV_3A_CMD, diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/Makefile b/drivers/misc/mediatek/imgsensor/src/mt8127/Makefile old mode 100755 new mode 100644 index 406194b7f38..d89d028d434 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/Makefile +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/Makefile @@ -1,14 +1,63 @@ -# -# Makefile for misc devices that really don't fit anywhere else. -# include $(srctree)/drivers/misc/mediatek/Makefile.custom obj-y += kd_sensorlist.o - -ifeq ($(wildcard $(srctree)/arch/arm/mach-$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT)/imgsensor),) - -custom_kernel_imgsensor := $(addsuffix /, $(shell echo $(CONFIG_CUSTOM_KERNEL_IMGSENSOR))) - -obj-y += $(custom_kernel_imgsensor) - +ifeq ($(ARCH_MTK_PROJECT), tb27A1910) +obj-y += gc0312yuv_Sensor.o +else + ifeq ($(ARCH_MTK_PROJECT), ford) + ifeq ($(CONFIG_AUSTIN_PROJECT), y) + obj-y += sp2509mipiraw_Sensor.o + obj-y += gc2355mipiraw_huaquan_Sensor.o + obj-y += sp0a19raw_Sensor.o + #obj-y += gc0312yuv_blx_Sensor.o + obj-y += gc0312mipi_Sensor.o + else + obj-y += gc0312yuv_Sensor.o + obj-y += hi704yuv_Sensor.o + endif + else + ifeq ($(ARCH_MTK_PROJECT), tb27A1912) + obj-y += gc0312yuv_Sensor.o + else + ifeq ($(ARCH_MTK_PROJECT), ford_proto) + obj-y += gc0312yuv_Sensor.o + else + obj-y += ov2659yuv_Sensor.o + endif + endif endif +endif + +# $(CONFIG_MTK_PLATFORM) +$(warning "xilog project is:$(ARCH_MTK_PROJECT)") +ifeq ($(ARCH_MTK_PROJECT), tb8127p4) + obj-y += ov5647_Sensor_p4.o +else + ifeq ($(ARCH_MTK_PROJECT), tb8127p4_25) + obj-y += ov5647_Sensor_p4_25.o + else + ifeq ($(ARCH_MTK_PROJECT), tb8127p1_25) + obj-y += ov5647_Sensor_p1_25.o + else + ifeq ($(ARCH_MTK_PROJECT), tb27A1910) + obj-y += gc2355mipiraw_Sensor.o + else + ifeq ($(ARCH_MTK_PROJECT), ford) + obj-y += gc2355mipiraw_Sensor.o + obj-y += gc2356mipiraw_Sensor.o + else + ifeq ($(ARCH_MTK_PROJECT), tb27A1912) + obj-y += gc2355mipiraw_Sensor.o + else + ifeq ($(ARCH_MTK_PROJECT), ford_proto) + obj-y += gc2355mipiraw_Sensor.o + else + obj-y += ov5647_Sensor.o + endif + endif + endif + endif + endif +endif +endif + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_CameraCustomized.h new file mode 100644 index 00000000000..5c9637f3740 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_CameraCustomized.h @@ -0,0 +1,70 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#ifndef __CAMERA_CUSTOMIZED_H +#define __CAMERA_CUSTOMIZED_H + +// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 +#define MAIN_SENSOR_ORIENTATION_ANGLE 90 // 90 +#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist + + +// First, we think you hold the cell phone vertical. +// Second, we suppose the direction of upward is 0 +// Third, it is 90, 180, 270 in clockwise +// here we define the main sensor and sub sensor angles to deal with the jpeg orientation +#define MAIN_SENSOR_TO_PHONE_ANGLE 0 +#define SUB_SENSOR_TO_PHONE_ANGLE 0 + + +#define CAM_SIZE_QVGA_WIDTH 320 +#define CAM_SIZE_QVGA_HEIGHT 240 +#define CAM_SIZE_VGA_WIDTH 640 +#define CAM_SIZE_VGA_HEIGHT 480 +#define CAM_SIZE_05M_WIDTH 800 +#define CAM_SIZE_05M_HEIGHT 600 +#define CAM_SIZE_1M_WIDTH 1280 +#define CAM_SIZE_1M_HEIGHT 960 +#define CAM_SIZE_2M_WIDTH 1600 +#define CAM_SIZE_2M_HEIGHT 1200 +#define CAM_SIZE_3M_WIDTH 2048 +#define CAM_SIZE_3M_HEIGHT 1536 +#define CAM_SIZE_5M_WIDTH 2592 +#define CAM_SIZE_5M_HEIGHT 1944 + +// for main sensor +#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 +#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 +#define MAIN_NUM_OF_STILL_RESOLUTION 7 +#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} +#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} +#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ + {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ + // {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ + // {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ + // {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ + // {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ + // {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} + +// if sub sensor does not exist, set all the parameters as 0 +#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 +#define SUB_NUM_OF_VIDEO_RESOLUTION 0 +#define SUB_NUM_OF_STILL_RESOLUTION 0 +#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} +#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} +#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} + +//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) +//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) +//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) + +#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Camera_Sensor_para.h similarity index 56% rename from drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Camera_Sensor_para.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Camera_Sensor_para.h index 20f6e8378c6..c9c64c16ab8 100644 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Camera_Sensor_para.h +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Camera_Sensor_para.h @@ -1,49 +1,14 @@ -/***************************************************************************** - * - * Filename: - * --------- - * camera_sensor_para.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of Sensor tuning parameters that should be generated by CCT - * - * - * Author: - * ------- - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * Mar 4 2010 mtk70508 - * [DUMA00154792] Sensor driver - * - * - * Feb 24 2010 mtk01118 - * [DUMA00025869] [Camera][YUV I/F & Query feature] check in camera code - * - * - * Apr 7 2009 mtk02204 - * [DUMA00004012] [Camera] Restructure and rename camera related custom folders and folder name of came - * - * - * Feb 24 2009 mtk02204 - * [DUMA00001084] First Check in of MT6516 multimedia drivers - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + /* SENSOR FULL SIZE */ #ifndef __CAMERA_SENSOR_PARA_H #define __CAMERA_SENSOR_PARA_H diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Sensor.c new file mode 100644 index 00000000000..87a0a93e61f --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Sensor.c @@ -0,0 +1,1314 @@ +/***************************************************************************** + * + * Filename: + * --------- + * GC0312mipi_Sensor.c + * + * Project: + * -------- + * ALPS + * + * Description: + * ------------ + * Source code of Sensor driver + * + * + *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! + *============================================================================ + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +//#include +//#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" + +#include "gc0312mipi_Sensor.h" + +/****************************Modify Following Strings for Debug****************************/ +#define PFX "GC0312_camera_sensor" +//#define LOG_1 LOG_INF("GC0312,MIPI 1LANE\n") +//#define LOG_2 LOG_INF("preview 1280*960@30fps,864Mbps/lane; video 1280*960@30fps,864Mbps/lane; capture 5M@30fps,864Mbps/lane\n") +//#define LOG_INF(format, args...) xlog_printk(ANDROID_LOG_INFO , PFX, "[%s] " format, __FUNCTION__, ##args) +#define LOG_INF(format, args...) printk(PFX "[%s] " format, __FUNCTION__, ##args) +#define Sleep(ms) mdelay(ms) + +static kal_uint16 moduleid = 0x00; +static DEFINE_SPINLOCK(imgsensor_drv_lock); + +static imgsensor_info_struct imgsensor_info = { + .sensor_id = GC0312MIPI_SENSOR_ID, //record sensor id defined in Kd_imgsensor.h + + .checksum_value = 0xf7375923, //checksum value for Camera Auto Test + + .pre = { + .pclk = 15000000, //record different mode's pclk + .linelength = 974, //record different mode's linelength + .framelength = 504, //record different mode's framelength + .startx = 0, //record different mode's startx of grabwindow + .starty = 0, //record different mode's starty of grabwindow + .grabwindow_width = 640, //record different mode's width of grabwindow + .grabwindow_height = 480, //record different mode's height of grabwindow + /* following for MIPIDataLowPwr2HighSpeedSettleDelayCount by different scenario */ + .mipi_data_lp2hs_settle_dc = 85,//unit , ns + /* following for GetDefaultFramerateByScenario() */ + .max_framerate = 300, + }, + .cap = { + .pclk = 15000000, + .linelength = 974, + .framelength = 504, + .startx = 0, + .starty = 0, + .grabwindow_width = 640, + .grabwindow_height = 480, + .mipi_data_lp2hs_settle_dc = 85, + .max_framerate = 300, + }, + .cap1 = { //capture for PIP 24fps relative information, capture1 mode must use same framelength, linelength with Capture mode for shutter calculate + .pclk = 15000000, + .linelength = 974, + .framelength = 504, + .startx = 0, + .starty = 0, + .grabwindow_width = 640, + .grabwindow_height = 480, + .mipi_data_lp2hs_settle_dc = 85, + .max_framerate = 300, + }, + .normal_video = { + .pclk = 15000000, + .linelength = 974, + .framelength = 504, + .startx = 0, + .starty = 0, + .grabwindow_width = 640, + .grabwindow_height = 480, + .mipi_data_lp2hs_settle_dc = 85, + .max_framerate = 300, + }, + .hs_video = { + .pclk = 15000000, + .linelength = 974, + .framelength = 504, + .startx = 0, + .starty = 0, + .grabwindow_width = 640, + .grabwindow_height = 480, + .mipi_data_lp2hs_settle_dc = 85, + .max_framerate = 300, + }, + .slim_video = { + .pclk = 15000000, + .linelength = 974, + .framelength = 504, + .startx = 0, + .starty = 0, + .grabwindow_width = 640, + .grabwindow_height = 480, + .mipi_data_lp2hs_settle_dc = 85, + .max_framerate = 300, + }, + .margin = 0, //sensor framelength & shutter margin + .min_shutter = 1, //min shutter + .max_frame_length = 0xfff,//max framelength by sensor register's limitation + .ae_shut_delay_frame = 0, //shutter delay frame for AE cycle, 2 frame with ispGain_delay-shut_delay=2-0=2 + .ae_sensor_gain_delay_frame = 0,//sensor gain delay frame for AE cycle,2 frame with ispGain_delay-sensor_gain_delay=2-0=2 + .ae_ispGain_delay_frame = 2,//isp gain delay frame for AE cycle + .ihdr_support = 0, //1, support; 0,not support + .ihdr_le_firstline = 0, //1,le first ; 0, se first + .sensor_mode_num = 3, //support sensor mode num + + .cap_delay_frame = 2, //enter capture delay frame num + .pre_delay_frame = 2, //enter preview delay frame num + .video_delay_frame = 2, //enter video delay frame num + .hs_video_delay_frame = 2, //enter high speed video delay frame num + .slim_video_delay_frame = 2,//enter slim video delay frame num + + .isp_driving_current = ISP_DRIVING_6MA, //mclk driving current + .sensor_interface_type = SENSOR_INTERFACE_TYPE_PARALLEL,//sensor_interface_type + //.mipi_sensor_type = MIPI_OPHY_NCSI2, //0,MIPI_OPHY_NCSI2; 1,MIPI_OPHY_CSI2 + //.mipi_settle_delay_mode = MIPI_SETTLEDELAY_AUTO,//0,MIPI_SETTLEDELAY_AUTO; 1,MIPI_SETTLEDELAY_MANNUAL + .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_R,//sensor output first pixel color + .mclk = 24,//mclk value, suggest 24 or 26 for 24Mhz or 26Mhz + //.mipi_lane_num = SENSOR_MIPI_1_LANE,//mipi lane num + .i2c_addr_table = {0x42, 0xff},//record sensor support all write id addr, only supprt 4must end with 0xff +}; + + +static imgsensor_struct imgsensor = { + .mirror = IMAGE_NORMAL, //mirrorflip information + .sensor_mode = IMGSENSOR_MODE_INIT, //IMGSENSOR_MODE enum value,record current sensor mode,such as: INIT, Preview, Capture, Video,High Speed Video, Slim Video + .shutter = 0x3ED, //current shutter + .gain = 0x40, //current gain + .dummy_pixel = 0, //current dummypixel + .dummy_line = 0, //current dummyline + .current_fps = 300, //full size current fps : 24fps for PIP, 30fps for Normal or ZSD + .autoflicker_en = KAL_FALSE, //auto flicker enable: KAL_FALSE for disable auto flicker, KAL_TRUE for enable auto flicker + .test_pattern = KAL_FALSE, //test pattern mode or not. KAL_FALSE for in test pattern mode, KAL_TRUE for normal output + .current_scenario_id = MSDK_SCENARIO_ID_CAMERA_PREVIEW,//current scenario id + .ihdr_en = 0, //sensor need support LE, SE with HDR feature + .i2c_write_id = 0x42,//record current sensor's i2c write id +}; + + +/* Sensor output window information */ +static SENSOR_WINSIZE_INFO_STRUCT imgsensor_winsize_info[5] = +{ + { 640, 480, 0, 0, 640, 480, 640, 480, 0000, 0000, 640, 480, 0, 0, 640, 480}, // Preview + { 640, 480, 0, 0, 640, 480, 640, 480, 0000, 0000, 640, 480, 0, 0, 640, 480}, // capture + { 640, 480, 0, 0, 640, 480, 640, 480, 0000, 0000, 640, 480, 0, 0, 640, 480}, // video + { 640, 480, 0, 0, 640, 480, 640, 480, 0000, 0000, 640, 480, 0, 0, 640, 480}, //hight speed video + { 640, 480, 0, 0, 640, 480, 640, 480, 0000, 0000, 640, 480, 0, 0, 640, 480} // slim video +}; + + +static kal_uint16 read_cmos_sensor(kal_uint32 addr) +{ + kal_uint16 get_byte=0; + + char pu_send_cmd[1] = {(char)(addr & 0xFF) }; + iReadRegI2C(pu_send_cmd, 1, (u8*)&get_byte, 1, imgsensor.i2c_write_id); + + return get_byte; + +} + +static void write_cmos_sensor(kal_uint32 addr, kal_uint32 para) +{ +#if 1 + char pu_send_cmd[2] = {(char)(addr & 0xFF), (char)(para & 0xFF)}; + iWriteRegI2C(pu_send_cmd, 2, imgsensor.i2c_write_id); +#else + iWriteReg((u16)addr, (u32)para, 2, imgsensor.i2c_write_id); +#endif + +} + +static void set_dummy(void) +{ + +// end +} /* set_dummy */ + +static kal_uint32 return_sensor_id(void) +{ + return ((read_cmos_sensor(0xf0) << 8) | read_cmos_sensor(0xf1)); +} + +static void set_max_framerate(UINT16 framerate,kal_bool min_framelength_en) +{ + //kal_int16 dummy_line; + kal_uint32 frame_length = imgsensor.frame_length; + //unsigned long flags; + + frame_length = imgsensor.pclk / framerate * 10 / imgsensor.line_length; + spin_lock(&imgsensor_drv_lock); + imgsensor.frame_length = (frame_length > imgsensor.min_frame_length) ? frame_length : imgsensor.min_frame_length; + imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; + + if (imgsensor.frame_length > imgsensor_info.max_frame_length) + { + imgsensor.frame_length = imgsensor_info.max_frame_length; + imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; + } + if (min_framelength_en) + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + set_dummy(); +} /* set_max_framerate */ + + + +/************************************************************************* +* FUNCTION +* set_shutter +* +* DESCRIPTION +* This function set e-shutter of sensor to change exposure time. +* +* PARAMETERS +* iShutter : exposured lines +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static void set_shutter(kal_uint16 shutter) +{ + unsigned long flags; + //kal_uint16 realtime_fps = 0; + //kal_uint32 frame_length = 0; + spin_lock_irqsave(&imgsensor_drv_lock, flags); + imgsensor.shutter = shutter; + spin_unlock_irqrestore(&imgsensor_drv_lock, flags); + + // if shutter bigger than frame_length, should extend frame length first + spin_lock(&imgsensor_drv_lock); + if (shutter > imgsensor.min_frame_length - imgsensor_info.margin) + imgsensor.frame_length = shutter + imgsensor_info.margin; + else + imgsensor.frame_length = imgsensor.min_frame_length; + if (imgsensor.frame_length > imgsensor_info.max_frame_length) + imgsensor.frame_length = imgsensor_info.max_frame_length; + spin_unlock(&imgsensor_drv_lock); + shutter = (shutter < imgsensor_info.min_shutter) ? imgsensor_info.min_shutter : shutter; + shutter = (shutter > (imgsensor_info.max_frame_length - imgsensor_info.margin)) ? (imgsensor_info.max_frame_length - imgsensor_info.margin) : shutter; + + // Update Shutter + if(shutter > 4095) shutter = 4095; + if(shutter < 6) shutter = 6; + + //Update Shutter + write_cmos_sensor(0x04, shutter & 0xFF); + write_cmos_sensor(0x03, (shutter>>8) & 0x0F); + + LOG_INF("Exit! shutter =%d, framelength =%d\n", shutter,imgsensor.frame_length); + +} /* set_shutter */ + +/* +static kal_uint16 gain2reg(const kal_uint16 gain) +{ + kal_uint16 reg_gain = 0x0000; + + reg_gain = ((gain / BASEGAIN) << 4) + ((gain % BASEGAIN) * 16 / BASEGAIN); + reg_gain = reg_gain & 0xFFFF; + return (kal_uint16)reg_gain; +} +*/ + +/************************************************************************* +* FUNCTION +* set_gain +* +* DESCRIPTION +* This function is to set global gain to sensor. +* +* PARAMETERS +* iGain : sensor global gain(base: 0x40) +* +* RETURNS +* the actually gain set to sensor. +* +* GLOBALS AFFECTED +* +*************************************************************************/ + +#define ANALOG_GAIN_1 64 +#define ANALOG_GAIN_2 87 +#define ANALOG_GAIN_3 125 +#define ANALOG_GAIN_4 167 +#define ANALOG_GAIN_5 258 + +static kal_uint16 set_gain(kal_uint16 gain) +{ + kal_uint16 iReg,temp; + + iReg = gain; + + if(iReg < 0x40) + iReg = 0x40; + if((ANALOG_GAIN_1<= iReg)&&(iReg < ANALOG_GAIN_2)) + { + //analog gain + write_cmos_sensor(0x48, 0x00); + temp = iReg / 2; + write_cmos_sensor(0x71, temp); + LOG_INF("GC0312MIPI analogic gain 1x, GC0312MIPI add pregain = %d\n",temp); + } + else if((ANALOG_GAIN_2<= iReg)&&(iReg < ANALOG_GAIN_3)) + { + //analog gain + write_cmos_sensor(0x48, 0x01);// + temp = 32 * iReg / ANALOG_GAIN_2; + write_cmos_sensor(0x71, temp); + LOG_INF("GC0312MIPI analogic gain 1.42x , GC0312MIPI add pregain = %d\n",temp); + } + else if((ANALOG_GAIN_3<= iReg)&&(iReg < ANALOG_GAIN_4)) + { + //analog gain + write_cmos_sensor(0x48, 0x02);// + temp = 32 * iReg / ANALOG_GAIN_3; + write_cmos_sensor(0x71, temp); + LOG_INF("GC0312MIPI analogic gain 1.97x , GC0312MIPI add pregain = %d\n",temp); + } + else if(ANALOG_GAIN_4<= iReg) + { + //analog gain + write_cmos_sensor(0x48, 0x03);// + temp = 32 * iReg/ANALOG_GAIN_4; + write_cmos_sensor(0x71, temp); + LOG_INF("GC0312MIPI analogic gain 2.78x , GC0312MIPI add pregain = %d\n",temp); + } + + return gain; + +} /* set_gain */ + +static void ihdr_write_shutter_gain(kal_uint16 le, kal_uint16 se, kal_uint16 gain) +{ + LOG_INF("le:0x%x, se:0x%x, gain:0x%x\n",le,se,gain); + +} + + +/* +static void set_mirror_flip(kal_uint8 image_mirror) +{ + LOG_INF("image_mirror = %d\n", image_mirror); + +} +*/ +/************************************************************************* +* FUNCTION +* night_mode +* +* DESCRIPTION +* This function night mode of sensor. +* +* PARAMETERS +* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static void night_mode(kal_bool enable) +{ +/*No Need to implement this function*/ +} /* night_mode */ + +static void sensor_init(void) +{ + write_cmos_sensor(0xfe,0xf0); + write_cmos_sensor(0xfe,0xf0); + write_cmos_sensor(0xfc,0x0e); + write_cmos_sensor(0xfc,0x0e); + write_cmos_sensor(0xf2,0x07); + write_cmos_sensor(0xf3,0x00); + write_cmos_sensor(0xf7,0x1b);//1f + write_cmos_sensor(0xf8,0x04); + write_cmos_sensor(0xf9,0x0e); + write_cmos_sensor(0xfa,0x11); + + ///////////////////////////////////////////////// + ///////////////// CISCTL reg ///////////////// + ///////////////////////////////////////////////// + write_cmos_sensor(0x00,0x2f); + write_cmos_sensor(0x01,0x0f);//06 + write_cmos_sensor(0x02,0x04); + write_cmos_sensor(0x4f,0x00);//AEC 0FF + write_cmos_sensor(0xfe,0x01); + write_cmos_sensor(0x0a,0x45); + write_cmos_sensor(0xfe,0x00); + write_cmos_sensor(0x48,0x00); + write_cmos_sensor(0x03,0x02); + write_cmos_sensor(0x04,0x68); + write_cmos_sensor(0x05,0x01); + write_cmos_sensor(0x06,0x18); + write_cmos_sensor(0x07,0x00); + write_cmos_sensor(0x08,0x10); + write_cmos_sensor(0x09,0x00); + write_cmos_sensor(0x0a,0x00); + write_cmos_sensor(0x0b,0x00); + write_cmos_sensor(0x0c,0x00);//06 + write_cmos_sensor(0x0d,0x01);//502 + write_cmos_sensor(0x0e,0xe8); + write_cmos_sensor(0x0f,0x02);//662 + write_cmos_sensor(0x10,0x88); + write_cmos_sensor(0x16,0x00); //add + write_cmos_sensor(0x17,0x14); + write_cmos_sensor(0x18,0x1a); + write_cmos_sensor(0x19,0x14);//0x14 AD pipe + write_cmos_sensor(0x1b,0x48); + write_cmos_sensor(0x1c,0x6c); + write_cmos_sensor(0x1e,0x6b); + write_cmos_sensor(0x1f,0x28); + write_cmos_sensor(0x20,0x8b); + write_cmos_sensor(0x21,0x49); + write_cmos_sensor(0x22,0xd0); + write_cmos_sensor(0x23,0x04); + write_cmos_sensor(0x24,0x16); + write_cmos_sensor(0x34,0x20); + + ///////////////////////////////////////////////// + //////////////////// BLK //////////////////// + ///////////////////////////////////////////////// + write_cmos_sensor(0x26, 0x23); + write_cmos_sensor(0x28, 0xff); + write_cmos_sensor(0x29, 0x00); + write_cmos_sensor(0x32, 0x04); /* 00 travis 20140929 */ + write_cmos_sensor(0x33, 0x10); + write_cmos_sensor(0x37, 0x20); + write_cmos_sensor(0x38, 0x10); + write_cmos_sensor(0x47, 0x80); + write_cmos_sensor(0x4e, 0x66); + write_cmos_sensor(0xa8, 0x02); + write_cmos_sensor(0xa9, 0x80); + + ///////////////////////////////////////////////// + ////////////////// ISP reg /////////////////// + ///////////////////////////////////////////////// + write_cmos_sensor(0x40,0x02); + write_cmos_sensor(0x41,0x01); + write_cmos_sensor(0x42,0x00); + write_cmos_sensor(0x44,0x17); + write_cmos_sensor(0x45,0x00); + write_cmos_sensor(0x46,0x32); //sync 02 + + write_cmos_sensor(0x49,0x03); + write_cmos_sensor(0x4c,0xa0);//2zhen sheng xiao + write_cmos_sensor(0x4d,0x01); + + write_cmos_sensor(0x50,0x01); + write_cmos_sensor(0x54,0x04);// + write_cmos_sensor(0x55,0x01);// + write_cmos_sensor(0x56,0xe0); + write_cmos_sensor(0x57,0x02);// + write_cmos_sensor(0x58,0x80); + + ///////////////////////////////////////////////// + /////////////////// GAIN //////////////////// + ///////////////////////////////////////////////// + write_cmos_sensor(0x70,0x70);// global gain 1.2*1.36 + write_cmos_sensor(0x71,0x20);// pregain gain + write_cmos_sensor(0x72,0x40);// post gain + write_cmos_sensor(0x5a,0x84); + write_cmos_sensor(0x5b,0xc9); + write_cmos_sensor(0x5c,0xed); + write_cmos_sensor(0x77,0x40);// R gain + write_cmos_sensor(0x78,0x40);// G gain + + write_cmos_sensor(0x79,0x40);// B gain + + write_cmos_sensor(0xfe,0x01); + + write_cmos_sensor(0x3e,0x40); + write_cmos_sensor(0x3f,0x57); + write_cmos_sensor(0x40,0x7d); + write_cmos_sensor(0x44,0x02); + + ////////////////////////////////////////////// + //////////////// DD //////////////////// + ////////////////////////////////////////////// + write_cmos_sensor(0xfe,0x00); + write_cmos_sensor(0x80,0xc1); + write_cmos_sensor(0x84,0x10); + write_cmos_sensor(0x86,0x50); + write_cmos_sensor(0x87,0x30); + write_cmos_sensor(0x88,0x15); + write_cmos_sensor(0x89,0xf0); + ////////////////////////////////////////////// + write_cmos_sensor(0xdd,0x00); + + ////////////////////////////////////////////// + ////////////////dark sun//////////////////// + ////////////////////////////////////////////// + write_cmos_sensor(0xfe,0x01); + write_cmos_sensor(0x45,0xf7); + write_cmos_sensor(0x46,0xff);//sun vaule th + write_cmos_sensor(0x47,0x15);//sun vaule th + write_cmos_sensor(0x48,0x03);//sun mode + write_cmos_sensor(0x4f,0x60);//sun_clamp + + ///////////////////////////////////////////////// + ///////////////////// DVP //////////////////// + ///////////////////////////////////////////////// + write_cmos_sensor(0xfe, 0x03); + write_cmos_sensor(0x01, 0x00); + write_cmos_sensor(0x02, 0x00); + write_cmos_sensor(0x10, 0x00); + write_cmos_sensor(0x15, 0x00); + write_cmos_sensor(0xfe, 0x00); + write_cmos_sensor(0xf3, 0xff); /* output_enable */ +} /* sensor_init */ + + +static void preview_setting(void) +{ + LOG_INF("E!\n"); + //MIPI// + write_cmos_sensor(0xf3, 0xff); /* output_enable */ +} /* preview_setting */ + +static void capture_setting(kal_uint16 currefps) +{ + LOG_INF("E! currefps:%d\n",currefps); + write_cmos_sensor(0xf3, 0xff); /* output_enable */ +} + +static void normal_video_setting(kal_uint16 currefps) +{ + LOG_INF("E! currefps:%d\n",currefps); + write_cmos_sensor(0xf3, 0xff); /* output_enable */ +} + +static void hs_video_setting(void) +{ + LOG_INF("E\n"); + + write_cmos_sensor(0xf3, 0xff); /* output_enable */ +} + +static void slim_video_setting(void) +{ + LOG_INF("E\n"); + write_cmos_sensor(0xf3, 0xff); /* output_enable */ +} + +static kal_uint32 set_test_pattern_mode(kal_bool enable) +{ + LOG_INF("enable: %d\n", enable); + + if (enable) + { + write_cmos_sensor(0xfe, 0x00); + write_cmos_sensor(0x4c, 0x21); + } + else + { + write_cmos_sensor(0xfe, 0x00); + write_cmos_sensor(0x4c, 0x20); + } + spin_lock(&imgsensor_drv_lock); + imgsensor.test_pattern = enable; + spin_unlock(&imgsensor_drv_lock); + return ERROR_NONE; +} + +UINT32 GC0312_BLXGetModuleID() +{ + printk("GC0312_BLXGetModuleID\n"); + return moduleid; +} + +/************************************************************************* +* FUNCTION +* get_imgsensor_id +* +* DESCRIPTION +* This function get the sensor ID +* +* PARAMETERS +* *sensorID : return the sensor ID +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 get_imgsensor_id(UINT32 *sensor_id) +{ + kal_uint8 i = 0; + kal_uint8 retry = 2; + + while (imgsensor_info.i2c_addr_table[i] != 0xff) { + spin_lock(&imgsensor_drv_lock); + imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; + spin_unlock(&imgsensor_drv_lock); + do { + *sensor_id = return_sensor_id(); + if (*sensor_id == imgsensor_info.sensor_id) { + moduleid = 0x04; + LOG_INF("GC0312 get_imgsensor_id i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id,*sensor_id); + return ERROR_NONE; + } + LOG_INF("GC0312 get_imgsensor_id Read sensor id fail, write id: 0x%x, id: 0x%x\n", imgsensor.i2c_write_id,*sensor_id); + retry--; + } while(retry > 0); + i++; + retry = 2; + } + if (*sensor_id != imgsensor_info.sensor_id) { + // if Sensor ID is not correct, Must set *sensor_id to 0xFFFFFFFF + *sensor_id = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + return ERROR_NONE; +} + + +/************************************************************************* +* FUNCTION +* open +* +* DESCRIPTION +* This function initialize the registers of CMOS sensor +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 open(void) +{ + kal_uint8 i = 0; + kal_uint8 retry = 2; + kal_uint32 sensor_id = 0; + //LOG_1; + + while (imgsensor_info.i2c_addr_table[i] != 0xff) + { + spin_lock(&imgsensor_drv_lock); + imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; + spin_unlock(&imgsensor_drv_lock); + do { + sensor_id = return_sensor_id(); + if (sensor_id == imgsensor_info.sensor_id) + { + LOG_INF("GC0312 open i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id,sensor_id); + break; + } + LOG_INF("GC0312 open Read sensor id fail, write id: 0x%x, id: 0x%x\n", imgsensor.i2c_write_id,sensor_id); + retry--; + } while(retry > 0); + i++; + if (sensor_id == imgsensor_info.sensor_id) + break; + retry = 2; + } + if (imgsensor_info.sensor_id != sensor_id) + return ERROR_SENSOR_CONNECT_FAIL; + + /* initail sequence write in */ + sensor_init(); + + spin_lock(&imgsensor_drv_lock); + + imgsensor.autoflicker_en= KAL_FALSE; + imgsensor.sensor_mode = IMGSENSOR_MODE_INIT; + imgsensor.pclk = imgsensor_info.pre.pclk; + imgsensor.frame_length = imgsensor_info.pre.framelength; + imgsensor.line_length = imgsensor_info.pre.linelength; + imgsensor.min_frame_length = imgsensor_info.pre.framelength; + imgsensor.dummy_pixel = 0; + imgsensor.dummy_line = 0; + imgsensor.ihdr_en = 0; + imgsensor.test_pattern = KAL_FALSE; + imgsensor.current_fps = imgsensor_info.pre.max_framerate; + spin_unlock(&imgsensor_drv_lock); + + return ERROR_NONE; +} /* open */ + + + +/************************************************************************* +* FUNCTION +* close +* +* DESCRIPTION +* +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 close(void) +{ + LOG_INF("E\n"); + + /*No Need to implement this function*/ + + return ERROR_NONE; +} /* close */ + + +/************************************************************************* +* FUNCTION +* preview +* +* DESCRIPTION +* This function start the sensor preview. +* +* PARAMETERS +* *image_window : address pointer of pixel numbers in one period of HSYNC +* *sensor_config_data : address pointer of line numbers in one period of VSYNC +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + LOG_INF("E\n"); + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_PREVIEW; + imgsensor.pclk = imgsensor_info.pre.pclk; + //imgsensor.video_mode = KAL_FALSE; + imgsensor.line_length = imgsensor_info.pre.linelength; + imgsensor.frame_length = imgsensor_info.pre.framelength; + imgsensor.min_frame_length = imgsensor_info.pre.framelength; + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); + preview_setting(); + return ERROR_NONE; +} /* preview */ + +/************************************************************************* +* FUNCTION +* capture +* +* DESCRIPTION +* This function setup the CMOS sensor in capture MY_OUTPUT mode +* +* PARAMETERS +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + LOG_INF("E\n"); + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_CAPTURE; + if (imgsensor.current_fps == imgsensor_info.cap1.max_framerate) {//PIP capture: 24fps for less than 13M, 20fps for 16M,15fps for 20M + imgsensor.pclk = imgsensor_info.cap1.pclk; + imgsensor.line_length = imgsensor_info.cap1.linelength; + imgsensor.frame_length = imgsensor_info.cap1.framelength; + imgsensor.min_frame_length = imgsensor_info.cap1.framelength; + imgsensor.autoflicker_en = KAL_FALSE; + } else { + if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) + LOG_INF("Warning: current_fps %d fps is not support, so use cap's setting: %d fps!\n",imgsensor.current_fps,imgsensor_info.cap.max_framerate/10); + imgsensor.pclk = imgsensor_info.cap.pclk; + imgsensor.line_length = imgsensor_info.cap.linelength; + imgsensor.frame_length = imgsensor_info.cap.framelength; + imgsensor.min_frame_length = imgsensor_info.cap.framelength; + imgsensor.autoflicker_en = KAL_FALSE; + } + spin_unlock(&imgsensor_drv_lock); + capture_setting(imgsensor.current_fps); + return ERROR_NONE; +} /* capture() */ +static kal_uint32 normal_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + LOG_INF("E\n"); + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_VIDEO; + imgsensor.pclk = imgsensor_info.normal_video.pclk; + imgsensor.line_length = imgsensor_info.normal_video.linelength; + imgsensor.frame_length = imgsensor_info.normal_video.framelength; + imgsensor.min_frame_length = imgsensor_info.normal_video.framelength; + //imgsensor.current_fps = 300; + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); + normal_video_setting(imgsensor.current_fps); + return ERROR_NONE; +} /* normal_video */ + +static kal_uint32 hs_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + LOG_INF("E\n"); + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_HIGH_SPEED_VIDEO; + imgsensor.pclk = imgsensor_info.hs_video.pclk; + //imgsensor.video_mode = KAL_TRUE; + imgsensor.line_length = imgsensor_info.hs_video.linelength; + imgsensor.frame_length = imgsensor_info.hs_video.framelength; + imgsensor.min_frame_length = imgsensor_info.hs_video.framelength; + imgsensor.dummy_line = 0; + imgsensor.dummy_pixel = 0; + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); + hs_video_setting(); + return ERROR_NONE; +} /* hs_video */ + +static kal_uint32 slim_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + LOG_INF("E\n"); + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_SLIM_VIDEO; + imgsensor.pclk = imgsensor_info.slim_video.pclk; + imgsensor.line_length = imgsensor_info.slim_video.linelength; + imgsensor.frame_length = imgsensor_info.slim_video.framelength; + imgsensor.min_frame_length = imgsensor_info.slim_video.framelength; + imgsensor.dummy_line = 0; + imgsensor.dummy_pixel = 0; + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); + slim_video_setting(); + return ERROR_NONE; +} /* slim_video */ + + + +static kal_uint32 get_resolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *sensor_resolution) +{ + LOG_INF("E\n"); + sensor_resolution->SensorFullWidth = imgsensor_info.cap.grabwindow_width; + sensor_resolution->SensorFullHeight = imgsensor_info.cap.grabwindow_height; + + sensor_resolution->SensorPreviewWidth = imgsensor_info.pre.grabwindow_width; + sensor_resolution->SensorPreviewHeight = imgsensor_info.pre.grabwindow_height; + + sensor_resolution->SensorVideoWidth = imgsensor_info.normal_video.grabwindow_width; + sensor_resolution->SensorVideoHeight = imgsensor_info.normal_video.grabwindow_height; + + + sensor_resolution->SensorHighSpeedVideoWidth = imgsensor_info.hs_video.grabwindow_width; + sensor_resolution->SensorHighSpeedVideoHeight = imgsensor_info.hs_video.grabwindow_height; + + sensor_resolution->SensorSlimVideoWidth = imgsensor_info.slim_video.grabwindow_width; + sensor_resolution->SensorSlimVideoHeight = imgsensor_info.slim_video.grabwindow_height; + return ERROR_NONE; +} /* get_resolution */ + +static kal_uint32 get_info(MSDK_SCENARIO_ID_ENUM scenario_id, + MSDK_SENSOR_INFO_STRUCT *sensor_info, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + LOG_INF("scenario_id = %d\n", scenario_id); + + + //sensor_info->SensorVideoFrameRate = imgsensor_info.normal_video.max_framerate/10; /* not use */ + //sensor_info->SensorStillCaptureFrameRate= imgsensor_info.cap.max_framerate/10; /* not use */ + //imgsensor_info->SensorWebCamCaptureFrameRate= imgsensor_info.v.max_framerate; /* not use */ + + sensor_info->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; + sensor_info->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; /* not use */ + sensor_info->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; // inverse with datasheet + sensor_info->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + sensor_info->SensorInterruptDelayLines = 4; /* not use */ + sensor_info->SensorResetActiveHigh = FALSE; /* not use */ + sensor_info->SensorResetDelayCount = 5; /* not use */ + + sensor_info->SensroInterfaceType = imgsensor_info.sensor_interface_type; + sensor_info->MIPIsensorType = imgsensor_info.mipi_sensor_type; + sensor_info->SettleDelayMode = imgsensor_info.mipi_settle_delay_mode; + sensor_info->SensorOutputDataFormat = imgsensor_info.sensor_output_dataformat; + + sensor_info->CaptureDelayFrame = imgsensor_info.cap_delay_frame; + sensor_info->PreviewDelayFrame = imgsensor_info.pre_delay_frame; + sensor_info->VideoDelayFrame = imgsensor_info.video_delay_frame; + sensor_info->HighSpeedVideoDelayFrame = imgsensor_info.hs_video_delay_frame; + sensor_info->SlimVideoDelayFrame = imgsensor_info.slim_video_delay_frame; + + sensor_info->SensorMasterClockSwitch = 0; /* not use */ + sensor_info->SensorDrivingCurrent = imgsensor_info.isp_driving_current; + + sensor_info->AEShutDelayFrame = imgsensor_info.ae_shut_delay_frame; /* The frame of setting shutter default 0 for TG int */ + sensor_info->AESensorGainDelayFrame = imgsensor_info.ae_sensor_gain_delay_frame; /* The frame of setting sensor gain */ + sensor_info->AEISPGainDelayFrame = imgsensor_info.ae_ispGain_delay_frame; + sensor_info->IHDR_Support = imgsensor_info.ihdr_support; + sensor_info->IHDR_LE_FirstLine = imgsensor_info.ihdr_le_firstline; + sensor_info->SensorModeNum = imgsensor_info.sensor_mode_num; + + sensor_info->SensorMIPILaneNumber = imgsensor_info.mipi_lane_num; + sensor_info->SensorClockFreq = imgsensor_info.mclk; + sensor_info->SensorClockDividCount = 3; /* not use */ + sensor_info->SensorClockRisingCount = 0; + sensor_info->SensorClockFallingCount = 2; /* not use */ + sensor_info->SensorPixelClockCount = 3; /* not use */ + sensor_info->SensorDataLatchCount = 2; /* not use */ + + sensor_info->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + sensor_info->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + sensor_info->SensorWidthSampling = 0; // 0 is default 1x + sensor_info->SensorHightSampling = 0; // 0 is default 1x + sensor_info->SensorPacketECCOrder = 1; + + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; + sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + sensor_info->SensorGrabStartX = imgsensor_info.cap.startx; + sensor_info->SensorGrabStartY = imgsensor_info.cap.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.cap.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + + sensor_info->SensorGrabStartX = imgsensor_info.normal_video.startx; + sensor_info->SensorGrabStartY = imgsensor_info.normal_video.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.normal_video.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + sensor_info->SensorGrabStartX = imgsensor_info.hs_video.startx; + sensor_info->SensorGrabStartY = imgsensor_info.hs_video.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.hs_video.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + sensor_info->SensorGrabStartX = imgsensor_info.slim_video.startx; + sensor_info->SensorGrabStartY = imgsensor_info.slim_video.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.slim_video.mipi_data_lp2hs_settle_dc; + + break; + default: + sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; + sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; + break; + } + + return ERROR_NONE; +} /* get_info */ + + +static kal_uint32 control(MSDK_SCENARIO_ID_ENUM scenario_id, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + LOG_INF("scenario_id = %d\n", scenario_id); + spin_lock(&imgsensor_drv_lock); + imgsensor.current_scenario_id = scenario_id; + spin_unlock(&imgsensor_drv_lock); + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + preview(image_window, sensor_config_data); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + capture(image_window, sensor_config_data); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + normal_video(image_window, sensor_config_data); + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + hs_video(image_window, sensor_config_data); + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + slim_video(image_window, sensor_config_data); + break; + default: + LOG_INF("Error ScenarioId setting"); + preview(image_window, sensor_config_data); + return ERROR_INVALID_SCENARIO_ID; + } + return ERROR_NONE; +} /* control() */ + + + +static kal_uint32 set_video_mode(UINT16 framerate) +{//This Function not used after ROME + LOG_INF("framerate = %d\n ", framerate); + // SetVideoMode Function should fix framerate + if (framerate == 0) + // Dynamic frame rate + return ERROR_NONE; + spin_lock(&imgsensor_drv_lock); + if ((framerate == 300) && (imgsensor.autoflicker_en == KAL_TRUE)) + imgsensor.current_fps = 296; + else if ((framerate == 150) && (imgsensor.autoflicker_en == KAL_TRUE)) + imgsensor.current_fps = 146; + else + imgsensor.current_fps = framerate; + spin_unlock(&imgsensor_drv_lock); + set_max_framerate(imgsensor.current_fps,1); + + return ERROR_NONE; +} + +static kal_uint32 set_auto_flicker_mode(kal_bool enable, UINT16 framerate) +{ + LOG_INF("enable = %d, framerate = %d \n", enable, framerate); + spin_lock(&imgsensor_drv_lock); + if (enable) //enable auto flicker + imgsensor.autoflicker_en = KAL_TRUE; + else //Cancel Auto flick + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); + return ERROR_NONE; +} + + +static kal_uint32 set_max_framerate_by_scenario(MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 framerate) +{ + kal_uint32 frame_length; + + LOG_INF("scenario_id = %d, framerate = %d\n", scenario_id, framerate); + + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; + imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + set_dummy(); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + if(framerate == 0) + return ERROR_NONE; + frame_length = imgsensor_info.normal_video.pclk / framerate * 10 / imgsensor_info.normal_video.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.normal_video.framelength) ? (frame_length - imgsensor_info.normal_video.framelength) : 0; + imgsensor.frame_length = imgsensor_info.normal_video.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + set_dummy(); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + if (imgsensor.current_fps == imgsensor_info.cap1.max_framerate) { + frame_length = imgsensor_info.cap1.pclk / framerate * 10 / imgsensor_info.cap1.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.cap1.framelength) ? (frame_length - imgsensor_info.cap1.framelength) : 0; + imgsensor.frame_length = imgsensor_info.cap1.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + } else { + if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) + LOG_INF("Warning: current_fps %d fps is not support, so use cap's setting: %d fps!\n",framerate,imgsensor_info.cap.max_framerate/10); + frame_length = imgsensor_info.cap.pclk / framerate * 10 / imgsensor_info.cap.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.cap.framelength) ? (frame_length - imgsensor_info.cap.framelength) : 0; + imgsensor.frame_length = imgsensor_info.cap.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + } + set_dummy(); + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + frame_length = imgsensor_info.hs_video.pclk / framerate * 10 / imgsensor_info.hs_video.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.hs_video.framelength) ? (frame_length - imgsensor_info.hs_video.framelength) : 0; + imgsensor.frame_length = imgsensor_info.hs_video.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + set_dummy(); + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + frame_length = imgsensor_info.slim_video.pclk / framerate * 10 / imgsensor_info.slim_video.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.slim_video.framelength) ? (frame_length - imgsensor_info.slim_video.framelength): 0; + imgsensor.frame_length = imgsensor_info.slim_video.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + set_dummy(); + break; + default: //coding with preview scenario by default + frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; + imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + set_dummy(); + LOG_INF("error scenario_id = %d, we use preview scenario \n", scenario_id); + break; + } + return ERROR_NONE; +} + + +static kal_uint32 get_default_framerate_by_scenario(MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 *framerate) +{ + LOG_INF("scenario_id = %d\n", scenario_id); + + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + *framerate = imgsensor_info.pre.max_framerate; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *framerate = imgsensor_info.normal_video.max_framerate; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + *framerate = imgsensor_info.cap.max_framerate; + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + *framerate = imgsensor_info.hs_video.max_framerate; + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + *framerate = imgsensor_info.slim_video.max_framerate; + break; + default: + break; + } + + return ERROR_NONE; +} + + + +static kal_uint32 feature_control(MSDK_SENSOR_FEATURE_ENUM feature_id, + UINT8 *feature_para,UINT32 *feature_para_len) +{ + UINT16 *feature_return_para_16=(UINT16 *) feature_para; + UINT16 *feature_data_16=(UINT16 *) feature_para; + UINT32 *feature_return_para_32=(UINT32 *) feature_para; + UINT32 *feature_data_32=(UINT32 *) feature_para; + unsigned long long *feature_data=(unsigned long long *) feature_para; + //unsigned long long *feature_return_para=(unsigned long long *) feature_para; + + SENSOR_WINSIZE_INFO_STRUCT *wininfo; + MSDK_SENSOR_REG_INFO_STRUCT *sensor_reg_data=(MSDK_SENSOR_REG_INFO_STRUCT *) feature_para; + + LOG_INF("feature_id = %d\n", feature_id); + switch (feature_id) { + case SENSOR_FEATURE_GET_PERIOD: + *feature_return_para_16++ = imgsensor.line_length; + *feature_return_para_16 = imgsensor.frame_length; + *feature_para_len=4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + *feature_return_para_32 = imgsensor.pclk; + *feature_para_len=4; + break; + case SENSOR_FEATURE_SET_ESHUTTER: + set_shutter(*feature_data); + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + night_mode((BOOL) *feature_data); + break; + case SENSOR_FEATURE_SET_GAIN: + set_gain((UINT16) *feature_data); + break; + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + break; + case SENSOR_FEATURE_SET_REGISTER: + write_cmos_sensor(sensor_reg_data->RegAddr, sensor_reg_data->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + sensor_reg_data->RegData = read_cmos_sensor(sensor_reg_data->RegAddr); + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE + // if EEPROM does not exist in camera module. + *feature_return_para_32=LENS_DRIVER_ID_DO_NOT_CARE; + *feature_para_len=4; + break; + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID://cuirui add for MID + *feature_return_para_32=GC0312_BLXGetModuleID(); + *feature_para_len=4; + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + set_video_mode(*feature_data); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + get_imgsensor_id(feature_return_para_32); + break; + case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: + set_auto_flicker_mode((BOOL)*feature_data_16,*(feature_data_16+1)); + break; + case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: + set_max_framerate_by_scenario((MSDK_SCENARIO_ID_ENUM)*feature_data, *(feature_data+1)); + break; + case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: + get_default_framerate_by_scenario((MSDK_SCENARIO_ID_ENUM)*(feature_data), (MUINT32 *)(uintptr_t)(*(feature_data+1))); + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + set_test_pattern_mode((BOOL)*feature_data); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: //for factory mode auto testing + *feature_return_para_32 = imgsensor_info.checksum_value; + *feature_para_len=4; + break; + case SENSOR_FEATURE_SET_FRAMERATE: + LOG_INF("current fps :%d\n", (UINT32)*feature_data); + spin_lock(&imgsensor_drv_lock); + imgsensor.current_fps = *feature_data; + spin_unlock(&imgsensor_drv_lock); + break; + case SENSOR_FEATURE_SET_HDR: + LOG_INF("ihdr enable :%d\n", (BOOL)*feature_data); + spin_lock(&imgsensor_drv_lock); + imgsensor.ihdr_en = (BOOL)*feature_data; + spin_unlock(&imgsensor_drv_lock); + break; + case SENSOR_FEATURE_GET_CROP_INFO: + LOG_INF("SENSOR_FEATURE_GET_CROP_INFO scenarioId:%d\n", (UINT32)*feature_data); + + wininfo = (SENSOR_WINSIZE_INFO_STRUCT *)(uintptr_t)(*(feature_data+1)); + + switch (*feature_data_32) { + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[1],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[2],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[3],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[4],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + default: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[0],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + } + break; + case SENSOR_FEATURE_SET_IHDR_SHUTTER_GAIN: + LOG_INF("SENSOR_SET_SENSOR_IHDR LE=%d, SE=%d, Gain=%d\n",(UINT16)*feature_data,(UINT16)*(feature_data+1),(UINT16)*(feature_data+2)); + ihdr_write_shutter_gain((UINT16)*feature_data,(UINT16)*(feature_data+1),(UINT16)*(feature_data+2)); + break; + default: + break; + } + + return ERROR_NONE; +} /* feature_control() */ + +static SENSOR_FUNCTION_STRUCT sensor_func = { + open, + get_info, + get_resolution, + feature_control, + control, + close +}; + +UINT32 GC0312MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc!=NULL) + *pfFunc=&sensor_func; + return ERROR_NONE; +} /* GC0312MIPI_RAW_SensorInit */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Sensor.h new file mode 100644 index 00000000000..66d7692bb61 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312mipi_Sensor.h @@ -0,0 +1,120 @@ +/***************************************************************************** + * + * Filename: + * --------- + * GC0312mipi_Sensor.h + * + * Project: + * -------- + * ALPS + * + * Description: + * ------------ + * CMOS sensor header file + * + ****************************************************************************/ +#ifndef _GC0312MIPI_SENSOR_H +#define _GC0312MIPI_SENSOR_H + + +typedef enum{ + IMGSENSOR_MODE_INIT, + IMGSENSOR_MODE_PREVIEW, + IMGSENSOR_MODE_CAPTURE, + IMGSENSOR_MODE_VIDEO, + IMGSENSOR_MODE_HIGH_SPEED_VIDEO, + IMGSENSOR_MODE_SLIM_VIDEO, +} IMGSENSOR_MODE; + +typedef struct imgsensor_mode_struct { + kal_uint32 pclk; //record different mode's pclk + kal_uint32 linelength; //record different mode's linelength + kal_uint32 framelength; //record different mode's framelength + + kal_uint8 startx; //record different mode's startx of grabwindow + kal_uint8 starty; //record different mode's startx of grabwindow + + kal_uint16 grabwindow_width; //record different mode's width of grabwindow + kal_uint16 grabwindow_height; //record different mode's height of grabwindow + + /* following for MIPIDataLowPwr2HighSpeedSettleDelayCount by different scenario */ + kal_uint8 mipi_data_lp2hs_settle_dc; + + /* following for GetDefaultFramerateByScenario() */ + kal_uint16 max_framerate; + +} imgsensor_mode_struct; + +/* SENSOR PRIVATE STRUCT FOR VARIABLES*/ +typedef struct imgsensor_struct { + kal_uint8 mirror; //mirrorflip information + + kal_uint8 sensor_mode; //record IMGSENSOR_MODE enum value + + kal_uint32 shutter; //current shutter + kal_uint16 gain; //current gain + + kal_uint32 pclk; //current pclk + + kal_uint32 frame_length; //current framelength + kal_uint32 line_length; //current linelength + + kal_uint32 min_frame_length; //current min framelength to max framerate + kal_uint16 dummy_pixel; //current dummypixel + kal_uint16 dummy_line; //current dummline + + kal_uint16 current_fps; //current max fps + kal_bool autoflicker_en; //record autoflicker enable or disable + kal_bool test_pattern; //record test pattern mode or not + MSDK_SCENARIO_ID_ENUM current_scenario_id;//current scenario id + kal_uint8 ihdr_en; //ihdr enable or disable + + kal_uint8 i2c_write_id; //record current sensor's i2c write id +} imgsensor_struct; + +/* SENSOR PRIVATE STRUCT FOR CONSTANT*/ +typedef struct imgsensor_info_struct { + kal_uint32 sensor_id; //record sensor id defined in Kd_imgsensor.h + kal_uint32 checksum_value; //checksum value for Camera Auto Test + imgsensor_mode_struct pre; //preview scenario relative information + imgsensor_mode_struct cap; //capture scenario relative information + imgsensor_mode_struct cap1; //capture for PIP 24fps relative information, capture1 mode must use same framelength, linelength with Capture mode for shutter calculate + imgsensor_mode_struct normal_video;//normal video scenario relative information + imgsensor_mode_struct hs_video; //high speed video scenario relative information + imgsensor_mode_struct slim_video; //slim video for VT scenario relative information + + kal_uint8 ae_shut_delay_frame; //shutter delay frame for AE cycle + kal_uint8 ae_sensor_gain_delay_frame; //sensor gain delay frame for AE cycle + kal_uint8 ae_ispGain_delay_frame; //isp gain delay frame for AE cycle + kal_uint8 ihdr_support; //1, support; 0,not support + kal_uint8 ihdr_le_firstline; //1,le first ; 0, se first + kal_uint8 sensor_mode_num; //support sensor mode num + + kal_uint8 cap_delay_frame; //enter capture delay frame num + kal_uint8 pre_delay_frame; //enter preview delay frame num + kal_uint8 video_delay_frame; //enter video delay frame num + kal_uint8 hs_video_delay_frame; //enter high speed video delay frame num + kal_uint8 slim_video_delay_frame; //enter slim video delay frame num + + kal_uint8 margin; //sensor framelength & shutter margin + kal_uint32 min_shutter; //min shutter + kal_uint32 max_frame_length; //max framelength by sensor register's limitation + + kal_uint8 isp_driving_current; //mclk driving current + kal_uint8 sensor_interface_type;//sensor_interface_type + kal_uint8 mipi_sensor_type; //0,MIPI_OPHY_NCSI2; 1,MIPI_OPHY_CSI2, default is NCSI2, don't modify this para + kal_uint8 mipi_settle_delay_mode; //0, high speed signal auto detect; 1, use settle delay,unit is ns, default is auto detect, don't modify this para + kal_uint8 sensor_output_dataformat;//sensor output first pixel color + kal_uint8 mclk; //mclk value, suggest 24 or 26 for 24Mhz or 26Mhz + + kal_uint8 mipi_lane_num; //mipi lane num + kal_uint8 i2c_addr_table[5]; //record sensor support all write id addr, only supprt 4must end with 0xff +} imgsensor_info_struct; + + + +extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); +extern int iWriteReg(u16 a_u2Addr , u32 a_u4Data , u32 a_u4Bytes , u16 i2cId); + +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_CameraCustomized.h new file mode 100644 index 00000000000..73a73edc07f --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_CameraCustomized.h @@ -0,0 +1,61 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef __CAMERA_CUSTOMIZED_H +#define __CAMERA_CUSTOMIZED_H + +// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 +#define MAIN_SENSOR_ORIENTATION_ANGLE 90 // 90 +#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist + + +// First, we think you hold the cell phone vertical. +// Second, we suppose the direction of upward is 0 +// Third, it is 90, 180, 270 in clockwise +// here we define the main sensor and sub sensor angles to deal with the jpeg orientation +#define MAIN_SENSOR_TO_PHONE_ANGLE 0 +#define SUB_SENSOR_TO_PHONE_ANGLE 0 + + +#define CAM_SIZE_QVGA_WIDTH 320 +#define CAM_SIZE_QVGA_HEIGHT 240 +#define CAM_SIZE_VGA_WIDTH 640 +#define CAM_SIZE_VGA_HEIGHT 480 +#define CAM_SIZE_05M_WIDTH 800 +#define CAM_SIZE_05M_HEIGHT 600 +#define CAM_SIZE_1M_WIDTH 1280 +#define CAM_SIZE_1M_HEIGHT 960 +#define CAM_SIZE_2M_WIDTH 1600 +#define CAM_SIZE_2M_HEIGHT 1200 +#define CAM_SIZE_3M_WIDTH 2048 +#define CAM_SIZE_3M_HEIGHT 1536 +#define CAM_SIZE_5M_WIDTH 2592 +#define CAM_SIZE_5M_HEIGHT 1944 + +// for main sensor +#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 +#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 +#define MAIN_NUM_OF_STILL_RESOLUTION 7 +#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} +#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} +#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ + {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ + // {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ + // {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ + // {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ + // {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ + // {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} + +// if sub sensor does not exist, set all the parameters as 0 +#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 +#define SUB_NUM_OF_VIDEO_RESOLUTION 0 +#define SUB_NUM_OF_STILL_RESOLUTION 0 +#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} +#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} +#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} + +//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) +//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) +//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) + +#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Camera_Sensor_para.h new file mode 100644 index 00000000000..f3996e7b3bb --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Camera_Sensor_para.h @@ -0,0 +1,57 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +/* SENSOR FULL SIZE */ +#ifndef __CAMERA_SENSOR_PARA_H +#define __CAMERA_SENSOR_PARA_H + +#define CAMERA_SENSOR_REG_DEFAULT_VALUE \ + /* ARRAY: SENSOR.reg[11] */\ + {\ + /* STRUCT: SENSOR.reg[0] */\ + {\ + /* SENSOR.reg[0].addr */ 0x00000304, /* SENSOR.reg[0].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[1] */\ + {\ + /* SENSOR.reg[1].addr */ 0x00000305, /* SENSOR.reg[1].para */ 0x0000000D\ + },\ + /* STRUCT: SENSOR.reg[2] */\ + {\ + /* SENSOR.reg[2].addr */ 0x00000306, /* SENSOR.reg[2].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[3] */\ + {\ + /* SENSOR.reg[3].addr */ 0x00000307, /* SENSOR.reg[3].para */ 0x000000C0\ + },\ + /* STRUCT: SENSOR.reg[4] */\ + {\ + /* SENSOR.reg[4].addr */ 0x00000300, /* SENSOR.reg[4].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[5] */\ + {\ + /* SENSOR.reg[5].addr */ 0x00000301, /* SENSOR.reg[5].para */ 0x00000004\ + },\ + /* STRUCT: SENSOR.reg[6] */\ + {\ + /* SENSOR.reg[6].addr */ 0x0000030A, /* SENSOR.reg[6].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[7] */\ + {\ + /* SENSOR.reg[7].addr */ 0x0000030B, /* SENSOR.reg[7].para */ 0x00000002\ + },\ + /* STRUCT: SENSOR.reg[8] */\ + {\ + /* SENSOR.reg[8].addr */ 0x00000308, /* SENSOR.reg[8].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[9] */\ + {\ + /* SENSOR.reg[9].addr */ 0x00000309, /* SENSOR.reg[9].para */ 0x00000008\ + },\ + /* STRUCT: SENSOR.reg[10] */\ + {\ + /* SENSOR.reg[10].addr */ 0xFFFFFFFF, /* SENSOR.reg[10].para */ 0x00000001\ + }\ + } + +#define CAMERA_SENSOR_CCT_DEFAULT_VALUE {{ 0xFFFFFFFF, 0x08 } ,{ 0x0209, 0x0008 } ,{ 0x0207, 0x0008 } ,{ 0x020D, 0x0008 } ,{ 0x020B, 0x0008 }} +#endif /* __CAMERA_SENSOR_PARA_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Sensor.c new file mode 100644 index 00000000000..bbad6f6abb8 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Sensor.c @@ -0,0 +1,2213 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" +#include "kd_camera_feature.h" + +#include "gc0312yuv_Sensor.h" +#include "gc0312yuv_Camera_Sensor_para.h" +#include "gc0312yuv_CameraCustomized.h" + +/* #define GC0312YUV_DEBUG */ +#ifdef GC0312YUV_DEBUG +#define SENSORDB printk +#else +#define SENSORDB(x, ...) +#endif + +#define GC0312_TEST_PATTERN_CHECKSUM (0xA8CCFA09) + +/*#define DEBUG_SENSOR_GC0312//T_flash Tuning*/ + +extern int iReadRegI2C(u8 *a_pSendData, u16 a_sizeSendData, u8 *a_pRecvData, u16 a_sizeRecvData, + u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData, u16 a_sizeSendData, u16 i2cId); + +kal_uint16 GC0312_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) +{ + char puSendCmd[2] = { (char)(addr & 0xFF), (char)(para & 0xFF) }; + + iWriteRegI2C(puSendCmd, 2, GC0312_WRITE_ID); + +} + +kal_uint16 GC0312_read_cmos_sensor(kal_uint8 addr) +{ + kal_uint16 get_byte = 0; + char puSendCmd = { (char)(addr & 0xFF) }; + iReadRegI2C(&puSendCmd, 1, (u8 *) &get_byte, 1, GC0312_WRITE_ID); + + return get_byte; +} + + +#ifdef DEBUG_SENSOR_GC0312 +#define gc0312_OP_CODE_INI 0x00 /* Initial value. */ +#define gc0312_OP_CODE_REG 0x01 /* Register */ +#define gc0312_OP_CODE_DLY 0x02 /* Delay */ +#define gc0312_OP_CODE_END 0x03 /* End of initial setting. */ +static kal_uint16 fromsd; + +typedef struct { + u16 init_reg; + u16 init_val; /* Save the register value and delay tick */ + u8 op_code; /* 0 - Initial value, 1 - Register, 2 - Delay, 3 - End of setting. */ +} gc0312_initial_set_struct; + +gc0312_initial_set_struct gc0312_Init_Reg[5000]; + +static u32 strtol(const char *nptr, u8 base) +{ + + printk("gc0312___%s____\n", __func__); + + u8 ret; + if (!nptr || (base != 16 && base != 10 && base != 8)) { + printk("gc0312 %s(): NULL pointer input\n", __func__); + return -1; + } + for (ret = 0; *nptr; nptr++) { + if ((base == 16 && *nptr >= 'A' && *nptr <= 'F') || + (base == 16 && *nptr >= 'a' && *nptr <= 'f') || + (base >= 10 && *nptr >= '0' && *nptr <= '9') || + (base >= 8 && *nptr >= '0' && *nptr <= '7')) { + ret *= base; + if (base == 16 && *nptr >= 'A' && *nptr <= 'F') + ret += *nptr - 'A' + 10; + else if (base == 16 && *nptr >= 'a' && *nptr <= 'f') + ret += *nptr - 'a' + 10; + else if (base >= 10 && *nptr >= '0' && *nptr <= '9') + ret += *nptr - '0'; + else if (base >= 8 && *nptr >= '0' && *nptr <= '7') + ret += *nptr - '0'; + } else + return ret; + } + return ret; +} + +static u8 GC0312_Initialize_from_T_Flash(void) +{ + /* FS_HANDLE fp = -1; /* Default, no file opened. */ */ + /* u8 *data_buff = NULL; */ + u8 *curr_ptr = NULL; + u32 file_size = 0; + /* u32 bytes_read = 0; */ + u32 i = 0, j = 0; + u8 func_ind[4] = { 0 }; /* REG or DLY */ + + printk("gc0312 ___%s____ start\n", __func__); + + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static u8 data_buff[10 * 1024]; + + fp = filp_open("/mnt/sdcard/gc0312_sd.txt", O_RDONLY, 0); + if (IS_ERR(fp)) { + /* printk("0312 create file error,IS_ERR(fp)=%s\n",IS_ERR(fp)); */ + return -1; + } else { + /* printk("0312 create file error,IS_ERR(fp)=%s\n",IS_ERR(fp)); */ + } + fs = get_fs(); + set_fs(KERNEL_DS); + + file_size = vfs_llseek(fp, 0, SEEK_END); + vfs_read(fp, data_buff, file_size, &pos); + /* printk("%s %d %d\n", buf,iFileLen,pos); */ + filp_close(fp, NULL); + set_fs(fs); + + /* Start parse the setting witch read from t-flash. */ + curr_ptr = data_buff; + while (curr_ptr < (data_buff + file_size)) { + while ((*curr_ptr == ' ') || (*curr_ptr == '\t')) /* Skip the Space & TAB */ + curr_ptr++; + + if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '*')) { + while (!(((*curr_ptr) == '*') && ((*(curr_ptr + 1)) == '/'))) { + curr_ptr++; /* Skip block comment code. */ + } + + while (!((*curr_ptr == 0x0D) && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue; + } + + if (((*curr_ptr) == '/') || ((*curr_ptr) == '{') || ((*curr_ptr) == '}')) { /* Comment line, skip it. */ + while (!((*curr_ptr == 0x0D) && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue; + } + /* This just content one enter line. */ + if (((*curr_ptr) == 0x0D) && ((*(curr_ptr + 1)) == 0x0A)) { + curr_ptr += 2; + continue; + } + /* printk(" curr_ptr1 = %s\n",curr_ptr); */ + memcpy(func_ind, curr_ptr, 3); + + + if (strcmp((const char *)func_ind, "REG") == 0) { /* REG */ + curr_ptr += 6; /* Skip "REG(0x" or "DLY(" */ + gc0312_Init_Reg[i].op_code = gc0312_OP_CODE_REG; + + gc0312_Init_Reg[i].init_reg = strtol((const char *)curr_ptr, 16); + curr_ptr += 5; /* Skip "00, 0x" */ + + gc0312_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 16); + curr_ptr += 4; /* Skip "00);" */ + + } else { /* DLY */ + + /* Need add delay for this setting. */ + curr_ptr += 4; + gc0312_Init_Reg[i].op_code = gc0312_OP_CODE_DLY; + + gc0312_Init_Reg[i].init_reg = 0xFF; + gc0312_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 10); /* Get the delay ticks, the delay should less then 50 */ + } + i++; + + + /* Skip to next line directly. */ + while (!((*curr_ptr == 0x0D) && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + curr_ptr += 2; + } + + /* (0xFFFF, 0xFFFF) means the end of initial setting. */ + gc0312_Init_Reg[i].op_code = gc0312_OP_CODE_END; + gc0312_Init_Reg[i].init_reg = 0xFF; + gc0312_Init_Reg[i].init_val = 0xFF; + i++; + /* for (j=0; j0xd0) + GC0312ExifInfo.RealISOValue = AE_ISO_100; + else if (t_gain >0x70) + GC0312ExifInfo.RealISOValue = AE_ISO_200; + else if (t_gain >0x20) + GC0312ExifInfo.RealISOValue = AE_ISO_400; + else + GC0312ExifInfo.RealISOValue = AE_ISO_800; + + /* + GC0312_write_cmos_sensor(0xfe,0x00); + analog_gain= GC0312_read_cmos_sensor(0x48); + pre_gain = GC0312_read_cmos_sensor(0x71); + post_gain = GC0312_read_cmos_sensor(0x72); + total_gain=analog_gain*pre_gain*post_gain; + printk("GC0312ExifInfo analog=%d,pre=%d,post=%d,total=%d",analog_gain,pre_gain,post_gain,total_gain); + + if (total_gain <170000) + GC0312ExifInfo.RealISOValue = AE_ISO_100; + else if (total_gain <330000) + GC0312ExifInfo.RealISOValue = AE_ISO_200; + else if (total_gain <570000) + GC0312ExifInfo.RealISOValue = AE_ISO_400; + else + GC0312ExifInfo.RealISOValue = AE_ISO_800; + */ + + /* + if (shutter_iso <40) + GC0312ExifInfo.RealISOValue = AE_ISO_100; + else if (shutter_iso<55) + GC0312ExifInfo.RealISOValue = AE_ISO_200; + else if (shutter_iso<105) + GC0312ExifInfo.RealISOValue = AE_ISO_400; + else + GC0312ExifInfo.RealISOValue = AE_ISO_800; + */ + + return shutter; +} /* GC0312_read_shutter */ + + +/************************************************************************* + * FUNCTION + * GC0312_write_reg + * + * DESCRIPTION + * This function set the register of GC0312. + * + * PARAMETERS + * addr : the register index of GC0312 + * para : setting parameter of the specified register of GC0312 + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +void GC0312_write_reg(kal_uint32 addr, kal_uint32 para) +{ + GC0312_write_cmos_sensor(addr, para); +} /* GC0312_write_reg() */ + + +/************************************************************************* + * FUNCTION + * GC0312_read_cmos_sensor + * + * DESCRIPTION + * This function read parameter of specified register from GC0312. + * + * PARAMETERS + * addr : the register index of GC0312 + * + * RETURNS + * the data that read from GC0312 + * + * GLOBALS AFFECTED + * + *************************************************************************/ +kal_uint32 GC0312_read_reg(kal_uint32 addr) +{ + return GC0312_read_cmos_sensor(addr); +} /* OV7670_read_reg() */ + + +/************************************************************************* +* FUNCTION +* GC0312_awb_enable +* +* DESCRIPTION +* This function enable or disable the awb (Auto White Balance). +* +* PARAMETERS +* 1. kal_bool : KAL_TRUE - enable awb, KAL_FALSE - disable awb. +* +* RETURNS +* kal_bool : It means set awb right or not. +* +*************************************************************************/ +static void GC0312_awb_enable(kal_bool enalbe) +{ + kal_uint16 temp_AWB_reg = 0; + + temp_AWB_reg = GC0312_read_cmos_sensor(0x42); + + if (enalbe) { + GC0312_write_cmos_sensor(0x42, (temp_AWB_reg | 0x02)); + } else { + GC0312_write_cmos_sensor(0x42, (temp_AWB_reg & (~0x02))); + } + +} + + +/************************************************************************* +* FUNCTION +* GC0312_GAMMA_Select +* +* DESCRIPTION +* This function is served for FAE to select the appropriate GAMMA curve. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void GC0312GammaSelect(kal_uint32 GammaLvl) +{ + switch (GammaLvl) { + case GC0312_RGB_Gamma_m1: /* smallest gamma curve */ + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xbf, 0x06); + GC0312_write_cmos_sensor(0xc0, 0x12); + GC0312_write_cmos_sensor(0xc1, 0x22); + GC0312_write_cmos_sensor(0xc2, 0x35); + GC0312_write_cmos_sensor(0xc3, 0x4b); + GC0312_write_cmos_sensor(0xc4, 0x5f); + GC0312_write_cmos_sensor(0xc5, 0x72); + GC0312_write_cmos_sensor(0xc6, 0x8d); + GC0312_write_cmos_sensor(0xc7, 0xa4); + GC0312_write_cmos_sensor(0xc8, 0xb8); + GC0312_write_cmos_sensor(0xc9, 0xc8); + GC0312_write_cmos_sensor(0xca, 0xd4); + GC0312_write_cmos_sensor(0xcb, 0xde); + GC0312_write_cmos_sensor(0xcc, 0xe6); + GC0312_write_cmos_sensor(0xcd, 0xf1); + GC0312_write_cmos_sensor(0xce, 0xf8); + GC0312_write_cmos_sensor(0xcf, 0xfd); + break; + case GC0312_RGB_Gamma_m2: + GC0312_write_cmos_sensor(0xBF, 0x08); + GC0312_write_cmos_sensor(0xc0, 0x0F); + GC0312_write_cmos_sensor(0xc1, 0x21); + GC0312_write_cmos_sensor(0xc2, 0x32); + GC0312_write_cmos_sensor(0xc3, 0x43); + GC0312_write_cmos_sensor(0xc4, 0x50); + GC0312_write_cmos_sensor(0xc5, 0x5E); + GC0312_write_cmos_sensor(0xc6, 0x78); + GC0312_write_cmos_sensor(0xc7, 0x90); + GC0312_write_cmos_sensor(0xc8, 0xA6); + GC0312_write_cmos_sensor(0xc9, 0xB9); + GC0312_write_cmos_sensor(0xcA, 0xC9); + GC0312_write_cmos_sensor(0xcB, 0xD6); + GC0312_write_cmos_sensor(0xcC, 0xE0); + GC0312_write_cmos_sensor(0xcD, 0xEE); + GC0312_write_cmos_sensor(0xcE, 0xF8); + GC0312_write_cmos_sensor(0xcF, 0xFF); + break; + + case GC0312_RGB_Gamma_m3: + GC0312_write_cmos_sensor(0xbf, 0x0b); + GC0312_write_cmos_sensor(0xc0, 0x17); + GC0312_write_cmos_sensor(0xc1, 0x2a); + GC0312_write_cmos_sensor(0xc2, 0x41); + GC0312_write_cmos_sensor(0xc3, 0x54); + GC0312_write_cmos_sensor(0xc4, 0x66); + GC0312_write_cmos_sensor(0xc5, 0x74); + GC0312_write_cmos_sensor(0xc6, 0x8c); + GC0312_write_cmos_sensor(0xc7, 0xa3); + GC0312_write_cmos_sensor(0xc8, 0xb5); + GC0312_write_cmos_sensor(0xc9, 0xc4); + GC0312_write_cmos_sensor(0xca, 0xd0); + GC0312_write_cmos_sensor(0xcb, 0xdb); + GC0312_write_cmos_sensor(0xcc, 0xe5); + GC0312_write_cmos_sensor(0xcd, 0xf0); + GC0312_write_cmos_sensor(0xce, 0xf7); + GC0312_write_cmos_sensor(0xcf, 0xff); + break; + + case GC0312_RGB_Gamma_m4: + GC0312_write_cmos_sensor(0xBF, 0x0E); + GC0312_write_cmos_sensor(0xc0, 0x1C); + GC0312_write_cmos_sensor(0xc1, 0x34); + GC0312_write_cmos_sensor(0xc2, 0x48); + GC0312_write_cmos_sensor(0xc3, 0x5A); + GC0312_write_cmos_sensor(0xc4, 0x6B); + GC0312_write_cmos_sensor(0xc5, 0x7B); + GC0312_write_cmos_sensor(0xc6, 0x95); + GC0312_write_cmos_sensor(0xc7, 0xAB); + GC0312_write_cmos_sensor(0xc8, 0xBF); + GC0312_write_cmos_sensor(0xc9, 0xCE); + GC0312_write_cmos_sensor(0xcA, 0xD9); + GC0312_write_cmos_sensor(0xcB, 0xE4); + GC0312_write_cmos_sensor(0xcC, 0xEC); + GC0312_write_cmos_sensor(0xcD, 0xF7); + GC0312_write_cmos_sensor(0xcE, 0xFD); + GC0312_write_cmos_sensor(0xcF, 0xFF); + break; + + case GC0312_RGB_Gamma_m5: + GC0312_write_cmos_sensor(0xBF, 0x10); + GC0312_write_cmos_sensor(0xc0, 0x20); + GC0312_write_cmos_sensor(0xc1, 0x38); + GC0312_write_cmos_sensor(0xc2, 0x4E); + GC0312_write_cmos_sensor(0xc3, 0x63); + GC0312_write_cmos_sensor(0xc4, 0x76); + GC0312_write_cmos_sensor(0xc5, 0x87); + GC0312_write_cmos_sensor(0xc6, 0xA2); + GC0312_write_cmos_sensor(0xc7, 0xB8); + GC0312_write_cmos_sensor(0xc8, 0xCA); + GC0312_write_cmos_sensor(0xc9, 0xD8); + GC0312_write_cmos_sensor(0xcA, 0xE3); + GC0312_write_cmos_sensor(0xcB, 0xEB); + GC0312_write_cmos_sensor(0xcC, 0xF0); + GC0312_write_cmos_sensor(0xcD, 0xF8); + GC0312_write_cmos_sensor(0xcE, 0xFD); + GC0312_write_cmos_sensor(0xcF, 0xFF); + break; + + case GC0312_RGB_Gamma_m6: /* largest gamma curve */ + GC0312_write_cmos_sensor(0xBF, 0x14); + GC0312_write_cmos_sensor(0xc0, 0x28); + GC0312_write_cmos_sensor(0xc1, 0x44); + GC0312_write_cmos_sensor(0xc2, 0x5D); + GC0312_write_cmos_sensor(0xc3, 0x72); + GC0312_write_cmos_sensor(0xc4, 0x86); + GC0312_write_cmos_sensor(0xc5, 0x95); + GC0312_write_cmos_sensor(0xc6, 0xB1); + GC0312_write_cmos_sensor(0xc7, 0xC6); + GC0312_write_cmos_sensor(0xc8, 0xD5); + GC0312_write_cmos_sensor(0xc9, 0xE1); + GC0312_write_cmos_sensor(0xcA, 0xEA); + GC0312_write_cmos_sensor(0xcB, 0xF1); + GC0312_write_cmos_sensor(0xcC, 0xF5); + GC0312_write_cmos_sensor(0xcD, 0xFB); + GC0312_write_cmos_sensor(0xcE, 0xFE); + GC0312_write_cmos_sensor(0xcF, 0xFF); + break; + case GC0312_RGB_Gamma_night: /* Gamma for night mode */ + GC0312_write_cmos_sensor(0xBF, 0x0B); + GC0312_write_cmos_sensor(0xc0, 0x16); + GC0312_write_cmos_sensor(0xc1, 0x29); + GC0312_write_cmos_sensor(0xc2, 0x3C); + GC0312_write_cmos_sensor(0xc3, 0x4F); + GC0312_write_cmos_sensor(0xc4, 0x5F); + GC0312_write_cmos_sensor(0xc5, 0x6F); + GC0312_write_cmos_sensor(0xc6, 0x8A); + GC0312_write_cmos_sensor(0xc7, 0x9F); + GC0312_write_cmos_sensor(0xc8, 0xB4); + GC0312_write_cmos_sensor(0xc9, 0xC6); + GC0312_write_cmos_sensor(0xcA, 0xD3); + GC0312_write_cmos_sensor(0xcB, 0xDD); + GC0312_write_cmos_sensor(0xcC, 0xE5); + GC0312_write_cmos_sensor(0xcD, 0xF1); + GC0312_write_cmos_sensor(0xcE, 0xFA); + GC0312_write_cmos_sensor(0xcF, 0xFF); + break; + default: + /* GC0312_RGB_Gamma_m3 */ + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xbf, 0x0b); + GC0312_write_cmos_sensor(0xc0, 0x17); + GC0312_write_cmos_sensor(0xc1, 0x2a); + GC0312_write_cmos_sensor(0xc2, 0x41); + GC0312_write_cmos_sensor(0xc3, 0x54); + GC0312_write_cmos_sensor(0xc4, 0x66); + GC0312_write_cmos_sensor(0xc5, 0x74); + GC0312_write_cmos_sensor(0xc6, 0x8c); + GC0312_write_cmos_sensor(0xc7, 0xa3); + GC0312_write_cmos_sensor(0xc8, 0xb5); + GC0312_write_cmos_sensor(0xc9, 0xc4); + GC0312_write_cmos_sensor(0xca, 0xd0); + GC0312_write_cmos_sensor(0xcb, 0xdb); + GC0312_write_cmos_sensor(0xcc, 0xe5); + GC0312_write_cmos_sensor(0xcd, 0xf0); + GC0312_write_cmos_sensor(0xce, 0xf7); + GC0312_write_cmos_sensor(0xcf, 0xff); + break; + } +} + + +/************************************************************************* + * FUNCTION + * GC0312_config_window + * + * DESCRIPTION + * This function config the hardware window of GC0312 for getting specified + * data of that window. + * + * PARAMETERS + * start_x : start column of the interested window + * start_y : start row of the interested window + * width : column widht of the itnerested window + * height : row depth of the itnerested window + * + * RETURNS + * the data that read from GC0312 + * + * GLOBALS AFFECTED + * + *************************************************************************/ +void GC0312_config_window(kal_uint16 startx, kal_uint16 starty, kal_uint16 width, kal_uint16 height) +{ +} /* GC0312_config_window */ + + +/************************************************************************* + * FUNCTION + * GC0312_SetGain + * + * DESCRIPTION + * This function is to set global gain to sensor. + * + * PARAMETERS + * iGain : sensor global gain(base: 0x40) + * + * RETURNS + * the actually gain set to sensor. + * + * GLOBALS AFFECTED + * + *************************************************************************/ +kal_uint16 GC0312_SetGain(kal_uint16 iGain) +{ + return iGain; +} + + +/************************************************************************* + * FUNCTION + * GC0312_NightMode + * + * DESCRIPTION + * This function night mode of GC0312. + * + * PARAMETERS + * bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +void GC0312NightMode(kal_bool bEnable) +{ + if (bEnable) { + GC0312_write_cmos_sensor(0xfe, 0x01); + if (GC0312_MPEG4_encode_mode == KAL_TRUE) + GC0312_write_cmos_sensor(0x3c, 0x30); + else + GC0312_write_cmos_sensor(0x3c, 0x30); + GC0312_write_cmos_sensor(0xfe, 0x00); + /* GC0312GammaSelect(GC0312_RGB_Gamma_night); */ + GC0312_NIGHT_MODE = KAL_TRUE; + } else { + GC0312_write_cmos_sensor(0xfe, 0x01); + if (GC0312_MPEG4_encode_mode == KAL_TRUE) { + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x0d, 0xf8); + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x05, 0x01); + GC0312_write_cmos_sensor(0x06, 0x18); + GC0312_write_cmos_sensor(0x07, 0x00); + GC0312_write_cmos_sensor(0x08, 0x10); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x25, 0x00); + GC0312_write_cmos_sensor(0x26, 0x9a); + GC0312_write_cmos_sensor(0x27, 0x01); + GC0312_write_cmos_sensor(0x28, 0x34); + GC0312_write_cmos_sensor(0x29, 0x02); + GC0312_write_cmos_sensor(0x2a, 0x68); + GC0312_write_cmos_sensor(0x2b, 0x03); + GC0312_write_cmos_sensor(0x2c, 0x02); + GC0312_write_cmos_sensor(0x2d, 0x03); + GC0312_write_cmos_sensor(0x2e, 0x9c); + GC0312_write_cmos_sensor(0x2f, 0x04); + GC0312_write_cmos_sensor(0x30, 0xd0); + GC0312_write_cmos_sensor(0x31, 0x04); + GC0312_write_cmos_sensor(0x32, 0xd0); + GC0312_write_cmos_sensor(0x33, 0x06); + GC0312_write_cmos_sensor(0x34, 0x04); + GC0312_write_cmos_sensor(0x35, 0x0d); + GC0312_write_cmos_sensor(0x36, 0x14); + GC0312_write_cmos_sensor(0x37, 0x18); + GC0312_write_cmos_sensor(0x38, 0x20); + GC0312_write_cmos_sensor(0x39, 0x30); + GC0312_write_cmos_sensor(0x3a, 0x30); + GC0312_write_cmos_sensor(0x3b, 0x30); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x35); + GC0312_write_cmos_sensor(0xfe, 0x00); + } else { + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x0d, 0xf8); /*new exp 3*/ + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x05, 0x01);/*01*/ + GC0312_write_cmos_sensor(0x06, 0x18);/*89*/ + GC0312_write_cmos_sensor(0x07, 0x00); + GC0312_write_cmos_sensor(0x08, 0x10);/*22*/ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x25, 0x00); + GC0312_write_cmos_sensor(0x26, 0x9a); /*8a //step*/ + GC0312_write_cmos_sensor(0x27, 0x01); + GC0312_write_cmos_sensor(0x28, 0x34); /*2step level 1 30fps*/ + GC0312_write_cmos_sensor(0x29, 0x02); + GC0312_write_cmos_sensor(0x2a, 0x68); /*4step level 2 25 fps*/ + GC0312_write_cmos_sensor(0x2b, 0x04); + GC0312_write_cmos_sensor(0x2c, 0xd0); /*5step level 3 20*/ + GC0312_write_cmos_sensor(0x2d, 0x06); + GC0312_write_cmos_sensor(0x2e, 0x04); /*10step level 4 17*/ + GC0312_write_cmos_sensor(0x2f, 0x09); + GC0312_write_cmos_sensor(0x30, 0x04); /*14step level 5 12fps*/ + GC0312_write_cmos_sensor(0x31, 0x09); + GC0312_write_cmos_sensor(0x32, 0x04); /*14 step level 6 10fps*/ + GC0312_write_cmos_sensor(0x33, 0x09); + GC0312_write_cmos_sensor(0x34, 0x08); /* level 7*/ + GC0312_write_cmos_sensor(0x35, 0x08); /*2.25x level 1*/ + GC0312_write_cmos_sensor(0x36, 0x0d); /*3.5x level 2*/ + GC0312_write_cmos_sensor(0x37, 0x10); /*6x level 3*/ + GC0312_write_cmos_sensor(0x38, 0x14); /* level 4*/ + GC0312_write_cmos_sensor(0x39, 0x18); /* level 5*/ + GC0312_write_cmos_sensor(0x3a, 0x28); /* level 6*/ + GC0312_write_cmos_sensor(0x3b, 0x28); /* level 7 3.5x*/ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x39); + GC0312_write_cmos_sensor(0xfe, 0x00); + } + + GC0312_write_cmos_sensor(0xfe, 0x00); + /* GC0312GammaSelect(GC0312_RGB_Gamma_m3); */ + GC0312_NIGHT_MODE = KAL_FALSE; + } +} /* GC0312_NightMode */ + +/************************************************************************* +* FUNCTION +* GC0312_Sensor_Init +* +* DESCRIPTION +* This function apply all of the initial setting to sensor. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +*************************************************************************/ +void GC0312_Sensor_Init(void) +{ + GC0312_write_cmos_sensor(0xfe, 0xf0); + GC0312_write_cmos_sensor(0xfe, 0xf0); + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xfc, 0x0e); + GC0312_write_cmos_sensor(0xfc, 0x0e); + GC0312_write_cmos_sensor(0xf2, 0x07); + GC0312_write_cmos_sensor(0xf3, 0x00); /* output_disable */ + GC0312_write_cmos_sensor(0xf7, 0x1b); + GC0312_write_cmos_sensor(0xf8, 0x04); + GC0312_write_cmos_sensor(0xf9, 0x0e); + GC0312_write_cmos_sensor(0xfa, 0x11); + + /* /////////////////////////////////////////////// */ + /* /////////////// CISCTL reg ///////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0x00, 0x2f); + GC0312_write_cmos_sensor(0x01, 0x0f); + GC0312_write_cmos_sensor(0x02, 0x04); + GC0312_write_cmos_sensor(0x03, 0x02); + GC0312_write_cmos_sensor(0x04, 0x68); + GC0312_write_cmos_sensor(0x09, 0x00); + GC0312_write_cmos_sensor(0x0a, 0x00); + GC0312_write_cmos_sensor(0x0b, 0x00); + GC0312_write_cmos_sensor(0x0c, 0x04); + GC0312_write_cmos_sensor(0x0d, 0x01); + GC0312_write_cmos_sensor(0x0e, 0xe8); + GC0312_write_cmos_sensor(0x0f, 0x02); + GC0312_write_cmos_sensor(0x10, 0x88); + GC0312_write_cmos_sensor(0x16, 0x00); + GC0312_write_cmos_sensor(0x17, 0x14); + GC0312_write_cmos_sensor(0x18, 0x1a); + GC0312_write_cmos_sensor(0x19, 0x14); + GC0312_write_cmos_sensor(0x1b, 0x48); + GC0312_write_cmos_sensor(0x1c, 0x6c); /* 1c travis 20140929 */ + GC0312_write_cmos_sensor(0x1e, 0x6b); + GC0312_write_cmos_sensor(0x1f, 0x28); + GC0312_write_cmos_sensor(0x20, 0x8b); /* 89 travis 20140801 */ + GC0312_write_cmos_sensor(0x21, 0x49); + GC0312_write_cmos_sensor(0x22, 0xd0); /* b0 travis 20140929 */ + GC0312_write_cmos_sensor(0x23, 0x04); + GC0312_write_cmos_sensor(0x24, 0x16); + GC0312_write_cmos_sensor(0x34, 0x20); + + /* /////////////////////////////////////////////// */ + /* ////////////////// BLK //////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0x26, 0x23); + GC0312_write_cmos_sensor(0x28, 0xff); + GC0312_write_cmos_sensor(0x29, 0x00); + GC0312_write_cmos_sensor(0x32, 0x04); /* 00 travis 20140929 */ + GC0312_write_cmos_sensor(0x33, 0x10); + GC0312_write_cmos_sensor(0x37, 0x20); + GC0312_write_cmos_sensor(0x38, 0x10); + GC0312_write_cmos_sensor(0x47, 0x80); + GC0312_write_cmos_sensor(0x4e, 0x66); + GC0312_write_cmos_sensor(0xa8, 0x02); + GC0312_write_cmos_sensor(0xa9, 0x80); + + /* /////////////////////////////////////////////// */ + /* //////////////// ISP reg /////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0x40, 0xff); + GC0312_write_cmos_sensor(0x41, 0x25); /* 21 becky */ + GC0312_write_cmos_sensor(0x42, 0xcf); + GC0312_write_cmos_sensor(0x44, 0x02); + GC0312_write_cmos_sensor(0x45, 0xa8); + GC0312_write_cmos_sensor(0x46, 0x02); + GC0312_write_cmos_sensor(0x4a, 0x11); + GC0312_write_cmos_sensor(0x4b, 0x01); + GC0312_write_cmos_sensor(0x4c, 0x20); + GC0312_write_cmos_sensor(0x4d, 0x05); + GC0312_write_cmos_sensor(0x4f, 0x01); + GC0312_write_cmos_sensor(0x50, 0x01); + GC0312_write_cmos_sensor(0x55, 0x01); + GC0312_write_cmos_sensor(0x56, 0xe0); + GC0312_write_cmos_sensor(0x57, 0x02); + GC0312_write_cmos_sensor(0x58, 0x80); + GC0312_write_cmos_sensor(0xde, 0xa8); /* */ + + /* /////////////////////////////////////////////// */ + /* ///////////////// GAIN //////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0x70, 0x70); + GC0312_write_cmos_sensor(0x5a, 0x84); + GC0312_write_cmos_sensor(0x5b, 0xc9); + GC0312_write_cmos_sensor(0x5c, 0xed); + GC0312_write_cmos_sensor(0x77, 0x40); + GC0312_write_cmos_sensor(0x78, 0x58); + GC0312_write_cmos_sensor(0x79, 0xa9); + + /* /////////////////////////////////////////////// */ + /* ///////////////// DNDD ///////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0x82, 0x01); + GC0312_write_cmos_sensor(0x83, 0x01); + GC0312_write_cmos_sensor(0x89, 0x0e); + GC0312_write_cmos_sensor(0x8a, 0x0e); + GC0312_write_cmos_sensor(0x8b, 0x0e); + + /* /////////////////////////////////////////////// */ + /* //////////////// EEINTP //////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0x8f, 0xaa); + GC0312_write_cmos_sensor(0x90, 0x8c); + GC0312_write_cmos_sensor(0x91, 0x90); + GC0312_write_cmos_sensor(0x92, 0x08); + GC0312_write_cmos_sensor(0x93, 0x08); + GC0312_write_cmos_sensor(0x94, 0x08); + GC0312_write_cmos_sensor(0x95, 0x44); + GC0312_write_cmos_sensor(0x96, 0xf0); + + /* /////////////////////////////////////////////// */ + /* /////////////////// ASDE //////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0xfe, 0x00); + + GC0312_write_cmos_sensor(0x9a, 0x20); + GC0312_write_cmos_sensor(0x9b, 0x60); + GC0312_write_cmos_sensor(0x9c, 0x40); + GC0312_write_cmos_sensor(0x9d, 0x80); + + GC0312_write_cmos_sensor(0xa1, 0x30); + GC0312_write_cmos_sensor(0xa2, 0x44); + GC0312_write_cmos_sensor(0xa4, 0x20); /*30 travis 20140929*/ + GC0312_write_cmos_sensor(0xa5, 0x3c); /*30 travis 20140929*/ + GC0312_write_cmos_sensor(0xaa, 0x30); /*10 travis 20140929*/ + GC0312_write_cmos_sensor(0xac, 0x00); + + /* /////////////////////////////////////////////// */ + /* ///////////////// GAMMA /////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xbf, 0x06); + GC0312_write_cmos_sensor(0xc0, 0x14); + GC0312_write_cmos_sensor(0xc1, 0x2b); + GC0312_write_cmos_sensor(0xc2, 0x46); + GC0312_write_cmos_sensor(0xc3, 0x5b); + GC0312_write_cmos_sensor(0xc4, 0x6e); + GC0312_write_cmos_sensor(0xc5, 0x7b); + GC0312_write_cmos_sensor(0xc6, 0x93); + GC0312_write_cmos_sensor(0xc7, 0xa5); + GC0312_write_cmos_sensor(0xc8, 0xb7); + GC0312_write_cmos_sensor(0xc9, 0xc6); + GC0312_write_cmos_sensor(0xca, 0xd1); + GC0312_write_cmos_sensor(0xcb, 0xdb); + GC0312_write_cmos_sensor(0xcc, 0xe1); + GC0312_write_cmos_sensor(0xcd, 0xee); + GC0312_write_cmos_sensor(0xce, 0xf8); + GC0312_write_cmos_sensor(0xcf, 0xfe); + + + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x5f, 0x12); + GC0312_write_cmos_sensor(0x60, 0x22); + GC0312_write_cmos_sensor(0x61, 0x31); + GC0312_write_cmos_sensor(0x62, 0x3d); + GC0312_write_cmos_sensor(0x63, 0x49); + GC0312_write_cmos_sensor(0x64, 0x54); + GC0312_write_cmos_sensor(0x65, 0x5e); + GC0312_write_cmos_sensor(0x66, 0x71); + GC0312_write_cmos_sensor(0x67, 0x82); + GC0312_write_cmos_sensor(0x68, 0x92); + GC0312_write_cmos_sensor(0x69, 0xa0); + GC0312_write_cmos_sensor(0x6a, 0xae); + GC0312_write_cmos_sensor(0x6b, 0xba); + GC0312_write_cmos_sensor(0x6c, 0xc6); + GC0312_write_cmos_sensor(0x6d, 0xd8); + GC0312_write_cmos_sensor(0x6e, 0xe4); + GC0312_write_cmos_sensor(0x6f, 0xef); + + GC0312_write_cmos_sensor(0xb1, 0xb0); + GC0312_write_cmos_sensor(0xb2, 0xd0); + GC0312_write_cmos_sensor(0xb3, 0x80); + GC0312_write_cmos_sensor(0xb4, 0x90); + + ///////////////////////////////////////////// + /////////////////// YCP ////////////////// + ///////////////////////////////////////////// + GC0312_write_cmos_sensor(0xd0, 0x40); + GC0312_write_cmos_sensor(0xd1, 0x30); + GC0312_write_cmos_sensor(0xd2, 0x2a); + GC0312_write_cmos_sensor(0xd3, 0x42); /*40*/ + GC0312_write_cmos_sensor(0xd5, 0x00); /*40*/ + GC0312_write_cmos_sensor(0xd6, 0xf2); + GC0312_write_cmos_sensor(0xd7, 0x1b); + GC0312_write_cmos_sensor(0xd8, 0x18); + GC0312_write_cmos_sensor(0xdd, 0x03); + + ///////////////////////////////////////////// + //////////////////// AEC //////////////// + ///////////////////////////////////////////// + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x05, 0x30); + GC0312_write_cmos_sensor(0x06, 0x75); + GC0312_write_cmos_sensor(0x07, 0x40); + GC0312_write_cmos_sensor(0x08, 0xb0); + GC0312_write_cmos_sensor(0x0a, 0xc5); + GC0312_write_cmos_sensor(0x0b, 0x11); + GC0312_write_cmos_sensor(0x0c, 0x00); + GC0312_write_cmos_sensor(0x12, 0x52); + GC0312_write_cmos_sensor(0x13, 0x39); /*3c*/ + GC0312_write_cmos_sensor(0x18, 0x95); + GC0312_write_cmos_sensor(0x19, 0x96); + GC0312_write_cmos_sensor(0x1f, 0x20); /*20*/ + GC0312_write_cmos_sensor(0x20, 0xc0); + GC0312_write_cmos_sensor(0x3e, 0x40); + GC0312_write_cmos_sensor(0x3f, 0x57); + GC0312_write_cmos_sensor(0x40, 0x7d); + GC0312_write_cmos_sensor(0x03, 0x60); + GC0312_write_cmos_sensor(0x44, 0x02); + + ///////////////////////////////////////////////// + //////////////////// AWB //////////////////// + ///////////////////////////////////////////////// + GC0312_write_cmos_sensor(0x1c, 0x91); + GC0312_write_cmos_sensor(0x21, 0x15); + GC0312_write_cmos_sensor(0x50, 0x80); + GC0312_write_cmos_sensor(0x56, 0x04); + GC0312_write_cmos_sensor(0x59, 0x02); + GC0312_write_cmos_sensor(0x5b, 0x02); + GC0312_write_cmos_sensor(0x61, 0x96); + GC0312_write_cmos_sensor(0x62, 0xc6); + GC0312_write_cmos_sensor(0x63, 0xd0); + GC0312_write_cmos_sensor(0x65, 0x06); + GC0312_write_cmos_sensor(0x66, 0x06); + GC0312_write_cmos_sensor(0x67, 0x04); + GC0312_write_cmos_sensor(0x69, 0x08); + GC0312_write_cmos_sensor(0x6a, 0x03); /*25 outdoor thd*/ + GC0312_write_cmos_sensor(0x6b, 0x01); + GC0312_write_cmos_sensor(0x6c, 0x00); + GC0312_write_cmos_sensor(0x6d, 0x02); + GC0312_write_cmos_sensor(0x6e, 0x00); + GC0312_write_cmos_sensor(0x6f, 0x80); + GC0312_write_cmos_sensor(0x76, 0x80); + GC0312_write_cmos_sensor(0x77, 0x45); + GC0312_write_cmos_sensor(0x78, 0xf0); + GC0312_write_cmos_sensor(0x79, 0x75); + GC0312_write_cmos_sensor(0x7a, 0x40); + GC0312_write_cmos_sensor(0x7b, 0x50); + GC0312_write_cmos_sensor(0x7c, 0x0c); + + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x90, 0xcb); + GC0312_write_cmos_sensor(0x91, 0xbe); + GC0312_write_cmos_sensor(0x92, 0xf0); + GC0312_write_cmos_sensor(0x93, 0xcc); + GC0312_write_cmos_sensor(0x95, 0x1a); + GC0312_write_cmos_sensor(0x96, 0xf0); + GC0312_write_cmos_sensor(0x97, 0x43); + GC0312_write_cmos_sensor(0x98, 0x1a); + GC0312_write_cmos_sensor(0x9a, 0x43); + GC0312_write_cmos_sensor(0x9b, 0x1a); + GC0312_write_cmos_sensor(0x9c, 0xc4); + GC0312_write_cmos_sensor(0x9d, 0x44); + GC0312_write_cmos_sensor(0x9f, 0xc7); + GC0312_write_cmos_sensor(0xa0, 0xc8); + GC0312_write_cmos_sensor(0xa1, 0x00); + GC0312_write_cmos_sensor(0xa2, 0x00); + GC0312_write_cmos_sensor(0x86, 0x00); + GC0312_write_cmos_sensor(0x87, 0x00); + GC0312_write_cmos_sensor(0x88, 0x00); + GC0312_write_cmos_sensor(0x89, 0x00); + GC0312_write_cmos_sensor(0xa4, 0xb6); + GC0312_write_cmos_sensor(0xa5, 0xa2); + GC0312_write_cmos_sensor(0xa6, 0xb6); + GC0312_write_cmos_sensor(0xa7, 0x95); + GC0312_write_cmos_sensor(0xa9, 0xbc); + GC0312_write_cmos_sensor(0xaa, 0x95); + GC0312_write_cmos_sensor(0xab, 0xab); + GC0312_write_cmos_sensor(0xac, 0x8d); + GC0312_write_cmos_sensor(0xae, 0xc8); + GC0312_write_cmos_sensor(0xaf, 0xab); + GC0312_write_cmos_sensor(0xb0, 0xc8); + GC0312_write_cmos_sensor(0xb1, 0x97); + GC0312_write_cmos_sensor(0xb3, 0xb7); + GC0312_write_cmos_sensor(0xb4, 0x7f); + GC0312_write_cmos_sensor(0xb5, 0x00); + GC0312_write_cmos_sensor(0xb6, 0x00); + GC0312_write_cmos_sensor(0x8b, 0x00); + GC0312_write_cmos_sensor(0x8c, 0x00); + GC0312_write_cmos_sensor(0x8d, 0x00); + GC0312_write_cmos_sensor(0x8e, 0x00); + GC0312_write_cmos_sensor(0x94, 0x55); + GC0312_write_cmos_sensor(0x99, 0xa6); + GC0312_write_cmos_sensor(0x9e, 0xaa); + GC0312_write_cmos_sensor(0xa3, 0x0a); + GC0312_write_cmos_sensor(0x8a, 0x00); + GC0312_write_cmos_sensor(0xa8, 0x55); + GC0312_write_cmos_sensor(0xad, 0x55); + GC0312_write_cmos_sensor(0xb2, 0x55); + GC0312_write_cmos_sensor(0xb7, 0x05); + GC0312_write_cmos_sensor(0x8f, 0x00); + GC0312_write_cmos_sensor(0xb8, 0xcb); + GC0312_write_cmos_sensor(0xb9, 0x9b); + /* /////////////////////////////////////////////// */ + /* ////////////////// CC //////////////////// */ + /* /////////////////////////////////////////////// */ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0xd0, 0x40); + GC0312_write_cmos_sensor(0xd1, 0xfc); + GC0312_write_cmos_sensor(0xd2, 0x06); + GC0312_write_cmos_sensor(0xd3, 0xea); + GC0312_write_cmos_sensor(0xd4, 0x42); + GC0312_write_cmos_sensor(0xd5, 0xec); + + GC0312_write_cmos_sensor(0xd6, 0x42); + GC0312_write_cmos_sensor(0xd7, 0x04); + GC0312_write_cmos_sensor(0xd8, 0x09); + GC0312_write_cmos_sensor(0xd9, 0x00); + GC0312_write_cmos_sensor(0xda, 0x40); + GC0312_write_cmos_sensor(0xdb, 0xec); + + ///////////////////////////////////////////////// + //////////////////// LSC //////////////////// + ///////////////////////////////////////////////// + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0xc1, 0x3c); + GC0312_write_cmos_sensor(0xc2, 0x50); + GC0312_write_cmos_sensor(0xc3, 0x00); + GC0312_write_cmos_sensor(0xc4, 0x20); + GC0312_write_cmos_sensor(0xc5, 0x1a); + GC0312_write_cmos_sensor(0xc6, 0x1a); + GC0312_write_cmos_sensor(0xc7, 0x10); + GC0312_write_cmos_sensor(0xc8, 0x00); + GC0312_write_cmos_sensor(0xc9, 0x00); + GC0312_write_cmos_sensor(0xdc, 0x20); + GC0312_write_cmos_sensor(0xdd, 0x10); + GC0312_write_cmos_sensor(0xdf, 0x00); + GC0312_write_cmos_sensor(0xde, 0x00); + + ///////////////////////////////////////////////// + /////////////////// Histogram ///////////////// + ///////////////////////////////////////////////// + GC0312_write_cmos_sensor(0x01, 0x10); + GC0312_write_cmos_sensor(0x0b, 0x31); + GC0312_write_cmos_sensor(0x0e, 0x50); + GC0312_write_cmos_sensor(0x0f, 0x0f); + GC0312_write_cmos_sensor(0x10, 0x6e); + GC0312_write_cmos_sensor(0x12, 0xa0); + GC0312_write_cmos_sensor(0x15, 0x60); + GC0312_write_cmos_sensor(0x16, 0x60); + GC0312_write_cmos_sensor(0x17, 0xe0); + + ///////////////////////////////////////////// + ////////////// Measure Windo/////////////// + ///////////////////////////////////////////// + GC0312_write_cmos_sensor(0xcc, 0x0c); + GC0312_write_cmos_sensor(0xcd, 0x10); + GC0312_write_cmos_sensor(0xce, 0xa0); + GC0312_write_cmos_sensor(0xcf, 0xe6); + + ///////////////////////////////////////////// + ///////////////// dark sun ////////////// + ///////////////////////////////////////////// + GC0312_write_cmos_sensor(0x45, 0xf7); + GC0312_write_cmos_sensor(0x46, 0xff); + GC0312_write_cmos_sensor(0x47, 0x15); + GC0312_write_cmos_sensor(0x48, 0x03); + GC0312_write_cmos_sensor(0x4f, 0x60); + + //////////////////banding////////////////// + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x0d, 0xf8); /*new exp 3*/ + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x05, 0x01);/*01*/ + GC0312_write_cmos_sensor(0x06, 0x18);/*89*/ + GC0312_write_cmos_sensor(0x07, 0x00); + GC0312_write_cmos_sensor(0x08, 0x10);/*22*/ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x25, 0x00); + GC0312_write_cmos_sensor(0x26, 0x9a); /*8a //step*/ + GC0312_write_cmos_sensor(0x27, 0x01); + GC0312_write_cmos_sensor(0x28, 0x34); /*2step level 1 30fps*/ + GC0312_write_cmos_sensor(0x29, 0x02); + GC0312_write_cmos_sensor(0x2a, 0x68); /*4step level 2 25 fps*/ + GC0312_write_cmos_sensor(0x2b, 0x04); + GC0312_write_cmos_sensor(0x2c, 0xd0); /*5step level 3 20*/ + GC0312_write_cmos_sensor(0x2d, 0x06); + GC0312_write_cmos_sensor(0x2e, 0x04); /*10step level 4 17*/ + GC0312_write_cmos_sensor(0x2f, 0x09); + GC0312_write_cmos_sensor(0x30, 0xa0); /*14step level 5 12fps*/ + GC0312_write_cmos_sensor(0x31, 0x0a); + GC0312_write_cmos_sensor(0x32, 0xd4); /*14 step level 6 10fps*/ + GC0312_write_cmos_sensor(0x33, 0x0c); + GC0312_write_cmos_sensor(0x34, 0x08); /* level 7*/ + GC0312_write_cmos_sensor(0x35, 0x08); /*2.25x level 1*/ + GC0312_write_cmos_sensor(0x36, 0x0d); /*3.5x level 2*/ + GC0312_write_cmos_sensor(0x37, 0x10); /*6x level 3*/ + GC0312_write_cmos_sensor(0x38, 0x14); /* level 4*/ + GC0312_write_cmos_sensor(0x39, 0x18); /* level 5*/ + GC0312_write_cmos_sensor(0x3a, 0x28); /* level 6*/ + GC0312_write_cmos_sensor(0x3b, 0x28); /* level 7 3.5x*/ + ///////////////////////////////////////////////// + ///////////////////// DVP //////////////////// + ///////////////////////////////////////////////// + GC0312_write_cmos_sensor(0xfe, 0x03); + GC0312_write_cmos_sensor(0x01, 0x00); + GC0312_write_cmos_sensor(0x02, 0x00); + GC0312_write_cmos_sensor(0x10, 0x00); + GC0312_write_cmos_sensor(0x15, 0x00); + GC0312_write_cmos_sensor(0xfe, 0x00); + /* /////////////////OUTPUT////////////////////// */ + GC0312_write_cmos_sensor(0xf3, 0xff); /* output_enable */ + +} + + + +UINT32 GC0312GetSensorID(UINT32 *sensorID) +{ + int retry = 3; + /* check if sensor ID correct */ + do { + *sensorID = ((GC0312_read_cmos_sensor(0xf0) << 8) | GC0312_read_cmos_sensor(0xf1)); + if (*sensorID == GC0312_SENSOR_ID) + break; + SENSORDB("Read Sensor ID Fail = 0x%04x\n", *sensorID); + retry--; + } while (retry > 0); + + if (*sensorID != GC0312_SENSOR_ID) { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + return ERROR_NONE; +} + + + + +/************************************************************************* +* FUNCTION +* GC0312_Write_More_Registers +* +* DESCRIPTION +* This function is served for FAE to modify the necessary Init Regs. Do not modify the regs +* in init_GC0312() directly. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void GC0312_Write_More_Registers(void) +{ + /* //////////////////for FAE to modify the necessary Init Regs.//////////////// */ + +} + + +/************************************************************************* + * FUNCTION + * GC0312Open + * + * DESCRIPTION + * This function initialize the registers of CMOS sensor + * + * PARAMETERS + * None + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312Open(void) +{ + volatile signed char i; + kal_uint16 sensor_id = 0; + + printk(" Entry GC0312Open!!!\r\n"); + + Sleep(10); + + + /* Read sensor ID to adjust I2C is OK? */ + for (i = 0; i < 3; i++) { + sensor_id = ((GC0312_read_cmos_sensor(0xf0) << 8) | GC0312_read_cmos_sensor(0xf1)); + if (sensor_id != GC0312_SENSOR_ID) { + SENSORDB("GC0312 Read Sensor ID Fail[open] = 0x%x\n", sensor_id); + return ERROR_SENSOR_CONNECT_FAIL; + } + } + + SENSORDB("GC0312_ Sensor Read ID OK \r\n"); + GC0312_Sensor_Init(); +#ifdef DEBUG_SENSOR_GC0312 + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static char buf[60 * 1024]; + + printk("gc0312 open debug\n"); + + fp = filp_open("/mnt/sdcard/gc0312_sd.txt", O_RDONLY, 0); + + if (IS_ERR(fp)) { + fromsd = 0; + printk("gc0312 open file error\n"); + } else { + fromsd = 1; + printk("gc0312 open file ok\n"); + + filp_close(fp, NULL); + set_fs(fs); + } + + if (fromsd == 1) { + printk("gc0312 open from t!\n"); + GC0312_Initialize_from_T_Flash(); + } else { + printk("gc0312 open not from t!\n"); + } + +#endif + GC0312_Write_More_Registers(); + + return ERROR_NONE; +} /* GC0312Open */ + + +/************************************************************************* + * FUNCTION + * GC0312Close + * + * DESCRIPTION + * This function is to turn off sensor module power. + * + * PARAMETERS + * None + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312Close(void) +{ + return ERROR_NONE; +} /* GC0312Close */ + + +/************************************************************************* + * FUNCTION + * GC0312Preview + * + * DESCRIPTION + * This function start the sensor preview. + * + * PARAMETERS + * *image_window : address pointer of pixel numbers in one period of HSYNC + * *sensor_config_data : address pointer of line numbers in one period of VSYNC + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + kal_uint32 iTemp; + kal_uint16 iStartX = 0, iStartY = 1; + + if (sensor_config_data->SensorOperationMode == MSDK_SENSOR_OPERATION_MODE_VIDEO) { /* MPEG4 Encode Mode */ + RETAILMSG(1, (TEXT("Camera Video preview\r\n"))); + GC0312_MPEG4_encode_mode = KAL_TRUE; + + } else { + RETAILMSG(1, (TEXT("Camera preview\r\n"))); + GC0312_MPEG4_encode_mode = KAL_FALSE; + } + + image_window->GrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + image_window->GrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + image_window->ExposureWindowWidth = IMAGE_SENSOR_PV_WIDTH; + image_window->ExposureWindowHeight = IMAGE_SENSOR_PV_HEIGHT; + + /* copy sensor_config_data */ + memcpy(&GC0312SensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* GC0312Preview */ + + +/************************************************************************* + * FUNCTION + * GC0312Capture + * + * DESCRIPTION + * This function setup the CMOS sensor in capture MY_OUTPUT mode + * + * PARAMETERS + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + GC0312_MODE_CAPTURE = KAL_TRUE; + + image_window->GrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + image_window->GrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + image_window->ExposureWindowWidth = IMAGE_SENSOR_FULL_WIDTH; + image_window->ExposureWindowHeight = IMAGE_SENSOR_FULL_HEIGHT; + + /* copy sensor_config_data */ + memcpy(&GC0312SensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* GC0312_Capture() */ + + + +UINT32 GC0312GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) +{ + pSensorResolution->SensorFullWidth = IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorFullHeight = IMAGE_SENSOR_FULL_HEIGHT; + pSensorResolution->SensorPreviewWidth = IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorPreviewHeight = IMAGE_SENSOR_PV_HEIGHT; + pSensorResolution->SensorVideoWidth = IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorVideoHeight = IMAGE_SENSOR_PV_HEIGHT; + return ERROR_NONE; +} /* GC0312GetResolution() */ + + +UINT32 GC0312GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + pSensorInfo->SensorPreviewResolutionX = IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY = IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX = IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY = IMAGE_SENSOR_FULL_HEIGHT; + + pSensorInfo->SensorCameraPreviewFrameRate = 30; + pSensorInfo->SensorVideoFrameRate = 30; + pSensorInfo->SensorStillCaptureFrameRate = 10; + pSensorInfo->SensorWebCamCaptureFrameRate = 15; + pSensorInfo->SensorResetActiveHigh = FALSE; + pSensorInfo->SensorResetDelayCount = 1; + pSensorInfo->SensorOutputDataFormat = SENSOR_OUTPUT_FORMAT_YUYV; + pSensorInfo->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorInterruptDelayLines = 1; + pSensorInfo->SensroInterfaceType = SENSOR_INTERFACE_TYPE_PARALLEL; + pSensorInfo->CaptureDelayFrame = 2; + pSensorInfo->PreviewDelayFrame = 2; + pSensorInfo->VideoDelayFrame = 4; + pSensorInfo->SensorMasterClockSwitch = 0; + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_4MA; + + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + default: + pSensorInfo->SensorClockFreq = 24; + pSensorInfo->SensorClockDividCount = 3; + pSensorInfo->SensorClockRisingCount = 0; + pSensorInfo->SensorClockFallingCount = 2; + pSensorInfo->SensorPixelClockCount = 3; + pSensorInfo->SensorDataLatchCount = 2; + pSensorInfo->SensorGrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + pSensorInfo->SensorGrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + break; + } + GC0312PixelClockDivider = pSensorInfo->SensorPixelClockCount; + memcpy(pSensorConfigData, &GC0312SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* GC0312GetInfo() */ + + +UINT32 GC0312Control(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + default: + GC0312Preview(pImageWindow, pSensorConfigData); + break; + } + + + return TRUE; +} /* GC0312Control() */ + +BOOL GC0312_set_Edge(UINT16 para) +{ + + switch (para) { + case ISP_EDGE_MIDDLE: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x95, 0x44); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_EDGE_HIGH: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x95, 0x99); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_EDGE_LOW: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x95, 0x00); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_set_HUE(UINT16 para) +{ + + switch (para) { + case ISP_HUE_MIDDLE: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x7a, 0x80); + GC0312_write_cmos_sensor(0x7b, 0x80); + GC0312_write_cmos_sensor(0x7c, 0x80); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_HUE_HIGH: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x7a, 0x88); + GC0312_write_cmos_sensor(0x7b, 0x88); + GC0312_write_cmos_sensor(0x7c, 0x80); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_HUE_LOW: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x7a, 0x80); + GC0312_write_cmos_sensor(0x7b, 0x80); + GC0312_write_cmos_sensor(0x7c, 0x88); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_set_Brightness(UINT16 para) +{ + + switch (para) { + case ISP_BRIGHT_MIDDLE: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd5, 0x00); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x39); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_BRIGHT_HIGH: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd5, 0x10); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x60); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_BRIGHT_LOW: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd5, 0xf8); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x30); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_set_Contrast(UINT16 para) +{ + + switch (para) { + case ISP_CONTRAST_MIDDLE: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd3, 0x42); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_CONTRAST_HIGH: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd3, 0x50); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_CONTRAST_LOW: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd3, 0x30); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_set_Saturation(UINT16 para) +{ + + switch (para) { + case ISP_SAT_MIDDLE: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd1, 0x30); + GC0312_write_cmos_sensor(0xd2, 0x2a); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_SAT_HIGH: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd1, 0x40); + GC0312_write_cmos_sensor(0xd2, 0x40); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_SAT_LOW: + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xd1, 0x20); + GC0312_write_cmos_sensor(0xd2, 0x20); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + + + + +BOOL GC0312_set_param_wb(UINT16 para) +{ + + switch (para) { + case AWB_MODE_OFF: + + break; + + case AWB_MODE_AUTO: + GC0312_awb_enable(KAL_TRUE); + break; + + case AWB_MODE_CLOUDY_DAYLIGHT: /* cloudy */ + GC0312_awb_enable(KAL_FALSE); + GC0312_write_cmos_sensor(0x77, 0x8c); /* WB_manual_gain */ + GC0312_write_cmos_sensor(0x78, 0x50); + GC0312_write_cmos_sensor(0x79, 0x40); + break; + + case AWB_MODE_DAYLIGHT: /* sunny */ + GC0312_awb_enable(KAL_FALSE); + GC0312_write_cmos_sensor(0x77, 0x74); + GC0312_write_cmos_sensor(0x78, 0x52); + GC0312_write_cmos_sensor(0x79, 0x40); + break; + + case AWB_MODE_INCANDESCENT: /* office */ + GC0312_awb_enable(KAL_FALSE); + GC0312_write_cmos_sensor(0x77, 0x48); + GC0312_write_cmos_sensor(0x78, 0x40); + GC0312_write_cmos_sensor(0x79, 0x5c); + break; + + case AWB_MODE_TUNGSTEN: /* home */ + GC0312_awb_enable(KAL_FALSE); + GC0312_write_cmos_sensor(0x77, 0x40); + GC0312_write_cmos_sensor(0x78, 0x54); + GC0312_write_cmos_sensor(0x79, 0x70); + break; + + case AWB_MODE_FLUORESCENT: + GC0312_awb_enable(KAL_FALSE); + GC0312_write_cmos_sensor(0x77, 0x40); + GC0312_write_cmos_sensor(0x78, 0x42); + GC0312_write_cmos_sensor(0x79, 0x50); + break; + + default: + return FALSE; + } + + return TRUE; +} /* GC0312_set_param_wb */ + + +BOOL GC0312_set_param_effect(UINT16 para) +{ + kal_uint32 ret = KAL_TRUE; + + switch (para) { + case MEFFECT_OFF: + GC0312_write_cmos_sensor(0x43, 0x00); + break; + + case MEFFECT_SEPIA: + GC0312_write_cmos_sensor(0x43, 0x02); + GC0312_write_cmos_sensor(0xda, 0xd0); + GC0312_write_cmos_sensor(0xdb, 0x28); + break; + + case MEFFECT_NEGATIVE: + GC0312_write_cmos_sensor(0x43, 0x01); + break; + + case MEFFECT_SEPIAGREEN: + GC0312_write_cmos_sensor(0x43, 0x02); + GC0312_write_cmos_sensor(0xda, 0xc0); + GC0312_write_cmos_sensor(0xdb, 0xc0); + break; + + case MEFFECT_SEPIABLUE: + GC0312_write_cmos_sensor(0x43, 0x02); + GC0312_write_cmos_sensor(0xda, 0x50); + GC0312_write_cmos_sensor(0xdb, 0xe0); + break; + + case MEFFECT_MONO: + GC0312_write_cmos_sensor(0x43, 0x02); + GC0312_write_cmos_sensor(0xda, 0x00); + GC0312_write_cmos_sensor(0xdb, 0x00); + break; + default: + ret = FALSE; + } + + return ret; + +} /* GC0312_set_param_effect */ + + +BOOL GC0312_set_param_banding(UINT16 para) +{ + switch (para) { + case AE_FLICKER_MODE_50HZ: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x0d, 0xf8); /*new exp 3*/ + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x05, 0x01);/*01*/ + GC0312_write_cmos_sensor(0x06, 0x18);/*89*/ + GC0312_write_cmos_sensor(0x07, 0x00); + GC0312_write_cmos_sensor(0x08, 0x10);/*22*/ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x25, 0x00); + GC0312_write_cmos_sensor(0x26, 0x9a); /*8a //step*/ + GC0312_write_cmos_sensor(0x27, 0x01); + GC0312_write_cmos_sensor(0x28, 0x34); /*2step level 1 3 30fps*/ + GC0312_write_cmos_sensor(0x29, 0x02); + GC0312_write_cmos_sensor(0x2a, 0x68); /*4step level 2 25 fps*/ + GC0312_write_cmos_sensor(0x2b, 0x04); + GC0312_write_cmos_sensor(0x2c, 0xd0); /*5step level 3 12.5*/ + GC0312_write_cmos_sensor(0x2d, 0x06); + GC0312_write_cmos_sensor(0x2e, 0x04); /*10step level 4 10*/ + GC0312_write_cmos_sensor(0x2f, 0x09); + GC0312_write_cmos_sensor(0x30, 0xa0); /*14step level 5 6.25fps*/ + GC0312_write_cmos_sensor(0x31, 0x0a); + GC0312_write_cmos_sensor(0x32, 0xd4); /*14 step level 6 5.5fps*/ + GC0312_write_cmos_sensor(0x33, 0x0c); + GC0312_write_cmos_sensor(0x34, 0x08); /* level 7 5*/ + GC0312_write_cmos_sensor(0x35, 0x08); /*2.25x level 1*/ + GC0312_write_cmos_sensor(0x36, 0x0d); /*3.5x level 2*/ + GC0312_write_cmos_sensor(0x37, 0x10); /*6x level 3*/ + GC0312_write_cmos_sensor(0x38, 0x14); /* level 4*/ + GC0312_write_cmos_sensor(0x39, 0x18); /* level 5*/ + GC0312_write_cmos_sensor(0x3a, 0x28); /* level 6*/ + GC0312_write_cmos_sensor(0x3b, 0x28); /* level 7 3.5x*/ + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case AE_FLICKER_MODE_60HZ: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x0d, 0xf8); /*new exp 3*/ + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x05, 0x01);/*01*/ + GC0312_write_cmos_sensor(0x06, 0x13);/*89*/ + GC0312_write_cmos_sensor(0x07, 0x00); + GC0312_write_cmos_sensor(0x08, 0x14);/*22*/ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x25, 0x00); + GC0312_write_cmos_sensor(0x26, 0x81); /*8a //step*/ + GC0312_write_cmos_sensor(0x27, 0x01); + GC0312_write_cmos_sensor(0x28, 0x83); /*2step level 1 30fps*/ + GC0312_write_cmos_sensor(0x29, 0x02); + GC0312_write_cmos_sensor(0x2a, 0x85); /*4step level 2 25 fps*/ + GC0312_write_cmos_sensor(0x2b, 0x05); + GC0312_write_cmos_sensor(0x2c, 0x0a); + GC0312_write_cmos_sensor(0x2d, 0x06); + GC0312_write_cmos_sensor(0x2e, 0x0c); /*10step level 4 17*/ + GC0312_write_cmos_sensor(0x2f, 0x09); + GC0312_write_cmos_sensor(0x30, 0x93); /*14step level 5 12fps*/ + GC0312_write_cmos_sensor(0x31, 0x0a); + GC0312_write_cmos_sensor(0x32, 0x95); /*14 step level 6 10fps*/ + GC0312_write_cmos_sensor(0x33, 0x0b); + GC0312_write_cmos_sensor(0x34, 0x97); /* level 7*/ + GC0312_write_cmos_sensor(0x35, 0x08); /*2.25x level 1*/ + GC0312_write_cmos_sensor(0x36, 0x0d); /*3.5x level 2*/ + GC0312_write_cmos_sensor(0x37, 0x10); /*6x level 3*/ + GC0312_write_cmos_sensor(0x38, 0x14); /* level 4*/ + GC0312_write_cmos_sensor(0x39, 0x18); /* level 5*/ + GC0312_write_cmos_sensor(0x3a, 0x28); /* level 6*/ + GC0312_write_cmos_sensor(0x3b, 0x28); /* level 7 3.5x*/ + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + default: + return FALSE; + } + + return TRUE; +} /* GC0312_set_param_banding */ + + +BOOL GC0312_set_param_exposure(UINT16 para) +{ + + + switch (para) { + case AE_EV_COMP_n30: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x20); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + case AE_EV_COMP_n20: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x28); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case AE_EV_COMP_n10: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x30); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + + + case AE_EV_COMP_00: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x39); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + + + case AE_EV_COMP_10: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x40); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + + case AE_EV_COMP_20: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x48); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + case AE_EV_COMP_30: + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x50); + GC0312_write_cmos_sensor(0xfe, 0x00); + break; + default: + return FALSE; + } + + return TRUE; +} /* GC0312_set_param_exposure */ + + +UINT32 GC0312YUVSetVideoMode(UINT16 u2FrameRate) /* lanking add */ +{ + + GC0312_MPEG4_encode_mode = KAL_TRUE; + if (u2FrameRate == 30) { + + /*********video frame ************/ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x0d, 0xf8); + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x05, 0x01); + GC0312_write_cmos_sensor(0x06, 0x18); + GC0312_write_cmos_sensor(0x07, 0x00); + GC0312_write_cmos_sensor(0x08, 0x10); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x25, 0x00); + GC0312_write_cmos_sensor(0x26, 0x9a); + GC0312_write_cmos_sensor(0x27, 0x01); + GC0312_write_cmos_sensor(0x28, 0x34); + GC0312_write_cmos_sensor(0x29, 0x02); + GC0312_write_cmos_sensor(0x2a, 0x68); + GC0312_write_cmos_sensor(0x2b, 0x03); + GC0312_write_cmos_sensor(0x2c, 0x02); + GC0312_write_cmos_sensor(0x2d, 0x03); + GC0312_write_cmos_sensor(0x2e, 0x9c); + GC0312_write_cmos_sensor(0x2f, 0x04); + GC0312_write_cmos_sensor(0x30, 0xd0); + GC0312_write_cmos_sensor(0x31, 0x04); + GC0312_write_cmos_sensor(0x32, 0xd0); + GC0312_write_cmos_sensor(0x33, 0x06); + GC0312_write_cmos_sensor(0x34, 0x04); + GC0312_write_cmos_sensor(0x35, 0x0d); + GC0312_write_cmos_sensor(0x36, 0x14); + GC0312_write_cmos_sensor(0x37, 0x18); + GC0312_write_cmos_sensor(0x38, 0x20); + GC0312_write_cmos_sensor(0x39, 0x30); + GC0312_write_cmos_sensor(0x3a, 0x30); + GC0312_write_cmos_sensor(0x3b, 0x30); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x35); + GC0312_write_cmos_sensor(0xfe, 0x00); + + } else if (u2FrameRate == 15) { + + /*********video frame ************/ + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x0d, 0xf8); + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0x05, 0x01); + GC0312_write_cmos_sensor(0x06, 0x18); + GC0312_write_cmos_sensor(0x07, 0x00); + GC0312_write_cmos_sensor(0x08, 0x10); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x25, 0x00); + GC0312_write_cmos_sensor(0x26, 0x9a); + GC0312_write_cmos_sensor(0x27, 0x01); + GC0312_write_cmos_sensor(0x28, 0x34); + GC0312_write_cmos_sensor(0x29, 0x02); + GC0312_write_cmos_sensor(0x2a, 0x68); + GC0312_write_cmos_sensor(0x2b, 0x03); + GC0312_write_cmos_sensor(0x2c, 0x02); + GC0312_write_cmos_sensor(0x2d, 0x03); + GC0312_write_cmos_sensor(0x2e, 0x9c); + GC0312_write_cmos_sensor(0x2f, 0x04); + GC0312_write_cmos_sensor(0x30, 0xd0); + GC0312_write_cmos_sensor(0x31, 0x04); + GC0312_write_cmos_sensor(0x32, 0xd0); + GC0312_write_cmos_sensor(0x33, 0x06); + GC0312_write_cmos_sensor(0x34, 0x04); + GC0312_write_cmos_sensor(0x35, 0x0d); + GC0312_write_cmos_sensor(0x36, 0x14); + GC0312_write_cmos_sensor(0x37, 0x18); + GC0312_write_cmos_sensor(0x38, 0x20); + GC0312_write_cmos_sensor(0x39, 0x30); + GC0312_write_cmos_sensor(0x3a, 0x30); + GC0312_write_cmos_sensor(0x3b, 0x30); + GC0312_write_cmos_sensor(0xfe, 0x01); + GC0312_write_cmos_sensor(0x13, 0x35); + GC0312_write_cmos_sensor(0xfe, 0x00); + + } else { + + SENSORDB("Wrong Frame Rate"); + + } + + return TRUE; + +} + + +UINT32 GC0312YUVSensorSetting(FEATURE_ID iCmd, UINT16 iPara) +{ + +#ifdef DEBUG_SENSOR_GC0312 + printk("______%s______ Tflash debug\n", __func__); + return TRUE; +#endif + + switch (iCmd) { + case FID_ISP_EDGE: + GC0312_set_Edge(iPara); + break; + case FID_ISP_HUE: + GC0312_set_HUE(iPara); + break; + case FID_ISP_BRIGHT: + GC0312_set_Brightness(iPara); + break; + case FID_ISP_CONTRAST: + GC0312_set_Contrast(iPara); + break; + case FID_ISP_SAT: + GC0312_set_Saturation(iPara); + break; + case FID_AWB_MODE: + GC0312_set_param_wb(iPara); + break; + case FID_COLOR_EFFECT: + GC0312_set_param_effect(iPara); + break; + case FID_AE_EV: + GC0312_set_param_exposure(iPara); + break; + case FID_AE_FLICKER: + GC0312_set_param_banding(iPara); + break; + case FID_SCENE_MODE: + GC0312NightMode(iPara); + break; + default: + break; + } + return TRUE; +} /* GC0312YUVSensorSetting */ + +UINT32 GC0312_SetTestPatternMode(kal_bool bEnable) +{ + SENSORDB("bEnable: %d", bEnable); + if (bEnable) { + GC0312_write_cmos_sensor(0xfe, 0x00); + GC0312_write_cmos_sensor(0xfa, 0x32); + GC0312_write_cmos_sensor(0x40, 0x08); + GC0312_write_cmos_sensor(0x41, 0x00); + GC0312_write_cmos_sensor(0x42, 0x00); + GC0312_write_cmos_sensor(0x4f, 0x00); + GC0312_write_cmos_sensor(0x18, 0x06); + GC0312_write_cmos_sensor(0x77, 0x40); + GC0312_write_cmos_sensor(0x78, 0x40); + GC0312_write_cmos_sensor(0x79, 0x40); + GC0312_write_cmos_sensor(0xd0, 0x40); + GC0312_write_cmos_sensor(0xdd, 0x00); + GC0312_write_cmos_sensor(0x71, 0x40); + GC0312_write_cmos_sensor(0x72, 0x40); + GC0312_write_cmos_sensor(0x03, 0x00); + GC0312_write_cmos_sensor(0x04, 0x00); + GC0312_write_cmos_sensor(0x4c, 0x01); + } else { + } + + return ERROR_NONE; +} + +void GC0312GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) +{ + *pFeatureReturnPara32 = 0; + SENSORDB("GC0312GetAFMaxNumFocusAreas, *pFeatureReturnPara32 = %d\n", + *pFeatureReturnPara32); + +} + + +void GC0312GetAFMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) +{ + *pFeatureReturnPara32 = 0; + SENSORDB("GC0312GetAFMaxNumMeteringAreas,*pFeatureReturnPara32 = %d\n", + *pFeatureReturnPara32); + +} + +void GC0312GetExifInfo(UINT32 exifAddr) +{ + + SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; + + GC0312_Read_Shutter(); + + /* + //pExifInfo->FNumber = 28; + //pExifInfo->AEISOSpeed = GC0312ExifInfo.AEISOSpeed; + //pExifInfo->FlashLightTimeus = 0; + //pExifInfo->RealISOValue = GC0312ExifInfo.RealISOValue; + //pExifInfo->AWBMode = GC0312ExifInfo.AWBMode; + */ + + pExifInfo->RealISOValue = GC0312ExifInfo.RealISOValue; + pExifInfo->CapExposureTime = GC0312ExifInfo.CapExposureTime*1000; + printk("GC0312ExifInfo.CapExposureTime is %d",GC0312ExifInfo.CapExposureTime); +} + +UINT32 GC0312FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara, UINT32 *pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16 = (UINT16 *) pFeaturePara; + UINT16 *pFeatureData16 = (UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32 = (UINT32 *) pFeaturePara; + UINT32 *pFeatureData32 = (UINT32 *) pFeaturePara; + UINT32 GC0312SensorRegNumber; + UINT32 i; + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData = (MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData = (MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + + RETAILMSG(1, (_T("gaiyang GC0312FeatureControl FeatureId=%d\r\n"), FeatureId)); + + switch (FeatureId) { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++ = IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16 = IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PERIOD: + *pFeatureReturnPara16++ = (VGA_PERIOD_PIXEL_NUMS) + GC0312_dummy_pixels; + *pFeatureReturnPara16 = (VGA_PERIOD_LINE_NUMS) + GC0312_dummy_lines; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + *pFeatureReturnPara32 = GC0312_g_fPV_PCLK; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_ESHUTTER: + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + /* GC0312NightMode((BOOL) *pFeatureData16); */ + break; + case SENSOR_FEATURE_SET_GAIN: + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + GC0312_isp_master_clock = *pFeatureData32; + break; + case SENSOR_FEATURE_SET_REGISTER: + GC0312_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = GC0312_read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pSensorConfigData, &GC0312SensorConfigData, + sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + *pFeatureParaLen = sizeof(MSDK_SENSOR_CONFIG_STRUCT); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + case SENSOR_FEATURE_GET_CCT_REGISTER: + case SENSOR_FEATURE_SET_ENG_REGISTER: + case SENSOR_FEATURE_GET_ENG_REGISTER: + case SENSOR_FEATURE_GET_REGISTER_DEFAULT: + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + case SENSOR_FEATURE_GET_GROUP_COUNT: + case SENSOR_FEATURE_GET_GROUP_INFO: + case SENSOR_FEATURE_GET_ITEM_INFO: + case SENSOR_FEATURE_SET_ITEM_INFO: + case SENSOR_FEATURE_GET_ENG_INFO: + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + /* get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE */ + /* if EEPROM does not exist in camera module. */ + *pFeatureReturnPara32 = LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_YUV_CMD: + GC0312YUVSensorSetting((FEATURE_ID) *pFeatureData32, *(pFeatureData32 + 1)); + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: /* lanking */ + GC0312YUVSetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + GC0312GetSensorID(pFeatureData32); + break; + case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: + GC0312GetAFMaxNumFocusAreas(pFeatureReturnPara32); + *pFeatureParaLen = 4; + break; + + case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: + GC0312GetAFMaxNumMeteringAreas(pFeatureReturnPara32); + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + GC0312_SetTestPatternMode((BOOL) *pFeatureData16); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: + *pFeatureReturnPara32 = GC0312_TEST_PATTERN_CHECKSUM; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_EXIF_INFO: + GC0312GetExifInfo(*pFeatureData32); + break; + default: + break; + } + return ERROR_NONE; +} /* GC0312FeatureControl() */ + + +SENSOR_FUNCTION_STRUCT SensorFuncGC0312YUV = { + GC0312Open, + GC0312GetInfo, + GC0312GetResolution, + GC0312FeatureControl, + GC0312Control, + GC0312Close +}; + + +UINT32 GC0312_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc != NULL) + *pfFunc = &SensorFuncGC0312YUV; + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Sensor.h new file mode 100644 index 00000000000..09e9e719fa6 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_Sensor.h @@ -0,0 +1,48 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef __GC0312_SENSOR_H +#define __GC0312_SENSOR_H + + +#define VGA_PERIOD_PIXEL_NUMS 694 +#define VGA_PERIOD_LINE_NUMS 488 + +#define IMAGE_SENSOR_VGA_GRAB_PIXELS 0 +#define IMAGE_SENSOR_VGA_GRAB_LINES 1 + +#define IMAGE_SENSOR_VGA_WIDTH (640) +#define IMAGE_SENSOR_VGA_HEIGHT (480) + +#define IMAGE_SENSOR_PV_WIDTH (IMAGE_SENSOR_VGA_WIDTH - 8) +#define IMAGE_SENSOR_PV_HEIGHT (IMAGE_SENSOR_VGA_HEIGHT - 6) + +#define IMAGE_SENSOR_FULL_WIDTH (IMAGE_SENSOR_VGA_WIDTH - 8) +#define IMAGE_SENSOR_FULL_HEIGHT (IMAGE_SENSOR_VGA_HEIGHT - 6) + +#define GC0312_WRITE_ID 0x42 +#define GC0312_READ_ID 0x43 + +// GC0312 SENSOR Chip ID: 0xb310 + +typedef enum +{ + GC0312_RGB_Gamma_m1 = 0, + GC0312_RGB_Gamma_m2, + GC0312_RGB_Gamma_m3, + GC0312_RGB_Gamma_m4, + GC0312_RGB_Gamma_m5, + GC0312_RGB_Gamma_m6, + GC0312_RGB_Gamma_night +}GC0312_GAMMA_TAG; + + + +UINT32 GC0312Open(void); +UINT32 GC0312Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC0312FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); +UINT32 GC0312GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC0312GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); +UINT32 GC0312Close(void); + +#endif /* __SENSOR_H */ + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_CameraCustomized.h new file mode 100755 index 00000000000..5c9637f3740 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_CameraCustomized.h @@ -0,0 +1,70 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#ifndef __CAMERA_CUSTOMIZED_H +#define __CAMERA_CUSTOMIZED_H + +// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 +#define MAIN_SENSOR_ORIENTATION_ANGLE 90 // 90 +#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist + + +// First, we think you hold the cell phone vertical. +// Second, we suppose the direction of upward is 0 +// Third, it is 90, 180, 270 in clockwise +// here we define the main sensor and sub sensor angles to deal with the jpeg orientation +#define MAIN_SENSOR_TO_PHONE_ANGLE 0 +#define SUB_SENSOR_TO_PHONE_ANGLE 0 + + +#define CAM_SIZE_QVGA_WIDTH 320 +#define CAM_SIZE_QVGA_HEIGHT 240 +#define CAM_SIZE_VGA_WIDTH 640 +#define CAM_SIZE_VGA_HEIGHT 480 +#define CAM_SIZE_05M_WIDTH 800 +#define CAM_SIZE_05M_HEIGHT 600 +#define CAM_SIZE_1M_WIDTH 1280 +#define CAM_SIZE_1M_HEIGHT 960 +#define CAM_SIZE_2M_WIDTH 1600 +#define CAM_SIZE_2M_HEIGHT 1200 +#define CAM_SIZE_3M_WIDTH 2048 +#define CAM_SIZE_3M_HEIGHT 1536 +#define CAM_SIZE_5M_WIDTH 2592 +#define CAM_SIZE_5M_HEIGHT 1944 + +// for main sensor +#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 +#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 +#define MAIN_NUM_OF_STILL_RESOLUTION 7 +#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} +#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} +#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ + {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ + // {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ + // {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ + // {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ + // {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ + // {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} + +// if sub sensor does not exist, set all the parameters as 0 +#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 +#define SUB_NUM_OF_VIDEO_RESOLUTION 0 +#define SUB_NUM_OF_STILL_RESOLUTION 0 +#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} +#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} +#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} + +//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) +//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) +//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) + +#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Camera_Sensor_para.h new file mode 100755 index 00000000000..c9c64c16ab8 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Camera_Sensor_para.h @@ -0,0 +1,66 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +/* SENSOR FULL SIZE */ +#ifndef __CAMERA_SENSOR_PARA_H +#define __CAMERA_SENSOR_PARA_H + +#define CAMERA_SENSOR_REG_DEFAULT_VALUE \ + /* ARRAY: SENSOR.reg[11] */\ + {\ + /* STRUCT: SENSOR.reg[0] */\ + {\ + /* SENSOR.reg[0].addr */ 0x00000304, /* SENSOR.reg[0].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[1] */\ + {\ + /* SENSOR.reg[1].addr */ 0x00000305, /* SENSOR.reg[1].para */ 0x0000000D\ + },\ + /* STRUCT: SENSOR.reg[2] */\ + {\ + /* SENSOR.reg[2].addr */ 0x00000306, /* SENSOR.reg[2].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[3] */\ + {\ + /* SENSOR.reg[3].addr */ 0x00000307, /* SENSOR.reg[3].para */ 0x000000C0\ + },\ + /* STRUCT: SENSOR.reg[4] */\ + {\ + /* SENSOR.reg[4].addr */ 0x00000300, /* SENSOR.reg[4].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[5] */\ + {\ + /* SENSOR.reg[5].addr */ 0x00000301, /* SENSOR.reg[5].para */ 0x00000004\ + },\ + /* STRUCT: SENSOR.reg[6] */\ + {\ + /* SENSOR.reg[6].addr */ 0x0000030A, /* SENSOR.reg[6].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[7] */\ + {\ + /* SENSOR.reg[7].addr */ 0x0000030B, /* SENSOR.reg[7].para */ 0x00000002\ + },\ + /* STRUCT: SENSOR.reg[8] */\ + {\ + /* SENSOR.reg[8].addr */ 0x00000308, /* SENSOR.reg[8].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[9] */\ + {\ + /* SENSOR.reg[9].addr */ 0x00000309, /* SENSOR.reg[9].para */ 0x00000008\ + },\ + /* STRUCT: SENSOR.reg[10] */\ + {\ + /* SENSOR.reg[10].addr */ 0xFFFFFFFF, /* SENSOR.reg[10].para */ 0x00000001\ + }\ + } + +#define CAMERA_SENSOR_CCT_DEFAULT_VALUE {{ 0xFFFFFFFF, 0x08 } ,{ 0x0209, 0x0008 } ,{ 0x0207, 0x0008 } ,{ 0x020D, 0x0008 } ,{ 0x020B, 0x0008 }} +#endif /* __CAMERA_SENSOR_PARA_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Sensor.c new file mode 100755 index 00000000000..f0395278105 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Sensor.c @@ -0,0 +1,2260 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" +#include "kd_camera_feature.h" + +#include "gc0312yuv_blx_Sensor.h" +#include "gc0312yuv_blx_Camera_Sensor_para.h" +#include "gc0312yuv_blx_CameraCustomized.h" + +/* #define GC0312_BLXYUV_DEBUG */ +#ifdef GC0312_BLXYUV_DEBUG +#define SENSORDB printk +#else +#define SENSORDB(x, ...) +#endif + +#define GC0312_BLX_TEST_PATTERN_CHECKSUM (0x2c967597) + +/*#define DEBUG_SENSOR_GC0312_BLX//T_flash Tuning*/ +static kal_uint16 moduleid = 0x00; + +extern int iReadRegI2C(u8 *a_pSendData, u16 a_sizeSendData, u8 *a_pRecvData, u16 a_sizeRecvData, + u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData, u16 a_sizeSendData, u16 i2cId); + +kal_uint16 GC0312_BLX_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) +{ + char puSendCmd[2] = { (char)(addr & 0xFF), (char)(para & 0xFF) }; + + iWriteRegI2C(puSendCmd, 2, GC0312_BLX_WRITE_ID); + +} + +kal_uint16 GC0312_BLX_read_cmos_sensor(kal_uint8 addr) +{ + kal_uint16 get_byte = 0; + char puSendCmd = { (char)(addr & 0xFF) }; + iReadRegI2C(&puSendCmd, 1, (u8 *) &get_byte, 1, GC0312_BLX_WRITE_ID); + + return get_byte; +} + + +#ifdef DEBUG_SENSOR_GC0312_BLX +#define gc0312_OP_CODE_INI 0x00 /* Initial value. */ +#define gc0312_OP_CODE_REG 0x01 /* Register */ +#define gc0312_OP_CODE_DLY 0x02 /* Delay */ +#define gc0312_OP_CODE_END 0x03 /* End of initial setting. */ +static kal_uint16 fromsd; + +typedef struct { + u16 init_reg; + u16 init_val; /* Save the register value and delay tick */ + u8 op_code; /* 0 - Initial value, 1 - Register, 2 - Delay, 3 - End of setting. */ +} gc0312_initial_set_struct; + +gc0312_initial_set_struct gc0312_Init_Reg[5000]; + +static u32 strtol(const char *nptr, u8 base) +{ + + printk("gc0312___%s____\n", __func__); + + u8 ret; + if (!nptr || (base != 16 && base != 10 && base != 8)) { + printk("gc0312 %s(): NULL pointer input\n", __func__); + return -1; + } + for (ret = 0; *nptr; nptr++) { + if ((base == 16 && *nptr >= 'A' && *nptr <= 'F') || + (base == 16 && *nptr >= 'a' && *nptr <= 'f') || + (base >= 10 && *nptr >= '0' && *nptr <= '9') || + (base >= 8 && *nptr >= '0' && *nptr <= '7')) { + ret *= base; + if (base == 16 && *nptr >= 'A' && *nptr <= 'F') + ret += *nptr - 'A' + 10; + else if (base == 16 && *nptr >= 'a' && *nptr <= 'f') + ret += *nptr - 'a' + 10; + else if (base >= 10 && *nptr >= '0' && *nptr <= '9') + ret += *nptr - '0'; + else if (base >= 8 && *nptr >= '0' && *nptr <= '7') + ret += *nptr - '0'; + } else + return ret; + } + return ret; +} + +static u8 GC0312_BLX_Initialize_from_T_Flash(void) +{ + /* FS_HANDLE fp = -1; /* Default, no file opened. */ */ + /* u8 *data_buff = NULL; */ + u8 *curr_ptr = NULL; + u32 file_size = 0; + /* u32 bytes_read = 0; */ + u32 i = 0, j = 0; + u8 func_ind[4] = { 0 }; /* REG or DLY */ + + printk("gc0312 ___%s____ start\n", __func__); + + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static u8 data_buff[10 * 1024]; + + fp = filp_open("/mnt/sdcard/gc0312_sd.txt", O_RDONLY, 0); + if (IS_ERR(fp)) { + /* printk("0312 create file error,IS_ERR(fp)=%s\n",IS_ERR(fp)); */ + return -1; + } else { + /* printk("0312 create file error,IS_ERR(fp)=%s\n",IS_ERR(fp)); */ + } + fs = get_fs(); + set_fs(KERNEL_DS); + + file_size = vfs_llseek(fp, 0, SEEK_END); + vfs_read(fp, data_buff, file_size, &pos); + /* printk("%s %d %d\n", buf,iFileLen,pos); */ + filp_close(fp, NULL); + set_fs(fs); + + /* Start parse the setting witch read from t-flash. */ + curr_ptr = data_buff; + while (curr_ptr < (data_buff + file_size)) { + while ((*curr_ptr == ' ') || (*curr_ptr == '\t')) /* Skip the Space & TAB */ + curr_ptr++; + + if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '*')) { + while (!(((*curr_ptr) == '*') && ((*(curr_ptr + 1)) == '/'))) { + curr_ptr++; /* Skip block comment code. */ + } + + while (!((*curr_ptr == 0x0D) && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue; + } + + if (((*curr_ptr) == '/') || ((*curr_ptr) == '{') || ((*curr_ptr) == '}')) { /* Comment line, skip it. */ + while (!((*curr_ptr == 0x0D) && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue; + } + /* This just content one enter line. */ + if (((*curr_ptr) == 0x0D) && ((*(curr_ptr + 1)) == 0x0A)) { + curr_ptr += 2; + continue; + } + /* printk(" curr_ptr1 = %s\n",curr_ptr); */ + memcpy(func_ind, curr_ptr, 3); + + + if (strcmp((const char *)func_ind, "REG") == 0) { /* REG */ + curr_ptr += 6; /* Skip "REG(0x" or "DLY(" */ + gc0312_Init_Reg[i].op_code = gc0312_OP_CODE_REG; + + gc0312_Init_Reg[i].init_reg = strtol((const char *)curr_ptr, 16); + curr_ptr += 5; /* Skip "00, 0x" */ + + gc0312_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 16); + curr_ptr += 4; /* Skip "00);" */ + + } else { /* DLY */ + + /* Need add delay for this setting. */ + curr_ptr += 4; + gc0312_Init_Reg[i].op_code = gc0312_OP_CODE_DLY; + + gc0312_Init_Reg[i].init_reg = 0xFF; + gc0312_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 10); /* Get the delay ticks, the delay should less then 50 */ + } + i++; + + + /* Skip to next line directly. */ + while (!((*curr_ptr == 0x0D) && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + curr_ptr += 2; + } + + /* (0xFFFF, 0xFFFF) means the end of initial setting. */ + gc0312_Init_Reg[i].op_code = gc0312_OP_CODE_END; + gc0312_Init_Reg[i].init_reg = 0xFF; + gc0312_Init_Reg[i].init_val = 0xFF; + i++; + /* for (j=0; j0xd0) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_100; + else if (t_gain >0x70) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_200; + else if (t_gain >0x20) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_400; + else + GC0312_BLXExifInfo.RealISOValue = AE_ISO_800; + + /* + GC0312_BLX_write_cmos_sensor(0xfe,0x00); + analog_gain= GC0312_BLX_read_cmos_sensor(0x48); + pre_gain = GC0312_BLX_read_cmos_sensor(0x71); + post_gain = GC0312_BLX_read_cmos_sensor(0x72); + total_gain=analog_gain*pre_gain*post_gain; + printk("GC0312_BLXExifInfo analog=%d,pre=%d,post=%d,total=%d",analog_gain,pre_gain,post_gain,total_gain); + + if (total_gain <170000) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_100; + else if (total_gain <330000) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_200; + else if (total_gain <570000) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_400; + else + GC0312_BLXExifInfo.RealISOValue = AE_ISO_800; + */ + + /* + if (shutter_iso <40) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_100; + else if (shutter_iso<55) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_200; + else if (shutter_iso<105) + GC0312_BLXExifInfo.RealISOValue = AE_ISO_400; + else + GC0312_BLXExifInfo.RealISOValue = AE_ISO_800; + */ + + return shutter; +} /* GC0312_BLX_read_shutter */ + + +/************************************************************************* + * FUNCTION + * GC0312_BLX_write_reg + * + * DESCRIPTION + * This function set the register of GC0312_BLX. + * + * PARAMETERS + * addr : the register index of GC0312_BLX + * para : setting parameter of the specified register of GC0312_BLX + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +void GC0312_BLX_write_reg(kal_uint32 addr, kal_uint32 para) +{ + GC0312_BLX_write_cmos_sensor(addr, para); +} /* GC0312_BLX_write_reg() */ + + +/************************************************************************* + * FUNCTION + * GC0312_BLX_read_cmos_sensor + * + * DESCRIPTION + * This function read parameter of specified register from GC0312_BLX. + * + * PARAMETERS + * addr : the register index of GC0312_BLX + * + * RETURNS + * the data that read from GC0312_BLX + * + * GLOBALS AFFECTED + * + *************************************************************************/ +kal_uint32 GC0312_BLX_read_reg(kal_uint32 addr) +{ + return GC0312_BLX_read_cmos_sensor(addr); +} /* OV7670_read_reg() */ + + +/************************************************************************* +* FUNCTION +* GC0312_BLX_awb_enable +* +* DESCRIPTION +* This function enable or disable the awb (Auto White Balance). +* +* PARAMETERS +* 1. kal_bool : KAL_TRUE - enable awb, KAL_FALSE - disable awb. +* +* RETURNS +* kal_bool : It means set awb right or not. +* +*************************************************************************/ +static void GC0312_BLX_awb_enable(kal_bool enalbe) +{ + kal_uint16 temp_AWB_reg = 0; + + temp_AWB_reg = GC0312_BLX_read_cmos_sensor(0x42); + + if (enalbe) { + GC0312_BLX_write_cmos_sensor(0x42, (temp_AWB_reg | 0x02)); + } else { + GC0312_BLX_write_cmos_sensor(0x42, (temp_AWB_reg & (~0x02))); + } + +} + + +/************************************************************************* +* FUNCTION +* GC0312_BLX_GAMMA_Select +* +* DESCRIPTION +* This function is served for FAE to select the appropriate GAMMA curve. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void GC0312_BLXGammaSelect(kal_uint32 GammaLvl) +{ + switch (GammaLvl) { + case GC0312_BLX_RGB_Gamma_m1: /* smallest gamma curve */ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xbf, 0x06); + GC0312_BLX_write_cmos_sensor(0xc0, 0x12); + GC0312_BLX_write_cmos_sensor(0xc1, 0x22); + GC0312_BLX_write_cmos_sensor(0xc2, 0x35); + GC0312_BLX_write_cmos_sensor(0xc3, 0x4b); + GC0312_BLX_write_cmos_sensor(0xc4, 0x5f); + GC0312_BLX_write_cmos_sensor(0xc5, 0x72); + GC0312_BLX_write_cmos_sensor(0xc6, 0x8d); + GC0312_BLX_write_cmos_sensor(0xc7, 0xa4); + GC0312_BLX_write_cmos_sensor(0xc8, 0xb8); + GC0312_BLX_write_cmos_sensor(0xc9, 0xc8); + GC0312_BLX_write_cmos_sensor(0xca, 0xd4); + GC0312_BLX_write_cmos_sensor(0xcb, 0xde); + GC0312_BLX_write_cmos_sensor(0xcc, 0xe6); + GC0312_BLX_write_cmos_sensor(0xcd, 0xf1); + GC0312_BLX_write_cmos_sensor(0xce, 0xf8); + GC0312_BLX_write_cmos_sensor(0xcf, 0xfd); + break; + case GC0312_BLX_RGB_Gamma_m2: + GC0312_BLX_write_cmos_sensor(0xBF, 0x08); + GC0312_BLX_write_cmos_sensor(0xc0, 0x0F); + GC0312_BLX_write_cmos_sensor(0xc1, 0x21); + GC0312_BLX_write_cmos_sensor(0xc2, 0x32); + GC0312_BLX_write_cmos_sensor(0xc3, 0x43); + GC0312_BLX_write_cmos_sensor(0xc4, 0x50); + GC0312_BLX_write_cmos_sensor(0xc5, 0x5E); + GC0312_BLX_write_cmos_sensor(0xc6, 0x78); + GC0312_BLX_write_cmos_sensor(0xc7, 0x90); + GC0312_BLX_write_cmos_sensor(0xc8, 0xA6); + GC0312_BLX_write_cmos_sensor(0xc9, 0xB9); + GC0312_BLX_write_cmos_sensor(0xcA, 0xC9); + GC0312_BLX_write_cmos_sensor(0xcB, 0xD6); + GC0312_BLX_write_cmos_sensor(0xcC, 0xE0); + GC0312_BLX_write_cmos_sensor(0xcD, 0xEE); + GC0312_BLX_write_cmos_sensor(0xcE, 0xF8); + GC0312_BLX_write_cmos_sensor(0xcF, 0xFF); + break; + + case GC0312_BLX_RGB_Gamma_m3: + GC0312_BLX_write_cmos_sensor(0xbf, 0x0b); + GC0312_BLX_write_cmos_sensor(0xc0, 0x17); + GC0312_BLX_write_cmos_sensor(0xc1, 0x2a); + GC0312_BLX_write_cmos_sensor(0xc2, 0x41); + GC0312_BLX_write_cmos_sensor(0xc3, 0x54); + GC0312_BLX_write_cmos_sensor(0xc4, 0x66); + GC0312_BLX_write_cmos_sensor(0xc5, 0x74); + GC0312_BLX_write_cmos_sensor(0xc6, 0x8c); + GC0312_BLX_write_cmos_sensor(0xc7, 0xa3); + GC0312_BLX_write_cmos_sensor(0xc8, 0xb5); + GC0312_BLX_write_cmos_sensor(0xc9, 0xc4); + GC0312_BLX_write_cmos_sensor(0xca, 0xd0); + GC0312_BLX_write_cmos_sensor(0xcb, 0xdb); + GC0312_BLX_write_cmos_sensor(0xcc, 0xe5); + GC0312_BLX_write_cmos_sensor(0xcd, 0xf0); + GC0312_BLX_write_cmos_sensor(0xce, 0xf7); + GC0312_BLX_write_cmos_sensor(0xcf, 0xff); + break; + + case GC0312_BLX_RGB_Gamma_m4: + GC0312_BLX_write_cmos_sensor(0xBF, 0x0E); + GC0312_BLX_write_cmos_sensor(0xc0, 0x1C); + GC0312_BLX_write_cmos_sensor(0xc1, 0x34); + GC0312_BLX_write_cmos_sensor(0xc2, 0x48); + GC0312_BLX_write_cmos_sensor(0xc3, 0x5A); + GC0312_BLX_write_cmos_sensor(0xc4, 0x6B); + GC0312_BLX_write_cmos_sensor(0xc5, 0x7B); + GC0312_BLX_write_cmos_sensor(0xc6, 0x95); + GC0312_BLX_write_cmos_sensor(0xc7, 0xAB); + GC0312_BLX_write_cmos_sensor(0xc8, 0xBF); + GC0312_BLX_write_cmos_sensor(0xc9, 0xCE); + GC0312_BLX_write_cmos_sensor(0xcA, 0xD9); + GC0312_BLX_write_cmos_sensor(0xcB, 0xE4); + GC0312_BLX_write_cmos_sensor(0xcC, 0xEC); + GC0312_BLX_write_cmos_sensor(0xcD, 0xF7); + GC0312_BLX_write_cmos_sensor(0xcE, 0xFD); + GC0312_BLX_write_cmos_sensor(0xcF, 0xFF); + break; + + case GC0312_BLX_RGB_Gamma_m5: + GC0312_BLX_write_cmos_sensor(0xBF, 0x10); + GC0312_BLX_write_cmos_sensor(0xc0, 0x20); + GC0312_BLX_write_cmos_sensor(0xc1, 0x38); + GC0312_BLX_write_cmos_sensor(0xc2, 0x4E); + GC0312_BLX_write_cmos_sensor(0xc3, 0x63); + GC0312_BLX_write_cmos_sensor(0xc4, 0x76); + GC0312_BLX_write_cmos_sensor(0xc5, 0x87); + GC0312_BLX_write_cmos_sensor(0xc6, 0xA2); + GC0312_BLX_write_cmos_sensor(0xc7, 0xB8); + GC0312_BLX_write_cmos_sensor(0xc8, 0xCA); + GC0312_BLX_write_cmos_sensor(0xc9, 0xD8); + GC0312_BLX_write_cmos_sensor(0xcA, 0xE3); + GC0312_BLX_write_cmos_sensor(0xcB, 0xEB); + GC0312_BLX_write_cmos_sensor(0xcC, 0xF0); + GC0312_BLX_write_cmos_sensor(0xcD, 0xF8); + GC0312_BLX_write_cmos_sensor(0xcE, 0xFD); + GC0312_BLX_write_cmos_sensor(0xcF, 0xFF); + break; + + case GC0312_BLX_RGB_Gamma_m6: /* largest gamma curve */ + GC0312_BLX_write_cmos_sensor(0xBF, 0x14); + GC0312_BLX_write_cmos_sensor(0xc0, 0x28); + GC0312_BLX_write_cmos_sensor(0xc1, 0x44); + GC0312_BLX_write_cmos_sensor(0xc2, 0x5D); + GC0312_BLX_write_cmos_sensor(0xc3, 0x72); + GC0312_BLX_write_cmos_sensor(0xc4, 0x86); + GC0312_BLX_write_cmos_sensor(0xc5, 0x95); + GC0312_BLX_write_cmos_sensor(0xc6, 0xB1); + GC0312_BLX_write_cmos_sensor(0xc7, 0xC6); + GC0312_BLX_write_cmos_sensor(0xc8, 0xD5); + GC0312_BLX_write_cmos_sensor(0xc9, 0xE1); + GC0312_BLX_write_cmos_sensor(0xcA, 0xEA); + GC0312_BLX_write_cmos_sensor(0xcB, 0xF1); + GC0312_BLX_write_cmos_sensor(0xcC, 0xF5); + GC0312_BLX_write_cmos_sensor(0xcD, 0xFB); + GC0312_BLX_write_cmos_sensor(0xcE, 0xFE); + GC0312_BLX_write_cmos_sensor(0xcF, 0xFF); + break; + case GC0312_BLX_RGB_Gamma_night: /* Gamma for night mode */ + GC0312_BLX_write_cmos_sensor(0xBF, 0x0B); + GC0312_BLX_write_cmos_sensor(0xc0, 0x16); + GC0312_BLX_write_cmos_sensor(0xc1, 0x29); + GC0312_BLX_write_cmos_sensor(0xc2, 0x3C); + GC0312_BLX_write_cmos_sensor(0xc3, 0x4F); + GC0312_BLX_write_cmos_sensor(0xc4, 0x5F); + GC0312_BLX_write_cmos_sensor(0xc5, 0x6F); + GC0312_BLX_write_cmos_sensor(0xc6, 0x8A); + GC0312_BLX_write_cmos_sensor(0xc7, 0x9F); + GC0312_BLX_write_cmos_sensor(0xc8, 0xB4); + GC0312_BLX_write_cmos_sensor(0xc9, 0xC6); + GC0312_BLX_write_cmos_sensor(0xcA, 0xD3); + GC0312_BLX_write_cmos_sensor(0xcB, 0xDD); + GC0312_BLX_write_cmos_sensor(0xcC, 0xE5); + GC0312_BLX_write_cmos_sensor(0xcD, 0xF1); + GC0312_BLX_write_cmos_sensor(0xcE, 0xFA); + GC0312_BLX_write_cmos_sensor(0xcF, 0xFF); + break; + default: + /* GC0312_BLX_RGB_Gamma_m3 */ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xbf, 0x0b); + GC0312_BLX_write_cmos_sensor(0xc0, 0x17); + GC0312_BLX_write_cmos_sensor(0xc1, 0x2a); + GC0312_BLX_write_cmos_sensor(0xc2, 0x41); + GC0312_BLX_write_cmos_sensor(0xc3, 0x54); + GC0312_BLX_write_cmos_sensor(0xc4, 0x66); + GC0312_BLX_write_cmos_sensor(0xc5, 0x74); + GC0312_BLX_write_cmos_sensor(0xc6, 0x8c); + GC0312_BLX_write_cmos_sensor(0xc7, 0xa3); + GC0312_BLX_write_cmos_sensor(0xc8, 0xb5); + GC0312_BLX_write_cmos_sensor(0xc9, 0xc4); + GC0312_BLX_write_cmos_sensor(0xca, 0xd0); + GC0312_BLX_write_cmos_sensor(0xcb, 0xdb); + GC0312_BLX_write_cmos_sensor(0xcc, 0xe5); + GC0312_BLX_write_cmos_sensor(0xcd, 0xf0); + GC0312_BLX_write_cmos_sensor(0xce, 0xf7); + GC0312_BLX_write_cmos_sensor(0xcf, 0xff); + break; + } +} + + +/************************************************************************* + * FUNCTION + * GC0312_BLX_config_window + * + * DESCRIPTION + * This function config the hardware window of GC0312_BLX for getting specified + * data of that window. + * + * PARAMETERS + * start_x : start column of the interested window + * start_y : start row of the interested window + * width : column widht of the itnerested window + * height : row depth of the itnerested window + * + * RETURNS + * the data that read from GC0312_BLX + * + * GLOBALS AFFECTED + * + *************************************************************************/ +void GC0312_BLX_config_window(kal_uint16 startx, kal_uint16 starty, kal_uint16 width, kal_uint16 height) +{ +} /* GC0312_BLX_config_window */ + + +/************************************************************************* + * FUNCTION + * GC0312_BLX_SetGain + * + * DESCRIPTION + * This function is to set global gain to sensor. + * + * PARAMETERS + * iGain : sensor global gain(base: 0x40) + * + * RETURNS + * the actually gain set to sensor. + * + * GLOBALS AFFECTED + * + *************************************************************************/ +kal_uint16 GC0312_BLX_SetGain(kal_uint16 iGain) +{ + return iGain; +} + + +/************************************************************************* + * FUNCTION + * GC0312_BLX_NightMode + * + * DESCRIPTION + * This function night mode of GC0312_BLX. + * + * PARAMETERS + * bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +void GC0312_BLXNightMode(kal_bool bEnable) +{ + #if 0 + if (bEnable) { + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + if (GC0312_BLX_MPEG4_encode_mode == KAL_TRUE) + GC0312_BLX_write_cmos_sensor(0x3c, 0x30); + else + GC0312_BLX_write_cmos_sensor(0x3c, 0x30); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + /* GC0312_BLXGammaSelect(GC0312_BLX_RGB_Gamma_night); */ + GC0312_BLX_NIGHT_MODE = KAL_TRUE; + } else { + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + if (GC0312_BLX_MPEG4_encode_mode == KAL_TRUE) { + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x0d, 0xf8); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x05, 0x01); + GC0312_BLX_write_cmos_sensor(0x06, 0x18); + GC0312_BLX_write_cmos_sensor(0x07, 0x00); + GC0312_BLX_write_cmos_sensor(0x08, 0x10); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x25, 0x00); + GC0312_BLX_write_cmos_sensor(0x26, 0x9a); + GC0312_BLX_write_cmos_sensor(0x27, 0x01); + GC0312_BLX_write_cmos_sensor(0x28, 0x34); + GC0312_BLX_write_cmos_sensor(0x29, 0x02); + GC0312_BLX_write_cmos_sensor(0x2a, 0x68); + GC0312_BLX_write_cmos_sensor(0x2b, 0x03); + GC0312_BLX_write_cmos_sensor(0x2c, 0x02); + GC0312_BLX_write_cmos_sensor(0x2d, 0x03); + GC0312_BLX_write_cmos_sensor(0x2e, 0x9c); + GC0312_BLX_write_cmos_sensor(0x2f, 0x04); + GC0312_BLX_write_cmos_sensor(0x30, 0xd0); + GC0312_BLX_write_cmos_sensor(0x31, 0x04); + GC0312_BLX_write_cmos_sensor(0x32, 0xd0); + GC0312_BLX_write_cmos_sensor(0x33, 0x06); + GC0312_BLX_write_cmos_sensor(0x34, 0x04); + GC0312_BLX_write_cmos_sensor(0x35, 0x0d); + GC0312_BLX_write_cmos_sensor(0x36, 0x14); + GC0312_BLX_write_cmos_sensor(0x37, 0x18); + GC0312_BLX_write_cmos_sensor(0x38, 0x20); + GC0312_BLX_write_cmos_sensor(0x39, 0x30); + GC0312_BLX_write_cmos_sensor(0x3a, 0x30); + GC0312_BLX_write_cmos_sensor(0x3b, 0x30); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x35); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + } else { + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x0d, 0xf8); /*new exp 3*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x05, 0x01);/*01*/ + GC0312_BLX_write_cmos_sensor(0x06, 0x18);/*89*/ + GC0312_BLX_write_cmos_sensor(0x07, 0x00); + GC0312_BLX_write_cmos_sensor(0x08, 0x10);/*22*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x25, 0x00); + GC0312_BLX_write_cmos_sensor(0x26, 0x9a); /*8a //step*/ + GC0312_BLX_write_cmos_sensor(0x27, 0x01); + GC0312_BLX_write_cmos_sensor(0x28, 0x34); /*2step level 1 30fps*/ + GC0312_BLX_write_cmos_sensor(0x29, 0x02); + GC0312_BLX_write_cmos_sensor(0x2a, 0x68); /*4step level 2 25 fps*/ + GC0312_BLX_write_cmos_sensor(0x2b, 0x04); + GC0312_BLX_write_cmos_sensor(0x2c, 0xd0); /*5step level 3 20*/ + GC0312_BLX_write_cmos_sensor(0x2d, 0x06); + GC0312_BLX_write_cmos_sensor(0x2e, 0x04); /*10step level 4 17*/ + GC0312_BLX_write_cmos_sensor(0x2f, 0x09); + GC0312_BLX_write_cmos_sensor(0x30, 0x04); /*14step level 5 12fps*/ + GC0312_BLX_write_cmos_sensor(0x31, 0x09); + GC0312_BLX_write_cmos_sensor(0x32, 0x04); /*14 step level 6 10fps*/ + GC0312_BLX_write_cmos_sensor(0x33, 0x09); + GC0312_BLX_write_cmos_sensor(0x34, 0x08); /* level 7*/ + GC0312_BLX_write_cmos_sensor(0x35, 0x08); /*2.25x level 1*/ + GC0312_BLX_write_cmos_sensor(0x36, 0x0d); /*3.5x level 2*/ + GC0312_BLX_write_cmos_sensor(0x37, 0x10); /*6x level 3*/ + GC0312_BLX_write_cmos_sensor(0x38, 0x14); /* level 4*/ + GC0312_BLX_write_cmos_sensor(0x39, 0x18); /* level 5*/ + GC0312_BLX_write_cmos_sensor(0x3a, 0x28); /* level 6*/ + GC0312_BLX_write_cmos_sensor(0x3b, 0x28); /* level 7 3.5x*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x39); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + } + + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + /* GC0312_BLXGammaSelect(GC0312_BLX_RGB_Gamma_m3); */ + GC0312_BLX_NIGHT_MODE = KAL_FALSE; + } + #endif +} /* GC0312_NightMode */ + +/************************************************************************* +* FUNCTION +* GC0312_BLX_Sensor_Init +* +* DESCRIPTION +* This function apply all of the initial setting to sensor. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +*************************************************************************/ +void GC0312_BLX_Sensor_Init(void) +{ + /*///////////// Version_2016/09/08 /////////////*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0xf0); + GC0312_BLX_write_cmos_sensor(0xfe, 0xf0); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xfc, 0x0e); + GC0312_BLX_write_cmos_sensor(0xfc, 0x0e); + GC0312_BLX_write_cmos_sensor(0xf2, 0x07); + GC0312_BLX_write_cmos_sensor(0xf3, 0x00); + GC0312_BLX_write_cmos_sensor(0xf7, 0x1b); + GC0312_BLX_write_cmos_sensor(0xf8, 0x04); + GC0312_BLX_write_cmos_sensor(0xf9, 0x0e); + GC0312_BLX_write_cmos_sensor(0xfa, 0x11); + + /* /////////////////////////////////////////// */ + /* /// CISCTL GC0312_write_cmos_sensor //// */ + /* /////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0x00, 0x2f); + GC0312_BLX_write_cmos_sensor(0x01, 0x0f); + GC0312_BLX_write_cmos_sensor(0x02, 0x04); + GC0312_BLX_write_cmos_sensor(0x03, 0x02); + GC0312_BLX_write_cmos_sensor(0x04, 0x68); + GC0312_BLX_write_cmos_sensor(0x09, 0x00); + GC0312_BLX_write_cmos_sensor(0x0a, 0x00); + GC0312_BLX_write_cmos_sensor(0x0b, 0x00); + GC0312_BLX_write_cmos_sensor(0x0c, 0x04); + GC0312_BLX_write_cmos_sensor(0x0d, 0x01); + GC0312_BLX_write_cmos_sensor(0x0e, 0xe8); + GC0312_BLX_write_cmos_sensor(0x0f, 0x02); + GC0312_BLX_write_cmos_sensor(0x10, 0x88); + GC0312_BLX_write_cmos_sensor(0x16, 0x00); + GC0312_BLX_write_cmos_sensor(0x17, 0x14); + GC0312_BLX_write_cmos_sensor(0x18, 0x1a); + GC0312_BLX_write_cmos_sensor(0x19, 0x14); + GC0312_BLX_write_cmos_sensor(0x1b, 0x48); + GC0312_BLX_write_cmos_sensor(0x1c, 0x6c); + GC0312_BLX_write_cmos_sensor(0x1e, 0x6b); + GC0312_BLX_write_cmos_sensor(0x1f, 0x28); + GC0312_BLX_write_cmos_sensor(0x20, 0x8b); + GC0312_BLX_write_cmos_sensor(0x21, 0x49); + GC0312_BLX_write_cmos_sensor(0x22, 0xd0); + GC0312_BLX_write_cmos_sensor(0x23, 0x04); + GC0312_BLX_write_cmos_sensor(0x24, 0x16); + GC0312_BLX_write_cmos_sensor(0x34, 0x20); + + /* /////////////////////////////////////////// */ + /* /////////// BLK //////////////////// */ + /* /////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0x26, 0x23); + GC0312_BLX_write_cmos_sensor(0x28, 0xff); + GC0312_BLX_write_cmos_sensor(0x29, 0x00); + GC0312_BLX_write_cmos_sensor(0x32, 0x04); + GC0312_BLX_write_cmos_sensor(0x33, 0x10); + GC0312_BLX_write_cmos_sensor(0x37, 0x20); + GC0312_BLX_write_cmos_sensor(0x38, 0x10); + GC0312_BLX_write_cmos_sensor(0x47, 0x80); + GC0312_BLX_write_cmos_sensor(0x4e, 0x66); + GC0312_BLX_write_cmos_sensor(0xa8, 0x02); + GC0312_BLX_write_cmos_sensor(0xa9, 0x80); + + /* /////////////////////////////////////////// */ + /* //////////////// ISP ///////////////////// */ + /* /////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0x40, 0xff); + GC0312_BLX_write_cmos_sensor(0x41, 0x25); + GC0312_BLX_write_cmos_sensor(0x42, 0xcf); + GC0312_BLX_write_cmos_sensor(0x44, 0x02); + GC0312_BLX_write_cmos_sensor(0x45, 0xa8); + GC0312_BLX_write_cmos_sensor(0x46, 0x02); + GC0312_BLX_write_cmos_sensor(0x4a, 0x11); + GC0312_BLX_write_cmos_sensor(0x4b, 0x01); + GC0312_BLX_write_cmos_sensor(0x4c, 0x20); + GC0312_BLX_write_cmos_sensor(0x4d, 0x05); + GC0312_BLX_write_cmos_sensor(0x4f, 0x01); + GC0312_BLX_write_cmos_sensor(0x50, 0x01); + GC0312_BLX_write_cmos_sensor(0x55, 0x01); + GC0312_BLX_write_cmos_sensor(0x56, 0xe0); + GC0312_BLX_write_cmos_sensor(0x57, 0x02); + GC0312_BLX_write_cmos_sensor(0x58, 0x80); + + /* /////////////////////////////////////////// */ + /* ///////////// GAIN //////////////////// */ + /* /////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0x70, 0x70); + GC0312_BLX_write_cmos_sensor(0x5a, 0x84); + GC0312_BLX_write_cmos_sensor(0x5b, 0xc9); + GC0312_BLX_write_cmos_sensor(0x5c, 0xed); + GC0312_BLX_write_cmos_sensor(0x77, 0x54); + GC0312_BLX_write_cmos_sensor(0x78, 0x40); + GC0312_BLX_write_cmos_sensor(0x79, 0x62); + + /* /////////////////////////////////////////// */ + /* ///////////// DNDD ///////////////////// */ + /* /////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0x82, 0x03); + GC0312_BLX_write_cmos_sensor(0x83, 0x03); + GC0312_BLX_write_cmos_sensor(0x89, 0x0e); + GC0312_BLX_write_cmos_sensor(0x8a, 0x0e); + GC0312_BLX_write_cmos_sensor(0x8b, 0x0e); + + /* ///////////////////////////////////////// */ + /* ////////// EEINTP //////////////////// */ + /* ///////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0x8f, 0xaa); + GC0312_BLX_write_cmos_sensor(0x90, 0x8c); + GC0312_BLX_write_cmos_sensor(0x91, 0x90); + GC0312_BLX_write_cmos_sensor(0x92, 0x08); + GC0312_BLX_write_cmos_sensor(0x93, 0x08); + GC0312_BLX_write_cmos_sensor(0x94, 0x04); + GC0312_BLX_write_cmos_sensor(0x95, 0x44); + GC0312_BLX_write_cmos_sensor(0x96, 0xf0); + + /* /////////////////////////////////////////// */ + /* /////////////// ASDE //////////////////// */ + /* /////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + + GC0312_BLX_write_cmos_sensor(0x9a, 0x20); + GC0312_BLX_write_cmos_sensor(0x9b, 0x60); + GC0312_BLX_write_cmos_sensor(0x9c, 0x40); + GC0312_BLX_write_cmos_sensor(0x9d, 0x80); + + GC0312_BLX_write_cmos_sensor(0xa1, 0x30); + GC0312_BLX_write_cmos_sensor(0xa2, 0x44); + GC0312_BLX_write_cmos_sensor(0xa4, 0x26); + GC0312_BLX_write_cmos_sensor(0xa5, 0x38); + GC0312_BLX_write_cmos_sensor(0xaa, 0x2a); + GC0312_BLX_write_cmos_sensor(0xac, 0x00); + + /* ////////////////////////////////////////// */ + /* //////////// GAMMA /////////////////// */ + /* ////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xbf, 0x00); + GC0312_BLX_write_cmos_sensor(0xc0, 0x0b); + GC0312_BLX_write_cmos_sensor(0xc1, 0x27); + GC0312_BLX_write_cmos_sensor(0xc2, 0x45); + GC0312_BLX_write_cmos_sensor(0xc3, 0x5d); + GC0312_BLX_write_cmos_sensor(0xc4, 0x70); + GC0312_BLX_write_cmos_sensor(0xc5, 0x80); + GC0312_BLX_write_cmos_sensor(0xc6, 0x98); + GC0312_BLX_write_cmos_sensor(0xc7, 0xac); + GC0312_BLX_write_cmos_sensor(0xc8, 0xbc); + GC0312_BLX_write_cmos_sensor(0xc9, 0xca); + GC0312_BLX_write_cmos_sensor(0xca, 0xd7); + GC0312_BLX_write_cmos_sensor(0xcb, 0xe1); + GC0312_BLX_write_cmos_sensor(0xcc, 0xe9); + GC0312_BLX_write_cmos_sensor(0xcd, 0xf3); + GC0312_BLX_write_cmos_sensor(0xce, 0xfa); + GC0312_BLX_write_cmos_sensor(0xcf, 0xfe); + + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x5f, 0x00); + GC0312_BLX_write_cmos_sensor(0x60, 0x15); + GC0312_BLX_write_cmos_sensor(0x61, 0x3d); + GC0312_BLX_write_cmos_sensor(0x62, 0x58); + GC0312_BLX_write_cmos_sensor(0x63, 0x6f); + GC0312_BLX_write_cmos_sensor(0x64, 0x80); + GC0312_BLX_write_cmos_sensor(0x65, 0x92); + GC0312_BLX_write_cmos_sensor(0x66, 0xa8); + GC0312_BLX_write_cmos_sensor(0x67, 0xb9); + GC0312_BLX_write_cmos_sensor(0x68, 0xc7); + GC0312_BLX_write_cmos_sensor(0x69, 0xd1); + GC0312_BLX_write_cmos_sensor(0x6a, 0xda); + GC0312_BLX_write_cmos_sensor(0x6b, 0xe3); + GC0312_BLX_write_cmos_sensor(0x6c, 0xe8); + GC0312_BLX_write_cmos_sensor(0x6d, 0xf2); + GC0312_BLX_write_cmos_sensor(0x6e, 0xfb); + GC0312_BLX_write_cmos_sensor(0x6f, 0xfd); + + GC0312_BLX_write_cmos_sensor(0xb1, 0x80); + GC0312_BLX_write_cmos_sensor(0xb2, 0x90); + GC0312_BLX_write_cmos_sensor(0xb3, 0x0b); + GC0312_BLX_write_cmos_sensor(0xb4, 0x10); + + ///////////////////////////////////////// + /////////////// YCP ////////////////// + ///////////////////////////////////////// + GC0312_BLX_write_cmos_sensor(0xd0, 0x40); + GC0312_BLX_write_cmos_sensor(0xd1, 0x2e);//32 + GC0312_BLX_write_cmos_sensor(0xd2, 0x2c);//2e + GC0312_BLX_write_cmos_sensor(0xd3, 0x40); + GC0312_BLX_write_cmos_sensor(0xd5, 0x00); + GC0312_BLX_write_cmos_sensor(0xd6, 0xf2); + GC0312_BLX_write_cmos_sensor(0xd7, 0x1b); + GC0312_BLX_write_cmos_sensor(0xd8, 0x18); + GC0312_BLX_write_cmos_sensor(0xde, 0xa6); + GC0312_BLX_write_cmos_sensor(0xdd, 0x03); + + //////////////////////////////////////// + /////////////// AEC //////////////// + //////////////////////////////////////// + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x05, 0x30); + GC0312_BLX_write_cmos_sensor(0x06, 0x75); + GC0312_BLX_write_cmos_sensor(0x07, 0x40); + GC0312_BLX_write_cmos_sensor(0x08, 0xb0); + GC0312_BLX_write_cmos_sensor(0x0a, 0xc5); + GC0312_BLX_write_cmos_sensor(0x0b, 0x11); + GC0312_BLX_write_cmos_sensor(0x0c, 0x00); /*Center weight*/ + GC0312_BLX_write_cmos_sensor(0x12, 0x52); + GC0312_BLX_write_cmos_sensor(0x13, 0x35); + GC0312_BLX_write_cmos_sensor(0x18, 0x95); + GC0312_BLX_write_cmos_sensor(0x19, 0x96); + GC0312_BLX_write_cmos_sensor(0x1e, 0x31); + GC0312_BLX_write_cmos_sensor(0x1f, 0x20); + GC0312_BLX_write_cmos_sensor(0x20, 0xc0); + GC0312_BLX_write_cmos_sensor(0x3e, 0x40); + GC0312_BLX_write_cmos_sensor(0x3f, 0x57); + GC0312_BLX_write_cmos_sensor(0x40, 0x7d); + GC0312_BLX_write_cmos_sensor(0x03, 0x60); + GC0312_BLX_write_cmos_sensor(0x44, 0x02); + + ///////////////////////////////////////////// + //////////////// AWB //////////////////// + ///////////////////////////////////////////// + GC0312_BLX_write_cmos_sensor(0x1c, 0x91); + GC0312_BLX_write_cmos_sensor(0x21, 0x15); + GC0312_BLX_write_cmos_sensor(0x50, 0x80); + GC0312_BLX_write_cmos_sensor(0x56, 0x0c); + GC0312_BLX_write_cmos_sensor(0x58, 0x04); + GC0312_BLX_write_cmos_sensor(0x59, 0x00); + GC0312_BLX_write_cmos_sensor(0x5b, 0x02); + GC0312_BLX_write_cmos_sensor(0x61, 0x96); + GC0312_BLX_write_cmos_sensor(0x62, 0xc6); + GC0312_BLX_write_cmos_sensor(0x63, 0x14); + GC0312_BLX_write_cmos_sensor(0x64, 0xa0); + GC0312_BLX_write_cmos_sensor(0x65, 0x06); + GC0312_BLX_write_cmos_sensor(0x66, 0x06); + GC0312_BLX_write_cmos_sensor(0x67, 0x86); + GC0312_BLX_write_cmos_sensor(0x69, 0x08); + GC0312_BLX_write_cmos_sensor(0x6a, 0x80); + GC0312_BLX_write_cmos_sensor(0x6b, 0x01); + GC0312_BLX_write_cmos_sensor(0x6c, 0x00); + GC0312_BLX_write_cmos_sensor(0x6d, 0x03); + GC0312_BLX_write_cmos_sensor(0x6e, 0x00); + GC0312_BLX_write_cmos_sensor(0x6f, 0x80); + GC0312_BLX_write_cmos_sensor(0x76, 0x80); + GC0312_BLX_write_cmos_sensor(0x77, 0x60); + GC0312_BLX_write_cmos_sensor(0x78, 0xf0); + GC0312_BLX_write_cmos_sensor(0x79, 0x75); + GC0312_BLX_write_cmos_sensor(0x7a, 0x40); + GC0312_BLX_write_cmos_sensor(0x7b, 0x5c); + GC0312_BLX_write_cmos_sensor(0x7c, 0x08); + + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x90, 0x00); + GC0312_BLX_write_cmos_sensor(0x91, 0x00); + GC0312_BLX_write_cmos_sensor(0x92, 0xfa); + GC0312_BLX_write_cmos_sensor(0x93, 0xe1); + GC0312_BLX_write_cmos_sensor(0x95, 0x21); + GC0312_BLX_write_cmos_sensor(0x96, 0xfb); + GC0312_BLX_write_cmos_sensor(0x97, 0x49); + GC0312_BLX_write_cmos_sensor(0x98, 0x22); + GC0312_BLX_write_cmos_sensor(0x9a, 0x00); + GC0312_BLX_write_cmos_sensor(0x9b, 0x00); + GC0312_BLX_write_cmos_sensor(0x9c, 0x92); + GC0312_BLX_write_cmos_sensor(0x9d, 0x51); + GC0312_BLX_write_cmos_sensor(0x9f, 0x00); + GC0312_BLX_write_cmos_sensor(0xa0, 0x00); + GC0312_BLX_write_cmos_sensor(0xa1, 0x00); + GC0312_BLX_write_cmos_sensor(0xa2, 0x00); + GC0312_BLX_write_cmos_sensor(0x86, 0x00); + GC0312_BLX_write_cmos_sensor(0x87, 0x00); + GC0312_BLX_write_cmos_sensor(0x88, 0x00); + GC0312_BLX_write_cmos_sensor(0x89, 0x00); + GC0312_BLX_write_cmos_sensor(0xa4, 0x00); + GC0312_BLX_write_cmos_sensor(0xa5, 0x00); + GC0312_BLX_write_cmos_sensor(0xa6, 0xd7); + GC0312_BLX_write_cmos_sensor(0xa7, 0xab); + GC0312_BLX_write_cmos_sensor(0xa9, 0xd9); + GC0312_BLX_write_cmos_sensor(0xaa, 0xa0); + GC0312_BLX_write_cmos_sensor(0xab, 0xc1); + GC0312_BLX_write_cmos_sensor(0xac, 0x94); + GC0312_BLX_write_cmos_sensor(0xae, 0x00); + GC0312_BLX_write_cmos_sensor(0xaf, 0x00); + GC0312_BLX_write_cmos_sensor(0xb0, 0xda); + GC0312_BLX_write_cmos_sensor(0xb1, 0xa1); + GC0312_BLX_write_cmos_sensor(0xb3, 0x00); + GC0312_BLX_write_cmos_sensor(0xb4, 0x00); + GC0312_BLX_write_cmos_sensor(0xb5, 0x00); + GC0312_BLX_write_cmos_sensor(0xb6, 0x00); + GC0312_BLX_write_cmos_sensor(0x8b, 0x00); + GC0312_BLX_write_cmos_sensor(0x8c, 0x00); + GC0312_BLX_write_cmos_sensor(0x8d, 0x00); + GC0312_BLX_write_cmos_sensor(0x8e, 0x00); + GC0312_BLX_write_cmos_sensor(0x94, 0x50); + GC0312_BLX_write_cmos_sensor(0x99, 0xa6); + GC0312_BLX_write_cmos_sensor(0x9e, 0xa0); + GC0312_BLX_write_cmos_sensor(0xa3, 0x00); + GC0312_BLX_write_cmos_sensor(0x8a, 0x00); + GC0312_BLX_write_cmos_sensor(0xa8, 0x50); + GC0312_BLX_write_cmos_sensor(0xad, 0x55); + GC0312_BLX_write_cmos_sensor(0xb2, 0x50); + GC0312_BLX_write_cmos_sensor(0xb7, 0x00); + GC0312_BLX_write_cmos_sensor(0x8f, 0x00); + GC0312_BLX_write_cmos_sensor(0xb8, 0xd6); + GC0312_BLX_write_cmos_sensor(0xb9, 0x8c); + + GC0312_BLX_write_cmos_sensor(0x86, 0x60); + GC0312_BLX_write_cmos_sensor(0x87, 0x58); + GC0312_BLX_write_cmos_sensor(0x88, 0x00); + GC0312_BLX_write_cmos_sensor(0x89, 0x00); + GC0312_BLX_write_cmos_sensor(0x8a, 0xaa); + GC0312_BLX_write_cmos_sensor(0x8b, 0xcb); + GC0312_BLX_write_cmos_sensor(0x8c, 0xbb); + GC0312_BLX_write_cmos_sensor(0x8d, 0x00); + GC0312_BLX_write_cmos_sensor(0x8e, 0x00); + GC0312_BLX_write_cmos_sensor(0x8f, 0x55); + /* /////////////////////////////////////////// */ + /* ////////////// CC //////////////////// */ + /* /////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); /*CCM*/ + GC0312_BLX_write_cmos_sensor(0xd0, 0x42); + GC0312_BLX_write_cmos_sensor(0xd1, 0x00); + GC0312_BLX_write_cmos_sensor(0xd2, 0x08); + GC0312_BLX_write_cmos_sensor(0xd3, 0xf8); + GC0312_BLX_write_cmos_sensor(0xd4, 0x46); + GC0312_BLX_write_cmos_sensor(0xd5, 0xf0); + + GC0312_BLX_write_cmos_sensor(0xd6, 0x42); + GC0312_BLX_write_cmos_sensor(0xd7, 0xfa); /*fc*/ + GC0312_BLX_write_cmos_sensor(0xd8, 0x02); + GC0312_BLX_write_cmos_sensor(0xd9, 0xfc); + GC0312_BLX_write_cmos_sensor(0xda, 0x40); + GC0312_BLX_write_cmos_sensor(0xdb, 0xec); + /*/////////////////////////////////////////////*/ + /*//////////////// LSC ////////////////////*/ + /*/////////////////////////////////////////////*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0xc1, 0x3c); + GC0312_BLX_write_cmos_sensor(0xc2, 0x50); + GC0312_BLX_write_cmos_sensor(0xc3, 0x00); + GC0312_BLX_write_cmos_sensor(0xc4, 0x38); + GC0312_BLX_write_cmos_sensor(0xc5, 0x20); + GC0312_BLX_write_cmos_sensor(0xc6, 0x20); + GC0312_BLX_write_cmos_sensor(0xc7, 0x10); + GC0312_BLX_write_cmos_sensor(0xc8, 0x00); + GC0312_BLX_write_cmos_sensor(0xc9, 0x00); + GC0312_BLX_write_cmos_sensor(0xdc, 0x20); + GC0312_BLX_write_cmos_sensor(0xdd, 0x10); + GC0312_BLX_write_cmos_sensor(0xdf, 0x00); + GC0312_BLX_write_cmos_sensor(0xde, 0x00); + + /*/////////////////////////////////////////////*/ + /*/////////////// Histogram /////////////////*/ + /*/////////////////////////////////////////////*/ + GC0312_BLX_write_cmos_sensor(0x01, 0x10); + GC0312_BLX_write_cmos_sensor(0x0b, 0x31); + GC0312_BLX_write_cmos_sensor(0x0e, 0x50); + GC0312_BLX_write_cmos_sensor(0x0f, 0x0f); + GC0312_BLX_write_cmos_sensor(0x10, 0x6e); + GC0312_BLX_write_cmos_sensor(0x12, 0xa0); + GC0312_BLX_write_cmos_sensor(0x15, 0x60); + GC0312_BLX_write_cmos_sensor(0x16, 0x60); + GC0312_BLX_write_cmos_sensor(0x17, 0xe0); + + /*////////////////////////////////////////*/ + /*//////////Measure Windo/////////////// */ + /*////////////////////////////////////////*/ + GC0312_BLX_write_cmos_sensor(0xcc, 0x0c); + GC0312_BLX_write_cmos_sensor(0xcd, 0x10); + GC0312_BLX_write_cmos_sensor(0xce, 0xa0); + GC0312_BLX_write_cmos_sensor(0xcf, 0xe6); + + /*/////////////////////////////////////////*/ + /*///////////// dark sun ////////////// */ + /*/////////////////////////////////////////*/ + GC0312_BLX_write_cmos_sensor(0x45, 0xf7); + GC0312_BLX_write_cmos_sensor(0x46, 0xff); + GC0312_BLX_write_cmos_sensor(0x47, 0xff); + GC0312_BLX_write_cmos_sensor(0x48, 0x03); + GC0312_BLX_write_cmos_sensor(0x4f, 0x60); + + /*//////////////banding//////////////////*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x0d, 0xf8); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x05, 0x01); + GC0312_BLX_write_cmos_sensor(0x06, 0x18); + GC0312_BLX_write_cmos_sensor(0x07, 0x00); + GC0312_BLX_write_cmos_sensor(0x08, 0x10); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x25, 0x00); + GC0312_BLX_write_cmos_sensor(0x26, 0x9a); + GC0312_BLX_write_cmos_sensor(0x27, 0x01); + GC0312_BLX_write_cmos_sensor(0x28, 0x34); + GC0312_BLX_write_cmos_sensor(0x29, 0x02); + GC0312_BLX_write_cmos_sensor(0x2a, 0x68); + GC0312_BLX_write_cmos_sensor(0x2b, 0x04); + GC0312_BLX_write_cmos_sensor(0x2c, 0xd0); + GC0312_BLX_write_cmos_sensor(0x2d, 0x06); + GC0312_BLX_write_cmos_sensor(0x2e, 0x04); + GC0312_BLX_write_cmos_sensor(0x2f, 0x09); + GC0312_BLX_write_cmos_sensor(0x30, 0x06); + GC0312_BLX_write_cmos_sensor(0x31, 0x09); + GC0312_BLX_write_cmos_sensor(0x32, 0xa0); + GC0312_BLX_write_cmos_sensor(0x33, 0x0a); + GC0312_BLX_write_cmos_sensor(0x34, 0x3a); + GC0312_BLX_write_cmos_sensor(0x35, 0x10); + GC0312_BLX_write_cmos_sensor(0x36, 0x10); + GC0312_BLX_write_cmos_sensor(0x37, 0x12); + GC0312_BLX_write_cmos_sensor(0x38, 0x14); + GC0312_BLX_write_cmos_sensor(0x39, 0x18); + GC0312_BLX_write_cmos_sensor(0x3a, 0x28); + GC0312_BLX_write_cmos_sensor(0x3b, 0x28); + /*///////////////////////////////////////////// */ + /*///////////////// DVP //////////////////// */ + /*///////////////////////////////////////////// */ + GC0312_BLX_write_cmos_sensor(0xfe, 0x03); + GC0312_BLX_write_cmos_sensor(0x01, 0x00); + GC0312_BLX_write_cmos_sensor(0x02, 0x00); + GC0312_BLX_write_cmos_sensor(0x10, 0x00); + GC0312_BLX_write_cmos_sensor(0x15, 0x00); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + + + + /* //////////////OUTPUT////////////////////// */ + GC0312_BLX_write_cmos_sensor(0xf3, 0xff); +} + + +UINT32 GC0312_BLXGetModuleID() +{ + printk("GC0312_BLXGetModuleID\n"); + return moduleid; +} + + +UINT32 GC0312_BLXGetSensorID(UINT32 *sensorID) +{ + int retry = 3; + /* check if sensor ID correct */ + do { + *sensorID = ((GC0312_BLX_read_cmos_sensor(0xf0) << 8) | GC0312_BLX_read_cmos_sensor(0xf1)); + if (*sensorID == GC0312_SENSOR_ID_BLX) { + moduleid = 0x04; + break; + } + + SENSORDB("Read Sensor ID Fail = 0x%04x\n", *sensorID); + retry--; + } while (retry > 0); + if (*sensorID != GC0312_SENSOR_ID_BLX) { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + return ERROR_NONE; +} + + + + +/************************************************************************* +* FUNCTION +* GC0312_BLX_Write_More_Registers +* +* DESCRIPTION +* This function is served for FAE to modify the necessary Init Regs. Do not modify the regs +* in init_GC0312_BLX() directly. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void GC0312_BLX_Write_More_Registers(void) +{ + /* //////////////////for FAE to modify the necessary Init Regs.//////////////// */ + +} + + +/************************************************************************* + * FUNCTION + * GC0312_BLXOpen + * + * DESCRIPTION + * This function initialize the registers of CMOS sensor + * + * PARAMETERS + * None + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312_BLXOpen(void) +{ + volatile signed char i; + kal_uint16 sensor_id = 0; + + printk(" Entry GC0312_BLXOpen!!!\r\n"); + + Sleep(10); + + + /* Read sensor ID to adjust I2C is OK? */ + for (i = 0; i < 3; i++) { + sensor_id = ((GC0312_BLX_read_cmos_sensor(0xf0) << 8) | GC0312_BLX_read_cmos_sensor(0xf1)); + if (sensor_id != GC0312_SENSOR_ID_BLX) { + SENSORDB("GC0312_BLX Read Sensor ID Fail[open] = 0x%x\n", sensor_id); + return ERROR_SENSOR_CONNECT_FAIL; + } + } + + SENSORDB("GC0312_BLX_ Sensor Read ID OK \r\n"); + GC0312_BLX_Sensor_Init(); +#ifdef DEBUG_SENSOR_GC0312_BLX + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static char buf[60 * 1024]; + + printk("gc0312 open debug\n"); + + fp = filp_open("/mnt/sdcard/gc0312_sd.txt", O_RDONLY, 0); + + if (IS_ERR(fp)) { + fromsd = 0; + printk("gc0312 open file error\n"); + } else { + fromsd = 1; + printk("gc0312 open file ok\n"); + + filp_close(fp, NULL); + set_fs(fs); + } + + if (fromsd == 1) { + printk("gc0312 open from t!\n"); + GC0312_BLX_Initialize_from_T_Flash(); + } else { + printk("gc0312 open not from t!\n"); + } + +#endif + GC0312_BLX_Write_More_Registers(); + + return ERROR_NONE; +} /* GC0312_BLXOpen */ + + +/************************************************************************* + * FUNCTION + * GC0312_BLXClose + * + * DESCRIPTION + * This function is to turn off sensor module power. + * + * PARAMETERS + * None + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312_BLXClose(void) +{ + return ERROR_NONE; +} /* GC0312_BLXClose */ + + +/************************************************************************* + * FUNCTION + * GC0312_BLXPreview + * + * DESCRIPTION + * This function start the sensor preview. + * + * PARAMETERS + * *image_window : address pointer of pixel numbers in one period of HSYNC + * *sensor_config_data : address pointer of line numbers in one period of VSYNC + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312_BLXPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + kal_uint32 iTemp; + kal_uint16 iStartX = 0, iStartY = 1; + + if (sensor_config_data->SensorOperationMode == MSDK_SENSOR_OPERATION_MODE_VIDEO) { /* MPEG4 Encode Mode */ + RETAILMSG(1, (TEXT("Camera Video preview\r\n"))); + GC0312_BLX_MPEG4_encode_mode = KAL_TRUE; + + } else { + RETAILMSG(1, (TEXT("Camera preview\r\n"))); + GC0312_BLX_MPEG4_encode_mode = KAL_FALSE; + } + + image_window->GrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + image_window->GrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + image_window->ExposureWindowWidth = IMAGE_SENSOR_PV_WIDTH; + image_window->ExposureWindowHeight = IMAGE_SENSOR_PV_HEIGHT; + + /* copy sensor_config_data */ + memcpy(&GC0312_BLXSensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* GC0312_BLXPreview */ + + +/************************************************************************* + * FUNCTION + * GC0312_BLXCapture + * + * DESCRIPTION + * This function setup the CMOS sensor in capture MY_OUTPUT mode + * + * PARAMETERS + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 GC0312_BLXCapture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + GC0312_BLX_MODE_CAPTURE = KAL_TRUE; + + image_window->GrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + image_window->GrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + image_window->ExposureWindowWidth = IMAGE_SENSOR_FULL_WIDTH; + image_window->ExposureWindowHeight = IMAGE_SENSOR_FULL_HEIGHT; + + /* copy sensor_config_data */ + memcpy(&GC0312_BLXSensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* GC0312_BLX_Capture() */ + + + +UINT32 GC0312_BLXGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) +{ + pSensorResolution->SensorFullWidth = IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorFullHeight = IMAGE_SENSOR_FULL_HEIGHT; + pSensorResolution->SensorPreviewWidth = IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorPreviewHeight = IMAGE_SENSOR_PV_HEIGHT; + pSensorResolution->SensorVideoWidth = IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorVideoHeight = IMAGE_SENSOR_PV_HEIGHT; + return ERROR_NONE; +} /* GC0312_BLXGetResolution() */ + + +UINT32 GC0312_BLXGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + pSensorInfo->SensorPreviewResolutionX = IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY = IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX = IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY = IMAGE_SENSOR_FULL_HEIGHT; + + pSensorInfo->SensorCameraPreviewFrameRate = 30; + pSensorInfo->SensorVideoFrameRate = 30; + pSensorInfo->SensorStillCaptureFrameRate = 10; + pSensorInfo->SensorWebCamCaptureFrameRate = 15; + pSensorInfo->SensorResetActiveHigh = FALSE; + pSensorInfo->SensorResetDelayCount = 1; + pSensorInfo->SensorOutputDataFormat = SENSOR_OUTPUT_FORMAT_YUYV; + pSensorInfo->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorInterruptDelayLines = 1; + pSensorInfo->SensroInterfaceType = SENSOR_INTERFACE_TYPE_PARALLEL; + pSensorInfo->CaptureDelayFrame = 2; + pSensorInfo->PreviewDelayFrame = 2; + pSensorInfo->VideoDelayFrame = 4; + pSensorInfo->SensorMasterClockSwitch = 0; + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_4MA; + + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + default: + pSensorInfo->SensorClockFreq = 24; + pSensorInfo->SensorClockDividCount = 3; + pSensorInfo->SensorClockRisingCount = 0; + pSensorInfo->SensorClockFallingCount = 2; + pSensorInfo->SensorPixelClockCount = 3; + pSensorInfo->SensorDataLatchCount = 2; + pSensorInfo->SensorGrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + pSensorInfo->SensorGrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + break; + } + GC0312_BLXPixelClockDivider = pSensorInfo->SensorPixelClockCount; + memcpy(pSensorConfigData, &GC0312_BLXSensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* GC0312_BLXGetInfo() */ + + +UINT32 GC0312_BLXControl(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + default: + GC0312_BLXPreview(pImageWindow, pSensorConfigData); + break; + } + + + return TRUE; +} /* GC0312_BLXControl() */ + +BOOL GC0312_BLX_set_Edge(UINT16 para) +{ + + switch (para) { + case ISP_EDGE_MIDDLE: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x95, 0x44); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_EDGE_HIGH: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x95, 0x99); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_EDGE_LOW: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x95, 0x00); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_BLX_set_HUE(UINT16 para) +{ + + switch (para) { + case ISP_HUE_MIDDLE: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x7a, 0x80); + GC0312_BLX_write_cmos_sensor(0x7b, 0x80); + GC0312_BLX_write_cmos_sensor(0x7c, 0x80); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_HUE_HIGH: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x7a, 0x88); + GC0312_BLX_write_cmos_sensor(0x7b, 0x88); + GC0312_BLX_write_cmos_sensor(0x7c, 0x80); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_HUE_LOW: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x7a, 0x80); + GC0312_BLX_write_cmos_sensor(0x7b, 0x80); + GC0312_BLX_write_cmos_sensor(0x7c, 0x88); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_BLX_set_Brightness(UINT16 para) +{ + + switch (para) { + case ISP_BRIGHT_MIDDLE: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd5, 0x00); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x35); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_BRIGHT_HIGH: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd5, 0x10); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x60); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_BRIGHT_LOW: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd5, 0xf8); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x30); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_BLX_set_Contrast(UINT16 para) +{ + + switch (para) { + case ISP_CONTRAST_MIDDLE: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd3, 0x40); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_CONTRAST_HIGH: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd3, 0x50); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_CONTRAST_LOW: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd3, 0x30); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + +BOOL GC0312_BLX_set_Saturation(UINT16 para) +{ + + switch (para) { + case ISP_SAT_MIDDLE: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd1, 0x2e); + GC0312_BLX_write_cmos_sensor(0xd2, 0x2c); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_SAT_HIGH: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd1, 0x40); + GC0312_BLX_write_cmos_sensor(0xd2, 0x40); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case ISP_SAT_LOW: + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xd1, 0x20); + GC0312_BLX_write_cmos_sensor(0xd2, 0x20); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + default: + return FALSE; + } + + return TRUE; +} + + + + +BOOL GC0312_BLX_set_param_wb(UINT16 para) +{ + + switch (para) { + case AWB_MODE_OFF: + + break; + + case AWB_MODE_AUTO: + GC0312_BLX_awb_enable(KAL_TRUE); + break; + + case AWB_MODE_CLOUDY_DAYLIGHT: /* cloudy */ + GC0312_BLX_awb_enable(KAL_FALSE); + GC0312_BLX_write_cmos_sensor(0x77, 0x8c); /* WB_manual_gain */ + GC0312_BLX_write_cmos_sensor(0x78, 0x50); + GC0312_BLX_write_cmos_sensor(0x79, 0x40); + break; + + case AWB_MODE_DAYLIGHT: /* sunny */ + GC0312_BLX_awb_enable(KAL_FALSE); + GC0312_BLX_write_cmos_sensor(0x77, 0x74); + GC0312_BLX_write_cmos_sensor(0x78, 0x52); + GC0312_BLX_write_cmos_sensor(0x79, 0x40); + break; + + case AWB_MODE_INCANDESCENT: /* office */ + GC0312_BLX_awb_enable(KAL_FALSE); + GC0312_BLX_write_cmos_sensor(0x77, 0x48); + GC0312_BLX_write_cmos_sensor(0x78, 0x40); + GC0312_BLX_write_cmos_sensor(0x79, 0x5c); + break; + + case AWB_MODE_TUNGSTEN: /* home */ + GC0312_BLX_awb_enable(KAL_FALSE); + GC0312_BLX_write_cmos_sensor(0x77, 0x40); + GC0312_BLX_write_cmos_sensor(0x78, 0x54); + GC0312_BLX_write_cmos_sensor(0x79, 0x70); + break; + + case AWB_MODE_FLUORESCENT: + GC0312_BLX_awb_enable(KAL_FALSE); + GC0312_BLX_write_cmos_sensor(0x77, 0x40); + GC0312_BLX_write_cmos_sensor(0x78, 0x42); + GC0312_BLX_write_cmos_sensor(0x79, 0x50); + break; + + default: + return FALSE; + } + + return TRUE; +} /* GC0312_BLX_set_param_wb */ + + +BOOL GC0312_BLX_set_param_effect(UINT16 para) +{ + kal_uint32 ret = KAL_TRUE; + + switch (para) { + case MEFFECT_OFF: + GC0312_BLX_write_cmos_sensor(0x43, 0x00); + break; + + case MEFFECT_SEPIA: + GC0312_BLX_write_cmos_sensor(0x43, 0x02); + GC0312_BLX_write_cmos_sensor(0xda, 0xd0); + GC0312_BLX_write_cmos_sensor(0xdb, 0x28); + break; + + case MEFFECT_NEGATIVE: + GC0312_BLX_write_cmos_sensor(0x43, 0x01); + break; + + case MEFFECT_SEPIAGREEN: + GC0312_BLX_write_cmos_sensor(0x43, 0x02); + GC0312_BLX_write_cmos_sensor(0xda, 0xc0); + GC0312_BLX_write_cmos_sensor(0xdb, 0xc0); + break; + + case MEFFECT_SEPIABLUE: + GC0312_BLX_write_cmos_sensor(0x43, 0x02); + GC0312_BLX_write_cmos_sensor(0xda, 0x50); + GC0312_BLX_write_cmos_sensor(0xdb, 0xe0); + break; + + case MEFFECT_MONO: + GC0312_BLX_write_cmos_sensor(0x43, 0x02); + GC0312_BLX_write_cmos_sensor(0xda, 0x00); + GC0312_BLX_write_cmos_sensor(0xdb, 0x00); + break; + default: + ret = FALSE; + } + + return ret; + +} /* GC0312_BLX_set_param_effect */ + + +BOOL GC0312_BLX_set_param_banding(UINT16 para) +{ + switch (para) { + case AE_FLICKER_MODE_50HZ: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x0d, 0xf8); /*new exp 3*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x05, 0x01);/*01*/ + GC0312_BLX_write_cmos_sensor(0x06, 0x18);/*89*/ + GC0312_BLX_write_cmos_sensor(0x07, 0x00); + GC0312_BLX_write_cmos_sensor(0x08, 0x10);/*22*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x25, 0x00); + GC0312_BLX_write_cmos_sensor(0x26, 0x9a); /*8a //step*/ + GC0312_BLX_write_cmos_sensor(0x27, 0x01); + GC0312_BLX_write_cmos_sensor(0x28, 0x34); /*2step level 1 3 30fps*/ + GC0312_BLX_write_cmos_sensor(0x29, 0x02); + GC0312_BLX_write_cmos_sensor(0x2a, 0x68); /*4step level 2 25 fps*/ + GC0312_BLX_write_cmos_sensor(0x2b, 0x04); + GC0312_BLX_write_cmos_sensor(0x2c, 0xd0); /*5step level 3 12.5*/ + GC0312_BLX_write_cmos_sensor(0x2d, 0x06); + GC0312_BLX_write_cmos_sensor(0x2e, 0x04); /*10step level 4 10*/ + GC0312_BLX_write_cmos_sensor(0x2f, 0x09); + GC0312_BLX_write_cmos_sensor(0x30, 0x06); /*14step level 5 6.25fps*/ + GC0312_BLX_write_cmos_sensor(0x31, 0x09); + GC0312_BLX_write_cmos_sensor(0x32, 0x06); /*14 step level 6 5.5fps*/ + GC0312_BLX_write_cmos_sensor(0x33, 0x0a); + GC0312_BLX_write_cmos_sensor(0x34, 0x3a); /* level 7 5*/ + GC0312_BLX_write_cmos_sensor(0x35, 0x10); /*2.25x level 1*/ + GC0312_BLX_write_cmos_sensor(0x36, 0x10); /*3.5x level 2*/ + GC0312_BLX_write_cmos_sensor(0x37, 0x12); /*6x level 3*/ + GC0312_BLX_write_cmos_sensor(0x38, 0x14); /* level 4*/ + GC0312_BLX_write_cmos_sensor(0x39, 0x18); /* level 5*/ + GC0312_BLX_write_cmos_sensor(0x3a, 0x28); /* level 6*/ + GC0312_BLX_write_cmos_sensor(0x3b, 0x28); /* level 7 3.5x*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case AE_FLICKER_MODE_60HZ: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x0d, 0xf8); /*new exp 3*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x05, 0x01);/*01*/ + GC0312_BLX_write_cmos_sensor(0x06, 0x13);/*89*/ + GC0312_BLX_write_cmos_sensor(0x07, 0x00); + GC0312_BLX_write_cmos_sensor(0x08, 0x14);/*22*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x25, 0x00); + GC0312_BLX_write_cmos_sensor(0x26, 0x81); /*8a //step*/ + GC0312_BLX_write_cmos_sensor(0x27, 0x01); + GC0312_BLX_write_cmos_sensor(0x28, 0x83); /*2step level 1 30fps*/ + GC0312_BLX_write_cmos_sensor(0x29, 0x02); + GC0312_BLX_write_cmos_sensor(0x2a, 0x85); /*4step level 2 25 fps*/ + GC0312_BLX_write_cmos_sensor(0x2b, 0x05); + GC0312_BLX_write_cmos_sensor(0x2c, 0x0a); + GC0312_BLX_write_cmos_sensor(0x2d, 0x06); + GC0312_BLX_write_cmos_sensor(0x2e, 0x0c); /*10step level 4 17*/ + GC0312_BLX_write_cmos_sensor(0x2f, 0x09); + GC0312_BLX_write_cmos_sensor(0x30, 0x12); /*14step level 5 12fps*/ + GC0312_BLX_write_cmos_sensor(0x31, 0x09); + GC0312_BLX_write_cmos_sensor(0x32, 0x93); /*14 step level 6 10fps*/ + GC0312_BLX_write_cmos_sensor(0x33, 0x0a); + GC0312_BLX_write_cmos_sensor(0x34, 0x14); /* level 7*/ + GC0312_BLX_write_cmos_sensor(0x35, 0x10); /*2.25x level 1*/ + GC0312_BLX_write_cmos_sensor(0x36, 0x10); /*3.5x level 2*/ + GC0312_BLX_write_cmos_sensor(0x37, 0x12); /*6x level 3*/ + GC0312_BLX_write_cmos_sensor(0x38, 0x14); /* level 4*/ + GC0312_BLX_write_cmos_sensor(0x39, 0x18); /* level 5*/ + GC0312_BLX_write_cmos_sensor(0x3a, 0x28); /* level 6*/ + GC0312_BLX_write_cmos_sensor(0x3b, 0x28); /* level 7 3.5x*/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + default: + return FALSE; + } + + return TRUE; +} /* GC0312_BLX_set_param_banding */ + + +BOOL GC0312_BLX_set_param_exposure(UINT16 para) +{ + + + switch (para) { + case AE_EV_COMP_n30: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x20); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + case AE_EV_COMP_n20: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x28); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case AE_EV_COMP_n10: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x30); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + + + case AE_EV_COMP_00: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x35); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + + + case AE_EV_COMP_10: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x40); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + + case AE_EV_COMP_20: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x48); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + case AE_EV_COMP_30: + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x50); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + break; + default: + return FALSE; + } + + return TRUE; +} /* GC0312_BLX_set_param_exposure */ + + +UINT32 GC0312_BLXYUVSetVideoMode(UINT16 u2FrameRate) /* lanking add */ +{ + + GC0312_BLX_MPEG4_encode_mode = KAL_TRUE; +#if 0 + if (u2FrameRate == 30) { + + /*********video frame ************/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x0d, 0xf8); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x05, 0x01); + GC0312_BLX_write_cmos_sensor(0x06, 0x18); + GC0312_BLX_write_cmos_sensor(0x07, 0x00); + GC0312_BLX_write_cmos_sensor(0x08, 0x10); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x25, 0x00); + GC0312_BLX_write_cmos_sensor(0x26, 0x9a); + GC0312_BLX_write_cmos_sensor(0x27, 0x01); + GC0312_BLX_write_cmos_sensor(0x28, 0x34); + GC0312_BLX_write_cmos_sensor(0x29, 0x02); + GC0312_BLX_write_cmos_sensor(0x2a, 0x68); + GC0312_BLX_write_cmos_sensor(0x2b, 0x03); + GC0312_BLX_write_cmos_sensor(0x2c, 0x02); + GC0312_BLX_write_cmos_sensor(0x2d, 0x03); + GC0312_BLX_write_cmos_sensor(0x2e, 0x9c); + GC0312_BLX_write_cmos_sensor(0x2f, 0x04); + GC0312_BLX_write_cmos_sensor(0x30, 0xd0); + GC0312_BLX_write_cmos_sensor(0x31, 0x04); + GC0312_BLX_write_cmos_sensor(0x32, 0xd0); + GC0312_BLX_write_cmos_sensor(0x33, 0x06); + GC0312_BLX_write_cmos_sensor(0x34, 0x04); + GC0312_BLX_write_cmos_sensor(0x35, 0x0d); + GC0312_BLX_write_cmos_sensor(0x36, 0x14); + GC0312_BLX_write_cmos_sensor(0x37, 0x18); + GC0312_BLX_write_cmos_sensor(0x38, 0x20); + GC0312_BLX_write_cmos_sensor(0x39, 0x30); + GC0312_BLX_write_cmos_sensor(0x3a, 0x30); + GC0312_BLX_write_cmos_sensor(0x3b, 0x30); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x35); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + + } else if (u2FrameRate == 15) { + + /*********video frame ************/ + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x0d, 0xf8); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0x05, 0x01); + GC0312_BLX_write_cmos_sensor(0x06, 0x18); + GC0312_BLX_write_cmos_sensor(0x07, 0x00); + GC0312_BLX_write_cmos_sensor(0x08, 0x10); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x25, 0x00); + GC0312_BLX_write_cmos_sensor(0x26, 0x9a); + GC0312_BLX_write_cmos_sensor(0x27, 0x01); + GC0312_BLX_write_cmos_sensor(0x28, 0x34); + GC0312_BLX_write_cmos_sensor(0x29, 0x02); + GC0312_BLX_write_cmos_sensor(0x2a, 0x68); + GC0312_BLX_write_cmos_sensor(0x2b, 0x03); + GC0312_BLX_write_cmos_sensor(0x2c, 0x02); + GC0312_BLX_write_cmos_sensor(0x2d, 0x03); + GC0312_BLX_write_cmos_sensor(0x2e, 0x9c); + GC0312_BLX_write_cmos_sensor(0x2f, 0x04); + GC0312_BLX_write_cmos_sensor(0x30, 0xd0); + GC0312_BLX_write_cmos_sensor(0x31, 0x04); + GC0312_BLX_write_cmos_sensor(0x32, 0xd0); + GC0312_BLX_write_cmos_sensor(0x33, 0x06); + GC0312_BLX_write_cmos_sensor(0x34, 0x04); + GC0312_BLX_write_cmos_sensor(0x35, 0x0d); + GC0312_BLX_write_cmos_sensor(0x36, 0x14); + GC0312_BLX_write_cmos_sensor(0x37, 0x18); + GC0312_BLX_write_cmos_sensor(0x38, 0x20); + GC0312_BLX_write_cmos_sensor(0x39, 0x30); + GC0312_BLX_write_cmos_sensor(0x3a, 0x30); + GC0312_BLX_write_cmos_sensor(0x3b, 0x30); + GC0312_BLX_write_cmos_sensor(0xfe, 0x01); + GC0312_BLX_write_cmos_sensor(0x13, 0x35); + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + + } else { + + SENSORDB("Wrong Frame Rate"); + + } +#endif + return TRUE; + +} + + +UINT32 GC0312_BLXYUVSensorSetting(FEATURE_ID iCmd, UINT16 iPara) +{ + +#ifdef DEBUG_SENSOR_GC0312_BLX + printk("______%s______ Tflash debug\n", __func__); + return TRUE; +#endif + + switch (iCmd) { + case FID_ISP_EDGE: + GC0312_BLX_set_Edge(iPara); + break; + case FID_ISP_HUE: + GC0312_BLX_set_HUE(iPara); + break; + case FID_ISP_BRIGHT: + GC0312_BLX_set_Brightness(iPara); + break; + case FID_ISP_CONTRAST: + GC0312_BLX_set_Contrast(iPara); + break; + case FID_ISP_SAT: + GC0312_BLX_set_Saturation(iPara); + break; + case FID_AWB_MODE: + GC0312_BLX_set_param_wb(iPara); + break; + case FID_COLOR_EFFECT: + GC0312_BLX_set_param_effect(iPara); + break; + case FID_AE_EV: + GC0312_BLX_set_param_exposure(iPara); + break; + case FID_AE_FLICKER: + GC0312_BLX_set_param_banding(iPara); + break; + case FID_SCENE_MODE: + GC0312_BLXNightMode(iPara); + break; + default: + break; + } + return TRUE; +} /* GC0312_BLXYUVSensorSetting */ + +UINT32 GC0312_BLX_SetTestPatternMode(kal_bool bEnable) +{ + SENSORDB("bEnable: %d", bEnable); + if (bEnable) { + GC0312_BLX_write_cmos_sensor(0xfe, 0x00); + GC0312_BLX_write_cmos_sensor(0xfa, 0x32); + GC0312_BLX_write_cmos_sensor(0x40, 0x08); + GC0312_BLX_write_cmos_sensor(0x41, 0x00); + GC0312_BLX_write_cmos_sensor(0x42, 0x00); + GC0312_BLX_write_cmos_sensor(0x4f, 0x00); + GC0312_BLX_write_cmos_sensor(0x18, 0x06); + GC0312_BLX_write_cmos_sensor(0x77, 0x40); + GC0312_BLX_write_cmos_sensor(0x78, 0x40); + GC0312_BLX_write_cmos_sensor(0x79, 0x40); + GC0312_BLX_write_cmos_sensor(0xd0, 0x40); + GC0312_BLX_write_cmos_sensor(0xdd, 0x00); + GC0312_BLX_write_cmos_sensor(0x71, 0x40); + GC0312_BLX_write_cmos_sensor(0x72, 0x40); + GC0312_BLX_write_cmos_sensor(0x03, 0x00); + GC0312_BLX_write_cmos_sensor(0x04, 0x00); + GC0312_BLX_write_cmos_sensor(0x4c, 0x01); + } else { + } + + return ERROR_NONE; +} + +void GC0312_BLXGetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) +{ + *pFeatureReturnPara32 = 0; + SENSORDB("GC0312_BLXGetAFMaxNumFocusAreas, *pFeatureReturnPara32 = %d\n", + *pFeatureReturnPara32); + +} + + +void GC0312_BLXGetAFMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) +{ + *pFeatureReturnPara32 = 0; + SENSORDB("GC0312_BLXGetAFMaxNumMeteringAreas,*pFeatureReturnPara32 = %d\n", + *pFeatureReturnPara32); + +} + +void GC0312_BLXGetExifInfo(UINT32 exifAddr) +{ + + SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; + + GC0312_BLX_Read_Shutter(); + + /* + //pExifInfo->FNumber = 28; + //pExifInfo->AEISOSpeed = GC0312_BLXExifInfo.AEISOSpeed; + //pExifInfo->FlashLightTimeus = 0; + //pExifInfo->RealISOValue = GC0312_BLXExifInfo.RealISOValue; + //pExifInfo->AWBMode = GC0312_BLXExifInfo.AWBMode; + */ + + pExifInfo->RealISOValue = GC0312_BLXExifInfo.RealISOValue; + pExifInfo->CapExposureTime = GC0312_BLXExifInfo.CapExposureTime*1000; + printk("GC0312_BLXExifInfo.CapExposureTime is %d",GC0312_BLXExifInfo.CapExposureTime); +} + +UINT32 GC0312_BLXFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara, UINT32 *pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16 = (UINT16 *) pFeaturePara; + UINT16 *pFeatureData16 = (UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32 = (UINT32 *) pFeaturePara; + UINT32 *pFeatureData32 = (UINT32 *) pFeaturePara; + UINT32 GC0312_BLXSensorRegNumber; + UINT32 i; + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData = (MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData = (MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + + RETAILMSG(1, (_T("gaiyang GC0312_BLXFeatureControl FeatureId=%d\r\n"), FeatureId)); + + switch (FeatureId) { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++ = IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16 = IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PERIOD: + *pFeatureReturnPara16++ = (VGA_PERIOD_PIXEL_NUMS) + GC0312_BLX_dummy_pixels; + *pFeatureReturnPara16 = (VGA_PERIOD_LINE_NUMS) + GC0312_BLX_dummy_lines; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + *pFeatureReturnPara32 = GC0312_BLX_g_fPV_PCLK; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_ESHUTTER: + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + /* GC0312_BLXNightMode((BOOL) *pFeatureData16); */ + break; + case SENSOR_FEATURE_SET_GAIN: + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + GC0312_BLX_isp_master_clock = *pFeatureData32; + break; + case SENSOR_FEATURE_SET_REGISTER: + GC0312_BLX_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = GC0312_BLX_read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pSensorConfigData, &GC0312_BLXSensorConfigData, + sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + *pFeatureParaLen = sizeof(MSDK_SENSOR_CONFIG_STRUCT); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + case SENSOR_FEATURE_GET_CCT_REGISTER: + case SENSOR_FEATURE_SET_ENG_REGISTER: + case SENSOR_FEATURE_GET_ENG_REGISTER: + case SENSOR_FEATURE_GET_REGISTER_DEFAULT: + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + case SENSOR_FEATURE_GET_GROUP_COUNT: + case SENSOR_FEATURE_GET_GROUP_INFO: + case SENSOR_FEATURE_GET_ITEM_INFO: + case SENSOR_FEATURE_SET_ITEM_INFO: + case SENSOR_FEATURE_GET_ENG_INFO: + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + /* get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE */ + /* if EEPROM does not exist in camera module. */ + *pFeatureReturnPara32 = LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID://cuirui add for MID + *pFeatureReturnPara32=GC0312_BLXGetModuleID(); + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_SET_YUV_CMD: + GC0312_BLXYUVSensorSetting((FEATURE_ID) *pFeatureData32, *(pFeatureData32 + 1)); + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: /* lanking */ + GC0312_BLXYUVSetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + GC0312_BLXGetSensorID(pFeatureData32); + break; + case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: + GC0312_BLXGetAFMaxNumFocusAreas(pFeatureReturnPara32); + *pFeatureParaLen = 4; + break; + + case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: + GC0312_BLXGetAFMaxNumMeteringAreas(pFeatureReturnPara32); + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + GC0312_BLX_SetTestPatternMode((BOOL) *pFeatureData16); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: + *pFeatureReturnPara32 = GC0312_BLX_TEST_PATTERN_CHECKSUM; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_EXIF_INFO: + GC0312_BLXGetExifInfo(*pFeatureData32); + break; + default: + break; + } + return ERROR_NONE; +} /* GC0312_BLXFeatureControl() */ + + +SENSOR_FUNCTION_STRUCT SensorFuncGC0312_BLXYUV = { + GC0312_BLXOpen, + GC0312_BLXGetInfo, + GC0312_BLXGetResolution, + GC0312_BLXFeatureControl, + GC0312_BLXControl, + GC0312_BLXClose +}; + + +UINT32 GC0312_YUV_BLX_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc != NULL) + *pfFunc = &SensorFuncGC0312_BLXYUV; + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Sensor.h new file mode 100755 index 00000000000..ed129209a38 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc0312yuv_blx_Sensor.h @@ -0,0 +1,57 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#ifndef __GC0312_BLX_SENSOR_H +#define __GC0312_BLX_SENSOR_H + + +#define VGA_PERIOD_PIXEL_NUMS 694 +#define VGA_PERIOD_LINE_NUMS 488 + +#define IMAGE_SENSOR_VGA_GRAB_PIXELS 0 +#define IMAGE_SENSOR_VGA_GRAB_LINES 1 + +#define IMAGE_SENSOR_VGA_WIDTH (640) +#define IMAGE_SENSOR_VGA_HEIGHT (480) + +#define IMAGE_SENSOR_PV_WIDTH (IMAGE_SENSOR_VGA_WIDTH - 8) +#define IMAGE_SENSOR_PV_HEIGHT (IMAGE_SENSOR_VGA_HEIGHT - 6) + +#define IMAGE_SENSOR_FULL_WIDTH (IMAGE_SENSOR_VGA_WIDTH - 8) +#define IMAGE_SENSOR_FULL_HEIGHT (IMAGE_SENSOR_VGA_HEIGHT - 6) + +#define GC0312_BLX_WRITE_ID 0x42 +#define GC0312_BLX_READ_ID 0x43 + +// GC0312_BLX SENSOR Chip ID: 0xb310 + +typedef enum +{ + GC0312_BLX_RGB_Gamma_m1 = 0, + GC0312_BLX_RGB_Gamma_m2, + GC0312_BLX_RGB_Gamma_m3, + GC0312_BLX_RGB_Gamma_m4, + GC0312_BLX_RGB_Gamma_m5, + GC0312_BLX_RGB_Gamma_m6, + GC0312_BLX_RGB_Gamma_night +}GC0312_BLX_GAMMA_TAG; + + + +UINT32 GC0312_BLXOpen(void); +UINT32 GC0312_BLXControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC0312_BLXFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); +UINT32 GC0312_BLXGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC0312_BLXGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); +UINT32 GC0312_BLXClose(void); + +#endif /* __SENSOR_H */ + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_CameraCustomized.h similarity index 54% rename from drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_CameraCustomized.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_CameraCustomized.h index 0d3a4e185cb..222211d004c 100644 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_CameraCustomized.h +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_CameraCustomized.h @@ -1,78 +1,4 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of camera customized parameters. - * - * - * Author: - * ------- - * PC Huang (MTK02204) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * Feb 9 2010 mtk80461 - * [DUMA00154355] JPeg Orientation feature check in - * - * - * Oct 27 2009 mtk02204 - * [DUMA00015869] [Camera Driver] Modifiy camera related drivers for dual/backup sensor/lens drivers. - * - * - * Sep 24 2009 mtk02204 - * [DUMA00134387] [LTK][GW616][Camera]4040 Camera:Camera Quality Test failed. - * - * - * Jul 8 2009 mtk02204 - * [DUMA00008051] [Camera Driver] Add drivers for camera high ISO binning mode. - * - * - * Jul 8 2009 mtk02204 - * [DUMA00008051] [Camera Driver] Add drivers for camera high ISO binning mode. - * - * - * Jul 7 2009 mtk02204 - * [DUMA00008051] [Camera Driver] Add drivers for camera high ISO binning mode. - * - * - * Jun 6 2009 mtk02204 - * [DUMA00119628] MTK camera_recorded video only contain audio but no video with Jean effect - * - * - * Apr 10 2009 mtk02204 - * [DUMA00004178] [Camera] Check in for MTK camera integration - * - * - * Mar 13 2009 mtk02204 - * [DUMA00001084] First Check in of MT6516 multimedia drivers - * - * - * Mar 2 2009 mtk02204 - * [DUMA00001084] First Check in of MT6516 multimedia drivers - * - * - * Feb 6 2009 mtk02204 - * [DUMA00001084] First Check in of MT6516 multimedia drivers - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ + /* MediaTek Inc. (C) 2010. All rights reserved. */ #ifndef __CAMERA_CUSTOMIZED_H #define __CAMERA_CUSTOMIZED_H @@ -104,7 +30,7 @@ #define CAM_SIZE_3M_HEIGHT 1536 #define CAM_SIZE_5M_WIDTH 2592 #define CAM_SIZE_5M_HEIGHT 1944 - + // for main sensor #define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 #define MAIN_NUM_OF_VIDEO_RESOLUTION 4 diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Camera_Sensor_para.h new file mode 100644 index 00000000000..c646f6a4463 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Camera_Sensor_para.h @@ -0,0 +1,26 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef _GC2355_CAMERA_SENSOR_PARA_H +#define _GC2355_CAMERA_SENSOR_PARA_H + +#define GC2355_CAMERA_SENSOR_REG_DEFAULT_VALUE \ +{ \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ + {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,ISP_DRIVING_6MA}, \ +} + +#define GC2355_CAMERA_SENSOR_CCT_DEFAULT_VALUE \ +{ \ + {0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40}, \ +} + +#endif /* __CAMERA_SENSOR_PARA_H */ +/* SENSOR FULL SIZE */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Sensor.c similarity index 90% rename from drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Sensor.c rename to drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Sensor.c index b0b964e0e40..5edde48d681 100644 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Sensor.c +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Sensor.c @@ -167,7 +167,7 @@ void GC2355_set_shutter(kal_uint16 iShutter) #ifdef GC2355_DRIVER_TRACE SENSORDB("GC2355_set_shutter iShutter = %d \n",iShutter); #endif - if(iShutter < 7) iShutter = 7; + if(iShutter < 1) iShutter = 1; if(iShutter > 16383) iShutter = 16383;//2^14 //Update Shutter GC2355_write_cmos_sensor(0x04, (iShutter) & 0xFF); @@ -376,37 +376,6 @@ static void GC2355_sensor_to_camera_para(void) } } - -/* SZ TCT xuejian.zhong add for CTS test*/ -static void GC2355GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("S5K5E2YAGetAFMaxNumFocusAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -static void GC2355GetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("S5K5E2YAGetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -static void GC2355GetExifInfo(UINT32 exifAddr) -{ - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = AE_ISO_100; - pExifInfo->AWBMode = AWB_MODE_AUTO; - pExifInfo->CapExposureTime = 0; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = AE_ISO_100; -} - -/* SZ TCT xuejian.zhong end */ - - - - - /* ------------------------ Engineer mode ------------------------ */ inline static void GC2355_get_sensor_group_count(kal_int32 *sensor_count_ptr) { @@ -634,25 +603,25 @@ void GC2355_SetMirrorFlip(GC2355_IMAGE_MIRROR Mirror) { /* switch(Mirror) { - case GC2355_IMAGE_NORMAL://IMAGE_NORMAL: + case GC2355_IMAGE_NORMAL://IMAGE_V_MIRROR: GC2355_write_cmos_sensor(0x17,0x14); - GC2355_write_cmos_sensor(0x92,0x01); - GC2355_write_cmos_sensor(0x94,0x05); + GC2355_write_cmos_sensor(0x92,0x03); + GC2355_write_cmos_sensor(0x94,0x07); break; - case GC2355_IMAGE_H_MIRROR://IMAGE_H_MIRROR: + case GC2355_IMAGE_H_MIRROR://IMAGE_NORMAL: GC2355_write_cmos_sensor(0x17,0x15); - GC2355_write_cmos_sensor(0x92,0x01); - GC2355_write_cmos_sensor(0x94,0x04); + GC2355_write_cmos_sensor(0x92,0x03); + GC2355_write_cmos_sensor(0x94,0x06); break; - case GC2355_IMAGE_V_MIRROR://IMAGE_V_MIRROR: + case GC2355_IMAGE_V_MIRROR://IMAGE_HV_MIRROR: GC2355_write_cmos_sensor(0x17,0x16); GC2355_write_cmos_sensor(0x92,0x02); - GC2355_write_cmos_sensor(0x94,0x05); + GC2355_write_cmos_sensor(0x94,0x07); break; - case GC2355_IMAGE_HV_MIRROR://IMAGE_HV_MIRROR: + case GC2355_IMAGE_HV_MIRROR://IMAGE_H_MIRROR: GC2355_write_cmos_sensor(0x17,0x17); GC2355_write_cmos_sensor(0x92,0x02); - GC2355_write_cmos_sensor(0x94,0x04); + GC2355_write_cmos_sensor(0x94,0x06); break; }*/ } @@ -665,47 +634,47 @@ static void GC2355_Sensor_Init(void) GC2355_write_cmos_sensor(0xfe,0x80); GC2355_write_cmos_sensor(0xfe,0x80); GC2355_write_cmos_sensor(0xfe,0x80); - GC2355_write_cmos_sensor(0xf2,0x00); - GC2355_write_cmos_sensor(0xf6,0x00); - GC2355_write_cmos_sensor(0xf7,0x19); - GC2355_write_cmos_sensor(0xf8,0x06); - GC2355_write_cmos_sensor(0xf9,0x4e); - GC2355_write_cmos_sensor(0xfa,0x00); + GC2355_write_cmos_sensor(0xf2,0x00); //sync_pad_io_ebi + GC2355_write_cmos_sensor(0xf6,0x00); //up down + GC2355_write_cmos_sensor(0xf7,0x19); //PLL enable + GC2355_write_cmos_sensor(0xf8,0x06); //PLL mode 2 + GC2355_write_cmos_sensor(0xf9,0x4e); //[0]PLL enable + GC2355_write_cmos_sensor(0xfa,0x00); //div GC2355_write_cmos_sensor(0xfc,0x06); GC2355_write_cmos_sensor(0xfe,0x00); ///////////////////////////////////////////////////// ////////////////// ANALOG & CISCTL /////////////// ///////////////////////////////////////////////////// - GC2355_write_cmos_sensor(0x03,0x07); - GC2355_write_cmos_sensor(0x04,0xd0); - GC2355_write_cmos_sensor(0x05,0x03); - GC2355_write_cmos_sensor(0x06,0x4c); + GC2355_write_cmos_sensor(0x03,0x0a); + GC2355_write_cmos_sensor(0x04,0x33); + GC2355_write_cmos_sensor(0x05,0x01); //max 20fps + GC2355_write_cmos_sensor(0x06,0x22); GC2355_write_cmos_sensor(0x07,0x00); - GC2355_write_cmos_sensor(0x08,0x12); - GC2355_write_cmos_sensor(0x0a,0x00); - GC2355_write_cmos_sensor(0x0c,0x04); + GC2355_write_cmos_sensor(0x08,0x0a); + GC2355_write_cmos_sensor(0x0a,0x00); //row start + GC2355_write_cmos_sensor(0x0c,0x04); //0c//col start GC2355_write_cmos_sensor(0x0d,0x04); GC2355_write_cmos_sensor(0x0e,0xc0); GC2355_write_cmos_sensor(0x0f,0x06); - GC2355_write_cmos_sensor(0x10,0x50); - GC2355_write_cmos_sensor(0x17,0x17); // mirror + GC2355_write_cmos_sensor(0x10,0x50); //Window setting 1616x1216 + GC2355_write_cmos_sensor(0x17,0x14); //16 GC2355_write_cmos_sensor(0x19,0x0b); GC2355_write_cmos_sensor(0x1b,0x48); GC2355_write_cmos_sensor(0x1c,0x12); GC2355_write_cmos_sensor(0x1d,0x10); - GC2355_write_cmos_sensor(0x1e,0xbc); - GC2355_write_cmos_sensor(0x1f,0xc9); + GC2355_write_cmos_sensor(0x1e,0xbc); //col_r/rowclk_mode/rsthigh_en FPN + GC2355_write_cmos_sensor(0x1f,0xc8); //rsgl_s_mode/vpix_s_mode µÆ¹ÜºáÌõÎÆ GC2355_write_cmos_sensor(0x20,0x71); - GC2355_write_cmos_sensor(0x21,0x20); + GC2355_write_cmos_sensor(0x21,0x20); //rsg GC2355_write_cmos_sensor(0x22,0xa0); GC2355_write_cmos_sensor(0x23,0x51); - GC2355_write_cmos_sensor(0x24,0x1b); + GC2355_write_cmos_sensor(0x24,0x1b); //drv GC2355_write_cmos_sensor(0x27,0x20); GC2355_write_cmos_sensor(0x28,0x00); - GC2355_write_cmos_sensor(0x2b,0x80);// 0x81 20140926 - GC2355_write_cmos_sensor(0x2c,0x38); - GC2355_write_cmos_sensor(0x2e,0x16); + GC2355_write_cmos_sensor(0x2b,0x81); //sf_s_mode FPN + GC2355_write_cmos_sensor(0x2c,0x38); //ispg FPN + GC2355_write_cmos_sensor(0x2e,0x16); //eq width GC2355_write_cmos_sensor(0x2f,0x14); GC2355_write_cmos_sensor(0x30,0x00); GC2355_write_cmos_sensor(0x31,0x01); @@ -718,7 +687,7 @@ static void GC2355_Sensor_Init(void) ///////////////////////////////////////////////////// ////////////////////// ISP ///////////////////// ///////////////////////////////////////////////////// - GC2355_write_cmos_sensor(0x8c,0x02); + GC2355_write_cmos_sensor(0x8c,0x02);// ///////////////////////////////////////////////////// ////////////////////// gain ///////////////////// @@ -734,15 +703,15 @@ static void GC2355_Sensor_Init(void) ///////////////////////////////////////////////////// /////////////////////// crop ////////////////////// ///////////////////////////////////////////////////// - GC2355_write_cmos_sensor(0x92,0x01); - GC2355_write_cmos_sensor(0x94,0x05); + GC2355_write_cmos_sensor(0x92,0x03); + GC2355_write_cmos_sensor(0x94,0x07);//00 GC2355_write_cmos_sensor(0x95,0x04); GC2355_write_cmos_sensor(0x96,0xb0); GC2355_write_cmos_sensor(0x97,0x06); - GC2355_write_cmos_sensor(0x98,0x40); + GC2355_write_cmos_sensor(0x98,0x40); //out window set 1600x1200 ///////////////////////////////////////////////////// - /////////////////////// BLK ////////////////////// + /////////////////////// BLK ////////////////////// ///////////////////////////////////////////////////// GC2355_write_cmos_sensor(0x18,0x02); GC2355_write_cmos_sensor(0x1a,0x01); @@ -760,20 +729,20 @@ static void GC2355_Sensor_Init(void) GC2355_write_cmos_sensor(0x4f,0x00); GC2355_write_cmos_sensor(0x5e,0x00); GC2355_write_cmos_sensor(0x66,0x20); - GC2355_write_cmos_sensor(0x6a,0x02); - GC2355_write_cmos_sensor(0x6b,0x02); - GC2355_write_cmos_sensor(0x6c,0x02); - GC2355_write_cmos_sensor(0x6d,0x02); - GC2355_write_cmos_sensor(0x6e,0x02); - GC2355_write_cmos_sensor(0x6f,0x02); - GC2355_write_cmos_sensor(0x70,0x02); - GC2355_write_cmos_sensor(0x71,0x02); + GC2355_write_cmos_sensor(0x6a,0x00); //manual offset + GC2355_write_cmos_sensor(0x6b,0x00); + GC2355_write_cmos_sensor(0x6c,0x00); + GC2355_write_cmos_sensor(0x6d,0x00); + GC2355_write_cmos_sensor(0x6e,0x00); + GC2355_write_cmos_sensor(0x6f,0x00); + GC2355_write_cmos_sensor(0x70,0x00); + GC2355_write_cmos_sensor(0x71,0x00); ///////////////////////////////////////////////////// //////////////////// dark sun ///////////////////// ///////////////////////////////////////////////////// GC2355_write_cmos_sensor(0x87,0x03); - GC2355_write_cmos_sensor(0xe0,0xe7); + GC2355_write_cmos_sensor(0xe0,0xe7); //dark sun en GC2355_write_cmos_sensor(0xe3,0xc0); ///////////////////////////////////////////////////// @@ -817,6 +786,7 @@ static void GC2355_Sensor_Init(void) UINT32 GC2355Open(void) { kal_uint16 sensor_id=0; + // check if sensor ID correct sensor_id=((GC2355_read_cmos_sensor(0xf0) << 8) | GC2355_read_cmos_sensor(0xf1)); #ifdef GC2355_DRIVER_TRACE @@ -1000,7 +970,7 @@ UINT32 GC2355GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, pSensorInfo->VideoDelayFrame = 1; pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_4MA; pSensorInfo->AEShutDelayFrame =0; /* The frame of setting shutter default 0 for TG int */ pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ pSensorInfo->AEISPGainDelayFrame = 2; @@ -1076,15 +1046,6 @@ UINT32 GC2355Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WIND UINT32 GC2355SetVideoMode(UINT16 u2FrameRate) {}; -/*****add by zero *********/ -UINT32 GC2355SetTestPatternMode(kal_bool bEnable) -{ - printk("zero %s\n ",__func__); - GC2355_write_cmos_sensor(0x17,0x14); // mirror - GC2355_write_cmos_sensor(0x92,0x02); - GC2355_write_cmos_sensor(0x94,0x04); -} -/*******end*************/ UINT32 GC2355FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) { @@ -1207,31 +1168,6 @@ UINT32 GC2355FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, break; case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - GC2355SetTestPatternMode((BOOL)*pFeatureData16); //add by zero - break; - /*SZ TCT xuejian.zhong add for CTS test */ - case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: - GC2355GetAFMaxNumFocusAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: - GC2355GetAEMaxNumMeteringAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - SENSORDB("SENSOR_FEATURE_GET_EXIF_INFO\n"); - - GC2355GetExifInfo(*pFeatureReturnPara32); - break; - /* xuejian.zhong add end */ - - - - default: break; } diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Sensor.h new file mode 100644 index 00000000000..0ba4de759a2 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_Sensor.h @@ -0,0 +1,143 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef _GC2355_SENSOR_H +#define _GC2355_SENSOR_H + +#define GC2355_DEBUG +#define GC2355_DRIVER_TRACE +//#define GC2355_TEST_PATTEM + +#define GC2355_FACTORY_START_ADDR 0 +#define GC2355_ENGINEER_START_ADDR 10 + +typedef enum GC2355_group_enum +{ + GC2355_PRE_GAIN = 0, + GC2355_CMMCLK_CURRENT, + GC2355_FRAME_RATE_LIMITATION, + GC2355_REGISTER_EDITOR, + GC2355_GROUP_TOTAL_NUMS +} GC2355_FACTORY_GROUP_ENUM; + +typedef enum GC2355_register_index +{ + GC2355_SENSOR_BASEGAIN = GC2355_FACTORY_START_ADDR, + GC2355_PRE_GAIN_R_INDEX, + GC2355_PRE_GAIN_Gr_INDEX, + GC2355_PRE_GAIN_Gb_INDEX, + GC2355_PRE_GAIN_B_INDEX, + GC2355_FACTORY_END_ADDR +} GC2355_FACTORY_REGISTER_INDEX; + +typedef enum GC2355_engineer_index +{ + GC2355_CMMCLK_CURRENT_INDEX = GC2355_ENGINEER_START_ADDR, + GC2355_ENGINEER_END +} GC2355_FACTORY_ENGINEER_INDEX; + +typedef struct _sensor_data_struct +{ + SENSOR_REG_STRUCT reg[GC2355_ENGINEER_END]; + SENSOR_REG_STRUCT cct[GC2355_FACTORY_END_ADDR]; +} sensor_data_struct; + +/* SENSOR PREVIEW/CAPTURE VT CLOCK */ +#define GC2355_PREVIEW_CLK 42000000 +#define GC2355_CAPTURE_CLK 42000000 + +#define GC2355_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW_B //SENSOR_OUTPUT_FORMAT_RAW_Gb //SENSOR_OUTPUT_FORMAT_RAW_R + +#define GC2355_MIN_ANALOG_GAIN 1 /* 1x */ +#define GC2355_MAX_ANALOG_GAIN 4 /* 2.8x */ + + +/* FRAME RATE UNIT */ +#define GC2355_FPS(x) (10 * (x)) + +/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ + +#define GC2355_FULL_PERIOD_PIXEL_NUMS 1126 +#define GC2355_FULL_PERIOD_LINE_NUMS 1242 + +#define GC2355_VIDEO_PERIOD_PIXEL_NUMS 1126 +#define GC2355_VIDEO_PERIOD_LINE_NUMS 1242 + +#define GC2355_PV_PERIOD_PIXEL_NUMS 1126 +#define GC2355_PV_PERIOD_LINE_NUMS 1242 + +/* SENSOR START/END POSITION */ +#define GC2355_FULL_X_START 0 +#define GC2355_FULL_Y_START 0 +#define GC2355_IMAGE_SENSOR_FULL_WIDTH (1600 - 8) +#define GC2355_IMAGE_SENSOR_FULL_HEIGHT (1200 - 6) + +#define GC2355_VIDEO_X_START 0 +#define GC2355_VIDEO_Y_START 0 +#define GC2355_IMAGE_SENSOR_VIDEO_WIDTH (1600) +#define GC2355_IMAGE_SENSOR_VIDEO_HEIGHT (1200) + +#define GC2355_PV_X_START 0 +#define GC2355_PV_Y_START 0 +#define GC2355_IMAGE_SENSOR_PV_WIDTH (1600 - 8) +#define GC2355_IMAGE_SENSOR_PV_HEIGHT (1200 - 6) + +/* SENSOR READ/WRITE ID */ +#define GC2355_WRITE_ID (0x78) +#define GC2355_READ_ID (0x79) + +/* SENSOR ID */ +//#define GC2355_SENSOR_ID (0x2355) + +/* SENSOR PRIVATE STRUCT */ +typedef enum { + SENSOR_MODE_INIT = 0, + SENSOR_MODE_PREVIEW, + SENSOR_MODE_VIDEO, + SENSOR_MODE_CAPTURE +} GC2355_SENSOR_MODE; + +typedef enum{ + GC2355_IMAGE_NORMAL = 0, + GC2355_IMAGE_H_MIRROR, + GC2355_IMAGE_V_MIRROR, + GC2355_IMAGE_HV_MIRROR +}GC2355_IMAGE_MIRROR; + +typedef struct GC2355_sensor_STRUCT +{ + MSDK_SENSOR_CONFIG_STRUCT cfg_data; + sensor_data_struct eng; /* engineer mode */ + MSDK_SENSOR_ENG_INFO_STRUCT eng_info; + GC2355_SENSOR_MODE sensorMode; + GC2355_IMAGE_MIRROR Mirror; + kal_bool pv_mode; + kal_bool video_mode; + kal_bool NightMode; + kal_uint16 normal_fps; /* video normal mode max fps */ + kal_uint16 night_fps; /* video night mode max fps */ + kal_uint16 FixedFps; + kal_uint16 shutter; + kal_uint16 gain; + kal_uint32 pclk; + kal_uint16 frame_height; + kal_uint16 frame_height_BackUp; + kal_uint16 line_length; + kal_uint16 Prv_line_length; +} GC2355_sensor_struct; + +typedef enum GC2355_GainMode_Index +{ + GC2355_Analogic_Gain = 0, + GC2355_Digital_Gain +}GC2355_GainMode_Index; +//export functions +UINT32 GC2355Open(void); +UINT32 GC2355Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2355FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); +UINT32 GC2355GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2355GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); +UINT32 GC2355Close(void); + +#define Sleep(ms) mdelay(ms) + +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_CameraCustomized.h deleted file mode 100644 index 01398777786..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_CameraCustomized.h +++ /dev/null @@ -1,157 +0,0 @@ -/* Copyright Statement: - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. The information contained herein - * is confidential and proprietary to MediaTek Inc. and/or its licensors. - * Without the prior written permission of MediaTek inc. and/or its licensors, - * any reproduction, modification, use or disclosure of MediaTek Software, - * and information contained herein, in whole or in part, shall be strictly prohibited. - */ -/* MediaTek Inc. (C) 2010. All rights reserved. - * - * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES - * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") - * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON - * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE - * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR - * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH - * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES - * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES - * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK - * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR - * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND - * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, - * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, - * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO - * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - */ - -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of camera customized parameters. - * - * - * Author: - * ------- - * Leo Lee - * - *============================================================================ - * HISTORY - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 03 01 2013 - * First release GC2355MIPI driver Version 1.0 - * - *------------------------------------------------------------------------------ - *============================================================================ - ****************************************************************************/ - -#ifndef __CAMERA_CUSTOMIZED_H -#define __CAMERA_CUSTOMIZED_H - -// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 -#define MAIN_SENSOR_ORIENTATION_ANGLE 90 -#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist - - -// First, we think you hold the cell phone vertical. -// Second, we suppose the direction of upward is 0 -// Third, it is 90, 180, 270 in clockwise -// here we define the main sensor and sub sensor angles to deal with the jpeg orientation -#define MAIN_SENSOR_TO_PHONE_ANGLE 90 -#define SUB_SENSOR_TO_PHONE_ANGLE 0 - - -#define CAM_SIZE_QVGA_WIDTH 320 -#define CAM_SIZE_QVGA_HEIGHT 240 -#define CAM_SIZE_VGA_WIDTH 640 -#define CAM_SIZE_VGA_HEIGHT 480 -#define CAM_SIZE_05M_WIDTH 800 -#define CAM_SIZE_05M_HEIGHT 600 -#define CAM_SIZE_1M_WIDTH 1280 -#define CAM_SIZE_1M_HEIGHT 960 -#define CAM_SIZE_2M_WIDTH 1600 -#define CAM_SIZE_2M_HEIGHT 1200 -#define CAM_SIZE_3M_WIDTH 2048 -#define CAM_SIZE_3M_HEIGHT 1536 -#define CAM_SIZE_5M_WIDTH 2592 -#define CAM_SIZE_5M_HEIGHT 1944 - -// for main sensor -#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 -#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 -#define MAIN_NUM_OF_STILL_RESOLUTION 7 -#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} -#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} -#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ - {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ - {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ - {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ - {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ - {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ - {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} - -// if sub sensor does not exist, set all the parameters as 0 -#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 -#define SUB_NUM_OF_VIDEO_RESOLUTION 0 -#define SUB_NUM_OF_STILL_RESOLUTION 0 -#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} -#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} -#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} - -//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) -//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) -//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) - -#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Camera_Sensor_para.h deleted file mode 100644 index 0f75967d263..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Camera_Sensor_para.h +++ /dev/null @@ -1,90 +0,0 @@ -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * camera_sensor_para.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of Sensor tuning parameters that should be generated by CCT - * - * - * Author: - * ------- - * Leo Lee - * - *============================================================================ - * HISTORY - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 03 01 2013 - * First release GC2355MIPI driver Version 1.0 - * - *------------------------------------------------------------------------------ - *============================================================================ - ****************************************************************************/ -#ifndef _GC2355MIPI_CAMERA_SENSOR_PARA_H -#define _GC2355MIPI_CAMERA_SENSOR_PARA_H - -#define GC2355MIPI_CAMERA_SENSOR_REG_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,ISP_DRIVING_6MA}, \ -} - -#define GC2355MIPI_CAMERA_SENSOR_CCT_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40}, \ -} - -#endif /* __CAMERA_SENSOR_PARA_H */ -/* SENSOR FULL SIZE */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Sensor.c deleted file mode 100644 index 0950de849e9..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Sensor.c +++ /dev/null @@ -1,1304 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * Leo Lee - * - *============================================================================ - * HISTORY - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 04 10 2013 - * First release MT6589 GC2355MIPI driver Version 1.0 - * - *------------------------------------------------------------------------------ - *============================================================================ - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "gc2355mipi_Sensor.h" -#include "gc2355mipi_Camera_Sensor_para.h" -#include "gc2355mipi_CameraCustomized.h" - -#ifdef GC2355MIPI_DEBUG -#define SENSORDB printk -#else -#define SENSORDB(x,...) -#endif - -#define GC2355MIPI_2Lane //MIPI Lane NUM - -#if defined(MT6577)||defined(MT6589) -static DEFINE_SPINLOCK(gc2355mipi_drv_lock); -#endif -//static kal_uint16 Half_iShutter=0; -static kal_bool b_Enable_Half = false; -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); - -/* SZ TCT xuejian.zhong add for CTS test*/ -static void GC2355GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - // SENSORDB("OV2680GetAFMaxNumFocusAreas *pFeatureReturnPara32 = %dÂ¥n", *pFeatureReturnPara32); -} - -static void GC2355GetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - // SENSORDB("OV2680GetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %dÂ¥n", *pFeatureReturnPara32); -} - -static void GC2355GetExifInfo(UINT32 exifAddr) -{ - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = AE_ISO_100; - pExifInfo->AWBMode = AWB_MODE_AUTO; - pExifInfo->CapExposureTime = 0; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = AE_ISO_100; -} - -/* SZ TCT xuejian.zhong end */ - - - -static GC2355MIPI_sensor_struct GC2355MIPI_sensor = -{ - .eng_info = - { - .SensorId = 128, - .SensorType = CMOS_SENSOR, - .SensorOutputDataFormat = GC2355MIPI_COLOR_FORMAT, - }, - .Mirror = GC2355MIPI_IMAGE_H_MIRROR, - .shutter = 0x20, - .gain = 0x20, - .pclk = GC2355MIPI_PREVIEW_CLK, - .frame_height = GC2355MIPI_PV_PERIOD_LINE_NUMS, - .line_length = GC2355MIPI_PV_PERIOD_PIXEL_NUMS, -}; - - -/************************************************************************* -* FUNCTION -* GC2355MIPI_write_cmos_sensor -* -* DESCRIPTION -* This function wirte data to CMOS sensor through I2C -* -* PARAMETERS -* addr: the 16bit address of register -* para: the 8bit value of register -* -* RETURNS -* None -* -* LOCAL AFFECTED -* -*************************************************************************/ -static void GC2355MIPI_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) -{ -kal_uint8 out_buff[2]; - - out_buff[0] = addr; - out_buff[1] = para; - - iWriteRegI2C((u8*)out_buff , (u16)sizeof(out_buff), GC2355MIPI_WRITE_ID); -} - -/************************************************************************* -* FUNCTION -* GC2035_read_cmos_sensor -* -* DESCRIPTION -* This function read data from CMOS sensor through I2C. -* -* PARAMETERS -* addr: the 16bit address of register -* -* RETURNS -* 8bit data read through I2C -* -* LOCAL AFFECTED -* -*************************************************************************/ -static kal_uint8 GC2355MIPI_read_cmos_sensor(kal_uint8 addr) -{ - kal_uint8 in_buff[1] = {0xFF}; - kal_uint8 out_buff[1]; - - out_buff[0] = addr; - - if (0 != iReadRegI2C((u8*)out_buff , (u16) sizeof(out_buff), (u8*)in_buff, (u16) sizeof(in_buff), GC2355MIPI_WRITE_ID)) { - SENSORDB("ERROR: GC2355MIPI_read_cmos_sensor \n"); - } - return in_buff[0]; -} - -/************************************************************************* -* FUNCTION -* GC2355MIPI_SetShutter -* -* DESCRIPTION -* This function set e-shutter of GC2355MIPI to change exposure time. -* -* PARAMETERS -* iShutter : exposured lines -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void GC2355MIPI_set_shutter(kal_uint16 iShutter) -{ -#if defined(MT6577)||defined(MT6589) - spin_lock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_sensor.shutter = iShutter; -#if defined(MT6577)||defined(MT6589) - spin_unlock(&gc2355mipi_drv_lock); -#endif - - if (!iShutter) iShutter = 1; /* avoid 0 */ - -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_set_shutter iShutter = %d \n",iShutter); -#endif - if(iShutter < 7) iShutter = 7; - if(iShutter > 16383) iShutter = 16383;//2^14 - //Update Shutter - GC2355MIPI_write_cmos_sensor(0x04, (iShutter) & 0xFF); - GC2355MIPI_write_cmos_sensor(0x03, (iShutter >> 8) & 0x3F); -} /* Set_GC2355MIPI_Shutter */ - -/************************************************************************* -* FUNCTION -* GC2355MIPI_SetGain -* -* DESCRIPTION -* This function is to set global gain to sensor. -* -* PARAMETERS -* iGain : sensor global gain(base: 0x40) -* -* RETURNS -* the actually gain set to sensor. -* -* GLOBALS AFFECTED -* -*************************************************************************/ -#define ANALOG_GAIN_1 64 // 1.00x -#define ANALOG_GAIN_2 88 // 1.375x -#define ANALOG_GAIN_3 122 // 1.90x -#define ANALOG_GAIN_4 168 // 2.625x -#define ANALOG_GAIN_5 239 // 3.738x -#define ANALOG_GAIN_6 330 // 5.163x -#define ANALOG_GAIN_7 470 // 7.350x - -kal_uint16 GC2355MIPI_SetGain(kal_uint16 iGain) -{ - kal_uint16 iReg,temp,temp1,luma_value; - - #ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_SetGain iGain = %d \n",iGain); - #endif - GC2355MIPI_write_cmos_sensor(0xb1, 0x01); - GC2355MIPI_write_cmos_sensor(0xb2, 0x00); - - iReg = iGain; - if(iReg < 0x40) - iReg = 0x40; - if((ANALOG_GAIN_1<= iReg)&&(iReg < ANALOG_GAIN_2)) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x00);// - temp = iReg; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 1x , add pregain = %d\n",temp); - - } - else if((ANALOG_GAIN_2<= iReg)&&(iReg < ANALOG_GAIN_3)) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x01);// - temp = 64*iReg/ANALOG_GAIN_2; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 1.375x , add pregain = %d\n",temp); - } - - else if((ANALOG_GAIN_3<= iReg)&&(iReg < ANALOG_GAIN_4)) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x02);// - temp = 64*iReg/ANALOG_GAIN_3; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 1.90x , add pregain = %d\n",temp); - } - - else if(ANALOG_GAIN_4<= iReg) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x03);// - temp = 64*iReg/ANALOG_GAIN_4; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 2.625x" , add pregain = %d\n",temp); - } -/* else if((ANALOG_GAIN_4<= iReg)&&(iReg < ANALOG_GAIN_5)) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x03);// - temp = 64*iReg/ANALOG_GAIN_4; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 2.625x , add pregain = %d\n",temp); - } - - else if((ANALOG_GAIN_5<= iReg)&&(iReg)&&(iReg < ANALOG_GAIN_6)) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x04);// - temp = 64*iReg/ANALOG_GAIN_5; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 3.738x , add pregain = %d\n",temp); - } - - else if((ANALOG_GAIN_6<= iReg)&&(iReg < ANALOG_GAIN_7)) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x05);// - temp = 64*iReg/ANALOG_GAIN_6; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 5.163x , add pregain = %d\n",temp); - } - else if(ANALOG_GAIN_7<= iReg) - { - //analog gain - GC2355MIPI_write_cmos_sensor(0xb6, 0x06);// - temp = 64*iReg/ANALOG_GAIN_7; - GC2355MIPI_write_cmos_sensor(0xb1, temp>>6); - GC2355MIPI_write_cmos_sensor(0xb2, (temp<<2)&0xfc); - //SENSORDB("GC2355 analogic gain 7.350x" , add pregain = %d\n",temp); - } -#endif*/ - - return iGain; -} -/************************************************************************* -* FUNCTION -* GC2355MIPI_NightMode -* -* DESCRIPTION -* This function night mode of GC2355MIPI. -* -* PARAMETERS -* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void GC2355MIPI_night_mode(kal_bool enable) -{ -/*No Need to implement this function*/ -#if 0 - const kal_uint16 dummy_pixel = GC2355MIPI_sensor.line_length - GC2355MIPI_PV_PERIOD_PIXEL_NUMS; - const kal_uint16 pv_min_fps = enable ? GC2355MIPI_sensor.night_fps : GC2355MIPI_sensor.normal_fps; - kal_uint16 dummy_line = GC2355MIPI_sensor.frame_height - GC2355MIPI_PV_PERIOD_LINE_NUMS; - kal_uint16 max_exposure_lines; - - printk("[GC2355MIPI_night_mode]enable=%d",enable); - if (!GC2355MIPI_sensor.video_mode) return; - max_exposure_lines = GC2355MIPI_sensor.pclk * GC2355MIPI_FPS(1) / (pv_min_fps * GC2355MIPI_sensor.line_length); - if (max_exposure_lines > GC2355MIPI_sensor.frame_height) /* fix max frame rate, AE table will fix min frame rate */ -// { -// dummy_line = max_exposure_lines - GC2355MIPI_PV_PERIOD_LINE_NUMS; -// } -#endif -} /* GC2355MIPI_NightMode */ - - -/* write camera_para to sensor register */ -static void GC2355MIPI_camera_para_to_sensor(void) -{ - kal_uint32 i; -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_camera_para_to_sensor\n"); -#endif - for (i = 0; 0xFFFFFFFF != GC2355MIPI_sensor.eng.reg[i].Addr; i++) - { - GC2355MIPI_write_cmos_sensor(GC2355MIPI_sensor.eng.reg[i].Addr, GC2355MIPI_sensor.eng.reg[i].Para); - } - for (i = GC2355MIPI_FACTORY_START_ADDR; 0xFFFFFFFF != GC2355MIPI_sensor.eng.reg[i].Addr; i++) - { - GC2355MIPI_write_cmos_sensor(GC2355MIPI_sensor.eng.reg[i].Addr, GC2355MIPI_sensor.eng.reg[i].Para); - } - GC2355MIPI_SetGain(GC2355MIPI_sensor.gain); /* update gain */ -} - -/* update camera_para from sensor register */ -static void GC2355MIPI_sensor_to_camera_para(void) -{ - kal_uint32 i,temp_data; -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_sensor_to_camera_para\n"); -#endif - for (i = 0; 0xFFFFFFFF != GC2355MIPI_sensor.eng.reg[i].Addr; i++) - { - temp_data = GC2355MIPI_read_cmos_sensor(GC2355MIPI_sensor.eng.reg[i].Addr); -#if defined(MT6577)||defined(MT6589) - spin_lock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_sensor.eng.reg[i].Para = temp_data; -#if defined(MT6577)||defined(MT6589) - spin_unlock(&gc2355mipi_drv_lock); -#endif - } - for (i = GC2355MIPI_FACTORY_START_ADDR; 0xFFFFFFFF != GC2355MIPI_sensor.eng.reg[i].Addr; i++) - { - temp_data = GC2355MIPI_read_cmos_sensor(GC2355MIPI_sensor.eng.reg[i].Addr); -#if defined(MT6577)||defined(MT6589) - spin_lock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_sensor.eng.reg[i].Para = temp_data; -#if defined(MT6577)||defined(MT6589) - spin_unlock(&gc2355mipi_drv_lock); -#endif - } -} - -/* ------------------------ Engineer mode ------------------------ */ -inline static void GC2355MIPI_get_sensor_group_count(kal_int32 *sensor_count_ptr) -{ -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_get_sensor_group_count\n"); -#endif - *sensor_count_ptr = GC2355MIPI_GROUP_TOTAL_NUMS; -} - -inline static void GC2355MIPI_get_sensor_group_info(MSDK_SENSOR_GROUP_INFO_STRUCT *para) -{ -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_get_sensor_group_info\n"); -#endif - switch (para->GroupIdx) - { - case GC2355MIPI_PRE_GAIN: - sprintf(para->GroupNamePtr, "CCT"); - para->ItemCount = 5; - break; - case GC2355MIPI_CMMCLK_CURRENT: - sprintf(para->GroupNamePtr, "CMMCLK Current"); - para->ItemCount = 1; - break; - case GC2355MIPI_FRAME_RATE_LIMITATION: - sprintf(para->GroupNamePtr, "Frame Rate Limitation"); - para->ItemCount = 2; - break; - case GC2355MIPI_REGISTER_EDITOR: - sprintf(para->GroupNamePtr, "Register Editor"); - para->ItemCount = 2; - break; - default: - ASSERT(0); - } -} - -inline static void GC2355MIPI_get_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - - const static kal_char *cct_item_name[] = {"SENSOR_BASEGAIN", "Pregain-R", "Pregain-Gr", "Pregain-Gb", "Pregain-B"}; - const static kal_char *editer_item_name[] = {"REG addr", "REG value"}; - -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_get_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case GC2355MIPI_PRE_GAIN: - switch (para->ItemIdx) - { - case GC2355MIPI_SENSOR_BASEGAIN: - case GC2355MIPI_PRE_GAIN_R_INDEX: - case GC2355MIPI_PRE_GAIN_Gr_INDEX: - case GC2355MIPI_PRE_GAIN_Gb_INDEX: - case GC2355MIPI_PRE_GAIN_B_INDEX: - break; - default: - ASSERT(0); - } - sprintf(para->ItemNamePtr, cct_item_name[para->ItemIdx - GC2355MIPI_SENSOR_BASEGAIN]); - para->ItemValue = GC2355MIPI_sensor.eng.cct[para->ItemIdx].Para * 1000 / BASEGAIN; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = GC2355MIPI_MIN_ANALOG_GAIN * 1000; - para->Max = GC2355MIPI_MAX_ANALOG_GAIN * 1000; - break; - case GC2355MIPI_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Drv Cur[2,4,6,8]mA"); - switch (GC2355MIPI_sensor.eng.reg[GC2355MIPI_CMMCLK_CURRENT_INDEX].Para) - { - case ISP_DRIVING_2MA: - para->ItemValue = 2; - break; - case ISP_DRIVING_4MA: - para->ItemValue = 4; - break; - case ISP_DRIVING_6MA: - para->ItemValue = 6; - break; - case ISP_DRIVING_8MA: - para->ItemValue = 8; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsReadOnly = KAL_FALSE; - para->IsNeedRestart = KAL_TRUE; - para->Min = 2; - para->Max = 8; - break; - default: - ASSERT(0); - } - break; - case GC2355MIPI_FRAME_RATE_LIMITATION: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Max Exposure Lines"); - para->ItemValue = 5998; - break; - case 1: - sprintf(para->ItemNamePtr, "Min Frame Rate"); - para->ItemValue = 5; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsNeedRestart = KAL_FALSE; - para->IsReadOnly = KAL_TRUE; - para->Min = para->Max = 0; - break; - case GC2355MIPI_REGISTER_EDITOR: - switch (para->ItemIdx) - { - case 0: - case 1: - sprintf(para->ItemNamePtr, editer_item_name[para->ItemIdx]); - para->ItemValue = 0; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = 0; - para->Max = (para->ItemIdx == 0 ? 0xFFFF : 0xFF); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - -inline static kal_bool GC2355MIPI_set_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - kal_uint16 temp_para; -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPI_set_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case GC2355MIPI_PRE_GAIN: - switch (para->ItemIdx) - { - case GC2355MIPI_SENSOR_BASEGAIN: - case GC2355MIPI_PRE_GAIN_R_INDEX: - case GC2355MIPI_PRE_GAIN_Gr_INDEX: - case GC2355MIPI_PRE_GAIN_Gb_INDEX: - case GC2355MIPI_PRE_GAIN_B_INDEX: -#if defined(MT6577)||defined(MT6589) - spin_lock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_sensor.eng.cct[para->ItemIdx].Para = para->ItemValue * BASEGAIN / 1000; -#if defined(MT6577)||defined(MT6589) - spin_unlock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_SetGain(GC2355MIPI_sensor.gain); /* update gain */ - break; - default: - ASSERT(0); - } - break; - case GC2355MIPI_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - switch (para->ItemValue) - { - case 2: - temp_para = ISP_DRIVING_2MA; - break; - case 3: - case 4: - temp_para = ISP_DRIVING_4MA; - break; - case 5: - case 6: - temp_para = ISP_DRIVING_6MA; - break; - default: - temp_para = ISP_DRIVING_8MA; - break; - } - //GC2355MIPI_set_isp_driving_current(temp_para); -#if defined(MT6577)||defined(MT6589) - spin_lock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_sensor.eng.reg[GC2355MIPI_CMMCLK_CURRENT_INDEX].Para = temp_para; -#if defined(MT6577)||defined(MT6589) - spin_unlock(&gc2355mipi_drv_lock); -#endif - break; - default: - ASSERT(0); - } - break; - case GC2355MIPI_FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case GC2355MIPI_REGISTER_EDITOR: - switch (para->ItemIdx) - { - static kal_uint32 fac_sensor_reg; - case 0: - if (para->ItemValue < 0 || para->ItemValue > 0xFFFF) return KAL_FALSE; - fac_sensor_reg = para->ItemValue; - break; - case 1: - if (para->ItemValue < 0 || para->ItemValue > 0xFF) return KAL_FALSE; - GC2355MIPI_write_cmos_sensor(fac_sensor_reg, para->ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} - -void GC2355MIPI_SetMirrorFlip(GC2355MIPI_IMAGE_MIRROR Mirror) -{ -/* switch(Mirror) - { - case GC2355MIPI_IMAGE_NORMAL://IMAGE_NORMAL: - GC2355MIPI_write_cmos_sensor(0x17,0x14); - GC2355MIPI_write_cmos_sensor(0x92,0x01); - GC2355MIPI_write_cmos_sensor(0x94,0x01); - break; - case GC2355MIPI_IMAGE_H_MIRROR://IMAGE_H_MIRROR: - GC2355MIPI_write_cmos_sensor(0x17,0x15); - GC2355MIPI_write_cmos_sensor(0x92,0x01); - GC2355MIPI_write_cmos_sensor(0x94,0x00); - break; - case GC2355MIPI_IMAGE_V_MIRROR://IMAGE_V_MIRROR: - GC2355MIPI_write_cmos_sensor(0x17,0x16); - GC2355MIPI_write_cmos_sensor(0x92,0x02); - GC2355MIPI_write_cmos_sensor(0x94,0x01); - break; - case GC2355MIPI_IMAGE_HV_MIRROR://IMAGE_HV_MIRROR: - GC2355MIPI_write_cmos_sensor(0x17,0x17); - GC2355MIPI_write_cmos_sensor(0x92,0x02); - GC2355MIPI_write_cmos_sensor(0x94,0x00); - break; - }*/ -} - -static void GC2355MIPI_Sensor_Init(void) -{ - ///////////////////////////////////////////////////// - ////////////////////// SYS ////////////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0xfe,0x80); - GC2355MIPI_write_cmos_sensor(0xfe,0x80); - GC2355MIPI_write_cmos_sensor(0xfe,0x80); - GC2355MIPI_write_cmos_sensor(0xf2,0x00); - GC2355MIPI_write_cmos_sensor(0xf6,0x00); -#if defined(GC2355MIPI_2Lane) - GC2355MIPI_write_cmos_sensor(0xf7,0x31); -#else - GC2355MIPI_write_cmos_sensor(0xf7,0x19); -#endif - GC2355MIPI_write_cmos_sensor(0xf8,0x06); - GC2355MIPI_write_cmos_sensor(0xf9,0x0e); - GC2355MIPI_write_cmos_sensor(0xfa,0x00); - GC2355MIPI_write_cmos_sensor(0xfc,0x06); - GC2355MIPI_write_cmos_sensor(0xfe,0x00); - - ///////////////////////////////////////////////////// - /////////////// ANALOG & CISCTL /////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0x03,0x07); - GC2355MIPI_write_cmos_sensor(0x04,0xd0); - GC2355MIPI_write_cmos_sensor(0x05,0x03); - GC2355MIPI_write_cmos_sensor(0x06,0x4c); - GC2355MIPI_write_cmos_sensor(0x07,0x00); - GC2355MIPI_write_cmos_sensor(0x08,0x12); - GC2355MIPI_write_cmos_sensor(0x0a,0x00); - GC2355MIPI_write_cmos_sensor(0x0c,0x04); - GC2355MIPI_write_cmos_sensor(0x0d,0x04); - GC2355MIPI_write_cmos_sensor(0x0e,0xc0); - GC2355MIPI_write_cmos_sensor(0x0f,0x06); - GC2355MIPI_write_cmos_sensor(0x10,0x50); - GC2355MIPI_write_cmos_sensor(0x17,0x17); - GC2355MIPI_write_cmos_sensor(0x19,0x0b); - GC2355MIPI_write_cmos_sensor(0x1b,0x48); - GC2355MIPI_write_cmos_sensor(0x1c,0x12); - GC2355MIPI_write_cmos_sensor(0x1d,0x10); - GC2355MIPI_write_cmos_sensor(0x1e,0xbc); - GC2355MIPI_write_cmos_sensor(0x1f,0xc9); - GC2355MIPI_write_cmos_sensor(0x20,0x71); - GC2355MIPI_write_cmos_sensor(0x21,0x20); - GC2355MIPI_write_cmos_sensor(0x22,0xa0); - GC2355MIPI_write_cmos_sensor(0x23,0x51); - GC2355MIPI_write_cmos_sensor(0x24,0x19); - GC2355MIPI_write_cmos_sensor(0x27,0x20); - GC2355MIPI_write_cmos_sensor(0x28,0x00); - GC2355MIPI_write_cmos_sensor(0x2b,0x80);// 0x81 20140926 - GC2355MIPI_write_cmos_sensor(0x2c,0x38); - GC2355MIPI_write_cmos_sensor(0x2e,0x16); - GC2355MIPI_write_cmos_sensor(0x2f,0x14); - GC2355MIPI_write_cmos_sensor(0x30,0x00); - GC2355MIPI_write_cmos_sensor(0x31,0x01); - GC2355MIPI_write_cmos_sensor(0x32,0x02); - GC2355MIPI_write_cmos_sensor(0x33,0x03); - GC2355MIPI_write_cmos_sensor(0x34,0x07); - GC2355MIPI_write_cmos_sensor(0x35,0x0b); - GC2355MIPI_write_cmos_sensor(0x36,0x0f); - - ///////////////////////////////////////////////////// - ////////////////////// MIPI ///////////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0xfe, 0x03); -#if defined(GC2355MIPI_2Lane) - GC2355MIPI_write_cmos_sensor(0x10, 0x81); - GC2355MIPI_write_cmos_sensor(0x01, 0x87); - GC2355MIPI_write_cmos_sensor(0x22, 0x03); - GC2355MIPI_write_cmos_sensor(0x23, 0x20); - GC2355MIPI_write_cmos_sensor(0x25, 0x10); - GC2355MIPI_write_cmos_sensor(0x29, 0x02); -#else - GC2355MIPI_write_cmos_sensor(0x10, 0x80); - GC2355MIPI_write_cmos_sensor(0x01, 0x83); - GC2355MIPI_write_cmos_sensor(0x22, 0x05); - GC2355MIPI_write_cmos_sensor(0x23, 0x30); - GC2355MIPI_write_cmos_sensor(0x25, 0x15); - GC2355MIPI_write_cmos_sensor(0x29, 0x06); -#endif - GC2355MIPI_write_cmos_sensor(0x02, 0x00); - GC2355MIPI_write_cmos_sensor(0x03, 0x90); - GC2355MIPI_write_cmos_sensor(0x04, 0x01); - GC2355MIPI_write_cmos_sensor(0x05, 0x00); - GC2355MIPI_write_cmos_sensor(0x06, 0xa2); - GC2355MIPI_write_cmos_sensor(0x11, 0x2b); - GC2355MIPI_write_cmos_sensor(0x12, 0xd0); - GC2355MIPI_write_cmos_sensor(0x13, 0x07); - GC2355MIPI_write_cmos_sensor(0x15, 0x60); - - GC2355MIPI_write_cmos_sensor(0x21, 0x10); - GC2355MIPI_write_cmos_sensor(0x24, 0x02); - GC2355MIPI_write_cmos_sensor(0x26, 0x08); - GC2355MIPI_write_cmos_sensor(0x27, 0x06); - GC2355MIPI_write_cmos_sensor(0x2a, 0x0a); - GC2355MIPI_write_cmos_sensor(0x2b, 0x08); - - GC2355MIPI_write_cmos_sensor(0x40, 0x00); - GC2355MIPI_write_cmos_sensor(0x41, 0x00); - GC2355MIPI_write_cmos_sensor(0x42, 0x40); - GC2355MIPI_write_cmos_sensor(0x43, 0x06); - GC2355MIPI_write_cmos_sensor(0xfe, 0x00); - - ///////////////////////////////////////////////////// - ////////////////////// gain ///////////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0xb0,0x50); - GC2355MIPI_write_cmos_sensor(0xb1,0x01); - GC2355MIPI_write_cmos_sensor(0xb2,0x00); - GC2355MIPI_write_cmos_sensor(0xb3,0x40); - GC2355MIPI_write_cmos_sensor(0xb4,0x40); - GC2355MIPI_write_cmos_sensor(0xb5,0x40); - GC2355MIPI_write_cmos_sensor(0xb6,0x00); - - ///////////////////////////////////////////////////// - ////////////////////// crop ///////////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0x92,0x02); - GC2355MIPI_write_cmos_sensor(0x94,0x00); - GC2355MIPI_write_cmos_sensor(0x95,0x04); - GC2355MIPI_write_cmos_sensor(0x96,0xb0); - GC2355MIPI_write_cmos_sensor(0x97,0x06); - GC2355MIPI_write_cmos_sensor(0x98,0x40); - - ///////////////////////////////////////////////////// - ////////////////////// BLK ///////////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0x18,0x02); - GC2355MIPI_write_cmos_sensor(0x1a,0x01); - GC2355MIPI_write_cmos_sensor(0x40,0x42); - GC2355MIPI_write_cmos_sensor(0x41,0x00); - GC2355MIPI_write_cmos_sensor(0x44,0x00); - GC2355MIPI_write_cmos_sensor(0x45,0x00); - GC2355MIPI_write_cmos_sensor(0x46,0x00); - GC2355MIPI_write_cmos_sensor(0x47,0x00); - GC2355MIPI_write_cmos_sensor(0x48,0x00); - GC2355MIPI_write_cmos_sensor(0x49,0x00); - GC2355MIPI_write_cmos_sensor(0x4a,0x00); - GC2355MIPI_write_cmos_sensor(0x4b,0x00); - GC2355MIPI_write_cmos_sensor(0x4e,0x3c); - GC2355MIPI_write_cmos_sensor(0x4f,0x00); - GC2355MIPI_write_cmos_sensor(0x5e,0x00); - GC2355MIPI_write_cmos_sensor(0x66,0x20); - GC2355MIPI_write_cmos_sensor(0x6a,0x02); - GC2355MIPI_write_cmos_sensor(0x6b,0x02); - GC2355MIPI_write_cmos_sensor(0x6c,0x02); - GC2355MIPI_write_cmos_sensor(0x6d,0x02); - GC2355MIPI_write_cmos_sensor(0x6e,0x02); - GC2355MIPI_write_cmos_sensor(0x6f,0x02); - GC2355MIPI_write_cmos_sensor(0x70,0x02); - GC2355MIPI_write_cmos_sensor(0x71,0x02); - - ///////////////////////////////////////////////////// - //////////////////// dark sun ///////////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0x87,0x03); - GC2355MIPI_write_cmos_sensor(0xe0,0xe7); - GC2355MIPI_write_cmos_sensor(0xe3,0xc0); - - ///////////////////////////////////////////////////// - ////////////////////// MIPI ///////////////////// - ///////////////////////////////////////////////////// - GC2355MIPI_write_cmos_sensor(0xfe, 0x03); -#if defined(GC2355MIPI_2Lane) - GC2355MIPI_write_cmos_sensor(0x10, 0x91); -#else - GC2355MIPI_write_cmos_sensor(0x10, 0x90); -#endif - GC2355MIPI_write_cmos_sensor(0xfe, 0x00); - -} /* GC2355MIPI_Sensor_Init */ - -/*****************************************************************************/ -/* Windows Mobile Sensor Interface */ -/*****************************************************************************/ -/************************************************************************* -* FUNCTION -* GC2355MIPIOpen -* -* DESCRIPTION -* This function initialize the registers of CMOS sensor -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -UINT32 GC2355MIPIOpen(void) -{ - kal_uint16 sensor_id=0; - - // check if sensor ID correct - sensor_id=((GC2355MIPI_read_cmos_sensor(0xf0) << 8) | GC2355MIPI_read_cmos_sensor(0xf1)); -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPIOpen, sensor_id:%x \n",sensor_id); -#endif - if (sensor_id != GC2355MIPI_SENSOR_ID) - return ERROR_SENSOR_CONNECT_FAIL; - - /* initail sequence write in */ - GC2355MIPI_Sensor_Init(); - -// GC2355MIPI_SetMirrorFlip(GC2355MIPI_sensor.Mirror); - - return ERROR_NONE; -} /* GC2355MIPIOpen */ - -/************************************************************************* -* FUNCTION -* GC2355MIPIGetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* *sensorID : return the sensor ID -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 GC2355MIPIGetSensorID(UINT32 *sensorID) -{ - // check if sensor ID correct - *sensorID=((GC2355MIPI_read_cmos_sensor(0xf0) << 8) | GC2355MIPI_read_cmos_sensor(0xf1)); -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPIGetSensorID:%x \n",*sensorID); -#endif - if (*sensorID != GC2355MIPI_SENSOR_ID) { - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - return ERROR_NONE; -} - -/************************************************************************* -* FUNCTION -* GC2355MIPIClose -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 GC2355MIPIClose(void) -{ -#ifdef GC2355MIPI_DRIVER_TRACE - SENSORDB("GC2355MIPIClose\n"); -#endif - //kdCISModulePowerOn(SensorIdx,currSensorName,0,mode_name); -// DRV_I2CClose(GC2355MIPIhDrvI2C); - return ERROR_NONE; -} /* GC2355MIPIClose */ - -/************************************************************************* -* FUNCTION -* GC2355MIPIPreview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 GC2355MIPIPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - -#if defined(MT6577)||defined(MT6589) - spin_lock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_sensor.pv_mode = KAL_TRUE; - - //GC2355MIPI_set_mirror(sensor_config_data->SensorImageMirror); - switch (sensor_config_data->SensorOperationMode) - { - case MSDK_SENSOR_OPERATION_MODE_VIDEO: - GC2355MIPI_sensor.video_mode = KAL_TRUE; - default: /* ISP_PREVIEW_MODE */ - GC2355MIPI_sensor.video_mode = KAL_FALSE; - } - GC2355MIPI_sensor.line_length = GC2355MIPI_PV_PERIOD_PIXEL_NUMS; - GC2355MIPI_sensor.frame_height = GC2355MIPI_PV_PERIOD_LINE_NUMS; - GC2355MIPI_sensor.pclk = GC2355MIPI_PREVIEW_CLK; -#if defined(MT6577)||defined(MT6589) - spin_unlock(&gc2355mipi_drv_lock); -#endif - //GC2355MIPI_Write_Shutter(GC2355MIPI_sensor.shutter); - return ERROR_NONE; -} /* GC2355MIPIPreview */ - -/************************************************************************* -* FUNCTION -* GC2355MIPICapture -* -* DESCRIPTION -* This function setup the CMOS sensor in capture MY_OUTPUT mode -* -* PARAMETERS -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 GC2355MIPICapture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint32 shutter = (kal_uint32)GC2355MIPI_sensor.shutter; -#if defined(MT6577)||defined(MT6589) - spin_lock(&gc2355mipi_drv_lock); -#endif - GC2355MIPI_sensor.video_mode = KAL_FALSE; - GC2355MIPI_sensor.pv_mode = KAL_FALSE; -#if defined(MT6577)||defined(MT6589) - spin_unlock(&gc2355mipi_drv_lock); -#endif - return ERROR_NONE; -} /* GC2355MIPI_Capture() */ - -UINT32 GC2355MIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - pSensorResolution->SensorFullWidth=GC2355MIPI_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight=GC2355MIPI_IMAGE_SENSOR_FULL_HEIGHT; - pSensorResolution->SensorPreviewWidth=GC2355MIPI_IMAGE_SENSOR_PV_WIDTH; - pSensorResolution->SensorPreviewHeight=GC2355MIPI_IMAGE_SENSOR_PV_HEIGHT; - pSensorResolution->SensorVideoWidth=GC2355MIPI_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight=GC2355MIPI_IMAGE_SENSOR_VIDEO_HEIGHT; - return ERROR_NONE; -} /* GC2355MIPIGetResolution() */ - -UINT32 GC2355MIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - pSensorInfo->SensorPreviewResolutionX=GC2355MIPI_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=GC2355MIPI_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=GC2355MIPI_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=GC2355MIPI_IMAGE_SENSOR_FULL_HEIGHT; - - pSensorInfo->SensorCameraPreviewFrameRate=30; - pSensorInfo->SensorVideoFrameRate=30; - pSensorInfo->SensorStillCaptureFrameRate=10; - pSensorInfo->SensorWebCamCaptureFrameRate=15; - pSensorInfo->SensorResetActiveHigh=TRUE; //low active - pSensorInfo->SensorResetDelayCount=5; - pSensorInfo->SensorOutputDataFormat=GC2355MIPI_COLOR_FORMAT; - pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 1; - pSensorInfo->VideoDelayFrame = 1; - - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; - pSensorInfo->AEShutDelayFrame =0; /* The frame of setting shutter default 0 for TG int */ - pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ - pSensorInfo->AEISPGainDelayFrame = 2; - - pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_MIPI; -#if defined(GC2355MIPI_2Lane) - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - //pSensorInfo->SensorRawType = RAW_TYPE_10BIT; -#else - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE; -#endif - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorWidthSampling = 0; - pSensorInfo->SensorHightSampling = 0; - pSensorInfo->SensorPacketECCOrder = 1; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = GC2355MIPI_PV_X_START; - pSensorInfo->SensorGrabStartY = GC2355MIPI_PV_Y_START; - - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = GC2355MIPI_VIDEO_X_START; - pSensorInfo->SensorGrabStartY = GC2355MIPI_VIDEO_Y_START; - - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = GC2355MIPI_FULL_X_START; - pSensorInfo->SensorGrabStartY = GC2355MIPI_FULL_Y_START; - break; - default: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = GC2355MIPI_PV_X_START; - pSensorInfo->SensorGrabStartY = GC2355MIPI_PV_Y_START; - break; - } - memcpy(pSensorConfigData, &GC2355MIPI_sensor.cfg_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - return ERROR_NONE; -} /* GC2355MIPIGetInfo() */ - - -UINT32 GC2355MIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - -#ifdef GC2355_DRIVER_TRACE - SENSORDB("GC2355MIPIControl ScenarioId = %d \n",ScenarioId); -#endif - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - GC2355MIPIPreview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - GC2355MIPICapture(pImageWindow, pSensorConfigData); - break; - default: - return ERROR_INVALID_SCENARIO_ID; - } - return ERROR_NONE; -} /* GC2355MIPIControl() */ - - - -UINT32 GC2355MIPISetVideoMode(UINT16 u2FrameRate) -{}; - -UINT32 GC2355MIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; - //UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; - //UINT32 GC2355MIPISensorRegNumber; - //UINT32 i; - //PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - //MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=GC2355MIPI_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16=GC2355MIPI_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: /* 3 */ - *pFeatureReturnPara16++=GC2355MIPI_sensor.line_length; - *pFeatureReturnPara16=GC2355MIPI_sensor.frame_height; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: /* 3 */ - *pFeatureReturnPara32 = GC2355MIPI_sensor.pclk; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_ESHUTTER: /* 4 */ - GC2355MIPI_set_shutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - GC2355MIPI_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: /* 6 */ - GC2355MIPI_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - break; - case SENSOR_FEATURE_SET_REGISTER: - GC2355MIPI_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = GC2355MIPI_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - memcpy(&GC2355MIPI_sensor.eng.cct, pFeaturePara, sizeof(GC2355MIPI_sensor.eng.cct)); - break; - break; - case SENSOR_FEATURE_GET_CCT_REGISTER: /* 12 */ - if (*pFeatureParaLen >= sizeof(GC2355MIPI_sensor.eng.cct) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(GC2355MIPI_sensor.eng.cct); - memcpy(pFeaturePara, &GC2355MIPI_sensor.eng.cct, sizeof(GC2355MIPI_sensor.eng.cct)); - } - break; - case SENSOR_FEATURE_SET_ENG_REGISTER: - memcpy(&GC2355MIPI_sensor.eng.reg, pFeaturePara, sizeof(GC2355MIPI_sensor.eng.reg)); - break; - case SENSOR_FEATURE_GET_ENG_REGISTER: /* 14 */ - if (*pFeatureParaLen >= sizeof(GC2355MIPI_sensor.eng.reg) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(GC2355MIPI_sensor.eng.reg); - memcpy(pFeaturePara, &GC2355MIPI_sensor.eng.reg, sizeof(GC2355MIPI_sensor.eng.reg)); - } - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->Version = NVRAM_CAMERA_SENSOR_FILE_VERSION; - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorId = GC2355MIPI_SENSOR_ID; - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorEngReg, &GC2355MIPI_sensor.eng.reg, sizeof(GC2355MIPI_sensor.eng.reg)); - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorCCTReg, &GC2355MIPI_sensor.eng.cct, sizeof(GC2355MIPI_sensor.eng.cct)); - *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pFeaturePara, &GC2355MIPI_sensor.cfg_data, sizeof(GC2355MIPI_sensor.cfg_data)); - *pFeatureParaLen = sizeof(GC2355MIPI_sensor.cfg_data); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - GC2355MIPI_camera_para_to_sensor(); - break; - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - GC2355MIPI_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - GC2355MIPI_get_sensor_group_count((kal_uint32 *)pFeaturePara); - *pFeatureParaLen = 4; - break; - case SENSOR_FEATURE_GET_GROUP_INFO: - GC2355MIPI_get_sensor_group_info((MSDK_SENSOR_GROUP_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - GC2355MIPI_get_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_SET_ITEM_INFO: - GC2355MIPI_set_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ENG_INFO: - memcpy(pFeaturePara, &GC2355MIPI_sensor.eng_info, sizeof(GC2355MIPI_sensor.eng_info)); - *pFeatureParaLen = sizeof(GC2355MIPI_sensor.eng_info); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - //GC2355MIPISetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - GC2355MIPIGetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - break; - - /*SZ TCT xuejian.zhong add for CTS test */ - case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: - GC2355GetAFMaxNumFocusAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: - GC2355GetAEMaxNumMeteringAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - - GC2355GetExifInfo(*pFeatureReturnPara32); - break; - /* xuejian.zhong add end */ - - - - default: - break; - } - return ERROR_NONE; -} /* GC2355MIPIFeatureControl() */ -SENSOR_FUNCTION_STRUCT SensorFuncGC2355MIPI= -{ - GC2355MIPIOpen, - GC2355MIPIGetInfo, - GC2355MIPIGetResolution, - GC2355MIPIFeatureControl, - GC2355MIPIControl, - GC2355MIPIClose -}; - -UINT32 GC2355MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - /* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncGC2355MIPI; - - return ERROR_NONE; -} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Sensor.h deleted file mode 100644 index 8818bfc624f..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_mipi_raw/gc2355mipi_Sensor.h +++ /dev/null @@ -1,240 +0,0 @@ -/* Copyright Statement: - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. The information contained herein - * is confidential and proprietary to MediaTek Inc. and/or its licensors. - * Without the prior written permission of MediaTek inc. and/or its licensors, - * any reproduction, modification, use or disclosure of MediaTek Software, - * and information contained herein, in whole or in part, shall be strictly prohibited. - */ -/* MediaTek Inc. (C) 2010. All rights reserved. - * - * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES - * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") - * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON - * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE - * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR - * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH - * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES - * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES - * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK - * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR - * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND - * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, - * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, - * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO - * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - */ - -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2005 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * Leo Lee - * - *============================================================================ - * HISTORY - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 03 01 2013 - * First release GC2355MIPI driver Version 1.0 - * - *------------------------------------------------------------------------------ - *============================================================================ - ****************************************************************************/ - -#ifndef _GC2355MIPI_SENSOR_H -#define _GC2355MIPI_SENSOR_H - -#define GC2355MIPI_DEBUG -#define GC2355MIPI_DRIVER_TRACE -//#define GC2355MIPI_TEST_PATTEM -//#define SENSORDB printk -//#define SENSORDB(x,...) - -#define GC2355MIPI_FACTORY_START_ADDR 0 -#define GC2355MIPI_ENGINEER_START_ADDR 10 - -typedef enum GC2355MIPI_group_enum -{ - GC2355MIPI_PRE_GAIN = 0, - GC2355MIPI_CMMCLK_CURRENT, - GC2355MIPI_FRAME_RATE_LIMITATION, - GC2355MIPI_REGISTER_EDITOR, - GC2355MIPI_GROUP_TOTAL_NUMS -} GC2355MIPI_FACTORY_GROUP_ENUM; - -typedef enum GC2355MIPI_register_index -{ - GC2355MIPI_SENSOR_BASEGAIN = GC2355MIPI_FACTORY_START_ADDR, - GC2355MIPI_PRE_GAIN_R_INDEX, - GC2355MIPI_PRE_GAIN_Gr_INDEX, - GC2355MIPI_PRE_GAIN_Gb_INDEX, - GC2355MIPI_PRE_GAIN_B_INDEX, - GC2355MIPI_FACTORY_END_ADDR -} GC2355MIPI_FACTORY_REGISTER_INDEX; - -typedef enum GC2355MIPI_engineer_index -{ - GC2355MIPI_CMMCLK_CURRENT_INDEX = GC2355MIPI_ENGINEER_START_ADDR, - GC2355MIPI_ENGINEER_END -} GC2355MIPI_FACTORY_ENGINEER_INDEX; - -typedef struct _sensor_data_struct -{ - SENSOR_REG_STRUCT reg[GC2355MIPI_ENGINEER_END]; - SENSOR_REG_STRUCT cct[GC2355MIPI_FACTORY_END_ADDR]; -} sensor_data_struct; - -#define GC2355MIPI_PREVIEW_CLK 42000000 -#define GC2355MIPI_CAPTURE_CLK 42000000 - -#define GC2355MIPI_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW_B - - -#define GC2355MIPI_MIN_ANALOG_GAIN 1 /* 1x */ -#define GC2355MIPI_MAX_ANALOG_GAIN 4 /* 2.8x */ - - -/* FRAME RATE UNIT */ -#define GC2355MIPI_FPS(x) (10 * (x)) - -/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ -#define GC2355MIPI_FULL_PERIOD_PIXEL_NUMS 1680 -#define GC2355MIPI_FULL_PERIOD_LINE_NUMS 1250 - -#define GC2355MIPI_VIDEO_PERIOD_PIXEL_NUMS 1680 -#define GC2355MIPI_VIDEO_PERIOD_LINE_NUMS 1250 - -#define GC2355MIPI_PV_PERIOD_PIXEL_NUMS 1680 -#define GC2355MIPI_PV_PERIOD_LINE_NUMS 1250 - -/* SENSOR START/END POSITION */ -#define GC2355MIPI_FULL_X_START 0 -#define GC2355MIPI_FULL_Y_START 0 -#define GC2355MIPI_IMAGE_SENSOR_FULL_WIDTH (1600 - 8) -#define GC2355MIPI_IMAGE_SENSOR_FULL_HEIGHT (1200 - 6) - -#define GC2355MIPI_VIDEO_X_START 0 -#define GC2355MIPI_VIDEO_Y_START 0 -#define GC2355MIPI_IMAGE_SENSOR_VIDEO_WIDTH (1600) -#define GC2355MIPI_IMAGE_SENSOR_VIDEO_HEIGHT (1200) - -#define GC2355MIPI_PV_X_START 0 -#define GC2355MIPI_PV_Y_START 0 -#define GC2355MIPI_IMAGE_SENSOR_PV_WIDTH (1600 - 8) -#define GC2355MIPI_IMAGE_SENSOR_PV_HEIGHT (1200 - 6) - -/* SENSOR READ/WRITE ID */ -#define GC2355MIPI_WRITE_ID (0x78) -#define GC2355MIPI_READ_ID (0x79) - -/* SENSOR ID */ - - -/* SENSOR PRIVATE STRUCT */ -typedef enum { - SENSOR_MODE_INIT = 0, - SENSOR_MODE_PREVIEW, - SENSOR_MODE_VIDEO, - SENSOR_MODE_CAPTURE -} GC2355MIPI_SENSOR_MODE; - -typedef enum{ - GC2355MIPI_IMAGE_NORMAL = 0, - GC2355MIPI_IMAGE_H_MIRROR, - GC2355MIPI_IMAGE_V_MIRROR, - GC2355MIPI_IMAGE_HV_MIRROR -}GC2355MIPI_IMAGE_MIRROR; - -typedef struct GC2355MIPI_sensor_STRUCT -{ - MSDK_SENSOR_CONFIG_STRUCT cfg_data; - sensor_data_struct eng; /* engineer mode */ - MSDK_SENSOR_ENG_INFO_STRUCT eng_info; - GC2355MIPI_SENSOR_MODE sensorMode; - GC2355MIPI_IMAGE_MIRROR Mirror; - kal_bool pv_mode; - kal_bool video_mode; - kal_bool NightMode; - kal_uint16 normal_fps; /* video normal mode max fps */ - kal_uint16 night_fps; /* video night mode max fps */ - kal_uint16 FixedFps; - kal_uint16 shutter; - kal_uint16 gain; - kal_uint32 pclk; - kal_uint16 frame_height; - kal_uint16 frame_height_BackUp; - kal_uint16 line_length; - kal_uint16 Prv_line_length; -} GC2355MIPI_sensor_struct; - -typedef enum GC2355MIPI_GainMode_Index -{ - GC2355MIPI_Analogic_Gain = 0, - GC2355MIPI_Digital_Gain -}GC2355MIPI_GainMode_Index; -//export functions -UINT32 GC2355MIPIOpen(void); -UINT32 GC2355MIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 GC2355MIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 GC2355MIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 GC2355MIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 GC2355MIPIClose(void); - -#define Sleep(ms) mdelay(ms) - -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_CameraCustomized.h deleted file mode 100644 index 77a1db39f89..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_CameraCustomized.h +++ /dev/null @@ -1,157 +0,0 @@ -/* Copyright Statement: - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. The information contained herein - * is confidential and proprietary to MediaTek Inc. and/or its licensors. - * Without the prior written permission of MediaTek inc. and/or its licensors, - * any reproduction, modification, use or disclosure of MediaTek Software, - * and information contained herein, in whole or in part, shall be strictly prohibited. - */ -/* MediaTek Inc. (C) 2010. All rights reserved. - * - * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES - * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") - * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON - * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE - * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR - * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH - * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES - * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES - * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK - * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR - * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND - * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, - * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, - * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO - * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - */ - -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of camera customized parameters. - * - * - * Author: - * ------- - * Leo Lee - * - *============================================================================ - * HISTORY - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 03 01 2013 - * First release GC2355 driver Version 1.0 - * - *------------------------------------------------------------------------------ - *============================================================================ - ****************************************************************************/ - -#ifndef __CAMERA_CUSTOMIZED_H -#define __CAMERA_CUSTOMIZED_H - -// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 -#define MAIN_SENSOR_ORIENTATION_ANGLE 90 -#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist - - -// First, we think you hold the cell phone vertical. -// Second, we suppose the direction of upward is 0 -// Third, it is 90, 180, 270 in clockwise -// here we define the main sensor and sub sensor angles to deal with the jpeg orientation -#define MAIN_SENSOR_TO_PHONE_ANGLE 90 -#define SUB_SENSOR_TO_PHONE_ANGLE 0 - - -#define CAM_SIZE_QVGA_WIDTH 320 -#define CAM_SIZE_QVGA_HEIGHT 240 -#define CAM_SIZE_VGA_WIDTH 640 -#define CAM_SIZE_VGA_HEIGHT 480 -#define CAM_SIZE_05M_WIDTH 800 -#define CAM_SIZE_05M_HEIGHT 600 -#define CAM_SIZE_1M_WIDTH 1280 -#define CAM_SIZE_1M_HEIGHT 960 -#define CAM_SIZE_2M_WIDTH 1600 -#define CAM_SIZE_2M_HEIGHT 1200 -#define CAM_SIZE_3M_WIDTH 2048 -#define CAM_SIZE_3M_HEIGHT 1536 -#define CAM_SIZE_5M_WIDTH 2592 -#define CAM_SIZE_5M_HEIGHT 1944 - -// for main sensor -#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 -#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 -#define MAIN_NUM_OF_STILL_RESOLUTION 7 -#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} -#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} -#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ - {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ - {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ - {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ - {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ - {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ - {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} - -// if sub sensor does not exist, set all the parameters as 0 -#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 -#define SUB_NUM_OF_VIDEO_RESOLUTION 0 -#define SUB_NUM_OF_STILL_RESOLUTION 0 -#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} -#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} -#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} - -//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) -//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) -//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) - -#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Camera_Sensor_para.h deleted file mode 100644 index 8f229ee64fd..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Camera_Sensor_para.h +++ /dev/null @@ -1,90 +0,0 @@ -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * camera_sensor_para.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of Sensor tuning parameters that should be generated by CCT - * - * - * Author: - * ------- - * Leo Lee - * - *============================================================================ - * HISTORY - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 03 01 2013 - * First release GC2355 driver Version 1.0 - * - *------------------------------------------------------------------------------ - *============================================================================ - ****************************************************************************/ -#ifndef _GC2355_CAMERA_SENSOR_PARA_H -#define _GC2355_CAMERA_SENSOR_PARA_H - -#define GC2355_CAMERA_SENSOR_REG_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,ISP_DRIVING_6MA}, \ -} - -#define GC2355_CAMERA_SENSOR_CCT_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40}, \ -} - -#endif /* __CAMERA_SENSOR_PARA_H */ -/* SENSOR FULL SIZE */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Sensor.h deleted file mode 100644 index 33f0927fae8..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355_raw/gc2355_Sensor.h +++ /dev/null @@ -1,239 +0,0 @@ -/* Copyright Statement: - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. The information contained herein - * is confidential and proprietary to MediaTek Inc. and/or its licensors. - * Without the prior written permission of MediaTek inc. and/or its licensors, - * any reproduction, modification, use or disclosure of MediaTek Software, - * and information contained herein, in whole or in part, shall be strictly prohibited. - */ -/* MediaTek Inc. (C) 2010. All rights reserved. - * - * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES - * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") - * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON - * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE - * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR - * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH - * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES - * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES - * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK - * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR - * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND - * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, - * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, - * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO - * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - */ - -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2005 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * Leo Lee - * - *============================================================================ - * HISTORY - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 03 01 2013 - * First release GC2355 driver Version 1.0 - * - *------------------------------------------------------------------------------ - *============================================================================ - ****************************************************************************/ - -#ifndef _GC2355_SENSOR_H -#define _GC2355_SENSOR_H - -#define GC2355_DEBUG -#define GC2355_DRIVER_TRACE -//#define GC2355_TEST_PATTEM - -#define GC2355_FACTORY_START_ADDR 0 -#define GC2355_ENGINEER_START_ADDR 10 - -typedef enum GC2355_group_enum -{ - GC2355_PRE_GAIN = 0, - GC2355_CMMCLK_CURRENT, - GC2355_FRAME_RATE_LIMITATION, - GC2355_REGISTER_EDITOR, - GC2355_GROUP_TOTAL_NUMS -} GC2355_FACTORY_GROUP_ENUM; - -typedef enum GC2355_register_index -{ - GC2355_SENSOR_BASEGAIN = GC2355_FACTORY_START_ADDR, - GC2355_PRE_GAIN_R_INDEX, - GC2355_PRE_GAIN_Gr_INDEX, - GC2355_PRE_GAIN_Gb_INDEX, - GC2355_PRE_GAIN_B_INDEX, - GC2355_FACTORY_END_ADDR -} GC2355_FACTORY_REGISTER_INDEX; - -typedef enum GC2355_engineer_index -{ - GC2355_CMMCLK_CURRENT_INDEX = GC2355_ENGINEER_START_ADDR, - GC2355_ENGINEER_END -} GC2355_FACTORY_ENGINEER_INDEX; - -typedef struct _sensor_data_struct -{ - SENSOR_REG_STRUCT reg[GC2355_ENGINEER_END]; - SENSOR_REG_STRUCT cct[GC2355_FACTORY_END_ADDR]; -} sensor_data_struct; - -/* SENSOR PREVIEW/CAPTURE VT CLOCK */ -#define GC2355_PREVIEW_CLK 42000000 -#define GC2355_CAPTURE_CLK 42000000 - -#define GC2355_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW_R //SENSOR_OUTPUT_FORMAT_RAW_Gb //SENSOR_OUTPUT_FORMAT_RAW_R - -#define GC2355_MIN_ANALOG_GAIN 1 /* 1x */ -#define GC2355_MAX_ANALOG_GAIN 4 /* 2.8x */ - - -/* FRAME RATE UNIT */ -#define GC2355_FPS(x) (10 * (x)) - -/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ - -#define GC2355_FULL_PERIOD_PIXEL_NUMS 1680 -#define GC2355_FULL_PERIOD_LINE_NUMS 1250 - -#define GC2355_VIDEO_PERIOD_PIXEL_NUMS 1680 -#define GC2355_VIDEO_PERIOD_LINE_NUMS 1250 - -#define GC2355_PV_PERIOD_PIXEL_NUMS 1680 -#define GC2355_PV_PERIOD_LINE_NUMS 1250 - -/* SENSOR START/END POSITION */ -#define GC2355_FULL_X_START 0 -#define GC2355_FULL_Y_START 0 -#define GC2355_IMAGE_SENSOR_FULL_WIDTH (1600 - 8) -#define GC2355_IMAGE_SENSOR_FULL_HEIGHT (1200 - 6) - -#define GC2355_VIDEO_X_START 0 -#define GC2355_VIDEO_Y_START 0 -#define GC2355_IMAGE_SENSOR_VIDEO_WIDTH (1600) -#define GC2355_IMAGE_SENSOR_VIDEO_HEIGHT (1200) - -#define GC2355_PV_X_START 0 -#define GC2355_PV_Y_START 0 -#define GC2355_IMAGE_SENSOR_PV_WIDTH (1600 - 8) -#define GC2355_IMAGE_SENSOR_PV_HEIGHT (1200 - 6) - -/* SENSOR READ/WRITE ID */ -#define GC2355_WRITE_ID (0x78) -#define GC2355_READ_ID (0x79) - -/* SENSOR ID */ -//#define GC2355_SENSOR_ID (0x2355) - -/* SENSOR PRIVATE STRUCT */ -typedef enum { - SENSOR_MODE_INIT = 0, - SENSOR_MODE_PREVIEW, - SENSOR_MODE_VIDEO, - SENSOR_MODE_CAPTURE -} GC2355_SENSOR_MODE; - -typedef enum{ - GC2355_IMAGE_NORMAL = 0, - GC2355_IMAGE_H_MIRROR, - GC2355_IMAGE_V_MIRROR, - GC2355_IMAGE_HV_MIRROR -}GC2355_IMAGE_MIRROR; - -typedef struct GC2355_sensor_STRUCT -{ - MSDK_SENSOR_CONFIG_STRUCT cfg_data; - sensor_data_struct eng; /* engineer mode */ - MSDK_SENSOR_ENG_INFO_STRUCT eng_info; - GC2355_SENSOR_MODE sensorMode; - GC2355_IMAGE_MIRROR Mirror; - kal_bool pv_mode; - kal_bool video_mode; - kal_bool NightMode; - kal_uint16 normal_fps; /* video normal mode max fps */ - kal_uint16 night_fps; /* video night mode max fps */ - kal_uint16 FixedFps; - kal_uint16 shutter; - kal_uint16 gain; - kal_uint32 pclk; - kal_uint16 frame_height; - kal_uint16 frame_height_BackUp; - kal_uint16 line_length; - kal_uint16 Prv_line_length; -} GC2355_sensor_struct; - -typedef enum GC2355_GainMode_Index -{ - GC2355_Analogic_Gain = 0, - GC2355_Digital_Gain -}GC2355_GainMode_Index; -//export functions -UINT32 GC2355Open(void); -UINT32 GC2355Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 GC2355FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 GC2355GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 GC2355GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 GC2355Close(void); - -#define Sleep(ms) mdelay(ms) - -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipiraw_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_CameraCustomized.h similarity index 100% rename from drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipiraw_CameraCustomized.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_CameraCustomized.h diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipiraw_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Camera_Sensor_para.h similarity index 100% rename from drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipiraw_Camera_Sensor_para.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Camera_Sensor_para.h diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Sensor.c new file mode 100644 index 00000000000..99bcdf1e9e9 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Sensor.c @@ -0,0 +1,1175 @@ +/*******************************************************************************************/ + + +/*******************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" + +#include "gc2355mipiraw_Sensor.h" +#include "gc2355mipiraw_Camera_Sensor_para.h" +#include "gc2355mipiraw_CameraCustomized.h" +static DEFINE_SPINLOCK(gc2355mipiraw_drv_lock); + +#define GC2355_DEBUG +//#define GC2355_DEBUG_SOFIA +#define GC2355_TEST_PATTERN_CHECKSUM (0x9d1c9dad)//(0x5593c632) + +#ifdef GC2355_DEBUG + #define GC2355DB(fmt, arg...) pr_debug("[GC2355mipiraw][%s] " fmt, __func__, ##arg) +#else + #define GC2355DB(fmt, arg...) +#endif + +#ifdef GC2355_DEBUG_SOFIA + #define GC2355DBSOFIA(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG, "[GC2355Raw] ", fmt, ##arg) +#else + #define GC2355DBSOFIA(fmt, arg...) +#endif + +#define mDELAY(ms) mdelay(ms) + +kal_uint32 GC2355_FeatureControl_PERIOD_PixelNum=GC2355_PV_PERIOD_PIXEL_NUMS; +kal_uint32 GC2355_FeatureControl_PERIOD_LineNum=GC2355_PV_PERIOD_LINE_NUMS; +UINT16 gc2355VIDEO_MODE_TARGET_FPS = 30; +MSDK_SENSOR_CONFIG_STRUCT GC2355SensorConfigData; +MSDK_SCENARIO_ID_ENUM GC2355CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; + +/* FIXME: old factors and DIDNOT use now. s*/ +SENSOR_REG_STRUCT GC2355SensorCCT[]=CAMERA_SENSOR_CCT_DEFAULT_VALUE; +SENSOR_REG_STRUCT GC2355SensorReg[ENGINEER_END]=CAMERA_SENSOR_REG_DEFAULT_VALUE; +/* FIXME: old factors and DIDNOT use now. e*/ + +static GC2355_PARA_STRUCT gc2355; + +#define Sleep(ms) mdelay(ms) +#define GC2355_ORIENTATION IMAGE_NORMAL //IMAGE_NORMAL//IMAGE_NORMAL + +extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); + +/************************************************************************* +* FUNCTION +* GC2355MIPI_write_cmos_sensor +* +* DESCRIPTION +* This function wirte data to CMOS sensor through I2C +* +* PARAMETERS +* addr: the 16bit address of register +* para: the 8bit value of register +* +* RETURNS +* None +* +* LOCAL AFFECTED +* +*************************************************************************/ +static void GC2355_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) +{ +kal_uint8 out_buff[2]; + + out_buff[0] = addr; + out_buff[1] = para; + + iWriteRegI2C((u8*)out_buff , 2, GC2355MIPI_WRITE_ID); +} + +/************************************************************************* +* FUNCTION +* GC2035_read_cmos_sensor +* +* DESCRIPTION +* This function read data from CMOS sensor through I2C. +* +* PARAMETERS +* addr: the 16bit address of register +* +* RETURNS +* 8bit data read through I2C +* +* LOCAL AFFECTED +* +*************************************************************************/ +static kal_uint8 GC2355_read_cmos_sensor(kal_uint8 addr) +{ + kal_uint8 in_buff[1] = {0xFF}; + kal_uint8 out_buff[1]; + + out_buff[0] = addr; + + if (0 != iReadRegI2C((u8*)out_buff , 1, (u8*)in_buff, 1, GC2355MIPI_WRITE_ID)) { + GC2355DB("ERROR: GC2355MIPI_read_cmos_sensor \n"); + } + return in_buff[0]; +} + + +void GC2355_SetGain(UINT16 iGain) +{ + +#define ANALOG_GAIN_1 64 // 1.00x +#define ANALOG_GAIN_2 88 //1.37x +#define ANALOG_GAIN_3 121 // 1.89x +#define ANALOG_GAIN_4 168 // 2.59x +#define ANALOG_GAIN_5 239 // 3.70x +#define ANALOG_GAIN_6 330 // 5.06x +#define ANALOG_GAIN_7 470 // 7.15x + + kal_uint16 iReg,temp,temp1; + + GC2355DB("GC2355MIPI_SetGain iGain = %d \n",iGain); + + GC2355_write_cmos_sensor(0xb1, 0x01); + GC2355_write_cmos_sensor(0xb2, 0x00); + + iReg = iGain; + //digital gain + //GC2355MIPI_write_cmos_sensor(0xb1, iReg>>6); + //GC2355MIPI_write_cmos_sensor(0xb2, (iReg<<2)&0xfc); + + + if(iReg < 0x40) + iReg = 0x40; + if(iReg > 512) + iReg = 512; + + if((ANALOG_GAIN_1<= iReg)&&(iReg < ANALOG_GAIN_2)) + { + //analog gain + GC2355_write_cmos_sensor(0xb6, 0x00);// + temp = iReg; + GC2355_write_cmos_sensor(0xb1, temp>>6); + GC2355_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + GC2355DB("GC2355 analogic gain 1x , GC2355 add pregain = %d\n",temp); + + } + else if((ANALOG_GAIN_2<= iReg)&&(iReg < ANALOG_GAIN_3)) + { + //analog gain + GC2355_write_cmos_sensor(0xb6, 0x01);// + temp = 64*iReg/ANALOG_GAIN_2; + GC2355_write_cmos_sensor(0xb1, temp>>6); + GC2355_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + GC2355DB("GC2355 analogic gain 1.45x , GC2355 add pregain = %d\n",temp); + + } + + else if((ANALOG_GAIN_3<= iReg)&&(iReg < ANALOG_GAIN_4)) + { + //analog gain + GC2355_write_cmos_sensor(0xb6, 0x02);// + temp = 64*iReg/ANALOG_GAIN_3; + GC2355_write_cmos_sensor(0xb1, temp>>6); + GC2355_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + GC2355DB("GC2355 analogic gain 2.02x , GC2355 add pregain = %d\n",temp); + } + +// else if(ANALOG_GAIN_4<= iReg) + else + { + //analog gain + GC2355_write_cmos_sensor(0xb6, 0x03);// + temp = 64*iReg/ANALOG_GAIN_4; + GC2355_write_cmos_sensor(0xb1, temp>>6); + GC2355_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + + GC2355DB("GC2355 analogic gain 2.8x, temp = %d\n", temp); + } + +} /* GC2355_SetGain_SetGain */ + + +void GC2355_camera_para_to_sensor(void) +{} + +void GC2355_sensor_to_camera_para(void) +{} + +kal_int32 GC2355_get_sensor_group_count(void) +{ + return GROUP_TOTAL_NUMS; +} + +void GC2355_get_sensor_group_info(kal_uint16 group_idx, kal_int8* group_name_ptr, kal_int32* item_count_ptr) +{} +void GC2355_get_sensor_item_info(kal_uint16 group_idx,kal_uint16 item_idx, MSDK_SENSOR_ITEM_INFO_STRUCT* info_ptr) +{} +kal_bool GC2355_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 ItemValue) +{ return KAL_TRUE;} + +static void GC2355_SetDummy( const kal_uint32 iPixels, const kal_uint32 iLines ) +{ + kal_uint32 hb = 0; + kal_uint32 vb = 0; + + if ( SENSOR_MODE_PREVIEW == gc2355.sensorMode ) //SXGA size output + { + hb = GC2355_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2355_DEFAULT_DUMMY_LINE_NUMS + iLines; + } + else if( SENSOR_MODE_VIDEO== gc2355.sensorMode ) + { + hb = GC2355_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2355_DEFAULT_DUMMY_LINE_NUMS + iLines; + } + else//QSXGA size output + { + hb = GC2355_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2355_DEFAULT_DUMMY_LINE_NUMS + iLines; + } + + //if(gc2355.maxExposureLines > frame_length -4 ) + // return; + + //ASSERT(line_length < GC2355_MAX_LINE_LENGTH); //0xCCCC + //ASSERT(frame_length < GC2355_MAX_FRAME_LENGTH); //0xFFFF + + //Set HB + GC2355_write_cmos_sensor(0x05, (hb >> 8)& 0xFF); + GC2355_write_cmos_sensor(0x06, hb & 0xFF); + + //Set VB + GC2355_write_cmos_sensor(0x07, (vb >> 8) & 0xFF); + GC2355_write_cmos_sensor(0x08, vb & 0xFF); + GC2355DB("GC2355_SetDummy framelength=%d\n",vb+GC2355_VALID_LINE_NUMS); + +} /* GC2355_SetDummy */ + +static void GC2355_Sensor_Init(void) +{ + /* SYS */ + GC2355_write_cmos_sensor(0xfe,0x80); + GC2355_write_cmos_sensor(0xfe,0x80); + GC2355_write_cmos_sensor(0xfe,0x80); + GC2355_write_cmos_sensor(0xf2,0x00); //sync_pad_io_ebi + GC2355_write_cmos_sensor(0xf6,0x00); //up down + GC2355_write_cmos_sensor(0xf7,0x31); //19 //pll enable + GC2355_write_cmos_sensor(0xf8,0x06); //Pll mode 2 /////86--°µ´¦½µÆµ + GC2355_write_cmos_sensor(0xf9,0x0e); //de//[0] pll enable + GC2355_write_cmos_sensor(0xfa,0x00); //div + GC2355_write_cmos_sensor(0xfc,0x06); //4e + //GC2355_write_cmos_sensor(0xfd,0x00); + GC2355_write_cmos_sensor(0xfe,0x00); + + /* ANALOG & CISCTL*/ + // AEC&frame length// + GC2355_write_cmos_sensor(0x03,0x04); // 0a -> 04 + GC2355_write_cmos_sensor(0x04,0xb0); // 41 -> b0 + GC2355_write_cmos_sensor(0x05,0x01); //max 30fps 03 + GC2355_write_cmos_sensor(0x06,0x1c); + GC2355_write_cmos_sensor(0x07,0x00); + GC2355_write_cmos_sensor(0x08,0x0e); //22 + GC2355_write_cmos_sensor(0x0a,0x00); //row start + GC2355_write_cmos_sensor(0x0c,0x04); //0c//col start + GC2355_write_cmos_sensor(0x0d,0x04); + GC2355_write_cmos_sensor(0x0e,0xc0); //c0 + GC2355_write_cmos_sensor(0x0f,0x06); + GC2355_write_cmos_sensor(0x10,0x50); //Window setting 1616x1216 + /*GC2355_write_cmos_sensor(0x11,0x00); + GC2355_write_cmos_sensor(0x12,0x18); //sh_delay + GC2355_write_cmos_sensor(0x13,0x11); + GC2355_write_cmos_sensor(0x14,0x01); + GC2355_write_cmos_sensor(0x15,0x00); + GC2355_write_cmos_sensor(0x16,0xc1);*/ + GC2355_write_cmos_sensor(0x17,0x17);//14 + //GC2355_write_cmos_sensor(0x18,0x02); + GC2355_write_cmos_sensor(0x19,0x0b); + GC2355_write_cmos_sensor(0x1b,0x49); //48 + GC2355_write_cmos_sensor(0x1c,0x12); + GC2355_write_cmos_sensor(0x1d,0x10); //double reset + GC2355_write_cmos_sensor(0x1e,0xbc); //a8//col_r/rowclk_mode/rsthigh_en FPN + GC2355_write_cmos_sensor(0x1f,0xc8); //c8//rsgl_s_mode/vpix_s_mode µÆ¹ÜºáÌõÎÆ + GC2355_write_cmos_sensor(0x20,0x71); + GC2355_write_cmos_sensor(0x21,0x20); //rsg µÆ¹ÜºáÌõÎÆ //////40 + GC2355_write_cmos_sensor(0x22,0xa0); //e0 //80 //f0 + GC2355_write_cmos_sensor(0x23,0x51); //51 + GC2355_write_cmos_sensor(0x24,0x19); //0b //55 + //GC2355_write_cmos_sensor(0x25,0x10); //10 + //GC2355_write_cmos_sensor(0x26,0x00); + GC2355_write_cmos_sensor(0x27,0x20); + GC2355_write_cmos_sensor(0x28,0x00);//10 + //GC2355_write_cmos_sensor(0x29,0x00); + //GC2355_write_cmos_sensor(0x2a,0x00); + GC2355_write_cmos_sensor(0x2b,0x81); //00 sf_s_mode FPN + GC2355_write_cmos_sensor(0x2c,0x38); //50 //5c ispg FPN + //GC2355_write_cmos_sensor(0x2d,0x15); + GC2355_write_cmos_sensor(0x2e,0x16); //05//eq width + GC2355_write_cmos_sensor(0x2f,0x14); //[3:0]tx_width д0ÄܸÄÂéµã + GC2355_write_cmos_sensor(0x30,0x00); + GC2355_write_cmos_sensor(0x31,0x01); + GC2355_write_cmos_sensor(0x32,0x02); + GC2355_write_cmos_sensor(0x33,0x03); + GC2355_write_cmos_sensor(0x34,0x07); + GC2355_write_cmos_sensor(0x35,0x0b); + GC2355_write_cmos_sensor(0x36,0x0f); + + /* gain */ + GC2355_write_cmos_sensor(0xb0,0x50); + GC2355_write_cmos_sensor(0xb1,0x01); + GC2355_write_cmos_sensor(0xb2,0x00); + GC2355_write_cmos_sensor(0xb3,0x40); + GC2355_write_cmos_sensor(0xb4,0x40); + GC2355_write_cmos_sensor(0xb5,0x40); + GC2355_write_cmos_sensor(0xb6,0x00); + + /* crop */ + GC2355_write_cmos_sensor(0x92,0x02); + GC2355_write_cmos_sensor(0x95,0x04); + GC2355_write_cmos_sensor(0x96,0xb0); + GC2355_write_cmos_sensor(0x97,0x06); + GC2355_write_cmos_sensor(0x98,0x40); //out window set 1600x1200 + + /* BLK */ + GC2355_write_cmos_sensor(0x18,0x02);//1a-lily + GC2355_write_cmos_sensor(0x1a,0x01);//09-lily //01 + GC2355_write_cmos_sensor(0x40,0x42);//43-lily + GC2355_write_cmos_sensor(0x4e,0x3c); //BLK select + GC2355_write_cmos_sensor(0x4f,0x00); + GC2355_write_cmos_sensor(0x5e,0x00);//18-lily //offset ratio + GC2355_write_cmos_sensor(0x66,0x20);//20-lily //dark ratio + GC2355_write_cmos_sensor(0x6a,0x00);//39 + GC2355_write_cmos_sensor(0x6b,0x00); + GC2355_write_cmos_sensor(0x6c,0x00); + GC2355_write_cmos_sensor(0x6d,0x00); + GC2355_write_cmos_sensor(0x6e,0x00); + GC2355_write_cmos_sensor(0x6f,0x00); + GC2355_write_cmos_sensor(0x70,0x00); + GC2355_write_cmos_sensor(0x71,0x00); //manual offset + + /* Dark sun */ + GC2355_write_cmos_sensor(0x87,0x03); // + GC2355_write_cmos_sensor(0xe0,0xe7); //dark sun en/extend mode + GC2355_write_cmos_sensor(0xe2,0x03); + GC2355_write_cmos_sensor(0xe3,0xc0); //clamp + + /*MIPI*/ + GC2355_write_cmos_sensor(0xfe, 0x03); + GC2355_write_cmos_sensor(0x01, 0x87); + GC2355_write_cmos_sensor(0x02, 0x11); + GC2355_write_cmos_sensor(0x03, 0x91); + GC2355_write_cmos_sensor(0x04, 0x01); + GC2355_write_cmos_sensor(0x05, 0x00); + GC2355_write_cmos_sensor(0x06, 0xa2); + GC2355_write_cmos_sensor(0x10, 0x91);//91//94//1lane raw8 + GC2355_write_cmos_sensor(0x11, 0x2b);//2b + GC2355_write_cmos_sensor(0x15, 0x60); + GC2355_write_cmos_sensor(0x12, 0xd0); //d0//40 + GC2355_write_cmos_sensor(0x13, 0x07); //07//06 + GC2355_write_cmos_sensor(0x21, 0x10); + GC2355_write_cmos_sensor(0x22, 0x03); + GC2355_write_cmos_sensor(0x23, 0x20); + GC2355_write_cmos_sensor(0x24, 0x02); + GC2355_write_cmos_sensor(0x25, 0x10); + GC2355_write_cmos_sensor(0x26, 0x08); + // GC2355_write_cmos_sensor(0x27, 0x06); + GC2355_write_cmos_sensor(0x29, 0x02);//04 + GC2355_write_cmos_sensor(0x2a, 0x0a); + GC2355_write_cmos_sensor(0x2b, 0x08); + GC2355_write_cmos_sensor(0x40, 0x00); + GC2355_write_cmos_sensor(0x41, 0x00); + GC2355_write_cmos_sensor(0x42, 0x40); + GC2355_write_cmos_sensor(0x43, 0x06); + GC2355_write_cmos_sensor(0xfe, 0x00); + + +} /* GC2355_Sensor_Init */ + +UINT32 GC2355Open(void) +{ + volatile signed int i; + kal_uint16 sensor_id = 0; + GC2355DB("GC2355Open enter :\n "); + sensor_id=((GC2355_read_cmos_sensor(0xf0) << 8) | GC2355_read_cmos_sensor(0xf1)); + GC2355DB("GC2355MIPIGetSensorID:%x \n",sensor_id); + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_INIT; + gc2355.GC2355AutoFlickerMode = KAL_FALSE; + gc2355.GC2355VideoMode = KAL_FALSE; + gc2355.shutter = 0xff; + gc2355.Gain = 64; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355_Sensor_Init(); + + GC2355DB("GC2355Open exit :\n "); + + return ERROR_NONE; +} + +extern IMM_auxadc_GetOneChannelValue_Cali(int Channel, int *voltage); +UINT32 GC2355GetSensorID(UINT32 *sensorID) +{ + int retry = 1; + int adc_val = 0; + GC2355DB("GC2355GetSensorID enter :\n "); + + // check if sensor ID correct + *sensorID =((GC2355_read_cmos_sensor(0xf0) << 8) | GC2355_read_cmos_sensor(0xf1)); + IMM_auxadc_GetOneChannelValue_Cali(12, &adc_val); + if ((*sensorID == GC2355MIPI_SENSOR_ID) && (adc_val < 100000)) { /*0.1v = 100000uv , 0v :huaqun ; >0.1:qunhui*/ + *sensorID = GC2355MIPI_SENSOR_ID; + } else { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + GC2355DB("GC2355MIPIGetSensorID:%x \n",*sensorID); + /* + if (*sensorID != GC2355MIPI_SENSOR_ID) { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + */ + return ERROR_NONE; +} + + +void GC2355_SetShutter(kal_uint32 iShutter) +{ + //kal_uint8 i=0; + if(MSDK_SCENARIO_ID_CAMERA_ZSD == GC2355CurrentScenarioId ) + { + //GC2355DB("always UPDATE SHUTTER when gc2355.sensorMode == SENSOR_MODE_CAPTURE\n"); + } + else{ + if(gc2355.sensorMode == SENSOR_MODE_CAPTURE) + { + //GC2355DB("capture!!DONT UPDATE SHUTTER!!\n"); + //return; + } + } + if(gc2355.shutter == iShutter); + //return; + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.shutter= iShutter; + + spin_unlock(&gc2355mipiraw_drv_lock); + if(gc2355.shutter > 16383) gc2355.shutter = 16383; + if(gc2355.shutter < 12) gc2355.shutter = 12; + GC2355_write_cmos_sensor(0x03, (gc2355.shutter>>8) & 0x3F); + GC2355_write_cmos_sensor(0x04, gc2355.shutter & 0xFF); + + + GC2355DB("GC2355_SetShutter:%x \n",iShutter); + + // GC2355DB("GC2355_SetShutter 0x03=%x, 0x04=%x \n",GC2355_read_cmos_sensor(0x03),GC2355_read_cmos_sensor(0x04)); + return; +} /* GC2355_SetShutter */ + +UINT32 GC2355_read_shutter(void) +{ + + kal_uint16 temp_reg1, temp_reg2; + UINT32 shutter =0; + temp_reg1 = GC2355_read_cmos_sensor(0x03); // AEC[b19~b16] + temp_reg2 = GC2355_read_cmos_sensor(0x04); // AEC[b15~b8] + shutter = ((temp_reg1 << 8)| (temp_reg2)); + + return shutter; +} + +void GC2355_NightMode(kal_bool bEnable) +{} + + +UINT32 GC2355Close(void) +{ return ERROR_NONE;} + +void GC2355SetFlipMirror(kal_int32 imgMirror) +{ + kal_int16 mirror=0,flip=0; + + switch (imgMirror) + { + case IMAGE_NORMAL://IMAGE_NORMAL: + GC2355_write_cmos_sensor(0x17,0x14);//bit[1][0] + GC2355_write_cmos_sensor(0x92,0x03); + GC2355_write_cmos_sensor(0x94,0x0b); + break; + case IMAGE_H_MIRROR://IMAGE_H_MIRROR: + GC2355_write_cmos_sensor(0x17,0x15); +// GC2355_write_cmos_sensor(0x92,0x03); +// GC2355_write_cmos_sensor(0x94,0x0b); + break; + case IMAGE_V_MIRROR://IMAGE_V_MIRROR: + GC2355_write_cmos_sensor(0x17,0x16); +// GC2355_write_cmos_sensor(0x92,0x02); +// GC2355_write_cmos_sensor(0x94,0x0b); + break; + case IMAGE_HV_MIRROR://IMAGE_HV_MIRROR: + GC2355_write_cmos_sensor(0x17,0x17); +// GC2355_write_cmos_sensor(0x92,0x02); +// GC2355_write_cmos_sensor(0x94,0x0b); + break; + } +} + +UINT32 GC2355Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + GC2355DB("GC2355Preview enter:"); + + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_PREVIEW; // Need set preview setting after capture mode + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + GC2355_FeatureControl_PERIOD_PixelNum=GC2355_PV_PERIOD_PIXEL_NUMS+ gc2355.DummyPixels; + GC2355_FeatureControl_PERIOD_LineNum=GC2355_PV_PERIOD_LINE_NUMS+gc2355.DummyLines; + spin_unlock(&gc2355mipiraw_drv_lock); + + //GC2355_write_shutter(gc2355.shutter); + //write_GC2355_gain(gc2355.pvGain); + //set mirror & flip + //GC2355DB("[GC2355Preview] mirror&flip: %d \n",sensor_config_data->SensorImageMirror); + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.imgMirror = sensor_config_data->SensorImageMirror; + spin_unlock(&gc2355mipiraw_drv_lock); + //if(SENSOR_MODE_PREVIEW==gc2355.sensorMode ) return ERROR_NONE; + + GC2355DB("GC2355Preview mirror:%d\n",sensor_config_data->SensorImageMirror); + GC2355SetFlipMirror(GC2355_ORIENTATION); + GC2355_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + GC2355DB("GC2355Preview exit: \n"); + mdelay(100); + return ERROR_NONE; +} /* GC2355Preview() */ + + +UINT32 GC2355Video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + GC2355DB("GC2355Video enter:"); + if(gc2355.sensorMode == SENSOR_MODE_VIDEO) + { + // do nothing + } + else + //GC2355VideoSetting(); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_VIDEO; + GC2355_FeatureControl_PERIOD_PixelNum=GC2355_VIDEO_PERIOD_PIXEL_NUMS+ gc2355.DummyPixels; + GC2355_FeatureControl_PERIOD_LineNum=GC2355_VIDEO_PERIOD_LINE_NUMS+gc2355.DummyLines; +/* + spin_unlock(&gc2355mipiraw_drv_lock); + + //GC2355_write_shutter(gc2355.shutter); + //write_GC2355_gain(gc2355.pvGain); + + spin_lock(&gc2355mipiraw_drv_lock); +*/ + gc2355.imgMirror = sensor_config_data->SensorImageMirror; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355SetFlipMirror(GC2355_ORIENTATION); + GC2355DB("GC2355Video mirror:%d\n",sensor_config_data->SensorImageMirror); + GC2355_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + //GC2355DBSOFIA("[GC2355Video]frame_len=%x\n", ((GC2355_read_cmos_sensor(0x380e)<<8)+GC2355_read_cmos_sensor(0x380f))); + mdelay(100); + GC2355DB("GC2355Video exit:\n"); + return ERROR_NONE; +} + + +UINT32 GC2355Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + kal_uint32 shutter = gc2355.shutter; + kal_uint32 temp_data; + if( SENSOR_MODE_CAPTURE== gc2355.sensorMode) + { + GC2355DB("GC2355Capture BusrtShot!!!\n"); + }else{ + GC2355DB("GC2355Capture enter:\n"); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.pvShutter =shutter; + gc2355.sensorGlobalGain = temp_data; + gc2355.pvGain =gc2355.sensorGlobalGain; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355DB("[GC2355Capture]gc2355.shutter=%d, read_pv_shutter=%d, read_pv_gain = 0x%x\n",gc2355.shutter, shutter,gc2355.sensorGlobalGain); + + // Full size setting + //.GC2355CaptureSetting(); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_CAPTURE; + gc2355.imgMirror = sensor_config_data->SensorImageMirror; + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + GC2355_FeatureControl_PERIOD_PixelNum = GC2355_FULL_PERIOD_PIXEL_NUMS + gc2355.DummyPixels; + GC2355_FeatureControl_PERIOD_LineNum = GC2355_FULL_PERIOD_LINE_NUMS + gc2355.DummyLines; + spin_unlock(&gc2355mipiraw_drv_lock); + + //GC2355DB("[GC2355Capture] mirror&flip: %d\n",sensor_config_data->SensorImageMirror); + + GC2355DB("GC2355capture mirror:%d\n",sensor_config_data->SensorImageMirror); + GC2355SetFlipMirror(GC2355_ORIENTATION); + GC2355_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + + if(GC2355CurrentScenarioId==MSDK_SCENARIO_ID_CAMERA_ZSD) + { + GC2355DB("GC2355Capture exit ZSD!!\n"); + return ERROR_NONE; + } + GC2355DB("GC2355Capture exit:\n"); + } + + return ERROR_NONE; +} /* GC2355Capture() */ + +UINT32 GC2355GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) +{ + + GC2355DB("GC2355GetResolution!!\n"); + pSensorResolution->SensorPreviewWidth = GC2355_IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorPreviewHeight = GC2355_IMAGE_SENSOR_PV_HEIGHT; + pSensorResolution->SensorFullWidth = GC2355_IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorFullHeight = GC2355_IMAGE_SENSOR_FULL_HEIGHT; + pSensorResolution->SensorVideoWidth = GC2355_IMAGE_SENSOR_VIDEO_WIDTH; + pSensorResolution->SensorVideoHeight = GC2355_IMAGE_SENSOR_VIDEO_HEIGHT; + return ERROR_NONE; +} /* GC2355GetResolution() */ + +UINT32 GC2355GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + + pSensorInfo->SensorPreviewResolutionX= GC2355_IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY= GC2355_IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX= GC2355_IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY= GC2355_IMAGE_SENSOR_FULL_HEIGHT; + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.imgMirror = pSensorConfigData->SensorImageMirror ; + spin_unlock(&gc2355mipiraw_drv_lock); + + pSensorInfo->SensorOutputDataFormat= SENSOR_OUTPUT_FORMAT_RAW_B; + + pSensorInfo->SensorClockPolarity =SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + + pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_MIPI; + pSensorInfo->MIPIsensorType = MIPI_OPHY_CSI2; + + pSensorInfo->CaptureDelayFrame = 4; + pSensorInfo->PreviewDelayFrame = 3; + pSensorInfo->VideoDelayFrame = 3; + + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; + pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ + pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ + pSensorInfo->AEISPGainDelayFrame = 2; + + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_PV_X_START; + pSensorInfo->SensorGrabStartY = GC2355_PV_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_VIDEO_X_START; + pSensorInfo->SensorGrabStartY = GC2355_VIDEO_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_FULL_X_START; //2*GC2355_IMAGE_SENSOR_PV_STARTX; + pSensorInfo->SensorGrabStartY = GC2355_FULL_Y_START; //2*GC2355_IMAGE_SENSOR_PV_STARTY; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + default: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_PV_X_START; + pSensorInfo->SensorGrabStartY = GC2355_PV_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + } + + memcpy(pSensorConfigData, &GC2355SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + + return ERROR_NONE; +} /* GC2355GetInfo() */ + + +UINT32 GC2355Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + spin_lock(&gc2355mipiraw_drv_lock); + GC2355CurrentScenarioId = ScenarioId; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355DB("GC2355CurrentScenarioId=%d\n",GC2355CurrentScenarioId); + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + GC2355Preview(pImageWindow, pSensorConfigData); + break; +/* + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + GC2355Video(pImageWindow, pSensorConfigData); + break; + */ + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + GC2355Capture(pImageWindow, pSensorConfigData); + break; + default: + return ERROR_INVALID_SCENARIO_ID; + } + return ERROR_NONE; +} /* GC2355Control() */ + + +UINT32 GC2355SetVideoMode(UINT16 u2FrameRate) +{ + kal_uint32 MIN_Frame_length =0,extralines=0; + GC2355DB("[GC2355SetVideoMode] frame rate = %d\n", u2FrameRate); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355VIDEO_MODE_TARGET_FPS=u2FrameRate; + spin_unlock(&gc2355mipiraw_drv_lock); + + if(u2FrameRate==0) + { + GC2355DB("Disable Video Mode or dynimac fps\n"); + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = extralines ; + spin_unlock(&gc2355mipiraw_drv_lock); + //GC2355_SetDummy(gc2355.DummyPixels ,gc2355.DummyLines); + return KAL_TRUE; + } + + if(u2FrameRate >30 || u2FrameRate <5) + GC2355DB("error frame rate seting %d fps\n",u2FrameRate); + + if(gc2355.sensorMode == SENSOR_MODE_VIDEO)//video ScenarioId recording + { + if(u2FrameRate==30) + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + else + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + MIN_Frame_length = (GC2355MIPI_VIDEO_CLK)/(GC2355_VIDEO_PERIOD_PIXEL_NUMS + gc2355.DummyPixels)/u2FrameRate; + gc2355.DummyLines = MIN_Frame_length - GC2355_VALID_LINE_NUMS-GC2355_DEFAULT_DUMMY_LINE_NUMS; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355DB("GC2355SetVideoMode MIN_Frame_length %d\n",MIN_Frame_length); + + GC2355_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + } + else if(gc2355.sensorMode == SENSOR_MODE_CAPTURE) + { + GC2355DB("-------[GC2355SetVideoMode]ZSD???---------\n"); + if(u2FrameRate==30) + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + else + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + MIN_Frame_length = (GC2355MIPI_VIDEO_CLK)/(GC2355_VIDEO_PERIOD_PIXEL_NUMS + gc2355.DummyPixels)/u2FrameRate; + gc2355.DummyLines = MIN_Frame_length - GC2355_VALID_LINE_NUMS-GC2355_DEFAULT_DUMMY_LINE_NUMS; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + } + + return KAL_TRUE; +} + +UINT32 GC2355SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) +{ + //return ERROR_NONE; + //GC2355DB("[GC2355SetAutoFlickerMode] frame rate(10base) = %d %d\n", bEnable, u2FrameRate); + if(bEnable) { // enable auto flicker + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.GC2355AutoFlickerMode = KAL_TRUE; + spin_unlock(&gc2355mipiraw_drv_lock); + } else { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.GC2355AutoFlickerMode = KAL_FALSE; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355DB("Disable Auto flicker\n"); + } + + return ERROR_NONE; +} + +UINT32 GC2355SetTestPatternMode(kal_bool bEnable) +{ + GC2355DB("[GC2355SetTestPatternMode] Test pattern enable:%d\n", bEnable); + if(bEnable) + { + GC2355_write_cmos_sensor(0x8b,0xb2); //bit[4]: 1 enable test pattern, 0 disable test pattern + } + else + { + GC2355_write_cmos_sensor(0x8b,0xa2);//bit[4]: 1 enable test pattern, 0 disable test pattern + } + return ERROR_NONE; +} + + +UINT32 GC2355MIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) { + kal_uint32 pclk; + kal_int16 dummyLine; + kal_uint16 lineLength,frameHeight; + + GC2355DB("GC2355MIPISetMaxFramerateByScenario: scenarioId = %d, frame rate = %d\n",scenarioId,frameRate); + switch (scenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + pclk = GC2355MIPI_PREVIEW_CLK; + lineLength = GC2355_PV_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk)/frameRate/lineLength; + dummyLine = frameHeight - GC2355_VALID_LINE_NUMS; + gc2355.sensorMode = SENSOR_MODE_PREVIEW; + GC2355_SetDummy(0, dummyLine); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + pclk = GC2355MIPI_VIDEO_CLK; + lineLength = GC2355_VIDEO_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk)/frameRate/lineLength; + dummyLine = frameHeight - GC2355_VALID_LINE_NUMS; + gc2355.sensorMode = SENSOR_MODE_VIDEO; + GC2355_SetDummy(0, dummyLine); + break; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + pclk = GC2355MIPI_CAPTURE_CLK; + lineLength = GC2355_FULL_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk)/frameRate/lineLength; + dummyLine = frameHeight - GC2355_VALID_LINE_NUMS; + gc2355.sensorMode = SENSOR_MODE_CAPTURE; + GC2355_SetDummy(0, dummyLine); + break; + case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added + break; + case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: + break; + case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added + break; + default: + break; + } + return ERROR_NONE; +} + + +UINT32 GC2355MIPIGetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate) +{ + + switch (scenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *pframeRate = 300; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + *pframeRate = 300; + break; + case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added + case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: + case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added + *pframeRate = 300; + break; + default: + break; + } + + return ERROR_NONE; +} + + +UINT32 GC2355FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; + UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; + UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; + UINT32 SensorRegNumber; + UINT32 i; + PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; + + switch (FeatureId) + { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++= GC2355_IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16= GC2355_IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PERIOD: + *pFeatureReturnPara16++= GC2355_FeatureControl_PERIOD_PixelNum; + *pFeatureReturnPara16= GC2355_FeatureControl_PERIOD_LineNum; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + switch(GC2355CurrentScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + *pFeatureReturnPara32 = GC2355MIPI_PREVIEW_CLK; + *pFeatureParaLen=4; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *pFeatureReturnPara32 = GC2355MIPI_VIDEO_CLK; + *pFeatureParaLen=4; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + *pFeatureReturnPara32 = GC2355MIPI_CAPTURE_CLK; + *pFeatureParaLen=4; + break; + default: + *pFeatureReturnPara32 = GC2355MIPI_CAPTURE_CLK; + *pFeatureParaLen=4; + break; + } + break; + + case SENSOR_FEATURE_SET_ESHUTTER: + GC2355_SetShutter(*pFeatureData16); + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + GC2355_NightMode((BOOL) *pFeatureData16); + break; + case SENSOR_FEATURE_SET_GAIN: + GC2355_SetGain((UINT16) *pFeatureData16); + break; + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + //GC2355_isp_master_clock=*pFeatureData32; + break; + case SENSOR_FEATURE_SET_REGISTER: + GC2355_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = GC2355_read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + SensorRegNumber=FACTORY_END_ADDR; + for (i=0;i=sizeof(NVRAM_SENSOR_DATA_STRUCT)) + { + pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION; + pSensorDefaultData->SensorId=GC2355MIPI_SENSOR_ID; + memcpy(pSensorDefaultData->SensorEngReg, GC2355SensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END); + memcpy(pSensorDefaultData->SensorCCTReg, GC2355SensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR); + } + else + return FALSE; + *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pSensorConfigData, &GC2355SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); + break; + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + GC2355_camera_para_to_sensor(); + break; + + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + GC2355_sensor_to_camera_para(); + break; + case SENSOR_FEATURE_GET_GROUP_COUNT: + *pFeatureReturnPara32++=GC2355_get_sensor_group_count(); + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_GROUP_INFO: + GC2355_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount); + *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_ITEM_INFO: + GC2355_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo); + *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + + case SENSOR_FEATURE_SET_ITEM_INFO: + GC2355_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue); + *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + + case SENSOR_FEATURE_GET_ENG_INFO: + pSensorEngInfo->SensorId = 129; + pSensorEngInfo->SensorType = CMOS_SENSOR; + pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_B; + *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE + // if EEPROM does not exist in camera module. + *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen=4; + break; + + case SENSOR_FEATURE_INITIALIZE_AF: + break; + case SENSOR_FEATURE_CONSTANT_AF: + break; + case SENSOR_FEATURE_MOVE_FOCUS_LENS: + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + GC2355SetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + GC2355GetSensorID(pFeatureReturnPara32); + break; + case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: + GC2355SetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1)); + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + GC2355SetTestPatternMode((BOOL)*pFeatureData16); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: + *pFeatureReturnPara32=GC2355_TEST_PATTERN_CHECKSUM; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: + GC2355MIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1)); + break; + case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: + GC2355MIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1))); + break; + default: + break; + } + return ERROR_NONE; +} /* GC2355FeatureControl() */ + + +SENSOR_FUNCTION_STRUCT SensorFuncGC2355= +{ + GC2355Open, + GC2355GetInfo, + GC2355GetResolution, + GC2355FeatureControl, + GC2355Control, + GC2355Close +}; + +UINT32 GC2355_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc!=NULL) + *pfFunc=&SensorFuncGC2355; + + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Sensor.h new file mode 100644 index 00000000000..6bfd3294595 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_Sensor.h @@ -0,0 +1,200 @@ +/*******************************************************************************************/ + + +/*******************************************************************************************/ + +/* SENSOR FULL SIZE */ +#ifndef __SENSOR_H +#define __SENSOR_H + + + +typedef enum group_enum { + PRE_GAIN=0, + CMMCLK_CURRENT, + FRAME_RATE_LIMITATION, + REGISTER_EDITOR, + GROUP_TOTAL_NUMS +} FACTORY_GROUP_ENUM; + + +#define ENGINEER_START_ADDR 10 +#define FACTORY_START_ADDR 0 + +typedef enum engineer_index +{ + CMMCLK_CURRENT_INDEX=ENGINEER_START_ADDR, + ENGINEER_END +} FACTORY_ENGINEER_INDEX; + +typedef enum register_index +{ + SENSOR_BASEGAIN=FACTORY_START_ADDR, + PRE_GAIN_R_INDEX, + PRE_GAIN_Gr_INDEX, + PRE_GAIN_Gb_INDEX, + PRE_GAIN_B_INDEX, + FACTORY_END_ADDR +} FACTORY_REGISTER_INDEX; + + +typedef struct +{ + SENSOR_REG_STRUCT Reg[ENGINEER_END]; + SENSOR_REG_STRUCT CCT[FACTORY_END_ADDR]; +} SENSOR_DATA_STRUCT, *PSENSOR_DATA_STRUCT; + +typedef enum { + SENSOR_MODE_INIT = 0, + SENSOR_MODE_PREVIEW, + SENSOR_MODE_VIDEO, + SENSOR_MODE_CAPTURE +} GC2355_SENSOR_MODE; + + +typedef struct +{ + kal_uint32 DummyPixels; + kal_uint32 DummyLines; + + kal_uint32 pvShutter; + kal_uint32 pvGain; + kal_uint32 Gain; + + kal_uint32 pvPclk; // x10 480 for 48MHZ + kal_uint32 videoPclk; + kal_uint32 capPclk; // x10 + + kal_uint32 shutter; + kal_uint32 maxExposureLines; + + kal_uint16 sensorGlobalGain;//sensor gain read from 0x350a 0x350b; + kal_uint16 ispBaseGain;//64 + kal_uint16 realGain;//ispBaseGain as 1x + + kal_int16 imgMirror; + + GC2355_SENSOR_MODE sensorMode; + + kal_bool GC2355AutoFlickerMode; + kal_bool GC2355VideoMode; + +}GC2355_PARA_STRUCT,*PGC2355_PARA_STRUCT; + + #define GC2355_MIPI_2_Lane + #define GC2355_MIPI_30FPS + + #define GC2355_IMAGE_SENSOR_FULL_WIDTH (1600) + #define GC2355_IMAGE_SENSOR_FULL_HEIGHT (1200) + + /* SENSOR PV SIZE */ + #define GC2355_IMAGE_SENSOR_PV_WIDTH (1600) + #define GC2355_IMAGE_SENSOR_PV_HEIGHT (1200) + + #define GC2355_IMAGE_SENSOR_VIDEO_WIDTH (1600) + #define GC2355_IMAGE_SENSOR_VIDEO_HEIGHT (1200) + + + /* SENSOR SCALER FACTOR */ + #define GC2355_PV_SCALER_FACTOR 3 + #define GC2355_FULL_SCALER_FACTOR 1 + + /* SENSOR START/EDE POSITION */ + #define GC2355_FULL_X_START (0) + #define GC2355_FULL_Y_START (0) + + + #define GC2355_PV_X_START 0 + #define GC2355_PV_Y_START 0 + + + #define GC2355_VIDEO_X_START 0 + #define GC2355_VIDEO_Y_START 0 + + + #define GC2355_MAX_ANALOG_GAIN (6) + #define GC2355_MIN_ANALOG_GAIN (1) + #define GC2355_ANALOG_GAIN_1X (0x0020) +#ifdef GC2355_MIPI_30FPS + #define GC2355MIPI_CAPTURE_CLK (42000000) + #define GC2355MIPI_PREVIEW_CLK (42000000) + #define GC2355MIPI_VIDEO_CLK (42000000) +#else //20fps + #define GC2355MIPI_CAPTURE_CLK (30000000) + #define GC2355MIPI_PREVIEW_CLK (30000000) + #define GC2355MIPI_VIDEO_CLK (30000000) +#endif + + /* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ + + +#define GC2355_VALID_IXEL_NUMS 800 +#define GC2355_VALID_LINE_NUMS 1200 +#ifdef GC2355_MIPI_30FPS +#define GC2355_DEFAULT_DUMMY_PIXEL_NUMS 0x11c //244 +#define GC2355_DEFAULT_DUMMY_LINE_NUMS 0x0e //64 +#define GC2355_VIDEO_PERIOD_PIXEL_NUMS (1120) +#define GC2355_VIDEO_PERIOD_LINE_NUMS (1246) + +#define GC2355_PV_PERIOD_PIXEL_NUMS (1120) +#define GC2355_PV_PERIOD_LINE_NUMS (1246) + +#define GC2355_FULL_PERIOD_PIXEL_NUMS (1120) +#define GC2355_FULL_PERIOD_LINE_NUMS (1246) + +#else //20fps +#define GC2355_DEFAULT_DUMMY_PIXEL_NUMS 285 //244 +#define GC2355_DEFAULT_DUMMY_LINE_NUMS 123 //64 +#define GC2355_VIDEO_PERIOD_PIXEL_NUMS (1107) +#define GC2355_VIDEO_PERIOD_LINE_NUMS (1355) + +#define GC2355_PV_PERIOD_PIXEL_NUMS (1107) +#define GC2355_PV_PERIOD_LINE_NUMS (1355) + +#define GC2355_FULL_PERIOD_PIXEL_NUMS (1107) +#define GC2355_FULL_PERIOD_LINE_NUMS (1355) + +#endif + + + +#define GC2355_MIN_LINE_LENGTH 0x1100 +#define GC2355_MIN_FRAME_LENGTH 0xc00 + +#define GC2355_MAX_LINE_LENGTH 0xCCCC +#define GC2355_MAX_FRAME_LENGTH 0xFFFF + + /* DUMMY NEEDS TO BE INSERTED */ + /* SETUP TIME NEED TO BE INSERTED */ + +#define GC2355MIPI_WRITE_ID (0x78) +#define GC2355MIPI_READ_ID (0x79) + +// SENSOR CHIP VERSION + +//#define GC2355MIPI_SENSOR_ID GC2355_SENSOR_ID + +#define GC2355MIPI_PAGE_SETTING_REG (0xFF) + +//s_add for porting +//s_add for porting +//s_add for porting + +//export functions +UINT32 GC2355MIPIOpen(void); +UINT32 GC2355MIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); +UINT32 GC2355MIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2355MIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2355MIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); +UINT32 GC2355MIPIClose(void); + +//#define Sleep(ms) mdelay(ms) +//#define RETAILMSG(x,...) +//#define TEXT + +//e_add for porting +//e_add for porting +//e_add for porting + +#endif /* __SENSOR_H */ + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipiraw_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_CameraCustomized.h similarity index 100% rename from drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipiraw_CameraCustomized.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_CameraCustomized.h diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipiraw_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Camera_Sensor_para.h similarity index 100% rename from drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipiraw_Camera_Sensor_para.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Camera_Sensor_para.h diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Sensor.c new file mode 100755 index 00000000000..59ad94218df --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Sensor.c @@ -0,0 +1,1205 @@ +/*******************************************************************************************/ + + +/*******************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" + +#include "gc2355mipiraw_huaquan_Sensor.h" +#include "gc2355mipiraw_huaquan_Camera_Sensor_para.h" +#include "gc2355mipiraw_huaquan_CameraCustomized.h" +static DEFINE_SPINLOCK(gc2355mipiraw_drv_lock); + +#define GC2355_HUAQUAN_DEBUG +//#define GC2355_HUAQUAN_DEBUG_SOFIA +#define GC2355_HUAQUAN_TEST_PATTERN_CHECKSUM (0x9d1c9dad)//(0x5593c632) + +#ifdef GC2355_HUAQUAN_DEBUG + //#define GC2355_HUAQUANDB(fmt, arg...) pr_debug("[GC2355_HUAQUANmipiraw][%s] " fmt, __func__, ##arg) + #define GC2355_HUAQUANDB(fmt, arg...) printk("[GC2355_HUAQUANmipiraw][%s] " fmt, __func__, ##arg) +#else + #define GC2355_HUAQUANDB(fmt, arg...) +#endif + +#ifdef GC2355_HUAQUAN_DEBUG_SOFIA + #define GC2355_HUAQUANDBSOFIA(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG, "[GC2355_HUAQUANRaw] ", fmt, ##arg) +#else + #define GC2355_HUAQUANDBSOFIA(fmt, arg...) +#endif + +#define mDELAY(ms) mdelay(ms) + +kal_uint32 GC2355_HUAQUAN_FeatureControl_PERIOD_PixelNum=GC2355_HUAQUAN_PV_PERIOD_PIXEL_NUMS; +kal_uint32 GC2355_HUAQUAN_FeatureControl_PERIOD_LineNum=GC2355_HUAQUAN_PV_PERIOD_LINE_NUMS; +UINT16 gc2355_huaquan_VIDEO_MODE_TARGET_FPS = 30; +MSDK_SENSOR_CONFIG_STRUCT GC2355_HUAQUANSensorConfigData; +MSDK_SCENARIO_ID_ENUM GC2355_HUAQUANCurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; + +/* FIXME: old factors and DIDNOT use now. s*/ +SENSOR_REG_STRUCT GC2355_HUAQUANSensorCCT[]=CAMERA_SENSOR_CCT_DEFAULT_VALUE; +SENSOR_REG_STRUCT GC2355_HUAQUANSensorReg[ENGINEER_END]=CAMERA_SENSOR_REG_DEFAULT_VALUE; +/* FIXME: old factors and DIDNOT use now. e*/ + +static GC2355_HUAQUAN_PARA_STRUCT gc2355; + +#define Sleep(ms) mdelay(ms) +#define GC2355_HUAQUAN_ORIENTATION IMAGE_NORMAL //IMAGE_HV_MIRROR //IMAGE_NORMAL + +extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); + +static kal_uint16 moduleid = 0x00; + +/************************************************************************* +* FUNCTION +* GC2035_read_cmos_sensor +* +* DESCRIPTION +* This function read data from CMOS sensor through I2C. +* +* PARAMETERS +* addr: the 16bit address of register +* +* RETURNS +* 8bit data read through I2C +* +* LOCAL AFFECTED +* +*************************************************************************/ +static kal_uint8 GC2355_HUAQUAN_read_cmos_sensor(kal_uint8 addr) +{ + kal_uint8 in_buff[1] = {0xFF}; + kal_uint8 out_buff[1]; + + out_buff[0] = addr; + + if (0 != iReadRegI2C((u8*)out_buff , 1, (u8*)in_buff, 1, GC2355_HUAQUANMIPI_WRITE_ID)) { + GC2355_HUAQUANDB("ERROR: GC2355_HUAQUANMIPI_read_cmos_sensor \n"); + } + return in_buff[0]; +} + + +/************************************************************************* +* FUNCTION +* GC2355_HUAQUANMIPI_write_cmos_sensor +* +* DESCRIPTION +* This function wirte data to CMOS sensor through I2C +* +* PARAMETERS +* addr: the 16bit address of register +* para: the 8bit value of register +* +* RETURNS +* None +* +* LOCAL AFFECTED +* +*************************************************************************/ +static void GC2355_HUAQUAN_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) +{ +kal_uint8 out_buff[2]; + + out_buff[0] = addr; + out_buff[1] = para; + + iWriteRegI2C((u8*)out_buff , 2, GC2355_HUAQUANMIPI_WRITE_ID); + + GC2355_HUAQUANDB("cc read 0x%x =%x \n", addr, GC2355_HUAQUAN_read_cmos_sensor(addr)); +} + + + +void GC2355_HUAQUAN_SetGain(UINT16 iGain) +{ + +#define ANALOG_GAIN_1 64 // 1.00x +#define ANALOG_GAIN_2 88 //1.37x +#define ANALOG_GAIN_3 121 // 1.89x +#define ANALOG_GAIN_4 168 // 2.59x +#define ANALOG_GAIN_5 239 // 3.70x +#define ANALOG_GAIN_6 330 // 5.06x +#define ANALOG_GAIN_7 470 // 7.15x + + kal_uint16 iReg,temp,temp1; + + GC2355_HUAQUANDB("GC2355_HUAQUANMIPI_SetGain iGain = %d \n",iGain); + + //GC2355_HUAQUAN_write_cmos_sensor(0xb1, 0x01); + //GC2355_HUAQUAN_write_cmos_sensor(0xb2, 0x00); + + iReg = iGain; + //digital gain + //GC2355_HUAQUANMIPI_write_cmos_sensor(0xb1, iReg>>6); + //GC2355_HUAQUANMIPI_write_cmos_sensor(0xb2, (iReg<<2)&0xfc); + if(iReg==0) + return; + + if(iReg < 0x40) + iReg = 0x40; + if(iReg > 511) + iReg = 511; + + if((ANALOG_GAIN_1<= iReg)&&(iReg < ANALOG_GAIN_2)) + { + //analog gain + GC2355_HUAQUAN_write_cmos_sensor(0xb6,0x00);// + temp = iReg; + GC2355_HUAQUAN_write_cmos_sensor(0xb1, temp>>6); + GC2355_HUAQUAN_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + GC2355_HUAQUANDB("GC2355_HUAQUAN analogic gain 1x , GC2355_HUAQUAN add pregain = %d\n",temp); + + } + else if((ANALOG_GAIN_2<= iReg)&&(iReg < ANALOG_GAIN_3)) + { + //analog gain + GC2355_HUAQUAN_write_cmos_sensor(0xb6,0x01);// + temp = 64*iReg/ANALOG_GAIN_2; + GC2355_HUAQUAN_write_cmos_sensor(0xb1, temp>>6); + GC2355_HUAQUAN_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + GC2355_HUAQUANDB("GC2355_HUAQUAN analogic gain 1.45x , GC2355_HUAQUAN add pregain = %d\n",temp); + + } + + else if((ANALOG_GAIN_3<= iReg)&&(iReg < ANALOG_GAIN_4)) + { + //analog gain + GC2355_HUAQUAN_write_cmos_sensor(0xb6, 0x02);// + temp = 64*iReg/ANALOG_GAIN_3; + GC2355_HUAQUAN_write_cmos_sensor(0xb1, temp>>6); + GC2355_HUAQUAN_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + GC2355_HUAQUANDB("GC2355_HUAQUAN analogic gain 2.02x , GC2355_HUAQUAN add pregain = %d\n",temp); + } + +// else if(ANALOG_GAIN_4<= iReg) + else + { + //analog gain + GC2355_HUAQUAN_write_cmos_sensor(0xb6, 0x03);// + temp = 64*iReg/ANALOG_GAIN_4; + GC2355_HUAQUAN_write_cmos_sensor(0xb1, temp>>6); + GC2355_HUAQUAN_write_cmos_sensor(0xb2, (temp<<2)&0xfc); + + GC2355_HUAQUANDB("GC2355_HUAQUAN analogic gain 2.8x, temp = %d\n", temp); + } + +} /* GC2355_HUAQUAN_SetGain_SetGain */ + + +void GC2355_HUAQUAN_camera_para_to_sensor(void) +{} + +void GC2355_HUAQUAN_sensor_to_camera_para(void) +{} + +kal_int32 GC2355_HUAQUAN_get_sensor_group_count(void) +{ + return GROUP_TOTAL_NUMS; +} + +void GC2355_HUAQUAN_get_sensor_group_info(kal_uint16 group_idx, kal_int8* group_name_ptr, kal_int32* item_count_ptr) +{} +void GC2355_HUAQUAN_get_sensor_item_info(kal_uint16 group_idx,kal_uint16 item_idx, MSDK_SENSOR_ITEM_INFO_STRUCT* info_ptr) +{} +kal_bool GC2355_HUAQUAN_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 ItemValue) +{ return KAL_TRUE;} + +static void GC2355_HUAQUAN_SetDummy( const kal_uint32 iPixels, const kal_uint32 iLines ) +{ + kal_uint32 hb = 0; + kal_uint32 vb = 0; + + if ( SENSOR_MODE_PREVIEW == gc2355.sensorMode ) //SXGA size output + { + hb = GC2355_HUAQUAN_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2355_HUAQUAN_DEFAULT_DUMMY_LINE_NUMS + iLines; + } + else if( SENSOR_MODE_VIDEO== gc2355.sensorMode ) + { + hb = GC2355_HUAQUAN_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2355_HUAQUAN_DEFAULT_DUMMY_LINE_NUMS + iLines; + } + else//QSXGA size output + { + hb = GC2355_HUAQUAN_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2355_HUAQUAN_DEFAULT_DUMMY_LINE_NUMS + iLines; + } + + //if(gc2355.maxExposureLines > frame_length -4 ) + // return; + + //ASSERT(line_length < GC2355_HUAQUAN_MAX_LINE_LENGTH); //0xCCCC + //ASSERT(frame_length < GC2355_HUAQUAN_MAX_FRAME_LENGTH); //0xFFFF + + //Set HB + GC2355_HUAQUAN_write_cmos_sensor(0x05, (hb >> 8)& 0xFF); + GC2355_HUAQUAN_write_cmos_sensor(0x06, hb & 0xFF); + + //Set VB + GC2355_HUAQUAN_write_cmos_sensor(0x07, (vb >> 8) & 0xFF); + GC2355_HUAQUAN_write_cmos_sensor(0x08, vb & 0xFF); + GC2355_HUAQUANDB("GC2355_HUAQUAN_SetDummy framelength=%d\n",vb+GC2355_HUAQUAN_VALID_LINE_NUMS); + +} /* GC2355_HUAQUAN_SetDummy */ + +static void GC2355_HUAQUAN_Sensor_Init(void) +{ + /* SYS */ + GC2355_HUAQUAN_write_cmos_sensor(0xfe,0x80); + GC2355_HUAQUAN_write_cmos_sensor(0xfe,0x80); + GC2355_HUAQUAN_write_cmos_sensor(0xfe,0x80); + GC2355_HUAQUAN_write_cmos_sensor(0xf2,0x00); //sync_pad_io_ebi + GC2355_HUAQUAN_write_cmos_sensor(0xf6,0x00); //up down + GC2355_HUAQUAN_write_cmos_sensor(0xf7,0x19); //19 //pll enable + GC2355_HUAQUAN_write_cmos_sensor(0xf8,0x06); //Pll mode 2 /////86--\B0\B5\B4\A6\BD\B5Ƶ + GC2355_HUAQUAN_write_cmos_sensor(0xf9,0x0e); //de//[0] pll enable + GC2355_HUAQUAN_write_cmos_sensor(0xfa,0x00); //div + GC2355_HUAQUAN_write_cmos_sensor(0xfc,0x06); //4e + //GC2355_HUAQUAN_write_cmos_sensor(0xfd,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0xfe,0x00); + + /* ANALOG & CISCTL*/ + // AEC&frame length// + GC2355_HUAQUAN_write_cmos_sensor(0x03,0x04); // 0a -> 04 + GC2355_HUAQUAN_write_cmos_sensor(0x04,0xb0); // 41 -> b0 + GC2355_HUAQUAN_write_cmos_sensor(0x05,0x01); //max 30fps 03 + GC2355_HUAQUAN_write_cmos_sensor(0x06,0x1c); + GC2355_HUAQUAN_write_cmos_sensor(0x07,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x08,0x0e); //22 + GC2355_HUAQUAN_write_cmos_sensor(0x0a,0x00); //row start + GC2355_HUAQUAN_write_cmos_sensor(0x0c,0x04); //0c//col start + GC2355_HUAQUAN_write_cmos_sensor(0x0d,0x04); + GC2355_HUAQUAN_write_cmos_sensor(0x0e,0xc0); //c0 + GC2355_HUAQUAN_write_cmos_sensor(0x0f,0x06); + GC2355_HUAQUAN_write_cmos_sensor(0x10,0x50); //Window setting 1616x1216 + /*GC2355_HUAQUAN_write_cmos_sensor(0x11,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x12,0x18); //sh_delay + GC2355_HUAQUAN_write_cmos_sensor(0x13,0x11); + GC2355_HUAQUAN_write_cmos_sensor(0x14,0x01); + GC2355_HUAQUAN_write_cmos_sensor(0x15,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x16,0xc1);*/ + GC2355_HUAQUAN_write_cmos_sensor(0x17,0x17);//14 + //GC2355_HUAQUAN_write_cmos_sensor(0x18,0x02); + GC2355_HUAQUAN_write_cmos_sensor(0x19,0x0b); + GC2355_HUAQUAN_write_cmos_sensor(0x1b,0x48); //48 + GC2355_HUAQUAN_write_cmos_sensor(0x1c,0x12); + GC2355_HUAQUAN_write_cmos_sensor(0x1d,0x10); //double reset + GC2355_HUAQUAN_write_cmos_sensor(0x1e,0xbc); //a8//col_r/rowclk_mode/rsthigh_en FPN + GC2355_HUAQUAN_write_cmos_sensor(0x1f,0xc9); //c8//rsgl_s_mode/vpix_s_mode \B5ƹܺ\E1\CC\F5\CE\C6 + GC2355_HUAQUAN_write_cmos_sensor(0x20,0x71); + GC2355_HUAQUAN_write_cmos_sensor(0x21,0x20); //rsg \B5ƹܺ\E1\CC\F5\CE\C6 //////40 + GC2355_HUAQUAN_write_cmos_sensor(0x22,0xa0); //e0 //80 //f0 + GC2355_HUAQUAN_write_cmos_sensor(0x23,0x51); //51 + GC2355_HUAQUAN_write_cmos_sensor(0x24,0x19); //0b //55 + //GC2355_HUAQUAN_write_cmos_sensor(0x25,0x10); //10 + //GC2355_HUAQUAN_write_cmos_sensor(0x26,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x27,0x20); + GC2355_HUAQUAN_write_cmos_sensor(0x28,0x00);//10 + //GC2355_HUAQUAN_write_cmos_sensor(0x29,0x00); + //GC2355_HUAQUAN_write_cmos_sensor(0x2a,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x2b,0x80); //00 sf_s_mode FPN + GC2355_HUAQUAN_write_cmos_sensor(0x2c,0x38); //50 //5c ispg FPN + //GC2355_HUAQUAN_write_cmos_sensor(0x2d,0x15); + GC2355_HUAQUAN_write_cmos_sensor(0x2e,0x16); //05//eq width + GC2355_HUAQUAN_write_cmos_sensor(0x2f,0x14); //[3:0]tx_width д0\C4ܸ\C4\C2\E9\B5\E3 + GC2355_HUAQUAN_write_cmos_sensor(0x30,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x31,0x01); + GC2355_HUAQUAN_write_cmos_sensor(0x32,0x02); + GC2355_HUAQUAN_write_cmos_sensor(0x33,0x03); + GC2355_HUAQUAN_write_cmos_sensor(0x34,0x07); + GC2355_HUAQUAN_write_cmos_sensor(0x35,0x0b); + GC2355_HUAQUAN_write_cmos_sensor(0x36,0x0f); + + /* gain */ + GC2355_HUAQUAN_write_cmos_sensor(0xb0,0x50); + GC2355_HUAQUAN_write_cmos_sensor(0xb1,0x01); + GC2355_HUAQUAN_write_cmos_sensor(0xb2,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0xb3,0x40); + GC2355_HUAQUAN_write_cmos_sensor(0xb4,0x40); + GC2355_HUAQUAN_write_cmos_sensor(0xb5,0x40); + GC2355_HUAQUAN_write_cmos_sensor(0xb6,0x00); + + /* crop */ + GC2355_HUAQUAN_write_cmos_sensor(0x92,0x02); + GC2355_HUAQUAN_write_cmos_sensor(0x95,0x04); + GC2355_HUAQUAN_write_cmos_sensor(0x96,0xb0); + GC2355_HUAQUAN_write_cmos_sensor(0x97,0x06); + GC2355_HUAQUAN_write_cmos_sensor(0x98,0x40); //out window set 1600x1200 + + /* BLK */ + GC2355_HUAQUAN_write_cmos_sensor(0x18,0x02);//1a-lily + GC2355_HUAQUAN_write_cmos_sensor(0x1a,0x01);//09-lily //01 + GC2355_HUAQUAN_write_cmos_sensor(0x40,0x42);//43-lily + GC2355_HUAQUAN_write_cmos_sensor(0x41,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x44,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x45,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x46,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x47,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x48,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x49,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x4a,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x4b,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x4e,0x3c); //BLK select + GC2355_HUAQUAN_write_cmos_sensor(0x4f,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x5e,0x00);//18-lily //offset ratio + GC2355_HUAQUAN_write_cmos_sensor(0x66,0x20);//20-lily //dark ratio + GC2355_HUAQUAN_write_cmos_sensor(0x6a,0x00);//39 + GC2355_HUAQUAN_write_cmos_sensor(0x6b,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x6c,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x6d,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x6e,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x6f,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x70,0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x71,0x00); //manual offset + + /* Dark sun */ + GC2355_HUAQUAN_write_cmos_sensor(0x87,0x03); // + GC2355_HUAQUAN_write_cmos_sensor(0xe0,0xe7); //dark sun en/extend mode + GC2355_HUAQUAN_write_cmos_sensor(0xe2,0x03); + GC2355_HUAQUAN_write_cmos_sensor(0xe3,0xc0); //clamp + GC2355_HUAQUAN_write_cmos_sensor(0xe4, 0x01); + GC2355_HUAQUAN_write_cmos_sensor(0xe5, 0xff); /*add by lucifer*/ + + /*MIPI*/ + GC2355_HUAQUAN_write_cmos_sensor(0xfe, 0x03); + GC2355_HUAQUAN_write_cmos_sensor(0x01, 0x83); + GC2355_HUAQUAN_write_cmos_sensor(0x02, 0x11); + GC2355_HUAQUAN_write_cmos_sensor(0x03, 0x91); + GC2355_HUAQUAN_write_cmos_sensor(0x04, 0x01); + GC2355_HUAQUAN_write_cmos_sensor(0x05, 0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x06, 0xa2); + GC2355_HUAQUAN_write_cmos_sensor(0x10, 0x92);//91//94//1lane raw8, 90 + GC2355_HUAQUAN_write_cmos_sensor(0x11, 0x2b);//2b + GC2355_HUAQUAN_write_cmos_sensor(0x15, 0x60); + GC2355_HUAQUAN_write_cmos_sensor(0x12, 0xd0); //d0//40 + GC2355_HUAQUAN_write_cmos_sensor(0x13, 0x07); //07//06 + GC2355_HUAQUAN_write_cmos_sensor(0x21, 0x10); + GC2355_HUAQUAN_write_cmos_sensor(0x22, 0x05); + GC2355_HUAQUAN_write_cmos_sensor(0x23, 0x30); + GC2355_HUAQUAN_write_cmos_sensor(0x24, 0x02); + GC2355_HUAQUAN_write_cmos_sensor(0x25, 0x15); + GC2355_HUAQUAN_write_cmos_sensor(0x26, 0x08); + GC2355_HUAQUAN_write_cmos_sensor(0x27, 0x06); + GC2355_HUAQUAN_write_cmos_sensor(0x29, 0x06);//04 + GC2355_HUAQUAN_write_cmos_sensor(0x2a, 0x0a); + GC2355_HUAQUAN_write_cmos_sensor(0x2b, 0x08); + GC2355_HUAQUAN_write_cmos_sensor(0x40, 0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x41, 0x00); + GC2355_HUAQUAN_write_cmos_sensor(0x42, 0x40); + GC2355_HUAQUAN_write_cmos_sensor(0x43, 0x06); + GC2355_HUAQUAN_write_cmos_sensor(0xfe, 0x00); + + +} /* GC2355_HUAQUAN_Sensor_Init */ + +UINT32 GC2355_HUAQUANOpen(void) +{ + volatile signed int i; + kal_uint16 sensor_id = 0; + GC2355_HUAQUANDB("GC2355_HUAQUANOpen enter :\n "); + sensor_id=((GC2355_HUAQUAN_read_cmos_sensor(0xf0) << 8) | GC2355_HUAQUAN_read_cmos_sensor(0xf1)); + GC2355_HUAQUANDB("GC2355_HUAQUANMIPIGetSensorID:%x \n",sensor_id); + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_INIT; + gc2355.GC2355_HUAQUANAutoFlickerMode = KAL_FALSE; + gc2355.GC2355_HUAQUANVideoMode = KAL_FALSE; + gc2355.shutter = 0xff; + gc2355.Gain = 64; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355_HUAQUAN_Sensor_Init(); + + GC2355_HUAQUANDB("GC2355_HUAQUANOpen exit :\n "); + + return ERROR_NONE; +} +UINT32 GC2355HUAQUANGetModuleID() +{ + printk("GC2355HUAQUANGetModuleID\n"); + return moduleid; +} + +extern IMM_auxadc_GetOneChannelValue_Cali(int Channel, int *voltage); +UINT32 GC2355_HUAQUANGetSensorID(UINT32 *sensorID) +{ + int retry = 1; + int adc_val = 0; + GC2355_HUAQUANDB("GC2355_HUAQUANGetSensorID enter :\n "); + + // check if sensor ID correct + *sensorID =((GC2355_HUAQUAN_read_cmos_sensor(0xf0) << 8) | GC2355_HUAQUAN_read_cmos_sensor(0xf1)); + //IMM_auxadc_GetOneChannelValue_Cali(12, &adc_val); + //if ((*sensorID == GC2355MIPI_SENSOR_ID_HUAQUAN) && (adc_val < 100000)) { /*0.1v = 100000uv , 0v :huaqun ; >0.1:qunhui*/ + if (*sensorID == GC2355MIPI_SENSOR_ID_HUAQUAN) { + *sensorID = GC2355MIPI_SENSOR_ID_HUAQUAN; + moduleid = 0x02; + + } else { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + GC2355_HUAQUANDB("GC2355_HUAQUANMIPIGetSensorID:%x \n",*sensorID); + /* + if (*sensorID != GC2355MIPI_SENSOR_ID_HUAQUAN) { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + */ + return ERROR_NONE; +} + + +void GC2355_HUAQUAN_SetShutter(kal_uint32 iShutter) +{ + //kal_uint8 i=0; + if(MSDK_SCENARIO_ID_CAMERA_ZSD == GC2355_HUAQUANCurrentScenarioId ) + { + //GC2355_HUAQUANDB("always UPDATE SHUTTER when gc2355.sensorMode == SENSOR_MODE_CAPTURE\n"); + } + else{ + if(gc2355.sensorMode == SENSOR_MODE_CAPTURE) + { + //GC2355_HUAQUANDB("capture!!DONT UPDATE SHUTTER!!\n"); + //return; + } + } + if(gc2355.shutter == iShutter); + //return; + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.shutter= iShutter; + + spin_unlock(&gc2355mipiraw_drv_lock); + if(gc2355.shutter > 16383) gc2355.shutter = 16383; + if(gc2355.shutter < 12) gc2355.shutter = 12; + GC2355_HUAQUAN_write_cmos_sensor(0x03, (gc2355.shutter>>8) & 0x3F); + GC2355_HUAQUAN_write_cmos_sensor(0x04, gc2355.shutter & 0xFF); + + + GC2355_HUAQUANDB("GC2355_HUAQUAN_SetShutter:%x \n",iShutter); + + // GC2355_HUAQUANDB("GC2355_HUAQUAN_SetShutter 0x03=%x, 0x04=%x \n",GC2355_HUAQUAN_read_cmos_sensor(0x03),GC2355_HUAQUAN_read_cmos_sensor(0x04)); + return; +} /* GC2355_HUAQUAN_SetShutter */ + +UINT32 GC2355_HUAQUAN_read_shutter(void) +{ + + kal_uint16 temp_reg1, temp_reg2; + UINT32 shutter =0; + temp_reg1 = GC2355_HUAQUAN_read_cmos_sensor(0x03); // AEC[b19~b16] + temp_reg2 = GC2355_HUAQUAN_read_cmos_sensor(0x04); // AEC[b15~b8] + shutter = ((temp_reg1 << 8)| (temp_reg2)); + + return shutter; +} + +void GC2355_HUAQUAN_NightMode(kal_bool bEnable) +{} + + +UINT32 GC2355_HUAQUANClose(void) +{ return ERROR_NONE;} + +void GC2355_HUAQUANSetFlipMirror(kal_int32 imgMirror) +{ + kal_int16 mirror=0,flip=0; + + switch (imgMirror) + { + case IMAGE_NORMAL://IMAGE_NORMAL: + GC2355_HUAQUAN_write_cmos_sensor(0x17,0x14);//bit[1][0] + GC2355_HUAQUAN_write_cmos_sensor(0x92,0x03); + GC2355_HUAQUAN_write_cmos_sensor(0x94,0x0b); + break; + case IMAGE_H_MIRROR://IMAGE_H_MIRROR: + GC2355_HUAQUAN_write_cmos_sensor(0x17,0x15); +// GC2355_HUAQUAN_write_cmos_sensor(0x92,0x03); +// GC2355_HUAQUAN_write_cmos_sensor(0x94,0x0b); + break; + case IMAGE_V_MIRROR://IMAGE_V_MIRROR: + GC2355_HUAQUAN_write_cmos_sensor(0x17,0x16); +// GC2355_HUAQUAN_write_cmos_sensor(0x92,0x02); +// GC2355_HUAQUAN_write_cmos_sensor(0x94,0x0b); + break; + case IMAGE_HV_MIRROR://IMAGE_HV_MIRROR: + GC2355_HUAQUAN_write_cmos_sensor(0x17,0x17); +// GC2355_HUAQUAN_write_cmos_sensor(0x92,0x02); +// GC2355_HUAQUAN_write_cmos_sensor(0x94,0x0b); + break; + } +} + +UINT32 GC2355_HUAQUANPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + GC2355_HUAQUANDB("GC2355_HUAQUANPreview enter:"); + + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_PREVIEW; // Need set preview setting after capture mode + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + GC2355_HUAQUAN_FeatureControl_PERIOD_PixelNum=GC2355_HUAQUAN_PV_PERIOD_PIXEL_NUMS+ gc2355.DummyPixels; + GC2355_HUAQUAN_FeatureControl_PERIOD_LineNum=GC2355_HUAQUAN_PV_PERIOD_LINE_NUMS+gc2355.DummyLines; + spin_unlock(&gc2355mipiraw_drv_lock); + + //GC2355_HUAQUAN_write_shutter(gc2355.shutter); + //write_GC2355_HUAQUAN_gain(gc2355.pvGain); + //set mirror & flip + //GC2355_HUAQUANDB("[GC2355_HUAQUANPreview] mirror&flip: %d \n",sensor_config_data->SensorImageMirror); + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.imgMirror = sensor_config_data->SensorImageMirror; + spin_unlock(&gc2355mipiraw_drv_lock); + //if(SENSOR_MODE_PREVIEW==gc2355.sensorMode ) return ERROR_NONE; + + GC2355_HUAQUANDB("GC2355_HUAQUANPreview mirror:%d\n",sensor_config_data->SensorImageMirror); + GC2355_HUAQUANSetFlipMirror(GC2355_HUAQUAN_ORIENTATION); + GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + GC2355_HUAQUANDB("GC2355_HUAQUANPreview exit: \n"); + mdelay(100); + return ERROR_NONE; +} /* GC2355_HUAQUANPreview() */ + + +UINT32 GC2355_HUAQUANVideo(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + GC2355_HUAQUANDB("GC2355_HUAQUANVideo enter:"); + if(gc2355.sensorMode == SENSOR_MODE_VIDEO) + { + // do nothing + } + else + //GC2355_HUAQUANVideoSetting(); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_VIDEO; + GC2355_HUAQUAN_FeatureControl_PERIOD_PixelNum=GC2355_HUAQUAN_VIDEO_PERIOD_PIXEL_NUMS+ gc2355.DummyPixels; + GC2355_HUAQUAN_FeatureControl_PERIOD_LineNum=GC2355_HUAQUAN_VIDEO_PERIOD_LINE_NUMS+gc2355.DummyLines; +/* + spin_unlock(&gc2355mipiraw_drv_lock); + + //GC2355_HUAQUAN_write_shutter(gc2355.shutter); + //write_GC2355_HUAQUAN_gain(gc2355.pvGain); + + spin_lock(&gc2355mipiraw_drv_lock); +*/ + gc2355.imgMirror = sensor_config_data->SensorImageMirror; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355_HUAQUANSetFlipMirror(GC2355_HUAQUAN_ORIENTATION); + GC2355_HUAQUANDB("GC2355_HUAQUANVideo mirror:%d\n",sensor_config_data->SensorImageMirror); + GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + //GC2355_HUAQUANDBSOFIA("[GC2355_HUAQUANVideo]frame_len=%x\n", ((GC2355_HUAQUAN_read_cmos_sensor(0x380e)<<8)+GC2355_HUAQUAN_read_cmos_sensor(0x380f))); + mdelay(100); + GC2355_HUAQUANDB("GC2355_HUAQUANVideo exit:\n"); + return ERROR_NONE; +} + + +UINT32 GC2355_HUAQUANCapture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + kal_uint32 shutter = gc2355.shutter; + kal_uint32 temp_data; + if( SENSOR_MODE_CAPTURE== gc2355.sensorMode) + { + GC2355_HUAQUANDB("GC2355_HUAQUANCapture BusrtShot!!!\n"); + }else{ + GC2355_HUAQUANDB("GC2355_HUAQUANCapture enter:\n"); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.pvShutter =shutter; + gc2355.sensorGlobalGain = temp_data; + gc2355.pvGain =gc2355.sensorGlobalGain; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355_HUAQUANDB("[GC2355_HUAQUANCapture]gc2355.shutter=%d, read_pv_shutter=%d, read_pv_gain = 0x%x\n",gc2355.shutter, shutter,gc2355.sensorGlobalGain); + + // Full size setting + //.GC2355_HUAQUANCaptureSetting(); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.sensorMode = SENSOR_MODE_CAPTURE; + gc2355.imgMirror = sensor_config_data->SensorImageMirror; + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + GC2355_HUAQUAN_FeatureControl_PERIOD_PixelNum = GC2355_HUAQUAN_FULL_PERIOD_PIXEL_NUMS + gc2355.DummyPixels; + GC2355_HUAQUAN_FeatureControl_PERIOD_LineNum = GC2355_HUAQUAN_FULL_PERIOD_LINE_NUMS + gc2355.DummyLines; + spin_unlock(&gc2355mipiraw_drv_lock); + + //GC2355_HUAQUANDB("[GC2355_HUAQUANCapture] mirror&flip: %d\n",sensor_config_data->SensorImageMirror); + + GC2355_HUAQUANDB("GC2355_HUAQUANcapture mirror:%d\n",sensor_config_data->SensorImageMirror); + GC2355_HUAQUANSetFlipMirror(GC2355_HUAQUAN_ORIENTATION); + GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + + if(GC2355_HUAQUANCurrentScenarioId==MSDK_SCENARIO_ID_CAMERA_ZSD) + { + GC2355_HUAQUANDB("GC2355_HUAQUANCapture exit ZSD!!\n"); + return ERROR_NONE; + } + GC2355_HUAQUANDB("GC2355_HUAQUANCapture exit:\n"); + } + + return ERROR_NONE; +} /* GC2355_HUAQUANCapture() */ + +UINT32 GC2355_HUAQUANGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) +{ + + GC2355_HUAQUANDB("GC2355_HUAQUANGetResolution!!\n"); + pSensorResolution->SensorPreviewWidth = GC2355_HUAQUAN_IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorPreviewHeight = GC2355_HUAQUAN_IMAGE_SENSOR_PV_HEIGHT; + pSensorResolution->SensorFullWidth = GC2355_HUAQUAN_IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorFullHeight = GC2355_HUAQUAN_IMAGE_SENSOR_FULL_HEIGHT; + pSensorResolution->SensorVideoWidth = GC2355_HUAQUAN_IMAGE_SENSOR_VIDEO_WIDTH; + pSensorResolution->SensorVideoHeight = GC2355_HUAQUAN_IMAGE_SENSOR_VIDEO_HEIGHT; + return ERROR_NONE; +} /* GC2355_HUAQUANGetResolution() */ + +UINT32 GC2355_HUAQUANGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + + pSensorInfo->SensorPreviewResolutionX= GC2355_HUAQUAN_IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY= GC2355_HUAQUAN_IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX= GC2355_HUAQUAN_IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY= GC2355_HUAQUAN_IMAGE_SENSOR_FULL_HEIGHT; + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.imgMirror = pSensorConfigData->SensorImageMirror ; + spin_unlock(&gc2355mipiraw_drv_lock); + + pSensorInfo->SensorOutputDataFormat= SENSOR_OUTPUT_FORMAT_RAW_B; + + pSensorInfo->SensorClockPolarity =SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + + pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_MIPI; + pSensorInfo->MIPIsensorType = MIPI_OPHY_CSI2; + + pSensorInfo->CaptureDelayFrame = 4; + pSensorInfo->PreviewDelayFrame = 3; + pSensorInfo->VideoDelayFrame = 3; + + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; + pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ + pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ + pSensorInfo->AEISPGainDelayFrame = 2; + + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_HUAQUAN_PV_X_START; + pSensorInfo->SensorGrabStartY = GC2355_HUAQUAN_PV_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE;//2 + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_HUAQUAN_VIDEO_X_START; + pSensorInfo->SensorGrabStartY = GC2355_HUAQUAN_VIDEO_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE;//2 + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_HUAQUAN_FULL_X_START; //2*GC2355_HUAQUAN_IMAGE_SENSOR_PV_STARTX; + pSensorInfo->SensorGrabStartY = GC2355_HUAQUAN_FULL_Y_START; //2*GC2355_HUAQUAN_IMAGE_SENSOR_PV_STARTY; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + default: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockRisingCount= 0; + + pSensorInfo->SensorGrabStartX = GC2355_HUAQUAN_PV_X_START; + pSensorInfo->SensorGrabStartY = GC2355_HUAQUAN_PV_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE;//2 + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + } + + memcpy(pSensorConfigData, &GC2355_HUAQUANSensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + + return ERROR_NONE; +} /* GC2355_HUAQUANGetInfo() */ + + +UINT32 GC2355_HUAQUANControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + spin_lock(&gc2355mipiraw_drv_lock); + GC2355_HUAQUANCurrentScenarioId = ScenarioId; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355_HUAQUANDB("GC2355_HUAQUANCurrentScenarioId=%d\n",GC2355_HUAQUANCurrentScenarioId); + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + GC2355_HUAQUANPreview(pImageWindow, pSensorConfigData); + break; +/* + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + GC2355_HUAQUANVideo(pImageWindow, pSensorConfigData); + break; + */ + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + GC2355_HUAQUANCapture(pImageWindow, pSensorConfigData); + break; + default: + return ERROR_INVALID_SCENARIO_ID; + } + return ERROR_NONE; +} /* GC2355_HUAQUANControl() */ + + +UINT32 GC2355_HUAQUANSetVideoMode(UINT16 u2FrameRate) +{ + kal_uint32 MIN_Frame_length =0,extralines=0; + GC2355_HUAQUANDB("[GC2355_HUAQUANSetVideoMode] frame rate = %d\n", u2FrameRate); + + spin_lock(&gc2355mipiraw_drv_lock); + gc2355_huaquan_VIDEO_MODE_TARGET_FPS=u2FrameRate; + spin_unlock(&gc2355mipiraw_drv_lock); + + if(u2FrameRate==0) + { + GC2355_HUAQUANDB("Disable Video Mode or dynimac fps\n"); + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = extralines ; + spin_unlock(&gc2355mipiraw_drv_lock); + //GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels ,gc2355.DummyLines); + return KAL_TRUE; + } + + if(u2FrameRate >30 || u2FrameRate <5) + GC2355_HUAQUANDB("error frame rate seting %d fps\n",u2FrameRate); + + if(gc2355.sensorMode == SENSOR_MODE_VIDEO)//video ScenarioId recording + { + if(u2FrameRate==30) + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + else + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + MIN_Frame_length = (GC2355_HUAQUANMIPI_VIDEO_CLK)/(GC2355_HUAQUAN_VIDEO_PERIOD_PIXEL_NUMS + gc2355.DummyPixels)/u2FrameRate; + gc2355.DummyLines = MIN_Frame_length - GC2355_HUAQUAN_VALID_LINE_NUMS-GC2355_HUAQUAN_DEFAULT_DUMMY_LINE_NUMS; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355_HUAQUANDB("GC2355_HUAQUANSetVideoMode MIN_Frame_length %d\n",MIN_Frame_length); + + GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + } + else if(gc2355.sensorMode == SENSOR_MODE_CAPTURE) + { + GC2355_HUAQUANDB("-------[GC2355_HUAQUANSetVideoMode]ZSD???---------\n"); + if(u2FrameRate==30) + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + gc2355.DummyLines = 0 ; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + else + { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.DummyPixels = 0;//define dummy pixels and lines + MIN_Frame_length = (GC2355_HUAQUANMIPI_VIDEO_CLK)/(GC2355_HUAQUAN_VIDEO_PERIOD_PIXEL_NUMS + gc2355.DummyPixels)/u2FrameRate; + gc2355.DummyLines = MIN_Frame_length - GC2355_HUAQUAN_VALID_LINE_NUMS-GC2355_HUAQUAN_DEFAULT_DUMMY_LINE_NUMS; + spin_unlock(&gc2355mipiraw_drv_lock); + + GC2355_HUAQUAN_SetDummy(gc2355.DummyPixels,gc2355.DummyLines); + } + } + + return KAL_TRUE; +} + +UINT32 GC2355_HUAQUANSetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) +{ + //return ERROR_NONE; + //GC2355_HUAQUANDB("[GC2355_HUAQUANSetAutoFlickerMode] frame rate(10base) = %d %d\n", bEnable, u2FrameRate); + if(bEnable) { // enable auto flicker + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.GC2355_HUAQUANAutoFlickerMode = KAL_TRUE; + spin_unlock(&gc2355mipiraw_drv_lock); + } else { + spin_lock(&gc2355mipiraw_drv_lock); + gc2355.GC2355_HUAQUANAutoFlickerMode = KAL_FALSE; + spin_unlock(&gc2355mipiraw_drv_lock); + GC2355_HUAQUANDB("Disable Auto flicker\n"); + } + + return ERROR_NONE; +} + +UINT32 GC2355_HUAQUANSetTestPatternMode(kal_bool bEnable) +{ + GC2355_HUAQUANDB("[GC2355_HUAQUANSetTestPatternMode] Test pattern enable:%d\n", bEnable); + if(bEnable) + { + GC2355_HUAQUAN_write_cmos_sensor(0x8b,0xb2); //bit[4]: 1 enable test pattern, 0 disable test pattern + } + else + { + GC2355_HUAQUAN_write_cmos_sensor(0x8b,0xa2);//bit[4]: 1 enable test pattern, 0 disable test pattern + } + return ERROR_NONE; +} + + +UINT32 GC2355_HUAQUANMIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) { + kal_uint32 pclk; + kal_int16 dummyLine; + kal_uint16 lineLength,frameHeight; + + GC2355_HUAQUANDB("GC2355_HUAQUANMIPISetMaxFramerateByScenario: scenarioId = %d, frame rate = %d\n",scenarioId,frameRate); + switch (scenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + pclk = GC2355_HUAQUANMIPI_PREVIEW_CLK; + lineLength = GC2355_HUAQUAN_PV_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk)/frameRate/lineLength; + dummyLine = frameHeight - GC2355_HUAQUAN_VALID_LINE_NUMS; + gc2355.sensorMode = SENSOR_MODE_PREVIEW; + GC2355_HUAQUAN_SetDummy(0, dummyLine); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + pclk = GC2355_HUAQUANMIPI_VIDEO_CLK; + lineLength = GC2355_HUAQUAN_VIDEO_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk)/frameRate/lineLength; + dummyLine = frameHeight - GC2355_HUAQUAN_VALID_LINE_NUMS; + gc2355.sensorMode = SENSOR_MODE_VIDEO; + GC2355_HUAQUAN_SetDummy(0, dummyLine); + break; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + pclk = GC2355_HUAQUANMIPI_CAPTURE_CLK; + lineLength = GC2355_HUAQUAN_FULL_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk)/frameRate/lineLength; + dummyLine = frameHeight - GC2355_HUAQUAN_VALID_LINE_NUMS; + gc2355.sensorMode = SENSOR_MODE_CAPTURE; + GC2355_HUAQUAN_SetDummy(0, dummyLine); + break; + case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added + break; + case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: + break; + case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added + break; + default: + break; + } + return ERROR_NONE; +} + + +UINT32 GC2355_HUAQUANMIPIGetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate) +{ + + switch (scenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *pframeRate = 300; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + *pframeRate = 300; + break; + case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added + case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: + case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added + *pframeRate = 300; + break; + default: + break; + } + + return ERROR_NONE; +} + + +UINT32 GC2355_HUAQUANFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; + UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; + UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; + UINT32 SensorRegNumber; + UINT32 i; + PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; + + switch (FeatureId) + { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++= GC2355_HUAQUAN_IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16= GC2355_HUAQUAN_IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PERIOD: + *pFeatureReturnPara16++= GC2355_HUAQUAN_FeatureControl_PERIOD_PixelNum; + *pFeatureReturnPara16= GC2355_HUAQUAN_FeatureControl_PERIOD_LineNum; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + switch(GC2355_HUAQUANCurrentScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + *pFeatureReturnPara32 = GC2355_HUAQUANMIPI_PREVIEW_CLK; + *pFeatureParaLen=4; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *pFeatureReturnPara32 = GC2355_HUAQUANMIPI_VIDEO_CLK; + *pFeatureParaLen=4; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + *pFeatureReturnPara32 = GC2355_HUAQUANMIPI_CAPTURE_CLK; + *pFeatureParaLen=4; + break; + default: + *pFeatureReturnPara32 = GC2355_HUAQUANMIPI_CAPTURE_CLK; + *pFeatureParaLen=4; + break; + } + break; + + case SENSOR_FEATURE_SET_ESHUTTER: + GC2355_HUAQUAN_SetShutter(*pFeatureData16); + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + GC2355_HUAQUAN_NightMode((BOOL) *pFeatureData16); + break; + case SENSOR_FEATURE_SET_GAIN: + GC2355_HUAQUAN_SetGain((UINT16) *pFeatureData16); + break; + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + //GC2355_HUAQUAN_isp_master_clock=*pFeatureData32; + break; + case SENSOR_FEATURE_SET_REGISTER: + GC2355_HUAQUAN_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = GC2355_HUAQUAN_read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + SensorRegNumber=FACTORY_END_ADDR; + for (i=0;i=sizeof(NVRAM_SENSOR_DATA_STRUCT)) + { + pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION; + pSensorDefaultData->SensorId=GC2355MIPI_SENSOR_ID_HUAQUAN; + memcpy(pSensorDefaultData->SensorEngReg, GC2355_HUAQUANSensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END); + memcpy(pSensorDefaultData->SensorCCTReg, GC2355_HUAQUANSensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR); + } + else + return FALSE; + *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pSensorConfigData, &GC2355_HUAQUANSensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); + break; + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + GC2355_HUAQUAN_camera_para_to_sensor(); + break; + + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + GC2355_HUAQUAN_sensor_to_camera_para(); + break; + case SENSOR_FEATURE_GET_GROUP_COUNT: + *pFeatureReturnPara32++=GC2355_HUAQUAN_get_sensor_group_count(); + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_GROUP_INFO: + GC2355_HUAQUAN_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount); + *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_ITEM_INFO: + GC2355_HUAQUAN_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo); + *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + + case SENSOR_FEATURE_SET_ITEM_INFO: + GC2355_HUAQUAN_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue); + *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + + case SENSOR_FEATURE_GET_ENG_INFO: + pSensorEngInfo->SensorId = 129; + pSensorEngInfo->SensorType = CMOS_SENSOR; + pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_B; + *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE + // if EEPROM does not exist in camera module. + *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID://cuirui add for MID + *pFeatureReturnPara32=GC2355HUAQUANGetModuleID(); + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_INITIALIZE_AF: + break; + case SENSOR_FEATURE_CONSTANT_AF: + break; + case SENSOR_FEATURE_MOVE_FOCUS_LENS: + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + GC2355_HUAQUANSetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + GC2355_HUAQUANGetSensorID(pFeatureReturnPara32); + break; + case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: + GC2355_HUAQUANSetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1)); + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + GC2355_HUAQUANSetTestPatternMode((BOOL)*pFeatureData16); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: + *pFeatureReturnPara32=GC2355_HUAQUAN_TEST_PATTERN_CHECKSUM; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: + GC2355_HUAQUANMIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1)); + break; + case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: + GC2355_HUAQUANMIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1))); + break; + default: + break; + } + return ERROR_NONE; +} /* GC2355_HUAQUANFeatureControl() */ + + +SENSOR_FUNCTION_STRUCT SensorFuncGC2355_HUAQUAN= +{ + GC2355_HUAQUANOpen, + GC2355_HUAQUANGetInfo, + GC2355_HUAQUANGetResolution, + GC2355_HUAQUANFeatureControl, + GC2355_HUAQUANControl, + GC2355_HUAQUANClose +}; + +UINT32 GC2355_HUAQUAN_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc!=NULL) + *pfFunc=&SensorFuncGC2355_HUAQUAN; + + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Sensor.h new file mode 100644 index 00000000000..1a9e12d5704 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2355mipiraw_huaquan_Sensor.h @@ -0,0 +1,200 @@ +/*******************************************************************************************/ + + +/*******************************************************************************************/ + +/* SENSOR FULL SIZE */ +#ifndef __SENSOR_H +#define __SENSOR_H + + + +typedef enum group_enum { + PRE_GAIN=0, + CMMCLK_CURRENT, + FRAME_RATE_LIMITATION, + REGISTER_EDITOR, + GROUP_TOTAL_NUMS +} FACTORY_GROUP_ENUM; + + +#define ENGINEER_START_ADDR 10 +#define FACTORY_START_ADDR 0 + +typedef enum engineer_index +{ + CMMCLK_CURRENT_INDEX=ENGINEER_START_ADDR, + ENGINEER_END +} FACTORY_ENGINEER_INDEX; + +typedef enum register_index +{ + SENSOR_BASEGAIN=FACTORY_START_ADDR, + PRE_GAIN_R_INDEX, + PRE_GAIN_Gr_INDEX, + PRE_GAIN_Gb_INDEX, + PRE_GAIN_B_INDEX, + FACTORY_END_ADDR +} FACTORY_REGISTER_INDEX; + + +typedef struct +{ + SENSOR_REG_STRUCT Reg[ENGINEER_END]; + SENSOR_REG_STRUCT CCT[FACTORY_END_ADDR]; +} SENSOR_DATA_STRUCT, *PSENSOR_DATA_STRUCT; + +typedef enum { + SENSOR_MODE_INIT = 0, + SENSOR_MODE_PREVIEW, + SENSOR_MODE_VIDEO, + SENSOR_MODE_CAPTURE +} GC2355_HUAQUAN_SENSOR_MODE; + + +typedef struct +{ + kal_uint32 DummyPixels; + kal_uint32 DummyLines; + + kal_uint32 pvShutter; + kal_uint32 pvGain; + kal_uint32 Gain; + + kal_uint32 pvPclk; // x10 480 for 48MHZ + kal_uint32 videoPclk; + kal_uint32 capPclk; // x10 + + kal_uint32 shutter; + kal_uint32 maxExposureLines; + + kal_uint16 sensorGlobalGain;//sensor gain read from 0x350a 0x350b; + kal_uint16 ispBaseGain;//64 + kal_uint16 realGain;//ispBaseGain as 1x + + kal_int16 imgMirror; + + GC2355_HUAQUAN_SENSOR_MODE sensorMode; + + kal_bool GC2355_HUAQUANAutoFlickerMode; + kal_bool GC2355_HUAQUANVideoMode; + +}GC2355_HUAQUAN_PARA_STRUCT,*PGC2355_HUAQUAN_PARA_STRUCT; + + #define GC2355_HUAQUAN_MIPI_2_Lane + #define GC2355_HUAQUAN_MIPI_30FPS + + #define GC2355_HUAQUAN_IMAGE_SENSOR_FULL_WIDTH (1600) + #define GC2355_HUAQUAN_IMAGE_SENSOR_FULL_HEIGHT (1200) + + /* SENSOR PV SIZE */ + #define GC2355_HUAQUAN_IMAGE_SENSOR_PV_WIDTH (1600) + #define GC2355_HUAQUAN_IMAGE_SENSOR_PV_HEIGHT (1200) + + #define GC2355_HUAQUAN_IMAGE_SENSOR_VIDEO_WIDTH (1600) + #define GC2355_HUAQUAN_IMAGE_SENSOR_VIDEO_HEIGHT (1200) + + + /* SENSOR SCALER FACTOR */ + #define GC2355_HUAQUAN_PV_SCALER_FACTOR 3 + #define GC2355_HUAQUAN_FULL_SCALER_FACTOR 1 + + /* SENSOR START/EDE POSITION */ + #define GC2355_HUAQUAN_FULL_X_START (0) + #define GC2355_HUAQUAN_FULL_Y_START (0) + + + #define GC2355_HUAQUAN_PV_X_START 0 + #define GC2355_HUAQUAN_PV_Y_START 0 + + + #define GC2355_HUAQUAN_VIDEO_X_START 0 + #define GC2355_HUAQUAN_VIDEO_Y_START 0 + + + #define GC2355_HUAQUAN_MAX_ANALOG_GAIN (6) + #define GC2355_HUAQUAN_MIN_ANALOG_GAIN (1) + #define GC2355_HUAQUAN_ANALOG_GAIN_1X (0x0020) +#ifdef GC2355_HUAQUAN_MIPI_30FPS + #define GC2355_HUAQUANMIPI_CAPTURE_CLK (42000000) + #define GC2355_HUAQUANMIPI_PREVIEW_CLK (42000000) + #define GC2355_HUAQUANMIPI_VIDEO_CLK (42000000) +#else //20fps + #define GC2355_HUAQUANMIPI_CAPTURE_CLK (30000000) + #define GC2355_HUAQUANMIPI_PREVIEW_CLK (30000000) + #define GC2355_HUAQUANMIPI_VIDEO_CLK (30000000) +#endif + + /* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ + + +#define GC2355_HUAQUAN_VALID_IXEL_NUMS 800 +#define GC2355_HUAQUAN_VALID_LINE_NUMS 1200 +#ifdef GC2355_HUAQUAN_MIPI_30FPS +#define GC2355_HUAQUAN_DEFAULT_DUMMY_PIXEL_NUMS 0x11c //244 +#define GC2355_HUAQUAN_DEFAULT_DUMMY_LINE_NUMS 0x0e //64 +#define GC2355_HUAQUAN_VIDEO_PERIOD_PIXEL_NUMS (1120) +#define GC2355_HUAQUAN_VIDEO_PERIOD_LINE_NUMS (1246) + +#define GC2355_HUAQUAN_PV_PERIOD_PIXEL_NUMS (1120) +#define GC2355_HUAQUAN_PV_PERIOD_LINE_NUMS (1246) + +#define GC2355_HUAQUAN_FULL_PERIOD_PIXEL_NUMS (1120) +#define GC2355_HUAQUAN_FULL_PERIOD_LINE_NUMS (1246) + +#else //20fps +#define GC2355_HUAQUAN_DEFAULT_DUMMY_PIXEL_NUMS 285 //244 +#define GC2355_HUAQUAN_DEFAULT_DUMMY_LINE_NUMS 123 //64 +#define GC2355_HUAQUAN_VIDEO_PERIOD_PIXEL_NUMS (1107) +#define GC2355_HUAQUAN_VIDEO_PERIOD_LINE_NUMS (1355) + +#define GC2355_HUAQUAN_PV_PERIOD_PIXEL_NUMS (1107) +#define GC2355_HUAQUAN_PV_PERIOD_LINE_NUMS (1355) + +#define GC2355_HUAQUAN_FULL_PERIOD_PIXEL_NUMS (1107) +#define GC2355_HUAQUAN_FULL_PERIOD_LINE_NUMS (1355) + +#endif + + + +#define GC2355_HUAQUAN_MIN_LINE_LENGTH 0x1100 +#define GC2355_HUAQUAN_MIN_FRAME_LENGTH 0xc00 + +#define GC2355_HUAQUAN_MAX_LINE_LENGTH 0xCCCC +#define GC2355_HUAQUAN_MAX_FRAME_LENGTH 0xFFFF + + /* DUMMY NEEDS TO BE INSERTED */ + /* SETUP TIME NEED TO BE INSERTED */ + +#define GC2355_HUAQUANMIPI_WRITE_ID (0x78) +#define GC2355_HUAQUANMIPI_READ_ID (0x79) + +// SENSOR CHIP VERSION + +//#define GC2355_HUAQUANMIPI_SENSOR_ID GC2355_HUAQUAN_SENSOR_ID + +#define GC2355_HUAQUANMIPI_PAGE_SETTING_REG (0xFF) + +//s_add for porting +//s_add for porting +//s_add for porting + +//export functions +UINT32 GC2355_HUAQUANMIPIOpen(void); +UINT32 GC2355_HUAQUANMIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); +UINT32 GC2355_HUAQUANMIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2355_HUAQUANMIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2355_HUAQUANMIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); +UINT32 GC2355_HUAQUANMIPIClose(void); + +//#define Sleep(ms) mdelay(ms) +//#define RETAILMSG(x,...) +//#define TEXT + +//e_add for porting +//e_add for porting +//e_add for porting + +#endif /* __SENSOR_H */ + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_CameraCustomized.h new file mode 100644 index 00000000000..78c5896e533 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_CameraCustomized.h @@ -0,0 +1,61 @@ +/*******************************************************************************************/ + +/*******************************************************************************************/ + +#ifndef __CAMERA_CUSTOMIZED_H +#define __CAMERA_CUSTOMIZED_H + +/*the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270*/ +#define MAIN_SENSOR_ORIENTATION_ANGLE 90 +#define SUB_SENSOR_ORIENTATION_ANGLE 0 /*do not care if the sub sensor does not exist */ + +/*First, we think you hold the cell phone vertical.*/ +/*Second, we suppose the direction of upward is 0*/ +/*Third, it is 90, 180, 270 in clockwise*/ +/*here we define the main sensor and sub sensor angles to deal with the jpeg orientation*/ +#define MAIN_SENSOR_TO_PHONE_ANGLE 90 +#define SUB_SENSOR_TO_PHONE_ANGLE 0 + +#define CAM_SIZE_QVGA_WIDTH 320 +#define CAM_SIZE_QVGA_HEIGHT 240 +#define CAM_SIZE_VGA_WIDTH 640 +#define CAM_SIZE_VGA_HEIGHT 480 +#define CAM_SIZE_05M_WIDTH 800 +#define CAM_SIZE_05M_HEIGHT 600 +#define CAM_SIZE_1M_WIDTH 1280 +#define CAM_SIZE_1M_HEIGHT 960 +#define CAM_SIZE_2M_WIDTH 1600 +#define CAM_SIZE_2M_HEIGHT 1200 +#define CAM_SIZE_3M_WIDTH 2048 +#define CAM_SIZE_3M_HEIGHT 1536 +#define CAM_SIZE_5M_WIDTH 2592 +#define CAM_SIZE_5M_HEIGHT 1944 + +/*for main sensor*/ +#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 +#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 +#define MAIN_NUM_OF_STILL_RESOLUTION 7 +#define MAIN_VIDEO_RESOLUTION_PROFILE {{176, 144}, {320, 240}, {640, 480}, {720, 480} } +#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232, 174}, {320, 240}, {240, 320} } +#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH, CAM_SIZE_QVGA_HEIGHT}, \ + {CAM_SIZE_VGA_WIDTH, CAM_SIZE_VGA_HEIGHT}, \ + {CAM_SIZE_05M_WIDTH, CAM_SIZE_05M_HEIGHT}, \ + {CAM_SIZE_1M_WIDTH, CAM_SIZE_1M_HEIGHT}, \ + {CAM_SIZE_2M_WIDTH, CAM_SIZE_2M_HEIGHT}, \ + {CAM_SIZE_3M_WIDTH, CAM_SIZE_3M_HEIGHT}, \ + {CAM_SIZE_5M_WIDTH, CAM_SIZE_5M_HEIGHT} } + +/*if sub sensor does not exist, set all the parameters as 0*/ +#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 +#define SUB_NUM_OF_VIDEO_RESOLUTION 0 +#define SUB_NUM_OF_STILL_RESOLUTION 0 +#define SUB_VIDEO_RESOLUTION_PROFILE {{0, 0} } +#define SUB_PREVIEW_RESOLUTION_PROFILE {{0, 0} } +#define SUB_STILL_RESOLUTION_PROFILE {{0, 0} } + +/*#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION)*/ +/*#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION)*/ +/*#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION)*/ + +#define NUM_OF_VIDEO_STREAM_BUFF 8 /*Maximun is 8 */ +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Camera_Sensor_para.h new file mode 100644 index 00000000000..7a69dde8ab3 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Camera_Sensor_para.h @@ -0,0 +1,58 @@ +/*******************************************************************************************/ + +/*******************************************************************************************/ + +/* SENSOR FULL SIZE */ +#ifndef __CAMERA_SENSOR_PARA_H +#define __CAMERA_SENSOR_PARA_H + +#define CAMERA_SENSOR_REG_DEFAULT_VALUE \ + /* ARRAY: SENSOR.reg[11] */\ + {\ + /* STRUCT: SENSOR.reg[0] */\ + {\ + /* SENSOR.reg[0].addr */ 0x00000304, /* SENSOR.reg[0].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[1] */\ + {\ + /* SENSOR.reg[1].addr */ 0x00000305, /* SENSOR.reg[1].para */ 0x0000000D\ + },\ + /* STRUCT: SENSOR.reg[2] */\ + {\ + /* SENSOR.reg[2].addr */ 0x00000306, /* SENSOR.reg[2].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[3] */\ + {\ + /* SENSOR.reg[3].addr */ 0x00000307, /* SENSOR.reg[3].para */ 0x000000C0\ + },\ + /* STRUCT: SENSOR.reg[4] */\ + {\ + /* SENSOR.reg[4].addr */ 0x00000300, /* SENSOR.reg[4].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[5] */\ + {\ + /* SENSOR.reg[5].addr */ 0x00000301, /* SENSOR.reg[5].para */ 0x00000004\ + },\ + /* STRUCT: SENSOR.reg[6] */\ + {\ + /* SENSOR.reg[6].addr */ 0x0000030A, /* SENSOR.reg[6].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[7] */\ + {\ + /* SENSOR.reg[7].addr */ 0x0000030B, /* SENSOR.reg[7].para */ 0x00000002\ + },\ + /* STRUCT: SENSOR.reg[8] */\ + {\ + /* SENSOR.reg[8].addr */ 0x00000308, /* SENSOR.reg[8].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[9] */\ + {\ + /* SENSOR.reg[9].addr */ 0x00000309, /* SENSOR.reg[9].para */ 0x00000008\ + },\ + /* STRUCT: SENSOR.reg[10] */\ + {\ + /* SENSOR.reg[10].addr */ 0xFFFFFFFF, /* SENSOR.reg[10].para */ 0x00000001\ + } } + +#define CAMERA_SENSOR_CCT_DEFAULT_VALUE {{0xFFFFFFFF, 0x08}, {0x0205, 0x20}, {0x020e, 0x01}, {0x0210, 0x01}, {0x0212, 0x01} } +#endif /* __CAMERA_SENSOR_PARA_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Sensor.c new file mode 100644 index 00000000000..4a93626ffaa --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Sensor.c @@ -0,0 +1,1178 @@ +/*******************************************************************************************/ + +/*******************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" + +#include "gc2356mipiraw_Sensor.h" +#include "gc2356mipiraw_Camera_Sensor_para.h" +#include "gc2356mipiraw_CameraCustomized.h" +static DEFINE_SPINLOCK(gc2356mipiraw_drv_lock); + +#define GC2356_DEBUG +/*#define GC2356_DEBUG_SOFIA*/ +#define GC2356_TEST_PATTERN_CHECKSUM (0x9d1c9dad) /*(0x5593c632)*/ + +#ifdef GC2356_DEBUG +#define GC2356DB(fmt, arg...) pr_debug("[GC2356mipiraw][%s] " fmt, __func__, ##arg) +#else +#define GC2356DB(fmt, arg...) +#endif + +#ifdef GC2356_DEBUG_SOFIA +#define GC2356DBSOFIA(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG, "[GC2356Raw] ", fmt, ##arg) +#else +#define GC2356DBSOFIA(fmt, arg...) +#endif + +#define mDELAY(ms) mdelay(ms) + +kal_uint32 GC2356_FeatureControl_PERIOD_PixelNum = GC2356_PV_PERIOD_PIXEL_NUMS; +kal_uint32 GC2356_FeatureControl_PERIOD_LineNum = GC2356_PV_PERIOD_LINE_NUMS; +UINT16 gc2356VIDEO_MODE_TARGET_FPS = 30; +MSDK_SENSOR_CONFIG_STRUCT GC2356SensorConfigData; +MSDK_SCENARIO_ID_ENUM GC2356CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; + +/*FIXME: old factors and DIDNOT use now. s*/ +SENSOR_REG_STRUCT GC2356SensorCCT[] = CAMERA_SENSOR_CCT_DEFAULT_VALUE; +SENSOR_REG_STRUCT GC2356SensorReg[ENGINEER_END] = + CAMERA_SENSOR_REG_DEFAULT_VALUE; +/*FIXME: old factors and DIDNOT use now. e*/ + +static GC2356_PARA_STRUCT gc2356; + +#define Sleep(ms) mdelay(ms) +#define GC2356_ORIENTATION IMAGE_NORMAL /*IMAGE_NORMAL*/ + +extern int iReadRegI2C(u8 *a_pSendData, u16 a_sizeSendData, u8 *a_pRecvData, + u16 a_sizeRecvData, u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData, u16 a_sizeSendData, u16 i2cId); + +/************************************************************************* +* FUNCTION +* GC2356MIPI_write_cmos_sensor +* +* DESCRIPTION +* This function wirte data to CMOS sensor through I2C +* +* PARAMETERS +* addr: the 16bit address of register +* para: the 8bit value of register +* +* RETURNS +* None +* +* LOCAL AFFECTED +* +*************************************************************************/ +static void GC2356_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) +{ + kal_uint8 out_buff[2]; + + out_buff[0] = addr; + out_buff[1] = para; + + iWriteRegI2C((u8 *) out_buff, 2, GC2356MIPI_WRITE_ID); +} + +/************************************************************************* +* FUNCTION +* GC2035_read_cmos_sensor +* +* DESCRIPTION +* This function read data from CMOS sensor through I2C. +* +* PARAMETERS +* addr: the 16bit address of register +* +* RETURNS +* 8bit data read through I2C +* +* LOCAL AFFECTED +* +*************************************************************************/ +static kal_uint8 GC2356_read_cmos_sensor(kal_uint8 addr) +{ + kal_uint8 in_buff[1] = { 0xFF }; + kal_uint8 out_buff[1]; + + out_buff[0] = addr; + + if (0 != + iReadRegI2C((u8 *) out_buff, 1, (u8 *) in_buff, 1, + GC2356MIPI_WRITE_ID)) { + GC2356DB("ERROR: GC2356MIPI_read_cmos_sensor \n"); + } + return in_buff[0]; +} + +void GC2356_SetGain(UINT16 iGain) +{ + +#define ANALOG_GAIN_1 64 /*1.00x*/ +#define ANALOG_GAIN_2 88 /*1.37x*/ +#define ANALOG_GAIN_3 121 /*1.89x*/ +#define ANALOG_GAIN_4 168 /*2.59x*/ +#define ANALOG_GAIN_5 239 /*3.70x*/ +#define ANALOG_GAIN_6 330 /*5.06x*/ +#define ANALOG_GAIN_7 470 /*7.15x*/ + + kal_uint16 iReg, temp, temp1; + + GC2356DB("GC2356MIPI_SetGain iGain = %d \n", iGain); + + GC2356_write_cmos_sensor(0xb1, 0x01); + GC2356_write_cmos_sensor(0xb2, 0x00); + + iReg = iGain; + /*digital gain*/ + /*GC2356MIPI_write_cmos_sensor(0xb1, iReg>>6);*/ + /*GC2356MIPI_write_cmos_sensor(0xb2, (iReg<<2)&0xfc);*/ + + if (iReg < 0x40) + iReg = 0x40; + if (iReg > 512) + iReg = 512; + + if ((ANALOG_GAIN_1 <= iReg) && (iReg < ANALOG_GAIN_2)) { + /*analog gain*/ + GC2356_write_cmos_sensor(0xb6, 0x00); + temp = iReg; + GC2356_write_cmos_sensor(0xb1, temp >> 6); + GC2356_write_cmos_sensor(0xb2, (temp << 2) & 0xfc); + GC2356DB("GC2356 analogic gain 1x , GC2356 add pregain = %d\n", + temp); + + } else if ((ANALOG_GAIN_2 <= iReg) && (iReg < ANALOG_GAIN_3)) { + /*analog gain*/ + GC2356_write_cmos_sensor(0xb6, 0x01); + temp = 64 * iReg / ANALOG_GAIN_2; + GC2356_write_cmos_sensor(0xb1, temp >> 6); + GC2356_write_cmos_sensor(0xb2, (temp << 2) & 0xfc); + GC2356DB + ("GC2356 analogic gain 1.45x , GC2356 add pregain = %d\n", + temp); + + } + + else if ((ANALOG_GAIN_3 <= iReg) && (iReg < ANALOG_GAIN_4)) { + /*analog gain*/ + GC2356_write_cmos_sensor(0xb6, 0x02); + temp = 64 * iReg / ANALOG_GAIN_3; + GC2356_write_cmos_sensor(0xb1, temp >> 6); + GC2356_write_cmos_sensor(0xb2, (temp << 2) & 0xfc); + GC2356DB + ("GC2356 analogic gain 2.02x , GC2356 add pregain = %d\n", + temp); + } +/*else if(ANALOG_GAIN_4<= iReg)*/ + else { + /*analog gain*/ + GC2356_write_cmos_sensor(0xb6, 0x03); + temp = 64 * iReg / ANALOG_GAIN_4; + GC2356_write_cmos_sensor(0xb1, temp >> 6); + GC2356_write_cmos_sensor(0xb2, (temp << 2) & 0xfc); + + GC2356DB("GC2356 analogic gain 2.8x, temp = %d\n", temp); + } + +} /*GC2356_SetGain_SetGain*/ + +void GC2356_camera_para_to_sensor(void) +{ +} + +void GC2356_sensor_to_camera_para(void) +{ +} + +kal_int32 GC2356_get_sensor_group_count(void) +{ + return GROUP_TOTAL_NUMS; +} + +void GC2356_get_sensor_group_info(kal_uint16 group_idx, + kal_int8 *group_name_ptr, + kal_int32 *item_count_ptr) +{ +} + +void GC2356_get_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, + MSDK_SENSOR_ITEM_INFO_STRUCT *info_ptr) +{ +} + +kal_bool GC2356_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, + kal_int32 ItemValue) +{ + return KAL_TRUE; +} + +static void GC2356_SetDummy(const kal_uint32 iPixels, const kal_uint32 iLines) +{ + kal_uint32 hb = 0; + kal_uint32 vb = 0; + + if (SENSOR_MODE_PREVIEW == gc2356.sensorMode) { /*SXGA size output*/ + hb = GC2356_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2356_DEFAULT_DUMMY_LINE_NUMS + iLines; + } else if (SENSOR_MODE_VIDEO == gc2356.sensorMode) { + hb = GC2356_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2356_DEFAULT_DUMMY_LINE_NUMS + iLines; + } else { + hb = GC2356_DEFAULT_DUMMY_PIXEL_NUMS + iPixels; + vb = GC2356_DEFAULT_DUMMY_LINE_NUMS + iLines; + } + + /*if(gc2356.maxExposureLines > frame_length -4 )*/ + /*return;*/ + + /*ASSERT(line_length < GC2356_MAX_LINE_LENGTH); 0xCCCC*/ + /*ASSERT(frame_length < GC2356_MAX_FRAME_LENGTH) 0xFFFF*/ + + /*Set HB*/ + GC2356_write_cmos_sensor(0x05, (hb >> 8) & 0xFF); + GC2356_write_cmos_sensor(0x06, hb & 0xFF); + + /*Set VB*/ + GC2356_write_cmos_sensor(0x07, (vb >> 8) & 0xFF); + GC2356_write_cmos_sensor(0x08, vb & 0xFF); + GC2356DB("GC2356_SetDummy framelength=%d\n", + vb + GC2356_VALID_LINE_NUMS); + +} /*GC2356_SetDummy*/ + +static void GC2356_Sensor_Init(void) +{ + /* SYS */ + GC2356_write_cmos_sensor(0xfe, 0x80); + GC2356_write_cmos_sensor(0xfe, 0x80); + GC2356_write_cmos_sensor(0xfe, 0x80); + GC2356_write_cmos_sensor(0xf2, 0x00); /*sync_pad_io_ebi*/ + GC2356_write_cmos_sensor(0xf6, 0x00); /*up down*/ + GC2356_write_cmos_sensor(0xf7, 0x31); /*19 pll enable*/ + GC2356_write_cmos_sensor(0xf8, 0x06); /*Pll mode 2 86--reduce frequency in dark*/ + GC2356_write_cmos_sensor(0xf9, 0x0e); /*de[0] pll enable*/ + GC2356_write_cmos_sensor(0xfa, 0x00); /*div*/ + GC2356_write_cmos_sensor(0xfc, 0x06); /*4e*/ + /*GC2356_write_cmos_sensor(0xfd,0x00);*/ + GC2356_write_cmos_sensor(0xfe, 0x00); + + /* ANALOG & CISCTL */ + /*AEC&frame length*/ + GC2356_write_cmos_sensor(0x03, 0x04); /*0a -> 04*/ + GC2356_write_cmos_sensor(0x04, 0xb0); /*41 -> b0*/ + GC2356_write_cmos_sensor(0x05, 0x01); /*max 30fps 03*/ + GC2356_write_cmos_sensor(0x06, 0x1c); + GC2356_write_cmos_sensor(0x07, 0x00); + GC2356_write_cmos_sensor(0x08, 0x0e); /*22*/ + GC2356_write_cmos_sensor(0x0a, 0x00); /*row start*/ + GC2356_write_cmos_sensor(0x0c, 0x04); /*0c col start*/ + GC2356_write_cmos_sensor(0x0d, 0x04); + GC2356_write_cmos_sensor(0x0e, 0xc0); /*c0*/ + GC2356_write_cmos_sensor(0x0f, 0x06); + GC2356_write_cmos_sensor(0x10, 0x50); /*Window setting 1616x1216*/ + /*GC2356_write_cmos_sensor(0x11,0x00); + GC2356_write_cmos_sensor(0x12,0x18); + GC2356_write_cmos_sensor(0x13,0x11); + GC2356_write_cmos_sensor(0x14,0x01); + GC2356_write_cmos_sensor(0x15,0x00); + GC2356_write_cmos_sensor(0x16,0xc1); */ + GC2356_write_cmos_sensor(0x17, 0x17); /*14*/ + GC2356_write_cmos_sensor(0x19, 0x0b); + GC2356_write_cmos_sensor(0x1b, 0x49); /*48*/ + GC2356_write_cmos_sensor(0x1c, 0x12); + GC2356_write_cmos_sensor(0x1d, 0x10); /*double reset*/ + GC2356_write_cmos_sensor(0x1e, 0xbc); /*a8 col_r/rowclk_mode/rsthigh_en FPN*/ + GC2356_write_cmos_sensor(0x1f, 0xc8); /*c8 rsgl_s_mode/vpix_s_mode µÆ¹ÜºáÌõÎÆ*/ + GC2356_write_cmos_sensor(0x20, 0x71); + GC2356_write_cmos_sensor(0x21, 0x20); /*rsg µÆ¹ÜºáÌõÎÆ 40*/ + GC2356_write_cmos_sensor(0x22, 0xa0); /*e0 80 f0*/ + GC2356_write_cmos_sensor(0x23, 0x51); /*51*/ + GC2356_write_cmos_sensor(0x24, 0x19); /*0b 55*/ + /*GC2356_write_cmos_sensor(0x25,0x10);*/ /*10*/ + /*GC2356_write_cmos_sensor(0x26,0x00);*/ + GC2356_write_cmos_sensor(0x27, 0x20); + GC2356_write_cmos_sensor(0x28, 0x00); /*10*/ + /*GC2356_write_cmos_sensor(0x29,0x00);*/ + /*GC2356_write_cmos_sensor(0x2a,0x00);*/ + GC2356_write_cmos_sensor(0x2b, 0x81); /*00 sf_s_mode FPN*/ + GC2356_write_cmos_sensor(0x2c, 0x38); /*50 5c ispg FPN*/ + /*GC2356_write_cmos_sensor(0x2d,0x15);*/ + GC2356_write_cmos_sensor(0x2e, 0x16); /*05 eq width*/ + GC2356_write_cmos_sensor(0x2f, 0x14); /*[3:0]tx_width д0ÄܸÄÂéµã*/ + GC2356_write_cmos_sensor(0x30, 0x00); + GC2356_write_cmos_sensor(0x31, 0x01); + GC2356_write_cmos_sensor(0x32, 0x02); + GC2356_write_cmos_sensor(0x33, 0x03); + GC2356_write_cmos_sensor(0x34, 0x07); + GC2356_write_cmos_sensor(0x35, 0x0b); + GC2356_write_cmos_sensor(0x36, 0x0f); + + /* gain */ + GC2356_write_cmos_sensor(0xb0, 0x50); + GC2356_write_cmos_sensor(0xb1, 0x01); + GC2356_write_cmos_sensor(0xb2, 0x00); + GC2356_write_cmos_sensor(0xb3, 0x40); + GC2356_write_cmos_sensor(0xb4, 0x40); + GC2356_write_cmos_sensor(0xb5, 0x40); + GC2356_write_cmos_sensor(0xb6, 0x00); + + /* crop */ + GC2356_write_cmos_sensor(0x92, 0x02); + GC2356_write_cmos_sensor(0x95, 0x04); + GC2356_write_cmos_sensor(0x96, 0xb0); + GC2356_write_cmos_sensor(0x97, 0x06); + GC2356_write_cmos_sensor(0x98, 0x40); /*out window set 1600x1200*/ + + /* BLK */ + GC2356_write_cmos_sensor(0x18, 0x02); /*1a-lily*/ + GC2356_write_cmos_sensor(0x1a, 0x01); /*09-lily 01*/ + GC2356_write_cmos_sensor(0x40, 0x42); /*43-lily*/ + GC2356_write_cmos_sensor(0x4e, 0x3c); /*BLK select*/ + GC2356_write_cmos_sensor(0x4f, 0x00); + GC2356_write_cmos_sensor(0x5e, 0x00); /*18-lily offset ratio*/ + GC2356_write_cmos_sensor(0x66, 0x20); /*20-lily dark ratio*/ + GC2356_write_cmos_sensor(0x6a, 0x00); /*39*/ + GC2356_write_cmos_sensor(0x6b, 0x00); + GC2356_write_cmos_sensor(0x6c, 0x00); + GC2356_write_cmos_sensor(0x6d, 0x00); + GC2356_write_cmos_sensor(0x6e, 0x00); + GC2356_write_cmos_sensor(0x6f, 0x00); + GC2356_write_cmos_sensor(0x70, 0x00); + GC2356_write_cmos_sensor(0x71, 0x00); /*manual offset*/ + + /* Dark sun */ + GC2356_write_cmos_sensor(0x87, 0x03); + GC2356_write_cmos_sensor(0xe0, 0xe7); /*dark sun en/extend mode*/ + GC2356_write_cmos_sensor(0xe2, 0x03); + GC2356_write_cmos_sensor(0xe3, 0xc0); /*clamp*/ + + /*MIPI*/ GC2356_write_cmos_sensor(0xfe, 0x03); + GC2356_write_cmos_sensor(0x01, 0x87); + GC2356_write_cmos_sensor(0x02, 0x11); + GC2356_write_cmos_sensor(0x03, 0x91); + GC2356_write_cmos_sensor(0x04, 0x01); + GC2356_write_cmos_sensor(0x05, 0x00); + GC2356_write_cmos_sensor(0x06, 0xa2); + GC2356_write_cmos_sensor(0x10, 0x91); + GC2356_write_cmos_sensor(0x11, 0x2b); + GC2356_write_cmos_sensor(0x15, 0x60); + GC2356_write_cmos_sensor(0x12, 0xd0); + GC2356_write_cmos_sensor(0x13, 0x07); + GC2356_write_cmos_sensor(0x21, 0x10); + GC2356_write_cmos_sensor(0x22, 0x03); + GC2356_write_cmos_sensor(0x23, 0x20); + GC2356_write_cmos_sensor(0x24, 0x02); + GC2356_write_cmos_sensor(0x25, 0x10); + GC2356_write_cmos_sensor(0x26, 0x08); + GC2356_write_cmos_sensor(0x29, 0x02); + GC2356_write_cmos_sensor(0x2a, 0x0a); + GC2356_write_cmos_sensor(0x2b, 0x08); + GC2356_write_cmos_sensor(0x40, 0x00); + GC2356_write_cmos_sensor(0x41, 0x00); + GC2356_write_cmos_sensor(0x42, 0x40); + GC2356_write_cmos_sensor(0x43, 0x06); + GC2356_write_cmos_sensor(0xfe, 0x00); + +} /* GC2356_Sensor_Init */ + +UINT32 GC2356Open(void) +{ + volatile signed int i; + kal_uint16 sensor_id = 0; + GC2356DB("GC2356Open enter :\n "); + sensor_id = + ((GC2356_read_cmos_sensor(0xf0) << 8) | + GC2356_read_cmos_sensor(0xf1)); + GC2356DB("GC2356MIPIGetSensorID:%x \n", sensor_id); + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.sensorMode = SENSOR_MODE_INIT; + gc2356.GC2356AutoFlickerMode = KAL_FALSE; + gc2356.GC2356VideoMode = KAL_FALSE; + gc2356.shutter = 0xff; + gc2356.Gain = 64; + spin_unlock(&gc2356mipiraw_drv_lock); + GC2356_Sensor_Init(); + + GC2356DB("GC2356Open exit :\n "); + + return ERROR_NONE; +} + +extern IMM_auxadc_GetOneChannelValue_Cali(int Channel, int *voltage); +UINT32 GC2356GetSensorID(UINT32 *sensorID) +{ + int retry = 1; + int adc_val = 0; + + GC2356DB("GC2356GetSensorID enter :\n "); + + /*check if sensor ID correct*/ + *sensorID = + ((GC2356_read_cmos_sensor(0xf0) << 8) | + GC2356_read_cmos_sensor(0xf1)); + IMM_auxadc_GetOneChannelValue_Cali(12, &adc_val); + if ((*sensorID == GC2355MIPI_SENSOR_ID) && (adc_val > 100000)) { /*0.1v = 100000uv */ + *sensorID = GC2356MIPI_SENSOR_ID; + } + GC2356DB("[%s,%d]: adc_val = %d \n", __FUNCTION__, __LINE__, adc_val); + GC2356DB("GC2356MIPIGetSensorID:%x \n", *sensorID); + + if (*sensorID != GC2356MIPI_SENSOR_ID) { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + return ERROR_NONE; +} + +void GC2356_SetShutter(kal_uint32 iShutter) +{ + /*kal_uint8 i=0;*/ + if (MSDK_SCENARIO_ID_CAMERA_ZSD == GC2356CurrentScenarioId) { + /*GC2356DB("always UPDATE SHUTTER when gc2356.sensorMode == SENSOR_MODE_CAPTURE\n");*/ + } else { + if (gc2356.sensorMode == SENSOR_MODE_CAPTURE) { + /*GC2356DB("capture!!DONT UPDATE SHUTTER!!\n");*/ + /*return;*/ + } + } + if (gc2356.shutter == iShutter) { + /*return;*/ + } + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.shutter = iShutter; + + spin_unlock(&gc2356mipiraw_drv_lock); + if (gc2356.shutter > 16383) + gc2356.shutter = 16383; + if (gc2356.shutter < 12) + gc2356.shutter = 12; + GC2356_write_cmos_sensor(0x03, (gc2356.shutter >> 8) & 0x3F); + GC2356_write_cmos_sensor(0x04, gc2356.shutter & 0xFF); + + GC2356DB("GC2356_SetShutter:%x \n", iShutter); + + /*GC2356DB("GC2356_SetShutter 0x03=%x, 0x04=%x \n",GC2356_read_cmos_sensor(0x03),GC2356_read_cmos_sensor(0x04));*/ + return; +} /* GC2356_SetShutter */ + +UINT32 GC2356_read_shutter(void) +{ + + kal_uint16 temp_reg1, temp_reg2; + UINT32 shutter = 0; + temp_reg1 = GC2356_read_cmos_sensor(0x03); /*AEC[b19~b16]*/ + temp_reg2 = GC2356_read_cmos_sensor(0x04); /*AEC[b15~b8]*/ + shutter = ((temp_reg1 << 8) | (temp_reg2)); + + return shutter; +} + +void GC2356_NightMode(kal_bool bEnable) +{ +} + +UINT32 GC2356Close(void) +{ + return ERROR_NONE; +} + +void GC2356SetFlipMirror(kal_int32 imgMirror) +{ + kal_int16 mirror = 0, flip = 0; + + switch (imgMirror) { + case IMAGE_NORMAL: /*IMAGE_NORMAL:*/ + GC2356_write_cmos_sensor(0x17, 0x14); /*bit[1][0]*/ + GC2356_write_cmos_sensor(0x92, 0x03); + GC2356_write_cmos_sensor(0x94, 0x0b); + break; + case IMAGE_H_MIRROR: + GC2356_write_cmos_sensor(0x17, 0x15); + break; + case IMAGE_V_MIRROR: + GC2356_write_cmos_sensor(0x17, 0x16); + break; + case IMAGE_HV_MIRROR: + GC2356_write_cmos_sensor(0x17, 0x17); + break; + } +} + +UINT32 GC2356Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + GC2356DB("GC2356Preview enter:"); + + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.sensorMode = SENSOR_MODE_PREVIEW; /*Need set preview setting after capture mode*/ + gc2356.DummyPixels = 0; /*define dummy pixels and lines*/ + gc2356.DummyLines = 0; + GC2356_FeatureControl_PERIOD_PixelNum = + GC2356_PV_PERIOD_PIXEL_NUMS + gc2356.DummyPixels; + GC2356_FeatureControl_PERIOD_LineNum = + GC2356_PV_PERIOD_LINE_NUMS + gc2356.DummyLines; + spin_unlock(&gc2356mipiraw_drv_lock); + + /*GC2356_write_shutter(gc2356.shutter);*/ + /*write_GC2356_gain(gc2356.pvGain);*/ + /*set mirror & flip*/ + /*GC2356DB("[GC2356Preview] mirror&flip: %d \n",sensor_config_data->SensorImageMirror);*/ + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.imgMirror = sensor_config_data->SensorImageMirror; + spin_unlock(&gc2356mipiraw_drv_lock); + /*if(SENSOR_MODE_PREVIEW==gc2356.sensorMode ) return ERROR_NONE;*/ + + GC2356DB("GC2356Preview mirror:%d\n", + sensor_config_data->SensorImageMirror); + GC2356SetFlipMirror(GC2356_ORIENTATION); + GC2356_SetDummy(gc2356.DummyPixels, gc2356.DummyLines); + GC2356DB("GC2356Preview exit: \n"); + mdelay(100); + return ERROR_NONE; +} /* GC2356Preview() */ + +UINT32 GC2356Video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + GC2356DB("GC2356Video enter:"); + if (gc2356.sensorMode == SENSOR_MODE_VIDEO) { + } else + /*GC2356VideoSetting();*/ + + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.sensorMode = SENSOR_MODE_VIDEO; + GC2356_FeatureControl_PERIOD_PixelNum = + GC2356_VIDEO_PERIOD_PIXEL_NUMS + gc2356.DummyPixels; + GC2356_FeatureControl_PERIOD_LineNum = + GC2356_VIDEO_PERIOD_LINE_NUMS + gc2356.DummyLines; +/* + spin_unlock(&gc2356mipiraw_drv_lock); + spin_lock(&gc2356mipiraw_drv_lock); +*/ + gc2356.imgMirror = sensor_config_data->SensorImageMirror; + spin_unlock(&gc2356mipiraw_drv_lock); + GC2356SetFlipMirror(GC2356_ORIENTATION); + GC2356DB("GC2356Video mirror:%d\n", + sensor_config_data->SensorImageMirror); + GC2356_SetDummy(gc2356.DummyPixels, gc2356.DummyLines); + /*GC2356DBSOFIA("[GC2356Video]frame_len=%x\n", ((GC2356_read_cmos_sensor(0x380e)<<8)+GC2356_read_cmos_sensor(0x380f)));*/ + mdelay(100); + GC2356DB("GC2356Video exit:\n"); + return ERROR_NONE; +} + +UINT32 GC2356Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + kal_uint32 shutter = gc2356.shutter; + kal_uint32 temp_data; + if (SENSOR_MODE_CAPTURE == gc2356.sensorMode) { + GC2356DB("GC2356Capture BusrtShot!!!\n"); + } else { + GC2356DB("GC2356Capture enter:\n"); + + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.pvShutter = shutter; + gc2356.sensorGlobalGain = temp_data; + gc2356.pvGain = gc2356.sensorGlobalGain; + spin_unlock(&gc2356mipiraw_drv_lock); + + GC2356DB + ("[GC2356Capture]gc2356.shutter=%d, read_pv_shutter=%d, read_pv_gain = 0x%x\n", + gc2356.shutter, shutter, gc2356.sensorGlobalGain); + + + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.sensorMode = SENSOR_MODE_CAPTURE; + gc2356.imgMirror = sensor_config_data->SensorImageMirror; + gc2356.DummyPixels = 0;/*define dummy pixels and lines*/ + gc2356.DummyLines = 0; + GC2356_FeatureControl_PERIOD_PixelNum = + GC2356_FULL_PERIOD_PIXEL_NUMS + gc2356.DummyPixels; + GC2356_FeatureControl_PERIOD_LineNum = + GC2356_FULL_PERIOD_LINE_NUMS + gc2356.DummyLines; + spin_unlock(&gc2356mipiraw_drv_lock); + + /*GC2356DB("[GC2356Capture] mirror&flip: %d\n",sensor_config_data->SensorImageMirror);*/ + + GC2356DB("GC2356capture mirror:%d\n", + sensor_config_data->SensorImageMirror); + GC2356SetFlipMirror(GC2356_ORIENTATION); + GC2356_SetDummy(gc2356.DummyPixels, gc2356.DummyLines); + + if (GC2356CurrentScenarioId == MSDK_SCENARIO_ID_CAMERA_ZSD) { + GC2356DB("GC2356Capture exit ZSD!!\n"); + return ERROR_NONE; + } + GC2356DB("GC2356Capture exit:\n"); + } + + return ERROR_NONE; +} /* GC2356Capture() */ + +UINT32 GC2356GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT * + pSensorResolution) +{ + + GC2356DB("GC2356GetResolution!!\n"); + pSensorResolution->SensorPreviewWidth = GC2356_IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorPreviewHeight = GC2356_IMAGE_SENSOR_PV_HEIGHT; + pSensorResolution->SensorFullWidth = GC2356_IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorFullHeight = GC2356_IMAGE_SENSOR_FULL_HEIGHT; + pSensorResolution->SensorVideoWidth = GC2356_IMAGE_SENSOR_VIDEO_WIDTH; + pSensorResolution->SensorVideoHeight = GC2356_IMAGE_SENSOR_VIDEO_HEIGHT; + return ERROR_NONE; +} /* GC2356GetResolution() */ + +UINT32 GC2356GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + + pSensorInfo->SensorPreviewResolutionX = GC2356_IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY = GC2356_IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX = GC2356_IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY = GC2356_IMAGE_SENSOR_FULL_HEIGHT; + + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.imgMirror = pSensorConfigData->SensorImageMirror; + spin_unlock(&gc2356mipiraw_drv_lock); + + pSensorInfo->SensorOutputDataFormat = SENSOR_OUTPUT_FORMAT_RAW_B; + + pSensorInfo->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + + pSensorInfo->SensroInterfaceType = SENSOR_INTERFACE_TYPE_MIPI; + pSensorInfo->MIPIsensorType = MIPI_OPHY_CSI2; + + pSensorInfo->CaptureDelayFrame = 4; + pSensorInfo->PreviewDelayFrame = 3; + pSensorInfo->VideoDelayFrame = 3; + + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; + pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ + pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ + pSensorInfo->AEISPGainDelayFrame = 2; + + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + pSensorInfo->SensorClockFreq = 24; + pSensorInfo->SensorClockRisingCount = 0; + + pSensorInfo->SensorGrabStartX = GC2356_PV_X_START; + pSensorInfo->SensorGrabStartY = GC2356_PV_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + pSensorInfo->SensorClockFreq = 24; + pSensorInfo->SensorClockRisingCount = 0; + + pSensorInfo->SensorGrabStartX = GC2356_VIDEO_X_START; + pSensorInfo->SensorGrabStartY = GC2356_VIDEO_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + pSensorInfo->SensorClockFreq = 24; + pSensorInfo->SensorClockRisingCount = 0; + + pSensorInfo->SensorGrabStartX = GC2356_FULL_X_START; /*2*GC2356_IMAGE_SENSOR_PV_STARTX;*/ + pSensorInfo->SensorGrabStartY = GC2356_FULL_Y_START; /*2*GC2356_IMAGE_SENSOR_PV_STARTY;*/ + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + default: + pSensorInfo->SensorClockFreq = 24; + pSensorInfo->SensorClockRisingCount = 0; + + pSensorInfo->SensorGrabStartX = GC2356_PV_X_START; + pSensorInfo->SensorGrabStartY = GC2356_PV_Y_START; + + pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; + pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; + pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + pSensorInfo->SensorPacketECCOrder = 1; + break; + } + + memcpy(pSensorConfigData, &GC2356SensorConfigData, + sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + + return ERROR_NONE; +} /* GC2356GetInfo() */ + +UINT32 GC2356Control(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + spin_lock(&gc2356mipiraw_drv_lock); + GC2356CurrentScenarioId = ScenarioId; + spin_unlock(&gc2356mipiraw_drv_lock); + GC2356DB("GC2356CurrentScenarioId=%d\n", GC2356CurrentScenarioId); + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + GC2356Preview(pImageWindow, pSensorConfigData); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + GC2356Capture(pImageWindow, pSensorConfigData); + break; + default: + return ERROR_INVALID_SCENARIO_ID; + } + return ERROR_NONE; +} /* GC2356Control() */ + +UINT32 GC2356SetVideoMode(UINT16 u2FrameRate) +{ + kal_uint32 MIN_Frame_length = 0, extralines = 0; + GC2356DB("[GC2356SetVideoMode] frame rate = %d\n", u2FrameRate); + + spin_lock(&gc2356mipiraw_drv_lock); + gc2356VIDEO_MODE_TARGET_FPS = u2FrameRate; + spin_unlock(&gc2356mipiraw_drv_lock); + + if (u2FrameRate == 0) { + GC2356DB("Disable Video Mode or dynimac fps\n"); + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.DummyPixels = 0; + gc2356.DummyLines = extralines; + spin_unlock(&gc2356mipiraw_drv_lock); + return KAL_TRUE; + } + + if (u2FrameRate > 30 || u2FrameRate < 5) + GC2356DB("error frame rate seting %d fps\n", u2FrameRate); + + if (gc2356.sensorMode == SENSOR_MODE_VIDEO) { + if (u2FrameRate == 30) { + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.DummyPixels = 0; + gc2356.DummyLines = 0; + spin_unlock(&gc2356mipiraw_drv_lock); + + GC2356_SetDummy(gc2356.DummyPixels, gc2356.DummyLines); + } else { + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.DummyPixels = 0; + MIN_Frame_length = + (GC2356MIPI_VIDEO_CLK) / + (GC2356_VIDEO_PERIOD_PIXEL_NUMS + + gc2356.DummyPixels) / u2FrameRate; + gc2356.DummyLines = + MIN_Frame_length - GC2356_VALID_LINE_NUMS - + GC2356_DEFAULT_DUMMY_LINE_NUMS; + spin_unlock(&gc2356mipiraw_drv_lock); + GC2356DB("GC2356SetVideoMode MIN_Frame_length %d\n", + MIN_Frame_length); + + GC2356_SetDummy(gc2356.DummyPixels, gc2356.DummyLines); + } + } else if (gc2356.sensorMode == SENSOR_MODE_CAPTURE) { + GC2356DB("-------[GC2356SetVideoMode]ZSD???---------\n"); + if (u2FrameRate == 30) { + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.DummyPixels = 0; + gc2356.DummyLines = 0; + spin_unlock(&gc2356mipiraw_drv_lock); + + GC2356_SetDummy(gc2356.DummyPixels, gc2356.DummyLines); + } else { + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.DummyPixels = 0; + MIN_Frame_length = + (GC2356MIPI_VIDEO_CLK) / + (GC2356_VIDEO_PERIOD_PIXEL_NUMS + + gc2356.DummyPixels) / u2FrameRate; + gc2356.DummyLines = + MIN_Frame_length - GC2356_VALID_LINE_NUMS - + GC2356_DEFAULT_DUMMY_LINE_NUMS; + spin_unlock(&gc2356mipiraw_drv_lock); + + GC2356_SetDummy(gc2356.DummyPixels, gc2356.DummyLines); + } + } + + return KAL_TRUE; +} + +UINT32 GC2356SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) +{ + if (bEnable) { + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.GC2356AutoFlickerMode = KAL_TRUE; + spin_unlock(&gc2356mipiraw_drv_lock); + } else { + spin_lock(&gc2356mipiraw_drv_lock); + gc2356.GC2356AutoFlickerMode = KAL_FALSE; + spin_unlock(&gc2356mipiraw_drv_lock); + GC2356DB("Disable Auto flicker\n"); + } + + return ERROR_NONE; +} + +UINT32 GC2356SetTestPatternMode(kal_bool bEnable) +{ + GC2356DB("[GC2356SetTestPatternMode] Test pattern enable:%d\n", + bEnable); + if (bEnable) { + GC2356_write_cmos_sensor(0x8b, 0xb2); /*bit[4]: 1 enable test pattern, 0 disable test pattern*/ + } else { + GC2356_write_cmos_sensor(0x8b, 0xa2); /*bit[4]: 1 enable test pattern, 0 disable test pattern*/ + } + return ERROR_NONE; +} + +UINT32 GC2356MIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, + MUINT32 frameRate) +{ + kal_uint32 pclk; + kal_int16 dummyLine; + kal_uint16 lineLength, frameHeight; + + GC2356DB + ("GC2356MIPISetMaxFramerateByScenario: scenarioId = %d, frame rate = %d\n", + scenarioId, frameRate); + switch (scenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + pclk = GC2356MIPI_PREVIEW_CLK; + lineLength = GC2356_PV_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk) / frameRate / lineLength; + dummyLine = frameHeight - GC2356_VALID_LINE_NUMS; + gc2356.sensorMode = SENSOR_MODE_PREVIEW; + GC2356_SetDummy(0, dummyLine); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + pclk = GC2356MIPI_VIDEO_CLK; + lineLength = GC2356_VIDEO_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk) / frameRate / lineLength; + dummyLine = frameHeight - GC2356_VALID_LINE_NUMS; + gc2356.sensorMode = SENSOR_MODE_VIDEO; + GC2356_SetDummy(0, dummyLine); + break; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + pclk = GC2356MIPI_CAPTURE_CLK; + lineLength = GC2356_FULL_PERIOD_PIXEL_NUMS; + frameHeight = (10 * pclk) / frameRate / lineLength; + dummyLine = frameHeight - GC2356_VALID_LINE_NUMS; + gc2356.sensorMode = SENSOR_MODE_CAPTURE; + GC2356_SetDummy(0, dummyLine); + break; + case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: + break; + case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: + break; + case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: + break; + default: + break; + } + return ERROR_NONE; +} + +UINT32 GC2356MIPIGetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, + MUINT32 *pframeRate) +{ + + switch (scenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *pframeRate = 300; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + *pframeRate = 300; + break; + case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: + case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: + case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: + *pframeRate = 300; + break; + default: + break; + } + + return ERROR_NONE; +} + +UINT32 GC2356FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara, UINT32 *pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16 = (UINT16 *) pFeaturePara; + UINT16 *pFeatureData16 = (UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32 = (UINT32 *) pFeaturePara; + UINT32 *pFeatureData32 = (UINT32 *) pFeaturePara; + UINT32 SensorRegNumber; + UINT32 i; + PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData = + (PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData = + (MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData = + (MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo = + (MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo = + (MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; + MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo = + (MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; + + switch (FeatureId) { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++ = GC2356_IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16 = GC2356_IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PERIOD: + *pFeatureReturnPara16++ = GC2356_FeatureControl_PERIOD_PixelNum; + *pFeatureReturnPara16 = GC2356_FeatureControl_PERIOD_LineNum; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + switch (GC2356CurrentScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + *pFeatureReturnPara32 = GC2356MIPI_PREVIEW_CLK; + *pFeatureParaLen = 4; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *pFeatureReturnPara32 = GC2356MIPI_VIDEO_CLK; + *pFeatureParaLen = 4; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + *pFeatureReturnPara32 = GC2356MIPI_CAPTURE_CLK; + *pFeatureParaLen = 4; + break; + default: + *pFeatureReturnPara32 = GC2356MIPI_CAPTURE_CLK; + *pFeatureParaLen = 4; + break; + } + break; + + case SENSOR_FEATURE_SET_ESHUTTER: + GC2356_SetShutter(*pFeatureData16); + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + GC2356_NightMode((BOOL) * pFeatureData16); + break; + case SENSOR_FEATURE_SET_GAIN: + GC2356_SetGain((UINT16) *pFeatureData16); + break; + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + /*GC2356_isp_master_clock=*pFeatureData32;*/ + break; + case SENSOR_FEATURE_SET_REGISTER: + GC2356_write_cmos_sensor(pSensorRegData->RegAddr, + pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = + GC2356_read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + SensorRegNumber = FACTORY_END_ADDR; + for (i = 0; i < SensorRegNumber; i++) { + spin_lock(&gc2356mipiraw_drv_lock); + GC2356SensorCCT[i].Addr = *pFeatureData32++; + GC2356SensorCCT[i].Para = *pFeatureData32++; + spin_unlock(&gc2356mipiraw_drv_lock); + } + break; + case SENSOR_FEATURE_GET_CCT_REGISTER: + SensorRegNumber = FACTORY_END_ADDR; + if (*pFeatureParaLen < + (SensorRegNumber * sizeof(SENSOR_REG_STRUCT) + 4)) + return FALSE; + *pFeatureData32++ = SensorRegNumber; + for (i = 0; i < SensorRegNumber; i++) { + *pFeatureData32++ = GC2356SensorCCT[i].Addr; + *pFeatureData32++ = GC2356SensorCCT[i].Para; + } + break; + case SENSOR_FEATURE_SET_ENG_REGISTER: + SensorRegNumber = ENGINEER_END; + for (i = 0; i < SensorRegNumber; i++) { + spin_lock(&gc2356mipiraw_drv_lock); + GC2356SensorReg[i].Addr = *pFeatureData32++; + GC2356SensorReg[i].Para = *pFeatureData32++; + spin_unlock(&gc2356mipiraw_drv_lock); + } + break; + case SENSOR_FEATURE_GET_ENG_REGISTER: + SensorRegNumber = ENGINEER_END; + if (*pFeatureParaLen < + (SensorRegNumber * sizeof(SENSOR_REG_STRUCT) + 4)) + return FALSE; + *pFeatureData32++ = SensorRegNumber; + for (i = 0; i < SensorRegNumber; i++) { + *pFeatureData32++ = GC2356SensorReg[i].Addr; + *pFeatureData32++ = GC2356SensorReg[i].Para; + } + break; + case SENSOR_FEATURE_GET_REGISTER_DEFAULT: + if (*pFeatureParaLen >= sizeof(NVRAM_SENSOR_DATA_STRUCT)) { + pSensorDefaultData->Version = + NVRAM_CAMERA_SENSOR_FILE_VERSION; + pSensorDefaultData->SensorId = GC2356MIPI_SENSOR_ID; + memcpy(pSensorDefaultData->SensorEngReg, + GC2356SensorReg, + sizeof(SENSOR_REG_STRUCT) * ENGINEER_END); + memcpy(pSensorDefaultData->SensorCCTReg, + GC2356SensorCCT, + sizeof(SENSOR_REG_STRUCT) * FACTORY_END_ADDR); + } else + return FALSE; + *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pSensorConfigData, &GC2356SensorConfigData, + sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + *pFeatureParaLen = sizeof(MSDK_SENSOR_CONFIG_STRUCT); + break; + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + GC2356_camera_para_to_sensor(); + break; + + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + GC2356_sensor_to_camera_para(); + break; + case SENSOR_FEATURE_GET_GROUP_COUNT: + *pFeatureReturnPara32++ = GC2356_get_sensor_group_count(); + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_GROUP_INFO: + GC2356_get_sensor_group_info(pSensorGroupInfo->GroupIdx, + pSensorGroupInfo->GroupNamePtr, + &pSensorGroupInfo->ItemCount); + *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_ITEM_INFO: + GC2356_get_sensor_item_info(pSensorItemInfo->GroupIdx, + pSensorItemInfo->ItemIdx, + pSensorItemInfo); + *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + + case SENSOR_FEATURE_SET_ITEM_INFO: + GC2356_set_sensor_item_info(pSensorItemInfo->GroupIdx, + pSensorItemInfo->ItemIdx, + pSensorItemInfo->ItemValue); + *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + + case SENSOR_FEATURE_GET_ENG_INFO: + pSensorEngInfo->SensorId = 129; + pSensorEngInfo->SensorType = CMOS_SENSOR; + pSensorEngInfo->SensorOutputDataFormat = + SENSOR_OUTPUT_FORMAT_RAW_B; + *pFeatureParaLen = sizeof(MSDK_SENSOR_ENG_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + *pFeatureReturnPara32 = LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen = 4; + break; + + case SENSOR_FEATURE_INITIALIZE_AF: + break; + case SENSOR_FEATURE_CONSTANT_AF: + break; + case SENSOR_FEATURE_MOVE_FOCUS_LENS: + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + GC2356SetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + GC2356GetSensorID(pFeatureReturnPara32); + break; + case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: + GC2356SetAutoFlickerMode((BOOL) * pFeatureData16, + *(pFeatureData16 + 1)); + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + GC2356SetTestPatternMode((BOOL) * pFeatureData16); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: + *pFeatureReturnPara32 = GC2356_TEST_PATTERN_CHECKSUM; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: + GC2356MIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM) * + pFeatureData32, + *(pFeatureData32 + 1)); + break; + case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: + GC2356MIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM) + *pFeatureData32, + (MUINT32 + *) (*(pFeatureData32 + + 1))); + break; + default: + break; + } + return ERROR_NONE; +} /* GC2356FeatureControl() */ + +SENSOR_FUNCTION_STRUCT SensorFuncGC2356 = { + GC2356Open, + GC2356GetInfo, + GC2356GetResolution, + GC2356FeatureControl, + GC2356Control, + GC2356Close +}; + +UINT32 GC2356_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc != NULL) + *pfFunc = &SensorFuncGC2356; + + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Sensor.h new file mode 100644 index 00000000000..dbf330f2429 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/gc2356mipiraw_Sensor.h @@ -0,0 +1,178 @@ +/*******************************************************************************************/ + +/*******************************************************************************************/ + +/* SENSOR FULL SIZE */ +#ifndef __SENSOR_H +#define __SENSOR_H + +typedef enum group_enum { + PRE_GAIN = 0, + CMMCLK_CURRENT, + FRAME_RATE_LIMITATION, + REGISTER_EDITOR, + GROUP_TOTAL_NUMS +} FACTORY_GROUP_ENUM; + +#define ENGINEER_START_ADDR 10 +#define FACTORY_START_ADDR 0 + +typedef enum engineer_index { + CMMCLK_CURRENT_INDEX = ENGINEER_START_ADDR, + ENGINEER_END +} FACTORY_ENGINEER_INDEX; + +typedef enum register_index { + SENSOR_BASEGAIN = FACTORY_START_ADDR, + PRE_GAIN_R_INDEX, + PRE_GAIN_Gr_INDEX, + PRE_GAIN_Gb_INDEX, + PRE_GAIN_B_INDEX, + FACTORY_END_ADDR +} FACTORY_REGISTER_INDEX; + +typedef struct { + SENSOR_REG_STRUCT Reg[ENGINEER_END]; + SENSOR_REG_STRUCT CCT[FACTORY_END_ADDR]; +} SENSOR_DATA_STRUCT, *PSENSOR_DATA_STRUCT; + +typedef enum { + SENSOR_MODE_INIT = 0, + SENSOR_MODE_PREVIEW, + SENSOR_MODE_VIDEO, + SENSOR_MODE_CAPTURE +} GC2356_SENSOR_MODE; + +typedef struct { + kal_uint32 DummyPixels; + kal_uint32 DummyLines; + + kal_uint32 pvShutter; + kal_uint32 pvGain; + kal_uint32 Gain; + + kal_uint32 pvPclk; /*x10 480 for 48MHZ*/ + kal_uint32 videoPclk; + kal_uint32 capPclk; /*x10*/ + + kal_uint32 shutter; + kal_uint32 maxExposureLines; + + kal_uint16 sensorGlobalGain; /*sensor gain read from 0x350a 0x350b;*/ + kal_uint16 ispBaseGain; /*64*/ + kal_uint16 realGain; /*ispBaseGain as 1x*/ + + kal_int16 imgMirror; + + GC2356_SENSOR_MODE sensorMode; + + kal_bool GC2356AutoFlickerMode; + kal_bool GC2356VideoMode; + +} GC2356_PARA_STRUCT, *PGC2356_PARA_STRUCT; + +#define GC2356_MIPI_2_Lane +#define GC2356_MIPI_30FPS + +#define GC2356_IMAGE_SENSOR_FULL_WIDTH (1600) +#define GC2356_IMAGE_SENSOR_FULL_HEIGHT (1200) + + /* SENSOR PV SIZE */ +#define GC2356_IMAGE_SENSOR_PV_WIDTH (1600) +#define GC2356_IMAGE_SENSOR_PV_HEIGHT (1200) + +#define GC2356_IMAGE_SENSOR_VIDEO_WIDTH (1600) +#define GC2356_IMAGE_SENSOR_VIDEO_HEIGHT (1200) + + /* SENSOR SCALER FACTOR */ +#define GC2356_PV_SCALER_FACTOR 3 +#define GC2356_FULL_SCALER_FACTOR 1 + + /* SENSOR START/EDE POSITION */ +#define GC2356_FULL_X_START (0) +#define GC2356_FULL_Y_START (0) + +#define GC2356_PV_X_START 0 +#define GC2356_PV_Y_START 0 + +#define GC2356_VIDEO_X_START 0 +#define GC2356_VIDEO_Y_START 0 + +#define GC2356_MAX_ANALOG_GAIN (6) +#define GC2356_MIN_ANALOG_GAIN (1) +#define GC2356_ANALOG_GAIN_1X (0x0020) +#ifdef GC2356_MIPI_30FPS +#define GC2356MIPI_CAPTURE_CLK (42000000) +#define GC2356MIPI_PREVIEW_CLK (42000000) +#define GC2356MIPI_VIDEO_CLK (42000000) +#else /*20fps*/ +#define GC2356MIPI_CAPTURE_CLK (30000000) +#define GC2356MIPI_PREVIEW_CLK (30000000) +#define GC2356MIPI_VIDEO_CLK (30000000) +#endif + + /* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ + +#define GC2356_VALID_IXEL_NUMS 800 +#define GC2356_VALID_LINE_NUMS 1200 +#ifdef GC2356_MIPI_30FPS +#define GC2356_DEFAULT_DUMMY_PIXEL_NUMS 0x11c /*244*/ +#define GC2356_DEFAULT_DUMMY_LINE_NUMS 0x0e /*64*/ +#define GC2356_VIDEO_PERIOD_PIXEL_NUMS (1120) +#define GC2356_VIDEO_PERIOD_LINE_NUMS (1246) + +#define GC2356_PV_PERIOD_PIXEL_NUMS (1120) +#define GC2356_PV_PERIOD_LINE_NUMS (1246) + +#define GC2356_FULL_PERIOD_PIXEL_NUMS (1120) +#define GC2356_FULL_PERIOD_LINE_NUMS (1246) + +#else /*20fps*/ +#define GC2356_DEFAULT_DUMMY_PIXEL_NUMS 285 /*244*/ +#define GC2356_DEFAULT_DUMMY_LINE_NUMS 123 /*64*/ +#define GC2356_VIDEO_PERIOD_PIXEL_NUMS (1107) +#define GC2356_VIDEO_PERIOD_LINE_NUMS (1355) + +#define GC2356_PV_PERIOD_PIXEL_NUMS (1107) +#define GC2356_PV_PERIOD_LINE_NUMS (1355) + +#define GC2356_FULL_PERIOD_PIXEL_NUMS (1107) +#define GC2356_FULL_PERIOD_LINE_NUMS (1355) + +#endif + +#define GC2356_MIN_LINE_LENGTH 0x1100 +#define GC2356_MIN_FRAME_LENGTH 0xc00 + +#define GC2356_MAX_LINE_LENGTH 0xCCCC +#define GC2356_MAX_FRAME_LENGTH 0xFFFF + + /* DUMMY NEEDS TO BE INSERTED */ + /* SETUP TIME NEED TO BE INSERTED */ + +#define GC2356MIPI_WRITE_ID (0x78) +#define GC2356MIPI_READ_ID (0x79) + +/* SENSOR CHIP VERSION*/ + +/*#define GC2356MIPI_SENSOR_ID GC2356_SENSOR_ID*/ + +#define GC2356MIPI_PAGE_SETTING_REG (0xFF) + + +UINT32 GC2356MIPIOpen(void); +UINT32 GC2356MIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT * + pSensorResolution); +UINT32 GC2356MIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2356MIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 GC2356MIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara, UINT32 *pFeatureParaLen); +UINT32 GC2356MIPIClose(void); + + + +#endif /* __SENSOR_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_CameraCustomized.h similarity index 64% rename from drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_CameraCustomized.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_CameraCustomized.h index bf08c9491b2..38e20faa8a0 100644 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_CameraCustomized.h +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_CameraCustomized.h @@ -26,11 +26,11 @@ * $Log:$ * * 07 11 2011 jun.pei - * [ALPS00059464] hi708 sensor check in + * [ALPS00059464] hi704 sensor check in * . * * . - * Add Hi708 YUV sensor driver support + * Add HI704 YUV sensor driver support * * *------------------------------------------------------------------------------ @@ -41,19 +41,17 @@ #ifndef __CAMERA_CUSTOMIZED_H #define __CAMERA_CUSTOMIZED_H -// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 +/*the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270*/ #define MAIN_SENSOR_ORIENTATION_ANGLE 90 -#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist +#define SUB_SENSOR_ORIENTATION_ANGLE 0 /*do not care if the sub sensor does not exist */ - -// First, we think you hold the cell phone vertical. -// Second, we suppose the direction of upward is 0 -// Third, it is 90, 180, 270 in clockwise -// here we define the main sensor and sub sensor angles to deal with the jpeg orientation +/*First, we think you hold the cell phone vertical. +Second, we suppose the direction of upward is 0 +Third, it is 90, 180, 270 in clockwise +here we define the main sensor and sub sensor angles to deal with the jpeg orientation*/ #define MAIN_SENSOR_TO_PHONE_ANGLE 90 #define SUB_SENSOR_TO_PHONE_ANGLE 0 - #define CAM_SIZE_QVGA_WIDTH 320 #define CAM_SIZE_QVGA_HEIGHT 240 #define CAM_SIZE_VGA_WIDTH 640 @@ -70,28 +68,27 @@ #define CAM_SIZE_5M_WIDTH 2592 #define CAM_SIZE_5M_HEIGHT 1944 */ -// for main sensor +/*for main sensor*/ #define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 #define MAIN_NUM_OF_VIDEO_RESOLUTION 3 #define MAIN_NUM_OF_STILL_RESOLUTION 2 -#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480}/*,{720,480}*/} -#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} -#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ - {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ +#define MAIN_VIDEO_RESOLUTION_PROFILE {{176, 144}, {320, 240}, {640, 480} /*,{720,480}*/ } +#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232, 174}, {320, 240}, {240, 320} } +#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH, CAM_SIZE_QVGA_HEIGHT}, \ + {CAM_SIZE_VGA_WIDTH, CAM_SIZE_VGA_HEIGHT}, \ /* {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ - {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}*/} + {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}*/ } -// if sub sensor does not exist, set all the parameters as 0 +/*f sub sensor does not exist, set all the parameters as 0*/ #define SUB_NUM_OF_PREVIEW_RESOLUTION 0 #define SUB_NUM_OF_VIDEO_RESOLUTION 0 #define SUB_NUM_OF_STILL_RESOLUTION 0 -#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} -#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} -#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} +#define SUB_VIDEO_RESOLUTION_PROFILE {{0, 0} } +#define SUB_PREVIEW_RESOLUTION_PROFILE {{0, 0} } +#define SUB_STILL_RESOLUTION_PROFILE {{0, 0} } - -#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 +#define NUM_OF_VIDEO_STREAM_BUFF 8 /*Maximun is 8 */ #endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Camera_Sensor_para.h similarity index 91% rename from drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Camera_Sensor_para.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Camera_Sensor_para.h index 5a85a860a40..4d611aa4b8d 100644 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Camera_Sensor_para.h +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Camera_Sensor_para.h @@ -25,29 +25,29 @@ * $Log:$ * * 07 11 2011 jun.pei - * [ALPS00059464] hi708 sensor check in + * [ALPS00059464] hi704 sensor check in * . * * 05 25 2010 sean.cheng - * [ALPS00001357][Meta]CameraTool + * [ALPS00001357][Meta]CameraTool * . - * Add HI708 YUV sensor driver support + * Add HI704 YUV sensor driver support * * Mar 4 2010 mtk70508 * [DUMA00154792] Sensor driver - * + * * * Feb 24 2010 mtk01118 * [DUMA00025869] [Camera][YUV I/F & Query feature] check in camera code - * + * * * Apr 7 2009 mtk02204 * [DUMA00004012] [Camera] Restructure and rename camera related custom folders and folder name of came - * + * * * Feb 24 2009 mtk02204 * [DUMA00001084] First Check in of MT6516 multimedia drivers - * + * * *------------------------------------------------------------------------------ * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! @@ -103,8 +103,8 @@ /* STRUCT: SENSOR.reg[10] */\ {\ /* SENSOR.reg[10].addr */ 0xFFFFFFFF, /* SENSOR.reg[10].para */ 0x00000001\ - }\ + } \ } -#define CAMERA_SENSOR_CCT_DEFAULT_VALUE {{ 0xFFFFFFFF, 0x08 } ,{ 0x0209, 0x0008 } ,{ 0x0207, 0x0008 } ,{ 0x020D, 0x0008 } ,{ 0x020B, 0x0008 }} +#define CAMERA_SENSOR_CCT_DEFAULT_VALUE {{ 0xFFFFFFFF, 0x08 } , { 0x0209, 0x0008 } , { 0x0207, 0x0008 } , { 0x020D, 0x0008 } , { 0x020B, 0x0008 } } #endif /* __CAMERA_SENSOR_PARA_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Sensor.c new file mode 100644 index 00000000000..2806ff52eeb --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Sensor.c @@ -0,0 +1,1827 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" +#include "kd_camera_feature.h" +#include "hi704yuv_Sensor.h" +#include "hi704yuv_Camera_Sensor_para.h" +#include "hi704yuv_CameraCustomized.h" + +#define HI704YUV_DEBUG +#ifdef HI704YUV_DEBUG +#define SENSORDB printk +#else +#define SENSORDB(x, ...) +#endif + +#if 0 +extern int iReadReg(u16 a_u2Addr, u8 * a_puBuff, u16 i2cId); +extern int iWriteReg(u16 a_u2Addr, u32 a_u4Data, u32 a_u4Bytes, u16 i2cId); +static int sensor_id_fail; +#define HI704_write_cmos_sensor(addr, para) iWriteReg((u16) addr , (u32) para , 1, HI704_WRITE_ID) +#define HI704_write_cmos_sensor_2(addr, para, bytes) iWriteReg((u16) addr , (u32) para , sbytes, HI704_WRITE_ID) +kal_uint16 HI704_read_cmos_sensor(kal_uint32 addr) +{ + kal_uint16 get_byte = 0; + iReadReg((u16) addr, (u8 *) & get_byte, HI704_WRITE_ID); + return get_byte; +} + +#endif +static DEFINE_SPINLOCK(hi704_yuv_drv_lock); + +extern int iReadRegI2C(u8 * a_pSendData, u16 a_sizeSendData, u8 * a_pRecvData, + u16 a_sizeRecvData, u16 i2cId); +extern int iWriteRegI2C(u8 * a_pSendData, u16 a_sizeSendData, u16 i2cId); +kal_uint16 HI704_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) +{ + char puSendCmd[2] = { (char)(addr & 0xFF), (char)(para & 0xFF) }; + iWriteRegI2C(puSendCmd, 2, HI704_WRITE_ID); + return 0; +} + +kal_uint16 HI704_read_cmos_sensor(kal_uint8 addr) +{ + kal_uint16 get_byte = 0; + char puSendCmd = { (char)(addr & 0xFF) }; + iReadRegI2C(&puSendCmd, 1, (u8 *) & get_byte, 1, HI704_WRITE_ID); + return get_byte; +} + +/******************************************************************************* +Adapter for Winmo typedef +********************************************************************************/ +#define WINMO_USE 0 + +#define Sleep(ms) mdelay(ms) +#define RETAILMSG(x, ...) +#define TEXT + +/******************************************************************************* +* follow is define by jun +********************************************************************************/ +MSDK_SENSOR_CONFIG_STRUCT HI704SensorConfigData; +SENSOR_EXIF_INFO_STRUCT HI704ExifInfo; +static struct HI704_sensor_STRUCT HI704_sensor; +static kal_uint32 HI704_zoom_factor; +static int sensor_id_fail; +/************************************************************************* + * FUNCTION + * HI704_read_Shutter + * + * DESCRIPTION + * This function read e-shutter of HI704 . + * + * PARAMETERS + * None + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +kal_uint16 HI704_Read_Shutter(void) +{ + + UINT8 high_exp, mid_exp, low_exp = 0; + UINT32 EXP, t_gain, ISO, CLK = 0, shutter; + + HI704_write_cmos_sensor(0x03, 0x20); + + high_exp = HI704_read_cmos_sensor(0x80); + mid_exp = HI704_read_cmos_sensor(0x81); + low_exp = HI704_read_cmos_sensor(0x82); + + CLK = HI704_sensor.pv_pclk; + shutter = ((high_exp << 16) | (mid_exp << 8) | low_exp); + printk("HYNIXshutter=%d ", shutter); + EXP = shutter * 8 * 1000 / CLK; // returns in ms + SENSORDB + ("HI704ExifInfo %s,high_exp = %d,mid_exp = %d,low_exp = %d,EXP = %d", + __func__, high_exp, mid_exp, low_exp, EXP); + printk("HYNIXEXP=%d ", EXP); + if (EXP < 1) + EXP = 1; + + HI704ExifInfo.CapExposureTime = EXP; + + HI704_write_cmos_sensor(0x03, 0x20); + t_gain = HI704_read_cmos_sensor(0xb0); + SENSORDB("t_gain = %d \n", t_gain); + + printk("HI704ExifInfo t_gain=%d ", t_gain); + + ISO = t_gain * 100 / 32; + if (ISO < 150) + HI704ExifInfo.RealISOValue = AE_ISO_100; + else if (ISO < 250) + HI704ExifInfo.RealISOValue = AE_ISO_200; + else if (ISO < 450) + HI704ExifInfo.RealISOValue = AE_ISO_400; + else + HI704ExifInfo.RealISOValue = AE_ISO_800; + + printk("HYNIXISO=%d ", ISO); + + // HI704ExifInfo.RealISOValue = ISO; + return shutter; +} /* HI704_read_shutter */ + +#define HI258_LOAD_FROM_T_FLASH + +#ifdef HI258_LOAD_FROM_T_FLASH +/*kal_uint16 HI258_write_cmos_sensor(kal_uint8 addr, kal_uint8 para);*/ + +#define HI256_OP_CODE_INI 0x00 /* Initial value. */ +#define HI256_OP_CODE_REG 0x01 /* Register */ +#define HI256_OP_CODE_DLY 0x02 /* Delay */ +#define HI256_OP_CODE_END 0x03 /* End of initial setting. */ + +typedef struct { + u16 init_reg; + u16 init_val; /* Save the register value and delay tick */ + u8 op_code; /* 0 - Initial value, 1 - Register, 2 - Delay, 3 - End of setting. */ +} HI256_initial_set_struct; + +HI256_initial_set_struct HI256_Init_Reg[2000]; + +static u32 strtol(const char *nptr, u8 base) +{ + u8 ret; + if (!nptr || (base != 16 && base != 10 && base != 8)) { + printk("%s(): NULL pointer input\n", __FUNCTION__); + return -1; + } + for (ret = 0; *nptr; nptr++) { + if ((base == 16 && *nptr >= 'A' && *nptr <= 'F') || + (base == 16 && *nptr >= 'a' && *nptr <= 'f') || + (base >= 10 && *nptr >= '0' && *nptr <= '9') || + (base >= 8 && *nptr >= '0' && *nptr <= '7')) { + ret *= base; + if (base == 16 && *nptr >= 'A' && *nptr <= 'F') + ret += *nptr - 'A' + 10; + else if (base == 16 && *nptr >= 'a' && *nptr <= 'f') + ret += *nptr - 'a' + 10; + else if (base >= 10 && *nptr >= '0' && *nptr <= '9') + ret += *nptr - '0'; + else if (base >= 8 && *nptr >= '0' && *nptr <= '7') + ret += *nptr - '0'; + } else + return ret; + } + return ret; +} + +u8 Hi258_Initialize_from_T_Flash(void) +{ + u8 *curr_ptr = NULL; + u32 file_size = 0; + u32 i = 0, j = 0; + u8 func_ind[4] = { 0 }; /* REG or DLY */ + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static u8 data_buff[50 * 1024]; + + fp = filp_open("/data/hi258_sd.dat", O_RDONLY, 0); + if (IS_ERR(fp)) { + printk("create file error\n"); + return 2; + } else + printk("Hi256_Initialize_from_T_Flash Open File Success\n"); + + fs = get_fs(); + set_fs(KERNEL_DS); + + file_size = vfs_llseek(fp, 0, SEEK_END); + vfs_read(fp, data_buff, file_size, &pos); + filp_close(fp, NULL); + set_fs(fs); + + printk("1\n"); + + /* Start parse the setting witch read from t-flash. */ + curr_ptr = data_buff; + while (curr_ptr < (data_buff + file_size)) { + while ((*curr_ptr == ' ') || (*curr_ptr == '\t')) /* Skip the Space & TAB */ + curr_ptr++; + + if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '*')) { + while (!(((*curr_ptr) == '*') + && ((*(curr_ptr + 1)) == '/'))) { + curr_ptr++; /* Skip block comment code. */ + } + + while (!((*curr_ptr == 0x0D) + && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue; + } + + if (((*curr_ptr) == '/') || ((*curr_ptr) == '{') || ((*curr_ptr) == '}')) { /* Comment line, skip it. */ + while (!((*curr_ptr == 0x0D) + && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue; + } + /* This just content one enter line. */ + if (((*curr_ptr) == 0x0D) && ((*(curr_ptr + 1)) == 0x0A)) { + curr_ptr += 2; + continue; + } + memcpy(func_ind, curr_ptr, 3); + + if (strcmp((const char *)func_ind, "REG") == 0) { /* REG */ + curr_ptr += 6; /* Skip "REG(0x" or "DLY(" */ + HI256_Init_Reg[i].op_code = HI256_OP_CODE_REG; + + HI256_Init_Reg[i].init_reg = + strtol((const char *)curr_ptr, 16); + curr_ptr += 6; /* Skip "00, 0x" */ + + HI256_Init_Reg[i].init_val = + strtol((const char *)curr_ptr, 16); + curr_ptr += 4; /* Skip "00);" */ + } else { /* DLY */ + + /* Need add delay for this setting. */ + curr_ptr += 4; + HI256_Init_Reg[i].op_code = HI256_OP_CODE_DLY; + + HI256_Init_Reg[i].init_reg = 0xFF; + HI256_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 10); /* Get the delay ticks, the delay should less then 50 */ + } + i++; + + /* Skip to next line directly. */ + while (!((*curr_ptr == 0x0D) && (*(curr_ptr + 1) == 0x0A))) { + curr_ptr++; + } + curr_ptr += 2; + } + printk("2\n"); + /* (0xFFFF, 0xFFFF) means the end of initial setting. */ + HI256_Init_Reg[i].op_code = HI256_OP_CODE_END; + HI256_Init_Reg[i].init_reg = 0xFF; + HI256_Init_Reg[i].init_val = 0xFF; + i++; + + /* Start apply the initial setting to sensor. */ +#if 1 + for (j = 0; j < i; j++) { + if (HI256_Init_Reg[j].op_code == HI256_OP_CODE_END) { /* End of the setting. */ + break; + } else if (HI256_Init_Reg[j].op_code == HI256_OP_CODE_DLY) { + msleep(HI256_Init_Reg[j].init_val); /* Delay */ + } else if (HI256_Init_Reg[j].op_code == HI256_OP_CODE_REG) { + HI704_write_cmos_sensor((kal_uint8) + HI256_Init_Reg[j].init_reg, + (kal_uint8) + HI256_Init_Reg[j].init_val); + } else { + printk("REG ERROR!\n"); + } + } +#endif + printk("3\n"); + return 1; +} + +#endif +const HI704_SENSOR_INIT_INFO HI704_Initial_Setting_Info[] = { +/*PAGE 0*/ +/*Image Size/Windowing/HSYNC/VSYNC[Type1]*/ + {0x03, 0x00}, /*PAGEMODE(0x03) */ + +#if 0 +/* under construction !*/ +/* under construction !*/ +/* under construction !*/ +#endif + + {0x03, 0x00}, + {0x10, 0x00}, + {0x11, 0x90}, //XY Flip + {0x12, 0x04}, + {0x20, 0x00}, + {0x21, 0x02}, //Flip 0x02, None 0x04 + {0x22, 0x00}, + {0x23, 0x00}, //Flip 0x00, None 0x04 + + {0x40, 0x01}, //Hblank 296 + {0x41, 0x58}, + {0x42, 0x00}, + {0x43, 0x14}, //Vblank 04 + +//BLC + {0x80, 0x2e}, //don't touch + {0x81, 0x7e}, //don't touch + {0x82, 0x90}, + {0x83, 0x30}, + {0x84, 0x2c}, //*** Change 100406 + {0x85, 0x4b}, //*** Change 100406 + {0x89, 0x48}, //don't touch + {0x90, 0x0f}, //BLC_TIME_TH_ON + {0x91, 0x0f}, //BLC_TIME_TH_OFF + {0x92, 0x78}, //BLC_AG_TH_ON + {0x93, 0x70}, //BLC_AG_TH_OFF + + {0x98, 0x38}, + {0x99, 0x42}, //don't touch + {0xa8, 0x42}, //don't touch + +//Page 2 Last Update 15_03_10 + {0x03, 0x02}, + {0x22, 0xa7}, //don't touch + {0x52, 0xa2}, //don't touch + {0x54, 0x10}, //don't touch + {0x55, 0x18}, //don't touch + {0x56, 0x0c}, //don't touch + {0x59, 0x00}, //don't touch + + {0x60, 0x11}, //don't touch + {0x61, 0x1b}, //don't touch + {0x62, 0x11}, //don't touch + {0x63, 0x1a}, //don't touch + {0x64, 0x11}, //don't touch + {0x65, 0x1a}, //don't touch + {0x72, 0x12}, //don't touch + {0x73, 0x19}, //don't touch + {0x74, 0x12}, //don't touch + {0x75, 0x19}, //don't touch + {0x80, 0x1d}, //don't touch + {0xa0, 0x1d}, //don't touch + {0xa5, 0x1d}, //don't touch + {0xb8, 0x10}, //don't touch + {0xb9, 0x13}, //don't touch + + {0xc0, 0x04}, //don't touch + {0xc1, 0x0d}, //don't touch + {0xc2, 0x04}, //don't touch + {0xc3, 0x0d}, //don't touch + {0xc4, 0x05}, //don't touch + {0xc5, 0x0c}, //don't touch + {0xc6, 0x05}, //don't touch + {0xc7, 0x0c}, //don't touch + {0xc8, 0x06}, //don't touch + {0xc9, 0x0b}, //don't touch + {0xca, 0x06}, //don't touch + {0xcb, 0x0b}, //don't touch + {0xcc, 0x06}, //don't touch + {0xcd, 0x0a}, //don't touch + {0xce, 0x06}, //don't touch + {0xcf, 0x0a}, //don't touch + {0xd0, 0x03}, //don't touch + {0xd1, 0x1c}, //don't touch + +//Page 10 + {0x03, 0x10}, + {0x10, 0x00}, + {0x11, 0x43}, + {0x12, 0x30}, + {0x40, 0x80}, + {0x41, 0x08}, + {0x48, 0x80}, + {0x50, 0x78}, + + {0x60, 0x7d}, + {0x61, 0x00}, + {0x62, 0xb2}, + {0x63, 0x8a}, + {0x64, 0xa0}, + {0x65, 0x88}, + {0x66, 0x80}, + {0x67, 0x36}, + {0x68, 0x80}, + +//LPF + {0x03, 0x11}, + {0x10, 0x20}, + {0x11, 0x07}, + {0x20, 0x00}, + {0x21, 0x60}, + {0x23, 0x0A}, + {0x60, 0x12}, + {0x61, 0x85}, + {0x62, 0x00}, + {0x63, 0x00}, + {0x64, 0x00}, + + {0x67, 0x70}, + {0x68, 0x24}, + {0x69, 0x04}, + +//Page 12 +//2D + {0x03, 0x12}, + {0x40, 0xD3}, + {0x41, 0x09}, + {0x50, 0x16}, + {0x51, 0x24}, + {0x70, 0x1F}, + {0x71, 0x00}, + {0x72, 0x00}, + {0x73, 0x00}, + {0x74, 0x12}, + {0x75, 0x12}, + {0x76, 0x20}, + {0x77, 0x80}, + {0x78, 0x88}, + {0x79, 0x18}, + +///////////////////// + {0x90, 0x3d}, + {0x91, 0x34}, + {0x99, 0x28}, + {0x9c, 0x00}, + {0x9d, 0x00}, + {0x9e, 0x28}, + {0x9f, 0x28}, + {0xb0, 0x7d}, + {0xb5, 0x44}, + {0xb6, 0x82}, + {0xb7, 0x52}, + {0xb8, 0x44}, + {0xb9, 0x15}, +///////////////////// + +//Edge + {0x03, 0x13}, + {0x10, 0x01}, + {0x11, 0x89}, + {0x12, 0x14}, + {0x13, 0x19}, + {0x14, 0x08}, + {0x20, 0x03}, + {0x21, 0x05}, + {0x23, 0x25}, + {0x24, 0x21}, + {0x25, 0x08}, + {0x26, 0x40}, + {0x27, 0x00}, + {0x28, 0x08}, + {0x29, 0x80}, + {0x2A, 0xE0}, + {0x2B, 0x10}, + {0x2C, 0x28}, + {0x2D, 0x40}, + {0x2E, 0x00}, + {0x2F, 0x00}, + {0x30, 0x11}, + {0x80, 0x04}, + {0x81, 0x07}, + {0x90, 0x05}, + {0x91, 0x00}, + {0x92, 0x00}, + {0x93, 0x30}, + {0x94, 0x30}, + {0x95, 0x10}, + +//Shading + {0x03, 0x14}, + {0x10, 0x01}, + {0x20, 0x7e}, + {0x21, 0x95}, + {0x22, 0x2f}, + {0x23, 0x1c}, + {0x24, 0x1f}, + +//Page 15 CMC + {0x03, 0x15}, + {0x10, 0x03}, + {0x14, 0x52}, //0802 by Sam + {0x16, 0x52}, + {0x17, 0x2d}, + {0x30, 0xfd}, + {0x31, 0xb9}, + {0x32, 0x40}, + {0x33, 0x2b}, + {0x34, 0xdd}, + {0x35, 0x33}, + {0x36, 0x07}, + {0x37, 0x3a}, + {0x38, 0x70}, +//CMC OFS + {0x40, 0xa0}, + {0x41, 0xf0}, + {0x42, 0x88}, + {0x43, 0x18}, + {0x44, 0x68}, + {0x45, 0x40}, + {0x46, 0x00}, + {0x47, 0x38}, + {0x48, 0xa0}, + +//Gamma + {0x03, 0x16}, + + {0x30, 0x00}, + {0x31, 0x0b}, + {0x32, 0x15}, + {0x33, 0x3d}, + {0x34, 0x6c}, + {0x35, 0x89}, + {0x36, 0xa0}, + {0x37, 0xb1}, + {0x38, 0xc6}, + {0x39, 0xd1}, + {0x3a, 0xda}, + {0x3b, 0xe9}, + {0x3c, 0xf5}, + {0x3d, 0xfb}, + {0x3e, 0xff}, + +/*Page 17 AE*/ + {0x03, 0x17}, + {0xc4, 0x3c}, + {0xc5, 0x32}, + +/*Page 20 AE*/ + {0x03, 0x20}, + {0x10, 0x0c}, + {0x11, 0x44}, + + {0x20, 0x01}, + {0x28, 0x27}, + {0x29, 0xa1}, + + {0x2a, 0xf0}, + {0x2b, 0x34}, + {0x2c, 0x2b}, + + {0x30, 0xf8}, + + {0x39, 0x22}, + {0x3a, 0xde}, + {0x3b, 0x22}, + {0x3c, 0xde}, + + {0x60, 0x95}, + {0x68, 0x3c}, + {0x69, 0x64}, + {0x6A, 0x28}, + {0x6B, 0xc8}, + + {0x70, 0x2c}, //For Y decay + {0x76, 0x22}, + {0x77, 0x02}, + {0x78, 0x12}, + {0x79, 0x27}, + {0x7a, 0x23}, + {0x7c, 0x1d}, + {0x7d, 0x22}, + + {0x83, 0x00}, //EXP Normal 30.00 fps + {0x84, 0xd2}, + {0x85, 0x1c}, + {0x86, 0x00}, //EXPMin 6827.73 fps + {0x87, 0xee}, + {0x88, 0x03}, //EXP Max 60hz 8.00 fps + {0x89, 0x13}, + {0x8a, 0xe9}, + {0xa0, 0x02}, //EXP Max 50hz 8.33 fps + {0xa1, 0xf6}, + {0xa2, 0xa0}, + {0x8B, 0x3f}, //EXP100 + {0x8C, 0x38}, + {0x8D, 0x34}, //EXP120 + {0x8E, 0x87}, + {0x9c, 0x06}, //EXP Limit 975.39 fps + {0x9d, 0x82}, + {0x9e, 0x00}, //EXP Unit + {0x9f, 0xee}, + {0xa3, 0x00}, //Outdoor Int + {0xa4, 0x34}, + + {0xb0, 0x3d}, + {0xb1, 0x14}, + {0xb2, 0xe1}, + + {0xb3, 0x30}, + {0xb4, 0x20}, + {0xb5, 0x50}, + {0xb6, 0x38}, + {0xb7, 0x30}, + {0xb8, 0x2c}, + {0xb9, 0x2a}, + {0xba, 0x28}, + {0xbb, 0x27}, + {0xbc, 0xa0}, + {0xbd, 0xa0}, + + {0xc0, 0x16}, //0x1a->0x16 + {0xc3, 0x48}, + {0xc4, 0x48}, + +//Page 22 AWB + {0x03, 0x22}, + {0x10, 0xe2}, + {0x11, 0x2e}, + {0x30, 0x80}, + {0x31, 0x80}, + {0x38, 0x12}, + {0x39, 0x33}, + {0x3a, 0x88}, + {0x3b, 0xc4}, + {0x40, 0xf0}, + {0x41, 0x33}, + {0x42, 0x33}, + {0x43, 0xf3}, + {0x44, 0x55}, + {0x45, 0x44}, + {0x46, 0x02}, + {0x60, 0x00}, + {0x61, 0x00}, + {0x80, 0x35}, + {0x81, 0x20}, + {0x82, 0x40}, + {0x83, 0x58}, //RMAX Default + {0x84, 0x21}, //RMIN Default + {0x85, 0x60}, //BMAX Default + {0x86, 0x25}, //BMIN Default + {0x87, 0x44}, //RMAXB Default + {0x88, 0x20}, //RMINB Default + {0x89, 0x40}, //BMAXB Default + {0x8a, 0x20}, //BMINB Default + {0x8b, 0x04}, //OUT TH + {0x8d, 0x22}, + {0x8e, 0x91}, + + {0x8f, 0x63}, //awb_slope_th0 + {0x90, 0x61}, //awb_slope_th1 + {0x91, 0x5b}, //awb_slope_th2 + {0x92, 0x52}, //awb_slope_th3 + {0x93, 0x45}, //awb_slope_th4 + {0x94, 0x3c}, //awb_slope_th5 + {0x95, 0x34}, //awb_slope_th6 + {0x96, 0x2f}, //awb_slope_th7 + {0x97, 0x28}, //awb_slope_th8 + {0x98, 0x24}, //awb_slope_th9 + {0x99, 0x21}, //awb_slope_th10 + {0x9a, 0x20}, //awb_slope_th11 + + {0x9b, 0x0f}, //awb_slope_delta1 + + {0xb0, 0x30}, + {0xb1, 0x48}, + +//{0x9b, 0x0f}, //awb_slope_delta1 + + + + {0x03, 0x17}, //Page 17 + {0xC0, 0x01}, + {0xC4, 0x3c}, //FLK200 + {0xC5, 0x32}, //FLK240 + + {0x03, 0x20}, + {0x10, 0x0c}, //AE OFF + {0x18, 0x38}, //AE RESET + + {0x83, 0x00}, //EXP Normal 30.00 fps + {0x84, 0xd2}, + {0x85, 0x1c}, + {0x86, 0x00}, //EXPMin 6827.73 fps + {0x87, 0xee}, + {0x88, 0x03}, //EXP Max 60hz 8.00 fps + {0x89, 0x13}, + {0x8a, 0xe9}, + {0xa0, 0x02}, //EXP Max 50hz 8.33 fps + {0xa1, 0xf6}, + {0xa2, 0xa0}, + {0x8B, 0x3f}, //EXP100 + {0x8C, 0x38}, + {0x8D, 0x34}, //EXP120 + {0x8E, 0x87}, + {0x9c, 0x06}, //EXP Limit 975.39 fps + {0x9d, 0x82}, + {0x9e, 0x00}, //EXP Unit + {0x9f, 0xee}, + + + + {0x83, 0x00}, //EXP Normal 30.00 fps + {0x84, 0xbe}, + {0x85, 0x6e}, + {0x86, 0x00}, //EXPMin 6827.73 fps + {0x87, 0xfa}, + {0x88, 0x02}, //EXP Max 60hz 8.00 fps + {0x89, 0xf9}, + {0x8a, 0xb8}, + {0xa0, 0x02}, //EXP Max 50hz 8.33 fps + {0xa1, 0xf8}, + {0xa2, 0xb8}, + {0x8B, 0x3f}, //EXP100 + {0x8C, 0x7a}, + {0x8D, 0x34}, //EXP120 + {0x8E, 0xbc}, + {0x9c, 0x04}, //EXP Limit 975.39 fps + {0x9d, 0x65}, + {0x9e, 0x00}, //EXP Unit + {0x9f, 0xfa}, + {0xa3, 0x00}, //Outdoor Int + {0xa4, 0x34}, + + {0x03, 0x22}, + {0x10, 0xfb}, + + {0x03, 0x20}, + {0x10, 0x8c}, + + {0x03, 0x20}, + {0x10, 0xec}, //AE ON with AFC ON + {0x18, 0x30}, + + {0x03, 0x00}, + {0x01, 0xf0}, + {0xff, 0xff}, //End of Initial Setting +}; + +static void HI704_Initial_Setting(void) +{ + kal_uint32 iEcount; + for (iEcount = 0; + (!((0xff == (HI704_Initial_Setting_Info[iEcount].address)) + && (0xff == (HI704_Initial_Setting_Info[iEcount].data)))); + iEcount++) { + HI704_write_cmos_sensor(HI704_Initial_Setting_Info + [iEcount].address, + HI704_Initial_Setting_Info + [iEcount].data); + } +} + +static void HI704_Init_Parameter(void) +{ + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.first_init = KAL_TRUE; + HI704_sensor.pv_mode = KAL_TRUE; + HI704_sensor.night_mode = KAL_FALSE; + HI704_sensor.MPEG4_Video_mode = KAL_FALSE; + + HI704_sensor.cp_pclk = HI704_sensor.pv_pclk; + + HI704_sensor.pv_dummy_pixels = 0; + HI704_sensor.pv_dummy_lines = 0; + HI704_sensor.cp_dummy_pixels = 0; + HI704_sensor.cp_dummy_lines = 0; + + HI704_sensor.wb = 0; + HI704_sensor.exposure = 0; + HI704_sensor.effect = 0; + HI704_sensor.banding = AE_FLICKER_MODE_50HZ; + + HI704_sensor.pv_line_length = 640; + HI704_sensor.pv_frame_height = 480; + HI704_sensor.cp_line_length = 640; + HI704_sensor.cp_frame_height = 480; + spin_unlock(&hi704_yuv_drv_lock); +} + +static kal_uint8 HI704_power_on(void) +{ + kal_uint8 HI704_sensor_id = 0; + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.pv_pclk = 13000000; + spin_unlock(&hi704_yuv_drv_lock); + /*Software Reset */ + HI704_write_cmos_sensor(0x01, 0xf1); + HI704_write_cmos_sensor(0x01, 0xf3); + HI704_write_cmos_sensor(0x01, 0xf1); + + /* Read Sensor ID */ + HI704_sensor_id = HI704_read_cmos_sensor(0x04); + SENSORDB("[HI704YUV]:lixing read Sensor ID:%x\n", HI704_sensor_id); + return HI704_sensor_id; + +} + +int HI704_SEN_RUN_TEST_PATTERN = 0; +#define HI704_TEST_PATTERN_CHECKSUM 0x786a9657 + +UINT32 HI704SetTestPatternMode(kal_bool bEnable) +{ + /*output color bar */ + HI704_write_cmos_sensor(0x03, 0x00); + HI704_write_cmos_sensor(0x50, 0x04); + return ERROR_NONE; +} + +/************************************************************************* +* FUNCTION +* HI704Open +* +* DESCRIPTION +* This function initialize the registers of CMOS sensor +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +UINT32 HI704Open(void) +{ + spin_lock(&hi704_yuv_drv_lock); + sensor_id_fail = 0; + spin_unlock(&hi704_yuv_drv_lock); + SENSORDB("[Enter]:HI704 Open func:"); + + if (HI704_power_on() != HI704_SENSOR_ID) { + SENSORDB("[HI704]Error:read sensor ID fail\n"); + spin_lock(&hi704_yuv_drv_lock); + sensor_id_fail = 1; + spin_unlock(&hi704_yuv_drv_lock); + return ERROR_SENSOR_CONNECT_FAIL; + } +#ifdef HI258_LOAD_FROM_T_FLASH + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static kal_uint8 fromsd; + + printk("HI258 Open File Start\n"); + fp = filp_open("/data/hi258_sd.dat", O_RDONLY, 0); + if (IS_ERR(fp)) { + fromsd = 0; + printk("open file error\n"); + } else { + printk("open file success\n"); + fromsd = 1; + filp_close(fp, NULL); + } + if (fromsd == 1) + Hi258_Initialize_from_T_Flash(); + else { + /* Apply sensor initail setting */ + HI704_Initial_Setting(); + HI704_Init_Parameter(); + } +#endif + + /* Apply sensor initail setting */ + //HI704_Initial_Setting(); + //HI704_Init_Parameter(); + + SENSORDB("[Exit]:HI704 Open func\n"); + return ERROR_NONE; +} /* HI704Open() */ + +/************************************************************************* +* FUNCTION +* HI704_GetSensorID +* +* DESCRIPTION +* This function get the sensor ID +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +#ifdef SLT_DEVINFO_CMM +#include +static struct devinfo_struct *s_DEVINFO_ccm; +#endif +static kal_uint32 HI704_GetSensorID(kal_uint32 * sensorID) +{ + SENSORDB("[Enter]:HI704 Open func "); + *sensorID = HI704_power_on(); +#ifdef SLT_DEVINFO_CMM + char mid_info = 0; + char dev_vendorlist[0x20][20] = + { "null", "sunny", "truly", "A-kerr", "LiteArray", "Darling", + "Qtech", "OFlim", "Huaquan" + }; + s_DEVINFO_ccm = + (struct devinfo_struct *)kmalloc(sizeof(struct devinfo_struct), + GFP_KERNEL); + s_DEVINFO_ccm->device_type = "CCM-S"; /*dongge 20131219 add -S sub, -M main */ + s_DEVINFO_ccm->device_module = "H5PV-W6200HQ-JDK"; /*can change if got module id */ + s_DEVINFO_ccm->device_vendor = "Huaquan"; + s_DEVINFO_ccm->device_ic = "hi708"; + s_DEVINFO_ccm->device_version = "Hynix"; + s_DEVINFO_ccm->device_info = "30W"; +#endif + + if (*sensorID != HI704_SENSOR_ID) { + SENSORDB("[HI704]Error:read sensor ID fail\n"); + spin_lock(&hi704_yuv_drv_lock); + sensor_id_fail = 1; + spin_unlock(&hi704_yuv_drv_lock); + *sensorID = 0xFFFFFFFF; +#ifdef SLT_DEVINFO_CMM + s_DEVINFO_ccm->device_used = DEVINFO_UNUSED; + devinfo_check_add_device(s_DEVINFO_ccm); +#endif + return ERROR_SENSOR_CONNECT_FAIL; + } +#ifdef SLT_DEVINFO_CMM + s_DEVINFO_ccm->device_used = DEVINFO_USED; + devinfo_check_add_device(s_DEVINFO_ccm); +#endif + return ERROR_NONE; +} /* HI704Open */ + +/************************************************************************* +* FUNCTION +* HI704Close +* +* DESCRIPTION +* This function is to turn off sensor module power. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +UINT32 HI704Close(void) +{ + + return ERROR_NONE; +} /* HI704Close() */ + +static void HI704_Set_Mirror_Flip(kal_uint8 image_mirror) +{ + /******************************************************** + * Page Mode 0: Reg 0x0011 bit[1:0] = [Y Flip : X Flip] + * 0: Off; 1: On. + *********************************************************/ + kal_uint8 temp_data; + SENSORDB("[Enter]:HI704 set Mirror_flip func:image_mirror=%d\n", + image_mirror); + HI704_write_cmos_sensor(0x03, 0x00); + temp_data = (HI704_read_cmos_sensor(0x11)); + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.mirror = temp_data; + spin_unlock(&hi704_yuv_drv_lock); + HI704_write_cmos_sensor(0x11, 0x90); + SENSORDB("[Exit]:HI704 set Mirror_flip func\n"); +} + +#if 0 +static void HI704_set_dummy(kal_uint16 dummy_pixels, kal_uint16 dummy_lines) +{ + HI704_write_cmos_sensor(0x03, 0x00); + HI704_write_cmos_sensor(0x40, ((dummy_pixels & 0x0F00)) >> 8); + HI704_write_cmos_sensor(0x41, (dummy_pixels & 0xFF)); + HI704_write_cmos_sensor(0x42, ((dummy_lines & 0xFF00) >> 8)); + HI704_write_cmos_sensor(0x43, (dummy_lines & 0xFF)); +} +#endif + +/* 640 * 480*/ +static void HI704_Set_VGA_mode(void) +{ + kal_uint32 temp; + + HI704_write_cmos_sensor(0x03, 0x00); + HI704_write_cmos_sensor(0x10, 0x00); /*VGA Size */ + + HI704_write_cmos_sensor(0x20, 0x00); + HI704_write_cmos_sensor(0x21, 0x02); //For XYFlip + HI704_write_cmos_sensor(0x22, 0x00); + HI704_write_cmos_sensor(0x23, 0x00); //For XYFlip + + + + HI704_write_cmos_sensor(0x03, 0x11); + HI704_write_cmos_sensor(0x10, 0x25); + + HI704_write_cmos_sensor(0x03, 0x20); + + HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10) & 0x7f); /*Close AE */ + HI704_write_cmos_sensor(0x03, 0x20); + HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10) | 0x80); +} + +void HI704_night_mode(kal_bool enable) +{ + SENSORDB("[Enter]HI704 night mode func:enable = %d\n", enable); + SENSORDB("HI704_sensor.video_mode = %d\n", + HI704_sensor.MPEG4_Video_mode); + SENSORDB("HI704_sensor.night_mode = %d\n", HI704_sensor.night_mode); + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.night_mode = enable; + spin_unlock(&hi704_yuv_drv_lock); + + if (HI704_sensor.MPEG4_Video_mode == KAL_TRUE) + + if (enable) { + /*HI704_Cal_Min_Frame_Rate(HI704_MIN_FRAMERATE_5); */ + HI704_write_cmos_sensor(0x03, 0x00); + HI704_write_cmos_sensor(0x01, 0xf1); + + HI704_write_cmos_sensor(0x03, 0x20); + HI704_write_cmos_sensor(0x83, 0x00); + HI704_write_cmos_sensor(0x84, 0xc3); + HI704_write_cmos_sensor(0x85, 0x3c); + HI704_write_cmos_sensor(0x86, 0x00); + HI704_write_cmos_sensor(0x87, 0xee); + HI704_write_cmos_sensor(0x88, 0x04); + HI704_write_cmos_sensor(0x89, 0xec); + HI704_write_cmos_sensor(0x8a, 0xa8); + HI704_write_cmos_sensor(0xa0, 0x04); + HI704_write_cmos_sensor(0xa1, 0xec); + HI704_write_cmos_sensor(0xa2, 0xa8); + HI704_write_cmos_sensor(0xb1, 0x14); + HI704_write_cmos_sensor(0xb2, 0xff); + + HI704_write_cmos_sensor(0x03, 0x00); + HI704_write_cmos_sensor(0x01, 0xf0); + + /* HI704_write_cmos_sensor(0x18, 0x38); */ + } else { + /*HI704_Cal_Min_Frame_Rate(HI704_MIN_FRAMERATE_10); */ + + } +} + +/************************************************************************* +* FUNCTION +* HI704Preview +* +* DESCRIPTION +* This function start the sensor preview. +* +* PARAMETERS +* *image_window : address pointer of pixel numbers in one period of HSYNC +* *sensor_config_data : address pointer of line numbers in one period of VSYNC +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static UINT32 HI704Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT * image_window, + MSDK_SENSOR_CONFIG_STRUCT * sensor_config_data) +{ + spin_lock(&hi704_yuv_drv_lock); + sensor_config_data->SensorImageMirror = IMAGE_NORMAL; + if (HI704_sensor.first_init == KAL_TRUE) { + HI704_sensor.MPEG4_Video_mode = HI704_sensor.MPEG4_Video_mode; + } else { + HI704_sensor.MPEG4_Video_mode = !HI704_sensor.MPEG4_Video_mode; + } + spin_unlock(&hi704_yuv_drv_lock); + + SENSORDB("[Enter]:HI704 preview func:"); + SENSORDB("HI704_sensor.video_mode = %d\n", + HI704_sensor.MPEG4_Video_mode); + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.first_init = KAL_FALSE; + HI704_sensor.pv_mode = KAL_TRUE; + spin_unlock(&hi704_yuv_drv_lock); + + { + SENSORDB("[HI704]preview set_VGA_mode\n"); + HI704_Set_VGA_mode(); + } + + HI704_Set_Mirror_Flip(sensor_config_data->SensorImageMirror); + + SENSORDB("[Exit]:HI704 preview func\n"); + return TRUE; +} /* HI704_Preview */ + +UINT32 HI704Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT * image_window, + MSDK_SENSOR_CONFIG_STRUCT * sensor_config_data) +{ + SENSORDB("[HI704][Enter]HI704_capture_func\n"); + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.pv_mode = KAL_FALSE; + spin_unlock(&hi704_yuv_drv_lock); + + return ERROR_NONE; +} /* HM3451Capture() */ + +UINT32 HI704GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT * + pSensorResolution) +{ + SENSORDB("[Enter]:HI704 get Resolution func\n"); + + pSensorResolution->SensorFullWidth = HI704_IMAGE_SENSOR_FULL_WIDTH - 10; + pSensorResolution->SensorFullHeight = + HI704_IMAGE_SENSOR_FULL_HEIGHT - 10 - 10; + pSensorResolution->SensorPreviewWidth = + HI704_IMAGE_SENSOR_PV_WIDTH - 16; + pSensorResolution->SensorPreviewHeight = + HI704_IMAGE_SENSOR_PV_HEIGHT - 12 - 10; + pSensorResolution->SensorVideoWidth = HI704_IMAGE_SENSOR_PV_WIDTH - 16; + pSensorResolution->SensorVideoHeight = + HI704_IMAGE_SENSOR_PV_HEIGHT - 12 - 10; + pSensorResolution->Sensor3DFullWidth = + HI704_IMAGE_SENSOR_FULL_WIDTH - 10; + pSensorResolution->Sensor3DFullHeight = + HI704_IMAGE_SENSOR_FULL_HEIGHT - 10 - 10; + pSensorResolution->Sensor3DPreviewWidth = + HI704_IMAGE_SENSOR_PV_WIDTH - 16; + pSensorResolution->Sensor3DPreviewHeight = + HI704_IMAGE_SENSOR_PV_HEIGHT - 12 - 10; + pSensorResolution->Sensor3DVideoWidth = + HI704_IMAGE_SENSOR_PV_WIDTH - 16; + pSensorResolution->Sensor3DVideoHeight = + HI704_IMAGE_SENSOR_PV_HEIGHT - 12 - 10; + + SENSORDB("[Exit]:HI704 get Resolution func\n"); + return ERROR_NONE; +} /* HI704GetResolution() */ + +UINT32 HI704GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT * pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT * pSensorConfigData) +{ + SENSORDB("[Enter]:HI704 getInfo func:ScenarioId = %d\n", ScenarioId); + + pSensorInfo->SensorPreviewResolutionX = HI704_IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY = HI704_IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX = HI704_IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY = HI704_IMAGE_SENSOR_FULL_HEIGHT; + + pSensorInfo->SensorCameraPreviewFrameRate = 30; + pSensorInfo->SensorVideoFrameRate = 30; + pSensorInfo->SensorStillCaptureFrameRate = 30; + pSensorInfo->SensorWebCamCaptureFrameRate = 15; + pSensorInfo->SensorResetActiveHigh = FALSE; + pSensorInfo->SensorResetDelayCount = 4; + pSensorInfo->SensorOutputDataFormat = SENSOR_OUTPUT_FORMAT_YUYV; /*SENSOR_OUTPUT_FORMAT_YVYU; */ + pSensorInfo->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorInterruptDelayLines = 1; + pSensorInfo->SensroInterfaceType = SENSOR_INTERFACE_TYPE_PARALLEL; + + pSensorInfo->CaptureDelayFrame = 4; + pSensorInfo->PreviewDelayFrame = 8; + pSensorInfo->VideoDelayFrame = 0; + pSensorInfo->SensorMasterClockSwitch = 0; + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; + + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: + case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: + pSensorInfo->SensorClockFreq = 26; + pSensorInfo->SensorClockDividCount = 3; + pSensorInfo->SensorClockRisingCount = 0; + pSensorInfo->SensorClockFallingCount = 2; + pSensorInfo->SensorPixelClockCount = 3; + pSensorInfo->SensorDataLatchCount = 2; + pSensorInfo->SensorGrabStartX = 1; + pSensorInfo->SensorGrabStartY = 10; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: + pSensorInfo->SensorClockFreq = 26; + pSensorInfo->SensorClockDividCount = 3; + pSensorInfo->SensorClockRisingCount = 0; + pSensorInfo->SensorClockFallingCount = 2; + pSensorInfo->SensorPixelClockCount = 3; + pSensorInfo->SensorDataLatchCount = 2; + pSensorInfo->SensorGrabStartX = 1; + pSensorInfo->SensorGrabStartY = 10; + break; + default: + pSensorInfo->SensorClockFreq = 26; + pSensorInfo->SensorClockDividCount = 3; + pSensorInfo->SensorClockRisingCount = 0; + pSensorInfo->SensorClockFallingCount = 2; + pSensorInfo->SensorPixelClockCount = 3; + pSensorInfo->SensorDataLatchCount = 2; + pSensorInfo->SensorGrabStartX = 1; + pSensorInfo->SensorGrabStartY = 10; + break; + } + memcpy(pSensorConfigData, &HI704SensorConfigData, + sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + + SENSORDB("[Exit]:HI704 getInfo func\n"); + return ERROR_NONE; +} /* HI704GetInfo() */ + +UINT32 HI704Control(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT * pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT * pSensorConfigData) +{ + SENSORDB("[Enter]:HI704 Control func:ScenarioId = %d\n", ScenarioId); + + switch (ScenarioId) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + /*case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: */ + /*case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: */ + HI704Preview(pImageWindow, pSensorConfigData); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + /*case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: */ + HI704Capture(pImageWindow, pSensorConfigData); + break; + default: + break; + } + + SENSORDB("[Exit]:HI704 Control func\n"); + return TRUE; +} /* HI704Control() */ + +/************************************************************************* +* FUNCTION +* HI704_set_param_wb +* +* DESCRIPTION +* wb setting. +* +* PARAMETERS +* none +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +BOOL HI704_set_param_wb(UINT16 para) +{ + /*This sensor need more time to balance AWB, */ + /*we suggest higher fps or drop some frame to avoid garbage color when preview initial */ + SENSORDB("[Enter]HI704 set_param_wb func:para = %d\n", para); + + if (HI704_sensor.wb == para) + return KAL_TRUE; + + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.wb = para; + spin_unlock(&hi704_yuv_drv_lock); + + switch (para) { + case AWB_MODE_AUTO: + { + HI704_write_cmos_sensor(0x03, 0x22); + HI704_write_cmos_sensor(0x11, 0x2e); + HI704_write_cmos_sensor(0x83, 0x58); + HI704_write_cmos_sensor(0x84, 0x21); + HI704_write_cmos_sensor(0x85, 0x60); + HI704_write_cmos_sensor(0x86, 0x25); + HI704_write_cmos_sensor(0x10, 0xfb); + } + break; + case AWB_MODE_CLOUDY_DAYLIGHT: + { + HI704_write_cmos_sensor(0x03, 0x22); + HI704_write_cmos_sensor(0x10, 0x6a); + HI704_write_cmos_sensor(0x80, 0x50); + HI704_write_cmos_sensor(0x81, 0x20); + HI704_write_cmos_sensor(0x82, 0x24); + HI704_write_cmos_sensor(0x83, 0x65); + HI704_write_cmos_sensor(0x84, 0x45); + HI704_write_cmos_sensor(0x85, 0x2a); + HI704_write_cmos_sensor(0x86, 0x1c); + HI704_write_cmos_sensor(0x10, 0xfb); + } + break; + case AWB_MODE_DAYLIGHT: + { + HI704_write_cmos_sensor(0x03, 0x22); + HI704_write_cmos_sensor(0x11, 0x28); + HI704_write_cmos_sensor(0x80, 0x59); + HI704_write_cmos_sensor(0x82, 0x29); + HI704_write_cmos_sensor(0x83, 0x60); + HI704_write_cmos_sensor(0x84, 0x50); + HI704_write_cmos_sensor(0x85, 0x2f); + HI704_write_cmos_sensor(0x86, 0x23); + HI704_write_cmos_sensor(0x10, 0xfb); + } + break; + case AWB_MODE_INCANDESCENT: + { + HI704_write_cmos_sensor(0x03, 0x22); + HI704_write_cmos_sensor(0x11, 0x28); + HI704_write_cmos_sensor(0x80, 0x29); + HI704_write_cmos_sensor(0x82, 0x54); + HI704_write_cmos_sensor(0x83, 0x2e); + HI704_write_cmos_sensor(0x84, 0x23); + HI704_write_cmos_sensor(0x85, 0x58); + HI704_write_cmos_sensor(0x86, 0x4f); + HI704_write_cmos_sensor(0x10, 0xfb); + } + break; + case AWB_MODE_FLUORESCENT: + { + HI704_write_cmos_sensor(0x03, 0x22); + HI704_write_cmos_sensor(0x11, 0x28); + HI704_write_cmos_sensor(0x80, 0x41); + HI704_write_cmos_sensor(0x82, 0x42); + HI704_write_cmos_sensor(0x83, 0x44); + HI704_write_cmos_sensor(0x84, 0x34); + HI704_write_cmos_sensor(0x85, 0x46); + HI704_write_cmos_sensor(0x86, 0x3a); + HI704_write_cmos_sensor(0x10, 0xfb); + } + break; + case AWB_MODE_TUNGSTEN: + { + HI704_write_cmos_sensor(0x03, 0x22); + HI704_write_cmos_sensor(0x80, 0x24); + HI704_write_cmos_sensor(0x81, 0x20); + HI704_write_cmos_sensor(0x82, 0x58); + HI704_write_cmos_sensor(0x83, 0x27); + HI704_write_cmos_sensor(0x84, 0x22); + HI704_write_cmos_sensor(0x85, 0x58); + HI704_write_cmos_sensor(0x86, 0x52); + HI704_write_cmos_sensor(0x10, 0xfb); + } + break; + case AWB_MODE_OFF: + { + SENSORDB("HI704 AWB OFF"); + HI704_write_cmos_sensor(0x03, 0x22); + HI704_write_cmos_sensor(0x10, 0xe2); + } + break; + default: + return FALSE; + } + + return TRUE; +} /* HI704_set_param_wb */ + +/************************************************************************* +* FUNCTION +* HI704_set_param_effect +* +* DESCRIPTION +* effect setting. +* +* PARAMETERS +* none +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +BOOL HI704_set_param_effect(UINT16 para) +{ + SENSORDB("[Enter]HI704 set_param_effect func:para = %d\n", para); + + if (HI704_sensor.effect == para) + return KAL_TRUE; + + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.effect = para; + spin_unlock(&hi704_yuv_drv_lock); + + switch (para) { + case MEFFECT_OFF: + { + HI704_write_cmos_sensor(0x03, 0x10); + HI704_write_cmos_sensor(0x11, 0x03); + HI704_write_cmos_sensor(0x12, 0x30); + HI704_write_cmos_sensor(0x13, 0x00); + HI704_write_cmos_sensor(0x44, 0x80); + HI704_write_cmos_sensor(0x45, 0x80); + + HI704_write_cmos_sensor(0x47, 0x7f); + HI704_write_cmos_sensor(0x03, 0x13); + HI704_write_cmos_sensor(0x20, 0x07); + HI704_write_cmos_sensor(0x21, 0x07); + } + break; + case MEFFECT_SEPIA: + { + HI704_write_cmos_sensor(0x03, 0x10); + HI704_write_cmos_sensor(0x11, 0x03); + HI704_write_cmos_sensor(0x12, 0x23); + HI704_write_cmos_sensor(0x13, 0x00); + HI704_write_cmos_sensor(0x44, 0x70); + HI704_write_cmos_sensor(0x45, 0x98); + + HI704_write_cmos_sensor(0x47, 0x7f); + HI704_write_cmos_sensor(0x03, 0x13); + HI704_write_cmos_sensor(0x20, 0x07); + HI704_write_cmos_sensor(0x21, 0x07); + } + break; + case MEFFECT_NEGATIVE: + { + HI704_write_cmos_sensor(0x03, 0x10); + HI704_write_cmos_sensor(0x11, 0x03); + HI704_write_cmos_sensor(0x12, 0x08); + HI704_write_cmos_sensor(0x13, 0x00); + HI704_write_cmos_sensor(0x14, 0x00); + } + break; + case MEFFECT_SEPIAGREEN: + { + HI704_write_cmos_sensor(0x03, 0x10); + HI704_write_cmos_sensor(0x11, 0x03); + HI704_write_cmos_sensor(0x12, 0x03); + HI704_write_cmos_sensor(0x13, 0x00); + HI704_write_cmos_sensor(0x44, 0x30); + HI704_write_cmos_sensor(0x45, 0x50); + } + break; + case MEFFECT_SEPIABLUE: + { + HI704_write_cmos_sensor(0x03, 0x10); + HI704_write_cmos_sensor(0x11, 0x03); + HI704_write_cmos_sensor(0x12, 0x03); + HI704_write_cmos_sensor(0x13, 0x00); + HI704_write_cmos_sensor(0x44, 0xb0); + HI704_write_cmos_sensor(0x45, 0x40); + } + break; + case MEFFECT_MONO: + { + HI704_write_cmos_sensor(0x03, 0x10); + HI704_write_cmos_sensor(0x11, 0x03); + HI704_write_cmos_sensor(0x12, 0x03); + HI704_write_cmos_sensor(0x44, 0x80); + HI704_write_cmos_sensor(0x45, 0x80); + } + break; + default: + return KAL_FALSE; + } + + return KAL_TRUE; +} /* HI704_set_param_effect */ + +/************************************************************************* +* FUNCTION +* HI704_set_param_banding +* +* DESCRIPTION +* banding setting. +* +* PARAMETERS +* none +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +BOOL HI704_set_param_banding(UINT16 para) +{ + SENSORDB("[Enter]HI704 set_param_banding func:para = %d\n", para); + + if (HI704_sensor.banding == para) + return KAL_TRUE; + + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.banding = para; + spin_unlock(&hi704_yuv_drv_lock); + + switch (para) { + case AE_FLICKER_MODE_50HZ: + { + HI704_write_cmos_sensor(0x03, 0x20); + HI704_write_cmos_sensor(0x10, 0x9c); + } + break; + case AE_FLICKER_MODE_60HZ: + { + HI704_write_cmos_sensor(0x03, 0x20); + HI704_write_cmos_sensor(0x10, 0x8c); + } + break; + default: + return KAL_FALSE; + } + + return KAL_TRUE; +} /* HI704_set_param_banding */ + +/************************************************************************* +* FUNCTION +* HI704_set_param_exposure +* +* DESCRIPTION +* exposure setting. +* +* PARAMETERS +* none +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +BOOL HI704_set_param_exposure(UINT16 para) +{ + SENSORDB("[Enter]HI704 set_param_exposure func:para = %d\n", para); + + if (HI704_sensor.exposure == para) + return KAL_TRUE; + + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.exposure = para; + spin_unlock(&hi704_yuv_drv_lock); + + HI704_write_cmos_sensor(0x03, 0x10); + HI704_write_cmos_sensor(0x12, HI704_read_cmos_sensor(0x12) | 0x10); + switch (para) { + case AE_EV_COMP_13: /*+4 EV */ + HI704_write_cmos_sensor(0x40, 0x60); + break; + case AE_EV_COMP_10: /*+3 EV */ + HI704_write_cmos_sensor(0x40, 0x48); + break; + case AE_EV_COMP_07: /*+2 EV */ + HI704_write_cmos_sensor(0x40, 0x30); + break; + case AE_EV_COMP_03: /* +1 EV */ + HI704_write_cmos_sensor(0x40, 0x18); + break; + case AE_EV_COMP_00: /* +0 EV */ + HI704_write_cmos_sensor(0x40, 0x80); + break; + case AE_EV_COMP_n03: + /*-1 EV*/ + HI704_write_cmos_sensor(0x40, 0x98); + break; + case AE_EV_COMP_n07: + /*-2 EV */ + HI704_write_cmos_sensor(0x40, 0xb0); + break; + case AE_EV_COMP_n10: + /*-3 EV*/ + HI704_write_cmos_sensor(0x40, 0xc8); + break; + case AE_EV_COMP_n13: + /*-4 EV*/ + HI704_write_cmos_sensor(0x40, 0xe0); + break; + default: + return FALSE; + } + + return TRUE; +} /* HI704_set_param_exposure */ + +void HI704_set_AE_mode(UINT32 iPara) +{ + UINT8 temp_AE_reg = 0; + SENSORDB("HI704_set_AE_mode = %d E \n", iPara); + HI704_write_cmos_sensor(0x03, 0x20); + temp_AE_reg = HI704_read_cmos_sensor(0x10); + + if (AE_MODE_OFF == iPara) { + /* turn off AEC/AGC */ + HI704_write_cmos_sensor(0x10, temp_AE_reg & ~0x10); + } else { + HI704_write_cmos_sensor(0x10, temp_AE_reg | 0x10); + } +} + +UINT32 HI704YUVSensorSetting(FEATURE_ID iCmd, UINT32 iPara) +{ + SENSORDB("[Enter]HI704YUVSensorSetting func:cmd = %d\n", iCmd); + + switch (iCmd) { + case FID_SCENE_MODE: + if (iPara == SCENE_MODE_OFF) { + HI704_night_mode(FALSE); + } else if (iPara == SCENE_MODE_NIGHTSCENE) { + HI704_night_mode(TRUE); + } + break; + case FID_AWB_MODE: + HI704_set_param_wb(iPara); + break; + case FID_COLOR_EFFECT: + HI704_set_param_effect(iPara); + break; + case FID_AE_EV: + HI704_set_param_exposure(iPara); + break; + case FID_AE_FLICKER: + HI704_set_param_banding(iPara); + break; + case FID_ZOOM_FACTOR: + spin_lock(&hi704_yuv_drv_lock); + HI704_zoom_factor = iPara; + spin_unlock(&hi704_yuv_drv_lock); + break; + case FID_AE_SCENE_MODE: + HI704_set_AE_mode(iPara); + break; + default: + break; + } + return TRUE; +} /* HI704YUVSensorSetting */ + +UINT32 HI704YUVSetVideoMode(UINT16 u2FrameRate) +{ + spin_lock(&hi704_yuv_drv_lock); + HI704_sensor.MPEG4_Video_mode = KAL_TRUE; + spin_unlock(&hi704_yuv_drv_lock); + SENSORDB("[Enter]HI704 Set Video Mode:FrameRate= %d\n", u2FrameRate); + SENSORDB("HI704_sensor.video_mode = %d\n", + HI704_sensor.MPEG4_Video_mode); + + if (u2FrameRate == 30) + u2FrameRate = 20; + + spin_lock(&hi704_yuv_drv_lock); + /*HI704_sensor.fix_framerate = u2FrameRate * 10; */ + spin_unlock(&hi704_yuv_drv_lock); + + if (HI704_sensor.fix_framerate <= 300) { + /*HI704_Fix_Video_Frame_Rate(HI704_sensor.fix_framerate); */ + } else { + SENSORDB("Wrong Frame Rate"); + } + + return TRUE; +} + +void HI704GetAFMaxNumFocusAreas(UINT32 * pFeatureReturnPara32) +{ + *pFeatureReturnPara32 = 0; + SENSORDB("HI704GetAFMaxNumFocusAreas *pFeatureReturnPara32 = %d\n", + *pFeatureReturnPara32); +} + +void HI704GetAEMaxNumMeteringAreas(UINT32 * pFeatureReturnPara32) +{ + *pFeatureReturnPara32 = 0; + SENSORDB("HI704GetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %d\n", + *pFeatureReturnPara32); +} + +void HI704GetExifInfo(UINT32 exifAddr) +{ + HI704_Read_Shutter(); + SENSOR_EXIF_INFO_STRUCT *pExifInfo = + (SENSOR_EXIF_INFO_STRUCT *) exifAddr; + + //pExifInfo->RealISOValue = GC0312ExifInfo.RealISOValue; + //pExifInfo->AWBMode = GC0312ExifInfo.AWBMode; + pExifInfo->RealISOValue = HI704ExifInfo.RealISOValue; + pExifInfo->CapExposureTime = HI704ExifInfo.CapExposureTime * 1000; + + printk("HYNIXExifInfo.RealISOValue is %d", HI704ExifInfo.RealISOValue); + printk("HYNIXExifInfo.CapExposureTime is %d", + HI704ExifInfo.CapExposureTime); +} + +UINT32 HI704FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 * pFeaturePara, UINT32 * pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16 = (UINT16 *) pFeaturePara; + UINT16 *pFeatureData16 = (UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32 = (UINT32 *) pFeaturePara; + UINT32 *pFeatureData32 = (UINT32 *) pFeaturePara; + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData = + (MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData = + (MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + + switch (FeatureId) { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++ = HI704_IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16 = HI704_IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PERIOD: + *pFeatureReturnPara16++ = HI704_IMAGE_SENSOR_PV_WIDTH; + *pFeatureReturnPara16 = HI704_IMAGE_SENSOR_PV_HEIGHT; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + /*pFeatureReturnPara32 = HI704_sensor_pclk/10; */ + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_ESHUTTER: + + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + HI704_night_mode((BOOL) * pFeatureData16); + break; + case SENSOR_FEATURE_SET_GAIN: + break; + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + break; + case SENSOR_FEATURE_SET_REGISTER: + HI704_write_cmos_sensor(pSensorRegData->RegAddr, + pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = + HI704_read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pSensorConfigData, &HI704SensorConfigData, + sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + *pFeatureParaLen = sizeof(MSDK_SENSOR_CONFIG_STRUCT); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + case SENSOR_FEATURE_GET_CCT_REGISTER: + case SENSOR_FEATURE_SET_ENG_REGISTER: + case SENSOR_FEATURE_GET_ENG_REGISTER: + case SENSOR_FEATURE_GET_REGISTER_DEFAULT: + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + case SENSOR_FEATURE_GET_GROUP_INFO: + case SENSOR_FEATURE_GET_ITEM_INFO: + case SENSOR_FEATURE_SET_ITEM_INFO: + case SENSOR_FEATURE_GET_ENG_INFO: + break; + case SENSOR_FEATURE_GET_GROUP_COUNT: + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + HI704SetTestPatternMode((BOOL) * pFeatureData16); + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + *pFeatureReturnPara32 = LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_SET_YUV_CMD: + HI704YUVSensorSetting((FEATURE_ID) * pFeatureData32, + *(pFeatureData32 + 1)); + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + HI704YUVSetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + HI704_GetSensorID(pFeatureData32); + break; + case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: + HI704GetAFMaxNumFocusAreas(pFeatureReturnPara32); + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: + HI704GetAEMaxNumMeteringAreas(pFeatureReturnPara32); + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_EXIF_INFO: + SENSORDB("SENSOR_FEATURE_GET_EXIF_INFO\n"); + SENSORDB("EXIF addr = 0x%x\n", *pFeatureData32); + HI704GetExifInfo(*pFeatureData32); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: + *pFeatureReturnPara32 = HI704_TEST_PATTERN_CHECKSUM; + *pFeatureParaLen = 4; + break; + default: + break; + } + return ERROR_NONE; +} /* HI704FeatureControl() */ + +SENSOR_FUNCTION_STRUCT SensorFuncHI704 = { + HI704Open, + HI704GetInfo, + HI704GetResolution, + HI704FeatureControl, + HI704Control, + HI704Close +}; + +UINT32 HI704_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT * pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc != NULL) + *pfFunc = &SensorFuncHI704; + + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Sensor.h new file mode 100644 index 00000000000..d08fa99a40a --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/hi704yuv_Sensor.h @@ -0,0 +1,133 @@ +/***************************************************************************** + * + * Filename: + * --------- + * sensor.h + * + * Project: + * -------- + * DUMA + * + * Description: + * ------------ + * Header file of Sensor driver + * + * + * Author: + * ------- + * PC Huang (MTK02204) + * + *============================================================================ + * HISTORY + * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + * $Revision:$ + * $Modtime:$ + * $Log:$ + * + * 07 11 2011 jun.pei + * [ALPS00059464] hi704 sensor check in + * . + * + * + * + *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! + *============================================================================ + ****************************************************************************/ +/* SENSOR FULL SIZE */ +#ifndef __SENSOR_H +#define __SENSOR_H + + /*follow is define by jun*/ + /* SENSOR READ/WRITE ID */ + +#define HI704_IMAGE_SENSOR_QVGA_WIDTH (320) +#define HI704_IMAGE_SENSOR_QVGA_HEIGHT (240) +#define HI704_IMAGE_SENSOR_VGA_WIDTH (640) +#define HI704_IMAGE_SENSOR_VGA_HEIGHT (480) +#define HI704_IMAGE_SENSOR_SXGA_WIDTH (1280) +#define HI704_IMAGE_SENSOR_SXGA_HEIGHT (1024) + +#define HI704_IMAGE_SENSOR_FULL_WIDTH HI704_IMAGE_SENSOR_VGA_WIDTH +#define HI704_IMAGE_SENSOR_FULL_HEIGHT HI704_IMAGE_SENSOR_VGA_HEIGHT + +#define HI704_IMAGE_SENSOR_PV_WIDTH HI704_IMAGE_SENSOR_VGA_WIDTH +#define HI704_IMAGE_SENSOR_PV_HEIGHT HI704_IMAGE_SENSOR_VGA_HEIGHT + +/*SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD*/ +#define HI704_VGA_DEFAULT_PIXEL_NUMS (656) +#define HI704_VGA_DEFAULT_LINE_NUMS (500) + +#define HI704_QVGA_DEFAULT_PIXEL_NUMS (656) +#define HI704_QVGA_DEFAULT_LINE_NUMS (254) + +/* MAX/MIN FRAME RATE (FRAMES PER SEC.) */ +#define HI704_MIN_FRAMERATE_5 (50) +#define HI704_MIN_FRAMERATE_7_5 (75) +#define HI704_MIN_FRAMERATE_10 (100) +#define HI704_MIN_FRAMERATE_15 (150) + +/*Video Fixed Framerate*/ +#define HI704_VIDEO_FIX_FRAMERATE_5 (50) +#define HI704_VIDEO_FIX_FRAMERATE_7_5 (75) +#define HI704_VIDEO_FIX_FRAMERATE_10 (100) +#define HI704_VIDEO_FIX_FRAMERATE_15 (150) +#define HI704_VIDEO_FIX_FRAMERATE_20 (200) +#define HI704_VIDEO_FIX_FRAMERATE_25 (250) +#define HI704_VIDEO_FIX_FRAMERATE_30 (300) + +#define HI704_WRITE_ID 0x60 +#define HI704_READ_ID 0x61 + +/*#define HI704_SCCB_SLAVE_ADDR 0x60*/ + +typedef struct _SENSOR_INIT_INFO { + kal_uint8 address; + kal_uint8 data; +} HI704_SENSOR_INIT_INFO; +typedef enum __VIDEO_MODE__ { + HI704_VIDEO_NORMAL = 0, + HI704_VIDEO_MPEG4, + HI704_VIDEO_MAX +} HI704_VIDEO_MODE; + +struct HI704_sensor_STRUCT { + kal_bool first_init; + kal_bool pv_mode; /*True: Preview Mode; False: Capture Mode*/ + kal_bool night_mode;/*True: Night Mode; False: Auto Mode*/ + kal_bool MPEG4_Video_mode;/*Video Mode: MJPEG or MPEG4*/ + kal_uint8 mirror; + kal_uint32 pv_pclk; /*Preview Pclk*/ + kal_uint32 cp_pclk; /*Capture Pclk*/ + kal_uint16 pv_dummy_pixels; /*Dummy Pixels*/ + kal_uint16 pv_dummy_lines; /*Dummy Lines*/ + kal_uint16 cp_dummy_pixels; /*Dummy Pixels*/ + kal_uint16 cp_dummy_lines; /*Dummy Lines*/ + kal_uint16 fix_framerate; /*Fixed Framerate*/ + kal_uint32 wb; + kal_uint32 exposure; + kal_uint32 effect; + kal_uint32 banding; + kal_uint16 pv_line_length; + kal_uint16 pv_frame_height; + kal_uint16 cp_line_length; + kal_uint16 cp_frame_height; + kal_uint16 video_current_frame_rate; +}; + +/*export functions*/ +UINT32 HI704Open(void); +UINT32 HI704GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT * + pSensorResolution); +UINT32 HI704GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 HI704Control(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 HI704FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara, UINT32 *pFeatureParaLen); +UINT32 HI704Close(void); + +#endif /* __SENSOR_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Sensor.c deleted file mode 100644 index 0052ed682a4..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Sensor.c +++ /dev/null @@ -1,2409 +0,0 @@ - -/* Copyright Statement: - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. The information contained herein - * is confidential and proprietary to MediaTek Inc. and/or its licensors. - * Without the prior written permission of MediaTek inc. and/or its licensors, - * any reproduction, modification, use or disclosure of MediaTek Software, - * and information contained herein, in whole or in part, shall be strictly prohibited. - */ -/* MediaTek Inc. (C) 2010. All rights reserved. - * - * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES - * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") - * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON - * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE - * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR - * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH - * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES - * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES - * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK - * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR - * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND - * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, - * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, - * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO - * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - * - * The following software/firmware and/or related documentation ("MediaTek Software") - * have been modified by MediaTek Inc. All revisions are subject to any receiver's - * applicable license agreements with MediaTek Inc. - */ - - -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************//***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * PC Huang (MTK02204) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 07 11 2011 jun.pei - * [ALPS00059464] hi708 sensor check in - * . - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -//#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" -#include "kd_camera_feature.h" - -#include "hi708yuv_Sensor.h" -#include "hi708yuv_Camera_Sensor_para.h" -#include "hi708yuv_CameraCustomized.h" - -#define HI708YUV_DEBUG -#ifdef HI708YUV_DEBUG -#define SENSORDB printk -#else - -#define SENSORDB(x,...) -#endif - -#if 0 -extern int iReadReg(u16 a_u2Addr , u8 * a_puBuff , u16 i2cId); -extern int iWriteReg(u16 a_u2Addr , u32 a_u4Data , u32 a_u4Bytes , u16 i2cId); -static int sensor_id_fail = 0; -#define HI708_write_cmos_sensor(addr, para) iWriteReg((u16) addr , (u32) para ,1,HI708_WRITE_ID) -#define HI708_write_cmos_sensor_2(addr, para, bytes) iWriteReg((u16) addr , (u32) para ,bytes,HI708_WRITE_ID) -kal_uint16 HI708_read_cmos_sensor(kal_uint32 addr) -{ -kal_uint16 get_byte=0; - iReadReg((u16) addr ,(u8*)&get_byte,HI708_WRITE_ID); - return get_byte; -} - -#endif - -#if defined(DTV_NMI5625) || defined(ATV_NMI168H) -extern bool g_bIsAtvStart; -#endif - -static DEFINE_SPINLOCK(hi708_yuv_drv_lock); - -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); -kal_uint16 HI708_write_cmos_sensor(kal_uint8 addr, kal_uint8 para) -{ - char puSendCmd[2] = {(char)(addr & 0xFF) , (char)(para & 0xFF)}; - iWriteRegI2C(puSendCmd , 2,HI708_WRITE_ID); - return 0; -} -kal_uint16 HI708_read_cmos_sensor(kal_uint8 addr) -{ - kal_uint16 get_byte=0; - char puSendCmd = { (char)(addr & 0xFF) }; - iReadRegI2C(&puSendCmd , 1, (u8*)&get_byte,1,HI708_WRITE_ID); - return get_byte; -} - -#define HI708_LOAD_FROM_T_FLASH -#ifdef HI708_LOAD_FROM_T_FLASH - -static kal_uint8 fromsd = 0; -kal_uint16 HI708_write_cmos_sensor(kal_uint8 addr, kal_uint8 para); - -#define HI708_OP_CODE_INI 0x00 /* Initial value. */ -#define HI708_OP_CODE_REG 0x01 /* Register */ -#define HI708_OP_CODE_DLY 0x02 /* Delay */ -#define HI708_OP_CODE_END 0x03 /* End of initial setting. */ - - typedef struct - { - u16 init_reg; - u16 init_val; /* Save the register value and delay tick */ - u8 op_code; /* 0 - Initial value, 1 - Register, 2 - Delay, 3 - End of setting. */ - } HI708_initial_set_struct; - - HI708_initial_set_struct HI708_Init_Reg[1000]; - - u32 strtol(const char *nptr, u8 base) - { - u8 ret; - if(!nptr || (base!=16 && base!=10 && base!=8)) - { - printk("%s(): NULL pointer input\n", __FUNCTION__); - return -1; - } - for(ret=0; *nptr; nptr++) - { - if((base==16 && *nptr>='A' && *nptr<='F') || - (base==16 && *nptr>='a' && *nptr<='f') || - (base>=10 && *nptr>='0' && *nptr<='9') || - (base>=8 && *nptr>='0' && *nptr<='7') ) - { - ret *= base; - if(base==16 && *nptr>='A' && *nptr<='F') - ret += *nptr-'A'+10; - else if(base==16 && *nptr>='a' && *nptr<='f') - ret += *nptr-'a'+10; - else if(base>=10 && *nptr>='0' && *nptr<='9') - ret += *nptr-'0'; - else if(base>=8 && *nptr>='0' && *nptr<='7') - ret += *nptr-'0'; - } - else - return ret; - } - return ret; - } - - u8 Hi708_Initialize_from_T_Flash() - { - //FS_HANDLE fp = -1; /* Default, no file opened. */ - //u8 *data_buff = NULL; - u8 *curr_ptr = NULL; - u32 file_size = 0; - //u32 bytes_read = 0; - u32 i = 0, j = 0; - u8 func_ind[4] = {0}; /* REG or DLY */ - - - struct file *fp; - mm_segment_t fs; - loff_t pos = 0; - static u8 data_buff[10*1024] ; - - fp = filp_open("/storage/sdcard0/hi708_sd.dat", O_RDONLY , 0); - if (IS_ERR(fp)) { - printk("create file error\n"); - return 2;//-1; - } - else - printk("Hi708_Initialize_from_T_Flash Open File Success\n"); - - fs = get_fs(); - set_fs(KERNEL_DS); - - file_size = vfs_llseek(fp, 0, SEEK_END); - vfs_read(fp, data_buff, file_size, &pos); - filp_close(fp, NULL); - set_fs(fs); - - printk("1\n"); - - /* Start parse the setting witch read from t-flash. */ - curr_ptr = data_buff; - while (curr_ptr < (data_buff + file_size)) - { - while ((*curr_ptr == ' ') || (*curr_ptr == '\t'))/* Skip the Space & TAB */ - curr_ptr++; - - if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '*')) - { - while (!(((*curr_ptr) == '*') && ((*(curr_ptr + 1)) == '/'))) - { - curr_ptr++; /* Skip block comment code. */ - } - - while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) - { - curr_ptr++; - } - - curr_ptr += 2; /* Skip the enter line */ - - continue ; - } - - if (((*curr_ptr) == '/') || ((*curr_ptr) == '{') || ((*curr_ptr) == '}')) /* Comment line, skip it. */ - { - while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) - { - curr_ptr++; - } - - curr_ptr += 2; /* Skip the enter line */ - - continue ; - } - /* This just content one enter line. */ - if (((*curr_ptr) == 0x0D) && ((*(curr_ptr + 1)) == 0x0A)) - { - curr_ptr += 2; - continue ; - } - //printk(" curr_ptr1 = %s\n",curr_ptr); - memcpy(func_ind, curr_ptr, 3); - - if (strcmp((const char *)func_ind, "REG") == 0) /* REG */ - { - curr_ptr += 6; /* Skip "REG(0x" or "DLY(" */ - HI708_Init_Reg[i].op_code = HI708_OP_CODE_REG; - - HI708_Init_Reg[i].init_reg = strtol((const char *)curr_ptr, 16); - curr_ptr += 5; /* Skip "00, 0x" */ - - HI708_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 16); - curr_ptr += 4; /* Skip "00);" */ - } - else /* DLY */ - { - /* Need add delay for this setting. */ - curr_ptr += 4; - HI708_Init_Reg[i].op_code = HI708_OP_CODE_DLY; - - HI708_Init_Reg[i].init_reg = 0xFF; - HI708_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 10); /* Get the delay ticks, the delay should less then 50 */ - } - i++; - - /* Skip to next line directly. */ - while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) - { - curr_ptr++; - } - curr_ptr += 2; - } - printk("2\n"); - /* (0xFFFF, 0xFFFF) means the end of initial setting. */ - HI708_Init_Reg[i].op_code = HI708_OP_CODE_END; - HI708_Init_Reg[i].init_reg = 0xFF; - HI708_Init_Reg[i].init_val = 0xFF; - i++; - //for (j=0; j 0x40: For Max Framerate = 30fps -//BLC -{0x80,0x2e}, -{0x81,0x7e}, -{0x82,0x90}, -{0x83,0x30}, -{0x84,0x20}, -{0x85,0x0b}, -{0x89,0x48},//BLChold -{0x90,0x0e}, -{0x91,0x0e}, - -{0x92,0x40},//AG_IN -{0x93,0x38},//AG_OUT -{0x98,0x20}, -{0x99,0x43},//OutBLC -{0xa0,0x43},//DarkBLC -{0xa8,0x43},//NormalBLC - -//Page2 -{0x03,0x02}, -{0x20,0x33}, -{0x21,0x77}, -{0x22,0xa7}, -{0x23,0x30}, -{0x52,0xa2}, -{0x55,0x18}, -{0x56,0x0c}, -{0x60,0x11}, -{0x61,0x1b}, -{0x62,0x11}, -{0x63,0x1a}, -{0x64,0x11}, -{0x65,0x1a}, -{0x72,0x12}, -{0x73,0x19}, -{0x74,0x12}, -{0x75,0x19}, -{0x80,0x1d}, -{0x81,0x6f}, -{0x82,0x1e}, -{0x83,0x2b}, -{0x84,0x1e}, -{0x85,0x2b}, -{0x92,0x45}, -{0x93,0x52}, -{0x94,0x45}, -{0x95,0x52}, -{0xa0,0x1d}, -{0xa1,0x6b}, -{0xa4,0x6b}, -{0xa5,0x1d}, -{0xa8,0x2e}, -{0xa9,0x42}, -{0xaa,0x55}, -{0xab,0x69}, -{0xb8,0x10}, -{0xb9,0x13}, -{0xbc,0x1d}, -{0xbd,0x1f}, -{0xc0,0x04}, -{0xc1,0x0d}, -{0xc4,0x05}, -{0xc5,0x0c}, -{0xc8,0x06}, -{0xc9,0x0b}, -{0xcc,0x06}, -{0xcd,0x0a}, -{0xc2,0x04}, -{0xc3,0x0d}, -{0xc6,0x05}, -{0xc7,0x0c}, -{0xca,0x06}, -{0xcb,0x0b}, -{0xce,0x06}, -{0xcf,0x0a}, -{0xd0,0x03}, -{0xd1,0x1c}, -{0xd6,0x46}, -{0xd7,0x48}, - -//Page10 -{0x03,0x10}, -{0x10,0x03},//03;//ISPCTL1;YUVORDER{FIX) -{0x11,0x43}, -{0x12,0xF0},//Yoffet;dyoffseetenable -{0x40,0x8a}, //0x95 -{0x41,0x00},//00DYOFS -{0x42,0x01},//Cb//3 -{0x43,0x01},//Cr//4 -{0x48,0x94},//Contrast //0xaa -{0x50,0x48},//AGBRT - -{0x60,0x7f}, -{0x61,0x00},// -{0x62,0x86},//SATB -{0x63,0x90},//SATR 0x8a -{0x64,0x48},//AGSAT -{0x67,0x3f}, -{0x68,0x80}, - -//LPF -{0x03,0x11}, -{0x10,0x25}, //LPF_CTL1//0x01 -{0x11,0x07}, //TestSetting -{0x20,0x00}, //LPF_AUTO_CTL -{0x21,0x38}, //LPF_PGA_TH -{0x22,0x00}, //LPF_TIME_TH -{0x23,0x10}, //TestSetting -{0x60,0x10}, //ZARA_SIGMA_TH//40->10 -{0x61,0x82}, -{0x62,0x00}, //ZARA_HLVL_CTL -{0x63,0x00}, //ZARA_LLVL_CTL -{0x64,0x00}, //ZARA_DY_CTL - -{0x67,0xA0}, //TestSetting -{0x68,0x40}, //TestSetting -{0x69,0x10}, //TestSetting - -//2D -{0x03,0x12}, -{0x40,0xeb}, //YC2D_LPF_CTL1 -{0x41,0x10}, //YC2D_LPF_CTL2 -{0x50,0x18}, //TestSetting -{0x51,0x24}, //TestSetting -{0x70,0x1f}, //GBGR_CTL1//0x1f -{0x71,0x00}, //TestSetting -{0x72,0x00}, //TestSetting -{0x73,0x00}, //TestSetting -{0x74,0x10}, //GBGR_G_UNIT_TH -{0x75,0x10}, //GBGR_RB_UNIT_TH -{0x76,0x20}, //GBGR_EDGE_TH -{0x77,0x80}, //GBGR_HLVL_TH -{0x78,0x88}, //GBGR_HLVL_COMP -{0x79,0x18}, //TestSetting -{0xb0,0x7d},//dpc - -//Edge -{0x03,0x13}, -{0x10,0x01}, -{0x11,0x89}, -{0x12,0x14}, -{0x13,0x19}, -{0x14,0x08}, //TestSetting -{0x20,0x06}, //SHARP_SLOPE -{0x21,0x05}, //SHARP_SLOPE_TH -{0x23,0x30}, //SHARP_DY_CTL -{0x24,0x33}, //40->33 -{0x25,0x08}, //SHARP_PGA_TH -{0x26,0x18}, //TestSetting -{0x27,0x00}, //TestSetting -{0x28,0x08}, //TestSetting -{0x29,0x50}, //AG_TH -{0x2a,0xe0}, //regionratio -{0x2b,0x10}, //TestSetting -{0x2c,0x28}, //TestSetting -{0x2d,0x40}, //TestSetting -{0x2e,0x00}, //TestSetting -{0x2f,0x00}, //TestSetting -{0x30,0x11}, //TestSetting -{0x80,0x03}, //SHARP2D_CTL -{0x81,0x07}, //TestSetting -{0x90,0x06}, //SHARP2D_SLOPE -{0x91,0x05}, //SHARP2D_DIFF_CTL -{0x92,0x00}, //SHARP2D_HI_CLIP -{0x93,0x20}, //SHARP2D_DY_CTL -{0x94,0x42}, //TestSetting -{0x95,0x60}, //TestSetting - -//Shading -{0x03,0x14}, -{0x10,0x01}, -{0x20,0x93},//XCEN -{0x21,0x80},//YCEN -{0x22,0x54},//76;34;2b -{0x23,0x50},//4b;15;0d -{0x24,0x44},//3b;10;0b - -//Page15CMC -{0x03,0x15}, -{0x10,0x03}, - -{0x14,0x3c}, -{0x16,0x2c}, -{0x17,0x2f}, - -{0x30,0xcb}, -{0x31,0x61}, -{0x32,0x16}, -{0x33,0x23}, -{0x34,0xce}, -{0x35,0x2b}, -{0x36,0x01}, -{0x37,0x34}, -{0x38,0x75}, - -{0x40,0x87}, -{0x41,0x18}, -{0x42,0x91}, -{0x43,0x94}, -{0x44,0x9f}, -{0x45,0x33}, -{0x46,0x00}, -{0x47,0x94}, -{0x48,0x14}, - -//PAGE16 -//GammaCorrection -{0x03,0x16}, - -{0x30,0x00}, -{0x31,0x0a}, -{0x32,0x1b}, -{0x33,0x2e}, -{0x34,0x5c}, -{0x35,0x79}, -{0x36,0x95}, -{0x37,0xa4}, -{0x38,0xb1}, -{0x39,0xbd}, -{0x3a,0xc8}, -{0x3b,0xd9}, -{0x3c,0xe8}, -{0x3d,0xf5}, -{0x3e,0xff}, - -//PAGE17 -//AutoFlickerCancellation -{0x03,0x17}, -{0xc4,0x3c}, -{0xc5,0x32}, - -//Page20AE -{0x03,0x20}, -{0x10,0x0c}, -{0x11,0x04}, - -{0x20,0x01}, -{0x28,0x27}, -{0x29,0xa1}, - -{0x2a,0xf0}, -{0x2b,0x34}, - -{0x30, 0x78}, - -{0x39,0x22}, -{0x3a,0xde}, -{0x3b,0x22}, -{0x3c,0xde}, - -{0x60,0x95},//d5;99 -{0x68,0x3c}, -{0x69,0x64}, -{0x6A,0x28}, -{0x6B,0xc8}, - -{0x70,0x48},//YTarget42 - -{0x76,0x22},//Unlockbnd1 -{0x77,0x02},//Unlockbnd2 - -{0x78,0x12},//Yth1 -{0x79,0x26},//Yth2 -{0x7a,0x23},//Yth3 - -{0x7c,0x1c}, -{0x7d,0x22}, - -{0x83, 0x01}, //EXP Normal 33.33 fps -{0x84, 0xbc}, -{0x85, 0x56}, -{0x86, 0x00}, //EXPMin 3250.00 fps -{0x87, 0xfa}, -{0x88, 0x01}, //EXP Max 7.14 fps -{0x89, 0xbc}, -{0x8a, 0x56}, -{0x8B, 0x1f}, //EXP100 -{0x8C, 0xbd}, -{0x8D, 0x1a}, //EXP120 -{0x8E, 0x5e}, -{0x9c, 0x03}, //EXP Limit 812.50 fps -{0x9d, 0x6b}, -{0x9e, 0x00}, //EXP Unit -{0x9f, 0xfa}, -// {0xa4, 0x18}, - - -{0x94, 0x01}, -{0x95, 0xb7}, -{0x96, 0x74}, -{0x98, 0x8C}, -{0x99, 0x23}, - -{0xb1, 0x14}, -{0xb2, 0x48}, -{0xb4, 0x14}, -{0xb5, 0x38}, -{0xb6, 0x26}, -{0xb7, 0x20}, -{0xb8, 0x1d}, -{0xb9, 0x1b}, -{0xba, 0x1a}, -{0xbb, 0x19}, -{0xbc, 0x19}, -{0xbd, 0x18}, - -{0xc0, 0x1a}, //0x1a->0x16 -{0xc3, 0x48}, -{0xc4, 0x48}, - - -//Page22AWB -{0x03,0x22}, -{0x10,0xfb}, -{0x11,0x26}, -{0x30,0x80}, -{0x31,0x80}, -{0x38,0x12}, -{0x39,0x33}, -{0x3a,0x88}, -{0x3b,0xc4}, -{0x40,0xf0}, -{0x41,0x33}, -{0x42,0x33}, -{0x43,0xf3}, -{0x44,0x55}, -{0x45,0x44}, -{0x46,0x02}, -{0x60,0x00}, -{0x61,0x00}, -{0x80,0x39}, -{0x81,0x20}, -{0x82,0x22}, -{0x83,0x46}, -{0x84,0x16}, -{0x85,0x57}, -{0x86,0x28}, -{0x87,0x38}, -{0x88,0x20}, -{0x89,0x48}, -{0x8a,0x38}, -{0x8b,0x02}, -{0x8d,0x22}, -{0x8e,0x71}, -{0x8f,0x63}, -{0x90,0x60}, -{0x91,0x5c}, -{0x92,0x56}, -{0x93,0x52}, -{0x94,0x4c}, -{0x95,0x36}, -{0x96,0x31}, -{0x97,0x2e}, -{0x98,0x2a}, -{0x99,0x29}, -{0x9a,0x26}, -{0x9b,0x09}, -{0xb0,0x30}, -{0xb1,0x48}, -{0x03,0x22}, -{0x10,0xfb}, - -{0x03,0x20}, -{0x10,0x9c}, - -{0x01,0xf0}, -{0x03,0x00}, -{0x01,0xc0}, - -{0xff,0xff}//EndofInitialSetting -}; - -static void HI708_Set_VGA_mode(void) -{ - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x00); - HI708_write_cmos_sensor(0x10, 0x00); //VGA Size - - HI708_write_cmos_sensor(0x20, 0x00); - HI708_write_cmos_sensor(0x21, 0x04); - - HI708_write_cmos_sensor(0x40, 0x01); //HBLANK: 0x70 = 112 - HI708_write_cmos_sensor(0x41, 0x58); - HI708_write_cmos_sensor(0x42, 0x00); //VBLANK: 0x04 = 4 - HI708_write_cmos_sensor(0x43, 0x14); - - // HI708_write_cmos_sensor(0x03, 0x11); - // HI708_write_cmos_sensor(0x10, 0x25); - - HI708_write_cmos_sensor(0x03, 0x20); - - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - - //HI708_write_cmos_sensor(0x83, 0x00); - // HI708_write_cmos_sensor(0x84, 0xbe); - //HI708_write_cmos_sensor(0x85, 0x6e); - HI708_write_cmos_sensor(0x86, 0x00); - HI708_write_cmos_sensor(0x87, 0xfa); - - HI708_write_cmos_sensor(0x8b, 0x1f); - HI708_write_cmos_sensor(0x8c, 0xbd); - HI708_write_cmos_sensor(0x8d, 0x1a); - HI708_write_cmos_sensor(0x8e, 0x5e); - - HI708_write_cmos_sensor(0x9c, 0x03);//0b - HI708_write_cmos_sensor(0x9d, 0x6b);//b8 - HI708_write_cmos_sensor(0x9e, 0x00); - HI708_write_cmos_sensor(0x9f, 0xfa); - - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - -} - -static void HI708_Initial_Setting(void) -{ - kal_uint32 iEcount; - for(iEcount=0;(!((0xff==(HI708_Initial_Setting_Info[iEcount].address))&&(0xff==(HI708_Initial_Setting_Info[iEcount].data))));iEcount++) - { - HI708_write_cmos_sensor(HI708_Initial_Setting_Info[iEcount].address, HI708_Initial_Setting_Info[iEcount].data); - } - - HI708_Set_VGA_mode(); -} - -static void HI708_Init_Parameter(void) -{ - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.first_init = KAL_TRUE; - HI708_sensor.pv_mode = KAL_TRUE; - HI708_sensor.night_mode = KAL_FALSE; - HI708_sensor.MPEG4_Video_mode = KAL_FALSE; - - HI708_sensor.cp_pclk = HI708_sensor.pv_pclk; - - HI708_sensor.pv_dummy_pixels = 0; - HI708_sensor.pv_dummy_lines = 0; - HI708_sensor.cp_dummy_pixels = 0; - HI708_sensor.cp_dummy_lines = 0; - - HI708_sensor.wb = 0; - HI708_sensor.exposure = 0; - HI708_sensor.effect = 0; - HI708_sensor.banding = AE_FLICKER_MODE_50HZ; - - HI708_sensor.pv_line_length = 640; - HI708_sensor.pv_frame_height = 480; - HI708_sensor.cp_line_length = 640; - HI708_sensor.cp_frame_height = 480; - spin_unlock(&hi708_yuv_drv_lock); -} - -static kal_uint8 HI708_power_on(void) -{ - kal_uint8 HI708_sensor_id = 0; - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.pv_pclk = 13000000; - spin_unlock(&hi708_yuv_drv_lock); - //Software Reset - HI708_write_cmos_sensor(0x01,0xf1); - HI708_write_cmos_sensor(0x01,0xf3); - HI708_write_cmos_sensor(0x01,0xf1); - - /* Read Sensor ID */ - HI708_sensor_id = HI708_read_cmos_sensor(0x04); - SENSORDB("[HI708YUV]:read Sensor ID:%x\n",HI708_sensor_id); - return HI708_sensor_id; -} - - -/************************************************************************* -* FUNCTION -* HI708Open -* -* DESCRIPTION -* This function initialize the registers of CMOS sensor -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 HI708Open(void) -{ - spin_lock(&hi708_yuv_drv_lock); - sensor_id_fail = 0; - spin_unlock(&hi708_yuv_drv_lock); - SENSORDB("[Enter]:HI708 Open func:"); - - - if (HI708_power_on() != HI708_SENSOR_ID) - { - SENSORDB("[HI708]Error:read sensor ID fail\n"); - spin_lock(&hi708_yuv_drv_lock); - sensor_id_fail = 1; - spin_unlock(&hi708_yuv_drv_lock); - return ERROR_SENSOR_CONNECT_FAIL; - } - - /* Apply sensor initail setting*/ - - #ifdef HI708_LOAD_FROM_T_FLASH - - struct file *fp; - mm_segment_t fs; - loff_t pos = 0; - //static char buf[10*1024] ; - - printk("HI708 Open File Start\n"); - fp = filp_open("/storage/sdcard0/hi708_sd.dat", O_RDONLY , 0); - if (IS_ERR(fp)) - { - fromsd = 0; - printk("open file error\n"); - ////////return 0; - } - else - { - printk("open file success\n"); - fromsd = 1; - //SP2528_Initialize_from_T_Flash(); - filp_close(fp, NULL); - } - //set_fs(fs); - if(fromsd == 1) - Hi708_Initialize_from_T_Flash(); - else - { - HI708_Initial_Setting(); - } - HI708_Init_Parameter(); - #else - /* Apply sensor initail setting*/ - HI708_Initial_Setting(); - HI708_Init_Parameter(); - #endif - - - - SENSORDB("[Exit]:HI708 Open func\n"); - return ERROR_NONE; -} /* HI708Open() */ - -UINT32 HI708Init(void) -{ - UINT32 open_ret = HI708Open(); - - if (ERROR_SENSOR_CONNECT_FAIL != open_ret) - { - HI708_write_cmos_sensor(0x03, 0x00); - HI708_write_cmos_sensor(0x08, 0x0f); - HI708_write_cmos_sensor(0x01, 0xf1); //sensor sleep mode - mDELAY(20); - } - - return open_ret; -} /* HI708Init() */ - -/************************************************************************* -* FUNCTION -* HI708_GetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -static kal_uint32 HI708_GetSensorID(kal_uint32 *sensorID) -{ - SENSORDB("[Enter]:HI708 Open func "); - *sensorID = HI708_power_on() ; - - if (*sensorID != HI708_SENSOR_ID) - { - SENSORDB("[HI708]Error:read sensor ID fail\n"); - spin_lock(&hi708_yuv_drv_lock); - sensor_id_fail = 1; - spin_unlock(&hi708_yuv_drv_lock); - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - - return ERROR_NONE; -} /* HI708Open */ - - -/************************************************************************* -* FUNCTION -* HI708Close -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 HI708Close(void) -{ - - return ERROR_NONE; -} /* HI708Close() */ - - -static void HI708_Set_Mirror_Flip(kal_uint8 image_mirror) -{ - /******************************************************** - * Page Mode 0: Reg 0x0011 bit[1:0] = [Y Flip : X Flip] - * 0: Off; 1: On. - *********************************************************/ - kal_uint8 temp_data; - SENSORDB("[Enter]:HI708 set Mirror_flip func:image_mirror=%d\n",image_mirror); - HI708_write_cmos_sensor(0x03,0x00); //Page 0 - temp_data = (HI708_read_cmos_sensor(0x11) & 0xfc); - spin_lock(&hi708_yuv_drv_lock); - //HI708_sensor.mirror = (HI708_read_cmos_sensor(0x11) & 0xfc); - switch (image_mirror) - { - case IMAGE_NORMAL: - //HI708_sensor.mirror |= 0x00; - temp_data |= 0x00; - break; - case IMAGE_H_MIRROR: - //HI708_sensor.mirror |= 0x01; - temp_data |= 0x01; - break; - case IMAGE_V_MIRROR: - //HI708_sensor.mirror |= 0x02; - temp_data |= 0x02; - break; - case IMAGE_HV_MIRROR: - //HI708_sensor.mirror |= 0x03; - temp_data |= 0x03; - break; - default: - //HI708_sensor.mirror |= 0x00; - temp_data |= 0x00; - } - HI708_sensor.mirror = temp_data; - spin_unlock(&hi708_yuv_drv_lock); - HI708_write_cmos_sensor(0x11, HI708_sensor.mirror); - SENSORDB("[Exit]:HI708 set Mirror_flip func\n"); -} - -#if 0 -static void HI708_set_dummy(kal_uint16 dummy_pixels,kal_uint16 dummy_lines) -{ - HI708_write_cmos_sensor(0x03, 0x00); //Page 0 - HI708_write_cmos_sensor(0x40,((dummy_pixels & 0x0F00))>>8); //HBLANK - HI708_write_cmos_sensor(0x41,(dummy_pixels & 0xFF)); - HI708_write_cmos_sensor(0x42,((dummy_lines & 0xFF00)>>8)); //VBLANK ( Vsync Type 1) - HI708_write_cmos_sensor(0x43,(dummy_lines & 0xFF)); -} -#endif - -// 640 * 480 - - -static void HI708_Cal_Min_Frame_Rate(kal_uint16 min_framerate) -{ - kal_uint32 HI708_expmax = 0; - kal_uint32 HI708_expbanding = 0; - kal_uint32 temp_data; - - SENSORDB("[HI708] HI708_Cal_Min_Frame_Rate:min_fps=%d\n",min_framerate); - - //No Fixed Framerate - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg - HI708_write_cmos_sensor(0x03, 0x00); - HI708_write_cmos_sensor(0x11, HI708_read_cmos_sensor(0x11)&0xfb); - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - //HI708_write_cmos_sensor(0x11, 0x04); - //HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - //HI708_write_cmos_sensor(0x2a, 0xf0); - //HI708_write_cmos_sensor(0x2b, 0x34); - - HI708_write_cmos_sensor(0x03, 0x00); - temp_data = ((HI708_read_cmos_sensor(0x40)<<8)|HI708_read_cmos_sensor(0x41)); - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.pv_dummy_pixels = temp_data; - HI708_sensor.pv_line_length = HI708_VGA_DEFAULT_PIXEL_NUMS+ HI708_sensor.pv_dummy_pixels ; - spin_unlock(&hi708_yuv_drv_lock); - - if(HI708_sensor.banding == AE_FLICKER_MODE_50HZ) - { - HI708_expbanding = (HI708_sensor.pv_pclk/HI708_sensor.pv_line_length/100)*HI708_sensor.pv_line_length/8; - HI708_expmax = HI708_expbanding*10*(100/min_framerate) ; - } - else if(HI708_sensor.banding == AE_FLICKER_MODE_60HZ) - { - HI708_expbanding = (HI708_sensor.pv_pclk/HI708_sensor.pv_line_length/120)*HI708_sensor.pv_line_length/8; - HI708_expmax = HI708_expbanding*10*(120/min_framerate) ; - } - else//default 5oHZ - { - SENSORDB("[HI708][Error] Wrong Banding Setting!!!..."); - } - - HI708_write_cmos_sensor(0x03, 0x00); - HI708_write_cmos_sensor(0x12, 0x05); - - HI708_write_cmos_sensor(0x03, 0x20); - - HI708_write_cmos_sensor(0x8b, 0x1f); - HI708_write_cmos_sensor(0x8c, 0xbd); - HI708_write_cmos_sensor(0x8d, 0x1a); - HI708_write_cmos_sensor(0x8e, 0x5e); - - HI708_write_cmos_sensor(0x9c, 0x03);//0b - HI708_write_cmos_sensor(0x9d, 0x6b);//b8 - HI708_write_cmos_sensor(0x9e, 0x00); - HI708_write_cmos_sensor(0x9f, 0xfa); - - - if(HI708_sensor.night_mode) - { - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x83, 0x02);//(HI708_expmax>>16)&0xff);//7fps - HI708_write_cmos_sensor(0x84, 0x49);//(HI708_expmax>>8)&0xff); - HI708_write_cmos_sensor(0x85, 0xf0);//(HI708_expmax>>0)&0xff); - HI708_write_cmos_sensor(0x88, 0x02);//(HI708_expmax>>16)&0xff);//7fps - HI708_write_cmos_sensor(0x89, 0x49);//(HI708_expmax>>8)&0xff); - HI708_write_cmos_sensor(0x8a, 0xf0);//(HI708_expmax>>0)&0xff); - HI708_night_flag = KAL_TRUE; - }else - { - if(HI708_night_flag) - { - HI708_write_cmos_sensor(0x83, 0x02);//(HI708_expmax>>16)&0xff);//01 10fps - HI708_write_cmos_sensor(0x84, 0x7a);//(HI708_expmax>>8)&0xff);//bc - HI708_write_cmos_sensor(0x85, 0xc4);//(HI708_expmax>>0)&0xff);//56 - HI708_night_flag = KAL_FALSE; - } - HI708_write_cmos_sensor(0x88, 0x02);//(HI708_expmax>>16)&0xff);//01 10fps - HI708_write_cmos_sensor(0x89, 0x7a);//(HI708_expmax>>8)&0xff);//bc - HI708_write_cmos_sensor(0x8a, 0xc4);//(HI708_expmax>>0)&0xff);//56 - } - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - HI708_write_cmos_sensor(0x03, 0x00); - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg - -} - - -static void HI708_Fix_Video_Frame_Rate(kal_uint16 fix_framerate) -{ - kal_uint32 HI708_expfix; - kal_uint32 HI708_expfix_temp; - kal_uint32 HI708_expmax = 0; - kal_uint32 HI708_expbanding = 0; - kal_uint32 temp_data1,temp_data2; - - SENSORDB("[Enter]HI708 Fix_video_frame_rate func: fix_fps=%d\n",fix_framerate); - - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.video_current_frame_rate = fix_framerate; - spin_unlock(&hi708_yuv_drv_lock); - // Fixed Framerate - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x00); - //HI708_write_cmos_sensor(0x11, HI708_read_cmos_sensor(0x11)|0x04); - - //HI708_write_cmos_sensor(0x12,HI708_read_cmos_sensor(0x12)&0xfe); - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE - - HI708_write_cmos_sensor(0x11, 0x00); - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - //HI708_write_cmos_sensor(0x2a, 0x00); - //HI708_write_cmos_sensor(0x2b, 0x35); - - HI708_write_cmos_sensor(0x03, 0x00); - temp_data1 = ((HI708_read_cmos_sensor(0x40)<<8)|HI708_read_cmos_sensor(0x41)); - temp_data2 = ((HI708_read_cmos_sensor(0x42)<<8)|HI708_read_cmos_sensor(0x43)); - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.pv_dummy_pixels = temp_data1; - HI708_sensor.pv_line_length = HI708_VGA_DEFAULT_PIXEL_NUMS + HI708_sensor.pv_dummy_pixels ; - HI708_sensor.pv_dummy_lines = temp_data2; - spin_unlock(&hi708_yuv_drv_lock); - - HI708_expfix_temp = ((HI708_sensor.pv_pclk*10/fix_framerate)-(HI708_sensor.pv_line_length*HI708_sensor.pv_dummy_lines))/8; - HI708_expfix = ((HI708_expfix_temp*8/HI708_sensor.pv_line_length)*HI708_sensor.pv_line_length)/8; - - HI708_write_cmos_sensor(0x03, 0x20); - //HI708_write_cmos_sensor(0x83, (HI708_expfix>>16)&0xff); - //HI708_write_cmos_sensor(0x84, (HI708_expfix>>8)&0xff); - //HI708_write_cmos_sensor(0x85, (HI708_expfix>>0)&0xff); - HI708_write_cmos_sensor(0x8b, 0x1f); - HI708_write_cmos_sensor(0x8c, 0xbd); - HI708_write_cmos_sensor(0x8d, 0x1a); - HI708_write_cmos_sensor(0x8e, 0x5e); -/* - if(HI708_sensor.night_mode) - { - HI708_write_cmos_sensor(0x83, 0x02);//(HI708_expfix>>16)&0xff);//10fps - HI708_write_cmos_sensor(0x84, 0x7a);//(HI708_expfix>>8)&0xff); - HI708_write_cmos_sensor(0x85, 0xc4);//(HI708_expfix>>0)&0xff); - HI708_write_cmos_sensor(0x88, 0x02);//(HI708_expfix>>16)&0xff);//10fps - HI708_write_cmos_sensor(0x89, 0x7a);//(HI708_expfix>>8)&0xff); - HI708_write_cmos_sensor(0x8a, 0xc4);//(HI708_expfix>>0)&0xff); - HI708_write_cmos_sensor(0x91, 0x02);//(HI708_expfix>>16)&0xff);//10fps - HI708_write_cmos_sensor(0x92, 0x71);//(HI708_expfix>>8)&0xff); - HI708_write_cmos_sensor(0x93, 0x00);//(HI708_expfix>>0)&0xff); -}else*/ -//{ - HI708_write_cmos_sensor(0x83, 0x01);//(HI708_expfix>>16)&0xff);//11fps - HI708_write_cmos_sensor(0x84, 0xbc);//(HI708_expfix>>8)&0xff); - HI708_write_cmos_sensor(0x85, 0x56);//(HI708_expfix>>0)&0xff); - HI708_write_cmos_sensor(0x88, 0x00);//(HI708_expfix>>16)&0xff);//11fps - HI708_write_cmos_sensor(0x89, 0xde);//(HI708_expfix>>8)&0xff); - HI708_write_cmos_sensor(0x8a, 0x2b);//(HI708_expfix>>0)&0xff); - HI708_write_cmos_sensor(0x91, 0x01);//(HI708_expfix>>16)&0xff);//10fps - HI708_write_cmos_sensor(0x92, 0xbb);//(HI708_expfix>>8)&0xff); - HI708_write_cmos_sensor(0x93, 0x5c);//(HI708_expfix>>0)&0xff); -//} - if(HI708_sensor.banding == AE_FLICKER_MODE_50HZ) - { - HI708_expbanding = ((HI708_read_cmos_sensor(0x8b)<<8)|HI708_read_cmos_sensor(0x8c)); - } - else if(HI708_sensor.banding == AE_FLICKER_MODE_60HZ) - { - HI708_expbanding = ((HI708_read_cmos_sensor(0x8d)<<8)|HI708_read_cmos_sensor(0x8e)); - } - else - { - SENSORDB("[HI708]Wrong Banding Setting!!!..."); - } - HI708_expmax = ((HI708_expfix_temp-HI708_expbanding)/HI708_expbanding)*HI708_expbanding; - - HI708_write_cmos_sensor(0x03, 0x20); - //HI708_write_cmos_sensor(0x88, (HI708_expmax>>16)&0xff); - //HI708_write_cmos_sensor(0x89, (HI708_expmax>>8)&0xff); - //HI708_write_cmos_sensor(0x8a, (HI708_expmax>>0)&0xff); - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg -} - -#if 0 -// 320 * 240 -static void HI708_Set_QVGA_mode(void) -{ - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x00); - HI708_write_cmos_sensor(0x10, 0x01); //QVGA Size: 0x10 -> 0x01 - - HI708_write_cmos_sensor(0x20, 0x00); - HI708_write_cmos_sensor(0x21, 0x02); - - HI708_write_cmos_sensor(0x40, 0x01); //HBLANK: 0x0158 = 344 - HI708_write_cmos_sensor(0x41, 0x58); - HI708_write_cmos_sensor(0x42, 0x00); //VBLANK: 0x14 = 20 - HI708_write_cmos_sensor(0x43, 0x14); - - HI708_write_cmos_sensor(0x03, 0x11); //QVGA Fixframerate - HI708_write_cmos_sensor(0x10, 0x21); - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - - HI708_write_cmos_sensor(0x83, 0x00); - HI708_write_cmos_sensor(0x84, 0xaf); - HI708_write_cmos_sensor(0x85, 0xc8); - HI708_write_cmos_sensor(0x86, 0x00); - HI708_write_cmos_sensor(0x87, 0xfa); - - HI708_write_cmos_sensor(0x8b, 0x3a); - HI708_write_cmos_sensor(0x8c, 0x98); - HI708_write_cmos_sensor(0x8d, 0x30); - HI708_write_cmos_sensor(0x8e, 0xd4); - - HI708_write_cmos_sensor(0x9c, 0x0b); - HI708_write_cmos_sensor(0x9d, 0x3b); - HI708_write_cmos_sensor(0x9e, 0x00); - HI708_write_cmos_sensor(0x9f, 0xfa); - - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - -} -#endif -void HI708_night_mode(kal_bool enable) -{ - SENSORDB("HHL[Enter]HI708 night mode func:enable = %d\n",enable); - SENSORDB("HI708_sensor.video_mode = %d\n",HI708_sensor.MPEG4_Video_mode); - SENSORDB("HI708_sensor.night_mode = %d\n",HI708_sensor.night_mode); - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.night_mode = enable; - spin_unlock(&hi708_yuv_drv_lock); - - if(HI708_sensor.MPEG4_Video_mode == KAL_TRUE) - return; - - if(enable) - -{ - if (HI708_sensor.banding == AE_FLICKER_MODE_50HZ) - { - - SENSORDB("[HI708]HI708NightMode Disable AE_FLICKER_MODE_50HZ\n"); - - HI708_write_cmos_sensor(0x03, 0x20); - - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - - //BEGIN <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x83, 0x02); - HI708_write_cmos_sensor(0x84, 0x7a); - HI708_write_cmos_sensor(0x85, 0xc4);//15fps - HI708_write_cmos_sensor(0x86, 0x00); - HI708_write_cmos_sensor(0x87, 0xfa); - //END <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x88, 0x02); - HI708_write_cmos_sensor(0x89, 0x7a); - HI708_write_cmos_sensor(0x8A, 0xc4);//7 - - HI708_write_cmos_sensor(0x8b, 0x1f); - HI708_write_cmos_sensor(0x8c, 0xbd); - HI708_write_cmos_sensor(0x8d, 0x1a); - HI708_write_cmos_sensor(0x8e, 0x5e); - - HI708_write_cmos_sensor(0x9c, 0x03); - HI708_write_cmos_sensor(0x9d, 0x6b); - HI708_write_cmos_sensor(0x9e, 0x00); - HI708_write_cmos_sensor(0x9f, 0xfa); - - - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - - - -} -else -{ -SENSORDB("[HI708]HI708NightMode Disable AE_FLICKER_MODE_60HZ\n"); -HI708_write_cmos_sensor(0x03, 0x20); - -HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE -HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - -//BEGIN <> <20130922> panzaoyan - - HI708_write_cmos_sensor(0x83, 0x02); - HI708_write_cmos_sensor(0x84, 0x78); - HI708_write_cmos_sensor(0x85, 0xd0);//15fps -HI708_write_cmos_sensor(0x86, 0x00); -HI708_write_cmos_sensor(0x87, 0xfa); -//END <> <20130922> panzaoyan -HI708_write_cmos_sensor(0x88, 0x02); -HI708_write_cmos_sensor(0x89, 0x78); -HI708_write_cmos_sensor(0x8A, 0xd0);//7 - -HI708_write_cmos_sensor(0x8b, 0x1f); -HI708_write_cmos_sensor(0x8c, 0xbd); -HI708_write_cmos_sensor(0x8d, 0x1a); -HI708_write_cmos_sensor(0x8e, 0x5e); - -HI708_write_cmos_sensor(0x9c, 0x03); -HI708_write_cmos_sensor(0x9d, 0x6b); -HI708_write_cmos_sensor(0x9e, 0x00); -HI708_write_cmos_sensor(0x9f, 0xfa); - - -HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg - -HI708_write_cmos_sensor(0x03, 0x20); -HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE -HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - - - } - - -} -else -{ - if (HI708_sensor.banding == AE_FLICKER_MODE_50HZ) - { SENSORDB("[HI708]HI708NightMode Enable AE_FLICKER_MODE_50HZ\n"); - HI708_write_cmos_sensor(0x03, 0x20); - - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - //BEGIN <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x83, 0x01); - HI708_write_cmos_sensor(0x84, 0xbc); - HI708_write_cmos_sensor(0x85, 0x56);//15fps - HI708_write_cmos_sensor(0x86, 0x00); - HI708_write_cmos_sensor(0x87, 0xfa); - //END <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x88, 0x01); - HI708_write_cmos_sensor(0x89, 0xbc); - HI708_write_cmos_sensor(0x8A, 0x56);//7 - - HI708_write_cmos_sensor(0x8b, 0x1f); - HI708_write_cmos_sensor(0x8c, 0xbd); - HI708_write_cmos_sensor(0x8d, 0x1a); - HI708_write_cmos_sensor(0x8e, 0x5e); - - HI708_write_cmos_sensor(0x9c, 0x03); - HI708_write_cmos_sensor(0x9d, 0x6b); - HI708_write_cmos_sensor(0x9e, 0x00); - HI708_write_cmos_sensor(0x9f, 0xfa); - - - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - - } - else - { SENSORDB("[HI708]HI708NightMode Enable AE_FLICKER_MODE_60HZ\n"); - - HI708_write_cmos_sensor(0x03, 0x20); - - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE - //BEGIN <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x83, 0x01); - HI708_write_cmos_sensor(0x84, 0xc0); - HI708_write_cmos_sensor(0x85, 0x3e);//15fps - HI708_write_cmos_sensor(0x86, 0x00); - HI708_write_cmos_sensor(0x87, 0xfa); - //END<> <20130922> panzaoyan - HI708_write_cmos_sensor(0x88, 0x01); - HI708_write_cmos_sensor(0x89, 0xc0); - HI708_write_cmos_sensor(0x8A, 0x3e);//7 - - HI708_write_cmos_sensor(0x8b, 0x1f); - HI708_write_cmos_sensor(0x8c, 0xbd); - HI708_write_cmos_sensor(0x8d, 0x1a); - HI708_write_cmos_sensor(0x8e, 0x5e); - - HI708_write_cmos_sensor(0x9c, 0x03); - HI708_write_cmos_sensor(0x9d, 0x6b); - HI708_write_cmos_sensor(0x9e, 0x00); - HI708_write_cmos_sensor(0x9f, 0xfa); - - - HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE - HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE - - } - - -} -} - -/************************************************************************* -* FUNCTION -* HI708Preview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -static UINT32 HI708Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x10, 0xfb); - spin_lock(&hi708_yuv_drv_lock); - sensor_config_data->SensorImageMirror = IMAGE_HV_MIRROR; - if(HI708_sensor.first_init == KAL_TRUE) - { - HI708_sensor.MPEG4_Video_mode = HI708_sensor.MPEG4_Video_mode; - } - else - { - HI708_sensor.MPEG4_Video_mode = KAL_FALSE;//!HI708_sensor.MPEG4_Video_mode; - } - spin_unlock(&hi708_yuv_drv_lock); - - SENSORDB("HHL[Enter]:HI708 preview func:"); - SENSORDB("HI708_sensor.video_mode = %d\n",HI708_sensor.MPEG4_Video_mode); - - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.first_init = KAL_FALSE; - HI708_sensor.pv_mode = KAL_TRUE; - spin_unlock(&hi708_yuv_drv_lock); - - // { - // SENSORDB("[HI708]preview set_VGA_mode\n"); - // - // } - - //HI708_write_cmos_sensor(0x03, 0x10); - //HI708_write_cmos_sensor(0x40, 0x03); - //HI708_write_cmos_sensor(0x62, 0x83); - //HI708_write_cmos_sensor(0x63, 0x9a); - - // HI708_Set_Mirror_Flip(sensor_config_data->SensorImageMirror); - // HI708_Set_Mirror_Flip(IMAGE_V_MIRROR); - - SENSORDB("[Exit]:HI708 preview func\n"); - - HI708_night_mode(HI708_sensor.night_mode); - return TRUE; -} /* HI708_Preview */ - - -UINT32 HI708Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ -kal_uint32 CapShutter; - SENSORDB("HHL[HI708][Enter]HI708_capture_func\n"); - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.pv_mode = KAL_FALSE; - spin_unlock(&hi708_yuv_drv_lock); -#if 0 - HI708_write_cmos_sensor(0x03, 0x20); - HI708_sensor.PvShutter = (HI708_read_cmos_sensor(0x80) << 16)|(HI708_read_cmos_sensor(0x81) << 8)|HI708_read_cmos_sensor(0x82); - CapShutter = HI708_sensor.PvShutter; - HI708_sensor.CapExposure=HI708_sensor.PvShutter*8*76923 - - HI708_write_cmos_sensor(0x03, 0x20); - HI708_write_cmos_sensor(0x83, (CapShutter >> 16) & 0xFF); - HI708_write_cmos_sensor(0x84, (CapShutter >> 8) & 0xFF); - HI708_write_cmos_sensor(0x85, CapShutter & 0xFF); - #endif - return ERROR_NONE; -} /* HM3451Capture() */ - - -UINT32 HI708GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - SENSORDB("[Enter]:HI708 get Resolution func\n"); - - pSensorResolution->SensorFullWidth=HI708_IMAGE_SENSOR_FULL_WIDTH ; - pSensorResolution->SensorFullHeight=HI708_IMAGE_SENSOR_FULL_HEIGHT ; - pSensorResolution->SensorPreviewWidth=HI708_IMAGE_SENSOR_PV_WIDTH ; - pSensorResolution->SensorPreviewHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ; - pSensorResolution->SensorVideoWidth=HI708_IMAGE_SENSOR_PV_WIDTH ; - pSensorResolution->SensorVideoHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ; - pSensorResolution->Sensor3DFullWidth=HI708_IMAGE_SENSOR_FULL_WIDTH ; - pSensorResolution->Sensor3DFullHeight=HI708_IMAGE_SENSOR_FULL_HEIGHT ; - pSensorResolution->Sensor3DPreviewWidth=HI708_IMAGE_SENSOR_PV_WIDTH ; - pSensorResolution->Sensor3DPreviewHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ; - pSensorResolution->Sensor3DVideoWidth=HI708_IMAGE_SENSOR_PV_WIDTH ; - pSensorResolution->Sensor3DVideoHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ; - - SENSORDB("[Exit]:HI708 get Resolution func\n"); - return ERROR_NONE; -} /* HI708GetResolution() */ - -UINT32 HI708GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - - switch(ScenarioId) - { - - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=15; - break; - - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=30; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=30; - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=30; - break; - default: - - pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=30; - break; - - } - - - - SENSORDB("[Enter]:HI708 getInfo func:ScenarioId = %d\n",ScenarioId); - - // pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH; - // pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT; - // pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH; - // pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; - - pSensorInfo->SensorCameraPreviewFrameRate=30; - pSensorInfo->SensorVideoFrameRate=30; - pSensorInfo->SensorStillCaptureFrameRate=30; - pSensorInfo->SensorWebCamCaptureFrameRate=15; - pSensorInfo->SensorResetActiveHigh=FALSE;//low is to reset - pSensorInfo->SensorResetDelayCount=4; //4ms - pSensorInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_YUYV; //SENSOR_OUTPUT_FORMAT_YVYU; - pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorInterruptDelayLines = 1; - pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_PARALLEL; - - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 2;//10; - pSensorInfo->VideoDelayFrame = 0; - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = 4; - pSensorInfo->SensorGrabStartY = 2; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = 4; - pSensorInfo->SensorGrabStartY = 2;//4; - break; - default: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = 4; - pSensorInfo->SensorGrabStartY = 2;//4; - break; - } - // HI708_PixelClockDivider=pSensorInfo->SensorPixelClockCount; - memcpy(pSensorConfigData, &HI708SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - - SENSORDB("[Exit]:HI708 getInfo func\n"); - return ERROR_NONE; -} /* HI708GetInfo() */ - - -UINT32 HI708Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - SENSORDB("HHL [Enter]:HI708 Control func:ScenarioId = %d\n",ScenarioId); - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: - //case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - HI708Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: - HI708Capture(pImageWindow, pSensorConfigData); - break; - // case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - // case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - // case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - // HI708Preview(pImageWindow, pSensorConfigData); - // break; - // case MSDK_SCENARIO_ID_CAMERA_ZSD: - // HI708Capture(pImageWindow, pSensorConfigData); - // break; - default: - break; - } - - SENSORDB("[Exit]:HI708 Control func\n"); - return TRUE; -} /* HI708Control() */ - - -/************************************************************************* -* FUNCTION -* HI708_set_param_wb -* -* DESCRIPTION -* wb setting. -* -* PARAMETERS -* none -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -BOOL HI708_set_param_wb(UINT16 para) -{ - //This sensor need more time to balance AWB, - //we suggest higher fps or drop some frame to avoid garbage color when preview initial - SENSORDB("[Enter]HI708 set_param_wb func:para = %d\n",para); - - if(HI708_sensor.wb == para) return KAL_TRUE; - - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.wb = para; - spin_unlock(&hi708_yuv_drv_lock); - - switch (para) - { - case AWB_MODE_AUTO: - { - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x11, 0x2e); - HI708_write_cmos_sensor(0x80, 0x38); - HI708_write_cmos_sensor(0x82, 0x30); - HI708_write_cmos_sensor(0x83, 0x46);//56 - HI708_write_cmos_sensor(0x84, 0x16); - HI708_write_cmos_sensor(0x85, 0x57); - HI708_write_cmos_sensor(0x86, 0x28); - } - break; - case AWB_MODE_CLOUDY_DAYLIGHT: - { - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x11, 0x28); - HI708_write_cmos_sensor(0x80, 0x52); - HI708_write_cmos_sensor(0x81, 0x20); - HI708_write_cmos_sensor(0x82, 0x2e); - HI708_write_cmos_sensor(0x83, 0x5d); - HI708_write_cmos_sensor(0x84, 0x55); - HI708_write_cmos_sensor(0x85, 0x30); - HI708_write_cmos_sensor(0x86, 0x25); - } - break; - case AWB_MODE_DAYLIGHT: - { - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x11, 0x28); - HI708_write_cmos_sensor(0x80, 0x50); - HI708_write_cmos_sensor(0x81, 0x20); - HI708_write_cmos_sensor(0x82, 0x2d); - HI708_write_cmos_sensor(0x83, 0x52); - HI708_write_cmos_sensor(0x84, 0x40); - HI708_write_cmos_sensor(0x85, 0x30); - HI708_write_cmos_sensor(0x86, 0x1c); - } - break; - case AWB_MODE_INCANDESCENT: - { - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x11, 0x28); - HI708_write_cmos_sensor(0x80, 0x29); - HI708_write_cmos_sensor(0x82, 0x54); - HI708_write_cmos_sensor(0x83, 0x2e); - HI708_write_cmos_sensor(0x84, 0x23); - HI708_write_cmos_sensor(0x85, 0x58); - HI708_write_cmos_sensor(0x86, 0x4f); - } - break; - case AWB_MODE_FLUORESCENT: - { - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x11, 0x28); - HI708_write_cmos_sensor(0x80, 0x40); - HI708_write_cmos_sensor(0x81, 0x20); - HI708_write_cmos_sensor(0x82, 0x4f); - HI708_write_cmos_sensor(0x83, 0x44); - HI708_write_cmos_sensor(0x84, 0x3a); - HI708_write_cmos_sensor(0x85, 0x47); - HI708_write_cmos_sensor(0x86, 0x3a); - } - break; - case AWB_MODE_TUNGSTEN: - { - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x80, 0x24); - HI708_write_cmos_sensor(0x81, 0x20); - HI708_write_cmos_sensor(0x82, 0x58); - HI708_write_cmos_sensor(0x83, 0x27); - HI708_write_cmos_sensor(0x84, 0x22); - HI708_write_cmos_sensor(0x85, 0x58); - HI708_write_cmos_sensor(0x86, 0x52); - } - break; - case AWB_MODE_OFF: - { - SENSORDB("HI708 AWB OFF"); - HI708_write_cmos_sensor(0x03, 0x22); - HI708_write_cmos_sensor(0x10, 0xe2); - } - break; - default: - return FALSE; - } - - return TRUE; -} /* HI708_set_param_wb */ - -/************************************************************************* -* FUNCTION -* HI708_set_param_effect -* -* DESCRIPTION -* effect setting. -* -* PARAMETERS -* none -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -BOOL HI708_set_param_effect(UINT16 para) -{ - SENSORDB("[Enter]HI708 set_param_effect func:para = %d\n",para); - - if(HI708_sensor.effect == para) return KAL_TRUE; - - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.effect = para; - spin_unlock(&hi708_yuv_drv_lock); - - switch (para) - { - case MEFFECT_OFF: - { - HI708_write_cmos_sensor(0x03, 0x10); - HI708_write_cmos_sensor(0x11, 0x43); - HI708_write_cmos_sensor(0x12, 0xF0); - HI708_write_cmos_sensor(0x13, 0x03); - HI708_write_cmos_sensor(0x44, 0x80); - HI708_write_cmos_sensor(0x45, 0x80); - - HI708_write_cmos_sensor(0x47, 0x7f); - //HI708_write_cmos_sensor(0x03, 0x13); - // HI708_write_cmos_sensor(0x20, 0x07); - //HI708_write_cmos_sensor(0x21, 0x07); - - - } - break; - case MEFFECT_SEPIA: - { - HI708_write_cmos_sensor(0x03, 0x10); - HI708_write_cmos_sensor(0x11, 0x03); - HI708_write_cmos_sensor(0x12, 0x23); - HI708_write_cmos_sensor(0x13, 0x00); - HI708_write_cmos_sensor(0x44, 0x6c); - HI708_write_cmos_sensor(0x45, 0x9a); - - HI708_write_cmos_sensor(0x47, 0x7f); - // HI708_write_cmos_sensor(0x03, 0x13); - // HI708_write_cmos_sensor(0x20, 0x07); - //HI708_write_cmos_sensor(0x21, 0x07); - - - } - break; - case MEFFECT_NEGATIVE: - { - HI708_write_cmos_sensor(0x03, 0x10); - HI708_write_cmos_sensor(0x11, 0x03); - HI708_write_cmos_sensor(0x12, 0x08); - HI708_write_cmos_sensor(0x13, 0x00); - HI708_write_cmos_sensor(0x14, 0x00); - } - break; - case MEFFECT_SEPIAGREEN: - { - HI708_write_cmos_sensor(0x03, 0x10); - HI708_write_cmos_sensor(0x11, 0x03); - HI708_write_cmos_sensor(0x12, 0x03); - //HI708_write_cmos_sensor(0x40, 0x00); - HI708_write_cmos_sensor(0x13, 0x00); - HI708_write_cmos_sensor(0x44, 0x30); - HI708_write_cmos_sensor(0x45, 0x50); - } - break; - case MEFFECT_SEPIABLUE: - { - HI708_write_cmos_sensor(0x03, 0x10); - HI708_write_cmos_sensor(0x11, 0x03); - HI708_write_cmos_sensor(0x12, 0x03); - //HI708_write_cmos_sensor(0x40, 0x00); - HI708_write_cmos_sensor(0x13, 0x00); - HI708_write_cmos_sensor(0x44, 0xb0); - HI708_write_cmos_sensor(0x45, 0x40); - } - break; - case MEFFECT_MONO: - { - HI708_write_cmos_sensor(0x03, 0x10); - HI708_write_cmos_sensor(0x11, 0x03); - HI708_write_cmos_sensor(0x12, 0x03); - //HI708_write_cmos_sensor(0x40, 0x00); - HI708_write_cmos_sensor(0x44, 0x80); - HI708_write_cmos_sensor(0x45, 0x80); - } - break; - default: - return KAL_FALSE; - } - - return KAL_TRUE; -} /* HI708_set_param_effect */ - -/************************************************************************* -* FUNCTION -* HI708_set_param_banding -* -* DESCRIPTION -* banding setting. -* -* PARAMETERS -* none -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -BOOL HI708_set_param_banding(UINT16 para) -{ - SENSORDB("[Enter]HI708 set_param_banding func:para = %d\n",para); - - if(HI708_sensor.banding == para) return KAL_TRUE; - - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.banding = para; - spin_unlock(&hi708_yuv_drv_lock); - - switch (para) - { - case AE_FLICKER_MODE_50HZ: - { - HI708_write_cmos_sensor(0x03,0x20); - HI708_write_cmos_sensor(0x10,0x1c); - HI708_write_cmos_sensor(0x18,0x38); - //BEGIN <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x83, 0x01); - HI708_write_cmos_sensor(0x84, 0xbc); - HI708_write_cmos_sensor(0x85, 0x56);//15fps - //END <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x88, 0x01); - HI708_write_cmos_sensor(0x89, 0xbc); - HI708_write_cmos_sensor(0x8A, 0x56);//50HZ - - HI708_write_cmos_sensor(0x18, 0x30); - HI708_write_cmos_sensor(0x10, 0x9c); - } - break; - case AE_FLICKER_MODE_60HZ: - { - HI708_write_cmos_sensor(0x03,0x20); - HI708_write_cmos_sensor(0x10,0x0c); - HI708_write_cmos_sensor(0x18,0x38); - //BEGIN <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x83, 0x01); - HI708_write_cmos_sensor(0x84, 0xc0); - HI708_write_cmos_sensor(0x85, 0x3e);//15fps - HI708_write_cmos_sensor(0x86, 0x00); - HI708_write_cmos_sensor(0x87, 0xfa); - //END <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x88, 0x01); - HI708_write_cmos_sensor(0x89, 0xc0); - HI708_write_cmos_sensor(0x8A, 0x3e);//60HZ - - HI708_write_cmos_sensor(0x18, 0x30); - HI708_write_cmos_sensor(0x10, 0x8c); - } - break; - default: - { - HI708_write_cmos_sensor(0x03,0x20); - HI708_write_cmos_sensor(0x10,0x1c); - HI708_write_cmos_sensor(0x18,0x38); - //BEGIN <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x83, 0x01); - HI708_write_cmos_sensor(0x84, 0xbc); - HI708_write_cmos_sensor(0x85, 0x56);//15fps - //END <> <20130922> panzaoyan - HI708_write_cmos_sensor(0x88, 0x01); - HI708_write_cmos_sensor(0x89, 0xbc); - HI708_write_cmos_sensor(0x8A, 0x56);//50HZ - - HI708_write_cmos_sensor(0x18, 0x30); - HI708_write_cmos_sensor(0x10, 0x9c); - } - } - - return KAL_TRUE; -} /* HI708_set_param_banding */ - - - - -/************************************************************************* -* FUNCTION -* HI708_set_param_exposure -* -* DESCRIPTION -* exposure setting. -* -* PARAMETERS -* none -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -BOOL HI708_set_param_exposure(UINT16 para) -{ - SENSORDB("[Enter]HI708 set_param_exposure func:para = %d\n",para); - - if(HI708_sensor.exposure == para) return KAL_TRUE; - - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.exposure = para; - spin_unlock(&hi708_yuv_drv_lock); - - HI708_write_cmos_sensor(0x03,0x10); - HI708_write_cmos_sensor(0x12,HI708_read_cmos_sensor(0x12)|0x10); - switch (para) - { - /*GIONEE: malp 20130625 add for CR00828155 start*/ - case AE_EV_COMP_20: //+2 EV - HI708_write_cmos_sensor(0x40,0x30); - break; - /*GIONEE: malp 20130625 add for CR00828155 end*/ - case AE_EV_COMP_13: //+1.3 EV - HI708_write_cmos_sensor(0x40,0x20); - break; - case AE_EV_COMP_10: //+1 EV - HI708_write_cmos_sensor(0x40,0x15); - break; - case AE_EV_COMP_07: //+0.7 EV - HI708_write_cmos_sensor(0x40,0x10); - break; - case AE_EV_COMP_03: // +0.3 EV - HI708_write_cmos_sensor(0x40,0x05); - break; - case AE_EV_COMP_00: // +0 EV - HI708_write_cmos_sensor(0x40,0x88);//90//96 wangc modified for reducing previewer brightness at 2012-10-24 - - break; - case AE_EV_COMP_n03: // -0.3 EV - HI708_write_cmos_sensor(0x40,0x95);//98//a3 - - break; - case AE_EV_COMP_n07: // -0.7 EV - HI708_write_cmos_sensor(0x40,0xa0); - break; - case AE_EV_COMP_n10: //-1 EV - HI708_write_cmos_sensor(0x40,0xa5); - break; - case AE_EV_COMP_n13: // -1.3 EV - HI708_write_cmos_sensor(0x40,0xb0); - break; - /*GIONEE: malp 20130625 add for CR00828155 start*/ - case AE_EV_COMP_n20: //-2 EV - HI708_write_cmos_sensor(0x40,0xc0); - break; - /*GIONEE: malp 20130625 add for CR00828155 end*/ - default: - return FALSE; - } - - return TRUE; -} /* HI708_set_param_exposure */ - -void HI708_set_AE_mode(UINT32 iPara) -{ - UINT8 temp_AE_reg = 0; - SENSORDB("HI708_set_AE_mode = %d E \n",iPara); - HI708_write_cmos_sensor(0x03,0x20); - temp_AE_reg = HI708_read_cmos_sensor(0x10); - - if (AE_MODE_OFF == iPara) - { - // turn off AEC/AGC - HI708_write_cmos_sensor(0x10,temp_AE_reg &~ 0x10); - } - else - { - HI708_write_cmos_sensor(0x10,temp_AE_reg | 0x10); - } -} -UINT32 HI708YUVSensorSetting(FEATURE_ID iCmd, UINT32 iPara) -{ - SENSORDB("[Enter]HI708YUVSensorSetting func:cmd = %d\n",iCmd); - - switch (iCmd) - { - case FID_SCENE_MODE: //auto mode or night mode - if (iPara == SCENE_MODE_OFF)//auto mode - { - HI708_night_mode(FALSE); - } - else if (iPara == SCENE_MODE_NIGHTSCENE)//night mode - { - HI708_night_mode(TRUE); - } - break; - case FID_AWB_MODE: - HI708_set_param_wb(iPara); - break; - case FID_COLOR_EFFECT: - HI708_set_param_effect(iPara); - break; - case FID_AE_EV: - HI708_set_param_exposure(iPara); - break; - case FID_AE_FLICKER: - HI708_set_param_banding(iPara); - break; - case FID_ZOOM_FACTOR: - spin_lock(&hi708_yuv_drv_lock); - HI708_zoom_factor = iPara; - spin_unlock(&hi708_yuv_drv_lock); - break; - case FID_AE_SCENE_MODE: - HI708_set_AE_mode(iPara); - break; - default: - break; - } - return TRUE; -} /* HI708YUVSensorSetting */ - -UINT32 HI708YUVSetVideoMode(UINT16 u2FrameRate) -{ -/* spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.MPEG4_Video_mode = KAL_TRUE; - spin_unlock(&hi708_yuv_drv_lock); - SENSORDB("[Enter]HI708 Set Video Mode:FrameRate= %d\n",u2FrameRate); - SENSORDB("HI708_sensor.video_mode = %d\n",HI708_sensor.MPEG4_Video_mode); - - // if(u2FrameRate == 30) u2FrameRate = 20; - //u2FrameRate = 12; - - spin_lock(&hi708_yuv_drv_lock); - HI708_sensor.fix_framerate = u2FrameRate * 10; - spin_unlock(&hi708_yuv_drv_lock); - - if(HI708_sensor.fix_framerate <= 300 ) - { - HI708_Fix_Video_Frame_Rate(HI708_sensor.fix_framerate); - } - else - { - SENSORDB("Wrong Frame Rate"); - } - - return TRUE; -*/ -} - -void HI708GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("HI708GetAFMaxNumFocusAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -void HI708GetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("HI708GetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -void HI708GetExifInfo(UINT32 exifAddr) -{ - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = AE_ISO_100; - pExifInfo->AWBMode = HI708_sensor.wb; - pExifInfo->CapExposureTime = 0; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = AE_ISO_100; -} - -/*****add by zero *********/ -UINT32 HI708SetTestPatternMode(kal_bool bEnable) -{ - printk("zero %s\n ",__func__); - HI708_Set_Mirror_Flip(IMAGE_NORMAL); -} -/*******end*************/ - -UINT32 HI708FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - //UINT16 u2Temp = 0; - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; - UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - SENSORDB("HHL [Enter]:HI708 Feature Control func:FeatureId = %d\n",FeatureId); - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=HI708_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16=HI708_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: - *pFeatureReturnPara16++=HI708_IMAGE_SENSOR_PV_WIDTH;//+HI708_sensor.pv_dummy_pixels; - *pFeatureReturnPara16=HI708_IMAGE_SENSOR_PV_HEIGHT;//+HI708_sensor.pv_dummy_lines; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: - //*pFeatureReturnPara32 = HI708_sensor_pclk/10; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_ESHUTTER: - - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - HI708_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - break; - case SENSOR_FEATURE_SET_REGISTER: - HI708_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = HI708_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pSensorConfigData, &HI708SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - case SENSOR_FEATURE_GET_CCT_REGISTER: - case SENSOR_FEATURE_SET_ENG_REGISTER: - case SENSOR_FEATURE_GET_ENG_REGISTER: - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - case SENSOR_FEATURE_GET_GROUP_INFO: - case SENSOR_FEATURE_GET_ITEM_INFO: - case SENSOR_FEATURE_SET_ITEM_INFO: - case SENSOR_FEATURE_GET_ENG_INFO: - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - // *pFeatureReturnPara32++=0; - //*pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_YUV_CMD: - HI708YUVSensorSetting((FEATURE_ID)*pFeatureData32, *(pFeatureData32+1)); - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - HI708YUVSetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - HI708_GetSensorID(pFeatureData32); - break; - case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: - HI708GetAFMaxNumFocusAreas(pFeatureReturnPara32); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: - HI708GetAEMaxNumMeteringAreas(pFeatureReturnPara32); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - SENSORDB("SENSOR_FEATURE_GET_EXIF_INFO\n"); - SENSORDB("EXIF addr = 0x%x\n",*pFeatureData32); - HI708GetExifInfo(*pFeatureData32); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - HI708SetTestPatternMode((BOOL)*pFeatureData16); //add by zero - break; - default: - break; - } - return ERROR_NONE; -} /* HI708FeatureControl() */ - - -SENSOR_FUNCTION_STRUCT SensorFuncHI708= -{ - HI708Open, - HI708GetInfo, - HI708GetResolution, - HI708FeatureControl, - HI708Control, - HI708Close -}; - -UINT32 HI708_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - - /* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncHI708; - - return ERROR_NONE; -} /* SensorInit() */ - - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Sensor.h deleted file mode 100644 index a633af95dd2..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/hi708_yuv/hi708yuv_Sensor.h +++ /dev/null @@ -1,203 +0,0 @@ -/* Copyright Statement: - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. The information contained herein - * is confidential and proprietary to MediaTek Inc. and/or its licensors. - * Without the prior written permission of MediaTek inc. and/or its licensors, - * any reproduction, modification, use or disclosure of MediaTek Software, - * and information contained herein, in whole or in part, shall be strictly prohibited. - */ -/* MediaTek Inc. (C) 2010. All rights reserved. - * - * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES - * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") - * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON - * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE - * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR - * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH - * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES - * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES - * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK - * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR - * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND - * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, - * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, - * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO - * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - * - * The following software/firmware and/or related documentation ("MediaTek Software") - * have been modified by MediaTek Inc. All revisions are subject to any receiver's - * applicable license agreements with MediaTek Inc. - */ - - -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of Sensor driver - * - * - * Author: - * ------- - * PC Huang (MTK02204) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 07 11 2011 jun.pei - * [ALPS00059464] hi708 sensor check in - * . - * - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -/* SENSOR FULL SIZE */ - #ifndef __SENSOR_H - #define __SENSOR_H - - //follow is define by jun - /* SENSOR READ/WRITE ID */ - -#define HI708_IMAGE_SENSOR_QVGA_WIDTH (320) -#define HI708_IMAGE_SENSOR_QVGA_HEIGHT (240) -#define HI708_IMAGE_SENSOR_VGA_WIDTH (640) -#define HI708_IMAGE_SENSOR_VGA_HEIGHT (480) -#define HI708_IMAGE_SENSOR_SXGA_WIDTH (1280) -#define HI708_IMAGE_SENSOR_SXGA_HEIGHT (1024) - -#define HI708_IMAGE_SENSOR_FULL_WIDTH HI708_IMAGE_SENSOR_VGA_WIDTH-12 -#define HI708_IMAGE_SENSOR_FULL_HEIGHT HI708_IMAGE_SENSOR_VGA_HEIGHT-8 - -#define HI708_IMAGE_SENSOR_PV_WIDTH HI708_IMAGE_SENSOR_VGA_WIDTH-12 -#define HI708_IMAGE_SENSOR_PV_HEIGHT HI708_IMAGE_SENSOR_VGA_HEIGHT-8 - -//SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD -#define HI708_VGA_DEFAULT_PIXEL_NUMS (656) -#define HI708_VGA_DEFAULT_LINE_NUMS (500) - -#define HI708_QVGA_DEFAULT_PIXEL_NUMS (656) -#define HI708_QVGA_DEFAULT_LINE_NUMS (254) - -/* MAX/MIN FRAME RATE (FRAMES PER SEC.) */ -#define HI708_MIN_FRAMERATE_5 (50) -#define HI708_MIN_FRAMERATE_7_5 (75) -#define HI708_MIN_FRAMERATE_10 (100) -#define HI708_MIN_FRAMERATE_15 (150) - -//Video Fixed Framerate -#define HI708_VIDEO_FIX_FRAMERATE_5 (50) -#define HI708_VIDEO_FIX_FRAMERATE_7_5 (75) -#define HI708_VIDEO_FIX_FRAMERATE_10 (100) -#define HI708_VIDEO_FIX_FRAMERATE_15 (150) -#define HI708_VIDEO_FIX_FRAMERATE_20 (200) -#define HI708_VIDEO_FIX_FRAMERATE_25 (250) -#define HI708_VIDEO_FIX_FRAMERATE_30 (300) - - -#define HI708_WRITE_ID 0x60 -#define HI708_READ_ID 0x61 - - //#define HI708_SCCB_SLAVE_ADDR 0x60 - -typedef struct _SENSOR_INIT_INFO -{ - kal_uint8 address; - kal_uint8 data; -}HI708_SENSOR_INIT_INFO; -typedef enum __VIDEO_MODE__ -{ - HI708_VIDEO_NORMAL = 0, - HI708_VIDEO_MPEG4, - HI708_VIDEO_MAX -} HI708_VIDEO_MODE; - -struct HI708_sensor_STRUCT -{ - kal_bool first_init; - kal_bool pv_mode; //True: Preview Mode; False: Capture Mode - kal_bool night_mode; //True: Night Mode; False: Auto Mode - kal_bool MPEG4_Video_mode; //Video Mode: MJPEG or MPEG4 - kal_uint8 mirror; - kal_uint32 pv_pclk; //Preview Pclk - kal_uint32 cp_pclk; //Capture Pclk - kal_uint16 pv_dummy_pixels; //Dummy Pixels - kal_uint16 pv_dummy_lines; //Dummy Lines - kal_uint16 cp_dummy_pixels; //Dummy Pixels - kal_uint16 cp_dummy_lines; //Dummy Lines - kal_uint16 fix_framerate; //Fixed Framerate - kal_uint32 wb; - kal_uint32 exposure; - kal_uint32 effect; - kal_uint32 banding; - kal_uint16 pv_line_length; - kal_uint16 pv_frame_height; - kal_uint16 cp_line_length; - kal_uint16 cp_frame_height; - kal_uint16 video_current_frame_rate; -}; - - -//export functions -UINT32 HI708Open(void); -UINT32 HI708GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 HI708GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 HI708Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 HI708FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 HI708Close(void); - - -#endif /* __SENSOR_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.c b/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.c index 267926e3d6c..d09284d91b3 100644 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.c +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.c @@ -32,7 +32,9 @@ static DEFINE_SPINLOCK(kdsensor_drv_lock); static struct i2c_board_info __initdata i2c_devs1={I2C_BOARD_INFO(CAMERA_HW_DRVNAME1, 0xfe>>1)}; - +//add for hq camera debug log open/close +static kal_bool debugFlag = KAL_TRUE; +#define SENSORDB(fmt, arg...) if (debugFlag) {printk("[HQ_CAM][kd_sensorlist]" fmt, ##arg);} /****************************************************************************** @@ -58,6 +60,12 @@ static struct i2c_board_info __initdata i2c_devs1={I2C_BOARD_INFO(CAMERA_HW_DRVN #endif +#define CAM_NAME_LEN 32 +static char mainCameraName[CAM_NAME_LEN + 1] = {0}; +static char subCameraName[CAM_NAME_LEN + 1] = {0}; +char *g_main_camera = NULL; +char *g_sub_camera = NULL; + /******************************************************************************* * Proifling ********************************************************************************/ @@ -143,6 +151,103 @@ bool setExpGainDoneFlag = 0; ********************************************************************************/ static const struct i2c_device_id CAMERA_HW_i2c_id[] = {{CAMERA_HW_DRVNAME1,0},{}}; + +/*******************************************************************************/ +/*HQ camera sys debug begin */ +/*******************************************************************************/ +#define HQ_CAM_SYSFS_SUPPORT +#ifdef HQ_CAM_SYSFS_SUPPORT +UINT32 kdGetSensorInitFuncList(ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT **ppSensorList); + + +static ssize_t sensor_module_show(struct kobject * kobj,struct kobj_attribute * attr,char * buf) +{ + ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT *pSensorList_mid = NULL; + SENSOR_FUNCTION_STRUCT *g_pInvokeSensorFunc_mid[2] = {NULL,NULL}; + char *s = buf; + int vaule = 0; + int num = 0; + ssize_t ret; + kal_uint8 i; + UINT32 leght=1; + + if (0 != kdGetSensorInitFuncList(&pSensorList_mid)) { + PK_ERR("[HQ_CAM]ERROR:kdGetSensorInitFuncList()\n"); + return -EIO; + } + + for (num=0; num < MAX_NUM_OF_SUPPORT_SENSOR; num++) { + if (NULL == pSensorList_mid[num].SensorInit) { + SENSORDB("[HQ_CAM][kd_sensorlist]sensorlist end\n"); + break; + } + SENSORDB("[HQ_CAM][kd_sensorlist]sensorname=%s\n", pSensorList_mid[num].drvname); + pSensorList_mid[num].SensorInit(&g_pInvokeSensorFunc_mid[0]); + if ( g_pInvokeSensorFunc_mid[0] ) { + ret = g_pInvokeSensorFunc_mid[i]->SensorFeatureControl(SENSOR_FEATURE_GET_SENSOR_CURRENT_MID, &vaule, &leght); + //s += sprintf(s, "i is :%d,current MID: 0x%x\n", i, vaule); + if (vaule == 0x01) { + s += sprintf(s, "vaule is 0x%x, Rear Camera SP2509 BLX module\n",vaule); + } else if (vaule == 0x02) { + s += sprintf(s, "vaule is 0x%x, Rear Camera GC2355 HuaQuan module\n",vaule); + } else if (vaule == 0x03) { + s += sprintf(s, "vaule is 0x%x, Front Camera SP0A19 QunHui module\n",vaule); + } else if (vaule == 0x04) { + s += sprintf(s, "vaule is 0x%x, Front Camera GC0312 BLX module\n",vaule); + } else if (vaule == 0x05) { + s += sprintf(s, "vaule is 0x%x, Rear Camera SP2509 HuaQuan module\n",vaule); + } + else { + s += sprintf(s, "vaule is 0x%x, NULL module\n",vaule); + } + } + else { + SENSORDB("[HQ_CAM][kd_sensorlist] sensorlist is NULL"); + } + } + + return (s - buf); +} + +static ssize_t sensor_module_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) +{ + return n; +} + +static DEVICE_ATTR(sensor_module, 0644, sensor_module_show, sensor_module_store); + +static struct attribute *CAM_sysfs_attrs[] = { + &dev_attr_sensor_module.attr, + NULL, + }; +static struct attribute_group CAM_attr_group = { + .attrs = CAM_sysfs_attrs, + }; + +struct kobject *HQ_CAM_debug_kobj; +static int CAM_sysfs_init(void) +{ + HQ_CAM_debug_kobj = kobject_create_and_add("hq_cam", NULL); + if (HQ_CAM_debug_kobj == NULL) { + SENSORDB("[HQ_CAM][kd_sensorlist] falied to creat hq_cam\n"); + return -ENOMEM; + } + + return sysfs_create_group(HQ_CAM_debug_kobj, &CAM_attr_group); +} +static void CAM_sysfs_exit(void) +{ + sysfs_remove_group(HQ_CAM_debug_kobj, &CAM_attr_group); + kobject_put(HQ_CAM_debug_kobj); +} + +#endif +/*******************************************************************************/ +/*HQ camera sys debug end */ +/*******************************************************************************/ + + + /******************************************************************************* * general camera image sensor kernel driver *******************************************************************************/ @@ -906,6 +1011,27 @@ inline static int adopt_CAMERA_HW_Open(void) PK_DBG(" ERROR:SensorOpen(), turn off power \n"); kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM*) g_invokeSocketIdx, g_invokeSensorNameStr, false, CAMERA_HW_DRVNAME1); } + #if defined(HQ_HARDWAREINFO) + else{ // Add for sensor provider HW info module + int i = 0; + for(i = 0;i < KDIMGSENSOR_MAX_INVOKE_DRIVERS;i++){ + + if(g_bEnableDriver[i]){ + + if ((DUAL_CAMERA_MAIN_SENSOR == g_invokeSocketIdx[i])&& (g_main_camera != mainCameraName)){ + memcpy(mainCameraName,g_invokeSensorNameStr[i],CAM_NAME_LEN); + g_main_camera = mainCameraName; + } + else if ((DUAL_CAMERA_SUB_SENSOR == g_invokeSocketIdx[i]) && (g_sub_camera != subCameraName)) { + memcpy(subCameraName,g_invokeSensorNameStr[i],CAM_NAME_LEN); + g_sub_camera = subCameraName; + } + break; + } + + } + } + #endif } else { PK_DBG(" ERROR:NULL g_pSensorFunc\n"); @@ -1194,7 +1320,8 @@ inline static int adopt_CAMERA_HW_FeatureControl(void *pBuf) case SENSOR_FEATURE_SET_TEST_PATTERN: case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: case SENSOR_FEATURE_GET_SENSOR_CURRENT_TEMPERATURE: - case SENSOR_FEATURE_SET_YUV_3A_CMD: + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID: + case SENSOR_FEATURE_SET_YUV_3A_CMD: // if(copy_from_user((void*)pFeaturePara , (void *) pFeatureCtrl->pFeaturePara, FeatureParaLen)) { kfree(pFeaturePara); @@ -1344,6 +1471,7 @@ inline static int adopt_CAMERA_HW_FeatureControl(void *pBuf) case SENSOR_FEATURE_SET_TEST_PATTERN: case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: case SENSOR_FEATURE_GET_SENSOR_CURRENT_TEMPERATURE: + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID: // if(copy_to_user((void __user *) pFeatureCtrl->pFeaturePara, (void*)pFeaturePara , FeatureParaLen)) { kfree(pFeaturePara); @@ -1682,6 +1810,7 @@ static int CAMERA_HW_i2c_probe(struct i2c_client *client, const struct i2c_devic return i4RetValue; } + CAM_sysfs_init();//add by cuirui for camera debug //spin_lock_init(&g_CamHWLock); PK_DBG("[CAMERA_HW] Attached!! \n"); @@ -1694,7 +1823,8 @@ static int CAMERA_HW_i2c_probe(struct i2c_client *client, const struct i2c_devic ********************************************************************************/ static int CAMERA_HW_i2c_remove(struct i2c_client *client) { - return 0; + CAM_sysfs_exit();//add by cuirui for camera debug + return 0; } /******************************************************************************* @@ -1792,6 +1922,34 @@ static ssize_t CAMERA_HW_Reg_Debug(struct file *pFile, const char __user *buffer return count; } +static ssize_t CAMERA_HW_Reg_Debug_2(struct file *pFile, const char __user *buffer, size_t count, + loff_t *ppos) +{ + char regBuf[64] = {'\0'}; + u32 u4CopyBufSize = (count < (sizeof(regBuf) - 1)) ? (count) : (sizeof(regBuf) - 1); + + MSDK_SENSOR_REG_INFO_STRUCT sensorReg; + memset(&sensorReg, 0, sizeof(MSDK_SENSOR_REG_INFO_STRUCT)); + + if (copy_from_user(regBuf, buffer, u4CopyBufSize)) + return -EFAULT; + + if (sscanf(regBuf, "%x %x", &sensorReg.RegAddr, &sensorReg.RegData) == 2) { + if (g_pSensorFunc != NULL) { + g_pSensorFunc->SensorFeatureControl(DUAL_CAMERA_SUB_SENSOR, SENSOR_FEATURE_SET_REGISTER, (MUINT8*)&sensorReg, (MUINT32*)sizeof(MSDK_SENSOR_REG_INFO_STRUCT)); + g_pSensorFunc->SensorFeatureControl(DUAL_CAMERA_SUB_SENSOR, SENSOR_FEATURE_GET_REGISTER, (MUINT8*)&sensorReg, (MUINT32*)sizeof(MSDK_SENSOR_REG_INFO_STRUCT)); + PK_DBG("write addr = 0x%08x, data = 0x%08x\n", sensorReg.RegAddr, sensorReg.RegData); + } + } + else if (sscanf(regBuf, "%x", &sensorReg.RegAddr) == 1) { + if (g_pSensorFunc != NULL) { + g_pSensorFunc->SensorFeatureControl(DUAL_CAMERA_SUB_SENSOR, SENSOR_FEATURE_GET_REGISTER, (MUINT8*)&sensorReg, (MUINT32*)sizeof(MSDK_SENSOR_REG_INFO_STRUCT)); + PK_DBG("read addr = 0x%08x, data = 0x%08x\n", sensorReg.RegAddr, sensorReg.RegData); + } + } + + return count; +} @@ -1816,6 +1974,12 @@ static const struct file_operations g_stCAMERA_camsensor_fops = { .write = CAMERA_HW_Reg_Debug }; +static const struct file_operations g_stCAMERA_camsensor2_fops = { + .owner = THIS_MODULE, + .read = CAMERA_HW_DumpReg_To_Proc, + .write = CAMERA_HW_Reg_Debug_2 +}; + /*======================================================================= * CAMERA_HW_i2C_init() *=======================================================================*/ @@ -1840,6 +2004,10 @@ static int __init CAMERA_HW_i2C_init(void) PK_ERR("add /proc/driver/camsensor entry fail\n"); } + prEntry = proc_create("driver/camsensor2", 0, NULL, &g_stCAMERA_camsensor2_fops); + if (!prEntry) { + PK_ERR("add /proc/driver/camsensor2 entry fail\n"); + } atomic_set(&g_CamHWOpend, 0); diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.h b/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.h index db99154cde0..1f59a63314c 100644 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.h +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/kd_sensorlist.h @@ -1,5 +1,5 @@ -//s_add new sensor driver here -//export funtions +/*s_add new sensor driver here*/ +/*export funtions*/ UINT32 OV2722MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 MT9P012SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 MT9P015SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); @@ -62,59 +62,33 @@ UINT32 S5K8AAYX_PVI_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 S5K4ECGX_MIPI_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 S5K4ECGX_MIPI_JPG_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 S5K3H2YX_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 SP0A19_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 SP0A19_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 SP2509_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 GC0312MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 GC0312_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 GC0312_YUV_BLX_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 GC0313MIPI_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 IMX135_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 OV16825MIPISensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 IMX220_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 GC0329_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 GC2355_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 GC2355_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 GC2356_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); +UINT32 GC2355_HUAQUAN_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 GC0330_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); UINT32 S5K4H5YX_2LANE_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 GC2355_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 HI708_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 OV2680MIPISensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 S5K5E2YA_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 OV5670_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 OV56702ND_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -UINT32 GC2355MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); -//! Add Sensor Init function here -//! Note: -//! 1. Add by the resolution from ""large to small"", due to large sensor -//! will be possible to be main sensor. -//! This can avoid I2C error during searching sensor. -//! 2. This file should be the same as mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp +/*! Add Sensor Init function here +Note: +1. Add by the resolution from ""large to small"", due to large sensor + will be possible to be main sensor. + This can avoid I2C error during searching sensor. + 2. This file should be the same as mediatek\custom\common\hal\imgsensor\src\sensorlist.cpp +*/ ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] = { - -#if defined(OV5670_MIPI_RAW) - {OV5670_SENSOR_ID, SENSOR_DRVNAME_OV5670_MIPI_RAW, OV5670_MIPI_RAW_SensorInit}, -#endif - -#if defined(OV56702ND_MIPI_RAW) - {OV5670_SENSOR_ID+1, SENSOR_DRVNAME_OV56702ND_MIPI_RAW, OV56702ND_MIPI_RAW_SensorInit}, -#endif - -#if defined(S5K5E2YA_MIPI_RAW) - {S5K5E2YA_SENSOR_ID, SENSOR_DRVNAME_S5K5E2YA_MIPI_RAW, S5K5E2YA_MIPI_RAW_SensorInit}, -#endif - -#if defined(OV2680_RAW) - {OV2680MIPI_SENSOR_ID, SENSOR_DRVNAME_OV2680_RAW, OV2680MIPISensorInit}, -#endif - -#if defined(GC2355_MIPI_RAW) - {GC2355MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2355_MIPI_RAW, GC2355MIPI_RAW_SensorInit}, -#endif - -#if defined(GC2355_RAW) - {GC2355_SENSOR_ID, SENSOR_DRVNAME_GC2355_RAW, GC2355_RAW_SensorInit}, -#endif - -#if defined(HI708_YUV) - {HI708_SENSOR_ID, SENSOR_DRVNAME_HI708_YUV, HI708_YUV_SensorInit}, -#endif #if defined(OV16825_MIPI_RAW) {OV16825MIPI_SENSOR_ID, SENSOR_DRVNAME_OV16825_MIPI_RAW, OV16825MIPISensorInit}, #endif @@ -281,9 +255,6 @@ ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] = {PAS6180_SENSOR_ID, SENSOR_DRVNAME_PAS6180_SERIAL_YUV, PAS6180_SERIAL_YUV_SensorInit}, #endif -#if defined(HI704_YUV) - {HI704_SENSOR_ID, SENSOR_DRVNAME_HI704_YUV, HI704_YUV_SensorInit}, -#endif #if defined(IMX105_MIPI_RAW) {IMX105_SENSOR_ID, SENSOR_DRVNAME_IMX105_MIPI_RAW, IMX105_MIPI_RAW_SensorInit}, #endif @@ -306,8 +277,11 @@ ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] = {S5K8AAYX_MIPI_SENSOR_ID, SENSOR_DRVNAME_S5K8AAYX_YUV, S5K8AAYX_PVI_YUV_SensorInit}, #endif -#if defined(SP0A19_YUV) - {SP0A19_YUV_SENSOR_ID, SENSOR_DRVNAME_SP0A19_YUV, SP0A19_YUV_SensorInit}, +#if defined(SP0A19_RAW) + {SP0A19_SENSOR_ID, SENSOR_DRVNAME_SP0A19_RAW, SP0A19_RAW_SensorInit}, +#endif +#if defined(SP2509_MIPI_RAW) + {SP2509MIPI_SENSOR_ID, SENSOR_DRVNAME_SP2509_MIPI_RAW, SP2509_MIPI_RAW_SensorInit}, #endif #if defined(GC0313_MIPI_YUV) {GC0313MIPI_YUV_SENSOR_ID, SENSOR_DRVNAME_GC0313MIPI_YUV, GC0313MIPI_YUV_SensorInit}, @@ -315,6 +289,18 @@ ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] = #if defined(GC0329_YUV) {GC0329_SENSOR_ID, SENSOR_DRVNAME_GC0329_YUV, GC0329_YUV_SensorInit}, #endif +#if defined(GC2355_RAW) + {GC2355_SENSOR_ID, SENSOR_DRVNAME_GC2355_RAW, GC2355_RAW_SensorInit}, +#endif +#if defined(GC2355_MIPI_RAW) + {GC2355MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2355_MIPI_RAW, GC2355_MIPI_RAW_SensorInit}, +#endif +#if defined(GC2355_MIPI_RAW_QUNHUI) + {GC2356MIPI_SENSOR_ID, SENSOR_DRVNAME_GC2356_MIPI_RAW, GC2356_MIPI_RAW_SensorInit}, +#endif +#if defined(GC2355_MIPI_RAW_HUAQUAN) + {GC2355MIPI_SENSOR_ID_HUAQUAN, SENSOR_DRVNAME_GC2355_MIPI_RAW_HUAQUAN, GC2355_HUAQUAN_MIPI_RAW_SensorInit}, +#endif #if defined(GC0330_YUV) {GC0330_SENSOR_ID, SENSOR_DRVNAME_GC0330_YUV, GC0330_YUV_SensorInit}, #endif @@ -325,10 +311,22 @@ ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR+1] = #if defined(S5K4H5YX_2LANE_MIPI_RAW) {S5K4H5YX_2LANE_SENSOR_ID, SENSOR_DRVNAME_S5K4H5YX_2LANE_MIPI_RAW, S5K4H5YX_2LANE_MIPI_RAW_SensorInit}, #endif - - -/* ADD sensor driver before this line */ - {0,{0},NULL}, //end of list +/*Sub camera should be added here, Bill modified start in 20150402*/ +#if defined(GC0312_MIPI_RAW) + {GC0312MIPI_SENSOR_ID,SENSOR_DRVNAME_GC0312_RAW, GC0312MIPI_RAW_SensorInit}, +#endif +#if defined(GC0312_YUV) + {GC0312_SENSOR_ID,SENSOR_DRVNAME_GC0312_YUV, GC0312_YUV_SensorInit}, +#endif +#if defined(GC0312_YUV_BLX) + {GC0312_SENSOR_ID_BLX,SENSOR_DRVNAME_GC0312_YUV_BLX, GC0312_YUV_BLX_SensorInit}, +#endif +#if defined(HI704_YUV) + {HI704_SENSOR_ID, SENSOR_DRVNAME_HI704_YUV, HI704_YUV_SensorInit}, +#endif +/*Bill modified end*/ +/* ADD sensor driver before this line */ + {0 , {0} , NULL}, /*end of list*/ }; -//e_add new sensor driver here +/*e_add new sensor driver here*/ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/Makefile b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/Makefile deleted file mode 100644 index 6174973c5cd..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom - -obj-y += ov2659yuv_Sensor.o - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Sensor.c deleted file mode 100644 index 67ccceddff7..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Sensor.c +++ /dev/null @@ -1,1796 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" -#include "kd_camera_feature.h" -#include "ov2659yuv_Sensor.h" -#include "ov2659yuv_Camera_Sensor_para.h" -#include "ov2659yuv_CameraCustomized.h" - -#define OV2659YUV_DEBUG -#ifdef OV2659YUV_DEBUG -#define OV2659SENSORDB printk -#else -#define OV2659SENSORDB(x,...) -#endif - -static DEFINE_SPINLOCK(ov2659_drv_lock); - -extern int iReadReg(u16 a_u2Addr , u8 * a_puBuff , u16 i2cId); -extern int iWriteReg(u16 a_u2Addr , u32 a_u4Data , u32 a_u4Bytes , u16 i2cId); - -#define OV2659_write_cmos_sensor(addr, para) iWriteReg((u16) addr , (u32) para ,1,OV2659_WRITE_ID) -#define mDELAY(ms) mdelay(ms) -#define OV2659_TEST_PATTERN_CHECKSUM (0x1c936910) // 0x7ba87eae - -static struct -{ - kal_uint8 IsPVmode; - kal_uint32 PreviewDummyPixels; - kal_uint32 PreviewDummyLines; - kal_uint32 CaptureDummyPixels; - kal_uint32 CaptureDummyLines; - kal_uint32 PreviewPclk; - kal_uint32 CapturePclk; - kal_uint32 PreviewShutter; - kal_uint32 SensorGain; - kal_uint32 sceneMode; - kal_uint32 SensorShutter; - unsigned char isoSpeed; - OV2659_SENSOR_MODE SensorMode; -} OV2659Sensor; - -UINT16 WBcount = 0; - -MSDK_SENSOR_CONFIG_STRUCT OV2659SensorConfigData; - - - -kal_uint16 OV2659_read_cmos_sensor(kal_uint32 addr) -{ - kal_uint16 get_byte=0; - - iReadReg((u16)addr, (u8*)&get_byte, OV2659_WRITE_ID); - - return get_byte; -} - - - -kal_uint32 OV2659_gain_check(kal_uint32 gain) -{ - gain = (gain > OV2659_MAX_GAIN) ? OV2659_MAX_GAIN : gain; - gain = (gain < OV2659_MIN_GAIN) ? OV2659_MIN_GAIN : gain; - - return gain; -} - - - -static void OV2659_set_AE_mode(kal_bool AE_enable) -{ - kal_uint8 AeTemp; - - AeTemp = OV2659_read_cmos_sensor(0x3503); - - if (AE_enable == KAL_TRUE) - { - OV2659SENSORDB("[OV2659_set_AE_mode] enable\n"); - - OV2659_write_cmos_sensor(0x3503, (AeTemp & (~0x07))); - } - else - { - OV2659SENSORDB("[OV2659_set_AE_mode] disable\n"); - - OV2659_write_cmos_sensor(0x3503, (AeTemp | 0x07)); - } -} - - - -static void OV2659WriteShutter(kal_uint32 shutter) -{ - kal_uint32 extra_exposure_lines = 0; - - OV2659SENSORDB("[OV2659WriteShutter] shutter=%d\n", shutter); - - if (OV2659Sensor.IsPVmode) - { - if (shutter <= OV2659_PV_EXPOSURE_LIMITATION) - extra_exposure_lines = 0; - else - extra_exposure_lines = shutter - OV2659_PV_EXPOSURE_LIMITATION; - } - else - { - if (shutter <= OV2659_FULL_EXPOSURE_LIMITATION) - extra_exposure_lines = 0; - else - extra_exposure_lines = shutter - OV2659_FULL_EXPOSURE_LIMITATION; - } - - shutter *= 16; - - OV2659_write_cmos_sensor(0x3502, shutter & 0x00FF); - OV2659_write_cmos_sensor(0x3501, ((shutter & 0x0FF00) >>8)); - OV2659_write_cmos_sensor(0x3500, ((shutter & 0xFF0000) >> 16)); - - if(extra_exposure_lines>0) - { - OV2659_write_cmos_sensor(0x3507, extra_exposure_lines & 0xFF); - OV2659_write_cmos_sensor(0x3506, (extra_exposure_lines & 0xFF00) >> 8); - } - else - { - OV2659_write_cmos_sensor(0x3507, 0x00); - OV2659_write_cmos_sensor(0x3506, 0x00); - } -} - - - -static void OV2659WriteSensorGain(kal_uint32 gain) -{ - kal_uint16 temp_reg = 0; - - OV2659SENSORDB("[OV2659WriteSensorGain] gain=%d\n", gain); - - gain = OV2659_gain_check(gain); - temp_reg = gain&0xFF; - - OV2659_write_cmos_sensor(0x350B, temp_reg); -} - - - -void OV2659_night_mode(kal_bool enable) -{ - kal_uint16 night = OV2659_read_cmos_sensor(0x3A00); - - if (enable) - { - OV2659SENSORDB("[OV2659_night_mode] enable\n"); - - OV2659_write_cmos_sensor(0x3A00, night | 0x04); // 25fps-5fps - OV2659_write_cmos_sensor(0x3a02, 0x0e); - OV2659_write_cmos_sensor(0x3a03, 0x70); - OV2659_write_cmos_sensor(0x3a14, 0x0e); - OV2659_write_cmos_sensor(0x3a15, 0x70); - } - else - { - OV2659SENSORDB("[OV2659_night_mode] disable\n"); - - OV2659_write_cmos_sensor(0x3A00, night | 0x04); //25fps-12.5fps - OV2659_write_cmos_sensor(0x3a02, 0x07); - OV2659_write_cmos_sensor(0x3a03, 0x38); - OV2659_write_cmos_sensor(0x3a14, 0x07); - OV2659_write_cmos_sensor(0x3a15, 0x38); - } -} - - - -void OV2659_set_contrast(UINT16 para) -{ - OV2659SENSORDB("[OV2659_set_contrast]para=%d\n", para); - - switch (para) - { - case ISP_CONTRAST_HIGH: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5080, 0x28); - OV2659_write_cmos_sensor(0x5081, 0x28); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case ISP_CONTRAST_MIDDLE: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5080, 0x20); - OV2659_write_cmos_sensor(0x5081, 0x20); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case ISP_CONTRAST_LOW: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5080, 0x18); - OV2659_write_cmos_sensor(0x5081, 0x18); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - default: - break; - } -} - - - -void OV2659_set_brightness(UINT16 para) -{ - OV2659SENSORDB("[OV5645MIPI_set_brightness]para=%d\n", para); - - switch (para) - { - case ISP_BRIGHT_HIGH: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3a0f, 0x50); - OV2659_write_cmos_sensor(0x3a10, 0x48); - OV2659_write_cmos_sensor(0x3a11, 0xa0); - OV2659_write_cmos_sensor(0x3a1b, 0x50); - OV2659_write_cmos_sensor(0x3a1e, 0x48); - OV2659_write_cmos_sensor(0x3a1f, 0x24); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case ISP_BRIGHT_MIDDLE: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3a0f, 0x38); - OV2659_write_cmos_sensor(0x3a10, 0x30); - OV2659_write_cmos_sensor(0x3a11, 0x70); - OV2659_write_cmos_sensor(0x3a1b, 0x38); - OV2659_write_cmos_sensor(0x3a1e, 0x30); - OV2659_write_cmos_sensor(0x3a1f, 0x18); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case ISP_BRIGHT_LOW: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3a0f, 0x20); - OV2659_write_cmos_sensor(0x3a10, 0x18); - OV2659_write_cmos_sensor(0x3a11, 0x40); - OV2659_write_cmos_sensor(0x3a1b, 0x20); - OV2659_write_cmos_sensor(0x3a1e, 0x18); - OV2659_write_cmos_sensor(0x3a1f, 0x0c); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - default: - break; - } -} - - - -void OV2659_set_saturation(UINT16 para) -{ - OV2659SENSORDB("[OV5645MIPI_set_saturation]para=%d\n", para); - - switch (para) - { - case ISP_SAT_HIGH: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5073, 0x1B); - OV2659_write_cmos_sensor(0x5074, 0xd6); - OV2659_write_cmos_sensor(0x5075, 0xf2); - OV2659_write_cmos_sensor(0x5076, 0xf2); - OV2659_write_cmos_sensor(0x5077, 0xe7); - OV2659_write_cmos_sensor(0x5078, 0x0a); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case ISP_SAT_MIDDLE: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5073, 0x17); - OV2659_write_cmos_sensor(0x5074, 0xb3); - OV2659_write_cmos_sensor(0x5075, 0xca); - OV2659_write_cmos_sensor(0x5076, 0xca); - OV2659_write_cmos_sensor(0x5077, 0xc1); - OV2659_write_cmos_sensor(0x5078, 0x09); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case ISP_SAT_LOW: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5073, 0x12); - OV2659_write_cmos_sensor(0x5074, 0x8f); - OV2659_write_cmos_sensor(0x5075, 0xa1); - OV2659_write_cmos_sensor(0x5076, 0xa1); - OV2659_write_cmos_sensor(0x5077, 0x9a); - OV2659_write_cmos_sensor(0x5078, 0x07); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - default: - break; - } -} - - - -void OV2659_set_iso(UINT16 para) -{ - OV2659SENSORDB("[OV5645MIPI_set_iso]para=%d\n", para); - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.isoSpeed = para; - spin_unlock(&ov2659_drv_lock); - - switch (para) - { - case AE_ISO_AUTO: - OV2659_write_cmos_sensor(0x3a19, 0x38); - break; - case AE_ISO_100: - OV2659_write_cmos_sensor(0x3a19, 0x18); - break; - case AE_ISO_200: - OV2659_write_cmos_sensor(0x3a19, 0x38); - break; - case AE_ISO_400: - OV2659_write_cmos_sensor(0x3a19, 0x58); - break; - default: - break; - } -} - - - -BOOL OV2659_set_param_exposure_for_HDR(UINT16 para) -{ - kal_uint32 gain = 0, shutter = 0; - - OV2659SENSORDB("[OV2659_set_param_exposure_for_HDR]para=%d\n", para); - - OV2659_set_AE_mode(KAL_FALSE); - - gain = OV2659Sensor.SensorGain; - shutter = OV2659Sensor.SensorShutter; - - switch (para) - { - case AE_EV_COMP_20: - case AE_EV_COMP_10: - gain =gain<<1; - shutter = shutter<<1; - break; - case AE_EV_COMP_00: - break; - case AE_EV_COMP_n10: - case AE_EV_COMP_n20: - gain = gain >> 1; - shutter = shutter >> 1; - break; - default: - break; - } - - OV2659WriteSensorGain(gain); - OV2659WriteShutter(shutter); - - return TRUE; -} - - - -void OV2659_set_scene_mode(UINT16 para) -{ - OV2659SENSORDB("[OV2659_set_scene_mode]para=%d\n", para); - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.sceneMode=para; - spin_unlock(&ov2659_drv_lock); - - switch (para) - { - case SCENE_MODE_NIGHTSCENE: - OV2659_night_mode(KAL_TRUE); - break; - case SCENE_MODE_PORTRAIT: - case SCENE_MODE_LANDSCAPE: - case SCENE_MODE_SUNSET: - case SCENE_MODE_SPORTS: - case SCENE_MODE_HDR: - break; - case SCENE_MODE_OFF: - OV2659_night_mode(KAL_FALSE); - break; - default: - break; - } -} - - - -static void OV2659SetDummy(kal_uint32 dummy_pixels, kal_uint32 dummy_lines) -{ - kal_uint32 temp_reg, temp_reg1, temp_reg2; - - OV2659SENSORDB("[OV2659SetDummy] dummy_pixels=%d, dummy_lines=%d\n", dummy_pixels, dummy_lines); - - if (dummy_pixels > 0) - { - temp_reg1 = OV2659_read_cmos_sensor(0x380D); - temp_reg2 = OV2659_read_cmos_sensor(0x380C); - - temp_reg = (temp_reg1 & 0xFF) | (temp_reg2 << 8); - temp_reg += dummy_pixels; - - OV2659_write_cmos_sensor(0x380D, (temp_reg & 0xFF)); - OV2659_write_cmos_sensor(0x380C, ((temp_reg & 0xFF00) >> 8)); - } - - if (dummy_lines > 0) - { - temp_reg1 = OV2659_read_cmos_sensor(0x380F); - temp_reg2 = OV2659_read_cmos_sensor(0x380E); - - temp_reg = (temp_reg1 & 0xFF) | (temp_reg2 << 8); - temp_reg += dummy_lines; - - OV2659_write_cmos_sensor(0x380F, (temp_reg & 0xFF)); - OV2659_write_cmos_sensor(0x380E, ((temp_reg & 0xFF00) >> 8)); - } -} - - - -static kal_uint32 OV2659ReadShutter(void) -{ - kal_uint16 temp_reg1, temp_reg2 ,temp_reg3; - - temp_reg1 = OV2659_read_cmos_sensor(0x3500); - temp_reg2 = OV2659_read_cmos_sensor(0x3501); - temp_reg3 = OV2659_read_cmos_sensor(0x3502); - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.PreviewShutter = (temp_reg1 << 12)| (temp_reg2 << 4)|(temp_reg3 >> 4); - spin_unlock(&ov2659_drv_lock); - - OV2659SENSORDB("[OV2659ReadShutter] shutter=%d\n", OV2659Sensor.PreviewShutter); - - return OV2659Sensor.PreviewShutter; -} - - - -static kal_uint32 OV2659ReadSensorGain(void) -{ - kal_uint32 sensor_gain = 0; - - sensor_gain=(OV2659_read_cmos_sensor(0x350B) & 0xFF); - - OV2659SENSORDB("[OV2659ReadSensorGain] gain_350B=%d\n", sensor_gain); - - return sensor_gain; -} - - - - -static void OV2659_set_AWB_mode(kal_bool AWB_enable) -{ - kal_uint8 AwbTemp; - - AwbTemp = OV2659_read_cmos_sensor(0x3406); - - if (AWB_enable == KAL_TRUE) - { - OV2659SENSORDB("[OV2659_set_AWB_mode] enable\n"); - OV2659_write_cmos_sensor(0x3406, AwbTemp & 0xFE); - } - else - { - OV2659SENSORDB("[OV2659_set_AWB_mode] disable\n"); - OV2659_write_cmos_sensor(0x3406, AwbTemp | 0x01); - } - -} - - - -BOOL OV2659_set_param_wb(UINT16 para) -{ - OV2659SENSORDB("[OV2659_set_param_wb]para=%d\n", para); - - switch (para) - { - case AWB_MODE_OFF: - OV2659_set_AWB_mode(KAL_FALSE); - break; - case AWB_MODE_AUTO: - OV2659_set_AWB_mode(KAL_TRUE); - break; - case AWB_MODE_CLOUDY_DAYLIGHT: - OV2659_set_AWB_mode(KAL_FALSE); - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3400, 0x06); - OV2659_write_cmos_sensor(0x3401, 0x30); - OV2659_write_cmos_sensor(0x3402, 0x04); - OV2659_write_cmos_sensor(0x3403, 0x00); - OV2659_write_cmos_sensor(0x3404, 0x04); - OV2659_write_cmos_sensor(0x3405, 0x30); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case AWB_MODE_DAYLIGHT: - OV2659_set_AWB_mode(KAL_FALSE); - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3400, 0x06); - OV2659_write_cmos_sensor(0x3401, 0x10); - OV2659_write_cmos_sensor(0x3402, 0x04); - OV2659_write_cmos_sensor(0x3403, 0x00); - OV2659_write_cmos_sensor(0x3404, 0x04); - OV2659_write_cmos_sensor(0x3405, 0x48); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case AWB_MODE_INCANDESCENT: - OV2659_set_AWB_mode(KAL_FALSE); - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3400, 0x04); - OV2659_write_cmos_sensor(0x3401, 0xe0); - OV2659_write_cmos_sensor(0x3402, 0x04); - OV2659_write_cmos_sensor(0x3403, 0x00); - OV2659_write_cmos_sensor(0x3404, 0x05); - OV2659_write_cmos_sensor(0x3405, 0xa0); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case AWB_MODE_TUNGSTEN: - OV2659_set_AWB_mode(KAL_FALSE); - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3400, 0x05); - OV2659_write_cmos_sensor(0x3401, 0x48); - OV2659_write_cmos_sensor(0x3402, 0x04); - OV2659_write_cmos_sensor(0x3403, 0x00); - OV2659_write_cmos_sensor(0x3404, 0x05); - OV2659_write_cmos_sensor(0x3405, 0xe0); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case AWB_MODE_FLUORESCENT: - OV2659_set_AWB_mode(KAL_FALSE); - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x3400, 0x04); - OV2659_write_cmos_sensor(0x3401, 0x00); - OV2659_write_cmos_sensor(0x3402, 0x04); - OV2659_write_cmos_sensor(0x3403, 0x00); - OV2659_write_cmos_sensor(0x3404, 0x06); - OV2659_write_cmos_sensor(0x3405, 0x50); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - default: - return FALSE; - } - - spin_lock(&ov2659_drv_lock); - WBcount= para; - spin_unlock(&ov2659_drv_lock); - - return TRUE; -} - - - -static kal_uint32 OV2659_GetSensorID(kal_uint32 *sensorID) -{ - volatile signed char i; - kal_uint32 sensor_id=0; - - OV2659_write_cmos_sensor(0x0103, 0x01); - mDELAY(10); - - for(i=0;i<3;i++) - { - sensor_id = (OV2659_read_cmos_sensor(0x300A) << 8) | OV2659_read_cmos_sensor(0x300B); - - OV2659SENSORDB("[OV2659_GetSensorID] sensorID=%x\n", sensor_id); - - if(sensor_id != OV2659_SENSOR_ID) - { - *sensorID =0xffffffff; - - return ERROR_SENSOR_CONNECT_FAIL; - } - } - - *sensorID = sensor_id; - - return ERROR_NONE; -} - - - -static void OV2659InitialSetting(void) -{ - OV2659SENSORDB("[OV2659InitialSetting]\n"); - - OV2659_write_cmos_sensor(0x3000, 0x0f); - OV2659_write_cmos_sensor(0x3001, 0xff); - OV2659_write_cmos_sensor(0x3002, 0xff); - OV2659_write_cmos_sensor(0x0100, 0x01); - OV2659_write_cmos_sensor(0x3633, 0x3d); - OV2659_write_cmos_sensor(0x3620, 0x02); - OV2659_write_cmos_sensor(0x3631, 0x11); - OV2659_write_cmos_sensor(0x3612, 0x04); - OV2659_write_cmos_sensor(0x3630, 0x20); - OV2659_write_cmos_sensor(0x4702, 0x02); - OV2659_write_cmos_sensor(0x370c, 0x34); - OV2659_write_cmos_sensor(0x4003, 0x88); - OV2659_write_cmos_sensor(0x3800, 0x00); - OV2659_write_cmos_sensor(0x3801, 0x00); - OV2659_write_cmos_sensor(0x3802, 0x00); - OV2659_write_cmos_sensor(0x3803, 0x00); - OV2659_write_cmos_sensor(0x3804, 0x06); - OV2659_write_cmos_sensor(0x3805, 0x5f); - OV2659_write_cmos_sensor(0x3806, 0x04); - OV2659_write_cmos_sensor(0x3807, 0xb7); - OV2659_write_cmos_sensor(0x3808, 0x03); - OV2659_write_cmos_sensor(0x3809, 0x20); - OV2659_write_cmos_sensor(0x380a, 0x02); - OV2659_write_cmos_sensor(0x380b, 0x58); - OV2659_write_cmos_sensor(0x3811, 0x08); - OV2659_write_cmos_sensor(0x3813, 0x02); - OV2659_write_cmos_sensor(0x3814, 0x31); - OV2659_write_cmos_sensor(0x3815, 0x31); - OV2659_write_cmos_sensor(0x3820, 0x81); - OV2659_write_cmos_sensor(0x3821, 0x01); - OV2659_write_cmos_sensor(0x5002, 0x10); - OV2659_write_cmos_sensor(0x4608, 0x00); - OV2659_write_cmos_sensor(0x4609, 0xa0); - OV2659_write_cmos_sensor(0x3623, 0x00); - OV2659_write_cmos_sensor(0x3634, 0x76); - OV2659_write_cmos_sensor(0x3701, 0x44); - OV2659_write_cmos_sensor(0x3208, 0x01); - OV2659_write_cmos_sensor(0x3702, 0x18); - OV2659_write_cmos_sensor(0x3703, 0x24); - OV2659_write_cmos_sensor(0x3704, 0x24); - OV2659_write_cmos_sensor(0x3208, 0x11); - OV2659_write_cmos_sensor(0x3208, 0x02); - OV2659_write_cmos_sensor(0x3702, 0x30); - OV2659_write_cmos_sensor(0x3703, 0x48); - OV2659_write_cmos_sensor(0x3704, 0x48); - OV2659_write_cmos_sensor(0x3208, 0x12); - OV2659_write_cmos_sensor(0x3705, 0x0c); - OV2659_write_cmos_sensor(0x370a, 0x52); - OV2659_write_cmos_sensor(0x3003, 0x80);//3 - OV2659_write_cmos_sensor(0x3004, 0x10); - OV2659_write_cmos_sensor(0x3005, 0x16); - OV2659_write_cmos_sensor(0x3006, 0x0d); - OV2659_write_cmos_sensor(0x380c, 0x05); - OV2659_write_cmos_sensor(0x380d, 0x14); - OV2659_write_cmos_sensor(0x380e, 0x02); - OV2659_write_cmos_sensor(0x380f, 0xe3); - OV2659_write_cmos_sensor(0x3a05, 0x30); - OV2659_write_cmos_sensor(0x3a08, 0x00); - OV2659_write_cmos_sensor(0x3a09, 0xb9); - OV2659_write_cmos_sensor(0x3a0e, 0x04); - OV2659_write_cmos_sensor(0x3a0a, 0x00); - OV2659_write_cmos_sensor(0x3a0b, 0x9a); - OV2659_write_cmos_sensor(0x3a0d, 0x04); - OV2659_write_cmos_sensor(0x3a00, 0x3c); - OV2659_write_cmos_sensor(0x3a02, 0x05); - OV2659_write_cmos_sensor(0x3a03, 0xc6); - OV2659_write_cmos_sensor(0x3a14, 0x05); - OV2659_write_cmos_sensor(0x3a15, 0xc6); - OV2659_write_cmos_sensor(0x350c, 0x00); - OV2659_write_cmos_sensor(0x350d, 0x00); - OV2659_write_cmos_sensor(0x4300, 0x31); - OV2659_write_cmos_sensor(0x5086, 0x02); - OV2659_write_cmos_sensor(0x5000, 0xff); - OV2659_write_cmos_sensor(0x5001, 0x1f); - OV2659_write_cmos_sensor(0x507e, 0x3a); - OV2659_write_cmos_sensor(0x507f, 0x10); - OV2659_write_cmos_sensor(0x507c, 0x80); - OV2659_write_cmos_sensor(0x507d, 0x00); - OV2659_write_cmos_sensor(0x507b, 0x06); - OV2659_write_cmos_sensor(0x5025, 0x06); - OV2659_write_cmos_sensor(0x5026, 0x0c); - OV2659_write_cmos_sensor(0x5027, 0x1c); - OV2659_write_cmos_sensor(0x5028, 0x36); - OV2659_write_cmos_sensor(0x5029, 0x4e); - OV2659_write_cmos_sensor(0x502a, 0x5f); - OV2659_write_cmos_sensor(0x502b, 0x6d); - OV2659_write_cmos_sensor(0x502c, 0x78); - OV2659_write_cmos_sensor(0x502d, 0x84); - OV2659_write_cmos_sensor(0x502e, 0x95); - OV2659_write_cmos_sensor(0x502f, 0xa5); - OV2659_write_cmos_sensor(0x5030, 0xb4); - OV2659_write_cmos_sensor(0x5031, 0xc8); - OV2659_write_cmos_sensor(0x5032, 0xde); - OV2659_write_cmos_sensor(0x5033, 0xf0); - OV2659_write_cmos_sensor(0x5034, 0x15); - OV2659_write_cmos_sensor(0x5070, 0x28); - OV2659_write_cmos_sensor(0x5071, 0x48); - OV2659_write_cmos_sensor(0x5072, 0x10); - OV2659_write_cmos_sensor(0x5073, 0x17); - OV2659_write_cmos_sensor(0x5074, 0xb3); - OV2659_write_cmos_sensor(0x5075, 0xca); - OV2659_write_cmos_sensor(0x5076, 0xca); - OV2659_write_cmos_sensor(0x5077, 0xc1); - OV2659_write_cmos_sensor(0x5078, 0x09); - OV2659_write_cmos_sensor(0x5079, 0x98); - OV2659_write_cmos_sensor(0x507a, 0x01); - OV2659_write_cmos_sensor(0x5035, 0x6a); - OV2659_write_cmos_sensor(0x5036, 0x11); - OV2659_write_cmos_sensor(0x5037, 0x92); - OV2659_write_cmos_sensor(0x5038, 0x21); - OV2659_write_cmos_sensor(0x5039, 0xe1); - OV2659_write_cmos_sensor(0x503a, 0x01); - OV2659_write_cmos_sensor(0x503c, 0x10); - OV2659_write_cmos_sensor(0x503d, 0x10); - OV2659_write_cmos_sensor(0x503e, 0x10); - OV2659_write_cmos_sensor(0x503f, 0x65); - OV2659_write_cmos_sensor(0x5040, 0x62); - OV2659_write_cmos_sensor(0x5041, 0x0e); - OV2659_write_cmos_sensor(0x5042, 0x9c); - OV2659_write_cmos_sensor(0x5043, 0x20); - OV2659_write_cmos_sensor(0x5044, 0x28); - OV2659_write_cmos_sensor(0x5045, 0x22); - OV2659_write_cmos_sensor(0x5046, 0x5c); - OV2659_write_cmos_sensor(0x5047, 0xf8); - OV2659_write_cmos_sensor(0x5048, 0x08); - OV2659_write_cmos_sensor(0x5049, 0x70); - OV2659_write_cmos_sensor(0x504a, 0xf0); - OV2659_write_cmos_sensor(0x504b, 0xf0); - OV2659_write_cmos_sensor(0x500c, 0x03); - OV2659_write_cmos_sensor(0x500d, 0x26); - OV2659_write_cmos_sensor(0x500e, 0x02); - OV2659_write_cmos_sensor(0x500f, 0x64); - OV2659_write_cmos_sensor(0x5010, 0x6a); - OV2659_write_cmos_sensor(0x5011, 0x00); - OV2659_write_cmos_sensor(0x5012, 0x66); - OV2659_write_cmos_sensor(0x5013, 0x03); - OV2659_write_cmos_sensor(0x5014, 0x24); - OV2659_write_cmos_sensor(0x5015, 0x02); - OV2659_write_cmos_sensor(0x5016, 0x74); - OV2659_write_cmos_sensor(0x5017, 0x62); - OV2659_write_cmos_sensor(0x5018, 0x00); - OV2659_write_cmos_sensor(0x5019, 0x66); - OV2659_write_cmos_sensor(0x501a, 0x03); - OV2659_write_cmos_sensor(0x501b, 0x16); - OV2659_write_cmos_sensor(0x501c, 0x02); - OV2659_write_cmos_sensor(0x501d, 0x76); - OV2659_write_cmos_sensor(0x501e, 0x5d); - OV2659_write_cmos_sensor(0x501f, 0x00); - OV2659_write_cmos_sensor(0x5020, 0x66); - OV2659_write_cmos_sensor(0x506e, 0x44); - OV2659_write_cmos_sensor(0x5064, 0x08); - OV2659_write_cmos_sensor(0x5065, 0x10); - OV2659_write_cmos_sensor(0x5066, 0x16); - OV2659_write_cmos_sensor(0x5067, 0x10); - OV2659_write_cmos_sensor(0x506c, 0x08); - OV2659_write_cmos_sensor(0x506d, 0x10); - OV2659_write_cmos_sensor(0x506f, 0xa6); - OV2659_write_cmos_sensor(0x5068, 0x08); - OV2659_write_cmos_sensor(0x5069, 0x10); - OV2659_write_cmos_sensor(0x506a, 0x18); - OV2659_write_cmos_sensor(0x506b, 0x28); - OV2659_write_cmos_sensor(0x5084, 0x0c); - OV2659_write_cmos_sensor(0x5085, 0x3c);//3 - OV2659_write_cmos_sensor(0x5005, 0x80); - OV2659_write_cmos_sensor(0x5051, 0x40); - OV2659_write_cmos_sensor(0x5052, 0x40); - OV2659_write_cmos_sensor(0x5053, 0x40); - OV2659_write_cmos_sensor(0x3a0f, 0x38); //4 - OV2659_write_cmos_sensor(0x3a10, 0x30); //3 - OV2659_write_cmos_sensor(0x3a11, 0x70); - OV2659_write_cmos_sensor(0x3a1b, 0x38); //4 - OV2659_write_cmos_sensor(0x3a1e, 0x30); //3 - OV2659_write_cmos_sensor(0x3a1f, 0x20); - OV2659_write_cmos_sensor(0x5060, 0x69); - OV2659_write_cmos_sensor(0x5061, 0xbe); - OV2659_write_cmos_sensor(0x5062, 0xbe); - OV2659_write_cmos_sensor(0x5063, 0x69); - OV2659_write_cmos_sensor(0x3a18, 0x00); - OV2659_write_cmos_sensor(0x3a19, 0x38); - OV2659_write_cmos_sensor(0x4009, 0x02); - OV2659_write_cmos_sensor(0x3503, 0x00); - OV2659_write_cmos_sensor(0x3011, 0xC2 /*0x82*/); // Increase IO driving current - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.IsPVmode = 1; - OV2659Sensor.PreviewDummyPixels = 0; - OV2659Sensor.PreviewDummyLines = 0; - OV2659Sensor.PreviewPclk = 480; - OV2659Sensor.CapturePclk = 480; - OV2659Sensor.SensorGain = 0x10; - WBcount = AWB_MODE_AUTO; - spin_unlock(&ov2659_drv_lock); -} - - - -static void OV2659PreviewSetting(void) -{ - OV2659SENSORDB("[OV2659PreviewSetting]\n"); - - OV2659_write_cmos_sensor(0X0100, 0X00); - OV2659_write_cmos_sensor(0x3503, OV2659_read_cmos_sensor(0x3503) | 0x07); - OV2659_write_cmos_sensor(0x3500, ((OV2659Sensor.PreviewShutter * 16) >> 16) & 0xff); - OV2659_write_cmos_sensor(0x3501, ((OV2659Sensor.PreviewShutter * 16) >> 8) & 0xff); - OV2659_write_cmos_sensor(0x3502, (OV2659Sensor.PreviewShutter * 16) & 0xff); - OV2659_write_cmos_sensor(0x350B, OV2659Sensor.SensorGain); - OV2659_write_cmos_sensor(0x3a00, OV2659_read_cmos_sensor(0x3a00) | 0x04); - OV2659_write_cmos_sensor(0x3503, OV2659_read_cmos_sensor(0x3503) & 0xf8); - OV2659_write_cmos_sensor(0x5066, 0x28); - OV2659_write_cmos_sensor(0x5067, 0x10); - OV2659_write_cmos_sensor(0x506a, 0x0c); - OV2659_write_cmos_sensor(0x506b, 0x1c); - OV2659_write_cmos_sensor(0x3800, 0x00); - OV2659_write_cmos_sensor(0x3801, 0x00); - OV2659_write_cmos_sensor(0x3802, 0x00); - OV2659_write_cmos_sensor(0x3803, 0x00); - OV2659_write_cmos_sensor(0x3804, 0x06); - OV2659_write_cmos_sensor(0x3805, 0x5f); - OV2659_write_cmos_sensor(0x3806, 0x04); - OV2659_write_cmos_sensor(0x3807, 0xb7); - OV2659_write_cmos_sensor(0x3808, 0x03); - OV2659_write_cmos_sensor(0x3809, 0x20); - OV2659_write_cmos_sensor(0x380a, 0x02); - OV2659_write_cmos_sensor(0x380b, 0x58); - OV2659_write_cmos_sensor(0x3811, 0x08); - OV2659_write_cmos_sensor(0x3813, 0x02); - OV2659_write_cmos_sensor(0x3814, 0x31); - OV2659_write_cmos_sensor(0x3815, 0x31); - OV2659_write_cmos_sensor(0x3820, 0x81); - OV2659_write_cmos_sensor(0x3821, 0x01); - OV2659_write_cmos_sensor(0x3623, 0x00); - OV2659_write_cmos_sensor(0x3634, 0x76); - OV2659_write_cmos_sensor(0x3701, 0x44); - OV2659_write_cmos_sensor(0x3208, 0xa1); - OV2659_write_cmos_sensor(0x3705, 0x0c); - OV2659_write_cmos_sensor(0x370a, 0x52); - OV2659_write_cmos_sensor(0x4608, 0x00); - OV2659_write_cmos_sensor(0x4609, 0x80); - OV2659_write_cmos_sensor(0x5002, 0x10); - OV2659_write_cmos_sensor(0x3003, 0x80);//30fps 26mclk - OV2659_write_cmos_sensor(0x3004, 0x10); - OV2659_write_cmos_sensor(0x3005, 0x16); - OV2659_write_cmos_sensor(0x3006, 0x0d); - OV2659_write_cmos_sensor(0x380c, 0x05); - OV2659_write_cmos_sensor(0x380d, 0x14); - OV2659_write_cmos_sensor(0x380e, 0x02); - OV2659_write_cmos_sensor(0x380f, 0x68); - OV2659_write_cmos_sensor(0x3a08, 0x00); - OV2659_write_cmos_sensor(0x3a09, 0xb9); - OV2659_write_cmos_sensor(0x3a0e, 0x03); - OV2659_write_cmos_sensor(0x3a0a, 0x00); - OV2659_write_cmos_sensor(0x3a0b, 0x9a); - OV2659_write_cmos_sensor(0x3a0d, 0x04); - OV2659_write_cmos_sensor(0X0100, 0X01); - OV2659_write_cmos_sensor(0X301d, 0X08); - mDELAY(10); - OV2659_write_cmos_sensor(0X301d, 0X00); - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.IsPVmode = KAL_TRUE; - OV2659Sensor.PreviewPclk = 480; - OV2659Sensor.SensorMode = SENSOR_MODE_PREVIEW; - spin_unlock(&ov2659_drv_lock); -} - - - -static void OV2659FullSizeCaptureSetting(void) -{ - OV2659SENSORDB("[OV2659FullSizeCaptureSetting]\n"); - - OV2659_write_cmos_sensor(0X0100, 0X00); - OV2659_write_cmos_sensor(0x3a00, OV2659_read_cmos_sensor(0x3a00) & 0xfb); - OV2659_write_cmos_sensor(0x3503, OV2659_read_cmos_sensor(0x3503) | 0x07); - OV2659_write_cmos_sensor(0x5066, 0x28); - OV2659_write_cmos_sensor(0x5067, 0x18); - OV2659_write_cmos_sensor(0x506a, 0x06); - OV2659_write_cmos_sensor(0x506b, 0x16); - OV2659_write_cmos_sensor(0x3800, 0x00); - OV2659_write_cmos_sensor(0x3801, 0x00); - OV2659_write_cmos_sensor(0x3802, 0x00); - OV2659_write_cmos_sensor(0x3803, 0x00); - OV2659_write_cmos_sensor(0x3804, 0x06); - OV2659_write_cmos_sensor(0x3805, 0x5f); - OV2659_write_cmos_sensor(0x3806, 0x04); - OV2659_write_cmos_sensor(0x3807, 0xbb); - OV2659_write_cmos_sensor(0x3808, 0x06); - OV2659_write_cmos_sensor(0x3809, 0x40); - OV2659_write_cmos_sensor(0x380a, 0x04); - OV2659_write_cmos_sensor(0x380b, 0xb0); - OV2659_write_cmos_sensor(0x3811, 0x10); - OV2659_write_cmos_sensor(0x3813, 0x06); - OV2659_write_cmos_sensor(0x3814, 0x11); - OV2659_write_cmos_sensor(0x3815, 0x11); - OV2659_write_cmos_sensor(0x3623, 0x00); - OV2659_write_cmos_sensor(0x3634, 0x44); - OV2659_write_cmos_sensor(0x3701, 0x44); - OV2659_write_cmos_sensor(0x3208, 0xa2); - OV2659_write_cmos_sensor(0x3705, 0x18); - OV2659_write_cmos_sensor(0x3820, OV2659_read_cmos_sensor(0x3820) & 0xfe); - OV2659_write_cmos_sensor(0x3821, OV2659_read_cmos_sensor(0x3821) & 0xfe); - OV2659_write_cmos_sensor(0x370a, 0x12); - OV2659_write_cmos_sensor(0x4608, 0x00); - OV2659_write_cmos_sensor(0x4609, 0x80); - OV2659_write_cmos_sensor(0x5002, 0x00); - OV2659_write_cmos_sensor(0x3003, 0x80);//15fps - OV2659_write_cmos_sensor(0x3004, 0x10); - OV2659_write_cmos_sensor(0x3005, 0x21); - OV2659_write_cmos_sensor(0x3006, 0x0d); - OV2659_write_cmos_sensor(0x380c, 0x07); - OV2659_write_cmos_sensor(0x380d, 0x9f); - OV2659_write_cmos_sensor(0x380e, 0x04); - OV2659_write_cmos_sensor(0x380f, 0xd0); - OV2659_write_cmos_sensor(0x3a08, 0x00); - OV2659_write_cmos_sensor(0x3a09, 0xb9); - OV2659_write_cmos_sensor(0x3a0e, 0x06); - OV2659_write_cmos_sensor(0x3a0a, 0x00); - OV2659_write_cmos_sensor(0x3a0b, 0x9a); - OV2659_write_cmos_sensor(0x3a0d, 0x08); - OV2659_write_cmos_sensor(0x4003, 0x88); - OV2659_write_cmos_sensor(0X0100, 0X01); - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.IsPVmode = KAL_FALSE; - OV2659Sensor.CapturePclk = 585; - spin_unlock(&ov2659_drv_lock); -} - - - -static void OV2659SetHVMirror(kal_uint8 Mirror) -{ - kal_uint8 mirror = 0, flip = 0; - - OV2659SENSORDB("[OV2659SetHVMirror]mirror=%d\n", Mirror); - - Mirror = IMAGE_HV_MIRROR; - - flip = OV2659_read_cmos_sensor(0x3820); - mirror = OV2659_read_cmos_sensor(0x3821); - - switch (Mirror) - { - //for tablet PC sub only - case IMAGE_NORMAL: - OV2659_write_cmos_sensor(0x3820, flip | 0x06); - OV2659_write_cmos_sensor(0x3821, mirror | 0x06); - break; - case IMAGE_H_MIRROR: - OV2659_write_cmos_sensor(0x3820, flip | 0x06); - OV2659_write_cmos_sensor(0x3821, mirror & 0xf9); - break; - case IMAGE_V_MIRROR: - OV2659_write_cmos_sensor(0x3820, flip & 0xf9); - OV2659_write_cmos_sensor(0x3821, mirror | 0x06); - break; - case IMAGE_HV_MIRROR: - OV2659_write_cmos_sensor(0x3820, flip & 0xf9); - OV2659_write_cmos_sensor(0x3821, mirror & 0xf9); - break; - default: - break; - } -} - - - -UINT32 OV2659Open(void) -{ - volatile signed int i; - kal_uint16 sensor_id = 0; - - OV2659SENSORDB("[OV2659Open]\n"); - - OV2659_write_cmos_sensor(0x0103, 0x01); - mDELAY(10); - - for(i = 0; i < 3; i++) - { - sensor_id = (OV2659_read_cmos_sensor(0x300A) << 8) | OV2659_read_cmos_sensor(0x300B); - - OV2659SENSORDB("[OV2659Open]SensorId=%x\n", sensor_id); - - if(sensor_id != OV2659_SENSOR_ID) - { - return ERROR_SENSOR_CONNECT_FAIL; - } - } - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.CaptureDummyPixels = 0; - OV2659Sensor.CaptureDummyLines = 0; - OV2659Sensor.PreviewDummyPixels = 0; - OV2659Sensor.PreviewDummyLines = 0; - OV2659Sensor.SensorMode = SENSOR_MODE_INIT; - OV2659Sensor.isoSpeed = 100; - spin_unlock(&ov2659_drv_lock); - - OV2659InitialSetting(); - - return ERROR_NONE; -} - - - -UINT32 OV2659Close(void) -{ - OV2659SENSORDB("[OV2659Close]\n"); - - return ERROR_NONE; -} - - - -UINT32 OV2659Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - OV2659SENSORDB("[OV2659Preview]enter\n"); - - OV2659PreviewSetting(); - mDELAY(300); - OV2659_set_AE_mode(KAL_TRUE); - OV2659_set_AWB_mode(KAL_TRUE); - OV2659SetHVMirror(sensor_config_data->SensorImageMirror); - - OV2659SENSORDB("[OV2659Preview]exit\n"); - - return TRUE ; -} - - - -UINT32 OV2659Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint32 shutter = 0, temp = 0; - - OV2659SENSORDB("[OV2659Capture]enter\n"); - - if(SENSOR_MODE_PREVIEW == OV2659Sensor.SensorMode) - { - OV2659SENSORDB("[OV2659Capture]Normal Capture\n "); - - OV2659_set_AWB_mode(KAL_FALSE); - - OV2659_write_cmos_sensor(0x3a00, OV2659_read_cmos_sensor(0x3a00)&0xfb); - OV2659_write_cmos_sensor(0x3503, OV2659_read_cmos_sensor(0x3503)|0x07); - - shutter=OV2659ReadShutter(); - temp =OV2659ReadSensorGain(); - - mDELAY(30); - OV2659FullSizeCaptureSetting(); - OV2659SetHVMirror(sensor_config_data->SensorImageMirror);//tablet pc sub sensor use only - spin_lock(&ov2659_drv_lock); - OV2659Sensor.SensorMode= SENSOR_MODE_CAPTURE; - OV2659Sensor.CaptureDummyPixels = 0; - OV2659Sensor.CaptureDummyLines = 0; - spin_unlock(&ov2659_drv_lock); - - shutter = shutter * 2; - - OV2659WriteShutter(shutter); - mDELAY(300); - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.SensorGain = temp; - OV2659Sensor.SensorShutter = shutter; - spin_unlock(&ov2659_drv_lock); - } - else if(SENSOR_MODE_ZSD == OV2659Sensor.SensorMode) - { - //for zsd hdr use - shutter = OV2659ReadShutter(); - temp = OV2659ReadSensorGain(); - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.SensorGain = temp; - OV2659Sensor.SensorShutter = shutter; - spin_unlock(&ov2659_drv_lock); - } - - OV2659SENSORDB("[OV2659Capture]exit\n"); - - return ERROR_NONE; -} - - - -UINT32 OV2659ZSDPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - OV2659SENSORDB("[OV2659ZSDPreview]enter\n"); - - if(SENSOR_MODE_PREVIEW == OV2659Sensor.SensorMode || OV2659Sensor.SensorMode == SENSOR_MODE_INIT) - { - OV2659FullSizeCaptureSetting(); - OV2659SetHVMirror(sensor_config_data->SensorImageMirror);//tablet PC sub sensor use - } - - spin_lock(&ov2659_drv_lock); - OV2659Sensor.SensorMode = SENSOR_MODE_ZSD; - spin_unlock(&ov2659_drv_lock); - - OV2659_set_AE_mode(KAL_TRUE); - OV2659_set_AWB_mode(KAL_TRUE); - - OV2659SENSORDB("[OV2659ZSDPreview]exit\n"); - - return ERROR_NONE; -} - - - -UINT32 OV2659GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - OV2659SENSORDB("[OV2659GetResolution]\n"); - - pSensorResolution->SensorPreviewWidth = OV2659_IMAGE_SENSOR_SVGA_WIDTH - 1 * 8; - pSensorResolution->SensorPreviewHeight = OV2659_IMAGE_SENSOR_SVGA_HEIGHT - 1 * 8; - pSensorResolution->SensorFullWidth = OV2659_IMAGE_SENSOR_UVGA_WITDH - 2 * 8; - pSensorResolution->SensorFullHeight = OV2659_IMAGE_SENSOR_UVGA_HEIGHT - 2 * 8; - pSensorResolution->SensorVideoWidth = OV2659_IMAGE_SENSOR_SVGA_WIDTH - 1 * 8; - pSensorResolution->SensorVideoHeight = OV2659_IMAGE_SENSOR_SVGA_HEIGHT - 1 * 8; - - return ERROR_NONE; -} - - - -UINT32 OV2659GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - OV2659SENSORDB("[OV2659GetInfo]\n"); - - pSensorInfo->SensorPreviewResolutionX = OV2659_IMAGE_SENSOR_SVGA_WIDTH - 1 * 8; - pSensorInfo->SensorPreviewResolutionY = OV2659_IMAGE_SENSOR_SVGA_HEIGHT - 1 * 8; - pSensorInfo->SensorFullResolutionX = OV2659_IMAGE_SENSOR_UVGA_WITDH - 2 * 8; - pSensorInfo->SensorFullResolutionY = OV2659_IMAGE_SENSOR_UVGA_HEIGHT - 2 * 8; - pSensorInfo->SensorCameraPreviewFrameRate = 30; - pSensorInfo->SensorVideoFrameRate = 30; - pSensorInfo->SensorStillCaptureFrameRate = 10; - pSensorInfo->SensorWebCamCaptureFrameRate = 15; - pSensorInfo->SensorResetActiveHigh = FALSE; - pSensorInfo->SensorResetDelayCount = 1; - pSensorInfo->SensorOutputDataFormat = SENSOR_OUTPUT_FORMAT_YUYV; - pSensorInfo->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorInterruptDelayLines = 1; - pSensorInfo->SensroInterfaceType = SENSOR_INTERFACE_TYPE_PARALLEL; - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 4; - pSensorInfo->VideoDelayFrame = 4; - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_2MA; - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorClockFreq = 26; - pSensorInfo->SensorClockDividCount = 3; - pSensorInfo->SensorClockRisingCount = 0; - pSensorInfo->SensorClockFallingCount = 2; - pSensorInfo->SensorPixelClockCount = 3; - pSensorInfo->SensorDataLatchCount = 2; - pSensorInfo->SensorGrabStartX = 2; - pSensorInfo->SensorGrabStartY = 2; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - pSensorInfo->SensorClockFreq = 26; - pSensorInfo->SensorClockDividCount = 3; - pSensorInfo->SensorClockRisingCount = 0; - pSensorInfo->SensorClockFallingCount = 2; - pSensorInfo->SensorPixelClockCount = 3; - pSensorInfo->SensorDataLatchCount = 2; - pSensorInfo->SensorGrabStartX = 2; - pSensorInfo->SensorGrabStartY = 2; - break; - default: - pSensorInfo->SensorClockFreq = 26; - pSensorInfo->SensorClockDividCount = 3; - pSensorInfo->SensorClockRisingCount = 0; - pSensorInfo->SensorClockFallingCount = 2; - pSensorInfo->SensorPixelClockCount = 3; - pSensorInfo->SensorDataLatchCount = 2; - pSensorInfo->SensorGrabStartX = 2; - pSensorInfo->SensorGrabStartY = 2; - break; - } - - memcpy(pSensorConfigData, &OV2659SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - - return ERROR_NONE; -} - - - -UINT32 OV2659Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - OV2659SENSORDB("[OV2659Control]\n"); - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - OV2659Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - OV2659Capture(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV2659ZSDPreview(pImageWindow, pSensorConfigData); - break; - default: - break; - } - - return TRUE; -} - - - -BOOL OV2659_set_param_effect(UINT16 para) -{ - OV2659SENSORDB("[OV2659_set_param_effect]para=%d\n", para); - switch (para) - { - case MEFFECT_OFF: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5001, 0x1f); - OV2659_write_cmos_sensor(0x507B, 0x06); - OV2659_write_cmos_sensor(0x507e, 0x3a); - OV2659_write_cmos_sensor(0x507f, 0x10); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case MEFFECT_SEPIA: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5001, 0x1f); - OV2659_write_cmos_sensor(0x507B, 0x1e); - OV2659_write_cmos_sensor(0x507e, 0x40); - OV2659_write_cmos_sensor(0x507f, 0xa0); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case MEFFECT_NEGATIVE: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5001, 0x1f); - OV2659_write_cmos_sensor(0x507B, 0x46); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case MEFFECT_SEPIAGREEN: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5001, 0x1f); - OV2659_write_cmos_sensor(0x507B, 0x1e); - OV2659_write_cmos_sensor(0x507e, 0x60); - OV2659_write_cmos_sensor(0x507f, 0x60); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case MEFFECT_SEPIABLUE: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5001, 0x1f); - OV2659_write_cmos_sensor(0x507B, 0x1e); - OV2659_write_cmos_sensor(0x507e, 0xa0); - OV2659_write_cmos_sensor(0x507f, 0x40); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - case MEFFECT_MONO: - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5001, 0x1f); - OV2659_write_cmos_sensor(0x507B, 0x26); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - break; - default: - return KAL_FALSE; - } - - return KAL_TRUE; -} - - - -BOOL OV2659_set_param_banding(UINT16 para) -{ - kal_uint8 banding; - kal_uint32 exposure_limitation = 0, line_length = 0, sensor_pixel_clock = 0; - - OV2659SENSORDB("[OV2659_set_param_banding]para=%d\n", para); - - if (OV2659Sensor.IsPVmode == KAL_TRUE) - { - line_length = OV2659_PV_PERIOD_PIXEL_NUMS + OV2659Sensor.PreviewDummyPixels; - exposure_limitation = OV2659_PV_PERIOD_LINE_NUMS + OV2659Sensor.PreviewDummyLines; - sensor_pixel_clock = OV2659Sensor.PreviewPclk * 100 * 1000; - } - else - { - line_length = OV2659_FULL_PERIOD_PIXEL_NUMS + OV2659Sensor.CaptureDummyPixels; - exposure_limitation = OV2659_FULL_PERIOD_LINE_NUMS + OV2659Sensor.CaptureDummyLines; - sensor_pixel_clock = OV2659Sensor.CapturePclk * 100 * 1000; - } - - line_length = line_length * 2; - banding = OV2659_read_cmos_sensor(0x3A05); - - switch (para) - { - case AE_FLICKER_MODE_50HZ: - OV2659_write_cmos_sensor(0x3a05, banding & 0x7f); - break; - case AE_FLICKER_MODE_60HZ: - OV2659_write_cmos_sensor(0x3a05, banding | 0x80); - break; - default: - return FALSE; - } - - return TRUE; -} - - - -BOOL OV2659_set_param_exposure(UINT16 para) -{ - kal_uint8 EvTemp0 = 0x00, EvTemp1 = 0x00, temp_reg= 0x00; - - OV2659SENSORDB("[OV2659_set_param_exposure]para=%d\n", para); - - if (SCENE_MODE_HDR == OV2659Sensor.sceneMode) - { - OV2659_set_param_exposure_for_HDR(para); - - return TRUE; - } - - temp_reg=OV2659_read_cmos_sensor(0x5083); - OV2659_write_cmos_sensor(0x507b, OV2659_read_cmos_sensor(0x507b) | 0x04); - - switch (para) - { - case AE_EV_COMP_20: - EvTemp0 = 0x20; - EvTemp1 = temp_reg & 0xf7; - break; - case AE_EV_COMP_10: - EvTemp0 = 0x10; - EvTemp1 = temp_reg & 0xf7; - break; - case AE_EV_COMP_00: - EvTemp0 = 0x00; - EvTemp1 = temp_reg & 0xf7; - break; - case AE_EV_COMP_n10: - EvTemp0 = 0x10; - EvTemp1 = temp_reg | 0x08; - break; - case AE_EV_COMP_n20: - EvTemp0 = 0x20; - EvTemp1 = temp_reg | 0x08; - break; - default: - return FALSE; - } - - OV2659_write_cmos_sensor(0x3208, 0x00); - OV2659_write_cmos_sensor(0x5082, EvTemp0); - OV2659_write_cmos_sensor(0x5083, EvTemp1); - OV2659_write_cmos_sensor(0x3208, 0x10); - OV2659_write_cmos_sensor(0x3208, 0xa0); - - return TRUE; -} - - - -UINT32 OV2659YUVSensorSetting(FEATURE_ID iCmd, UINT32 iPara) -{ - OV2659SENSORDB("[OV2659YUVSensorSetting]icmd=%d, ipara=%d\n", iCmd, iPara); - - switch (iCmd) { - case FID_SCENE_MODE: - OV2659_set_scene_mode(iPara); - break; - case FID_AWB_MODE: - OV2659_set_param_wb(iPara); - break; - case FID_COLOR_EFFECT: - OV2659_set_param_effect(iPara); - break; - case FID_AE_EV: - OV2659_set_param_exposure(iPara); - break; - case FID_AE_FLICKER: - OV2659_set_param_banding(iPara); - break; - case FID_AE_SCENE_MODE: - if(iPara == AE_MODE_OFF) - OV2659_set_AE_mode(KAL_FALSE); - else - OV2659_set_AE_mode(KAL_TRUE); - break; - case FID_ZOOM_FACTOR: - break; - case FID_ISP_CONTRAST: - OV2659_set_contrast(iPara); - break; - case FID_ISP_BRIGHT: - OV2659_set_brightness(iPara); - break; - case FID_ISP_SAT: - OV2659_set_saturation(iPara); - break; - case FID_AE_ISO: - OV2659_set_iso(iPara); - break; - default: - break; - } - mDELAY(30); - return TRUE; -} - - - -UINT32 OV2659YUVSetVideoMode(UINT16 u2FrameRate) -{ - if (u2FrameRate == 30) - { - OV2659_write_cmos_sensor(0x3003, 0x80);//30fps 26mclk - OV2659_write_cmos_sensor(0x3004, 0x10); - OV2659_write_cmos_sensor(0x3005, 0x16); - OV2659_write_cmos_sensor(0x3006, 0x0d); - OV2659_write_cmos_sensor(0x380c, 0x05); - OV2659_write_cmos_sensor(0x380d, 0x14); - OV2659_write_cmos_sensor(0x380e, 0x02); - OV2659_write_cmos_sensor(0x380f, 0x68); - OV2659_write_cmos_sensor(0x3a08, 0x00); - OV2659_write_cmos_sensor(0x3a09, 0xb9); - OV2659_write_cmos_sensor(0x3a0e, 0x03); - OV2659_write_cmos_sensor(0x3a0a, 0x00); - OV2659_write_cmos_sensor(0x3a0b, 0x9a); - OV2659_write_cmos_sensor(0x3a0d, 0x04); - OV2659_write_cmos_sensor(0x3a00, 0x38); - OV2659_write_cmos_sensor(0x3a02, 0x02); - OV2659_write_cmos_sensor(0x3a03, 0x68); - OV2659_write_cmos_sensor(0x3a14, 0x02); - OV2659_write_cmos_sensor(0x3a15, 0x68); - } - else if (u2FrameRate == 15) - { - OV2659_write_cmos_sensor(0x3003, 0x80);//15fps 26mclk - OV2659_write_cmos_sensor(0x3004, 0x20); - OV2659_write_cmos_sensor(0x3005, 0x16); - OV2659_write_cmos_sensor(0x3006, 0x0d); - OV2659_write_cmos_sensor(0x380c, 0x05); - OV2659_write_cmos_sensor(0x380d, 0x14); - OV2659_write_cmos_sensor(0x380e, 0x02); - OV2659_write_cmos_sensor(0x380f, 0x68); - OV2659_write_cmos_sensor(0x3a08, 0x00); - OV2659_write_cmos_sensor(0x3a09, 0x5c); - OV2659_write_cmos_sensor(0x3a0e, 0x06); - OV2659_write_cmos_sensor(0x3a0a, 0x00); - OV2659_write_cmos_sensor(0x3a0b, 0x4d); - OV2659_write_cmos_sensor(0x3a0d, 0x08); - OV2659_write_cmos_sensor(0x3a00, 0x38); - OV2659_write_cmos_sensor(0x3a02, 0x02); - OV2659_write_cmos_sensor(0x3a03, 0x68); - OV2659_write_cmos_sensor(0x3a14, 0x02); - OV2659_write_cmos_sensor(0x3a15, 0x68); - } - else - { - printk("Wrong frame rate setting \n"); - } - - mDELAY(30); - - return TRUE; -} - - - -UINT32 OV2659SetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) -{ - kal_uint32 pclk; - kal_int16 dummyLine, lineLength, frameHeight; - - switch (scenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pclk = 480 / 10; - lineLength = OV2659_PV_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk) / frameRate / lineLength; - dummyLine = frameHeight - OV2659_PV_PERIOD_LINE_NUMS; - OV2659SENSORDB("[OV2659SetMaxFramerateByScenario][preview]framerate=%d, dummy_line=%d\n",frameRate, dummyLine); - OV2659SetDummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pclk = 480 / 10; - lineLength = OV2659_PV_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk) / frameRate / lineLength; - dummyLine = frameHeight - OV2659_PV_PERIOD_LINE_NUMS; - OV2659SENSORDB("[OV2659SetMaxFramerateByScenario][video]framerate=%d, dummy_line=%d\n",frameRate, dummyLine); - OV2659SetDummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pclk = 480 / 10; - lineLength = OV2659_FULL_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk) / frameRate / lineLength; - dummyLine = frameHeight - OV2659_FULL_PERIOD_LINE_NUMS; - OV2659SENSORDB("[OV2659SetMaxFramerateByScenario][capture/zsd]framerate=%d, dummy_line=%d\n",frameRate, dummyLine); - OV2659SetDummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: - break; - default: - break; - } - - return ERROR_NONE; -} - - - -UINT32 OV2659GetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate) -{ - OV2659SENSORDB("[OV2659GetDefaultFramerateByScenario]\n"); - - switch (scenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - *pframeRate = 300; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - *pframeRate = 300; - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: - *pframeRate = 300; - break; - default: - break; - } - - return ERROR_NONE; -} - - - -UINT32 OV2659SetTestPatternMode(kal_bool bEnable) -{ - OV2659SENSORDB("[OV2659SetTestPatternMode]bEnable=%d\n",bEnable); - - if(bEnable) - OV2659_write_cmos_sensor(0x50a0, 0x80); - else - OV2659_write_cmos_sensor(0x50a0, 0x00); - mDELAY(100); - - return ERROR_NONE; -} - - - -void OV2659Set3ACtrl(ACDK_SENSOR_3A_LOCK_ENUM action) -{ - OV2659SENSORDB("[OV2659Set3ACtrl]action=%d\n",action); - - switch (action) - { - case SENSOR_3A_AE_LOCK: - OV2659_set_AE_mode(KAL_FALSE); - break; - case SENSOR_3A_AE_UNLOCK: - OV2659_set_AE_mode(KAL_TRUE); - break; - case SENSOR_3A_AWB_LOCK: - OV2659_set_AWB_mode(KAL_FALSE); - break; - case SENSOR_3A_AWB_UNLOCK: - OV2659_set_AWB_mode(KAL_TRUE); - break; - default: - break; - } - - //fix wb mode for capture -> preview,root casue is ap follow . - OV2659_set_param_wb(WBcount); - return; -} - - - -static void OV2659GetCurAeAwbInfo(UINT32 pSensorAEAWBCurStruct) -{ - //OV2659SENSORDB("[OV2659GetCurAeAwbInfo]\n"); - - PSENSOR_AE_AWB_CUR_STRUCT Info = (PSENSOR_AE_AWB_CUR_STRUCT)pSensorAEAWBCurStruct; - Info->SensorAECur.AeCurShutter = OV2659ReadShutter(); - Info->SensorAECur.AeCurGain = OV2659ReadSensorGain() * 2; - Info->SensorAwbGainCur.AwbCurRgain = OV2659_read_cmos_sensor(0x504c); - Info->SensorAwbGainCur.AwbCurBgain = OV2659_read_cmos_sensor(0x504e); -} - - - -void OV2659_get_AEAWB_lock(UINT32 *pAElockRet32, UINT32 *pAWBlockRet32) -{ - OV2659SENSORDB("[OV2659_get_AEAWB_lock]\n"); - - *pAElockRet32 = 1; - *pAWBlockRet32 = 1; -} - - - -void OV2659_GetDelayInfo(UINT32 delayAddr) -{ - //OV2659SENSORDB("[OV2659_GetDelayInfo]\n"); - - SENSOR_DELAY_INFO_STRUCT *pDelayInfo=(SENSOR_DELAY_INFO_STRUCT*)delayAddr; - pDelayInfo->InitDelay = 0; - pDelayInfo->EffectDelay = 0; - pDelayInfo->AwbDelay = 0; - pDelayInfo->AFSwitchDelayFrame = 50; -} - - - -void OV2659GetExifInfo(UINT32 exifAddr) -{ - //OV2659SENSORDB("[OV2659GetExifInfo]\n"); - - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = OV2659Sensor.isoSpeed; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = OV2659Sensor.isoSpeed; - pExifInfo->AWBMode = WBcount; -} - - - -UINT32 OV2659FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara, *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara, *pFeatureData32=(UINT32 *) pFeaturePara; - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=OV2659_IMAGE_SENSOR_UVGA_WITDH; - *pFeatureReturnPara16=OV2659_IMAGE_SENSOR_UVGA_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: - *pFeatureReturnPara16++=OV2659_PV_PERIOD_PIXEL_NUMS + OV2659Sensor.PreviewDummyPixels; - *pFeatureReturnPara16=OV2659_PV_PERIOD_LINE_NUMS + OV2659Sensor.PreviewDummyLines; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: - *pFeatureReturnPara32 = OV2659Sensor.PreviewPclk * 1000 * 100; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - OV2659_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_REGISTER: - OV2659_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV2659_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pSensorConfigData, &OV2659SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - *pFeatureReturnPara32++ = 0; - *pFeatureParaLen = 4; - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - *pFeatureReturnPara32 = LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen = 4; - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV2659_GetSensorID(pFeatureData32); - break; - case SENSOR_FEATURE_SET_YUV_CMD: - OV2659YUVSensorSetting((FEATURE_ID)*pFeatureData32, *(pFeatureData32 + 1)); - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV2659YUVSetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: - OV2659SetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32 + 1)); - break; - case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: - OV2659GetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32 + 1))); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV2659SetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_SET_YUV_3A_CMD: - OV2659Set3ACtrl((ACDK_SENSOR_3A_LOCK_ENUM)*pFeatureData32); - break; - case SENSOR_FEATURE_GET_SHUTTER_GAIN_AWB_GAIN: - OV2659GetCurAeAwbInfo(*pFeatureData32); - break; - case SENSOR_FEATURE_GET_AE_AWB_LOCK_INFO: - OV2659_get_AEAWB_lock((UINT32 *)(*pFeatureData32),(UINT32 *) (*(pFeatureData32 + 1))); - break; - case SENSOR_FEATURE_GET_DELAY_INFO: - OV2659_GetDelayInfo(*pFeatureData32); - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - OV2659GetExifInfo(*pFeatureData32); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: - *pFeatureReturnPara32= OV2659_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_AUTOTEST_CMD: - case SENSOR_FEATURE_SET_GAIN: - case SENSOR_FEATURE_SET_FLASHLIGHT: - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - case SENSOR_FEATURE_SET_ESHUTTER: - case SENSOR_FEATURE_SET_CCT_REGISTER: - case SENSOR_FEATURE_GET_CCT_REGISTER: - case SENSOR_FEATURE_SET_ENG_REGISTER: - case SENSOR_FEATURE_GET_ENG_REGISTER: - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - case SENSOR_FEATURE_GET_GROUP_INFO: - case SENSOR_FEATURE_GET_ITEM_INFO: - case SENSOR_FEATURE_SET_ITEM_INFO: - case SENSOR_FEATURE_GET_ENG_INFO: - break; - default: - break; - } - return ERROR_NONE; -} - - - -SENSOR_FUNCTION_STRUCT SensorFuncOV2659= -{ - OV2659Open, - OV2659GetInfo, - OV2659GetResolution, - OV2659FeatureControl, - OV2659Control, - OV2659Close -}; - - - -UINT32 OV2659_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV2659; - - return ERROR_NONE; -} - - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Sensor.h deleted file mode 100644 index 032e7f98b61..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2659_yuv/ov2659yuv_Sensor.h +++ /dev/null @@ -1,59 +0,0 @@ -/* SENSOR FULL SIZE */ -#ifndef __SENSOR_H -#define __SENSOR_H - - -typedef enum { - SENSOR_MODE_INIT = 0, - SENSOR_MODE_PREVIEW, - SENSOR_MODE_CAPTURE, - SENSOR_MODE_ZSD -} OV2659_SENSOR_MODE; - -typedef enum _OV2659_OP_TYPE_ { - OV2659_MODE_NONE, - OV2659_MODE_PREVIEW, - OV2659_MODE_CAPTURE, - OV2659_MODE_QCIF_VIDEO, - OV2659_MODE_CIF_VIDEO, - OV2659_MODE_QVGA_VIDEO - } OV2659_OP_TYPE; - -extern OV2659_OP_TYPE OV2659_g_iOV2659_Mode; - -#define OV2659_MAX_GAIN (0x38) -#define OV2659_MIN_GAIN (1) - -#define OV2659_ID_REG (0x300A) -#define OV2659_INFO_REG (0x300B) - -#define OV2659_IMAGE_SENSOR_SVGA_WIDTH (800) -#define OV2659_IMAGE_SENSOR_SVGA_HEIGHT (600) -#define OV2659_IMAGE_SENSOR_UVGA_WITDH (1600) -#define OV2659_IMAGE_SENSOR_UVGA_HEIGHT (1200) - -#define OV2659_PV_PERIOD_PIXEL_NUMS (1300) -#define OV2659_PV_PERIOD_LINE_NUMS (616) -#define OV2659_FULL_PERIOD_PIXEL_NUMS (1951) -#define OV2659_FULL_PERIOD_LINE_NUMS (1232) - -#define OV2659_PV_EXPOSURE_LIMITATION (616-4) -#define OV2659_FULL_EXPOSURE_LIMITATION (1232-4) - -#define OV2659_PV_GRAB_START_X (5) -#define OV2659_PV_GRAB_START_Y (5) -#define OV2659_FULL_GRAB_START_X (5) -#define OV2659_FULL_GRAB_START_Y (5) - -#define OV2659_WRITE_ID 0x60 -#define OV2659_READ_ID 0x61 - -UINT32 OV2659Open(void); -UINT32 OV2659GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 OV2659GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV2659Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV2659FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 OV2659Close(void); -UINT32 OV2659_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); - -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/Makefile b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/Makefile deleted file mode 100644 index 77ba96d4f80..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom - -obj-y += ov2680mipiraw_Sensor.o - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_CameraCustomized.h deleted file mode 100644 index 5ed52d6c872..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_CameraCustomized.h +++ /dev/null @@ -1,124 +0,0 @@ -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of Me diaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of camera customized parameters. - * - * - - * Author: - * ------- - * PC Huang (MTK02204) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -/*BEGIN PN:DTS2013020603845, modify by w00167383, 2012-02-06*/ -#ifndef __CAMERA_CUSTOMIZED_H -#define __CAMERA_CUSTOMIZED_H - -// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 -#define MAIN_SENSOR_ORIENTATION_ANGLE 90 -#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist - - -// First, we think you hold the cell phone vertical. -// Second, we suppose the direction of upward is 0 -// Third, it is 90, 180, 270 in clockwise -// here we define the main sensor and sub sensor angles to deal with the jpeg orientation -#define MAIN_SENSOR_TO_PHONE_ANGLE 90 -#define SUB_SENSOR_TO_PHONE_ANGLE 0 - - -#define CAM_SIZE_QVGA_WIDTH 320 -#define CAM_SIZE_QVGA_HEIGHT 240 -#define CAM_SIZE_VGA_WIDTH 640 -#define CAM_SIZE_VGA_HEIGHT 480 -#define CAM_SIZE_05M_WIDTH 800 -#define CAM_SIZE_05M_HEIGHT 600 -#define CAM_SIZE_1M_WIDTH 1280 -#define CAM_SIZE_1M_HEIGHT 960 -#define CAM_SIZE_2M_WIDTH 1600 -#define CAM_SIZE_2M_HEIGHT 1200 -#define CAM_SIZE_3M_WIDTH 2048 -#define CAM_SIZE_3M_HEIGHT 1536 -#define CAM_SIZE_5M_WIDTH 2592 -#define CAM_SIZE_5M_HEIGHT 1944 - -// for main sensor -#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 -#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 -#define MAIN_NUM_OF_STILL_RESOLUTION 7 -#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} -#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} -#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ - {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ - {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ - {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ - {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ - {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ - {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} - -// if sub sensor does not exist, set all the parameters as 0 -#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 -#define SUB_NUM_OF_VIDEO_RESOLUTION 0 -#define SUB_NUM_OF_STILL_RESOLUTION 0 -#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} -#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} -#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} - -//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) -//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) -//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) - -#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 -#endif -/*END PN:DTS2013020603845, modify by w00167383, 2012-02-06*/ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Camera_Sensor_para.h deleted file mode 100644 index 0ad26bfbe06..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Camera_Sensor_para.h +++ /dev/null @@ -1,89 +0,0 @@ -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ -/***************************************************************************** - * - * Filename: - * --------- - * camera_sensor_para.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of Sensor tuning parameters that should be generated by CCT - * - * - * Author: - * ------- - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -/*BEGIN PN:DTS2013020603845, modify by w00167383, 2012-02-06*/ -#ifndef _OV2680_CAMERA_SENSOR_PARA_H -#define _OV2680_CAMERA_SENSOR_PARA_H - -#define OV2680_CAMERA_SENSOR_REG_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,ISP_DRIVING_6MA}, \ -} - -#define OV2680_CAMERA_SENSOR_CCT_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40}, \ -} - -#endif /* __CAMERA_SENSOR_PARA_H */ -/* SENSOR FULL SIZE */ -/*END PN:DTS2013020603845, modify by w00167383, 2012-02-06*/ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Sensor.c deleted file mode 100644 index 389350a1332..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Sensor.c +++ /dev/null @@ -1,2062 +0,0 @@ -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2005 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ - -/***************************************************************************** - * - * Filename: - * --------- - * Sensor.c - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Image sensor driver function - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "ov2680mipiraw_Sensor.h" -#include "ov2680mipiraw_Camera_Sensor_para.h" -#include "ov2680mipiraw_CameraCustomized.h" - -#define OV2680_DEBUG -#define OV2680_DRIVER_TRACE -#define LOG_TAG "[OV2680MIPIRaw]" -#ifdef OV2680_DEBUG -#define SENSORDB(fmt,arg...) printk(LOG_TAG "%s: " fmt "\n", __FUNCTION__ ,##arg) -#else -#define SENSORDB(fmt,arg...) -#endif -//#define OV2680_TEST_PATTERN_CHECKSUM 0x17870f14 -#define OV2680_TEST_PATTERN_CHECKSUM 0x86da3e5a - -//kal_bool OV2680_during_testpattern = KAL_FALSE; - - -//#define ACDK -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); -extern int iMultiWriteReg(u8 *pData, u16 lens, u16 i2cId); - -//#define USE_I2C_MULTIWRITE -#define Ov2680_multi_write_cmos_sensor(pData, lens) iMultiWriteReg((u8*) pData, (u16) lens, OV2680_SLAVE_WRITE_ID_1) - - -MSDK_SCENARIO_ID_ENUM ov2680CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; - -/* SZ TCT xuejian.zhong add for CTS test*/ -static void OV2680GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("OV2680GetAFMaxNumFocusAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -static void OV2680GetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("OV2680GetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -static void OV2680GetExifInfo(UINT32 exifAddr) -{ - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = AE_ISO_100; - pExifInfo->AWBMode = AWB_MODE_AUTO; - pExifInfo->CapExposureTime = 0; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = AE_ISO_100; -} - -/* SZ TCT xuejian.zhong end */ - - - -static OV2680_sensor_struct OV2680_sensor = -{ - .eng = - { - .reg = OV2680_CAMERA_SENSOR_REG_DEFAULT_VALUE, - .cct = OV2680_CAMERA_SENSOR_CCT_DEFAULT_VALUE, - }, - .eng_info = - { - .SensorId = OV2680MIPI_SENSOR_ID, - .SensorType = CMOS_SENSOR, - .SensorOutputDataFormat = OV2680_COLOR_FORMAT, - }, - .shutter = 0x20, - .gain = 0x20, - .pv_pclk = OV2680_PREVIEW_CLK, - .cap_pclk = OV2680_CAPTURE_CLK, - .pclk = OV2680_PREVIEW_CLK, - .frame_height = OV2680_PV_PERIOD_LINE_NUMS, - .line_length = OV2680_PV_PERIOD_PIXEL_NUMS, - .is_zsd = KAL_FALSE, //for zsd - .dummy_pixels = 0, - .dummy_lines = 0, //for zsd - .is_autofliker = KAL_FALSE, -}; - -static DEFINE_SPINLOCK(OV2680_drv_lock); - -kal_uint16 OV2680_read_cmos_sensor(kal_uint32 addr) -{ - kal_uint16 get_byte=0; - char puSendCmd[2] = {(char)(addr >> 8) , (char)(addr & 0xFF) }; - iReadRegI2C(puSendCmd , 2, (u8*)&get_byte,1,OV2680_sensor.write_id); -#ifdef OV2680_DRIVER_TRACE - //SENSORDB("OV2680_read_cmos_sensor, addr:%x;get_byte:%x \n",addr,get_byte); -#endif - return get_byte; -} - -kal_uint16 OV2680_write_cmos_sensor(kal_uint32 addr, kal_uint32 para) -{ - //kal_uint16 reg_tmp; - - char puSendCmd[3] = {(char)(addr >> 8) , (char)(addr & 0xFF) ,(char)(para & 0xFF)}; - - iWriteRegI2C(puSendCmd , 3,OV2680_sensor.write_id); - return ERROR_NONE; -} - -/***************************** OTP Feature **********************************/ -//#define OV2680_USE_OTP - - - -/***************************** OTP Feature End**********************************/ - -void OV2680_Write_Shutter(kal_uint16 ishutter) -{ - - kal_uint16 extra_shutter = 0; - kal_uint16 realtime_fp = 0; - kal_uint16 frame_height = 0; - kal_uint16 line_length = 0; - - unsigned long flags; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_write_shutter:%x \n",ishutter); -#endif - if (!ishutter) ishutter = 1; /* avoid 0 */ - //if(ishutter > 0xfff) - - frame_height = OV2680_PV_PERIOD_LINE_NUMS + OV2680_sensor.dummy_lines; - - if(ishutter > (frame_height -4)) - { - extra_shutter = ishutter - frame_height + 4; - SENSORDB("[shutter > frame_height] frame_height:%x extra_shutter:%x \n",frame_height,extra_shutter); - } - else - { - extra_shutter = 0; - } - frame_height += extra_shutter; - OV2680_sensor.frame_height = frame_height; - SENSORDB("OV2680_sensor.is_autofliker:%x, OV2680_sensor.frame_height: %x \n",OV2680_sensor.is_autofliker,OV2680_sensor.frame_height); - #if 1 - if(OV2680_sensor.is_autofliker == KAL_TRUE) - { - realtime_fp = OV2680_sensor.pclk *10 / ((OV2680_sensor.line_length/OV2680_MIPI_LANE_NUM) * OV2680_sensor.frame_height); - SENSORDB("[OV2680_Write_Shutter]pv_clk:%d\n",OV2680_sensor.pclk); - SENSORDB("[OV2680_Write_Shutter]line_length/4:%d\n",(OV2680_sensor.line_length/OV2680_MIPI_LANE_NUM)); - SENSORDB("[OV2680_Write_Shutter]frame_height:%d\n",OV2680_sensor.frame_height); - SENSORDB("[OV2680_Write_Shutter]framerate(10base):%d\n",realtime_fp); - - if((realtime_fp >= 297)&&(realtime_fp <= 303)) - { - realtime_fp = 296; - spin_lock_irqsave(&OV2680_drv_lock,flags); - OV2680_sensor.frame_height = OV2680_sensor.pclk *10 / ((OV2680_sensor.line_length/OV2680_MIPI_LANE_NUM) * realtime_fp); - spin_unlock_irqrestore(&OV2680_drv_lock,flags); - - SENSORDB("[autofliker realtime_fp=30,extern heights slowdown to 29.6fps][height:%d]",OV2680_sensor.frame_height); - } - else if((realtime_fp >= 147)&&(realtime_fp <= 153)) - { - realtime_fp = 146; - spin_lock_irqsave(&OV2680_drv_lock,flags); - OV2680_sensor.frame_height = OV2680_sensor.pclk *10 / ((OV2680_sensor.line_length/OV2680_MIPI_LANE_NUM) * realtime_fp); - spin_unlock_irqrestore(&OV2680_drv_lock,flags); - SENSORDB("[autofliker realtime_fp=15,extern heights slowdown to 14.6fps][height:%d]",OV2680_sensor.frame_height); - } - //OV2680_sensor.frame_height = OV2680_sensor.frame_height +(OV2680_sensor.frame_height>>7); - - } - #endif - OV2680_write_cmos_sensor(0x380e, (OV2680_sensor.frame_height>>8)&0xFF); - OV2680_write_cmos_sensor(0x380f, (OV2680_sensor.frame_height)&0xFF); - - OV2680_write_cmos_sensor(0x3500, (ishutter >> 12) & 0xF); - OV2680_write_cmos_sensor(0x3501, (ishutter >> 4) & 0xFF); - OV2680_write_cmos_sensor(0x3502, (ishutter << 4) & 0xFF); - -} - - -/************************************************************************* -* FUNCTION -* OV2680_Set_Dummy -* -* DESCRIPTION -* This function set dummy pixel or dummy line of OV2680 -* -* PARAMETERS -* iPixels : dummy pixel -* iLines : dummy linel -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -static void OV2680_Set_Dummy(const kal_uint16 iPixels, const kal_uint16 iLines) -{ - kal_uint16 line_length, frame_height; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_Set_Dummy:iPixels:%x; iLines:%x \n",iPixels,iLines); -#endif - - - OV2680_sensor.dummy_lines = iLines; - OV2680_sensor.dummy_pixels = iPixels; - - line_length = OV2680_PV_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV2680_PV_PERIOD_LINE_NUMS + iLines; - -#ifdef OV2680_DRIVER_TRACE - SENSORDB("line_length:%x; frame_height:%x \n",line_length,frame_height); -#endif - - if ((line_length >= 0xFFFF)||(frame_height >= 0xFFFF)) // need check - { - #ifdef OV2680_DRIVER_TRACE - SENSORDB("ERROR: line length or frame height is overflow!!!!!!!! \n"); - #endif - return ERROR_NONE; - } -// if((line_length == OV2680_sensor.line_length)&&(frame_height == OV2680_sensor.frame_height)) -// return ; - spin_lock(&OV2680_drv_lock); - OV2680_sensor.line_length = line_length; - OV2680_sensor.frame_height = frame_height; - spin_unlock(&OV2680_drv_lock); - - SENSORDB("line_length:%x; frame_height:%x \n",line_length,frame_height); - SENSORDB("write to register line_length/4:%x; frame_height:%x \n",(line_length/4),frame_height); - - /* Add dummy pixels: */ - /* 0x380c [0:4], 0x380d defines the PCLKs in one line of OV2680 */ - /* Add dummy lines:*/ - /* 0x380e [0:1], 0x380f defines total lines in one frame of OV2680 */ - OV2680_write_cmos_sensor(0x380c, (line_length/OV2680_MIPI_LANE_NUM) >> 8); - OV2680_write_cmos_sensor(0x380d, (line_length/OV2680_MIPI_LANE_NUM) & 0xFF); - OV2680_write_cmos_sensor(0x380e, frame_height >> 8); - OV2680_write_cmos_sensor(0x380f, frame_height & 0xFF); - return ERROR_NONE; -} /* OV2680_Set_Dummy */ - - -/************************************************************************* -* FUNCTION -* OV2680_SetShutter -* -* DESCRIPTION -* This function set e-shutter of OV2680 to change exposure time. -* -* PARAMETERS -* iShutter : exposured lines -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - - -void set_OV2680_shutter(kal_uint16 iShutter) -{ - - unsigned long flags; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("set_OV2680_shutter:%x \n",iShutter); -#endif - - spin_lock_irqsave(&OV2680_drv_lock,flags); - OV2680_sensor.shutter = iShutter; - spin_unlock_irqrestore(&OV2680_drv_lock,flags); - - OV2680_Write_Shutter(iShutter); - -} /* Set_OV2680_Shutter */ - - kal_uint16 OV2680Gain2Reg(const kal_uint16 iGain) -{ - kal_uint16 iReg = 0x00; - - //iReg = ((iGain / BASEGAIN) << 4) + ((iGain % BASEGAIN) * 16 / BASEGAIN); - iReg = iGain *16 / BASEGAIN; - - iReg = iReg & 0xFF; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680Gain2Reg:iGain:%x; iReg:%x \n",iGain,iReg); -#endif - return iReg; -} - - -kal_uint16 OV2680_SetGain(kal_uint16 iGain) -{ - kal_uint16 i; - kal_uint16 gain_reg = 0; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_SetGain:iGain = %x;\n",iGain); - SENSORDB("OV2680_SetGain:gain_reg 0 = %x;\n",gain_reg); - -#endif - - if(!iGain) { - SENSORDB("OV2680_SetGain[ERROR]:gain is zero, iGain = %x;\n",iGain); - iGain = 64; // 1x base - } - gain_reg = iGain/4; //sensor gain base 1x= 16, IReg = iGain/64*16; - gain_reg &= 0x3ff; - - OV2680_write_cmos_sensor(0x350b, (gain_reg&0xff)); - OV2680_write_cmos_sensor(0x3508, (gain_reg>>8)); - return ERROR_NONE; -} - - - - -/************************************************************************* -* FUNCTION -* OV2680_SetGain -* -* DESCRIPTION -* This function is to set global gain to sensor. -* -* PARAMETERS -* iGain : sensor global gain(base: 0x40) -* -* RETURNS -* the actually gain set to sensor. -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -#if 0 -void OV2680_set_isp_driving_current(kal_uint16 current) -{ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_set_isp_driving_current:current:%x;\n",current); -#endif - //iowrite32((0x2 << 12)|(0<<28)|(0x8880888), 0xF0001500); -} -#endif - -/************************************************************************* -* FUNCTION -* OV2680_NightMode -* -* DESCRIPTION -* This function night mode of OV2680. -* -* PARAMETERS -* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void OV2680_night_mode(kal_bool enable) -{ -} /* OV2680_NightMode */ - - -/* write camera_para to sensor register */ -static void OV2680_camera_para_to_sensor(void) -{ - kal_uint32 i; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_camera_para_to_sensor\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV2680_sensor.eng.reg[i].Addr; i++) - { - OV2680_write_cmos_sensor(OV2680_sensor.eng.reg[i].Addr, OV2680_sensor.eng.reg[i].Para); - } - for (i = OV2680_FACTORY_START_ADDR; 0xFFFFFFFF != OV2680_sensor.eng.reg[i].Addr; i++) - { - OV2680_write_cmos_sensor(OV2680_sensor.eng.reg[i].Addr, OV2680_sensor.eng.reg[i].Para); - } - OV2680_SetGain(OV2680_sensor.gain); /* update gain */ -} - -/* update camera_para from sensor register */ -static void OV2680_sensor_to_camera_para(void) -{ - kal_uint32 i; - kal_uint32 temp_data; - -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_sensor_to_camera_para\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV2680_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV2680_read_cmos_sensor(OV2680_sensor.eng.reg[i].Addr); - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&OV2680_drv_lock); - - } - for (i = OV2680_FACTORY_START_ADDR; 0xFFFFFFFF != OV2680_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV2680_read_cmos_sensor(OV2680_sensor.eng.reg[i].Addr); - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&OV2680_drv_lock); - } -} - -/* ------------------------ Engineer mode ------------------------ */ -inline static void OV2680_get_sensor_group_count(kal_int32 *sensor_count_ptr) -{ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_get_sensor_group_count\n"); -#endif - *sensor_count_ptr = OV2680_GROUP_TOTAL_NUMS; -} - -inline static void OV2680_get_sensor_group_info(MSDK_SENSOR_GROUP_INFO_STRUCT *para) -{ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_get_sensor_group_info\n"); -#endif - switch (para->GroupIdx) - { - case OV2680_PRE_GAIN: - sprintf(para->GroupNamePtr, "CCT"); - para->ItemCount = 5; - break; - case OV2680_CMMCLK_CURRENT: - sprintf(para->GroupNamePtr, "CMMCLK Current"); - para->ItemCount = 1; - break; - case OV2680_FRAME_RATE_LIMITATION: - sprintf(para->GroupNamePtr, "Frame Rate Limitation"); - para->ItemCount = 2; - break; - case OV2680_REGISTER_EDITOR: - sprintf(para->GroupNamePtr, "Register Editor"); - para->ItemCount = 2; - break; - default: - ASSERT(0); - } -} - -inline static void OV2680_get_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - - const static kal_char *cct_item_name[] = {"SENSOR_BASEGAIN", "Pregain-R", "Pregain-Gr", "Pregain-Gb", "Pregain-B"}; - const static kal_char *editer_item_name[] = {"REG addr", "REG value"}; - -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_get_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV2680_PRE_GAIN: - switch (para->ItemIdx) - { - case OV2680_SENSOR_BASEGAIN: - case OV2680_PRE_GAIN_R_INDEX: - case OV2680_PRE_GAIN_Gr_INDEX: - case OV2680_PRE_GAIN_Gb_INDEX: - case OV2680_PRE_GAIN_B_INDEX: - break; - default: - ASSERT(0); - } - sprintf(para->ItemNamePtr, cct_item_name[para->ItemIdx - OV2680_SENSOR_BASEGAIN]); - para->ItemValue = OV2680_sensor.eng.cct[para->ItemIdx].Para * 1000 / BASEGAIN; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = OV2680_MIN_ANALOG_GAIN * 1000; - para->Max = OV2680_MAX_ANALOG_GAIN * 1000; - break; - case OV2680_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Drv Cur[2,4,6,8]mA"); - switch (OV2680_sensor.eng.reg[OV2680_CMMCLK_CURRENT_INDEX].Para) - { - case ISP_DRIVING_2MA: - para->ItemValue = 2; - break; - case ISP_DRIVING_4MA: - para->ItemValue = 4; - break; - case ISP_DRIVING_6MA: - para->ItemValue = 6; - break; - case ISP_DRIVING_8MA: - para->ItemValue = 8; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsReadOnly = KAL_FALSE; - para->IsNeedRestart = KAL_TRUE; - para->Min = 2; - para->Max = 8; - break; - default: - ASSERT(0); - } - break; - case OV2680_FRAME_RATE_LIMITATION: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Max Exposure Lines"); - para->ItemValue = 5998; - break; - case 1: - sprintf(para->ItemNamePtr, "Min Frame Rate"); - para->ItemValue = 5; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsNeedRestart = KAL_FALSE; - para->IsReadOnly = KAL_TRUE; - para->Min = para->Max = 0; - break; - case OV2680_REGISTER_EDITOR: - switch (para->ItemIdx) - { - case 0: - case 1: - sprintf(para->ItemNamePtr, editer_item_name[para->ItemIdx]); - para->ItemValue = 0; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = 0; - para->Max = (para->ItemIdx == 0 ? 0xFFFF : 0xFF); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - -inline static kal_bool OV2680_set_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - kal_uint16 temp_para; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680_set_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV2680_PRE_GAIN: - switch (para->ItemIdx) - { - case OV2680_SENSOR_BASEGAIN: - case OV2680_PRE_GAIN_R_INDEX: - case OV2680_PRE_GAIN_Gr_INDEX: - case OV2680_PRE_GAIN_Gb_INDEX: - case OV2680_PRE_GAIN_B_INDEX: - spin_lock(&OV2680_drv_lock); - OV2680_sensor.eng.cct[para->ItemIdx].Para = para->ItemValue * BASEGAIN / 1000; - spin_unlock(&OV2680_drv_lock); - - OV2680_SetGain(OV2680_sensor.gain); /* update gain */ - break; - default: - ASSERT(0); - } - break; - case OV2680_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - switch (para->ItemValue) - { - case 2: - temp_para = ISP_DRIVING_2MA; - break; - case 3: - case 4: - temp_para = ISP_DRIVING_4MA; - break; - case 5: - case 6: - temp_para = ISP_DRIVING_6MA; - break; - default: - temp_para = ISP_DRIVING_8MA; - break; - } - //OV2680_set_isp_driving_current((kal_uint16)temp_para); - spin_lock(&OV2680_drv_lock); - OV2680_sensor.eng.reg[OV2680_CMMCLK_CURRENT_INDEX].Para = temp_para; - spin_unlock(&OV2680_drv_lock); - break; - default: - ASSERT(0); - } - break; - case OV2680_FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case OV2680_REGISTER_EDITOR: - switch (para->ItemIdx) - { - static kal_uint32 fac_sensor_reg; - case 0: - if (para->ItemValue < 0 || para->ItemValue > 0xFFFF) return KAL_FALSE; - fac_sensor_reg = para->ItemValue; - break; - case 1: - if (para->ItemValue < 0 || para->ItemValue > 0xFF) return KAL_FALSE; - OV2680_write_cmos_sensor(fac_sensor_reg, para->ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} - - - -#ifdef USE_I2C_MULTIWRITE -static kal_uint8 OV2680_init[]={ - - //0x01, 0x03, 0x01, - 0x30, 0x02, 0x00, - 0x30, 0x16, 0x1c, - 0x30, 0x18, 0x44, - 0x30, 0x20, 0x00, - 0x30, 0x80, 0x02, - 0x30, 0x82, 0x37, - 0x30, 0x84, 0x09, - 0x30, 0x85, 0x04, - 0x30, 0x86, 0x01, - 0x35, 0x01, 0x26, - 0x35, 0x02, 0x40, - 0x35, 0x03, 0x03, - 0x35, 0x0b, 0x36, - 0x36, 0x00, 0xb4, - 0x36, 0x03, 0x39, - 0x36, 0x04, 0x24, - 0x36, 0x05, 0x00, - 0x36, 0x20, 0x26, - 0x36, 0x21, 0x37, - 0x36, 0x22, 0x04, - 0x36, 0x28, 0x00, - 0x37, 0x05, 0x3c, - 0x37, 0x0c, 0x50, - 0x37, 0x0d, 0xc0, - 0x37, 0x18, 0x88, - 0x37, 0x20, 0x00, - 0x37, 0x21, 0x00, - 0x37, 0x22, 0x00, - 0x37, 0x23, 0x00, - 0x37, 0x38, 0x00, - 0x37, 0x0a, 0x23, - 0x37, 0x17, 0x58, - 0x37, 0x81, 0x80, - 0x37, 0x89, 0x60, - 0x38, 0x00, 0x00, - 0x38, 0x01, 0x00, - 0x38, 0x02, 0x00, - 0x38, 0x03, 0x00, - 0x38, 0x04, 0x06, - 0x38, 0x05, 0x4f, - 0x38, 0x06, 0x04, - 0x38, 0x07, 0xbf, - 0x38, 0x08, 0x03, - 0x38, 0x09, 0x20, - 0x38, 0x0a, 0x02, - 0x38, 0x0b, 0x58, - 0x38, 0x0c, 0x06, - 0x38, 0x0d, 0xac, - 0x38, 0x0e, 0x02, - 0x38, 0x0f, 0x84, - 0x38, 0x10, 0x00, - 0x38, 0x11, 0x04, - 0x38, 0x12, 0x00, - 0x38, 0x13, 0x04, - 0x38, 0x14, 0x31, - 0x38, 0x15, 0x31, - 0x38, 0x19, 0x04, - 0x38, 0x20, 0xc2, - 0x38, 0x21, 0x01, - 0x40, 0x00, 0x81, - 0x40, 0x01, 0x40, - 0x40, 0x08, 0x00, - 0x40, 0x09, 0x03, - 0x46, 0x02, 0x02, - 0x48, 0x1f, 0x36, - 0x48, 0x25, 0x36, - 0x48, 0x37, 0x30, - 0x50, 0x02, 0x30, - 0x50, 0x80, 0x00, - 0x50, 0x81, 0x41, - 0x01, 0x00, 0x01, - -}; - -static kal_uint8 OV2680_preview[]={ - 0x01, 0x00, 0x00, - 0x30, 0x86, 0x00, - 0x35, 0x01, 0x4e, - 0x35, 0x02, 0xe0, - 0x36, 0x20, 0x26, - 0x36, 0x21, 0x37, - 0x36, 0x22, 0x04, - 0x37, 0x0a, 0x21, - 0x37, 0x0d, 0xc0, - 0x37, 0x18, 0x88, - 0x37, 0x21, 0x00, - 0x37, 0x22, 0x00, - 0x37, 0x23, 0x00, - 0x37, 0x38, 0x00, - 0x38, 0x03, 0x00, - 0x38, 0x07, 0xbf, - 0x38, 0x08, 0x06, - 0x38, 0x09, 0x40, - 0x38, 0x0a, 0x04, - 0x38, 0x0b, 0xb0, - 0x38, 0x0c, 0x06, - 0x38, 0x0d, 0xa4, - 0x38, 0x0e, 0x05, - 0x38, 0x0f, 0x0e, - 0x38, 0x11, 0x08, - 0x38, 0x13, 0x08, - 0x38, 0x14, 0x11, - 0x38, 0x15, 0x11, - 0x38, 0x20, 0xc0, - 0x38, 0x21, 0x00, - 0x40, 0x08, 0x02, - 0x40, 0x09, 0x09, - 0x48, 0x37, 0x18, - 0x01, 0x00, 0x01, - -}; - -static kal_uint8 OV2680_fullsize_15fps[]={ - 0x01, 0x00, 0x00, - 0x30, 0x86, 0x01, - 0x35, 0x01, 0x4e, - 0x35, 0x02, 0xe0, - 0x36, 0x20, 0x24, - 0x36, 0x21, 0x34, - 0x36, 0x22, 0x03, - 0x37, 0x0a, 0x21, - 0x37, 0x0d, 0x00, - 0x37, 0x18, 0x80, - 0x37, 0x21, 0x09, - 0x37, 0x22, 0x0b, - 0x37, 0x23, 0x48, - 0x37, 0x38, 0x99, - 0x38, 0x03, 0x00, - 0x38, 0x07, 0xbf, - 0x38, 0x08, 0x06, - 0x38, 0x09, 0x40, - 0x38, 0x0a, 0x04, - 0x38, 0x0b, 0xb0, - 0x38, 0x0c, 0x06, - 0x38, 0x0d, 0xa4, - 0x38, 0x0e, 0x05, - 0x38, 0x0f, 0x0e, - 0x38, 0x11, 0x08, - 0x38, 0x13, 0x08, - 0x38, 0x14, 0x11, - 0x38, 0x15, 0x11, - 0x38, 0x20, 0xc0, - 0x38, 0x21, 0x00, - 0x40, 0x08, 0x02, - 0x40, 0x09, 0x09, - 0x48, 0x37, 0x30, - 0x01, 0x00, 0x01, - -}; - -//static kal_uint8 OV2680_capture[]={ -// }; - -#else -static void OV2680MIPI_Sensor_Init(void) -{ - /* - @@Initial - MIPI 4-Lane 4608x3456 10-bit 15fps_640Mbps_lane - 100 99 4608 3456 - 100 98 1 1 - 102 81 0 ffff - 102 84 1 ffff - 102 3601 5dc - 102 3f00 da2 - 102 910 31 - */ - - //;Reset - OV2680_write_cmos_sensor(0x0103, 0x01); - mdelay(50); - OV2680_write_cmos_sensor(0x3002, 0x00); - OV2680_write_cmos_sensor(0x3016, 0x1c); - OV2680_write_cmos_sensor(0x3018, 0x44); - OV2680_write_cmos_sensor(0x3020, 0x00); - OV2680_write_cmos_sensor(0x3080, 0x02); - OV2680_write_cmos_sensor(0x3082, 0x37); - OV2680_write_cmos_sensor(0x3084, 0x09); - OV2680_write_cmos_sensor(0x3085, 0x04); - OV2680_write_cmos_sensor(0x3086, 0x01); - OV2680_write_cmos_sensor(0x3501, 0x26); - OV2680_write_cmos_sensor(0x3502, 0x40); - OV2680_write_cmos_sensor(0x3503, 0x03); - OV2680_write_cmos_sensor(0x350b, 0x36); - OV2680_write_cmos_sensor(0x3600, 0xb4); - OV2680_write_cmos_sensor(0x3603, 0x39); - OV2680_write_cmos_sensor(0x3604, 0x24); - OV2680_write_cmos_sensor(0x3605, 0x00); - OV2680_write_cmos_sensor(0x3620, 0x26); - OV2680_write_cmos_sensor(0x3621, 0x37); - OV2680_write_cmos_sensor(0x3622, 0x04); - OV2680_write_cmos_sensor(0x3628, 0x00); - OV2680_write_cmos_sensor(0x3705, 0x3c); - OV2680_write_cmos_sensor(0x370c, 0x50); - OV2680_write_cmos_sensor(0x370d, 0xc0); - OV2680_write_cmos_sensor(0x3718, 0x88); - OV2680_write_cmos_sensor(0x3720, 0x00); - OV2680_write_cmos_sensor(0x3721, 0x00); - OV2680_write_cmos_sensor(0x3722, 0x00); - OV2680_write_cmos_sensor(0x3723, 0x00); - OV2680_write_cmos_sensor(0x3738, 0x00); - OV2680_write_cmos_sensor(0x370a, 0x23); - OV2680_write_cmos_sensor(0x3717, 0x58); - OV2680_write_cmos_sensor(0x3781, 0x80); - OV2680_write_cmos_sensor(0x3784, 0x0c); // - OV2680_write_cmos_sensor(0x3789, 0x60); - OV2680_write_cmos_sensor(0x3800, 0x00); - OV2680_write_cmos_sensor(0x3801, 0x00); - OV2680_write_cmos_sensor(0x3802, 0x00); - OV2680_write_cmos_sensor(0x3803, 0x00); - OV2680_write_cmos_sensor(0x3804, 0x06); - OV2680_write_cmos_sensor(0x3805, 0x4f); - OV2680_write_cmos_sensor(0x3806, 0x04); - OV2680_write_cmos_sensor(0x3807, 0xbf); - OV2680_write_cmos_sensor(0x3808, 0x03); - OV2680_write_cmos_sensor(0x3809, 0x20); - OV2680_write_cmos_sensor(0x380a, 0x02); - OV2680_write_cmos_sensor(0x380b, 0x58); - OV2680_write_cmos_sensor(0x380c, 0x06); - OV2680_write_cmos_sensor(0x380d, 0xac); - OV2680_write_cmos_sensor(0x380e, 0x02); - OV2680_write_cmos_sensor(0x380f, 0x84); - OV2680_write_cmos_sensor(0x3810, 0x00); - OV2680_write_cmos_sensor(0x3811, 0x04); - OV2680_write_cmos_sensor(0x3812, 0x00); - OV2680_write_cmos_sensor(0x3813, 0x04); - OV2680_write_cmos_sensor(0x3814, 0x31); - OV2680_write_cmos_sensor(0x3815, 0x31); - OV2680_write_cmos_sensor(0x3819, 0x04); - OV2680_write_cmos_sensor(0x3820, 0xc2); - OV2680_write_cmos_sensor(0x3821, 0x01); - OV2680_write_cmos_sensor(0x4000, 0x81); - OV2680_write_cmos_sensor(0x4001, 0x40); - OV2680_write_cmos_sensor(0x4008, 0x00); - OV2680_write_cmos_sensor(0x4009, 0x03); - OV2680_write_cmos_sensor(0x4602, 0x02); - OV2680_write_cmos_sensor(0x481f, 0x36); - OV2680_write_cmos_sensor(0x4825, 0x36); - OV2680_write_cmos_sensor(0x4837, 0x30); - OV2680_write_cmos_sensor(0x5002, 0x30); - OV2680_write_cmos_sensor(0x5080, 0x00); - OV2680_write_cmos_sensor(0x5081, 0x41); - OV2680_write_cmos_sensor(0x3021, 0x23); - OV2680_write_cmos_sensor(0x0100, 0x01); - - - mdelay(40); - - -} /* OV2680MIPI_Sensor_Init */ /* OV2680MIPI_Sensor_Init */ - -static void OV2680MIPI_Sensor_preview(void) -{ - //------------------------------------------------------------------------------- - - - SENSORDB("OV2680MIPIPreview Setting \n"); - - OV2680_write_cmos_sensor(0x0100, 0x00); - OV2680_write_cmos_sensor(0x3086, 0x00); - OV2680_write_cmos_sensor(0x3501, 0x4e); - OV2680_write_cmos_sensor(0x3502, 0xe0); - OV2680_write_cmos_sensor(0x3620, 0x26); - OV2680_write_cmos_sensor(0x3621, 0x37); - OV2680_write_cmos_sensor(0x3622, 0x04); - OV2680_write_cmos_sensor(0x370a, 0x21); - OV2680_write_cmos_sensor(0x370d, 0xc0); - OV2680_write_cmos_sensor(0x3718, 0x88); - OV2680_write_cmos_sensor(0x3721, 0x00); - OV2680_write_cmos_sensor(0x3722, 0x00); - OV2680_write_cmos_sensor(0x3723, 0x00); - OV2680_write_cmos_sensor(0x3738, 0x00); - OV2680_write_cmos_sensor(0x3803, 0x00); - OV2680_write_cmos_sensor(0x3807, 0xbf); - OV2680_write_cmos_sensor(0x3808, 0x06); - OV2680_write_cmos_sensor(0x3809, 0x40); - OV2680_write_cmos_sensor(0x380a, 0x04); - OV2680_write_cmos_sensor(0x380b, 0xb0); - OV2680_write_cmos_sensor(0x380c, 0x06); - OV2680_write_cmos_sensor(0x380d, 0xa4); - OV2680_write_cmos_sensor(0x380e, 0x05); - OV2680_write_cmos_sensor(0x380f, 0x0e); - OV2680_write_cmos_sensor(0x3811, 0x08); - OV2680_write_cmos_sensor(0x3813, 0x08); - OV2680_write_cmos_sensor(0x3814, 0x11); - OV2680_write_cmos_sensor(0x3815, 0x11); - OV2680_write_cmos_sensor(0x3820, 0xc0); - OV2680_write_cmos_sensor(0x3821, 0x00); - OV2680_write_cmos_sensor(0x4008, 0x02); - OV2680_write_cmos_sensor(0x4009, 0x09); - OV2680_write_cmos_sensor(0x4837, 0x18); - OV2680_write_cmos_sensor(0x0100, 0x01); - mdelay(60); - -} -static void OV2680MIPI_Sensor_2M_15fps(void) -{ - //------------------------------------------------------------------------------- - - - SENSORDB("OV2680MIPIPreview Setting \n"); - - OV2680_write_cmos_sensor(0x0100, 0x00); - OV2680_write_cmos_sensor(0x3086, 0x01); - OV2680_write_cmos_sensor(0x3501, 0x4e); - OV2680_write_cmos_sensor(0x3502, 0xe0); - OV2680_write_cmos_sensor(0x3620, 0x24); - OV2680_write_cmos_sensor(0x3621, 0x34); - OV2680_write_cmos_sensor(0x3622, 0x03); - OV2680_write_cmos_sensor(0x370a, 0x21); - OV2680_write_cmos_sensor(0x370d, 0x00); - OV2680_write_cmos_sensor(0x3718, 0x80); - OV2680_write_cmos_sensor(0x3721, 0x09); - OV2680_write_cmos_sensor(0x3722, 0x0b); - OV2680_write_cmos_sensor(0x3723, 0x48); - OV2680_write_cmos_sensor(0x3738, 0x99); - OV2680_write_cmos_sensor(0x3803, 0x00); - OV2680_write_cmos_sensor(0x3807, 0xbf); - OV2680_write_cmos_sensor(0x3808, 0x06); - OV2680_write_cmos_sensor(0x3809, 0x40); - OV2680_write_cmos_sensor(0x380a, 0x04); - OV2680_write_cmos_sensor(0x380b, 0xb0); - OV2680_write_cmos_sensor(0x380c, 0x06); - OV2680_write_cmos_sensor(0x380d, 0xa4); - OV2680_write_cmos_sensor(0x380e, 0x05); - OV2680_write_cmos_sensor(0x380f, 0x0e); - OV2680_write_cmos_sensor(0x3811, 0x08); - OV2680_write_cmos_sensor(0x3813, 0x08); - OV2680_write_cmos_sensor(0x3814, 0x11); - OV2680_write_cmos_sensor(0x3815, 0x11); - OV2680_write_cmos_sensor(0x3820, 0xc0);//0xc4 - OV2680_write_cmos_sensor(0x3821, 0x00);//0x04 - OV2680_write_cmos_sensor(0x4008, 0x02); - OV2680_write_cmos_sensor(0x4009, 0x09); - OV2680_write_cmos_sensor(0x4837, 0x30); - OV2680_write_cmos_sensor(0x0100, 0x01); - mdelay(60); - -} - - -#endif -#ifdef USE_I2C_MULTIWRITE -static UINT32 OV2680MultiWrite(kal_uint8* pData, int iLen) -{ - int totalCnt = 0, len = 0; - int transfer_len, transac_len=3; - kal_uint8* pBuf=NULL; - dma_addr_t dmaHandle; - pBuf = (kal_uint8*)kmalloc(1024, GFP_KERNEL); - - totalCnt = iLen; - transfer_len = totalCnt / transac_len; - len = (transfer_len<<8)|transac_len; - - SENSORDB("Total Count = %d, Len = 0x%x\n", totalCnt,len); - memcpy(pBuf, pData, totalCnt ); - dmaHandle = dma_map_single(NULL, pBuf, 1024, DMA_TO_DEVICE); - Ov2680_multi_write_cmos_sensor(dmaHandle, len); - dma_unmap_single(NULL, dmaHandle, 1024, DMA_TO_DEVICE); - - SENSORDB("OV2680MultiWrite exit :\n "); - -} -#endif - -UINT32 OV2680Open(void) -{ - kal_uint16 sensor_id=0; - int i, iLen; - const kal_uint16 sccb_writeid[] = {OV2680_SLAVE_WRITE_ID_1,OV2680_SLAVE_WRITE_ID_2}; - SENSORDB("OV2680Open\n"); - - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.is_zsd = KAL_FALSE; //for zsd full size preview - OV2680_sensor.is_zsd_cap = KAL_FALSE; - OV2680_sensor.is_autofliker = KAL_FALSE; //for autofliker. - OV2680_sensor.pv_mode = KAL_FALSE; - OV2680_sensor.pclk = OV2680_PREVIEW_CLK; - spin_unlock(&OV2680_drv_lock); - - for(i = 0; i <(sizeof(sccb_writeid)/sizeof(sccb_writeid[0])); i++) - { - spin_lock(&OV2680_drv_lock); - OV2680_sensor.write_id = sccb_writeid[i]; - OV2680_sensor.read_id = (sccb_writeid[i]|0x01); - spin_unlock(&OV2680_drv_lock); - - sensor_id=((OV2680_read_cmos_sensor(0x300A) << 8) | OV2680_read_cmos_sensor(0x300B)); - -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680Open, sensor_id:%x \n",sensor_id); -#endif - if(OV2680MIPI_SENSOR_ID == sensor_id) - { - SENSORDB("OV2680 slave write id:%x \n",OV2680_sensor.write_id); - break; - } - } - - // check if sensor ID correct - if (sensor_id != OV2680MIPI_SENSOR_ID) - { - SENSORDB("OV2680 Check ID fails! \n"); - - SENSORDB("[Warning]OV2680GetSensorID, sensor_id:%x \n",sensor_id); - //sensor_id = OV2680_SENSOR_ID; - sensor_id = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - - //OV2680_global_setting(); - #ifdef USE_I2C_MULTIWRITE - OV2680_write_cmos_sensor(0x0103, 0x01); - mdelay(30); - iLen = ARRAY_SIZE(OV2680_init); - OV2680MultiWrite(OV2680_init, iLen); - mdelay(40); - - iLen = ARRAY_SIZE(OV2680_preview); - OV2680MultiWrite(OV2680_preview, iLen); - mdelay(60); - - #else - OV2680MIPI_Sensor_Init(); - OV2680MIPI_Sensor_preview(); - - #endif - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.dummy_pixels = 0; - OV2680_sensor.dummy_lines = 0; - OV2680_sensor.line_length = OV2680_PV_PERIOD_PIXEL_NUMS; - OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS; - OV2680_sensor.pclk = OV2680_PREVIEW_CLK; - spin_unlock(&OV2680_drv_lock); - - OV2680_Set_Dummy(0, 0); /* modify dummy_pixel must gen AE table again */ - - SENSORDB("open End \n"); - - return ERROR_NONE; -} /* OV2680Open */ - -/************************************************************************* -* FUNCTION -* OV5642GetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* *sensorID : return the sensor ID -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV2680GetSensorID(UINT32 *sensorID) -{ - //added by mandrave - int i; - const kal_uint16 sccb_writeid[] = {OV2680_SLAVE_WRITE_ID_1, OV2680_SLAVE_WRITE_ID_2}; - - printk("alphaxiang OV2680GetSensorID enter,\n"); - for(i = 0; i <(sizeof(sccb_writeid)/sizeof(sccb_writeid[0])); i++) - { - spin_lock(&OV2680_drv_lock); - OV2680_sensor.write_id = sccb_writeid[i]; - OV2680_sensor.read_id = (sccb_writeid[i]|0x01); - spin_unlock(&OV2680_drv_lock); - - *sensorID=((OV2680_read_cmos_sensor(0x300A) << 8) | OV2680_read_cmos_sensor(0x300B)); - - - printk("alphaxiang OV2680GetSensorID, sensor_id:%x \n",*sensorID); - - if(OV2680MIPI_SENSOR_ID == *sensorID) - { - SENSORDB("OV2680 slave write id:%x \n",OV2680_sensor.write_id); - break; - } - } - - // check if sensor ID correct - if (*sensorID != OV2680MIPI_SENSOR_ID) - { - SENSORDB("[Warning]OV2680GetSensorID, sensor_id:%x \n",*sensorID); - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - SENSORDB("OV2680GetSensorID exit,\n"); - return ERROR_NONE; -} - -/************************************************************************* -* FUNCTION -* OV2680Close -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV2680Close(void) -{ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680Close\n"); -#endif - - return ERROR_NONE; -} /* OV2680Close */ - -/************************************************************************* -* FUNCTION -* OV2680Preview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV2680Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_line; - int iLen; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680Preview \n"); -#endif - spin_lock(&OV2680_drv_lock); - OV2680_sensor.pv_mode = KAL_TRUE; - OV2680_sensor.is_zsd = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.video_mode = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - dummy_line = 0; - //OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS; - OV2680_sensor.dummy_pixels = 0; - OV2680_sensor.dummy_lines = 0; - OV2680_sensor.line_length = OV2680_PV_PERIOD_PIXEL_NUMS; - OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS + dummy_line; - OV2680_sensor.pclk = OV2680_PREVIEW_CLK; - - OV2680_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - - return ERROR_NONE; - -} /* OV2680Preview */ - - -/************************************************************************* -* FUNCTION -* OV2680VIDEO -* -* DESCRIPTION -* This function start the sensor Video preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -UINT32 OV2680VIDEO(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_line; - kal_uint16 ret; - int iLen; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680VIDEO \n"); -#endif - spin_lock(&OV2680_drv_lock); - OV2680_sensor.pv_mode = KAL_FALSE; - OV2680_sensor.is_zsd = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.video_mode = KAL_TRUE; - spin_unlock(&OV2680_drv_lock); - dummy_line = 0; - - //OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS; - OV2680_sensor.dummy_pixels = 0; - OV2680_sensor.dummy_lines = 0; - OV2680_sensor.line_length = OV2680_PV_PERIOD_PIXEL_NUMS; - OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS + dummy_line; - OV2680_sensor.pclk = OV2680_PREVIEW_CLK; - - OV2680_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - - return ERROR_NONE; - -} /* OV2680VIDEO */ - - -/************************************************************************* -* FUNCTION -* OV2680ZsdPreview -* -* DESCRIPTION -* This function setup the CMOS sensor in Full Size output mode -* -* PARAMETERS -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV2680ZsdPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) - -{ - kal_uint16 dummy_pixel = 0; - kal_uint16 dummy_line = 0; - kal_uint16 ret; - int iLen; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680ZsdPreview \n"); -#endif - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.pv_mode = KAL_FALSE; - OV2680_sensor.is_zsd = KAL_TRUE; - spin_unlock(&OV2680_drv_lock); - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.video_mode = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - dummy_line = 0; - //OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS; - OV2680_sensor.dummy_pixels = 0; - OV2680_sensor.dummy_lines = 0; - OV2680_sensor.line_length = OV2680_PV_PERIOD_PIXEL_NUMS; - OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS + dummy_line; - OV2680_sensor.pclk = OV2680_PREVIEW_CLK; - - OV2680_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - return ERROR_NONE; -} - - - -/************************************************************************* -* FUNCTION -*OV2680Capture -* -* DESCRIPTION -* This function setup the CMOS sensor in capture MY_OUTPUT mode -* -* PARAMETERS -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV2680Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_pixel = 0; - kal_uint16 dummy_line = 0; - kal_uint16 ret; - int iLen; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680Capture start test1\n"); -#endif - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.video_mode = KAL_FALSE; - //OV2680_sensor.is_autofliker = KAL_FALSE; - OV2680_sensor.pv_mode = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - - dummy_line = 0; - //OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS; - OV2680_sensor.dummy_pixels = 0; - OV2680_sensor.dummy_lines = 0; - OV2680_sensor.line_length = OV2680_PV_PERIOD_PIXEL_NUMS; - OV2680_sensor.frame_height = OV2680_PV_PERIOD_LINE_NUMS + dummy_line; - OV2680_sensor.pclk = OV2680_PREVIEW_CLK; - - OV2680_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - - - return ERROR_NONE; -} /* OV2680_Capture() */ - - -UINT32 OV26803DPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_line; - kal_uint16 ret; - int iLen; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV26803DPreview \n"); -#endif - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.pv_mode = KAL_TRUE; - spin_unlock(&OV2680_drv_lock); - - spin_lock(&OV2680_drv_lock); - OV2680_sensor.video_mode = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - - return ERROR_NONE; - -} - - -UINT32 OV2680GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680GetResolution \n"); -#endif - pSensorResolution->SensorFullWidth=OV2680_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight=OV2680_IMAGE_SENSOR_FULL_HEIGHT; - pSensorResolution->SensorPreviewWidth=OV2680_IMAGE_SENSOR_PV_WIDTH; - pSensorResolution->SensorPreviewHeight=OV2680_IMAGE_SENSOR_PV_HEIGHT; - pSensorResolution->SensorVideoWidth=OV2680_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight=OV2680_IMAGE_SENSOR_VIDEO_HEIGHT; - pSensorResolution->Sensor3DFullWidth=OV2680_IMAGE_SENSOR_3D_FULL_WIDTH; - pSensorResolution->Sensor3DFullHeight=OV2680_IMAGE_SENSOR_3D_FULL_HEIGHT; - pSensorResolution->Sensor3DPreviewWidth=OV2680_IMAGE_SENSOR_3D_PV_WIDTH; - pSensorResolution->Sensor3DPreviewHeight=OV2680_IMAGE_SENSOR_3D_PV_HEIGHT; - pSensorResolution->Sensor3DVideoWidth=OV2680_IMAGE_SENSOR_3D_VIDEO_WIDTH; - pSensorResolution->Sensor3DVideoHeight=OV2680_IMAGE_SENSOR_3D_VIDEO_HEIGHT; - return ERROR_NONE; -}/* OV2680GetResolution() */ - -UINT32 OV2680GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680GetInfo£¬FeatureId:%d\n",ScenarioId); -#endif - - switch(ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorPreviewResolutionX=OV2680_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV2680_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV2680_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV2680_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate = 30; - break; - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - pSensorInfo->SensorPreviewResolutionX=OV2680_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV2680_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV2680_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV2680_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=30; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorPreviewResolutionX=OV2680_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV2680_IMAGE_SENSOR_VIDEO_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV2680_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV2680_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=30; - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - pSensorInfo->SensorPreviewResolutionX=OV2680_IMAGE_SENSOR_3D_VIDEO_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV2680_IMAGE_SENSOR_3D_VIDEO_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV2680_IMAGE_SENSOR_3D_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV2680_IMAGE_SENSOR_3D_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate=30; - break; - default: - pSensorInfo->SensorPreviewResolutionX=OV2680_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV2680_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV2680_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV2680_IMAGE_SENSOR_FULL_HEIGHT; - pSensorInfo->SensorCameraPreviewFrameRate = 30; - break; - } - - //pSensorInfo->SensorCameraPreviewFrameRate=30; - pSensorInfo->SensorVideoFrameRate=30; - pSensorInfo->SensorStillCaptureFrameRate=30; - pSensorInfo->SensorWebCamCaptureFrameRate=15; - pSensorInfo->SensorResetActiveHigh=FALSE; //low active - pSensorInfo->SensorResetDelayCount=5; - - pSensorInfo->SensorOutputDataFormat=OV2680_COLOR_FORMAT; - pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorInterruptDelayLines = 4; - pSensorInfo->SensroInterfaceType = SENSOR_INTERFACE_TYPE_MIPI; - pSensorInfo->CaptureDelayFrame = 3; - pSensorInfo->PreviewDelayFrame = 2; - pSensorInfo->VideoDelayFrame = 1; - - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_4MA; - pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ - pSensorInfo->AESensorGainDelayFrame = 0;/* The frame of setting sensor gain */ - pSensorInfo->AEISPGainDelayFrame = 2; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = OV2680_PV_X_START; - pSensorInfo->SensorGrabStartY = OV2680_PV_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE; - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 26; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorWidthSampling = 0; // 0 is default 1x - pSensorInfo->SensorHightSampling = 0; // 0 is default 1x - pSensorInfo->SensorPacketECCOrder = 1; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = OV2680_PV_X_START; - pSensorInfo->SensorGrabStartY = OV2680_PV_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE; - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 26; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorWidthSampling = 0; // 0 is default 1x - pSensorInfo->SensorHightSampling = 0; // 0 is default 1x - pSensorInfo->SensorPacketECCOrder = 1; - - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV2680_FULL_X_START; - pSensorInfo->SensorGrabStartY = OV2680_FULL_Y_START; - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE; //Hesong Modify 10/25 SENSOR_MIPI_2_LANE - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 26; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorWidthSampling = 0; // 0 is default 1x - pSensorInfo->SensorHightSampling = 0; // 0 is default 1x - pSensorInfo->SensorPacketECCOrder = 1; - break; - - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX= OV2680_3D_PV_X_START; - pSensorInfo->SensorGrabStartY = OV2680_3D_PV_Y_START; - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE; //Hesong Modify 10/25 SENSOR_MIPI_2_LANE - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 26; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorWidthSampling = 0; // 0 is default 1x - pSensorInfo->SensorHightSampling = 0; // 0 is default 1x - pSensorInfo->SensorPacketECCOrder = 1; - - break; - default: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV2680_PV_X_START; - pSensorInfo->SensorGrabStartY = OV2680_PV_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_1_LANE; - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 26; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorWidthSampling = 0; // 0 is default 1x - pSensorInfo->SensorHightSampling = 0; // 0 is default 1x - pSensorInfo->SensorPacketECCOrder = 1; - break; - } - return ERROR_NONE; -} /* OV2680GetInfo() */ - - -UINT32 OV2680Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680Control£¬ScenarioId:%d\n",ScenarioId); -#endif - - spin_lock(&OV2680_drv_lock); - ov2680CurrentScenarioId = ScenarioId; - spin_unlock(&OV2680_drv_lock); - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - OV2680Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - OV2680VIDEO(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - OV2680Capture(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV2680ZsdPreview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - OV26803DPreview(pImageWindow, pSensorConfigData); - break; - default: - return ERROR_INVALID_SCENARIO_ID; - } - return ERROR_NONE; -} /* OV2680Control() */ - -UINT32 OV2680SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - - //kal_uint32 pv_max_frame_rate_lines = OV2680_sensor.dummy_lines; - - SENSORDB("[OV2680SetAutoFlickerMode] bEnable = %d, frame rate(10base) = %d\n", bEnable, u2FrameRate); - - if(bEnable) - { - spin_lock(&OV2680_drv_lock); - OV2680_sensor.is_autofliker = KAL_TRUE; - spin_unlock(&OV2680_drv_lock); - } - else - { - spin_lock(&OV2680_drv_lock); - OV2680_sensor.is_autofliker = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - } - SENSORDB("[OV2680SetAutoFlickerMode]bEnable:%x \n",bEnable); - return ERROR_NONE; -} - - -UINT32 OV2680SetCalData(PSET_SENSOR_CALIBRATION_DATA_STRUCT pSetSensorCalData) -{ - UINT32 i; - SENSORDB("OV2680 Sensor write calibration data num = %d \r\n", pSetSensorCalData->DataSize); - SENSORDB("OV2680 Sensor write calibration data format = %x \r\n", pSetSensorCalData->DataFormat); - if(pSetSensorCalData->DataSize <= MAX_SHADING_DATA_TBL){ - for (i = 0; i < pSetSensorCalData->DataSize; i++){ - if (((pSetSensorCalData->DataFormat & 0xFFFF) == 1) && ((pSetSensorCalData->DataFormat >> 16) == 1)){ - SENSORDB("OV2680 Sensor write calibration data: address = %x, value = %x \r\n",(pSetSensorCalData->ShadingData[i])>>16,(pSetSensorCalData->ShadingData[i])&0xFFFF); - OV2680_write_cmos_sensor((pSetSensorCalData->ShadingData[i])>>16, (pSetSensorCalData->ShadingData[i])&0xFFFF); - } - } - } - return ERROR_NONE; -} - -UINT32 OV2680SetTestPatternMode(kal_bool bEnable) -{ - SENSORDB("[OV2680SetTestPatternMode] Test pattern enable:%d\n", bEnable); - if(bEnable == KAL_TRUE) - { - //OV2680_during_testpattern = KAL_TRUE; - OV2680_write_cmos_sensor(0x5080,0x80); - - SENSORDB("[OV2680SetTestPatternMode] Test pattern enable==TRUE:\n"); - } - else - { - //OV2680_during_testpattern = KAL_FALSE; - OV2680_write_cmos_sensor(0x5080,0x00); - - SENSORDB("[OV2680SetTestPatternMode] Test pattern enable==FALSE:\n"); - } - - return ERROR_NONE; -} - -UINT32 OV2680SetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) -{ - kal_uint32 pclk; - kal_int16 dummyLine; - kal_uint16 lineLength,frameHeight; - - SENSORDB("OV2680SetMaxFramerateByScenario: scenarioId = %d, frame rate = %d\n",scenarioId,frameRate); - switch (scenarioId) { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pclk = OV2680_PREVIEW_CLK; - lineLength = OV2680_PV_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/(lineLength/OV2680_MIPI_LANE_NUM); - dummyLine = frameHeight - OV2680_PV_PERIOD_LINE_NUMS; - if (dummyLine < 0){ - dummyLine = 0; - } - OV2680_Set_Dummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pclk = OV2680_VIDEO_CLK; - lineLength = OV2680_VIDEO_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/(lineLength/OV2680_MIPI_LANE_NUM); - dummyLine = frameHeight - OV2680_VIDEO_PERIOD_LINE_NUMS; - if (dummyLine < 0){ - dummyLine = 0; - } - OV2680_Set_Dummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pclk = OV2680_CAPTURE_CLK; - lineLength = OV2680_FULL_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/(lineLength/OV2680_MIPI_LANE_NUM); - if(frameHeight < OV2680_FULL_PERIOD_LINE_NUMS) - frameHeight = OV2680_FULL_PERIOD_LINE_NUMS; - dummyLine = frameHeight - OV2680_FULL_PERIOD_LINE_NUMS; - - //SENSORDB("OV2680SetMaxFramerateByScenario: scenarioId = %d, frame rate calculate = %d\n",((10 * pclk)/frameHeight/lineLength)); - OV2680_Set_Dummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - break; - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - break; - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - break; - default: - break; - } - return ERROR_NONE; -} - - -UINT32 OV2680GetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate) -{ - switch (scenarioId) { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - *pframeRate = 300; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - *pframeRate = 300; - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - *pframeRate = 300; - break; - default: - break; - } - - return ERROR_NONE; -} - -UINT32 OV2680SetVideoMode(UINT16 u2FrameRate) -{ - kal_int16 dummy_line; - /* to fix VSYNC, to fix frame rate */ -#ifdef OV2680_DRIVER_TRACE - SENSORDB("OV2680SetVideoMode£¬u2FrameRate:%d\n",u2FrameRate); -#endif - - - if((30 == u2FrameRate)||(15 == u2FrameRate)||(24 == u2FrameRate)) - { - dummy_line = OV2680_sensor.pclk / u2FrameRate / (OV2680_sensor.line_length/OV2680_MIPI_LANE_NUM) - OV2680_sensor.frame_height; - if (dummy_line < 0) - dummy_line = 0; -#ifdef OV2680_DRIVER_TRACE - SENSORDB("dummy_line %d\n", dummy_line); -#endif - OV2680_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - spin_lock(&OV2680_drv_lock); - OV2680_sensor.video_mode = KAL_TRUE; - spin_unlock(&OV2680_drv_lock); - } - else if(0 == u2FrameRate) - { - spin_lock(&OV2680_drv_lock); - OV2680_sensor.video_mode = KAL_FALSE; - spin_unlock(&OV2680_drv_lock); - - SENSORDB("disable video mode\n"); - } - else{ - SENSORDB("[OV2680SetVideoMode],Error Framerate, u2FrameRate=%d",u2FrameRate); - } - return ERROR_NONE; -} - - -UINT32 OV2680FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; - UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; - UINT32 OV2680SensorRegNumber; - UINT32 i; - //PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - //MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - PSET_SENSOR_CALIBRATION_DATA_STRUCT pSetSensorCalData=(PSET_SENSOR_CALIBRATION_DATA_STRUCT)pFeaturePara; - -#ifdef OV2680_DRIVER_TRACE - //SENSORDB("OV2680FeatureControl£¬FeatureId:%d\n",FeatureId); -#endif - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=OV2680_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16=OV2680_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD:/* 3 */ - *pFeatureReturnPara16++= (OV2680_sensor.line_length/OV2680_MIPI_LANE_NUM); - *pFeatureReturnPara16= OV2680_sensor.frame_height; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: /* 3 */ - *pFeatureReturnPara32 = OV2680_sensor.pclk; - break; - case SENSOR_FEATURE_SET_ESHUTTER: /* 4 */ - set_OV2680_shutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - //OV2680_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: /* 6 */ - OV2680_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - break; - case SENSOR_FEATURE_SET_REGISTER: - OV2680_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV2680_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - //memcpy(&OV2680_sensor.eng.cct, pFeaturePara, sizeof(OV2680_sensor.eng.cct)); - OV2680SensorRegNumber = OV2680_FACTORY_END_ADDR; - for (i=0;i= sizeof(OV2680_sensor.eng.cct) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV2680_sensor.eng.cct); - memcpy(pFeaturePara, &OV2680_sensor.eng.cct, sizeof(OV2680_sensor.eng.cct)); - } - break; - case SENSOR_FEATURE_SET_ENG_REGISTER: - //memcpy(&OV2680_sensor.eng.reg, pFeaturePara, sizeof(OV2680_sensor.eng.reg)); - OV2680SensorRegNumber = OV2680_ENGINEER_END; - for (i=0;i= sizeof(OV2680_sensor.eng.reg) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV2680_sensor.eng.reg); - memcpy(pFeaturePara, &OV2680_sensor.eng.reg, sizeof(OV2680_sensor.eng.reg)); - } - break; - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->Version = NVRAM_CAMERA_SENSOR_FILE_VERSION; - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorId = OV2680MIPI_SENSOR_ID; - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorEngReg, &OV2680_sensor.eng.reg, sizeof(OV2680_sensor.eng.reg)); - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorCCTReg, &OV2680_sensor.eng.cct, sizeof(OV2680_sensor.eng.cct)); - *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pFeaturePara, &OV2680_sensor.cfg_data, sizeof(OV2680_sensor.cfg_data)); - *pFeatureParaLen = sizeof(OV2680_sensor.cfg_data); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - OV2680_camera_para_to_sensor(); - break; - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - OV2680_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - OV2680_get_sensor_group_count((kal_uint32 *)pFeaturePara); - *pFeatureParaLen = 4; - break; - case SENSOR_FEATURE_GET_GROUP_INFO: - OV2680_get_sensor_group_info((MSDK_SENSOR_GROUP_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - OV2680_get_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_SET_ITEM_INFO: - OV2680_set_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ENG_INFO: - memcpy(pFeaturePara, &OV2680_sensor.eng_info, sizeof(OV2680_sensor.eng_info)); - *pFeatureParaLen = sizeof(OV2680_sensor.eng_info); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV2680SetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV2680GetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - OV2680SetAutoFlickerMode((BOOL)*pFeatureData16,*(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_CALIBRATION_DATA: - OV2680SetCalData(pSetSensorCalData); - break; - case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: - OV2680SetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1)); - break; - case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: - OV2680GetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1))); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV2680SetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing - *pFeatureReturnPara32=OV2680_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - - /*SZ TCT xuejian.zhong add for CTS test */ - case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: - OV2680GetAFMaxNumFocusAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: - OV2680GetAEMaxNumMeteringAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - SENSORDB("SENSOR_FEATURE_GET_EXIF_INFO\n"); - SENSORDB("EXIF addr = 0x%x\n",*pFeatureData32); - - OV2680GetExifInfo(*pFeatureData32); - break; - /* xuejian.zhong add end */ - - - - default: - break; - } - return ERROR_NONE; -}/* OV2680FeatureControl() */ -SENSOR_FUNCTION_STRUCT SensorFuncOV2680= -{ - OV2680Open, - OV2680GetInfo, - OV2680GetResolution, - OV2680FeatureControl, - OV2680Control, - OV2680Close -}; - -UINT32 OV2680MIPISensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -//UINT32 OV2680SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ -/* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV2680; - - return ERROR_NONE; -}/* SensorInit() */ - - - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Sensor.h deleted file mode 100644 index 0accc4af70a..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov2680_raw/ov2680mipiraw_Sensor.h +++ /dev/null @@ -1,218 +0,0 @@ -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2005 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABI LITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ - -/***************************************************************************** - * - * Filename: - * --------- - * sensor.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * CMOS sensor header file - * - ****************************************************************************/ -#ifndef _OV2680_SENSOR_H -#define _OV2680_SENSOR_H - -#define OV2680_DEBUG -#define OV2680_DRIVER_TRACE -//#define OV2680_TEST_PATTEM -#ifdef OV2680_DEBUG -//#define SENSORDB printk -#else -//#define SENSORDB(x,...) -#endif - - -#define OV2680_FACTORY_START_ADDR 0 -#define OV2680_ENGINEER_START_ADDR 10 - -//#define MIPI_INTERFACE -// sensor ID 0x2680 - -typedef enum OV2680_group_enum -{ - OV2680_PRE_GAIN = 0, - OV2680_CMMCLK_CURRENT, - OV2680_FRAME_RATE_LIMITATION, - OV2680_REGISTER_EDITOR, - OV2680_GROUP_TOTAL_NUMS -} OV2680_FACTORY_GROUP_ENUM; - -typedef enum OV2680_register_index -{ - OV2680_SENSOR_BASEGAIN = OV2680_FACTORY_START_ADDR, - OV2680_PRE_GAIN_R_INDEX, - OV2680_PRE_GAIN_Gr_INDEX, - OV2680_PRE_GAIN_Gb_INDEX, - OV2680_PRE_GAIN_B_INDEX, - OV2680_FACTORY_END_ADDR -} OV2680_FACTORY_REGISTER_INDEX; - -typedef enum OV2680_engineer_index -{ - OV2680_CMMCLK_CURRENT_INDEX = OV2680_ENGINEER_START_ADDR, - OV2680_ENGINEER_END -} OV2680_FACTORY_ENGINEER_INDEX; - -typedef struct _sensor_data_struct -{ - SENSOR_REG_STRUCT reg[OV2680_ENGINEER_END]; - SENSOR_REG_STRUCT cct[OV2680_FACTORY_END_ADDR]; -} sensor_data_struct; - - -#define OV2680_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW_B - -#define OV2680_MIN_ANALOG_GAIN 1 /* 1x */ -#define OV2680_MAX_ANALOG_GAIN 32 /* 32x */ - - -/* FRAME RATE UNIT */ -#define OV2680_FPS(x) (10 * (x)) - -#define OV2680_MIPI_LANE_NUM 1 - -#define OV2680_PREVIEW_CLK 66000000 -#define OV2680_CAPTURE_CLK 66000000 -#define OV2680_VIDEO_CLK 66000000 -#define OV2680_ZSD_PRE_CLK 66000000 - -/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ -#define OV2680_FULL_PERIOD_PIXEL_NUMS (1700) // 0x06a4) // 15fps -#define OV2680_FULL_PERIOD_LINE_NUMS 1294 //0x050e - -#define OV2680_PV_PERIOD_PIXEL_NUMS OV2680_FULL_PERIOD_PIXEL_NUMS // -#define OV2680_PV_PERIOD_LINE_NUMS OV2680_FULL_PERIOD_LINE_NUMS // - -#define OV2680_VIDEO_PERIOD_PIXEL_NUMS OV2680_FULL_PERIOD_PIXEL_NUMS // -#define OV2680_VIDEO_PERIOD_LINE_NUMS OV2680_FULL_PERIOD_LINE_NUMS // - -#define OV2680_3D_FULL_PERIOD_PIXEL_NUMS OV2680_FULL_PERIOD_PIXEL_NUMS /* 15 fps */ -#define OV2680_3D_FULL_PERIOD_LINE_NUMS OV2680_FULL_PERIOD_LINE_NUMS -#define OV2680_3D_PV_PERIOD_PIXEL_NUMS OV2680_FULL_PERIOD_PIXEL_NUMS /* 30 fps */ -#define OV2680_3D_PV_PERIOD_LINE_NUMS OV2680_FULL_PERIOD_LINE_NUMS -#define OV2680_3D_VIDEO_PERIOD_PIXEL_NUMS OV2680_FULL_PERIOD_PIXEL_NUMS /* 30 fps */ -#define OV2680_3D_VIDEO_PERIOD_LINE_NUMS OV2680_FULL_PERIOD_LINE_NUMS -/* SENSOR START/END POSITION */ -#define OV2680_FULL_X_START 0//10 -#define OV2680_FULL_Y_START 0//10 -#define OV2680_IMAGE_SENSOR_FULL_WIDTH 1600 -#define OV2680_IMAGE_SENSOR_FULL_HEIGHT 1200 - -#define OV2680_PV_X_START 0 // 2 -#define OV2680_PV_Y_START 0 // 2 -#define OV2680_IMAGE_SENSOR_PV_WIDTH OV2680_IMAGE_SENSOR_FULL_WIDTH -#define OV2680_IMAGE_SENSOR_PV_HEIGHT OV2680_IMAGE_SENSOR_FULL_HEIGHT - -#define OV2680_VIDEO_X_START 0 //9 -#define OV2680_VIDEO_Y_START 0 //11 -#define OV2680_IMAGE_SENSOR_VIDEO_WIDTH OV2680_IMAGE_SENSOR_FULL_WIDTH -#define OV2680_IMAGE_SENSOR_VIDEO_HEIGHT OV2680_IMAGE_SENSOR_FULL_HEIGHT - -#define OV2680_3D_FULL_X_START 0 -#define OV2680_3D_FULL_Y_START 0 -#define OV2680_IMAGE_SENSOR_3D_FULL_WIDTH OV2680_IMAGE_SENSOR_FULL_WIDTH -#define OV2680_IMAGE_SENSOR_3D_FULL_HEIGHT OV2680_IMAGE_SENSOR_FULL_HEIGHT -#define OV2680_3D_PV_X_START 2 -#define OV2680_3D_PV_Y_START 2 -#define OV2680_IMAGE_SENSOR_3D_PV_WIDTH OV2680_IMAGE_SENSOR_FULL_WIDTH -#define OV2680_IMAGE_SENSOR_3D_PV_HEIGHT OV2680_IMAGE_SENSOR_FULL_HEIGHT -#define OV2680_3D_VIDEO_X_START 2 -#define OV2680_3D_VIDEO_Y_START 2 -#define OV2680_IMAGE_SENSOR_3D_VIDEO_WIDTH OV2680_IMAGE_SENSOR_FULL_WIDTH -#define OV2680_IMAGE_SENSOR_3D_VIDEO_HEIGHT OV2680_IMAGE_SENSOR_FULL_HEIGHT - - - -/* SENSOR READ/WRITE ID */ - -#define OV2680_SLAVE_WRITE_ID_1 (0x6c) -#define OV2680_SLAVE_WRITE_ID_2 (0x20) -/************OTP Feature*********************/ -//#define OV2680_USE_OTP -//#define OV2680_USE_WB_OTP - -#if defined(OV2680_USE_OTP) - -#endif -/************OTP Feature*********************/ - -/* SENSOR PRIVATE STRUCT */ -typedef struct OV2680_sensor_STRUCT -{ - MSDK_SENSOR_CONFIG_STRUCT cfg_data; - sensor_data_struct eng; /* engineer mode */ - MSDK_SENSOR_ENG_INFO_STRUCT eng_info; - kal_uint8 mirror; - kal_bool pv_mode; - kal_bool video_mode; - //kal_bool NightMode; - kal_bool is_zsd; - kal_bool is_zsd_cap; - kal_bool is_autofliker; - //kal_uint16 normal_fps; /* video normal mode max fps */ - //kal_uint16 night_fps; /* video night mode max fps */ - kal_uint16 FixedFps; - kal_uint16 shutter; - kal_uint16 gain; - kal_uint32 pv_pclk; - kal_uint32 cap_pclk; - kal_uint32 pclk; - kal_uint16 frame_height; - kal_uint16 line_length; - kal_uint16 write_id; - kal_uint16 read_id; - kal_uint16 dummy_pixels; - kal_uint16 dummy_lines; - kal_bool enter_preview; -} OV2680_sensor_struct; - -//export functions -UINT32 OV2680Open(void); -UINT32 OV2680Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV2680FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 OV2680GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV2680GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 OV2680Close(void); - -#define Sleep(ms) mdelay(ms) - -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/Makefile b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/Makefile deleted file mode 100644 index 04cae9c0350..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom - -# $(CONFIG_MTK_PLATFORM) -$(warning "xilog project is:$(ARCH_MTK_PROJECT)") -ifeq ($(ARCH_MTK_PROJECT), tb8127p4) - obj-y += ov5647_Sensor_p4.o -else - ifeq ($(ARCH_MTK_PROJECT), tb8127p4_25) - obj-y += ov5647_Sensor_p4_25.o - else - ifeq ($(ARCH_MTK_PROJECT), tb8127p1_25) - obj-y += ov5647_Sensor_p1_25.o - else - obj-y += ov5647_Sensor.o - endif - endif -endif - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_CameraCustomized.h deleted file mode 100644 index d0f8424ea74..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_CameraCustomized.h +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of camera customized parameters. - * - * - * Author: - * ------- - * PC Huang (MTK02204) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 12 16 2011 koli.lin - * [ALPS00030473] [Camera] - * [Camera] Add the OV5647 sensor driver to perforce. - * - * Feb 9 2010 mtk80461 - * [DUMA00154355] JPeg Orientation feature check in - * - * - * Oct 27 2009 mtk02204 - * [DUMA00015869] [Camera Driver] Modifiy camera related drivers for dual/backup sensor/lens drivers. - * - * - * Sep 24 2009 mtk02204 - * [DUMA00134387] [LTK][GW616][Camera]4040 Camera:Camera Quality Test failed. - * - * - * Jul 8 2009 mtk02204 - * [DUMA00008051] [Camera Driver] Add drivers for camera high ISO binning mode. - * - * - * Jul 8 2009 mtk02204 - * [DUMA00008051] [Camera Driver] Add drivers for camera high ISO binning mode. - * - * - * Jul 7 2009 mtk02204 - * [DUMA00008051] [Camera Driver] Add drivers for camera high ISO binning mode. - * - * - * Jun 6 2009 mtk02204 - * [DUMA00119628] MTK camera_recorded video only contain audio but no video with Jean effect - * - * - * Apr 10 2009 mtk02204 - * [DUMA00004178] [Camera] Check in for MTK camera integration - * - * - * Mar 13 2009 mtk02204 - * [DUMA00001084] First Check in of MT6516 multimedia drivers - * - * - * Mar 2 2009 mtk02204 - * [DUMA00001084] First Check in of MT6516 multimedia drivers - * - * - * Feb 6 2009 mtk02204 - * [DUMA00001084] First Check in of MT6516 multimedia drivers - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ - -#ifndef __CAMERA_CUSTOMIZED_H -#define __CAMERA_CUSTOMIZED_H - -// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 -#define MAIN_SENSOR_ORIENTATION_ANGLE 90 -#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist - - -// First, we think you hold the cell phone vertical. -// Second, we suppose the direction of upward is 0 -// Third, it is 90, 180, 270 in clockwise -// here we define the main sensor and sub sensor angles to deal with the jpeg orientation -#define MAIN_SENSOR_TO_PHONE_ANGLE 90 -#define SUB_SENSOR_TO_PHONE_ANGLE 0 - - -#define CAM_SIZE_QVGA_WIDTH 320 -#define CAM_SIZE_QVGA_HEIGHT 240 -#define CAM_SIZE_VGA_WIDTH 640 -#define CAM_SIZE_VGA_HEIGHT 480 -#define CAM_SIZE_05M_WIDTH 800 -#define CAM_SIZE_05M_HEIGHT 600 -#define CAM_SIZE_1M_WIDTH 1280 -#define CAM_SIZE_1M_HEIGHT 960 -#define CAM_SIZE_2M_WIDTH 1600 -#define CAM_SIZE_2M_HEIGHT 1200 -#define CAM_SIZE_3M_WIDTH 2048 -#define CAM_SIZE_3M_HEIGHT 1536 -#define CAM_SIZE_5M_WIDTH 2592 -#define CAM_SIZE_5M_HEIGHT 1944 - -// for main sensor -#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 -#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 -#define MAIN_NUM_OF_STILL_RESOLUTION 7 -#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} -#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} -#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ - {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ - {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ - {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ - {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ - {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ - {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} - -// if sub sensor does not exist, set all the parameters as 0 -#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 -#define SUB_NUM_OF_VIDEO_RESOLUTION 0 -#define SUB_NUM_OF_STILL_RESOLUTION 0 -#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} -#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} -#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} - -//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) -//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) -//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) - -#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Camera_Sensor_para.h deleted file mode 100644 index 348b9c103ff..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Camera_Sensor_para.h +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * camera_sensor_para.h - * - * Project: - * -------- - * DUMA - * - * Description: - * ------------ - * Header file of Sensor tuning parameters that should be generated by CCT - * - * - * Author: - * ------- - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 12 16 2011 koli.lin - * [ALPS00030473] [Camera] - * [Camera] Add the OV5647 sensor driver to perforce. - * - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -#ifndef _OV5647_CAMERA_SENSOR_PARA_H -#define _OV5647_CAMERA_SENSOR_PARA_H - -#define OV5647_CAMERA_SENSOR_REG_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF}, \ - {0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,0xFFFFFFFF},{0xFFFFFFFF,ISP_DRIVING_6MA}, \ -} - -#define OV5647_CAMERA_SENSOR_CCT_DEFAULT_VALUE \ -{ \ - {0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40},{0xFFFFFFFF,0x40}, \ -} - -#endif /* __CAMERA_SENSOR_PARA_H */ -/* SENSOR FULL SIZE */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor.c deleted file mode 100644 index b226bec1cb1..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor.c +++ /dev/null @@ -1,1505 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * HengJun (MTK70677) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Correct the write shutter function, max_shutter = frame_length - 4 + vts_differ. - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Enlarge frame length before write shutter to make sure it can take effect - * - * 02 19 2012 koli.lin - * [ALPS00237113] [Performance][Video recording]Recording preview the screen have flash - * [Camera] 1. Modify the AE converge speed in the video mode. - * 2. Modify the isp gain delay frame with sensor exposure time and gain synchronization. - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "ov5647_Sensor.h" -#include "ov5647_Camera_Sensor_para.h" -#include "ov5647_CameraCustomized.h" - -MSDK_SCENARIO_ID_ENUM CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; -static kal_bool OV5647AutoFlicKerMode = KAL_FALSE; - -#define OV5647_TEST_PATTERN_CHECKSUM (0x53ba2977) -#define OV5647_DRIVER_TRACE -#define OV5647_DEBUG - - -#ifdef OV5647_DEBUG -#define SENSORDB printk -#else -#define SENSORDB(x,...) -#endif -//#define ACDK - -static DEFINE_SPINLOCK(ov5647_drv_lock); - -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate); - - -static OV5647_sensor_struct OV5647_sensor = -{ -// .eng = -// { - // .reg = OV5647_CAMERA_SENSOR_REG_DEFAULT_VALUE, - // .cct = OV5647_CAMERA_SENSOR_CCT_DEFAULT_VALUE, - // }, - .eng_info = - { - .SensorId = 128, - .SensorType = CMOS_SENSOR, - .SensorOutputDataFormat = OV5647_COLOR_FORMAT, - }, - .shutter = 0x20, - .gain = 0x20, - .pclk = OV5647_PREVIEW_CLK, - .frame_height = OV5647_PV_PERIOD_LINE_NUMS, - .line_length = OV5647_PV_PERIOD_PIXEL_NUMS, -}; - - -kal_uint16 OV5647_write_cmos_sensor(kal_uint32 addr, kal_uint32 para) -{ - char puSendCmd[3] = {(char)(addr >> 8) , (char)(addr & 0xFF) ,(char)(para & 0xFF)}; - - iWriteRegI2C(puSendCmd , 3,OV5647_WRITE_ID); -return (kal_uint16)1; -} -kal_uint16 OV5647_read_cmos_sensor(kal_uint32 addr) -{ - kal_uint16 get_byte=0; - char puSendCmd[2] = {(char)(addr >> 8) , (char)(addr & 0xFF) }; - iReadRegI2C(puSendCmd , 2, (u8*)&get_byte,1,OV5647_WRITE_ID); - return get_byte; -} - - - -static void OV5647_Write_Shutter(kal_uint16 iShutter) -{ - kal_uint16 extra_line = 0; - - /* 0x3500,0x3501, 0x3502 will increase VBLANK to get exposure larger than frame exposure */ - /* AE doesn't update sensor gain at capture mode, thus extra exposure lines must be updated here. */ - if (!iShutter) iShutter = 1; /* avoid 0 */ - - if(OV5647AutoFlicKerMode){ - //Change frame 29.5fps ~ 29.8fps to do auto flick - if(OV5647_sensor.video_mode == KAL_FALSE){ - if(CurrentScenarioId== MSDK_SCENARIO_ID_CAMERA_ZSD){ - OV5647SetMaxFrameRate(148); - } - else{ - OV5647SetMaxFrameRate(296); - } - } - } - - if(iShutter > (OV5647_sensor.frame_height-4)) - extra_line = iShutter - (OV5647_sensor.frame_height - 4); - - // Update Extra shutter - OV5647_write_cmos_sensor(0x350c, (extra_line >> 8) & 0xFF); - OV5647_write_cmos_sensor(0x350d, (extra_line) & 0xFF); - - //Update Shutter - OV5647_write_cmos_sensor(0x3500, (iShutter >> 12) & 0xF); - OV5647_write_cmos_sensor(0x3501, (iShutter >> 4) & 0xFF); - OV5647_write_cmos_sensor(0x3502, (iShutter << 4) & 0xFF); - -} /* OV5647_Write_Shutter */ - -static void OV5647_Set_Dummy(const kal_uint16 iPixels, const kal_uint16 iLines) -{ - kal_uint16 line_length, frame_height; - - if (OV5647_sensor.pv_mode){ - line_length = OV5647_PV_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_PV_PERIOD_LINE_NUMS + iLines; - }else{ - line_length = OV5647_FULL_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_FULL_PERIOD_LINE_NUMS + iLines; - } - - if ((line_length >= 0x1FFF)||(frame_height >= 0xFFF)) - return ; - - /* Add dummy pixels: */ - /* 0x380c [0:4], 0x380d defines the PCLKs in one line of OV5647 */ - /* Add dummy lines:*/ - /* 0x380e [0:1], 0x380f defines total lines in one frame of OV5647 */ - OV5647_write_cmos_sensor(0x380c, line_length >> 8); - OV5647_write_cmos_sensor(0x380d, line_length & 0xFF); - OV5647_write_cmos_sensor(0x380e, frame_height >> 8); - OV5647_write_cmos_sensor(0x380f, frame_height & 0xFF); - -} /* OV5647_Set_Dummy */ - -/*Avoid Folat, frame rate =10 * u2FrameRate */ -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate) -{ - kal_int16 dummy_line; - kal_uint16 FrameHeight = OV5647_sensor.frame_height; - unsigned long flags; - - //dummy_line = OV5647_sensor.pclk / u2FrameRate / OV5647_PV_PERIOD_PIXEL_NUMS - OV5647_PV_PERIOD_LINE_NUMS; - printk("10*OV5647_sensor.pclk= %d, u2FrameRate = %d,OV5647_sensor.line_length = %d\n", (10 * OV5647_sensor.pclk), u2FrameRate, OV5647_sensor.line_length); - FrameHeight= (10 * OV5647_sensor.pclk) / u2FrameRate / OV5647_sensor.line_length; - //if(FrameHeight>OV5647_sensor.frame_height){ - spin_lock_irqsave(&ov5647_drv_lock,flags); - OV5647_sensor.frame_height = FrameHeight; - spin_unlock_irqrestore(&ov5647_drv_lock,flags); - dummy_line = FrameHeight - OV5647_PV_PERIOD_LINE_NUMS; - - if(dummy_line < 0) { - dummy_line = 0; - } - /* to fix VSYNC, to fix frame rate */ - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //} - printk("FrameHeight = %d, dummy_line = %d, OV5647_PV_PERIOD_LINE_NUMS = %d, OV5647_FULL_PERIOD_LINE_NUMS = %d\n",FrameHeight,dummy_line,OV5647_PV_PERIOD_LINE_NUMS,OV5647_FULL_PERIOD_LINE_NUMS); - return (UINT32)u2FrameRate; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetShutter -* -* DESCRIPTION -* This function set e-shutter of OV5647 to change exposure time. -* -* PARAMETERS -* iShutter : exposured lines -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void set_OV5647_shutter(kal_uint16 iShutter) -{ - spin_lock(&ov5647_drv_lock); - OV5647_sensor.shutter = iShutter; - spin_unlock(&ov5647_drv_lock); - OV5647_Write_Shutter(iShutter); -} /* Set_OV5647_Shutter */ - -#if 0 -static kal_uint16 OV5647Reg2Gain(const kal_uint8 iReg) -{ - kal_uint16 iGain ; - /* Range: 1x to 32x */ - iGain = (iReg >> 4) * BASEGAIN + (iReg & 0xF) * BASEGAIN / 16; - return iGain ; -} -#endif - kal_uint8 OV5647Gain2Reg(const kal_uint16 iGain) -{ - kal_uint16 iReg = 0x00; - iReg = ((iGain / BASEGAIN) << 4) + ((iGain % BASEGAIN) * 16 / BASEGAIN); - iReg = iReg & 0xFF; - return (kal_uint8)iReg; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetGain -* -* DESCRIPTION -* This function is to set global gain to sensor. -* -* PARAMETERS -* iGain : sensor global gain(base: 0x40) -* -* RETURNS -* the actually gain set to sensor. -* -* GLOBALS AFFECTED -* -*************************************************************************/ -kal_uint16 OV5647_SetGain(kal_uint16 iGain) -{ - kal_uint8 iReg; - //V5647_sensor.gain = iGain; - /* 0x350a[0:1], 0x350b AGC real gain */ - /* [0:3] = N meams N /16 X */ - /* [4:9] = M meams M X */ - /* Total gain = M + N /16 X */ - iReg = OV5647Gain2Reg(iGain); - if (iReg < 0x10) iReg = 0x10; - //OV5647_write_cmos_sensor(0x350a, iReg); - OV5647_write_cmos_sensor(0x350b, iReg); - return iGain; -} -/************************************************************************* -* FUNCTION -* OV5647_NightMode -* -* DESCRIPTION -* This function night mode of OV5647. -* -* PARAMETERS -* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void OV5647_night_mode(kal_bool enable) -{ -/*No Need to implement this function*/ -#if 0 - const kal_uint16 dummy_pixel = OV5647_sensor.line_length - OV5647_PV_PERIOD_PIXEL_NUMS; - const kal_uint16 pv_min_fps = enable ? OV5647_sensor.night_fps : OV5647_sensor.normal_fps; - kal_uint16 dummy_line = OV5647_sensor.frame_height - OV5647_PV_PERIOD_LINE_NUMS; - kal_uint16 max_exposure_lines; - - printk("[soso][OV5647_night_mode]enable=%d",enable); - if (!OV5647_sensor.video_mode) return; - max_exposure_lines = OV5647_sensor.pclk * OV5647_FPS(1) / (pv_min_fps * OV5647_sensor.line_length); - if (max_exposure_lines > OV5647_sensor.frame_height) /* fix max frame rate, AE table will fix min frame rate */ -// { -// dummy_line = max_exposure_lines - OV5647_PV_PERIOD_LINE_NUMS; -// OV5647_Set_Dummy(dummy_pixel, dummy_line); -// } -#endif -} /* OV5647_NightMode */ - - -/* write camera_para to sensor register */ -static void OV5647_camera_para_to_sensor(void) -{ - kal_uint32 i; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_camera_para_to_sensor\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ -} - -/* update camera_para from sensor register */ -static void OV5647_sensor_to_camera_para(void) -{ - kal_uint32 i,temp_data; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_sensor_to_camera_para\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } -} - -/* ------------------------ Engineer mode ------------------------ */ -inline static void OV5647_get_sensor_group_count(kal_int32 *sensor_count_ptr) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_count\n"); -#endif - *sensor_count_ptr = OV5647_GROUP_TOTAL_NUMS; -} - -inline static void OV5647_get_sensor_group_info(MSDK_SENSOR_GROUP_INFO_STRUCT *para) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - sprintf(para->GroupNamePtr, "CCT"); - para->ItemCount = 5; - break; - case OV5647_CMMCLK_CURRENT: - sprintf(para->GroupNamePtr, "CMMCLK Current"); - para->ItemCount = 1; - break; - case OV5647_FRAME_RATE_LIMITATION: - sprintf(para->GroupNamePtr, "Frame Rate Limitation"); - para->ItemCount = 2; - break; - case OV5647_REGISTER_EDITOR: - sprintf(para->GroupNamePtr, "Register Editor"); - para->ItemCount = 2; - break; - default: - ASSERT(0); - } -} - -inline static void OV5647_get_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - - const static kal_char *cct_item_name[] = {"SENSOR_BASEGAIN", "Pregain-R", "Pregain-Gr", "Pregain-Gb", "Pregain-B"}; - const static kal_char *editer_item_name[] = {"REG addr", "REG value"}; - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - break; - default: - ASSERT(0); - } - sprintf(para->ItemNamePtr, cct_item_name[para->ItemIdx - OV5647_SENSOR_BASEGAIN]); - para->ItemValue = OV5647_sensor.eng.cct[para->ItemIdx].Para * 1000 / BASEGAIN; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = OV5647_MIN_ANALOG_GAIN * 1000; - para->Max = OV5647_MAX_ANALOG_GAIN * 1000; - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Drv Cur[2,4,6,8]mA"); - switch (OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para) - { - case ISP_DRIVING_2MA: - para->ItemValue = 2; - break; - case ISP_DRIVING_4MA: - para->ItemValue = 4; - break; - case ISP_DRIVING_6MA: - para->ItemValue = 6; - break; - case ISP_DRIVING_8MA: - para->ItemValue = 8; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsReadOnly = KAL_FALSE; - para->IsNeedRestart = KAL_TRUE; - para->Min = 2; - para->Max = 8; - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Max Exposure Lines"); - para->ItemValue = 5998; - break; - case 1: - sprintf(para->ItemNamePtr, "Min Frame Rate"); - para->ItemValue = 5; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsNeedRestart = KAL_FALSE; - para->IsReadOnly = KAL_TRUE; - para->Min = para->Max = 0; - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - case 0: - case 1: - sprintf(para->ItemNamePtr, editer_item_name[para->ItemIdx]); - para->ItemValue = 0; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = 0; - para->Max = (para->ItemIdx == 0 ? 0xFFFF : 0xFF); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - -inline static kal_bool OV5647_set_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - kal_uint16 temp_para; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_set_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.cct[para->ItemIdx].Para = para->ItemValue * BASEGAIN / 1000; - spin_unlock(&ov5647_drv_lock); - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ - break; - default: - ASSERT(0); - } - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - switch (para->ItemValue) - { - case 2: - temp_para = ISP_DRIVING_2MA; - break; - case 3: - case 4: - temp_para = ISP_DRIVING_4MA; - break; - case 5: - case 6: - temp_para = ISP_DRIVING_6MA; - break; - default: - temp_para = ISP_DRIVING_8MA; - break; - } - //OV5647_set_isp_driving_current(temp_para); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para = temp_para; - spin_unlock(&ov5647_drv_lock); - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - static kal_uint32 fac_sensor_reg; - case 0: - if (para->ItemValue < 0 || para->ItemValue > 0xFFFF) return KAL_FALSE; - fac_sensor_reg = para->ItemValue; - break; - case 1: - if (para->ItemValue < 0 || para->ItemValue > 0xFF) return KAL_FALSE; - OV5647_write_cmos_sensor(fac_sensor_reg, para->ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} - -static void OV5647_Sensor_Init(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0103, 0x01); - mdelay(5); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - - OV5647_write_cmos_sensor(0x3011, 0x62); // Houston 20130917 increase sensor IO capability - OV5647_write_cmos_sensor(0x3013, 0x08);//0x04-->0x00-->0x08 Turn off internal LDO - OV5647_write_cmos_sensor(0x4708, 0x01/*0x00*/); // Houston 20130917 change pclk polarity - OV5647_write_cmos_sensor(0x5000, 0x06); - OV5647_write_cmos_sensor(0x5003, 0x08); - OV5647_write_cmos_sensor(0x5a00, 0x08); - OV5647_write_cmos_sensor(0x3000, 0xff); - OV5647_write_cmos_sensor(0x3001, 0xff); - OV5647_write_cmos_sensor(0x3002, 0xff); - OV5647_write_cmos_sensor(0x3a18, 0x01); - OV5647_write_cmos_sensor(0x3a19, 0xe0); - OV5647_write_cmos_sensor(0x3c01, 0x80); - OV5647_write_cmos_sensor(0x3b07, 0x0c); - OV5647_write_cmos_sensor(0x3630, 0x2e); - OV5647_write_cmos_sensor(0x3632, 0xe2); - OV5647_write_cmos_sensor(0x3633, 0x23); - OV5647_write_cmos_sensor(0x3634, 0x44); - OV5647_write_cmos_sensor(0x3620, 0x64); - OV5647_write_cmos_sensor(0x3621, 0xe0); - OV5647_write_cmos_sensor(0x3600, 0x37); - OV5647_write_cmos_sensor(0x3704, 0xa0); - OV5647_write_cmos_sensor(0x3703, 0x5a); - OV5647_write_cmos_sensor(0x3715, 0x78); - OV5647_write_cmos_sensor(0x3717, 0x01); - OV5647_write_cmos_sensor(0x3731, 0x02); - OV5647_write_cmos_sensor(0x370b, 0x60); - OV5647_write_cmos_sensor(0x3705, 0x1a); - OV5647_write_cmos_sensor(0x3f05, 0x02); - OV5647_write_cmos_sensor(0x3f06, 0x10); - OV5647_write_cmos_sensor(0x3f01, 0x0a); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0f, 0x58); - OV5647_write_cmos_sensor(0x3a10, 0x50); - OV5647_write_cmos_sensor(0x3a1b, 0x58); - OV5647_write_cmos_sensor(0x3a1e, 0x50); - OV5647_write_cmos_sensor(0x3a11, 0x60); - OV5647_write_cmos_sensor(0x3a1f, 0x28); - OV5647_write_cmos_sensor(0x4001, 0x02); - OV5647_write_cmos_sensor(0x4000, 0x09); - OV5647_write_cmos_sensor(0x4003, 0x08); - // manual AWB,manual AE,close Lenc,open WBC - OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x3501, 0x3c); - OV5647_write_cmos_sensor(0x3502, 0x00); - OV5647_write_cmos_sensor(0x350a, 0x00); - OV5647_write_cmos_sensor(0x350b, 0x7f); - OV5647_write_cmos_sensor(0x5001, 0x01); //;manual AWB - OV5647_write_cmos_sensor(0x5180, 0x08); - OV5647_write_cmos_sensor(0x5186, 0x04); - OV5647_write_cmos_sensor(0x5187, 0x00); - OV5647_write_cmos_sensor(0x5188, 0x04); - OV5647_write_cmos_sensor(0x5189, 0x00); - OV5647_write_cmos_sensor(0x518a, 0x04); - OV5647_write_cmos_sensor(0x518b, 0x00); - OV5647_write_cmos_sensor(0x5000, 0x06); //;No lenc,WBC on - - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#ifdef OV5647_TEST_PATTEM - OV5647_write_cmos_sensor(0x503D, 0x92); -#endif - - OV5647_write_cmos_sensor(0x0100, 0x01); - -} /* OV5647_Sensor_Init */ /* OV5647_Sensor_Init */ - - -static void OV5647_Sensor_1M(void) -{ - //------------------------------------------------------------------------------- - // PLL MY_OUTPUT clock(fclk) - // fclk = (0x40 - 0x300E[5:0]) x N x Bit8Div x MCLK / M, where - // N = 1, 1.5, 2, 3 for 0x300F[7:6] = 0~3, respectively - // M = 1, 1.5, 2, 3 for 0x300F[1:0] = 0~3, respectively - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // Sys Clk = fclk / Bit8Div / SenDiv - // Sensor MY_OUTPUT clock(DVP PCLK) - // DVP PCLK = ISP CLK / DVPDiv, where - // ISP CLK = fclk / Bit8Div / SenDiv / CLKDiv / 2, where - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // SenDiv = 1, 2 for 0x3010[4] = 0 or 1 repectively - // CLKDiv = (0x3011[5:0] + 1) - // DVPDiv = 0x304C[3:0] * (2 ^ 0x304C[4]), if 0x304C[3:0] = 0, use 16 instead - // - // Base shutter calculation - // 60Hz: (1/120) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - // 50Hz: (1/100) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - //------------------------------------------------------------------------------- - //26M MCLK 48.1M PCLK - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x4005, 0x18); // update BLC, Jason - //OV5647_write_cmos_sensor(0x4005, 0x1A); // update BLC, mtk70677 - OV5647_write_cmos_sensor(0x4005, 0x18);//mtk70677,Upate BLC when gain changed - OV5647_write_cmos_sensor(0x4051, 0x8F); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x18"); -#endif - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - //OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - //OV5647_write_cmos_sensor(0x3036, 0x46); /* PLL muitiplier */ - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor(0x370c, 0x03); /* Reserved */ - OV5647_write_cmos_sensor(0x3612, 0x09); /* Reserved */ - OV5647_write_cmos_sensor(0x3618, 0x00); /* Reserved */ - OV5647_write_cmos_sensor(0x380c, 0x07); /* TIMING HTS 0x065e */ - OV5647_write_cmos_sensor(0x380d, 0x68); /* TIMING HTS 1630 */ - OV5647_write_cmos_sensor(0x380e, 0x03); /* TIMING VTS 0x03d8 */ - OV5647_write_cmos_sensor(0x380f, 0xd8); /* TIMING VTS 984 */ - OV5647_write_cmos_sensor(0x3814, 0x31); /* TIMING X INC */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* TIMING Y INC */ - OV5647_write_cmos_sensor(0x3708, 0x22); /* Reserved */ - OV5647_write_cmos_sensor(0x3709, 0x52); /* Reserved */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* ??????? */ - OV5647_write_cmos_sensor(0x3808, 0x05); /* TIMING X OUTPUT SIZE 0x0500 */ - OV5647_write_cmos_sensor(0x3809, 0x10); /* TIMING X OUTPUT SIZE 1280 */ - OV5647_write_cmos_sensor(0x380a, 0x03); /* TIMING Y OUTPUT SIZE 0x03c0 */ - OV5647_write_cmos_sensor(0x380b, 0xcc); /* TIMING Y OUTPUT SIZE 960 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x08); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x02); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x37); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa1); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* B60 MAX */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* B50 MAX */ - OV5647_write_cmos_sensor(0x4004, 0x02); /* BLC CTRL04 */ - //OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x3a08, 0x01); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0a, 0x00); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* ??????? */ - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - -#ifdef CAPTURE_15FPS -#if defined(__OV5647_48M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_52M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3D); /* 52.867M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_54M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3F); /* 54.67M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#elif defined(__OV5647_56M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x41); /* 56.333M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#endif -#endif - OV5647_write_cmos_sensor(0x0100, 0x01); -} - -#if 1 // Houston 20131003 decrease capture frame rate due to pclk can't reach to 80MHz -static void OV5647_Sensor_5M(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - OV5647_write_cmos_sensor(0x3821, 0x06); - OV5647_write_cmos_sensor(0x3820, 0x00); - OV5647_write_cmos_sensor(0x370c, 0x00); - OV5647_write_cmos_sensor(0x3612, 0x0b); - OV5647_write_cmos_sensor(0x3618, 0x04); - //OV5647_write_cmos_sensor(0x380c, 0x0a); /* TIMING HTS 0x0a8c */ - //OV5647_write_cmos_sensor(0x380d, 0x8c); /* TIMING HTS 2700 */ - OV5647_write_cmos_sensor(0x380c, 0x0b); /* TIMING HTS 0x0bfe */ - OV5647_write_cmos_sensor(0x380d, 0xef); /* TIMING HTS 3055 */ - OV5647_write_cmos_sensor(0x380e, 0x07); /* TIMING VTS 0x07b0 */ - OV5647_write_cmos_sensor(0x380f, 0xb0); /* TIMING VTS 1968 */ - OV5647_write_cmos_sensor(0x3814, 0x11); - //OV5647_write_cmos_sensor(0x3815, 0x11); //0909 for test - OV5647_write_cmos_sensor(0x3708, 0x24); - OV5647_write_cmos_sensor(0x3709, 0x12); - OV5647_write_cmos_sensor(0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x20); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x98); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x0c); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x04); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x33); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa3); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor(0x3a09, 0x27); - OV5647_write_cmos_sensor(0x3a0b, 0xf6); - OV5647_write_cmos_sensor(0x3a0d, 0x08); - OV5647_write_cmos_sensor(0x3a0e, 0x06); - OV5647_write_cmos_sensor(0x4004, 0x04); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a09, 0x94); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0b, 0x7b); - OV5647_write_cmos_sensor(0x3a0d, 0x10); - OV5647_write_cmos_sensor(0x3a0e, 0x0d); - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x0100, 0x01); -} -#endif -#ifdef CAPTURE_15FPS - -static void OV5647_Sensor_5M_15fps(void) -{ - //kal_uint8 iTemp1 = OV5647_read_cmos_sensor(0x3820) & 0x06; - //kal_uint8 iTemp2 = OV5647_read_cmos_sensor(0x3821) & 0x06; - OV5647_write_cmos_sensor( 0x0100, 0x00); //15fps - OV5647_write_cmos_sensor(0x4005, 0x1a); // update BLC, Jason - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x1a"); -#endif - OV5647_write_cmos_sensor( 0x303c, 0x11); - //OV5647_write_cmos_sensor( 0x3821, iTemp2); - //OV5647_write_cmos_sensor( 0x3820, iTemp1); - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor( 0x370c, 0x00); - OV5647_write_cmos_sensor( 0x3612, 0x0b); - OV5647_write_cmos_sensor( 0x3618, 0x04); - OV5647_write_cmos_sensor( 0x380c, 0x0a); - OV5647_write_cmos_sensor( 0x380d, 0x8c); //2700 - OV5647_write_cmos_sensor( 0x380e, 0x07); - OV5647_write_cmos_sensor( 0x380f, 0xb0);//1968 - OV5647_write_cmos_sensor( 0x3814, 0x11); - OV5647_write_cmos_sensor( 0x3815, 0x11); - OV5647_write_cmos_sensor( 0x3708, 0x24); - OV5647_write_cmos_sensor( 0x3709, 0x12); - OV5647_write_cmos_sensor( 0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x20); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x98); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x0c); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x04); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x33); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa3); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x4004, 0x04); - OV5647_write_cmos_sensor( 0x3034, 0x1a); - OV5647_write_cmos_sensor( 0x3035, 0x11); - OV5647_write_cmos_sensor( 0x3036, 0x3e); - OV5647_write_cmos_sensor( 0x3037, 0x02); - OV5647_write_cmos_sensor( 0x303c, 0x11); - OV5647_write_cmos_sensor( 0x3a08, 0x01); - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0a, 0x00); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x3503, 0x07);//soso - OV5647_write_cmos_sensor( 0x0100, 0x01); -} -#endif - -/*****************************************************************************/ -/* Windows Mobile Sensor Interface */ -/*****************************************************************************/ -/************************************************************************* -* FUNCTION -* OV5647Open -* -* DESCRIPTION -* This function initialize the registers of CMOS sensor -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -UINT32 OV5647Open(void) -{ - kal_uint16 sensor_id=0; - - // check if sensor ID correct - sensor_id=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Open, sensor_id:%x \n",sensor_id); -#endif - if (sensor_id != OV5647_SENSOR_ID) - return ERROR_SENSOR_CONNECT_FAIL; - - /* initail sequence write in */ - OV5647_Sensor_Init(); - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - OV5647_sensor.Prv_line_length = OV5647_PV_PERIOD_PIXEL_NUMS;//For ZSD - spin_unlock(&ov5647_drv_lock); - return ERROR_NONE; -} /* OV5647Open */ - -/************************************************************************* -* FUNCTION -* OV5647GetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* *sensorID : return the sensor ID -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647GetSensorID(UINT32 *sensorID) -{ - // check if sensor ID correct - *sensorID=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647GetSensorID, sensor_id:%x \n",*sensorID); -#endif - if (*sensorID != OV5647_SENSOR_ID) { - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - - return ERROR_NONE; -} - -/************************************************************************* -* FUNCTION -* OV5647Close -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Close(void) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Close\n"); -#endif - //CISModulePowerOn(FALSE); -// DRV_I2CClose(OV5647hDrvI2C); - return ERROR_NONE; -} /* OV5647Close */ - -/************************************************************************* -* FUNCTION -* OV5647Preview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_line; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s]\n",__FUNCTION__); -#endif - - OV5647_Sensor_1M(); - - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_TRUE; - - //OV5647_set_mirror(sensor_config_data->SensorImageMirror); - switch (sensor_config_data->SensorOperationMode) - { - case MSDK_SENSOR_OPERATION_MODE_VIDEO: - OV5647_sensor.video_mode = KAL_TRUE; - dummy_line = 0; - default: /* ISP_PREVIEW_MODE */ - OV5647_sensor.video_mode = KAL_FALSE; - dummy_line = 0; - } - - OV5647_sensor.line_length = OV5647_PV_PERIOD_PIXEL_NUMS; - OV5647_sensor.Prv_line_length=OV5647_sensor.line_length;//For Capture Funtion to calculate capture shutter - OV5647_sensor.frame_height = OV5647_PV_PERIOD_LINE_NUMS+dummy_line; - -#ifdef CAPTURE_15FPS - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; -#endif - spin_unlock(&ov5647_drv_lock); - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //OV5647_Write_Shutter(OV5647_sensor.shutter); - - //printk("[soso][OV5647Preview]shutter=%x,shutter=%d\n",OV5647_sensor.shutter,OV5647_sensor.shutter); - - return ERROR_NONE; -} /* OV5647Preview */ - -/************************************************************************* -* FUNCTION -* OV5647Capture -* -* DESCRIPTION -* This function setup the CMOS sensor in capture MY_OUTPUT mode -* -* PARAMETERS -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - const kal_uint32 pv_line_length = (kal_uint32)OV5647_sensor.Prv_line_length; - kal_uint32 shutter = (kal_uint32)OV5647_sensor.shutter; - kal_uint16 cap_fps; - kal_uint16 dummy_pixel; - - spin_lock(&ov5647_drv_lock); - OV5647_sensor.video_mode = KAL_FALSE; - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - //if(OV5647_sensor.pv_mode == KAL_TRUE) - { - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); -#ifdef CAPTURE_15FPS - OV5647_Sensor_5M_15fps(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = 80600000; - spin_unlock(&ov5647_drv_lock); - cap_fps = OV5647_FPS(15); - - - OV5647_Set_Dummy(0, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - //806 is cpature PCLK 481 is preivew PCLK - //shutter = shutter * pv_line_length * 806/OV5647_sensor.line_length/481; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806 ))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000 - 3; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 563333))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 481000))); -#if defined(__OV5647_48M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000; -#elif defined(__OV5647_52M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 528667)))); -#elif defined(__OV5647_54M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 546))))/1000; -#elif defined(__OV5647_56M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 563))))/1000; -#endif - - -#else - OV5647_Sensor_5M(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; - spin_unlock(&ov5647_drv_lock); - - cap_fps = OV5647_FPS(8); - dummy_pixel = OV5647_sensor.pclk * OV5647_FPS(1) / (OV5647_FULL_PERIOD_LINE_NUMS * cap_fps); - dummy_pixel = dummy_pixel < OV5647_FULL_PERIOD_PIXEL_NUMS ? 0 : dummy_pixel - OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_Set_Dummy(dummy_pixel, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS+dummy_pixel; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - - /* shutter translation */ - shutter = shutter * pv_line_length / OV5647_sensor.line_length; -#endif -printk("[soso][capture]shutter=%x",shutter); - OV5647_Write_Shutter((kal_uint16)shutter); - - //mdelay(1000); - } - return ERROR_NONE; -} /* OV5647_Capture() */ - -UINT32 OV5647GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - pSensorResolution->SensorFullWidth=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - pSensorResolution->SensorPreviewWidth=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorResolution->SensorPreviewHeight=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorResolution->SensorVideoWidth=OV5647_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight=OV5647_IMAGE_SENSOR_VIDEO_HEIGHT; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s] ===> Full(%d x %d) , Preview (%d x %d) , Video (%d x %d)\n",__FUNCTION__, - pSensorResolution->SensorFullWidth, pSensorResolution->SensorFullHeight, - pSensorResolution->SensorPreviewWidth, pSensorResolution->SensorPreviewHeight, - pSensorResolution->SensorVideoWidth, pSensorResolution->SensorVideoHeight); -#endif - return ERROR_NONE; -} /* OV5647GetResolution() */ - -UINT32 OV5647GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - -#ifdef OV5647_DRIVER_TRACE - char scenario_str[10][20]={"PREVIEW","CAPTURE_JPEG","VIDEO_PREVIEW","HIGH SPEED VIDEO","ZSD","3D PREVIEW","3D CAPTURE", "3D VIDEO", "TV OUT", "MAX" }; - SENSORDB("[%s] ===> ScenarioId(%d):%s , SensorType: %d\n",__FUNCTION__ , ScenarioId , scenario_str[ScenarioId] , pSensorInfo->SensroInterfaceType); -#endif - -#if 0 - pSensorInfo->SensorPreviewResolutionX=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV5647_IMAGE_SENSOR_FULL_HEIGHT; -#endif - - pSensorInfo->SensorCameraPreviewFrameRate=30; - pSensorInfo->SensorVideoFrameRate=30; - pSensorInfo->SensorStillCaptureFrameRate=10; - pSensorInfo->SensorWebCamCaptureFrameRate=15; - pSensorInfo->SensorResetActiveHigh=TRUE; //low active - pSensorInfo->SensorResetDelayCount=5; - pSensorInfo->SensorOutputDataFormat=OV5647_COLOR_FORMAT; - pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - // Houston 20130916 add SensorInterfaceType +++ - pSensorInfo->SensorInterruptDelayLines = 3; - pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_PARALLEL; - // Houston 20130916 add SensorInterfaceType --- - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 2;//1; // Houston 20130917 increase pv delay frame to fix pclk phase shift - pSensorInfo->VideoDelayFrame = 1; - - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_2MA;//ISP_DRIVING_4MA;//ISP_DRIVING_6MA;//ISP_DRIVING_8MA; // Houston 20130917 increase pv delay frame to fix pclk phase shift - pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ - pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ - pSensorInfo->AEISPGainDelayFrame = 2; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - pSensorInfo->SensorClockFreq= 26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_FULL_X_START; - pSensorInfo->SensorGrabStartY = OV5647_FULL_Y_START; - break; - default: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - break; - } -#if 0 - OV5647PixelClockDivider=pSensorInfo->SensorPixelClockCount; - memcpy(pSensorConfigData, &OV5647SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); -#endif - return ERROR_NONE; -} /* OV5647GetInfo() */ - - -UINT32 OV5647Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - -#ifdef OV5647_DRIVER_TRACE - char scenario_str[10][20]={"PREVIEW","CAPTURE_JPEG","VIDEO_PREVIEW","HIGH SPEED VIDEO","ZSD","3D PREVIEW","3D CAPTURE", "3D VIDEO", "TV OUT", "MAX" }; - SENSORDB("[%s] ===> ScenarioId(%d):%s\n",__FUNCTION__ , ScenarioId , scenario_str[ScenarioId]); -#endif - - CurrentScenarioId = ScenarioId; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - OV5647Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV5647Capture(pImageWindow, pSensorConfigData); - break; - default: -#ifdef OV5647_DRIVER_TRACE - SENSORDB("\nOV5647Control <== return ERROR_INVALID_SCENARIO_ID (0x%x) \n", ERROR_INVALID_SCENARIO_ID); -#endif - return ERROR_INVALID_SCENARIO_ID; - } -#ifdef OV5647_DRIVER_TRACE - SENSORDB("\nOV5647Control <== return TRUE \n"); -#endif - return TRUE; -} /* OV5647Control() */ - - - -UINT32 OV5647SetVideoMode(UINT16 u2FrameRate) -{ - //printk("[soso][OV5647SetMaxFrameRate]u2FrameRate=%d",u2FrameRate); - spin_lock(&ov5647_drv_lock); - - if(u2FrameRate == 30){ - OV5647_sensor.NightMode = KAL_FALSE; - }else if(u2FrameRate == 15){ - OV5647_sensor.NightMode = KAL_TRUE; - }else if(u2FrameRate == 0){ - //For Dynamic frame rate,Nothing to do - OV5647_sensor.video_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - return TRUE; - }else{ - // TODO: - //return TRUE; - } - - OV5647_sensor.video_mode = KAL_TRUE; - OV5647_sensor.FixedFps = u2FrameRate; - spin_unlock(&ov5647_drv_lock); - - if((u2FrameRate == 30)&&(OV5647AutoFlicKerMode==KAL_TRUE)) - u2FrameRate = 296; - else - u2FrameRate = 10 * u2FrameRate; - - OV5647SetMaxFrameRate(u2FrameRate); - OV5647_Write_Shutter(OV5647_sensor.shutter);//From Meimei Video issue - return TRUE; -} - -UINT32 OV5647SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - - if(bEnable){ - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_TRUE; - spin_unlock(&ov5647_drv_lock); - /*Change frame rate 29.5fps to 29.8fps to do Auto flick*/ - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(296); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(148); - }else{//Cancel Auto flick - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(300); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(150); - } - return TRUE; -} - -UINT32 OV5647SetTestPatternMode(kal_bool bEnable) -{ - SENSORDB("[OV5647SetTestPatternMode] Test pattern enable:%d\n", bEnable); - if(bEnable) - { - OV5647_write_cmos_sensor(0x503D,0x80); - } - else - { - OV5647_write_cmos_sensor(0x503D,0x00); - } - - return ERROR_NONE; -} - -UINT32 OV5647FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; -// UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; -// UINT32 OV5647SensorRegNumber; -// UINT32 i; - //PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - //MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s] ===> FeatureId: %d\n", __FUNCTION__, FeatureId); -#endif - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=OV5647_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: /* 3 */ - *pFeatureReturnPara16++=OV5647_sensor.line_length; - *pFeatureReturnPara16=OV5647_sensor.frame_height; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: /* 3 */ - *pFeatureReturnPara32 = OV5647_sensor.pclk; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_ESHUTTER: /* 4 */ - set_OV5647_shutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - OV5647_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: /* 6 */ - OV5647_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - break; - case SENSOR_FEATURE_SET_REGISTER: - OV5647_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV5647_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - memcpy(&OV5647_sensor.eng.cct, pFeaturePara, sizeof(OV5647_sensor.eng.cct)); - break; - break; - case SENSOR_FEATURE_GET_CCT_REGISTER: /* 12 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.cct) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.cct); - memcpy(pFeaturePara, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - } - break; - case SENSOR_FEATURE_SET_ENG_REGISTER: - memcpy(&OV5647_sensor.eng.reg, pFeaturePara, sizeof(OV5647_sensor.eng.reg)); - break; - case SENSOR_FEATURE_GET_ENG_REGISTER: /* 14 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.reg) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.reg); - memcpy(pFeaturePara, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - } - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->Version = NVRAM_CAMERA_SENSOR_FILE_VERSION; - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorId = OV5647_SENSOR_ID; - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorEngReg, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorCCTReg, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pFeaturePara, &OV5647_sensor.cfg_data, sizeof(OV5647_sensor.cfg_data)); - *pFeatureParaLen = sizeof(OV5647_sensor.cfg_data); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - OV5647_camera_para_to_sensor(); - break; - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - OV5647_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - OV5647_get_sensor_group_count((kal_uint32 *)pFeaturePara); - *pFeatureParaLen = 4; - break; - OV5647_get_sensor_group_info((MSDK_SENSOR_GROUP_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - OV5647_get_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_SET_ITEM_INFO: - OV5647_set_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ENG_INFO: - memcpy(pFeaturePara, &OV5647_sensor.eng_info, sizeof(OV5647_sensor.eng_info)); - *pFeatureParaLen = sizeof(OV5647_sensor.eng_info); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV5647SetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV5647GetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - OV5647SetAutoFlickerMode((BOOL)*pFeatureData16,*(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV5647SetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: - *pFeatureReturnPara32= OV5647_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - default: - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s] ===> FeatureId: %d , Not Implement !!! \n", __FUNCTION__, FeatureId); -#endif - break; - } - return ERROR_NONE; -} /* OV5647FeatureControl() */ -SENSOR_FUNCTION_STRUCT SensorFuncOV5647= -{ - OV5647Open, - OV5647GetInfo, - OV5647GetResolution, - OV5647FeatureControl, - OV5647Control, - OV5647Close -}; - -UINT32 OV5647SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - /* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV5647; - - return ERROR_NONE; -} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor.h deleted file mode 100644 index 29807de9e3a..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor.h +++ /dev/null @@ -1,189 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * HengJun (MTK70677) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ - -#ifndef _OV5647_SENSOR_H -#define _OV5647_SENSOR_H - -//#define OV5647_DEBUG -//#define OV5647_DRIVER_TRACE -//#define OV5647_TEST_PATTEM -#ifdef OV5647_DEBUG -//#define SENSORDB printk -#else -//#define SENSORDB(x,...) -#endif - -#define OV5647_FACTORY_START_ADDR 0 -#define OV5647_ENGINEER_START_ADDR 10 - -typedef enum OV5647_group_enum -{ - OV5647_PRE_GAIN = 0, - OV5647_CMMCLK_CURRENT, - OV5647_FRAME_RATE_LIMITATION, - OV5647_REGISTER_EDITOR, - OV5647_GROUP_TOTAL_NUMS -} OV5647_FACTORY_GROUP_ENUM; - -typedef enum OV5647_register_index -{ - OV5647_SENSOR_BASEGAIN = OV5647_FACTORY_START_ADDR, - OV5647_PRE_GAIN_R_INDEX, - OV5647_PRE_GAIN_Gr_INDEX, - OV5647_PRE_GAIN_Gb_INDEX, - OV5647_PRE_GAIN_B_INDEX, - OV5647_FACTORY_END_ADDR -} OV5647_FACTORY_REGISTER_INDEX; - -typedef enum OV5647_engineer_index -{ - OV5647_CMMCLK_CURRENT_INDEX = OV5647_ENGINEER_START_ADDR, - OV5647_ENGINEER_END -} OV5647_FACTORY_ENGINEER_INDEX; - -typedef struct _sensor_data_struct -{ - SENSOR_REG_STRUCT reg[OV5647_ENGINEER_END]; - SENSOR_REG_STRUCT cct[OV5647_FACTORY_END_ADDR]; -} sensor_data_struct; - -/* SENSOR PREVIEW/CAPTURE VT CLOCK */ -#define __OV5647_54M__ -//#define __OV5647_48M__ - - -#if defined(__OV5647_48M__)/*Preview PClk=48.1MHz*/ - #define OV5647_PREVIEW_CLK 48100000 - #define OV5647_CAPTURE_CLK 48100000 -#elif defined(__OV5647_52M__)/*Preview PClk=52.866666MHz*/ - #define OV5647_PREVIEW_CLK 52866667 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_54M__)/*Preview PClk=54.6MHz*/ - #define OV5647_PREVIEW_CLK 54600000 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_56M__)/*Preview PClk=56.333MHz*/ - #define OV5647_PREVIEW_CLK 56333333 - #define OV5647_CAPTURE_CLK 80600000 -#else - #error "This Sensor PCLK Setting is not configuration" -#endif - -#define OV5647_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW_B //SENSOR_OUTPUT_FORMAT_RAW_Gb //SENSOR_OUTPUT_FORMAT_RAW_R - -#define OV5647_MIN_ANALOG_GAIN 1 /* 1x */ -#define OV5647_MAX_ANALOG_GAIN 32 /* 32x */ - - -/* FRAME RATE UNIT */ -#define OV5647_FPS(x) (10 * (x)) -#define CAPTURE_15FPS - -/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ -//#define OV5647_FULL_PERIOD_PIXEL_NUMS 2700 /* 9 fps */ -#ifdef CAPTURE_15FPS -#define OV5647_FULL_PERIOD_PIXEL_NUMS 2700 /* 15 fps */ -#define OV5647_FULL_PERIOD_LINE_NUMS 1968 -#else -#define OV5647_FULL_PERIOD_PIXEL_NUMS 3055 /* 8 fps */ -#define OV5647_FULL_PERIOD_LINE_NUMS 1968 -#endif - - -#if defined(__OV5647_48M__) - #define OV5647_PV_PERIOD_PIXEL_NUMS 1630 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_52M__)// TODO: - #define OV5647_PV_PERIOD_PIXEL_NUMS 1790 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_54M__)// TODO: - #define OV5647_PV_PERIOD_PIXEL_NUMS 1850 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_56M__) - #define OV5647_PV_PERIOD_PIXEL_NUMS 1896 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#endif - - -/* SENSOR START/END POSITION */ -#define OV5647_FULL_X_START 4 //(1+16+6) -#define OV5647_FULL_Y_START 4 //(1+12+4) -#define OV5647_IMAGE_SENSOR_FULL_WIDTH (2560 - 32) //(2592 - 16) /* 2560 */ -#define OV5647_IMAGE_SENSOR_FULL_HEIGHT (1920 - 24) //(1944 - 12) /* 1920 */ -#define OV5647_PV_X_START 2 -#define OV5647_PV_Y_START 2 -#define OV5647_IMAGE_SENSOR_PV_WIDTH (1280 - 16) /* 1264 */ -#define OV5647_IMAGE_SENSOR_PV_HEIGHT (960 - 12) /* 948 */ -#define OV5647_IMAGE_SENSOR_VIDEO_WIDTH (1280 - 16) /* 1264 */ -#define OV5647_IMAGE_SENSOR_VIDEO_HEIGHT (960 - 12) /* 948 */ - -/* SENSOR READ/WRITE ID */ -#define OV5647_WRITE_ID (0x6c) -#define OV5647_READ_ID (0x6d) - -/* SENSOR ID */ -//#define OV5647_SENSOR_ID (0x5647) - -/* SENSOR PRIVATE STRUCT */ -typedef struct OV5647_sensor_STRUCT -{ - MSDK_SENSOR_CONFIG_STRUCT cfg_data; - sensor_data_struct eng; /* engineer mode */ - MSDK_SENSOR_ENG_INFO_STRUCT eng_info; - kal_uint8 mirror; - kal_bool pv_mode; - kal_bool video_mode; - kal_bool NightMode; - kal_uint16 normal_fps; /* video normal mode max fps */ - kal_uint16 night_fps; /* video night mode max fps */ - kal_uint16 FixedFps; - kal_uint16 shutter; - kal_uint16 gain; - kal_uint32 pclk; - kal_uint16 frame_height; - kal_uint16 frame_height_BackUp; - kal_uint16 line_length; - kal_uint16 Prv_line_length; -} OV5647_sensor_struct; - -//export functions -UINT32 OV5647Open(void); -UINT32 OV5647Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV5647FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 OV5647GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV5647GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 OV5647Close(void); - -UINT32 OV5647SetTestPatternMode(kal_bool bEnable); - -#define Sleep(ms) mdelay(ms) - -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p1_25.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p1_25.c deleted file mode 100644 index b611073ab42..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p1_25.c +++ /dev/null @@ -1,1451 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * HengJun (MTK70677) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Correct the write shutter function, max_shutter = frame_length - 4 + vts_differ. - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Enlarge frame length before write shutter to make sure it can take effect - * - * 02 19 2012 koli.lin - * [ALPS00237113] [Performance][Video recording]Recording preview the screen have flash - * [Camera] 1. Modify the AE converge speed in the video mode. - * 2. Modify the isp gain delay frame with sensor exposure time and gain synchronization. - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -#warning "compile ov5647_Sensor_p1_25.c" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "ov5647_Sensor_p1_25.h" -#include "ov5647_Camera_Sensor_para.h" -#include "ov5647_CameraCustomized.h" - -MSDK_SCENARIO_ID_ENUM CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; -static kal_bool OV5647AutoFlicKerMode = KAL_FALSE; - -#define OV5647_TEST_PATTERN_CHECKSUM (0x53ba2977) -#define OV5647_DRIVER_TRACE -#define OV5647_DEBUG - -#ifdef OV5647_DEBUG -#define SENSORDB printk -#else -#define SENSORDB(x,...) -#endif -//#define ACDK - -static DEFINE_SPINLOCK(ov5647_drv_lock); - -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate); - - -static OV5647_sensor_struct OV5647_sensor = -{ -// .eng = -// { - // .reg = OV5647_CAMERA_SENSOR_REG_DEFAULT_VALUE, - // .cct = OV5647_CAMERA_SENSOR_CCT_DEFAULT_VALUE, - // }, - .eng_info = - { - .SensorId = 128, - .SensorType = CMOS_SENSOR, - .SensorOutputDataFormat = OV5647_COLOR_FORMAT, - }, - .shutter = 0x20, - .gain = 0x20, - .pclk = OV5647_PREVIEW_CLK, - .frame_height = OV5647_PV_PERIOD_LINE_NUMS, - .line_length = OV5647_PV_PERIOD_PIXEL_NUMS, -}; - - -kal_uint16 OV5647_write_cmos_sensor(kal_uint32 addr, kal_uint32 para) -{ - char puSendCmd[3] = {(char)(addr >> 8) , (char)(addr & 0xFF) ,(char)(para & 0xFF)}; - - iWriteRegI2C(puSendCmd , 3,OV5647_WRITE_ID); -return (kal_uint16)1; -} -kal_uint16 OV5647_read_cmos_sensor(kal_uint32 addr) -{ - kal_uint16 get_byte=0; - char puSendCmd[2] = {(char)(addr >> 8) , (char)(addr & 0xFF) }; - iReadRegI2C(puSendCmd , 2, (u8*)&get_byte,1,OV5647_WRITE_ID); - return get_byte; -} - - - -static void OV5647_Write_Shutter(kal_uint16 iShutter) -{ - kal_uint16 extra_line = 0; - - /* 0x3500,0x3501, 0x3502 will increase VBLANK to get exposure larger than frame exposure */ - /* AE doesn't update sensor gain at capture mode, thus extra exposure lines must be updated here. */ - if (!iShutter) iShutter = 1; /* avoid 0 */ - - if(OV5647AutoFlicKerMode){ - //Change frame 29.5fps ~ 29.8fps to do auto flick - if(OV5647_sensor.video_mode == KAL_FALSE){ - OV5647SetMaxFrameRate(296); - } - } - - if(iShutter > (OV5647_sensor.frame_height-4)) - extra_line = iShutter - (OV5647_sensor.frame_height - 4); - - // Update Extra shutter - OV5647_write_cmos_sensor(0x350c, (extra_line >> 8) & 0xFF); - OV5647_write_cmos_sensor(0x350d, (extra_line) & 0xFF); - - //Update Shutter - OV5647_write_cmos_sensor(0x3500, (iShutter >> 12) & 0xF); - OV5647_write_cmos_sensor(0x3501, (iShutter >> 4) & 0xFF); - OV5647_write_cmos_sensor(0x3502, (iShutter << 4) & 0xFF); - -} /* OV5647_Write_Shutter */ - -static void OV5647_Set_Dummy(const kal_uint16 iPixels, const kal_uint16 iLines) -{ - kal_uint16 line_length, frame_height; - - if (OV5647_sensor.pv_mode){ - line_length = OV5647_PV_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_PV_PERIOD_LINE_NUMS + iLines; - }else{ - line_length = OV5647_FULL_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_FULL_PERIOD_LINE_NUMS + iLines; - } - - if ((line_length >= 0x1FFF)||(frame_height >= 0xFFF)) - return ; - - /* Add dummy pixels: */ - /* 0x380c [0:4], 0x380d defines the PCLKs in one line of OV5647 */ - /* Add dummy lines:*/ - /* 0x380e [0:1], 0x380f defines total lines in one frame of OV5647 */ - OV5647_write_cmos_sensor(0x380c, line_length >> 8); - OV5647_write_cmos_sensor(0x380d, line_length & 0xFF); - OV5647_write_cmos_sensor(0x380e, frame_height >> 8); - OV5647_write_cmos_sensor(0x380f, frame_height & 0xFF); - -} /* OV5647_Set_Dummy */ - -/*Avoid Folat, frame rate =10 * u2FrameRate */ -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate) -{ - kal_int16 dummy_line; - kal_uint16 FrameHeight = OV5647_sensor.frame_height; - unsigned long flags; - - printk("[soso][OV5647SetMaxFrameRate]u2FrameRate=%d",u2FrameRate); - - //dummy_line = OV5647_sensor.pclk / u2FrameRate / OV5647_PV_PERIOD_PIXEL_NUMS - OV5647_PV_PERIOD_LINE_NUMS; - FrameHeight= (10 * OV5647_sensor.pclk) / u2FrameRate / OV5647_sensor.line_length; - //if(FrameHeight>OV5647_sensor.frame_height){ - spin_lock_irqsave(&ov5647_drv_lock,flags); - OV5647_sensor.frame_height = FrameHeight; - spin_unlock_irqrestore(&ov5647_drv_lock,flags); - dummy_line = FrameHeight - OV5647_PV_PERIOD_LINE_NUMS; - /* to fix VSYNC, to fix frame rate */ - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //} - return (UINT32)u2FrameRate; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetShutter -* -* DESCRIPTION -* This function set e-shutter of OV5647 to change exposure time. -* -* PARAMETERS -* iShutter : exposured lines -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void set_OV5647_shutter(kal_uint16 iShutter) -{ - spin_lock(&ov5647_drv_lock); - OV5647_sensor.shutter = iShutter; - spin_unlock(&ov5647_drv_lock); - OV5647_Write_Shutter(iShutter); -} /* Set_OV5647_Shutter */ - -#if 0 -static kal_uint16 OV5647Reg2Gain(const kal_uint8 iReg) -{ - kal_uint16 iGain ; - /* Range: 1x to 32x */ - iGain = (iReg >> 4) * BASEGAIN + (iReg & 0xF) * BASEGAIN / 16; - return iGain ; -} -#endif - kal_uint8 OV5647Gain2Reg(const kal_uint16 iGain) -{ - kal_uint16 iReg = 0x00; - iReg = ((iGain / BASEGAIN) << 4) + ((iGain % BASEGAIN) * 16 / BASEGAIN); - iReg = iReg & 0xFF; - return (kal_uint8)iReg; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetGain -* -* DESCRIPTION -* This function is to set global gain to sensor. -* -* PARAMETERS -* iGain : sensor global gain(base: 0x40) -* -* RETURNS -* the actually gain set to sensor. -* -* GLOBALS AFFECTED -* -*************************************************************************/ -kal_uint16 OV5647_SetGain(kal_uint16 iGain) -{ - kal_uint8 iReg; - //V5647_sensor.gain = iGain; - /* 0x350a[0:1], 0x350b AGC real gain */ - /* [0:3] = N meams N /16 X */ - /* [4:9] = M meams M X */ - /* Total gain = M + N /16 X */ - iReg = OV5647Gain2Reg(iGain); - if (iReg < 0x10) iReg = 0x10; - //OV5647_write_cmos_sensor(0x350a, iReg); - OV5647_write_cmos_sensor(0x350b, iReg); - return iGain; -} -/************************************************************************* -* FUNCTION -* OV5647_NightMode -* -* DESCRIPTION -* This function night mode of OV5647. -* -* PARAMETERS -* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void OV5647_night_mode(kal_bool enable) -{ -/*No Need to implement this function*/ -#if 0 - const kal_uint16 dummy_pixel = OV5647_sensor.line_length - OV5647_PV_PERIOD_PIXEL_NUMS; - const kal_uint16 pv_min_fps = enable ? OV5647_sensor.night_fps : OV5647_sensor.normal_fps; - kal_uint16 dummy_line = OV5647_sensor.frame_height - OV5647_PV_PERIOD_LINE_NUMS; - kal_uint16 max_exposure_lines; - - printk("[soso][OV5647_night_mode]enable=%d",enable); - if (!OV5647_sensor.video_mode) return; - max_exposure_lines = OV5647_sensor.pclk * OV5647_FPS(1) / (pv_min_fps * OV5647_sensor.line_length); - if (max_exposure_lines > OV5647_sensor.frame_height) /* fix max frame rate, AE table will fix min frame rate */ -// { -// dummy_line = max_exposure_lines - OV5647_PV_PERIOD_LINE_NUMS; -// OV5647_Set_Dummy(dummy_pixel, dummy_line); -// } -#endif -} /* OV5647_NightMode */ - - -/* write camera_para to sensor register */ -static void OV5647_camera_para_to_sensor(void) -{ - kal_uint32 i; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_camera_para_to_sensor\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ -} - -/* update camera_para from sensor register */ -static void OV5647_sensor_to_camera_para(void) -{ - kal_uint32 i,temp_data; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_sensor_to_camera_para\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } -} - -/* ------------------------ Engineer mode ------------------------ */ -inline static void OV5647_get_sensor_group_count(kal_int32 *sensor_count_ptr) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_count\n"); -#endif - *sensor_count_ptr = OV5647_GROUP_TOTAL_NUMS; -} - -inline static void OV5647_get_sensor_group_info(MSDK_SENSOR_GROUP_INFO_STRUCT *para) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - sprintf(para->GroupNamePtr, "CCT"); - para->ItemCount = 5; - break; - case OV5647_CMMCLK_CURRENT: - sprintf(para->GroupNamePtr, "CMMCLK Current"); - para->ItemCount = 1; - break; - case OV5647_FRAME_RATE_LIMITATION: - sprintf(para->GroupNamePtr, "Frame Rate Limitation"); - para->ItemCount = 2; - break; - case OV5647_REGISTER_EDITOR: - sprintf(para->GroupNamePtr, "Register Editor"); - para->ItemCount = 2; - break; - default: - ASSERT(0); - } -} - -inline static void OV5647_get_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - - const static kal_char *cct_item_name[] = {"SENSOR_BASEGAIN", "Pregain-R", "Pregain-Gr", "Pregain-Gb", "Pregain-B"}; - const static kal_char *editer_item_name[] = {"REG addr", "REG value"}; - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - break; - default: - ASSERT(0); - } - sprintf(para->ItemNamePtr, cct_item_name[para->ItemIdx - OV5647_SENSOR_BASEGAIN]); - para->ItemValue = OV5647_sensor.eng.cct[para->ItemIdx].Para * 1000 / BASEGAIN; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = OV5647_MIN_ANALOG_GAIN * 1000; - para->Max = OV5647_MAX_ANALOG_GAIN * 1000; - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Drv Cur[2,4,6,8]mA"); - switch (OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para) - { - case ISP_DRIVING_2MA: - para->ItemValue = 2; - break; - case ISP_DRIVING_4MA: - para->ItemValue = 4; - break; - case ISP_DRIVING_6MA: - para->ItemValue = 6; - break; - case ISP_DRIVING_8MA: - para->ItemValue = 8; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsReadOnly = KAL_FALSE; - para->IsNeedRestart = KAL_TRUE; - para->Min = 2; - para->Max = 8; - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Max Exposure Lines"); - para->ItemValue = 5998; - break; - case 1: - sprintf(para->ItemNamePtr, "Min Frame Rate"); - para->ItemValue = 5; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsNeedRestart = KAL_FALSE; - para->IsReadOnly = KAL_TRUE; - para->Min = para->Max = 0; - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - case 0: - case 1: - sprintf(para->ItemNamePtr, editer_item_name[para->ItemIdx]); - para->ItemValue = 0; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = 0; - para->Max = (para->ItemIdx == 0 ? 0xFFFF : 0xFF); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - -inline static kal_bool OV5647_set_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - kal_uint16 temp_para; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_set_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.cct[para->ItemIdx].Para = para->ItemValue * BASEGAIN / 1000; - spin_unlock(&ov5647_drv_lock); - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ - break; - default: - ASSERT(0); - } - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - switch (para->ItemValue) - { - case 2: - temp_para = ISP_DRIVING_2MA; - break; - case 3: - case 4: - temp_para = ISP_DRIVING_4MA; - break; - case 5: - case 6: - temp_para = ISP_DRIVING_6MA; - break; - default: - temp_para = ISP_DRIVING_8MA; - break; - } - //OV5647_set_isp_driving_current(temp_para); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para = temp_para; - spin_unlock(&ov5647_drv_lock); - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - static kal_uint32 fac_sensor_reg; - case 0: - if (para->ItemValue < 0 || para->ItemValue > 0xFFFF) return KAL_FALSE; - fac_sensor_reg = para->ItemValue; - break; - case 1: - if (para->ItemValue < 0 || para->ItemValue > 0xFF) return KAL_FALSE; - OV5647_write_cmos_sensor(fac_sensor_reg, para->ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} - -static void OV5647_Sensor_Init(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0103, 0x01); - mdelay(5); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - - OV5647_write_cmos_sensor(0x3011, 0x62); - OV5647_write_cmos_sensor(0x3013, 0x08);//0x04-->0x00-->0x08 Turn off internal LDO - OV5647_write_cmos_sensor(0x4708, 0x01); - OV5647_write_cmos_sensor(0x5000, 0x06); - OV5647_write_cmos_sensor(0x5003, 0x08); - OV5647_write_cmos_sensor(0x5a00, 0x08); - OV5647_write_cmos_sensor(0x3000, 0xff); - OV5647_write_cmos_sensor(0x3001, 0xff); - OV5647_write_cmos_sensor(0x3002, 0xff); - OV5647_write_cmos_sensor(0x3a18, 0x01); - OV5647_write_cmos_sensor(0x3a19, 0xe0); - OV5647_write_cmos_sensor(0x3c01, 0x80); - OV5647_write_cmos_sensor(0x3b07, 0x0c); - OV5647_write_cmos_sensor(0x3630, 0x2e); - OV5647_write_cmos_sensor(0x3632, 0xe2); - OV5647_write_cmos_sensor(0x3633, 0x23); - OV5647_write_cmos_sensor(0x3634, 0x44); - OV5647_write_cmos_sensor(0x3620, 0x64); - OV5647_write_cmos_sensor(0x3621, 0xe0); - OV5647_write_cmos_sensor(0x3600, 0x37); - OV5647_write_cmos_sensor(0x3704, 0xa0); - OV5647_write_cmos_sensor(0x3703, 0x5a); - OV5647_write_cmos_sensor(0x3715, 0x78); - OV5647_write_cmos_sensor(0x3717, 0x01); - OV5647_write_cmos_sensor(0x3731, 0x02); - OV5647_write_cmos_sensor(0x370b, 0x60); - OV5647_write_cmos_sensor(0x3705, 0x1a); - OV5647_write_cmos_sensor(0x3f05, 0x02); - OV5647_write_cmos_sensor(0x3f06, 0x10); - OV5647_write_cmos_sensor(0x3f01, 0x0a); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0f, 0x58); - OV5647_write_cmos_sensor(0x3a10, 0x50); - OV5647_write_cmos_sensor(0x3a1b, 0x58); - OV5647_write_cmos_sensor(0x3a1e, 0x50); - OV5647_write_cmos_sensor(0x3a11, 0x60); - OV5647_write_cmos_sensor(0x3a1f, 0x28); - OV5647_write_cmos_sensor(0x4001, 0x02); - OV5647_write_cmos_sensor(0x4000, 0x09); - OV5647_write_cmos_sensor(0x4003, 0x08); - // manual AWB,manual AE,close Lenc,open WBC - OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x3501, 0x3c); - OV5647_write_cmos_sensor(0x3502, 0x00); - OV5647_write_cmos_sensor(0x350a, 0x00); - OV5647_write_cmos_sensor(0x350b, 0x7f); - OV5647_write_cmos_sensor(0x5001, 0x01); //;manual AWB - OV5647_write_cmos_sensor(0x5180, 0x08); - OV5647_write_cmos_sensor(0x5186, 0x04); - OV5647_write_cmos_sensor(0x5187, 0x00); - OV5647_write_cmos_sensor(0x5188, 0x04); - OV5647_write_cmos_sensor(0x5189, 0x00); - OV5647_write_cmos_sensor(0x518a, 0x04); - OV5647_write_cmos_sensor(0x518b, 0x00); - OV5647_write_cmos_sensor(0x5000, 0x06); //;No lenc,WBC on - - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#ifdef OV5647_TEST_PATTEM - OV5647_write_cmos_sensor(0x503D, 0x92); -#endif - - OV5647_write_cmos_sensor(0x0100, 0x01); - -} /* OV5647_Sensor_Init */ /* OV5647_Sensor_Init */ - - -static void OV5647_Sensor_1M(void) -{ - //------------------------------------------------------------------------------- - // PLL MY_OUTPUT clock(fclk) - // fclk = (0x40 - 0x300E[5:0]) x N x Bit8Div x MCLK / M, where - // N = 1, 1.5, 2, 3 for 0x300F[7:6] = 0~3, respectively - // M = 1, 1.5, 2, 3 for 0x300F[1:0] = 0~3, respectively - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // Sys Clk = fclk / Bit8Div / SenDiv - // Sensor MY_OUTPUT clock(DVP PCLK) - // DVP PCLK = ISP CLK / DVPDiv, where - // ISP CLK = fclk / Bit8Div / SenDiv / CLKDiv / 2, where - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // SenDiv = 1, 2 for 0x3010[4] = 0 or 1 repectively - // CLKDiv = (0x3011[5:0] + 1) - // DVPDiv = 0x304C[3:0] * (2 ^ 0x304C[4]), if 0x304C[3:0] = 0, use 16 instead - // - // Base shutter calculation - // 60Hz: (1/120) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - // 50Hz: (1/100) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - //------------------------------------------------------------------------------- - //26M MCLK 48.1M PCLK - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x4005, 0x18); // update BLC, Jason - //OV5647_write_cmos_sensor(0x4005, 0x1A); // update BLC, mtk70677 - OV5647_write_cmos_sensor(0x4005, 0x18);//mtk70677,Upate BLC when gain changed - OV5647_write_cmos_sensor(0x4051, 0x8F); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x18"); -#endif - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - //OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - //OV5647_write_cmos_sensor(0x3036, 0x46); /* PLL muitiplier */ - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor(0x370c, 0x03); /* Reserved */ - OV5647_write_cmos_sensor(0x3612, 0x09); /* Reserved */ - OV5647_write_cmos_sensor(0x3618, 0x00); /* Reserved */ - OV5647_write_cmos_sensor(0x380c, 0x07); /* TIMING HTS 0x065e */ - OV5647_write_cmos_sensor(0x380d, 0x68); /* TIMING HTS 1630 */ - OV5647_write_cmos_sensor(0x380e, 0x03); /* TIMING VTS 0x03d8 */ - OV5647_write_cmos_sensor(0x380f, 0xd8); /* TIMING VTS 984 */ - OV5647_write_cmos_sensor(0x3814, 0x31); /* TIMING X INC */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* TIMING Y INC */ - OV5647_write_cmos_sensor(0x3708, 0x22); /* Reserved */ - OV5647_write_cmos_sensor(0x3709, 0x52); /* Reserved */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* ??????? */ - OV5647_write_cmos_sensor(0x3808, 0x05); /* TIMING X OUTPUT SIZE 0x0500 */ - OV5647_write_cmos_sensor(0x3809, 0x10); /* TIMING X OUTPUT SIZE 1280 */ - OV5647_write_cmos_sensor(0x380a, 0x03); /* TIMING Y OUTPUT SIZE 0x03c0 */ - OV5647_write_cmos_sensor(0x380b, 0xcc); /* TIMING Y OUTPUT SIZE 960 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x08); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x02); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x37); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa1); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* B60 MAX */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* B50 MAX */ - OV5647_write_cmos_sensor(0x4004, 0x02); /* BLC CTRL04 */ - //OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x3a08, 0x01); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0a, 0x00); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* ??????? */ - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - -#ifdef CAPTURE_15FPS -#if defined(__OV5647_48M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_52M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3D); /* 52.867M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_54M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3F); /* 54.67M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#elif defined(__OV5647_56M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x41); /* 56.333M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#endif -#endif - OV5647_write_cmos_sensor(0x0100, 0x01); -} - -#if 0 -static void OV5647_Sensor_5M(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - OV5647_write_cmos_sensor(0x3821, 0x06); - OV5647_write_cmos_sensor(0x3820, 0x00); - OV5647_write_cmos_sensor(0x370c, 0x00); - OV5647_write_cmos_sensor(0x3612, 0x0b); - OV5647_write_cmos_sensor(0x3618, 0x04); - //OV5647_write_cmos_sensor(0x380c, 0x0a); /* TIMING HTS 0x0a8c */ - //OV5647_write_cmos_sensor(0x380d, 0x8c); /* TIMING HTS 2700 */ - OV5647_write_cmos_sensor(0x380c, 0x0b); /* TIMING HTS 0x0bfe */ - OV5647_write_cmos_sensor(0x380d, 0xef); /* TIMING HTS 3055 */ - OV5647_write_cmos_sensor(0x380e, 0x07); /* TIMING VTS 0x07b0 */ - OV5647_write_cmos_sensor(0x380f, 0xb0); /* TIMING VTS 1968 */ - OV5647_write_cmos_sensor(0x3814, 0x11); - //OV5647_write_cmos_sensor(0x3815, 0x11); //0909 for test - OV5647_write_cmos_sensor(0x3708, 0x24); - OV5647_write_cmos_sensor(0x3709, 0x12); - OV5647_write_cmos_sensor(0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x00); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x80); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x20); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x12); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x40); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa4); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor(0x3a09, 0x27); - OV5647_write_cmos_sensor(0x3a0b, 0xf6); - OV5647_write_cmos_sensor(0x3a0d, 0x08); - OV5647_write_cmos_sensor(0x3a0e, 0x06); - OV5647_write_cmos_sensor(0x4004, 0x04); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a09, 0x94); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0b, 0x7b); - OV5647_write_cmos_sensor(0x3a0d, 0x10); - OV5647_write_cmos_sensor(0x3a0e, 0x0d); - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x0100, 0x01); -} -#endif -#ifdef CAPTURE_15FPS - -static void OV5647_Sensor_5M_15fps(void) -{ - //kal_uint8 iTemp1 = OV5647_read_cmos_sensor(0x3820) & 0x06; - //kal_uint8 iTemp2 = OV5647_read_cmos_sensor(0x3821) & 0x06; - OV5647_write_cmos_sensor( 0x0100, 0x00); //15fps - OV5647_write_cmos_sensor(0x4005, 0x1a); // update BLC, Jason - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x1a"); -#endif - OV5647_write_cmos_sensor( 0x303c, 0x11); - //OV5647_write_cmos_sensor( 0x3821, iTemp2); - //OV5647_write_cmos_sensor( 0x3820, iTemp1); - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor( 0x370c, 0x00); - OV5647_write_cmos_sensor( 0x3612, 0x0b); - OV5647_write_cmos_sensor( 0x3618, 0x04); - OV5647_write_cmos_sensor( 0x380c, 0x0a); - OV5647_write_cmos_sensor( 0x380d, 0x8c); //2700 - OV5647_write_cmos_sensor( 0x380e, 0x07); - OV5647_write_cmos_sensor( 0x380f, 0xb0);//1968 - OV5647_write_cmos_sensor( 0x3814, 0x11); - OV5647_write_cmos_sensor( 0x3815, 0x11); - OV5647_write_cmos_sensor( 0x3708, 0x24); - OV5647_write_cmos_sensor( 0x3709, 0x12); - OV5647_write_cmos_sensor( 0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x20); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x98); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x0c); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x04); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x33); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa3); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x4004, 0x04); - OV5647_write_cmos_sensor( 0x3034, 0x1a); - OV5647_write_cmos_sensor( 0x3035, 0x11); - OV5647_write_cmos_sensor( 0x3036, 0x3e); - OV5647_write_cmos_sensor( 0x3037, 0x02); - OV5647_write_cmos_sensor( 0x303c, 0x11); - OV5647_write_cmos_sensor( 0x3a08, 0x01); - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0a, 0x00); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x3503, 0x07);//soso - OV5647_write_cmos_sensor( 0x0100, 0x01); -} -#endif - -/*****************************************************************************/ -/* Windows Mobile Sensor Interface */ -/*****************************************************************************/ -/************************************************************************* -* FUNCTION -* OV5647Open -* -* DESCRIPTION -* This function initialize the registers of CMOS sensor -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -UINT32 OV5647Open(void) -{ - kal_uint16 sensor_id=0; - - // check if sensor ID correct - sensor_id=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Open, sensor_id:%x \n",sensor_id); -#endif - if (sensor_id != OV5647_SENSOR_ID) - return ERROR_SENSOR_CONNECT_FAIL; - - /* initail sequence write in */ - OV5647_Sensor_Init(); - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - OV5647_sensor.Prv_line_length = OV5647_PV_PERIOD_PIXEL_NUMS;//For ZSD - spin_unlock(&ov5647_drv_lock); - return ERROR_NONE; -} /* OV5647Open */ - -/************************************************************************* -* FUNCTION -* OV5642GetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* *sensorID : return the sensor ID -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5642GetSensorID(UINT32 *sensorID) -{ - // check if sensor ID correct - *sensorID=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Open, sensor_id:%x \n",*sensorID); -#endif - if (*sensorID != OV5647_SENSOR_ID) { - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - - return ERROR_NONE; -} - -/************************************************************************* -* FUNCTION -* OV5647Close -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Close(void) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Close\n"); -#endif - //CISModulePowerOn(FALSE); -// DRV_I2CClose(OV5647hDrvI2C); - return ERROR_NONE; -} /* OV5647Close */ - -/************************************************************************* -* FUNCTION -* OV5647Preview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_line; - - OV5647_Sensor_1M(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_TRUE; - - //OV5647_set_mirror(sensor_config_data->SensorImageMirror); - switch (sensor_config_data->SensorOperationMode) - { - case MSDK_SENSOR_OPERATION_MODE_VIDEO: - OV5647_sensor.video_mode = KAL_TRUE; - dummy_line = 0; - default: /* ISP_PREVIEW_MODE */ - OV5647_sensor.video_mode = KAL_FALSE; - dummy_line = 0; - } - OV5647_sensor.line_length = OV5647_PV_PERIOD_PIXEL_NUMS; - OV5647_sensor.Prv_line_length=OV5647_sensor.line_length;//For Capture Funtion to calculate capture shutter - OV5647_sensor.frame_height = OV5647_PV_PERIOD_LINE_NUMS+dummy_line; - -#ifdef CAPTURE_15FPS - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; -#endif - spin_unlock(&ov5647_drv_lock); - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //OV5647_Write_Shutter(OV5647_sensor.shutter); - - //printk("[soso][OV5647Preview]shutter=%x,shutter=%d\n",OV5647_sensor.shutter,OV5647_sensor.shutter); - return ERROR_NONE; -} /* OV5647Preview */ - -/************************************************************************* -* FUNCTION -* OV5647Capture -* -* DESCRIPTION -* This function setup the CMOS sensor in capture MY_OUTPUT mode -* -* PARAMETERS -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - const kal_uint32 pv_line_length = (kal_uint32)OV5647_sensor.Prv_line_length; - kal_uint32 shutter = (kal_uint32)OV5647_sensor.shutter; - kal_uint16 cap_fps; - - spin_lock(&ov5647_drv_lock); - OV5647_sensor.video_mode = KAL_FALSE; - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - //if(OV5647_sensor.pv_mode == KAL_TRUE) - { - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); -#ifdef CAPTURE_15FPS - OV5647_Sensor_5M_15fps(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = 80600000; - spin_unlock(&ov5647_drv_lock); - cap_fps = OV5647_FPS(15); - - - OV5647_Set_Dummy(0, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - //806 is cpature PCLK 481 is preivew PCLK - //shutter = shutter * pv_line_length * 806/OV5647_sensor.line_length/481; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806 ))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000 - 3; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 563333))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 481000))); -#if defined(__OV5647_48M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000; -#elif defined(__OV5647_52M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 528667)))); -#elif defined(__OV5647_54M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 546))))/1000; -#elif defined(__OV5647_56M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 563))))/1000; -#endif - - -#else - OV5647_Sensor_5M(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; - spin_unlock(&ov5647_drv_lock); - - cap_fps = OV5647_FPS(8); - dummy_pixel = OV5647_sensor.pclk * OV5647_FPS(1) / (OV5647_FULL_PERIOD_LINE_NUMS * cap_fps); - dummy_pixel = dummy_pixel < OV5647_FULL_PERIOD_PIXEL_NUMS ? 0 : dummy_pixel - OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_Set_Dummy(dummy_pixel, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS+dummy_pixel; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - - /* shutter translation */ - shutter = shutter * pv_line_length / OV5647_sensor.line_length; -#endif -printk("[soso][capture]shutter=%x",shutter); - OV5647_Write_Shutter((kal_uint16)shutter); - //mdelay(1000); - } - return ERROR_NONE; -} /* OV5647_Capture() */ - -UINT32 OV5647GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - pSensorResolution->SensorFullWidth=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - pSensorResolution->SensorPreviewWidth=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorResolution->SensorPreviewHeight=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorResolution->SensorVideoWidth=OV5647_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight=OV5647_IMAGE_SENSOR_VIDEO_HEIGHT; - return ERROR_NONE; -} /* OV5647GetResolution() */ - -UINT32 OV5647GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ -#if 0 - pSensorInfo->SensorPreviewResolutionX=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV5647_IMAGE_SENSOR_FULL_HEIGHT; -#endif - - pSensorInfo->SensorCameraPreviewFrameRate=30; - pSensorInfo->SensorVideoFrameRate=30; - pSensorInfo->SensorStillCaptureFrameRate=10; - pSensorInfo->SensorWebCamCaptureFrameRate=15; - pSensorInfo->SensorResetActiveHigh=TRUE; //low active - pSensorInfo->SensorResetDelayCount=5; - pSensorInfo->SensorOutputDataFormat=OV5647_COLOR_FORMAT; - pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 1; - pSensorInfo->VideoDelayFrame = 1; - - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_2MA; - pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ - pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ - pSensorInfo->AEISPGainDelayFrame = 2; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_FULL_X_START; - pSensorInfo->SensorGrabStartY = OV5647_FULL_Y_START; - break; - default: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - break; - } -#if 0 - OV5647PixelClockDivider=pSensorInfo->SensorPixelClockCount; - memcpy(pSensorConfigData, &OV5647SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); -#endif - return ERROR_NONE; -} /* OV5647GetInfo() */ - - -UINT32 OV5647Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - OV5647Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV5647Capture(pImageWindow, pSensorConfigData); - break; - default: - return ERROR_INVALID_SCENARIO_ID; - } - - return TRUE; -} /* OV5647Control() */ - - - -UINT32 OV5647SetVideoMode(UINT16 u2FrameRate) -{ - //printk("[soso][OV5647SetMaxFrameRate]u2FrameRate=%d",u2FrameRate); - spin_lock(&ov5647_drv_lock); - - if(u2FrameRate == 30){ - OV5647_sensor.NightMode = KAL_FALSE; - }else if(u2FrameRate == 15){ - OV5647_sensor.NightMode = KAL_TRUE; - }else if(u2FrameRate == 0){ - //For Dynamic frame rate,Nothing to do - OV5647_sensor.video_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - return TRUE; - }else{ - // TODO: - //return TRUE; - } - - OV5647_sensor.video_mode = KAL_TRUE; - OV5647_sensor.FixedFps = u2FrameRate; - spin_unlock(&ov5647_drv_lock); - - if((u2FrameRate == 30)&&(OV5647AutoFlicKerMode==KAL_TRUE)) - u2FrameRate = 296; - else - u2FrameRate = 10 * u2FrameRate; - - OV5647SetMaxFrameRate(u2FrameRate); - OV5647_Write_Shutter(OV5647_sensor.shutter);//From Meimei Video issue - return TRUE; -} - -UINT32 OV5647SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - - if(bEnable){ - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_TRUE; - spin_unlock(&ov5647_drv_lock); - /*Change frame rate 29.5fps to 29.8fps to do Auto flick*/ - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(296); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(148); - }else{//Cancel Auto flick - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(300); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(150); - } - return TRUE; -} - -UINT32 OV5647SetTestPatternMode(kal_bool bEnable) -{ - SENSORDB("[OV5647SetTestPatternMode] Test pattern enable:%d\n", bEnable); - if(bEnable) - { - OV5647_write_cmos_sensor(0x503D,0x80); - } - else - { - OV5647_write_cmos_sensor(0x503D,0x00); - } - - return ERROR_NONE; -} - -UINT32 OV5647FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; -// UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; -// UINT32 OV5647SensorRegNumber; -// UINT32 i; - //PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - //MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=OV5647_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: /* 3 */ - *pFeatureReturnPara16++=OV5647_sensor.line_length; - *pFeatureReturnPara16=OV5647_sensor.frame_height; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: /* 3 */ - *pFeatureReturnPara32 = OV5647_sensor.pclk; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_ESHUTTER: /* 4 */ - set_OV5647_shutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - OV5647_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: /* 6 */ - OV5647_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - break; - case SENSOR_FEATURE_SET_REGISTER: - OV5647_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV5647_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - memcpy(&OV5647_sensor.eng.cct, pFeaturePara, sizeof(OV5647_sensor.eng.cct)); - break; - break; - case SENSOR_FEATURE_GET_CCT_REGISTER: /* 12 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.cct) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.cct); - memcpy(pFeaturePara, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - } - break; - case SENSOR_FEATURE_SET_ENG_REGISTER: - memcpy(&OV5647_sensor.eng.reg, pFeaturePara, sizeof(OV5647_sensor.eng.reg)); - break; - case SENSOR_FEATURE_GET_ENG_REGISTER: /* 14 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.reg) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.reg); - memcpy(pFeaturePara, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - } - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->Version = NVRAM_CAMERA_SENSOR_FILE_VERSION; - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorId = OV5647_SENSOR_ID; - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorEngReg, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorCCTReg, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pFeaturePara, &OV5647_sensor.cfg_data, sizeof(OV5647_sensor.cfg_data)); - *pFeatureParaLen = sizeof(OV5647_sensor.cfg_data); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - OV5647_camera_para_to_sensor(); - break; - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - OV5647_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - OV5647_get_sensor_group_count((kal_uint32 *)pFeaturePara); - *pFeatureParaLen = 4; - break; - OV5647_get_sensor_group_info((MSDK_SENSOR_GROUP_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - OV5647_get_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_SET_ITEM_INFO: - OV5647_set_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ENG_INFO: - memcpy(pFeaturePara, &OV5647_sensor.eng_info, sizeof(OV5647_sensor.eng_info)); - *pFeatureParaLen = sizeof(OV5647_sensor.eng_info); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV5647SetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV5642GetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - OV5647SetAutoFlickerMode((BOOL)*pFeatureData16,*(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV5647SetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: - *pFeatureReturnPara32= OV5647_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - default: - break; - } - return ERROR_NONE; -} /* OV5647FeatureControl() */ -SENSOR_FUNCTION_STRUCT SensorFuncOV5647= -{ - OV5647Open, - OV5647GetInfo, - OV5647GetResolution, - OV5647FeatureControl, - OV5647Control, - OV5647Close -}; - -UINT32 OV5647SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - /* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV5647; - - return ERROR_NONE; -} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p1_25.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p1_25.h deleted file mode 100644 index 4919802134d..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p1_25.h +++ /dev/null @@ -1,185 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * HengJun (MTK70677) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ - -#ifndef _OV5647_SENSOR_H -#define _OV5647_SENSOR_H - -//#define OV5647_DEBUG -//#define OV5647_DRIVER_TRACE -//#define OV5647_TEST_PATTEM -#ifdef OV5647_DEBUG -//#define SENSORDB printk -#else -//#define SENSORDB(x,...) -#endif - -#define OV5647_FACTORY_START_ADDR 0 -#define OV5647_ENGINEER_START_ADDR 10 - -typedef enum OV5647_group_enum -{ - OV5647_PRE_GAIN = 0, - OV5647_CMMCLK_CURRENT, - OV5647_FRAME_RATE_LIMITATION, - OV5647_REGISTER_EDITOR, - OV5647_GROUP_TOTAL_NUMS -} OV5647_FACTORY_GROUP_ENUM; - -typedef enum OV5647_register_index -{ - OV5647_SENSOR_BASEGAIN = OV5647_FACTORY_START_ADDR, - OV5647_PRE_GAIN_R_INDEX, - OV5647_PRE_GAIN_Gr_INDEX, - OV5647_PRE_GAIN_Gb_INDEX, - OV5647_PRE_GAIN_B_INDEX, - OV5647_FACTORY_END_ADDR -} OV5647_FACTORY_REGISTER_INDEX; - -typedef enum OV5647_engineer_index -{ - OV5647_CMMCLK_CURRENT_INDEX = OV5647_ENGINEER_START_ADDR, - OV5647_ENGINEER_END -} OV5647_FACTORY_ENGINEER_INDEX; - -typedef struct _sensor_data_struct -{ - SENSOR_REG_STRUCT reg[OV5647_ENGINEER_END]; - SENSOR_REG_STRUCT cct[OV5647_FACTORY_END_ADDR]; -} sensor_data_struct; - -/* SENSOR PREVIEW/CAPTURE VT CLOCK */ -#define __OV5647_54M__ - -#if defined(__OV5647_48M__)/*Preview PClk=48.1MHz*/ - #define OV5647_PREVIEW_CLK 48100000 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_52M__)/*Preview PClk=52.866666MHz*/ - #define OV5647_PREVIEW_CLK 52866667 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_54M__)/*Preview PClk=54.6MHz*/ - #define OV5647_PREVIEW_CLK 54600000 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_56M__)/*Preview PClk=56.333MHz*/ - #define OV5647_PREVIEW_CLK 56333333 - #define OV5647_CAPTURE_CLK 80600000 -#else - #error "This Sensor PCLK Setting is not configuration" -#endif - -#define OV5647_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW_B //SENSOR_OUTPUT_FORMAT_RAW_Gb //SENSOR_OUTPUT_FORMAT_RAW_R - -#define OV5647_MIN_ANALOG_GAIN 1 /* 1x */ -#define OV5647_MAX_ANALOG_GAIN 32 /* 32x */ - - -/* FRAME RATE UNIT */ -#define OV5647_FPS(x) (10 * (x)) -#define CAPTURE_15FPS - -/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ -//#define OV5647_FULL_PERIOD_PIXEL_NUMS 2700 /* 9 fps */ -#ifdef CAPTURE_15FPS -#define OV5647_FULL_PERIOD_PIXEL_NUMS 2700 /* 15 fps */ -#define OV5647_FULL_PERIOD_LINE_NUMS 1968 -#else -#define OV5647_FULL_PERIOD_PIXEL_NUMS 3055 /* 8 fps */ -#define OV5647_FULL_PERIOD_LINE_NUMS 1968 -#endif - - -#if defined(__OV5647_48M__) - #define OV5647_PV_PERIOD_PIXEL_NUMS 1630 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_52M__)// TODO: - #define OV5647_PV_PERIOD_PIXEL_NUMS 1790 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_54M__)// TODO: - #define OV5647_PV_PERIOD_PIXEL_NUMS 1850 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_56M__) - #define OV5647_PV_PERIOD_PIXEL_NUMS 1896 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#endif - - -/* SENSOR START/END POSITION */ -#define OV5647_FULL_X_START 4 //(1+16+6) -#define OV5647_FULL_Y_START 4 //(1+12+4) -#define OV5647_IMAGE_SENSOR_FULL_WIDTH (2560 - 32) //(2592 - 16) /* 2560 */ -#define OV5647_IMAGE_SENSOR_FULL_HEIGHT (1920 - 24) //(1944 - 12) /* 1920 */ -#define OV5647_PV_X_START 2 -#define OV5647_PV_Y_START 2 -#define OV5647_IMAGE_SENSOR_PV_WIDTH (1280 - 16) /* 1264 */ -#define OV5647_IMAGE_SENSOR_PV_HEIGHT (960 - 12) /* 948 */ -#define OV5647_IMAGE_SENSOR_VIDEO_WIDTH (1280 - 16) /* 1264 */ -#define OV5647_IMAGE_SENSOR_VIDEO_HEIGHT (960 - 12) /* 948 */ - -/* SENSOR READ/WRITE ID */ -#define OV5647_WRITE_ID (0x6c) -#define OV5647_READ_ID (0x6d) - -/* SENSOR ID */ -//#define OV5647_SENSOR_ID (0x5647) - -/* SENSOR PRIVATE STRUCT */ -typedef struct OV5647_sensor_STRUCT -{ - MSDK_SENSOR_CONFIG_STRUCT cfg_data; - sensor_data_struct eng; /* engineer mode */ - MSDK_SENSOR_ENG_INFO_STRUCT eng_info; - kal_uint8 mirror; - kal_bool pv_mode; - kal_bool video_mode; - kal_bool NightMode; - kal_uint16 normal_fps; /* video normal mode max fps */ - kal_uint16 night_fps; /* video night mode max fps */ - kal_uint16 FixedFps; - kal_uint16 shutter; - kal_uint16 gain; - kal_uint32 pclk; - kal_uint16 frame_height; - kal_uint16 frame_height_BackUp; - kal_uint16 line_length; - kal_uint16 Prv_line_length; -} OV5647_sensor_struct; - -//export functions -UINT32 OV5647Open(void); -UINT32 OV5647Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV5647FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 OV5647GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV5647GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 OV5647Close(void); - -#define Sleep(ms) mdelay(ms) - -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4.c deleted file mode 100644 index 2d809f5a93e..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4.c +++ /dev/null @@ -1,1506 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * HengJun (MTK70677) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Correct the write shutter function, max_shutter = frame_length - 4 + vts_differ. - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Enlarge frame length before write shutter to make sure it can take effect - * - * 02 19 2012 koli.lin - * [ALPS00237113] [Performance][Video recording]Recording preview the screen have flash - * [Camera] 1. Modify the AE converge speed in the video mode. - * 2. Modify the isp gain delay frame with sensor exposure time and gain synchronization. - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -#warning "compile ov5647_Sensor_p4.c" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "ov5647_Sensor_p4.h" -#include "ov5647_Camera_Sensor_para.h" -#include "ov5647_CameraCustomized.h" - -MSDK_SCENARIO_ID_ENUM CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; -static kal_bool OV5647AutoFlicKerMode = KAL_FALSE; - -#define OV5647_TEST_PATTERN_CHECKSUM (0x53ba2977) -#define OV5647_DRIVER_TRACE -#define OV5647_DEBUG - - -#ifdef OV5647_DEBUG -#define SENSORDB printk -#else -#define SENSORDB(x,...) -#endif -//#define ACDK - -static DEFINE_SPINLOCK(ov5647_drv_lock); - -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate); - - -static OV5647_sensor_struct OV5647_sensor = -{ -// .eng = -// { - // .reg = OV5647_CAMERA_SENSOR_REG_DEFAULT_VALUE, - // .cct = OV5647_CAMERA_SENSOR_CCT_DEFAULT_VALUE, - // }, - .eng_info = - { - .SensorId = 128, - .SensorType = CMOS_SENSOR, - .SensorOutputDataFormat = OV5647_COLOR_FORMAT, - }, - .shutter = 0x20, - .gain = 0x20, - .pclk = OV5647_PREVIEW_CLK, - .frame_height = OV5647_PV_PERIOD_LINE_NUMS, - .line_length = OV5647_PV_PERIOD_PIXEL_NUMS, -}; - - -kal_uint16 OV5647_write_cmos_sensor(kal_uint32 addr, kal_uint32 para) -{ - char puSendCmd[3] = {(char)(addr >> 8) , (char)(addr & 0xFF) ,(char)(para & 0xFF)}; - - iWriteRegI2C(puSendCmd , 3,OV5647_WRITE_ID); -return (kal_uint16)1; -} -kal_uint16 OV5647_read_cmos_sensor(kal_uint32 addr) -{ - kal_uint16 get_byte=0; - char puSendCmd[2] = {(char)(addr >> 8) , (char)(addr & 0xFF) }; - iReadRegI2C(puSendCmd , 2, (u8*)&get_byte,1,OV5647_WRITE_ID); - return get_byte; -} - - - -static void OV5647_Write_Shutter(kal_uint16 iShutter) -{ - kal_uint16 extra_line = 0; - - /* 0x3500,0x3501, 0x3502 will increase VBLANK to get exposure larger than frame exposure */ - /* AE doesn't update sensor gain at capture mode, thus extra exposure lines must be updated here. */ - if (!iShutter) iShutter = 1; /* avoid 0 */ - - if(OV5647AutoFlicKerMode){ - //Change frame 29.5fps ~ 29.8fps to do auto flick - if(OV5647_sensor.video_mode == KAL_FALSE){ - if(CurrentScenarioId== MSDK_SCENARIO_ID_CAMERA_ZSD){ - OV5647SetMaxFrameRate(148); - } - else{ - OV5647SetMaxFrameRate(296); - } - } - } - - if(iShutter > (OV5647_sensor.frame_height-4)) - extra_line = iShutter - (OV5647_sensor.frame_height - 4); - - // Update Extra shutter - OV5647_write_cmos_sensor(0x350c, (extra_line >> 8) & 0xFF); - OV5647_write_cmos_sensor(0x350d, (extra_line) & 0xFF); - - //Update Shutter - OV5647_write_cmos_sensor(0x3500, (iShutter >> 12) & 0xF); - OV5647_write_cmos_sensor(0x3501, (iShutter >> 4) & 0xFF); - OV5647_write_cmos_sensor(0x3502, (iShutter << 4) & 0xFF); - -} /* OV5647_Write_Shutter */ - -static void OV5647_Set_Dummy(const kal_uint16 iPixels, const kal_uint16 iLines) -{ - kal_uint16 line_length, frame_height; - - if (OV5647_sensor.pv_mode){ - line_length = OV5647_PV_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_PV_PERIOD_LINE_NUMS + iLines; - }else{ - line_length = OV5647_FULL_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_FULL_PERIOD_LINE_NUMS + iLines; - } - - if ((line_length >= 0x1FFF)||(frame_height >= 0xFFF)) - return ; - - /* Add dummy pixels: */ - /* 0x380c [0:4], 0x380d defines the PCLKs in one line of OV5647 */ - /* Add dummy lines:*/ - /* 0x380e [0:1], 0x380f defines total lines in one frame of OV5647 */ - OV5647_write_cmos_sensor(0x380c, line_length >> 8); - OV5647_write_cmos_sensor(0x380d, line_length & 0xFF); - OV5647_write_cmos_sensor(0x380e, frame_height >> 8); - OV5647_write_cmos_sensor(0x380f, frame_height & 0xFF); - -} /* OV5647_Set_Dummy */ - -/*Avoid Folat, frame rate =10 * u2FrameRate */ -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate) -{ - kal_int16 dummy_line; - kal_uint16 FrameHeight = OV5647_sensor.frame_height; - unsigned long flags; - - //dummy_line = OV5647_sensor.pclk / u2FrameRate / OV5647_PV_PERIOD_PIXEL_NUMS - OV5647_PV_PERIOD_LINE_NUMS; - printk("10*OV5647_sensor.pclk= %d, u2FrameRate = %d,OV5647_sensor.line_length = %d\n", (10 * OV5647_sensor.pclk), u2FrameRate, OV5647_sensor.line_length); - FrameHeight= (10 * OV5647_sensor.pclk) / u2FrameRate / OV5647_sensor.line_length; - //if(FrameHeight>OV5647_sensor.frame_height){ - spin_lock_irqsave(&ov5647_drv_lock,flags); - OV5647_sensor.frame_height = FrameHeight; - spin_unlock_irqrestore(&ov5647_drv_lock,flags); - dummy_line = FrameHeight - OV5647_PV_PERIOD_LINE_NUMS; - - if(dummy_line < 0) { - dummy_line = 0; - } - /* to fix VSYNC, to fix frame rate */ - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //} - printk("FrameHeight = %d, dummy_line = %d, OV5647_PV_PERIOD_LINE_NUMS = %d, OV5647_FULL_PERIOD_LINE_NUMS = %d\n",FrameHeight,dummy_line,OV5647_PV_PERIOD_LINE_NUMS,OV5647_FULL_PERIOD_LINE_NUMS); - return (UINT32)u2FrameRate; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetShutter -* -* DESCRIPTION -* This function set e-shutter of OV5647 to change exposure time. -* -* PARAMETERS -* iShutter : exposured lines -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void set_OV5647_shutter(kal_uint16 iShutter) -{ - spin_lock(&ov5647_drv_lock); - OV5647_sensor.shutter = iShutter; - spin_unlock(&ov5647_drv_lock); - OV5647_Write_Shutter(iShutter); -} /* Set_OV5647_Shutter */ - -#if 0 -static kal_uint16 OV5647Reg2Gain(const kal_uint8 iReg) -{ - kal_uint16 iGain ; - /* Range: 1x to 32x */ - iGain = (iReg >> 4) * BASEGAIN + (iReg & 0xF) * BASEGAIN / 16; - return iGain ; -} -#endif - kal_uint8 OV5647Gain2Reg(const kal_uint16 iGain) -{ - kal_uint16 iReg = 0x00; - iReg = ((iGain / BASEGAIN) << 4) + ((iGain % BASEGAIN) * 16 / BASEGAIN); - iReg = iReg & 0xFF; - return (kal_uint8)iReg; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetGain -* -* DESCRIPTION -* This function is to set global gain to sensor. -* -* PARAMETERS -* iGain : sensor global gain(base: 0x40) -* -* RETURNS -* the actually gain set to sensor. -* -* GLOBALS AFFECTED -* -*************************************************************************/ -kal_uint16 OV5647_SetGain(kal_uint16 iGain) -{ - kal_uint8 iReg; - //V5647_sensor.gain = iGain; - /* 0x350a[0:1], 0x350b AGC real gain */ - /* [0:3] = N meams N /16 X */ - /* [4:9] = M meams M X */ - /* Total gain = M + N /16 X */ - iReg = OV5647Gain2Reg(iGain); - if (iReg < 0x10) iReg = 0x10; - //OV5647_write_cmos_sensor(0x350a, iReg); - OV5647_write_cmos_sensor(0x350b, iReg); - return iGain; -} -/************************************************************************* -* FUNCTION -* OV5647_NightMode -* -* DESCRIPTION -* This function night mode of OV5647. -* -* PARAMETERS -* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void OV5647_night_mode(kal_bool enable) -{ -/*No Need to implement this function*/ -#if 0 - const kal_uint16 dummy_pixel = OV5647_sensor.line_length - OV5647_PV_PERIOD_PIXEL_NUMS; - const kal_uint16 pv_min_fps = enable ? OV5647_sensor.night_fps : OV5647_sensor.normal_fps; - kal_uint16 dummy_line = OV5647_sensor.frame_height - OV5647_PV_PERIOD_LINE_NUMS; - kal_uint16 max_exposure_lines; - - printk("[soso][OV5647_night_mode]enable=%d",enable); - if (!OV5647_sensor.video_mode) return; - max_exposure_lines = OV5647_sensor.pclk * OV5647_FPS(1) / (pv_min_fps * OV5647_sensor.line_length); - if (max_exposure_lines > OV5647_sensor.frame_height) /* fix max frame rate, AE table will fix min frame rate */ -// { -// dummy_line = max_exposure_lines - OV5647_PV_PERIOD_LINE_NUMS; -// OV5647_Set_Dummy(dummy_pixel, dummy_line); -// } -#endif -} /* OV5647_NightMode */ - - -/* write camera_para to sensor register */ -static void OV5647_camera_para_to_sensor(void) -{ - kal_uint32 i; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_camera_para_to_sensor\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ -} - -/* update camera_para from sensor register */ -static void OV5647_sensor_to_camera_para(void) -{ - kal_uint32 i,temp_data; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_sensor_to_camera_para\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } -} - -/* ------------------------ Engineer mode ------------------------ */ -inline static void OV5647_get_sensor_group_count(kal_int32 *sensor_count_ptr) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_count\n"); -#endif - *sensor_count_ptr = OV5647_GROUP_TOTAL_NUMS; -} - -inline static void OV5647_get_sensor_group_info(MSDK_SENSOR_GROUP_INFO_STRUCT *para) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - sprintf(para->GroupNamePtr, "CCT"); - para->ItemCount = 5; - break; - case OV5647_CMMCLK_CURRENT: - sprintf(para->GroupNamePtr, "CMMCLK Current"); - para->ItemCount = 1; - break; - case OV5647_FRAME_RATE_LIMITATION: - sprintf(para->GroupNamePtr, "Frame Rate Limitation"); - para->ItemCount = 2; - break; - case OV5647_REGISTER_EDITOR: - sprintf(para->GroupNamePtr, "Register Editor"); - para->ItemCount = 2; - break; - default: - ASSERT(0); - } -} - -inline static void OV5647_get_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - - const static kal_char *cct_item_name[] = {"SENSOR_BASEGAIN", "Pregain-R", "Pregain-Gr", "Pregain-Gb", "Pregain-B"}; - const static kal_char *editer_item_name[] = {"REG addr", "REG value"}; - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - break; - default: - ASSERT(0); - } - sprintf(para->ItemNamePtr, cct_item_name[para->ItemIdx - OV5647_SENSOR_BASEGAIN]); - para->ItemValue = OV5647_sensor.eng.cct[para->ItemIdx].Para * 1000 / BASEGAIN; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = OV5647_MIN_ANALOG_GAIN * 1000; - para->Max = OV5647_MAX_ANALOG_GAIN * 1000; - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Drv Cur[2,4,6,8]mA"); - switch (OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para) - { - case ISP_DRIVING_2MA: - para->ItemValue = 2; - break; - case ISP_DRIVING_4MA: - para->ItemValue = 4; - break; - case ISP_DRIVING_6MA: - para->ItemValue = 6; - break; - case ISP_DRIVING_8MA: - para->ItemValue = 8; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsReadOnly = KAL_FALSE; - para->IsNeedRestart = KAL_TRUE; - para->Min = 2; - para->Max = 8; - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Max Exposure Lines"); - para->ItemValue = 5998; - break; - case 1: - sprintf(para->ItemNamePtr, "Min Frame Rate"); - para->ItemValue = 5; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsNeedRestart = KAL_FALSE; - para->IsReadOnly = KAL_TRUE; - para->Min = para->Max = 0; - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - case 0: - case 1: - sprintf(para->ItemNamePtr, editer_item_name[para->ItemIdx]); - para->ItemValue = 0; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = 0; - para->Max = (para->ItemIdx == 0 ? 0xFFFF : 0xFF); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - -inline static kal_bool OV5647_set_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - kal_uint16 temp_para; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_set_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.cct[para->ItemIdx].Para = para->ItemValue * BASEGAIN / 1000; - spin_unlock(&ov5647_drv_lock); - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ - break; - default: - ASSERT(0); - } - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - switch (para->ItemValue) - { - case 2: - temp_para = ISP_DRIVING_2MA; - break; - case 3: - case 4: - temp_para = ISP_DRIVING_4MA; - break; - case 5: - case 6: - temp_para = ISP_DRIVING_6MA; - break; - default: - temp_para = ISP_DRIVING_8MA; - break; - } - //OV5647_set_isp_driving_current(temp_para); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para = temp_para; - spin_unlock(&ov5647_drv_lock); - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - static kal_uint32 fac_sensor_reg; - case 0: - if (para->ItemValue < 0 || para->ItemValue > 0xFFFF) return KAL_FALSE; - fac_sensor_reg = para->ItemValue; - break; - case 1: - if (para->ItemValue < 0 || para->ItemValue > 0xFF) return KAL_FALSE; - OV5647_write_cmos_sensor(fac_sensor_reg, para->ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} - -static void OV5647_Sensor_Init(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0103, 0x01); - mdelay(5); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - - OV5647_write_cmos_sensor(0x3011, 0x62); // Houston 20130917 increase sensor IO capability - OV5647_write_cmos_sensor(0x3013, 0x08);//0x04-->0x00-->0x08 Turn off internal LDO - OV5647_write_cmos_sensor(0x4708, 0x01/*0x00*/); // Houston 20130917 change pclk polarity - OV5647_write_cmos_sensor(0x5000, 0x06); - OV5647_write_cmos_sensor(0x5003, 0x08); - OV5647_write_cmos_sensor(0x5a00, 0x08); - OV5647_write_cmos_sensor(0x3000, 0xff); - OV5647_write_cmos_sensor(0x3001, 0xff); - OV5647_write_cmos_sensor(0x3002, 0xff); - OV5647_write_cmos_sensor(0x3a18, 0x01); - OV5647_write_cmos_sensor(0x3a19, 0xe0); - OV5647_write_cmos_sensor(0x3c01, 0x80); - OV5647_write_cmos_sensor(0x3b07, 0x0c); - OV5647_write_cmos_sensor(0x3630, 0x2e); - OV5647_write_cmos_sensor(0x3632, 0xe2); - OV5647_write_cmos_sensor(0x3633, 0x23); - OV5647_write_cmos_sensor(0x3634, 0x44); - OV5647_write_cmos_sensor(0x3620, 0x64); - OV5647_write_cmos_sensor(0x3621, 0xe0); - OV5647_write_cmos_sensor(0x3600, 0x37); - OV5647_write_cmos_sensor(0x3704, 0xa0); - OV5647_write_cmos_sensor(0x3703, 0x5a); - OV5647_write_cmos_sensor(0x3715, 0x78); - OV5647_write_cmos_sensor(0x3717, 0x01); - OV5647_write_cmos_sensor(0x3731, 0x02); - OV5647_write_cmos_sensor(0x370b, 0x60); - OV5647_write_cmos_sensor(0x3705, 0x1a); - OV5647_write_cmos_sensor(0x3f05, 0x02); - OV5647_write_cmos_sensor(0x3f06, 0x10); - OV5647_write_cmos_sensor(0x3f01, 0x0a); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0f, 0x58); - OV5647_write_cmos_sensor(0x3a10, 0x50); - OV5647_write_cmos_sensor(0x3a1b, 0x58); - OV5647_write_cmos_sensor(0x3a1e, 0x50); - OV5647_write_cmos_sensor(0x3a11, 0x60); - OV5647_write_cmos_sensor(0x3a1f, 0x28); - OV5647_write_cmos_sensor(0x4001, 0x02); - OV5647_write_cmos_sensor(0x4000, 0x09); - OV5647_write_cmos_sensor(0x4003, 0x08); - // manual AWB,manual AE,close Lenc,open WBC - OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x3501, 0x3c); - OV5647_write_cmos_sensor(0x3502, 0x00); - OV5647_write_cmos_sensor(0x350a, 0x00); - OV5647_write_cmos_sensor(0x350b, 0x7f); - OV5647_write_cmos_sensor(0x5001, 0x01); //;manual AWB - OV5647_write_cmos_sensor(0x5180, 0x08); - OV5647_write_cmos_sensor(0x5186, 0x04); - OV5647_write_cmos_sensor(0x5187, 0x00); - OV5647_write_cmos_sensor(0x5188, 0x04); - OV5647_write_cmos_sensor(0x5189, 0x00); - OV5647_write_cmos_sensor(0x518a, 0x04); - OV5647_write_cmos_sensor(0x518b, 0x00); - OV5647_write_cmos_sensor(0x5000, 0x06); //;No lenc,WBC on - - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#ifdef OV5647_TEST_PATTEM - OV5647_write_cmos_sensor(0x503D, 0x92); -#endif - - OV5647_write_cmos_sensor(0x0100, 0x01); - -} /* OV5647_Sensor_Init */ /* OV5647_Sensor_Init */ - - -static void OV5647_Sensor_1M(void) -{ - //------------------------------------------------------------------------------- - // PLL MY_OUTPUT clock(fclk) - // fclk = (0x40 - 0x300E[5:0]) x N x Bit8Div x MCLK / M, where - // N = 1, 1.5, 2, 3 for 0x300F[7:6] = 0~3, respectively - // M = 1, 1.5, 2, 3 for 0x300F[1:0] = 0~3, respectively - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // Sys Clk = fclk / Bit8Div / SenDiv - // Sensor MY_OUTPUT clock(DVP PCLK) - // DVP PCLK = ISP CLK / DVPDiv, where - // ISP CLK = fclk / Bit8Div / SenDiv / CLKDiv / 2, where - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // SenDiv = 1, 2 for 0x3010[4] = 0 or 1 repectively - // CLKDiv = (0x3011[5:0] + 1) - // DVPDiv = 0x304C[3:0] * (2 ^ 0x304C[4]), if 0x304C[3:0] = 0, use 16 instead - // - // Base shutter calculation - // 60Hz: (1/120) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - // 50Hz: (1/100) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - //------------------------------------------------------------------------------- - //26M MCLK 48.1M PCLK - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x4005, 0x18); // update BLC, Jason - //OV5647_write_cmos_sensor(0x4005, 0x1A); // update BLC, mtk70677 - OV5647_write_cmos_sensor(0x4005, 0x18);//mtk70677,Upate BLC when gain changed - OV5647_write_cmos_sensor(0x4051, 0x8F); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x18"); -#endif - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - //OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - //OV5647_write_cmos_sensor(0x3036, 0x46); /* PLL muitiplier */ - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor(0x370c, 0x03); /* Reserved */ - OV5647_write_cmos_sensor(0x3612, 0x09); /* Reserved */ - OV5647_write_cmos_sensor(0x3618, 0x00); /* Reserved */ - OV5647_write_cmos_sensor(0x380c, 0x07); /* TIMING HTS 0x065e */ - OV5647_write_cmos_sensor(0x380d, 0x68); /* TIMING HTS 1630 */ - OV5647_write_cmos_sensor(0x380e, 0x03); /* TIMING VTS 0x03d8 */ - OV5647_write_cmos_sensor(0x380f, 0xd8); /* TIMING VTS 984 */ - OV5647_write_cmos_sensor(0x3814, 0x31); /* TIMING X INC */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* TIMING Y INC */ - OV5647_write_cmos_sensor(0x3708, 0x22); /* Reserved */ - OV5647_write_cmos_sensor(0x3709, 0x52); /* Reserved */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* ??????? */ - OV5647_write_cmos_sensor(0x3808, 0x05); /* TIMING X OUTPUT SIZE 0x0500 */ - OV5647_write_cmos_sensor(0x3809, 0x10); /* TIMING X OUTPUT SIZE 1280 */ - OV5647_write_cmos_sensor(0x380a, 0x03); /* TIMING Y OUTPUT SIZE 0x03c0 */ - OV5647_write_cmos_sensor(0x380b, 0xcc); /* TIMING Y OUTPUT SIZE 960 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x08); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x02); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x37); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa1); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* B60 MAX */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* B50 MAX */ - OV5647_write_cmos_sensor(0x4004, 0x02); /* BLC CTRL04 */ - //OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x3a08, 0x01); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0a, 0x00); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* ??????? */ - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - -#ifdef CAPTURE_15FPS -#if defined(__OV5647_48M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_52M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3D); /* 52.867M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_54M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3F); /* 54.67M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#elif defined(__OV5647_56M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x41); /* 56.333M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#endif -#endif - OV5647_write_cmos_sensor(0x0100, 0x01); -} - -#if 1 // Houston 20131003 decrease capture frame rate due to pclk can't reach to 80MHz -static void OV5647_Sensor_5M(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - OV5647_write_cmos_sensor(0x3821, 0x06); - OV5647_write_cmos_sensor(0x3820, 0x00); - OV5647_write_cmos_sensor(0x370c, 0x00); - OV5647_write_cmos_sensor(0x3612, 0x0b); - OV5647_write_cmos_sensor(0x3618, 0x04); - //OV5647_write_cmos_sensor(0x380c, 0x0a); /* TIMING HTS 0x0a8c */ - //OV5647_write_cmos_sensor(0x380d, 0x8c); /* TIMING HTS 2700 */ - OV5647_write_cmos_sensor(0x380c, 0x0b); /* TIMING HTS 0x0bfe */ - OV5647_write_cmos_sensor(0x380d, 0xef); /* TIMING HTS 3055 */ - OV5647_write_cmos_sensor(0x380e, 0x07); /* TIMING VTS 0x07b0 */ - OV5647_write_cmos_sensor(0x380f, 0xb0); /* TIMING VTS 1968 */ - OV5647_write_cmos_sensor(0x3814, 0x11); - //OV5647_write_cmos_sensor(0x3815, 0x11); //0909 for test - OV5647_write_cmos_sensor(0x3708, 0x24); - OV5647_write_cmos_sensor(0x3709, 0x12); - OV5647_write_cmos_sensor(0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x20); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x98); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x0c); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x04); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x33); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa3); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor(0x3a09, 0x27); - OV5647_write_cmos_sensor(0x3a0b, 0xf6); - OV5647_write_cmos_sensor(0x3a0d, 0x08); - OV5647_write_cmos_sensor(0x3a0e, 0x06); - OV5647_write_cmos_sensor(0x4004, 0x04); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a09, 0x94); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0b, 0x7b); - OV5647_write_cmos_sensor(0x3a0d, 0x10); - OV5647_write_cmos_sensor(0x3a0e, 0x0d); - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x0100, 0x01); -} -#endif -#ifdef CAPTURE_15FPS - -static void OV5647_Sensor_5M_15fps(void) -{ - //kal_uint8 iTemp1 = OV5647_read_cmos_sensor(0x3820) & 0x06; - //kal_uint8 iTemp2 = OV5647_read_cmos_sensor(0x3821) & 0x06; - OV5647_write_cmos_sensor( 0x0100, 0x00); //15fps - OV5647_write_cmos_sensor(0x4005, 0x1a); // update BLC, Jason - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x1a"); -#endif - OV5647_write_cmos_sensor( 0x303c, 0x11); - //OV5647_write_cmos_sensor( 0x3821, iTemp2); - //OV5647_write_cmos_sensor( 0x3820, iTemp1); - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor( 0x370c, 0x00); - OV5647_write_cmos_sensor( 0x3612, 0x0b); - OV5647_write_cmos_sensor( 0x3618, 0x04); - OV5647_write_cmos_sensor( 0x380c, 0x0a); - OV5647_write_cmos_sensor( 0x380d, 0x8c); //2700 - OV5647_write_cmos_sensor( 0x380e, 0x07); - OV5647_write_cmos_sensor( 0x380f, 0xb0);//1968 - OV5647_write_cmos_sensor( 0x3814, 0x11); - OV5647_write_cmos_sensor( 0x3815, 0x11); - OV5647_write_cmos_sensor( 0x3708, 0x24); - OV5647_write_cmos_sensor( 0x3709, 0x12); - OV5647_write_cmos_sensor( 0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x20); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x98); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x0c); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x04); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x33); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa3); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x4004, 0x04); - OV5647_write_cmos_sensor( 0x3034, 0x1a); - OV5647_write_cmos_sensor( 0x3035, 0x11); - OV5647_write_cmos_sensor( 0x3036, 0x3e); - OV5647_write_cmos_sensor( 0x3037, 0x02); - OV5647_write_cmos_sensor( 0x303c, 0x11); - OV5647_write_cmos_sensor( 0x3a08, 0x01); - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0a, 0x00); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x3503, 0x07);//soso - OV5647_write_cmos_sensor( 0x0100, 0x01); -} -#endif - -/*****************************************************************************/ -/* Windows Mobile Sensor Interface */ -/*****************************************************************************/ -/************************************************************************* -* FUNCTION -* OV5647Open -* -* DESCRIPTION -* This function initialize the registers of CMOS sensor -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -UINT32 OV5647Open(void) -{ - kal_uint16 sensor_id=0; - - // check if sensor ID correct - sensor_id=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Open, sensor_id:%x \n",sensor_id); -#endif - if (sensor_id != OV5647_SENSOR_ID) - return ERROR_SENSOR_CONNECT_FAIL; - - /* initail sequence write in */ - OV5647_Sensor_Init(); - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - OV5647_sensor.Prv_line_length = OV5647_PV_PERIOD_PIXEL_NUMS;//For ZSD - spin_unlock(&ov5647_drv_lock); - return ERROR_NONE; -} /* OV5647Open */ - -/************************************************************************* -* FUNCTION -* OV5647GetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* *sensorID : return the sensor ID -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647GetSensorID(UINT32 *sensorID) -{ - // check if sensor ID correct - *sensorID=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647GetSensorID, sensor_id:%x \n",*sensorID); -#endif - if (*sensorID != OV5647_SENSOR_ID) { - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - - return ERROR_NONE; -} - -/************************************************************************* -* FUNCTION -* OV5647Close -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Close(void) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Close\n"); -#endif - //CISModulePowerOn(FALSE); -// DRV_I2CClose(OV5647hDrvI2C); - return ERROR_NONE; -} /* OV5647Close */ - -/************************************************************************* -* FUNCTION -* OV5647Preview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_line; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s]\n",__FUNCTION__); -#endif - - OV5647_Sensor_1M(); - - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_TRUE; - - //OV5647_set_mirror(sensor_config_data->SensorImageMirror); - switch (sensor_config_data->SensorOperationMode) - { - case MSDK_SENSOR_OPERATION_MODE_VIDEO: - OV5647_sensor.video_mode = KAL_TRUE; - dummy_line = 0; - default: /* ISP_PREVIEW_MODE */ - OV5647_sensor.video_mode = KAL_FALSE; - dummy_line = 0; - } - - OV5647_sensor.line_length = OV5647_PV_PERIOD_PIXEL_NUMS; - OV5647_sensor.Prv_line_length=OV5647_sensor.line_length;//For Capture Funtion to calculate capture shutter - OV5647_sensor.frame_height = OV5647_PV_PERIOD_LINE_NUMS+dummy_line; - -#ifdef CAPTURE_15FPS - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; -#endif - spin_unlock(&ov5647_drv_lock); - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //OV5647_Write_Shutter(OV5647_sensor.shutter); - - //printk("[soso][OV5647Preview]shutter=%x,shutter=%d\n",OV5647_sensor.shutter,OV5647_sensor.shutter); - - return ERROR_NONE; -} /* OV5647Preview */ - -/************************************************************************* -* FUNCTION -* OV5647Capture -* -* DESCRIPTION -* This function setup the CMOS sensor in capture MY_OUTPUT mode -* -* PARAMETERS -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - const kal_uint32 pv_line_length = (kal_uint32)OV5647_sensor.Prv_line_length; - kal_uint32 shutter = (kal_uint32)OV5647_sensor.shutter; - kal_uint16 cap_fps; - kal_uint16 dummy_pixel; - - spin_lock(&ov5647_drv_lock); - OV5647_sensor.video_mode = KAL_FALSE; - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - //if(OV5647_sensor.pv_mode == KAL_TRUE) - { - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); -#ifdef CAPTURE_15FPS - OV5647_Sensor_5M_15fps(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = 80600000; - spin_unlock(&ov5647_drv_lock); - cap_fps = OV5647_FPS(15); - - - OV5647_Set_Dummy(0, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - //806 is cpature PCLK 481 is preivew PCLK - //shutter = shutter * pv_line_length * 806/OV5647_sensor.line_length/481; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806 ))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000 - 3; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 563333))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 481000))); -#if defined(__OV5647_48M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000; -#elif defined(__OV5647_52M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 528667)))); -#elif defined(__OV5647_54M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 546))))/1000; -#elif defined(__OV5647_56M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 563))))/1000; -#endif - - -#else - OV5647_Sensor_5M(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; - spin_unlock(&ov5647_drv_lock); - - cap_fps = OV5647_FPS(8); - dummy_pixel = OV5647_sensor.pclk * OV5647_FPS(1) / (OV5647_FULL_PERIOD_LINE_NUMS * cap_fps); - dummy_pixel = dummy_pixel < OV5647_FULL_PERIOD_PIXEL_NUMS ? 0 : dummy_pixel - OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_Set_Dummy(dummy_pixel, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS+dummy_pixel; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - - /* shutter translation */ - shutter = shutter * pv_line_length / OV5647_sensor.line_length; -#endif -printk("[soso][capture]shutter=%x",shutter); - OV5647_Write_Shutter((kal_uint16)shutter); - - //mdelay(1000); - } - return ERROR_NONE; -} /* OV5647_Capture() */ - -UINT32 OV5647GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - pSensorResolution->SensorFullWidth=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - pSensorResolution->SensorPreviewWidth=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorResolution->SensorPreviewHeight=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorResolution->SensorVideoWidth=OV5647_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight=OV5647_IMAGE_SENSOR_VIDEO_HEIGHT; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s] ===> Full(%d x %d) , Preview (%d x %d) , Video (%d x %d)\n",__FUNCTION__, - pSensorResolution->SensorFullWidth, pSensorResolution->SensorFullHeight, - pSensorResolution->SensorPreviewWidth, pSensorResolution->SensorPreviewHeight, - pSensorResolution->SensorVideoWidth, pSensorResolution->SensorVideoHeight); -#endif - return ERROR_NONE; -} /* OV5647GetResolution() */ - -UINT32 OV5647GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - -#ifdef OV5647_DRIVER_TRACE - char scenario_str[10][20]={"PREVIEW","CAPTURE_JPEG","VIDEO_PREVIEW","HIGH SPEED VIDEO","ZSD","3D PREVIEW","3D CAPTURE", "3D VIDEO", "TV OUT", "MAX" }; - SENSORDB("[%s] ===> ScenarioId(%d):%s , SensorType: %d\n",__FUNCTION__ , ScenarioId , scenario_str[ScenarioId] , pSensorInfo->SensroInterfaceType); -#endif - -#if 0 - pSensorInfo->SensorPreviewResolutionX=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV5647_IMAGE_SENSOR_FULL_HEIGHT; -#endif - - pSensorInfo->SensorCameraPreviewFrameRate=30; - pSensorInfo->SensorVideoFrameRate=30; - pSensorInfo->SensorStillCaptureFrameRate=10; - pSensorInfo->SensorWebCamCaptureFrameRate=15; - pSensorInfo->SensorResetActiveHigh=TRUE; //low active - pSensorInfo->SensorResetDelayCount=5; - pSensorInfo->SensorOutputDataFormat=OV5647_COLOR_FORMAT; - pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - // Houston 20130916 add SensorInterfaceType +++ - pSensorInfo->SensorInterruptDelayLines = 3; - pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_PARALLEL; - // Houston 20130916 add SensorInterfaceType --- - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 2;//1; // Houston 20130917 increase pv delay frame to fix pclk phase shift - pSensorInfo->VideoDelayFrame = 1; - - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_2MA;//ISP_DRIVING_4MA;//ISP_DRIVING_6MA;//ISP_DRIVING_8MA; // Houston 20130917 increase pv delay frame to fix pclk phase shift - pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ - pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ - pSensorInfo->AEISPGainDelayFrame = 2; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - pSensorInfo->SensorClockFreq= 26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_FULL_X_START; - pSensorInfo->SensorGrabStartY = OV5647_FULL_Y_START; - break; - default: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - break; - } -#if 0 - OV5647PixelClockDivider=pSensorInfo->SensorPixelClockCount; - memcpy(pSensorConfigData, &OV5647SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); -#endif - return ERROR_NONE; -} /* OV5647GetInfo() */ - - -UINT32 OV5647Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - -#ifdef OV5647_DRIVER_TRACE - char scenario_str[10][20]={"PREVIEW","CAPTURE_JPEG","VIDEO_PREVIEW","HIGH SPEED VIDEO","ZSD","3D PREVIEW","3D CAPTURE", "3D VIDEO", "TV OUT", "MAX" }; - SENSORDB("[%s] ===> ScenarioId(%d):%s\n",__FUNCTION__ , ScenarioId , scenario_str[ScenarioId]); -#endif - - CurrentScenarioId = ScenarioId; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - OV5647Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV5647Capture(pImageWindow, pSensorConfigData); - break; - default: -#ifdef OV5647_DRIVER_TRACE - SENSORDB("\nOV5647Control <== return ERROR_INVALID_SCENARIO_ID (0x%x) \n", ERROR_INVALID_SCENARIO_ID); -#endif - return ERROR_INVALID_SCENARIO_ID; - } -#ifdef OV5647_DRIVER_TRACE - SENSORDB("\nOV5647Control <== return TRUE \n"); -#endif - return TRUE; -} /* OV5647Control() */ - - - -UINT32 OV5647SetVideoMode(UINT16 u2FrameRate) -{ - //printk("[soso][OV5647SetMaxFrameRate]u2FrameRate=%d",u2FrameRate); - spin_lock(&ov5647_drv_lock); - - if(u2FrameRate == 30){ - OV5647_sensor.NightMode = KAL_FALSE; - }else if(u2FrameRate == 15){ - OV5647_sensor.NightMode = KAL_TRUE; - }else if(u2FrameRate == 0){ - //For Dynamic frame rate,Nothing to do - OV5647_sensor.video_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - return TRUE; - }else{ - // TODO: - //return TRUE; - } - - OV5647_sensor.video_mode = KAL_TRUE; - OV5647_sensor.FixedFps = u2FrameRate; - spin_unlock(&ov5647_drv_lock); - - if((u2FrameRate == 30)&&(OV5647AutoFlicKerMode==KAL_TRUE)) - u2FrameRate = 296; - else - u2FrameRate = 10 * u2FrameRate; - - OV5647SetMaxFrameRate(u2FrameRate); - OV5647_Write_Shutter(OV5647_sensor.shutter);//From Meimei Video issue - return TRUE; -} - -UINT32 OV5647SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - - if(bEnable){ - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_TRUE; - spin_unlock(&ov5647_drv_lock); - /*Change frame rate 29.5fps to 29.8fps to do Auto flick*/ - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(296); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(148); - }else{//Cancel Auto flick - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(300); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(150); - } - return TRUE; -} - -UINT32 OV5647SetTestPatternMode(kal_bool bEnable) -{ - SENSORDB("[OV5647SetTestPatternMode] Test pattern enable:%d\n", bEnable); - if(bEnable) - { - OV5647_write_cmos_sensor(0x503D,0x80); - } - else - { - OV5647_write_cmos_sensor(0x503D,0x00); - } - - return ERROR_NONE; -} - -UINT32 OV5647FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; -// UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; -// UINT32 OV5647SensorRegNumber; -// UINT32 i; - //PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - //MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s] ===> FeatureId: %d\n", __FUNCTION__, FeatureId); -#endif - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=OV5647_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: /* 3 */ - *pFeatureReturnPara16++=OV5647_sensor.line_length; - *pFeatureReturnPara16=OV5647_sensor.frame_height; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: /* 3 */ - *pFeatureReturnPara32 = OV5647_sensor.pclk; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_ESHUTTER: /* 4 */ - set_OV5647_shutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - OV5647_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: /* 6 */ - OV5647_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - break; - case SENSOR_FEATURE_SET_REGISTER: - OV5647_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV5647_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - memcpy(&OV5647_sensor.eng.cct, pFeaturePara, sizeof(OV5647_sensor.eng.cct)); - break; - break; - case SENSOR_FEATURE_GET_CCT_REGISTER: /* 12 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.cct) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.cct); - memcpy(pFeaturePara, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - } - break; - case SENSOR_FEATURE_SET_ENG_REGISTER: - memcpy(&OV5647_sensor.eng.reg, pFeaturePara, sizeof(OV5647_sensor.eng.reg)); - break; - case SENSOR_FEATURE_GET_ENG_REGISTER: /* 14 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.reg) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.reg); - memcpy(pFeaturePara, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - } - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->Version = NVRAM_CAMERA_SENSOR_FILE_VERSION; - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorId = OV5647_SENSOR_ID; - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorEngReg, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorCCTReg, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pFeaturePara, &OV5647_sensor.cfg_data, sizeof(OV5647_sensor.cfg_data)); - *pFeatureParaLen = sizeof(OV5647_sensor.cfg_data); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - OV5647_camera_para_to_sensor(); - break; - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - OV5647_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - OV5647_get_sensor_group_count((kal_uint32 *)pFeaturePara); - *pFeatureParaLen = 4; - break; - OV5647_get_sensor_group_info((MSDK_SENSOR_GROUP_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - OV5647_get_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_SET_ITEM_INFO: - OV5647_set_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ENG_INFO: - memcpy(pFeaturePara, &OV5647_sensor.eng_info, sizeof(OV5647_sensor.eng_info)); - *pFeatureParaLen = sizeof(OV5647_sensor.eng_info); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV5647SetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV5647GetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - OV5647SetAutoFlickerMode((BOOL)*pFeatureData16,*(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV5647SetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: - *pFeatureReturnPara32= OV5647_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - default: - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("[%s] ===> FeatureId: %d , Not Implement !!! \n", __FUNCTION__, FeatureId); -#endif - break; - } - return ERROR_NONE; -} /* OV5647FeatureControl() */ -SENSOR_FUNCTION_STRUCT SensorFuncOV5647= -{ - OV5647Open, - OV5647GetInfo, - OV5647GetResolution, - OV5647FeatureControl, - OV5647Control, - OV5647Close -}; - -UINT32 OV5647SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - /* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV5647; - - return ERROR_NONE; -} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4.h deleted file mode 100644 index 4919802134d..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4.h +++ /dev/null @@ -1,185 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * HengJun (MTK70677) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ - -#ifndef _OV5647_SENSOR_H -#define _OV5647_SENSOR_H - -//#define OV5647_DEBUG -//#define OV5647_DRIVER_TRACE -//#define OV5647_TEST_PATTEM -#ifdef OV5647_DEBUG -//#define SENSORDB printk -#else -//#define SENSORDB(x,...) -#endif - -#define OV5647_FACTORY_START_ADDR 0 -#define OV5647_ENGINEER_START_ADDR 10 - -typedef enum OV5647_group_enum -{ - OV5647_PRE_GAIN = 0, - OV5647_CMMCLK_CURRENT, - OV5647_FRAME_RATE_LIMITATION, - OV5647_REGISTER_EDITOR, - OV5647_GROUP_TOTAL_NUMS -} OV5647_FACTORY_GROUP_ENUM; - -typedef enum OV5647_register_index -{ - OV5647_SENSOR_BASEGAIN = OV5647_FACTORY_START_ADDR, - OV5647_PRE_GAIN_R_INDEX, - OV5647_PRE_GAIN_Gr_INDEX, - OV5647_PRE_GAIN_Gb_INDEX, - OV5647_PRE_GAIN_B_INDEX, - OV5647_FACTORY_END_ADDR -} OV5647_FACTORY_REGISTER_INDEX; - -typedef enum OV5647_engineer_index -{ - OV5647_CMMCLK_CURRENT_INDEX = OV5647_ENGINEER_START_ADDR, - OV5647_ENGINEER_END -} OV5647_FACTORY_ENGINEER_INDEX; - -typedef struct _sensor_data_struct -{ - SENSOR_REG_STRUCT reg[OV5647_ENGINEER_END]; - SENSOR_REG_STRUCT cct[OV5647_FACTORY_END_ADDR]; -} sensor_data_struct; - -/* SENSOR PREVIEW/CAPTURE VT CLOCK */ -#define __OV5647_54M__ - -#if defined(__OV5647_48M__)/*Preview PClk=48.1MHz*/ - #define OV5647_PREVIEW_CLK 48100000 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_52M__)/*Preview PClk=52.866666MHz*/ - #define OV5647_PREVIEW_CLK 52866667 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_54M__)/*Preview PClk=54.6MHz*/ - #define OV5647_PREVIEW_CLK 54600000 - #define OV5647_CAPTURE_CLK 80600000 -#elif defined(__OV5647_56M__)/*Preview PClk=56.333MHz*/ - #define OV5647_PREVIEW_CLK 56333333 - #define OV5647_CAPTURE_CLK 80600000 -#else - #error "This Sensor PCLK Setting is not configuration" -#endif - -#define OV5647_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW_B //SENSOR_OUTPUT_FORMAT_RAW_Gb //SENSOR_OUTPUT_FORMAT_RAW_R - -#define OV5647_MIN_ANALOG_GAIN 1 /* 1x */ -#define OV5647_MAX_ANALOG_GAIN 32 /* 32x */ - - -/* FRAME RATE UNIT */ -#define OV5647_FPS(x) (10 * (x)) -#define CAPTURE_15FPS - -/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ -//#define OV5647_FULL_PERIOD_PIXEL_NUMS 2700 /* 9 fps */ -#ifdef CAPTURE_15FPS -#define OV5647_FULL_PERIOD_PIXEL_NUMS 2700 /* 15 fps */ -#define OV5647_FULL_PERIOD_LINE_NUMS 1968 -#else -#define OV5647_FULL_PERIOD_PIXEL_NUMS 3055 /* 8 fps */ -#define OV5647_FULL_PERIOD_LINE_NUMS 1968 -#endif - - -#if defined(__OV5647_48M__) - #define OV5647_PV_PERIOD_PIXEL_NUMS 1630 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_52M__)// TODO: - #define OV5647_PV_PERIOD_PIXEL_NUMS 1790 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_54M__)// TODO: - #define OV5647_PV_PERIOD_PIXEL_NUMS 1850 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#elif defined(__OV5647_56M__) - #define OV5647_PV_PERIOD_PIXEL_NUMS 1896 /* 30 fps */ - #define OV5647_PV_PERIOD_LINE_NUMS 984 -#endif - - -/* SENSOR START/END POSITION */ -#define OV5647_FULL_X_START 4 //(1+16+6) -#define OV5647_FULL_Y_START 4 //(1+12+4) -#define OV5647_IMAGE_SENSOR_FULL_WIDTH (2560 - 32) //(2592 - 16) /* 2560 */ -#define OV5647_IMAGE_SENSOR_FULL_HEIGHT (1920 - 24) //(1944 - 12) /* 1920 */ -#define OV5647_PV_X_START 2 -#define OV5647_PV_Y_START 2 -#define OV5647_IMAGE_SENSOR_PV_WIDTH (1280 - 16) /* 1264 */ -#define OV5647_IMAGE_SENSOR_PV_HEIGHT (960 - 12) /* 948 */ -#define OV5647_IMAGE_SENSOR_VIDEO_WIDTH (1280 - 16) /* 1264 */ -#define OV5647_IMAGE_SENSOR_VIDEO_HEIGHT (960 - 12) /* 948 */ - -/* SENSOR READ/WRITE ID */ -#define OV5647_WRITE_ID (0x6c) -#define OV5647_READ_ID (0x6d) - -/* SENSOR ID */ -//#define OV5647_SENSOR_ID (0x5647) - -/* SENSOR PRIVATE STRUCT */ -typedef struct OV5647_sensor_STRUCT -{ - MSDK_SENSOR_CONFIG_STRUCT cfg_data; - sensor_data_struct eng; /* engineer mode */ - MSDK_SENSOR_ENG_INFO_STRUCT eng_info; - kal_uint8 mirror; - kal_bool pv_mode; - kal_bool video_mode; - kal_bool NightMode; - kal_uint16 normal_fps; /* video normal mode max fps */ - kal_uint16 night_fps; /* video night mode max fps */ - kal_uint16 FixedFps; - kal_uint16 shutter; - kal_uint16 gain; - kal_uint32 pclk; - kal_uint16 frame_height; - kal_uint16 frame_height_BackUp; - kal_uint16 line_length; - kal_uint16 Prv_line_length; -} OV5647_sensor_struct; - -//export functions -UINT32 OV5647Open(void); -UINT32 OV5647Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV5647FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 OV5647GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 OV5647GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 OV5647Close(void); - -#define Sleep(ms) mdelay(ms) - -#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4_25.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4_25.c deleted file mode 100644 index c6b6b8bd986..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5647_raw/ov5647_Sensor_p4_25.c +++ /dev/null @@ -1,1451 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * sensor.c - * - * Project: - * -------- - * RAW - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - * Author: - * ------- - * HengJun (MTK70677) - * - *============================================================================ - * HISTORY - * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *------------------------------------------------------------------------------ - * $Revision:$ - * $Modtime:$ - * $Log:$ - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Correct the write shutter function, max_shutter = frame_length - 4 + vts_differ. - * - * 09 07 2012 qihao.geng - * [ALPS00351342] [6577JB][Camera]HDR photo is black when set anti-flicker as 60HZ - * Enlarge frame length before write shutter to make sure it can take effect - * - * 02 19 2012 koli.lin - * [ALPS00237113] [Performance][Video recording]Recording preview the screen have flash - * [Camera] 1. Modify the AE converge speed in the video mode. - * 2. Modify the isp gain delay frame with sensor exposure time and gain synchronization. - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ -#warning "compile ov5647_Sensor_p4_25.c" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "ov5647_Sensor_p4.h" -#include "ov5647_Camera_Sensor_para.h" -#include "ov5647_CameraCustomized.h" - -MSDK_SCENARIO_ID_ENUM CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; -static kal_bool OV5647AutoFlicKerMode = KAL_FALSE; - -#define OV5647_TEST_PATTERN_CHECKSUM (0x53ba2977) -#define OV5647_DRIVER_TRACE -#define OV5647_DEBUG - -#ifdef OV5647_DEBUG -#define SENSORDB printk -#else -#define SENSORDB(x,...) -#endif -//#define ACDK - -static DEFINE_SPINLOCK(ov5647_drv_lock); - -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate); - - -static OV5647_sensor_struct OV5647_sensor = -{ -// .eng = -// { - // .reg = OV5647_CAMERA_SENSOR_REG_DEFAULT_VALUE, - // .cct = OV5647_CAMERA_SENSOR_CCT_DEFAULT_VALUE, - // }, - .eng_info = - { - .SensorId = 128, - .SensorType = CMOS_SENSOR, - .SensorOutputDataFormat = OV5647_COLOR_FORMAT, - }, - .shutter = 0x20, - .gain = 0x20, - .pclk = OV5647_PREVIEW_CLK, - .frame_height = OV5647_PV_PERIOD_LINE_NUMS, - .line_length = OV5647_PV_PERIOD_PIXEL_NUMS, -}; - - -kal_uint16 OV5647_write_cmos_sensor(kal_uint32 addr, kal_uint32 para) -{ - char puSendCmd[3] = {(char)(addr >> 8) , (char)(addr & 0xFF) ,(char)(para & 0xFF)}; - - iWriteRegI2C(puSendCmd , 3,OV5647_WRITE_ID); -return (kal_uint16)1; -} -kal_uint16 OV5647_read_cmos_sensor(kal_uint32 addr) -{ - kal_uint16 get_byte=0; - char puSendCmd[2] = {(char)(addr >> 8) , (char)(addr & 0xFF) }; - iReadRegI2C(puSendCmd , 2, (u8*)&get_byte,1,OV5647_WRITE_ID); - return get_byte; -} - - - -static void OV5647_Write_Shutter(kal_uint16 iShutter) -{ - kal_uint16 extra_line = 0; - - /* 0x3500,0x3501, 0x3502 will increase VBLANK to get exposure larger than frame exposure */ - /* AE doesn't update sensor gain at capture mode, thus extra exposure lines must be updated here. */ - if (!iShutter) iShutter = 1; /* avoid 0 */ - - if(OV5647AutoFlicKerMode){ - //Change frame 29.5fps ~ 29.8fps to do auto flick - if(OV5647_sensor.video_mode == KAL_FALSE){ - OV5647SetMaxFrameRate(296); - } - } - - if(iShutter > (OV5647_sensor.frame_height-4)) - extra_line = iShutter - (OV5647_sensor.frame_height - 4); - - // Update Extra shutter - OV5647_write_cmos_sensor(0x350c, (extra_line >> 8) & 0xFF); - OV5647_write_cmos_sensor(0x350d, (extra_line) & 0xFF); - - //Update Shutter - OV5647_write_cmos_sensor(0x3500, (iShutter >> 12) & 0xF); - OV5647_write_cmos_sensor(0x3501, (iShutter >> 4) & 0xFF); - OV5647_write_cmos_sensor(0x3502, (iShutter << 4) & 0xFF); - -} /* OV5647_Write_Shutter */ - -static void OV5647_Set_Dummy(const kal_uint16 iPixels, const kal_uint16 iLines) -{ - kal_uint16 line_length, frame_height; - - if (OV5647_sensor.pv_mode){ - line_length = OV5647_PV_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_PV_PERIOD_LINE_NUMS + iLines; - }else{ - line_length = OV5647_FULL_PERIOD_PIXEL_NUMS + iPixels; - frame_height = OV5647_FULL_PERIOD_LINE_NUMS + iLines; - } - - if ((line_length >= 0x1FFF)||(frame_height >= 0xFFF)) - return ; - - /* Add dummy pixels: */ - /* 0x380c [0:4], 0x380d defines the PCLKs in one line of OV5647 */ - /* Add dummy lines:*/ - /* 0x380e [0:1], 0x380f defines total lines in one frame of OV5647 */ - OV5647_write_cmos_sensor(0x380c, line_length >> 8); - OV5647_write_cmos_sensor(0x380d, line_length & 0xFF); - OV5647_write_cmos_sensor(0x380e, frame_height >> 8); - OV5647_write_cmos_sensor(0x380f, frame_height & 0xFF); - -} /* OV5647_Set_Dummy */ - -/*Avoid Folat, frame rate =10 * u2FrameRate */ -UINT32 OV5647SetMaxFrameRate(UINT16 u2FrameRate) -{ - kal_int16 dummy_line; - kal_uint16 FrameHeight = OV5647_sensor.frame_height; - unsigned long flags; - - printk("[soso][OV5647SetMaxFrameRate]u2FrameRate=%d",u2FrameRate); - - //dummy_line = OV5647_sensor.pclk / u2FrameRate / OV5647_PV_PERIOD_PIXEL_NUMS - OV5647_PV_PERIOD_LINE_NUMS; - FrameHeight= (10 * OV5647_sensor.pclk) / u2FrameRate / OV5647_sensor.line_length; - //if(FrameHeight>OV5647_sensor.frame_height){ - spin_lock_irqsave(&ov5647_drv_lock,flags); - OV5647_sensor.frame_height = FrameHeight; - spin_unlock_irqrestore(&ov5647_drv_lock,flags); - dummy_line = FrameHeight - OV5647_PV_PERIOD_LINE_NUMS; - /* to fix VSYNC, to fix frame rate */ - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //} - return (UINT32)u2FrameRate; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetShutter -* -* DESCRIPTION -* This function set e-shutter of OV5647 to change exposure time. -* -* PARAMETERS -* iShutter : exposured lines -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void set_OV5647_shutter(kal_uint16 iShutter) -{ - spin_lock(&ov5647_drv_lock); - OV5647_sensor.shutter = iShutter; - spin_unlock(&ov5647_drv_lock); - OV5647_Write_Shutter(iShutter); -} /* Set_OV5647_Shutter */ - -#if 0 -static kal_uint16 OV5647Reg2Gain(const kal_uint8 iReg) -{ - kal_uint16 iGain ; - /* Range: 1x to 32x */ - iGain = (iReg >> 4) * BASEGAIN + (iReg & 0xF) * BASEGAIN / 16; - return iGain ; -} -#endif - kal_uint8 OV5647Gain2Reg(const kal_uint16 iGain) -{ - kal_uint16 iReg = 0x00; - iReg = ((iGain / BASEGAIN) << 4) + ((iGain % BASEGAIN) * 16 / BASEGAIN); - iReg = iReg & 0xFF; - return (kal_uint8)iReg; -} - -/************************************************************************* -* FUNCTION -* OV5647_SetGain -* -* DESCRIPTION -* This function is to set global gain to sensor. -* -* PARAMETERS -* iGain : sensor global gain(base: 0x40) -* -* RETURNS -* the actually gain set to sensor. -* -* GLOBALS AFFECTED -* -*************************************************************************/ -kal_uint16 OV5647_SetGain(kal_uint16 iGain) -{ - kal_uint8 iReg; - //V5647_sensor.gain = iGain; - /* 0x350a[0:1], 0x350b AGC real gain */ - /* [0:3] = N meams N /16 X */ - /* [4:9] = M meams M X */ - /* Total gain = M + N /16 X */ - iReg = OV5647Gain2Reg(iGain); - if (iReg < 0x10) iReg = 0x10; - //OV5647_write_cmos_sensor(0x350a, iReg); - OV5647_write_cmos_sensor(0x350b, iReg); - return iGain; -} -/************************************************************************* -* FUNCTION -* OV5647_NightMode -* -* DESCRIPTION -* This function night mode of OV5647. -* -* PARAMETERS -* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void OV5647_night_mode(kal_bool enable) -{ -/*No Need to implement this function*/ -#if 0 - const kal_uint16 dummy_pixel = OV5647_sensor.line_length - OV5647_PV_PERIOD_PIXEL_NUMS; - const kal_uint16 pv_min_fps = enable ? OV5647_sensor.night_fps : OV5647_sensor.normal_fps; - kal_uint16 dummy_line = OV5647_sensor.frame_height - OV5647_PV_PERIOD_LINE_NUMS; - kal_uint16 max_exposure_lines; - - printk("[soso][OV5647_night_mode]enable=%d",enable); - if (!OV5647_sensor.video_mode) return; - max_exposure_lines = OV5647_sensor.pclk * OV5647_FPS(1) / (pv_min_fps * OV5647_sensor.line_length); - if (max_exposure_lines > OV5647_sensor.frame_height) /* fix max frame rate, AE table will fix min frame rate */ -// { -// dummy_line = max_exposure_lines - OV5647_PV_PERIOD_LINE_NUMS; -// OV5647_Set_Dummy(dummy_pixel, dummy_line); -// } -#endif -} /* OV5647_NightMode */ - - -/* write camera_para to sensor register */ -static void OV5647_camera_para_to_sensor(void) -{ - kal_uint32 i; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_camera_para_to_sensor\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - OV5647_write_cmos_sensor(OV5647_sensor.eng.reg[i].Addr, OV5647_sensor.eng.reg[i].Para); - } - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ -} - -/* update camera_para from sensor register */ -static void OV5647_sensor_to_camera_para(void) -{ - kal_uint32 i,temp_data; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_sensor_to_camera_para\n"); -#endif - for (i = 0; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } - for (i = OV5647_FACTORY_START_ADDR; 0xFFFFFFFF != OV5647_sensor.eng.reg[i].Addr; i++) - { - temp_data = OV5647_read_cmos_sensor(OV5647_sensor.eng.reg[i].Addr); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[i].Para = temp_data; - spin_unlock(&ov5647_drv_lock); - } -} - -/* ------------------------ Engineer mode ------------------------ */ -inline static void OV5647_get_sensor_group_count(kal_int32 *sensor_count_ptr) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_count\n"); -#endif - *sensor_count_ptr = OV5647_GROUP_TOTAL_NUMS; -} - -inline static void OV5647_get_sensor_group_info(MSDK_SENSOR_GROUP_INFO_STRUCT *para) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_group_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - sprintf(para->GroupNamePtr, "CCT"); - para->ItemCount = 5; - break; - case OV5647_CMMCLK_CURRENT: - sprintf(para->GroupNamePtr, "CMMCLK Current"); - para->ItemCount = 1; - break; - case OV5647_FRAME_RATE_LIMITATION: - sprintf(para->GroupNamePtr, "Frame Rate Limitation"); - para->ItemCount = 2; - break; - case OV5647_REGISTER_EDITOR: - sprintf(para->GroupNamePtr, "Register Editor"); - para->ItemCount = 2; - break; - default: - ASSERT(0); - } -} - -inline static void OV5647_get_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - - const static kal_char *cct_item_name[] = {"SENSOR_BASEGAIN", "Pregain-R", "Pregain-Gr", "Pregain-Gb", "Pregain-B"}; - const static kal_char *editer_item_name[] = {"REG addr", "REG value"}; - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_get_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - break; - default: - ASSERT(0); - } - sprintf(para->ItemNamePtr, cct_item_name[para->ItemIdx - OV5647_SENSOR_BASEGAIN]); - para->ItemValue = OV5647_sensor.eng.cct[para->ItemIdx].Para * 1000 / BASEGAIN; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = OV5647_MIN_ANALOG_GAIN * 1000; - para->Max = OV5647_MAX_ANALOG_GAIN * 1000; - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Drv Cur[2,4,6,8]mA"); - switch (OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para) - { - case ISP_DRIVING_2MA: - para->ItemValue = 2; - break; - case ISP_DRIVING_4MA: - para->ItemValue = 4; - break; - case ISP_DRIVING_6MA: - para->ItemValue = 6; - break; - case ISP_DRIVING_8MA: - para->ItemValue = 8; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsReadOnly = KAL_FALSE; - para->IsNeedRestart = KAL_TRUE; - para->Min = 2; - para->Max = 8; - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - switch (para->ItemIdx) - { - case 0: - sprintf(para->ItemNamePtr, "Max Exposure Lines"); - para->ItemValue = 5998; - break; - case 1: - sprintf(para->ItemNamePtr, "Min Frame Rate"); - para->ItemValue = 5; - break; - default: - ASSERT(0); - } - para->IsTrueFalse = para->IsNeedRestart = KAL_FALSE; - para->IsReadOnly = KAL_TRUE; - para->Min = para->Max = 0; - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - case 0: - case 1: - sprintf(para->ItemNamePtr, editer_item_name[para->ItemIdx]); - para->ItemValue = 0; - para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; - para->Min = 0; - para->Max = (para->ItemIdx == 0 ? 0xFFFF : 0xFF); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - -inline static kal_bool OV5647_set_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) -{ - kal_uint16 temp_para; -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647_set_sensor_item_info\n"); -#endif - switch (para->GroupIdx) - { - case OV5647_PRE_GAIN: - switch (para->ItemIdx) - { - case OV5647_SENSOR_BASEGAIN: - case OV5647_PRE_GAIN_R_INDEX: - case OV5647_PRE_GAIN_Gr_INDEX: - case OV5647_PRE_GAIN_Gb_INDEX: - case OV5647_PRE_GAIN_B_INDEX: - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.cct[para->ItemIdx].Para = para->ItemValue * BASEGAIN / 1000; - spin_unlock(&ov5647_drv_lock); - OV5647_SetGain(OV5647_sensor.gain); /* update gain */ - break; - default: - ASSERT(0); - } - break; - case OV5647_CMMCLK_CURRENT: - switch (para->ItemIdx) - { - case 0: - switch (para->ItemValue) - { - case 2: - temp_para = ISP_DRIVING_2MA; - break; - case 3: - case 4: - temp_para = ISP_DRIVING_4MA; - break; - case 5: - case 6: - temp_para = ISP_DRIVING_6MA; - break; - default: - temp_para = ISP_DRIVING_8MA; - break; - } - //OV5647_set_isp_driving_current(temp_para); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.eng.reg[OV5647_CMMCLK_CURRENT_INDEX].Para = temp_para; - spin_unlock(&ov5647_drv_lock); - break; - default: - ASSERT(0); - } - break; - case OV5647_FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case OV5647_REGISTER_EDITOR: - switch (para->ItemIdx) - { - static kal_uint32 fac_sensor_reg; - case 0: - if (para->ItemValue < 0 || para->ItemValue > 0xFFFF) return KAL_FALSE; - fac_sensor_reg = para->ItemValue; - break; - case 1: - if (para->ItemValue < 0 || para->ItemValue > 0xFF) return KAL_FALSE; - OV5647_write_cmos_sensor(fac_sensor_reg, para->ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} - -static void OV5647_Sensor_Init(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0103, 0x01); - mdelay(5); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - OV5647_write_cmos_sensor(0x0100, 0x00); - - OV5647_write_cmos_sensor(0x3011, 0x62); - OV5647_write_cmos_sensor(0x3013, 0x08);//0x04-->0x00-->0x08 Turn off internal LDO - OV5647_write_cmos_sensor(0x4708, 0x01); - OV5647_write_cmos_sensor(0x5000, 0x06); - OV5647_write_cmos_sensor(0x5003, 0x08); - OV5647_write_cmos_sensor(0x5a00, 0x08); - OV5647_write_cmos_sensor(0x3000, 0xff); - OV5647_write_cmos_sensor(0x3001, 0xff); - OV5647_write_cmos_sensor(0x3002, 0xff); - OV5647_write_cmos_sensor(0x3a18, 0x01); - OV5647_write_cmos_sensor(0x3a19, 0xe0); - OV5647_write_cmos_sensor(0x3c01, 0x80); - OV5647_write_cmos_sensor(0x3b07, 0x0c); - OV5647_write_cmos_sensor(0x3630, 0x2e); - OV5647_write_cmos_sensor(0x3632, 0xe2); - OV5647_write_cmos_sensor(0x3633, 0x23); - OV5647_write_cmos_sensor(0x3634, 0x44); - OV5647_write_cmos_sensor(0x3620, 0x64); - OV5647_write_cmos_sensor(0x3621, 0xe0); - OV5647_write_cmos_sensor(0x3600, 0x37); - OV5647_write_cmos_sensor(0x3704, 0xa0); - OV5647_write_cmos_sensor(0x3703, 0x5a); - OV5647_write_cmos_sensor(0x3715, 0x78); - OV5647_write_cmos_sensor(0x3717, 0x01); - OV5647_write_cmos_sensor(0x3731, 0x02); - OV5647_write_cmos_sensor(0x370b, 0x60); - OV5647_write_cmos_sensor(0x3705, 0x1a); - OV5647_write_cmos_sensor(0x3f05, 0x02); - OV5647_write_cmos_sensor(0x3f06, 0x10); - OV5647_write_cmos_sensor(0x3f01, 0x0a); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0f, 0x58); - OV5647_write_cmos_sensor(0x3a10, 0x50); - OV5647_write_cmos_sensor(0x3a1b, 0x58); - OV5647_write_cmos_sensor(0x3a1e, 0x50); - OV5647_write_cmos_sensor(0x3a11, 0x60); - OV5647_write_cmos_sensor(0x3a1f, 0x28); - OV5647_write_cmos_sensor(0x4001, 0x02); - OV5647_write_cmos_sensor(0x4000, 0x09); - OV5647_write_cmos_sensor(0x4003, 0x08); - // manual AWB,manual AE,close Lenc,open WBC - OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x3501, 0x3c); - OV5647_write_cmos_sensor(0x3502, 0x00); - OV5647_write_cmos_sensor(0x350a, 0x00); - OV5647_write_cmos_sensor(0x350b, 0x7f); - OV5647_write_cmos_sensor(0x5001, 0x01); //;manual AWB - OV5647_write_cmos_sensor(0x5180, 0x08); - OV5647_write_cmos_sensor(0x5186, 0x04); - OV5647_write_cmos_sensor(0x5187, 0x00); - OV5647_write_cmos_sensor(0x5188, 0x04); - OV5647_write_cmos_sensor(0x5189, 0x00); - OV5647_write_cmos_sensor(0x518a, 0x04); - OV5647_write_cmos_sensor(0x518b, 0x00); - OV5647_write_cmos_sensor(0x5000, 0x06); //;No lenc,WBC on - - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#ifdef OV5647_TEST_PATTEM - OV5647_write_cmos_sensor(0x503D, 0x92); -#endif - - OV5647_write_cmos_sensor(0x0100, 0x01); - -} /* OV5647_Sensor_Init */ /* OV5647_Sensor_Init */ - - -static void OV5647_Sensor_1M(void) -{ - //------------------------------------------------------------------------------- - // PLL MY_OUTPUT clock(fclk) - // fclk = (0x40 - 0x300E[5:0]) x N x Bit8Div x MCLK / M, where - // N = 1, 1.5, 2, 3 for 0x300F[7:6] = 0~3, respectively - // M = 1, 1.5, 2, 3 for 0x300F[1:0] = 0~3, respectively - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // Sys Clk = fclk / Bit8Div / SenDiv - // Sensor MY_OUTPUT clock(DVP PCLK) - // DVP PCLK = ISP CLK / DVPDiv, where - // ISP CLK = fclk / Bit8Div / SenDiv / CLKDiv / 2, where - // Bit8Div = 1, 1, 4, 5 for 0x300F[5:4] = 0~3, respectively - // SenDiv = 1, 2 for 0x3010[4] = 0 or 1 repectively - // CLKDiv = (0x3011[5:0] + 1) - // DVPDiv = 0x304C[3:0] * (2 ^ 0x304C[4]), if 0x304C[3:0] = 0, use 16 instead - // - // Base shutter calculation - // 60Hz: (1/120) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - // 50Hz: (1/100) * ISP Clk / QXGA_MODE_WITHOUT_DUMMY_PIXELS - //------------------------------------------------------------------------------- - //26M MCLK 48.1M PCLK - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x4005, 0x18); // update BLC, Jason - //OV5647_write_cmos_sensor(0x4005, 0x1A); // update BLC, mtk70677 - OV5647_write_cmos_sensor(0x4005, 0x18);//mtk70677,Upate BLC when gain changed - OV5647_write_cmos_sensor(0x4051, 0x8F); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x18"); -#endif - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - //OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - //OV5647_write_cmos_sensor(0x3036, 0x46); /* PLL muitiplier */ - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor(0x370c, 0x03); /* Reserved */ - OV5647_write_cmos_sensor(0x3612, 0x09); /* Reserved */ - OV5647_write_cmos_sensor(0x3618, 0x00); /* Reserved */ - OV5647_write_cmos_sensor(0x380c, 0x07); /* TIMING HTS 0x065e */ - OV5647_write_cmos_sensor(0x380d, 0x68); /* TIMING HTS 1630 */ - OV5647_write_cmos_sensor(0x380e, 0x03); /* TIMING VTS 0x03d8 */ - OV5647_write_cmos_sensor(0x380f, 0xd8); /* TIMING VTS 984 */ - OV5647_write_cmos_sensor(0x3814, 0x31); /* TIMING X INC */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* TIMING Y INC */ - OV5647_write_cmos_sensor(0x3708, 0x22); /* Reserved */ - OV5647_write_cmos_sensor(0x3709, 0x52); /* Reserved */ - OV5647_write_cmos_sensor(0x3815, 0x31); /* ??????? */ - OV5647_write_cmos_sensor(0x3808, 0x05); /* TIMING X OUTPUT SIZE 0x0500 */ - OV5647_write_cmos_sensor(0x3809, 0x10); /* TIMING X OUTPUT SIZE 1280 */ - OV5647_write_cmos_sensor(0x380a, 0x03); /* TIMING Y OUTPUT SIZE 0x03c0 */ - OV5647_write_cmos_sensor(0x380b, 0xcc); /* TIMING Y OUTPUT SIZE 960 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x08); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x02); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x37); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa1); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* B60 MAX */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* B50 MAX */ - OV5647_write_cmos_sensor(0x4004, 0x02); /* BLC CTRL04 */ - //OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x3a08, 0x01); /* B50 STEP */ - OV5647_write_cmos_sensor(0x3a09, 0x27); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0a, 0x00); /* B60 STEP */ - OV5647_write_cmos_sensor(0x3a0b, 0xf6); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0d, 0x04); /* ??????? */ - OV5647_write_cmos_sensor(0x3a0e, 0x03); /* ??????? */ - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - -#ifdef CAPTURE_15FPS -#if defined(__OV5647_48M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x21); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x4a); /* 48.1M */ - OV5647_write_cmos_sensor(0x3037, 0x02); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_52M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3D); /* 52.867M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#elif defined(__OV5647_54M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x3F); /* 54.67M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ - -#elif defined(__OV5647_56M__) - OV5647_write_cmos_sensor(0x3034, 0x1a); /* PLL ctrl0 */ - OV5647_write_cmos_sensor(0x3035, 0x11); /* Debug mode */ - OV5647_write_cmos_sensor(0x3036, 0x41); /* 56.333M */ - OV5647_write_cmos_sensor(0x3037, 0x03); /* PLL ctrl3 */ - - OV5647_write_cmos_sensor(0x3106, 0xf9); - OV5647_write_cmos_sensor(0x303c, 0x11); /* PLLS control2 0x12*/ -#endif -#endif - OV5647_write_cmos_sensor(0x0100, 0x01); -} - -#if 0 -static void OV5647_Sensor_5M(void) -{ - OV5647_write_cmos_sensor(0x0100, 0x00); - //OV5647_write_cmos_sensor(0x350c, 0x00); - //OV5647_write_cmos_sensor(0x350d, 0x00); - //OV5647_write_cmos_sensor(0x3503, 0x03); //;manual AE - OV5647_write_cmos_sensor(0x3821, 0x06); - OV5647_write_cmos_sensor(0x3820, 0x00); - OV5647_write_cmos_sensor(0x370c, 0x00); - OV5647_write_cmos_sensor(0x3612, 0x0b); - OV5647_write_cmos_sensor(0x3618, 0x04); - //OV5647_write_cmos_sensor(0x380c, 0x0a); /* TIMING HTS 0x0a8c */ - //OV5647_write_cmos_sensor(0x380d, 0x8c); /* TIMING HTS 2700 */ - OV5647_write_cmos_sensor(0x380c, 0x0b); /* TIMING HTS 0x0bfe */ - OV5647_write_cmos_sensor(0x380d, 0xef); /* TIMING HTS 3055 */ - OV5647_write_cmos_sensor(0x380e, 0x07); /* TIMING VTS 0x07b0 */ - OV5647_write_cmos_sensor(0x380f, 0xb0); /* TIMING VTS 1968 */ - OV5647_write_cmos_sensor(0x3814, 0x11); - //OV5647_write_cmos_sensor(0x3815, 0x11); //0909 for test - OV5647_write_cmos_sensor(0x3708, 0x24); - OV5647_write_cmos_sensor(0x3709, 0x12); - OV5647_write_cmos_sensor(0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x00); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x80); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x20); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x12); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x40); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa4); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor(0x3a09, 0x27); - OV5647_write_cmos_sensor(0x3a0b, 0xf6); - OV5647_write_cmos_sensor(0x3a0d, 0x08); - OV5647_write_cmos_sensor(0x3a0e, 0x06); - OV5647_write_cmos_sensor(0x4004, 0x04); - OV5647_write_cmos_sensor(0x3a08, 0x00); - OV5647_write_cmos_sensor(0x3a09, 0x94); - OV5647_write_cmos_sensor(0x3a0a, 0x00); - OV5647_write_cmos_sensor(0x3a0b, 0x7b); - OV5647_write_cmos_sensor(0x3a0d, 0x10); - OV5647_write_cmos_sensor(0x3a0e, 0x0d); - //OV5647_write_cmos_sensor(0x3503, 0x07); //;manual AE - OV5647_write_cmos_sensor(0x0100, 0x01); -} -#endif -#ifdef CAPTURE_15FPS - -static void OV5647_Sensor_5M_15fps(void) -{ - //kal_uint8 iTemp1 = OV5647_read_cmos_sensor(0x3820) & 0x06; - //kal_uint8 iTemp2 = OV5647_read_cmos_sensor(0x3821) & 0x06; - OV5647_write_cmos_sensor( 0x0100, 0x00); //15fps - OV5647_write_cmos_sensor(0x4005, 0x1a); // update BLC, Jason - -#ifdef OV5647_DRIVER_TRACE - SENSORDB("Write Reg 0x4005 = 0x1a"); -#endif - OV5647_write_cmos_sensor( 0x303c, 0x11); - //OV5647_write_cmos_sensor( 0x3821, iTemp2); - //OV5647_write_cmos_sensor( 0x3820, iTemp1); - OV5647_write_cmos_sensor(0x3821, 0x07); /* timing tc reg21 */ - OV5647_write_cmos_sensor(0x3820, 0x41); /* timing tc reg20 */ - OV5647_write_cmos_sensor( 0x370c, 0x00); - OV5647_write_cmos_sensor( 0x3612, 0x0b); - OV5647_write_cmos_sensor( 0x3618, 0x04); - OV5647_write_cmos_sensor( 0x380c, 0x0a); - OV5647_write_cmos_sensor( 0x380d, 0x8c); //2700 - OV5647_write_cmos_sensor( 0x380e, 0x07); - OV5647_write_cmos_sensor( 0x380f, 0xb0);//1968 - OV5647_write_cmos_sensor( 0x3814, 0x11); - OV5647_write_cmos_sensor( 0x3815, 0x11); - OV5647_write_cmos_sensor( 0x3708, 0x24); - OV5647_write_cmos_sensor( 0x3709, 0x12); - OV5647_write_cmos_sensor( 0x3815, 0x11); - - OV5647_write_cmos_sensor(0x3808, 0x0a); /* TIMING X OUTPUT SIZE 0x0a20 */ - OV5647_write_cmos_sensor(0x3809, 0x20); /* TIMING X OUTPUT SIZE 2592 */ - OV5647_write_cmos_sensor(0x380a, 0x07); /* TIMING Y OUTPUT SIZE 0x0798*/ - OV5647_write_cmos_sensor(0x380b, 0x98); /* TIMING Y OUTPUT SIZE 1944 */ - OV5647_write_cmos_sensor(0x3800, 0x00); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3801, 0x0c); /* TIMING X ADDR START */ - OV5647_write_cmos_sensor(0x3802, 0x00); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3803, 0x04); /* TIMING Y ADDR START */ - OV5647_write_cmos_sensor(0x3804, 0x0a); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3805, 0x33); /* TIMING X ADDR END */ - OV5647_write_cmos_sensor(0x3806, 0x07); /* TIMING Y ADDR END */ - OV5647_write_cmos_sensor(0x3807, 0xa3); /* TIMING Y ADDR END */ - - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x4004, 0x04); - OV5647_write_cmos_sensor( 0x3034, 0x1a); - OV5647_write_cmos_sensor( 0x3035, 0x11); - OV5647_write_cmos_sensor( 0x3036, 0x3e); - OV5647_write_cmos_sensor( 0x3037, 0x02); - OV5647_write_cmos_sensor( 0x303c, 0x11); - OV5647_write_cmos_sensor( 0x3a08, 0x01); - OV5647_write_cmos_sensor( 0x3a09, 0x27); - OV5647_write_cmos_sensor( 0x3a0a, 0x00); - OV5647_write_cmos_sensor( 0x3a0b, 0xf6); - OV5647_write_cmos_sensor( 0x3a0d, 0x08); - OV5647_write_cmos_sensor( 0x3a0e, 0x06); - OV5647_write_cmos_sensor( 0x3503, 0x07);//soso - OV5647_write_cmos_sensor( 0x0100, 0x01); -} -#endif - -/*****************************************************************************/ -/* Windows Mobile Sensor Interface */ -/*****************************************************************************/ -/************************************************************************* -* FUNCTION -* OV5647Open -* -* DESCRIPTION -* This function initialize the registers of CMOS sensor -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -UINT32 OV5647Open(void) -{ - kal_uint16 sensor_id=0; - - // check if sensor ID correct - sensor_id=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Open, sensor_id:%x \n",sensor_id); -#endif - if (sensor_id != OV5647_SENSOR_ID) - return ERROR_SENSOR_CONNECT_FAIL; - - /* initail sequence write in */ - OV5647_Sensor_Init(); - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - OV5647_sensor.Prv_line_length = OV5647_PV_PERIOD_PIXEL_NUMS;//For ZSD - spin_unlock(&ov5647_drv_lock); - return ERROR_NONE; -} /* OV5647Open */ - -/************************************************************************* -* FUNCTION -* OV5642GetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* *sensorID : return the sensor ID -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5642GetSensorID(UINT32 *sensorID) -{ - // check if sensor ID correct - *sensorID=((OV5647_read_cmos_sensor(0x300A) << 8) | OV5647_read_cmos_sensor(0x300B)); -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Open, sensor_id:%x \n",*sensorID); -#endif - if (*sensorID != OV5647_SENSOR_ID) { - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - - return ERROR_NONE; -} - -/************************************************************************* -* FUNCTION -* OV5647Close -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Close(void) -{ -#ifdef OV5647_DRIVER_TRACE - SENSORDB("OV5647Close\n"); -#endif - //CISModulePowerOn(FALSE); -// DRV_I2CClose(OV5647hDrvI2C); - return ERROR_NONE; -} /* OV5647Close */ - -/************************************************************************* -* FUNCTION -* OV5647Preview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - kal_uint16 dummy_line; - - OV5647_Sensor_1M(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_TRUE; - - //OV5647_set_mirror(sensor_config_data->SensorImageMirror); - switch (sensor_config_data->SensorOperationMode) - { - case MSDK_SENSOR_OPERATION_MODE_VIDEO: - OV5647_sensor.video_mode = KAL_TRUE; - dummy_line = 0; - default: /* ISP_PREVIEW_MODE */ - OV5647_sensor.video_mode = KAL_FALSE; - dummy_line = 0; - } - OV5647_sensor.line_length = OV5647_PV_PERIOD_PIXEL_NUMS; - OV5647_sensor.Prv_line_length=OV5647_sensor.line_length;//For Capture Funtion to calculate capture shutter - OV5647_sensor.frame_height = OV5647_PV_PERIOD_LINE_NUMS+dummy_line; - -#ifdef CAPTURE_15FPS - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; -#endif - spin_unlock(&ov5647_drv_lock); - OV5647_Set_Dummy(0, dummy_line); /* modify dummy_pixel must gen AE table again */ - //OV5647_Write_Shutter(OV5647_sensor.shutter); - - //printk("[soso][OV5647Preview]shutter=%x,shutter=%d\n",OV5647_sensor.shutter,OV5647_sensor.shutter); - return ERROR_NONE; -} /* OV5647Preview */ - -/************************************************************************* -* FUNCTION -* OV5647Capture -* -* DESCRIPTION -* This function setup the CMOS sensor in capture MY_OUTPUT mode -* -* PARAMETERS -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 OV5647Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - const kal_uint32 pv_line_length = (kal_uint32)OV5647_sensor.Prv_line_length; - kal_uint32 shutter = (kal_uint32)OV5647_sensor.shutter; - kal_uint16 cap_fps; - - spin_lock(&ov5647_drv_lock); - OV5647_sensor.video_mode = KAL_FALSE; - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - //if(OV5647_sensor.pv_mode == KAL_TRUE) - { - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pv_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); -#ifdef CAPTURE_15FPS - OV5647_Sensor_5M_15fps(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = 80600000; - spin_unlock(&ov5647_drv_lock); - cap_fps = OV5647_FPS(15); - - - OV5647_Set_Dummy(0, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - //806 is cpature PCLK 481 is preivew PCLK - //shutter = shutter * pv_line_length * 806/OV5647_sensor.line_length/481; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806 ))/((kal_uint32)(OV5647_sensor.line_length * 481))); - //shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000 - 3; - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 563333))); - //shutter = shutter * (((kal_uint32)(pv_line_length * 806000))/((kal_uint32)(OV5647_sensor.line_length * 481000))); -#if defined(__OV5647_48M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 481))))/1000; -#elif defined(__OV5647_52M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 528667)))); -#elif defined(__OV5647_54M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 546))))/1000; -#elif defined(__OV5647_56M__) - shutter = (shutter * (((kal_uint32)(pv_line_length * 806 * 1000))/((kal_uint32)(OV5647_sensor.line_length * 563))))/1000; -#endif - - -#else - OV5647_Sensor_5M(); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.pclk = OV5647_PREVIEW_CLK; - spin_unlock(&ov5647_drv_lock); - - cap_fps = OV5647_FPS(8); - dummy_pixel = OV5647_sensor.pclk * OV5647_FPS(1) / (OV5647_FULL_PERIOD_LINE_NUMS * cap_fps); - dummy_pixel = dummy_pixel < OV5647_FULL_PERIOD_PIXEL_NUMS ? 0 : dummy_pixel - OV5647_FULL_PERIOD_PIXEL_NUMS; - OV5647_Set_Dummy(dummy_pixel, 0); - spin_lock(&ov5647_drv_lock); - OV5647_sensor.line_length = OV5647_FULL_PERIOD_PIXEL_NUMS+dummy_pixel; - OV5647_sensor.frame_height = OV5647_FULL_PERIOD_LINE_NUMS; - spin_unlock(&ov5647_drv_lock); - - /* shutter translation */ - shutter = shutter * pv_line_length / OV5647_sensor.line_length; -#endif -printk("[soso][capture]shutter=%x",shutter); - OV5647_Write_Shutter((kal_uint16)shutter); - //mdelay(1000); - } - return ERROR_NONE; -} /* OV5647_Capture() */ - -UINT32 OV5647GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - pSensorResolution->SensorFullWidth=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - pSensorResolution->SensorPreviewWidth=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorResolution->SensorPreviewHeight=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorResolution->SensorVideoWidth=OV5647_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight=OV5647_IMAGE_SENSOR_VIDEO_HEIGHT; - return ERROR_NONE; -} /* OV5647GetResolution() */ - -UINT32 OV5647GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ -#if 0 - pSensorInfo->SensorPreviewResolutionX=OV5647_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY=OV5647_IMAGE_SENSOR_PV_HEIGHT; - pSensorInfo->SensorFullResolutionX=OV5647_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY=OV5647_IMAGE_SENSOR_FULL_HEIGHT; -#endif - - pSensorInfo->SensorCameraPreviewFrameRate=30; - pSensorInfo->SensorVideoFrameRate=30; - pSensorInfo->SensorStillCaptureFrameRate=10; - pSensorInfo->SensorWebCamCaptureFrameRate=15; - pSensorInfo->SensorResetActiveHigh=TRUE; //low active - pSensorInfo->SensorResetDelayCount=5; - pSensorInfo->SensorOutputDataFormat=OV5647_COLOR_FORMAT; - pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 1; - pSensorInfo->VideoDelayFrame = 1; - - pSensorInfo->SensorMasterClockSwitch = 0; - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_2MA; - pSensorInfo->AEShutDelayFrame = 0; /* The frame of setting shutter default 0 for TG int */ - pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ - pSensorInfo->AEISPGainDelayFrame = 2; - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorClockFallingCount= 2; - pSensorInfo->SensorPixelClockCount= 3; - pSensorInfo->SensorDataLatchCount= 2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount= 3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_FULL_X_START; - pSensorInfo->SensorGrabStartY = OV5647_FULL_Y_START; - break; - default: - pSensorInfo->SensorClockFreq=26; - pSensorInfo->SensorClockDividCount=3; - pSensorInfo->SensorClockRisingCount=0; - pSensorInfo->SensorClockFallingCount=2; - pSensorInfo->SensorPixelClockCount=3; - pSensorInfo->SensorDataLatchCount=2; - pSensorInfo->SensorGrabStartX = OV5647_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5647_PV_Y_START; - break; - } -#if 0 - OV5647PixelClockDivider=pSensorInfo->SensorPixelClockCount; - memcpy(pSensorConfigData, &OV5647SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); -#endif - return ERROR_NONE; -} /* OV5647GetInfo() */ - - -UINT32 OV5647Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - //case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: - OV5647Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - //case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV5647Capture(pImageWindow, pSensorConfigData); - break; - default: - return ERROR_INVALID_SCENARIO_ID; - } - - return TRUE; -} /* OV5647Control() */ - - - -UINT32 OV5647SetVideoMode(UINT16 u2FrameRate) -{ - //printk("[soso][OV5647SetMaxFrameRate]u2FrameRate=%d",u2FrameRate); - spin_lock(&ov5647_drv_lock); - - if(u2FrameRate == 30){ - OV5647_sensor.NightMode = KAL_FALSE; - }else if(u2FrameRate == 15){ - OV5647_sensor.NightMode = KAL_TRUE; - }else if(u2FrameRate == 0){ - //For Dynamic frame rate,Nothing to do - OV5647_sensor.video_mode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - return TRUE; - }else{ - // TODO: - //return TRUE; - } - - OV5647_sensor.video_mode = KAL_TRUE; - OV5647_sensor.FixedFps = u2FrameRate; - spin_unlock(&ov5647_drv_lock); - - if((u2FrameRate == 30)&&(OV5647AutoFlicKerMode==KAL_TRUE)) - u2FrameRate = 296; - else - u2FrameRate = 10 * u2FrameRate; - - OV5647SetMaxFrameRate(u2FrameRate); - OV5647_Write_Shutter(OV5647_sensor.shutter);//From Meimei Video issue - return TRUE; -} - -UINT32 OV5647SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - - if(bEnable){ - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_TRUE; - spin_unlock(&ov5647_drv_lock); - /*Change frame rate 29.5fps to 29.8fps to do Auto flick*/ - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(296); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(148); - }else{//Cancel Auto flick - spin_lock(&ov5647_drv_lock); - OV5647AutoFlicKerMode = KAL_FALSE; - spin_unlock(&ov5647_drv_lock); - if((OV5647_sensor.FixedFps == 30)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(300); - if((OV5647_sensor.FixedFps == 15)&&(OV5647_sensor.video_mode==KAL_TRUE)) - OV5647SetMaxFrameRate(150); - } - return TRUE; -} - -UINT32 OV5647SetTestPatternMode(kal_bool bEnable) -{ - SENSORDB("[OV5647SetTestPatternMode] Test pattern enable:%d\n", bEnable); - if(bEnable) - { - OV5647_write_cmos_sensor(0x503D,0x80); - } - else - { - OV5647_write_cmos_sensor(0x503D,0x00); - } - - return ERROR_NONE; -} - -UINT32 OV5647FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; -// UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; -// UINT32 OV5647SensorRegNumber; -// UINT32 i; - //PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - //MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - //MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++=OV5647_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16=OV5647_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: /* 3 */ - *pFeatureReturnPara16++=OV5647_sensor.line_length; - *pFeatureReturnPara16=OV5647_sensor.frame_height; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: /* 3 */ - *pFeatureReturnPara32 = OV5647_sensor.pclk; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_ESHUTTER: /* 4 */ - set_OV5647_shutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - OV5647_night_mode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: /* 6 */ - OV5647_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - break; - case SENSOR_FEATURE_SET_REGISTER: - OV5647_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV5647_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - memcpy(&OV5647_sensor.eng.cct, pFeaturePara, sizeof(OV5647_sensor.eng.cct)); - break; - break; - case SENSOR_FEATURE_GET_CCT_REGISTER: /* 12 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.cct) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.cct); - memcpy(pFeaturePara, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - } - break; - case SENSOR_FEATURE_SET_ENG_REGISTER: - memcpy(&OV5647_sensor.eng.reg, pFeaturePara, sizeof(OV5647_sensor.eng.reg)); - break; - case SENSOR_FEATURE_GET_ENG_REGISTER: /* 14 */ - if (*pFeatureParaLen >= sizeof(OV5647_sensor.eng.reg) + sizeof(kal_uint32)) - { - *((kal_uint32 *)pFeaturePara++) = sizeof(OV5647_sensor.eng.reg); - memcpy(pFeaturePara, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - } - case SENSOR_FEATURE_GET_REGISTER_DEFAULT: - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->Version = NVRAM_CAMERA_SENSOR_FILE_VERSION; - ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorId = OV5647_SENSOR_ID; - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorEngReg, &OV5647_sensor.eng.reg, sizeof(OV5647_sensor.eng.reg)); - memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorCCTReg, &OV5647_sensor.eng.cct, sizeof(OV5647_sensor.eng.cct)); - *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pFeaturePara, &OV5647_sensor.cfg_data, sizeof(OV5647_sensor.cfg_data)); - *pFeatureParaLen = sizeof(OV5647_sensor.cfg_data); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - OV5647_camera_para_to_sensor(); - break; - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - OV5647_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - OV5647_get_sensor_group_count((kal_uint32 *)pFeaturePara); - *pFeatureParaLen = 4; - break; - OV5647_get_sensor_group_info((MSDK_SENSOR_GROUP_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - OV5647_get_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_SET_ITEM_INFO: - OV5647_set_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); - *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ENG_INFO: - memcpy(pFeaturePara, &OV5647_sensor.eng_info, sizeof(OV5647_sensor.eng_info)); - *pFeatureParaLen = sizeof(OV5647_sensor.eng_info); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV5647SetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV5642GetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - OV5647SetAutoFlickerMode((BOOL)*pFeatureData16,*(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV5647SetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: - *pFeatureReturnPara32= OV5647_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - default: - break; - } - return ERROR_NONE; -} /* OV5647FeatureControl() */ -SENSOR_FUNCTION_STRUCT SensorFuncOV5647= -{ - OV5647Open, - OV5647GetInfo, - OV5647GetResolution, - OV5647FeatureControl, - OV5647Control, - OV5647Close -}; - -UINT32 OV5647SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - /* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV5647; - - return ERROR_NONE; -} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/Makefile b/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/Makefile deleted file mode 100644 index 84964eb7256..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom - -obj-y += ov56702ndmipi_Sensor.o - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipi_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipi_Sensor.c deleted file mode 100644 index c8bbc262e68..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipi_Sensor.c +++ /dev/null @@ -1,2140 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * OV56702NDmipi_Sensor.c - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "ov56702ndmipi_Sensor.h" - -#include "ov56702ndmipiraw_Camera_Sensor_para.h" -#include "ov56702ndmipiraw_CameraCustomized.h" -static DEFINE_SPINLOCK(ov56702ndmipiraw_drv_lock); -static int module_id = 0; - -#define OV56702ND_DEBUG -#ifdef OV56702ND_DEBUG - #define OV56702NDDB(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG, "[OV56702NDRaw] ", fmt, ##arg) -#else - #define OV56702NDDB(fmt, arg...) -#endif - - -kal_uint32 OV56702ND_FeatureControl_PERIOD_PixelNum=OV56702ND_PV_PERIOD_PIXEL_NUMS; -kal_uint32 OV56702ND_FeatureControl_PERIOD_LineNum=OV56702ND_PV_PERIOD_LINE_NUMS; - -UINT16 OV56702ND_VIDEO_MODE_TARGET_FPS = 30; - -MSDK_SCENARIO_ID_ENUM OV56702NDCurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; -MSDK_SENSOR_CONFIG_STRUCT OV56702NDSensorConfigData; -static OV56702ND_PARA_STRUCT OV56702ND; -kal_uint32 OV56702ND_FAC_SENSOR_REG; - - -SENSOR_REG_STRUCT OV56702NDSensorCCT[]=CAMERA_SENSOR_CCT_DEFAULT_VALUE; -SENSOR_REG_STRUCT OV56702NDSensorReg[ENGINEER_END]=CAMERA_SENSOR_REG_DEFAULT_VALUE; - - -#define OV56702ND_TEST_PATTERN_CHECKSUM 0xca3667da //0x5d8082f0 //0x75bef806 //0xa2230d9f //0xf5e2f1ce -kal_bool OV56702ND_During_testpattern = KAL_FALSE; - -extern int iReadReg(u16 a_u2Addr , u8 * a_puBuff , u16 i2cId); -extern int iWriteReg(u16 a_u2Addr , u32 a_u4Data , u32 a_u4Bytes , u16 i2cId); - -#define OV56702ND_write_cmos_sensor(addr, para) iWriteReg((u16) addr , (u32) para , 1, OV56702NDMIPI_WRITE_ID) - -kal_uint16 OV56702ND_read_cmos_sensor(kal_uint32 addr) -{ -kal_uint16 get_byte=0; - iReadReg((u16) addr ,(u8*)&get_byte,OV56702NDMIPI_WRITE_ID); - return get_byte; -} - - -void OV56702ND_Init_Para(void) -{ - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorMode = SENSOR_MODE_INIT; - OV56702ND.OV56702NDAutoFlickerMode = KAL_FALSE; - OV56702ND.OV56702NDVideoMode = KAL_FALSE; - OV56702ND.DummyLines= 0; - OV56702ND.DummyPixels= 0; - OV56702ND.pvPclk = (10285); - OV56702ND.videoPclk = (10285); - OV56702ND.capPclk = (10285); - - OV56702ND.shutter = 0x4C00; - OV56702ND.ispBaseGain = BASEGAIN; - OV56702ND.sensorGlobalGain = 0x0200; - spin_unlock(&ov56702ndmipiraw_drv_lock); -} - -#define RG_Ratio_Typical 264 -#define BG_Ratio_Typical 236 - -struct otp_struct { - int flag; // bit[7]: info, bit[6]:wb - int module_integrator_id; - int lens_id; - int production_year; - int production_month; - int production_day; - int rg_ratio; - int bg_ratio; -}; - - -static void otp_i2c_write( uint32_t addr, kal_uint16 data) -{ - OV56702ND_write_cmos_sensor(addr, data); -} - -static kal_uint16 otp_i2c_read(uint32_t addr) - -{ - return OV56702ND_read_cmos_sensor(addr); -} - - -// return value: -// bit[7]: 0 no otp info, 1 valid otp info -// bit[6]: 0 no otp wb, 1 valib otp wb -static int read_otp(struct otp_struct *otp_ptr) -{ - int otp_flag, addr, temp, i; - //set 0x5002[3] to “0†- int temp1; - - temp1 = otp_i2c_read(0x5002); - otp_i2c_write(0x5002, (0x00 & 0x08) | (temp1 & (~0x08))); - - // read OTP into buffer - otp_i2c_write(0x3d84, 0xC0); - otp_i2c_write(0x3d88, 0x70); // OTP start address - otp_i2c_write(0x3d89, 0x10); - otp_i2c_write(0x3d8A, 0x70); // OTP end address - otp_i2c_write(0x3d8B, 0x29); - otp_i2c_write(0x3d81, 0x01); // load otp into buffer - mdelay(5); - - // OTP into - otp_flag = otp_i2c_read(0x7010); - addr = 0; - - if((otp_flag & 0xc0) == 0x40) { - addr = 0x7011; // base address of info group 1 - } else if((otp_flag & 0x30) == 0x10) { - addr = 0x7016; // base address of info group 2 - }else if((otp_flag & 0x0c) == 0x04) { - addr = 0x701b; // base address of info group 3 - } - - if(addr != 0) { - (*otp_ptr).flag = 0x80; // valid base info in OTP - (*otp_ptr).module_integrator_id = otp_i2c_read( addr ); - (*otp_ptr).lens_id = otp_i2c_read( addr + 1); - (*otp_ptr).production_year = otp_i2c_read( addr + 2); - (*otp_ptr).production_month = otp_i2c_read( addr + 3); - (*otp_ptr).production_day = otp_i2c_read( addr + 4); - } else { - (*otp_ptr).flag = 0x00; // not info in OTP - (*otp_ptr).module_integrator_id = 0; - (*otp_ptr).lens_id = 0; - (*otp_ptr).production_year = 0; - (*otp_ptr).production_month = 0; - (*otp_ptr).production_day = 0; - } - - module_id = (*otp_ptr).module_integrator_id; - // OTP WB Calibration - otp_flag = otp_i2c_read(0x7020); - addr = 0; - - if((otp_flag & 0xc0) == 0x40) { - addr = 0x7021; // base address of WB Calibration group 1 - }else if((otp_flag & 0x30) == 0x10) { - addr = 0x7024; // base address of WB Calibration group 2 - }else if((otp_flag & 0x0c) == 0x04) { - addr = 0x7027; // base address of WB Calibration group 3 - } - - if(addr != 0) { - (*otp_ptr).flag |= 0x40; - temp = otp_i2c_read( addr + 2); - (*otp_ptr).rg_ratio = (otp_i2c_read(addr)<<2) + ((temp>>6) & 0x03); - (*otp_ptr).bg_ratio = (otp_i2c_read( addr + 1)<<2) + ((temp>>4) & 0x03); - }else { - (*otp_ptr).rg_ratio = 0; - (*otp_ptr).bg_ratio = 0; - } - - for(i=0x7010;i<=0x7029;i++) { - otp_i2c_write(i,0); // clear OTP buffer, recommended use continuous write to accelarate - } - - //set 0x5002[3] to “1†- temp1 = otp_i2c_read(0x5002); - otp_i2c_write(0x5002, (0x02 & 0x08) | (temp1 & (~0x08))); - return (*otp_ptr).flag ; -} - -static int apply_otp(struct otp_struct *otp_ptr) -{ - int rg, bg, R_gain, G_gain, B_gain, Base_gain; - - // apply OTP WB Calibration - if ((*otp_ptr).flag & 0x40) { - rg = (*otp_ptr). rg_ratio; - bg = (*otp_ptr).bg_ratio; - //calculate G gain - R_gain = (RG_Ratio_Typical*1000) / rg; - B_gain = (BG_Ratio_Typical*1000) / bg; - G_gain = 1000; - - if (R_gain < 1000 || B_gain < 1000) - { - if (R_gain < B_gain) - Base_gain = R_gain; - else - Base_gain = B_gain; - } - else - { - Base_gain = G_gain; - } - - R_gain = 0x400 * R_gain / (Base_gain); - B_gain = 0x400 * B_gain / (Base_gain); - G_gain = 0x400 * G_gain / (Base_gain); - // update sensor WB gain - if (R_gain>0x400) { - otp_i2c_write(0x5032, R_gain>>8); - otp_i2c_write(0x5033, R_gain & 0x00ff); - } - if (G_gain>0x400) { - otp_i2c_write(0x5034, G_gain>>8); - otp_i2c_write(0x5035, G_gain & 0x00ff); - } - if (B_gain>0x400) { - otp_i2c_write(0x5036, B_gain>>8); - otp_i2c_write(0x5037, B_gain & 0x00ff); - } - } - return (*otp_ptr).flag ; -} - -void ov56702nd_otp_config() -{ - struct otp_struct otp_info ; - - read_otp(&otp_info); - apply_otp(&otp_info) ; -} -kal_uint32 GetOV56702NDLineLength(void) -{ - kal_uint32 OV56702ND_line_length = 0; - if ( SENSOR_MODE_PREVIEW == OV56702ND.sensorMode ) - { - OV56702ND_line_length = OV56702ND_PV_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels; - } - else if( SENSOR_MODE_VIDEO == OV56702ND.sensorMode ) - { - OV56702ND_line_length = OV56702ND_VIDEO_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels; - } - else - { - OV56702ND_line_length = OV56702ND_FULL_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels; - } - - return OV56702ND_line_length; - -} - - -kal_uint32 GetOV56702NDFrameLength(void) -{ - kal_uint32 OV56702ND_frame_length = 0; - - if ( SENSOR_MODE_PREVIEW == OV56702ND.sensorMode ) - { - OV56702ND_frame_length = OV56702ND_PV_PERIOD_LINE_NUMS + OV56702ND.DummyLines ; - } - else if( SENSOR_MODE_VIDEO == OV56702ND.sensorMode ) - { - OV56702ND_frame_length = OV56702ND_VIDEO_PERIOD_LINE_NUMS + OV56702ND.DummyLines ; - } - else - { - OV56702ND_frame_length = OV56702ND_FULL_PERIOD_LINE_NUMS + OV56702ND.DummyLines ; - } - - return OV56702ND_frame_length; -} - - -kal_uint32 OV56702ND_CalcExtra_For_ShutterMargin(kal_uint32 shutter_value,kal_uint32 shutterLimitation) -{ - kal_uint32 extra_lines = 0; - - - if (shutter_value <4 ){ - shutter_value = 4; - } - - - if (shutter_value > shutterLimitation) - { - extra_lines = shutter_value - shutterLimitation; - } - else - extra_lines = 0; - - return extra_lines; - -} - - -kal_uint32 OV56702ND_CalcFrameLength_For_AutoFlicker(void) -{ - - kal_uint32 AutoFlicker_min_framelength = 0; - - switch(OV56702NDCurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_ZSD: - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - AutoFlicker_min_framelength = (OV56702ND.capPclk*10000) /(OV56702ND_FULL_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels)/OV56702ND_AUTOFLICKER_OFFSET_25*10 ; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - if(OV56702ND_VIDEO_MODE_TARGET_FPS==30) - { - AutoFlicker_min_framelength = (OV56702ND.videoPclk*10000) /(OV56702ND_VIDEO_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels)/OV56702ND_AUTOFLICKER_OFFSET_30*10 ; - } - else if(OV56702ND_VIDEO_MODE_TARGET_FPS==15) - { - AutoFlicker_min_framelength = (OV56702ND.videoPclk*10000) /(OV56702ND_VIDEO_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels)/OV56702ND_AUTOFLICKER_OFFSET_15*10 ; - } - else - { - AutoFlicker_min_framelength = OV56702ND_VIDEO_PERIOD_LINE_NUMS + OV56702ND.DummyLines; - } - break; - - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - default: - AutoFlicker_min_framelength = (OV56702ND.pvPclk*10000) /(OV56702ND_PV_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels)/OV56702ND_AUTOFLICKER_OFFSET_30*10 ; - break; - } - - OV56702NDDB("AutoFlicker_min_framelength =%d,OV56702NDCurrentScenarioId =%d\n", AutoFlicker_min_framelength,OV56702NDCurrentScenarioId); - - return AutoFlicker_min_framelength; - -} - - -void OV56702ND_write_shutter(kal_uint32 shutter) -{ - kal_uint32 min_framelength = OV56702ND_PV_PERIOD_PIXEL_NUMS, max_shutter=0; - kal_uint32 line_length = 0; - kal_uint32 frame_length = 0; - unsigned long flags; - - //for test - //shutter = 0x7fc; //issue - - - line_length = GetOV56702NDLineLength(); - frame_length = GetOV56702NDFrameLength(); - - max_shutter = frame_length-OV56702ND_SHUTTER_MARGIN; - - frame_length = frame_length + OV56702ND_CalcExtra_For_ShutterMargin(shutter,max_shutter); - - - - if(OV56702ND.OV56702NDAutoFlickerMode == KAL_TRUE) - { - min_framelength = OV56702ND_CalcFrameLength_For_AutoFlicker(); - - if(frame_length < min_framelength) - frame_length = min_framelength; - } - - - spin_lock_irqsave(&ov56702ndmipiraw_drv_lock,flags); - OV56702ND_FeatureControl_PERIOD_PixelNum = line_length; - OV56702ND_FeatureControl_PERIOD_LineNum = frame_length; - spin_unlock_irqrestore(&ov56702ndmipiraw_drv_lock,flags); - - //Set total frame length //VTS - OV56702ND_write_cmos_sensor(0x380e, (frame_length >> 8) & 0xFF); - OV56702ND_write_cmos_sensor(0x380f, frame_length & 0xFF); - - //Set shutter - OV56702ND_write_cmos_sensor(0x3500, (shutter>>12) & 0x0F); - OV56702ND_write_cmos_sensor(0x3501, (shutter>>4) & 0xFF); - OV56702ND_write_cmos_sensor(0x3502, (shutter<<4) & 0xF0); /* Don't use the fraction part. */ - - OV56702NDDB("ov56702nd write shutter=%x, line_length=%x, frame_length=%x\n", shutter, line_length, frame_length); - -} - - -static kal_uint16 OV56702NDReg2Gain(const kal_uint16 iReg) -{ - kal_uint16 iGain =0; - - iGain = iReg*BASEGAIN/OV56702ND_GAIN_BASE; - return iGain; - -} - -static kal_uint16 OV56702NDGain2Reg(const kal_uint16 Gain) -{ - kal_uint32 iReg = 0x0000; - kal_uint32 TempGain = BASEGAIN; - - - TempGain = Gain; - if(TempGain < BASEGAIN){ - TempGain = BASEGAIN; - //OV56702NDDB("###ov56702nd write gain underflow### Gain =%x\n", Gain); - } - if(TempGain > 16*BASEGAIN){ - TempGain = 16*BASEGAIN; - //OV56702NDDB("###ov56702nd write gain overflow### Gain =%x\n", Gain); - } - - iReg = (TempGain*OV56702ND_GAIN_BASE)/BASEGAIN; - - //iReg = ((TempGain /BASEGAIN)<<7)+((TempGain % BASEGAIN)<<7/BASEGAIN); - iReg = iReg & 0xFFFF; - - //OV56702NDDB("###ov56702nd write Reg ### iReg =%x\n", iReg); - - return iReg; - -} - -void write_OV56702ND_gain(kal_uint16 gain) -{ - kal_uint16 iGain =1; - kal_uint8 ChangeFlag=0x01; - - kal_uint16 read_gain; - - iGain=(gain / OV56702ND_GAIN_BASE); - - if(iGain<2){ - ChangeFlag= 0x00; - } - else if(iGain<4){ - ChangeFlag= 0x01; - } - else if(iGain<8){ - ChangeFlag= 0x03; - } - else{ - ChangeFlag= 0x07; - } - - //ChangeFlag= 0x07; - - OV56702ND_write_cmos_sensor(0x301d, 0xf0); - OV56702ND_write_cmos_sensor(0x3209, 0x00); - OV56702ND_write_cmos_sensor(0x320a, 0x01); - - //group write hold - //group 0:delay 0x366a for one frame,then active with gain - OV56702ND_write_cmos_sensor(0x3208, 0x00); - OV56702ND_write_cmos_sensor(0x366a, ChangeFlag); - OV56702ND_write_cmos_sensor(0x3208, 0x10); - - //group 1:all other registers( gain) - OV56702ND_write_cmos_sensor(0x3208, 0x01); - OV56702ND_write_cmos_sensor(0x3508,(gain>>8)); - OV56702ND_write_cmos_sensor(0x3509,(gain&0xff)); - - OV56702ND_write_cmos_sensor(0x3208, 0x11); - - //group lanch - OV56702ND_write_cmos_sensor(0x320B, 0x15); - OV56702ND_write_cmos_sensor(0x3208, 0xA1); - - //read_gain=(((OV56702ND_read_cmos_sensor(0x3508)&0x1F) << 8) | OV56702ND_read_cmos_sensor(0x3509)); - //OV56702NDDB("[OV56702ND_SetGain]0x3508|0x3509=0x%x \n",read_gain); - //OV56702NDDB("[OV56702ND_SetGain]0x366a=%d \n",(OV56702ND_read_cmos_sensor(0x366a))); - - return; - -} - -void OV56702ND_SetGain(UINT16 iGain) -{ - unsigned long flags; - spin_lock_irqsave(&ov56702ndmipiraw_drv_lock,flags); - - OV56702NDDB("OV56702ND_SetGain iGain = %d :\n ",iGain); - - OV56702ND.realGain = iGain; - OV56702ND.sensorGlobalGain = OV56702NDGain2Reg(iGain); - spin_unlock_irqrestore(&ov56702ndmipiraw_drv_lock,flags); - - write_OV56702ND_gain(OV56702ND.sensorGlobalGain); - OV56702NDDB(" [OV56702ND_SetGain]OV56702ND.sensorGlobalGain=0x%x,OV56702ND.realGain =%d",OV56702ND.sensorGlobalGain, - OV56702ND.realGain); - - //temperature test - //OV56702ND_write_cmos_sensor(0x4d12,0x01); - //OV56702NDDB("Temperature read_reg 0x4d13 =%x \n",OV56702ND_read_cmos_sensor(0x4d13)); -} - -kal_uint16 read_OV56702ND_gain(void) -{ - kal_uint16 read_gain=0; - - read_gain=(((OV56702ND_read_cmos_sensor(0x3508)&0x1F) << 8) | OV56702ND_read_cmos_sensor(0x3509)); - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorGlobalGain = read_gain; - OV56702ND.realGain = OV56702NDReg2Gain(OV56702ND.sensorGlobalGain); - spin_unlock(&ov56702ndmipiraw_drv_lock); - - OV56702NDDB("OV56702ND.sensorGlobalGain=0x%x,OV56702ND.realGain=%d\n",OV56702ND.sensorGlobalGain,OV56702ND.realGain); - - return OV56702ND.sensorGlobalGain; -} - - -#if 1 -void OV56702ND_camera_para_to_sensor(void) -{ - kal_uint32 i; - for(i=0; 0xFFFFFFFF!=OV56702NDSensorReg[i].Addr; i++) - { - OV56702ND_write_cmos_sensor(OV56702NDSensorReg[i].Addr, OV56702NDSensorReg[i].Para); - } - for(i=ENGINEER_START_ADDR; 0xFFFFFFFF!=OV56702NDSensorReg[i].Addr; i++) - { - OV56702ND_write_cmos_sensor(OV56702NDSensorReg[i].Addr, OV56702NDSensorReg[i].Para); - } - for(i=FACTORY_START_ADDR; iItemNamePtr,"Pregain-R"); - temp_addr = PRE_GAIN_R_INDEX; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gr"); - temp_addr = PRE_GAIN_Gr_INDEX; - break; - case 2: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gb"); - temp_addr = PRE_GAIN_Gb_INDEX; - break; - case 3: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-B"); - temp_addr = PRE_GAIN_B_INDEX; - break; - case 4: - sprintf((char *)info_ptr->ItemNamePtr,"SENSOR_BASEGAIN"); - temp_addr = SENSOR_BASEGAIN; - break; - default: - ASSERT(0); - } - - temp_para= OV56702NDSensorCCT[temp_addr].Para; - //temp_gain= (temp_para/OV56702ND.sensorBaseGain) * 1000; - - info_ptr->ItemValue=temp_gain; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min= OV56702ND_MIN_ANALOG_GAIN * 1000; - info_ptr->Max= OV56702ND_MAX_ANALOG_GAIN * 1000; - break; - case CMMCLK_CURRENT: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"Drv Cur[2,4,6,8]mA"); - - //temp_reg=MT9P017SensorReg[CMMCLK_CURRENT_INDEX].Para; - temp_reg = ISP_DRIVING_2MA; - if(temp_reg==ISP_DRIVING_2MA) - { - info_ptr->ItemValue=2; - } - else if(temp_reg==ISP_DRIVING_4MA) - { - info_ptr->ItemValue=4; - } - else if(temp_reg==ISP_DRIVING_6MA) - { - info_ptr->ItemValue=6; - } - else if(temp_reg==ISP_DRIVING_8MA) - { - info_ptr->ItemValue=8; - } - - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_TRUE; - info_ptr->Min=2; - info_ptr->Max=8; - break; - default: - ASSERT(0); - } - break; - case FRAME_RATE_LIMITATION: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"Max Exposure Lines"); - info_ptr->ItemValue= 111; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_TRUE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"Min Frame Rate"); - info_ptr->ItemValue=12; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_TRUE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0; - break; - default: - ASSERT(0); - } - break; - case REGISTER_EDITOR: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"REG Addr."); - info_ptr->ItemValue=0; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0xFFFF; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"REG Value"); - info_ptr->ItemValue=0; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0xFFFF; - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - - - -kal_bool OV56702ND_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 ItemValue) -{ - kal_uint16 temp_gain=0,temp_addr=0, temp_para=0; - - switch (group_idx) - { - case PRE_GAIN: - switch (item_idx) - { - case 0: - temp_addr = PRE_GAIN_R_INDEX; - break; - case 1: - temp_addr = PRE_GAIN_Gr_INDEX; - break; - case 2: - temp_addr = PRE_GAIN_Gb_INDEX; - break; - case 3: - temp_addr = PRE_GAIN_B_INDEX; - break; - case 4: - temp_addr = SENSOR_BASEGAIN; - break; - default: - ASSERT(0); - } - - temp_gain=((ItemValue*BASEGAIN+500)/1000); //+500:get closed integer value - - if(temp_gain>=1*BASEGAIN && temp_gain<=16*BASEGAIN) - { -// temp_para=(temp_gain * OV56702ND.sensorBaseGain + BASEGAIN/2)/BASEGAIN; - } - else - ASSERT(0); - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702NDSensorCCT[temp_addr].Para = temp_para; - spin_unlock(&ov56702ndmipiraw_drv_lock); - OV56702ND_write_cmos_sensor(OV56702NDSensorCCT[temp_addr].Addr,temp_para); - - break; - case CMMCLK_CURRENT: - switch (item_idx) - { - case 0: - //no need to apply this item for driving current - break; - default: - ASSERT(0); - } - break; - case FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case REGISTER_EDITOR: - switch (item_idx) - { - case 0: - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND_FAC_SENSOR_REG=ItemValue; - spin_unlock(&ov56702ndmipiraw_drv_lock); - break; - case 1: - OV56702ND_write_cmos_sensor(OV56702ND_FAC_SENSOR_REG,ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} -#endif - - -static void OV56702ND_SetDummy( const kal_uint32 iPixels, const kal_uint32 iLines ) -{ - kal_uint32 line_length = 0; - kal_uint32 frame_length = 0; - - if ( SENSOR_MODE_PREVIEW == OV56702ND.sensorMode ) - { - line_length = OV56702ND_PV_PERIOD_PIXEL_NUMS + iPixels; - frame_length = OV56702ND_PV_PERIOD_LINE_NUMS + iLines; - } - else if( SENSOR_MODE_VIDEO== OV56702ND.sensorMode ) - { - line_length = OV56702ND_VIDEO_PERIOD_PIXEL_NUMS + iPixels; - frame_length = OV56702ND_VIDEO_PERIOD_LINE_NUMS + iLines; - } - else - { - line_length = OV56702ND_FULL_PERIOD_PIXEL_NUMS + iPixels; - frame_length = OV56702ND_FULL_PERIOD_LINE_NUMS + iLines; - } - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND_FeatureControl_PERIOD_PixelNum = line_length; - OV56702ND_FeatureControl_PERIOD_LineNum = frame_length; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - //Set total frame length - OV56702ND_write_cmos_sensor(0x380e, (frame_length >> 8) & 0xFF); - OV56702ND_write_cmos_sensor(0x380f, frame_length & 0xFF); - //Set total line length - OV56702ND_write_cmos_sensor(0x380c, (line_length >> 8) & 0xFF); - OV56702ND_write_cmos_sensor(0x380d, line_length & 0xFF); - -} - - -void OV56702NDPreviewSetting(void) -{ - OV56702NDDB(" OV56702NDPreviewSetting_2lane enter\n"); - - /* // - - //@@PV_Quarter_size_30fps_800Mbps/lane - //99 1296 960 - //;;102 3601 157c - //;;PCLK=HTS*VTS*fps=0x68c*0x7fd*30=1676*2045*30=102.85M - - OV56702ND_write_cmos_sensor(0x0100, 0x00); // - - OV56702ND_write_cmos_sensor(0x3501, 0x3d); // - OV56702ND_write_cmos_sensor(0x366e, 0x08); // - OV56702ND_write_cmos_sensor(0x370b, 0x1b); // - OV56702ND_write_cmos_sensor(0x3808, 0x05); // - OV56702ND_write_cmos_sensor(0x3809, 0x10); // - OV56702ND_write_cmos_sensor(0x380a, 0x03); // - OV56702ND_write_cmos_sensor(0x380b, 0xc0); // - OV56702ND_write_cmos_sensor(0x380c, 0x06); // - OV56702ND_write_cmos_sensor(0x380d, 0x8c); // - OV56702ND_write_cmos_sensor(0x380e, 0x07); //;03 - OV56702ND_write_cmos_sensor(0x380f, 0xfd); //;e0 - OV56702ND_write_cmos_sensor(0x3814, 0x03); // - OV56702ND_write_cmos_sensor(0x3820, 0x90); // - OV56702ND_write_cmos_sensor(0x3821, 0x47); // - OV56702ND_write_cmos_sensor(0x382a, 0x03); // - OV56702ND_write_cmos_sensor(0x4009, 0x05); // - OV56702ND_write_cmos_sensor(0x4502, 0x48); // - OV56702ND_write_cmos_sensor(0x4508, 0x55); // - OV56702ND_write_cmos_sensor(0x4509, 0x55); // - OV56702ND_write_cmos_sensor(0x4600, 0x00); // - OV56702ND_write_cmos_sensor(0x4601, 0x81); // - OV56702ND_write_cmos_sensor(0x4017, 0x10); //; threshold = 4LSB for Binning sum format. - OV56702ND_write_cmos_sensor(0x400a, 0x02); //; - OV56702ND_write_cmos_sensor(0x400b, 0x00); //; - - OV56702ND_write_cmos_sensor(0x0100, 0x01); // -*/ - - //@@PV_Quarter_size_30fps_800Mbps/lane_1296x972 - //99 1296 972 - //;;102 3601 157c - //;;PCLK=HTS*VTS*fps=0x68c*0x7fd*30=1676*2045*30=102.85M - - OV56702ND_write_cmos_sensor(0x0100, 0x00); // - - OV56702ND_write_cmos_sensor(0x3501, 0x73); // - OV56702ND_write_cmos_sensor(0x3502, 0x00); // - OV56702ND_write_cmos_sensor(0x3508, 0x01); // - OV56702ND_write_cmos_sensor(0x3509, 0x80); // - OV56702ND_write_cmos_sensor(0x366e, 0x08); // - OV56702ND_write_cmos_sensor(0x370b, 0x1b); // - OV56702ND_write_cmos_sensor(0x3808, 0x05); // - OV56702ND_write_cmos_sensor(0x3809, 0x10); // - OV56702ND_write_cmos_sensor(0x380a, 0x03); // - OV56702ND_write_cmos_sensor(0x380b, 0xcc); //;c0 - OV56702ND_write_cmos_sensor(0x380c, 0x06); // - OV56702ND_write_cmos_sensor(0x380d, 0x8c); // - OV56702ND_write_cmos_sensor(0x380e, 0x07); //;03 - OV56702ND_write_cmos_sensor(0x380f, 0xfd); //;e0 - OV56702ND_write_cmos_sensor(0x3814, 0x03); // - OV56702ND_write_cmos_sensor(0x3820, 0x90); // - OV56702ND_write_cmos_sensor(0x3821, 0x47); // - OV56702ND_write_cmos_sensor(0x382a, 0x03); // - OV56702ND_write_cmos_sensor(0x3845, 0x02); // - OV56702ND_write_cmos_sensor(0x4009, 0x05); // - OV56702ND_write_cmos_sensor(0x4502, 0x48); // - OV56702ND_write_cmos_sensor(0x4508, 0x55); // - OV56702ND_write_cmos_sensor(0x4509, 0x55); // - OV56702ND_write_cmos_sensor(0x4600, 0x00); // - OV56702ND_write_cmos_sensor(0x4601, 0x81); // - OV56702ND_write_cmos_sensor(0x4017, 0x10); //; threshold = 4LSB for Binning - OV56702ND_write_cmos_sensor(0x400a, 0x02); //; - OV56702ND_write_cmos_sensor(0x400b, 0x00); //; - - OV56702ND_write_cmos_sensor(0x0100, 0x01); // -} - - -void OV56702NDVideoSetting(void) -{ - OV56702NDDB(" OV56702NDvideoSetting_2lane enter:video/preview sync\n"); - - OV56702NDPreviewSetting(); -} - - - -void OV56702NDCaptureSetting(void) -{ - OV56702NDDB("OV56702NDCaptureSetting_2lane enter\n"); - - OV56702ND_write_cmos_sensor(0x0100, 0x00); - - OV56702ND_write_cmos_sensor(0x3501, 0x5f); //long exposure - OV56702ND_write_cmos_sensor(0x3502, 0xd0); //long exposure - - OV56702ND_write_cmos_sensor(0x3508, 0x03); //gain - OV56702ND_write_cmos_sensor(0x3509, 0x00); //gain - - OV56702ND_write_cmos_sensor(0x366e, 0x10); - OV56702ND_write_cmos_sensor(0x370b, 0x1b); - OV56702ND_write_cmos_sensor(0x3808, 0x0a); - OV56702ND_write_cmos_sensor(0x3809, 0x20); - OV56702ND_write_cmos_sensor(0x380a, 0x07); - OV56702ND_write_cmos_sensor(0x380b, 0x98); - OV56702ND_write_cmos_sensor(0x380c, 0x07); //;06 - OV56702ND_write_cmos_sensor(0x380d, 0xdc); //;8c - OV56702ND_write_cmos_sensor(0x380e, 0x07); - OV56702ND_write_cmos_sensor(0x380f, 0xfd); - OV56702ND_write_cmos_sensor(0x3814, 0x01); - OV56702ND_write_cmos_sensor(0x3820, 0x80); - OV56702ND_write_cmos_sensor(0x3821, 0x46); - OV56702ND_write_cmos_sensor(0x382a, 0x01); - - OV56702ND_write_cmos_sensor(0x3845, 0x00); //v_offset for auto size mode - - OV56702ND_write_cmos_sensor(0x4009, 0x0d); - OV56702ND_write_cmos_sensor(0x4502, 0x40); - OV56702ND_write_cmos_sensor(0x4508, 0xaa); - OV56702ND_write_cmos_sensor(0x4509, 0xaa); - OV56702ND_write_cmos_sensor(0x4600, 0x01); - OV56702ND_write_cmos_sensor(0x4601, 0x03); - OV56702ND_write_cmos_sensor(0x4017, 0x08); //threshold= 2LSB for full size - OV56702ND_write_cmos_sensor(0x400a, 0x02); // - OV56702ND_write_cmos_sensor(0x400b, 0x00); // - - OV56702ND_write_cmos_sensor(0x0100, 0x01); - -} - - -static void OV56702ND_Sensor_Init(void) -{ - OV56702NDDB("OV56702ND_Sensor_Init_2lane enter\n"); - - OV56702ND_write_cmos_sensor(0x0103,0x01);// ; software reset - mdelay(10); - OV56702ND_write_cmos_sensor(0x0100, 0x00);// ; software standby - OV56702ND_write_cmos_sensor(0x0100, 0x00); - OV56702ND_write_cmos_sensor(0x0300, 0x04); - OV56702ND_write_cmos_sensor(0x0301, 0x00); - OV56702ND_write_cmos_sensor(0x0302, 0x64); //;78 - OV56702ND_write_cmos_sensor(0x0303, 0x00); - OV56702ND_write_cmos_sensor(0x0304, 0x03); - OV56702ND_write_cmos_sensor(0x0305, 0x01); - OV56702ND_write_cmos_sensor(0x0306, 0x01); - OV56702ND_write_cmos_sensor(0x030a, 0x00); - OV56702ND_write_cmos_sensor(0x030b, 0x00); - OV56702ND_write_cmos_sensor(0x030c, 0x00); - OV56702ND_write_cmos_sensor(0x030d, 0x1e); - OV56702ND_write_cmos_sensor(0x030e, 0x00); - OV56702ND_write_cmos_sensor(0x030f, 0x06); - OV56702ND_write_cmos_sensor(0x0312, 0x01); - OV56702ND_write_cmos_sensor(0x3000, 0x00); - OV56702ND_write_cmos_sensor(0x3002, 0x21); - OV56702ND_write_cmos_sensor(0x3005, 0xf0); - OV56702ND_write_cmos_sensor(0x3007, 0x00); - OV56702ND_write_cmos_sensor(0x3015, 0x0f); - OV56702ND_write_cmos_sensor(0x3018, 0x32); - OV56702ND_write_cmos_sensor(0x301a, 0xf0); - OV56702ND_write_cmos_sensor(0x301b, 0xf0); - OV56702ND_write_cmos_sensor(0x301c, 0xf0); - OV56702ND_write_cmos_sensor(0x301d, 0xf0); - OV56702ND_write_cmos_sensor(0x301e, 0xf0); - OV56702ND_write_cmos_sensor(0x3030, 0x00); - OV56702ND_write_cmos_sensor(0x3031, 0x0a); - OV56702ND_write_cmos_sensor(0x303c, 0xff); - OV56702ND_write_cmos_sensor(0x303e, 0xff); - OV56702ND_write_cmos_sensor(0x3040, 0xf0); - OV56702ND_write_cmos_sensor(0x3041, 0x00); - OV56702ND_write_cmos_sensor(0x3042, 0xf0); - OV56702ND_write_cmos_sensor(0x3106, 0x11); - OV56702ND_write_cmos_sensor(0x3500, 0x00); - OV56702ND_write_cmos_sensor(0x3501, 0x7b); - OV56702ND_write_cmos_sensor(0x3502, 0x00); - OV56702ND_write_cmos_sensor(0x3503, 0x04); - OV56702ND_write_cmos_sensor(0x3504, 0x03); - OV56702ND_write_cmos_sensor(0x3505, 0x83); - OV56702ND_write_cmos_sensor(0x3508, 0x07); - OV56702ND_write_cmos_sensor(0x3509, 0x80); - OV56702ND_write_cmos_sensor(0x350e, 0x04); - OV56702ND_write_cmos_sensor(0x350f, 0x00); - OV56702ND_write_cmos_sensor(0x3510, 0x00); - OV56702ND_write_cmos_sensor(0x3511, 0x02); - OV56702ND_write_cmos_sensor(0x3512, 0x00); - OV56702ND_write_cmos_sensor(0x3601, 0xc8); - OV56702ND_write_cmos_sensor(0x3610, 0x88); - OV56702ND_write_cmos_sensor(0x3612, 0x48); - OV56702ND_write_cmos_sensor(0x3614, 0x5b); - OV56702ND_write_cmos_sensor(0x3615, 0x96); - OV56702ND_write_cmos_sensor(0x3621, 0xd0); - OV56702ND_write_cmos_sensor(0x3622, 0x00); - OV56702ND_write_cmos_sensor(0x3623, 0x00); - OV56702ND_write_cmos_sensor(0x3633, 0x13); - OV56702ND_write_cmos_sensor(0x3634, 0x13); - OV56702ND_write_cmos_sensor(0x3635, 0x13); - OV56702ND_write_cmos_sensor(0x3636, 0x13); - OV56702ND_write_cmos_sensor(0x3645, 0x13); - OV56702ND_write_cmos_sensor(0x3646, 0x82); - OV56702ND_write_cmos_sensor(0x3650, 0x00); - OV56702ND_write_cmos_sensor(0x3652, 0xff); - OV56702ND_write_cmos_sensor(0x3655, 0x20); - OV56702ND_write_cmos_sensor(0x3656, 0xff); - OV56702ND_write_cmos_sensor(0x365a, 0xff); - OV56702ND_write_cmos_sensor(0x365e, 0xff); - OV56702ND_write_cmos_sensor(0x3668, 0x00); - OV56702ND_write_cmos_sensor(0x366a, 0x07); - OV56702ND_write_cmos_sensor(0x366e, 0x10); - OV56702ND_write_cmos_sensor(0x366d, 0x00); - OV56702ND_write_cmos_sensor(0x366f, 0x80); - OV56702ND_write_cmos_sensor(0x3700, 0x28); - OV56702ND_write_cmos_sensor(0x3701, 0x10); - OV56702ND_write_cmos_sensor(0x3702, 0x3a); - OV56702ND_write_cmos_sensor(0x3703, 0x19); - OV56702ND_write_cmos_sensor(0x3704, 0x10); - OV56702ND_write_cmos_sensor(0x3705, 0x00); - OV56702ND_write_cmos_sensor(0x3706, 0x66); - OV56702ND_write_cmos_sensor(0x3707, 0x08); - OV56702ND_write_cmos_sensor(0x3708, 0x34); - OV56702ND_write_cmos_sensor(0x3709, 0x40); - OV56702ND_write_cmos_sensor(0x370a, 0x01); - OV56702ND_write_cmos_sensor(0x370b, 0x1b); - OV56702ND_write_cmos_sensor(0x3714, 0x24); - OV56702ND_write_cmos_sensor(0x371a, 0x3e); - OV56702ND_write_cmos_sensor(0x3733, 0x00); - OV56702ND_write_cmos_sensor(0x3734, 0x00); - OV56702ND_write_cmos_sensor(0x373a, 0x05); - OV56702ND_write_cmos_sensor(0x373b, 0x06); - OV56702ND_write_cmos_sensor(0x373c, 0x0a); - OV56702ND_write_cmos_sensor(0x373f, 0xa0); - OV56702ND_write_cmos_sensor(0x3755, 0x00); - OV56702ND_write_cmos_sensor(0x3758, 0x00); - OV56702ND_write_cmos_sensor(0x375b, 0x0e); - OV56702ND_write_cmos_sensor(0x3766, 0x5f); - OV56702ND_write_cmos_sensor(0x3768, 0x00); - OV56702ND_write_cmos_sensor(0x3769, 0x22); - OV56702ND_write_cmos_sensor(0x3773, 0x08); - OV56702ND_write_cmos_sensor(0x3774, 0x1f); - OV56702ND_write_cmos_sensor(0x3776, 0x06); - OV56702ND_write_cmos_sensor(0x37a0, 0x88); - OV56702ND_write_cmos_sensor(0x37a1, 0x5c); - OV56702ND_write_cmos_sensor(0x37a7, 0x88); - OV56702ND_write_cmos_sensor(0x37a8, 0x70); - OV56702ND_write_cmos_sensor(0x37aa, 0x88); - OV56702ND_write_cmos_sensor(0x37ab, 0x48); - OV56702ND_write_cmos_sensor(0x37b3, 0x66); - OV56702ND_write_cmos_sensor(0x37c2, 0x04); - OV56702ND_write_cmos_sensor(0x37c5, 0x00); - OV56702ND_write_cmos_sensor(0x37c8, 0x00); - OV56702ND_write_cmos_sensor(0x3800, 0x00); - OV56702ND_write_cmos_sensor(0x3801, 0x0c); - OV56702ND_write_cmos_sensor(0x3802, 0x00); - OV56702ND_write_cmos_sensor(0x3803, 0x04); - OV56702ND_write_cmos_sensor(0x3804, 0x0a); - OV56702ND_write_cmos_sensor(0x3805, 0x33); - OV56702ND_write_cmos_sensor(0x3806, 0x07); - OV56702ND_write_cmos_sensor(0x3807, 0xa3); - OV56702ND_write_cmos_sensor(0x3808, 0x0a); - OV56702ND_write_cmos_sensor(0x3809, 0x20); - OV56702ND_write_cmos_sensor(0x380a, 0x07); - OV56702ND_write_cmos_sensor(0x380b, 0x98); - OV56702ND_write_cmos_sensor(0x380c, 0x07); // ;06 - OV56702ND_write_cmos_sensor(0x380d, 0xdc); // ;8c - OV56702ND_write_cmos_sensor(0x380e, 0x07); - OV56702ND_write_cmos_sensor(0x380f, 0xb8); - OV56702ND_write_cmos_sensor(0x3811, 0x04); - OV56702ND_write_cmos_sensor(0x3813, 0x02); - OV56702ND_write_cmos_sensor(0x3814, 0x01); - OV56702ND_write_cmos_sensor(0x3815, 0x01); - OV56702ND_write_cmos_sensor(0x3816, 0x00); - OV56702ND_write_cmos_sensor(0x3817, 0x00); - OV56702ND_write_cmos_sensor(0x3818, 0x00); - OV56702ND_write_cmos_sensor(0x3819, 0x00); - OV56702ND_write_cmos_sensor(0x3820, 0x80); - OV56702ND_write_cmos_sensor(0x3821, 0x46); - OV56702ND_write_cmos_sensor(0x3822, 0x48); - OV56702ND_write_cmos_sensor(0x3826, 0x00); - OV56702ND_write_cmos_sensor(0x3827, 0x08); - OV56702ND_write_cmos_sensor(0x382a, 0x01); - OV56702ND_write_cmos_sensor(0x382b, 0x01); - OV56702ND_write_cmos_sensor(0x3830, 0x08); - OV56702ND_write_cmos_sensor(0x3836, 0x02); - OV56702ND_write_cmos_sensor(0x3837, 0x00); - OV56702ND_write_cmos_sensor(0x3838, 0x10); - OV56702ND_write_cmos_sensor(0x3841, 0xff); - OV56702ND_write_cmos_sensor(0x3846, 0x48); - OV56702ND_write_cmos_sensor(0x3861, 0x00); - OV56702ND_write_cmos_sensor(0x3862, 0x04);//x00); - OV56702ND_write_cmos_sensor(0x3863, 0x06);//0x18); - OV56702ND_write_cmos_sensor(0x3a11, 0x01); - OV56702ND_write_cmos_sensor(0x3a12, 0x78); - OV56702ND_write_cmos_sensor(0x3b00, 0x00); - OV56702ND_write_cmos_sensor(0x3b02, 0x00); - OV56702ND_write_cmos_sensor(0x3b03, 0x00); - OV56702ND_write_cmos_sensor(0x3b04, 0x00); - OV56702ND_write_cmos_sensor(0x3b05, 0x00); - OV56702ND_write_cmos_sensor(0x3c00, 0x89); - OV56702ND_write_cmos_sensor(0x3c01, 0xab); - OV56702ND_write_cmos_sensor(0x3c02, 0x01); - OV56702ND_write_cmos_sensor(0x3c03, 0x00); - OV56702ND_write_cmos_sensor(0x3c04, 0x00); - OV56702ND_write_cmos_sensor(0x3c05, 0x03); - OV56702ND_write_cmos_sensor(0x3c06, 0x00); - OV56702ND_write_cmos_sensor(0x3c07, 0x05); - OV56702ND_write_cmos_sensor(0x3c0c, 0x00); - OV56702ND_write_cmos_sensor(0x3c0d, 0x00); - OV56702ND_write_cmos_sensor(0x3c0e, 0x00); - OV56702ND_write_cmos_sensor(0x3c0f, 0x00); - OV56702ND_write_cmos_sensor(0x3c40, 0x00); - OV56702ND_write_cmos_sensor(0x3c41, 0xa3); - OV56702ND_write_cmos_sensor(0x3c43, 0x7d); - OV56702ND_write_cmos_sensor(0x3c45, 0xd7); - OV56702ND_write_cmos_sensor(0x3c47, 0xfc); - OV56702ND_write_cmos_sensor(0x3c50, 0x05); - OV56702ND_write_cmos_sensor(0x3c52, 0xaa); - OV56702ND_write_cmos_sensor(0x3c54, 0x71); - OV56702ND_write_cmos_sensor(0x3c56, 0x80); - OV56702ND_write_cmos_sensor(0x3d85, 0x17); - OV56702ND_write_cmos_sensor(0x3f03, 0x00); - OV56702ND_write_cmos_sensor(0x3f0a, 0x00); - OV56702ND_write_cmos_sensor(0x3f0b, 0x00); - OV56702ND_write_cmos_sensor(0x4001, 0x60); - OV56702ND_write_cmos_sensor(0x4009, 0x0d); - OV56702ND_write_cmos_sensor(0x4020, 0x00); - OV56702ND_write_cmos_sensor(0x4021, 0x00); - OV56702ND_write_cmos_sensor(0x4022, 0x00); - OV56702ND_write_cmos_sensor(0x4023, 0x00); - OV56702ND_write_cmos_sensor(0x4024, 0x00); - OV56702ND_write_cmos_sensor(0x4025, 0x00); - OV56702ND_write_cmos_sensor(0x4026, 0x00); - OV56702ND_write_cmos_sensor(0x4027, 0x00); - OV56702ND_write_cmos_sensor(0x4028, 0x00); - OV56702ND_write_cmos_sensor(0x4029, 0x00); - OV56702ND_write_cmos_sensor(0x402a, 0x00); - OV56702ND_write_cmos_sensor(0x402b, 0x00); - OV56702ND_write_cmos_sensor(0x402c, 0x00); - OV56702ND_write_cmos_sensor(0x402d, 0x00); - OV56702ND_write_cmos_sensor(0x402e, 0x00); - OV56702ND_write_cmos_sensor(0x402f, 0x00); - OV56702ND_write_cmos_sensor(0x4040, 0x00); - OV56702ND_write_cmos_sensor(0x4041, 0x03);//0x00); - OV56702ND_write_cmos_sensor(0x4042, 0x00); - OV56702ND_write_cmos_sensor(0x4043, 0x7a);//0x80); - OV56702ND_write_cmos_sensor(0x4044, 0x00); - OV56702ND_write_cmos_sensor(0x4045, 0x7a);//0x80); - OV56702ND_write_cmos_sensor(0x4046, 0x00); - OV56702ND_write_cmos_sensor(0x4047, 0x7a);//0x80); - OV56702ND_write_cmos_sensor(0x4048, 0x00); - OV56702ND_write_cmos_sensor(0x4049, 0x7a);//0x80); - OV56702ND_write_cmos_sensor(0x4303, 0x00); - OV56702ND_write_cmos_sensor(0x4307, 0x30); - OV56702ND_write_cmos_sensor(0x4500, 0x58); - OV56702ND_write_cmos_sensor(0x4501, 0x04); - OV56702ND_write_cmos_sensor(0x4502, 0x40); - OV56702ND_write_cmos_sensor(0x4503, 0x10); - OV56702ND_write_cmos_sensor(0x4508, 0xaa); - OV56702ND_write_cmos_sensor(0x4509, 0xaa); - OV56702ND_write_cmos_sensor(0x450a, 0x00); - OV56702ND_write_cmos_sensor(0x450b, 0x00); - OV56702ND_write_cmos_sensor(0x4600, 0x01); - OV56702ND_write_cmos_sensor(0x4601, 0x03); - OV56702ND_write_cmos_sensor(0x4700, 0xa4); - OV56702ND_write_cmos_sensor(0x4800, 0x4c); - OV56702ND_write_cmos_sensor(0x4816, 0x53); - OV56702ND_write_cmos_sensor(0x481f, 0x40); - OV56702ND_write_cmos_sensor(0x4837, 0x14); // ;11 - OV56702ND_write_cmos_sensor(0x5000, 0x56);//0x16); - OV56702ND_write_cmos_sensor(0x5001, 0x01); - OV56702ND_write_cmos_sensor(0x5002, 0x28);//0xa8); - OV56702ND_write_cmos_sensor(0x5004, 0x0c); - OV56702ND_write_cmos_sensor(0x5006, 0x0c); - OV56702ND_write_cmos_sensor(0x5007, 0xe0); - OV56702ND_write_cmos_sensor(0x5008, 0x01); - OV56702ND_write_cmos_sensor(0x5009, 0xb0); - OV56702ND_write_cmos_sensor(0x5901, 0x00); - OV56702ND_write_cmos_sensor(0x5a01, 0x00); - OV56702ND_write_cmos_sensor(0x5a03, 0x00); - OV56702ND_write_cmos_sensor(0x5a04, 0x0c); - OV56702ND_write_cmos_sensor(0x5a05, 0xe0); - OV56702ND_write_cmos_sensor(0x5a06, 0x09); - OV56702ND_write_cmos_sensor(0x5a07, 0xb0); - OV56702ND_write_cmos_sensor(0x5a08, 0x06); - OV56702ND_write_cmos_sensor(0x5e00, 0x00); - //for BLC - OV56702ND_write_cmos_sensor(0x3734, 0x40); - OV56702ND_write_cmos_sensor(0x5b00, 0x01); - OV56702ND_write_cmos_sensor(0x5b01, 0x10); - OV56702ND_write_cmos_sensor(0x5b02, 0x01); - OV56702ND_write_cmos_sensor(0x5b03, 0xdb); - OV56702ND_write_cmos_sensor(0x3d8c, 0x71); - OV56702ND_write_cmos_sensor(0x3d8d, 0xea); - OV56702ND_write_cmos_sensor(0x4017, 0x08); - - OV56702ND_write_cmos_sensor(0x3618, 0x2a); - - //;Ally031414 - OV56702ND_write_cmos_sensor(0x3734, 0x40); // ;; Improve HFPN - OV56702ND_write_cmos_sensor(0x5b00, 0x01); // ;; [2:0] otp start addr[10:8] - OV56702ND_write_cmos_sensor(0x5b01, 0x10); // ;; [7:0] otp start addr[7:0] - OV56702ND_write_cmos_sensor(0x5b02, 0x01); // ;; [2:0] otp end addr[10:8] - OV56702ND_write_cmos_sensor(0x5b03, 0xDB); // ;; [7:0] otp end addr[7:0] - OV56702ND_write_cmos_sensor(0x3d8c, 0x71); //; Header address high byte - OV56702ND_write_cmos_sensor(0x3d8d, 0xEA); //; Header address low byte - OV56702ND_write_cmos_sensor(0x4017, 0x08); // ; threshold= 2LSB for full size - - //;Strong DPC1.53 - OV56702ND_write_cmos_sensor(0x5780, 0x3e); - OV56702ND_write_cmos_sensor(0x5781, 0x0f); - OV56702ND_write_cmos_sensor(0x5782, 0x44); - OV56702ND_write_cmos_sensor(0x5783, 0x02); - OV56702ND_write_cmos_sensor(0x5784, 0x01); - OV56702ND_write_cmos_sensor(0x5785, 0x00); - OV56702ND_write_cmos_sensor(0x5786, 0x00); - OV56702ND_write_cmos_sensor(0x5787, 0x04); - OV56702ND_write_cmos_sensor(0x5788, 0x02); - OV56702ND_write_cmos_sensor(0x5789, 0x0f); - OV56702ND_write_cmos_sensor(0x578a, 0xfd); - OV56702ND_write_cmos_sensor(0x578b, 0xf5); - OV56702ND_write_cmos_sensor(0x578c, 0xf5); - OV56702ND_write_cmos_sensor(0x578d, 0x03); - OV56702ND_write_cmos_sensor(0x578e, 0x08); - OV56702ND_write_cmos_sensor(0x578f, 0x0c); - OV56702ND_write_cmos_sensor(0x5790, 0x08); - OV56702ND_write_cmos_sensor(0x5791, 0x04); - OV56702ND_write_cmos_sensor(0x5792, 0x00); - OV56702ND_write_cmos_sensor(0x5793, 0x52); - OV56702ND_write_cmos_sensor(0x5794, 0xa3); - //;Ping - OV56702ND_write_cmos_sensor(0x380e, 0x07); //; fps fine adjustment - OV56702ND_write_cmos_sensor(0x380f, 0xfd); //; fps fine adjustment - OV56702ND_write_cmos_sensor(0x3503, 0x00); //; real gain [2] gain no delay, shutter no delay - //;added - OV56702ND_write_cmos_sensor(0x3d85, 0x17); - OV56702ND_write_cmos_sensor(0x3655, 0x20); - - OV56702ND_write_cmos_sensor(0x0100, 0x01); //;01 - - ov56702nd_otp_config(); -} - - -UINT32 OV56702NDOpen(void) -{ - - volatile signed int i; - kal_uint16 sensor_id = 0; - - OV56702NDDB("OV56702ND Open enter :\n "); - OV56702ND_write_cmos_sensor(0x0103,0x01);// Reset sensor - mdelay(2); - - for(i=0;i<2;i++) - { - sensor_id = (OV56702ND_read_cmos_sensor(0x300B)<<8)|OV56702ND_read_cmos_sensor(0x300C); - OV56702NDDB("OV56702ND READ ID :%x",sensor_id); - if(sensor_id != OV5670MIPI_SENSOR_ID) - { - return ERROR_SENSOR_CONNECT_FAIL; - }else - break; - } - - OV56702ND_Sensor_Init(); - OV56702ND_Init_Para(); - OV56702NDDB("OV56702NDOpen exit :\n "); - - return ERROR_NONE; -} - -void OV56702NDGetModuleID(void) -{ - struct otp_struct otp_info ; - - OV56702ND_write_cmos_sensor(0x0100, 0x01); //stream on - read_otp(&otp_info); - OV56702ND_write_cmos_sensor(0x0100, 0x00); //stream off -} - -UINT32 OV56702NDGetSensorID(UINT32 *sensorID) -{ - int retry = 2; - - OV56702NDDB("OV56702NDGetSensorID enter :\n "); - mdelay(5); - - do { - *sensorID = (OV56702ND_read_cmos_sensor(0x300B)<<8)|OV56702ND_read_cmos_sensor(0x300C); - if (*sensorID == OV56702NDMIPI_SENSOR_ID) - { - OV56702NDDB("Sensor ID = 0x%04x\n", *sensorID); - OV56702NDGetModuleID(); - break; - } - OV56702NDDB("Read Sensor ID Fail = 0x%04x\n", *sensorID); - retry--; - } while (retry > 0); - - if (*sensorID != OV56702NDMIPI_SENSOR_ID) { - OV56702NDDB("Read Sensor ID Fail = 0x%04x\n", *sensorID); - - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } else { - OV56702NDDB("alexadd %s module_id=%d", __func__, module_id); - if (module_id != 0x44) { - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - } - return ERROR_NONE; -} - - -void OV56702ND_SetShutter(kal_uint32 iShutter) -{ - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.shutter= iShutter; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - OV56702ND_write_shutter(iShutter); - return; -} - - - -UINT32 OV56702ND_read_shutter(void) -{ - - kal_uint16 temp_reg1, temp_reg2 ,temp_reg3; - UINT32 shutter =0; - temp_reg1 = OV56702ND_read_cmos_sensor(0x3500); // AEC[b19~b16] - temp_reg2 = OV56702ND_read_cmos_sensor(0x3501); // AEC[b15~b8] - temp_reg3 = OV56702ND_read_cmos_sensor(0x3502); // AEC[b7~b0] - - shutter = (temp_reg1 <<12)| (temp_reg2<<4)|(temp_reg3>>4); - - return shutter; -} - -void OV56702ND_NightMode(kal_bool bEnable) -{ - -} - -UINT32 OV56702NDClose(void) -{ - - return ERROR_NONE; -} - -#if 0 -void OV56702NDSetFlipMirror(kal_int32 imgMirror) -{ - kal_int16 mirror=0,flip=0; - mirror= OV56702ND_read_cmos_sensor(0x3820); - flip = OV56702ND_read_cmos_sensor(0x3821); - - switch (imgMirror) - { - case IMAGE_H_MIRROR://IMAGE_NORMAL: - OV56702ND_write_cmos_sensor(0x3820, (mirror & (0xF9)));//Set normal - OV56702ND_write_cmos_sensor(0x3821, (flip & (0xF9))); //Set normal - break; - case IMAGE_NORMAL://IMAGE_V_MIRROR: - OV56702ND_write_cmos_sensor(0x3820, (mirror & (0xF9)));//Set flip - OV56702ND_write_cmos_sensor(0x3821, (flip | (0x06))); //Set flip - break; - case IMAGE_HV_MIRROR://IMAGE_H_MIRROR: - OV56702ND_write_cmos_sensor(0x3820, (mirror |(0x06))); //Set mirror - OV56702ND_write_cmos_sensor(0x3821, (flip & (0xF9))); //Set mirror - break; - case IMAGE_V_MIRROR://IMAGE_HV_MIRROR: - OV56702ND_write_cmos_sensor(0x3820, (mirror |(0x06))); //Set mirror & flip - OV56702ND_write_cmos_sensor(0x3821, (flip |(0x06))); //Set mirror & flip - break; - } -} -#endif - - -UINT32 OV56702NDPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - OV56702NDDB("OV56702NDPreview enter:"); - - //OV56702NDPreviewSetting(); - OV56702NDCaptureSetting(); - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorMode = SENSOR_MODE_PREVIEW; - OV56702ND.DummyPixels = 0; - OV56702ND.DummyLines = 0 ; - OV56702ND_FeatureControl_PERIOD_PixelNum=OV56702ND_PV_PERIOD_PIXEL_NUMS+ OV56702ND.DummyPixels; - OV56702ND_FeatureControl_PERIOD_LineNum=OV56702ND_PV_PERIOD_LINE_NUMS+OV56702ND.DummyLines; - OV56702ND.imgMirror = sensor_config_data->SensorImageMirror; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - //OV56702NDSetFlipMirror(sensor_config_data->SensorImageMirror); - - mdelay(40);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY - OV56702NDDB("OV56702NDPreview exit:\n"); - - - return ERROR_NONE; -} - - -UINT32 OV56702NDVideo(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - OV56702NDDB("OV56702NDVideo enter:"); - - OV56702NDVideoSetting(); - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorMode = SENSOR_MODE_VIDEO; - OV56702ND_FeatureControl_PERIOD_PixelNum=OV56702ND_VIDEO_PERIOD_PIXEL_NUMS+ OV56702ND.DummyPixels; - OV56702ND_FeatureControl_PERIOD_LineNum=OV56702ND_VIDEO_PERIOD_LINE_NUMS+OV56702ND.DummyLines; - OV56702ND.imgMirror = sensor_config_data->SensorImageMirror; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - //OV56702NDSetFlipMirror(sensor_config_data->SensorImageMirror); - - mdelay(40);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY - OV56702NDDB("OV56702NDVideo exit:\n"); - return ERROR_NONE; -} - - -UINT32 OV56702NDCapture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - //kal_uint32 shutter = OV56702ND.shutter; - - if( SENSOR_MODE_CAPTURE== OV56702ND.sensorMode) - { - OV56702NDDB("OV56702NDCapture BusrtShot / ZSD!!!\n"); - } - else - { - OV56702NDDB("OV56702NDCapture enter:\n"); - - OV56702NDCaptureSetting(); - mdelay(40);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorMode = SENSOR_MODE_CAPTURE; - OV56702ND.imgMirror = sensor_config_data->SensorImageMirror; - OV56702ND.DummyPixels = 0; - OV56702ND.DummyLines = 0 ; - OV56702ND_FeatureControl_PERIOD_PixelNum = OV56702ND_FULL_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels; - OV56702ND_FeatureControl_PERIOD_LineNum = OV56702ND_FULL_PERIOD_LINE_NUMS + OV56702ND.DummyLines; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - //OV56702NDSetFlipMirror(sensor_config_data->SensorImageMirror); - - OV56702NDDB("OV56702NDCapture exit:\n"); - } - - if(OV56702ND_During_testpattern == KAL_TRUE) - { - OV56702ND_write_cmos_sensor(0x4303,0x80); - } - - return ERROR_NONE; -} - - - -UINT32 OV56702NDGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - - OV56702NDDB("OV56702NDGetResolution!!\n"); - - pSensorResolution->SensorPreviewWidth = OV56702ND_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorPreviewHeight = OV56702ND_IMAGE_SENSOR_FULL_HEIGHT; - - pSensorResolution->SensorFullWidth = OV56702ND_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight = OV56702ND_IMAGE_SENSOR_FULL_HEIGHT; - - pSensorResolution->SensorVideoWidth = OV56702ND_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight = OV56702ND_IMAGE_SENSOR_VIDEO_HEIGHT; - return ERROR_NONE; -} - -UINT32 OV56702NDGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.imgMirror = pSensorConfigData->SensorImageMirror ; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - pSensorInfo->SensorOutputDataFormat= SENSOR_OUTPUT_FORMAT_RAW_B; - - pSensorInfo->SensorClockPolarity =SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_MIPI; - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 2; - pSensorInfo->VideoDelayFrame = 2; - - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; - pSensorInfo->AEShutDelayFrame = 0; - pSensorInfo->AESensorGainDelayFrame = 0; - pSensorInfo->AEISPGainDelayFrame = 2; - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV56702ND_PV_X_START; - pSensorInfo->SensorGrabStartY = OV56702ND_PV_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV56702ND_VIDEO_X_START; - pSensorInfo->SensorGrabStartY = OV56702ND_VIDEO_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV56702ND_FULL_X_START; - pSensorInfo->SensorGrabStartY = OV56702ND_FULL_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - default: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV56702ND_PV_X_START; - pSensorInfo->SensorGrabStartY = OV56702ND_PV_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - } - - memcpy(pSensorConfigData, &OV56702NDSensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - - return ERROR_NONE; -} /* OV56702NDGetInfo() */ - - - -UINT32 OV56702NDControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702NDCurrentScenarioId = ScenarioId; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - OV56702NDDB("OV56702NDCurrentScenarioId=%d\n",OV56702NDCurrentScenarioId); - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - OV56702NDPreview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - OV56702NDDB("OV56702ND video_preiew sync\n"); - OV56702NDVideo(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV56702NDCapture(pImageWindow, pSensorConfigData); - break; - - default: - return ERROR_INVALID_SCENARIO_ID; - - } - return ERROR_NONE; -} /* OV56702NDControl() */ - - - -kal_uint32 OV56702ND_SET_FrameLength_ByVideoMode(UINT16 Video_TargetFps) -{ - UINT32 frameRate = 0; - kal_uint32 MIN_FrameLength=0; - - if(OV56702ND.OV56702NDAutoFlickerMode == KAL_TRUE) - { - if (Video_TargetFps==30) - frameRate= OV56702ND_AUTOFLICKER_OFFSET_30; - else if(Video_TargetFps==15) - frameRate= OV56702ND_AUTOFLICKER_OFFSET_15; - else - frameRate=Video_TargetFps*10; - - MIN_FrameLength = (OV56702ND.videoPclk*10000)/(OV56702ND_VIDEO_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels)/frameRate*10; - } - else - MIN_FrameLength = (OV56702ND.videoPclk*10000) /(OV56702ND_VIDEO_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels)/Video_TargetFps; - - return MIN_FrameLength; - -} - - - -UINT32 OV56702NDSetVideoMode(UINT16 u2FrameRate) -{ - - kal_uint32 MIN_Frame_length =0,frameRate=0,extralines=0; - OV56702NDDB("[OV56702NDSetVideoMode] frame rate = %d\n", u2FrameRate); - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND_VIDEO_MODE_TARGET_FPS=u2FrameRate; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - if(u2FrameRate==0) - { - OV56702NDDB("Disable Video Mode or dynimac fps\n"); - return KAL_TRUE; - } - if(u2FrameRate >30 || u2FrameRate <5) - OV56702NDDB("abmornal frame rate seting,pay attention~\n"); - - if(OV56702ND.sensorMode == SENSOR_MODE_VIDEO)//video ScenarioId recording - { - - MIN_Frame_length = OV56702ND_SET_FrameLength_ByVideoMode(u2FrameRate); - - if((MIN_Frame_length <=OV56702ND_VIDEO_PERIOD_LINE_NUMS)) - { - MIN_Frame_length = OV56702ND_VIDEO_PERIOD_LINE_NUMS; - OV56702NDDB("[OV56702NDSetVideoMode]current fps = %d\n", (OV56702ND.videoPclk*10000) /(OV56702ND_VIDEO_PERIOD_PIXEL_NUMS)/OV56702ND_VIDEO_PERIOD_LINE_NUMS); - } - OV56702NDDB("[OV56702NDSetVideoMode]current fps (10 base)= %d\n", (OV56702ND.videoPclk*10000)*10/(OV56702ND_VIDEO_PERIOD_PIXEL_NUMS + OV56702ND.DummyPixels)/MIN_Frame_length); - extralines = MIN_Frame_length - OV56702ND_VIDEO_PERIOD_LINE_NUMS; - - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.DummyPixels = 0;//define dummy pixels and lines - OV56702ND.DummyLines = extralines ; - spin_unlock(&ov56702ndmipiraw_drv_lock); - - OV56702ND_SetDummy(OV56702ND.DummyPixels,extralines); - } - - OV56702NDDB("[OV56702NDSetVideoMode]MIN_Frame_length=%d,OV56702ND.DummyLines=%d\n",MIN_Frame_length,OV56702ND.DummyLines); - - return KAL_TRUE; -} - - -UINT32 OV56702NDSetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - - if(bEnable) { - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.OV56702NDAutoFlickerMode = KAL_TRUE; - spin_unlock(&ov56702ndmipiraw_drv_lock); - OV56702NDDB("OV56702ND Enable Auto flicker\n"); - } else { - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.OV56702NDAutoFlickerMode = KAL_FALSE; - spin_unlock(&ov56702ndmipiraw_drv_lock); - OV56702NDDB("OV56702ND Disable Auto flicker\n"); - } - - return ERROR_NONE; -} - - -UINT32 OV56702NDSetTestPatternMode(kal_bool bEnable) -{ - OV56702NDDB("[OV56702NDSetTestPatternMode] Test pattern enable:%d\n", bEnable); - if(bEnable == KAL_TRUE) - { - OV56702ND_During_testpattern = KAL_TRUE; - - //OV56702ND_write_cmos_sensor(0x5000,0x16);// ; LENC off, MWB on, BPC on, WPC on - - OV56702ND_write_cmos_sensor(0x4303,0x08); - } - else - { - OV56702ND_During_testpattern = KAL_FALSE; - //OV56702ND_write_cmos_sensor(0x5000,0x96);// ; LENC on, MWB on, BPC on, WPC on - OV56702ND_write_cmos_sensor(0x4303,0x00); - } - - return ERROR_NONE; -} - - -/************************************************************************* -* -* DESCRIPTION: -* INTERFACE FUNCTION, FOR USER TO SET MAX FRAMERATE; -* -*************************************************************************/ -UINT32 OV56702NDMIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) { - kal_uint32 pclk; - kal_int16 dummyLine; - kal_uint16 lineLength,frameHeight; - - OV56702NDDB("OV56702NDMIPISetMaxFramerateByScenario: scenarioId = %d, frame rate = %d\n",scenarioId,frameRate); - switch (scenarioId) { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pclk = OV56702ND_PREVIEW_PCLK; - lineLength = OV56702ND_PV_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/lineLength; - dummyLine = frameHeight - OV56702ND_PV_PERIOD_LINE_NUMS; - if(dummyLine<0) - dummyLine = 0; - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorMode = SENSOR_MODE_PREVIEW; - spin_unlock(&ov56702ndmipiraw_drv_lock); - OV56702ND_SetDummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pclk = OV56702ND_VIDEO_PCLK; - lineLength = OV56702ND_VIDEO_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/lineLength; - dummyLine = frameHeight - OV56702ND_VIDEO_PERIOD_LINE_NUMS; - if(dummyLine<0) - dummyLine = 0; - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorMode = SENSOR_MODE_VIDEO; - spin_unlock(&ov56702ndmipiraw_drv_lock); - OV56702ND_SetDummy(0, dummyLine); - break; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pclk = OV56702ND_CAPTURE_PCLK; - lineLength = OV56702ND_FULL_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/lineLength; - dummyLine = frameHeight - OV56702ND_FULL_PERIOD_LINE_NUMS; - if(dummyLine<0) - dummyLine = 0; - spin_lock(&ov56702ndmipiraw_drv_lock); - OV56702ND.sensorMode = SENSOR_MODE_CAPTURE; - spin_unlock(&ov56702ndmipiraw_drv_lock); - OV56702ND_SetDummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: - break; - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - break; - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: - break; - default: - break; - } - return ERROR_NONE; -} - - -UINT32 OV56702NDMIPIGetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate) -{ - - switch (scenarioId) { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - *pframeRate = OV56702ND_MAX_FPS_PREVIEW; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - *pframeRate = OV56702ND_MAX_FPS_CAPTURE; - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - *pframeRate = OV56702ND_MAX_FPS_CAPTURE; - break; - default: - break; - } - - return ERROR_NONE; -} - -/* Sensor output window information */ - -/* SZ TCT xuejian.zhong add for CTS test*/ - -static void OV56702NDGetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - // SENSORDB("OV56702NDGetAFMaxNumFocusAreas *pFeatureReturnPara32 = %dÂ¥n", *pFeatureReturnPara32); -} - -static void OV56702NDGetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - // SENSORDB("OV56702NDGetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %dÂ¥n", *pFeatureReturnPara32); -} - -static void OV56702NDGetExifInfo(UINT32 exifAddr) -{ - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = AE_ISO_100; - pExifInfo->AWBMode = AWB_MODE_AUTO; - pExifInfo->CapExposureTime = 0; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = AE_ISO_100; -} - -/* SZ TCT xuejian.zhong end */ - - -UINT32 OV56702NDFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; - UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; - UINT32 SensorRegNumber; - UINT32 i; - PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++= OV56702ND_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16= OV56702ND_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: - *pFeatureReturnPara16++= OV56702ND_FeatureControl_PERIOD_PixelNum; - *pFeatureReturnPara16= OV56702ND_FeatureControl_PERIOD_LineNum; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: - switch(OV56702NDCurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - *pFeatureReturnPara32 = OV56702ND_PREVIEW_PCLK; - *pFeatureParaLen=4; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - *pFeatureReturnPara32 = OV56702ND_VIDEO_PCLK; - *pFeatureParaLen=4; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - *pFeatureReturnPara32 = OV56702ND_CAPTURE_PCLK; - *pFeatureParaLen=4; - break; - default: - *pFeatureReturnPara32 = OV56702ND_PREVIEW_PCLK; - *pFeatureParaLen=4; - break; - } - break; - - case SENSOR_FEATURE_SET_ESHUTTER: - OV56702ND_SetShutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - OV56702ND_NightMode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: - OV56702ND_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - //OV56702ND_isp_master_clock=*pFeatureData32; - break; - case SENSOR_FEATURE_SET_REGISTER: - OV56702ND_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV56702ND_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - SensorRegNumber=FACTORY_END_ADDR; - for (i=0;i=sizeof(NVRAM_SENSOR_DATA_STRUCT)) - { - pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION; - pSensorDefaultData->SensorId=OV56702NDMIPI_SENSOR_ID; - memcpy(pSensorDefaultData->SensorEngReg, OV56702NDSensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END); - memcpy(pSensorDefaultData->SensorCCTReg, OV56702NDSensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR); - } - else - return FALSE; - *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pSensorConfigData, &OV56702NDSensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - OV56702ND_camera_para_to_sensor(); - break; - - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - OV56702ND_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - *pFeatureReturnPara32++=OV56702ND_get_sensor_group_count(); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_GROUP_INFO: - OV56702ND_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount); - *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - OV56702ND_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo); - *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - - case SENSOR_FEATURE_SET_ITEM_INFO: - OV56702ND_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue); - *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - - case SENSOR_FEATURE_GET_ENG_INFO: - pSensorEngInfo->SensorId = 129; - pSensorEngInfo->SensorType = CMOS_SENSOR; - pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_B; - *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_INITIALIZE_AF: - break; - case SENSOR_FEATURE_CONSTANT_AF: - break; - case SENSOR_FEATURE_MOVE_FOCUS_LENS: - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV56702NDSetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV56702NDGetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - OV56702NDSetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: - OV56702NDMIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1)); - break; - case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: - OV56702NDMIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1))); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV56702NDSetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing - *pFeatureReturnPara32=OV56702ND_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - /*SZ TCT xuejian.zhong add for CTS test */ - case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: - OV56702NDGetAFMaxNumFocusAreas(pFeatureData32); - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: - OV56702NDGetAEMaxNumMeteringAreas(pFeatureData32); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - // SENSORDB("SENSOR_FEATURE_GET_EXIF_INFOÂ¥n"); - // SENSORDB("EXIF addr = 0x%xÂ¥n",*pFeatureData32); - - OV56702NDGetExifInfo(*pFeatureData32); - break; - /* xuejian.zhong add end */ - default: - break; - } - return ERROR_NONE; -} - - -SENSOR_FUNCTION_STRUCT SensorFuncOV56702ND= -{ - OV56702NDOpen, - OV56702NDGetInfo, - OV56702NDGetResolution, - OV56702NDFeatureControl, - OV56702NDControl, - OV56702NDClose -}; - -UINT32 OV56702ND_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV56702ND; - - return ERROR_NONE; -} diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipi_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipi_Sensor.h deleted file mode 100644 index 30caf44d019..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov56702nd_mipi_raw/ov56702ndmipi_Sensor.h +++ /dev/null @@ -1,147 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * OV56702NDmipi_Sensor.h - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * CMOS sensor header file - * - ****************************************************************************/ -#ifndef _OV56702NDMIPI_SENSOR_H -#define _OV56702NDMIPI_SENSOR_H - -typedef enum group_enum { - PRE_GAIN=0, - CMMCLK_CURRENT, - FRAME_RATE_LIMITATION, - REGISTER_EDITOR, - GROUP_TOTAL_NUMS -} FACTORY_GROUP_ENUM; - - -#define ENGINEER_START_ADDR 10 -#define FACTORY_START_ADDR 0 - -typedef enum engineer_index -{ - CMMCLK_CURRENT_INDEX=ENGINEER_START_ADDR, - ENGINEER_END -} FACTORY_ENGINEER_INDEX; - -typedef enum register_index -{ - SENSOR_BASEGAIN=FACTORY_START_ADDR, - PRE_GAIN_R_INDEX, - PRE_GAIN_Gr_INDEX, - PRE_GAIN_Gb_INDEX, - PRE_GAIN_B_INDEX, - FACTORY_END_ADDR -} FACTORY_REGISTER_INDEX; - -typedef struct -{ - SENSOR_REG_STRUCT Reg[ENGINEER_END]; - SENSOR_REG_STRUCT CCT[FACTORY_END_ADDR]; -} SENSOR_DATA_STRUCT, *PSENSOR_DATA_STRUCT; - -typedef enum { - SENSOR_MODE_INIT = 0, - SENSOR_MODE_PREVIEW, - SENSOR_MODE_VIDEO, - SENSOR_MODE_CAPTURE -} OV56702ND_SENSOR_MODE; - - -typedef struct -{ - kal_uint32 DummyPixels; - kal_uint32 DummyLines; - - kal_uint32 pvShutter; - kal_uint32 pvGain; - - kal_uint32 pvPclk; - kal_uint32 videoPclk; - kal_uint32 capPclk; - - kal_uint32 shutter; - - kal_uint16 sensorGlobalGain; - kal_uint16 ispBaseGain; - kal_uint16 realGain; - - kal_int16 imgMirror; - - OV56702ND_SENSOR_MODE sensorMode; - - kal_bool OV56702NDAutoFlickerMode; - kal_bool OV56702NDVideoMode; - -}OV56702ND_PARA_STRUCT,*POV56702ND_PARA_STRUCT; - - - #define OV56702ND_SHUTTER_MARGIN (4) - #define OV56702ND_GAIN_BASE (128) - #define OV56702ND_AUTOFLICKER_OFFSET_30 (296) - #define OV56702ND_AUTOFLICKER_OFFSET_25 (250) - #define OV56702ND_AUTOFLICKER_OFFSET_15 (146) - #define OV56702ND_PREVIEW_PCLK (102850000) - #define OV56702ND_VIDEO_PCLK (OV56702ND_PREVIEW_PCLK) - #define OV56702ND_CAPTURE_PCLK (102850000) - - #define OV56702ND_MAX_FPS_PREVIEW (300) - #define OV56702ND_MAX_FPS_VIDEO (300) - #define OV56702ND_MAX_FPS_CAPTURE (250) - //#define OV56702ND_MAX_FPS_N3D (300) - - - //grab window - #define OV56702ND_IMAGE_SENSOR_PV_WIDTH (1296) - #define OV56702ND_IMAGE_SENSOR_PV_HEIGHT (972) //(960) - #define OV56702ND_IMAGE_SENSOR_VIDEO_WIDTH (OV56702ND_IMAGE_SENSOR_PV_WIDTH) - #define OV56702ND_IMAGE_SENSOR_VIDEO_HEIGHT (OV56702ND_IMAGE_SENSOR_PV_HEIGHT) - #define OV56702ND_IMAGE_SENSOR_FULL_WIDTH (2592) - #define OV56702ND_IMAGE_SENSOR_FULL_HEIGHT (1944) - - #define OV56702ND_FULL_X_START (0) - #define OV56702ND_FULL_Y_START (0) - #define OV56702ND_PV_X_START (0) - #define OV56702ND_PV_Y_START (0) - #define OV56702ND_VIDEO_X_START (0) - #define OV56702ND_VIDEO_Y_START (0) - - #define OV56702ND_MAX_ANALOG_GAIN (8) - #define OV56702ND_MIN_ANALOG_GAIN (1) - - - /* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ - #define OV56702ND_PV_PERIOD_PIXEL_NUMS 0x068C //1676*2=>3352 - #define OV56702ND_PV_PERIOD_LINE_NUMS 0x07FD //2045 - - #define OV56702ND_VIDEO_PERIOD_PIXEL_NUMS OV56702ND_PV_PERIOD_PIXEL_NUMS - #define OV56702ND_VIDEO_PERIOD_LINE_NUMS OV56702ND_PV_PERIOD_LINE_NUMS - - #define OV56702ND_FULL_PERIOD_PIXEL_NUMS 0x07DC //2012*2 25fps - #define OV56702ND_FULL_PERIOD_LINE_NUMS 0x07FD //2045 - - #define OV56702NDMIPI_WRITE_ID (0x6c) - #define OV56702NDMIPI_READ_ID (0x6d) - - #define OV56702NDMIPI_SENSOR_ID OV5670_SENSOR_ID - - - UINT32 OV56702NDMIPIOpen(void); - UINT32 OV56702NDMIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); - UINT32 OV56702NDMIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); - UINT32 OV56702NDMIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); - UINT32 OV56702NDMIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); - UINT32 OV56702NDMIPIClose(void); - -#endif - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/Makefile b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/Makefile deleted file mode 100644 index 71732e48b22..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom - -obj-y += ov5670mipi_Sensor.o - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipi_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipi_Sensor.c deleted file mode 100644 index ea77182bd7e..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipi_Sensor.c +++ /dev/null @@ -1,2157 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * OV5670mipi_Sensor.c - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * Source code of Sensor driver - * - * - *------------------------------------------------------------------------------ - * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! - *============================================================================ - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "ov5670mipi_Sensor.h" - -#include "ov5670mipiraw_Camera_Sensor_para.h" -#include "ov5670mipiraw_CameraCustomized.h" -static DEFINE_SPINLOCK(ov5670mipiraw_drv_lock); -static int module_id = 0; - -#define OV5670_DEBUG -#ifdef OV5670_DEBUG - #define OV5670DB(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG, "[OV5670Raw] ", fmt, ##arg) -#else - #define OV5670DB(fmt, arg...) -#endif - - -kal_uint32 OV5670_FeatureControl_PERIOD_PixelNum=OV5670_PV_PERIOD_PIXEL_NUMS; -kal_uint32 OV5670_FeatureControl_PERIOD_LineNum=OV5670_PV_PERIOD_LINE_NUMS; - -UINT16 OV5670_VIDEO_MODE_TARGET_FPS = 30; - -MSDK_SCENARIO_ID_ENUM OV5670CurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; -MSDK_SENSOR_CONFIG_STRUCT OV5670SensorConfigData; -static OV5670_PARA_STRUCT OV5670; -kal_uint32 OV5670_FAC_SENSOR_REG; - - -SENSOR_REG_STRUCT OV5670SensorCCT[]=CAMERA_SENSOR_CCT_DEFAULT_VALUE; -SENSOR_REG_STRUCT OV5670SensorReg[ENGINEER_END]=CAMERA_SENSOR_REG_DEFAULT_VALUE; - - -#define OV5670_TEST_PATTERN_CHECKSUM 0xca3667da //0x5d8082f0 //0x75bef806 //0xa2230d9f //0xf5e2f1ce -kal_bool OV5670_During_testpattern = KAL_FALSE; - -extern int iReadReg(u16 a_u2Addr , u8 * a_puBuff , u16 i2cId); -extern int iWriteReg(u16 a_u2Addr , u32 a_u4Data , u32 a_u4Bytes , u16 i2cId); - -#define OV5670_write_cmos_sensor(addr, para) iWriteReg((u16) addr , (u32) para , 1, OV5670MIPI_WRITE_ID) - -kal_uint16 OV5670_read_cmos_sensor(kal_uint32 addr) -{ -kal_uint16 get_byte=0; - iReadReg((u16) addr ,(u8*)&get_byte,OV5670MIPI_WRITE_ID); - return get_byte; -} - - -void OV5670_Init_Para(void) -{ - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorMode = SENSOR_MODE_INIT; - OV5670.OV5670AutoFlickerMode = KAL_FALSE; - OV5670.OV5670VideoMode = KAL_FALSE; - OV5670.DummyLines= 0; - OV5670.DummyPixels= 0; - OV5670.pvPclk = (10285); - OV5670.videoPclk = (10285); - OV5670.capPclk = (10285); - - OV5670.shutter = 0x4C00; - OV5670.ispBaseGain = BASEGAIN; - OV5670.sensorGlobalGain = 0x0200; - spin_unlock(&ov5670mipiraw_drv_lock); -} - -#define RG_Ratio_Typical 0x264 -#define BG_Ratio_Typical 0x236 - -struct otp_struct { - int flag; // bit[7]: info, bit[6]:wb - int module_integrator_id; - int lens_id; - int production_year; - int production_month; - int production_day; - int rg_ratio; - int bg_ratio; - int g_gain; - int ob_data; - int golden_RG; - int golden_BG; - int golden_G; -}; - - -static void otp_i2c_write( uint32_t addr, kal_uint16 data) -{ - OV5670_write_cmos_sensor(addr, data); -} - -static kal_uint16 otp_i2c_read(uint32_t addr) - -{ - return OV5670_read_cmos_sensor(addr); -} - - -// return value: -// bit[7]: 0 no otp info, 1 valid otp info -// bit[6]: 0 no otp wb, 1 valib otp wb -static int read_otp(struct otp_struct *otp_ptr) -{ - int otp_flag, addr, temp, i; - //set 0x5002[3] to “0†- int temp1; - - temp1 = otp_i2c_read(0x5002); - otp_i2c_write(0x5002, (0x00 & 0x08) | (temp1 & (~0x08))); - - // read OTP into buffer - otp_i2c_write(0x3d84, 0xC0); - otp_i2c_write(0x3d88, 0x70); // OTP start address - otp_i2c_write(0x3d89, 0x10); - otp_i2c_write(0x3d8A, 0x70); // OTP end address - otp_i2c_write(0x3d8B, 0x29); - otp_i2c_write(0x3d81, 0x01); // load otp into buffer - mdelay(5); - - // OTP into - otp_flag = otp_i2c_read(0x7010); - addr = 0; - - if((otp_flag & 0xc0) == 0x40) { - addr = 0x7011; // base address of info group 1 - } else if((otp_flag & 0x30) == 0x10) { - addr = 0x7018; // base address of info group 2 - }else if((otp_flag & 0x0c) == 0x04) { - addr = 0x701f; // base address of info group 3 - } - - if(addr != 0) { - (*otp_ptr).flag = 0x80; // valid base info in OTP - (*otp_ptr).module_integrator_id = otp_i2c_read( addr ); - (*otp_ptr).lens_id = otp_i2c_read( addr + 1); - (*otp_ptr).production_year = otp_i2c_read( addr + 4); - (*otp_ptr).production_month = otp_i2c_read( addr + 5); - (*otp_ptr).production_day = otp_i2c_read( addr + 6); - } else { - (*otp_ptr).flag = 0x00; // not info in OTP - (*otp_ptr).module_integrator_id = 0; - (*otp_ptr).lens_id = 0; - (*otp_ptr).production_year = 0; - (*otp_ptr).production_month = 0; - (*otp_ptr).production_day = 0; - } - - module_id = (*otp_ptr).module_integrator_id; - // OTP WB Calibration - otp_flag = otp_i2c_read(0x7026); - addr = 0; - - if((otp_flag & 0xc0) == 0x40) { - addr = 0x7028; // base address of WB Calibration group 1 - }else if((otp_flag & 0x30) == 0x10) { - addr = 0x7031; // base address of WB Calibration group 2 - }else if((otp_flag & 0x0c) == 0x04) { - addr = 0x703a; // base address of WB Calibration group 3 - } - - if(addr != 0) { - (*otp_ptr).flag |= 0x40; - (*otp_ptr).ob_data = otp_i2c_read(addr-1); - - temp = otp_i2c_read( addr + 3); - (*otp_ptr).rg_ratio = (otp_i2c_read(addr)<<2) + ((temp>>6) & 0x03); - (*otp_ptr).bg_ratio = (otp_i2c_read( addr + 1)<<2) + ((temp>>4) & 0x03); - - temp = otp_i2c_read(addr + 7); - (*otp_ptr).golden_RG = (otp_i2c_read(addr + 4) << 2) + ((temp >> 6) & 0x03); - (*otp_ptr).golden_BG = (otp_i2c_read(addr + 5) << 2) + ((temp >> 4) & 0x03); - (*otp_ptr).golden_G = otp_i2c_read(addr + 6); - - OV5670DB("ob_data=%d rg_ratio=%d bg_ratio=%d golden_RG=%d golden_BG=%d golden_G=%d\n", - (*otp_ptr).ob_data, (*otp_ptr).rg_ratio, (*otp_ptr).bg_ratio, (*otp_ptr).golden_RG, (*otp_ptr).golden_BG, (*otp_ptr).golden_G); - - }else { - (*otp_ptr).rg_ratio = 0; - (*otp_ptr).bg_ratio = 0; - } - - for(i=0x7010;i<=0x7041;i++) { - otp_i2c_write(i,0); // clear OTP buffer, recommended use continuous write to accelarate - } - - //set 0x5002[3] to “1†- temp1 = otp_i2c_read(0x5002); - otp_i2c_write(0x5002, (0x02 & 0x08) | (temp1 & (~0x08))); - return (*otp_ptr).flag ; -} - -static int apply_otp(struct otp_struct *otp_ptr) -{ - int rg, bg, R_gain, G_gain, B_gain, Base_gain; - - // apply OTP WB Calibration - if ((*otp_ptr).flag & 0x40) { - rg = (*otp_ptr). rg_ratio; - bg = (*otp_ptr).bg_ratio; - //calculate G gain - R_gain = (RG_Ratio_Typical*1000) / rg; - B_gain = (BG_Ratio_Typical*1000) / bg; - G_gain = 1000; - OV5670DB("before calibration R_gain=%d B_gain=%d G_gain=%d rg=%d bg=%d\n", R_gain, B_gain, G_gain, rg, bg); - if (R_gain < 1000 || B_gain < 1000) - { - if (R_gain < B_gain) - Base_gain = R_gain; - else - Base_gain = B_gain; - } - else - { - Base_gain = G_gain; - } - - R_gain = 0x400 * R_gain / (Base_gain); - B_gain = 0x400 * B_gain / (Base_gain); - G_gain = 0x400 * G_gain / (Base_gain); - OV5670DB("after calibration R_gain=%d B_gain=%d G_gain=%d \n", R_gain, B_gain, G_gain); - - // update sensor WB gain - if (R_gain>0x400) { - otp_i2c_write(0x5032, R_gain>>8); - otp_i2c_write(0x5033, R_gain & 0x00ff); - } - if (G_gain>0x400) { - otp_i2c_write(0x5034, G_gain>>8); - otp_i2c_write(0x5035, G_gain & 0x00ff); - } - if (B_gain>0x400) { - otp_i2c_write(0x5036, B_gain>>8); - otp_i2c_write(0x5037, B_gain & 0x00ff); - } - } - return (*otp_ptr).flag ; -} - -void ov5670_otp_config() -{ - struct otp_struct otp_info ; - - read_otp(&otp_info); - apply_otp(&otp_info) ; -} -kal_uint32 GetOV5670LineLength(void) -{ - kal_uint32 OV5670_line_length = 0; - if ( SENSOR_MODE_PREVIEW == OV5670.sensorMode ) - { - OV5670_line_length = OV5670_PV_PERIOD_PIXEL_NUMS + OV5670.DummyPixels; - } - else if( SENSOR_MODE_VIDEO == OV5670.sensorMode ) - { - OV5670_line_length = OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels; - } - else - { - OV5670_line_length = OV5670_FULL_PERIOD_PIXEL_NUMS + OV5670.DummyPixels; - } - - return OV5670_line_length; - -} - - -kal_uint32 GetOV5670FrameLength(void) -{ - kal_uint32 OV5670_frame_length = 0; - - if ( SENSOR_MODE_PREVIEW == OV5670.sensorMode ) - { - OV5670_frame_length = OV5670_PV_PERIOD_LINE_NUMS + OV5670.DummyLines ; - } - else if( SENSOR_MODE_VIDEO == OV5670.sensorMode ) - { - OV5670_frame_length = OV5670_VIDEO_PERIOD_LINE_NUMS + OV5670.DummyLines ; - } - else - { - OV5670_frame_length = OV5670_FULL_PERIOD_LINE_NUMS + OV5670.DummyLines ; - } - - return OV5670_frame_length; -} - - -kal_uint32 OV5670_CalcExtra_For_ShutterMargin(kal_uint32 shutter_value,kal_uint32 shutterLimitation) -{ - kal_uint32 extra_lines = 0; - - - if (shutter_value <4 ){ - shutter_value = 4; - } - - - if (shutter_value > shutterLimitation) - { - extra_lines = shutter_value - shutterLimitation; - } - else - extra_lines = 0; - - return extra_lines; - -} - - -kal_uint32 OV5670_CalcFrameLength_For_AutoFlicker(void) -{ - - kal_uint32 AutoFlicker_min_framelength = 0; - - switch(OV5670CurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_ZSD: - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - AutoFlicker_min_framelength = (OV5670.capPclk*10000) /(OV5670_FULL_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_25*10 ; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - if(OV5670_VIDEO_MODE_TARGET_FPS==30) - { - AutoFlicker_min_framelength = (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_30*10 ; - } - else if(OV5670_VIDEO_MODE_TARGET_FPS==15) - { - AutoFlicker_min_framelength = (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_15*10 ; - } - else - { - AutoFlicker_min_framelength = OV5670_VIDEO_PERIOD_LINE_NUMS + OV5670.DummyLines; - } - break; - - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - default: - AutoFlicker_min_framelength = (OV5670.pvPclk*10000) /(OV5670_PV_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/OV5670_AUTOFLICKER_OFFSET_30*10 ; - break; - } - - OV5670DB("AutoFlicker_min_framelength =%d,OV5670CurrentScenarioId =%d\n", AutoFlicker_min_framelength,OV5670CurrentScenarioId); - - return AutoFlicker_min_framelength; - -} - - -void OV5670_write_shutter(kal_uint32 shutter) -{ - kal_uint32 min_framelength = OV5670_PV_PERIOD_PIXEL_NUMS, max_shutter=0; - kal_uint32 line_length = 0; - kal_uint32 frame_length = 0; - unsigned long flags; - - //for test - //shutter = 0x7fc; //issue - - - line_length = GetOV5670LineLength(); - frame_length = GetOV5670FrameLength(); - - max_shutter = frame_length-OV5670_SHUTTER_MARGIN; - - frame_length = frame_length + OV5670_CalcExtra_For_ShutterMargin(shutter,max_shutter); - - - - if(OV5670.OV5670AutoFlickerMode == KAL_TRUE) - { - min_framelength = OV5670_CalcFrameLength_For_AutoFlicker(); - - if(frame_length < min_framelength) - frame_length = min_framelength; - } - - - spin_lock_irqsave(&ov5670mipiraw_drv_lock,flags); - OV5670_FeatureControl_PERIOD_PixelNum = line_length; - OV5670_FeatureControl_PERIOD_LineNum = frame_length; - spin_unlock_irqrestore(&ov5670mipiraw_drv_lock,flags); - - //Set total frame length //VTS - OV5670_write_cmos_sensor(0x380e, (frame_length >> 8) & 0xFF); - OV5670_write_cmos_sensor(0x380f, frame_length & 0xFF); - - //Set shutter - OV5670_write_cmos_sensor(0x3500, (shutter>>12) & 0x0F); - OV5670_write_cmos_sensor(0x3501, (shutter>>4) & 0xFF); - OV5670_write_cmos_sensor(0x3502, (shutter<<4) & 0xF0); /* Don't use the fraction part. */ - - OV5670DB("ov5670 write shutter=%x, line_length=%x, frame_length=%x\n", shutter, line_length, frame_length); - -} - - -static kal_uint16 OV5670Reg2Gain(const kal_uint16 iReg) -{ - kal_uint16 iGain =0; - - iGain = iReg*BASEGAIN/OV5670_GAIN_BASE; - return iGain; - -} - -static kal_uint16 OV5670Gain2Reg(const kal_uint16 Gain) -{ - kal_uint32 iReg = 0x0000; - kal_uint32 TempGain = BASEGAIN; - - - TempGain = Gain; - if(TempGain < BASEGAIN){ - TempGain = BASEGAIN; - //OV5670DB("###ov5670 write gain underflow### Gain =%x\n", Gain); - } - if(TempGain > 16*BASEGAIN){ - TempGain = 16*BASEGAIN; - //OV5670DB("###ov5670 write gain overflow### Gain =%x\n", Gain); - } - - iReg = (TempGain*OV5670_GAIN_BASE)/BASEGAIN; - - //iReg = ((TempGain /BASEGAIN)<<7)+((TempGain % BASEGAIN)<<7/BASEGAIN); - iReg = iReg & 0xFFFF; - - //OV5670DB("###ov5670 write Reg ### iReg =%x\n", iReg); - - return iReg; - -} - -void write_OV5670_gain(kal_uint16 gain) -{ - kal_uint16 iGain =1; - kal_uint8 ChangeFlag=0x01; - - kal_uint16 read_gain; - - iGain=(gain / OV5670_GAIN_BASE); - - if(iGain<2){ - ChangeFlag= 0x00; - } - else if(iGain<4){ - ChangeFlag= 0x01; - } - else if(iGain<8){ - ChangeFlag= 0x03; - } - else{ - ChangeFlag= 0x07; - } - - //ChangeFlag= 0x07; - - OV5670_write_cmos_sensor(0x301d, 0xf0); - OV5670_write_cmos_sensor(0x3209, 0x00); - OV5670_write_cmos_sensor(0x320a, 0x01); - - //group write hold - //group 0:delay 0x366a for one frame,then active with gain - OV5670_write_cmos_sensor(0x3208, 0x00); - OV5670_write_cmos_sensor(0x366a, ChangeFlag); - OV5670_write_cmos_sensor(0x3208, 0x10); - - //group 1:all other registers( gain) - OV5670_write_cmos_sensor(0x3208, 0x01); - OV5670_write_cmos_sensor(0x3508,(gain>>8)); - OV5670_write_cmos_sensor(0x3509,(gain&0xff)); - - OV5670_write_cmos_sensor(0x3208, 0x11); - - //group lanch - OV5670_write_cmos_sensor(0x320B, 0x15); - OV5670_write_cmos_sensor(0x3208, 0xA1); - - //read_gain=(((OV5670_read_cmos_sensor(0x3508)&0x1F) << 8) | OV5670_read_cmos_sensor(0x3509)); - //OV5670DB("[OV5670_SetGain]0x3508|0x3509=0x%x \n",read_gain); - //OV5670DB("[OV5670_SetGain]0x366a=%d \n",(OV5670_read_cmos_sensor(0x366a))); - - return; - -} - -void OV5670_SetGain(UINT16 iGain) -{ - unsigned long flags; - spin_lock_irqsave(&ov5670mipiraw_drv_lock,flags); - - OV5670DB("OV5670_SetGain iGain = %d :\n ",iGain); - - OV5670.realGain = iGain; - OV5670.sensorGlobalGain = OV5670Gain2Reg(iGain); - spin_unlock_irqrestore(&ov5670mipiraw_drv_lock,flags); - - write_OV5670_gain(OV5670.sensorGlobalGain); - OV5670DB(" [OV5670_SetGain]OV5670.sensorGlobalGain=0x%x,OV5670.realGain =%d",OV5670.sensorGlobalGain, - OV5670.realGain); - - //temperature test - //OV5670_write_cmos_sensor(0x4d12,0x01); - //OV5670DB("Temperature read_reg 0x4d13 =%x \n",OV5670_read_cmos_sensor(0x4d13)); -} - -kal_uint16 read_OV5670_gain(void) -{ - kal_uint16 read_gain=0; - - read_gain=(((OV5670_read_cmos_sensor(0x3508)&0x1F) << 8) | OV5670_read_cmos_sensor(0x3509)); - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorGlobalGain = read_gain; - OV5670.realGain = OV5670Reg2Gain(OV5670.sensorGlobalGain); - spin_unlock(&ov5670mipiraw_drv_lock); - - OV5670DB("OV5670.sensorGlobalGain=0x%x,OV5670.realGain=%d\n",OV5670.sensorGlobalGain,OV5670.realGain); - - return OV5670.sensorGlobalGain; -} - - -#if 1 -void OV5670_camera_para_to_sensor(void) -{ - kal_uint32 i; - for(i=0; 0xFFFFFFFF!=OV5670SensorReg[i].Addr; i++) - { - OV5670_write_cmos_sensor(OV5670SensorReg[i].Addr, OV5670SensorReg[i].Para); - } - for(i=ENGINEER_START_ADDR; 0xFFFFFFFF!=OV5670SensorReg[i].Addr; i++) - { - OV5670_write_cmos_sensor(OV5670SensorReg[i].Addr, OV5670SensorReg[i].Para); - } - for(i=FACTORY_START_ADDR; iItemNamePtr,"Pregain-R"); - temp_addr = PRE_GAIN_R_INDEX; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gr"); - temp_addr = PRE_GAIN_Gr_INDEX; - break; - case 2: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gb"); - temp_addr = PRE_GAIN_Gb_INDEX; - break; - case 3: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-B"); - temp_addr = PRE_GAIN_B_INDEX; - break; - case 4: - sprintf((char *)info_ptr->ItemNamePtr,"SENSOR_BASEGAIN"); - temp_addr = SENSOR_BASEGAIN; - break; - default: - ASSERT(0); - } - - temp_para= OV5670SensorCCT[temp_addr].Para; - //temp_gain= (temp_para/OV5670.sensorBaseGain) * 1000; - - info_ptr->ItemValue=temp_gain; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min= OV5670_MIN_ANALOG_GAIN * 1000; - info_ptr->Max= OV5670_MAX_ANALOG_GAIN * 1000; - break; - case CMMCLK_CURRENT: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"Drv Cur[2,4,6,8]mA"); - - //temp_reg=MT9P017SensorReg[CMMCLK_CURRENT_INDEX].Para; - temp_reg = ISP_DRIVING_2MA; - if(temp_reg==ISP_DRIVING_2MA) - { - info_ptr->ItemValue=2; - } - else if(temp_reg==ISP_DRIVING_4MA) - { - info_ptr->ItemValue=4; - } - else if(temp_reg==ISP_DRIVING_6MA) - { - info_ptr->ItemValue=6; - } - else if(temp_reg==ISP_DRIVING_8MA) - { - info_ptr->ItemValue=8; - } - - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_TRUE; - info_ptr->Min=2; - info_ptr->Max=8; - break; - default: - ASSERT(0); - } - break; - case FRAME_RATE_LIMITATION: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"Max Exposure Lines"); - info_ptr->ItemValue= 111; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_TRUE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"Min Frame Rate"); - info_ptr->ItemValue=12; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_TRUE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0; - break; - default: - ASSERT(0); - } - break; - case REGISTER_EDITOR: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"REG Addr."); - info_ptr->ItemValue=0; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0xFFFF; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"REG Value"); - info_ptr->ItemValue=0; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0xFFFF; - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } -} - - - -kal_bool OV5670_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 ItemValue) -{ - kal_uint16 temp_gain=0,temp_addr=0, temp_para=0; - - switch (group_idx) - { - case PRE_GAIN: - switch (item_idx) - { - case 0: - temp_addr = PRE_GAIN_R_INDEX; - break; - case 1: - temp_addr = PRE_GAIN_Gr_INDEX; - break; - case 2: - temp_addr = PRE_GAIN_Gb_INDEX; - break; - case 3: - temp_addr = PRE_GAIN_B_INDEX; - break; - case 4: - temp_addr = SENSOR_BASEGAIN; - break; - default: - ASSERT(0); - } - - temp_gain=((ItemValue*BASEGAIN+500)/1000); //+500:get closed integer value - - if(temp_gain>=1*BASEGAIN && temp_gain<=16*BASEGAIN) - { -// temp_para=(temp_gain * OV5670.sensorBaseGain + BASEGAIN/2)/BASEGAIN; - } - else - ASSERT(0); - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670SensorCCT[temp_addr].Para = temp_para; - spin_unlock(&ov5670mipiraw_drv_lock); - OV5670_write_cmos_sensor(OV5670SensorCCT[temp_addr].Addr,temp_para); - - break; - case CMMCLK_CURRENT: - switch (item_idx) - { - case 0: - //no need to apply this item for driving current - break; - default: - ASSERT(0); - } - break; - case FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case REGISTER_EDITOR: - switch (item_idx) - { - case 0: - spin_lock(&ov5670mipiraw_drv_lock); - OV5670_FAC_SENSOR_REG=ItemValue; - spin_unlock(&ov5670mipiraw_drv_lock); - break; - case 1: - OV5670_write_cmos_sensor(OV5670_FAC_SENSOR_REG,ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - } - return KAL_TRUE; -} -#endif - - -static void OV5670_SetDummy( const kal_uint32 iPixels, const kal_uint32 iLines ) -{ - kal_uint32 line_length = 0; - kal_uint32 frame_length = 0; - - if ( SENSOR_MODE_PREVIEW == OV5670.sensorMode ) - { - line_length = OV5670_PV_PERIOD_PIXEL_NUMS + iPixels; - frame_length = OV5670_PV_PERIOD_LINE_NUMS + iLines; - } - else if( SENSOR_MODE_VIDEO== OV5670.sensorMode ) - { - line_length = OV5670_VIDEO_PERIOD_PIXEL_NUMS + iPixels; - frame_length = OV5670_VIDEO_PERIOD_LINE_NUMS + iLines; - } - else - { - line_length = OV5670_FULL_PERIOD_PIXEL_NUMS + iPixels; - frame_length = OV5670_FULL_PERIOD_LINE_NUMS + iLines; - } - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670_FeatureControl_PERIOD_PixelNum = line_length; - OV5670_FeatureControl_PERIOD_LineNum = frame_length; - spin_unlock(&ov5670mipiraw_drv_lock); - - //Set total frame length - OV5670_write_cmos_sensor(0x380e, (frame_length >> 8) & 0xFF); - OV5670_write_cmos_sensor(0x380f, frame_length & 0xFF); - //Set total line length - OV5670_write_cmos_sensor(0x380c, (line_length >> 8) & 0xFF); - OV5670_write_cmos_sensor(0x380d, line_length & 0xFF); - -} - - -void OV5670PreviewSetting(void) -{ - OV5670DB(" OV5670PreviewSetting_2lane enter\n"); - - /* // - - //@@PV_Quarter_size_30fps_800Mbps/lane - //99 1296 960 - //;;102 3601 157c - //;;PCLK=HTS*VTS*fps=0x68c*0x7fd*30=1676*2045*30=102.85M - - OV5670_write_cmos_sensor(0x0100, 0x00); // - - OV5670_write_cmos_sensor(0x3501, 0x3d); // - OV5670_write_cmos_sensor(0x366e, 0x08); // - OV5670_write_cmos_sensor(0x370b, 0x1b); // - OV5670_write_cmos_sensor(0x3808, 0x05); // - OV5670_write_cmos_sensor(0x3809, 0x10); // - OV5670_write_cmos_sensor(0x380a, 0x03); // - OV5670_write_cmos_sensor(0x380b, 0xc0); // - OV5670_write_cmos_sensor(0x380c, 0x06); // - OV5670_write_cmos_sensor(0x380d, 0x8c); // - OV5670_write_cmos_sensor(0x380e, 0x07); //;03 - OV5670_write_cmos_sensor(0x380f, 0xfd); //;e0 - OV5670_write_cmos_sensor(0x3814, 0x03); // - OV5670_write_cmos_sensor(0x3820, 0x90); // - OV5670_write_cmos_sensor(0x3821, 0x47); // - OV5670_write_cmos_sensor(0x382a, 0x03); // - OV5670_write_cmos_sensor(0x4009, 0x05); // - OV5670_write_cmos_sensor(0x4502, 0x48); // - OV5670_write_cmos_sensor(0x4508, 0x55); // - OV5670_write_cmos_sensor(0x4509, 0x55); // - OV5670_write_cmos_sensor(0x4600, 0x00); // - OV5670_write_cmos_sensor(0x4601, 0x81); // - OV5670_write_cmos_sensor(0x4017, 0x10); //; threshold = 4LSB for Binning sum format. - OV5670_write_cmos_sensor(0x400a, 0x02); //; - OV5670_write_cmos_sensor(0x400b, 0x00); //; - - OV5670_write_cmos_sensor(0x0100, 0x01); // -*/ - - //@@PV_Quarter_size_30fps_800Mbps/lane_1296x972 - //99 1296 972 - //;;102 3601 157c - //;;PCLK=HTS*VTS*fps=0x68c*0x7fd*30=1676*2045*30=102.85M - - OV5670_write_cmos_sensor(0x0100, 0x00); // - - OV5670_write_cmos_sensor(0x3501, 0x73); // - OV5670_write_cmos_sensor(0x3502, 0x00); // - OV5670_write_cmos_sensor(0x3508, 0x01); // - OV5670_write_cmos_sensor(0x3509, 0x80); // - OV5670_write_cmos_sensor(0x366e, 0x08); // - OV5670_write_cmos_sensor(0x370b, 0x1b); // - OV5670_write_cmos_sensor(0x3808, 0x05); // - OV5670_write_cmos_sensor(0x3809, 0x10); // - OV5670_write_cmos_sensor(0x380a, 0x03); // - OV5670_write_cmos_sensor(0x380b, 0xcc); //;c0 - OV5670_write_cmos_sensor(0x380c, 0x06); // - OV5670_write_cmos_sensor(0x380d, 0x8c); // - OV5670_write_cmos_sensor(0x380e, 0x07); //;03 - OV5670_write_cmos_sensor(0x380f, 0xfd); //;e0 - OV5670_write_cmos_sensor(0x3814, 0x03); // - OV5670_write_cmos_sensor(0x3820, 0x90); // - OV5670_write_cmos_sensor(0x3821, 0x47); // - OV5670_write_cmos_sensor(0x382a, 0x03); // - OV5670_write_cmos_sensor(0x3845, 0x02); // - OV5670_write_cmos_sensor(0x4009, 0x05); // - OV5670_write_cmos_sensor(0x4502, 0x48); // - OV5670_write_cmos_sensor(0x4508, 0x55); // - OV5670_write_cmos_sensor(0x4509, 0x55); // - OV5670_write_cmos_sensor(0x4600, 0x00); // - OV5670_write_cmos_sensor(0x4601, 0x81); // - OV5670_write_cmos_sensor(0x4017, 0x10); //; threshold = 4LSB for Binning - OV5670_write_cmos_sensor(0x400a, 0x02); //; - OV5670_write_cmos_sensor(0x400b, 0x00); //; - - OV5670_write_cmos_sensor(0x0100, 0x01); // -} - - -void OV5670VideoSetting(void) -{ - OV5670DB(" OV5670videoSetting_2lane enter:video/preview sync\n"); - - OV5670PreviewSetting(); -} - - - -void OV5670CaptureSetting(void) -{ - OV5670DB("OV5670CaptureSetting_2lane enter\n"); - - OV5670_write_cmos_sensor(0x0100, 0x00); - - OV5670_write_cmos_sensor(0x3501, 0x5f); //long exposure - OV5670_write_cmos_sensor(0x3502, 0xd0); //long exposure - - OV5670_write_cmos_sensor(0x3508, 0x03); //gain - OV5670_write_cmos_sensor(0x3509, 0x00); //gain - - OV5670_write_cmos_sensor(0x366e, 0x10); - OV5670_write_cmos_sensor(0x370b, 0x1b); - OV5670_write_cmos_sensor(0x3808, 0x0a); - OV5670_write_cmos_sensor(0x3809, 0x20); - OV5670_write_cmos_sensor(0x380a, 0x07); - OV5670_write_cmos_sensor(0x380b, 0x98); - OV5670_write_cmos_sensor(0x380c, 0x07); //;06 - OV5670_write_cmos_sensor(0x380d, 0xdc); //;8c - OV5670_write_cmos_sensor(0x380e, 0x07); - OV5670_write_cmos_sensor(0x380f, 0xfd); - OV5670_write_cmos_sensor(0x3814, 0x01); - OV5670_write_cmos_sensor(0x3820, 0x80); - OV5670_write_cmos_sensor(0x3821, 0x46); - OV5670_write_cmos_sensor(0x382a, 0x01); - - OV5670_write_cmos_sensor(0x3845, 0x00); //v_offset for auto size mode - - OV5670_write_cmos_sensor(0x4009, 0x0d); - OV5670_write_cmos_sensor(0x4502, 0x40); - OV5670_write_cmos_sensor(0x4508, 0xaa); - OV5670_write_cmos_sensor(0x4509, 0xaa); - OV5670_write_cmos_sensor(0x4600, 0x01); - OV5670_write_cmos_sensor(0x4601, 0x03); - OV5670_write_cmos_sensor(0x4017, 0x08); //threshold= 2LSB for full size - OV5670_write_cmos_sensor(0x400a, 0x02); // - OV5670_write_cmos_sensor(0x400b, 0x00); // - - OV5670_write_cmos_sensor(0x0100, 0x01); - -} - - -static void OV5670_Sensor_Init(void) -{ - OV5670DB("OV5670_Sensor_Init_2lane enter\n"); - - OV5670_write_cmos_sensor(0x0103,0x01);// ; software reset - mdelay(10); - OV5670_write_cmos_sensor(0x0100, 0x00);// ; software standby - OV5670_write_cmos_sensor(0x0100, 0x00); - OV5670_write_cmos_sensor(0x0300, 0x04); - OV5670_write_cmos_sensor(0x0301, 0x00); - OV5670_write_cmos_sensor(0x0302, 0x64); //;78 - OV5670_write_cmos_sensor(0x0303, 0x00); - OV5670_write_cmos_sensor(0x0304, 0x03); - OV5670_write_cmos_sensor(0x0305, 0x01); - OV5670_write_cmos_sensor(0x0306, 0x01); - OV5670_write_cmos_sensor(0x030a, 0x00); - OV5670_write_cmos_sensor(0x030b, 0x00); - OV5670_write_cmos_sensor(0x030c, 0x00); - OV5670_write_cmos_sensor(0x030d, 0x1e); - OV5670_write_cmos_sensor(0x030e, 0x00); - OV5670_write_cmos_sensor(0x030f, 0x06); - OV5670_write_cmos_sensor(0x0312, 0x01); - OV5670_write_cmos_sensor(0x3000, 0x00); - OV5670_write_cmos_sensor(0x3002, 0x21); - OV5670_write_cmos_sensor(0x3005, 0xf0); - OV5670_write_cmos_sensor(0x3007, 0x00); - OV5670_write_cmos_sensor(0x3015, 0x0f); - OV5670_write_cmos_sensor(0x3018, 0x32); - OV5670_write_cmos_sensor(0x301a, 0xf0); - OV5670_write_cmos_sensor(0x301b, 0xf0); - OV5670_write_cmos_sensor(0x301c, 0xf0); - OV5670_write_cmos_sensor(0x301d, 0xf0); - OV5670_write_cmos_sensor(0x301e, 0xf0); - OV5670_write_cmos_sensor(0x3030, 0x00); - OV5670_write_cmos_sensor(0x3031, 0x0a); - OV5670_write_cmos_sensor(0x303c, 0xff); - OV5670_write_cmos_sensor(0x303e, 0xff); - OV5670_write_cmos_sensor(0x3040, 0xf0); - OV5670_write_cmos_sensor(0x3041, 0x00); - OV5670_write_cmos_sensor(0x3042, 0xf0); - OV5670_write_cmos_sensor(0x3106, 0x11); - OV5670_write_cmos_sensor(0x3500, 0x00); - OV5670_write_cmos_sensor(0x3501, 0x7b); - OV5670_write_cmos_sensor(0x3502, 0x00); - OV5670_write_cmos_sensor(0x3503, 0x04); - OV5670_write_cmos_sensor(0x3504, 0x03); - OV5670_write_cmos_sensor(0x3505, 0x83); - OV5670_write_cmos_sensor(0x3508, 0x07); - OV5670_write_cmos_sensor(0x3509, 0x80); - OV5670_write_cmos_sensor(0x350e, 0x04); - OV5670_write_cmos_sensor(0x350f, 0x00); - OV5670_write_cmos_sensor(0x3510, 0x00); - OV5670_write_cmos_sensor(0x3511, 0x02); - OV5670_write_cmos_sensor(0x3512, 0x00); - OV5670_write_cmos_sensor(0x3601, 0xc8); - OV5670_write_cmos_sensor(0x3610, 0x88); - OV5670_write_cmos_sensor(0x3612, 0x48); - OV5670_write_cmos_sensor(0x3614, 0x5b); - OV5670_write_cmos_sensor(0x3615, 0x96); - OV5670_write_cmos_sensor(0x3621, 0xd0); - OV5670_write_cmos_sensor(0x3622, 0x00); - OV5670_write_cmos_sensor(0x3623, 0x00); - OV5670_write_cmos_sensor(0x3633, 0x13); - OV5670_write_cmos_sensor(0x3634, 0x13); - OV5670_write_cmos_sensor(0x3635, 0x13); - OV5670_write_cmos_sensor(0x3636, 0x13); - OV5670_write_cmos_sensor(0x3645, 0x13); - OV5670_write_cmos_sensor(0x3646, 0x82); - OV5670_write_cmos_sensor(0x3650, 0x00); - OV5670_write_cmos_sensor(0x3652, 0xff); - OV5670_write_cmos_sensor(0x3655, 0x20); - OV5670_write_cmos_sensor(0x3656, 0xff); - OV5670_write_cmos_sensor(0x365a, 0xff); - OV5670_write_cmos_sensor(0x365e, 0xff); - OV5670_write_cmos_sensor(0x3668, 0x00); - OV5670_write_cmos_sensor(0x366a, 0x07); - OV5670_write_cmos_sensor(0x366e, 0x10); - OV5670_write_cmos_sensor(0x366d, 0x00); - OV5670_write_cmos_sensor(0x366f, 0x80); - OV5670_write_cmos_sensor(0x3700, 0x28); - OV5670_write_cmos_sensor(0x3701, 0x10); - OV5670_write_cmos_sensor(0x3702, 0x3a); - OV5670_write_cmos_sensor(0x3703, 0x19); - OV5670_write_cmos_sensor(0x3704, 0x10); - OV5670_write_cmos_sensor(0x3705, 0x00); - OV5670_write_cmos_sensor(0x3706, 0x66); - OV5670_write_cmos_sensor(0x3707, 0x08); - OV5670_write_cmos_sensor(0x3708, 0x34); - OV5670_write_cmos_sensor(0x3709, 0x40); - OV5670_write_cmos_sensor(0x370a, 0x01); - OV5670_write_cmos_sensor(0x370b, 0x1b); - OV5670_write_cmos_sensor(0x3714, 0x24); - OV5670_write_cmos_sensor(0x371a, 0x3e); - OV5670_write_cmos_sensor(0x3733, 0x00); - OV5670_write_cmos_sensor(0x3734, 0x00); - OV5670_write_cmos_sensor(0x373a, 0x05); - OV5670_write_cmos_sensor(0x373b, 0x06); - OV5670_write_cmos_sensor(0x373c, 0x0a); - OV5670_write_cmos_sensor(0x373f, 0xa0); - OV5670_write_cmos_sensor(0x3755, 0x00); - OV5670_write_cmos_sensor(0x3758, 0x00); - OV5670_write_cmos_sensor(0x375b, 0x0e); - OV5670_write_cmos_sensor(0x3766, 0x5f); - OV5670_write_cmos_sensor(0x3768, 0x00); - OV5670_write_cmos_sensor(0x3769, 0x22); - OV5670_write_cmos_sensor(0x3773, 0x08); - OV5670_write_cmos_sensor(0x3774, 0x1f); - OV5670_write_cmos_sensor(0x3776, 0x06); - OV5670_write_cmos_sensor(0x37a0, 0x88); - OV5670_write_cmos_sensor(0x37a1, 0x5c); - OV5670_write_cmos_sensor(0x37a7, 0x88); - OV5670_write_cmos_sensor(0x37a8, 0x70); - OV5670_write_cmos_sensor(0x37aa, 0x88); - OV5670_write_cmos_sensor(0x37ab, 0x48); - OV5670_write_cmos_sensor(0x37b3, 0x66); - OV5670_write_cmos_sensor(0x37c2, 0x04); - OV5670_write_cmos_sensor(0x37c5, 0x00); - OV5670_write_cmos_sensor(0x37c8, 0x00); - OV5670_write_cmos_sensor(0x3800, 0x00); - OV5670_write_cmos_sensor(0x3801, 0x0c); - OV5670_write_cmos_sensor(0x3802, 0x00); - OV5670_write_cmos_sensor(0x3803, 0x04); - OV5670_write_cmos_sensor(0x3804, 0x0a); - OV5670_write_cmos_sensor(0x3805, 0x33); - OV5670_write_cmos_sensor(0x3806, 0x07); - OV5670_write_cmos_sensor(0x3807, 0xa3); - OV5670_write_cmos_sensor(0x3808, 0x0a); - OV5670_write_cmos_sensor(0x3809, 0x20); - OV5670_write_cmos_sensor(0x380a, 0x07); - OV5670_write_cmos_sensor(0x380b, 0x98); - OV5670_write_cmos_sensor(0x380c, 0x07); // ;06 - OV5670_write_cmos_sensor(0x380d, 0xdc); // ;8c - OV5670_write_cmos_sensor(0x380e, 0x07); - OV5670_write_cmos_sensor(0x380f, 0xb8); - OV5670_write_cmos_sensor(0x3811, 0x04); - OV5670_write_cmos_sensor(0x3813, 0x02); - OV5670_write_cmos_sensor(0x3814, 0x01); - OV5670_write_cmos_sensor(0x3815, 0x01); - OV5670_write_cmos_sensor(0x3816, 0x00); - OV5670_write_cmos_sensor(0x3817, 0x00); - OV5670_write_cmos_sensor(0x3818, 0x00); - OV5670_write_cmos_sensor(0x3819, 0x00); - OV5670_write_cmos_sensor(0x3820, 0x80); - OV5670_write_cmos_sensor(0x3821, 0x46); - OV5670_write_cmos_sensor(0x3822, 0x48); - OV5670_write_cmos_sensor(0x3826, 0x00); - OV5670_write_cmos_sensor(0x3827, 0x08); - OV5670_write_cmos_sensor(0x382a, 0x01); - OV5670_write_cmos_sensor(0x382b, 0x01); - OV5670_write_cmos_sensor(0x3830, 0x08); - OV5670_write_cmos_sensor(0x3836, 0x02); - OV5670_write_cmos_sensor(0x3837, 0x00); - OV5670_write_cmos_sensor(0x3838, 0x10); - OV5670_write_cmos_sensor(0x3841, 0xff); - OV5670_write_cmos_sensor(0x3846, 0x48); - OV5670_write_cmos_sensor(0x3861, 0x00); - OV5670_write_cmos_sensor(0x3862, 0x04);//x00); - OV5670_write_cmos_sensor(0x3863, 0x06);//0x18); - OV5670_write_cmos_sensor(0x3a11, 0x01); - OV5670_write_cmos_sensor(0x3a12, 0x78); - OV5670_write_cmos_sensor(0x3b00, 0x00); - OV5670_write_cmos_sensor(0x3b02, 0x00); - OV5670_write_cmos_sensor(0x3b03, 0x00); - OV5670_write_cmos_sensor(0x3b04, 0x00); - OV5670_write_cmos_sensor(0x3b05, 0x00); - OV5670_write_cmos_sensor(0x3c00, 0x89); - OV5670_write_cmos_sensor(0x3c01, 0xab); - OV5670_write_cmos_sensor(0x3c02, 0x01); - OV5670_write_cmos_sensor(0x3c03, 0x00); - OV5670_write_cmos_sensor(0x3c04, 0x00); - OV5670_write_cmos_sensor(0x3c05, 0x03); - OV5670_write_cmos_sensor(0x3c06, 0x00); - OV5670_write_cmos_sensor(0x3c07, 0x05); - OV5670_write_cmos_sensor(0x3c0c, 0x00); - OV5670_write_cmos_sensor(0x3c0d, 0x00); - OV5670_write_cmos_sensor(0x3c0e, 0x00); - OV5670_write_cmos_sensor(0x3c0f, 0x00); - OV5670_write_cmos_sensor(0x3c40, 0x00); - OV5670_write_cmos_sensor(0x3c41, 0xa3); - OV5670_write_cmos_sensor(0x3c43, 0x7d); - OV5670_write_cmos_sensor(0x3c45, 0xd7); - OV5670_write_cmos_sensor(0x3c47, 0xfc); - OV5670_write_cmos_sensor(0x3c50, 0x05); - OV5670_write_cmos_sensor(0x3c52, 0xaa); - OV5670_write_cmos_sensor(0x3c54, 0x71); - OV5670_write_cmos_sensor(0x3c56, 0x80); - OV5670_write_cmos_sensor(0x3d85, 0x17); - OV5670_write_cmos_sensor(0x3f03, 0x00); - OV5670_write_cmos_sensor(0x3f0a, 0x00); - OV5670_write_cmos_sensor(0x3f0b, 0x00); - OV5670_write_cmos_sensor(0x4001, 0x60); - OV5670_write_cmos_sensor(0x4009, 0x0d); - OV5670_write_cmos_sensor(0x4020, 0x00); - OV5670_write_cmos_sensor(0x4021, 0x00); - OV5670_write_cmos_sensor(0x4022, 0x00); - OV5670_write_cmos_sensor(0x4023, 0x00); - OV5670_write_cmos_sensor(0x4024, 0x00); - OV5670_write_cmos_sensor(0x4025, 0x00); - OV5670_write_cmos_sensor(0x4026, 0x00); - OV5670_write_cmos_sensor(0x4027, 0x00); - OV5670_write_cmos_sensor(0x4028, 0x00); - OV5670_write_cmos_sensor(0x4029, 0x00); - OV5670_write_cmos_sensor(0x402a, 0x00); - OV5670_write_cmos_sensor(0x402b, 0x00); - OV5670_write_cmos_sensor(0x402c, 0x00); - OV5670_write_cmos_sensor(0x402d, 0x00); - OV5670_write_cmos_sensor(0x402e, 0x00); - OV5670_write_cmos_sensor(0x402f, 0x00); - OV5670_write_cmos_sensor(0x4040, 0x00); - OV5670_write_cmos_sensor(0x4041, 0x03);//0x00); - OV5670_write_cmos_sensor(0x4042, 0x00); - OV5670_write_cmos_sensor(0x4043, 0x7a);//0x80); - OV5670_write_cmos_sensor(0x4044, 0x00); - OV5670_write_cmos_sensor(0x4045, 0x7a);//0x80); - OV5670_write_cmos_sensor(0x4046, 0x00); - OV5670_write_cmos_sensor(0x4047, 0x7a);//0x80); - OV5670_write_cmos_sensor(0x4048, 0x00); - OV5670_write_cmos_sensor(0x4049, 0x7a);//0x80); - OV5670_write_cmos_sensor(0x4303, 0x00); - OV5670_write_cmos_sensor(0x4307, 0x30); - OV5670_write_cmos_sensor(0x4500, 0x58); - OV5670_write_cmos_sensor(0x4501, 0x04); - OV5670_write_cmos_sensor(0x4502, 0x40); - OV5670_write_cmos_sensor(0x4503, 0x10); - OV5670_write_cmos_sensor(0x4508, 0xaa); - OV5670_write_cmos_sensor(0x4509, 0xaa); - OV5670_write_cmos_sensor(0x450a, 0x00); - OV5670_write_cmos_sensor(0x450b, 0x00); - OV5670_write_cmos_sensor(0x4600, 0x01); - OV5670_write_cmos_sensor(0x4601, 0x03); - OV5670_write_cmos_sensor(0x4700, 0xa4); - OV5670_write_cmos_sensor(0x4800, 0x4c); - OV5670_write_cmos_sensor(0x4816, 0x53); - OV5670_write_cmos_sensor(0x481f, 0x40); - OV5670_write_cmos_sensor(0x4837, 0x14); // ;11 - OV5670_write_cmos_sensor(0x5000, 0x56);//0x16); - OV5670_write_cmos_sensor(0x5001, 0x01); - OV5670_write_cmos_sensor(0x5002, 0x28);//0xa8); - OV5670_write_cmos_sensor(0x5004, 0x0c); - OV5670_write_cmos_sensor(0x5006, 0x0c); - OV5670_write_cmos_sensor(0x5007, 0xe0); - OV5670_write_cmos_sensor(0x5008, 0x01); - OV5670_write_cmos_sensor(0x5009, 0xb0); - OV5670_write_cmos_sensor(0x5901, 0x00); - OV5670_write_cmos_sensor(0x5a01, 0x00); - OV5670_write_cmos_sensor(0x5a03, 0x00); - OV5670_write_cmos_sensor(0x5a04, 0x0c); - OV5670_write_cmos_sensor(0x5a05, 0xe0); - OV5670_write_cmos_sensor(0x5a06, 0x09); - OV5670_write_cmos_sensor(0x5a07, 0xb0); - OV5670_write_cmos_sensor(0x5a08, 0x06); - OV5670_write_cmos_sensor(0x5e00, 0x00); - //for BLC - OV5670_write_cmos_sensor(0x3734, 0x40); - OV5670_write_cmos_sensor(0x5b00, 0x01); - OV5670_write_cmos_sensor(0x5b01, 0x10); - OV5670_write_cmos_sensor(0x5b02, 0x01); - OV5670_write_cmos_sensor(0x5b03, 0xdb); - OV5670_write_cmos_sensor(0x3d8c, 0x71); - OV5670_write_cmos_sensor(0x3d8d, 0xea); - OV5670_write_cmos_sensor(0x4017, 0x08); - - OV5670_write_cmos_sensor(0x3618, 0x2a); - - //;Ally031414 - OV5670_write_cmos_sensor(0x3734, 0x40); // ;; Improve HFPN - OV5670_write_cmos_sensor(0x5b00, 0x01); // ;; [2:0] otp start addr[10:8] - OV5670_write_cmos_sensor(0x5b01, 0x10); // ;; [7:0] otp start addr[7:0] - OV5670_write_cmos_sensor(0x5b02, 0x01); // ;; [2:0] otp end addr[10:8] - OV5670_write_cmos_sensor(0x5b03, 0xDB); // ;; [7:0] otp end addr[7:0] - OV5670_write_cmos_sensor(0x3d8c, 0x71); //; Header address high byte - OV5670_write_cmos_sensor(0x3d8d, 0xEA); //; Header address low byte - OV5670_write_cmos_sensor(0x4017, 0x08); // ; threshold= 2LSB for full size - - //;Strong DPC1.53 - OV5670_write_cmos_sensor(0x5780, 0x3e); - OV5670_write_cmos_sensor(0x5781, 0x0f); - OV5670_write_cmos_sensor(0x5782, 0x44); - OV5670_write_cmos_sensor(0x5783, 0x02); - OV5670_write_cmos_sensor(0x5784, 0x01); - OV5670_write_cmos_sensor(0x5785, 0x00); - OV5670_write_cmos_sensor(0x5786, 0x00); - OV5670_write_cmos_sensor(0x5787, 0x04); - OV5670_write_cmos_sensor(0x5788, 0x02); - OV5670_write_cmos_sensor(0x5789, 0x0f); - OV5670_write_cmos_sensor(0x578a, 0xfd); - OV5670_write_cmos_sensor(0x578b, 0xf5); - OV5670_write_cmos_sensor(0x578c, 0xf5); - OV5670_write_cmos_sensor(0x578d, 0x03); - OV5670_write_cmos_sensor(0x578e, 0x08); - OV5670_write_cmos_sensor(0x578f, 0x0c); - OV5670_write_cmos_sensor(0x5790, 0x08); - OV5670_write_cmos_sensor(0x5791, 0x04); - OV5670_write_cmos_sensor(0x5792, 0x00); - OV5670_write_cmos_sensor(0x5793, 0x52); - OV5670_write_cmos_sensor(0x5794, 0xa3); - //;Ping - OV5670_write_cmos_sensor(0x380e, 0x07); //; fps fine adjustment - OV5670_write_cmos_sensor(0x380f, 0xfd); //; fps fine adjustment - OV5670_write_cmos_sensor(0x3503, 0x00); //; real gain [2] gain no delay, shutter no delay - //;added - OV5670_write_cmos_sensor(0x3d85, 0x17); - OV5670_write_cmos_sensor(0x3655, 0x20); - - OV5670_write_cmos_sensor(0x0100, 0x01); //;01 - - ov5670_otp_config(); -} - - -UINT32 OV5670Open(void) -{ - - volatile signed int i; - kal_uint16 sensor_id = 0; - - OV5670DB("OV5670 Open enter :\n "); - OV5670_write_cmos_sensor(0x0103,0x01);// Reset sensor - mdelay(2); - - for(i=0;i<2;i++) - { - sensor_id = (OV5670_read_cmos_sensor(0x300B)<<8)|OV5670_read_cmos_sensor(0x300C); - OV5670DB("OV5670 READ ID :%x",sensor_id); - if(sensor_id != OV5670MIPI_SENSOR_ID) - { - return ERROR_SENSOR_CONNECT_FAIL; - }else - break; - } - - OV5670_Sensor_Init(); - OV5670_Init_Para(); - OV5670DB("OV5670Open exit :\n "); - - return ERROR_NONE; -} - -void OV5670GetModuleID(void) -{ - struct otp_struct otp_info ; - - OV5670_write_cmos_sensor(0x0100, 0x01); //stream on - read_otp(&otp_info); - OV5670_write_cmos_sensor(0x0100, 0x00); //stream off -} - -UINT32 OV5670GetSensorID(UINT32 *sensorID) -{ - int retry = 2; - - OV5670DB("OV5670GetSensorID enter :\n "); - mdelay(5); - - do { - *sensorID = (OV5670_read_cmos_sensor(0x300B)<<8)|OV5670_read_cmos_sensor(0x300C); - if (*sensorID == OV5670MIPI_SENSOR_ID) - { - OV5670DB("Sensor ID = 0x%04x\n", *sensorID); - OV5670GetModuleID(); - break; - } - OV5670DB("Read Sensor ID Fail = 0x%04x\n", *sensorID); - retry--; - } while (retry > 0); - - if (*sensorID != OV5670MIPI_SENSOR_ID) { - OV5670DB("Read Sensor ID Fail = 0x%04x\n", *sensorID); - - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } else { - OV5670DB("alexadd %s module_id=%d", __func__, module_id); - if (module_id == 0x0c ||module_id != 0x44) return ERROR_NONE; - } - - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; -} - - -void OV5670_SetShutter(kal_uint32 iShutter) -{ - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.shutter= iShutter; - spin_unlock(&ov5670mipiraw_drv_lock); - - OV5670_write_shutter(iShutter); - return; -} - - - -UINT32 OV5670_read_shutter(void) -{ - - kal_uint16 temp_reg1, temp_reg2 ,temp_reg3; - UINT32 shutter =0; - temp_reg1 = OV5670_read_cmos_sensor(0x3500); // AEC[b19~b16] - temp_reg2 = OV5670_read_cmos_sensor(0x3501); // AEC[b15~b8] - temp_reg3 = OV5670_read_cmos_sensor(0x3502); // AEC[b7~b0] - - shutter = (temp_reg1 <<12)| (temp_reg2<<4)|(temp_reg3>>4); - - return shutter; -} - -void OV5670_NightMode(kal_bool bEnable) -{ - -} - -UINT32 OV5670Close(void) -{ - - return ERROR_NONE; -} - -#if 0 -void OV5670SetFlipMirror(kal_int32 imgMirror) -{ - kal_int16 mirror=0,flip=0; - mirror= OV5670_read_cmos_sensor(0x3820); - flip = OV5670_read_cmos_sensor(0x3821); - - switch (imgMirror) - { - case IMAGE_H_MIRROR://IMAGE_NORMAL: - OV5670_write_cmos_sensor(0x3820, (mirror & (0xF9)));//Set normal - OV5670_write_cmos_sensor(0x3821, (flip & (0xF9))); //Set normal - break; - case IMAGE_NORMAL://IMAGE_V_MIRROR: - OV5670_write_cmos_sensor(0x3820, (mirror & (0xF9)));//Set flip - OV5670_write_cmos_sensor(0x3821, (flip | (0x06))); //Set flip - break; - case IMAGE_HV_MIRROR://IMAGE_H_MIRROR: - OV5670_write_cmos_sensor(0x3820, (mirror |(0x06))); //Set mirror - OV5670_write_cmos_sensor(0x3821, (flip & (0xF9))); //Set mirror - break; - case IMAGE_V_MIRROR://IMAGE_HV_MIRROR: - OV5670_write_cmos_sensor(0x3820, (mirror |(0x06))); //Set mirror & flip - OV5670_write_cmos_sensor(0x3821, (flip |(0x06))); //Set mirror & flip - break; - } -} -#endif - - -UINT32 OV5670Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - OV5670DB("OV5670Preview enter:"); - - //OV5670PreviewSetting(); - OV5670CaptureSetting(); - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorMode = SENSOR_MODE_PREVIEW; - OV5670.DummyPixels = 0; - OV5670.DummyLines = 0 ; - OV5670_FeatureControl_PERIOD_PixelNum=OV5670_PV_PERIOD_PIXEL_NUMS+ OV5670.DummyPixels; - OV5670_FeatureControl_PERIOD_LineNum=OV5670_PV_PERIOD_LINE_NUMS+OV5670.DummyLines; - OV5670.imgMirror = sensor_config_data->SensorImageMirror; - spin_unlock(&ov5670mipiraw_drv_lock); - - //OV5670SetFlipMirror(sensor_config_data->SensorImageMirror); - - mdelay(20);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY - OV5670DB("OV5670Preview exit:\n"); - - - return ERROR_NONE; -} - - -UINT32 OV5670Video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - OV5670DB("OV5670Video enter:"); - - OV5670VideoSetting(); - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorMode = SENSOR_MODE_VIDEO; - OV5670_FeatureControl_PERIOD_PixelNum=OV5670_VIDEO_PERIOD_PIXEL_NUMS+ OV5670.DummyPixels; - OV5670_FeatureControl_PERIOD_LineNum=OV5670_VIDEO_PERIOD_LINE_NUMS+OV5670.DummyLines; - OV5670.imgMirror = sensor_config_data->SensorImageMirror; - spin_unlock(&ov5670mipiraw_drv_lock); - - //OV5670SetFlipMirror(sensor_config_data->SensorImageMirror); - - mdelay(40);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY - OV5670DB("OV5670Video exit:\n"); - return ERROR_NONE; -} - - -UINT32 OV5670Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - //kal_uint32 shutter = OV5670.shutter; - - if( SENSOR_MODE_CAPTURE== OV5670.sensorMode) - { - OV5670DB("OV5670Capture BusrtShot / ZSD!!!\n"); - } - else - { - OV5670DB("OV5670Capture enter:\n"); - - OV5670CaptureSetting(); - mdelay(40);//THIS DELAY SHOULD BE NEED BY CTS OR MONKEY - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorMode = SENSOR_MODE_CAPTURE; - OV5670.imgMirror = sensor_config_data->SensorImageMirror; - OV5670.DummyPixels = 0; - OV5670.DummyLines = 0 ; - OV5670_FeatureControl_PERIOD_PixelNum = OV5670_FULL_PERIOD_PIXEL_NUMS + OV5670.DummyPixels; - OV5670_FeatureControl_PERIOD_LineNum = OV5670_FULL_PERIOD_LINE_NUMS + OV5670.DummyLines; - spin_unlock(&ov5670mipiraw_drv_lock); - - //OV5670SetFlipMirror(sensor_config_data->SensorImageMirror); - - OV5670DB("OV5670Capture exit:\n"); - } - - if(OV5670_During_testpattern == KAL_TRUE) - { - OV5670_write_cmos_sensor(0x4303,0x80); - } - - return ERROR_NONE; -} - - - -UINT32 OV5670GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - - OV5670DB("OV5670GetResolution!!\n"); - - pSensorResolution->SensorPreviewWidth = OV5670_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorPreviewHeight = OV5670_IMAGE_SENSOR_FULL_HEIGHT; - - pSensorResolution->SensorFullWidth = OV5670_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight = OV5670_IMAGE_SENSOR_FULL_HEIGHT; - - pSensorResolution->SensorVideoWidth = OV5670_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight = OV5670_IMAGE_SENSOR_VIDEO_HEIGHT; - return ERROR_NONE; -} - -UINT32 OV5670GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.imgMirror = pSensorConfigData->SensorImageMirror ; - spin_unlock(&ov5670mipiraw_drv_lock); - - pSensorInfo->SensorOutputDataFormat= SENSOR_OUTPUT_FORMAT_RAW_B; - - pSensorInfo->SensorClockPolarity =SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_MIPI; - - pSensorInfo->CaptureDelayFrame = 2; - pSensorInfo->PreviewDelayFrame = 1; - pSensorInfo->VideoDelayFrame = 2; - - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; - pSensorInfo->AEShutDelayFrame = 0; - pSensorInfo->AESensorGainDelayFrame = 0; - pSensorInfo->AEISPGainDelayFrame = 2; - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV5670_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5670_PV_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV5670_VIDEO_X_START; - pSensorInfo->SensorGrabStartY = OV5670_VIDEO_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV5670_FULL_X_START; - pSensorInfo->SensorGrabStartY = OV5670_FULL_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - default: - pSensorInfo->SensorClockFreq=24; - pSensorInfo->SensorClockRisingCount= 0; - - pSensorInfo->SensorGrabStartX = OV5670_PV_X_START; - pSensorInfo->SensorGrabStartY = OV5670_PV_Y_START; - - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - break; - } - - memcpy(pSensorConfigData, &OV5670SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - - return ERROR_NONE; -} /* OV5670GetInfo() */ - - - -UINT32 OV5670Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - spin_lock(&ov5670mipiraw_drv_lock); - OV5670CurrentScenarioId = ScenarioId; - spin_unlock(&ov5670mipiraw_drv_lock); - - OV5670DB("OV5670CurrentScenarioId=%d\n",OV5670CurrentScenarioId); - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - OV5670Preview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - OV5670DB("OV5670 video_preiew sync\n"); - OV5670Video(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - OV5670Capture(pImageWindow, pSensorConfigData); - break; - - default: - return ERROR_INVALID_SCENARIO_ID; - - } - return ERROR_NONE; -} /* OV5670Control() */ - - - -kal_uint32 OV5670_SET_FrameLength_ByVideoMode(UINT16 Video_TargetFps) -{ - UINT32 frameRate = 0; - kal_uint32 MIN_FrameLength=0; - - if(OV5670.OV5670AutoFlickerMode == KAL_TRUE) - { - if (Video_TargetFps==30) - frameRate= OV5670_AUTOFLICKER_OFFSET_30; - else if(Video_TargetFps==15) - frameRate= OV5670_AUTOFLICKER_OFFSET_15; - else - frameRate=Video_TargetFps*10; - - MIN_FrameLength = (OV5670.videoPclk*10000)/(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/frameRate*10; - } - else - MIN_FrameLength = (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/Video_TargetFps; - - return MIN_FrameLength; - -} - - - -UINT32 OV5670SetVideoMode(UINT16 u2FrameRate) -{ - - kal_uint32 MIN_Frame_length =0,frameRate=0,extralines=0; - OV5670DB("[OV5670SetVideoMode] frame rate = %d\n", u2FrameRate); - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670_VIDEO_MODE_TARGET_FPS=u2FrameRate; - spin_unlock(&ov5670mipiraw_drv_lock); - - if(u2FrameRate==0) - { - OV5670DB("Disable Video Mode or dynimac fps\n"); - return KAL_TRUE; - } - if(u2FrameRate >30 || u2FrameRate <5) - OV5670DB("abmornal frame rate seting,pay attention~\n"); - - if(OV5670.sensorMode == SENSOR_MODE_VIDEO)//video ScenarioId recording - { - - MIN_Frame_length = OV5670_SET_FrameLength_ByVideoMode(u2FrameRate); - - if((MIN_Frame_length <=OV5670_VIDEO_PERIOD_LINE_NUMS)) - { - MIN_Frame_length = OV5670_VIDEO_PERIOD_LINE_NUMS; - OV5670DB("[OV5670SetVideoMode]current fps = %d\n", (OV5670.videoPclk*10000) /(OV5670_VIDEO_PERIOD_PIXEL_NUMS)/OV5670_VIDEO_PERIOD_LINE_NUMS); - } - OV5670DB("[OV5670SetVideoMode]current fps (10 base)= %d\n", (OV5670.videoPclk*10000)*10/(OV5670_VIDEO_PERIOD_PIXEL_NUMS + OV5670.DummyPixels)/MIN_Frame_length); - extralines = MIN_Frame_length - OV5670_VIDEO_PERIOD_LINE_NUMS; - - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.DummyPixels = 0;//define dummy pixels and lines - OV5670.DummyLines = extralines ; - spin_unlock(&ov5670mipiraw_drv_lock); - - OV5670_SetDummy(OV5670.DummyPixels,extralines); - } - - OV5670DB("[OV5670SetVideoMode]MIN_Frame_length=%d,OV5670.DummyLines=%d\n",MIN_Frame_length,OV5670.DummyLines); - - return KAL_TRUE; -} - - -UINT32 OV5670SetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - - if(bEnable) { - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.OV5670AutoFlickerMode = KAL_TRUE; - spin_unlock(&ov5670mipiraw_drv_lock); - OV5670DB("OV5670 Enable Auto flicker\n"); - } else { - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.OV5670AutoFlickerMode = KAL_FALSE; - spin_unlock(&ov5670mipiraw_drv_lock); - OV5670DB("OV5670 Disable Auto flicker\n"); - } - - return ERROR_NONE; -} - - -UINT32 OV5670SetTestPatternMode(kal_bool bEnable) -{ - OV5670DB("[OV5670SetTestPatternMode] Test pattern enable:%d\n", bEnable); - if(bEnable == KAL_TRUE) - { - OV5670_During_testpattern = KAL_TRUE; - - //OV5670_write_cmos_sensor(0x5000,0x16);// ; LENC off, MWB on, BPC on, WPC on - - OV5670_write_cmos_sensor(0x4303,0x08); - } - else - { - OV5670_During_testpattern = KAL_FALSE; - //OV5670_write_cmos_sensor(0x5000,0x96);// ; LENC on, MWB on, BPC on, WPC on - OV5670_write_cmos_sensor(0x4303,0x00); - } - - return ERROR_NONE; -} - - -/************************************************************************* -* -* DESCRIPTION: -* INTERFACE FUNCTION, FOR USER TO SET MAX FRAMERATE; -* -*************************************************************************/ -UINT32 OV5670MIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) { - kal_uint32 pclk; - kal_int16 dummyLine; - kal_uint16 lineLength,frameHeight; - - OV5670DB("OV5670MIPISetMaxFramerateByScenario: scenarioId = %d, frame rate = %d\n",scenarioId,frameRate); - switch (scenarioId) { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pclk = OV5670_PREVIEW_PCLK; - lineLength = OV5670_PV_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/lineLength; - dummyLine = frameHeight - OV5670_PV_PERIOD_LINE_NUMS; - if(dummyLine<0) - dummyLine = 0; - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorMode = SENSOR_MODE_PREVIEW; - spin_unlock(&ov5670mipiraw_drv_lock); - OV5670_SetDummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pclk = OV5670_VIDEO_PCLK; - lineLength = OV5670_VIDEO_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/lineLength; - dummyLine = frameHeight - OV5670_VIDEO_PERIOD_LINE_NUMS; - if(dummyLine<0) - dummyLine = 0; - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorMode = SENSOR_MODE_VIDEO; - spin_unlock(&ov5670mipiraw_drv_lock); - OV5670_SetDummy(0, dummyLine); - break; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pclk = OV5670_CAPTURE_PCLK; - lineLength = OV5670_FULL_PERIOD_PIXEL_NUMS; - frameHeight = (10 * pclk)/frameRate/lineLength; - dummyLine = frameHeight - OV5670_FULL_PERIOD_LINE_NUMS; - if(dummyLine<0) - dummyLine = 0; - spin_lock(&ov5670mipiraw_drv_lock); - OV5670.sensorMode = SENSOR_MODE_CAPTURE; - spin_unlock(&ov5670mipiraw_drv_lock); - OV5670_SetDummy(0, dummyLine); - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: - break; - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - break; - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: - break; - default: - break; - } - return ERROR_NONE; -} - - -UINT32 OV5670MIPIGetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate) -{ - - switch (scenarioId) { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - *pframeRate = OV5670_MAX_FPS_PREVIEW; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - *pframeRate = OV5670_MAX_FPS_CAPTURE; - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - *pframeRate = OV5670_MAX_FPS_CAPTURE; - break; - default: - break; - } - - return ERROR_NONE; -} - -/* Sensor output window information */ - -/* SZ TCT xuejian.zhong add for CTS test*/ - -static void OV5670GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - // SENSORDB("OV5670GetAFMaxNumFocusAreas *pFeatureReturnPara32 = %dÂ¥n", *pFeatureReturnPara32); -} - -static void OV5670GetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - // SENSORDB("OV5670GetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %dÂ¥n", *pFeatureReturnPara32); -} - -static void OV5670GetExifInfo(UINT32 exifAddr) -{ - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = AE_ISO_100; - pExifInfo->AWBMode = AWB_MODE_AUTO; - pExifInfo->CapExposureTime = 0; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = AE_ISO_100; -} - -/* SZ TCT xuejian.zhong end */ - - -UINT32 OV5670FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; - UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; - UINT32 SensorRegNumber; - UINT32 i; - PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++= OV5670_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16= OV5670_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PERIOD: - *pFeatureReturnPara16++= OV5670_FeatureControl_PERIOD_PixelNum; - *pFeatureReturnPara16= OV5670_FeatureControl_PERIOD_LineNum; - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: - switch(OV5670CurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK; - *pFeatureParaLen=4; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - *pFeatureReturnPara32 = OV5670_VIDEO_PCLK; - *pFeatureParaLen=4; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - *pFeatureReturnPara32 = OV5670_CAPTURE_PCLK; - *pFeatureParaLen=4; - break; - default: - *pFeatureReturnPara32 = OV5670_PREVIEW_PCLK; - *pFeatureParaLen=4; - break; - } - break; - - case SENSOR_FEATURE_SET_ESHUTTER: - OV5670_SetShutter(*pFeatureData16); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - OV5670_NightMode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: - OV5670_SetGain((UINT16) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - //OV5670_isp_master_clock=*pFeatureData32; - break; - case SENSOR_FEATURE_SET_REGISTER: - OV5670_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = OV5670_read_cmos_sensor(pSensorRegData->RegAddr); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - SensorRegNumber=FACTORY_END_ADDR; - for (i=0;i=sizeof(NVRAM_SENSOR_DATA_STRUCT)) - { - pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION; - pSensorDefaultData->SensorId=OV5670MIPI_SENSOR_ID; - memcpy(pSensorDefaultData->SensorEngReg, OV5670SensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END); - memcpy(pSensorDefaultData->SensorCCTReg, OV5670SensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR); - } - else - return FALSE; - *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pSensorConfigData, &OV5670SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - OV5670_camera_para_to_sensor(); - break; - - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - OV5670_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - *pFeatureReturnPara32++=OV5670_get_sensor_group_count(); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_GROUP_INFO: - OV5670_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount); - *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - OV5670_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo); - *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - - case SENSOR_FEATURE_SET_ITEM_INFO: - OV5670_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue); - *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - - case SENSOR_FEATURE_GET_ENG_INFO: - pSensorEngInfo->SensorId = 129; - pSensorEngInfo->SensorType = CMOS_SENSOR; - pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_B; - *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_INITIALIZE_AF: - break; - case SENSOR_FEATURE_CONSTANT_AF: - break; - case SENSOR_FEATURE_MOVE_FOCUS_LENS: - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - OV5670SetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - OV5670GetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - OV5670SetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: - OV5670MIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1)); - break; - case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: - OV5670MIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1))); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - OV5670SetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing - *pFeatureReturnPara32=OV5670_TEST_PATTERN_CHECKSUM; - *pFeatureParaLen=4; - break; - /*SZ TCT xuejian.zhong add for CTS test */ - case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: - OV5670GetAFMaxNumFocusAreas(pFeatureData32); - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: - OV5670GetAEMaxNumMeteringAreas(pFeatureData32); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - // SENSORDB("SENSOR_FEATURE_GET_EXIF_INFOÂ¥n"); - // SENSORDB("EXIF addr = 0x%xÂ¥n",*pFeatureData32); - - OV5670GetExifInfo(*pFeatureData32); - break; - /* xuejian.zhong add end */ - default: - break; - } - return ERROR_NONE; -} - - -SENSOR_FUNCTION_STRUCT SensorFuncOV5670= -{ - OV5670Open, - OV5670GetInfo, - OV5670GetResolution, - OV5670FeatureControl, - OV5670Control, - OV5670Close -}; - -UINT32 OV5670_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncOV5670; - - return ERROR_NONE; -} diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipi_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipi_Sensor.h deleted file mode 100644 index 7d76a015588..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/ov5670_mipi_raw/ov5670mipi_Sensor.h +++ /dev/null @@ -1,147 +0,0 @@ -/***************************************************************************** - * - * Filename: - * --------- - * OV5670mipi_Sensor.h - * - * Project: - * -------- - * ALPS - * - * Description: - * ------------ - * CMOS sensor header file - * - ****************************************************************************/ -#ifndef _OV5670MIPI_SENSOR_H -#define _OV5670MIPI_SENSOR_H - -typedef enum group_enum { - PRE_GAIN=0, - CMMCLK_CURRENT, - FRAME_RATE_LIMITATION, - REGISTER_EDITOR, - GROUP_TOTAL_NUMS -} FACTORY_GROUP_ENUM; - - -#define ENGINEER_START_ADDR 10 -#define FACTORY_START_ADDR 0 - -typedef enum engineer_index -{ - CMMCLK_CURRENT_INDEX=ENGINEER_START_ADDR, - ENGINEER_END -} FACTORY_ENGINEER_INDEX; - -typedef enum register_index -{ - SENSOR_BASEGAIN=FACTORY_START_ADDR, - PRE_GAIN_R_INDEX, - PRE_GAIN_Gr_INDEX, - PRE_GAIN_Gb_INDEX, - PRE_GAIN_B_INDEX, - FACTORY_END_ADDR -} FACTORY_REGISTER_INDEX; - -typedef struct -{ - SENSOR_REG_STRUCT Reg[ENGINEER_END]; - SENSOR_REG_STRUCT CCT[FACTORY_END_ADDR]; -} SENSOR_DATA_STRUCT, *PSENSOR_DATA_STRUCT; - -typedef enum { - SENSOR_MODE_INIT = 0, - SENSOR_MODE_PREVIEW, - SENSOR_MODE_VIDEO, - SENSOR_MODE_CAPTURE -} OV5670_SENSOR_MODE; - - -typedef struct -{ - kal_uint32 DummyPixels; - kal_uint32 DummyLines; - - kal_uint32 pvShutter; - kal_uint32 pvGain; - - kal_uint32 pvPclk; - kal_uint32 videoPclk; - kal_uint32 capPclk; - - kal_uint32 shutter; - - kal_uint16 sensorGlobalGain; - kal_uint16 ispBaseGain; - kal_uint16 realGain; - - kal_int16 imgMirror; - - OV5670_SENSOR_MODE sensorMode; - - kal_bool OV5670AutoFlickerMode; - kal_bool OV5670VideoMode; - -}OV5670_PARA_STRUCT,*POV5670_PARA_STRUCT; - - - #define OV5670_SHUTTER_MARGIN (4) - #define OV5670_GAIN_BASE (128) - #define OV5670_AUTOFLICKER_OFFSET_30 (296) - #define OV5670_AUTOFLICKER_OFFSET_25 (250) - #define OV5670_AUTOFLICKER_OFFSET_15 (146) - #define OV5670_PREVIEW_PCLK (102850000) - #define OV5670_VIDEO_PCLK (OV5670_PREVIEW_PCLK) - #define OV5670_CAPTURE_PCLK (102850000) - - #define OV5670_MAX_FPS_PREVIEW (300) - #define OV5670_MAX_FPS_VIDEO (300) - #define OV5670_MAX_FPS_CAPTURE (250) - //#define OV5670_MAX_FPS_N3D (300) - - - //grab window - #define OV5670_IMAGE_SENSOR_PV_WIDTH (1296) - #define OV5670_IMAGE_SENSOR_PV_HEIGHT (972) //(960) - #define OV5670_IMAGE_SENSOR_VIDEO_WIDTH (OV5670_IMAGE_SENSOR_PV_WIDTH) - #define OV5670_IMAGE_SENSOR_VIDEO_HEIGHT (OV5670_IMAGE_SENSOR_PV_HEIGHT) - #define OV5670_IMAGE_SENSOR_FULL_WIDTH (2592) - #define OV5670_IMAGE_SENSOR_FULL_HEIGHT (1944) - - #define OV5670_FULL_X_START (0) - #define OV5670_FULL_Y_START (0) - #define OV5670_PV_X_START (0) - #define OV5670_PV_Y_START (0) - #define OV5670_VIDEO_X_START (0) - #define OV5670_VIDEO_Y_START (0) - - #define OV5670_MAX_ANALOG_GAIN (8) - #define OV5670_MIN_ANALOG_GAIN (1) - - - /* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ - #define OV5670_PV_PERIOD_PIXEL_NUMS 0x068C //1676*2=>3352 - #define OV5670_PV_PERIOD_LINE_NUMS 0x07FD //2045 - - #define OV5670_VIDEO_PERIOD_PIXEL_NUMS OV5670_PV_PERIOD_PIXEL_NUMS - #define OV5670_VIDEO_PERIOD_LINE_NUMS OV5670_PV_PERIOD_LINE_NUMS - - #define OV5670_FULL_PERIOD_PIXEL_NUMS 0x07DC //2012*2 25fps - #define OV5670_FULL_PERIOD_LINE_NUMS 0x07FD //2045 - - #define OV5670MIPI_WRITE_ID (0x6c) - #define OV5670MIPI_READ_ID (0x6d) - - #define OV5670MIPI_SENSOR_ID OV5670_SENSOR_ID - - - UINT32 OV5670MIPIOpen(void); - UINT32 OV5670MIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); - UINT32 OV5670MIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); - UINT32 OV5670MIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); - UINT32 OV5670MIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); - UINT32 OV5670MIPIClose(void); - -#endif - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/Makefile b/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/Makefile deleted file mode 100644 index f86387482ff..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom - -obj-y += s5k5e2yamipiraw_Sensor.o - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Sensor.c deleted file mode 100644 index b93d6df15b7..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Sensor.c +++ /dev/null @@ -1,2171 +0,0 @@ -/*******************************************************************************************/ - - -/*******************************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "kd_camera_hw.h" -#include "kd_imgsensor.h" -#include "kd_imgsensor_define.h" -#include "kd_imgsensor_errcode.h" - -#include "s5k5e2yamipiraw_Sensor.h" -#include "s5k5e2yamipiraw_Camera_Sensor_para.h" -#include "s5k5e2yamipiraw_CameraCustomized.h" -static DEFINE_SPINLOCK(s5k5e2yamipiraw_drv_lock); - - -//#define S5K5E2YA_DEBUG_SOFIA - -#define mDELAY(ms) mdelay(ms) -#define Sleep(ms) mdelay(ms) - -#define S5K5E2YA_DEBUG -#ifdef S5K5E2YA_DEBUG -#define LOG_TAG (__FUNCTION__) -#define SENSORDB(fmt,arg...) xlog_printk(ANDROID_LOG_DEBUG , LOG_TAG, fmt, ##arg) //printk(LOG_TAG "%s: " fmt "\n", __FUNCTION__ ,##arg) -#else -#define SENSORDB(fmt,arg...) -#endif - - -#if 0 -#define S5K5E2YA_DEBUG -#ifdef S5K5E2YA_DEBUG - //#define S5K5E2YADB(fmt, arg...) printk( "[S5K5E2YARaw] " fmt, ##arg) - #define S5K5E2YADB(fmt, arg...) xlog_printk(ANDROID_LOG_DEBUG, "[S5K5E2YARaw]" fmt, #arg) -#else - #define S5K5E2YADB(x,...) -#endif - -#ifdef S5K5E2YA_DEBUG_SOFIA - #define S5K5E2YADBSOFIA(fmt, arg...) printk( "[S5K5E2YARaw] " fmt, ##arg) -#else - #define S5K5E2YADBSOFIA(x,...) -#endif -#endif - -#define S5K5E2YA_TEST_PATTERN_CHECKSUM (0x87e356d9) - - -MSDK_SENSOR_CONFIG_STRUCT S5K5E2YASensorConfigData; - -kal_uint32 S5K5E2YA_FAC_SENSOR_REG; -static MSDK_SCENARIO_ID_ENUM s_S5K5E2YACurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; - -/* FIXME: old factors and DIDNOT use now. s*/ -SENSOR_REG_STRUCT S5K5E2YASensorCCT[]=CAMERA_SENSOR_CCT_DEFAULT_VALUE; -SENSOR_REG_STRUCT S5K5E2YASensorReg[ENGINEER_END]=CAMERA_SENSOR_REG_DEFAULT_VALUE; -/* FIXME: old factors and DIDNOT use now. e*/ - -static S5K5E2YA_PARA_STRUCT s5k5e2ya; - -extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); -extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); -UINT32 S5K5E2YAMIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate); - -inline kal_uint16 S5K5E2YA_read_cmos_sensor(kal_uint32 addr) -{ - kal_uint16 get_byte=0; - char puSendCmd[2] = {(char)(addr >> 8) , (char)(addr & 0xFF) }; - iReadRegI2C(puSendCmd , 2, (u8*)&get_byte,1,S5K5E2YAMIPI_WRITE_ID); - return get_byte; -} - -inline void S5K5E2YA_wordwrite_cmos_sensor(u16 addr, u32 para) -{ - char puSendCmd[4] = {(char)(addr >> 8) , (char)(addr & 0xFF) , (char)(para >> 8), (char)(para & 0xFF) }; - iWriteRegI2C(puSendCmd , 4,S5K5E2YAMIPI_WRITE_ID); -} - -inline void S5K5E2YA_bytewrite_cmos_sensor(u16 addr, u32 para) -{ - char puSendCmd[4] = {(char)(addr >> 8) , (char)(addr & 0xFF) , (char)(para & 0xFF) }; - iWriteRegI2C(puSendCmd , 3,S5K5E2YAMIPI_WRITE_ID); -} - - - -//#define S5K5E2YA_USE_AWB_OTP -#if defined(S5K5E2YA_USE_AWB_OTP) - -#define RG_TYPICAL 0x2a1 -#define BG_TYPICAL 0x23f - - -kal_uint32 tRG_Ratio_typical = RG_TYPICAL; -kal_uint32 tBG_Ratio_typical = BG_TYPICAL; - - - - -void S5K5E2YA_MIPI_read_otp_wb(struct S5K5E2YA_MIPI_otp_struct *otp) -{ - kal_uint32 R_to_G, B_to_G, G_to_G; - kal_uint16 PageCount; - for(PageCount = 4; PageCount>=1; PageCount--) - { - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] PageCount=%d\n", PageCount); - S5K5E2YA_bytewrite_cmos_sensor(0x3a02, PageCount); //page set - S5K5E2YA_bytewrite_cmos_sensor(0x3a00, 0x01); //otp enable read - R_to_G = (S5K5E2YA_read_cmos_sensor(0x3a09)<<8)+S5K5E2YA_read_cmos_sensor(0x3a0a); - B_to_G = (S5K5E2YA_read_cmos_sensor(0x3a0b)<<8)+S5K5E2YA_read_cmos_sensor(0x3a0c); - G_to_G = (S5K5E2YA_read_cmos_sensor(0x3a0d)<<8)+S5K5E2YA_read_cmos_sensor(0x3a0e); - S5K5E2YA_bytewrite_cmos_sensor(0x3a00, 0x00); //otp disable read - - if((R_to_G != 0) && (B_to_G != 0) && (G_to_G != 0)) - break; - - if(PageCount == 1) - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] otp all value is zero"); - } - - otp->R_to_G = R_to_G; - otp->B_to_G = B_to_G; - otp->G_to_G = 0x400; - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] otp->R_to_G=0x%x\n", otp->R_to_G); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] otp->B_to_G=0x%x\n", otp->B_to_G); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] otp->G_to_G=0x%x\n", otp->G_to_G); -} - -void S5K5E2YA_MIPI_algorithm_otp_wb1(struct S5K5E2YA_MIPI_otp_struct *otp) -{ - kal_uint32 R_to_G, B_to_G, G_to_G; - kal_uint32 R_Gain, B_Gain, G_Gain; - kal_uint32 G_gain_R, G_gain_B; - - R_to_G = otp->R_to_G; - B_to_G = otp->B_to_G; - G_to_G = otp->G_to_G; - - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] R_to_G=%d\n", R_to_G); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] B_to_G=%d\n", B_to_G); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] G_to_G=%d\n", G_to_G); - - if(B_to_G < tBG_Ratio_typical) - { - if(R_to_G < tRG_Ratio_typical) - { - G_Gain = 0x100; - B_Gain = 0x100 * tBG_Ratio_typical / B_to_G; - R_Gain = 0x100 * tRG_Ratio_typical / R_to_G; - } - else - { - R_Gain = 0x100; - G_Gain = 0x100 * R_to_G / tRG_Ratio_typical; - B_Gain = G_Gain * tBG_Ratio_typical / B_to_G; - } - } - else - { - if(R_to_G < tRG_Ratio_typical) - { - B_Gain = 0x100; - G_Gain = 0x100 * B_to_G / tBG_Ratio_typical; - R_Gain = G_Gain * tRG_Ratio_typical / R_to_G; - } - else - { - G_gain_B = 0x100*B_to_G / tBG_Ratio_typical; - G_gain_R = 0x100*R_to_G / tRG_Ratio_typical; - - if(G_gain_B > G_gain_R) - { - B_Gain = 0x100; - G_Gain = G_gain_B; - R_Gain = G_Gain * tRG_Ratio_typical / R_to_G; - } - else - { - R_Gain = 0x100; - G_Gain = G_gain_R; - B_Gain = G_Gain * tBG_Ratio_typical / B_to_G; - } - } - } - - otp->R_Gain = R_Gain; - otp->B_Gain = B_Gain; - otp->G_Gain = G_Gain; - - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] R_gain=0x%x\n", otp->R_Gain); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] B_gain=0x%x\n", otp->B_Gain); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] G_gain=0x%x\n", otp->G_Gain); -} - - - -void S5K5E2YA_MIPI_write_otp_wb(struct S5K5E2YA_MIPI_otp_struct *otp) -{ - kal_uint16 R_GainH, B_GainH, G_GainH; - kal_uint16 R_GainL, B_GainL, G_GainL; - kal_uint32 temp; - - temp = otp->R_Gain; - R_GainH = (temp & 0xff00)>>8; - temp = otp->R_Gain; - R_GainL = (temp & 0x00ff); - - temp = otp->B_Gain; - B_GainH = (temp & 0xff00)>>8; - temp = otp->B_Gain; - B_GainL = (temp & 0x00ff); - - temp = otp->G_Gain; - G_GainH = (temp & 0xff00)>>8; - temp = otp->G_Gain; - G_GainL = (temp & 0x00ff); - - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] R_GainH=0x%x\n", R_GainH); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] R_GainL=0x%x\n", R_GainL); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] B_GainH=0x%x\n", B_GainH); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] B_GainL=0x%x\n", B_GainL); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] G_GainH=0x%x\n", G_GainH); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] G_GainL=0x%x\n", G_GainL); - - S5K5E2YA_bytewrite_cmos_sensor(0x020e, G_GainH); - S5K5E2YA_bytewrite_cmos_sensor(0x020f, G_GainL); - S5K5E2YA_bytewrite_cmos_sensor(0x0210, R_GainH); - S5K5E2YA_bytewrite_cmos_sensor(0x0211, R_GainL); - S5K5E2YA_bytewrite_cmos_sensor(0x0212, B_GainH); - S5K5E2YA_bytewrite_cmos_sensor(0x0213, B_GainL); - S5K5E2YA_bytewrite_cmos_sensor(0x0214, G_GainH); - S5K5E2YA_bytewrite_cmos_sensor(0x0215, G_GainL); - - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x020e,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x020e)); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x020f,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x020f)); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x0210,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x0210)); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x0211,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x0211)); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x0212,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x0212)); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x0213,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x0213)); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x0214,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x0214)); - SENSORDB("[S5K5E2YA] [S5K5E2YA_MIPI_read_otp_wb] [0x0215,0x%x]\n", S5K5E2YA_read_cmos_sensor(0x0215)); -} - -void S5K5E2YA_MIPI_update_wb_register_from_otp(void) -{ - struct S5K5E2YA_MIPI_otp_struct current_otp; - S5K5E2YA_MIPI_read_otp_wb(¤t_otp); - S5K5E2YA_MIPI_algorithm_otp_wb1(¤t_otp); - S5K5E2YA_MIPI_write_otp_wb(¤t_otp); -} -#endif - - -/* SZ TCT xuejian.zhong add for CTS test*/ -static void S5K5E2YAGetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("S5K5E2YAGetAFMaxNumFocusAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -static void S5K5E2YAGetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32) -{ - *pFeatureReturnPara32 = 0; - SENSORDB("S5K5E2YAGetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); -} - -static void S5K5E2YAGetExifInfo(UINT32 exifAddr) -{ - SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr; - pExifInfo->FNumber = 28; - pExifInfo->AEISOSpeed = AE_ISO_100; - pExifInfo->AWBMode = AWB_MODE_AUTO; - pExifInfo->CapExposureTime = 0; - pExifInfo->FlashLightTimeus = 0; - pExifInfo->RealISOValue = AE_ISO_100; -} - -/* SZ TCT xuejian.zhong end */ - - - - -static inline kal_uint32 GetScenarioLinelength(void) -{ - kal_uint32 u4Linelength=S5K5E2YA_PV_PERIOD_PIXEL_NUMS; //+s5k5e2ya.DummyPixels; - switch(s_S5K5E2YACurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - u4Linelength=S5K5E2YA_PV_PERIOD_PIXEL_NUMS; //+s5k5e2ya.DummyPixels; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - u4Linelength=S5K5E2YA_VIDEO_PERIOD_PIXEL_NUMS; //+s5k5e2ya.DummyPixels; - break; - case MSDK_SCENARIO_ID_CAMERA_ZSD: - u4Linelength=S5K5E2YA_ZSD_PERIOD_PIXEL_NUMS; //+s5k5e2ya.DummyPixels; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - u4Linelength=S5K5E2YA_FULL_PERIOD_PIXEL_NUMS; //+s5k5e2ya.DummyPixels; - break; - default: - break; - } - SENSORDB("u4Linelength=%d\n",u4Linelength); - return u4Linelength; -} - -static inline kal_uint32 GetScenarioPixelClock(void) -{ - SENSORDB("enter getscenariopixelclock\n"); - kal_uint32 pclk = s5k5e2ya.pvPclk; - switch(s_S5K5E2YACurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pclk = s5k5e2ya.pvPclk; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pclk = s5k5e2ya.m_vidPclk; - break; - case MSDK_SCENARIO_ID_CAMERA_ZSD: - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - pclk = s5k5e2ya.capPclk; - break; - default: - break; - } - SENSORDB("pixel clock=%d\n",pclk); - return pclk; -} - - -static inline kal_uint32 GetScenarioFramelength(void) -{ - SENSORDB("enter getscenarioframelength\n"); - kal_uint32 u4Framelength=S5K5E2YA_PV_PERIOD_LINE_NUMS; //+s5k5e2ya.DummyLines ; - switch(s_S5K5E2YACurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - u4Framelength=S5K5E2YA_PV_PERIOD_LINE_NUMS; //+s5k5e2ya.DummyLines ; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - u4Framelength=S5K5E2YA_VIDEO_PERIOD_LINE_NUMS; //+s5k5e2ya.DummyLines ; - break; - case MSDK_SCENARIO_ID_CAMERA_ZSD: - u4Framelength=S5K5E2YA_ZSD_PERIOD_LINE_NUMS; //+s5k5e2ya.DummyLines ; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - u4Framelength=S5K5E2YA_FULL_PERIOD_LINE_NUMS; //+s5k5e2ya.DummyLines ; - break; - default: - break; - } - SENSORDB("Framelength=%d\n",u4Framelength); - return u4Framelength; -} - -static inline void SetLinelength(kal_uint16 u2Linelength) -{ - SENSORDB("u4Linelength=%d\n",u2Linelength); - S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x01); //Grouped parameter hold - S5K5E2YA_wordwrite_cmos_sensor(0x0342,u2Linelength); - S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x00); //Grouped parameter release -} - -static inline void SetFramelength(kal_uint16 u2Framelength) -{ - SENSORDB("u2Framelength=%d\n",u2Framelength); - - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.maxExposureLines = u2Framelength; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x01); //Grouped parameter hold - S5K5E2YA_wordwrite_cmos_sensor(0x0340,u2Framelength); - S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x00); //Grouped parameter release -} - - - -void S5K5E2YA_write_shutter(kal_uint32 shutter) -{ - SENSORDB("enter s5k5 write shutter"); - kal_uint32 frame_length = 0, line_length = 0, framerate = 0 , pixelclock = 0; - unsigned long flags; - - #define SHUTTER_FRAMELENGTH_MARGIN 16 - - frame_length = GetScenarioFramelength(); - - frame_length = (s5k5e2ya.FixedFrameLength>frame_length)?s5k5e2ya.FixedFrameLength:frame_length; - - if (shutter < 3) - shutter = 3; - - if (shutter+SHUTTER_FRAMELENGTH_MARGIN > frame_length) - frame_length = shutter + SHUTTER_FRAMELENGTH_MARGIN; //extend framelength - - if(s5k5e2ya.S5K5E2YAAutoFlickerMode == KAL_TRUE) - { - line_length = GetScenarioLinelength(); - pixelclock = GetScenarioPixelClock(); - framerate = (10 * pixelclock) / (frame_length * line_length); - if(framerate == 300) - framerate = 296; - else if(framerate == 150) - framerate = 148; - } - - spin_lock_irqsave(&s5k5e2yamipiraw_drv_lock,flags); - s5k5e2ya.maxExposureLines = frame_length; - s5k5e2ya.shutter = shutter; - spin_unlock_irqrestore(&s5k5e2yamipiraw_drv_lock,flags); - - //S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x01); //Grouped parameter hold - S5K5E2YA_wordwrite_cmos_sensor(0x0202, shutter); - S5K5E2YA_wordwrite_cmos_sensor(0x0340,frame_length); - //S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x00); //Grouped parameter release - - SENSORDB("shutter=%d,framerate=%d\n",shutter,framerate); -} /* write_S5K5E2YA_shutter */ - - - - -/************************************************************************* -* FUNCTION -* S5K5E2YA_SetGain -* -* DESCRIPTION -* This function is to set global gain to sensor. -* -* PARAMETERS -* gain : sensor global gain(base: 0x40) -* -* RETURNS -* the actually gain set to sensor. -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void S5K5E2YA_SetGain(UINT16 gain) -{ - - unsigned long flags; - SENSORDB("gain=%d\n",gain); - - spin_lock_irqsave(&s5k5e2yamipiraw_drv_lock,flags); - s5k5e2ya.sensorGain = gain/2; - spin_unlock_irqrestore(&s5k5e2yamipiraw_drv_lock,flags); - - //S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x01); //Grouped parameter hold - S5K5E2YA_wordwrite_cmos_sensor(0x0204,s5k5e2ya.sensorGain); //sensor base gain is 32 - //S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x00); //Grouped parameter release - - SENSORDB("enter s5k5 setgain"); -} - - -void S5K5E2YA_camera_para_to_sensor(void) -{ - /* kal_uint32 i; - for(i=0; 0xFFFFFFFF!=S5K5E2YASensorReg[i].Addr; i++) - { - S5K5E2YA_wordwrite_cmos_sensor(S5K5E2YASensorReg[i].Addr, S5K5E2YASensorReg[i].Para); - } - for(i=ENGINEER_START_ADDR; 0xFFFFFFFF!=S5K5E2YASensorReg[i].Addr; i++) - { - S5K5E2YA_wordwrite_cmos_sensor(S5K5E2YASensorReg[i].Addr, S5K5E2YASensorReg[i].Para); - } - for(i=FACTORY_START_ADDR; iItemNamePtr,"Pregain-R"); - temp_addr = PRE_GAIN_R_INDEX; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gr"); - temp_addr = PRE_GAIN_Gr_INDEX; - break; - case 2: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-Gb"); - temp_addr = PRE_GAIN_Gb_INDEX; - break; - case 3: - sprintf((char *)info_ptr->ItemNamePtr,"Pregain-B"); - temp_addr = PRE_GAIN_B_INDEX; - break; - case 4: - sprintf((char *)info_ptr->ItemNamePtr,"SENSOR_BASEGAIN"); - temp_addr = SENSOR_BASEGAIN; - break; - default: - ASSERT(0); - } - - temp_para= S5K5E2YASensorCCT[temp_addr].Para; - temp_gain= (temp_para*1000/s5k5e2ya.sensorBaseGain) ; - - info_ptr->ItemValue=temp_gain; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min= S5K5E2YA_MIN_ANALOG_GAIN * 1000; - info_ptr->Max= S5K5E2YA_MAX_ANALOG_GAIN * 1000; - break; - case CMMCLK_CURRENT: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"Drv Cur[2,4,6,8]mA"); - - //temp_reg=MT9P017SensorReg[CMMCLK_CURRENT_INDEX].Para; - temp_reg = ISP_DRIVING_2MA; - if(temp_reg==ISP_DRIVING_2MA) - { - info_ptr->ItemValue=2; - } - else if(temp_reg==ISP_DRIVING_4MA) - { - info_ptr->ItemValue=4; - } - else if(temp_reg==ISP_DRIVING_6MA) - { - info_ptr->ItemValue=6; - } - else if(temp_reg==ISP_DRIVING_8MA) - { - info_ptr->ItemValue=8; - } - - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_TRUE; - info_ptr->Min=2; - info_ptr->Max=8; - break; - default: - ASSERT(0); - } - break; - case FRAME_RATE_LIMITATION: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"Max Exposure Lines"); - info_ptr->ItemValue= 111; //MT9P017_MAX_EXPOSURE_LINES; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_TRUE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"Min Frame Rate"); - info_ptr->ItemValue=12; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_TRUE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0; - break; - default: - ASSERT(0); - } - break; - case REGISTER_EDITOR: - switch (item_idx) - { - case 0: - sprintf((char *)info_ptr->ItemNamePtr,"REG Addr."); - info_ptr->ItemValue=0; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0xFFFF; - break; - case 1: - sprintf((char *)info_ptr->ItemNamePtr,"REG Value"); - info_ptr->ItemValue=0; - info_ptr->IsTrueFalse=KAL_FALSE; - info_ptr->IsReadOnly=KAL_FALSE; - info_ptr->IsNeedRestart=KAL_FALSE; - info_ptr->Min=0; - info_ptr->Max=0xFFFF; - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - }*/ -} - - - -kal_bool S5K5E2YA_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 ItemValue) -{ -/* - kal_uint16 temp_gain=0,temp_addr=0, temp_para=0; - switch (group_idx) - { - case PRE_GAIN: - switch (item_idx) - { - case 0: temp_addr = PRE_GAIN_R_INDEX; break; - case 1: temp_addr = PRE_GAIN_Gr_INDEX; break; - case 2: temp_addr = PRE_GAIN_Gb_INDEX; break; - case 3: temp_addr = PRE_GAIN_B_INDEX; break; - case 4: temp_addr = SENSOR_BASEGAIN; break; - default: ASSERT(0); - } - - temp_gain=((ItemValue*s5k5e2ya.sensorBaseGain+500)/1000); //+500:get closed integer value - - spin_lock(&s5k5e2yamipiraw_drv_lock); - S5K5E2YASensorCCT[temp_addr].Para = temp_para; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - S5K5E2YA_wordwrite_cmos_sensor(S5K5E2YASensorCCT[temp_addr].Addr,temp_para); - break; - - case CMMCLK_CURRENT: - switch (item_idx) - { - case 0: - //no need to apply this item for driving current - break; - default: - ASSERT(0); - } - break; - case FRAME_RATE_LIMITATION: - ASSERT(0); - break; - case REGISTER_EDITOR: - switch (item_idx) - { - case 0: - spin_lock(&s5k5e2yamipiraw_drv_lock); - S5K5E2YA_FAC_SENSOR_REG=ItemValue; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - break; - case 1: - S5K5E2YA_wordwrite_cmos_sensor(S5K5E2YA_FAC_SENSOR_REG,ItemValue); - break; - default: - ASSERT(0); - } - break; - default: - ASSERT(0); - }*/ - return KAL_TRUE; -} - - -static void S5K5E2YA_SetDummy( const kal_uint32 iPixels, const kal_uint32 iLines ) -{ - kal_uint16 u2Linelength = 0,u2Framelength = 0; - SENSORDB("iPixels=%d,iLines=%d\n",iPixels,iLines); - - switch (s_S5K5E2YACurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - u2Linelength = S5K5E2YA_PV_PERIOD_PIXEL_NUMS+iPixels; - u2Framelength = S5K5E2YA_PV_PERIOD_LINE_NUMS+iLines; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - u2Linelength = S5K5E2YA_VIDEO_PERIOD_PIXEL_NUMS+iPixels; - u2Framelength = S5K5E2YA_VIDEO_PERIOD_LINE_NUMS+iLines; - break; - case MSDK_SCENARIO_ID_CAMERA_ZSD: - u2Linelength = S5K5E2YA_ZSD_PERIOD_PIXEL_NUMS+iPixels; - u2Framelength = S5K5E2YA_ZSD_PERIOD_LINE_NUMS+iLines; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - u2Linelength = S5K5E2YA_FULL_PERIOD_PIXEL_NUMS+iPixels; - u2Framelength = S5K5E2YA_FULL_PERIOD_LINE_NUMS+iLines; - break; - default: - u2Linelength = S5K5E2YA_PV_PERIOD_PIXEL_NUMS+iPixels; - u2Framelength = S5K5E2YA_PV_PERIOD_LINE_NUMS+iLines; - break; - } - - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.maxExposureLines = u2Framelength; - s5k5e2ya.DummyPixels=iPixels; - s5k5e2ya.DummyLines=iLines; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - //S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x01); //Grouped parameter hold - S5K5E2YA_wordwrite_cmos_sensor(0x0340,u2Framelength); - S5K5E2YA_wordwrite_cmos_sensor(0x0342,u2Linelength); - //S5K5E2YA_bytewrite_cmos_sensor(0x0104, 0x00); //Grouped parameter hold -} - - - -void S5K5E2YAPreviewSetting(void) -{ - - SENSORDB("s5k5e2yaPreview Setting Start\n"); - - // Reset for operation - S5K5E2YA_bytewrite_cmos_sensor(0x0100,0x00); //stream off - - // Clock Setting - S5K5E2YA_bytewrite_cmos_sensor(0x0305,0x06); //PLLP (def:5) - S5K5E2YA_bytewrite_cmos_sensor(0x0306,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x0307,0xE0); //PLLM (def:CCh 204d --> B3h 179d) - S5K5E2YA_bytewrite_cmos_sensor(0x3C1F,0x00); //PLLS - - S5K5E2YA_bytewrite_cmos_sensor(0x0820,0x03); // requested link bit rate mbps : (def:3D3h 979d --> 35Bh 859d) - S5K5E2YA_bytewrite_cmos_sensor(0x0821,0x80); - S5K5E2YA_bytewrite_cmos_sensor(0x3C1C,0x58); //dbr_div - - - // Size Setting - S5K5E2YA_bytewrite_cmos_sensor(0x0340,0x07); // frame_length_lines : def. 990d (--> 3C8 Mimnimum 22 lines) - S5K5E2YA_bytewrite_cmos_sensor(0x0341,0xD0); - S5K5E2YA_bytewrite_cmos_sensor(0x0342,0x0B); // line_length_pck : def. 2950d - S5K5E2YA_bytewrite_cmos_sensor(0x0343,0x86); - - S5K5E2YA_bytewrite_cmos_sensor(0x0344,0x00); // x_addr_start - S5K5E2YA_bytewrite_cmos_sensor(0x0345,0x08); - S5K5E2YA_bytewrite_cmos_sensor(0x0346,0x00); // y_addr_start - S5K5E2YA_bytewrite_cmos_sensor(0x0347,0x08); - S5K5E2YA_bytewrite_cmos_sensor(0x0348,0x0A); // x_addr_end : def. 2575d - S5K5E2YA_bytewrite_cmos_sensor(0x0349,0x07); - S5K5E2YA_bytewrite_cmos_sensor(0x034A,0x07); // y_addr_end : def. 1936d - S5K5E2YA_bytewrite_cmos_sensor(0x034B,0x87); - S5K5E2YA_bytewrite_cmos_sensor(0x034C,0x05); // x_output size : def. 1280d - S5K5E2YA_bytewrite_cmos_sensor(0x034D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x034E,0x03); // y_output size : def. 960d - S5K5E2YA_bytewrite_cmos_sensor(0x034F,0xC0); - - - //Digital Binning - S5K5E2YA_bytewrite_cmos_sensor(0x0900,0x01); //2x2 Binning - S5K5E2YA_bytewrite_cmos_sensor(0x0901,0x22); - S5K5E2YA_bytewrite_cmos_sensor(0x0387,0x03); - - //Integration time - S5K5E2YA_bytewrite_cmos_sensor(0x0202,0x02); // coarse integration - S5K5E2YA_bytewrite_cmos_sensor(0x0203,0x00); - - - //Analog Timing Tuning (140117) - S5K5E2YA_bytewrite_cmos_sensor(0x3000,0x04); // ct_ld_start - S5K5E2YA_bytewrite_cmos_sensor(0x3002,0x03); // ct_sl_start - S5K5E2YA_bytewrite_cmos_sensor(0x3003,0x04); // ct_sl_margin - S5K5E2YA_bytewrite_cmos_sensor(0x3004,0x02); // ct_rx_start - S5K5E2YA_bytewrite_cmos_sensor(0x3005,0x00); // ct_rx_margin (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3006,0x10); // ct_rx_margin (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3007,0x03); // ct_tx_start - S5K5E2YA_bytewrite_cmos_sensor(0x3008,0x46); // ct_tx_width - S5K5E2YA_bytewrite_cmos_sensor(0x0200,0x04); // (fine_integ_time) (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x0201,0x98); // (fine_integ_time) (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3039,0x05); // cintc1_margin - S5K5E2YA_bytewrite_cmos_sensor(0x303A,0x05); // cintc2_margin - S5K5E2YA_bytewrite_cmos_sensor(0x303B,0x00); // offs_sh - S5K5E2YA_bytewrite_cmos_sensor(0x3009,0x05); // ct_srx_margin - S5K5E2YA_bytewrite_cmos_sensor(0x300A,0x46); // ct_stx_width - S5K5E2YA_bytewrite_cmos_sensor(0x300B,0x2E); // ct_dstx_width - S5K5E2YA_bytewrite_cmos_sensor(0x300C,0x10); // ct_stx2dstx - S5K5E2YA_bytewrite_cmos_sensor(0x3012,0x05); // ct_cds_start - S5K5E2YA_bytewrite_cmos_sensor(0x3013,0x00); // ct_s1s_start - S5K5E2YA_bytewrite_cmos_sensor(0x3014,0x1C); // ct_s1s_end - S5K5E2YA_bytewrite_cmos_sensor(0x300E,0x64); // ct_S5K5E2YA_bytewrite_cmos_sensor(0x3_width - S5K5E2YA_bytewrite_cmos_sensor(0x3010,0x56); // ct_s4_width - S5K5E2YA_bytewrite_cmos_sensor(0x3019,0x03); // ct_s4d_start - S5K5E2YA_bytewrite_cmos_sensor(0x301A,0x00); // ct_pbr_start - S5K5E2YA_bytewrite_cmos_sensor(0x301B,0x05); // ct_pbr_width - S5K5E2YA_bytewrite_cmos_sensor(0x301C,0x00); // ct_pbs_start - S5K5E2YA_bytewrite_cmos_sensor(0x301D,0x1C); // ct_pbs_width - S5K5E2YA_bytewrite_cmos_sensor(0x301E,0x00); // ct_pbr_ob_start - S5K5E2YA_bytewrite_cmos_sensor(0x301F,0x0E); // ct_pbr_ob_width - S5K5E2YA_bytewrite_cmos_sensor(0x3020,0x00); // ct_pbs_ob_start - S5K5E2YA_bytewrite_cmos_sensor(0x3021,0x00); // ct_pbs_ob_width - S5K5E2YA_bytewrite_cmos_sensor(0x3022,0x0A); // ct_cds_lim_start - S5K5E2YA_bytewrite_cmos_sensor(0x3023,0x19); // ct_crs_start - S5K5E2YA_bytewrite_cmos_sensor(0x3024,0x00); // ct_lp_hblk_cds_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3025,0x00); // ct_lp_hblk_cds_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3026,0x00); // ct_lp_hblk_cds_end (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3027,0x00); // ct_lp_hblk_cds_end (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3028,0x16); // ct_rmp_off_start - S5K5E2YA_bytewrite_cmos_sensor(0x3015,0x00); // ct_rmp_rst_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3016,0x6D); // ct_rmp_rst_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3017,0x00); // ct_rmp_sig_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3018,0x84); // ct_rmp_sig_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x302B,0x10); // ct_cnt_margin - S5K5E2YA_bytewrite_cmos_sensor(0x302C,0x0A); // ct_rmp_per - S5K5E2YA_bytewrite_cmos_sensor(0x302D,0x06); // ct_cnt_ms_margin1 - S5K5E2YA_bytewrite_cmos_sensor(0x302E,0x05); // ct_cnt_ms_margin2 - S5K5E2YA_bytewrite_cmos_sensor(0x302F,0x0E); // rst_mx - S5K5E2YA_bytewrite_cmos_sensor(0x3030,0x2F); // sig_mx - S5K5E2YA_bytewrite_cmos_sensor(0x3031,0x08); // ct_latch_start - S5K5E2YA_bytewrite_cmos_sensor(0x3032,0x05); // ct_latch_width - S5K5E2YA_bytewrite_cmos_sensor(0x3033,0x09); // ct_hold_start - S5K5E2YA_bytewrite_cmos_sensor(0x3034,0x05); // ct_hold_width - S5K5E2YA_bytewrite_cmos_sensor(0x3035,0x00); // ct_lp_hblk_dbs_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3036,0x00); // ct_lp_hblk_dbs_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3037,0x00); // ct_lp_hblk_dbs_end (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3038,0x00); // ct_lp_hblk_dbs_end (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3088,0x06); // ct_lat_lsb_offset_start1 - S5K5E2YA_bytewrite_cmos_sensor(0x308A,0x08); // ct_lat_lsb_offset_end1 - S5K5E2YA_bytewrite_cmos_sensor(0x308C,0x05); // ct_lat_lsb_offset_start2 - S5K5E2YA_bytewrite_cmos_sensor(0x308E,0x07); // ct_lat_lsb_offset_end2 - S5K5E2YA_bytewrite_cmos_sensor(0x3090,0x06); // ct_conv_en_offset_start1 - S5K5E2YA_bytewrite_cmos_sensor(0x3092,0x08); // ct_conv_en_offset_end1 - S5K5E2YA_bytewrite_cmos_sensor(0x3094,0x05); // ct_conv_en_offset_start2 - S5K5E2YA_bytewrite_cmos_sensor(0x3096,0x21); // ct_conv_en_offset_end2 - - //CDS - S5K5E2YA_bytewrite_cmos_sensor(0x3099,0x0E); // cds_option ([3]:crs switch disable, S5K5E2YA_bytewrite_cmos_sensor(0x3,s4 strengthx16) - S5K5E2YA_bytewrite_cmos_sensor(0x3070,0x10); // comp1_bias (default:77) - S5K5E2YA_bytewrite_cmos_sensor(0x3085,0x11); // comp1_bias (gain1~4) - S5K5E2YA_bytewrite_cmos_sensor(0x3086,0x01); // comp1_bias (gain4~8) - - - - //RMP - S5K5E2YA_bytewrite_cmos_sensor(0x3064,0x00); // Multiple sampling(gainx8,x16) - S5K5E2YA_bytewrite_cmos_sensor(0x3062,0x08); // off_rst - - //DBR - S5K5E2YA_bytewrite_cmos_sensor(0x3061,0x11); // dbr_tune_rd (default :08, 0E 3.02V) 3.1V - S5K5E2YA_bytewrite_cmos_sensor(0x307B,0x20); // dbr_tune_rgsl (default :08) - - //Bias sampling - S5K5E2YA_bytewrite_cmos_sensor(0x3068,0x00); // RMP BP bias sampling [0]: Disable - S5K5E2YA_bytewrite_cmos_sensor(0x3074,0x00); // Pixel bias sampling [2]:Default L - S5K5E2YA_bytewrite_cmos_sensor(0x307D,0x00); // VREF sampling [0] : Disable - S5K5E2YA_bytewrite_cmos_sensor(0x3045,0x01); // ct_opt_l1_start - S5K5E2YA_bytewrite_cmos_sensor(0x3046,0x05); // ct_opt_l1_width - S5K5E2YA_bytewrite_cmos_sensor(0x3047,0x78); - - //Smart PLA - S5K5E2YA_bytewrite_cmos_sensor(0x307F,0xB1); //RDV_OPTION[5:4], RG default high - S5K5E2YA_bytewrite_cmos_sensor(0x3098,0x01); //CDS_OPTION[16] SPLA-II enable - S5K5E2YA_bytewrite_cmos_sensor(0x305C,0xF6); //lob_extension[6] - - S5K5E2YA_bytewrite_cmos_sensor(0x306B,0x10); // [3]bls_stx_en disable - S5K5E2YA_bytewrite_cmos_sensor(0x3063,0x27); // ADC_SAT - S5K5E2YA_bytewrite_cmos_sensor(0x320C,0x07); // ADC_MAX (def:076Ch --> 0700h) - S5K5E2YA_bytewrite_cmos_sensor(0x320D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x3400,0x01); // GAS bypass - S5K5E2YA_bytewrite_cmos_sensor(0x3235,0x49); // L/F-ADLC on - S5K5E2YA_bytewrite_cmos_sensor(0x3233,0x00); // D-pedestal L/F ADLC off (1FC0h) - S5K5E2YA_bytewrite_cmos_sensor(0x3234,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x3300,0x0C); //BPC On - S5K5E2YA_bytewrite_cmos_sensor(0x0204,0x00); //Analog gain x1 - S5K5E2YA_bytewrite_cmos_sensor(0x0205,0x20); - - S5K5E2YA_bytewrite_cmos_sensor(0x3203,0x45); - S5K5E2YA_bytewrite_cmos_sensor(0x3205,0x4D); - S5K5E2YA_bytewrite_cmos_sensor(0x320B,0x40); - S5K5E2YA_bytewrite_cmos_sensor(0x320C,0x06); - S5K5E2YA_bytewrite_cmos_sensor(0x320D,0xC0); - - //LSC settting for 2560x1920 - - S5K5E2YA_bytewrite_cmos_sensor(0x340B,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x340C,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x340D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x340E,0x00); - - S5K5E2YA_bytewrite_cmos_sensor(0x3401,0x50); - S5K5E2YA_bytewrite_cmos_sensor(0x3402,0x3C); - S5K5E2YA_bytewrite_cmos_sensor(0x3403,0x03); - S5K5E2YA_bytewrite_cmos_sensor(0x3404,0x33); - S5K5E2YA_bytewrite_cmos_sensor(0x3405,0x04); - S5K5E2YA_bytewrite_cmos_sensor(0x3406,0x44); - S5K5E2YA_bytewrite_cmos_sensor(0x3458,0x03); - S5K5E2YA_bytewrite_cmos_sensor(0x3459,0x33); - S5K5E2YA_bytewrite_cmos_sensor(0x345A,0x04); - S5K5E2YA_bytewrite_cmos_sensor(0x345B,0x44); - - // S5K5E2YA_bytewrite_cmos_sensor(0x3200,0x00); - - // streaming ON - S5K5E2YA_bytewrite_cmos_sensor(0x0100,0x01); - - mDELAY(50); - - SENSORDB("preview setting end\n"); -} - -void S5K5E2YAVideoSetting(void) -{ - SENSORDB("enter s5k5e2ya video setting\n"); - - - // Reset for operation - S5K5E2YA_bytewrite_cmos_sensor(0x0100,0x00); //stream off - - // Clock Setting - S5K5E2YA_bytewrite_cmos_sensor(0x0305,0x06); //PLLP (def:5) - S5K5E2YA_bytewrite_cmos_sensor(0x0306,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x0307,0xE0); //PLLM (def:CCh 204d --> B3h 179d) - S5K5E2YA_bytewrite_cmos_sensor(0x3C1F,0x00); //PLLS - - - S5K5E2YA_bytewrite_cmos_sensor(0x0820,0x03); // requested link bit rate mbps : (def:3D3h 979d --> 35Bh 859d) - S5K5E2YA_bytewrite_cmos_sensor(0x0821,0x80); - S5K5E2YA_bytewrite_cmos_sensor(0x3C1C,0x58); //dbr_div - - - // Size Setting - S5K5E2YA_bytewrite_cmos_sensor(0x0340,0x07); // frame_length_lines : def. 1962d (7C2 --> 7A6 Mimnimum 23 lines) - S5K5E2YA_bytewrite_cmos_sensor(0x0341,0xD0); - S5K5E2YA_bytewrite_cmos_sensor(0x0342,0x0B); // line_length_pck : def. 2950d - S5K5E2YA_bytewrite_cmos_sensor(0x0343,0x86); - - S5K5E2YA_bytewrite_cmos_sensor(0x0344,0x00); // x_addr_start - S5K5E2YA_bytewrite_cmos_sensor(0x0345,0x08); - S5K5E2YA_bytewrite_cmos_sensor(0x0346,0x00); // y_addr_start - S5K5E2YA_bytewrite_cmos_sensor(0x0347,0xF8); - S5K5E2YA_bytewrite_cmos_sensor(0x0348,0x0A); // x_addr_end : def. 2575d - S5K5E2YA_bytewrite_cmos_sensor(0x0349,0x07); - S5K5E2YA_bytewrite_cmos_sensor(0x034A,0x06); // y_addr_end : def. 1936d - S5K5E2YA_bytewrite_cmos_sensor(0x034B,0x97); - S5K5E2YA_bytewrite_cmos_sensor(0x034C,0x0A); // x_output size : def. 2560d - S5K5E2YA_bytewrite_cmos_sensor(0x034D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x034E,0x05); // y_output size : def. 1440d - S5K5E2YA_bytewrite_cmos_sensor(0x034F,0xA0); - - //Digital Binning(default) - S5K5E2YA_bytewrite_cmos_sensor(0x0900,0x00); //0x0 Binning - S5K5E2YA_bytewrite_cmos_sensor(0x0901,0x20); - S5K5E2YA_bytewrite_cmos_sensor(0x0387,0x01); - - - //Integration time - S5K5E2YA_bytewrite_cmos_sensor(0x0202,0x02); // coarse integration - S5K5E2YA_bytewrite_cmos_sensor(0x0203,0x00); - - //Analog Timing Tuning (140117) - S5K5E2YA_bytewrite_cmos_sensor(0x3000,0x04); // ct_ld_start - S5K5E2YA_bytewrite_cmos_sensor(0x3002,0x03); // ct_sl_start - S5K5E2YA_bytewrite_cmos_sensor(0x3003,0x04); // ct_sl_margin - S5K5E2YA_bytewrite_cmos_sensor(0x3004,0x02); // ct_rx_start - S5K5E2YA_bytewrite_cmos_sensor(0x3005,0x00); // ct_rx_margin (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3006,0x10); // ct_rx_margin (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3007,0x03); // ct_tx_start - S5K5E2YA_bytewrite_cmos_sensor(0x3008,0x46); // ct_tx_width - S5K5E2YA_bytewrite_cmos_sensor(0x0200,0x04); // (fine_integ_time) (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x0201,0x98); // (fine_integ_time) (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3039,0x05); // cintc1_margin - S5K5E2YA_bytewrite_cmos_sensor(0x303A,0x05); // cintc2_margin - S5K5E2YA_bytewrite_cmos_sensor(0x303B,0x00); // offs_sh - S5K5E2YA_bytewrite_cmos_sensor(0x3009,0x05); // ct_srx_margin - S5K5E2YA_bytewrite_cmos_sensor(0x300A,0x46); // ct_stx_width - S5K5E2YA_bytewrite_cmos_sensor(0x300B,0x2E); // ct_dstx_width - S5K5E2YA_bytewrite_cmos_sensor(0x300C,0x10); // ct_stx2dstx - S5K5E2YA_bytewrite_cmos_sensor(0x3012,0x05); // ct_cds_start - S5K5E2YA_bytewrite_cmos_sensor(0x3013,0x00); // ct_s1s_start - S5K5E2YA_bytewrite_cmos_sensor(0x3014,0x1C); // ct_s1s_end - S5K5E2YA_bytewrite_cmos_sensor(0x300E,0x64); // ct_S5K5E2YA_bytewrite_cmos_sensor(0x3_width - S5K5E2YA_bytewrite_cmos_sensor(0x3010,0x56); // ct_s4_width - S5K5E2YA_bytewrite_cmos_sensor(0x3019,0x03); // ct_s4d_start - S5K5E2YA_bytewrite_cmos_sensor(0x301A,0x00); // ct_pbr_start - S5K5E2YA_bytewrite_cmos_sensor(0x301B,0x05); // ct_pbr_width - S5K5E2YA_bytewrite_cmos_sensor(0x301C,0x00); // ct_pbs_start - S5K5E2YA_bytewrite_cmos_sensor(0x301D,0x1C); // ct_pbs_width - S5K5E2YA_bytewrite_cmos_sensor(0x301E,0x00); // ct_pbr_ob_start - S5K5E2YA_bytewrite_cmos_sensor(0x301F,0x0E); // ct_pbr_ob_width - S5K5E2YA_bytewrite_cmos_sensor(0x3020,0x00); // ct_pbs_ob_start - S5K5E2YA_bytewrite_cmos_sensor(0x3021,0x00); // ct_pbs_ob_width - S5K5E2YA_bytewrite_cmos_sensor(0x3022,0x0A); // ct_cds_lim_start - S5K5E2YA_bytewrite_cmos_sensor(0x3023,0x19); // ct_crs_start - S5K5E2YA_bytewrite_cmos_sensor(0x3024,0x00); // ct_lp_hblk_cds_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3025,0x00); // ct_lp_hblk_cds_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3026,0x00); // ct_lp_hblk_cds_end (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3027,0x00); // ct_lp_hblk_cds_end (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3028,0x16); // ct_rmp_off_start - S5K5E2YA_bytewrite_cmos_sensor(0x3015,0x00); // ct_rmp_rst_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3016,0x6D); // ct_rmp_rst_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3017,0x00); // ct_rmp_sig_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3018,0x84); // ct_rmp_sig_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x302B,0x10); // ct_cnt_margin - S5K5E2YA_bytewrite_cmos_sensor(0x302C,0x0A); // ct_rmp_per - S5K5E2YA_bytewrite_cmos_sensor(0x302D,0x06); // ct_cnt_ms_margin1 - S5K5E2YA_bytewrite_cmos_sensor(0x302E,0x05); // ct_cnt_ms_margin2 - S5K5E2YA_bytewrite_cmos_sensor(0x302F,0x0E); // rst_mx - S5K5E2YA_bytewrite_cmos_sensor(0x3030,0x2F); // sig_mx - S5K5E2YA_bytewrite_cmos_sensor(0x3031,0x08); // ct_latch_start - S5K5E2YA_bytewrite_cmos_sensor(0x3032,0x05); // ct_latch_width - S5K5E2YA_bytewrite_cmos_sensor(0x3033,0x09); // ct_hold_start - S5K5E2YA_bytewrite_cmos_sensor(0x3034,0x05); // ct_hold_width - S5K5E2YA_bytewrite_cmos_sensor(0x3035,0x00); // ct_lp_hblk_dbs_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3036,0x00); // ct_lp_hblk_dbs_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3037,0x00); // ct_lp_hblk_dbs_end (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3038,0x00); // ct_lp_hblk_dbs_end (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3088,0x06); // ct_lat_lsb_offset_start1 - S5K5E2YA_bytewrite_cmos_sensor(0x308A,0x08); // ct_lat_lsb_offset_end1 - S5K5E2YA_bytewrite_cmos_sensor(0x308C,0x05); // ct_lat_lsb_offset_start2 - S5K5E2YA_bytewrite_cmos_sensor(0x308E,0x07); // ct_lat_lsb_offset_end2 - S5K5E2YA_bytewrite_cmos_sensor(0x3090,0x06); // ct_conv_en_offset_start1 - S5K5E2YA_bytewrite_cmos_sensor(0x3092,0x08); // ct_conv_en_offset_end1 - S5K5E2YA_bytewrite_cmos_sensor(0x3094,0x05); // ct_conv_en_offset_start2 - S5K5E2YA_bytewrite_cmos_sensor(0x3096,0x21); // ct_conv_en_offset_end2 - - //CDS - S5K5E2YA_bytewrite_cmos_sensor(0x3099,0x0E); // cds_option ([3]:crs switch disable, S5K5E2YA_bytewrite_cmos_sensor(0x3,s4 strengthx16) - S5K5E2YA_bytewrite_cmos_sensor(0x3070,0x10); // comp1_bias (default:77) - S5K5E2YA_bytewrite_cmos_sensor(0x3085,0x11); // comp1_bias (gain1~4) - S5K5E2YA_bytewrite_cmos_sensor(0x3086,0x01); // comp1_bias (gain4~8) - - - - //RMP - S5K5E2YA_bytewrite_cmos_sensor(0x3064,0x00); // Multiple sampling(gainx8,x16) - S5K5E2YA_bytewrite_cmos_sensor(0x3062,0x08); // off_rst - - //DBR - S5K5E2YA_bytewrite_cmos_sensor(0x3061,0x11); // dbr_tune_rd (default :08, 0E 3.02V) 3.1V - S5K5E2YA_bytewrite_cmos_sensor(0x307B,0x20); // dbr_tune_rgsl (default :08) - - //Bias sampling - S5K5E2YA_bytewrite_cmos_sensor(0x3068,0x00); // RMP BP bias sampling [0]: Disable - S5K5E2YA_bytewrite_cmos_sensor(0x3074,0x00); // Pixel bias sampling [2]:Default L - S5K5E2YA_bytewrite_cmos_sensor(0x307D,0x00); // VREF sampling [0] : Disable - S5K5E2YA_bytewrite_cmos_sensor(0x3045,0x01); // ct_opt_l1_start - S5K5E2YA_bytewrite_cmos_sensor(0x3046,0x05); // ct_opt_l1_width - S5K5E2YA_bytewrite_cmos_sensor(0x3047,0x78); - - //Smart PLA - S5K5E2YA_bytewrite_cmos_sensor(0x307F,0xB1); //RDV_OPTION[5:4], RG default high - S5K5E2YA_bytewrite_cmos_sensor(0x3098,0x01); //CDS_OPTION[16] SPLA-II enable - S5K5E2YA_bytewrite_cmos_sensor(0x305C,0xF6); //lob_extension[6] - - S5K5E2YA_bytewrite_cmos_sensor(0x306B,0x10); // [3]bls_stx_en disable - S5K5E2YA_bytewrite_cmos_sensor(0x3063,0x27); // ADC_SAT - S5K5E2YA_bytewrite_cmos_sensor(0x320C,0x07); // ADC_MAX (def:076Ch --> 0700h) - S5K5E2YA_bytewrite_cmos_sensor(0x320D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x3400,0x01); // GAS bypass - S5K5E2YA_bytewrite_cmos_sensor(0x3235,0x49); // L/F-ADLC on - S5K5E2YA_bytewrite_cmos_sensor(0x3233,0x00); // D-pedestal L/F ADLC off (1FC0h) - S5K5E2YA_bytewrite_cmos_sensor(0x3234,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x3300,0x0C); //BPC On - S5K5E2YA_bytewrite_cmos_sensor(0x0204,0x00); //Analog gain x1 - S5K5E2YA_bytewrite_cmos_sensor(0x0205,0x20); - - S5K5E2YA_bytewrite_cmos_sensor(0x3203,0x45); - S5K5E2YA_bytewrite_cmos_sensor(0x3205,0x4D); - S5K5E2YA_bytewrite_cmos_sensor(0x320B,0x40); - S5K5E2YA_bytewrite_cmos_sensor(0x320C,0x06); - S5K5E2YA_bytewrite_cmos_sensor(0x320D,0xC0); - - //LSC setting - S5K5E2YA_bytewrite_cmos_sensor(0x340B,0x27); - S5K5E2YA_bytewrite_cmos_sensor(0x340C,0x01); - S5K5E2YA_bytewrite_cmos_sensor(0x340D,0xA3); - S5K5E2YA_bytewrite_cmos_sensor(0x340E,0x9E); - - S5K5E2YA_bytewrite_cmos_sensor(0x3401,0x50); - S5K5E2YA_bytewrite_cmos_sensor(0x3402,0x3C); - S5K5E2YA_bytewrite_cmos_sensor(0x3403,0x03); - S5K5E2YA_bytewrite_cmos_sensor(0x3404,0x33); - S5K5E2YA_bytewrite_cmos_sensor(0x3405,0x04); - S5K5E2YA_bytewrite_cmos_sensor(0x3406,0x44); - S5K5E2YA_bytewrite_cmos_sensor(0x3458,0x03); - S5K5E2YA_bytewrite_cmos_sensor(0x3459,0x33); - S5K5E2YA_bytewrite_cmos_sensor(0x345A,0x04); - S5K5E2YA_bytewrite_cmos_sensor(0x345B,0x44); - -// S5K5E2YA_bytewrite_cmos_sensor(0x3200,0x00); - - // streaming ON - S5K5E2YA_bytewrite_cmos_sensor(0x0100,0x01); - - mDELAY(50); -} - -void S5K5E2YACaptureSetting(void) -{ - SENSORDB("enter s5k5e2ya capture setting\n"); - - // Reset for operation - S5K5E2YA_bytewrite_cmos_sensor(0x0100,0x00); //stream off - - // Clock Setting - S5K5E2YA_bytewrite_cmos_sensor(0x0305,0x06); //PLLP (def:5) - S5K5E2YA_bytewrite_cmos_sensor(0x0306,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x0307,0xE0); //PLLM (def:CCh 204d --> B3h 179d) - S5K5E2YA_bytewrite_cmos_sensor(0x3C1F,0x00); //PLLS - - S5K5E2YA_bytewrite_cmos_sensor(0x0820,0x03); // requested link bit rate mbps : (def:3D3h 979d --> 35Bh 859d) - S5K5E2YA_bytewrite_cmos_sensor(0x0821,0x80); - S5K5E2YA_bytewrite_cmos_sensor(0x3C1C,0x58); //dbr_div - - - // Size Setting - S5K5E2YA_bytewrite_cmos_sensor(0x0340,0x07); // frame_length_lines : def. 1962d (7C2 --> 7A6 Mimnimum 23 lines) - S5K5E2YA_bytewrite_cmos_sensor(0x0341,0xE9); - S5K5E2YA_bytewrite_cmos_sensor(0x0342,0x0B); // line_length_pck : def. 2950d - S5K5E2YA_bytewrite_cmos_sensor(0x0343,0x86); - - S5K5E2YA_bytewrite_cmos_sensor(0x0344,0x00); // x_addr_start - S5K5E2YA_bytewrite_cmos_sensor(0x0345,0x08); - S5K5E2YA_bytewrite_cmos_sensor(0x0346,0x00); // y_addr_start - S5K5E2YA_bytewrite_cmos_sensor(0x0347,0x08); - S5K5E2YA_bytewrite_cmos_sensor(0x0348,0x0A); // x_addr_end : def. 2575d - S5K5E2YA_bytewrite_cmos_sensor(0x0349,0x07); - S5K5E2YA_bytewrite_cmos_sensor(0x034A,0x07); // y_addr_end : def. 1936d - S5K5E2YA_bytewrite_cmos_sensor(0x034B,0x87); - S5K5E2YA_bytewrite_cmos_sensor(0x034C,0x0A); // x_output size : def. 2560d - S5K5E2YA_bytewrite_cmos_sensor(0x034D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x034E,0x07); // y_output size : def. 1920d - S5K5E2YA_bytewrite_cmos_sensor(0x034F,0x80); - - //Digital Binning(default) - S5K5E2YA_bytewrite_cmos_sensor(0x0900,0x00); //0x0 Binning - S5K5E2YA_bytewrite_cmos_sensor(0x0901,0x20); - S5K5E2YA_bytewrite_cmos_sensor(0x0387,0x01); - - - //Integration time - S5K5E2YA_bytewrite_cmos_sensor(0x0202,0x02); // coarse integration - S5K5E2YA_bytewrite_cmos_sensor(0x0203,0x00); - - //Analog Timing Tuning (140117) - S5K5E2YA_bytewrite_cmos_sensor(0x3000,0x04); // ct_ld_start - S5K5E2YA_bytewrite_cmos_sensor(0x3002,0x03); // ct_sl_start - S5K5E2YA_bytewrite_cmos_sensor(0x3003,0x04); // ct_sl_margin - S5K5E2YA_bytewrite_cmos_sensor(0x3004,0x02); // ct_rx_start - S5K5E2YA_bytewrite_cmos_sensor(0x3005,0x00); // ct_rx_margin (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3006,0x10); // ct_rx_margin (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3007,0x03); // ct_tx_start - S5K5E2YA_bytewrite_cmos_sensor(0x3008,0x46); // ct_tx_width - S5K5E2YA_bytewrite_cmos_sensor(0x0200,0x04); // (fine_integ_time) (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x0201,0x98); // (fine_integ_time) (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3039,0x05); // cintc1_margin - S5K5E2YA_bytewrite_cmos_sensor(0x303A,0x05); // cintc2_margin - S5K5E2YA_bytewrite_cmos_sensor(0x303B,0x00); // offs_sh - S5K5E2YA_bytewrite_cmos_sensor(0x3009,0x05); // ct_srx_margin - S5K5E2YA_bytewrite_cmos_sensor(0x300A,0x46); // ct_stx_width - S5K5E2YA_bytewrite_cmos_sensor(0x300B,0x2E); // ct_dstx_width - S5K5E2YA_bytewrite_cmos_sensor(0x300C,0x10); // ct_stx2dstx - S5K5E2YA_bytewrite_cmos_sensor(0x3012,0x05); // ct_cds_start - S5K5E2YA_bytewrite_cmos_sensor(0x3013,0x00); // ct_s1s_start - S5K5E2YA_bytewrite_cmos_sensor(0x3014,0x1C); // ct_s1s_end - S5K5E2YA_bytewrite_cmos_sensor(0x300E,0x64); // ct_S5K5E2YA_bytewrite_cmos_sensor(0x3_width - S5K5E2YA_bytewrite_cmos_sensor(0x3010,0x56); // ct_s4_width - S5K5E2YA_bytewrite_cmos_sensor(0x3019,0x03); // ct_s4d_start - S5K5E2YA_bytewrite_cmos_sensor(0x301A,0x00); // ct_pbr_start - S5K5E2YA_bytewrite_cmos_sensor(0x301B,0x05); // ct_pbr_width - S5K5E2YA_bytewrite_cmos_sensor(0x301C,0x00); // ct_pbs_start - S5K5E2YA_bytewrite_cmos_sensor(0x301D,0x1C); // ct_pbs_width - S5K5E2YA_bytewrite_cmos_sensor(0x301E,0x00); // ct_pbr_ob_start - S5K5E2YA_bytewrite_cmos_sensor(0x301F,0x0E); // ct_pbr_ob_width - S5K5E2YA_bytewrite_cmos_sensor(0x3020,0x00); // ct_pbs_ob_start - S5K5E2YA_bytewrite_cmos_sensor(0x3021,0x00); // ct_pbs_ob_width - S5K5E2YA_bytewrite_cmos_sensor(0x3022,0x0A); // ct_cds_lim_start - S5K5E2YA_bytewrite_cmos_sensor(0x3023,0x19); // ct_crs_start - S5K5E2YA_bytewrite_cmos_sensor(0x3024,0x00); // ct_lp_hblk_cds_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3025,0x00); // ct_lp_hblk_cds_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3026,0x00); // ct_lp_hblk_cds_end (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3027,0x00); // ct_lp_hblk_cds_end (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3028,0x16); // ct_rmp_off_start - S5K5E2YA_bytewrite_cmos_sensor(0x3015,0x00); // ct_rmp_rst_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3016,0x6D); // ct_rmp_rst_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3017,0x00); // ct_rmp_sig_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3018,0x84); // ct_rmp_sig_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x302B,0x10); // ct_cnt_margin - S5K5E2YA_bytewrite_cmos_sensor(0x302C,0x0A); // ct_rmp_per - S5K5E2YA_bytewrite_cmos_sensor(0x302D,0x06); // ct_cnt_ms_margin1 - S5K5E2YA_bytewrite_cmos_sensor(0x302E,0x05); // ct_cnt_ms_margin2 - S5K5E2YA_bytewrite_cmos_sensor(0x302F,0x0E); // rst_mx - S5K5E2YA_bytewrite_cmos_sensor(0x3030,0x2F); // sig_mx - S5K5E2YA_bytewrite_cmos_sensor(0x3031,0x08); // ct_latch_start - S5K5E2YA_bytewrite_cmos_sensor(0x3032,0x05); // ct_latch_width - S5K5E2YA_bytewrite_cmos_sensor(0x3033,0x09); // ct_hold_start - S5K5E2YA_bytewrite_cmos_sensor(0x3034,0x05); // ct_hold_width - S5K5E2YA_bytewrite_cmos_sensor(0x3035,0x00); // ct_lp_hblk_dbs_start (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3036,0x00); // ct_lp_hblk_dbs_start (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3037,0x00); // ct_lp_hblk_dbs_end (MSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3038,0x00); // ct_lp_hblk_dbs_end (LSB) - S5K5E2YA_bytewrite_cmos_sensor(0x3088,0x06); // ct_lat_lsb_offset_start1 - S5K5E2YA_bytewrite_cmos_sensor(0x308A,0x08); // ct_lat_lsb_offset_end1 - S5K5E2YA_bytewrite_cmos_sensor(0x308C,0x05); // ct_lat_lsb_offset_start2 - S5K5E2YA_bytewrite_cmos_sensor(0x308E,0x07); // ct_lat_lsb_offset_end2 - S5K5E2YA_bytewrite_cmos_sensor(0x3090,0x06); // ct_conv_en_offset_start1 - S5K5E2YA_bytewrite_cmos_sensor(0x3092,0x08); // ct_conv_en_offset_end1 - S5K5E2YA_bytewrite_cmos_sensor(0x3094,0x05); // ct_conv_en_offset_start2 - S5K5E2YA_bytewrite_cmos_sensor(0x3096,0x21); // ct_conv_en_offset_end2 - - //CDS - S5K5E2YA_bytewrite_cmos_sensor(0x3099,0x0E); // cds_option ([3]:crs switch disable, S5K5E2YA_bytewrite_cmos_sensor(0x3,s4 strengthx16) - S5K5E2YA_bytewrite_cmos_sensor(0x3070,0x10); // comp1_bias (default:77) - S5K5E2YA_bytewrite_cmos_sensor(0x3085,0x11); // comp1_bias (gain1~4) - S5K5E2YA_bytewrite_cmos_sensor(0x3086,0x01); // comp1_bias (gain4~8) - - - - //RMP - S5K5E2YA_bytewrite_cmos_sensor(0x3064,0x00); // Multiple sampling(gainx8,x16) - S5K5E2YA_bytewrite_cmos_sensor(0x3062,0x08); // off_rst - - //DBR - S5K5E2YA_bytewrite_cmos_sensor(0x3061,0x11); // dbr_tune_rd (default :08, 0E 3.02V) 3.1V - S5K5E2YA_bytewrite_cmos_sensor(0x307B,0x20); // dbr_tune_rgsl (default :08) - - //Bias sampling - S5K5E2YA_bytewrite_cmos_sensor(0x3068,0x00); // RMP BP bias sampling [0]: Disable - S5K5E2YA_bytewrite_cmos_sensor(0x3074,0x00); // Pixel bias sampling [2]:Default L - S5K5E2YA_bytewrite_cmos_sensor(0x307D,0x00); // VREF sampling [0] : Disable - S5K5E2YA_bytewrite_cmos_sensor(0x3045,0x01); // ct_opt_l1_start - S5K5E2YA_bytewrite_cmos_sensor(0x3046,0x05); // ct_opt_l1_width - S5K5E2YA_bytewrite_cmos_sensor(0x3047,0x78); - - //Smart PLA - S5K5E2YA_bytewrite_cmos_sensor(0x307F,0xB1); //RDV_OPTION[5:4], RG default high - S5K5E2YA_bytewrite_cmos_sensor(0x3098,0x01); //CDS_OPTION[16] SPLA-II enable - S5K5E2YA_bytewrite_cmos_sensor(0x305C,0xF6); //lob_extension[6] - - S5K5E2YA_bytewrite_cmos_sensor(0x306B,0x10); // [3]bls_stx_en disable - S5K5E2YA_bytewrite_cmos_sensor(0x3063,0x27); // ADC_SAT - S5K5E2YA_bytewrite_cmos_sensor(0x320C,0x07); // ADC_MAX (def:076Ch --> 0700h) - S5K5E2YA_bytewrite_cmos_sensor(0x320D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x3400,0x01); // GAS bypass - S5K5E2YA_bytewrite_cmos_sensor(0x3235,0x49); // L/F-ADLC on - S5K5E2YA_bytewrite_cmos_sensor(0x3233,0x00); // D-pedestal L/F ADLC off (1FC0h) - S5K5E2YA_bytewrite_cmos_sensor(0x3234,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x3300,0x0C); //BPC On - S5K5E2YA_bytewrite_cmos_sensor(0x0204,0x00); //Analog gain x1 - S5K5E2YA_bytewrite_cmos_sensor(0x0205,0x20); - - S5K5E2YA_bytewrite_cmos_sensor(0x3203,0x45); - S5K5E2YA_bytewrite_cmos_sensor(0x3205,0x4D); - S5K5E2YA_bytewrite_cmos_sensor(0x320B,0x40); - S5K5E2YA_bytewrite_cmos_sensor(0x320C,0x06); - S5K5E2YA_bytewrite_cmos_sensor(0x320D,0xC0); - - //LSC settting for 2560x1920 - S5K5E2YA_bytewrite_cmos_sensor(0x340B,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x340C,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x340D,0x00); - S5K5E2YA_bytewrite_cmos_sensor(0x340E,0x00); - - S5K5E2YA_bytewrite_cmos_sensor(0x3401,0x50); - S5K5E2YA_bytewrite_cmos_sensor(0x3402,0x3C); - S5K5E2YA_bytewrite_cmos_sensor(0x3403,0x03); - S5K5E2YA_bytewrite_cmos_sensor(0x3404,0x33); - S5K5E2YA_bytewrite_cmos_sensor(0x3405,0x04); - S5K5E2YA_bytewrite_cmos_sensor(0x3406,0x44); - S5K5E2YA_bytewrite_cmos_sensor(0x3458,0x03); - S5K5E2YA_bytewrite_cmos_sensor(0x3459,0x33); - S5K5E2YA_bytewrite_cmos_sensor(0x345A,0x04); - S5K5E2YA_bytewrite_cmos_sensor(0x345B,0x44); - - //S5K5E2YA_bytewrite_cmos_sensor(0x3200,0x00); - - // streaming ON - S5K5E2YA_bytewrite_cmos_sensor(0x0100,0x01); - - mDELAY(50); - - -} - - /* S5K5E2YAInitSetting */ - -/************************************************************************* -* FUNCTION -* S5K5E2YAOpen -* -* DESCRIPTION -* This function initialize the registers of CMOS sensor -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ - -UINT32 S5K5E2YAOpen(void) -{ - - volatile signed int i; - kal_uint32 sensor_id = 0; - - SENSORDB("enter s5k5e2ya open\n"); - - sensor_id = (S5K5E2YA_read_cmos_sensor(0x0000)<<8)|(S5K5E2YA_read_cmos_sensor(0x0001)); - SENSORDB("Read sensor ID=0x%x\n",sensor_id); - if(S5K5E2YA_SENSOR_ID != sensor_id) - { - return ERROR_SENSOR_CONNECT_FAIL; - } - - - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.sensorMode = SENSOR_MODE_INIT; - s5k5e2ya.S5K5E2YAAutoFlickerMode = KAL_FALSE; - s5k5e2ya.S5K5E2YAVideoMode = KAL_FALSE; - s5k5e2ya.DummyLines= 0; - s5k5e2ya.DummyPixels= 0; - s5k5e2ya.pvPclk = SENSOR_PCLK_PREVIEW; //171.8MHz - s5k5e2ya.m_vidPclk= SENSOR_PCLK_VIDEO; - s5k5e2ya.capPclk= SENSOR_PCLK_CAPTURE; - s5k5e2ya.maxExposureLines = S5K5E2YA_PV_PERIOD_LINE_NUMS; - s5k5e2ya.FixedFrameLength = S5K5E2YA_PV_PERIOD_LINE_NUMS; - s5k5e2ya.sensorGain = 0x10; //base gain - s5k5e2ya.pvGain = 0x10; - s_S5K5E2YACurrentScenarioId = MSDK_SCENARIO_ID_CAMERA_PREVIEW; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - return ERROR_NONE; -} - -/************************************************************************* -* FUNCTION -* S5K5E2YAGetSensorID -* -* DESCRIPTION -* This function get the sensor ID -* -* PARAMETERS -* *sensorID : return the sensor ID -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 S5K5E2YAGetSensorID(UINT32 *sensorID) -{ - SENSORDB("enter s5k5e2ya getsensorid\n"); - *sensorID = (S5K5E2YA_read_cmos_sensor(0x0000)<<8) | (S5K5E2YA_read_cmos_sensor(0x0001)); - SENSORDB("Read sensor ID=0x%x\n",*sensorID); - if (*sensorID != S5K5E2YA_SENSOR_ID) - { - *sensorID = 0xFFFFFFFF; - return ERROR_SENSOR_CONNECT_FAIL; - } - - SENSORDB("leave getsensorid\n"); - return ERROR_NONE; -} - - - -/************************************************************************* -* FUNCTION -* S5K5E2YA_read_shutter -* -* DESCRIPTION -* This function to Get exposure time. -* -* PARAMETERS -* None -* -* RETURNS -* shutter : exposured lines -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 S5K5E2YA_read_shutter(void) -{ - return ((S5K5E2YA_read_cmos_sensor(0x0202)<<8)|S5K5E2YA_read_cmos_sensor(0x0203)); // smiaRegs_rw_integration_time_coarse_integration_time - -} - -/************************************************************************* -* FUNCTION -* S5K5E2YA_night_mode -* -* DESCRIPTION -* This function night mode of S5K5E2YA. -* -* PARAMETERS -* none -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -void S5K5E2YA_NightMode(kal_bool bEnable) -{ -}/* S5K5E2YA_NightMode */ - - - -/************************************************************************* -* FUNCTION -* S5K5E2YAClose -* -* DESCRIPTION -* This function is to turn off sensor module power. -* -* PARAMETERS -* None -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 S5K5E2YAClose(void) -{ - return ERROR_NONE; -} /* S5K5E2YAClose() */ - -void S5K5E2YASetFlipMirror(kal_int32 imgMirror) -{ - SENSORDB("enter s5k5e2ya setflip mirror\n"); - SENSORDB("imgMirror=%d\n",imgMirror); - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.imgMirror = imgMirror; //(imgMirror+IMAGE_HV_MIRROR)%(IMAGE_HV_MIRROR+1); - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - switch (imgMirror) - { - case IMAGE_H_MIRROR://IMAGE_NORMAL: bit0 mirror, bit1 flip. - S5K5E2YA_bytewrite_cmos_sensor(0x0101,0x02 ); //morror - break; - case IMAGE_NORMAL://IMAGE_V_MIRROR: - S5K5E2YA_bytewrite_cmos_sensor(0x0101,0x03 ); - break; - case IMAGE_HV_MIRROR://IMAGE_H_MIRROR: - S5K5E2YA_bytewrite_cmos_sensor(0x0101,0x00 ); //morror +flip - break; - case IMAGE_V_MIRROR://IMAGE_HV_MIRROR: - S5K5E2YA_bytewrite_cmos_sensor(0x0101,0x01 ); //flip - break; - } -} - - -/************************************************************************* -* FUNCTION -* S5K5E2YAPreview -* -* DESCRIPTION -* This function start the sensor preview. -* -* PARAMETERS -* *image_window : address pointer of pixel numbers in one period of HSYNC -* *sensor_config_data : address pointer of line numbers in one period of VSYNC -* -* RETURNS -* None -* -* GLOBALS AFFECTED -* -*************************************************************************/ -UINT32 S5K5E2YAPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - SENSORDB("enter s5k5e2ya preview\n"); - - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.sensorMode = SENSOR_MODE_PREVIEW; // Need set preview setting after capture mode - //S5K5E2YA_FeatureControl_PERIOD_PixelNum=S5K5E2YA_PV_PERIOD_PIXEL_NUMS+ s5k5e2ya.DummyPixels; - //S5K5E2YA_FeatureControl_PERIOD_LineNum=S5K5E2YA_PV_PERIOD_LINE_NUMS+s5k5e2ya.DummyLines; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - S5K5E2YAPreviewSetting(); - - S5K5E2YA_SetDummy(0,0); - //set mirror & flip - S5K5E2YASetFlipMirror(sensor_config_data->SensorImageMirror); - SENSORDB("leave preview\n"); - - return ERROR_NONE; -} /* S5K5E2YAPreview() */ - -UINT32 S5K5E2YAVideo(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - - SENSORDB("enter s5k5e2ya video\n"); - - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.sensorMode = SENSOR_MODE_VIDEO; // Need set preview setting after capture mode - //S5K5E2YA_FeatureControl_PERIOD_PixelNum=S5K5E2YA_PV_PERIOD_PIXEL_NUMS+ s5k5e2ya.DummyPixels; - //S5K5E2YA_FeatureControl_PERIOD_LineNum=S5K5E2YA_PV_PERIOD_LINE_NUMS+s5k5e2ya.DummyLines; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - S5K5E2YAVideoSetting(); - - S5K5E2YA_write_shutter(s5k5e2ya.shutter); - S5K5E2YA_SetGain(s5k5e2ya.pvGain); - - S5K5E2YA_SetDummy(0,0); - //set mirror & flip - S5K5E2YASetFlipMirror(sensor_config_data->SensorImageMirror); - SENSORDB("leave video\n"); - - return ERROR_NONE; -} /* S5K5E2YAPreview() */ - - - -UINT32 S5K5E2YACapture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - SENSORDB("enter s5k5e2ya capture\n"); - SENSORDB("sensorMode=%d\n",s5k5e2ya.sensorMode); - - // Full size setting - S5K5E2YACaptureSetting(); - - S5K5E2YA_SetDummy(0,0); - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.sensorMode = SENSOR_MODE_CAPTURE; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - S5K5E2YASetFlipMirror(sensor_config_data->SensorImageMirror); - - return ERROR_NONE; -} /* S5K5E2YACapture() */ - -UINT32 S5K5E2YAZSDPreview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, - MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) -{ - SENSORDB("enter s5k5e2yxa zsd preview\n"); - // Full size setting - S5K5E2YACaptureSetting(); - - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.sensorMode = SENSOR_MODE_ZSD_PREVIEW; - //S5K5E2YXA_FeatureControl_PERIOD_PixelNum = S5K5E2YXA_FULL_PERIOD_PIXEL_NUMS + s5k5e2yxa.DummyPixels; - //S5K5E2YXA_FeatureControl_PERIOD_LineNum = S5K5E2YXA_FULL_PERIOD_LINE_NUMS + s5k5e2yxa.DummyLines; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - S5K5E2YA_SetDummy(0,0); - - S5K5E2YASetFlipMirror(sensor_config_data->SensorImageMirror); - - return ERROR_NONE; -} - - -UINT32 S5K5E2YAGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) -{ - - SENSORDB("enter s5k5e2ya getresolution\n"); - pSensorResolution->SensorPreviewWidth = S5K5E2YA_IMAGE_SENSOR_PV_WIDTH; - pSensorResolution->SensorPreviewHeight = S5K5E2YA_IMAGE_SENSOR_PV_HEIGHT; - pSensorResolution->SensorVideoWidth = S5K5E2YA_IMAGE_SENSOR_VIDEO_WIDTH; - pSensorResolution->SensorVideoHeight = S5K5E2YA_IMAGE_SENSOR_VIDEO_HEIGHT; - pSensorResolution->SensorFullWidth = S5K5E2YA_IMAGE_SENSOR_FULL_WIDTH; - pSensorResolution->SensorFullHeight = S5K5E2YA_IMAGE_SENSOR_FULL_HEIGHT; - return ERROR_NONE; -} /* S5K5E2YAGetResolution() */ - -UINT32 S5K5E2YAGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, - MSDK_SENSOR_INFO_STRUCT *pSensorInfo, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - SENSORDB("enter s5k5e2ya getinfo\n"); - SENSORDB("SCENARIO id=%d\n", ScenarioId); - switch(s_S5K5E2YACurrentScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorPreviewResolutionX= S5K5E2YA_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorPreviewResolutionY= S5K5E2YA_IMAGE_SENSOR_FULL_HEIGHT; - break; - default: - pSensorInfo->SensorPreviewResolutionX= S5K5E2YA_IMAGE_SENSOR_PV_WIDTH; - pSensorInfo->SensorPreviewResolutionY= S5K5E2YA_IMAGE_SENSOR_PV_HEIGHT; - break; - } - - pSensorInfo->SensorFullResolutionX= S5K5E2YA_IMAGE_SENSOR_FULL_WIDTH; - pSensorInfo->SensorFullResolutionY= S5K5E2YA_IMAGE_SENSOR_FULL_HEIGHT; - - pSensorInfo->SensorOutputDataFormat= SENSOR_OUTPUT_FORMAT_RAW_Gb; - - pSensorInfo->SensorClockPolarity =SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; - - pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_MIPI; - - pSensorInfo->CaptureDelayFrame = 1; - pSensorInfo->PreviewDelayFrame = 1; - pSensorInfo->VideoDelayFrame = 2; - - pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; - pSensorInfo->AEShutDelayFrame = 0;//0; /* The frame of setting shutter default 0 for TG int */ - pSensorInfo->AESensorGainDelayFrame = 1 ;//0; /* The frame of setting sensor gain */ - pSensorInfo->AEISPGainDelayFrame = 2; - - pSensorInfo->SensorClockFreq=24; //26 - pSensorInfo->SensorClockRisingCount= 0; - pSensorInfo->SensorMIPILaneNumber = SENSOR_MIPI_2_LANE; - pSensorInfo->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->MIPIDataLowPwr2HighSpeedSettleDelayCount = 14; - pSensorInfo->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; - pSensorInfo->SensorPacketECCOrder = 1; - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - pSensorInfo->SensorGrabStartX = S5K5E2YA_PV_X_START; - pSensorInfo->SensorGrabStartY = S5K5E2YA_PV_Y_START; - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - pSensorInfo->SensorGrabStartX = S5K5E2YA_VIDEO_X_START; - pSensorInfo->SensorGrabStartY = S5K5E2YA_VIDEO_Y_START; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - pSensorInfo->SensorGrabStartX = S5K5E2YA_FULL_X_START; //2*S5K5E2YA_IMAGE_SENSOR_PV_STARTX; - pSensorInfo->SensorGrabStartY = S5K5E2YA_FULL_Y_START; //2*S5K5E2YA_IMAGE_SENSOR_PV_STARTY; - break; - default: - pSensorInfo->SensorGrabStartX = S5K5E2YA_PV_X_START; - pSensorInfo->SensorGrabStartY = S5K5E2YA_PV_Y_START; - break; - } - - memcpy(pSensorConfigData, &S5K5E2YASensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - - return ERROR_NONE; -} /* S5K5E2YAGetInfo() */ - - -UINT32 S5K5E2YAControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) -{ - SENSORDB("enter s5k5e2ya control\n"); - spin_lock(&s5k5e2yamipiraw_drv_lock); - s_S5K5E2YACurrentScenarioId = ScenarioId; - s5k5e2ya.FixedFrameLength = GetScenarioFramelength(); - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - SENSORDB("s_S5K5E2YACurrentScenarioId=%d\n",s_S5K5E2YACurrentScenarioId); - - switch (ScenarioId) - { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - S5K5E2YAPreview(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - S5K5E2YAVideo(pImageWindow, pSensorConfigData); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - S5K5E2YACapture(pImageWindow, pSensorConfigData); - case MSDK_SCENARIO_ID_CAMERA_ZSD: - S5K5E2YAZSDPreview(pImageWindow,pSensorConfigData); - break; - default: - return ERROR_INVALID_SCENARIO_ID; - - } - return ERROR_NONE; -} /* S5K5E2YAControl() */ - -UINT32 S5K5E2YASetVideoMode(UINT16 u2FrameRate) -{ - s5k5e2ya.sensorMode=MSDK_SCENARIO_ID_VIDEO_PREVIEW; - SENSORDB("enter s5k5 setvideomode"); - SENSORDB("u2FrameRate=%d,sensorMode=%d\n", u2FrameRate,s5k5e2ya.sensorMode); - - if(0==u2FrameRate) //do not fix frame rate - { - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.FixedFrameLength = GetScenarioFramelength(); - spin_unlock(&s5k5e2yamipiraw_drv_lock); - SENSORDB("s5k5e2ya.FixedFrameLength=%d\n",s5k5e2ya.FixedFrameLength); - return ERROR_NONE; - } - - S5K5E2YAMIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_VIDEO_PREVIEW,u2FrameRate*10); - return ERROR_NONE; -} - -static void S5K5E2YASetMaxFrameRate(UINT16 u2FrameRate) -{ - kal_uint16 FrameHeight; - - SENSORDB("[S5K4H5YX] [S5K4H5YXMIPISetMaxFrameRate] u2FrameRate=%d\n",u2FrameRate); - - if(SENSOR_MODE_PREVIEW == s5k5e2ya.sensorMode) - { - FrameHeight= (10 * s5k5e2ya.pvPclk) / u2FrameRate / S5K5E2YA_PV_PERIOD_PIXEL_NUMS; - FrameHeight = (FrameHeight > S5K5E2YA_PV_PERIOD_LINE_NUMS) ? FrameHeight : S5K5E2YA_PV_PERIOD_LINE_NUMS; - } - else if(SENSOR_MODE_CAPTURE== s5k5e2ya.sensorMode || SENSOR_MODE_ZSD_PREVIEW == s5k5e2ya.sensorMode) - { - FrameHeight= (10 * s5k5e2ya.capPclk) / u2FrameRate / S5K5E2YA_FULL_PERIOD_PIXEL_NUMS; - FrameHeight = (FrameHeight > S5K5E2YA_FULL_PERIOD_LINE_NUMS) ? FrameHeight : S5K5E2YA_FULL_PERIOD_LINE_NUMS; - } - else - { - FrameHeight = (10 * s5k5e2ya.m_vidPclk) / u2FrameRate / S5K5E2YA_VIDEO_PERIOD_PIXEL_NUMS; - FrameHeight = (FrameHeight > S5K5E2YA_VIDEO_PERIOD_LINE_NUMS) ? FrameHeight : S5K5E2YA_VIDEO_PERIOD_LINE_NUMS; - } - SENSORDB("[S5K4H5YX] [S5K4H5YXMIPISetMaxFrameRate] FrameHeight=%d",FrameHeight); - SetFramelength(FrameHeight); /* modify dummy_pixel must gen AE table again */ -} - - -UINT32 S5K5E2YASetAutoFlickerMode(kal_bool bEnable, UINT16 u2FrameRate) -{ - if(bEnable) - { - SENSORDB("[S5K4H5YX] [S5K4H5YXSetAutoFlickerMode] enable\n"); - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.S5K5E2YAAutoFlickerMode = KAL_TRUE; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - if(u2FrameRate == 300) - S5K5E2YASetMaxFrameRate(296); - else if(u2FrameRate == 150) - S5K5E2YASetMaxFrameRate(148); - } - else - { - SENSORDB("[S5K4H5YX] [S5K4H5YXSetAutoFlickerMode] disable\n"); - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.S5K5E2YAAutoFlickerMode = KAL_FALSE; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - } - return ERROR_NONE; -} - - -UINT32 S5K5E2YASetTestPatternMode(kal_bool bEnable) -{ - SENSORDB("bEnable=%d\n", bEnable); - if(bEnable) - { - S5K5E2YA_bytewrite_cmos_sensor(0x0601,0x02); - } - else - { - S5K5E2YA_bytewrite_cmos_sensor(0x0601,0x00); - } - - S5K5E2YA_bytewrite_cmos_sensor(0x3200,0x00); - - return ERROR_NONE; -} - -UINT32 S5K5E2YAMIPISetMaxFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 frameRate) -{ - kal_uint16 frameLength = 0; - - SENSORDB("scenarioId=%d,frameRate=%d\n",scenarioId,frameRate); - switch (scenarioId) - { - //SetDummy() has to switch scenarioId again, so we do not use it here - //when SetDummy() is ok, we'll switch to using SetDummy() - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - frameLength = (s5k5e2ya.pvPclk)/frameRate*10/S5K5E2YA_PV_PERIOD_PIXEL_NUMS; - frameLength = (frameLength>S5K5E2YA_PV_PERIOD_LINE_NUMS)?(frameLength):(S5K5E2YA_PV_PERIOD_LINE_NUMS); - break; - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - frameLength = (s5k5e2ya.m_vidPclk)/frameRate*10/S5K5E2YA_VIDEO_PERIOD_PIXEL_NUMS; - frameLength = (frameLength>S5K5E2YA_VIDEO_PERIOD_LINE_NUMS)?(frameLength):(S5K5E2YA_VIDEO_PERIOD_LINE_NUMS); - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - frameLength = (s5k5e2ya.m_vidPclk)/frameRate*10/S5K5E2YA_FULL_PERIOD_PIXEL_NUMS; - frameLength = (frameLength>S5K5E2YA_FULL_PERIOD_LINE_NUMS)?(frameLength):(S5K5E2YA_FULL_PERIOD_LINE_NUMS); - break; - case MSDK_SCENARIO_ID_CAMERA_ZSD: - frameLength = (s5k5e2ya.m_vidPclk)/frameRate*10/S5K5E2YA_ZSD_PERIOD_PIXEL_NUMS; - frameLength = (frameLength>S5K5E2YA_ZSD_PERIOD_LINE_NUMS)?(frameLength):(S5K5E2YA_ZSD_PERIOD_LINE_NUMS); - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - break; - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - break; - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - break; - default: - frameLength = S5K5E2YA_PV_PERIOD_LINE_NUMS; - break; - } - spin_lock(&s5k5e2yamipiraw_drv_lock); - s5k5e2ya.FixedFrameLength = frameLength; - spin_unlock(&s5k5e2yamipiraw_drv_lock); - - SetFramelength(frameLength); //direct set frameLength - return ERROR_NONE; -} - - -UINT32 S5K5E2YAMIPIGetDefaultFramerateByScenario(MSDK_SCENARIO_ID_ENUM scenarioId, MUINT32 *pframeRate) -{ - - switch (scenarioId) { - case MSDK_SCENARIO_ID_CAMERA_PREVIEW: - case MSDK_SCENARIO_ID_VIDEO_PREVIEW: - *pframeRate = 300; - break; - case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: - case MSDK_SCENARIO_ID_CAMERA_ZSD: - #ifdef FULL_SIZE_30_FPS - *pframeRate = 300; - #else - *pframeRate = 250; - #endif - break; - case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added - case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: - case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added - *pframeRate = 300; - break; - default: - break; - } - - return ERROR_NONE; -} - -UINT32 S5K5E2YAFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, - UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) -{ - SENSORDB("enter s5k5e2ya featurecontrol\n"); - UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; - UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; - UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; - UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; - UINT32 SensorRegNumber; - UINT32 i; - PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; - MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; - MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; - MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; - - SENSORDB("s5k5FeatureId=%d\n",FeatureId); - switch (FeatureId) - { - case SENSOR_FEATURE_GET_RESOLUTION: - *pFeatureReturnPara16++= S5K5E2YA_IMAGE_SENSOR_FULL_WIDTH; - *pFeatureReturnPara16= S5K5E2YA_IMAGE_SENSOR_FULL_HEIGHT; - *pFeatureParaLen=4; - SENSORDB("s5k5enter SENSOR_FEATURE_GET_RESOLUTION\n"); - break; - case SENSOR_FEATURE_GET_PERIOD: - *pFeatureReturnPara16++= GetScenarioLinelength(); - *pFeatureReturnPara16= GetScenarioFramelength(); - *pFeatureParaLen=4; - SENSORDB("s5k5enter SENSOR_FEATURE_GET_PERIOD\n"); - break; - case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: - //same pclk for preview/capture - *pFeatureReturnPara32 = GetScenarioPixelClock(); - SENSORDB("s5k5sensor clock=%d\n",*pFeatureReturnPara32); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_ESHUTTER: - S5K5E2YA_write_shutter(*pFeatureData16); - SENSORDB("s5k5enter setshutter\n"); - break; - case SENSOR_FEATURE_SET_NIGHTMODE: - S5K5E2YA_NightMode((BOOL) *pFeatureData16); - break; - case SENSOR_FEATURE_SET_GAIN: - S5K5E2YA_SetGain((UINT16) *pFeatureData16); - SENSORDB("s5k5enter setgain\n"); - break; - case SENSOR_FEATURE_SET_FLASHLIGHT: - break; - case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: - //S5K5E2YA_isp_master_clock=*pFeatureData32; - SENSORDB("s5k5enter setispmasterclockfreq\n"); - break; - case SENSOR_FEATURE_SET_REGISTER: - S5K5E2YA_wordwrite_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); - SENSORDB("s5k5enter setregister\n"); - break; - case SENSOR_FEATURE_GET_REGISTER: - pSensorRegData->RegData = S5K5E2YA_read_cmos_sensor(pSensorRegData->RegAddr); - SENSORDB("s5k5enter getregister\n"); - break; - case SENSOR_FEATURE_SET_CCT_REGISTER: - SensorRegNumber=FACTORY_END_ADDR; - for (i=0;i=sizeof(NVRAM_SENSOR_DATA_STRUCT)) - { - pSensorDefaultData->Version=NVRAM_CAMERA_SENSOR_FILE_VERSION; - pSensorDefaultData->SensorId=S5K5E2YA_SENSOR_ID; - memcpy(pSensorDefaultData->SensorEngReg, S5K5E2YASensorReg, sizeof(SENSOR_REG_STRUCT)*ENGINEER_END); - memcpy(pSensorDefaultData->SensorCCTReg, S5K5E2YASensorCCT, sizeof(SENSOR_REG_STRUCT)*FACTORY_END_ADDR); - } - else - return ERROR_INVALID_PARA; - *pFeatureParaLen=sizeof(NVRAM_SENSOR_DATA_STRUCT); - SENSORDB("s5k5enter get register default\n"); - break; - case SENSOR_FEATURE_GET_CONFIG_PARA: - memcpy(pSensorConfigData, &S5K5E2YASensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); - *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); - break; - case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: - S5K5E2YA_camera_para_to_sensor(); - break; - - case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: - S5K5E2YA_sensor_to_camera_para(); - break; - case SENSOR_FEATURE_GET_GROUP_COUNT: - *pFeatureReturnPara32++=S5K5E2YA_get_sensor_group_count(); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_GROUP_INFO: - S5K5E2YA_get_sensor_group_info(pSensorGroupInfo->GroupIdx, pSensorGroupInfo->GroupNamePtr, &pSensorGroupInfo->ItemCount); - *pFeatureParaLen=sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_ITEM_INFO: - S5K5E2YA_get_sensor_item_info(pSensorItemInfo->GroupIdx,pSensorItemInfo->ItemIdx, pSensorItemInfo); - *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - - case SENSOR_FEATURE_SET_ITEM_INFO: - S5K5E2YA_set_sensor_item_info(pSensorItemInfo->GroupIdx, pSensorItemInfo->ItemIdx, pSensorItemInfo->ItemValue); - *pFeatureParaLen=sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); - break; - - case SENSOR_FEATURE_GET_ENG_INFO: - pSensorEngInfo->SensorId = 129; - pSensorEngInfo->SensorType = CMOS_SENSOR; - pSensorEngInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_RAW_B; - *pFeatureParaLen=sizeof(MSDK_SENSOR_ENG_INFO_STRUCT); - break; - case SENSOR_FEATURE_GET_LENS_DRIVER_ID: - // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE - // if EEPROM does not exist in camera module. - *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_INITIALIZE_AF: - break; - case SENSOR_FEATURE_CONSTANT_AF: - break; - case SENSOR_FEATURE_MOVE_FOCUS_LENS: - break; - case SENSOR_FEATURE_SET_VIDEO_MODE: - S5K5E2YASetVideoMode(*pFeatureData16); - break; - case SENSOR_FEATURE_CHECK_SENSOR_ID: - SENSORDB("s5k5enter check_sensor_id\n"); - S5K5E2YAGetSensorID(pFeatureReturnPara32); - break; - case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: - S5K5E2YASetAutoFlickerMode((BOOL)*pFeatureData16, *(pFeatureData16+1)); - break; - case SENSOR_FEATURE_SET_TEST_PATTERN: - S5K5E2YASetTestPatternMode((BOOL)*pFeatureData16); - break; - case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE://for factory mode auto testing - *pFeatureReturnPara32= S5K5E2YA_TEST_PATTERN_CHECKSUM; - SENSORDB("checksum = 0x%x",*pFeatureReturnPara32); - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: - S5K5E2YAMIPISetMaxFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, *(pFeatureData32+1)); - break; - case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: - S5K5E2YAMIPIGetDefaultFramerateByScenario((MSDK_SCENARIO_ID_ENUM)*pFeatureData32, (MUINT32 *)(*(pFeatureData32+1))); - break; - - /*SZ TCT xuejian.zhong add for CTS test */ - case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS: - S5K5E2YAGetAFMaxNumFocusAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - - case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS: - S5K5E2YAGetAEMaxNumMeteringAreas(pFeatureReturnPara32); - - *pFeatureParaLen=4; - break; - case SENSOR_FEATURE_GET_EXIF_INFO: - SENSORDB("SENSOR_FEATURE_GET_EXIF_INFO\n"); - SENSORDB("EXIF addr = 0x%x\n",*pFeatureData32); - - S5K5E2YAGetExifInfo(*pFeatureData32); - break; - /* xuejian.zhong add end */ - - - default: - break; - } - return ERROR_NONE; -} /* S5K5E2YAFeatureControl() */ - - -SENSOR_FUNCTION_STRUCT SensorFuncS5K5E2YA= -{ - S5K5E2YAOpen, - S5K5E2YAGetInfo, - S5K5E2YAGetResolution, - S5K5E2YAFeatureControl, - S5K5E2YAControl, - S5K5E2YAClose -}; - -UINT32 S5K5E2YA_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) -{ - /* To Do : Check Sensor status here */ - if (pfFunc!=NULL) - *pfFunc=&SensorFuncS5K5E2YA; - - return ERROR_NONE; -} /* SensorInit() */ - - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Sensor.h deleted file mode 100644 index 267ae48f535..00000000000 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Sensor.h +++ /dev/null @@ -1,192 +0,0 @@ -/*******************************************************************************************/ - - -/*******************************************************************************************/ - -/* SENSOR FULL SIZE */ -#ifndef __SENSOR_H -#define __SENSOR_H - -//#define CAPTURE_USE_VIDEO_SETTING -#define FULL_SIZE_30_FPS -//#define USE_MIPI_2_LANES //undefine this macro will use mipi 4 lanes - -typedef enum group_enum { - PRE_GAIN=0, - CMMCLK_CURRENT, - FRAME_RATE_LIMITATION, - REGISTER_EDITOR, - GROUP_TOTAL_NUMS -} FACTORY_GROUP_ENUM; - - -#define ENGINEER_START_ADDR 10 -#define FACTORY_START_ADDR 0 - -typedef enum engineer_index -{ - CMMCLK_CURRENT_INDEX=ENGINEER_START_ADDR, - ENGINEER_END -} FACTORY_ENGINEER_INDEX; - -typedef enum register_index -{ - SENSOR_BASEGAIN=FACTORY_START_ADDR, - PRE_GAIN_R_INDEX, - PRE_GAIN_Gr_INDEX, - PRE_GAIN_Gb_INDEX, - PRE_GAIN_B_INDEX, - FACTORY_END_ADDR -} FACTORY_REGISTER_INDEX; - -typedef struct -{ - SENSOR_REG_STRUCT Reg[ENGINEER_END]; - SENSOR_REG_STRUCT CCT[FACTORY_END_ADDR]; -} SENSOR_DATA_STRUCT, *PSENSOR_DATA_STRUCT; - -typedef enum { - SENSOR_MODE_INIT = 0, - SENSOR_MODE_PREVIEW, - SENSOR_MODE_VIDEO, - SENSOR_MODE_VIDEO_NIGHT, - SENSOR_MODE_SMALL_SIZE_END=SENSOR_MODE_VIDEO_NIGHT, - SENSOR_MODE_ZSD_PREVIEW, - SENSOR_MODE_CAPTURE, - SENSOR_MODE_FULL_SIZE_END=SENSOR_MODE_CAPTURE -} S5K5E2YA_SENSOR_MODE; - -typedef struct -{ - kal_uint32 DummyPixels; - kal_uint32 DummyLines; - - kal_uint32 pvShutter; - kal_uint32 pvGain; - - kal_uint32 pvPclk; // x10 480 for 48MHZ - kal_uint32 capPclk; // x10 - kal_uint32 m_vidPclk; - - kal_uint32 shutter; - kal_uint32 maxExposureLines; - kal_uint16 sensorGain; - kal_uint16 sensorBaseGain; - kal_int16 imgMirror; - - S5K5E2YA_SENSOR_MODE sensorMode; - - kal_bool S5K5E2YAAutoFlickerMode; - kal_bool S5K5E2YAVideoMode; - kal_uint32 FixedFrameLength; - -}S5K5E2YA_PARA_STRUCT,*PS5K5E2YA_PARA_STRUCT; - - //*************** +Sensor Framelength & Linelength ***************// - //Preview - #define S5K5E2YA_PV_PERIOD_PIXEL_NUMS (2950) - #define S5K5E2YA_PV_PERIOD_LINE_NUMS (2000) - - //Video - #define S5K5E2YA_VIDEO_PERIOD_PIXEL_NUMS (2950) - #define S5K5E2YA_VIDEO_PERIOD_LINE_NUMS (2000) - - //Capture - #define S5K5E2YA_FULL_PERIOD_PIXEL_NUMS (2950) - #define S5K5E2YA_FULL_PERIOD_LINE_NUMS (2025) - - //ZSD - #define S5K5E2YA_ZSD_PERIOD_PIXEL_NUMS S5K5E2YA_FULL_PERIOD_PIXEL_NUMS - #define S5K5E2YA_ZSD_PERIOD_LINE_NUMS S5K5E2YA_FULL_PERIOD_LINE_NUMS - //*************** -Sensor Framelength & Linelength ***************// - - //*************** +Sensor Output Size ***************// - #define S5K5E2YA_IMAGE_SENSOR_PV_WIDTH (1280) - #define S5K5E2YA_IMAGE_SENSOR_PV_HEIGHT (960) - - #define S5K5E2YA_IMAGE_SENSOR_VIDEO_WIDTH (2560) - #define S5K5E2YA_IMAGE_SENSOR_VIDEO_HEIGHT (1440) - - - #define S5K5E2YA_IMAGE_SENSOR_FULL_WIDTH (2560) - #define S5K5E2YA_IMAGE_SENSOR_FULL_HEIGHT (1920) - - - #define S5K5E2YA_IMAGE_SENSOR_ZSD_WIDTH S5K5E2YA_IMAGE_SENSOR_FULL_WIDTH - #define S5K5E2YA_IMAGE_SENSOR_ZSD_HEIGHT S5K5E2YA_IMAGE_SENSOR_FULL_HEIGHT - //*************** -Sensor Output Size ***************// - - - /* SENSOR START/EDE POSITION */ - #define S5K5E2YA_FULL_X_START (0) - #define S5K5E2YA_FULL_Y_START (0) - - - #define S5K5E2YA_PV_X_START (0) - #define S5K5E2YA_PV_Y_START (0) - - - #define S5K5E2YA_VIDEO_X_START (0) - #define S5K5E2YA_VIDEO_Y_START (0) - - - - #define S5K5E2YA_MAX_ANALOG_GAIN (16) - #define S5K5E2YA_MIN_ANALOG_GAIN (1) - - #define S5K5E2YA_MIN_LINE_LENGTH (0x0E68) //2724 - #define S5K5E2YA_MIN_FRAME_LENGTH (0x0A0F) //532 - - #define S5K5E2YA_MAX_LINE_LENGTH 0xCCCC - #define S5K5E2YA_MAX_FRAME_LENGTH 0xFFFF - - /* DUMMY NEEDS TO BE INSERTED */ - /* SETUP TIME NEED TO BE INSERTED */ - #define S5K5E2YA_IMAGE_SENSOR_PV_INSERTED_PIXELS 2 // Sync, Nosync=2 - #define S5K5E2YA_IMAGE_SENSOR_PV_INSERTED_LINES 2 - - #define S5K5E2YA_IMAGE_SENSOR_FULL_INSERTED_PIXELS 4 - #define S5K5E2YA_IMAGE_SENSOR_FULL_INSERTED_LINES 4 - - -#define S5K5E2YAMIPI_WRITE_ID (0x20) -#define S5K5E2YAMIPI_READ_ID (0x21) - -#define SENSOR_PCLK_PREVIEW (179200000) -#define SENSOR_PCLK_VIDEO SENSOR_PCLK_PREVIEW -#define SENSOR_PCLK_CAPTURE SENSOR_PCLK_PREVIEW -#define SENSOR_PCLK_ZSD SENSOR_PCLK_CAPTURE - - -#define S5K5E2YAMIPI_SENSOR_ID S5K5E2YA_SENSOR_ID - - -struct S5K5E2YA_MIPI_otp_struct -{ - kal_uint16 customer_id; - kal_uint16 module_integrator_id; - kal_uint16 lens_id; - kal_uint16 rg_ratio; - kal_uint16 bg_ratio; - kal_uint16 user_data[5]; - kal_uint16 R_to_G; - kal_uint16 B_to_G; - kal_uint16 G_to_G; - kal_uint16 R_Gain; - kal_uint16 G_Gain; - kal_uint16 B_Gain; -}; - - - -//export functions -UINT32 S5K5E2YAMIPIOpen(void); -UINT32 S5K5E2YAMIPIGetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); -UINT32 S5K5E2YAMIPIGetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 S5K5E2YAMIPIControl(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); -UINT32 S5K5E2YAMIPIFeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); -UINT32 S5K5E2YAMIPIClose(void); - - -#endif /* __SENSOR_H */ - diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19raw_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19raw_Sensor.c new file mode 100644 index 00000000000..77d46259cc6 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19raw_Sensor.c @@ -0,0 +1,1082 @@ +/***************************************************************************** + * + * Filename: + * --------- + * sensor.c + * + * Project: + * -------- + * RAW + * + * Description: + * ------------ + * Source code of Sensor driver + * + * + * Author: + * ------- + * Leo Lee + * + *============================================================================ + * HISTORY + *------------------------------------------------------------------------------ + * $Revision:$ + * $Modtime:$ + * $Log:$ + * + * 04 10 2013 + * First release MT6589 SP0A19 driver Version 1.0 + * + *------------------------------------------------------------------------------ + *============================================================================ + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" + +#include "sp0a19raw_Sensor.h" + +#define SP0A19_DEBUG +#ifdef SP0A19_DEBUG +#define SENSORDB(fmt, arg...) printk( "[SP0A19Raw] " fmt, ##arg) +#else +#define SENSORDB(x,...) +#endif + +#if defined(MT6577)||defined(MT6589) +static DEFINE_SPINLOCK(sp0a19_drv_lock); +#endif + +extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); + + +static SP0A19_sensor_struct SP0A19_sensor = +{ + .eng_info = + { + .SensorId = 128, + .SensorType = CMOS_SENSOR, + .SensorOutputDataFormat = SP0A19_COLOR_FORMAT, + }, + .Mirror = SP0A19_IMAGE_H_MIRROR, + .shutter = 0x20, + .gain = 0x20, + .pclk = SP0A19_PREVIEW_CLK, + .frame_height = SP0A19_PV_PERIOD_LINE_NUMS, + .line_length = SP0A19_PV_PERIOD_PIXEL_NUMS, +}; + +static kal_uint16 moduleid = 0x00; + +/************************************************************************* +* FUNCTION +* write_cmos_sensor +* +* DESCRIPTION +* This function wirte data to CMOS sensor through I2C +* +* PARAMETERS +* addr: the 16bit address of register +* para: the 8bit value of register +* +* RETURNS +* None +* +* LOCAL AFFECTED +* +*************************************************************************/ +static void write_cmos_sensor(kal_uint8 addr, kal_uint8 para) +{ + kal_uint8 out_buff[2]; + + out_buff[0] = addr; + out_buff[1] = para; + + iWriteRegI2C((u8*)out_buff , (u16)sizeof(out_buff), SP0A19_WRITE_ID); +} + +/************************************************************************* +* FUNCTION +* GC2035_read_cmos_sensor +* +* DESCRIPTION +* This function read data from CMOS sensor through I2C. +* +* PARAMETERS +* addr: the 16bit address of register +* +* RETURNS +* 8bit data read through I2C +* +* LOCAL AFFECTED +* +*************************************************************************/ +static kal_uint8 read_cmos_sensor(kal_uint8 addr) +{ + kal_uint8 in_buff[1] = {0xFF}; + kal_uint8 out_buff[1]; + + out_buff[0] = addr; + + if (0 != iReadRegI2C((u8*)out_buff , (u16) sizeof(out_buff), (u8*)in_buff, (u16) sizeof(in_buff), SP0A19_WRITE_ID)) { + SENSORDB("ERROR: read_cmos_sensor \n"); + } + return in_buff[0]; +} + +/************************************************************************* +* FUNCTION +* SP0A19_SetShutter +* +* DESCRIPTION +* This function set e-shutter of SP0A19 to change exposure time. +* +* PARAMETERS +* iShutter : exposured lines +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void SP0A19_set_shutter(kal_uint16 shutter) +{ + + +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_set_shutter iShutter = %d \n",shutter); +#endif + unsigned long flags; + if (shutter < 7) + shutter = 7; + else if(shutter > 0x1fff) + shutter = 0x1fff; +#if defined(MT6577)||defined(MT6589) + spin_lock_irqsave(&sp0a19_drv_lock, flags); +#endif + SP0A19_sensor.shutter = shutter; +#if defined(MT6577)||defined(MT6589) + spin_unlock_irqrestore(&sp0a19_drv_lock, flags); +#endif + //Update Shutter + write_cmos_sensor(0xfd, 0x00); + write_cmos_sensor(0x03, (shutter >> 8) & 0xFF); + write_cmos_sensor(0x04, shutter & 0xFF); + + SENSORDB("Exit! shutter =%d\n", shutter); + +} /* Set_SP0A19_Shutter */ + +/************************************************************************* +* FUNCTION +* SP0A19_SetGain +* +* DESCRIPTION +* This function is to set global gain to sensor. +* +* PARAMETERS +* iGain : sensor global gain(base: 0x40) +* +* RETURNS +* the actually gain set to sensor. +* +* GLOBALS AFFECTED +* +*************************************************************************/ +#define ANALOG_GAIN_1 64 // 1.00x +#define ANALOG_GAIN_2 88 // 1.375x +#define ANALOG_GAIN_3 122 // 1.90x +#define ANALOG_GAIN_4 168 // 2.625x +#define ANALOG_GAIN_5 239 // 3.738x +#define ANALOG_GAIN_6 330 // 5.163x +#define ANALOG_GAIN_7 470 // 7.350x + +kal_uint16 SP0A19_SetGain(kal_uint16 gain) +{ +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_SetGain iGain = %d BASEGAIN = %d\n",gain,BASEGAIN); +#endif + #if 1 + kal_uint8 iReg; + + if(gain >= BASEGAIN && gain <= 15*BASEGAIN) + { + iReg = 0x10 * gain/BASEGAIN; //change mtk gain base to aptina gain base + //iReg+= ((gain%BASEGAIN) * BASEGAIN)/0x10; + + if(iReg<=0x10) + { + write_cmos_sensor(0xfd, 0x00); + write_cmos_sensor(0x24, 0x10);//0x23 + SENSORDB("SP0A09MIPI_SetGain = 16"); + } + else if(iReg>= 0xa0)//gpw + { + write_cmos_sensor(0xfd, 0x00); + write_cmos_sensor(0x24,0xa0); + SENSORDB("SP0A09MIPI_SetGain = 160"); + } + else + { + write_cmos_sensor(0xfd, 0x00); + write_cmos_sensor(0x24, (kal_uint8)iReg); + SENSORDB("SP0A09MIPI_SetGain = %d",iReg); + } + } + else + SENSORDB("error gain setting"); + return gain; + + #endif +} +/************************************************************************* +* FUNCTION +* SP0A19_NightMode +* +* DESCRIPTION +* This function night mode of SP0A19. +* +* PARAMETERS +* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void SP0A19_night_mode(kal_bool enable) +{ +/*No Need to implement this function*/ +#if 0 + const kal_uint16 dummy_pixel = SP0A19_sensor.line_length - SP0A19_PV_PERIOD_PIXEL_NUMS; + const kal_uint16 pv_min_fps = enable ? SP0A19_sensor.night_fps : SP0A19_sensor.normal_fps; + kal_uint16 dummy_line = SP0A19_sensor.frame_height - SP0A19_PV_PERIOD_LINE_NUMS; + kal_uint16 max_exposure_lines; + + printk("[SP0A19_night_mode]enable=%d",enable); + if (!SP0A19_sensor.video_mode) return; + max_exposure_lines = SP0A19_sensor.pclk * SP0A19_FPS(1) / (pv_min_fps * SP0A19_sensor.line_length); + if (max_exposure_lines > SP0A19_sensor.frame_height) /* fix max frame rate, AE table will fix min frame rate */ +// { +// dummy_line = max_exposure_lines - SP0A19_PV_PERIOD_LINE_NUMS; +// } +#endif +} /* SP0A19_NightMode */ + + +/* write camera_para to sensor register */ +static void SP0A19_camera_para_to_sensor(void) +{ + kal_uint32 i; +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_camera_para_to_sensor\n"); +#endif + for (i = 0; 0xFFFFFFFF != SP0A19_sensor.eng.reg[i].Addr; i++) + { + write_cmos_sensor(SP0A19_sensor.eng.reg[i].Addr, SP0A19_sensor.eng.reg[i].Para); + } + for (i = SP0A19_FACTORY_START_ADDR; 0xFFFFFFFF != SP0A19_sensor.eng.reg[i].Addr; i++) + { + write_cmos_sensor(SP0A19_sensor.eng.reg[i].Addr, SP0A19_sensor.eng.reg[i].Para); + } + SP0A19_SetGain(SP0A19_sensor.gain); /* update gain */ +} + +/* update camera_para from sensor register */ +static void SP0A19_sensor_to_camera_para(void) +{ + kal_uint32 i,temp_data; +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_sensor_to_camera_para\n"); +#endif + for (i = 0; 0xFFFFFFFF != SP0A19_sensor.eng.reg[i].Addr; i++) + { + temp_data = read_cmos_sensor(SP0A19_sensor.eng.reg[i].Addr); +#if defined(MT6577)||defined(MT6589) + spin_lock(&sp0a19_drv_lock); +#endif + SP0A19_sensor.eng.reg[i].Para = temp_data; +#if defined(MT6577)||defined(MT6589) + spin_unlock(&sp0a19_drv_lock); +#endif + } + for (i = SP0A19_FACTORY_START_ADDR; 0xFFFFFFFF != SP0A19_sensor.eng.reg[i].Addr; i++) + { + temp_data = read_cmos_sensor(SP0A19_sensor.eng.reg[i].Addr); +#if defined(MT6577)||defined(MT6589) + spin_lock(&sp0a19_drv_lock); +#endif + SP0A19_sensor.eng.reg[i].Para = temp_data; +#if defined(MT6577)||defined(MT6589) + spin_unlock(&sp0a19_drv_lock); +#endif + } +} + +/* ------------------------ Engineer mode ------------------------ */ +inline static void SP0A19_get_sensor_group_count(kal_int32 *sensor_count_ptr) +{ +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_get_sensor_group_count\n"); +#endif + *sensor_count_ptr = SP0A19_GROUP_TOTAL_NUMS; +} + +inline static void SP0A19_get_sensor_group_info(MSDK_SENSOR_GROUP_INFO_STRUCT *para) +{ +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_get_sensor_group_info\n"); +#endif + switch (para->GroupIdx) + { + case SP0A19_PRE_GAIN: + sprintf(para->GroupNamePtr, "CCT"); + para->ItemCount = 5; + break; + case SP0A19_CMMCLK_CURRENT: + sprintf(para->GroupNamePtr, "CMMCLK Current"); + para->ItemCount = 1; + break; + case SP0A19_FRAME_RATE_LIMITATION: + sprintf(para->GroupNamePtr, "Frame Rate Limitation"); + para->ItemCount = 2; + break; + case SP0A19_REGISTER_EDITOR: + sprintf(para->GroupNamePtr, "Register Editor"); + para->ItemCount = 2; + break; + default: + ASSERT(0); + } +} + +inline static void SP0A19_get_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) +{ + + const static kal_char *cct_item_name[] = {"SENSOR_BASEGAIN", "Pregain-R", "Pregain-Gr", "Pregain-Gb", "Pregain-B"}; + const static kal_char *editer_item_name[] = {"REG addr", "REG value"}; + +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_get_sensor_item_info\n"); +#endif + switch (para->GroupIdx) + { + case SP0A19_PRE_GAIN: + switch (para->ItemIdx) + { + case SP0A19_SENSOR_BASEGAIN: + case SP0A19_PRE_GAIN_R_INDEX: + case SP0A19_PRE_GAIN_Gr_INDEX: + case SP0A19_PRE_GAIN_Gb_INDEX: + case SP0A19_PRE_GAIN_B_INDEX: + break; + default: + ASSERT(0); + } + sprintf(para->ItemNamePtr, cct_item_name[para->ItemIdx - SP0A19_SENSOR_BASEGAIN]); + para->ItemValue = SP0A19_sensor.eng.cct[para->ItemIdx].Para * 1000 / BASEGAIN; + para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; + para->Min = SP0A19_MIN_ANALOG_GAIN * 1000; + para->Max = SP0A19_MAX_ANALOG_GAIN * 1000; + break; + case SP0A19_CMMCLK_CURRENT: + switch (para->ItemIdx) + { + case 0: + sprintf(para->ItemNamePtr, "Drv Cur[2,4,6,8]mA"); + switch (SP0A19_sensor.eng.reg[SP0A19_CMMCLK_CURRENT_INDEX].Para) + { + case ISP_DRIVING_2MA: + para->ItemValue = 2; + break; + case ISP_DRIVING_4MA: + para->ItemValue = 4; + break; + case ISP_DRIVING_6MA: + para->ItemValue = 6; + break; + case ISP_DRIVING_8MA: + para->ItemValue = 8; + break; + default: + ASSERT(0); + } + para->IsTrueFalse = para->IsReadOnly = KAL_FALSE; + para->IsNeedRestart = KAL_TRUE; + para->Min = 2; + para->Max = 8; + break; + default: + ASSERT(0); + } + break; + case SP0A19_FRAME_RATE_LIMITATION: + switch (para->ItemIdx) + { + case 0: + sprintf(para->ItemNamePtr, "Max Exposure Lines"); + para->ItemValue = 5998; + break; + case 1: + sprintf(para->ItemNamePtr, "Min Frame Rate"); + para->ItemValue = 5; + break; + default: + ASSERT(0); + } + para->IsTrueFalse = para->IsNeedRestart = KAL_FALSE; + para->IsReadOnly = KAL_TRUE; + para->Min = para->Max = 0; + break; + case SP0A19_REGISTER_EDITOR: + switch (para->ItemIdx) + { + case 0: + case 1: + sprintf(para->ItemNamePtr, editer_item_name[para->ItemIdx]); + para->ItemValue = 0; + para->IsTrueFalse = para->IsReadOnly = para->IsNeedRestart = KAL_FALSE; + para->Min = 0; + para->Max = (para->ItemIdx == 0 ? 0xFFFF : 0xFF); + break; + default: + ASSERT(0); + } + break; + default: + ASSERT(0); + } +} + +inline static kal_bool SP0A19_set_sensor_item_info(MSDK_SENSOR_ITEM_INFO_STRUCT *para) +{ + kal_uint16 temp_para; +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19_set_sensor_item_info\n"); +#endif + switch (para->GroupIdx) + { + case SP0A19_PRE_GAIN: + switch (para->ItemIdx) + { + case SP0A19_SENSOR_BASEGAIN: + case SP0A19_PRE_GAIN_R_INDEX: + case SP0A19_PRE_GAIN_Gr_INDEX: + case SP0A19_PRE_GAIN_Gb_INDEX: + case SP0A19_PRE_GAIN_B_INDEX: +#if defined(MT6577)||defined(MT6589) + spin_lock(&sp0a19_drv_lock); +#endif + SP0A19_sensor.eng.cct[para->ItemIdx].Para = para->ItemValue * BASEGAIN / 1000; +#if defined(MT6577)||defined(MT6589) + spin_unlock(&sp0a19_drv_lock); +#endif + SP0A19_SetGain(SP0A19_sensor.gain); /* update gain */ + break; + default: + ASSERT(0); + } + break; + case SP0A19_CMMCLK_CURRENT: + switch (para->ItemIdx) + { + case 0: + switch (para->ItemValue) + { + case 2: + temp_para = ISP_DRIVING_2MA; + break; + case 3: + case 4: + temp_para = ISP_DRIVING_4MA; + break; + case 5: + case 6: + temp_para = ISP_DRIVING_6MA; + break; + default: + temp_para = ISP_DRIVING_8MA; + break; + } + //SP0A19_set_isp_driving_current(temp_para); +#if defined(MT6577)||defined(MT6589) + spin_lock(&sp0a19_drv_lock); +#endif + SP0A19_sensor.eng.reg[SP0A19_CMMCLK_CURRENT_INDEX].Para = temp_para; +#if defined(MT6577)||defined(MT6589) + spin_unlock(&sp0a19_drv_lock); +#endif + break; + default: + ASSERT(0); + } + break; + case SP0A19_FRAME_RATE_LIMITATION: + ASSERT(0); + break; + case SP0A19_REGISTER_EDITOR: + switch (para->ItemIdx) + { + static kal_uint32 fac_sensor_reg; + case 0: + if (para->ItemValue < 0 || para->ItemValue > 0xFFFF) return KAL_FALSE; + fac_sensor_reg = para->ItemValue; + break; + case 1: + if (para->ItemValue < 0 || para->ItemValue > 0xFF) return KAL_FALSE; + write_cmos_sensor(fac_sensor_reg, para->ItemValue); + break; + default: + ASSERT(0); + } + break; + default: + ASSERT(0); + } + return KAL_TRUE; +} + +void SP0A19_SetMirrorFlip(SP0A19_IMAGE_MIRROR Mirror) +{ +} + +static void SP0A19_Sensor_Init(void) +{ + SENSORDB("sensor_init start \n"); + write_cmos_sensor(0xfd,0x00); + write_cmos_sensor(0x32,0x00); + write_cmos_sensor(0x06,0x00); + write_cmos_sensor(0x09,0x00); + write_cmos_sensor(0x0a,0x14); + write_cmos_sensor(0x0f,0x2f); + write_cmos_sensor(0x10,0x2e); + write_cmos_sensor(0x11,0x00); + write_cmos_sensor(0x12,0x18); + write_cmos_sensor(0x13,0x2f); + write_cmos_sensor(0x14,0x00); + write_cmos_sensor(0x15,0x3f); + write_cmos_sensor(0x16,0x00); + write_cmos_sensor(0x17,0x18); + write_cmos_sensor(0x25,0x40); + write_cmos_sensor(0x1a,0x0b); + write_cmos_sensor(0x1b,0x0c); + write_cmos_sensor(0x1e,0x0b); + write_cmos_sensor(0x20,0x3f); + write_cmos_sensor(0x21,0x13); + write_cmos_sensor(0x22,0x19); + write_cmos_sensor(0x26,0x1a); + write_cmos_sensor(0x27,0xab); + write_cmos_sensor(0x28,0xfd); + write_cmos_sensor(0x30,0x00); + write_cmos_sensor(0x31,0x00); + write_cmos_sensor(0xfb,0x33); + write_cmos_sensor(0x1f,0x08); + write_cmos_sensor(0x34,0x00); + write_cmos_sensor(0x33,0x00); + write_cmos_sensor(0x5f,0x51); + write_cmos_sensor(0x35,0x20); + write_cmos_sensor(0x1C,0x28); + write_cmos_sensor(0xfd,0x00); + write_cmos_sensor(0x48,0x00); + write_cmos_sensor(0x49,0x01); + write_cmos_sensor(0x4a,0xe0); + write_cmos_sensor(0x4c,0x00); + write_cmos_sensor(0x4d,0x02); + write_cmos_sensor(0x4e,0x80); + write_cmos_sensor(0xfd,0x00); + write_cmos_sensor(0xf4,0x0f); + + SENSORDB("sensor_init end \n" ); +} /* SP0A19_Sensor_Init */ + +/*****************************************************************************/ +/* Windows Mobile Sensor Interface */ +/*****************************************************************************/ +/************************************************************************* +* FUNCTION +* SP0A19Open +* +* DESCRIPTION +* This function initialize the registers of CMOS sensor +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ + +UINT32 SP0A19Open(void) +{ + kal_uint32 rc = 0; + int retry = 0; + kal_uint16 sensorgain; + // check if sensor ID correct + retry = 3; + kal_uint16 sensor_id = 0; + mt_set_gpio_mode(GPIO_CAMERA_CMPDN1_PIN,GPIO_CAMERA_CMPDN1_PIN_M_GPIO); + mt_set_gpio_dir(GPIO_CAMERA_CMPDN1_PIN,GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_CAMERA_CMPDN1_PIN,GPIO_OUT_ZERO); + msleep(10); + + do { + // check if sensor ID correct + write_cmos_sensor(0xfd, 0x00); + sensor_id = read_cmos_sensor(0x02); + SENSORDB("sp0a19raw Read Sensor ID = 0x%04x\n", sensor_id); + if (sensor_id == SP0A19_SENSOR_ID) + { +// camera_pdn1_reverse = 1; + break; + } + retry--; + } while (retry > 0); + if (sensor_id != SP0A19_SENSOR_ID) { + sensor_id = 0xFFFFFFFF; + SENSORDB("sp0a19raw Read Sensor ID fail id = 0x%04x\n", sensor_id); + return ERROR_SENSOR_CONNECT_FAIL; + } + + /* initail sequence write in */ + SP0A19_Sensor_Init(); + +// SP0A19_SetMirrorFlip(SP0A19_sensor.Mirror); + + return ERROR_NONE; +} /* SP0A19Open */ + +UINT32 SP0A19GetModuleID() +{ + printk("SP0A19GetModuleID\n"); + return moduleid; +} + +/************************************************************************* +* FUNCTION +* SP0A19GetSensorID +* +* DESCRIPTION +* This function get the sensor ID +* +* PARAMETERS +* *sensorID : return the sensor ID +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +UINT32 SP0A19GetSensorID(UINT32 *sensorID) +{ + // check if sensor ID correct + kal_uint16 sensor_id=0; + int retry=3; + + SENSORDB("SP0A19GetSensorID \n"); + + // check if sensor ID correct + do { + + write_cmos_sensor(0xfd,0x00); + sensor_id=read_cmos_sensor(0x02); + if (sensor_id == SP0A19_SENSOR_ID) { + moduleid = 0x03; + SENSORDB("sp0a19raw Read Sensor ID = 0x%04x\n", sensor_id); + + break; + } + SENSORDB("Read Sensor ID Fail = 0x%x\n", sensor_id); + + retry--; + }while (retry > 0); + + if (sensor_id != SP0A19_SENSOR_ID) { + + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + + *sensorID = sensor_id; + return ERROR_NONE; +} + +/************************************************************************* +* FUNCTION +* SP0A19Close +* +* DESCRIPTION +* This function is to turn off sensor module power. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +UINT32 SP0A19Close(void) +{ +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19Close\n"); +#endif + //kdCISModulePowerOn(SensorIdx,currSensorName,0,mode_name); +// DRV_I2CClose(SP0A19hDrvI2C); + return ERROR_NONE; +} /* SP0A19Close */ + +/************************************************************************* +* FUNCTION +* SP0A19Preview +* +* DESCRIPTION +* This function start the sensor preview. +* +* PARAMETERS +* *image_window : address pointer of pixel numbers in one period of HSYNC +* *sensor_config_data : address pointer of line numbers in one period of VSYNC +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +UINT32 SP0A19Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ +#if defined(MT6577)||defined(MT6589) + spin_lock(&sp0a19_drv_lock); +#endif + SP0A19_sensor.pv_mode = KAL_TRUE; + + //SP0A19_set_mirror(sensor_config_data->SensorImageMirror); + switch (sensor_config_data->SensorOperationMode) + { + case MSDK_SENSOR_OPERATION_MODE_VIDEO: + SP0A19_sensor.video_mode = KAL_TRUE; + default: /* ISP_PREVIEW_MODE */ + SP0A19_sensor.video_mode = KAL_FALSE; + } + SP0A19_sensor.line_length = SP0A19_PV_PERIOD_PIXEL_NUMS; + SP0A19_sensor.frame_height = SP0A19_PV_PERIOD_LINE_NUMS; + SP0A19_sensor.pclk = SP0A19_PREVIEW_CLK; +#if defined(MT6577)||defined(MT6589) + spin_unlock(&sp0a19_drv_lock); +#endif + //SP0A19_Write_Shutter(SP0A19_sensor.shutter); + return ERROR_NONE; +} /* SP0A19Preview */ + +/************************************************************************* +* FUNCTION +* SP0A19Capture +* +* DESCRIPTION +* This function setup the CMOS sensor in capture MY_OUTPUT mode +* +* PARAMETERS +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +UINT32 SP0A19Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + kal_uint32 shutter = (kal_uint32)SP0A19_sensor.shutter; +#if defined(MT6577)||defined(MT6589) + spin_lock(&sp0a19_drv_lock); +#endif + SP0A19_sensor.video_mode = KAL_FALSE; + SP0A19_sensor.pv_mode = KAL_FALSE; +#if defined(MT6577)||defined(MT6589) + spin_unlock(&sp0a19_drv_lock); +#endif + return ERROR_NONE; +} /* SP0A19_Capture() */ + +UINT32 SP0A19GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) +{ + pSensorResolution->SensorFullWidth=SP0A19_IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorFullHeight=SP0A19_IMAGE_SENSOR_FULL_HEIGHT; + pSensorResolution->SensorPreviewWidth=SP0A19_IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorPreviewHeight=SP0A19_IMAGE_SENSOR_PV_HEIGHT; + pSensorResolution->SensorVideoWidth = SP0A19_IMAGE_SENSOR_VIDEO_WIDTH; + pSensorResolution->SensorVideoHeight = SP0A19_IMAGE_SENSOR_VIDEO_HEIGHT; + return ERROR_NONE; +} /* SP0A19GetResolution() */ + +UINT32 SP0A19GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + pSensorInfo->SensorPreviewResolutionX=SP0A19_IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY=SP0A19_IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX=SP0A19_IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY=SP0A19_IMAGE_SENSOR_FULL_HEIGHT; + + pSensorInfo->SensorCameraPreviewFrameRate=30; + pSensorInfo->SensorVideoFrameRate=30; + pSensorInfo->SensorStillCaptureFrameRate=10; + pSensorInfo->SensorWebCamCaptureFrameRate=15; + pSensorInfo->SensorResetActiveHigh=TRUE; //low active + pSensorInfo->SensorResetDelayCount=5; + pSensorInfo->SensorOutputDataFormat=SP0A19_COLOR_FORMAT; + pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_HIGH; + pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_PARALLEL; + + pSensorInfo->CaptureDelayFrame = 2; + pSensorInfo->PreviewDelayFrame = 1; + pSensorInfo->VideoDelayFrame = 1; + + pSensorInfo->SensorMasterClockSwitch = 0; + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_6MA; + pSensorInfo->AEShutDelayFrame =0; /* The frame of setting shutter default 0 for TG int */ + pSensorInfo->AESensorGainDelayFrame = 0; /* The frame of setting sensor gain */ + pSensorInfo->AEISPGainDelayFrame = 1; + + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockDividCount=3; + pSensorInfo->SensorClockRisingCount= 0; + pSensorInfo->SensorClockFallingCount= 2; + pSensorInfo->SensorPixelClockCount= 3; + pSensorInfo->SensorDataLatchCount= 2; + pSensorInfo->SensorGrabStartX = SP0A19_PV_X_START; + pSensorInfo->SensorGrabStartY = SP0A19_PV_Y_START; + + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockDividCount= 3; + pSensorInfo->SensorClockRisingCount=0; + pSensorInfo->SensorClockFallingCount=2; + pSensorInfo->SensorPixelClockCount=3; + pSensorInfo->SensorDataLatchCount=2; + pSensorInfo->SensorGrabStartX = SP0A19_FULL_X_START; + pSensorInfo->SensorGrabStartY = SP0A19_FULL_Y_START; + break; + default: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockDividCount=3; + pSensorInfo->SensorClockRisingCount=0; + pSensorInfo->SensorClockFallingCount=2; + pSensorInfo->SensorPixelClockCount=3; + pSensorInfo->SensorDataLatchCount=2; + pSensorInfo->SensorGrabStartX = SP0A19_PV_X_START; + pSensorInfo->SensorGrabStartY = SP0A19_PV_Y_START; + break; + } + memcpy(pSensorConfigData, &SP0A19_sensor.cfg_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* SP0A19GetInfo() */ + + +UINT32 SP0A19Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + +#ifdef SP0A19_DRIVER_TRACE + SENSORDB("SP0A19Control ScenarioId = %d \n",ScenarioId); +#endif + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + + SP0A19Preview(pImageWindow, pSensorConfigData); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + case MSDK_SCENARIO_ID_CAMERA_ZSD: + SP0A19Capture(pImageWindow, pSensorConfigData); + break; + default: + return ERROR_INVALID_SCENARIO_ID; + } + return TRUE; +} /* SP0A19Control() */ + + + +UINT32 SP0A19SetVideoMode(UINT16 u2FrameRate) +{}; + +UINT32 SP0A19FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; + UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; + //UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; + //UINT32 SP0A19SensorRegNumber; + //UINT32 i; + //PNVRAM_SENSOR_DATA_STRUCT pSensorDefaultData=(PNVRAM_SENSOR_DATA_STRUCT) pFeaturePara; + //MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + //MSDK_SENSOR_GROUP_INFO_STRUCT *pSensorGroupInfo=(MSDK_SENSOR_GROUP_INFO_STRUCT *) pFeaturePara; + //MSDK_SENSOR_ITEM_INFO_STRUCT *pSensorItemInfo=(MSDK_SENSOR_ITEM_INFO_STRUCT *) pFeaturePara; + //MSDK_SENSOR_ENG_INFO_STRUCT *pSensorEngInfo=(MSDK_SENSOR_ENG_INFO_STRUCT *) pFeaturePara; + + switch (FeatureId) + { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++=SP0A19_IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16=SP0A19_IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PERIOD: /* 3 */ + *pFeatureReturnPara16++=SP0A19_sensor.line_length; + *pFeatureReturnPara16=SP0A19_sensor.frame_height; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: /* 3 */ + *pFeatureReturnPara32 = SP0A19_sensor.pclk; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_SET_ESHUTTER: /* 4 */ + SP0A19_set_shutter(*pFeatureData16); + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + SP0A19_night_mode((BOOL) *pFeatureData16); + break; + case SENSOR_FEATURE_SET_GAIN: /* 6 */ + SP0A19_SetGain((UINT16) *pFeatureData16); + break; + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + break; + case SENSOR_FEATURE_SET_REGISTER: + write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + memcpy(&SP0A19_sensor.eng.cct, pFeaturePara, sizeof(SP0A19_sensor.eng.cct)); + break; + break; + case SENSOR_FEATURE_GET_CCT_REGISTER: /* 12 */ + if (*pFeatureParaLen >= sizeof(SP0A19_sensor.eng.cct) + sizeof(kal_uint32)) + { + *((kal_uint32 *)pFeaturePara++) = sizeof(SP0A19_sensor.eng.cct); + memcpy(pFeaturePara, &SP0A19_sensor.eng.cct, sizeof(SP0A19_sensor.eng.cct)); + } + break; + case SENSOR_FEATURE_SET_ENG_REGISTER: + memcpy(&SP0A19_sensor.eng.reg, pFeaturePara, sizeof(SP0A19_sensor.eng.reg)); + break; + case SENSOR_FEATURE_GET_ENG_REGISTER: /* 14 */ + if (*pFeatureParaLen >= sizeof(SP0A19_sensor.eng.reg) + sizeof(kal_uint32)) + { + *((kal_uint32 *)pFeaturePara++) = sizeof(SP0A19_sensor.eng.reg); + memcpy(pFeaturePara, &SP0A19_sensor.eng.reg, sizeof(SP0A19_sensor.eng.reg)); + } + case SENSOR_FEATURE_GET_REGISTER_DEFAULT: + ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->Version = NVRAM_CAMERA_SENSOR_FILE_VERSION; + ((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorId = SP0A19_SENSOR_ID; + memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorEngReg, &SP0A19_sensor.eng.reg, sizeof(SP0A19_sensor.eng.reg)); + memcpy(((PNVRAM_SENSOR_DATA_STRUCT)pFeaturePara)->SensorCCTReg, &SP0A19_sensor.eng.cct, sizeof(SP0A19_sensor.eng.cct)); + *pFeatureParaLen = sizeof(NVRAM_SENSOR_DATA_STRUCT); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pFeaturePara, &SP0A19_sensor.cfg_data, sizeof(SP0A19_sensor.cfg_data)); + *pFeatureParaLen = sizeof(SP0A19_sensor.cfg_data); + break; + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + SP0A19_camera_para_to_sensor(); + break; + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + SP0A19_sensor_to_camera_para(); + break; + case SENSOR_FEATURE_GET_GROUP_COUNT: + SP0A19_get_sensor_group_count((kal_uint32 *)pFeaturePara); + *pFeatureParaLen = 4; + break; + case SENSOR_FEATURE_GET_GROUP_INFO: + SP0A19_get_sensor_group_info((MSDK_SENSOR_GROUP_INFO_STRUCT *)pFeaturePara); + *pFeatureParaLen = sizeof(MSDK_SENSOR_GROUP_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_ITEM_INFO: + SP0A19_get_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); + *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + case SENSOR_FEATURE_SET_ITEM_INFO: + SP0A19_set_sensor_item_info((MSDK_SENSOR_ITEM_INFO_STRUCT *)pFeaturePara); + *pFeatureParaLen = sizeof(MSDK_SENSOR_ITEM_INFO_STRUCT); + break; + case SENSOR_FEATURE_GET_ENG_INFO: + memcpy(pFeaturePara, &SP0A19_sensor.eng_info, sizeof(SP0A19_sensor.eng_info)); + *pFeatureParaLen = sizeof(SP0A19_sensor.eng_info); + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE + // if EEPROM does not exist in camera module. + *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID://cuirui add for MID + *pFeatureReturnPara32=SP0A19GetModuleID(); + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + //SP0A19SetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + SP0A19GetSensorID(pFeatureReturnPara32); + break; + case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: + break; + default: + break; + } + return ERROR_NONE; +} /* SP0A19FeatureControl() */ +SENSOR_FUNCTION_STRUCT SensorFuncSP0A19= +{ + SP0A19Open, + SP0A19GetInfo, + SP0A19GetResolution, + SP0A19FeatureControl, + SP0A19Control, + SP0A19Close +}; + +UINT32 SP0A19_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc!=NULL) + *pfFunc=&SensorFuncSP0A19; + + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19raw_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19raw_Sensor.h new file mode 100644 index 00000000000..9be3398860e --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19raw_Sensor.h @@ -0,0 +1,143 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef _SP0A19_SENSOR_H +#define _SP0A19_SENSOR_H + +#define SP0A19_DEBUG +#define SP0A19_DRIVER_TRACE +//#define SP0A19_TEST_PATTEM + +#define SP0A19_FACTORY_START_ADDR 0 +#define SP0A19_ENGINEER_START_ADDR 10 + +typedef enum SP0A19_group_enum +{ + SP0A19_PRE_GAIN = 0, + SP0A19_CMMCLK_CURRENT, + SP0A19_FRAME_RATE_LIMITATION, + SP0A19_REGISTER_EDITOR, + SP0A19_GROUP_TOTAL_NUMS +} SP0A19_FACTORY_GROUP_ENUM; + +typedef enum SP0A19_register_index +{ + SP0A19_SENSOR_BASEGAIN = SP0A19_FACTORY_START_ADDR, + SP0A19_PRE_GAIN_R_INDEX, + SP0A19_PRE_GAIN_Gr_INDEX, + SP0A19_PRE_GAIN_Gb_INDEX, + SP0A19_PRE_GAIN_B_INDEX, + SP0A19_FACTORY_END_ADDR +} SP0A19_FACTORY_REGISTER_INDEX; + +typedef enum SP0A19_engineer_index +{ + SP0A19_CMMCLK_CURRENT_INDEX = SP0A19_ENGINEER_START_ADDR, + SP0A19_ENGINEER_END +} SP0A19_FACTORY_ENGINEER_INDEX; + +typedef struct _sensor_data_struct +{ + SENSOR_REG_STRUCT reg[SP0A19_ENGINEER_END]; + SENSOR_REG_STRUCT cct[SP0A19_FACTORY_END_ADDR]; +} sensor_data_struct; + +/* SENSOR PREVIEW/CAPTURE VT CLOCK */ +#define SP0A19_PREVIEW_CLK 12000000 +#define SP0A19_CAPTURE_CLK 12000000 + +#define SP0A19_COLOR_FORMAT SENSOR_OUTPUT_FORMAT_RAW8_B //SENSOR_OUTPUT_FORMAT_RAW_Gb //SENSOR_OUTPUT_FORMAT_RAW_R + +#define SP0A19_MIN_ANALOG_GAIN 1 /* 1x */ +#define SP0A19_MAX_ANALOG_GAIN 10 /* 2.8x */ + + +/* FRAME RATE UNIT */ +#define SP0A19_FPS(x) (10 * (x)) + +/* SENSOR PIXEL/LINE NUMBERS IN ONE PERIOD */ + +#define SP0A19_FULL_PERIOD_PIXEL_NUMS 871 +#define SP0A19_FULL_PERIOD_LINE_NUMS 510 + +#define SP0A19_VIDEO_PERIOD_PIXEL_NUMS 871 +#define SP0A19_VIDEO_PERIOD_LINE_NUMS 510 + +#define SP0A19_PV_PERIOD_PIXEL_NUMS 871 +#define SP0A19_PV_PERIOD_LINE_NUMS 510 + +/* SENSOR START/END POSITION */ +#define SP0A19_FULL_X_START 0 +#define SP0A19_FULL_Y_START 0 +#define SP0A19_IMAGE_SENSOR_FULL_WIDTH (640) +#define SP0A19_IMAGE_SENSOR_FULL_HEIGHT (480) + +#define SP0A19_VIDEO_X_START 0 +#define SP0A19_VIDEO_Y_START 0 +#define SP0A19_IMAGE_SENSOR_VIDEO_WIDTH (640) +#define SP0A19_IMAGE_SENSOR_VIDEO_HEIGHT (480) + +#define SP0A19_PV_X_START 0 +#define SP0A19_PV_Y_START 0 +#define SP0A19_IMAGE_SENSOR_PV_WIDTH (640) +#define SP0A19_IMAGE_SENSOR_PV_HEIGHT (480) + +/* SENSOR READ/WRITE ID */ +#define SP0A19_WRITE_ID (0x42) +#define SP0A19_READ_ID (0x43) + +/* SENSOR ID */ +//#define SP0A19_SENSOR_ID (0x2355) + +/* SENSOR PRIVATE STRUCT */ +typedef enum { + SENSOR_MODE_INIT = 0, + SENSOR_MODE_PREVIEW, + SENSOR_MODE_VIDEO, + SENSOR_MODE_CAPTURE +} SP0A19_SENSOR_MODE; + +typedef enum{ + SP0A19_IMAGE_NORMAL = 0, + SP0A19_IMAGE_H_MIRROR, + SP0A19_IMAGE_V_MIRROR, + SP0A19_IMAGE_HV_MIRROR +}SP0A19_IMAGE_MIRROR; + +typedef struct SP0A19_sensor_STRUCT +{ + MSDK_SENSOR_CONFIG_STRUCT cfg_data; + sensor_data_struct eng; /* engineer mode */ + MSDK_SENSOR_ENG_INFO_STRUCT eng_info; + SP0A19_SENSOR_MODE sensorMode; + SP0A19_IMAGE_MIRROR Mirror; + kal_bool pv_mode; + kal_bool video_mode; + kal_bool NightMode; + kal_uint16 normal_fps; /* video normal mode max fps */ + kal_uint16 night_fps; /* video night mode max fps */ + kal_uint16 FixedFps; + kal_uint16 shutter; + kal_uint16 gain; + kal_uint32 pclk; + kal_uint16 frame_height; + kal_uint16 frame_height_BackUp; + kal_uint16 line_length; + kal_uint16 Prv_line_length; +} SP0A19_sensor_struct; + +typedef enum SP0A19_GainMode_Index +{ + SP0A19_Analogic_Gain = 0, + SP0A19_Digital_Gain +}SP0A19_GainMode_Index; +//export functions +UINT32 SP0A19Open(void); +UINT32 SP0A19Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 SP0A19FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); +UINT32 SP0A19GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 SP0A19GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); +UINT32 SP0A19Close(void); + +#define Sleep(ms) mdelay(ms) + +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_CameraCustomized.h new file mode 100755 index 00000000000..0c36a5c0412 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_CameraCustomized.h @@ -0,0 +1,70 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#ifndef __CAMERA_CUSTOMIZED_H +#define __CAMERA_CUSTOMIZED_H + +// the angle between handset and sensor placement in clockwise, should be one of 0, 90, 270 +#define MAIN_SENSOR_ORIENTATION_ANGLE 90 // 90 +#define SUB_SENSOR_ORIENTATION_ANGLE 0 // do not care if the sub sensor does not exist + + +// First, we think you hold the cell phone vertical. +// Second, we suppose the direction of upward is 0 +// Third, it is 90, 180, 270 in clockwise +// here we define the main sensor and sub sensor angles to deal with the jpeg orientation +#define MAIN_SENSOR_TO_PHONE_ANGLE 0 +#define SUB_SENSOR_TO_PHONE_ANGLE 0 + + +#define CAM_SIZE_QVGA_WIDTH 320 +#define CAM_SIZE_QVGA_HEIGHT 240 +#define CAM_SIZE_VGA_WIDTH 640 +#define CAM_SIZE_VGA_HEIGHT 480 +#define CAM_SIZE_05M_WIDTH 800 +#define CAM_SIZE_05M_HEIGHT 600 +#define CAM_SIZE_1M_WIDTH 1280 +#define CAM_SIZE_1M_HEIGHT 960 +#define CAM_SIZE_2M_WIDTH 1600 +#define CAM_SIZE_2M_HEIGHT 1200 +#define CAM_SIZE_3M_WIDTH 2048 +#define CAM_SIZE_3M_HEIGHT 1536 +#define CAM_SIZE_5M_WIDTH 2592 +#define CAM_SIZE_5M_HEIGHT 1944 + +// for main sensor +#define MAIN_NUM_OF_PREVIEW_RESOLUTION 3 +#define MAIN_NUM_OF_VIDEO_RESOLUTION 4 +#define MAIN_NUM_OF_STILL_RESOLUTION 7 +#define MAIN_VIDEO_RESOLUTION_PROFILE {{176,144},{320,240},{640,480},{720,480}} +#define MAIN_PREVIEW_RESOLUTION_PROFILE {{232,174},{320,240},{240,320}} +#define MAIN_STILL_RESOLUTION_PROFILE {{CAM_SIZE_QVGA_WIDTH,CAM_SIZE_QVGA_HEIGHT}, \ + {CAM_SIZE_VGA_WIDTH,CAM_SIZE_VGA_HEIGHT}, \ + // {CAM_SIZE_05M_WIDTH,CAM_SIZE_05M_HEIGHT}, \ + // {CAM_SIZE_1M_WIDTH,CAM_SIZE_1M_HEIGHT}, \ + // {CAM_SIZE_2M_WIDTH,CAM_SIZE_2M_HEIGHT}, \ + // {CAM_SIZE_3M_WIDTH,CAM_SIZE_3M_HEIGHT}, \ + // {CAM_SIZE_5M_WIDTH,CAM_SIZE_5M_HEIGHT}} + +// if sub sensor does not exist, set all the parameters as 0 +#define SUB_NUM_OF_PREVIEW_RESOLUTION 0 +#define SUB_NUM_OF_VIDEO_RESOLUTION 0 +#define SUB_NUM_OF_STILL_RESOLUTION 0 +#define SUB_VIDEO_RESOLUTION_PROFILE {{0,0}} +#define SUB_PREVIEW_RESOLUTION_PROFILE {{0,0}} +#define SUB_STILL_RESOLUTION_PROFILE {{0,0}} + +//#define NUM_OF_PREVIEW_RESOLUTION max(MAIN_NUM_OF_PREVIEW_RESOLUTION,SUB_NUM_OF_PREVIEW_RESOLUTION) +//#define NUM_OF_VIDEO_RESOLUTION max(MAIN_NUM_OF_VIDEO_RESOLUTION,SUB_NUM_OF_VIDEO_RESOLUTION) +//#define NUM_OF_STILL_RESOLUTION max(MAIN_NUM_OF_STILL_RESOLUTION,SUB_NUM_OF_STILL_RESOLUTION) + +#define NUM_OF_VIDEO_STREAM_BUFF 8 // Maximun is 8 +#endif diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Camera_Sensor_para.h new file mode 100755 index 00000000000..5ccb0afd5de --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Camera_Sensor_para.h @@ -0,0 +1,66 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +/* SENSOR FULL SIZE */ +#ifndef __CAMERA_SENSOR_PARA_H +#define __CAMERA_SENSOR_PARA_H + +#define CAMERA_SENSOR_REG_DEFAULT_VALUE \ + /* ARRAY: SENSOR.reg[11] */\ + {\ + /* STRUCT: SENSOR.reg[0] */\ + {\ + /* SENSOR.reg[0].addr */ 0x00000304, /* SENSOR.reg[0].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[1] */\ + {\ + /* SENSOR.reg[1].addr */ 0x00000305, /* SENSOR.reg[1].para */ 0x0000000D\ + },\ + /* STRUCT: SENSOR.reg[2] */\ + {\ + /* SENSOR.reg[2].addr */ 0x00000306, /* SENSOR.reg[2].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[3] */\ + {\ + /* SENSOR.reg[3].addr */ 0x00000307, /* SENSOR.reg[3].para */ 0x000000C0\ + },\ + /* STRUCT: SENSOR.reg[4] */\ + {\ + /* SENSOR.reg[4].addr */ 0x00000300, /* SENSOR.reg[4].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[5] */\ + {\ + /* SENSOR.reg[5].addr */ 0x00000301, /* SENSOR.reg[5].para */ 0x00000004\ + },\ + /* STRUCT: SENSOR.reg[6] */\ + {\ + /* SENSOR.reg[6].addr */ 0x0000030A, /* SENSOR.reg[6].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[7] */\ + {\ + /* SENSOR.reg[7].addr */ 0x0000030B, /* SENSOR.reg[7].para */ 0x00000002\ + },\ + /* STRUCT: SENSOR.reg[8] */\ + {\ + /* SENSOR.reg[8].addr */ 0x00000308, /* SENSOR.reg[8].para */ 0x00000000\ + },\ + /* STRUCT: SENSOR.reg[9] */\ + {\ + /* SENSOR.reg[9].addr */ 0x00000309, /* SENSOR.reg[9].para */ 0x00000008\ + },\ + /* STRUCT: SENSOR.reg[10] */\ + {\ + /* SENSOR.reg[10].addr */ 0xFFFFFFFF, /* SENSOR.reg[10].para */ 0x00000001\ + }\ + } + +#define CAMERA_SENSOR_CCT_DEFAULT_VALUE {{ 0xFFFFFFFF, 0x08 } ,{ 0x0209, 0x0008 } ,{ 0x0207, 0x0008 } ,{ 0x020D, 0x0008 } ,{ 0x020B, 0x0008 }} +#endif /* __CAMERA_SENSOR_PARA_H */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Sensor.c new file mode 100755 index 00000000000..ee62dcd5cb5 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Sensor.c @@ -0,0 +1,2314 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" +#include "kd_camera_feature.h" + +#include "sp0a19yuv_Sensor.h" +#include "sp0a19yuv_Camera_Sensor_para.h" +#include "sp0a19yuv_CameraCustomized.h" +#define SP0A19_TEST_PATTERN_CHECKSUM (0xf7d0cc8c) //(0xcd8a511e)//(0x3f8c7160)//(0x5593c632)// +//#include + +#define SP0A19YUV_DEBUG +#ifdef SP0A19YUV_DEBUG +#define SENSORDB printk +#else +#define SENSORDB(x,...) +#endif +//#define DEBUG_SENSOR_SP0A19 + +#ifdef DEBUG_SENSOR_SP0A19 +static kal_uint8 SP0A19_fromsd = 0; +kal_uint16 SP0A19_write_cmos_sensor(kal_uint8 addr, kal_uint8 para); +#define SP0A19_OP_CODE_INI 0x00 /* Initial value. */ +#define SP0A19_OP_CODE_REG 0x01 /* Register */ +#define SP0A19_OP_CODE_DLY 0x02 /* Delay */ +#define SP0A19_OP_CODE_END 0x03 /* End of initial setting. */ + + +typedef struct +{ + u16 init_reg; + u16 init_val; /* Save the register value and delay tick */ + u8 op_code; /* 0 - Initial value, 1 - Register, 2 - Delay, 3 - End of setting. */ +} SP0A19_initial_set_struct; + +SP0A19_initial_set_struct SP0A19_Init_Reg[1000]; + +static u32 SP0A19_strtol(const char *nptr, u8 base) +{ + u8 ret; + if(!nptr || (base!=16 && base!=10 && base!=8)) + { + printk("%s(): NULL pointer input\n", __FUNCTION__); + return -1; + } + for(ret=0; *nptr; nptr++) + { + if((base==16 && *nptr>='A' && *nptr<='F') || + (base==16 && *nptr>='a' && *nptr<='f') || + (base>=10 && *nptr>='0' && *nptr<='9') || + (base>=8 && *nptr>='0' && *nptr<='7') ) + { + ret *= base; + if(base==16 && *nptr>='A' && *nptr<='F') + ret += *nptr-'A'+10; + else if(base==16 && *nptr>='a' && *nptr<='f') + ret += *nptr-'a'+10; + else if(base>=10 && *nptr>='0' && *nptr<='9') + ret += *nptr-'0'; + else if(base>=8 && *nptr>='0' && *nptr<='7') + ret += *nptr-'0'; + } + else + return ret; + } + return ret; +} + +u8 SP0A19_Initialize_from_T_Flash() +{ + //FS_HANDLE fp = -1; /* Default, no file opened. */ + //u8 *data_buff = NULL; + u8 *curr_ptr = NULL; + u32 file_size = 0; + //u32 bytes_read = 0; + u32 i = 0, j = 0; + u8 func_ind[4] = {0}; /* REG or DLY */ + + + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static u8 data_buff[10*1024] ; + + fp = filp_open("/mnt/sdcard/SP0A19_sd", O_RDONLY , 0); + if (IS_ERR(fp)) { + printk("create file error\n"); + return -1; + } + fs = get_fs(); + set_fs(KERNEL_DS); + + file_size = vfs_llseek(fp, 0, SEEK_END); + vfs_read(fp, data_buff, file_size, &pos); + //printk("%s %d %d\n", buf,iFileLen,pos); + filp_close(fp, NULL); + set_fs(fs); + + + + + + /* Start parse the setting witch read from t-flash. */ + curr_ptr = data_buff; + while (curr_ptr < (data_buff + file_size)) + { + while ((*curr_ptr == ' ') || (*curr_ptr == '\t'))/* Skip the Space & TAB */ + curr_ptr++; + + if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '*')) + { + while (!(((*curr_ptr) == '*') && ((*(curr_ptr + 1)) == '/'))) + { + curr_ptr++; /* Skip block comment code. */ + } + + while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) + { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue ; + } + + if (((*curr_ptr) == '/') || ((*curr_ptr) == '{') || ((*curr_ptr) == '}')) /* Comment line, skip it. */ + { + while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) + { + curr_ptr++; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue ; + } + /* This just content one enter line. */ + if (((*curr_ptr) == 0x0D) && ((*(curr_ptr + 1)) == 0x0A)) + { + curr_ptr += 2; + continue ; + } + //printk(" curr_ptr1 = %s\n",curr_ptr); + memcpy(func_ind, curr_ptr, 3); + + + if (strcmp((const char *)func_ind, "REG") == 0) /* REG */ + { + curr_ptr += 6; /* Skip "REG(0x" or "DLY(" */ + SP0A19_Init_Reg[i].op_code = SP0A19_OP_CODE_REG; + + SP0A19_Init_Reg[i].init_reg = SP0A19_strtol((const char *)curr_ptr, 16); + curr_ptr += 5; /* Skip "00, 0x" */ + + SP0A19_Init_Reg[i].init_val = SP0A19_strtol((const char *)curr_ptr, 16); + curr_ptr += 4; /* Skip "00);" */ + + } + else /* DLY */ + { + /* Need add delay for this setting. */ + curr_ptr += 4; + SP0A19_Init_Reg[i].op_code = SP0A19_OP_CODE_DLY; + + SP0A19_Init_Reg[i].init_reg = 0xFF; + SP0A19_Init_Reg[i].init_val = SP0A19_strtol((const char *)curr_ptr, 10); /* Get the delay ticks, the delay should less then 50 */ + } + i++; + + + /* Skip to next line directly. */ + while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) + { + curr_ptr++; + } + curr_ptr += 2; + } + + /* (0xFFFF, 0xFFFF) means the end of initial setting. */ + SP0A19_Init_Reg[i].op_code = SP0A19_OP_CODE_END; + SP0A19_Init_Reg[i].init_reg = 0xFF; + SP0A19_Init_Reg[i].init_val = 0xFF; + i++; + //for (j=0; j enable night mode, otherwise, disable night mode + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +void SP0A19GammaSelect(kal_uint32 GammaLvl); +void SP0A19NightMode(kal_bool bEnable) + { + // kal_uint8 temp = SP0A19_read_cmos_sensor(0x3B); + + if(bEnable)//night mode + { + SP0A19_write_cmos_sensor(0xfd,0x0 ); + SP0A19_write_cmos_sensor(0xb2,0x25); + SP0A19_write_cmos_sensor(0xb3,0x1f); + + if(SP0A19_MPEG4_encode_mode == KAL_TRUE) + { + if(sp0a19_isBanding== 0) + { + //Video record night 24M 50hz 12-12FPS maxgain:0x8c + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x00); + SP0A19_write_cmos_sensor(0x04,0x7b); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x08); + SP0A19_write_cmos_sensor(0x0a,0x1d); + SP0A19_write_cmos_sensor(0xf0,0x29); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x0c); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x29); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0xec); + SP0A19_write_cmos_sensor(0xcf,0x01); + SP0A19_write_cmos_sensor(0xd0,0xec); + SP0A19_write_cmos_sensor(0xd1,0x01); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" video 50Hz night\r\n"); + } + else if(sp0a19_isBanding == 1) + { + //SI13_SP0A19 24M 1\B7\D6Ƶ 50Hz 8.0392-8fps AE_Parameters_ maxgain 80 + //dbg_print("SP0A19_VID_NIGTHT_60HZ \r\n"); + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x00); + SP0A19_write_cmos_sensor(0x04,0x69); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x07); + SP0A19_write_cmos_sensor(0x0a,0xd7); + SP0A19_write_cmos_sensor(0xf0,0x23); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x0f); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x23); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0x0d); + SP0A19_write_cmos_sensor(0xcf,0x02); + SP0A19_write_cmos_sensor(0xd0,0x0d); + SP0A19_write_cmos_sensor(0xd1,0x02); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" video 60Hz night\r\n"); + } + } + else + { + + if(sp0a19_isBanding== 0) + { + //capture preview night 24M 50hz 20-6FPS maxgain:0x78 + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x01); + SP0A19_write_cmos_sensor(0x04,0x32); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x01); + SP0A19_write_cmos_sensor(0x0a,0x46); + SP0A19_write_cmos_sensor(0xf0,0x66); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x10); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x66); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0x60); + SP0A19_write_cmos_sensor(0xcf,0x06); + SP0A19_write_cmos_sensor(0xd0,0x60); + SP0A19_write_cmos_sensor(0xd1,0x06); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" priview 50Hz night\r\n"); + } + else if(sp0a19_isBanding== 1) + { + //capture preview night 24M 60hz 20-6FPS maxgain:0x78 + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x00); + SP0A19_write_cmos_sensor(0x04,0xff); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x01); + SP0A19_write_cmos_sensor(0x0a,0x46); + SP0A19_write_cmos_sensor(0xf0,0x55); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x14); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x55); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0xa4); + SP0A19_write_cmos_sensor(0xcf,0x06); + SP0A19_write_cmos_sensor(0xd0,0xa4); + SP0A19_write_cmos_sensor(0xd1,0x06); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" priview 60Hz night\r\n"); + } + } + } + else // daylight mode + { + + SP0A19_write_cmos_sensor(0xfd,0x0 ); + SP0A19_write_cmos_sensor(0xb2,0x10); + SP0A19_write_cmos_sensor(0xb3,0x1f); + + if(SP0A19_MPEG4_encode_mode == KAL_TRUE) + { + + if(sp0a19_isBanding== 0) + { + //Video record daylight 24M 50hz 14-14FPS maxgain:0x80 + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x00); + SP0A19_write_cmos_sensor(0x04,0xd8); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x03); + SP0A19_write_cmos_sensor(0x0a,0x31); + SP0A19_write_cmos_sensor(0xf0,0x48); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x07); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x48); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0xf8); + SP0A19_write_cmos_sensor(0xcf,0x01); + SP0A19_write_cmos_sensor(0xd0,0xf8); + SP0A19_write_cmos_sensor(0xd1,0x01); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" video 50Hz normal\r\n"); + } + else if(sp0a19_isBanding == 1) + { + //Video record daylight 24M 60Hz 14-14FPS maxgain:0x80 + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x00); + SP0A19_write_cmos_sensor(0x04,0xb4); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x03); + SP0A19_write_cmos_sensor(0x0a,0x31); + SP0A19_write_cmos_sensor(0xf0,0x3c); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x08); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x3c); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0xe0); + SP0A19_write_cmos_sensor(0xcf,0x01); + SP0A19_write_cmos_sensor(0xd0,0xe0); + SP0A19_write_cmos_sensor(0xd1,0x01); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" video 60Hz normal \n"); + } + } + else + { + // SENSORDB(" SP0A19_banding=%x\r\n",SP0A19_banding); + if(sp0a19_isBanding== 0) + { + //capture preview daylight 24M 50hz 20-8FPS maxgain:0x70 + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x01); + SP0A19_write_cmos_sensor(0x04,0x32); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x01); + SP0A19_write_cmos_sensor(0x0a,0x46); + SP0A19_write_cmos_sensor(0xf0,0x66); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x0c); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x66); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0xc8); + SP0A19_write_cmos_sensor(0xcf,0x04); + SP0A19_write_cmos_sensor(0xd0,0xc8); + SP0A19_write_cmos_sensor(0xd1,0x04); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" priview 50Hz normal\r\n"); + } + else if(sp0a19_isBanding== 1) + { + //capture preview daylight 24M 60hz 20-8FPS maxgain:0x70 + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x00); + SP0A19_write_cmos_sensor(0x04,0xff); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x01); + SP0A19_write_cmos_sensor(0x0a,0x46); + SP0A19_write_cmos_sensor(0xf0,0x55); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x0f); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x55); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0xfb); + SP0A19_write_cmos_sensor(0xcf,0x04); + SP0A19_write_cmos_sensor(0xd0,0xfb); + SP0A19_write_cmos_sensor(0xd1,0x04); + SP0A19_write_cmos_sensor(0xfd,0x00); + SENSORDB(" priview 60Hz normal\r\n"); + } + } + + } +} + +/************************************************************************* +* FUNCTION +* SP0A19_Sensor_Init +* +* DESCRIPTION +* This function apply all of the initial setting to sensor. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +*************************************************************************/ +void SP0A19_Sensor_Init(void) +{ + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x1c,0x28); + SP0A19_write_cmos_sensor(0x32,0x00); + SP0A19_write_cmos_sensor(0x0f,0x2f); + SP0A19_write_cmos_sensor(0x10,0x2e); + SP0A19_write_cmos_sensor(0x11,0x00); + SP0A19_write_cmos_sensor(0x12,0x18); + SP0A19_write_cmos_sensor(0x13,0x2f); + SP0A19_write_cmos_sensor(0x14,0x00); + SP0A19_write_cmos_sensor(0x15,0x3f); + SP0A19_write_cmos_sensor(0x16,0x00); + SP0A19_write_cmos_sensor(0x17,0x18); + SP0A19_write_cmos_sensor(0x25,0x40); + SP0A19_write_cmos_sensor(0x1a,0x0b); + SP0A19_write_cmos_sensor(0x1b,0x0c); + SP0A19_write_cmos_sensor(0x1e,0x0b); + SP0A19_write_cmos_sensor(0x20,0x3f); + SP0A19_write_cmos_sensor(0x21,0x13); + SP0A19_write_cmos_sensor(0x22,0x19); + SP0A19_write_cmos_sensor(0x26,0x1a); + SP0A19_write_cmos_sensor(0x27,0xab); + SP0A19_write_cmos_sensor(0x28,0xfd); + SP0A19_write_cmos_sensor(0x30,0x00); + SP0A19_write_cmos_sensor(0x31,0x00);//0x20 + SP0A19_write_cmos_sensor(0xfb,0x31); + SP0A19_write_cmos_sensor(0x1f,0x08); + + //Blacklevel + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x65,0x00); + SP0A19_write_cmos_sensor(0x66,0x00); + SP0A19_write_cmos_sensor(0x67,0x00); + SP0A19_write_cmos_sensor(0x68,0x00); + SP0A19_write_cmos_sensor(0x45,0x00); + SP0A19_write_cmos_sensor(0x46,0x0f); + + //ae setting + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x03,0x01); + SP0A19_write_cmos_sensor(0x04,0x32); + SP0A19_write_cmos_sensor(0x06,0x00); + SP0A19_write_cmos_sensor(0x09,0x01); + SP0A19_write_cmos_sensor(0x0a,0x46); + SP0A19_write_cmos_sensor(0xf0,0x66); + SP0A19_write_cmos_sensor(0xf1,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x90,0x0c); + SP0A19_write_cmos_sensor(0x92,0x01); + SP0A19_write_cmos_sensor(0x98,0x66); + SP0A19_write_cmos_sensor(0x99,0x00); + SP0A19_write_cmos_sensor(0x9a,0x01); + SP0A19_write_cmos_sensor(0x9b,0x00); + + //Status + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xce,0xc8); + SP0A19_write_cmos_sensor(0xcf,0x04); + SP0A19_write_cmos_sensor(0xd0,0xc8); + SP0A19_write_cmos_sensor(0xd1,0x04); + + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xc4,0x56); + SP0A19_write_cmos_sensor(0xc5,0x8f); + SP0A19_write_cmos_sensor(0xca,0x30); + SP0A19_write_cmos_sensor(0xcb,0x45); + SP0A19_write_cmos_sensor(0xcc,0x70); + SP0A19_write_cmos_sensor(0xcd,0x48); + SP0A19_write_cmos_sensor(0xfd,0x00); + + //lsc for st + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x35,0x24); + SP0A19_write_cmos_sensor(0x36,0x15); + SP0A19_write_cmos_sensor(0x37,0x15); + SP0A19_write_cmos_sensor(0x38,0x15); + SP0A19_write_cmos_sensor(0x39,0x1c); + SP0A19_write_cmos_sensor(0x3a,0x13); + SP0A19_write_cmos_sensor(0x3b,0x10); + SP0A19_write_cmos_sensor(0x3c,0x15); + SP0A19_write_cmos_sensor(0x3d,0x1b); + SP0A19_write_cmos_sensor(0x3e,0x10); + SP0A19_write_cmos_sensor(0x3f,0x0f); + SP0A19_write_cmos_sensor(0x40,0x18); + SP0A19_write_cmos_sensor(0x41,0x0b); + SP0A19_write_cmos_sensor(0x42,0x00); + SP0A19_write_cmos_sensor(0x43,0x0a); + SP0A19_write_cmos_sensor(0x44,0x02); + SP0A19_write_cmos_sensor(0x45,0x04); + SP0A19_write_cmos_sensor(0x46,0xf8); + SP0A19_write_cmos_sensor(0x47,0x00); + SP0A19_write_cmos_sensor(0x48,0x00); + SP0A19_write_cmos_sensor(0x49,0xfd); + SP0A19_write_cmos_sensor(0x4a,0xf9); + SP0A19_write_cmos_sensor(0x4b,0x02); + SP0A19_write_cmos_sensor(0x4c,0xf9); + SP0A19_write_cmos_sensor(0xfd,0x00); + //awb 1 + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0xc5); + SP0A19_write_cmos_sensor(0x29,0x9b); + SP0A19_write_cmos_sensor(0x2e,0x02); + SP0A19_write_cmos_sensor(0x2f,0x16); + SP0A19_write_cmos_sensor(0x17,0x17); + SP0A19_write_cmos_sensor(0x18,0x19); + SP0A19_write_cmos_sensor(0x19,0x45); + SP0A19_write_cmos_sensor(0x2a,0xef); + SP0A19_write_cmos_sensor(0x2b,0x15); + //awb2 + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x73,0x80); + SP0A19_write_cmos_sensor(0x1a,0x80); + SP0A19_write_cmos_sensor(0x1b,0x80); + //d65 + SP0A19_write_cmos_sensor(0x65,0xc5); + SP0A19_write_cmos_sensor(0x66,0xe5); + SP0A19_write_cmos_sensor(0x67,0x80); + SP0A19_write_cmos_sensor(0x68,0xa0); + //indoor + SP0A19_write_cmos_sensor(0x69,0xc6); + SP0A19_write_cmos_sensor(0x6a,0xec); + SP0A19_write_cmos_sensor(0x6b,0xa1); + SP0A19_write_cmos_sensor(0x6c,0xc4); + //f + SP0A19_write_cmos_sensor(0x61,0x7a); + SP0A19_write_cmos_sensor(0x62,0x96); + SP0A19_write_cmos_sensor(0x63,0xc5); + SP0A19_write_cmos_sensor(0x64,0xe6); + //cwf + SP0A19_write_cmos_sensor(0x6d,0x97); + SP0A19_write_cmos_sensor(0x6e,0xbb); + SP0A19_write_cmos_sensor(0x6f,0xbc); + SP0A19_write_cmos_sensor(0x70,0xdc); + +//skin detect////// + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x08,0x15); + SP0A19_write_cmos_sensor(0x09,0x04); + SP0A19_write_cmos_sensor(0x0a,0x20); + SP0A19_write_cmos_sensor(0x0b,0x12); + SP0A19_write_cmos_sensor(0x0c,0x27); + SP0A19_write_cmos_sensor(0x0d,0x06); + SP0A19_write_cmos_sensor(0x0f,0x63); + //BPC_grad + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x79,0xf0); + SP0A19_write_cmos_sensor(0x7a,0x80); + SP0A19_write_cmos_sensor(0x7b,0x80); + SP0A19_write_cmos_sensor(0x7c,0x20); + + //smooth + SP0A19_write_cmos_sensor(0xfd,0x00); + //\B5\A5ͨ\B5\C0\BC\E4ƽ\BB\AC\E3\D0Öµ + SP0A19_write_cmos_sensor(0x57,0x08); //raw_dif_thr_outdoor + SP0A19_write_cmos_sensor(0x58,0x0c); + SP0A19_write_cmos_sensor(0x56,0x10); //raw_dif_thr_dummy + SP0A19_write_cmos_sensor(0x59,0x18); //raw_dif_thr_lowlight + //GrGbƽ\BB\AC\E3\D0Öµ + SP0A19_write_cmos_sensor(0x89,0x08); //raw_grgb_thr_outdoor + SP0A19_write_cmos_sensor(0x8a,0x0c); + SP0A19_write_cmos_sensor(0x9c,0x12); //raw_grgb_thr_dummy + SP0A19_write_cmos_sensor(0x9d,0x18); //raw_grgb_thr_lowlight + + //Gr\GbÖ®\BC\E4ƽ\BB\ACÇ¿\B6\C8 + SP0A19_write_cmos_sensor(0x81,0xe0); //raw_gflt_fac_outdoor + SP0A19_write_cmos_sensor(0x82,0x90); + SP0A19_write_cmos_sensor(0x83,0x40); //raw_gflt_fac_dummy + SP0A19_write_cmos_sensor(0x84,0x10); //raw_gflt_fac_lowlight + //Gr\A1\A2Gb\B5\A5ͨ\B5\C0\C4\DAƽ\BB\ACÇ¿\B6\C8 + SP0A19_write_cmos_sensor(0x85,0xe0); //raw_gf_fac_outdoor + SP0A19_write_cmos_sensor(0x86,0x90); //raw_gf_fac_normal + SP0A19_write_cmos_sensor(0x87,0x40); //raw_gf_fac_dummy + SP0A19_write_cmos_sensor(0x88,0x10); //raw_gf_fac_lowlight + //R\A1\A2Bƽ\BB\ACÇ¿\B6\C8 + SP0A19_write_cmos_sensor(0x5a,0xff); //raw_rb_fac_outdoor + SP0A19_write_cmos_sensor(0x5b,0xd0); + SP0A19_write_cmos_sensor(0x5c,0x60); //raw_rb_fac_dummy + SP0A19_write_cmos_sensor(0x5d,0x10); //raw_rb_fac_lowlight + + //sharpen + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xe2,0x50); + SP0A19_write_cmos_sensor(0xe4,0xa0); + + SP0A19_write_cmos_sensor(0xe5,0x07); + SP0A19_write_cmos_sensor(0xd3,0x07); + SP0A19_write_cmos_sensor(0xd7,0x07); + + SP0A19_write_cmos_sensor(0xe6,0x09); + SP0A19_write_cmos_sensor(0xd4,0x09); + SP0A19_write_cmos_sensor(0xd8,0x09); + + SP0A19_write_cmos_sensor(0xe7,0x12); + SP0A19_write_cmos_sensor(0xd5,0x12); + SP0A19_write_cmos_sensor(0xd9,0x12); + + SP0A19_write_cmos_sensor(0xd2,0x16); + SP0A19_write_cmos_sensor(0xd6,0x16); + SP0A19_write_cmos_sensor(0xda,0x16); + + SP0A19_write_cmos_sensor(0xe8,0x28); + SP0A19_write_cmos_sensor(0xec,0x30); + SP0A19_write_cmos_sensor(0xe9,0x24); + SP0A19_write_cmos_sensor(0xed,0x2c); + SP0A19_write_cmos_sensor(0xea,0x18); + SP0A19_write_cmos_sensor(0xef,0x20); + SP0A19_write_cmos_sensor(0xeb,0x15); + SP0A19_write_cmos_sensor(0xf0,0x18); + + //CCM + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0xa0,0x68); + SP0A19_write_cmos_sensor(0xa1,0x00); + SP0A19_write_cmos_sensor(0xa2,0x17); + SP0A19_write_cmos_sensor(0xa3,0xf3); + SP0A19_write_cmos_sensor(0xa4,0x8e); + SP0A19_write_cmos_sensor(0xa5,0x00); + SP0A19_write_cmos_sensor(0xa6,0x00); + SP0A19_write_cmos_sensor(0xa7,0xe6); + SP0A19_write_cmos_sensor(0xa8,0x9a); + SP0A19_write_cmos_sensor(0xa9,0x00); + SP0A19_write_cmos_sensor(0xaa,0x03); + SP0A19_write_cmos_sensor(0xab,0x0c); + SP0A19_write_cmos_sensor(0xfd,0x00); + + //gamma + + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x8b,0x00); + SP0A19_write_cmos_sensor(0x8c,0x09); + SP0A19_write_cmos_sensor(0x8d,0x13); + SP0A19_write_cmos_sensor(0x8e,0x25); + SP0A19_write_cmos_sensor(0x8f,0x43); + SP0A19_write_cmos_sensor(0x90,0x5e); + SP0A19_write_cmos_sensor(0x91,0x75); + SP0A19_write_cmos_sensor(0x92,0x88); + SP0A19_write_cmos_sensor(0x93,0x9a); + SP0A19_write_cmos_sensor(0x94,0xa8); + SP0A19_write_cmos_sensor(0x95,0xB5); + SP0A19_write_cmos_sensor(0x96,0xbd); + SP0A19_write_cmos_sensor(0x97,0xc6); + SP0A19_write_cmos_sensor(0x98,0xcc); + SP0A19_write_cmos_sensor(0x99,0xd1); + SP0A19_write_cmos_sensor(0x9a,0xd5); + SP0A19_write_cmos_sensor(0x9b,0xd9); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x8d,0xdc); + SP0A19_write_cmos_sensor(0x8e,0xde); + + //rpc + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0xe0,0x4c); + SP0A19_write_cmos_sensor(0xe1,0x3c); + SP0A19_write_cmos_sensor(0xe2,0x34); + SP0A19_write_cmos_sensor(0xe3,0x2e); + SP0A19_write_cmos_sensor(0xe4,0x2e); + SP0A19_write_cmos_sensor(0xe5,0x2c); + SP0A19_write_cmos_sensor(0xe6,0x2c); + SP0A19_write_cmos_sensor(0xe8,0x2a); + SP0A19_write_cmos_sensor(0xe9,0x2a); + SP0A19_write_cmos_sensor(0xea,0x2a); + SP0A19_write_cmos_sensor(0xeb,0x28); + SP0A19_write_cmos_sensor(0xf5,0x28); + SP0A19_write_cmos_sensor(0xf6,0x28); + //ae min gain + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x94,0xa0); + SP0A19_write_cmos_sensor(0x95,0x28); + SP0A19_write_cmos_sensor(0x9c,0xa0); + SP0A19_write_cmos_sensor(0x9d,0x28); + + //ae target + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0xed,0x84); + SP0A19_write_cmos_sensor(0xf7,0x80); + SP0A19_write_cmos_sensor(0xf8,0x78); + SP0A19_write_cmos_sensor(0xec,0x74); + SP0A19_write_cmos_sensor(0xef,0x70); + SP0A19_write_cmos_sensor(0xf9,0x6c); + SP0A19_write_cmos_sensor(0xfa,0x64); + SP0A19_write_cmos_sensor(0xee,0x60); + //gray detect + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x30,0x40); + SP0A19_write_cmos_sensor(0x31,0x70); + SP0A19_write_cmos_sensor(0x32,0x40); + SP0A19_write_cmos_sensor(0x33,0xef); + SP0A19_write_cmos_sensor(0x34,0x05); + SP0A19_write_cmos_sensor(0x4d,0x2f); + SP0A19_write_cmos_sensor(0x4e,0x20); + SP0A19_write_cmos_sensor(0x4f,0x16); + //lowlight lum + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0xb2,0x10); + SP0A19_write_cmos_sensor(0xb3,0x1f); + SP0A19_write_cmos_sensor(0xb4,0x30); + SP0A19_write_cmos_sensor(0xb5,0x45); + //saturation + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0xbe,0xff); + SP0A19_write_cmos_sensor(0xbf,0x01); + SP0A19_write_cmos_sensor(0xc0,0xff); + SP0A19_write_cmos_sensor(0xc1,0xd8); + SP0A19_write_cmos_sensor(0xd3,0x88); + SP0A19_write_cmos_sensor(0xd4,0x84); + SP0A19_write_cmos_sensor(0xd6,0x7c); + SP0A19_write_cmos_sensor(0xd7,0x68); + //HEQ + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0xdc,0x00); + SP0A19_write_cmos_sensor(0xdd,0x7c); + SP0A19_write_cmos_sensor(0xde,0xa8); + SP0A19_write_cmos_sensor(0xdf,0x80); + //func enable + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x32,0x15); + SP0A19_write_cmos_sensor(0x34,0x76); + SP0A19_write_cmos_sensor(0x35,0x40); + SP0A19_write_cmos_sensor(0x33,0xef); + SP0A19_write_cmos_sensor(0x5f,0x51); + +} + + +/************************************************************************* +* FUNCTION +* GC329_Lens_Select +* +* DESCRIPTION +* This function is served for FAE to select the appropriate lens parameter. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void SP0A19_Lens_Select(kal_uint8 Lens_Tag) +{ + switch(Lens_Tag) + { + case CHT_806C_2: + #if 0 + SP0A19_write_cmos_sensor(0xfe, 0x01); + SP0A19_write_cmos_sensor(0xa0, 0x00); + SP0A19_write_cmos_sensor(0xa1, 0x3c); + SP0A19_write_cmos_sensor(0xa2, 0x50); + SP0A19_write_cmos_sensor(0xa3, 0x00); + SP0A19_write_cmos_sensor(0xa4, 0x00); + SP0A19_write_cmos_sensor(0xa5, 0x00); + SP0A19_write_cmos_sensor(0xa6, 0x00); + SP0A19_write_cmos_sensor(0xa7, 0x04); + + SP0A19_write_cmos_sensor(0xa8, 0x0f); + SP0A19_write_cmos_sensor(0xa9, 0x08); + SP0A19_write_cmos_sensor(0xaa, 0x00); + SP0A19_write_cmos_sensor(0xab, 0x04); + SP0A19_write_cmos_sensor(0xac, 0x00); + SP0A19_write_cmos_sensor(0xad, 0x07); + SP0A19_write_cmos_sensor(0xae, 0x0e); + SP0A19_write_cmos_sensor(0xaf, 0x00); + SP0A19_write_cmos_sensor(0xb0, 0x00); + SP0A19_write_cmos_sensor(0xb1, 0x09); + SP0A19_write_cmos_sensor(0xb2, 0x00); + SP0A19_write_cmos_sensor(0xb3, 0x00); + + SP0A19_write_cmos_sensor(0xb4, 0x30); + SP0A19_write_cmos_sensor(0xb5, 0x19); + SP0A19_write_cmos_sensor(0xb6, 0x21); + SP0A19_write_cmos_sensor(0xba, 0x3e); + SP0A19_write_cmos_sensor(0xbb, 0x26); + SP0A19_write_cmos_sensor(0xbc, 0x2f); + SP0A19_write_cmos_sensor(0xc0, 0x15); + SP0A19_write_cmos_sensor(0xc1, 0x11); + SP0A19_write_cmos_sensor(0xc2, 0x15); + SP0A19_write_cmos_sensor(0xc6, 0x1f); + SP0A19_write_cmos_sensor(0xc7, 0x16); + SP0A19_write_cmos_sensor(0xc8, 0x16); + + SP0A19_write_cmos_sensor(0xb7, 0x00); + SP0A19_write_cmos_sensor(0xb8, 0x00); + SP0A19_write_cmos_sensor(0xb9, 0x00); + SP0A19_write_cmos_sensor(0xbd, 0x00); + SP0A19_write_cmos_sensor(0xbe, 0x00); + SP0A19_write_cmos_sensor(0xbf, 0x00); + SP0A19_write_cmos_sensor(0xc3, 0x00); + SP0A19_write_cmos_sensor(0xc4, 0x00); + SP0A19_write_cmos_sensor(0xc5, 0x00); + SP0A19_write_cmos_sensor(0xc9, 0x0d); + SP0A19_write_cmos_sensor(0xca, 0x00); + SP0A19_write_cmos_sensor(0xcb, 0x00); + + SP0A19_write_cmos_sensor(0xfe, 0x00); + #endif + break; + + case CHT_808C_2: + #if 0 + SP0A19_write_cmos_sensor(0xfe, 0x01); + SP0A19_write_cmos_sensor(0xa0, 0x00); + SP0A19_write_cmos_sensor(0xa1, 0x3c); + SP0A19_write_cmos_sensor(0xa2, 0x50); + SP0A19_write_cmos_sensor(0xa3, 0x00); + SP0A19_write_cmos_sensor(0xa4, 0x00); + SP0A19_write_cmos_sensor(0xa5, 0x02); + SP0A19_write_cmos_sensor(0xa6, 0x00); + SP0A19_write_cmos_sensor(0xa7, 0x00); + + SP0A19_write_cmos_sensor(0xa8, 0x0c); + SP0A19_write_cmos_sensor(0xa9, 0x03); + SP0A19_write_cmos_sensor(0xaa, 0x00); + SP0A19_write_cmos_sensor(0xab, 0x05); + SP0A19_write_cmos_sensor(0xac, 0x01); + SP0A19_write_cmos_sensor(0xad, 0x07); + SP0A19_write_cmos_sensor(0xae, 0x0e); + SP0A19_write_cmos_sensor(0xaf, 0x00); + SP0A19_write_cmos_sensor(0xb0, 0x00); + SP0A19_write_cmos_sensor(0xb1, 0x08); + SP0A19_write_cmos_sensor(0xb2, 0x02); + SP0A19_write_cmos_sensor(0xb3, 0x00); + + SP0A19_write_cmos_sensor(0xb4, 0x30); + SP0A19_write_cmos_sensor(0xb5, 0x0f); + SP0A19_write_cmos_sensor(0xb6, 0x16); + SP0A19_write_cmos_sensor(0xba, 0x44); + SP0A19_write_cmos_sensor(0xbb, 0x24); + SP0A19_write_cmos_sensor(0xbc, 0x2a); + SP0A19_write_cmos_sensor(0xc0, 0x13); + SP0A19_write_cmos_sensor(0xc1, 0x0e); + SP0A19_write_cmos_sensor(0xc2, 0x11); + SP0A19_write_cmos_sensor(0xc6, 0x28); + SP0A19_write_cmos_sensor(0xc7, 0x21); + SP0A19_write_cmos_sensor(0xc8, 0x20); + + SP0A19_write_cmos_sensor(0xb7, 0x00); + SP0A19_write_cmos_sensor(0xb8, 0x00); + SP0A19_write_cmos_sensor(0xb9, 0x01); + SP0A19_write_cmos_sensor(0xbd, 0x00); + SP0A19_write_cmos_sensor(0xbe, 0x00); + SP0A19_write_cmos_sensor(0xbf, 0x00); + SP0A19_write_cmos_sensor(0xc3, 0x00); + SP0A19_write_cmos_sensor(0xc4, 0x00); + SP0A19_write_cmos_sensor(0xc5, 0x00); + SP0A19_write_cmos_sensor(0xc9, 0x00); + SP0A19_write_cmos_sensor(0xca, 0x00); + SP0A19_write_cmos_sensor(0xcb, 0x00); + + SP0A19_write_cmos_sensor(0xfe, 0x00); + #endif + break; + + case LY_982A_H114: + #if 0 + SP0A19_write_cmos_sensor(0xfe, 0x01); + SP0A19_write_cmos_sensor(0xa0, 0x00); + SP0A19_write_cmos_sensor(0xa1, 0x3c); + SP0A19_write_cmos_sensor(0xa2, 0x50); + SP0A19_write_cmos_sensor(0xa3, 0x00); + SP0A19_write_cmos_sensor(0xa4, 0x00); + SP0A19_write_cmos_sensor(0xa5, 0x00); + SP0A19_write_cmos_sensor(0xa6, 0x00); + SP0A19_write_cmos_sensor(0xa7, 0x00); + + SP0A19_write_cmos_sensor(0xa8, 0x0c); + SP0A19_write_cmos_sensor(0xa9, 0x06); + SP0A19_write_cmos_sensor(0xaa, 0x02); + SP0A19_write_cmos_sensor(0xab, 0x13); + SP0A19_write_cmos_sensor(0xac, 0x06); + SP0A19_write_cmos_sensor(0xad, 0x05); + SP0A19_write_cmos_sensor(0xae, 0x0b); + SP0A19_write_cmos_sensor(0xaf, 0x03); + SP0A19_write_cmos_sensor(0xb0, 0x00); + SP0A19_write_cmos_sensor(0xb1, 0x08); + SP0A19_write_cmos_sensor(0xb2, 0x01); + SP0A19_write_cmos_sensor(0xb3, 0x00); + + SP0A19_write_cmos_sensor(0xb4, 0x34); + SP0A19_write_cmos_sensor(0xb5, 0x29); + SP0A19_write_cmos_sensor(0xb6, 0x2e); + SP0A19_write_cmos_sensor(0xba, 0x30); + SP0A19_write_cmos_sensor(0xbb, 0x24); + SP0A19_write_cmos_sensor(0xbc, 0x28); + SP0A19_write_cmos_sensor(0xc0, 0x1c); + SP0A19_write_cmos_sensor(0xc1, 0x19); + SP0A19_write_cmos_sensor(0xc2, 0x19); + SP0A19_write_cmos_sensor(0xc6, 0x1a); + SP0A19_write_cmos_sensor(0xc7, 0x19); + SP0A19_write_cmos_sensor(0xc8, 0x1b); + + SP0A19_write_cmos_sensor(0xb7, 0x01); + SP0A19_write_cmos_sensor(0xb8, 0x01); + SP0A19_write_cmos_sensor(0xb9, 0x00); + SP0A19_write_cmos_sensor(0xbd, 0x00); + SP0A19_write_cmos_sensor(0xbe, 0x00); + SP0A19_write_cmos_sensor(0xbf, 0x00); + SP0A19_write_cmos_sensor(0xc3, 0x00); + SP0A19_write_cmos_sensor(0xc4, 0x00); + SP0A19_write_cmos_sensor(0xc5, 0x03); + SP0A19_write_cmos_sensor(0xc9, 0x00); + SP0A19_write_cmos_sensor(0xca, 0x00); + SP0A19_write_cmos_sensor(0xcb, 0x00); + + SP0A19_write_cmos_sensor(0xfe, 0x00); + #endif + break; + + case XY_046A: + #if 0 + SP0A19_write_cmos_sensor(0xfe, 0x01); + SP0A19_write_cmos_sensor(0xa0, 0x00); + SP0A19_write_cmos_sensor(0xa1, 0x3c); + SP0A19_write_cmos_sensor(0xa2, 0x50); + SP0A19_write_cmos_sensor(0xa3, 0x00); + SP0A19_write_cmos_sensor(0xa4, 0x00); + SP0A19_write_cmos_sensor(0xa5, 0x00); + SP0A19_write_cmos_sensor(0xa6, 0x10); + SP0A19_write_cmos_sensor(0xa7, 0x00); + + SP0A19_write_cmos_sensor(0xa8, 0x11); + SP0A19_write_cmos_sensor(0xa9, 0x0a); + SP0A19_write_cmos_sensor(0xaa, 0x05); + SP0A19_write_cmos_sensor(0xab, 0x04); + SP0A19_write_cmos_sensor(0xac, 0x03); + SP0A19_write_cmos_sensor(0xad, 0x00); + SP0A19_write_cmos_sensor(0xae, 0x08); + SP0A19_write_cmos_sensor(0xaf, 0x01); + SP0A19_write_cmos_sensor(0xb0, 0x00); + SP0A19_write_cmos_sensor(0xb1, 0x09); + SP0A19_write_cmos_sensor(0xb2, 0x02); + SP0A19_write_cmos_sensor(0xb3, 0x03); + + SP0A19_write_cmos_sensor(0xb4, 0x2e); + SP0A19_write_cmos_sensor(0xb5, 0x16); + SP0A19_write_cmos_sensor(0xb6, 0x24); + SP0A19_write_cmos_sensor(0xba, 0x3a); + SP0A19_write_cmos_sensor(0xbb, 0x1e); + SP0A19_write_cmos_sensor(0xbc, 0x24); + SP0A19_write_cmos_sensor(0xc0, 0x09); + SP0A19_write_cmos_sensor(0xc1, 0x02); + SP0A19_write_cmos_sensor(0xc2, 0x06); + SP0A19_write_cmos_sensor(0xc6, 0x25); + SP0A19_write_cmos_sensor(0xc7, 0x21); + SP0A19_write_cmos_sensor(0xc8, 0x23); + + SP0A19_write_cmos_sensor(0xb7, 0x00); + SP0A19_write_cmos_sensor(0xb8, 0x00); + SP0A19_write_cmos_sensor(0xb9, 0x0f); + SP0A19_write_cmos_sensor(0xbd, 0x00); + SP0A19_write_cmos_sensor(0xbe, 0x00); + SP0A19_write_cmos_sensor(0xbf, 0x00); + SP0A19_write_cmos_sensor(0xc3, 0x00); + SP0A19_write_cmos_sensor(0xc4, 0x00); + SP0A19_write_cmos_sensor(0xc5, 0x00); + SP0A19_write_cmos_sensor(0xc9, 0x00); + SP0A19_write_cmos_sensor(0xca, 0x00); + SP0A19_write_cmos_sensor(0xcb, 0x00); + + SP0A19_write_cmos_sensor(0xfe, 0x00); + #endif + break; + + case XY_0620: + #if 0 + SP0A19_write_cmos_sensor(0xfe, 0x01); + SP0A19_write_cmos_sensor(0xa0, 0x00); + SP0A19_write_cmos_sensor(0xa1, 0x3c); + SP0A19_write_cmos_sensor(0xa2, 0x50); + SP0A19_write_cmos_sensor(0xa3, 0x00); + SP0A19_write_cmos_sensor(0xa4, 0x00); + SP0A19_write_cmos_sensor(0xa5, 0x00); + SP0A19_write_cmos_sensor(0xa6, 0x00); + SP0A19_write_cmos_sensor(0xa7, 0x00); + + SP0A19_write_cmos_sensor(0xa8, 0x0f); + SP0A19_write_cmos_sensor(0xa9, 0x06); + SP0A19_write_cmos_sensor(0xaa, 0x00); + SP0A19_write_cmos_sensor(0xab, 0x07); + SP0A19_write_cmos_sensor(0xac, 0x05); + SP0A19_write_cmos_sensor(0xad, 0x08); + SP0A19_write_cmos_sensor(0xae, 0x13); + SP0A19_write_cmos_sensor(0xaf, 0x06); + SP0A19_write_cmos_sensor(0xb0, 0x00); + SP0A19_write_cmos_sensor(0xb1, 0x06); + SP0A19_write_cmos_sensor(0xb2, 0x01); + SP0A19_write_cmos_sensor(0xb3, 0x04); + + SP0A19_write_cmos_sensor(0xb4, 0x2d); + SP0A19_write_cmos_sensor(0xb5, 0x18); + SP0A19_write_cmos_sensor(0xb6, 0x22); + SP0A19_write_cmos_sensor(0xba, 0x45); + SP0A19_write_cmos_sensor(0xbb, 0x2d); + SP0A19_write_cmos_sensor(0xbc, 0x34); + SP0A19_write_cmos_sensor(0xc0, 0x16); + SP0A19_write_cmos_sensor(0xc1, 0x13); + SP0A19_write_cmos_sensor(0xc2, 0x19); + SP0A19_write_cmos_sensor(0xc6, 0x21); + SP0A19_write_cmos_sensor(0xc7, 0x1c); + SP0A19_write_cmos_sensor(0xc8, 0x18); + + SP0A19_write_cmos_sensor(0xb7, 0x00); + SP0A19_write_cmos_sensor(0xb8, 0x00); + SP0A19_write_cmos_sensor(0xb9, 0x00); + SP0A19_write_cmos_sensor(0xbd, 0x00); + SP0A19_write_cmos_sensor(0xbe, 0x00); + SP0A19_write_cmos_sensor(0xbf, 0x08); + SP0A19_write_cmos_sensor(0xc3, 0x00); + SP0A19_write_cmos_sensor(0xc4, 0x00); + SP0A19_write_cmos_sensor(0xc5, 0x01); + SP0A19_write_cmos_sensor(0xc9, 0x00); + SP0A19_write_cmos_sensor(0xca, 0x00); + SP0A19_write_cmos_sensor(0xcb, 0x10); + + SP0A19_write_cmos_sensor(0xfe, 0x00); + #endif + break; + + case XY_078V: + #if 0 + SP0A19_write_cmos_sensor(0xfe, 0x01); + SP0A19_write_cmos_sensor(0xa0, 0x00); + SP0A19_write_cmos_sensor(0xa1, 0x3c); + SP0A19_write_cmos_sensor(0xa2, 0x50); + SP0A19_write_cmos_sensor(0xa3, 0x00); + SP0A19_write_cmos_sensor(0xa4, 0x00); + SP0A19_write_cmos_sensor(0xa5, 0x00); + SP0A19_write_cmos_sensor(0xa6, 0x00); + SP0A19_write_cmos_sensor(0xa7, 0x00); + + SP0A19_write_cmos_sensor(0xa8, 0x14); + SP0A19_write_cmos_sensor(0xa9, 0x08); + SP0A19_write_cmos_sensor(0xaa, 0x0a); + SP0A19_write_cmos_sensor(0xab, 0x11); + SP0A19_write_cmos_sensor(0xac, 0x05); + SP0A19_write_cmos_sensor(0xad, 0x07); + SP0A19_write_cmos_sensor(0xae, 0x0b); + SP0A19_write_cmos_sensor(0xaf, 0x03); + SP0A19_write_cmos_sensor(0xb0, 0x00); + SP0A19_write_cmos_sensor(0xb1, 0x09); + SP0A19_write_cmos_sensor(0xb2, 0x04); + SP0A19_write_cmos_sensor(0xb3, 0x01); + + SP0A19_write_cmos_sensor(0xb4, 0x2f); + SP0A19_write_cmos_sensor(0xb5, 0x2a); + SP0A19_write_cmos_sensor(0xb6, 0x2c); + SP0A19_write_cmos_sensor(0xba, 0x3a); + SP0A19_write_cmos_sensor(0xbb, 0x2b); + SP0A19_write_cmos_sensor(0xbc, 0x32); + SP0A19_write_cmos_sensor(0xc0, 0x1b); + SP0A19_write_cmos_sensor(0xc1, 0x18); + SP0A19_write_cmos_sensor(0xc2, 0x1a); + SP0A19_write_cmos_sensor(0xc6, 0x12); + SP0A19_write_cmos_sensor(0xc7, 0x10); + SP0A19_write_cmos_sensor(0xc8, 0x12); + + SP0A19_write_cmos_sensor(0xb7, 0x0a); + SP0A19_write_cmos_sensor(0xb8, 0x00); + SP0A19_write_cmos_sensor(0xb9, 0x00); + SP0A19_write_cmos_sensor(0xbd, 0x00); + SP0A19_write_cmos_sensor(0xbe, 0x00); + SP0A19_write_cmos_sensor(0xbf, 0x00); + SP0A19_write_cmos_sensor(0xc3, 0x00); + SP0A19_write_cmos_sensor(0xc4, 0x00); + SP0A19_write_cmos_sensor(0xc5, 0x00); + SP0A19_write_cmos_sensor(0xc9, 0x0d); + SP0A19_write_cmos_sensor(0xca, 0x00); + SP0A19_write_cmos_sensor(0xcb, 0x00); + + SP0A19_write_cmos_sensor(0xfe, 0x00); + #endif + break; + + case YG1001A_F: + #if 0 + SP0A19_write_cmos_sensor(0xfe, 0x01); + SP0A19_write_cmos_sensor(0xa0, 0x00); + SP0A19_write_cmos_sensor(0xa1, 0x3c); + SP0A19_write_cmos_sensor(0xa2, 0x50); + SP0A19_write_cmos_sensor(0xa3, 0x00); + SP0A19_write_cmos_sensor(0xa4, 0x00); + SP0A19_write_cmos_sensor(0xa5, 0x00); + SP0A19_write_cmos_sensor(0xa6, 0x00); + SP0A19_write_cmos_sensor(0xa7, 0x00); + + SP0A19_write_cmos_sensor(0xa8, 0x0e); + SP0A19_write_cmos_sensor(0xa9, 0x05); + SP0A19_write_cmos_sensor(0xaa, 0x01); + SP0A19_write_cmos_sensor(0xab, 0x07); + SP0A19_write_cmos_sensor(0xac, 0x00); + SP0A19_write_cmos_sensor(0xad, 0x07); + SP0A19_write_cmos_sensor(0xae, 0x0e); + SP0A19_write_cmos_sensor(0xaf, 0x02); + SP0A19_write_cmos_sensor(0xb0, 0x00); + SP0A19_write_cmos_sensor(0xb1, 0x0d); + SP0A19_write_cmos_sensor(0xb2, 0x00); + SP0A19_write_cmos_sensor(0xb3, 0x00); + + SP0A19_write_cmos_sensor(0xb4, 0x2a); + SP0A19_write_cmos_sensor(0xb5, 0x0f); + SP0A19_write_cmos_sensor(0xb6, 0x14); + SP0A19_write_cmos_sensor(0xba, 0x40); + SP0A19_write_cmos_sensor(0xbb, 0x26); + SP0A19_write_cmos_sensor(0xbc, 0x2a); + SP0A19_write_cmos_sensor(0xc0, 0x0e); + SP0A19_write_cmos_sensor(0xc1, 0x0a); + SP0A19_write_cmos_sensor(0xc2, 0x0d); + SP0A19_write_cmos_sensor(0xc6, 0x27); + SP0A19_write_cmos_sensor(0xc7, 0x20); + SP0A19_write_cmos_sensor(0xc8, 0x1f); + + SP0A19_write_cmos_sensor(0xb7, 0x00); + SP0A19_write_cmos_sensor(0xb8, 0x00); + SP0A19_write_cmos_sensor(0xb9, 0x00); + SP0A19_write_cmos_sensor(0xbd, 0x00); + SP0A19_write_cmos_sensor(0xbe, 0x00); + SP0A19_write_cmos_sensor(0xbf, 0x00); + SP0A19_write_cmos_sensor(0xc3, 0x00); + SP0A19_write_cmos_sensor(0xc4, 0x00); + SP0A19_write_cmos_sensor(0xc5, 0x00); + SP0A19_write_cmos_sensor(0xc9, 0x00); + SP0A19_write_cmos_sensor(0xca, 0x00); + SP0A19_write_cmos_sensor(0xcb, 0x00); + + SP0A19_write_cmos_sensor(0xfe, 0x00); + #endif + break; + + default: + break; + } +} + + +/************************************************************************* +* FUNCTION +* SP0A19_GAMMA_Select +* +* DESCRIPTION +* This function is served for FAE to select the appropriate GAMMA curve. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +UINT32 SP0A19GetModuleID() +{ + printk("SP0A19GetModuleID\n"); + return moduleid; +} + +UINT32 SP0A19GetSensorID(UINT32 *sensorID) +{ + kal_uint16 sensor_id=0; + int retry=3; + + SENSORDB("SP0A19GetSensorID \n"); + // check if sensor ID correct + do { + SP0A19_write_cmos_sensor(0xfd,0x00); + sensor_id = SP0A19_read_cmos_sensor(0x02); + if (sensor_id == SP0A19_YUV_SENSOR_ID) { + moduleid = 0x03; + break; + } + SENSORDB("Read Sensor ID Fail = 0x%x\n", sensor_id); + retry--; + } while (retry > 0); + if (sensor_id != SP0A19_YUV_SENSOR_ID) { + *sensorID = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + + *sensorID = sensor_id; + RETAILMSG(1, (TEXT("Sensor Read ID OK \r\n"))); + return ERROR_NONE; +} + +void SP0A19GammaSelect(kal_uint32 GammaLvl) +{ + + +} + + + +/************************************************************************* +* FUNCTION +* SP0A19_Write_More_Registers +* +* DESCRIPTION +* This function is served for FAE to modify the necessary Init Regs. Do not modify the regs +* in init_SP0A19() directly. +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +void SP0A19_Write_More_Registers(void) +{ + ////////////20120427///////////////////////// + +} + + +/************************************************************************* + * FUNCTION + * SP0A19Open + * + * DESCRIPTION + * This function initialize the registers of CMOS sensor + * + * PARAMETERS + * None + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 SP0A19Open(void) +{ + kal_uint16 sensor_id=0; + int retry = 3; + + SENSORDB("SP0A19Open \n"); + + do { + + SP0A19_write_cmos_sensor(0xfd,0x00); + sensor_id=SP0A19_read_cmos_sensor(0x02); + if (sensor_id == SP0A19_YUV_SENSOR_ID) { + break; + } + SENSORDB("Read Sensor ID Fail = 0x%x\n", sensor_id); + + retry--; + }while (retry > 0); + + if (sensor_id != SP0A19_YUV_SENSOR_ID) + { + return ERROR_SENSOR_CONNECT_FAIL; + } + SENSORDB("SP0A19 Sensor id read OK, ID = %x\n", sensor_id); + + Sleep(10); +#ifdef DEBUG_SENSOR_SP0A19 //gepeiwei 120903 + + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static char buf[10*1024] ; + + fp = filp_open("/mnt/sdcard/SP0A19_sd", O_RDONLY , 0); + if (IS_ERR(fp)) { + SP0A19_fromsd = 0; + printk("open file error\n"); + + } + else + { + SP0A19_fromsd = 1; + printk("open file ok\n"); + + //SP0A19_Initialize_from_T_Flash(); + + + filp_close(fp, NULL); + set_fs(fs); + } + + if(SP0A19_fromsd == 1)//\CAÇ·\F1\B4\D3SD\B6\C1È¡//gepeiwei 120903 + { + printk("________________from t!\n"); + SP0A19_Initialize_from_T_Flash();//\B4\D3SD\BF\A8\B6\C1È¡\B5\C4\D6\F7Òª\BA\AF\CA\FD + } + else + { + SP0A19_Sensor_Init(); + SP0A19_Write_More_Registers();//added for FAE to debut + } +#else + //RETAILMSG(1, (TEXT("Sensor Read ID OK \r\n"))); + // initail sequence write in + SP0A19_Sensor_Init(); + SP0A19_Write_More_Registers();//added for FAE to debut +#endif + return ERROR_NONE; +} /* SP0A19Open */ + + +/************************************************************************* + * FUNCTION + * SP0A19Close + * + * DESCRIPTION + * This function is to turn off sensor module power. + * + * PARAMETERS + * None + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 SP0A19Close(void) +{ + SENSORDB("SP0A19Close\n"); + return ERROR_NONE; +} /* SP0A19Close */ + + +/************************************************************************* + * FUNCTION + * SP0A19Preview + * + * DESCRIPTION + * This function start the sensor preview. + * + * PARAMETERS + * *image_window : address pointer of pixel numbers in one period of HSYNC + * *sensor_config_data : address pointer of line numbers in one period of VSYNC + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 SP0A19Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) + +{ + kal_uint32 iTemp; + kal_uint16 iStartX = 0, iStartY = 1; + + if(sensor_config_data->SensorOperationMode == MSDK_SENSOR_OPERATION_MODE_VIDEO) // MPEG4 Encode Mode + { + RETAILMSG(1, (TEXT("Camera Video preview\r\n"))); + SP0A19_MPEG4_encode_mode = KAL_TRUE; + + } + else + { + RETAILMSG(1, (TEXT("Camera preview\r\n"))); + SP0A19_MPEG4_encode_mode = KAL_FALSE; + } + + image_window->GrabStartX= IMAGE_SENSOR_VGA_GRAB_PIXELS; + image_window->GrabStartY= IMAGE_SENSOR_VGA_GRAB_LINES; + image_window->ExposureWindowWidth = IMAGE_SENSOR_PV_WIDTH; + image_window->ExposureWindowHeight =IMAGE_SENSOR_PV_HEIGHT; + + // copy sensor_config_data + memcpy(&SP0A19SensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* SP0A19Preview */ + + +/************************************************************************* + * FUNCTION + * SP0A19Capture + * + * DESCRIPTION + * This function setup the CMOS sensor in capture MY_OUTPUT mode + * + * PARAMETERS + * + * RETURNS + * None + * + * GLOBALS AFFECTED + * + *************************************************************************/ +UINT32 SP0A19Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) + +{ + SP0A19_MODE_CAPTURE=KAL_TRUE; + + image_window->GrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + image_window->GrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + image_window->ExposureWindowWidth= IMAGE_SENSOR_FULL_WIDTH; + image_window->ExposureWindowHeight = IMAGE_SENSOR_FULL_HEIGHT; + + // copy sensor_config_data + memcpy(&SP0A19SensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* SP0A19_Capture() */ + + + +UINT32 SP0A19GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution) +{ + pSensorResolution->SensorFullWidth=IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorFullHeight=IMAGE_SENSOR_FULL_HEIGHT; + pSensorResolution->SensorPreviewWidth=IMAGE_SENSOR_PV_WIDTH; + pSensorResolution->SensorPreviewHeight=IMAGE_SENSOR_PV_HEIGHT; + pSensorResolution->SensorVideoWidth=IMAGE_SENSOR_FULL_WIDTH; + pSensorResolution->SensorVideoHeight=IMAGE_SENSOR_FULL_HEIGHT; + return ERROR_NONE; +} /* SP0A19GetResolution() */ + + +UINT32 SP0A19GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, + MSDK_SENSOR_INFO_STRUCT *pSensorInfo, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + pSensorInfo->SensorPreviewResolutionX=IMAGE_SENSOR_PV_WIDTH; + pSensorInfo->SensorPreviewResolutionY=IMAGE_SENSOR_PV_HEIGHT; + pSensorInfo->SensorFullResolutionX=IMAGE_SENSOR_FULL_WIDTH; + pSensorInfo->SensorFullResolutionY=IMAGE_SENSOR_FULL_HEIGHT; + + pSensorInfo->SensorCameraPreviewFrameRate=30; + pSensorInfo->SensorVideoFrameRate=30; + pSensorInfo->SensorStillCaptureFrameRate=10; + pSensorInfo->SensorWebCamCaptureFrameRate=15; + pSensorInfo->SensorResetActiveHigh=FALSE; + pSensorInfo->SensorResetDelayCount=1; + pSensorInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_YUYV; + pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_HIGH; + pSensorInfo->SensorInterruptDelayLines = 1; + pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_PARALLEL; +#if 0 + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_100_MODE].MaxWidth=CAM_SIZE_5M_WIDTH; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_100_MODE].MaxHeight=CAM_SIZE_5M_HEIGHT; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_100_MODE].ISOSupported=TRUE; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_100_MODE].BinningEnable=FALSE; + + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_200_MODE].MaxWidth=CAM_SIZE_5M_WIDTH; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_200_MODE].MaxHeight=CAM_SIZE_5M_HEIGHT; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_200_MODE].ISOSupported=TRUE; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_200_MODE].BinningEnable=FALSE; + + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_400_MODE].MaxWidth=CAM_SIZE_5M_WIDTH; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_400_MODE].MaxHeight=CAM_SIZE_5M_HEIGHT; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_400_MODE].ISOSupported=TRUE; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_400_MODE].BinningEnable=FALSE; + + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_800_MODE].MaxWidth=CAM_SIZE_1M_WIDTH; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_800_MODE].MaxHeight=CAM_SIZE_1M_HEIGHT; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_800_MODE].ISOSupported=TRUE; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_800_MODE].BinningEnable=FALSE; + + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_1600_MODE].MaxWidth=CAM_SIZE_1M_WIDTH; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_1600_MODE].MaxHeight=CAM_SIZE_1M_HEIGHT; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_1600_MODE].ISOSupported=TRUE; + pSensorInfo->SensorISOBinningInfo.ISOBinningInfo[ISO_1600_MODE].BinningEnable=FALSE; +#endif + pSensorInfo->CaptureDelayFrame = 2; + pSensorInfo->PreviewDelayFrame = 2; + pSensorInfo->VideoDelayFrame = 4; + pSensorInfo->SensorMasterClockSwitch = 0; + pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_6MA; + + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: +// case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockDividCount= 3; + pSensorInfo->SensorClockRisingCount= 0; + pSensorInfo->SensorClockFallingCount= 2; + pSensorInfo->SensorPixelClockCount= 3; + pSensorInfo->SensorDataLatchCount= 2; + pSensorInfo->SensorGrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + pSensorInfo->SensorGrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + // case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockDividCount= 3; + pSensorInfo->SensorClockRisingCount=0; + pSensorInfo->SensorClockFallingCount=2; + pSensorInfo->SensorPixelClockCount=3; + pSensorInfo->SensorDataLatchCount=2; + pSensorInfo->SensorGrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + pSensorInfo->SensorGrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + break; + default: + pSensorInfo->SensorClockFreq=24; + pSensorInfo->SensorClockDividCount= 3; + pSensorInfo->SensorClockRisingCount=0; + pSensorInfo->SensorClockFallingCount=2; + pSensorInfo->SensorPixelClockCount=3; + pSensorInfo->SensorDataLatchCount=2; + pSensorInfo->SensorGrabStartX = IMAGE_SENSOR_VGA_GRAB_PIXELS; + pSensorInfo->SensorGrabStartY = IMAGE_SENSOR_VGA_GRAB_LINES; + break; + } + SP0A19PixelClockDivider=pSensorInfo->SensorPixelClockCount; + memcpy(pSensorConfigData, &SP0A19SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + return ERROR_NONE; +} /* SP0A19GetInfo() */ + + +UINT32 SP0A19Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData) +{ + switch (ScenarioId) + { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: +// case MSDK_SCENARIO_ID_VIDEO_CAPTURE_MPEG4: + SP0A19Preview(pImageWindow, pSensorConfigData); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: +// case MSDK_SCENARIO_ID_CAMERA_CAPTURE_MEM: + SP0A19Capture(pImageWindow, pSensorConfigData); + break; + } + + + return TRUE; +} /* SP0A19Control() */ + +BOOL SP0A19_set_param_wb(UINT16 para) +{ + + switch (para) + { + case AWB_MODE_OFF: + + break; + case AWB_MODE_AUTO: + { + //SP0A19_reg_WB_auto \D7Ô¶\AF + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0xc5); + SP0A19_write_cmos_sensor(0x29,0x9b); + SP0A19_write_cmos_sensor(0xfd,0x00); // AUTO 3000K~7000K + SP0A19_write_cmos_sensor(0x32,0x15);//0d + } + break; + case AWB_MODE_CLOUDY_DAYLIGHT: + { + // SP0A19_reg_WB_auto \D2\F5\CC\EC + SP0A19_write_cmos_sensor(0xfd,0x00); //7000K + SP0A19_write_cmos_sensor(0x32,0x05); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0xbf); + SP0A19_write_cmos_sensor(0x29,0x89); + SP0A19_write_cmos_sensor(0xfd,0x00); + } + break; + case AWB_MODE_DAYLIGHT: + { + // SP0A19_reg_WB_auto \B0\D7\CC\EC + SP0A19_write_cmos_sensor(0xfd,0x00); //6500K + SP0A19_write_cmos_sensor(0x32,0x05); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0xbc); + SP0A19_write_cmos_sensor(0x29,0x5d); + SP0A19_write_cmos_sensor(0xfd,0x00); + } + break; + case AWB_MODE_INCANDESCENT: + { + // SP0A19_reg_WB_auto \B0׳\E3\B5\C6 + SP0A19_write_cmos_sensor(0xfd,0x00); //2800K~3000K + SP0A19_write_cmos_sensor(0x32,0x05); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0x89); + SP0A19_write_cmos_sensor(0x29,0xb8); + SP0A19_write_cmos_sensor(0xfd,0x00); + } + break; + case AWB_MODE_TUNGSTEN: + { + // SP0A19_reg_WB_auto \B0\D7\C8ȹ\E2 + SP0A19_write_cmos_sensor(0xfd,0x00); //4000K + SP0A19_write_cmos_sensor(0x32,0x05); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0xaf); + SP0A19_write_cmos_sensor(0x29,0x99); + SP0A19_write_cmos_sensor(0xfd,0x00); + } + break; + + case AWB_MODE_FLUORESCENT: + { + //SP0A19_reg_WB_auto Ó«\B9\E2\B5\C6 + SP0A19_write_cmos_sensor(0xfd,0x00); //4200K~5000K + SP0A19_write_cmos_sensor(0x32,0x05); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0xb5); + SP0A19_write_cmos_sensor(0x29,0xa5); + SP0A19_write_cmos_sensor(0xfd,0x00); + } + break; + + default: + return FALSE; + } + + return TRUE; + +} /* SP0A19_set_param_wb */ + + +BOOL SP0A19_set_param_effect(UINT16 para) +{ +// kal_uint32 ret = KAL_TRUE; + + switch (para) + { + case MEFFECT_OFF: + { + SP0A19_write_cmos_sensor(0xfd, 0x00); + SP0A19_write_cmos_sensor(0x62, 0x00); + SP0A19_write_cmos_sensor(0x63, 0x80); + SP0A19_write_cmos_sensor(0x64, 0x80); + } + break; + case MEFFECT_SEPIA: + { + SP0A19_write_cmos_sensor(0xfd, 0x00); + SP0A19_write_cmos_sensor(0x62, 0x10); + SP0A19_write_cmos_sensor(0x63, 0xc0); + SP0A19_write_cmos_sensor(0x64, 0x20); + + } + break; + case MEFFECT_NEGATIVE: + { + SP0A19_write_cmos_sensor(0xfd, 0x00); + SP0A19_write_cmos_sensor(0x62, 0x04); + SP0A19_write_cmos_sensor(0x63, 0x80); + SP0A19_write_cmos_sensor(0x64, 0x80); + } + break; + case MEFFECT_SEPIAGREEN: + { + SP0A19_write_cmos_sensor(0xfd, 0x00); + SP0A19_write_cmos_sensor(0x62, 0x10); + SP0A19_write_cmos_sensor(0x63, 0x20); + SP0A19_write_cmos_sensor(0x64, 0x20); + } + break; + case MEFFECT_SEPIABLUE: + { + SP0A19_write_cmos_sensor(0xfd, 0x00); + SP0A19_write_cmos_sensor(0x62, 0x10); + SP0A19_write_cmos_sensor(0x63, 0x20); + SP0A19_write_cmos_sensor(0x64, 0xf0); + } + break; + case MEFFECT_MONO: + { + SP0A19_write_cmos_sensor(0xfd, 0x00); + SP0A19_write_cmos_sensor(0x62, 0x20); + SP0A19_write_cmos_sensor(0x63, 0x80); + SP0A19_write_cmos_sensor(0x64, 0x80); + } + break; + + default: + return KAL_FALSE; + } + + return KAL_TRUE; + +} /* SP0A19_set_param_effect */ + + +BOOL SP0A19_set_param_banding(UINT16 para) +{ + switch (para) + { + case AE_FLICKER_MODE_50HZ: + sp0a19_isBanding = 0; + break; + + case AE_FLICKER_MODE_60HZ: + sp0a19_isBanding = 1; + break; + default: + return FALSE; + } + SP0A19NightMode(KAL_FALSE); + + return TRUE; +} /* SP0A19_set_param_banding */ + + +BOOL SP0A19_set_param_exposure(UINT16 para) +{ + + switch (para) + { + //case AE_EV_COMP_n30: + //SP0A19_write_cmos_sensor(0xfd, 0x00); + //SP0A19_write_cmos_sensor(0xdc, 0x30); + //break; + case AE_EV_COMP_n20: + SP0A19_write_cmos_sensor(0xfd, 0x00); + //SP0A19_write_cmos_sensor(0xdc, 0x20); + SP0A19_write_cmos_sensor(0xdc, 0xe0); + break; + case AE_EV_COMP_n10: + SP0A19_write_cmos_sensor(0xfd, 0x00); + //SP0A19_write_cmos_sensor(0xdc, 0x10); + SP0A19_write_cmos_sensor(0xdc, 0xf0); + break; + case AE_EV_COMP_00: // +0 EV + SP0A19_write_cmos_sensor(0xfd, 0x00); + SP0A19_write_cmos_sensor(0xdc, 0x00);//0xfa before + break; + case AE_EV_COMP_10: + SP0A19_write_cmos_sensor(0xfd, 0x00); + //SP0A19_write_cmos_sensor(0xdc, 0xf0); + SP0A19_write_cmos_sensor(0xdc, 0x10); + break; + case AE_EV_COMP_20: + SP0A19_write_cmos_sensor(0xfd, 0x00); + //SP0A19_write_cmos_sensor(0xdc, 0xe0); + SP0A19_write_cmos_sensor(0xdc, 0x20); + break; + //case AE_EV_COMP_30: + //SP0A19_write_cmos_sensor(0xfd, 0x00); + //SP0A19_write_cmos_sensor(0xdc, 0xd0); + //break; + default: + return FALSE; + } + + return TRUE; + +} /* SP0A19_set_param_exposure */ + + +/*===========================================================================*/ +//TEST mode add +UINT32 SP0A19YUVSetVideoMode(UINT16 u2FrameRate) +{ + + SP0A19_MPEG4_encode_mode = KAL_TRUE; + if (u2FrameRate == 30) + { + + /*********video frame ************/ + + } + else if (u2FrameRate == 15) + { + + /*********video frame ************/ + + } + else + { + + SENSORDB("Wrong Frame Rate"); + + } + + return TRUE; + +} +UINT32 SP0A19YUVSetTestPatternMode(kal_bool bEnable) +{ + SENSORDB("[SP0A19YUVSetTestPatternMode] Test pattern enable:%d\n", bEnable); + if(bEnable) + { + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x1c,0x28); + SP0A19_write_cmos_sensor(0xe7,0x03); + SP0A19_write_cmos_sensor(0xe7,0x00); + SP0A19_write_cmos_sensor(0x32,0x00); + SP0A19_write_cmos_sensor(0x33,0x00); + SP0A19_write_cmos_sensor(0x35,0x00); + SP0A19_write_cmos_sensor(0xd3,0x60); + SP0A19_write_cmos_sensor(0xd4,0x60); + SP0A19_write_cmos_sensor(0xd6,0x60); + SP0A19_write_cmos_sensor(0xd7,0x60); + SP0A19_write_cmos_sensor(0xf4,0x00); + SP0A19_write_cmos_sensor(0xfb,0x01); + SP0A19_write_cmos_sensor(0x30,0x00); + SP0A19_write_cmos_sensor(0x33,0xff); + SP0A19_write_cmos_sensor(0x34,0x16); + SP0A19_write_cmos_sensor(0x0d,0x14); + SP0A19_write_cmos_sensor(0xb3,0x00); + SP0A19_write_cmos_sensor(0xbf,0x00); + SP0A19_write_cmos_sensor(0xfd,0x01); + SP0A19_write_cmos_sensor(0x28,0x80); + SP0A19_write_cmos_sensor(0x29,0x80); + SP0A19_write_cmos_sensor(0xc4,0x00); + SP0A19_write_cmos_sensor(0xc5,0x00); + SP0A19_write_cmos_sensor(0xca,0x00); + SP0A19_write_cmos_sensor(0xcb,0x00); + SP0A19_write_cmos_sensor(0xde,0x00); + SP0A19_write_cmos_sensor(0xdf,0x00); + SP0A19_write_cmos_sensor(0xfd,0x00); + SP0A19_write_cmos_sensor(0x32,0xc1); + + } + else + { + //SP0A19_write_cmos_sensor(0xfd, 0x00); + } + return ERROR_NONE; +} + + +/*======================================================================================*/ + + + +UINT32 SP0A19YUVSensorSetting(FEATURE_ID iCmd, UINT16 iPara) +{ +#ifdef DEBUG_SENSOR_SP0A19 + return TRUE; +#endif + switch (iCmd) { + case FID_AWB_MODE: + SP0A19_set_param_wb(iPara); + break; + case FID_COLOR_EFFECT: + SP0A19_set_param_effect(iPara); + break; + case FID_AE_EV: + SP0A19_set_param_exposure(iPara); + break; + case FID_AE_FLICKER: + SP0A19_set_param_banding(iPara); + break; + case FID_SCENE_MODE: + SP0A19NightMode(iPara); + break; + default: + break; + } + return TRUE; +} /* SP0A19YUVSensorSetting */ + + +UINT32 SP0A19FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, + UINT8 *pFeaturePara,UINT32 *pFeatureParaLen) +{ + UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara; + UINT16 *pFeatureData16=(UINT16 *) pFeaturePara; + UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara; + UINT32 *pFeatureData32=(UINT32 *) pFeaturePara; + UINT32 SP0A19SensorRegNumber; + UINT32 i; + MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara; + MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara; + + RETAILMSG(1, (_T("gaiyang SP0A19FeatureControl FeatureId=%d\r\n"), FeatureId)); + + switch (FeatureId) + { + case SENSOR_FEATURE_GET_RESOLUTION: + *pFeatureReturnPara16++=IMAGE_SENSOR_FULL_WIDTH; + *pFeatureReturnPara16=IMAGE_SENSOR_FULL_HEIGHT; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PERIOD: + *pFeatureReturnPara16++=(VGA_PERIOD_PIXEL_NUMS)+SP0A19_dummy_pixels; + *pFeatureReturnPara16=(VGA_PERIOD_LINE_NUMS)+SP0A19_dummy_lines; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + *pFeatureReturnPara32 = SP0A19_g_fPV_PCLK; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_SET_ESHUTTER: + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + #ifndef DEBUG_SENSOR_SP0A19 + SP0A19NightMode((BOOL) *pFeatureData16); + #endif + break; + case SENSOR_FEATURE_SET_GAIN: + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + SP0A19_isp_master_clock=*pFeatureData32; + break; + case SENSOR_FEATURE_SET_REGISTER: + SP0A19_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + pSensorRegData->RegData = SP0A19_read_cmos_sensor(pSensorRegData->RegAddr); + break; + case SENSOR_FEATURE_GET_CONFIG_PARA: + memcpy(pSensorConfigData, &SP0A19SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT)); + *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT); + break; + case SENSOR_FEATURE_SET_CCT_REGISTER: + case SENSOR_FEATURE_GET_CCT_REGISTER: + case SENSOR_FEATURE_SET_ENG_REGISTER: + case SENSOR_FEATURE_GET_ENG_REGISTER: + case SENSOR_FEATURE_GET_REGISTER_DEFAULT: + case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR: + case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA: + case SENSOR_FEATURE_GET_GROUP_COUNT: + case SENSOR_FEATURE_GET_GROUP_INFO: + case SENSOR_FEATURE_GET_ITEM_INFO: + case SENSOR_FEATURE_SET_ITEM_INFO: + case SENSOR_FEATURE_GET_ENG_INFO: + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE + // if EEPROM does not exist in camera module. + *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE; + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID://cuirui add for MID + *pFeatureReturnPara32=SP0A19GetModuleID(); + *pFeatureParaLen=4; + break; + case SENSOR_FEATURE_SET_YUV_CMD: + SP0A19YUVSensorSetting((FEATURE_ID)*pFeatureData32, *(pFeatureData32+1)); + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + SP0A19YUVSetVideoMode(*pFeatureData16); + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + SP0A19YUVSetTestPatternMode((BOOL) *pFeatureData16); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: + *pFeatureReturnPara32=SP0A19_TEST_PATTERN_CHECKSUM; + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + + + SP0A19GetSensorID(pFeatureData32); + break; + default: + break; + } +return ERROR_NONE; +} /* SP0A19FeatureControl() */ + + +SENSOR_FUNCTION_STRUCT SensorFuncSP0A19YUV= +{ + SP0A19Open, + SP0A19GetInfo, + SP0A19GetResolution, + SP0A19FeatureControl, + SP0A19Control, + SP0A19Close +}; + + +UINT32 SP0A19_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc!=NULL) + *pfFunc=&SensorFuncSP0A19YUV; + return ERROR_NONE; +} /* SensorInit() */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Sensor.h new file mode 100755 index 00000000000..e20277b585c --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp0a19yuv_Sensor.h @@ -0,0 +1,64 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ + +#ifndef __SP0A19_SENSOR_H +#define __SP0A19_SENSOR_H + + +#define VGA_PERIOD_PIXEL_NUMS (640-8)//784//694 +#define VGA_PERIOD_LINE_NUMS (480-6)//510//488 + +#define IMAGE_SENSOR_VGA_GRAB_PIXELS 0 +#define IMAGE_SENSOR_VGA_GRAB_LINES 1 + +#define IMAGE_SENSOR_VGA_WIDTH (640-8) +#define IMAGE_SENSOR_VGA_HEIGHT (480-6) + +#define IMAGE_SENSOR_PV_WIDTH (640-8) +#define IMAGE_SENSOR_PV_HEIGHT (480-6) + +#define IMAGE_SENSOR_FULL_WIDTH (640-8) +#define IMAGE_SENSOR_FULL_HEIGHT (480-6) + +#define SP0A19_WRITE_ID 0x42 +#define SP0A19_READ_ID 0x43 +#define SP0A19_SENSOR_ID 0xa6 +typedef enum +{ + SP0A19_RGB_Gamma_m1 = 0, + SP0A19_RGB_Gamma_m2, + SP0A19_RGB_Gamma_m3, + SP0A19_RGB_Gamma_m4, + SP0A19_RGB_Gamma_m5, + SP0A19_RGB_Gamma_m6, + SP0A19_RGB_Gamma_night +}SP0A19_GAMMA_TAG; + +typedef enum +{ + CHT_806C_2 = 1, + CHT_808C_2, + LY_982A_H114, + XY_046A, + XY_0620, + XY_078V, + YG1001A_F +}SP0A19_LENS_TAG; + +UINT32 SP0A19Open(void); +UINT32 SP0A19Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 SP0A19FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId, UINT8 *pFeaturePara,UINT32 *pFeatureParaLen); +UINT32 SP0A19GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_INFO_STRUCT *pSensorInfo, MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData); +UINT32 SP0A19GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution); +UINT32 SP0A19Close(void); + +#endif /* __SENSOR_H */ + diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_CameraCustomized.h b/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_CameraCustomized.h old mode 100644 new mode 100755 similarity index 86% rename from drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_CameraCustomized.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_CameraCustomized.h index 94af62ce93a..1ad95821fe6 --- a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_CameraCustomized.h +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_CameraCustomized.h @@ -1,8 +1,13 @@ -/*******************************************************************************************/ - - -/*******************************************************************************************/ - +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +*/ #ifndef __CAMERA_CUSTOMIZED_H #define __CAMERA_CUSTOMIZED_H diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Camera_Sensor_para.h b/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Camera_Sensor_para.h similarity index 100% rename from drivers/misc/mediatek/imgsensor/src/mt8127/s5k5e2ya_mipi_raw/s5k5e2yamipiraw_Camera_Sensor_para.h rename to drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Camera_Sensor_para.h diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Sensor.c b/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Sensor.c new file mode 100644 index 00000000000..f7fff1549d2 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Sensor.c @@ -0,0 +1,1516 @@ + +/***************************************************************************** + * + * Filename: + * --------- + * sp2509mipiraw_Sensor.c + * + * Project: + * -------- + * ALPS + * + * Description: + * ------------ + * Source code of Sensor driver + * + * + *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!! + *============================================================================ + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +//#include + +#include "kd_camera_hw.h" +#include "kd_imgsensor.h" +#include "kd_imgsensor_define.h" +#include "kd_imgsensor_errcode.h" + +#include "sp2509mipiraw_Sensor.h" + +#ifdef SLT_DEVINFO_CMM_SP2509 +#include +static struct devinfo_struct *s_DEVINFO_ccm; //suppose 10 max lcm device +#endif + +/****************************Modify Following Strings for Debug****************************/ +#define PFX "SP2509_camera_sensor" + +#define LOG_1 LOG_INF("SP2509,MIPI 1LANE\n") +#define LOG_2 LOG_INF("preview 1600*1200@30fps,864Mbps/lane; video 1600*1200@30fps,864Mbps/lane; capture 2M@30fps,864Mbps/lane\n") +/**************************** Modify end *******************************************/ + +#define LOG_INF(format, args...) pr_debug(PFX "[%s] " format, __FUNCTION__, ##args) //xlog_printk(ANDROID_LOG_INFO , PFX, "[%s] " format, __FUNCTION__, ##args) + +/*****************************************************************************/ +// T CARD DEBUG +// debug by sp_zze 2015-06-03 +/*****************************************************************************/ +//#define DEBUG_SENSOR_SP2509 //for T-card +#ifdef DEBUG_SENSOR_SP2509 //sp_zze +#include +#include +#include + +#define SP2509_SD_FILE_PATH "/mnt/sdcard/SP2509_sd" +#define SP_I2C_WRITE write_cmos_sensor +#define SP_I2C_READ read_cmos_sensor +#define SP_LOG LOG_INF +#define SP_DELAY msleep +#define U32 kal_uint32 +#define U16 kal_uint16 +#define U8 kal_uint8 +#define DATA_BUFF_SIZE (25*1024)//25k, must be larger than size of sd file + +typedef struct +{ + U16 addr; + U16 val; +} SP2509_init_regs_struct; + +static kal_uint16 read_cmos_sensor(kal_uint32 addr); +static void write_cmos_sensor(kal_uint32 addr, kal_uint32 para); + +static U8 sp_tolower(U8 c) +{ + if (c <= 'Z' && c >= 'A') + return (c + 'a' - 'A'); + + return c; +} +#define BASE_MAX 36 +static const char digits[] = {"0123456789abcdefghijklmnopqrstuvwxyz"}; +static U32 sp_strtoul(const char *str, char **endptr, U8 base) //sp_zhangzhaoen +{ + const char *sc; + const char *s1, *s2; + U32 x = 0; + + for (sc = str; ; sc++) { // skip space + if (!(*sc == ' ' || *sc == '\t')) + break; + } + + if (base == 1 || base > BASE_MAX) { + if (endptr) + *endptr = (char *)str; + return 0; + } else if (base) { + if (base == 16 && *sc == '0' + && (sc[1] == 'x' || sc[1] == 'X')) + sc += 2; + } else if (*sc != '0') { + base = 10; + } else if (sc[1] == 'x' || sc[1] == 'X') { + base = 16; + sc += 2; + } else { + base = 8; + } + + for (s1 = sc; *sc == '0'; ++sc) + ; + + for (; ; ++sc) { + s2 = memchr(digits, sp_tolower(*sc), base); + if (s2 == NULL) + break; + + x = x * base + (s2 - digits); + } + if (s1 == sc) { + if (endptr) + *endptr = (char *)str; + return 0; + } + + // DEBUG: when overflow + + if (endptr) + *endptr = (char *)sc; + + return (x); +} +static U32 SP2509_Initialize_from_T_Flash(char *file_path) +{ + U8 *curr_ptr = NULL; + U8 *tmp = NULL; + U32 file_size = 0; + U32 regs_total = 0; + U8 func_ind[4] = {0}; /* REG or DLY */ + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static U8 data_buff[DATA_BUFF_SIZE]; + SP2509_init_regs_struct SP2509_reg; + + fp = filp_open(file_path, O_RDONLY , 0); + if (IS_ERR(fp)) { + SP_LOG("create file error\n"); + return 0; + } + fs = get_fs(); + set_fs(KERNEL_DS); + file_size = vfs_llseek(fp, 0, SEEK_END); + vfs_read(fp, data_buff, file_size, &pos); + filp_close(fp, NULL); + set_fs(fs); + + curr_ptr = data_buff; + while (curr_ptr < (data_buff + file_size)) { + while ((*curr_ptr == ' ') || (*curr_ptr == '\t'))/* Skip the Space & TAB */ + curr_ptr++; + + if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '*')) { + curr_ptr += 2; //skip '/' and '*' added by sp_zze + + while (!(((*curr_ptr) == '*') && ((*(curr_ptr + 1)) == '/'))) { + curr_ptr += 2; /* Skip block comment code. */ + } + while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) { + curr_ptr++; + + if (curr_ptr >= (data_buff + file_size)) + break; + } + curr_ptr += 2; /* Skip the enter line */ + continue ; + } + + if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '/')) { /* Comment line, skip it. */ + while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) { + curr_ptr++; + + if (curr_ptr >= (data_buff + file_size)) + break; + } + + curr_ptr += 2; /* Skip the enter line */ + + continue ; + } + + if (((*curr_ptr) == 0x0D) && ((*(curr_ptr + 1)) == 0x0A)) { + curr_ptr += 2; + continue ; + } + + memcpy(func_ind, curr_ptr, 3); + if (!strcmp((const char *)func_ind, "REG")) { /* REG */ + curr_ptr += 4; /* Skip "REG{" */ + SP2509_reg.addr = sp_strtoul((const char *)curr_ptr, &tmp, 16); + curr_ptr = tmp; + curr_ptr ++; /* Skip "," */ + SP2509_reg.val = sp_strtoul((const char *)curr_ptr, &tmp, 16); + curr_ptr += 2; /* Skip "};" */ + + //init + SP_I2C_WRITE(SP2509_reg.addr, SP2509_reg.val); + regs_total++; + } else if (!strcmp((const char *)func_ind, "DLY")) { /* DLY */ + curr_ptr += 4; /* Skip "DLY(" */ + SP2509_reg.val = sp_strtoul((const char *)curr_ptr, &tmp, 10); + curr_ptr = tmp; + + SP_DELAY(SP2509_reg.val); + } + + while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A))) { + curr_ptr++; + + if (curr_ptr >= (data_buff + file_size)) + break; + } + curr_ptr += 2; + } + + return regs_total; +} +static U8 read_from_extern_flash(char *file_path) +{ + struct file *fp; + + fp = filp_open(file_path, O_RDONLY , 0); + if (IS_ERR(fp)) { + SP_LOG("open file error\n"); + return 0; + } else { + SP_LOG("open file ok\n"); + filp_close(fp, NULL); + } + + return 1; +} + +#define SP2509_OTHER_DEBUG_PATH "/mnt/sdcard/SP2509_debug" +static imgsensor_info_struct imgsensor_info; +static void SP2509_other_debug(char *file_path) //sp_zze +{ + U8 *curr_ptr = NULL; + U8 *tmp = NULL; + U32 file_size = 0; + struct file *fp; + mm_segment_t fs; + loff_t pos = 0; + static U8 data_buff[1024]; + + fp = filp_open(file_path, O_RDONLY , 0); + if (IS_ERR(fp)) { + SP_LOG("create file error\n"); + return; + } + fs = get_fs(); + set_fs(KERNEL_DS); + file_size = vfs_llseek(fp, 0, SEEK_END); + vfs_read(fp, data_buff, file_size, &pos); + filp_close(fp, NULL); + set_fs(fs); + + curr_ptr = data_buff; + + imgsensor_info.ae_shut_delay_frame = sp_strtoul((const char *)curr_ptr, &tmp, 10); + curr_ptr = tmp; + curr_ptr ++; /* Skip "," */ + imgsensor_info.ae_sensor_gain_delay_frame = sp_strtoul((const char *)curr_ptr, &tmp, 10); + curr_ptr = tmp; + curr_ptr ++; /* Skip "," */ + imgsensor_info.ae_ispGain_delay_frame = sp_strtoul((const char *)curr_ptr, &tmp, 10); + //sensor_info->AEShutDelayFrame = imgsensor_info.ae_shut_delay_frame; + //sensor_info->AESensorGainDelayFrame = imgsensor_info.ae_sensor_gain_delay_frame; + //sensor_info->AEISPGainDelayFrame = imgsensor_info.ae_ispGain_delay_frame; + return; +} +#endif //END of T CARD DEBUG + +extern IMM_auxadc_GetOneChannelValue_Cali(int Channel, int *voltage); + +static DEFINE_SPINLOCK(imgsensor_drv_lock); + + +static imgsensor_info_struct imgsensor_info = { + .sensor_id = SP2509MIPI_SENSOR_ID, + + //.checksum_value = 0xbaa74750, + .checksum_value = 0xfaf63d31, // mod by liudongming 0x820e0cf, + + .pre = { + .pclk = 24000000, //record different mode's pclk + .linelength = 947, //record different mode's linelength + .framelength = 1234, //record different mode's framelength + .startx = 0, //record different mode's startx of grabwindow + .starty = 0, //record different mode's starty of grabwindow + .grabwindow_width = 1600,//2096, //record different mode's width of grabwindow + .grabwindow_height = 1200,//1552, //record different mode's height of grabwindow + /* following for MIPIDataLowPwr2HighSpeedSettleDelayCount by different scenario */ + .mipi_data_lp2hs_settle_dc = 30,//unit , ns + /* following for GetDefaultFramerateByScenario() */ + .max_framerate = 300, + }, + .cap = { + .pclk = 24000000, + .linelength = 947, + .framelength = 1234, + .startx = 0, + .starty = 0, + .grabwindow_width = 1600,//4192, + .grabwindow_height = 1200,//3104, + .mipi_data_lp2hs_settle_dc = 30, + .max_framerate = 300, + }, + .cap1 = { + .pclk = 24000000, + .linelength = 947, + .framelength = 1234, + .startx = 0, + .starty = 0, + .grabwindow_width = 1600,//4192, + .grabwindow_height = 1200,//3104, + .mipi_data_lp2hs_settle_dc = 30, + .max_framerate = 300, + }, + .normal_video = { + .pclk = 24000000, + .linelength = 947, + .framelength = 1234, + .startx = 0, + .starty = 0, + .grabwindow_width = 1600,//4192, + .grabwindow_height = 1200,//3104, + .mipi_data_lp2hs_settle_dc = 30, + .max_framerate = 300, + }, + .hs_video = { + .pclk = 24000000, + .linelength = 947, + .framelength = 1234, + .startx = 0, + .starty = 0, + .grabwindow_width = 1600, + .grabwindow_height = 1200, + .mipi_data_lp2hs_settle_dc = 30, + .max_framerate = 300, + }, + .slim_video = { + .pclk = 24000000, + .linelength = 947, + .framelength = 1234, + .startx = 0, + .starty = 0, + .grabwindow_width = 1600, + .grabwindow_height = 1200, + .mipi_data_lp2hs_settle_dc = 30, + .max_framerate = 300, + }, + .margin = 4, //sensor framelength & shutter margin + .min_shutter = 7, + .max_frame_length = 0xffff, + .ae_shut_delay_frame = 0, + .ae_sensor_gain_delay_frame = 0, + .ae_ispGain_delay_frame = 2, + .ihdr_support = 0, //1, support; 0,not support + .ihdr_le_firstline = 0, //1,le first ; 0, se first + .sensor_mode_num = 10, //support sensor mode num + + .cap_delay_frame = 2, //enter capture delay frame num + .pre_delay_frame = 2, //enter preview delay frame num + .video_delay_frame = 2, //enter video delay frame num + .hs_video_delay_frame = 2, + .slim_video_delay_frame = 2, + + .isp_driving_current = ISP_DRIVING_8MA, //mclk driving current + .sensor_interface_type = SENSOR_INTERFACE_TYPE_MIPI,//sensor_interface_type + .mipi_sensor_type = MIPI_OPHY_NCSI2, //0,MIPI_OPHY_NCSI2; 1,MIPI_OPHY_CSI2 + .mipi_settle_delay_mode = MIPI_SETTLEDELAY_AUTO,//0,MIPI_SETTLEDELAY_AUTO; 1,MIPI_SETTLEDELAY_MANNUAL + .sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_B, + .mclk = 24, + .mipi_lane_num = SENSOR_MIPI_1_LANE, + .i2c_addr_table = {0x7a, 0x7b, 0xff}, + .i2c_speed = 200, // i2c read/write speed +}; + + +static imgsensor_struct imgsensor = { + .mirror = IMAGE_NORMAL, //mirrorflip information + .sensor_mode = IMGSENSOR_MODE_INIT, //IMGSENSOR_MODE enum value,record current sensor mode,such as: INIT, Preview, Capture, Video,High Speed Video, Slim Video + .shutter = 0x46e, //current shutter // Danbo ?? + .gain = 0x40, //current gain // Danbo ?? + .dummy_pixel = 272, //current dummypixel + .dummy_line = 32, //current dummyline + .current_fps = 300, //full size current fps : 24fps for PIP, 30fps for Normal or ZSD + .autoflicker_en = KAL_FALSE, //auto flicker enable: KAL_FALSE for disable auto flicker, KAL_TRUE for enable auto flicker + .test_pattern = KAL_FALSE, //test pattern mode or not. KAL_FALSE for in test pattern mode, KAL_TRUE for normal output + .current_scenario_id = MSDK_SCENARIO_ID_CAMERA_PREVIEW,//current scenario id + .ihdr_en = 0, //sensor need support LE, SE with HDR feature + .i2c_write_id = 0x7a,//record current sensor's i2c write id +}; + + +/* Sensor output window information */ +static SENSOR_WINSIZE_INFO_STRUCT imgsensor_winsize_info[5] = +{ + { 1600, 1200, 0, 0, 1600, 1200, 1600, 1200, 0000, 0000, 1600, 1200, 0, 0, 1600, 1200}, // Preview 2112*1558 + { 1600, 1200, 0, 0, 1600, 1200, 1600, 1200, 0000, 0000, 1600, 1200, 0, 0, 1600, 1200}, // capture 4206*3128 + { 1600, 1200, 0, 0, 1600, 1200, 1600, 1200, 0000, 0000, 1600, 1200, 0, 0, 1600, 1200}, // video + { 1600, 1200, 0, 0, 1600, 1200, 1600, 1200, 0000, 0000, 1600, 1200, 0, 0, 1600, 1200}, //hight speed video + { 1600, 1200, 0, 0, 1600, 1200, 1600, 1200, 0000, 0000, 1600, 1200, 0, 0, 1600, 1200}};// slim video + + +static kal_uint16 moduleid = 0x00; + +static kal_uint16 read_cmos_sensor(kal_uint32 addr) +{ + kal_uint16 get_byte=0; + char pu_send_cmd[1] = {(char)(addr & 0xFF)}; + //kdSetI2CSpeed(imgsensor_info.i2c_speed); Add this func to set i2c speed by each sensor + + iReadRegI2C(pu_send_cmd, 1, (u8*)&get_byte, 1, imgsensor.i2c_write_id); + + return get_byte; +} + +static void write_cmos_sensor(kal_uint32 addr, kal_uint32 para) +{ + + char pu_send_cmd[2] = {(char)(addr & 0xFF), (char)(para & 0xFF)}; + //kdSetI2CSpeed(imgsensor_info.i2c_speed); Add this func to set i2c speed by each sensor + iWriteRegI2C(pu_send_cmd, 2, imgsensor.i2c_write_id); + LOG_INF("cc write 0x%x =%x \n" , addr,read_cmos_sensor(addr) ); +} + +static kal_uint32 return_sensor_id(void) +{ + write_cmos_sensor(0xfd, 0x00); + return ((read_cmos_sensor(0x02) << 8) | read_cmos_sensor(0x03)); +} + +static void set_max_framerate(UINT16 framerate,kal_bool min_framelength_en) +{ + + kal_uint32 frame_length = imgsensor.frame_length; + //unsigned long flags; + frame_length = imgsensor.pclk / framerate * 10 / imgsensor.line_length; + spin_lock(&imgsensor_drv_lock); + imgsensor.frame_length = (frame_length > imgsensor.min_frame_length) ? frame_length : imgsensor.min_frame_length; + imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; + if (imgsensor.frame_length > imgsensor_info.max_frame_length) + { + imgsensor.frame_length = imgsensor_info.max_frame_length; + imgsensor.dummy_line = imgsensor.frame_length - imgsensor.min_frame_length; + } + if (min_framelength_en) + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); +} /* set_max_framerate */ + + +static void write_shutter(kal_uint16 shutter) +{ + write_cmos_sensor(0xfd, 0x01); + write_cmos_sensor(0x03, (shutter >> 8) & 0xFF); + write_cmos_sensor(0x04, shutter & 0xFF); + write_cmos_sensor(0x01, 0x01); + LOG_INF("shutter =%d, framelength =%d\n", shutter,imgsensor.frame_length); + +} /* write_shutter */ + + + +/************************************************************************* +* FUNCTION +* set_shutter +* +* DESCRIPTION +* This function set e-shutter of sensor to change exposure time. +* +* PARAMETERS +* iShutter : exposured lines +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static void set_shutter(kal_uint16 shutter) +{ + unsigned long flags; + if (shutter < 7) + shutter = 7; + else if(shutter > 0xffff) + shutter = 0xffff; + + spin_lock_irqsave(&imgsensor_drv_lock, flags); + imgsensor.shutter = shutter; + spin_unlock_irqrestore(&imgsensor_drv_lock, flags); + + write_shutter(shutter); + +} /* set_shutter */ + + + + +/************************************************************************* +* FUNCTION +* set_gain +* +* DESCRIPTION +* This function is to set global gain to sensor. +* +* PARAMETERS +* iGain : sensor global gain(base: 0x40) +* +* RETURNS +* the actually gain set to sensor. +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint16 set_gain(kal_uint16 gain) +{ + + #if 1 + kal_uint8 iReg; + + if(gain >= BASEGAIN && gain <= 15*BASEGAIN) + { + iReg = 0x10 * gain/BASEGAIN; //change mtk gain base to aptina gain base + //iReg+= ((gain%BASEGAIN) * BASEGAIN)/0x10; + + if(iReg<=0x10) + { + write_cmos_sensor(0xfd, 0x01); + write_cmos_sensor(0x24, 0x10);//0x23 + write_cmos_sensor(0x01, 0x01); + } + else if(iReg>= 0xa0)//gpw + { + write_cmos_sensor(0xfd, 0x01); + write_cmos_sensor(0x24,0xa0); + write_cmos_sensor(0x01, 0x01); + } + else + { + write_cmos_sensor(0xfd, 0x01); + write_cmos_sensor(0x24, (kal_uint8)iReg); + write_cmos_sensor(0x01, 0x01); + } + } + return gain; + + #endif + +} /* set_gain */ + +static void ihdr_write_shutter_gain(kal_uint16 le, kal_uint16 se, kal_uint16 gain) +{ + +} + + + +static void set_mirror_flip(kal_uint8 image_mirror) +{ + + /******************************************************** + * + * 0x0101 Sensor mirror flip + * + * ISP and Sensor flip or mirror register bit should be the same!! + * + ********************************************************/ + //int static cnt = 0 ; + write_cmos_sensor(0xfd, 0x01); + //iTemp = read_cmos_sensor(0x3f) & 0x03; + //iTemp&= ~0x03; //Clear the mirror and flip bits. + + //cnt = (cnt +1 ) % 4 ; + //printk("%s :%d\n",__func__ ,cnt); + switch (image_mirror) { + case IMAGE_NORMAL: + write_cmos_sensor(0x3f, 0x00); //Set normal + break; + case IMAGE_H_MIRROR: + //write_cmos_sensor(0x3f, iTemp | 0x01); //Set mirror + write_cmos_sensor(0x3f, 0x01); + break; + case IMAGE_V_MIRROR: + //write_cmos_sensor(0x3f, iTemp | 0x02); //Set flip + write_cmos_sensor(0x3f, 0x02); + break; + case IMAGE_HV_MIRROR: + write_cmos_sensor(0x3f, 0x03); //Set mirror and flip + break; + default: + break ; + } + +} + + +/************************************************************************* +* FUNCTION +* night_mode +* +* DESCRIPTION +* This function night mode of sensor. +* +* PARAMETERS +* bEnable: KAL_TRUE -> enable night mode, otherwise, disable night mode +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static void night_mode(kal_bool enable) +{ +/*No Need to implement this function*/ +} /* night_mode */ + +static void sensor_init(void) +{ + LOG_INF("sensor_init start \n"); + //mdelay(1000); + write_cmos_sensor(0xfd,0x00); + write_cmos_sensor(0x2f,0x04); + write_cmos_sensor(0x34,0x00); + write_cmos_sensor(0x35,0x00); + write_cmos_sensor(0x30,0x1d); + write_cmos_sensor(0x33,0x05); + write_cmos_sensor(0xfd,0x01); + write_cmos_sensor(0x44,0x00); + write_cmos_sensor(0x2a,0x4c); + write_cmos_sensor(0x2b,0x1e); + write_cmos_sensor(0x2c,0x60); + write_cmos_sensor(0x25,0x11); + write_cmos_sensor(0x03,0x02); + write_cmos_sensor(0x04,0xf7); + write_cmos_sensor(0x09,0x00); + write_cmos_sensor(0x0a,0x02); + write_cmos_sensor(0x06,0x0a); + write_cmos_sensor(0x24,0x60); + write_cmos_sensor(0x01,0x01); + write_cmos_sensor(0xfb,0x73); + write_cmos_sensor(0xfd,0x01); + write_cmos_sensor(0x16,0x04); + write_cmos_sensor(0x1c,0x09); + write_cmos_sensor(0x21,0x46); + write_cmos_sensor(0x6c,0x00); + write_cmos_sensor(0x6b,0x00); + write_cmos_sensor(0x84,0x00); + write_cmos_sensor(0x85,0x10); + write_cmos_sensor(0x86,0x10); + write_cmos_sensor(0x12,0x04); + write_cmos_sensor(0x13,0x40); + write_cmos_sensor(0x11,0x20); + write_cmos_sensor(0x33,0x40); + write_cmos_sensor(0xd0,0x03); + write_cmos_sensor(0xd1,0x01); + write_cmos_sensor(0xd2,0x00); + write_cmos_sensor(0xd3,0x01); + write_cmos_sensor(0xd4,0x20); + write_cmos_sensor(0x51,0x14); + write_cmos_sensor(0x52,0x10); + write_cmos_sensor(0x55,0x30); + write_cmos_sensor(0x58,0x10); + write_cmos_sensor(0x71,0x10); + write_cmos_sensor(0x6f,0x40); + write_cmos_sensor(0x75,0x60); + write_cmos_sensor(0x76,0x10); + write_cmos_sensor(0x8a,0x22); + write_cmos_sensor(0x8b,0x22); + write_cmos_sensor(0x19,0x71); + write_cmos_sensor(0x29,0x01); + write_cmos_sensor(0xfd,0x01); + write_cmos_sensor(0x9d,0xea); + write_cmos_sensor(0xa0,0x05); + write_cmos_sensor(0xa1,0x02); + write_cmos_sensor(0xad,0x62); + write_cmos_sensor(0xae,0x00); + write_cmos_sensor(0xaf,0x85); + write_cmos_sensor(0xb1,0x01); + write_cmos_sensor(0xac,0x01); + write_cmos_sensor(0xfd,0x01); + write_cmos_sensor(0xfc,0x10); + write_cmos_sensor(0xfe,0x10); + write_cmos_sensor(0xf9,0x00); + write_cmos_sensor(0xfa,0x00); + write_cmos_sensor(0x8e,0x06); + write_cmos_sensor(0x8f,0x40); + write_cmos_sensor(0x90,0x04); + write_cmos_sensor(0x91,0xb0); + write_cmos_sensor(0x3f,0x00); + write_cmos_sensor(0xac,0x01); + write_cmos_sensor(0x45,0x01); + write_cmos_sensor(0x46,0x00); + write_cmos_sensor(0x47,0x6c); + write_cmos_sensor(0x48,0x03); + write_cmos_sensor(0x49,0x8b); + write_cmos_sensor(0x4a,0x00); + write_cmos_sensor(0x4b,0x07); + write_cmos_sensor(0x4c,0x04); + write_cmos_sensor(0x4d,0xb7); + LOG_INF("sensor_init end \n" ); +} /* MIPI_sensor_Init */ + + +static void preview_setting(void) //PreviewSetting +{ + + LOG_INF("preview_setting start\n" ); + + LOG_INF("preview_setting end \n" ); + +} /* preview_setting */ + +static void capture_setting(void) +{ + +} + +static void normal_video_setting(void ) // VideoFullSizeSetting +{ + +} +static void hs_video_setting(void) // VideoHDSetting_60fps +{ + +} + +static void slim_video_setting(void) // VideoHDSetting +{ +} + +static kal_uint32 set_test_pattern_mode(kal_bool enable) +{ + + if(enable) + { + write_cmos_sensor(0xfd,0x01); + write_cmos_sensor(0x0d,0x01); + } + else + { + write_cmos_sensor(0xfd,0x01); + write_cmos_sensor(0x0d,0x00); + } + spin_lock(&imgsensor_drv_lock); + imgsensor.test_pattern = enable; + spin_unlock(&imgsensor_drv_lock); + return ERROR_NONE; +} + +UINT32 SP2509GetModuleID() +{ + printk("SP2509GetModuleID\n"); + return moduleid; +} + + +/************************************************************************* +* FUNCTION +* get_imgsensor_id +* +* DESCRIPTION +* This function get the sensor ID +* +* PARAMETERS +* *sensorID : return the sensor ID +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 get_imgsensor_id(UINT32 *sensor_id) +{ + kal_uint8 i = 0; + kal_uint8 retry = 2; + int adc_val = 0; + //sensor have two i2c address 0x6c 0x6d & 0x21 0x20, we should detect the module used i2c address + while (imgsensor_info.i2c_addr_table[i] != 0xff) { + spin_lock(&imgsensor_drv_lock); + imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; + spin_unlock(&imgsensor_drv_lock); + do { + *sensor_id = return_sensor_id(); + if (*sensor_id == imgsensor_info.sensor_id) { + printk("i2c write id: 0x%x, sensor id: 0x%x\n", imgsensor.i2c_write_id,*sensor_id); + IMM_auxadc_GetOneChannelValue_Cali(12, &adc_val); + if (adc_val < 100000) { /*0.1v = 100000uv , 0.3v :huaquan ; 0v : blx*/ + moduleid = 0x01;//blx + } + else { /*0.1v = 100000uv , 0.3v :huaquan ; 0v : blx*/ + moduleid = 0x05;//Huaquan + } + return ERROR_NONE; + } + printk("Read sensor id fail, write id:0x%x id: 0x%x\n", imgsensor.i2c_write_id,*sensor_id); + retry--; + } while(retry > 0); + i++; + retry = 2; + } + if (*sensor_id != imgsensor_info.sensor_id) { + // if Sensor ID is not correct, Must set *sensor_id to 0xFFFFFFFF + *sensor_id = 0xFFFFFFFF; + return ERROR_SENSOR_CONNECT_FAIL; + } + + return ERROR_NONE; +} + +/************************************************************************* +* FUNCTION +* open +* +* DESCRIPTION +* This function initialize the registers of CMOS sensor +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 open(void) +{ + //const kal_uint8 i2c_addr[] = {IMGSENSOR_WRITE_ID_1, IMGSENSOR_WRITE_ID_2}; + + printk("open start \n" ); + kal_uint8 i = 0; + kal_uint8 retry = 2; + kal_uint32 sensor_id = 0; + + //sensor have two i2c address 0x6c 0x6d & 0x21 0x20, we should detect the module used i2c address + while (imgsensor_info.i2c_addr_table[i] != 0xff) { + spin_lock(&imgsensor_drv_lock); + imgsensor.i2c_write_id = imgsensor_info.i2c_addr_table[i]; + spin_unlock(&imgsensor_drv_lock); + do { + sensor_id = return_sensor_id(); + //sensor_id = 0x2508; + if (sensor_id == imgsensor_info.sensor_id) { + break; + } + retry--; + } while(retry > 0); + i++; + if (sensor_id == imgsensor_info.sensor_id) + break; + retry = 2; + } + if (imgsensor_info.sensor_id != sensor_id) + return ERROR_SENSOR_CONNECT_FAIL; + + /* initail sequence write in */ +#ifdef DEBUG_SENSOR_SP2509 + if(read_from_extern_flash(SP2509_SD_FILE_PATH)) { + SP_LOG("________________from t!\n"); + SP2509_Initialize_from_T_Flash(SP2509_SD_FILE_PATH); + } else { + preview_setting(); + sensor_init(); + } +#else + /* initail sequence write in */ + //preview_setting(); + + sensor_init(); +#endif + spin_lock(&imgsensor_drv_lock); + + imgsensor.autoflicker_en= KAL_FALSE; + imgsensor.sensor_mode = IMGSENSOR_MODE_INIT; + imgsensor.pclk = imgsensor_info.pre.pclk; + imgsensor.frame_length = imgsensor_info.pre.framelength; + imgsensor.line_length = imgsensor_info.pre.linelength; + imgsensor.min_frame_length = imgsensor_info.pre.framelength; + imgsensor.dummy_pixel = 0; + imgsensor.dummy_line = 0; + imgsensor.ihdr_en = KAL_FALSE; + imgsensor.test_pattern = KAL_FALSE; + imgsensor.current_fps = imgsensor_info.pre.max_framerate; + spin_unlock(&imgsensor_drv_lock); + + printk("open end \n" ); + + return ERROR_NONE; +} /* open */ + + + +/************************************************************************* +* FUNCTION +* close +* +* DESCRIPTION +* +* +* PARAMETERS +* None +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 close(void) +{ + + /*No Need to implement this function*/ + + return ERROR_NONE; +} /* close */ + + +/************************************************************************* +* FUNCTION +* preview +* +* DESCRIPTION +* This function start the sensor preview. +* +* PARAMETERS +* *image_window : address pointer of pixel numbers in one period of HSYNC +* *sensor_config_data : address pointer of line numbers in one period of VSYNC +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_PREVIEW; + imgsensor.pclk = imgsensor_info.pre.pclk; + //imgsensor.video_mode = KAL_FALSE; + imgsensor.line_length = imgsensor_info.pre.linelength; + imgsensor.frame_length = imgsensor_info.pre.framelength; + imgsensor.min_frame_length = imgsensor_info.pre.framelength; + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); +#ifndef DEBUG_SENSOR_SP2509 + preview_setting(); +#endif + + set_mirror_flip(sensor_config_data->SensorImageMirror); + + return ERROR_NONE; +} /* preview */ + +/************************************************************************* +* FUNCTION +* capture +* +* DESCRIPTION +* This function setup the CMOS sensor in capture MY_OUTPUT mode +* +* PARAMETERS +* +* RETURNS +* None +* +* GLOBALS AFFECTED +* +*************************************************************************/ +static kal_uint32 capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_CAPTURE; + if (imgsensor.current_fps == imgsensor_info.cap1.max_framerate) {//PIP capture: 24fps for less than 13M, 20fps for 16M,15fps for 20M + imgsensor.pclk = imgsensor_info.cap1.pclk; + imgsensor.line_length = imgsensor_info.cap1.linelength; + imgsensor.frame_length = imgsensor_info.cap1.framelength; + imgsensor.min_frame_length = imgsensor_info.cap1.framelength; + imgsensor.autoflicker_en = KAL_FALSE; + } else { + if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) + LOG_INF("Warning: current_fps %d fps is not support, so use cap's setting: %d fps!\n",imgsensor.current_fps,imgsensor_info.cap.max_framerate/10); + imgsensor.pclk = imgsensor_info.cap.pclk; + imgsensor.line_length = imgsensor_info.cap.linelength; + imgsensor.frame_length = imgsensor_info.cap.framelength; + imgsensor.min_frame_length = imgsensor_info.cap.framelength; + imgsensor.autoflicker_en = KAL_FALSE; + } + spin_unlock(&imgsensor_drv_lock); +#ifndef DEBUG_SENSOR_SP2509 + capture_setting(); +#endif + + return ERROR_NONE; +} /* capture() */ +static kal_uint32 normal_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_VIDEO; + imgsensor.pclk = imgsensor_info.normal_video.pclk; + imgsensor.line_length = imgsensor_info.normal_video.linelength; + imgsensor.frame_length = imgsensor_info.normal_video.framelength; + imgsensor.min_frame_length = imgsensor_info.normal_video.framelength; + //imgsensor.current_fps = 300; + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); +#ifndef DEBUG_SENSOR_SP2509 + normal_video_setting(); +#endif + + return ERROR_NONE; +} /* normal_video */ + +static kal_uint32 hs_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_HIGH_SPEED_VIDEO; + imgsensor.pclk = imgsensor_info.hs_video.pclk; + //imgsensor.video_mode = KAL_TRUE; + imgsensor.line_length = imgsensor_info.hs_video.linelength; + imgsensor.frame_length = imgsensor_info.hs_video.framelength; + imgsensor.min_frame_length = imgsensor_info.hs_video.framelength; + imgsensor.dummy_line = 0; + imgsensor.dummy_pixel = 0; + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); +#ifndef DEBUG_SENSOR_SP2509 + hs_video_setting(); +#endif + + return ERROR_NONE; +} /* hs_video */ + +static kal_uint32 slim_video(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + spin_lock(&imgsensor_drv_lock); + imgsensor.sensor_mode = IMGSENSOR_MODE_SLIM_VIDEO; + imgsensor.pclk = imgsensor_info.slim_video.pclk; + imgsensor.line_length = imgsensor_info.slim_video.linelength; + imgsensor.frame_length = imgsensor_info.slim_video.framelength; + imgsensor.min_frame_length = imgsensor_info.slim_video.framelength; + imgsensor.dummy_line = 0; + imgsensor.dummy_pixel = 0; + imgsensor.autoflicker_en = KAL_TRUE; + spin_unlock(&imgsensor_drv_lock); +#ifndef DEBUG_SENSOR_SP2509 + slim_video_setting(); +#endif + + return ERROR_NONE; +} /* slim_video */ + + +static kal_uint32 get_resolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *sensor_resolution) +{ + sensor_resolution->SensorFullWidth = imgsensor_info.cap.grabwindow_width; + sensor_resolution->SensorFullHeight = imgsensor_info.cap.grabwindow_height; + + sensor_resolution->SensorPreviewWidth = imgsensor_info.pre.grabwindow_width; + sensor_resolution->SensorPreviewHeight = imgsensor_info.pre.grabwindow_height; + + sensor_resolution->SensorVideoWidth = imgsensor_info.normal_video.grabwindow_width; + sensor_resolution->SensorVideoHeight = imgsensor_info.normal_video.grabwindow_height; + + + sensor_resolution->SensorHighSpeedVideoWidth = imgsensor_info.hs_video.grabwindow_width; + sensor_resolution->SensorHighSpeedVideoHeight = imgsensor_info.hs_video.grabwindow_height; + + sensor_resolution->SensorSlimVideoWidth = imgsensor_info.slim_video.grabwindow_width; + sensor_resolution->SensorSlimVideoHeight = imgsensor_info.slim_video.grabwindow_height; + + return ERROR_NONE; +} /* get_resolution */ + +static kal_uint32 get_info(MSDK_SCENARIO_ID_ENUM scenario_id, + MSDK_SENSOR_INFO_STRUCT *sensor_info, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + + +#ifdef DEBUG_SENSOR_SP2509 + if(read_from_extern_flash(SP2509_OTHER_DEBUG_PATH)) { + printk("sp_zze: other debug!\n"); + SP2509_other_debug(SP2509_OTHER_DEBUG_PATH); + } +#endif + + sensor_info->SensorClockPolarity = SENSOR_CLOCK_POLARITY_LOW; + sensor_info->SensorClockFallingPolarity = SENSOR_CLOCK_POLARITY_LOW; /* not use */ + sensor_info->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; // inverse with datasheet + sensor_info->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW; + sensor_info->SensorInterruptDelayLines = 4; /* not use */ + sensor_info->SensorResetActiveHigh = FALSE; /* not use */ + sensor_info->SensorResetDelayCount = 5; /* not use */ + + sensor_info->SensroInterfaceType = imgsensor_info.sensor_interface_type; + sensor_info->MIPIsensorType = imgsensor_info.mipi_sensor_type; + sensor_info->SettleDelayMode = imgsensor_info.mipi_settle_delay_mode; + sensor_info->SensorOutputDataFormat = imgsensor_info.sensor_output_dataformat; + + sensor_info->CaptureDelayFrame = imgsensor_info.cap_delay_frame; + sensor_info->PreviewDelayFrame = imgsensor_info.pre_delay_frame; + sensor_info->VideoDelayFrame = imgsensor_info.video_delay_frame; + sensor_info->HighSpeedVideoDelayFrame = imgsensor_info.hs_video_delay_frame; + sensor_info->SlimVideoDelayFrame = imgsensor_info.slim_video_delay_frame; + + sensor_info->SensorMasterClockSwitch = 0; /* not use */ + sensor_info->SensorDrivingCurrent = imgsensor_info.isp_driving_current; + + sensor_info->AEShutDelayFrame = imgsensor_info.ae_shut_delay_frame; /* The frame of setting shutter default 0 for TG int */ + sensor_info->AESensorGainDelayFrame = imgsensor_info.ae_sensor_gain_delay_frame; /* The frame of setting sensor gain */ + sensor_info->AEISPGainDelayFrame = imgsensor_info.ae_ispGain_delay_frame; + sensor_info->IHDR_Support = imgsensor_info.ihdr_support; + sensor_info->IHDR_LE_FirstLine = imgsensor_info.ihdr_le_firstline; + sensor_info->SensorModeNum = imgsensor_info.sensor_mode_num; + + sensor_info->SensorMIPILaneNumber = imgsensor_info.mipi_lane_num; + sensor_info->SensorClockFreq = imgsensor_info.mclk; + sensor_info->SensorClockDividCount = 3; /* not use */ + sensor_info->SensorClockRisingCount = 0; + sensor_info->SensorClockFallingCount = 2; /* not use */ + sensor_info->SensorPixelClockCount = 3; /* not use */ + sensor_info->SensorDataLatchCount = 2; /* not use */ + + sensor_info->MIPIDataLowPwr2HighSpeedTermDelayCount = 0; + sensor_info->MIPICLKLowPwr2HighSpeedTermDelayCount = 0; + sensor_info->SensorWidthSampling = 0; // 0 is default 1x + sensor_info->SensorHightSampling = 0; // 0 is default 1x + sensor_info->SensorPacketECCOrder = 1; + + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; + sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + sensor_info->SensorGrabStartX = imgsensor_info.cap.startx; + sensor_info->SensorGrabStartY = imgsensor_info.cap.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.cap.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + + sensor_info->SensorGrabStartX = imgsensor_info.normal_video.startx; + sensor_info->SensorGrabStartY = imgsensor_info.normal_video.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.normal_video.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + sensor_info->SensorGrabStartX = imgsensor_info.hs_video.startx; + sensor_info->SensorGrabStartY = imgsensor_info.hs_video.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.hs_video.mipi_data_lp2hs_settle_dc; + + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + sensor_info->SensorGrabStartX = imgsensor_info.slim_video.startx; + sensor_info->SensorGrabStartY = imgsensor_info.slim_video.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.slim_video.mipi_data_lp2hs_settle_dc; + + break; + default: + sensor_info->SensorGrabStartX = imgsensor_info.pre.startx; + sensor_info->SensorGrabStartY = imgsensor_info.pre.starty; + + sensor_info->MIPIDataLowPwr2HighSpeedSettleDelayCount = imgsensor_info.pre.mipi_data_lp2hs_settle_dc; + break; + } + + return ERROR_NONE; +} /* get_info */ + + +static kal_uint32 control(MSDK_SCENARIO_ID_ENUM scenario_id, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window, + MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data) +{ + spin_lock(&imgsensor_drv_lock); + imgsensor.current_scenario_id = scenario_id; + spin_unlock(&imgsensor_drv_lock); + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + preview(image_window, sensor_config_data); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + capture(image_window, sensor_config_data); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + normal_video(image_window, sensor_config_data); // VideoFullSizeSetting + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + hs_video(image_window, sensor_config_data); // VideoHDSetting_120fps + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + slim_video(image_window, sensor_config_data); // VideoHDSetting + break; + default: + preview(image_window, sensor_config_data); + return ERROR_INVALID_SCENARIO_ID; + } + return ERROR_NONE; +} /* control() */ + + + +static kal_uint32 set_video_mode(UINT16 framerate) +{ + // SetVideoMode Function should fix framerate + if (framerate == 0) + // Dynamic frame rate + return ERROR_NONE; + spin_lock(&imgsensor_drv_lock); + if ((framerate == 300) && (imgsensor.autoflicker_en == KAL_TRUE)) + imgsensor.current_fps = 296; + else if ((framerate == 150) && (imgsensor.autoflicker_en == KAL_TRUE)) + imgsensor.current_fps = 146; + else + imgsensor.current_fps = framerate; + spin_unlock(&imgsensor_drv_lock); + set_max_framerate(imgsensor.current_fps,1); + + return ERROR_NONE; +} + +static kal_uint32 set_auto_flicker_mode(kal_bool enable, UINT16 framerate) +{ + spin_lock(&imgsensor_drv_lock); + if (enable) //enable auto flicker + imgsensor.autoflicker_en = KAL_TRUE; + else //Cancel Auto flick + imgsensor.autoflicker_en = KAL_FALSE; + spin_unlock(&imgsensor_drv_lock); + return ERROR_NONE; +} + + +static kal_uint32 set_max_framerate_by_scenario(MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 framerate) +{ + kal_uint32 frame_length; + + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; + imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + //set_dummy(); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + if(framerate == 0) + return ERROR_NONE; + frame_length = imgsensor_info.normal_video.pclk / framerate * 10 / imgsensor_info.normal_video.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.normal_video.framelength) ? (frame_length - imgsensor_info.normal_video.framelength) : 0; + imgsensor.frame_length = imgsensor_info.normal_video.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + //set_dummy(); + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + if (imgsensor.current_fps == imgsensor_info.cap1.max_framerate) { + frame_length = imgsensor_info.cap1.pclk / framerate * 10 / imgsensor_info.cap1.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.cap1.framelength) ? (frame_length - imgsensor_info.cap1.framelength) : 0; + imgsensor.frame_length = imgsensor_info.cap1.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + } else { + if (imgsensor.current_fps != imgsensor_info.cap.max_framerate) + LOG_INF("Warning: current_fps %d fps is not support, so use cap's setting: %d fps!\n",framerate,imgsensor_info.cap.max_framerate/10); + frame_length = imgsensor_info.cap.pclk / framerate * 10 / imgsensor_info.cap.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.cap.framelength) ? (frame_length - imgsensor_info.cap.framelength) : 0; + imgsensor.frame_length = imgsensor_info.cap.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + } + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + frame_length = imgsensor_info.hs_video.pclk / framerate * 10 / imgsensor_info.hs_video.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.hs_video.framelength) ? (frame_length - imgsensor_info.hs_video.framelength) : 0; + imgsensor.frame_length = imgsensor_info.hs_video.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + //set_dummy(); + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + frame_length = imgsensor_info.slim_video.pclk / framerate * 10 / imgsensor_info.slim_video.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.slim_video.framelength) ? (frame_length - imgsensor_info.slim_video.framelength): 0; + imgsensor.frame_length = imgsensor_info.slim_video.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + //set_dummy(); + break; + default: //coding with preview scenario by default + frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength; + spin_lock(&imgsensor_drv_lock); + imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ? (frame_length - imgsensor_info.pre.framelength) : 0; + imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line; + imgsensor.min_frame_length = imgsensor.frame_length; + spin_unlock(&imgsensor_drv_lock); + + break; + } + return ERROR_NONE; + +} + + +static kal_uint32 get_default_framerate_by_scenario(MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 *framerate) +{ + + switch (scenario_id) { + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + *framerate = imgsensor_info.pre.max_framerate; + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + *framerate = imgsensor_info.normal_video.max_framerate; + break; + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + *framerate = imgsensor_info.cap.max_framerate; + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + *framerate = imgsensor_info.hs_video.max_framerate; + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + *framerate = imgsensor_info.slim_video.max_framerate; + break; + default: + break; + } + + return ERROR_NONE; +} + +static kal_uint32 feature_control(MSDK_SENSOR_FEATURE_ENUM feature_id, + UINT8 *feature_para,UINT32 *feature_para_len) +{ + UINT16 *feature_return_para_16=(UINT16 *) feature_para; + UINT16 *feature_data_16=(UINT16 *) feature_para; + UINT32 *feature_return_para_32=(UINT32 *) feature_para; + UINT32 *feature_data_32=(UINT32 *) feature_para; + unsigned long long *feature_data=(unsigned long long *) feature_para; + + SENSOR_WINSIZE_INFO_STRUCT *wininfo; + MSDK_SENSOR_REG_INFO_STRUCT *sensor_reg_data=(MSDK_SENSOR_REG_INFO_STRUCT *) feature_para; + + switch (feature_id) { + case SENSOR_FEATURE_GET_PERIOD: + *feature_return_para_16++ = imgsensor.line_length; + *feature_return_para_16 = imgsensor.frame_length; + *feature_para_len=4; + break; + case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ: + *feature_return_para_32 = imgsensor.pclk; + *feature_para_len=4; + break; + case SENSOR_FEATURE_SET_ESHUTTER: + set_shutter(*feature_data); + break; + case SENSOR_FEATURE_SET_NIGHTMODE: + night_mode((BOOL) *feature_data); + break; + case SENSOR_FEATURE_SET_GAIN: + set_gain((UINT16) *feature_data); + break; + case SENSOR_FEATURE_SET_FLASHLIGHT: + break; + case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ: + break; + case SENSOR_FEATURE_SET_REGISTER: + write_cmos_sensor(sensor_reg_data->RegAddr, sensor_reg_data->RegData); + break; + case SENSOR_FEATURE_GET_REGISTER: + sensor_reg_data->RegData = read_cmos_sensor(sensor_reg_data->RegAddr); + break; + case SENSOR_FEATURE_GET_LENS_DRIVER_ID: + // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE + // if EEPROM does not exist in camera module. + *feature_return_para_32=LENS_DRIVER_ID_DO_NOT_CARE; + *feature_para_len=4; + break; + case SENSOR_FEATURE_GET_SENSOR_CURRENT_MID://cuirui add for MID + *feature_return_para_32=SP2509GetModuleID(); + *feature_para_len=4; + break; + case SENSOR_FEATURE_SET_VIDEO_MODE: + set_video_mode(*feature_data); + break; + case SENSOR_FEATURE_CHECK_SENSOR_ID: + get_imgsensor_id(feature_return_para_32); + break; + case SENSOR_FEATURE_SET_AUTO_FLICKER_MODE: + set_auto_flicker_mode((BOOL)*feature_data_16,*(feature_data_16+1)); + break; + #if 0 + case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: + set_max_framerate_by_scenario((MSDK_SCENARIO_ID_ENUM)*feature_data, *(feature_data+1)); + #else // 32 bit PZT 20160531 for CTS test + case SENSOR_FEATURE_SET_MAX_FRAME_RATE_BY_SCENARIO: + set_max_framerate_by_scenario((MSDK_SCENARIO_ID_ENUM)*feature_data_32, *(feature_data_32+1)); + #endif + + break; + case SENSOR_FEATURE_GET_DEFAULT_FRAME_RATE_BY_SCENARIO: + //get_default_framerate_by_scenario((MSDK_SCENARIO_ID_ENUM)*feature_data_32, (MUINT32 *)(*(feature_data_32+1))); + get_default_framerate_by_scenario((MSDK_SCENARIO_ID_ENUM)*(feature_data), (MUINT32 *)(uintptr_t)(*(feature_data+1))); + break; + case SENSOR_FEATURE_SET_TEST_PATTERN: + set_test_pattern_mode((BOOL)*feature_data); + break; + case SENSOR_FEATURE_GET_TEST_PATTERN_CHECKSUM_VALUE: //for factory mode auto testing + *feature_return_para_32 = imgsensor_info.checksum_value; + *feature_para_len=4; + break; + case SENSOR_FEATURE_SET_FRAMERATE: + spin_lock(&imgsensor_drv_lock); + imgsensor.current_fps = *feature_data; + spin_unlock(&imgsensor_drv_lock); + break; + case SENSOR_FEATURE_SET_HDR: + spin_lock(&imgsensor_drv_lock); + imgsensor.ihdr_en = (BOOL)*feature_data; + spin_unlock(&imgsensor_drv_lock); + break; + case SENSOR_FEATURE_GET_CROP_INFO: + wininfo = (SENSOR_WINSIZE_INFO_STRUCT *)(uintptr_t)(*(feature_data+1)); + switch (*feature_data_32) { + case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[1],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_VIDEO_PREVIEW: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[2],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_HIGH_SPEED_VIDEO: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[3],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_SLIM_VIDEO: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[4],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + case MSDK_SCENARIO_ID_CAMERA_PREVIEW: + default: + memcpy((void *)wininfo,(void *)&imgsensor_winsize_info[0],sizeof(SENSOR_WINSIZE_INFO_STRUCT)); + break; + } + case SENSOR_FEATURE_SET_IHDR_SHUTTER_GAIN: + ihdr_write_shutter_gain((UINT16)*feature_data,(UINT16)*(feature_data+1),(UINT16)*(feature_data+2)); + break; + default: + break; + } + + return ERROR_NONE; +} /* feature_control() */ + +static SENSOR_FUNCTION_STRUCT sensor_func = { + open, + get_info, + get_resolution, + feature_control, + control, + close +}; + +UINT32 SP2509_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) +{ + /* To Do : Check Sensor status here */ + if (pfFunc!=NULL) + *pfFunc=&sensor_func; + return ERROR_NONE; +} /* SP2509_MIPI_RAW_SensorInit */ diff --git a/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Sensor.h b/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Sensor.h new file mode 100644 index 00000000000..556ac9aef21 --- /dev/null +++ b/drivers/misc/mediatek/imgsensor/src/mt8127/sp2509mipiraw_Sensor.h @@ -0,0 +1,143 @@ +/***************************************************************************** + * + * Filename: + * --------- + * sp2509mipiraw_Sensor.h + * + * Project: + * -------- + * ALPS + * + * Description: + * ------------ + * CMOS sensor header file + * + ****************************************************************************/ +#ifndef _SP2509mipi_SENSOR_H +#define _SP2509mipi_SENSOR_H + + +typedef enum{ + IMGSENSOR_MODE_INIT, + IMGSENSOR_MODE_PREVIEW, + IMGSENSOR_MODE_CAPTURE, + IMGSENSOR_MODE_VIDEO, + IMGSENSOR_MODE_HIGH_SPEED_VIDEO, + IMGSENSOR_MODE_SLIM_VIDEO, + IMGSENSOR_MODE_CUSTOM1, + IMGSENSOR_MODE_CUSTOM2, + IMGSENSOR_MODE_CUSTOM3, + IMGSENSOR_MODE_CUSTOM4, + IMGSENSOR_MODE_CUSTOM5, +} IMGSENSOR_MODE; + +typedef struct imgsensor_mode_struct { + kal_uint32 pclk; //record different mode's pclk + kal_uint32 linelength; //record different mode's linelength + kal_uint32 framelength; //record different mode's framelength + + kal_uint8 startx; //record different mode's startx of grabwindow + kal_uint8 starty; //record different mode's startx of grabwindow + + kal_uint16 grabwindow_width; //record different mode's width of grabwindow + kal_uint16 grabwindow_height; //record different mode's height of grabwindow + + /* following for MIPIDataLowPwr2HighSpeedSettleDelayCount by different scenario */ + kal_uint8 mipi_data_lp2hs_settle_dc; + + /* following for GetDefaultFramerateByScenario() */ + kal_uint16 max_framerate; + +} imgsensor_mode_struct; + +/* SENSOR PRIVATE STRUCT FOR VARIABLES*/ +typedef struct imgsensor_struct { + kal_uint8 mirror; //mirrorflip information + + kal_uint8 sensor_mode; //record IMGSENSOR_MODE enum value + + kal_uint32 shutter; //current shutter + kal_uint16 gain; //current gain + + kal_uint32 pclk; //current pclk + + kal_uint32 frame_length; //current framelength + kal_uint32 line_length; //current linelength + + kal_uint32 min_frame_length; //current min framelength to max framerate + kal_uint16 dummy_pixel; //current dummypixel + kal_uint16 dummy_line; //current dummline + + kal_uint16 current_fps; //current max fps + kal_bool autoflicker_en; //record autoflicker enable or disable + kal_bool test_pattern; //record test pattern mode or not + MSDK_SCENARIO_ID_ENUM current_scenario_id;//current scenario id + kal_uint8 ihdr_en; //ihdr enable or disable + + kal_uint8 i2c_write_id; //record current sensor's i2c write id + kal_uint8 update_sensor_otp_awb; // Update sensor awb from otp or not + kal_uint8 update_sensor_otp_lsc; // Update sensor lsc from otp or not +} imgsensor_struct; + +/* SENSOR PRIVATE STRUCT FOR CONSTANT*/ +typedef struct imgsensor_info_struct { + kal_uint32 sensor_id; //record sensor id defined in Kd_imgsensor.h + kal_uint32 checksum_value; //checksum value for Camera Auto Test + imgsensor_mode_struct pre; //preview scenario relative information + imgsensor_mode_struct cap; //capture scenario relative information + imgsensor_mode_struct cap1; //capture for PIP 24fps relative information + imgsensor_mode_struct normal_video;//normal video scenario relative information + imgsensor_mode_struct hs_video; //high speed video scenario relative information + imgsensor_mode_struct slim_video; //slim video for VT scenario relative information + imgsensor_mode_struct custom1; //custom1 scenario relative information + imgsensor_mode_struct custom2; //custom2 scenario relative information + imgsensor_mode_struct custom3; //custom3 scenario relative information + imgsensor_mode_struct custom4; //custom4 scenario relative information + imgsensor_mode_struct custom5; //custom5 scenario relative information + + kal_uint8 ae_shut_delay_frame; //shutter delay frame for AE cycle + kal_uint8 ae_sensor_gain_delay_frame; //sensor gain delay frame for AE cycle + kal_uint8 ae_ispGain_delay_frame; //isp gain delay frame for AE cycle + kal_uint8 ihdr_support; //1, support; 0,not support + kal_uint8 ihdr_le_firstline; //1,le first ; 0, se first + kal_uint8 sensor_mode_num; //support sensor mode num + + kal_uint8 cap_delay_frame; //enter capture delay frame num + kal_uint8 pre_delay_frame; //enter preview delay frame num + kal_uint8 video_delay_frame; //enter video delay frame num + kal_uint8 hs_video_delay_frame; //enter high speed video delay frame num + kal_uint8 slim_video_delay_frame; //enter slim video delay frame num + kal_uint8 custom1_delay_frame; //enter custom1 delay frame num + kal_uint8 custom2_delay_frame; //enter custom1 delay frame num + kal_uint8 custom3_delay_frame; //enter custom1 delay frame num + kal_uint8 custom4_delay_frame; //enter custom1 delay frame num + kal_uint8 custom5_delay_frame; //enter custom1 delay frame num + + kal_uint8 margin; //sensor framelength & shutter margin + kal_uint32 min_shutter; //min shutter + kal_uint32 max_frame_length; //max framelength by sensor register's limitation + + kal_uint8 isp_driving_current; //mclk driving current + kal_uint8 sensor_interface_type;//sensor_interface_type + kal_uint8 mipi_sensor_type; //0,MIPI_OPHY_NCSI2; 1,MIPI_OPHY_CSI2, default is NCSI2, don't modify this para + kal_uint8 mipi_settle_delay_mode; //0, high speed signal auto detect; 1, use settle delay,unit is ns, default is auto detect, don't modify this para + kal_uint8 sensor_output_dataformat; + kal_uint8 mclk; //mclk value, suggest 24 or 26 for 24Mhz or 26Mhz + + kal_uint8 mipi_lane_num; //mipi lane num + kal_uint8 i2c_addr_table[5]; //record sensor support all write id addr, only supprt 4must end with 0xff + kal_uint32 i2c_speed; //i2c speed +} imgsensor_info_struct; + +/* SENSOR READ/WRITE ID */ +//#define IMGSENSOR_WRITE_ID_1 (0x6c) +//#define IMGSENSOR_READ_ID_1 (0x6d) +//#define IMGSENSOR_WRITE_ID_2 (0x20) +//#define IMGSENSOR_READ_ID_2 (0x21) + +extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId); +extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId); +//extern void kdSetI2CSpeed(u16 i2cSpeed); + + +#endif diff --git a/drivers/misc/mediatek/irq/mt8127/irq.c b/drivers/misc/mediatek/irq/mt8127/irq.c index 951998e3939..7c52933923f 100644 --- a/drivers/misc/mediatek/irq/mt8127/irq.c +++ b/drivers/misc/mediatek/irq/mt8127/irq.c @@ -23,6 +23,10 @@ #include #endif +#include +#include +#include + #define GIC_DIST_IGROUP (0x080) #define GIC_DIST_ACTIVE_SET (0x300) @@ -1192,11 +1196,51 @@ int request_fiq(int irq, fiq_isr_handler handler, unsigned long irq_flags, void #endif /* CONFIG_FIQ_GLUE */ +/* Added by haitaoy@amazon.com, to report wake event of IRQ type. */ +struct mt_wake_event intr_event = { + .domain = "IRQ", +}; + +static unsigned int get_pending_status(int irq); +static unsigned int get_active_status(int irq); + +static int mt_intr_suspend(void) +{ + return 0; +} + +static void mt_intr_resume(void) +{ + int port; + u32 events; + struct mt_wake_event *we = spm_get_wakeup_event(); + + /* whether is waked up by WAKE_SRC_CPU0_IRQ or not. */ + if (we && we->domain && !strcmp(we->domain, "SPM") && we->code == 26) { + for (port = 0; port < 7; ++port) { + events = get_pending_status(port<<5); + if (events) { + int num = __ffs(events) + (port << 5); + spm_report_wakeup_event(&intr_event, num); + break; + } + } + } +} + +static struct syscore_ops mt_intr_syscore_ops = { + .suspend = mt_intr_suspend, + .resume = mt_intr_resume, +}; + void __init mt_init_irq(void) { spin_lock_init(&irq_lock); mt_gic_dist_init(); mt_gic_cpu_init(); + + /* register interrupt syscore operations. */ + register_syscore_ops(&mt_intr_syscore_ops); } static unsigned int get_mask(int irq) diff --git a/drivers/misc/mediatek/kernel/fiq_smp_call.c b/drivers/misc/mediatek/kernel/fiq_smp_call.c index c9db93e2a5a..686cfc324c2 100644 --- a/drivers/misc/mediatek/kernel/fiq_smp_call.c +++ b/drivers/misc/mediatek/kernel/fiq_smp_call.c @@ -179,6 +179,6 @@ static int __init fiq_smp_call_init(void) return 0; } -arch_initcall(fiq_smp_call_init); +arch_initcall_sync(fiq_smp_call_init); #endif /* CONFIG_FIQ_GLUE */ diff --git a/drivers/misc/mediatek/kernel/system.c b/drivers/misc/mediatek/kernel/system.c index b1916f45f0d..9bbd68ea802 100644 --- a/drivers/misc/mediatek/kernel/system.c +++ b/drivers/misc/mediatek/kernel/system.c @@ -22,14 +22,21 @@ void arch_reset(char mode, const char *cmd) rtc_mark_recovery(); } else if (cmd && !strcmp(cmd, "bootloader")) { rtc_mark_fast(); + } else if (cmd && !strcmp(cmd, "rpmbp")) { + rtc_mark_rpmbp(); } #ifdef CONFIG_MTK_KERNEL_POWER_OFF_CHARGING else if (cmd && !strcmp(cmd, "kpoc")) { rtc_mark_kpoc(); + } else if (cmd && !strcmp(cmd, "enter_kpoc")) { + rtc_mark_enter_kpoc(); } #endif else { - reboot = 1; + if (rtc_enter_kpoc_detected()) + reboot = 0; + else + reboot = 1; } if (res) { diff --git a/drivers/misc/mediatek/keypad/kpd.c b/drivers/misc/mediatek/keypad/kpd.c old mode 100644 new mode 100755 index 7ac0e72e1c5..42ed255667f --- a/drivers/misc/mediatek/keypad/kpd.c +++ b/drivers/misc/mediatek/keypad/kpd.c @@ -23,18 +23,30 @@ #include #endif +#ifdef CONFIG_AUSTIN_PROJECT +#include +#include + +static struct proc_dir_entry *proc_root; +static struct proc_dir_entry *proc_entry; +#define USER_ROOT_DIR "driver" +#define USER_ENTRY "hall_sensor" +#endif + #define KPD_NAME "mtk-kpd" #define MTK_KP_WAKESOURCE /* this is for auto set wake up source */ #ifdef CONFIG_OF void __iomem *kp_base; static unsigned int kp_irqnr; -#endif +#endif struct input_dev *kpd_input_dev; static bool kpd_suspend = false; static int kpd_show_hw_keycode = 1; static int kpd_show_register = 1; static volatile int call_status = 0; +static int kpd_swap_hw_vol_key = 0; +static u32 kpd_swap_up_code, kpd_swap_down_code; /*for kpd_memory_setting() function*/ static u16 kpd_keymap[KPD_NUM_KEYS]; @@ -306,6 +318,9 @@ static enum hrtimer_restart aee_timer_5s_func(struct hrtimer *timer) /************************************************************************************************************************************************/ #if KPD_HAS_SLIDE_QWERTY +#ifdef CONFIG_AUSTIN_PROJECT +static int slide_st = 0; +#endif static void kpd_slide_handler(unsigned long data) { bool slid; @@ -318,17 +333,20 @@ static void kpd_slide_handler(unsigned long data) input_sync(kpd_input_dev); kpd_print("report QWERTY = %s\n", slid ? "slid" : "closed"); +#ifdef CONFIG_AUSTIN_PROJECT + slide_st = slid; +#endif if (old_state) { mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 0); } else { mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 1); } /* for detecting the return to old_state */ - mt65xx_eint_set_polarity(KPD_SLIDE_EINT, old_state); - mt65xx_eint_unmask(KPD_SLIDE_EINT); + mt_eint_set_polarity(KPD_SLIDE_EINT, old_state); + mt_eint_unmask(KPD_SLIDE_EINT); } -static void kpd_slide_eint_handler(void) +void kpd_slide_eint_handler(void) { tasklet_schedule(&kpd_slide_tasklet); } @@ -411,6 +429,29 @@ static void kpd_keymap_handler(unsigned long data) kpd_aee_handler(linux_keycode, pressed); kpd_backlight_handler(pressed, linux_keycode); + if (pressed) { + u32 kc = linux_keycode; + /* Swap keycode is neccessary*/ + if(kpd_swap_hw_vol_key) { + if (kc == KEY_VOLUMEUP) + linux_keycode = KEY_VOLUMEDOWN; + else if (kc == KEY_VOLUMEDOWN) + linux_keycode = KEY_VOLUMEUP; + kpd_print("[kpd kc = %d keycode=%d \n", kc, linux_keycode); + } + + /* Save the pressed volume keycode */ + if (kc == KEY_VOLUMEUP) + kpd_swap_up_code = linux_keycode; + else if (kc == KEY_VOLUMEDOWN) + kpd_swap_down_code = linux_keycode; + } else { + /* Unpressed keycode should match the pressed keycode */ + if (linux_keycode == KEY_VOLUMEUP && kpd_swap_up_code != 0) + linux_keycode = kpd_swap_up_code; + else if (linux_keycode == KEY_VOLUMEDOWN && kpd_swap_down_code != 0) + linux_keycode = kpd_swap_down_code; + } input_report_key(kpd_input_dev, linux_keycode, pressed); input_sync(kpd_input_dev); kpd_print("report Linux keycode = %u\n", linux_keycode); @@ -726,6 +767,13 @@ long kpd_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) kpd_auto_test_for_factorymode(); /* API 3 for kpd factory mode auto-test */ printk("[kpd_auto_test_for_factorymode] test performed!!\n"); break; + case SET_KPD_KSWT_DEF: + kpd_swap_hw_vol_key = 0; + break; + case SET_KPD_KSWT_REV: + kpd_swap_hw_vol_key = 1; + break; + default: return -EINVAL; } @@ -754,10 +802,61 @@ static struct miscdevice kpd_dev = { static int kpd_open(struct input_dev *dev) { - kpd_slide_qwerty_init(); /* API 1 for kpd slide qwerty init settings */ + kpd_slide_qwerty_init(dev); /* API 1 for kpd slide qwerty init settings */ return 0; } +#ifdef CONFIG_AUSTIN_PROJECT +static ssize_t proc_hall_show(struct seq_file *m, char *page, size_t count, loff_t *f_ops) +{ + int status = slide_st; + + if(status) + seq_printf(m,"0xa\n"); + else + seq_printf(m,"0xb\n"); + + return 0; +} + +static int proc_hall_open(struct inode *inode, struct file *file) +{ + return single_open(file, proc_hall_show, PDE_DATA(inode)); +} + +static const struct file_operations hall_proc_fops = { + .owner = THIS_MODULE, + .open = proc_hall_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int hall_create_proc_entry(void) +{ + int error = 0; + + proc_root = proc_mkdir(USER_ROOT_DIR, NULL); + if (!proc_root){ + printk(KERN_ALERT"Create dir /proc/%s error!\n", USER_ROOT_DIR); + return -ENOMEM; + } + + proc_entry = proc_create(USER_ENTRY, 00644, proc_root, &hall_proc_fops); + if (!proc_entry){ + printk(KERN_ALERT"Create entry %s under /proc/%s error!\n", USER_ENTRY,USER_ROOT_DIR); + error = -ENOMEM; + goto err_out; + } + + return 0; + +err_out: + remove_proc_entry(USER_ENTRY, proc_root); + remove_proc_entry(USER_ROOT_DIR, NULL); + return error; +} +#endif static int kpd_pdrv_probe(struct platform_device *pdev) { @@ -782,6 +881,9 @@ static int kpd_pdrv_probe(struct platform_device *pdev) kpd_ldvt_test_init(); /* API 2 for kpd LFVT test enviroment settings */ +#ifdef CONFIG_AUSTIN_PROJECT + hall_create_proc_entry(); +#endif /* initialize and register input device (/dev/input/eventX) */ kpd_input_dev = input_allocate_device(); if (!kpd_input_dev) diff --git a/drivers/misc/mediatek/keypad/mt8127/hal_kpd.c b/drivers/misc/mediatek/keypad/mt8127/hal_kpd.c old mode 100644 new mode 100755 index 1ff8798d8eb..43489b8de87 --- a/drivers/misc/mediatek/keypad/mt8127/hal_kpd.c +++ b/drivers/misc/mediatek/keypad/mt8127/hal_kpd.c @@ -99,8 +99,10 @@ static void enable_kpd(int enable) } } #endif - -void kpd_slide_qwerty_init(void){ +#if KPD_HAS_SLIDE_QWERTY + extern void kpd_slide_eint_handler(void); +#endif +void kpd_slide_qwerty_init(struct input_dev *dev){ #if KPD_HAS_SLIDE_QWERTY bool evdev_flag=false; bool power_op=false; @@ -130,19 +132,20 @@ void kpd_slide_qwerty_init(void){ return -1; } } - +#if 0 power_op = powerOn_slidePin_interface(); if(!power_op) { printk(KPD_SAY "Qwerty slide pin interface power on fail\n"); } else { kpd_print("Qwerty slide pin interface power on success\n"); } - - mt65xx_eint_set_sens(KPD_SLIDE_EINT, KPD_SLIDE_SENSITIVE); +#endif + /*mt65xx_eint_set_sens(KPD_SLIDE_EINT, KPD_SLIDE_SENSITIVE); mt65xx_eint_set_hw_debounce(KPD_SLIDE_EINT, KPD_SLIDE_DEBOUNCE); mt65xx_eint_registration(KPD_SLIDE_EINT, true, KPD_SLIDE_POLARITY, - kpd_slide_eint_handler, false); - + kpd_slide_eint_handler, false);*/ + mt_eint_registration(KPD_SLIDE_EINT, CUST_EINT_KPD_SLIDE_TYPE,kpd_slide_eint_handler, 0); +#if 0 power_op = powerOff_slidePin_interface(); if(!power_op) { printk(KPD_SAY "Qwerty slide pin interface power off fail\n"); @@ -150,6 +153,7 @@ void kpd_slide_qwerty_init(void){ kpd_print("Qwerty slide pin interface power off success\n"); } #endif +#endif return; } /************************************************************/ diff --git a/drivers/misc/mediatek/lcm/KR070IA4T_DSI_VDO/KR070IA4T_DSI_VDO.c b/drivers/misc/mediatek/lcm/KR070IA4T_DSI_VDO/KR070IA4T_DSI_VDO.c new file mode 100644 index 00000000000..2c4dae0cfb5 --- /dev/null +++ b/drivers/misc/mediatek/lcm/KR070IA4T_DSI_VDO/KR070IA4T_DSI_VDO.c @@ -0,0 +1,286 @@ +#ifndef BUILD_LK +#include +#else +#include +#endif + +#ifdef BUILD_LK +#include +#include +#include +#elif (defined BUILD_UBOOT) +#include +#else +#include +#include +#endif + +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (1280) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +#ifdef GPIO_LCM_PWR +#define GPIO_LCD_PWR_EN GPIO_LCM_PWR +#else +#define GPIO_LCD_PWR_EN 0xFFFFFFFF +#endif + + +#ifdef GPIO_LCM_RST +#define GPIO_LCD_RST GPIO_LCM_RST +#else +#define GPIO_LCD_RST 0xFFFFFFFF +#endif + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + #if (LCM_DSI_CMD_MODE) + params->dsi.mode = CMD_MODE; + #else + params->dsi.mode = SYNC_EVENT_VDO_MODE; //SYNC_EVENT_VDO_MODE; + #endif + + // DSI + /* Command mode setting */ + // Three lane or Four lane + params->dsi.LANE_NUM = LCM_FOUR_LANE; + + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 0; + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=FRAME_WIDTH*3; + + params->dsi.vertical_sync_active = 6; + params->dsi.vertical_backporch = 3; + params->dsi.vertical_frontporch = 5; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 6; + params->dsi.horizontal_backporch = 48; + params->dsi.horizontal_frontporch = 16; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + params->dsi.ssc_disable = 1; + params->dsi.PLL_CLOCK = 225; +} + +static void lcm_set_gpio_output(unsigned int GPIO, unsigned int output) +{ + mt_set_gpio_mode(GPIO, GPIO_MODE_00); + mt_set_gpio_dir(GPIO, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO, (output>0)? GPIO_OUT_ONE: GPIO_OUT_ZERO); +} + + +static void lcm_init_power(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_init_power() enter\n"); + +#else + printk("[Kernel/LCM] lcm_init_power() enter\n"); + +#endif + +} + +static void lcm_suspend_power(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_suspend_power() enter\n"); + +#else + printk("[Kernel/LCM] lcm_suspend_power() enter\n"); +#endif + +} + +static void lcm_resume_power(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_resume_power() enter\n"); + +#else + printk("[Kernel/LCM] lcm_resume_power() enter\n"); + +#endif + +} + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_init() enter\n"); + lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + MDELAY(20); + //VDD power on ->VGP3_PMU 1.8V + upmu_set_rg_vgp3_vosel(3); + upmu_set_rg_vgp3_en(0x1); + + lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + +#else + printk("[Kernel/LCM] lcm_init() enter\n"); + +#endif +} + +static void lcm_suspend(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_suspend() enter\n"); + lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO); + MDELAY(20); + //VDD power off ->VGP3_PMU 1.8V + upmu_set_rg_vgp3_vosel(0); + upmu_set_rg_vgp3_en(0); + MDELAY(20); + lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO); + MDELAY(20); + +#else + printk("[Kernel/LCM] lcm_suspend() enter\n"); + lcm_set_gpio_output(GPIO_LCD_PWR_EN,GPIO_OUT_ZERO); + MDELAY(20); + //VDD power off ->VGP3_PMU 1.8V + hwPowerOn(MT6323_POWER_LDO_VGP3 , VOL_1800 ,"LCM"); + MDELAY(20); + + lcm_set_gpio_output(GPIO_LCD_RST,GPIO_OUT_ZERO); + MDELAY(20); + +#endif +} + +static void lcm_resume(void) +{ +#ifdef BUILD_LK + printf("[LK/LCM] lcm_resume() enter\n"); + lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + MDELAY(20); + //VGP3_PMU 1.8V + upmu_set_rg_vgp3_vosel(3); + upmu_set_rg_vgp3_en(0x1); + MDELAY(20); + + lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + +#else + printk("[Kernel/LCM] lcm_resume() enter\n"); + lcm_set_gpio_output(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + MDELAY(20); + hwPowerOn(MT6323_POWER_LDO_VGP3 , VOL_1800 ,"LCM"); + MDELAY(20); + lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + +#endif +} + +#if (LCM_DSI_CMD_MODE) +static void lcm_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height) +{ + unsigned int x0 = x; + unsigned int y0 = y; + unsigned int x1 = x0 + width - 1; + unsigned int y1 = y0 + height - 1; + + unsigned char x0_MSB = ((x0>>8)&0xFF); + unsigned char x0_LSB = (x0&0xFF); + unsigned char x1_MSB = ((x1>>8)&0xFF); + unsigned char x1_LSB = (x1&0xFF); + unsigned char y0_MSB = ((y0>>8)&0xFF); + unsigned char y0_LSB = (y0&0xFF); + unsigned char y1_MSB = ((y1>>8)&0xFF); + unsigned char y1_LSB = (y1&0xFF); + + unsigned int data_array[16]; + + data_array[0]= 0x00053902; + data_array[1]= (x1_MSB<<24)|(x0_LSB<<16)|(x0_MSB<<8)|0x2a; + data_array[2]= (x1_LSB); + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]= 0x00053902; + data_array[1]= (y1_MSB<<24)|(y0_LSB<<16)|(y0_MSB<<8)|0x2b; + data_array[2]= (y1_LSB); + dsi_set_cmdq(data_array, 3, 1); + + data_array[0]= 0x00290508; //HW bug, so need send one HS packet + dsi_set_cmdq(data_array, 1, 1); + + data_array[0]= 0x002c3909; + dsi_set_cmdq(data_array, 1, 0); +} +#endif + + +LCM_DRIVER kr070ia4t_dsi_vdo_lcm_drv = +{ + .name = "KR070IA4T_DSI_VDO", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .resume = lcm_resume, + .init_power = lcm_init_power, + .resume_power = lcm_resume_power, + .suspend_power = lcm_suspend_power, +#if (LCM_DSI_CMD_MODE) + .update = lcm_update, +#endif +}; diff --git a/drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/Makefile~ b/drivers/misc/mediatek/lcm/KR070IA4T_DSI_VDO/Makefile similarity index 78% rename from drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/Makefile~ rename to drivers/misc/mediatek/lcm/KR070IA4T_DSI_VDO/Makefile index be2a341d7dd..a448a09f6a7 100755 --- a/drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/Makefile~ +++ b/drivers/misc/mediatek/lcm/KR070IA4T_DSI_VDO/Makefile @@ -3,7 +3,4 @@ # include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += rm72013_wxga_dsi_vdo.o - - - +obj-y += KR070IA4T_DSI_VDO.o diff --git a/drivers/misc/mediatek/lcm/a080ean01_dsi_vdo/a080ean01_dsi_vdo.c b/drivers/misc/mediatek/lcm/a080ean01_dsi_vdo/a080ean01_dsi_vdo.c index 80b793860d8..79fbc5e86c3 100644 --- a/drivers/misc/mediatek/lcm/a080ean01_dsi_vdo/a080ean01_dsi_vdo.c +++ b/drivers/misc/mediatek/lcm/a080ean01_dsi_vdo/a080ean01_dsi_vdo.c @@ -18,22 +18,22 @@ #include #endif #include "lcm_drv.h" -#include "a080ean01_dsi_vdo.h" + #ifdef BUILD_LK -//#define TPS_I2C_BUS 2 //0 +#define TPS_I2C_BUS 0 #define TPS_I2C_ID I2C2 #define TPS_SLAVE_ADDR 0x74 #define TPS_data_size 13 //1024 -static const uint8_t e2prom_data[TPS_data_size] = {0xFA,0x3c,0x08,0x09,0x09,0x08,0x23,0x0a,0x01,0x06,0x01,0x7D,0x7D}; +const uint8_t e2prom_data[TPS_data_size] = {0xFA,0x3C,0x28,0x09,0x09,0x08,0x23,0x03,0x01,0x06,0x01,0x7D,0x7D}; #endif // --------------------------------------------------------------------------- // Local Constants // --------------------------------------------------------------------------- -#define FRAME_WIDTH (800) //(1024) -#define FRAME_HEIGHT (1280) //(600) +#define FRAME_WIDTH (800) +#define FRAME_HEIGHT (1280) + -#define LCM_ID 0x00 //Trust+AUO #define LCM_DSI_CMD_MODE 0 // --------------------------------------------------------------------------- @@ -60,49 +60,7 @@ static LCM_UTIL_FUNCS lcm_util = { #ifdef BUILD_LK /*----------------------------------------*/ -/*--------------TPS65640------------------*/ -static int tps65640_read_id(void) -{ - printf("Evan:%s\n",__func__); - int ret=0; - U8 id=0; - mt_i2c i2c = {0}; - i2c.id = TPS_I2C_ID; - i2c.addr = TPS_SLAVE_ADDR; - i2c.mode = ST_MODE; - i2c.speed = 100; - i2c.dma_en = 0; - - u8 buf1[2]; - buf1[0]=0xFF; - buf1[1]=0x01; - ret = i2c_write(&i2c, buf1, 2); - if(ret) - { - printf("--------Evan:%s step1 error---------\n",__func__); - //return ret; - } - - - - uint8_t buf2=0x07; - ret = i2c_write(&i2c, &buf2, 1); - if(ret) - { - printf("--------Evan:%s step2-1 error---------\n",__func__); - //return ret; - } - //uint8_t buf3[TPS_data_size]; - ret=i2c_read(&i2c, &id, 1); - if(ret) - { - printf("--------Evan:%s step2-2 error---------\n",__func__); - //return ret; - } - printf("-------Evan:id=%d--------",id); - return ret; -} - +/*--------------TPS65640------------------*/ static int tps65640_write_data(void) { printf("Evan:%s\n",__func__); @@ -114,44 +72,54 @@ static int tps65640_write_data(void) i2c.speed = 100; i2c.dma_en = 0; - /*write step1*/ - u8 buf1[8]; - u8 buf11[8]; + u8 buf1[TPS_data_size+1]; buf1[0] = 0x00; - buf11[0]=0x07; //lens=TPS_data_size+1; int i=0; - for(i=0;i<7;i++) //TPS_data_size + for(i=0;idsi.PS = LCM_PACKED_PS_24BIT_RGB888; //LCM_PACKED_PS_18BIT_RGB666; - params->dsi.vertical_sync_active = 4;//10;//0; - params->dsi.vertical_backporch = 8;//13;//23; - params->dsi.vertical_frontporch = 8;//12; + params->dsi.vertical_sync_active = 4;//0; + params->dsi.vertical_backporch = 8;//23; + params->dsi.vertical_frontporch = 8; params->dsi.vertical_active_line = FRAME_HEIGHT; - params->dsi.horizontal_sync_active = 4;//120;//0; - params->dsi.horizontal_backporch = 132;//100;//160; - params->dsi.horizontal_frontporch = 24;//100;//160; + params->dsi.horizontal_sync_active = 4;//0; + params->dsi.horizontal_backporch = 132;//160; + params->dsi.horizontal_frontporch = 24; //100;//160; params->dsi.horizontal_active_pixel = FRAME_WIDTH; - params->dsi.PLL_CLOCK = 250;//148; + params->dsi.PLL_CLOCK = 200;//148; } @@ -349,208 +332,33 @@ static void init_lcm_registers(void) //extern void tps65640_en(void); -static void extra_cmd(void) -{ - unsigned int data_array[16]; - //--------------LCM tmp start------------// - - data_array[0] = 0x00033902; - data_array[1] = 0x005A5AF1; - dsi_set_cmdq(data_array, 2, 1); - MDELAY(30); - - data_array[0] = 0x00033902; - data_array[1] = 0x00A5A5FC; - dsi_set_cmdq(data_array, 2, 1); - MDELAY(30); - - data_array[0] = 0x00033902; - data_array[1] = 0x001000D0; - dsi_set_cmdq(data_array, 2, 1); - MDELAY(30); - - data_array[0] = 0x00043902; - data_array[1] = 0xA04E01BC; - dsi_set_cmdq(data_array, 2, 1); - MDELAY(30); - - data_array[0] = 0x00063902; - data_array[1] = 0x1C1003E1; - data_array[2] = 0x00000782; - dsi_set_cmdq(data_array, 3, 1); - MDELAY(30); - - data_array[0] = 0x10B11500; - dsi_set_cmdq(data_array, 1, 1); - MDELAY(30); - - data_array[0] = 0x00053902; - data_array[1] = 0x2F2214B2; - data_array[2] = 0x00000004; - dsi_set_cmdq(data_array, 3, 1); - MDELAY(30); - - data_array[0] = 0x00063902; - data_array[1] = 0x080C02F2; - data_array[2] = 0x00001888; - dsi_set_cmdq(data_array, 3, 1); - MDELAY(30); - - data_array[0] = 0x1EB51500; - dsi_set_cmdq(data_array, 1, 1); - MDELAY(30); - - data_array[0] = 0x04B01500; - dsi_set_cmdq(data_array, 1, 1); - MDELAY(30); - - data_array[0] = 0x09FD1500; - dsi_set_cmdq(data_array, 1, 1); - MDELAY(30); - - data_array[0] = 0x00073902; - data_array[1] = 0x862163F6; - data_array[2] = 0x00000000; - dsi_set_cmdq(data_array, 3, 1); - MDELAY(30); - - data_array[0] = 0x00043902; - data_array[1] = 0x104C5ED8; - dsi_set_cmdq(data_array, 2, 1); - MDELAY(30); - // - data_array[0] = 0x000C3902; - data_array[1] = 0xE0C001F3; - data_array[2] = 0x3581D062; - data_array[3] = 0x002430F3; - dsi_set_cmdq(data_array, 4, 1); - MDELAY(30); - - data_array[0] = 0x002E3902; - data_array[1] = 0x030200F4; - data_array[2] = 0x09020326; - data_array[3] = 0x16160700; - data_array[4] = 0x08080003; - data_array[5] = 0x12000003; - data_array[6] = 0x011E1D1C; - data_array[7] = 0x02040109; - data_array[8] = 0x72757461; - data_array[9] = 0x00808083; - data_array[10] = 0x28010100; - data_array[11] = 0x01280304; - data_array[12] = 0x000032D1; - dsi_set_cmdq(data_array, 13, 1); - MDELAY(30); - - // - data_array[0] = 0x001B3902; - data_array[1] = 0x42429DF5; - data_array[2] = 0x4F98AB5F; - data_array[3] = 0x0443330F; - data_array[4] = 0x05525459; - data_array[5] = 0x60406040; - data_array[6] = 0x52262740; - data_array[7] = 0x00186D25; - dsi_set_cmdq(data_array, 8, 1); - MDELAY(30); - // - data_array[0] = 0x000B3902; - data_array[1] = 0x3F3F3FEE; - data_array[2] = 0x3F3F3F00; - data_array[3] = 0x00221100; - dsi_set_cmdq(data_array, 4, 1); - MDELAY(30); - - data_array[0] = 0x00123902; - data_array[1] = 0x431212EF; - data_array[2] = 0x24849043; - data_array[3] = 0x21210081; - data_array[4] = 0x80400303; - data_array[5] = 0x00000082; - dsi_set_cmdq(data_array, 6, 1); - MDELAY(30); - - data_array[0] = 0x00123902; - data_array[1] = 0x10350CFA; - data_array[2] = 0x1A141C14; - data_array[3] = 0x2C271F1E; - data_array[4] = 0x30383B33; - data_array[5] = 0x00003030; - dsi_set_cmdq(data_array, 6, 1); - MDELAY(30); - - data_array[0] = 0x00123902; - data_array[1] = 0x10350CFB; - data_array[2] = 0x1A141C14; - data_array[3] = 0x2C271F1E; - data_array[4] = 0x30383B33; - data_array[5] = 0x00003030; - dsi_set_cmdq(data_array, 6, 1); - MDELAY(30); - - data_array[0] = 0x00213902; - data_array[1] = 0x090B0BF7; - data_array[2] = 0x080A0A09; - data_array[3] = 0x16160108; - data_array[4] = 0x01071717; - data_array[5] = 0x090B0B01; - data_array[6] = 0x080A0A09; - data_array[7] = 0x16160108; - data_array[8] = 0x01071717; - data_array[9] = 0x00000001; - dsi_set_cmdq(data_array, 10, 1); - MDELAY(30); - //--------------LCM tmp end------------// - - -} - -static void set_reg_for_ESD(void) -{ - unsigned int data_array[16]; - data_array[0] = 0x00033902; - data_array[1] = 0x5A5AF1; - dsi_set_cmdq(data_array, 2, 1); - MDELAY(10); - - data_array[0] = 0x00053902; - data_array[1] = 0x1C1003E1; - data_array[2] = 0x00; - dsi_set_cmdq(data_array, 3, 1); - MDELAY(10); - - data_array[0] = 0x00033902; - data_array[1] = 0x1000D0; - dsi_set_cmdq(data_array, 2, 1); - MDELAY(10); -} - static void lcm_init(void) { unsigned int data_array[16]; #ifdef BUILD_LK - printf("CDT+AUO %s, LK \n", __func__); + printf("%s, LK \n", __func__); #else - printk("CDT+AUO %s, kernel", __func__); + printk("%s, kernel", __func__); #endif //tps65640_en(); //mt_set_gpio_out(GPIO118, GPIO_OUT_ONE); lcd_reset(0); lcd_power_en(0); lcd_power_en(1); + MDELAY(50);//Must > 5ms lcd_reset(1); - MDELAY(20); - lcd_reset(0); - MDELAY(20); - lcd_reset(1); - MDELAY(20); - + MDELAY(200);//Must > 50ms + +#ifdef BUILD_LK + //extern int tps65640_e2prom_data_check(void); + tps65640_e2prom_data_check(); +#endif /* software reset */ //data_array[0] = 0x00010500; // dsi_set_cmdq(data_array, 1, 1); -// MDELAY(80); + MDELAY(80); /* customer */ //data_array[0] = 0xFEA11500; @@ -562,33 +370,19 @@ static void lcm_init(void) data_array[0] = 0x00033902; data_array[1] = 0x005A5AF0; dsi_set_cmdq(data_array, 2, 1); - MDELAY(30); - - //add extra cmd ,remove later - //extra_cmd(); - set_reg_for_ESD(); + MDELAY(5); data_array[0] = 0x00110500; dsi_set_cmdq(data_array, 1, 1); - MDELAY(30); - //data_array[0] = 0x00290500; - //dsi_set_cmdq(data_array, 1, 1); - //MDELAY(10); + data_array[0] = 0x00290500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); data_array[0] = 0x00043902; data_array[1] = 0x280040c3; dsi_set_cmdq(data_array, 2, 1); - MDELAY(20); - - mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ONE); -#ifdef BUILD_LK -// tps65640_e2prom_data_check(); -#endif MDELAY(170); - data_array[0] = 0x00290500; - dsi_set_cmdq(data_array, 1, 1); - MDELAY(30); } @@ -612,19 +406,16 @@ static void lcm_suspend(void) data_array[0] = 0x00280500; dsi_set_cmdq(data_array, 1, 1); - MDELAY(2); - - mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ZERO); - MDELAY(2); + MDELAY(30); data_array[0] = 0x00043902; data_array[1] = 0x200040c3; dsi_set_cmdq(data_array, 2, 1); - MDELAY(20); + MDELAY(10); data_array[0] = 0x00100500; dsi_set_cmdq(data_array, 1, 1); - MDELAY(200); + MDELAY(30); lcd_reset(0); lcd_power_en(0); @@ -641,99 +432,46 @@ static void lcm_resume(void) #else printk("%s, kernel", __func__); #endif - lcm_init(); -} - -static unsigned int lcm_esd_test = FALSE; - -static unsigned int lcm_esd_check(void) -{ - #ifndef BUILD_LK - - char buffer[1]; - int array[4]; - int ret = 0; - - if(lcm_esd_test) - { - lcm_esd_test = FALSE; - return TRUE; - } - - array[0] = 0x00013700; - dsi_set_cmdq(array, 1, 1); - read_reg_v2(0x0A, buffer, 1); - //printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]); - if((buffer[0]&0x80)!=0x80) - { - // printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]); - ret++; - } - - // return TRUE: need recovery - // return FALSE: No need recovery - if(ret) - { - return TRUE; - } - else - { - return FALSE; - } - #endif -} - -static unsigned int lcm_esd_recover(void) -{ -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, KERNEL \n", __func__); -#endif - lcm_init(); - return TRUE; -} - -static unsigned int lcm_compare_id(void) -{ - unsigned int id1 = 0, id2 = 0, id = 0; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#endif +//mt_set_gpio_out(GPIO118, GPIO_OUT_ONE);//set standby HIGH lcd_reset(0); lcd_power_en(0); lcd_power_en(1); + MDELAY(50);//Must > 5ms lcd_reset(1); - MDELAY(20); - lcd_reset(0); - MDELAY(20); - lcd_reset(1); - MDELAY(20); + MDELAY(200);//Must > 50ms + + /* software reset */ + // data_array[0] = 0x00010500; + //dsi_set_cmdq(data_array, 1, 1); + /* customer */ + //data_array[0] = 0xFEA11500; + //dsi_set_cmdq(data_array, 1, 1); + //MDELAY(80); - mt_set_gpio_mode(GPIO_HALL_2_PIN, GPIO_HALL_2_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_HALL_2_PIN, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_HALL_2_PIN, GPIO_PULL_DISABLE); - mt_set_gpio_mode(GPIO_HALL_1_PIN, GPIO_HALL_1_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_HALL_1_PIN, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_HALL_1_PIN, GPIO_PULL_DISABLE); - MDELAY(2); + /* set display on */ + // data_array[0] = 0x00290500; + // dsi_set_cmdq(data_array, 1, 1); - id1 = mt_get_gpio_in(GPIO_HALL_2_PIN); - id2 = mt_get_gpio_in(GPIO_HALL_1_PIN); - id = (id1<<1)|(id2); -#ifdef BUILD_LK - printf("CDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); -#else - printk("CDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); -#endif - lcd_reset(0); - lcd_power_en(0); - MDELAY(10); - return (LCM_ID == id)?1:0; + data_array[0] = 0x00033902; + data_array[1] = 0x005A5AF0; + dsi_set_cmdq(data_array, 2, 1); + MDELAY(5); + + data_array[0] = 0x00110500; + dsi_set_cmdq(data_array, 1, 1); + + data_array[0] = 0x00290500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(10); + + data_array[0] = 0x00043902; + data_array[1] = 0x280040c3; + dsi_set_cmdq(data_array, 2, 1); + MDELAY(170); } + LCM_DRIVER a080ean01_dsi_vdo_lcm_drv = { .name = "a080ean01_dsi_vdo", @@ -742,9 +480,6 @@ LCM_DRIVER a080ean01_dsi_vdo_lcm_drv = .init = lcm_init, .suspend = lcm_suspend, .resume = lcm_resume, - .esd_check = lcm_esd_check, - .esd_recover = lcm_esd_recover, - .compare_id = lcm_compare_id, }; diff --git a/drivers/misc/mediatek/lcm/a080ean01_dsi_vdo/a080ean01_dsi_vdo.h b/drivers/misc/mediatek/lcm/a080ean01_dsi_vdo/a080ean01_dsi_vdo.h deleted file mode 100644 index 162ff6298c0..00000000000 --- a/drivers/misc/mediatek/lcm/a080ean01_dsi_vdo/a080ean01_dsi_vdo.h +++ /dev/null @@ -1 +0,0 @@ -#define TCL_PROTO_PCB 0 diff --git a/drivers/misc/mediatek/lcm/rm72013_wxga_dsi_vdo/Makefile b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo/Makefile similarity index 78% rename from drivers/misc/mediatek/lcm/rm72013_wxga_dsi_vdo/Makefile rename to drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo/Makefile index be2a341d7dd..964b2d95f96 100755 --- a/drivers/misc/mediatek/lcm/rm72013_wxga_dsi_vdo/Makefile +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo/Makefile @@ -3,7 +3,7 @@ # include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += rm72013_wxga_dsi_vdo.o +obj-y += hx8282_a01_lvds_dpi_vdo.o diff --git a/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo/hx8282_a01_lvds_dpi_vdo.c b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo/hx8282_a01_lvds_dpi_vdo.c new file mode 100644 index 00000000000..c9ca9c9f2ff --- /dev/null +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo/hx8282_a01_lvds_dpi_vdo.c @@ -0,0 +1,283 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef BUILD_LK +#include +#endif + +#ifdef BUILD_LK +#include +#include +#include +#include +#else +#include +#include +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + + +//#define GPIO_LCD_PWR_EN GPIO3 +#define GPIO_LCD_3V3_EN GPIO83 +#define GPIO_LCD_PWR_EN GPIO44 +#define GPIO_LCD_RST_EN GPIO89 +#define GPIO_LCD_STB_EN GPIO88 + +#define HSYNC_PULSE_WIDTH 10 +#define HSYNC_BACK_PORCH 160 +#define HSYNC_FRONT_PORCH 160 +#define VSYNC_PULSE_WIDTH 10 +#define VSYNC_BACK_PORCH 23 +#define VSYNC_FRONT_PORCH 12 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ONE); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ZERO); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +#if 1 +static void lcd_reset(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ONE); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + } +} +#endif + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->physical_width = 152; + params->physical_height = 86; +// div0_real = div0==0 ? 1: +// div0==1 ? 2: 4; +// div1_real = div1==0 ? 1: +// div1==1 ? 2: 4; +// freq = 26*mipi_pll_clk_ref/2^24/div0_real/div1_real/8 +#if 0 + /* RGB interface configurations */ + params->dpi.mipi_pll_clk_ref = 536870912; + params->dpi.mipi_pll_clk_div1 = 0; // div0=0,1,2,3;div0_real=1,2,4,4 + params->dpi.mipi_pll_clk_div2 = 0; // div1=0,1,2,3;div1_real=1,2,4,4 + params->dpi.dpi_clk_div = 4; //{4,2}, pll/4=51.025M + params->dpi.dpi_clk_duty = 2; +#endif + params->dpi.PLL_CLOCK = 52; //67MHz + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = HSYNC_PULSE_WIDTH; + params->dpi.hsync_back_porch = HSYNC_BACK_PORCH; + params->dpi.hsync_front_porch = HSYNC_FRONT_PORCH; + params->dpi.vsync_pulse_width = VSYNC_PULSE_WIDTH; + params->dpi.vsync_back_porch = VSYNC_BACK_PORCH; + params->dpi.vsync_front_porch = VSYNC_FRONT_PORCH; + + params->dpi.lvds_tx_en = 1; + params->dpi.ssc_disable = 1; + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 0; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + +extern void DSI_clk_HS_mode(unsigned char enter); + +//extern void DSI_Continuous_HS(void); + +static void init_lcm_registers(void) +{ + +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + +} + +static void lcm_init(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + + lcd_reset(0); + MDELAY(50); + lcd_reset(1); + + upmu_set_rg_vgp1_vosel(0x5); + upmu_set_rg_vgp1_en(0x1); + + MDELAY(20); + + lcd_power_en(1); + MDELAY(50); + +} + +static void lcm_suspend(void) +{ + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + MDELAY(100); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(10); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + + upmu_set_rg_vgp1_en(0x0); +#ifndef BUILD_LK + hwPowerDown(MT6323_POWER_LDO_VGP1,"lcm"); +#endif + + MDELAY(5); + lcd_power_en(0); +} + +static void lcm_resume(void) +{ + lcd_reset(0); + MDELAY(50); + lcd_reset(1); + +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); + hwPowerOn(MT6323_POWER_LDO_VGP1,VOL_2800,"lcm"); +#else + printf("[IND][LK] %s\n", __func__); +#endif + MDELAY(20); + lcd_power_en(1); + MDELAY(50); +} + +static int lcm_compare_id(void) +{ + return 1; +} + + +LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv = +{ + .name = "hx8282_a01_lvds_dpi_vdo", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .compare_id = lcm_compare_id, + +}; + diff --git a/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_kd/Makefile b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_kd/Makefile new file mode 100755 index 00000000000..a6d411ea253 --- /dev/null +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_kd/Makefile @@ -0,0 +1,9 @@ +# +# Makefile for misc devices that really don't fit anywhere else. +# +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += hx8282_a01_lvds_dpi_vdo_kd.o + + + diff --git a/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_kd/hx8282_a01_lvds_dpi_vdo_kd.c b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_kd/hx8282_a01_lvds_dpi_vdo_kd.c new file mode 100644 index 00000000000..5face59f4c8 --- /dev/null +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_kd/hx8282_a01_lvds_dpi_vdo_kd.c @@ -0,0 +1,297 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef BUILD_LK +#include +#endif + +#ifdef BUILD_LK +#include +#include +#include +#include +#else +#include +#include +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + + +//#define GPIO_LCD_PWR_EN GPIO3 +#define GPIO_LCD_3V3_EN GPIO83 +#define GPIO_LCD_PWR_EN GPIO44 +#define GPIO_LCD_RST_EN GPIO89 +#define GPIO_LCD_STB_EN GPIO88 + +#define HSYNC_PULSE_WIDTH 10 +#define HSYNC_BACK_PORCH 160 +#define HSYNC_FRONT_PORCH 160 +#define VSYNC_PULSE_WIDTH 10 +#define VSYNC_BACK_PORCH 23 +#define VSYNC_FRONT_PORCH 12 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ONE); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ZERO); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +#if 1 +static void lcd_reset(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ONE); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + } +} +#endif + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->physical_width = 152; + params->physical_height = 86; +// div0_real = div0==0 ? 1: +// div0==1 ? 2: 4; +// div1_real = div1==0 ? 1: +// div1==1 ? 2: 4; +// freq = 26*mipi_pll_clk_ref/2^24/div0_real/div1_real/8 +#if 0 + /* RGB interface configurations */ + params->dpi.mipi_pll_clk_ref = 536870912; + params->dpi.mipi_pll_clk_div1 = 0; // div0=0,1,2,3;div0_real=1,2,4,4 + params->dpi.mipi_pll_clk_div2 = 0; // div1=0,1,2,3;div1_real=1,2,4,4 + params->dpi.dpi_clk_div = 4; //{4,2}, pll/4=51.025M + params->dpi.dpi_clk_duty = 2; +#endif + params->dpi.PLL_CLOCK = 52; //67MHz + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = HSYNC_PULSE_WIDTH; + params->dpi.hsync_back_porch = HSYNC_BACK_PORCH; + params->dpi.hsync_front_porch = HSYNC_FRONT_PORCH; + params->dpi.vsync_pulse_width = VSYNC_PULSE_WIDTH; + params->dpi.vsync_back_porch = VSYNC_BACK_PORCH; + params->dpi.vsync_front_porch = VSYNC_FRONT_PORCH; + + params->dpi.lvds_tx_en = 1; + params->dpi.ssc_disable = 1; + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 0; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + +extern void DSI_clk_HS_mode(unsigned char enter); + +//extern void DSI_Continuous_HS(void); + +static void init_lcm_registers(void) +{ + +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + +} +static void lcm_init(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif +} + +static void lcm_init_power(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + lcd_reset(0); + MDELAY(1); + upmu_set_rg_vgp1_vosel(0x5); + upmu_set_rg_vgp1_en(0x1); + MDELAY(1); + + lcd_reset(1); + + MDELAY(10); + + lcd_power_en(1); + MDELAY(20); +} + + +static void lcm_suspend(void) +{ + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + MDELAY(100); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(10); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + + upmu_set_rg_vgp1_en(0x0); +#ifndef BUILD_LK + hwPowerDown(MT6323_POWER_LDO_VGP1,"lcm"); +#endif + + MDELAY(5); + lcd_power_en(0); +} + +static void lcm_resume(void) +{} + +static void lcm_resume_power(void) +{ + lcd_reset(0); + MDELAY(1); +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); + hwPowerOn(MT6323_POWER_LDO_VGP1,VOL_2800,"lcm"); +#else + printf("[IND][LK] %s\n", __func__); +#endif + MDELAY(1); + lcd_reset(1); + MDELAY(10); + + lcd_power_en(1); + MDELAY(20); +} + +static int lcm_compare_id(void) +{ + return 1; +} + + +LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv_kd = +{ + .name = "hx8282_a01_lvds_dpi_vdo_kd", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .init_power = lcm_init_power, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .resume_power = lcm_resume_power, + .compare_id = lcm_compare_id, + +}; + diff --git a/drivers/misc/mediatek/lcm/kr076_ek79007_wsvga_dsi_vdo/Makefile b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_tpv3/Makefile similarity index 76% rename from drivers/misc/mediatek/lcm/kr076_ek79007_wsvga_dsi_vdo/Makefile rename to drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_tpv3/Makefile index 59f2f0e84cc..8df7d66a706 100755 --- a/drivers/misc/mediatek/lcm/kr076_ek79007_wsvga_dsi_vdo/Makefile +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_tpv3/Makefile @@ -3,8 +3,7 @@ # include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += kr076_ek79007_wsvga_dsi_vdo.o - +obj-y += hx8282_a01_lvds_dpi_vdo_tpv3.o diff --git a/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_tpv3/hx8282_a01_lvds_dpi_vdo_tpv3.c b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_tpv3/hx8282_a01_lvds_dpi_vdo_tpv3.c new file mode 100644 index 00000000000..3935b0195c3 --- /dev/null +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_tpv3/hx8282_a01_lvds_dpi_vdo_tpv3.c @@ -0,0 +1,290 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef BUILD_LK +#include +#endif + +#ifdef BUILD_LK +#include +#include +#include +#include +#else +#include +#include +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + + +//#define GPIO_LCD_PWR_EN GPIO3 +#define GPIO_LCD_3V3_EN GPIO83 +#define GPIO_LCD_PWR_EN GPIO44 +#define GPIO_LCD_RST_EN GPIO89 +#define GPIO_LCD_STB_EN GPIO88 + +#define HSYNC_PULSE_WIDTH 10 +#define HSYNC_BACK_PORCH 160 +#define HSYNC_FRONT_PORCH 160 +#define VSYNC_PULSE_WIDTH 10 +#define VSYNC_BACK_PORCH 23 +#define VSYNC_FRONT_PORCH 12 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ONE); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ZERO); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +#if 1 +static void lcd_reset(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ONE); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + } +} +#endif + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->physical_width = 152; + params->physical_height = 86; +// div0_real = div0==0 ? 1: +// div0==1 ? 2: 4; +// div1_real = div1==0 ? 1: +// div1==1 ? 2: 4; +// freq = 26*mipi_pll_clk_ref/2^24/div0_real/div1_real/8 +#if 0 + /* RGB interface configurations */ + params->dpi.mipi_pll_clk_ref = 536870912; + params->dpi.mipi_pll_clk_div1 = 0; // div0=0,1,2,3;div0_real=1,2,4,4 + params->dpi.mipi_pll_clk_div2 = 0; // div1=0,1,2,3;div1_real=1,2,4,4 + params->dpi.dpi_clk_div = 4; //{4,2}, pll/4=51.025M + params->dpi.dpi_clk_duty = 2; +#endif + params->dpi.PLL_CLOCK = 52; //67MHz + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = HSYNC_PULSE_WIDTH; + params->dpi.hsync_back_porch = HSYNC_BACK_PORCH; + params->dpi.hsync_front_porch = HSYNC_FRONT_PORCH; + params->dpi.vsync_pulse_width = VSYNC_PULSE_WIDTH; + params->dpi.vsync_back_porch = VSYNC_BACK_PORCH; + params->dpi.vsync_front_porch = VSYNC_FRONT_PORCH; + + params->dpi.lvds_tx_en = 1; + params->dpi.ssc_disable = 1; + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 0; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + +extern void DSI_clk_HS_mode(unsigned char enter); + +//extern void DSI_Continuous_HS(void); + +static void init_lcm_registers(void) +{ + +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + +} + +static void lcm_init(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + + //lcd_reset(0); + MDELAY(10); + //lcd_reset(1); + + upmu_set_rg_vgp1_vosel(0x5); + upmu_set_rg_vgp1_en(0x1); + lcd_reset(0); + MDELAY(20); + lcd_reset(1); + MDELAY(20); + + lcd_power_en(1); + MDELAY(50); + +} + +static void lcm_suspend(void) +{ + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + MDELAY(100); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(10); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + + upmu_set_rg_vgp1_en(0x0); +#ifndef BUILD_LK + hwPowerDown(MT6323_POWER_LDO_VGP1,"lcm"); +#endif + + MDELAY(5); + lcd_power_en(0); +} + +static void lcm_resume(void) +{ + //lcd_reset(0); + MDELAY(10); + //lcd_reset(1); + +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); + hwPowerOn(MT6323_POWER_LDO_VGP1,VOL_2800,"lcm"); +#else + printf("[IND][LK] %s\n", __func__); +#endif + lcd_reset(0); + MDELAY(20); + lcd_reset(1); + MDELAY(20); + + lcd_power_en(1); + MDELAY(50); + +} + +static int lcm_compare_id(void) +{ + return 1; +} + + +LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv_tpv3 = +{ + .name = "hx8282_a01_lvds_dpi_vdo_tpv3", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .compare_id = lcm_compare_id, + +}; + diff --git a/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_txd/Makefile b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_txd/Makefile new file mode 100755 index 00000000000..c0b18c23c87 --- /dev/null +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_txd/Makefile @@ -0,0 +1,9 @@ +# +# Makefile for misc devices that really don't fit anywhere else. +# +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += hx8282_a01_lvds_dpi_vdo_txd.o + + + diff --git a/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_txd/hx8282_a01_lvds_dpi_vdo_txd.c b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_txd/hx8282_a01_lvds_dpi_vdo_txd.c new file mode 100644 index 00000000000..295460f4a3e --- /dev/null +++ b/drivers/misc/mediatek/lcm/hx8282_a01_lvds_dpi_vdo_txd/hx8282_a01_lvds_dpi_vdo_txd.c @@ -0,0 +1,283 @@ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + +#ifndef BUILD_LK +#include +#endif + +#ifdef BUILD_LK +#include +#include +#include +#include +#else +#include +#include +#include +#endif +#include "lcm_drv.h" + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (1024) +#define FRAME_HEIGHT (600) + + + +//#define GPIO_LCD_PWR_EN GPIO3 +#define GPIO_LCD_3V3_EN GPIO83 +#define GPIO_LCD_PWR_EN GPIO44 +#define GPIO_LCD_RST_EN GPIO89 +#define GPIO_LCD_STB_EN GPIO88 + +#define HSYNC_PULSE_WIDTH 10 +#define HSYNC_BACK_PORCH 160 +#define HSYNC_FRONT_PORCH 160 +#define VSYNC_PULSE_WIDTH 10 +#define VSYNC_BACK_PORCH 23 +#define VSYNC_FRONT_PORCH 12 + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) + +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg lcm_util.dsi_read_reg() +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ONE); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_3V3_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_3V3_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_3V3_EN, GPIO_OUT_ZERO); + MDELAY(5); + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +#if 1 +static void lcd_reset(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[IND][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[IND][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ONE); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_RST_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(1); + mt_set_gpio_mode(GPIO_LCD_STB_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_STB_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + } +} +#endif + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DPI; + params->ctrl = LCM_CTRL_SERIAL_DBI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->io_select_mode = 0; + + params->physical_width = 152; + params->physical_height = 86; +// div0_real = div0==0 ? 1: +// div0==1 ? 2: 4; +// div1_real = div1==0 ? 1: +// div1==1 ? 2: 4; +// freq = 26*mipi_pll_clk_ref/2^24/div0_real/div1_real/8 +#if 0 + /* RGB interface configurations */ + params->dpi.mipi_pll_clk_ref = 536870912; + params->dpi.mipi_pll_clk_div1 = 0; // div0=0,1,2,3;div0_real=1,2,4,4 + params->dpi.mipi_pll_clk_div2 = 0; // div1=0,1,2,3;div1_real=1,2,4,4 + params->dpi.dpi_clk_div = 4; //{4,2}, pll/4=51.025M + params->dpi.dpi_clk_duty = 2; +#endif + params->dpi.PLL_CLOCK = 52; //67MHz + + params->dpi.clk_pol = LCM_POLARITY_FALLING; + params->dpi.de_pol = LCM_POLARITY_RISING; + params->dpi.vsync_pol = LCM_POLARITY_FALLING; + params->dpi.hsync_pol = LCM_POLARITY_FALLING; + + params->dpi.hsync_pulse_width = HSYNC_PULSE_WIDTH; + params->dpi.hsync_back_porch = HSYNC_BACK_PORCH; + params->dpi.hsync_front_porch = HSYNC_FRONT_PORCH; + params->dpi.vsync_pulse_width = VSYNC_PULSE_WIDTH; + params->dpi.vsync_back_porch = VSYNC_BACK_PORCH; + params->dpi.vsync_front_porch = VSYNC_FRONT_PORCH; + + params->dpi.lvds_tx_en = 1; + params->dpi.ssc_disable = 1; + params->dpi.format = LCM_DPI_FORMAT_RGB888; // format is 24 bit + params->dpi.rgb_order = LCM_COLOR_ORDER_RGB; + params->dpi.is_serial_output = 0; + + params->dpi.intermediat_buffer_num = 0; + + params->dpi.io_driving_current = LCM_DRIVING_CURRENT_2MA; +} + +extern void DSI_clk_HS_mode(unsigned char enter); + +//extern void DSI_Continuous_HS(void); + +static void init_lcm_registers(void) +{ + +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + +} + +static void lcm_init(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + + lcd_reset(0); + MDELAY(50); + lcd_reset(1); + + upmu_set_rg_vgp1_vosel(0x5); + upmu_set_rg_vgp1_en(0x1); + + MDELAY(20); + + lcd_power_en(1); + MDELAY(50); + +} + +static void lcm_suspend(void) +{ + mt_set_gpio_out(GPIO_LCD_STB_EN, GPIO_OUT_ZERO); + MDELAY(100); + mt_set_gpio_out(GPIO_LCD_RST_EN, GPIO_OUT_ZERO); + MDELAY(10); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); +#else + printf("[IND][LK] %s\n", __func__); +#endif + + upmu_set_rg_vgp1_en(0x0); +#ifndef BUILD_LK + hwPowerDown(MT6323_POWER_LDO_VGP1,"lcm"); +#endif + + MDELAY(5); + lcd_power_en(0); +} + +static void lcm_resume(void) +{ + lcd_reset(0); + MDELAY(50); + lcd_reset(1); + +#ifndef BUILD_LK + printk("[IND][K] %s\n", __func__); + hwPowerOn(MT6323_POWER_LDO_VGP1,VOL_2800,"lcm"); +#else + printf("[IND][LK] %s\n", __func__); +#endif + MDELAY(20); + lcd_power_en(1); + MDELAY(50); +} + +static int lcm_compare_id(void) +{ + return 1; +} + + +LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv_txd = +{ + .name = "hx8282_a01_lvds_dpi_vdo_txd", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .compare_id = lcm_compare_id, + +}; + diff --git a/drivers/misc/mediatek/lcm/kr076_ek79007_wsvga_dsi_vdo/kr076_ek79007_wsvga_dsi_vdo.c b/drivers/misc/mediatek/lcm/kr076_ek79007_wsvga_dsi_vdo/kr076_ek79007_wsvga_dsi_vdo.c deleted file mode 100644 index e1aafa2ac6c..00000000000 --- a/drivers/misc/mediatek/lcm/kr076_ek79007_wsvga_dsi_vdo/kr076_ek79007_wsvga_dsi_vdo.c +++ /dev/null @@ -1,379 +0,0 @@ -#ifndef BUILD_LK - #include -#endif - #include "lcm_drv.h" - -#ifdef BUILD_LK - #include - #include -#elif defined(BUILD_UBOOT) - #include -#else - #include - #include - #include -#endif -// --------------------------------------------------------------------------- -// Local Constants -// --------------------------------------------------------------------------- - -#define FRAME_WIDTH (1024) -#define FRAME_HEIGHT (600) - -#define REGFLAG_DELAY 0XFE -#define REGFLAG_END_OF_TABLE 0xFFF // END OF REGISTERS MARKER - -#define LCM_ID_79007 0x00 -#define LCM_DSI_CMD_MODE 0 - -#define GPIO_RESET_PIN GPIO83 -#define GPIO_STBYB_PIN GPIO117 -#define GPIO_AVDD_PIN GPIO119 -#define GPIO_LCM_PWR_EN GPIO89 -#ifndef TRUE - #define TRUE 1 -#endif - -#ifndef FALSE - #define FALSE 0 -#endif - -// --------------------------------------------------------------------------- -// Local Variables -// --------------------------------------------------------------------------- - -static LCM_UTIL_FUNCS lcm_util = {0}; - -#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) - -#define UDELAY(n) (lcm_util.udelay(n)) -#define MDELAY(n) (lcm_util.mdelay(n)) - - -// --------------------------------------------------------------------------- -// Local Functions -// --------------------------------------------------------------------------- - -#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) -#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) -#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) -#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) -#define read_reg lcm_util.dsi_read_reg() -#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) - -#ifndef BUILD_LK -static unsigned int lcm_esd_test = FALSE; ///only for ESD test -#endif - - - -static void lcm_gpio_set(int num, int enable) -{ -#ifdef BUILD_LK -printf("\n\n\n===================== %s %d: num:%d => %d =======================\n\n\n", __func__, __LINE__, num, enable); -#endif - lcm_util.set_gpio_mode(num, GPIO_MODE_00); - lcm_util.set_gpio_dir(num, GPIO_DIR_OUT); - - if (enable) - lcm_util.set_gpio_out(num, GPIO_OUT_ONE); - else - lcm_util.set_gpio_out(num, GPIO_OUT_ZERO); -} - -static void lcd_reset(unsigned char enabled) -{ - if (enabled) - { - mt_set_gpio_mode(GPIO_RESET_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_RESET_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_RESET_PIN, GPIO_OUT_ONE); - } - else - { - mt_set_gpio_mode(GPIO_RESET_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_RESET_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_RESET_PIN, GPIO_OUT_ZERO); - } -} - -static void lcd_stbyb(unsigned char enabled) -{ - if (enabled) - { - mt_set_gpio_mode(GPIO_STBYB_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_STBYB_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_STBYB_PIN, GPIO_OUT_ONE); - } - else - { - mt_set_gpio_mode(GPIO_STBYB_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_STBYB_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_STBYB_PIN, GPIO_OUT_ZERO); - } -} - -static void lcd_DVDD_power_en(unsigned char enabled) -{ - if (enabled) - { - upmu_set_rg_vgp1_vosel(0x3); //1.8V - upmu_set_rg_vgp1_en(0x1); - } - else - { - upmu_set_rg_vgp1_en(0x0); - } -} -static void lcd_AVDD_power_en(unsigned char enabled) -{ - //lcm_gpio_set(GPIO_LCM_PWR_EN, enabled); - mt_set_gpio_mode(GPIO_LCM_PWR_EN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_LCM_PWR_EN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_LCM_PWR_EN, enabled); -} - - -static void init_lcm_registers(void) -{ - unsigned int data_array[16]; -#ifdef BUILD_LK - //printf("[IND][K] y_____0%s\n", __func__); -#else - //printk("[IND][K] y_____1%s\n", __func__); -#endif - - data_array[0] = 0x47801500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x40811500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x04821500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x77831500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x0F841500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x70851500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x70861500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - -} - - -// --------------------------------------------------------------------------- -// LCM Driver Implementations -// --------------------------------------------------------------------------- - -static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) -{ - memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); -} - - -static void lcm_get_params(LCM_PARAMS *params) -{ - //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015, - //improve dsi config and power on/off sequence - memset(params, 0, sizeof(LCM_PARAMS)); - - params->type = LCM_TYPE_DSI; - - params->width = FRAME_WIDTH; - params->height = FRAME_HEIGHT; - -#if (LCM_DSI_CMD_MODE) - params->dsi.mode = CMD_MODE; -#else - params->dsi.mode = BURST_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE; -#endif - - // DSI - /* Command mode setting */ - //1 Three lane or Four lane - params->dsi.LANE_NUM = LCM_FOUR_LANE; - //The following defined the fomat for data coming from LCD engine. - params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; - - // Video mode setting - params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; - - params->dsi.vertical_sync_active = 0x05;// 3 2 - params->dsi.vertical_backporch = 23;// 20 1 - params->dsi.vertical_frontporch = 12; // 1 12 - params->dsi.vertical_active_line = FRAME_HEIGHT; - - params->dsi.horizontal_sync_active = 0x16;// 50 2 - params->dsi.horizontal_backporch = 160; - params->dsi.horizontal_frontporch = 160; - params->dsi.horizontal_active_pixel = FRAME_WIDTH; - params->dsi.PLL_CLOCK=175; - params->dsi.ssc_disable = TRUE; - //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com - - } - - - -static void lcm_init(void) -{ - //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015, - //improve dsi config and power on/off sequence - - lcd_DVDD_power_en(0); - lcd_stbyb(0); - lcd_reset(0); - lcd_AVDD_power_en(0); - MDELAY(30); - - lcd_DVDD_power_en(1); - MDELAY(10); - - lcd_stbyb(1); - MDELAY(10); - - lcd_reset(1); - MDELAY(20); - lcd_reset(0); - MDELAY(10); - lcd_reset(1); - - lcd_AVDD_power_en(1); - - init_lcm_registers(); - MDELAY(50); - //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com - -} - - -static void lcm_suspend(void) -{ - //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015, - //improve dsi config and power on/off sequence - lcd_stbyb(0); - MDELAY(80); - - lcd_AVDD_power_en(0); - MDELAY(50); - - lcd_DVDD_power_en(0); - MDELAY(10); - - lcd_reset(0); - //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com -} - - -static void lcm_resume(void) -{ - lcm_init(); -} - -static unsigned int lcm_compare_id(void) -{ - return 1; -} - -static unsigned int lcm_esd_check(void) -{ - #ifndef BUILD_LK - char buffer[3]; - int array[4]; - int ret = 0; - - if(lcm_esd_test) - { - lcm_esd_test = FALSE; - return TRUE; - } - - array[0] = 0x5A871500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x125B1500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x55871500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x125B1500; - dsi_set_cmdq(array, 1, 1); - - //array[0] = 0x08B11500; - //dsi_set_cmdq(array, 1, 1); - - //MDELAY(2000); - - array[0] = 0x00013700; - dsi_set_cmdq(array, 1, 1); - - read_reg_v2(0x81, buffer, 1); - //printk("\n ZERO] [0x81]=0x%02x\n", buffer[0]); - - if(buffer[0] != 0x40) - { - printk("[LCM ERROR] [0x81]=0x%02x\n", buffer[0]); - return TRUE; - } - else - { - printk("[LCM ESD OK] [0x81]=0x%02x\n", buffer[0]); - array[0] = 0x925B1500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x5A871500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x925B1500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x00871500; - dsi_set_cmdq(array, 1, 1); - return FALSE; - } - - // return TRUE: need recovery - // return FALSE: No need recovery -#else - return FALSE; - #endif -} -static unsigned int lcm_esd_recover(void) -{ - #ifndef BUILD_LK - printk("\n [LCM ERROR] lcm_esd_recover \n"); - #endif - lcd_DVDD_power_en(0); - MDELAY(30); - lcm_init(); - return TRUE; -} - -LCM_DRIVER kr076_ek79007_wsvga_dsi_vdo_lcm_drv = -{ - .name = "kr076_ek79007_wsvga_dsi_vdo", - .set_util_funcs = lcm_set_util_funcs, - .get_params = lcm_get_params, - .init = lcm_init, - .suspend = lcm_suspend, - .resume = lcm_resume, - .compare_id = lcm_compare_id, - .esd_check = lcm_esd_check, - .esd_recover = lcm_esd_recover, -#if (LCM_DSI_CMD_MODE) - .set_backlight = lcm_setbacklight, - .update = lcm_update, -#endif -}; - - - - diff --git a/drivers/misc/mediatek/lcm/kr076_starry_ek79007_wsvga_dsi_vdo/Makefile b/drivers/misc/mediatek/lcm/kr076_starry_ek79007_wsvga_dsi_vdo/Makefile deleted file mode 100644 index 5cf8eedffab..00000000000 --- a/drivers/misc/mediatek/lcm/kr076_starry_ek79007_wsvga_dsi_vdo/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# -# Makefile for misc devices that really don't fit anywhere else. -# -include $(srctree)/drivers/misc/mediatek/Makefile.custom - -obj-y += kr076_starry_ek79007_wsvga_dsi_vdo.o - - - - diff --git a/drivers/misc/mediatek/lcm/kr076_starry_ek79007_wsvga_dsi_vdo/kr076_starry_ek79007_wsvga_dsi_vdo.c b/drivers/misc/mediatek/lcm/kr076_starry_ek79007_wsvga_dsi_vdo/kr076_starry_ek79007_wsvga_dsi_vdo.c deleted file mode 100644 index c4c8d418e52..00000000000 --- a/drivers/misc/mediatek/lcm/kr076_starry_ek79007_wsvga_dsi_vdo/kr076_starry_ek79007_wsvga_dsi_vdo.c +++ /dev/null @@ -1,376 +0,0 @@ -#ifndef BUILD_LK - #include -#endif - #include "lcm_drv.h" - -#ifdef BUILD_LK - #include - #include -#elif defined(BUILD_UBOOT) - #include -#else - #include - #include - #include -#endif -// --------------------------------------------------------------------------- -// Local Constants -// --------------------------------------------------------------------------- - -#define FRAME_WIDTH (1024) -#define FRAME_HEIGHT (600) - -#define REGFLAG_DELAY 0XFE -#define REGFLAG_END_OF_TABLE 0xFFF // END OF REGISTERS MARKER - -#define LCM_ID_79007 0x00 -#define LCM_DSI_CMD_MODE 0 - -#define GPIO_RESET_PIN GPIO83 -#define GPIO_STBYB_PIN GPIO117 -#define GPIO_AVDD_PIN GPIO119 -#define GPIO_LCM_PWR_EN GPIO89 -#ifndef TRUE - #define TRUE 1 -#endif - -#ifndef FALSE - #define FALSE 0 -#endif - -// --------------------------------------------------------------------------- -// Local Variables -// --------------------------------------------------------------------------- - -static LCM_UTIL_FUNCS lcm_util = {0}; - -#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) - -#define UDELAY(n) (lcm_util.udelay(n)) -#define MDELAY(n) (lcm_util.mdelay(n)) - - -// --------------------------------------------------------------------------- -// Local Functions -// --------------------------------------------------------------------------- - -#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) -#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) -#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) -#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) -#define read_reg lcm_util.dsi_read_reg() -#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) - -#ifndef BUILD_LK -static unsigned int lcm_esd_test = FALSE; ///only for ESD test -#endif - - - -static void lcm_gpio_set(int num, int enable) -{ -#ifdef BUILD_LK -printf("\n\n\n===================== %s %d: num:%d => %d =======================\n\n\n", __func__, __LINE__, num, enable); -#endif - lcm_util.set_gpio_mode(num, GPIO_MODE_00); - lcm_util.set_gpio_dir(num, GPIO_DIR_OUT); - - if (enable) - lcm_util.set_gpio_out(num, GPIO_OUT_ONE); - else - lcm_util.set_gpio_out(num, GPIO_OUT_ZERO); -} - -static void lcd_reset(unsigned char enabled) -{ - if (enabled) - { - mt_set_gpio_mode(GPIO_RESET_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_RESET_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_RESET_PIN, GPIO_OUT_ONE); - } - else - { - mt_set_gpio_mode(GPIO_RESET_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_RESET_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_RESET_PIN, GPIO_OUT_ZERO); - } -} - -static void lcd_stbyb(unsigned char enabled) -{ - if (enabled) - { - mt_set_gpio_mode(GPIO_STBYB_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_STBYB_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_STBYB_PIN, GPIO_OUT_ONE); - } - else - { - mt_set_gpio_mode(GPIO_STBYB_PIN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_STBYB_PIN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_STBYB_PIN, GPIO_OUT_ZERO); - } -} - -static void lcd_DVDD_power_en(unsigned char enabled) -{ - if (enabled) - { - upmu_set_rg_vgp1_vosel(0x3); //1.8V - upmu_set_rg_vgp1_en(0x1); - } - else - { - upmu_set_rg_vgp1_en(0x0); - } -} -static void lcd_AVDD_power_en(unsigned char enabled) -{ - //lcm_gpio_set(GPIO_LCM_PWR_EN, enabled); - mt_set_gpio_mode(GPIO_LCM_PWR_EN, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_LCM_PWR_EN, GPIO_DIR_OUT); - mt_set_gpio_out(GPIO_LCM_PWR_EN, enabled); -} - - -static void init_lcm_registers(void) -{ - unsigned int data_array[16]; -#ifdef BUILD_LK - //printf("[IND][K] y_____0%s\n", __func__); -#else - //printk("[IND][K] y_____1%s\n", __func__); -#endif - - data_array[0] = 0x47801500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x40811500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x04821500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x77831500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x0F841500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x70851500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - data_array[0] = 0x70861500; - dsi_set_cmdq(&data_array, 1, 1); - MDELAY(1); - -} - - -// --------------------------------------------------------------------------- -// LCM Driver Implementations -// --------------------------------------------------------------------------- - -static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) -{ - memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); -} - - -static void lcm_get_params(LCM_PARAMS *params) - { - memset(params, 0, sizeof(LCM_PARAMS)); - - params->type = LCM_TYPE_DSI; - - params->width = FRAME_WIDTH; - params->height = FRAME_HEIGHT; - - #if (LCM_DSI_CMD_MODE) - params->dsi.mode = CMD_MODE; - #else - params->dsi.mode = BURST_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE; - #endif - - // DSI - /* Command mode setting */ - //1 Three lane or Four lane - params->dsi.LANE_NUM = LCM_FOUR_LANE; - //The following defined the fomat for data coming from LCD engine. - params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; - - // Video mode setting - params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; - - params->dsi.vertical_sync_active = 0x05;// 3 2 - params->dsi.vertical_backporch = 23;// 20 1 - params->dsi.vertical_frontporch = 12; // 1 12 - params->dsi.vertical_active_line = FRAME_HEIGHT; - - params->dsi.horizontal_sync_active = 0x16;// 50 2 - params->dsi.horizontal_backporch = 160; - params->dsi.horizontal_frontporch = 160; - params->dsi.horizontal_active_pixel = FRAME_WIDTH; - /*[PLATFORM]-Mod-BEGIN by TCTSZ.huangjing,2014.09.09,set mipi clk 227M and disable ssc.*/ - //params->dsi.PLL_CLOCK=240; - params->dsi.PLL_CLOCK=175; - params->dsi.ssc_disable = TRUE; - /*[PLATFORM]-Mod-END by TCTSZ.huangjing*/ - } - - - -static void lcm_init(void) -{ - //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015, - //improve dsi config and power on/off sequence - lcd_DVDD_power_en(0); - lcd_stbyb(0); - lcd_reset(0); - lcd_AVDD_power_en(0); - MDELAY(30); - - lcd_DVDD_power_en(1); - MDELAY(10); - - lcd_stbyb(1); - MDELAY(10); - - lcd_reset(1); - MDELAY(20); - lcd_reset(0); - MDELAY(10); - lcd_reset(1); - - lcd_AVDD_power_en(1); - - init_lcm_registers(); - MDELAY(50); - //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com -} - - -static void lcm_suspend(void) -{ - //[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,28/4/2015, - //improve dsi config and power on/off sequence - lcd_stbyb(0); - MDELAY(80); - - lcd_AVDD_power_en(0); - MDELAY(50); - - lcd_DVDD_power_en(0); - MDELAY(10); - - lcd_reset(0); - //[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com -} - - -static void lcm_resume(void) -{ - lcm_init(); -} - -static unsigned int lcm_compare_id(void) -{ - return 1; -} - -static unsigned int lcm_esd_check(void) -{ - #ifndef BUILD_LK - char buffer[3]; - int array[4]; - int ret = 0; - - if(lcm_esd_test) - { - lcm_esd_test = FALSE; - return TRUE; - } - - array[0] = 0x5A871500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x125B1500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x55871500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x125B1500; - dsi_set_cmdq(array, 1, 1); - - //array[0] = 0x08B11500; - //dsi_set_cmdq(array, 1, 1); - - //MDELAY(2000); - - array[0] = 0x00013700; - dsi_set_cmdq(array, 1, 1); - - read_reg_v2(0x81, buffer, 1); - //printk("\n ZERO] [0x81]=0x%02x\n", buffer[0]); - - if(buffer[0] != 0x40) - { - printk("[LCM ERROR] [0x81]=0x%02x\n", buffer[0]); - return TRUE; - } - else - { - printk("[LCM ESD OK] [0x81]=0x%02x\n", buffer[0]); - array[0] = 0x925B1500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x5A871500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x925B1500; - dsi_set_cmdq(array, 1, 1); - - array[0] = 0x00871500; - dsi_set_cmdq(array, 1, 1); - return FALSE; - } - - // return TRUE: need recovery - // return FALSE: No need recovery -#else - return FALSE; - #endif -} -static unsigned int lcm_esd_recover(void) -{ - #ifndef BUILD_LK - printk("\n [LCM ERROR] lcm_esd_recover \n"); - #endif - lcd_DVDD_power_en(0); - MDELAY(30); - lcm_init(); - return TRUE; -} - -LCM_DRIVER kr076_ek79007_wsvga_dsi_vdo_lcm_drv = -{ - .name = "kr076_ek79007_wsvga_dsi_vdo", - .set_util_funcs = lcm_set_util_funcs, - .get_params = lcm_get_params, - .init = lcm_init, - .suspend = lcm_suspend, - .resume = lcm_resume, - .compare_id = lcm_compare_id, - .esd_check = lcm_esd_check, - .esd_recover = lcm_esd_recover, -#if (LCM_DSI_CMD_MODE) - .set_backlight = lcm_setbacklight, - .update = lcm_update, -#endif -}; - - - - diff --git a/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c b/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c index a5c0cb43c9f..e5eaee4dcc5 100644 --- a/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c +++ b/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c @@ -194,24 +194,64 @@ extern LCM_DRIVER r63419_wqhd_truly_phantom_lcm_drv; extern LCM_DRIVER r63419_fhd_truly_phantom_lcm_drv; extern LCM_DRIVER r63423_wqhd_truly_phantom_lcm_drv; extern LCM_DRIVER kr101ia2s_dsi_vdo_lcm_drv; +extern LCM_DRIVER kr070ia4t_dsi_vdo_lcm_drv; extern LCM_DRIVER r69338_hd720_dsi_vdo_jdi_dw8755a_drv; extern LCM_DRIVER otm9605a_qhd_dsi_vdo_drv; extern LCM_DRIVER ili9806e_dsi_vdo_fwvga_drv; -extern LCM_DRIVER kr076_ek79007_wsvga_dsi_vdo_lcm_drv; -extern LCM_DRIVER rm72013_wxga_dsi_vdo_lcm_drv; -extern LCM_DRIVER ota7291_wxga_dsi_vdo_lcm_drv; +extern LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv; +extern LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv_txd; +extern LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv_tpv3; +extern LCM_DRIVER hx8282_a01_lvds_dpi_vdo_lcm_drv_kd; + +extern LCM_DRIVER nt51021_inx_dsi_vdo_kd_lcm_drv; +extern LCM_DRIVER ota7290b_auo_dsi_vdo_kd_lcm_drv; +extern LCM_DRIVER nt51021_inx_dsi_vdo_inx_lcm_drv; +extern LCM_DRIVER ota7290b_auo_dsi_vdo_tpv_lcm_drv; +extern LCM_DRIVER ota7290b_hsd_dsi_vdo_kd_lcm_drv; +extern LCM_DRIVER nt51021_inx_dsi_vdo_txd_lcm_drv; LCM_DRIVER* lcm_driver_list[] = { -#if defined(KR076_EK79007_WSVGA_DSI_VDO) - &kr076_ek79007_wsvga_dsi_vdo_lcm_drv, +#if defined(NT51021_INX_DSI_VDO_KD) + &nt51021_inx_dsi_vdo_kd_lcm_drv, #endif -//[BUGFIX]-Mod-BEGIN by SCDTABLET.jinghuang@tcl.com,02/4/2015, -//add ek79007 lcd for KD. -#if defined(KR076_STARRY_EK79007_WSVGA_DSI_VDO) - &kr076_ek79007_wsvga_dsi_vdo_lcm_drv, + +#if defined(OTA7290B_AUO_DSI_VDO_KD) + &ota7290b_auo_dsi_vdo_kd_lcm_drv, #endif -//[BUGFIX]-Mod-END by SCDTABLET.jinghuang@tcl.com + +#if defined(NT51021_INX_DSI_VDO_INX) + &nt51021_inx_dsi_vdo_inx_lcm_drv, +#endif + +#if defined(OTA7290B_AUO_DSI_VDO_TPV) + &ota7290b_auo_dsi_vdo_tpv_lcm_drv, +#endif + +#if defined(OTA7290B_HSD_DSI_VDO_KD) + &ota7290b_hsd_dsi_vdo_kd_lcm_drv, +#endif + +#if defined(NT51021_INX_DSI_VDO_TXD) + &nt51021_inx_dsi_vdo_txd_lcm_drv, +#endif + +#if defined(HX8282_A01_LVDS_DPI_VDO) + &hx8282_a01_lvds_dpi_vdo_lcm_drv, +#endif + +#if defined(HX8282_A01_LVDS_DPI_VDO_TXD) + &hx8282_a01_lvds_dpi_vdo_lcm_drv_txd, +#endif + +#if defined(HX8282_A01_LVDS_DPI_VDO_TPV3) + &hx8282_a01_lvds_dpi_vdo_lcm_drv_tpv3, +#endif + +#if defined(HX8282_A01_LVDS_DPI_VDO_KD) + &hx8282_a01_lvds_dpi_vdo_lcm_drv_kd, +#endif + #if defined(OTM1283A_HD720_DSI_VDO_TM) &otm1283a_hd720_dsi_vdo_tm_lcm_drv, #endif @@ -227,6 +267,10 @@ LCM_DRIVER* lcm_driver_list[] = &kr101ia2s_dsi_vdo_lcm_drv, #endif +#if defined(KR070IA4T_DSI_VDO) + &kr070ia4t_dsi_vdo_lcm_drv, +#endif + #if defined(HX8394A_HD720_DSI_VDO_TIANMA_V2) &hx8394a_hd720_dsi_vdo_tianma_v2_lcm_drv, #endif @@ -873,6 +917,10 @@ LCM_DRIVER* lcm_driver_list[] = &it6151_fhd_edp_dsi_video_auo_lcm_drv, #endif +#if defined(A080EAN01_DSI_VDO) + &a080ean01_dsi_vdo_lcm_drv, +#endif + #if defined(IT6121_G156XW01V1_LVDS_VDO) &it6121_g156xw01v1_lvds_vdo_lcm_drv, #endif @@ -904,19 +952,6 @@ LCM_DRIVER* lcm_driver_list[] = #if defined(OTM9605A_QHD_DSI_VDO) &otm9605a_qhd_dsi_vdo_drv, #endif - -#if defined(RM72013_WXGA_DSI_VDO) - &rm72013_wxga_dsi_vdo_lcm_drv, -#endif - -#if defined(OTA7291_WXGA_DSI_VDO) - &ota7291_wxga_dsi_vdo_lcm_drv, -#endif - -#if defined(A080EAN01_DSI_VDO) - &a080ean01_dsi_vdo_lcm_drv, -#endif - }; #define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__) diff --git a/drivers/misc/mediatek/lcm/nt35595_fhd_dsi_cmd_truly/nt35595_fhd_dsi_cmd_truly.c b/drivers/misc/mediatek/lcm/nt35595_fhd_dsi_cmd_truly/nt35595_fhd_dsi_cmd_truly.c index a72fd3ee1bf..1e42468e995 100644 --- a/drivers/misc/mediatek/lcm/nt35595_fhd_dsi_cmd_truly/nt35595_fhd_dsi_cmd_truly.c +++ b/drivers/misc/mediatek/lcm/nt35595_fhd_dsi_cmd_truly/nt35595_fhd_dsi_cmd_truly.c @@ -1,37 +1,5 @@ -/***************************************************************************** -* Copyright Statement: -* -------------------- -* This software is protected by Copyright and the information contained -* herein is confidential. The software may not be copied and the information -* contained herein may not be used or disclosed except with the written -* permission of MediaTek Inc. (C) 2008 -* -* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES -* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") -* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON -* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. -* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE -* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR -* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH -* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO -* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S -* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. -* -* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE -* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, -* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, -* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO -* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. -* -* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE -* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF -* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND -* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER -* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). -* -*****************************************************************************/ + /* MediaTek Inc. (C) 2010. All rights reserved. */ + /* BEGIN PN:DTS2013053103858 , Added by d00238048, 2013.05.31*/ #ifndef BUILD_LK #include diff --git a/drivers/misc/mediatek/lcm/r63315_fhd_dsi_vdo_truly/Makefile b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_inx/Makefile old mode 100755 new mode 100644 similarity index 78% rename from drivers/misc/mediatek/lcm/r63315_fhd_dsi_vdo_truly/Makefile rename to drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_inx/Makefile index a2f2ce0452a..34ae5f74555 --- a/drivers/misc/mediatek/lcm/r63315_fhd_dsi_vdo_truly/Makefile +++ b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_inx/Makefile @@ -3,7 +3,7 @@ # include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += r63315_fhd_dsi_vdo_truly.o +obj-y += nt51021_inx_dsi_vdo_inx.o diff --git a/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_inx/nt51021_inx_dsi_vdo_inx.c b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_inx/nt51021_inx_dsi_vdo_inx.c new file mode 100644 index 00000000000..a2e40d33182 --- /dev/null +++ b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_inx/nt51021_inx_dsi_vdo_inx.c @@ -0,0 +1,521 @@ +#ifndef BUILD_LK + #include +#endif +#include "lcm_drv.h" + +#ifdef BUILD_LK + #include + #include +#elif defined(BUILD_UBOOT) +#else + #include + #include + #include +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (600) +#define FRAME_HEIGHT (1024) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF + +#define GPIO_LCD_PWR_EN (GPIO44 | 0x80000000) +#define GPIO_LCD_3V3_EN (GPIO83 | 0x80000000) +#define GPIO_LCD_RST (GPIO89 | 0x80000000) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +struct LCM_setting_table +{ + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void TC358768_DCS_write_1A_1P(unsigned char cmd, unsigned char para) +{ + unsigned int data_array[16]; + data_array[0] =(0x00001500 | (para<<24) | (cmd<<16)); + dsi_set_cmdq(data_array, 1, 1); +} + +static void TC358768_DCS_write_1A_0P(unsigned char cmd) +{ + unsigned int data_array[16]; + data_array[0]=(0x00000500 | (cmd<<16)); + dsi_set_cmdq(data_array, 1, 1); +} + +static void init_lcm_registers(void) +{ + TC358768_DCS_write_1A_1P(0x01,0x00); + MDELAY(20); + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); + TC358768_DCS_write_1A_1P(0x85,0x04); + TC358768_DCS_write_1A_1P(0x86,0x08); + TC358768_DCS_write_1A_1P(0x8C,0x8E); + TC358768_DCS_write_1A_1P(0xC5,0x2B); + TC358768_DCS_write_1A_1P(0xC7,0x2B); + TC358768_DCS_write_1A_1P(0x83,0xAA); + TC358768_DCS_write_1A_1P(0x84,0x11); + TC358768_DCS_write_1A_1P(0xA9,0x4B); + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); + TC358768_DCS_write_1A_1P(0xFD,0x5B); + TC358768_DCS_write_1A_1P(0xFA,0x14); + + TC358768_DCS_write_1A_1P(0x83,0xAA); + TC358768_DCS_write_1A_1P(0x84,0x11); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0xBB); + TC358768_DCS_write_1A_1P(0x84,0x22); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0xCC); + TC358768_DCS_write_1A_1P(0x84,0x33); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); +} + +static struct LCM_setting_table lcm_suspend_setting[] = +{ + {0x28, 0 , {}}, + {REGFLAG_DELAY, 10, {}}, + {0x10, 0 , {}}, + {REGFLAG_DELAY, 120, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } + +} + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dsi.mode = SYNC_EVENT_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;//SYNC_EVENT_VDO_MODE; + + // DSI + /* Command mode setting */ + //1 Three lane or Four lane + params->dsi.LANE_NUM = LCM_FOUR_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=FRAME_WIDTH*3; + + params->dsi.vertical_sync_active = 2; + params->dsi.vertical_backporch = 24; + params->dsi.vertical_frontporch = 35; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 2; + params->dsi.horizontal_backporch = 59; + params->dsi.horizontal_frontporch = 80; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + //1 Every lane speed + params->dsi.PLL_CLOCK = 156; //468;//495;//440; + // continuous clock + params->dsi.cont_clock = 1; + params->dsi.ssc_disable = 1; +} + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[NT51021][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[NT51021][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[NT51021][LK] %s\n", __func__); +#else + printk("[NT51021][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); + + init_lcm_registers(); + +#ifdef BUILD_LK + printf("[NT51021]lcm_init func:LK Austin nt51021 3rd inx lcm init ok!\n"); +#else + printk("[NT51021]lcm_init func:Kernel Austin nt51021 3rd inx lcm init ok!\n"); +#endif +} + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + data_array[0] =0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[NT51021][K] %s\n", __func__); +#else + printf("[NT51021][LK] %s\n", __func__); +#endif + lcd_power_en(0); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + + upmu_set_rg_vgp1_en(0x0); + MDELAY(10); + printk("[NT51021]lcm_suspend func:Kernel Austin nt51021 3rd inx lcm suspend ok!\n"); +} + +static void lcm_resume(void) +{ + init_lcm_registers(); + printk("[NT51021]lcm_init func:Kernel Austin nt51021 3rd inx lcm resume ok!\n"); +} + +static void lcm_resume_power(void) +{ +#ifdef BUILD_LK + printf("[NT51021][LK] %s\n", __func__); +#else + printk("[NT51021][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); +} + +static unsigned int lcm_compare_id(void) +{ + return 1; +} + +LCM_DRIVER nt51021_inx_dsi_vdo_inx_lcm_drv = +{ + .name = "nt51021_inx_dsi_vdo_inx_3rd", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .resume_power = lcm_resume_power, + .compare_id = lcm_compare_id, +}; + diff --git a/drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/Makefile b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_kd/Makefile old mode 100755 new mode 100644 similarity index 78% rename from drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/Makefile rename to drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_kd/Makefile index 18e319b3d07..b81bd2d004c --- a/drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/Makefile +++ b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_kd/Makefile @@ -3,7 +3,8 @@ # include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-y += ota7291_wxga_dsi_vdo.o +obj-y += nt51021_inx_dsi_vdo_kd.o + diff --git a/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_kd/nt51021_inx_dsi_vdo_kd.c b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_kd/nt51021_inx_dsi_vdo_kd.c new file mode 100644 index 00000000000..79d54febbc3 --- /dev/null +++ b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_kd/nt51021_inx_dsi_vdo_kd.c @@ -0,0 +1,518 @@ +#ifndef BUILD_LK + #include +#endif +#include "lcm_drv.h" + +#ifdef BUILD_LK + #include + #include +#elif defined(BUILD_UBOOT) +#else + #include + #include + #include +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (600) +#define FRAME_HEIGHT (1024) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF + +#define GPIO_LCD_PWR_EN (GPIO44 | 0x80000000) +#define GPIO_LCD_3V3_EN (GPIO83 | 0x80000000) +#define GPIO_LCD_RST (GPIO89 | 0x80000000) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +struct LCM_setting_table +{ + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void TC358768_DCS_write_1A_1P(unsigned char cmd, unsigned char para) +{ + unsigned int data_array[16]; + data_array[0] =(0x00001500 | (para<<24) | (cmd<<16)); + dsi_set_cmdq(data_array, 1, 1); +} + +static void TC358768_DCS_write_1A_0P(unsigned char cmd) +{ + unsigned int data_array[16]; + data_array[0]=(0x00000500 | (cmd<<16)); + dsi_set_cmdq(data_array, 1, 1); +} + +static void init_lcm_registers(void) +{ + TC358768_DCS_write_1A_1P(0x01,0x00); + MDELAY(20); + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); + TC358768_DCS_write_1A_1P(0x85,0x04); + TC358768_DCS_write_1A_1P(0x86,0x08); + TC358768_DCS_write_1A_1P(0x8C,0x8E); + TC358768_DCS_write_1A_1P(0xC5,0x2B); + TC358768_DCS_write_1A_1P(0xC7,0x2B); + TC358768_DCS_write_1A_1P(0x83,0xAA); + TC358768_DCS_write_1A_1P(0x84,0x11); + TC358768_DCS_write_1A_1P(0xA9,0x4B); + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); + TC358768_DCS_write_1A_1P(0xFD,0x5B); + TC358768_DCS_write_1A_1P(0xFA,0x14); + + TC358768_DCS_write_1A_1P(0x83,0xAA); + TC358768_DCS_write_1A_1P(0x84,0x11); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0xBB); + TC358768_DCS_write_1A_1P(0x84,0x22); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0xCC); + TC358768_DCS_write_1A_1P(0x84,0x33); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); +} + +static struct LCM_setting_table lcm_suspend_setting[] = +{ + {0x28, 0 , {}}, + {REGFLAG_DELAY, 10, {}}, + {0x10, 0 , {}}, + {REGFLAG_DELAY, 120, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } +} + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dsi.mode = SYNC_EVENT_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;//SYNC_EVENT_VDO_MODE; + + // DSI + /* Command mode setting */ + //1 Three lane or Four lane + params->dsi.LANE_NUM = LCM_FOUR_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=FRAME_WIDTH*3; + + params->dsi.vertical_sync_active = 2; + params->dsi.vertical_backporch = 24; + params->dsi.vertical_frontporch = 35; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 2; + params->dsi.horizontal_backporch = 59; + params->dsi.horizontal_frontporch = 80; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + //1 Every lane speed + params->dsi.PLL_CLOCK = 156; //468;//495;//440; + // continuous clock + params->dsi.cont_clock = 1; + params->dsi.ssc_disable = 1; +} + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[NT51021][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[NT51021][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[NT51021][LK] %s\n", __func__); +#else + printk("[NT51021][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); + + init_lcm_registers(); +#ifdef BUILD_LK + printf("[NT51021]lcm_init func:LK Austin nt51021 1st lcm init ok!\n"); +#else + printk("[NT51021]lcm_init func:Kernel Austin nt51021 1st lcm init ok!\n"); +#endif +} + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + data_array[0] =0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[NT51021][K] %s\n", __func__); +#else + printf("[NT51021][LK] %s\n", __func__); +#endif + lcd_power_en(0); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + + upmu_set_rg_vgp1_en(0x0); + MDELAY(10); + printk("[NT51021]lcm_suspend func:Kernel Austin nt51021 1st lcm suspend!\n"); +} + +static void lcm_resume(void) +{ + init_lcm_registers(); + printk("[NT51021]lcm_init func:Kernel Austin nt51021 1st lcm resume ok!\n"); +} + +static void lcm_resume_power(void) +{ +#ifdef BUILD_LK + printf("[NT51021][LK] %s\n", __func__); +#else + printk("[NT51021][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); +} + +static unsigned int lcm_compare_id(void) +{ + return 1; +} + +LCM_DRIVER nt51021_inx_dsi_vdo_kd_lcm_drv = +{ + .name = "nt51021_inx_dsi_vdo_kd", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .resume_power = lcm_resume_power, + .compare_id = lcm_compare_id, +}; + diff --git a/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_txd/Makefile b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_txd/Makefile new file mode 100644 index 00000000000..b14607c6587 --- /dev/null +++ b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_txd/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for misc devices that really don't fit anywhere else. +# +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += nt51021_inx_dsi_vdo_txd.o + + + + diff --git a/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_txd/nt51021_inx_dsi_vdo_txd.c b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_txd/nt51021_inx_dsi_vdo_txd.c new file mode 100644 index 00000000000..4c8ae5a91e1 --- /dev/null +++ b/drivers/misc/mediatek/lcm/nt51021_inx_dsi_vdo_txd/nt51021_inx_dsi_vdo_txd.c @@ -0,0 +1,516 @@ +#ifndef BUILD_LK + #include +#endif +#include "lcm_drv.h" + +#ifdef BUILD_LK + #include + #include +#elif defined(BUILD_UBOOT) +#else + #include + #include + #include +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (600) +#define FRAME_HEIGHT (1024) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF + +#define GPIO_LCD_PWR_EN (GPIO44 | 0x80000000) +#define GPIO_LCD_3V3_EN (GPIO83 | 0x80000000) +#define GPIO_LCD_RST (GPIO89 | 0x80000000) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +struct LCM_setting_table +{ + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void TC358768_DCS_write_1A_1P(unsigned char cmd, unsigned char para) +{ + unsigned int data_array[16]; + data_array[0] =(0x00001500 | (para<<24) | (cmd<<16)); + dsi_set_cmdq(data_array, 1, 1); +} + +static void TC358768_DCS_write_1A_0P(unsigned char cmd) +{ + unsigned int data_array[16]; + data_array[0]=(0x00000500 | (cmd<<16)); + dsi_set_cmdq(data_array, 1, 1); +} + +static void init_lcm_registers(void) +{ + TC358768_DCS_write_1A_1P(0x8f,0xa5); + MDELAY(20); + TC358768_DCS_write_1A_1P(0x01,0x00); + MDELAY(20); + TC358768_DCS_write_1A_1P(0x8f,0xa5); + MDELAY(20); + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); + TC358768_DCS_write_1A_1P(0x85,0x04); + TC358768_DCS_write_1A_1P(0x86,0x08); + TC358768_DCS_write_1A_1P(0x8C,0x8E); + TC358768_DCS_write_1A_1P(0xC5,0x2B); + TC358768_DCS_write_1A_1P(0xC7,0x2B); + TC358768_DCS_write_1A_1P(0x83,0xAA); + TC358768_DCS_write_1A_1P(0x84,0x11); + TC358768_DCS_write_1A_1P(0xA9,0x4B); + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); + TC358768_DCS_write_1A_1P(0xFD,0x5B); + TC358768_DCS_write_1A_1P(0xFA,0x14); + + TC358768_DCS_write_1A_1P(0x83,0xAA); + TC358768_DCS_write_1A_1P(0x84,0x11); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0xBB); + TC358768_DCS_write_1A_1P(0x84,0x22); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0xCC); + TC358768_DCS_write_1A_1P(0x84,0x33); + TC358768_DCS_write_1A_1P(0xC0,0x1F); + TC358768_DCS_write_1A_1P(0xC1,0x22); + TC358768_DCS_write_1A_1P(0xC2,0x2E); + TC358768_DCS_write_1A_1P(0xC3,0x3B); + TC358768_DCS_write_1A_1P(0xC4,0x44); + TC358768_DCS_write_1A_1P(0xC5,0x4D); + TC358768_DCS_write_1A_1P(0xC6,0x54); + TC358768_DCS_write_1A_1P(0xC7,0x5B); + TC358768_DCS_write_1A_1P(0xC8,0x61); + TC358768_DCS_write_1A_1P(0xC9,0xD0); + TC358768_DCS_write_1A_1P(0xCA,0xD2); + TC358768_DCS_write_1A_1P(0xCB,0xEE); + TC358768_DCS_write_1A_1P(0xCC,0xFB); + TC358768_DCS_write_1A_1P(0xCD,0x0B); + TC358768_DCS_write_1A_1P(0xCE,0x0F); + TC358768_DCS_write_1A_1P(0xCF,0x11); + TC358768_DCS_write_1A_1P(0xD0,0x13); + TC358768_DCS_write_1A_1P(0xD1,0x21); + TC358768_DCS_write_1A_1P(0xD2,0x33); + TC358768_DCS_write_1A_1P(0xD3,0x4D); + TC358768_DCS_write_1A_1P(0xD4,0x53); + TC358768_DCS_write_1A_1P(0xD5,0xB3); + TC358768_DCS_write_1A_1P(0xD6,0xB9); + TC358768_DCS_write_1A_1P(0xD7,0xBF); + TC358768_DCS_write_1A_1P(0xD8,0xC5); + TC358768_DCS_write_1A_1P(0xD9,0xCE); + TC358768_DCS_write_1A_1P(0xDA,0xD8); + TC358768_DCS_write_1A_1P(0xDB,0xE3); + TC358768_DCS_write_1A_1P(0xDC,0xF1); + TC358768_DCS_write_1A_1P(0xDD,0xFF); + TC358768_DCS_write_1A_1P(0xDE,0xF0); + TC358768_DCS_write_1A_1P(0xDF,0x2F); + TC358768_DCS_write_1A_1P(0xE0,0x20); + TC358768_DCS_write_1A_1P(0xE1,0x23); + TC358768_DCS_write_1A_1P(0xE2,0x30); + TC358768_DCS_write_1A_1P(0xE3,0x3E); + TC358768_DCS_write_1A_1P(0xE4,0x46); + TC358768_DCS_write_1A_1P(0xE5,0x4E); + TC358768_DCS_write_1A_1P(0xE6,0x57); + TC358768_DCS_write_1A_1P(0xE7,0x5E); + TC358768_DCS_write_1A_1P(0xE8,0x64); + TC358768_DCS_write_1A_1P(0xE9,0xD7); + TC358768_DCS_write_1A_1P(0xEA,0xDA); + TC358768_DCS_write_1A_1P(0xEB,0xF8); + TC358768_DCS_write_1A_1P(0xEC,0x07); + TC358768_DCS_write_1A_1P(0xED,0x16); + TC358768_DCS_write_1A_1P(0xEE,0x1B); + TC358768_DCS_write_1A_1P(0xEF,0x1D); + TC358768_DCS_write_1A_1P(0xF0,0x23); + TC358768_DCS_write_1A_1P(0xF1,0x32); + TC358768_DCS_write_1A_1P(0xF2,0x44); + TC358768_DCS_write_1A_1P(0xF3,0x61); + TC358768_DCS_write_1A_1P(0xF4,0x67); + TC358768_DCS_write_1A_1P(0xF5,0xBB); + TC358768_DCS_write_1A_1P(0xF6,0xC2); + TC358768_DCS_write_1A_1P(0xF7,0xCB); + TC358768_DCS_write_1A_1P(0xF8,0xD1); + TC358768_DCS_write_1A_1P(0xF9,0xDA); + TC358768_DCS_write_1A_1P(0xFA,0xE4); + TC358768_DCS_write_1A_1P(0xFB,0xEE); + TC358768_DCS_write_1A_1P(0xFC,0xFD); + TC358768_DCS_write_1A_1P(0xFD,0xFF); + TC358768_DCS_write_1A_1P(0xFE,0xF8); + TC358768_DCS_write_1A_1P(0xFF,0x2F); + + TC358768_DCS_write_1A_1P(0x83,0x00); + TC358768_DCS_write_1A_1P(0x84,0x00); + TC358768_DCS_write_1A_1P(0x8f,0x00); + MDELAY(10); +} + +static struct LCM_setting_table lcm_suspend_setting[] = +{ + {0x28, 0 , {}}, + {REGFLAG_DELAY, 10, {}}, + {0x10, 0 , {}}, + {REGFLAG_DELAY, 120, {}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + for(i = 0; i < count; i++) { + unsigned cmd; + cmd = table[i].cmd; + switch (cmd) { + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + case REGFLAG_END_OF_TABLE : + break; + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } +} + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + params->dsi.mode = SYNC_EVENT_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;//SYNC_EVENT_VDO_MODE; + + // DSI + /* Command mode setting */ + //1 Three lane or Four lane + params->dsi.LANE_NUM = LCM_FOUR_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=FRAME_WIDTH*3; + + params->dsi.vertical_sync_active = 2; + params->dsi.vertical_backporch = 24; + params->dsi.vertical_frontporch = 35; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 2; + params->dsi.horizontal_backporch = 59; + params->dsi.horizontal_frontporch = 80; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + //1 Every lane speed + params->dsi.PLL_CLOCK = 156; //468;//495;//440; + // continuous clock + params->dsi.cont_clock = 1; + params->dsi.ssc_disable = 1; +} + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[NT51021][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[NT51021][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[NT51021][LK] %s\n", __func__); +#else + printk("[NT51021][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); + + init_lcm_registers(); + +#ifdef BUILD_LK + printf("[NT51021]lcm_init func:LK Austin nt51021 4th txd lcm init ok!\n"); +#else + printk("[NT51021]lcm_init func:Kernel Austin nt51021 4th txd lcm init ok!\n"); +#endif +} + +static void lcm_suspend(void) +{ + unsigned int data_array[16]; + data_array[0] =0x00100500; + dsi_set_cmdq(data_array, 1, 1); + MDELAY(120); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[NT51021][K] %s\n", __func__); +#else + printf("[NT51021][LK] %s\n", __func__); +#endif + lcd_power_en(0); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + + upmu_set_rg_vgp1_en(0x0); + MDELAY(10); + printk("[NT51021]lcm_suspend func:Kernel Austin nt51021 4th txd lcm suspend ok!\n"); +} + +static void lcm_resume(void) +{ + init_lcm_registers(); + printk("[NT51021]lcm_init func:Kernel Austin nt51021 4th txd lcm resume ok!\n"); +} + +static void lcm_resume_power(void) +{ +#ifdef BUILD_LK + printf("[NT51021][LK] %s\n", __func__); +#else + printk("[NT51021][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); +} + +static unsigned int lcm_compare_id(void) +{ + return 1; +} + +LCM_DRIVER nt51021_inx_dsi_vdo_txd_lcm_drv = +{ + .name = "nt51021_inx_dsi_vdo_txd_4th", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .resume_power = lcm_resume_power, + .compare_id = lcm_compare_id, +}; + diff --git a/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_kd/Makefile b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_kd/Makefile new file mode 100644 index 00000000000..ca8afa04e0e --- /dev/null +++ b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_kd/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for misc devices that really don't fit anywhere else. +# +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += ota7290b_auo_dsi_vdo_kd.o + + + + diff --git a/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_kd/ota7290b_auo_dsi_vdo_kd.c b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_kd/ota7290b_auo_dsi_vdo_kd.c new file mode 100644 index 00000000000..7a468ffc984 --- /dev/null +++ b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_kd/ota7290b_auo_dsi_vdo_kd.c @@ -0,0 +1,285 @@ +#ifndef BUILD_LK + #include +#endif +#include "lcm_drv.h" + +#ifdef BUILD_LK + #include + #include +#elif defined(BUILD_UBOOT) +#else + #include + #include + #include +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (600) +#define FRAME_HEIGHT (1024) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF + +#define GPIO_LCD_PWR_EN (GPIO44 | 0x80000000) +#define GPIO_LCD_3V3_EN (GPIO83 | 0x80000000) +#define GPIO_LCD_RST (GPIO89 | 0x80000000) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +struct LCM_setting_table +{ + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } +} + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static struct LCM_setting_table lcm_initialization_setting[] = +{ + {0x11, 0, { }}, + {REGFLAG_DELAY, 120, { }}, + {0x29, 0, { }}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, { }}, +}; + +static struct LCM_setting_table lcm_suspend_setting[] = +{ + {0x28, 0 , { }}, + {REGFLAG_DELAY, 20, { }}, + {0x10, 0 , { }}, + {REGFLAG_DELAY, 120, { }}, + {REGFLAG_END_OF_TABLE, 0x00, { }} +}; + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dsi.mode = BURST_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;//SYNC_EVENT_VDO_MODE; + + // DSI + /* Command mode setting */ + //1 Three lane or Four lane + params->dsi.LANE_NUM = LCM_FOUR_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=FRAME_WIDTH*3; + + params->dsi.vertical_sync_active = 2; + params->dsi.vertical_backporch = 3; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 24; + params->dsi.horizontal_backporch = 36; + params->dsi.horizontal_frontporch = 20; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + //1 Every lane speed + params->dsi.PLL_CLOCK = 134; + params->dsi.ssc_disable = 1; //1:disable ssc , 0:enable ssc + //params->dsi.cont_clock = 1; // continuous clock +} + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[OTA7290B][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[OTA7290B][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[OTA7290B][LK] %s\n", __func__); +#else + printk("[OTA7290B][K] %s\n", __func__); +#endif + + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +#ifdef BUILD_LK + printf("[OTA7290B]lcm_init func:LK Austin ota7290b lcm init ok!\n"); +#else + printk("[OTA7290B]lcm_init func:Kernel Austin ota7290b lcm init ok!\n"); +#endif +} + +static void lcm_suspend(void) +{ + push_table(lcm_suspend_setting, sizeof(lcm_suspend_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[OTA7290B][K] %s\n", __func__); +#else + printf("[OTA7290B][LK] %s\n", __func__); +#endif + lcd_power_en(0); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + + upmu_set_rg_vgp1_en(0x0); + MDELAY(10); + printk("[OTA7290B]lcm_suspend func:Kernel Austin ota7290b AUO lcm suspend ok!\n"); +} + +static void lcm_resume(void) +{ + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + printk("[OTA7290B]lcm_init func:Kernel Austin ota7290b auo lcm resume ok!\n"); +} + +static void lcm_resume_power(void) +{ +#ifdef BUILD_LK + printf("[OTA7290B][LK] %s\n", __func__); +#else + printk("[OTA7290B][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); +} + +static unsigned int lcm_compare_id(void) +{ + return 1; +} + +LCM_DRIVER ota7290b_auo_dsi_vdo_kd_lcm_drv = +{ + .name = "ota7290b_auo_dsi_vdo_kd", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .resume_power = lcm_resume_power, + .compare_id = lcm_compare_id, +}; + diff --git a/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_tpv/Makefile b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_tpv/Makefile new file mode 100644 index 00000000000..528cc26774d --- /dev/null +++ b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_tpv/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for misc devices that really don't fit anywhere else. +# +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += ota7290b_auo_dsi_vdo_tpv.o + + + + diff --git a/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_tpv/ota7290b_auo_dsi_vdo_tpv.c b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_tpv/ota7290b_auo_dsi_vdo_tpv.c new file mode 100644 index 00000000000..a12292fab40 --- /dev/null +++ b/drivers/misc/mediatek/lcm/ota7290b_auo_dsi_vdo_tpv/ota7290b_auo_dsi_vdo_tpv.c @@ -0,0 +1,533 @@ +#ifndef BUILD_LK +#include +#endif +#include "lcm_drv.h" + +#ifdef BUILD_LK +#include +#include +#elif defined(BUILD_UBOOT) +#else +#include +#include +#include +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (600) +#define FRAME_HEIGHT (1024) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF + +#define GPIO_LCD_PWR_EN (GPIO44 | 0x80000000) +#define GPIO_LCD_3V3_EN (GPIO83 | 0x80000000) +#define GPIO_LCD_RST (GPIO89 | 0x80000000) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +struct LCM_setting_table +{ + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + + for(i = 0; i < count; i++) { + unsigned cmd; + + cmd = table[i].cmd; + switch (cmd) { + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + case REGFLAG_END_OF_TABLE : + break; + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } +} + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static struct LCM_setting_table lcm_initialization_setting[] = +{ + {0xB0, 1 , {0x5A}}, + {0xB1, 1 , {0x00}}, + {0x89, 1 , {0x01}}, + {0x91, 1 , {0x17}}, + + {0xB1, 1 , {0x03}}, + {0x2C, 1 , {0x28}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1 , {0xAB}}, + {0x01, 1 , {0x15}}, + {0x02, 1 , {0x00}}, + {0x03, 1 , {0x00}}, + {0x04, 1 , {0x00}}, + {0x05, 1 , {0x00}}, + {0x06, 1 , {0x00}}, + {0x07, 1 , {0x00}}, + {0x08, 1 , {0x00}}, + {0x09, 1 , {0xBF}}, + {0x0A, 1 , {0x1F}}, + {0x0B, 1 , {0x77}}, + {0x0C, 1 , {0x00}}, + {0x0D, 1 , {0x00}}, + {0x0E, 1 , {0xC4}}, + {0x0F, 1 , {0x0D}}, + {0x10, 1 , {0x05}}, + {0x11, 1 , {0x00}}, + {0x12, 1 , {0x70}}, + {0x13, 1 , {0x01}}, + {0x14, 1 , {0xE3}}, + {0x15, 1 , {0xFF}}, + {0x16, 1 , {0x3D}}, + {0x17, 1 , {0x0E}}, + {0x18, 1 , {0x01}}, + {0x19, 1 , {0x00}}, + {0x1A, 1 , {0x00}}, + {0x1B, 1 , {0xFC}}, + {0x1C, 1 , {0x0B}}, + {0x1D, 1 , {0xA0}}, + {0x1E, 1 , {0x03}}, + {0x1F, 1 , {0x04}}, + {0x20, 1 , {0x0C}}, + {0x21, 1 , {0x00}}, + {0x22, 1 , {0x04}}, + {0x23, 1 , {0x81}}, + {0x24, 1 , {0x1F}}, + {0x25, 1 , {0x10}}, + {0x26, 1 , {0x9B}}, + {0x2D, 1 , {0x01}}, + {0x2E, 1 , {0x84}}, + {0x2F, 1 , {0x00}}, + {0x30, 1 , {0x02}}, + {0x31, 1 , {0x08}}, + {0x32, 1 , {0x01}}, + {0x33, 1 , {0x1C}}, + {0x34, 1 , {0x70}}, + {0x35, 1 , {0xFF}}, + {0x36, 1 , {0xFF}}, + {0x37, 1 , {0xFF}}, + {0x38, 1 , {0xFF}}, + {0x39, 1 , {0xFF}}, + {0x3A, 1 , {0x05}}, + {0x3B, 1 , {0x00}}, + {0x3C, 1 , {0x00}}, + {0x3D, 1 , {0x00}}, + {0x3E, 1 , {0x0F}}, + {0x3F, 1 , {0x8C}}, + {0x40, 1 , {0x28}}, + {0x41, 1 , {0xFC}}, + {0x42, 1 , {0x01}}, + {0x43, 1 , {0x40}}, + {0x44, 1 , {0x05}}, + {0x45, 1 , {0xE8}}, + {0x46, 1 , {0x16}}, + {0x47, 1 , {0x00}}, + {0x48, 1 , {0x00}}, + {0x49, 1 , {0x88}}, + {0x4A, 1 , {0x08}}, + {0x4B, 1 , {0x05}}, + {0x4C, 1 , {0x03}}, + {0x4D, 1 , {0xD0}}, + {0x4E, 1 , {0x13}}, + {0x4F, 1 , {0xFF}}, + {0x50, 1 , {0x0A}}, + {0x51, 1 , {0x53}}, + {0x52, 1 , {0x26}}, + {0x53, 1 , {0x22}}, + {0x54, 1 , {0x09}}, + {0x55, 1 , {0x22}}, + {0x56, 1 , {0x00}}, + {0x57, 1 , {0x1C}}, + {0x58, 1 , {0x03}}, + {0x59, 1 , {0x3F}}, + {0x5A, 1 , {0x28}}, + {0x5B, 1 , {0x01}}, + {0x5C, 1 , {0xCC}}, + {0x5D, 1 , {0x21}}, + {0x5E, 1 , {0x04}}, + {0x5F, 1 , {0xA1}}, + {0x60, 1 , {0x14}}, + {0x61, 1 , {0x63}}, + {0x62, 1 , {0xCE}}, + {0x63, 1 , {0x41}}, + {0x64, 1 , {0xC8}}, + {0x65, 1 , {0x75}}, + {0x66, 1 , {0x08}}, + {0x67, 1 , {0x21}}, + {0x68, 1 , {0x88}}, + {0x69, 1 , {0x10}}, + {0x6A, 1 , {0x42}}, + {0x6B, 1 , {0x20}}, + {0x6C, 1 , {0x6B}}, + {0x6D, 1 , {0xB5}}, + {0x6E, 1 , {0xF6}}, + {0x6F, 1 , {0x5E}}, + {0x70, 1 , {0x8C}}, + {0x71, 1 , {0x5C}}, + {0x72, 1 , {0x87}}, + {0x73, 1 , {0x10}}, + {0x74, 1 , {0x02}}, + {0x75, 1 , {0x09}}, + {0x76, 1 , {0x00}}, + {0x77, 1 , {0x00}}, + {0x78, 1 , {0x0F}}, + {0x79, 1 , {0xE0}}, + {0x7A, 1 , {0x01}}, + {0x7B, 1 , {0xFF}}, + {0x7C, 1 , {0xFF}}, + {0x7D, 1 , {0x09}}, + {0x7E, 1 , {0x42}}, + {0x7F, 1 , {0xFE}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 1 , {0x02}}, + {REGFLAG_DELAY, 10, {}}, + + {0x00, 1 , {0xFF}}, + {0x01, 1 , {0x01}}, + {0x02, 1 , {0x00}}, + {0x03, 1 , {0x00}}, + {0x04, 1 , {0x00}}, + {0x05, 1 , {0x00}}, + {0x06, 1 , {0x00}}, + {0x07, 1 , {0x00}}, + {0x08, 1 , {0xC0}}, + {0x09, 1 , {0x00}}, + {0x0A, 1 , {0x00}}, + {0x0B, 1 , {0x14}}, + {0x0C, 1 , {0xE6}}, + {0x0D, 1 , {0x0D}}, + {0x0F, 1 , {0x00}}, + {0x10, 1 , {0x72}}, + {0x11, 1 , {0xC8}}, + {0x12, 1 , {0x1B}}, + {0x13, 1 , {0x44}}, + {0x14, 1 , {0x5A}}, + {0x15, 1 , {0x99}}, + {0x16, 1 , {0xB7}}, + {0x17, 1 , {0xA1}}, + {0x18, 1 , {0x8B}}, + {0x19, 1 , {0xBB}}, + {0x1A, 1 , {0xAB}}, + {0x1B, 1 , {0x0F}}, + {0x1C, 1 , {0xFF}}, + {0x1D, 1 , {0xFF}}, + {0x1E, 1 , {0xFF}}, + {0x1F, 1 , {0xFF}}, + {0x20, 1 , {0xFF}}, + {0x21, 1 , {0xFF}}, + {0x22, 1 , {0xFF}}, + {0x23, 1 , {0xFF}}, + {0x24, 1 , {0xFF}}, + {0x25, 1 , {0xFF}}, + {0x26, 1 , {0xFF}}, + {0x27, 1 , {0x1F}}, + {0x2C, 1 , {0xFF}}, + {0x2D, 1 , {0x07}}, + {0x33, 1 , {0x05}}, + {0x35, 1 , {0x7F}}, + {0x36, 1 , {0x04}}, + {0x38, 1 , {0x7F}}, + {0x3A, 1 , {0x80}}, + {0x3B, 1 , {0x01}}, + {0x3C, 1 , {0xC0}}, + {0x3D, 1 , {0x32}}, + {0x3E, 1 , {0x00}}, + {0x3F, 1 , {0x58}}, + {0x40, 1 , {0x06}}, + {0x41, 1 , {0x00}}, + {0x42, 1 , {0xCB}}, + {0x43, 1 , {0x00}}, + {0x44, 1 , {0x60}}, + {0x45, 1 , {0x09}}, + {0x46, 1 , {0x00}}, + {0x47, 1 , {0x00}}, + {0x48, 1 , {0xBB}}, + {0x49, 1 , {0xD2}}, + {0x4A, 1 , {0x01}}, + {0x4B, 1 , {0x00}}, + {0x4C, 1 , {0x10}}, + {0x4D, 1 , {0xC0}}, + {0x4E, 1 , {0x0F}}, + {0x4F, 1 , {0xF1}}, + {0x50, 1 , {0x78}}, + {0x51, 1 , {0x3A}}, + {0x52, 1 , {0x34}}, + {0x53, 1 , {0x59}}, + {0x54, 1 , {0x00}}, + {0x55, 1 , {0x03}}, + {0x56, 1 , {0x0C}}, + {0x57, 1 , {0x00}}, + {0x58, 1 , {0x00}}, + {0x59, 1 , {0xF0}}, + {0x5A, 1 , {0x7C}}, + {0x5B, 1 , {0x3E}}, + {0x5C, 1 , {0x9F}}, + {0x5D, 1 , {0x00}}, + {0x5E, 1 , {0x00}}, + {0x5F, 1 , {0x00}}, + {0x60, 1 , {0x60}}, + {0x61, 1 , {0x65}}, + {0x62, 1 , {0xB5}}, + {0x63, 1 , {0xB2}}, + {0x64, 1 , {0x02}}, + {0x65, 1 , {0x00}}, + {0x66, 1 , {0x00}}, + {0x67, 1 , {0x00}}, + {0x68, 1 , {0x98}}, + {0x69, 1 , {0x80}}, + {0x6A, 1 , {0x40}}, + {0x6B, 1 , {0x3C}}, + {0x6C, 1 , {0x3D}}, + {0x6D, 1 , {0x3D}}, + {0x6E, 1 , {0x3D}}, + {0x6F, 1 , {0x3D}}, + {0x70, 1 , {0x9F}}, + {0x71, 1 , {0xCF}}, + {0x72, 1 , {0x27}}, + {0x73, 1 , {0x00}}, + {0x74, 1 , {0x00}}, + {0x75, 1 , {0x00}}, + {0x76, 1 , {0x00}}, + {0x77, 1 , {0x00}}, + {0x78, 1 , {0x00}}, + {0x79, 1 , {0x00}}, + {0x7A, 1 , {0xAC}}, + {0x7B, 1 , {0xAC}}, + {0x7C, 1 , {0xAC}}, + {0x7D, 1 , {0xAC}}, + {0x7E, 1 , {0xAC}}, + {0x7F, 1 , {0x56}}, + {0x0B, 1 , {0x04}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 1 , {0x03}}, + {0x2C, 1 , {0x2C}}, + {REGFLAG_DELAY, 10, {}}, + + {0xB1, 1 , {0x00}}, + {0x89, 1 , {0x03}}, + {REGFLAG_END_OF_TABLE, 0x00, {}} +}; + +static struct LCM_setting_table lcm_suspend_setting[] = +{ + {0x28, 0 , { }}, + {REGFLAG_DELAY, 20, { }}, + {0x10, 0 , { }}, + {REGFLAG_DELAY, 120, { }}, + {REGFLAG_END_OF_TABLE, 0x00, { }} +}; + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dsi.mode = BURST_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;//SYNC_EVENT_VDO_MODE; + + // DSI + /* Command mode setting */ + //1 Three lane or Four lane + params->dsi.LANE_NUM = LCM_FOUR_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=FRAME_WIDTH*3; + + params->dsi.vertical_sync_active = 2; + params->dsi.vertical_backporch = 3; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 24; + params->dsi.horizontal_backporch = 36; + params->dsi.horizontal_frontporch = 20; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + //1 Every lane speed + params->dsi.PLL_CLOCK = 134; + params->dsi.ssc_disable = 1; //1:disable ssc , 0:enable ssc + //params->dsi.cont_clock = 1; // continuous clock +} + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[OTA7290B][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[OTA7290B][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + if (enabled) { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } else { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[OTA7290B][LK] %s\n", __func__); +#else + printk("[OTA7290B][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +#ifdef BUILD_LK + printf("[OTA7290B]lcm_init func:LK Austin ota7290b TPV lcm init ok!\n"); +#else + printk("[OTA7290B]lcm_init func:Kernel Austin ota7290b TPV lcm init ok!\n"); +#endif +} + +static void lcm_suspend(void) +{ + push_table(lcm_suspend_setting, sizeof(lcm_suspend_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[OTA7290B][K] %s\n", __func__); +#else + printf("[OTA7290B][LK] %s\n", __func__); +#endif + lcd_power_en(0); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + + upmu_set_rg_vgp1_en(0x0); + MDELAY(10); + printk("[OTA7290B]lcm_suspend func:Kernel Austin ota7290b TPV lcm suspend ok!\n"); +} + +static void lcm_resume(void) +{ + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + printk("[OTA7290B]lcm_init func:Kernel Austin ota7290b TPV lcm resume ok!\n"); +} + +static void lcm_resume_power(void) +{ +#ifdef BUILD_LK + printf("[OTA7290B][LK] %s\n", __func__); +#else + printk("[OTA7290B][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); +} + +static unsigned int lcm_compare_id(void) +{ + return 1; +} + +LCM_DRIVER ota7290b_auo_dsi_vdo_tpv_lcm_drv = +{ + .name = "ota7290b_auo_dsi_vdo_tpv", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .resume_power = lcm_resume_power, + .compare_id = lcm_compare_id, +}; + diff --git a/drivers/misc/mediatek/lcm/ota7290b_hsd_dsi_vdo_kd/Makefile b/drivers/misc/mediatek/lcm/ota7290b_hsd_dsi_vdo_kd/Makefile new file mode 100644 index 00000000000..c46ff90377d --- /dev/null +++ b/drivers/misc/mediatek/lcm/ota7290b_hsd_dsi_vdo_kd/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for misc devices that really don't fit anywhere else. +# +include $(srctree)/drivers/misc/mediatek/Makefile.custom + +obj-y += ota7290b_hsd_dsi_vdo_kd.o + + + + diff --git a/drivers/misc/mediatek/lcm/ota7290b_hsd_dsi_vdo_kd/ota7290b_hsd_dsi_vdo_kd.c b/drivers/misc/mediatek/lcm/ota7290b_hsd_dsi_vdo_kd/ota7290b_hsd_dsi_vdo_kd.c new file mode 100644 index 00000000000..3697a48a905 --- /dev/null +++ b/drivers/misc/mediatek/lcm/ota7290b_hsd_dsi_vdo_kd/ota7290b_hsd_dsi_vdo_kd.c @@ -0,0 +1,283 @@ +#ifndef BUILD_LK + #include +#endif +#include "lcm_drv.h" + +#ifdef BUILD_LK + #include + #include +#elif defined(BUILD_UBOOT) +#else + #include + #include + #include +#endif + +// --------------------------------------------------------------------------- +// Local Constants +// --------------------------------------------------------------------------- + +#define FRAME_WIDTH (600) +#define FRAME_HEIGHT (1024) + +#define REGFLAG_DELAY 0XFE +#define REGFLAG_END_OF_TABLE 0xFF + +#define GPIO_LCD_PWR_EN (GPIO44 | 0x80000000) +#define GPIO_LCD_3V3_EN (GPIO83 | 0x80000000) +#define GPIO_LCD_RST (GPIO89 | 0x80000000) + +// --------------------------------------------------------------------------- +// Local Variables +// --------------------------------------------------------------------------- + +static LCM_UTIL_FUNCS lcm_util = {0}; + +#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) +#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) +#define UDELAY(n) (lcm_util.udelay(n)) +#define MDELAY(n) (lcm_util.mdelay(n)) + +// --------------------------------------------------------------------------- +// Local Functions +// --------------------------------------------------------------------------- + +#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) +#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) +#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) +#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) +#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) +#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) + +#define LCM_DSI_CMD_MODE 0 + +// --------------------------------------------------------------------------- +// LCM Driver Implementations +// --------------------------------------------------------------------------- +struct LCM_setting_table +{ + unsigned char cmd; + unsigned char count; + unsigned char para_list[64]; +}; + +static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) +{ + unsigned int i; + for(i = 0; i < count; i++) { + + unsigned cmd; + cmd = table[i].cmd; + + switch (cmd) { + + case REGFLAG_DELAY : + MDELAY(table[i].count); + break; + + case REGFLAG_END_OF_TABLE : + break; + default: + dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); + } + } +} + +static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) +{ + memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); +} + +static struct LCM_setting_table lcm_initialization_setting[] = +{ + {0x11, 0, { }}, + {REGFLAG_DELAY, 120, { }}, + {0x29, 0, { }}, + {REGFLAG_DELAY, 20, {}}, + {REGFLAG_END_OF_TABLE, 0x00, { }}, +}; + +static struct LCM_setting_table lcm_suspend_setting[] = +{ + {0x28, 0 , { }}, + {REGFLAG_DELAY, 20, { }}, + {0x10, 0 , { }}, + {REGFLAG_DELAY, 120, { }}, + {REGFLAG_END_OF_TABLE, 0x00, { }} +}; + +static void lcm_get_params(LCM_PARAMS *params) +{ + memset(params, 0, sizeof(LCM_PARAMS)); + + params->type = LCM_TYPE_DSI; + + params->width = FRAME_WIDTH; + params->height = FRAME_HEIGHT; + + params->dsi.mode = BURST_VDO_MODE; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;//SYNC_EVENT_VDO_MODE; + + // DSI + /* Command mode setting */ + //1 Three lane or Four lane + params->dsi.LANE_NUM = LCM_FOUR_LANE; + //The following defined the fomat for data coming from LCD engine. + params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; + params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; + params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; + params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; + + // Highly depends on LCD driver capability. + // Not support in MT6573 + params->dsi.packet_size=256; + + // Video mode setting + params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage + + params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; + params->dsi.word_count=FRAME_WIDTH*3; + + params->dsi.vertical_sync_active = 2; + params->dsi.vertical_backporch = 3; + params->dsi.vertical_frontporch = 2; + params->dsi.vertical_active_line = FRAME_HEIGHT; + + params->dsi.horizontal_sync_active = 24; + params->dsi.horizontal_backporch = 36; + params->dsi.horizontal_frontporch = 20; + params->dsi.horizontal_active_pixel = FRAME_WIDTH; + + // Bit rate calculation + //1 Every lane speed + params->dsi.PLL_CLOCK = 134; + params->dsi.ssc_disable = 1; //1:disable ssc , 0:enable ssc + //params->dsi.cont_clock = 1; // continuous clock +} + +static void lcd_power_en(unsigned char enabled) +{ +#ifndef BUILD_LK + printk("[OTA7290B][K] %s : %s\n", __func__, enabled ? "on" : "off"); +#else + printf("[OTA7290B][LK] %s : %s\n", __func__, enabled ? "on" : "off"); +#endif + if (enabled) + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ONE); + } + else + { + mt_set_gpio_mode(GPIO_LCD_PWR_EN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_PWR_EN, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_PWR_EN, GPIO_OUT_ZERO); + } +} + +static void lcm_init(void) +{ +#ifdef BUILD_LK + printf("[OTA7290B][LK] %s\n", __func__); +#else + printk("[OTA7290B][K] %s\n", __func__); +#endif + + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); + + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + +#ifdef BUILD_LK + printf("[OTA7290B]lcm_init func:LK Austin ota7290b hsd lcm init ok!\n"); +#else + printk("[OTA7290B]lcm_init func:Kernel Austin ota7290b hsd lcm init ok!\n"); +#endif +} + +static void lcm_suspend(void) +{ + push_table(lcm_suspend_setting, sizeof(lcm_suspend_setting) / sizeof(struct LCM_setting_table), 1); +} + +static void lcm_suspend_power(void) +{ +#ifndef BUILD_LK + printk("[OTA7290B][K] %s\n", __func__); +#else + printf("[OTA7290B][LK] %s\n", __func__); +#endif + lcd_power_en(0); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + + upmu_set_rg_vgp1_en(0x0); + MDELAY(10); + printk("[OTA7290B]lcm_suspend func:Kernel Austin ota7290b HSD lcm suspend ok!\n"); +} + +static void lcm_resume(void) +{ + push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); + printk("[OTA7290B]lcm_init func:Kernel Austin ota7290b hsd lcm resume ok!\n"); +} + +static void lcm_resume_power(void) +{ +#ifdef BUILD_LK + printf("[OTA7290B][LK] %s\n", __func__); +#else + printk("[OTA7290B][K] %s\n", __func__); +#endif + upmu_set_rg_vgp1_vosel(0x7); + upmu_set_rg_vgp1_en(0x1); + MDELAY(20); + + mt_set_gpio_mode(GPIO_LCD_RST, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_LCD_RST, GPIO_DIR_OUT); + mt_set_gpio_out(GPIO_LCD_RST , GPIO_OUT_ONE); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ZERO); + MDELAY(10); + mt_set_gpio_out(GPIO_LCD_RST, GPIO_OUT_ONE); + MDELAY(20); + + lcd_power_en(1); + MDELAY(10); +} + +static unsigned int lcm_compare_id(void) +{ + return 1; +} + +LCM_DRIVER ota7290b_hsd_dsi_vdo_kd_lcm_drv = +{ + .name = "ota7290b_hsd_dsi_vdo_kd", + .set_util_funcs = lcm_set_util_funcs, + .get_params = lcm_get_params, + .init = lcm_init, + .suspend = lcm_suspend, + .suspend_power = lcm_suspend_power, + .resume = lcm_resume, + .resume_power = lcm_resume_power, + .compare_id = lcm_compare_id, +}; + diff --git a/drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/ota7291_wxga_dsi_vdo.c b/drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/ota7291_wxga_dsi_vdo.c deleted file mode 100644 index d40d1733791..00000000000 --- a/drivers/misc/mediatek/lcm/ota7291_wxga_dsi_vdo/ota7291_wxga_dsi_vdo.c +++ /dev/null @@ -1,398 +0,0 @@ -#ifdef BUILD_LK -#include -//Evan add -#include -#include -#include -//Evan add end -#else -#include -#endif - -#ifdef BUILD_LK -#include -#include -#else -#include -#include -#include -#endif -#include "lcm_drv.h" - -#ifdef BUILD_LK -#define TPS_I2C_BUS 0 -#define TPS_I2C_ID I2C2 -#define TPS_SLAVE_ADDR 0x74 -#define TPS_data_size 13 //1024 -const uint8_t e2prom_data[TPS_data_size] = {0xFA,0x3C,0x28,0x09,0x09,0x08,0x23,0x03,0x01,0x06,0x01,0x7D,0x7D}; -#endif - -// --------------------------------------------------------------------------- -// Local Constants -// --------------------------------------------------------------------------- -#define FRAME_WIDTH (800) -#define FRAME_HEIGHT (1280) - -#define REGFLAG_DELAY 0XFE -#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER - -#define LCM_ID 0x01 //KDT+AUO+OTA7291 -#define LCM_DSI_CMD_MODE 0 - -// --------------------------------------------------------------------------- -// Local Variables -// --------------------------------------------------------------------------- -static LCM_UTIL_FUNCS lcm_util = { - .set_gpio_out = NULL, -}; - -#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) -#define UDELAY(n) (lcm_util.udelay(n)) -#define MDELAY(n) (lcm_util.mdelay(n)) - -// --------------------------------------------------------------------------- -// Local Functions -// --------------------------------------------------------------------------- -#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) -#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) -#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) -#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) -#define read_reg lcm_util.dsi_read_reg() -#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) - -struct LCM_setting_table { - unsigned cmd; - unsigned char count; - unsigned char para_list[64]; -}; - -static struct LCM_setting_table lcm_initialization_setting[] = { - {0xd8,1,{0x66}}, - {0x19,18,{0x00,0x00,0xfc,0x51,0xf2,0x3f,0xff,0xf3,0x3f,0x91,0x00,0x00,0x00,0x1c,0xf8,0x1f,0x01,0xc3}}, - {0x19,18,{0x60,0x00,0x64,0xa0,0x10,0x0a,0x1e,0x1c,0x36,0x9c,0x10,0x09,0x3a,0x1e,0x80,0x91,0x02,0x3c}}, -}; - - -#ifdef BUILD_LK -/*----------------------------------------*/ -/*--------------TPS65640------------------*/ -static int tps65640_write_data(void) -{ - printf("Evan:%s\n",__func__); - int ret=0; - mt_i2c i2c = {0}; - i2c.id = TPS_I2C_ID; - i2c.addr = TPS_SLAVE_ADDR; - i2c.mode = ST_MODE; - i2c.speed = 100; - i2c.dma_en = 0; - - u8 buf1[TPS_data_size+1]; - buf1[0] = 0x00; - int i=0; - for(i=0;itype = LCM_TYPE_DSI; - params->width = FRAME_WIDTH; - params->height = FRAME_HEIGHT; - params->dsi.mode = SYNC_EVENT_VDO_MODE; //BURST_VDO_MODE;BURST_VDO_MODE; - - // DSI - /* Command mode setting */ - params->dsi.LANE_NUM = LCM_FOUR_LANE; - //The following defined the fomat for data coming from LCD engine. - params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; //LCM_DSI_FORMAT_RGB666; - - // Video mode setting - params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888; //LCM_PACKED_PS_18BIT_RGB666; - - params->dsi.vertical_sync_active = 4;//0; - params->dsi.vertical_backporch = 8;//23; - params->dsi.vertical_frontporch = 8; - params->dsi.vertical_active_line = FRAME_HEIGHT; - - params->dsi.horizontal_sync_active = 4;//0; - params->dsi.horizontal_backporch = 132;//160; - params->dsi.horizontal_frontporch = 24; //100;//160; - params->dsi.horizontal_active_pixel = FRAME_WIDTH; - - params->dsi.PLL_CLOCK = 260;//148; -} - - -static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) -{ - unsigned int i; - - for(i = 0; i < count; i++) { - unsigned cmd; - cmd = table[i].cmd; - - switch (cmd) { - case REGFLAG_DELAY : - MDELAY(table[i].count); - break; - - case REGFLAG_END_OF_TABLE : - break; - - default: - dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); - } - } - -} - -static void lcm_init(void) -{ - unsigned int data_array[16]; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, kernel", __func__); -#endif - - lcd_reset(0); - lcd_power_en(0); - lcd_power_en(1); - MDELAY(5); - mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ONE);//iml8881 bias - MDELAY(50); - lcd_reset(1); - MDELAY(15); - lcd_reset(0); - MDELAY(15); - lcd_reset(1); - MDELAY(15); - - push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); -} - - -static void lcm_suspend(void) -{ - unsigned int data_array[16]; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, kernel", __func__); -#endif - - lcd_reset(0); - MDELAY(5); - mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ZERO);//iml8881 bias - lcd_power_en(0); - MDELAY(10); -} - - -static void lcm_resume(void) -{ - unsigned int data_array[16]; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, kernel", __func__); -#endif - - lcm_init(); -} - -static unsigned int lcm_compare_id(void) -{ - unsigned int id1 = 0, id2 = 0, id = 0; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#endif - lcd_reset(0); - lcd_power_en(0); - lcd_power_en(1); - lcd_reset(1); - MDELAY(20); - lcd_reset(0); - MDELAY(20); - lcd_reset(1); - MDELAY(20); - - mt_set_gpio_mode(GPIO_HALL_2_PIN, GPIO_HALL_2_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_HALL_2_PIN, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_HALL_2_PIN, GPIO_PULL_DISABLE); - mt_set_gpio_mode(GPIO_HALL_1_PIN, GPIO_HALL_1_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_HALL_1_PIN, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_HALL_1_PIN, GPIO_PULL_DISABLE); - MDELAY(2); - - id1 = mt_get_gpio_in(GPIO_HALL_1_PIN); - id2 = mt_get_gpio_in(GPIO_HALL_2_PIN); - id = (id1<<1)|(id2); -#ifdef BUILD_LK - printf("KDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); -#else - printk("KDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); -#endif - lcd_reset(0); - lcd_power_en(0); - MDELAY(10); - return (LCM_ID == id)?1:0; -} - -LCM_DRIVER ota7291_wxga_dsi_vdo_lcm_drv = -{ - .name = "ota7291_wxga_dsi_vdo", - .set_util_funcs = lcm_set_util_funcs, - .get_params = lcm_get_params, - .init = lcm_init, - .suspend = lcm_suspend, - .resume = lcm_resume, - .compare_id = lcm_compare_id, -}; - - diff --git a/drivers/misc/mediatek/lcm/r63315_fhd_dsi_vdo_truly/r63315_fhd_dsi_vdo_truly.c b/drivers/misc/mediatek/lcm/r63315_fhd_dsi_vdo_truly/r63315_fhd_dsi_vdo_truly.c deleted file mode 100644 index 75973427325..00000000000 --- a/drivers/misc/mediatek/lcm/r63315_fhd_dsi_vdo_truly/r63315_fhd_dsi_vdo_truly.c +++ /dev/null @@ -1,477 +0,0 @@ -/**************************************************************************/ -/* */ -/* PRESENTATION */ -/* Copyright (c) 2013 JRD Communications, Inc. */ -/***************************************************************************/ -/* */ -/* This material is company confidential, cannot be reproduced in any */ -/* form without the written permission of JRD Communications, Inc. */ -/* */ -/*---------------------------------------------------------------------------*/ -/* Author : XIE Wei wei.xie@tcl.com */ -/*---------------------------------------------------------------------------*/ -/* Comments : driver ic: r63311 module: Truly */ -/* File :mediatek/custom/common/kernel/lcm/r63311_scribepro/r63311_scribepro.c -/* Labels : */ -/*=========================================================*/ -/* Modifications on Features list / Changes Request / Problems Report */ -/* date | author | Key | comment */ -/*---------|------------------|--------------------------|-------------------*/ -/*2013/05/09 | -/*========================================================*/ - -#ifndef BUILD_LK -#include -//#include -#endif -#include "lcm_drv.h" - -#ifdef BUILD_LK - #include -#elif defined(BUILD_UBOOT) - #include -#else - #include -#endif -// --------------------------------------------------------------------------- -// Local Constants -// --------------------------------------------------------------------------- -#define FRAME_WIDTH (1080) -#define FRAME_HEIGHT (1920) -#define REGFLAG_DELAY 0XFE -#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER - -#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) -#define SET_GPIO_OUT(n, v) (lcm_util.set_gpio_out((n), (v))) -#define UDELAY(n) (lcm_util.udelay(n)) -#define MDELAY(n) (lcm_util.mdelay(n)) - -// --------------------------------------------------------------------------- -// Local Functions -// --------------------------------------------------------------------------- -#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) -#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) -#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) -#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) -#define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd) -#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) - -//#define LCD_LDO_ENN_GPIO_PIN (GPIO_LCD_ENN) -//#define LCD_LDO_ENP_GPIO_PIN (GPIO_LCD_ENP) -#define LCD_LDO_ENN_GPIO_PIN (GPIO168) -#define LCD_LDO_ENP_GPIO_PIN (GPIO33) - - -static LCM_UTIL_FUNCS lcm_util = {0}; - - -struct LCM_setting_table { - unsigned cmd; - unsigned char count; - unsigned char para_list[64]; -}; - -// --------------------------------------------------------------------------- -// LCM Driver Implementations -// --------------------------------------------------------------------------- -static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) -{ - memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); -} - -static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) -{ - unsigned int i; - - for(i = 0; i < count; i++) { - unsigned cmd; - cmd = table[i].cmd; - switch (cmd) { - case REGFLAG_DELAY : - MDELAY(table[i].count); - break; - case REGFLAG_END_OF_TABLE : - break; - default: - dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); - } - } -} - -static void lcm_get_params(LCM_PARAMS *params) -{ - memset(params, 0, sizeof(LCM_PARAMS)); - params->type = LCM_TYPE_DSI; - params->width = FRAME_WIDTH; - params->height = FRAME_HEIGHT; - - params->dsi.mode = BURST_VDO_MODE; - - params->dsi.LANE_NUM = LCM_FOUR_LANE; - //The following defined the fomat for data coming from LCD engine. - params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB; - params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST; - params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB; - params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; - - params->dsi.packet_size=256; - - params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage - params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888; - params->dsi.word_count=1080*3; - - params->dsi.vertical_sync_active = 1; - params->dsi.vertical_backporch = 4; - params->dsi.vertical_frontporch = 3; - params->dsi.vertical_active_line = FRAME_HEIGHT; - - params->dsi.horizontal_sync_active = 3; - params->dsi.horizontal_backporch = 60; - params->dsi.horizontal_frontporch = 94; - params->dsi.horizontal_active_pixel = FRAME_WIDTH; - - // Bit rate calculation - params->dsi.PLL_CLOCK=494; -} - -static struct LCM_setting_table lcm_initialization_setting[] = { - /* - Note : - Data ID will depends on the following rule. - - count of parameters > 1 => Data ID = 0x39 - count of parameters = 1 => Data ID = 0x15 - count of parameters = 0 => Data ID = 0x05 - Structure Format : - {DCS command, count of parameters, {parameter list}} - {REGFLAG_DELAY, milliseconds of time, {}}, - ... - Setting ending by predefined flag - - {REGFLAG_END_OF_TABLE, 0x00, {}} - */ - - /* r63315 start */ - {0x11, 1, {0x00}}, - {REGFLAG_DELAY, 150, {}}, - {0xB0, 1, {0x04}}, - {0xB3, 6, {0x14,0x00,0x00,0x00,0x00,0x00}}, - {0xB6, 2, {0x3A,0xB3}}, - {0xB7, 1, {0x00}}, - {0xC0, 1, {0x33}}, - {0xC1, 34, {0x84,0x60,0x10,//0x84 - 0xEB,0xFF,0x6F,0xCE, - 0xFF,0xFF,0x17,0x12, - 0x58,0x73,0xAE,0x31, - 0x20,0xC6,0xFF,0xFF, - 0x1F,0xF3,0xFF,0x5F, - 0x10,0x10,0x10,0x10, - 0x00,0x62,0x01,0x22, - 0x22,0x01,0x00}}, - - {0xC2, 7, {0x31,0xF7,0x80,0x06,0x08,0x80,0x00}}, - {0xC3, 2, {0x00,0x00}}, - - {0xC4, 22, {0x70,0x00,0x00, - 0x00,0x00,0x00,0x00, - 0x00,0x00,0x0C,0x06, - 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, - 0x00,0x0C,0x06}}, - - {0xC6, 40, {0xC8,0x08,0x67, - 0x08,0x67,0x00,0x00, - 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, - 0x00,0x00,0x16,0x18, - 0x08,0xC8,0x08,0x67, - 0x08,0x67,0x00,0x00, - 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, - 0x00,0x00,0x16,0x18, - 0x08}}, - - {0xCB, 9, {0x31,0xFC,0x3F,0x8C,0x00,0x00,0x00,0x00,0xC0}}, - - {0xCC, 1, {0x0B}}, - - {0xD0, 10, {0x44,0x81,0xBB,0x5A,0xDA,0x4C,0x19,0x19,0x0C,0x00}}, - - {0xD3, 25, {0x1B,0x33,0xBB, - 0xBB,0xB3,0x33,0x33, - 0x33,0x00,0x01,0x00, - 0x00,0xD8,0xA0,0x0D, - 0x4C,0x4C,0x44,0x3B, - 0x22,0x73,0x07,0x3D, - 0xBF,0x00}}, - - {0xD5, 7, {0x06,0x00,0x00,0x01,0x10,0x01,0x10}}, - - {0xC7, 30, {0x09,0x0A,0x11, - 0x18,0x26,0x33,0x3E, - 0x50,0x38,0x42,0x52, - 0x60,0x67,0x6E,0x70, - 0x09,0x0A,0x11,0x18, - 0x26,0x33,0x3E,0x50, - 0x38,0x42,0x52,0x60, - 0x67,0x6E,0x70}}, - - {0xC8, 19, {0x01,0x00,0x00, - 0x00,0x00,0xFC,0x00, - 0x00,0x00,0x00,0x00, - 0xFC,0x00,0x00,0x00, - 0x00,0x00,0xFC,0x00}}, - - {0xDE, 6, {0x00,0xFF,0x07,0x10,0x00,0x73}}, - - {0x35, 1, {0x00}}, - - {0x29, 1, {0x00}}, - - {REGFLAG_DELAY, 80, {}}, - - {REGFLAG_END_OF_TABLE, 0x00, {}} - - /* r63315 end */ - -}; -static unsigned int lcd_id; -static void lcm_init(void) -{ -#ifdef BUILD_LK - printf("%s, %d,r63315 id = 0x%x\n",__FUNCTION__,__LINE__,lcd_id); -#endif - - lcm_util.set_gpio_mode(GPIO112, GPIO_MODE_00); - lcm_util.set_gpio_dir(GPIO112, GPIO_DIR_OUT); - lcm_util.set_gpio_pull_enable(GPIO112, GPIO_PULL_DISABLE); - - lcm_util.set_gpio_mode(LCD_LDO_ENP_GPIO_PIN, GPIO_MODE_00); - lcm_util.set_gpio_dir(LCD_LDO_ENP_GPIO_PIN, GPIO_DIR_OUT); - lcm_util.set_gpio_pull_enable(LCD_LDO_ENP_GPIO_PIN, GPIO_PULL_DISABLE); - - lcm_util.set_gpio_mode(LCD_LDO_ENN_GPIO_PIN, GPIO_MODE_00); - lcm_util.set_gpio_dir(LCD_LDO_ENN_GPIO_PIN, GPIO_DIR_OUT); - lcm_util.set_gpio_pull_enable(LCD_LDO_ENN_GPIO_PIN, GPIO_PULL_DISABLE); - - //SET_RESET_PIN(0); //for GPIO reset type reset low - lcm_util.set_gpio_out(GPIO112 , 0); //for GPIO reset type reset low - - MDELAY(5); - - SET_GPIO_OUT(LCD_LDO_ENP_GPIO_PIN , 1);//power on +5 - MDELAY(10); - SET_GPIO_OUT(LCD_LDO_ENN_GPIO_PIN , 1);//power on -5 - MDELAY(10); - - //SET_RESET_PIN(1);//rise edge for power on,for LCD idle current= 3.8mA - lcm_util.set_gpio_out(GPIO112, 1); //for LCD idle current= 3.8mA - - MDELAY(10); - - push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); - -} - -static void lcm_suspend(void) -{ - unsigned int data_array[16]; - - //SET_RESET_PIN(0);//Reset Low - lcm_util.set_gpio_mode(GPIO112, GPIO_MODE_00); - lcm_util.set_gpio_dir(GPIO112, GPIO_DIR_OUT); - lcm_util.set_gpio_pull_enable(GPIO112, GPIO_PULL_DISABLE); - lcm_util.set_gpio_out(GPIO112 , 0);//for LCD idle current= 3.8mA - - MDELAY(10); - - //SET_RESET_PIN(1); - lcm_util.set_gpio_out(GPIO112 , 1);//for LCD idle current= 3.8mA - - MDELAY(10); - - //data_array[0] = 0x00280500; -// dsi_set_cmdq(data_array, 1, 1); -// MDELAY(10); - -// data_array[0] = 0x00100500; -// dsi_set_cmdq(data_array, 1, 1); -// MDELAY(120);//delay more for 3 frames time 17*3=54ms - - data_array[0] = 0x04B02900; - dsi_set_cmdq(data_array, 1, 1); - -// data_array[0] = 0x00000500; -// dsi_set_cmdq(data_array, 1, 1); - -// data_array[0] = 0x00000500; -// dsi_set_cmdq(data_array, 1, 1); - - data_array[0] = 0x01B12900;//Deep standby - dsi_set_cmdq(data_array, 1, 1); - MDELAY(20); - - SET_GPIO_OUT(LCD_LDO_ENN_GPIO_PIN , 0); - MDELAY(2); - SET_GPIO_OUT(LCD_LDO_ENP_GPIO_PIN , 0); - MDELAY(10); - - lcm_util.set_gpio_out(GPIO112 , 0); - -} - -static void lcm_resume(void) -{ -//#if defined(BUILD_LK) || defined(BUILD_UBOOT) - -//#else - lcm_init(); -//#endif - -} - -static int dummy_delay = 0; -static unsigned int lcm_esd_check(void) -{ - #ifndef BUILD_LK - unsigned int data_array[16]; - unsigned char buffer_0a; - unsigned char buffer_0e; - unsigned char buffer_05; - unsigned int retval = 0; - - dummy_delay ++; - - if (dummy_delay >=10000) - dummy_delay = 0; - - if(dummy_delay %2 == 0) - { - //printk("%s return 1\n",__FUNCTION__); - - data_array[0] = 0x00013700; - dsi_set_cmdq(data_array, 1, 1); - read_reg_v2(0x05,&buffer_05, 1); - - data_array[0] = 0x00013700; - dsi_set_cmdq(data_array, 1, 1); - read_reg_v2(0x0A,&buffer_0a, 1); - - data_array[0] = 0x00013700; - dsi_set_cmdq(data_array, 1, 1); - read_reg_v2(0x0E,&buffer_0e, 1); - - //printk("lcm_esd_check lcm 0x0A is %x-----------------\n", buffer_0a); - //printk("lcm_esd_check lcm 0x0E is %x-----------------\n", buffer_0e); - //printk("lcm_esd_check lcm 0x05 is %x-----------------\n", buffer_05); - - if ((buffer_0a==0x1C)&&((buffer_0e&0x01)==0x00)&&(buffer_05==0x00)){ - //printk("diablox_lcd lcm_esd_check done\n"); - retval = 0; - }else{ - //printk("diablox_lcd lcm_esd_check return true\n"); - retval = 1; - } - } - - return retval; - #endif -} - -static unsigned int lcm_esd_recover(void) -{ - //printk("%s \n",__FUNCTION__); - - lcm_resume(); - lcm_init(); - - return 1; -} - -#if 0 -static unsigned int lcm_compare_id(void) -{ - unsigned int hd_id=0; - unsigned int id=0; - unsigned char buffer[5]; - unsigned int array[16]; - int i; - #ifdef BUILD_LK - printf("%s\n", __func__); - #else - printk("%s\n", __func__); - #endif - - - lcm_util.set_gpio_mode(LCD_LDO_ENP_GPIO_PIN, GPIO_MODE_00); - lcm_util.set_gpio_dir(LCD_LDO_ENP_GPIO_PIN, GPIO_DIR_OUT); - lcm_util.set_gpio_pull_enable(LCD_LDO_ENP_GPIO_PIN, GPIO_PULL_DISABLE); - - lcm_util.set_gpio_mode(LCD_LDO_ENN_GPIO_PIN, GPIO_MODE_00); - lcm_util.set_gpio_dir(LCD_LDO_ENN_GPIO_PIN, GPIO_DIR_OUT); - lcm_util.set_gpio_pull_enable(LCD_LDO_ENN_GPIO_PIN, GPIO_PULL_DISABLE); - - SET_RESET_PIN(0); - - MDELAY(50); - - SET_GPIO_OUT(LCD_LDO_ENP_GPIO_PIN , 1);//power on +5 - MDELAY(2); - SET_GPIO_OUT(LCD_LDO_ENN_GPIO_PIN , 1);//power on -5 - MDELAY(100); - - SET_RESET_PIN(1); - - MDELAY(50); - - for(i=0;i<10;i++) - { - array[0] = 0x00053700;// read id return two byte,version and id - dsi_set_cmdq(array, 1, 1); - - read_reg_v2(0xBF, buffer, 5); - MDELAY(20); - lcd_id = (buffer[2] << 8 )| buffer[3]; - if (lcd_id == 0x3155) - break; - } - - mt_set_gpio_mode(GPIO_LCD_ID1,0); // gpio mode high - mt_set_gpio_pull_enable(GPIO_LCD_ID1,0); - mt_set_gpio_dir(GPIO_LCD_ID1,0); //input - hd_id = mt_get_gpio_in(GPIO_LCD_ID1);//should be - -#ifdef BUILD_LK - printf("%s, LK lcm_compare_id debug: R63315_ScribePro lcd_id = 0x%08x\n", __func__, lcd_id); - printf("%s, LK lcm_compare_id debug: R63315_ScribePro hd_id = 0x%08x\n", __func__, hd_id); -#else - printk("%s, kernel lcm_compare_id horse debug: R63315_ScribePro lcd_id = 0x%08x\n", __func__, lcd_id); - printk("%s, kernel lcm_compare_id horse debug: R63315_ScribePro hd_id = 0x%08x\n", __func__, hd_id); -#endif - - if (!hd_id) //1=>nt hw lcd;0=>truly hw lcd - { - if(lcd_id == 0x3315) - return 1; - else - return 0; - } - else - { - return 0; - } -} -#endif - -LCM_DRIVER r63315_fhd_dsi_vdo_truly_lcm_drv = -{ - .name = "r63315_fhd_dsi_vdo_truly", - .set_util_funcs = lcm_set_util_funcs, - .get_params = lcm_get_params, - .init = lcm_init, - .suspend = lcm_suspend, - .resume = lcm_resume, - //.compare_id = lcm_compare_id, - .esd_check = lcm_esd_check, - .esd_recover = lcm_esd_recover, -}; diff --git a/drivers/misc/mediatek/lcm/r63419_fhd_truly_phantom_2k_cmd_ok/r63419_fhd_truly_phantom_2k_cmd_ok.c b/drivers/misc/mediatek/lcm/r63419_fhd_truly_phantom_2k_cmd_ok/r63419_fhd_truly_phantom_2k_cmd_ok.c index b9b142c55a2..db6d676443b 100644 --- a/drivers/misc/mediatek/lcm/r63419_fhd_truly_phantom_2k_cmd_ok/r63419_fhd_truly_phantom_2k_cmd_ok.c +++ b/drivers/misc/mediatek/lcm/r63419_fhd_truly_phantom_2k_cmd_ok/r63419_fhd_truly_phantom_2k_cmd_ok.c @@ -124,6 +124,7 @@ static struct i2c_driver tps65132_iic_driver = { .id_table = tps65132_id, .probe = tps65132_probe, .remove = tps65132_remove, + //.detect = mt6605_detect, .driver = { .owner = THIS_MODULE, .name = "tps65132", diff --git a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c index 7e57ec228ff..84c5d7bb774 100644 --- a/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c +++ b/drivers/misc/mediatek/lcm/r63419_wqhd_truly_phantom_2k_cmd_ok/r63419_wqhd_truly_phantom_2k_cmd_ok.c @@ -124,6 +124,7 @@ static struct i2c_driver tps65132_iic_driver = { .id_table = tps65132_id, .probe = tps65132_probe, .remove = tps65132_remove, + //.detect = mt6605_detect, .driver = { .owner = THIS_MODULE, .name = "tps65132", diff --git a/drivers/misc/mediatek/lcm/r63423_wqhd_truly_phantom_2k_cmd_ok/r63423_wqhd_truly_phantom_2k_cmd_ok.c b/drivers/misc/mediatek/lcm/r63423_wqhd_truly_phantom_2k_cmd_ok/r63423_wqhd_truly_phantom_2k_cmd_ok.c index f167284ac18..388c20d6e3f 100644 --- a/drivers/misc/mediatek/lcm/r63423_wqhd_truly_phantom_2k_cmd_ok/r63423_wqhd_truly_phantom_2k_cmd_ok.c +++ b/drivers/misc/mediatek/lcm/r63423_wqhd_truly_phantom_2k_cmd_ok/r63423_wqhd_truly_phantom_2k_cmd_ok.c @@ -124,6 +124,7 @@ static struct i2c_driver tps65132_iic_driver = { .id_table = tps65132_id, .probe = tps65132_probe, .remove = tps65132_remove, + //.detect = mt6605_detect, .driver = { .owner = THIS_MODULE, .name = "tps65132", diff --git a/drivers/misc/mediatek/lcm/rm72013_wxga_dsi_vdo/rm72013_wxga_dsi_vdo.c b/drivers/misc/mediatek/lcm/rm72013_wxga_dsi_vdo/rm72013_wxga_dsi_vdo.c deleted file mode 100644 index 09da4f5348e..00000000000 --- a/drivers/misc/mediatek/lcm/rm72013_wxga_dsi_vdo/rm72013_wxga_dsi_vdo.c +++ /dev/null @@ -1,350 +0,0 @@ -#ifdef BUILD_LK -#include -//Evan add -#include -#include -#include -//Evan add end -#else -#include -#endif - -#ifdef BUILD_LK -#include -#include -#else -#include -#include -#include -#endif -#include "lcm_drv.h" - -// --------------------------------------------------------------------------- -// Local Constants -// --------------------------------------------------------------------------- -#define FRAME_WIDTH (800) -#define FRAME_HEIGHT (1280) - -#define REGFLAG_DELAY 0XFE -#define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER - -#define LCM_DSI_CMD_MODE 0 -#define LCM_ID 0x03 //DPT+AUO+Rm72013 - -// --------------------------------------------------------------------------- -// Local Variables -// --------------------------------------------------------------------------- -static LCM_UTIL_FUNCS lcm_util = { - .set_gpio_out = NULL, -}; - -#define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) -#define UDELAY(n) (lcm_util.udelay(n)) -#define MDELAY(n) (lcm_util.mdelay(n)) - -// --------------------------------------------------------------------------- -// Local Functions -// --------------------------------------------------------------------------- -#define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) -#define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) -#define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) -#define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) -#define read_reg lcm_util.dsi_read_reg() -#define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) - -struct LCM_setting_table { - unsigned cmd; - unsigned char count; - unsigned char para_list[64]; -}; - -static struct LCM_setting_table lcm_initialization_setting[] = { - {0x50,1,{0x77}}, - {0xE1,1,{0x66}}, - {0xDC,1,{0x67}}, - {0xD3,1,{0xC8}}, - {0x50,1,{0x00}}, - {0xF0,2,{0x5A,0x5A}}, - {0xF5,1,{0x96}}, - {0xC3,3,{0x40,0x00,0x28}}, - {REGFLAG_DELAY, 6, {}}, - {0x11,1,{}}, - {0x29,1,{}}, - {REGFLAG_DELAY, 200, {}}, - {REGFLAG_END_OF_TABLE, 0x00, {}} -}; - -static struct LCM_setting_table lcm_power_off_setting[] = { - {0x28,1,{}}, - {0x10,1,{}}, - {REGFLAG_DELAY, 5, {}}, - {0xF0,2,{0x5A,0x5A}}, - {0xC3,3,{0x40,0x00,0x20}}, - {REGFLAG_END_OF_TABLE, 0x00, {}} -}; - -static void lcd_power_en(unsigned char enabled) -{ - if (enabled) { -#ifdef BUILD_LK - upmu_set_rg_vgp1_vosel(0x7);//3.3V - upmu_set_rg_vgp1_en(0x1); - upmu_set_rg_vgp3_vosel(0x3);//1.8V - upmu_set_rg_vgp3_en(0x1); -#else - upmu_set_rg_vgp1_vosel(0x7);//3.3V - upmu_set_rg_vgp1_en(0x1); - upmu_set_rg_vgp3_vosel(0x3);//1.8V - upmu_set_rg_vgp3_en(0x1); -#endif - } else { -#ifdef BUILD_LK - upmu_set_rg_vgp1_en(0); - upmu_set_rg_vgp1_vosel(0); - upmu_set_rg_vgp3_en(0); - upmu_set_rg_vgp3_vosel(0); -#else - upmu_set_rg_vgp1_en(0); - upmu_set_rg_vgp1_vosel(0); - upmu_set_rg_vgp3_en(0); - upmu_set_rg_vgp3_vosel(0); -#endif - } -} - - -static void lcd_reset(unsigned char enabled) -{ - if (enabled) { - mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ONE); - } else { - mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ZERO); - } -} - -// --------------------------------------------------------------------------- -// LCM Driver Implementations -// --------------------------------------------------------------------------- -static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) -{ - memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); -} - - -static void lcm_get_params(LCM_PARAMS *params) -{ - memset(params, 0, sizeof(LCM_PARAMS)); - - params->type = LCM_TYPE_DSI; - params->width = FRAME_WIDTH; - params->height = FRAME_HEIGHT; - params->dsi.mode = SYNC_EVENT_VDO_MODE; //BURST_VDO_MODE;BURST_VDO_MODE; - - // DSI - /* Command mode setting */ - params->dsi.LANE_NUM = LCM_FOUR_LANE; - //The following defined the fomat for data coming from LCD engine. - params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; //LCM_DSI_FORMAT_RGB666; - - // Video mode setting - params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888; //LCM_PACKED_PS_18BIT_RGB666; - - params->dsi.vertical_sync_active = 4;//0; - params->dsi.vertical_backporch = 8;//23; - params->dsi.vertical_frontporch = 8; - params->dsi.vertical_active_line = FRAME_HEIGHT; - - params->dsi.horizontal_sync_active = 4;//0; - params->dsi.horizontal_backporch = 132;//160; - params->dsi.horizontal_frontporch = 24; //100;//160; - params->dsi.horizontal_active_pixel = FRAME_WIDTH; - - params->dsi.PLL_CLOCK = 250;//148; -} - -static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) -{ - unsigned int i; - - for(i = 0; i < count; i++) { - unsigned cmd; - cmd = table[i].cmd; - - switch (cmd) { - case REGFLAG_DELAY : - MDELAY(table[i].count); - break; - - case REGFLAG_END_OF_TABLE : - break; - - default: - dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); - } - } - -} - -static void lcm_init(void) -{ - unsigned int data_array[16]; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, kernel", __func__); -#endif - - lcd_reset(0); - lcd_power_en(0); - lcd_power_en(1); - MDELAY(5); - mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ONE);//iml8881 bias - MDELAY(50); - lcd_reset(1); - MDELAY(15); - lcd_reset(0); - MDELAY(15); - lcd_reset(1); - MDELAY(15); - - push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); -} - - -static void lcm_suspend(void) -{ - unsigned int data_array[16]; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, kernel", __func__); -#endif - - push_table(lcm_power_off_setting, sizeof(lcm_power_off_setting) / sizeof(struct LCM_setting_table), 1); - - lcd_reset(0); - mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ZERO);//iml8881 bias - lcd_power_en(0); - MDELAY(10); -} - - -static void lcm_resume(void) -{ - unsigned int data_array[16]; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, kernel", __func__); -#endif - - lcm_init(); -} -/* -static unsigned int lcm_esd_test = FALSE; - -static unsigned int lcm_esd_check(void) -{ - - #ifndef BUILD_LK - - char buffer[1]; - int array[4]; - int ret = 0; - - if(lcm_esd_test) - { - lcm_esd_test = FALSE; - return TRUE; - } - - array[0] = 0x00013700; - dsi_set_cmdq(array, 1, 1); - read_reg_v2(0x0A, buffer, 1); - //printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]); - if(buffer[0] != 0x9C) - { - // printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]); - ret++; - } - - // return TRUE: need recovery - // return FALSE: No need recovery - if(ret) - { - return TRUE; - } - else - { - return FALSE; - } - #endif -} - -static unsigned int lcm_esd_recover(void) -{ -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#else - printk("%s, KERNEL \n", __func__); -#endif - lcm_init(); - return TRUE; -} -*/ -static unsigned int lcm_compare_id(void) -{ - unsigned int id1 = 0, id2 = 0, id = 0; - -#ifdef BUILD_LK - printf("%s, LK \n", __func__); -#endif - lcd_reset(0); - lcd_power_en(0); - lcd_power_en(1); - lcd_reset(1); - MDELAY(20); - lcd_reset(0); - MDELAY(20); - lcd_reset(1); - MDELAY(20); - - mt_set_gpio_mode(GPIO_HALL_2_PIN, GPIO_HALL_2_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_HALL_2_PIN, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_HALL_2_PIN, GPIO_PULL_DISABLE); - mt_set_gpio_mode(GPIO_HALL_1_PIN, GPIO_HALL_1_PIN_M_GPIO); - mt_set_gpio_dir(GPIO_HALL_1_PIN, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_HALL_1_PIN, GPIO_PULL_DISABLE); - MDELAY(2); - - id1 = mt_get_gpio_in(GPIO_HALL_1_PIN); - id2 = mt_get_gpio_in(GPIO_HALL_2_PIN); - id = (id1<<1)|(id2); -#ifdef BUILD_LK - printf("DPT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); -#else - printk("DPT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); -#endif - lcd_reset(0); - lcd_power_en(0); - MDELAY(10); - return (LCM_ID == id)?1:0; -} - -LCM_DRIVER rm72013_wxga_dsi_vdo_lcm_drv = -{ - .name = "rm72013_wxga_dsi_vdo", - .set_util_funcs = lcm_set_util_funcs, - .get_params = lcm_get_params, - .init = lcm_init, - .suspend = lcm_suspend, - .resume = lcm_resume, - //.esd_check = lcm_esd_check, - //.esd_recover = lcm_esd_recover, - .compare_id = lcm_compare_id, -}; - - diff --git a/drivers/misc/mediatek/leds/mt8127/leds.c b/drivers/misc/mediatek/leds/mt8127/leds.c index 21e4798a653..352109139bc 100644 --- a/drivers/misc/mediatek/leds/mt8127/leds.c +++ b/drivers/misc/mediatek/leds/mt8127/leds.c @@ -45,15 +45,7 @@ static DEFINE_MUTEX(leds_pmic_mutex); * variables ***************************************************************************/ //struct cust_mt65xx_led* bl_setting_hal = NULL; - - /*[PLATFORM]-ADD-BEIGIN by falin.luo 2015/6/15*/ - /*hall sensor use bl_brightness_hal to detect system status*/ -#ifdef CONFIG_MTK_HALL -unsigned int bl_brightness_hal = 102; -#else static unsigned int bl_brightness_hal = 102; -#endif -/*[PLATFORM]-ADD-END by falin.luo 2015/6/15*/ static unsigned int bl_duty_hal = 21; static unsigned int bl_div_hal = CLK_DIV1; static unsigned int bl_frequency_hal = 32000; @@ -1414,12 +1406,16 @@ void mt_mt65xx_led_work(struct work_struct *work) mutex_unlock(&leds_mutex);; } +extern unsigned long DISP_GetLCMIndex(void); void mt_mt65xx_led_set(struct led_classdev *led_cdev, enum led_brightness level) { struct mt65xx_led_data *led_data = container_of(led_cdev, struct mt65xx_led_data, cdev); //unsigned long flags; //spin_lock_irqsave(&leds_lock, flags); + static int lcmindex = -1; + if(lcmindex==-1) + lcmindex = DISP_GetLCMIndex(); #ifdef CONFIG_MTK_AAL_SUPPORT if(led_data->level != level) @@ -1428,13 +1424,32 @@ void mt_mt65xx_led_set(struct led_classdev *led_cdev, enum led_brightness level) if(strcmp(led_data->cust.name,"lcd-backlight") != 0) { LEDS_DEBUG("[LED]Set NLED directly %d at time %lu\n",led_data->level,jiffies); - schedule_work(&led_data->work); + schedule_work(&led_data->work); } else { - LEDS_DEBUG("[LED]Set Backlight directly %d at time %lu\n",led_data->level,jiffies); - //mt_mt65xx_led_set_cust(&led_data->cust, led_data->level); - disp_aal_notify_backlight_changed( (((1 << MT_LED_INTERNAL_LEVEL_BIT_CNT) - 1)*level + 127)/255 ); + #ifndef CONFIG_AUSTIN_PROJECT + int a, b; + if(lcmindex==1) {/*TXD LCM*/ + //map 5~255 to 100 ~ 934 + a = 834; + b = 83; + //led_data->level = led_data->level*233/255; /*max led level = 233*/ + } else { + // map 5 ~255 to 100 ~1023 + a = 923; + b = 81; + } + LEDS_DEBUG("[LED]Set Backlight directly %d at time %lu\n(a=%i,b=%i)",led_data->level,jiffies, a, b); + //mt_mt65xx_led_set_cust(&led_data->cust, led_data->level); + if(led_data->level==0) + disp_aal_notify_backlight_changed(0); + else + disp_aal_notify_backlight_changed(((a*led_data->level)/250) + b); + #else + disp_aal_notify_backlight_changed( (((1 << MT_LED_INTERNAL_LEVEL_BIT_CNT) - 1)*level + 127)/255 ); + #endif +//(((1 << MT_LED_INTERNAL_LEVEL_BIT_CNT) - 1)*led_data->level + 127)/255 ); } } #else @@ -1462,8 +1477,9 @@ void mt_mt65xx_led_set(struct led_classdev *led_cdev, enum led_brightness level) } //spin_unlock_irqrestore(&leds_lock, flags); #endif +#ifdef CONFIG_MTK_AEE_AED aee_kernel_wdt_kick_Powkey_api("mt_mt65xx_led_set",WDT_SETBY_Backlight); - +#endif } int mt_mt65xx_blink_set(struct led_classdev *led_cdev, diff --git a/drivers/misc/mediatek/m4u/mt8127/m4u_priv.c b/drivers/misc/mediatek/m4u/mt8127/m4u_priv.c index b583670698a..490bd8ff6da 100644 --- a/drivers/misc/mediatek/m4u/mt8127/m4u_priv.c +++ b/drivers/misc/mediatek/m4u/mt8127/m4u_priv.c @@ -693,6 +693,12 @@ static long MTK_M4U_ioctl(struct file * a_pstFile, return -EFAULT; } + if (m4u_module.eModuleID >= M4U_CLNTMOD_MAX || m4u_module.eModuleID < 0) + return -EINVAL; + + if (m4u_module.MVAStart != 0 && m4u_module.MVAStart != -1) + return -EINVAL; + if(m4u_module.MVAStart == -1) //work around for wrap layer { m4u_module.MVAStart = m4u_user_v2p(m4u_module.BufAddr); @@ -773,6 +779,8 @@ static long MTK_M4U_ioctl(struct file * a_pstFile, M4UDBG("MTK_M4U_T_DEALLOC_MVA, eModuleID:%d, VABuf:0x%x, Length:%d, MVAStart=0x%x \r\n", m4u_module.eModuleID, m4u_module.BufAddr, m4u_module.BufSize, m4u_module.MVAStart); + if (m4u_module.eModuleID >= M4U_CLNTMOD_MAX || m4u_module.eModuleID < 0) + return -EINVAL; pMvaInfo = m4u_delete_from_garbage_list(&m4u_module, a_pstFile); @@ -817,6 +825,12 @@ static long MTK_M4U_ioctl(struct file * a_pstFile, return -EFAULT; } + if (m4u_module.eModuleID >= M4U_CLNTMOD_MAX || m4u_module.eModuleID < 0) + return -EINVAL; + + if (m4u_module.MVAStart != 0) + return -EINVAL; + { mva_info_t *pList = NULL; pList = m4u_alloc_garbage_list(0, @@ -861,6 +875,8 @@ static long MTK_M4U_ioctl(struct file * a_pstFile, } M4UDBG("MTK_M4U_T_DEALLOC_MVA_SEC, eModuleID:%d, VABuf:0x%x, Length:%d, MVAStart=0x%x \r\n", m4u_module.eModuleID, m4u_module.BufAddr, m4u_module.BufSize, m4u_module.MVAStart); + if (m4u_module.eModuleID >= M4U_CLNTMOD_MAX || m4u_module.eModuleID < 0) + return -EINVAL; pMvaInfo = m4u_delete_from_garbage_list(&m4u_module, a_pstFile); @@ -1023,6 +1039,10 @@ static long MTK_M4U_ioctl(struct file * a_pstFile, M4UMSG(" MTK_M4U_T_CONFIG_PORT, copy_from_user failed: %d \n", ret); return -EFAULT; } + + if (m4u_port.ePortID >= M4U_CLNTMOD_MAX || m4u_port.ePortID < 0) + return -EINVAL; + M4UDBG("ePortID=%d, Virtuality=%d, Security=%d, Distance=%d, Direction=%d \n", m4u_port.ePortID, m4u_port.Virtuality, m4u_port.Security, m4u_port.Distance, m4u_port.Direction); @@ -1284,10 +1304,16 @@ static int __m4u_dump_rs_info(unsigned int va[], unsigned int pa[], unsigned int static int m4u_dump_rs_info(int m4u_index) { - unsigned int m4u_base = gM4UBaseAddr[m4u_index]; + unsigned int m4u_base; int i; unsigned int va[MMU_TOTAL_RS_NR], pa[MMU_TOTAL_RS_NR], st[MMU_TOTAL_RS_NR]; + if (m4u_index < 0 && m4u_index > TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_index); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_index]; + for(i=0; i TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_index); + return IRQ_NONE; + } m4u_base = gM4UBaseAddr[m4u_index]; IntrSrc = M4U_ReadReg32(m4u_base, REG_MMU_FAULT_ST) & 0xFF; @@ -1608,9 +1638,14 @@ static int m4u_confirm_range_invalidated(int m4u_index, unsigned int MVAStart, u { unsigned int i; unsigned int regval; - unsigned int m4u_base = gM4UBaseAddr[m4u_index]; + unsigned int m4u_base; int result = 0; + if (m4u_index < 0 && m4u_index > TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_index); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_index]; M4ULOG("m4u_confirm_range_invalidated, idx=0x%x, MVAStart=0x%x, MVAEnd=0x%x \n", m4u_index, MVAStart, MVAEnd); @@ -1722,9 +1757,15 @@ static unsigned int m4u_get_pfh_descriptor(unsigned int m4u_base, int tlbIndex, static int m4u_search_main_invalid(int m4u_id) { unsigned int i=0; - unsigned int m4u_base = gM4UBaseAddr[m4u_id]; + unsigned int m4u_base; unsigned int mva;// des; + if (m4u_id < 0 && m4u_id > TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_id); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_id]; + M4UINFO("search main tlb=>\n"); for(i=0;i TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_id); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_id]; + M4UINFO("dump main tlb=======>\n"); for(i=0;i TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_id); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_id]; + M4UINFO("dump main tlb=======>\n"); for(i=0;i TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_id); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_id]; M4UINFO("dump pfh tags=======>\n"); for(i=0;i TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_id); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_id]; M4UINFO("dump main tlb=======>\n"); for(i=0;imvaStart = mvaStart; MMProfileLogEx(M4U_MMP_Events[PROFILE_ALLOC_MVA], MMProfileFlagEnd, mvaStart, BufSize); - M4UINFO("alloc_mva_dynamic: id=%s, addr=0x%08x, size=%d,sec=%d, mva=0x%x, mva_end=0x%x\n", + M4ULOG("alloc_mva_dynamic: id=%s, addr=0x%08x, size=%d,sec=%d, mva=0x%x, mva_end=0x%x\n", m4u_get_module_name(eModuleID), BufAddr, BufSize, security, pMvaInfo->mvaStart, pMvaInfo->mvaStart+BufSize-1); #if __M4U_MAP_MVA_TO_KERNEL_FOR_DEBUG__ @@ -2693,7 +2757,7 @@ int __m4u_dealloc_mva(M4U_MODULE_ID_ENUM eModuleID, int ret; - M4UINFO("m4u_dealloc_mva, module=%s, addr=0x%x, size=0x%x, MVA=0x%x, mva_end=0x%x\n", + M4ULOG("m4u_dealloc_mva, module=%s, addr=0x%x, size=0x%x, MVA=0x%x, mva_end=0x%x\n", m4u_get_module_name(eModuleID), BufAddr, BufSize, MVA, MVA+BufSize-1 ); @@ -2969,10 +3033,16 @@ int m4u_do_insert_seq_range(M4U_PORT_ID_ENUM eModuleID, int m4u_invalid_seq_range_by_mva(int m4u_index, unsigned int MVAStart, unsigned int MVAEnd) { unsigned int i; - unsigned int m4u_base = gM4UBaseAddr[m4u_index]; + unsigned int m4u_base; unsigned int m4u_index_offset = SEQ_RANGE_NUM*m4u_index; int ret=-1; + if (m4u_index < 0 && m4u_index > TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_index); + return ret; + } + m4u_base = gM4UBaseAddr[m4u_index]; + MVAStart &= ~M4U_SEQ_ALIGN_MSK; MVAEnd |= M4U_SEQ_ALIGN_MSK; @@ -3323,7 +3393,13 @@ int m4u_do_sync_nonsec_sec_pgtable(unsigned int mva, static void m4u_get_perf_counter(int m4u_index, M4U_PERF_COUNT *pM4U_perf_count) { - unsigned int m4u_base = gM4UBaseAddr[m4u_index]; + unsigned int m4u_base; + if (m4u_index < 0 && m4u_index > TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_index); + return; + } + m4u_base = gM4UBaseAddr[m4u_index]; + pM4U_perf_count->transaction_cnt= M4U_ReadReg32(m4u_base, REG_MMU_ACC_CNT); ///> Transaction access count pM4U_perf_count->main_tlb_miss_cnt= M4U_ReadReg32(m4u_base, REG_MMU_MAIN_MSCNT); ///> Main TLB miss count pM4U_perf_count->pfh_tlb_miss_cnt= M4U_ReadReg32(m4u_base, REG_MMU_PF_MSCNT); ///> Prefetch TLB miss count @@ -3333,7 +3409,13 @@ static void m4u_get_perf_counter(int m4u_index, M4U_PERF_COUNT *pM4U_perf_count) int m4u_do_monitor_start(int m4u_id) { - unsigned int m4u_base = gM4UBaseAddr[m4u_id]; + unsigned int m4u_base; + + if (m4u_id < 0 && m4u_id > TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_id); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_id]; M4ULOG("start monitor, id=%d \n", m4u_id); @@ -3357,7 +3439,13 @@ int m4u_do_monitor_start(int m4u_id) int m4u_do_monitor_stop(int m4u_id) { M4U_PERF_COUNT cnt; - unsigned int m4u_base = gM4UBaseAddr[m4u_id]; + unsigned int m4u_base; + + if (m4u_id < 0 && m4u_id > TOTAL_M4U_NUM) { + M4UMSG("error m4u id, error id is %d\n", m4u_id); + return -1; + } + m4u_base = gM4UBaseAddr[m4u_id]; M4ULOG("stop monitor, id=%d \n", m4u_id); @@ -3604,7 +3692,7 @@ static int m4u_get_pages(M4U_MODULE_ID_ENUM eModuleID, unsigned int BufAddr, uns *(pPhys+i) = m4u_user_v2p(va_align + 0x1000*i); } - M4UINFO("alloc_mva VM_PFNMAP module=%s, va=0x%x, size=0x%x, vm_flag=0x%x\n", + M4ULOG("alloc_mva VM_PFNMAP module=%s, va=0x%x, size=0x%x, vm_flag=0x%x\n", m4u_get_module_name(eModuleID), BufAddr, BufSize, vma->vm_flags); up_read(¤t->mm->mmap_sem); } diff --git a/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.c b/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.c index dc5e0f4a27b..beb310b9059 100644 --- a/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.c +++ b/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.c @@ -1,23 +1,13 @@ /***************************************************************************** * - * Copyright (c) 2013 mCube, Inc. All rights reserved. + * Copyright (c) 2013 mCube, Inc. * - * This source is subject to the mCube Software License. - * This software is protected by Copyright and the information and source code - * contained herein is confidential. The software including the source code - * may not be copied and the information contained herein may not be used or - * disclosed except with the written permission of mCube Inc. - * - * All other rights reserved. * * This code and information are provided "as is" without warranty of any * kind, either expressed or implied, including but not limited to the * implied warranties of merchantability and/or fitness for a * particular purpose. * - * The following software/firmware and/or related documentation ("mCube Software") - * have been modified by mCube Inc. All revisions are subject to any receiver's - * applicable license agreements with mCube Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and diff --git a/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.h b/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.h index b3669dbc69c..dd1d9450326 100644 --- a/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.h +++ b/drivers/misc/mediatek/magnetometer/mc41xx/mc41xx.h @@ -1,23 +1,13 @@ /***************************************************************************** * - * Copyright (c) 2013 mCube, Inc. All rights reserved. + * Copyright (c) 2013 mCube, Inc. * - * This source is subject to the mCube Software License. - * This software is protected by Copyright and the information and source code - * contained herein is confidential. The software including the source code - * may not be copied and the information contained herein may not be used or - * disclosed except with the written permission of mCube Inc. - * - * All other rights reserved. * * This code and information are provided "as is" without warranty of any * kind, either expressed or implied, including but not limited to the * implied warranties of merchantability and/or fitness for a * particular purpose. * - * The following software/firmware and/or related documentation ("mCube Software") - * have been modified by mCube Inc. All revisions are subject to any receiver's - * applicable license agreements with mCube Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and diff --git a/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.c b/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.c index 29031e2c807..8124fc10bdf 100644 --- a/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.c +++ b/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.c @@ -1,23 +1,13 @@ /***************************************************************************** * - * Copyright (c) 2013 mCube, Inc. All rights reserved. + * Copyright (c) 2013 mCube, Inc. * - * This source is subject to the mCube Software License. - * This software is protected by Copyright and the information and source code - * contained herein is confidential. The software including the source code - * may not be copied and the information contained herein may not be used or - * disclosed except with the written permission of mCube Inc. - * - * All other rights reserved. * * This code and information are provided "as is" without warranty of any * kind, either expressed or implied, including but not limited to the * implied warranties of merchantability and/or fitness for a * particular purpose. * - * The following software/firmware and/or related documentation ("mCube Software") - * have been modified by mCube Inc. All revisions are subject to any receiver's - * applicable license agreements with mCube Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and diff --git a/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.h b/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.h index 50691639acb..431d79104cb 100644 --- a/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.h +++ b/drivers/misc/mediatek/magnetometer/mc64xx/mc64xx.h @@ -1,23 +1,13 @@ /***************************************************************************** * - * Copyright (c) 2013 mCube, Inc. All rights reserved. + * Copyright (c) 2013 mCube, Inc. * - * This source is subject to the mCube Software License. - * This software is protected by Copyright and the information and source code - * contained herein is confidential. The software including the source code - * may not be copied and the information contained herein may not be used or - * disclosed except with the written permission of mCube Inc. - * - * All other rights reserved. * * This code and information are provided "as is" without warranty of any * kind, either expressed or implied, including but not limited to the * implied warranties of merchantability and/or fitness for a * particular purpose. * - * The following software/firmware and/or related documentation ("mCube Software") - * have been modified by mCube Inc. All revisions are subject to any receiver's - * applicable license agreements with mCube Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and diff --git a/drivers/misc/mediatek/masp/asf/core/sec_mod_core.c b/drivers/misc/mediatek/masp/asf/core/sec_mod_core.c index de6152670cc..debcc6d5317 100644 --- a/drivers/misc/mediatek/masp/asf/core/sec_mod_core.c +++ b/drivers/misc/mediatek/masp/asf/core/sec_mod_core.c @@ -262,9 +262,9 @@ long sec_core_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { return -EFAULT; } - + if (hevc_blk.len > HEVC_BLK_LEN) { - SMSG(TRUE, "[%s] eop block size is too large!", MOD); + SMSG(TRUE, "[%s] eop block size is too large!\n", MOD); return -EFAULT; } @@ -296,7 +296,7 @@ long sec_core_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } if (hevc_blk.len > HEVC_BLK_LEN) { - SMSG(TRUE, "[%s] dop block size is too large!", MOD); + SMSG(TRUE, "[%s] dop block size is too large!\n", MOD); return -EFAULT; } diff --git a/drivers/misc/mediatek/mmc-host/mt8127/mt_dump.c b/drivers/misc/mediatek/mmc-host/mt8127/mt_dump.c index f82504ae002..4dfd119fa8d 100644 --- a/drivers/misc/mediatek/mmc-host/mt8127/mt_dump.c +++ b/drivers/misc/mediatek/mmc-host/mt8127/mt_dump.c @@ -18,10 +18,6 @@ #include #include -#ifdef CONFIG_MTK_EMMC_SUPPORT -#include "partition_define.h" -#endif - #ifndef FPGA_PLATFORM #include #endif @@ -33,9 +29,6 @@ MODULE_LICENSE("GPL"); /*--------------------------------------------------------------------------*/ /* some marco will be reuse with mmc subsystem */ -#ifdef CONFIG_MTK_EMMC_SUPPORT -#include "partition_define.h" -#endif char test_kdump[]={6,5,8,2,'k','d','u','m','p','t','e','s','t'}; //============== #define TEST_SIZE (128*1024) @@ -1251,21 +1244,6 @@ static unsigned int simp_init_sd(void){ sd_init = 1; return ret; } -unsigned int reset_boot_up_device(int type){ - int ret = 0; - - if(type == MMC_TYPE_MMC) - ret = simp_init_emmc(); - else if(type == MMC_TYPE_SD) - ret = simp_init_sd(); - else{ - printk(KERN_EMERG "invalide card type: %d\n", type); - ret = 1; - } - - return ret; -} -EXPORT_SYMBOL(reset_boot_up_device); #define MSDC_FIFO_SZ (128) #define MSDC_FIFO_THD (64) // (128) #define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16) @@ -1610,7 +1588,7 @@ static int simp_mmc_init(int card_type,bool boot) /*--------------------------------------------------------------------------*/ /* porting for panic dump interface */ /*--------------------------------------------------------------------------*/ -#ifdef CONFIG_MTK_EMMC_SUPPORT +#if 0 static int simp_emmc_dump_write(unsigned char* buf, unsigned int len, unsigned int offset,unsigned int dev) { @@ -1795,160 +1773,7 @@ static int sd_dump_read(unsigned char* buf, unsigned int len, unsigned int offse return ret; } -int card_dump_func_write(unsigned char* buf, unsigned int len, unsigned long long offset, int dev) -{ - int ret = SIMP_FAILED; - - //local_irq_disable(); - //preempt_disable(); - unsigned int sec_offset = 0; - #if MTK_MMC_DUMP_DBG - printk(KERN_EMERG "card_dump_func_write len<%d> addr<%lld> type<%d>\n",len,offset,dev); - #endif - if(offset % 512){ - printk("Address isn't 512 alignment!\n"); - return SIMP_FAILED; - } - sec_offset = offset/512; - switch (dev){ - case DUMP_INTO_BOOT_CARD_IPANIC: - #ifdef CONFIG_MTK_EMMC_SUPPORT - ret = simp_emmc_dump_write(buf, len, (unsigned int)offset, dev); - #endif - break; - case DUMP_INTO_BOOT_CARD_KDUMP: - break; - case DUMP_INTO_EXTERN_CARD: - ret = simp_sd_dump_write(buf, len, sec_offset, dev); - break; - default: - printk("unknown card type, error!\n"); - break; - } - - return ret; -} -EXPORT_SYMBOL(card_dump_func_write); - extern int simple_sd_ioctl_rw(struct msdc_ioctl* msdc_ctl); -#ifdef CONFIG_MTK_EMMC_SUPPORT - -#define SD_FALSE -1 -#define SD_TRUE 0 -#define DEBUG_MMC_IOCTL 0 -static int emmc_dump_read(unsigned char* buf, unsigned int len, unsigned int offset,unsigned int slot) -{ - /* maybe delete in furture */ - struct msdc_ioctl msdc_ctl; - unsigned int i; - unsigned int l_user_begin_num = 0; - unsigned int l_dest_num = 0; - unsigned long long l_start_offset = 0; - unsigned int ret = SD_FALSE; - - if ((0 != slot) || (0 != offset % 512) || (0 != len % 512)) { - /* emmc always in slot0 */ - printk("debug: slot is not use for emmc!\n"); - return ret; - } - - /* find the offset in emmc */ - for (i = 0; i < PART_NUM; i++) { - //for (i = 0; i < 1; i++) { - if ('m' == *(PartInfo[i].name) && 'b' == *(PartInfo[i].name + 1) && - 'r' == *(PartInfo[i].name + 2)){ - l_user_begin_num = i; - } - - if ('e' == *(PartInfo[i].name) && 'x' == *(PartInfo[i].name + 1) && - 'p' == *(PartInfo[i].name + 2) && 'd' == *(PartInfo[i].name + 3) && - 'b' == *(PartInfo[i].name + 4)){ - l_dest_num = i; - } - } - -#if DEBUG_MMC_IOCTL - printk("l_user_begin_num = %d l_dest_num = %d\n",l_user_begin_num,l_dest_num); -#endif - - if (l_user_begin_num >= PART_NUM && l_dest_num >= PART_NUM) { - printk("not find in scatter file error!\n"); - return ret; - } - - if (PartInfo[l_dest_num].size < (len + offset)) { - printk("read operation oversize!\n"); - return ret; - } - -#if DEBUG_MMC_IOCTL - printk("read start address=0x%llx\n", PartInfo[l_dest_num].start_address - PartInfo[l_user_begin_num].start_address); -#endif - l_start_offset = offset + PartInfo[l_dest_num].start_address - PartInfo[l_user_begin_num].start_address; - - msdc_ctl.partition = 0; - msdc_ctl.iswrite = 0; - msdc_ctl.host_num = slot; - msdc_ctl.opcode = MSDC_CARD_DUNM_FUNC; - msdc_ctl.total_size = 512; - msdc_ctl.trans_type = 0; - for (i = 0; i < (len/512); i++) { - /* code */ - msdc_ctl.address = (l_start_offset >> 9) + i; //blk address - msdc_ctl.buffer =(u32*)(buf + i * 512); - -#if DEBUG_MMC_IOCTL - printk("l_start_offset = 0x%x\n", msdc_ctl.address); -#endif - msdc_ctl.result = simple_sd_ioctl_rw(&msdc_ctl); - } - -#if DEBUG_MMC_IOCTL - printk("read data:"); - for (i = 0; i < 32; i++) { - printk("0x%x", buf[i]); - if (0 == (i+1)%32) - printk("\n"); - } -#endif - return SD_TRUE; -} -#endif - -int card_dump_func_read(unsigned char* buf, unsigned int len, unsigned long long offset, int dev) -{ - -// unsigned int l_slot; - unsigned int ret = SIMP_FAILED; - unsigned int sec_offset = 0; - #if MTK_MMC_DUMP_DBG - printk(KERN_EMERG "card_dump_func_read len<%d> addr<%lld> type<%d>\n",len,offset,dev); - #endif - if(offset % 512){ - printk("Address isn't 512 alignment!\n"); - return SIMP_FAILED; - } - sec_offset = offset/512; - switch (dev){ - case DUMP_INTO_BOOT_CARD_IPANIC: - #ifdef CONFIG_MTK_EMMC_SUPPORT - ret = emmc_dump_read(buf, len, (unsigned int)offset, dev); - #endif - break; - case DUMP_INTO_BOOT_CARD_KDUMP: - break; - case DUMP_INTO_EXTERN_CARD: - ret = sd_dump_read(buf, len, sec_offset); - break; - default: - printk("unknown card type, error!\n"); - break; - } - return ret; - -} -EXPORT_SYMBOL(card_dump_func_read); - /*--------------------------------------------------------------------------*/ /* porting for kdump interface */ diff --git a/drivers/misc/mediatek/mmc-host/mt8127/mt_sd.h b/drivers/misc/mediatek/mmc-host/mt8127/mt_sd.h index bfbae4dfcbd..8ea46ef90fb 100644 --- a/drivers/misc/mediatek/mmc-host/mt8127/mt_sd.h +++ b/drivers/misc/mediatek/mmc-host/mt8127/mt_sd.h @@ -1250,6 +1250,7 @@ struct ot_work_t struct msdc_host { + struct device *dev; struct msdc_hw *hw; struct mmc_host *mmc; /* mmc structure */ @@ -1338,8 +1339,17 @@ struct msdc_host #ifdef SDIO_ERROR_BYPASS int sdio_error; /* sdio error can't recovery */ #endif + u32 crc_count; /* total crc count */ + u32 crc_invalid_count; /* total crc invalid count eg CMD19 */ + u32 req_count; /* total request count */ + u32 datatimeout_count; /* total data timeout count */ + u32 cmdtimeout_count; /* total cmd timeout count */ + u32 reqtimeout_count; /* total req timeout count */ + u32 pc_count; /* total power cycle count */ + u32 pc_suspend; /* suspend/resume count */ void (*power_control)(struct msdc_host *host,u32 on); void (*power_switch)(struct msdc_host *host,u32 on); + u32 inserted; /* total card detection cound */ }; typedef enum { TRAN_MOD_PIO, diff --git a/drivers/misc/mediatek/mmc-host/mt8127/mt_sd_misc.c b/drivers/misc/mediatek/mmc-host/mt8127/mt_sd_misc.c index 2dc1cb3e307..59d6089ff6a 100644 --- a/drivers/misc/mediatek/mmc-host/mt8127/mt_sd_misc.c +++ b/drivers/misc/mediatek/mmc-host/mt8127/mt_sd_misc.c @@ -40,13 +40,10 @@ #include #ifdef CONFIG_MTK_EMMC_SUPPORT -#include "partition_define.h" - -//extern struct excel_info PartInfoEmmc[PART_NUM]; - extern u32 g_emmc_mode_switch; #endif +#define PARTITION_NAME_LENGTH (64) #define DRV_NAME_MISC "misc-sd" #define DEBUG_MMC_IOCTL 0 @@ -107,8 +104,12 @@ extern int msdc_reinit(struct msdc_host *host); static int sd_ioctl_reinit(struct msdc_ioctl* msdc_ctl) { - struct msdc_host *host = msdc_get_host(MSDC_SD,0,0); - return msdc_reinit(host); + struct msdc_host *host = msdc_get_host(MSDC_SD,0,0); + if (NULL != host) { + return msdc_reinit(host); + } else { + return -EINVAL; + } } //#endif @@ -132,7 +133,12 @@ static int simple_sd_ioctl_single_rw(struct msdc_ioctl* msdc_ctl) struct mmc_command msdc_cmd; struct mmc_request msdc_mrq; struct msdc_host *host_ctl; - + + if(!msdc_ctl) + return -EINVAL; + if(msdc_ctl->total_size <= 0) + return -EINVAL; + host_ctl = mtk_msdc_host[msdc_ctl->host_num]; BUG_ON(!host_ctl); BUG_ON(!host_ctl->mmc); @@ -248,6 +254,9 @@ static int simple_sd_ioctl_single_rw(struct msdc_ioctl* msdc_ctl) } } + /* clear the global buffer of R/W IOCTL */ + memset(sg_msdc_multi_buffer, 0 , 512); + if (msdc_ctl->partition){ mmc_send_ext_csd(host_ctl->mmc->card,l_buf); @@ -282,7 +291,12 @@ static int simple_sd_ioctl_multi_rw(struct msdc_ioctl* msdc_ctl) struct mmc_command msdc_stop; struct mmc_request msdc_mrq; struct msdc_host *host_ctl; - + + if(!msdc_ctl) + return -EINVAL; + if(msdc_ctl->total_size <= 0) + return -EINVAL; + host_ctl = mtk_msdc_host[msdc_ctl->host_num]; BUG_ON(!host_ctl); BUG_ON(!host_ctl->mmc); @@ -397,6 +411,9 @@ static int simple_sd_ioctl_multi_rw(struct msdc_ioctl* msdc_ctl) } } + /* clear the global buffer of R/W IOCTL */ + memset(sg_msdc_multi_buffer, 0 , msdc_ctl->total_size); + if (msdc_ctl->partition){ mmc_send_ext_csd(host_ctl->mmc->card,l_buf); @@ -434,9 +451,11 @@ int simple_sd_ioctl_rw(struct msdc_ioctl* msdc_ctl) static int simple_sd_ioctl_get_cid(struct msdc_ioctl* msdc_ctl) { struct msdc_host *host_ctl; - - host_ctl = mtk_msdc_host[msdc_ctl->host_num]; + if(!msdc_ctl) + return -EINVAL; + + host_ctl = mtk_msdc_host[msdc_ctl->host_num]; BUG_ON(!host_ctl); BUG_ON(!host_ctl->mmc); BUG_ON(!host_ctl->mmc->card); @@ -461,9 +480,11 @@ static int simple_sd_ioctl_get_cid(struct msdc_ioctl* msdc_ctl) static int simple_sd_ioctl_get_csd(struct msdc_ioctl* msdc_ctl) { struct msdc_host *host_ctl; - - host_ctl = mtk_msdc_host[msdc_ctl->host_num]; + if(!msdc_ctl) + return -EINVAL; + + host_ctl = mtk_msdc_host[msdc_ctl->host_num]; BUG_ON(!host_ctl); BUG_ON(!host_ctl->mmc); BUG_ON(!host_ctl->mmc->card); @@ -489,13 +510,14 @@ static int simple_sd_ioctl_get_excsd(struct msdc_ioctl* msdc_ctl) { char l_buf[512]; struct msdc_host *host_ctl; - #if DEBUG_MMC_IOCTL int i; #endif - - host_ctl = mtk_msdc_host[msdc_ctl->host_num]; + if(!msdc_ctl) + return -EINVAL; + + host_ctl = mtk_msdc_host[msdc_ctl->host_num]; BUG_ON(!host_ctl); BUG_ON(!host_ctl->mmc); BUG_ON(!host_ctl->mmc->card); @@ -540,39 +562,52 @@ extern u32 msdc_host_mode2[HOST_MAX_NUM]; #ifdef CONFIG_MTK_EMMC_SUPPORT static int simple_sd_ioctl_set_driving(struct msdc_ioctl* msdc_ctl) { - u32 base; + u32 base; struct msdc_host *host; #if DEBUG_MMC_IOCTL - unsigned int l_value; + unsigned int l_value; #endif - if (msdc_ctl->host_num == 0){ + if(!msdc_ctl) + return -EINVAL; + + if((msdc_ctl->host_num < 0) || (msdc_ctl->host_num >= HOST_MAX_NUM)){ + printk("invalid host num: %d\n", msdc_ctl->host_num); + return -EINVAL; + }else if (msdc_ctl->host_num == 0){ #ifndef CFG_DEV_MSDC0 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 1) { + } else if (msdc_ctl->host_num == 1) { #ifndef CFG_DEV_MSDC1 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 2) { + } else if (msdc_ctl->host_num == 2) { #ifndef CFG_DEV_MSDC2 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 3) { + } else if (msdc_ctl->host_num == 3) { #ifndef CFG_DEV_MSDC3 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif } else if (msdc_ctl->host_num == 4) { #ifndef CFG_DEV_MSDC4 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif + }else { + printk("invalid host num: %d\n", msdc_ctl->host_num); + return -EINVAL; } - base = mtk_msdc_host[msdc_ctl->host_num]->base; + + host = mtk_msdc_host[msdc_ctl->host_num]; + BUG_ON(!host); + + base = host->base; #ifndef FPGA_PLATFORM enable_clock(MT_CG_PERI_MSDC30_0 + mtk_msdc_host[msdc_ctl->host_num]->id, "SD"); #endif @@ -627,37 +662,50 @@ static int simple_sd_ioctl_set_driving(struct msdc_ioctl* msdc_ctl) static int simple_sd_ioctl_get_driving(struct msdc_ioctl* msdc_ctl) { - u32 base; -// unsigned int l_value; + u32 base; +// unsigned int l_value; + struct msdc_host *host; - - if (msdc_ctl->host_num == 0){ + if(!msdc_ctl) + return -EINVAL; + + if((msdc_ctl->host_num < 0) || (msdc_ctl->host_num >= HOST_MAX_NUM)){ + printk("invalid host num: %d\n", msdc_ctl->host_num); + return -EINVAL; + }else if (msdc_ctl->host_num == 0){ #ifndef CFG_DEV_MSDC0 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 1) { + } else if (msdc_ctl->host_num == 1) { #ifndef CFG_DEV_MSDC1 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 2) { + } else if (msdc_ctl->host_num == 2) { #ifndef CFG_DEV_MSDC2 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 3) { + } else if (msdc_ctl->host_num == 3) { #ifndef CFG_DEV_MSDC3 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif } else if (msdc_ctl->host_num == 4) { #ifndef CFG_DEV_MSDC4 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif + }else { + printk("invalid host num: %d\n", msdc_ctl->host_num); + return -EINVAL; } - base = mtk_msdc_host[msdc_ctl->host_num]->base; + + host = mtk_msdc_host[msdc_ctl->host_num]; + BUG_ON(!host); + + base = host->base; #ifndef FPGA_PLATFORM enable_clock(MT_CG_PERI_MSDC30_0 + mtk_msdc_host[msdc_ctl->host_num]->id, "SD"); #endif @@ -694,38 +742,48 @@ static int simple_sd_ioctl_get_driving(struct msdc_ioctl* msdc_ctl) #endif static int simple_sd_ioctl_sd30_mode_switch(struct msdc_ioctl* msdc_ctl) { -// u32 base; +// u32 base; // struct msdc_hw hw; - int id = msdc_ctl->host_num; + int id; #if DEBUG_MMC_IOCTL - unsigned int l_value; + unsigned int l_value; #endif - if (msdc_ctl->host_num == 0){ + if(!msdc_ctl) + return -EINVAL; + id = msdc_ctl->host_num; + + if((msdc_ctl->host_num < 0) || (msdc_ctl->host_num >= HOST_MAX_NUM)){ + printk("invalid host num: %d\n", msdc_ctl->host_num); + return -EINVAL; + }else if (msdc_ctl->host_num == 0){ #ifndef CFG_DEV_MSDC0 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 1) { + } else if (msdc_ctl->host_num == 1) { #ifndef CFG_DEV_MSDC1 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 2) { + } else if (msdc_ctl->host_num == 2) { #ifndef CFG_DEV_MSDC2 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif - } else if (msdc_ctl->host_num == 3) { + } else if (msdc_ctl->host_num == 3) { #ifndef CFG_DEV_MSDC3 - printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + printk("host%d is not config\n", msdc_ctl->host_num); + return -EINVAL; #endif } else if (msdc_ctl->host_num == 4) { #ifndef CFG_DEV_MSDC4 printk("host%d is not config\n", msdc_ctl->host_num); - return -1; + return -EINVAL; #endif + }else { + printk("invalid host num: %d\n", msdc_ctl->host_num); + return -EINVAL; } switch(msdc_ctl->sd30_mode){ @@ -833,6 +891,7 @@ typedef struct mbr_part_info { #define MBR_PART_NUM 6 #define __MMC_ERASE_ARG 0x00000000 #define __MMC_TRIM_ARG 0x00000001 +#define __MMC_DISCARD_ARG 0x00000003 struct __mmc_blk_data { spinlock_t lock; @@ -851,6 +910,10 @@ int msdc_get_info(STORAGE_TPYE storage_type,GET_STORAGE_INFO info_type,struct st struct msdc_host *host = NULL; int host_function = 0; bool boot = 0; + + if(!info) + return -EINVAL; + switch (storage_type){ case EMMC_CARD_BOOT : host_function = MSDC_EMMC; @@ -872,6 +935,9 @@ int msdc_get_info(STORAGE_TPYE storage_type,GET_STORAGE_INFO info_type,struct st break; } host = msdc_get_host(host_function,boot,0); + BUG_ON(!host); + BUG_ON(!host->mmc); + BUG_ON(!host->mmc->card); switch (info_type){ case CARD_INFO : if(host->mmc && host->mmc->card) @@ -907,7 +973,7 @@ int msdc_get_info(STORAGE_TPYE storage_type,GET_STORAGE_INFO info_type,struct st return 1; } -#ifdef CONFIG_MTK_EMMC_SUPPORT +#if 0 static int simple_mmc_get_disk_info(struct mbr_part_info* mpi, unsigned char* name) { int i = 0; @@ -918,6 +984,9 @@ static int simple_mmc_get_disk_info(struct mbr_part_info* mpi, unsigned char* na struct gendisk *disk; struct __mmc_blk_data *md; + if(!name || !mpi) + return -EINVAL; + /* emmc always in slot0 */ host = msdc_get_host(MSDC_EMMC,MSDC_BOOT_EN,0); BUG_ON(!host); @@ -939,7 +1008,7 @@ static int simple_mmc_get_disk_info(struct mbr_part_info* mpi, unsigned char* na #if DEBUG_MMC_IOCTL printk("part_name = %s name = %s\n", PartInfo[i].name, name); #endif - if (!strncmp(PartInfo[i].name, name, 25)){ + if (!strncmp(PartInfo[i].name, name, PARTITION_NAME_LENGTH)){ mpi->start_sector = part->start_sect; mpi->nr_sects = part->nr_sects; mpi->part_no = part->partno; @@ -966,6 +1035,7 @@ static int simple_mmc_get_disk_info(struct mbr_part_info* mpi, unsigned char* na static int simple_mmc_erase_func(unsigned int start, unsigned int size) { struct msdc_host *host; + unsigned int arg; /* emmc always in slot0 */ host = msdc_get_host(MSDC_EMMC,MSDC_BOOT_EN,0); @@ -975,18 +1045,30 @@ static int simple_mmc_erase_func(unsigned int start, unsigned int size) mmc_claim_host(host->mmc); - if (!mmc_can_trim(host->mmc->card)){ - printk("emmc card can't support trim\n"); - return 0; + if(mmc_can_discard(host->mmc->card)) + { + arg = __MMC_DISCARD_ARG; + }else if (host->mmc->card->ext_csd.sec_feature_support & EXT_CSD_SEC_GB_CL_EN){ + /* for Hynix eMMC chip\A3\ACdo trim even if it is MMC_QUIRK_TRIM_UNSTABLE */ + arg = __MMC_TRIM_ARG; + }else if(mmc_can_erase(host->mmc->card)){ + /* mmc_erase() will remove the erase group un-aligned part, + * msdc_command_start() will do trim for old combo erase un-aligned issue + */ + arg = __MMC_ERASE_ARG; + }else { + printk("[%s]: emmc card can't support trim / discard / erase\n", __func__); + goto end; } - mmc_erase(host->mmc->card, start, size, - __MMC_TRIM_ARG); + printk("[%s]: start=0x%x, size=%d, arg=0x%x, can_trim=(0x%x),EXT_CSD_SEC_GB_CL_EN=0x%lx\n", + __func__, start, size, arg, host->mmc->card->ext_csd.sec_feature_support, EXT_CSD_SEC_GB_CL_EN); + mmc_erase(host->mmc->card, start, size, arg); #if DEBUG_MMC_IOCTL - printk("erase done....\n"); + printk("[%s]: erase done....arg=0x%x\n", __func__, arg); #endif - +end: mmc_release_host(host->mmc); return 0; @@ -995,7 +1077,7 @@ static int simple_mmc_erase_func(unsigned int start, unsigned int size) static int simple_mmc_erase_partition(unsigned char* name) { -#ifdef CONFIG_MTK_EMMC_SUPPORT +#if 0 struct mbr_part_info mbr_part; int l_ret = -1; @@ -1025,8 +1107,13 @@ static int simple_mmc_erase_partition(unsigned char* name) #ifdef CONFIG_MTK_EMMC_SUPPORT static int simple_mmc_erase_partition_wrap(struct msdc_ioctl* msdc_ctl) { - unsigned char name[25]; + unsigned char name[PARTITION_NAME_LENGTH]; + if(!msdc_ctl) + return -EINVAL; + + if(msdc_ctl->total_size > PARTITION_NAME_LENGTH) + return -EFAULT; if (copy_from_user(name, (unsigned char*)msdc_ctl->buffer, msdc_ctl->total_size)) return -EFAULT; diff --git a/drivers/misc/mediatek/mmc-host/mt8127/sd.c b/drivers/misc/mediatek/mmc-host/mt8127/sd.c index 8c1c1805438..0b8a8e35074 100644 --- a/drivers/misc/mediatek/mmc-host/mt8127/sd.c +++ b/drivers/misc/mediatek/mmc-host/mt8127/sd.c @@ -40,7 +40,6 @@ #include //#include "../../../../../../kernel/drivers/mmc/card/queue.h" #include "drivers/mmc/card/queue.h" -#include "partition_define.h" #include #include #ifdef CONFIG_MTK_AEE_FEATURE @@ -64,8 +63,8 @@ //static struct workqueue_struct *workqueue; #include -#include "partition_define.h" +#define METRICS_DELAY HZ #define EXT_CSD_BOOT_SIZE_MULT 226 /* R */ #define EXT_CSD_RPMB_SIZE_MULT 168 /* R */ #define EXT_CSD_GP1_SIZE_MULT 143 /* R/W 3 bytes */ @@ -93,7 +92,11 @@ u32 g_emmc_mode_switch = 0; __res |= resp[__off-1] << ((32 - __shft) % 32); \ __res & __mask; \ }) - + +#define FILTER_INVALIDCMD(opcode) \ +((opcode == 5) || (opcode == 8) || (opcode == 19) || (opcode == 21) \ +|| (opcode == 52) || (opcode == 55)) + #ifdef MTK_EMMC_ETT_TO_DRIVER #include "emmc_device_list.h" static u8 m_id = 0; // Manufacturer ID @@ -119,6 +122,13 @@ struct mmc_blk_data { static unsigned int met_mmc_bdnum; +static void msdc_init_hw(struct msdc_host *host); +#define PAD_DELAY_MAX 32 /* PAD delay cells */ +struct msdc_delay_phase { + u8 maxlen; + u8 start; + u8 final_phase; +}; #define DRV_NAME "mtk-msdc" @@ -175,16 +185,88 @@ static struct msdc_regs *msdc_reg[HOST_MAX_NUM]; static unsigned int msdc_online_tuning(struct msdc_host *host, unsigned fn, unsigned addr); #endif // MTK_SDIO30_TEST_MODE_SUPPORT +#define MSDC_DEV_ATTR(name, fmt, val, fmt_type) \ +static ssize_t msdc_attr_##name##_show(struct device *dev, struct device_attribute *attr, char *buf) \ +{ \ + struct mmc_host *mmc = dev_get_drvdata(dev); \ + struct msdc_host *host = mmc_priv(mmc); \ + return sprintf(buf, fmt "\n", (fmt_type)val); \ +} \ +static ssize_t msdc_attr_##name##_store(struct device *dev, \ + struct device_attribute *attr, const char *buf, size_t count) \ +{ \ + fmt_type tmp; \ + struct mmc_host *mmc = dev_get_drvdata(dev); \ + struct msdc_host *host = mmc_priv(mmc); \ + int n = sscanf(buf, fmt, &tmp); \ + val = (typeof(val))tmp; \ + return n ? count : -EINVAL; \ +} \ +static DEVICE_ATTR(name, S_IRUGO | S_IWUSR | S_IWGRP, msdc_attr_##name##_show, msdc_attr_##name##_store) + +MSDC_DEV_ATTR(crc_count, "%d", host->crc_count, u32); +MSDC_DEV_ATTR(crc_invalid_count, "%d", host->crc_invalid_count, u32); +MSDC_DEV_ATTR(req_count, "%d", host->req_count, u32); +MSDC_DEV_ATTR(datatimeout_count, "%d", host->datatimeout_count, u32); +MSDC_DEV_ATTR(cmdtimeout_count, "%d", host->cmdtimeout_count, u32); +MSDC_DEV_ATTR(reqtimeout_count, "%d", host->reqtimeout_count, u32); +MSDC_DEV_ATTR(pc_count, "%d", host->pc_count, u32); +MSDC_DEV_ATTR(pc_suspend, "%d", host->pc_suspend, u32); +MSDC_DEV_ATTR(inserted, "%d", host->inserted, u32); + +static struct device_attribute *msdc_attrs[] = { + &dev_attr_crc_count, + &dev_attr_crc_invalid_count, + &dev_attr_req_count, + &dev_attr_datatimeout_count, + &dev_attr_cmdtimeout_count, + &dev_attr_reqtimeout_count, + &dev_attr_pc_count, + &dev_attr_pc_suspend, + &dev_attr_inserted, + NULL, +}; + +static void msdc_add_device_attrs(struct msdc_host *host, struct device_attribute *attrs[]) +{ + int i, ret; + + if (!attrs) + return; + + for (i = 0; attrs[i]; ++i) { + ret = device_create_file(host->dev, attrs[i]); + if (ret) + dev_err(host->dev, "failed to register attribute: %s; err=%d\n", + attrs[i]->attr.name, ret); + } +} + +static void msdc_remove_device_attrs(struct msdc_host *host, struct device_attribute *attrs[]) +{ + int i; + + if (!attrs) + return; + + for (i = 0; attrs[i]; ++i) + device_remove_file(host->dev, attrs[i]); +} + //================================= -#define MSDC_LOWER_FREQ +#define MSDC_LOWER_FREQ #define MSDC_MAX_FREQ_DIV (2) /* 200 / (4 * 2) */ #define MSDC_MAX_TIMEOUT_RETRY (1) #define MSDC_MAX_TIMEOUT_RETRY_EMMC (2) #define MSDC_MAX_W_TIMEOUT_TUNE (5) #define MSDC_MAX_W_TIMEOUT_TUNE_EMMC (64) #define MSDC_MAX_R_TIMEOUT_TUNE (3) +#ifdef CONFIG_AUSTIN_PROJECT +#define MSDC_MAX_POWER_CYCLE (80) +#else #define MSDC_MAX_POWER_CYCLE (3) +#endif #ifdef FPGA_PLATFORM #define PWR_GPIO (0xf0001E84) #define PWR_GPIO_EO (0xf0001E88) @@ -196,34 +278,6 @@ static unsigned int msdc_online_tuning(struct msdc_host *host, unsigned fn, un #define PWR_MASK_EN_MASK (~(1 << 8)) #define PWR_GPIO_L4_DIR_MASK (~(1 << 11)) -/* -#define MBR_START_ADDRESS_BYTE (0x660000) - -#define PART_NUM 20 - -struct excel_info PartInfo[PART_NUM]={ - {"preloader",262144,0x0,0}, - {"dsp_bl",1966080,0x40000,0}, - {"mbr",16384,0x220000,0}, - {"ebr1",376832,0x224000,1}, - {"pmt",4194304,0x280000,0}, - {"nvram",3145728,0x680000,0}, - {"seccfg",131072,0x980000,0}, - {"uboot",393216,0x9a0000,0}, - {"bootimg",6291456,0xa00000,0}, - {"recovery",6291456,0x1000000,0}, - {"sec_ro",6291456,0x1600000,5}, - {"misc",393216,0x1c00000,0}, - {"logo",3145728,0x1c60000,0}, - {"expdb",655360,0x1f60000,0}, - {"ebr2",16384,0x2000000,0}, - {"android",537919488,0x2004000,6}, - {"cache",537919488,0x22104000,2}, - {"usrdata",537919488,0x42204000,3}, - {"fat",0,0x62304000,4}, - {"bmtpool",10485760,0xFFFF0050,0}, - }; -*/ bool hwPowerOn_fpga(void){ volatile u16 l_val; @@ -884,7 +938,7 @@ static void msdc_dump_info(u32 id) #define msdc_reset_hw(id) \ msdc_reset(id); \ msdc_clr_fifo(id); \ - msdc_clr_int(); + msdc_clr_int(); static int msdc_clk_stable(struct msdc_host *host,u32 mode, u32 div){ u32 base = host->base; @@ -893,8 +947,11 @@ static int msdc_clk_stable(struct msdc_host *host,u32 mode, u32 div){ int retry_cnt = 1; do{ retry = 3; - sdr_set_field(MSDC_CFG, MSDC_CFG_CKMOD|MSDC_CFG_CKDIV,(mode << 8)|((div + retry_cnt) % 0xff)); - //sdr_set_field(MSDC_CFG, MSDC_CFG_CKMOD, mode); + if (host->id == 1) + sdr_set_bits(0xF0000070, BIT(7)); + sdr_set_field(MSDC_CFG, MSDC_CFG_CKMOD|MSDC_CFG_CKDIV,(mode << 8)|((div + retry_cnt) % 0xff)); + if (host->id == 1) + sdr_clr_bits(0xF0000070, BIT(7)); msdc_retry(!(sdr_read32(MSDC_CFG) & MSDC_CFG_CKSTB), retry, cnt,host->id); if(retry == 0){ printk(KERN_ERR "msdc%d host->onclock(%d)\n",host->id,host->core_clkon); @@ -915,6 +972,9 @@ static int msdc_clk_stable(struct msdc_host *host,u32 mode, u32 div){ break; retry_cnt += 1; }while(!retry); + + if (host->hw->host_function == MSDC_SD) + sdr_set_bits(MSDC_CFG, MSDC_CFG_CKPDN); return 0; } @@ -1623,7 +1683,7 @@ static void msdc_gate_clock(struct msdc_host* host, int delay) } else if(host->clk_gate_count == 0) { - del_timer(&host->timer); + del_timer_sync(&host->timer); msdc_clksrc_onoff(host, 0); N_MSG(CLK, "[%s]: msdc%d, successfully gate clock, clk_gate_count=%d, delay=%d\n", __func__, host->id, host->clk_gate_count, delay); } @@ -1760,20 +1820,25 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) { u32 base = host->base; u32 timeout, clk_ns; + u32 mode = 0; - host->timeout_ns = ns; + host->timeout_ns = ns; host->timeout_clks = clks; - - clk_ns = 1000000000UL / host->sclk; - timeout = ns / clk_ns + clks; - timeout = timeout >> 20; /* in 1048576 sclk cycle unit (83/85)*/ - timeout = timeout > 1 ? timeout - 1 : 0; - timeout = timeout > 255 ? 255 : timeout; - + if(host->sclk == 0){ + timeout = 0; + } else { + clk_ns = 1000000000UL / host->sclk; + timeout = (ns + clk_ns - 1) / clk_ns + clks; + timeout = (timeout + (1 << 20) - 1) >> 20; /* in 1048576 sclk cycle unit */ + sdr_get_field(MSDC_CFG, MSDC_CFG_CKMOD, mode); + timeout = mode >= 2 ? timeout * 2 : timeout; //DDR mode will double the clk cycles for data timeout + timeout = timeout > 1 ? timeout - 1 : 0; + timeout = timeout > 255 ? 255 : timeout; + } sdr_set_field(SDC_CFG, SDC_CFG_DTOC, timeout); - N_MSG(OPS, "Set read data timeout: %dns %dclks -> %d x 1048576 cycles", - ns, clks, timeout + 1); + N_MSG(OPS, "msdc%d, Set read data timeout: %dns %dclks -> %d x 1048576 cycles, mode:%d, clk_freq=%dKHz\n", + host->id, ns, clks, timeout + 1, mode, (host->sclk / 1000)); } /* msdc_eirq_sdio() will be called when EIRQ(for WIFI) */ @@ -1819,6 +1884,10 @@ static void msdc_tasklet_card(unsigned long arg) else inserted = (host->sd_cd_polarity == 0) ? 0 : 1; } + + if ((host->hw->host_function == MSDC_SD) && inserted) { + host->inserted++; + } if(host->block_bad_card){ inserted = 0; if(host->mmc->card) @@ -1925,6 +1994,8 @@ static void msdc_set_mclk(struct msdc_host *host, int ddr, u32 hz) if (!hz) { // set mmc system clock to 0 printk(KERN_ERR "msdc%d -> set mclk to 0",host->id); // fix me: need to set to 0 + if (host->hw->host_function == MSDC_SD) + sdr_clr_bits(MSDC_CFG, MSDC_CFG_CKPDN); if (is_card_sdio(host) || (host->hw->flags & MSDC_SDIO_IRQ)) host->saved_para.hz = hz; host->mclk = 0; @@ -2004,27 +2075,28 @@ static u32 msdc_power_tuning(struct msdc_host *host) u32 ret = 1; u32 host_err = 0; u32 base = host->base; - if (!mmc) return 1; + if (!mmc) return 1; card = mmc->card; if (card == NULL) { ERR_MSG("mmc->card is NULL"); - return 1; + return 1; } - // eMMC first + // eMMC first #ifdef CONFIG_MTK_EMMC_SUPPORT - if (mmc_card_mmc(card) && (host->hw->host_function == MSDC_EMMC)) { + if (mmc_card_mmc(card) && (host->hw->host_function == MSDC_EMMC)) { /* Fixme: */ - return 1; + return 1; } #endif - + if((host->sd_30_busy > 0) && (host->sd_30_busy <= MSDC_MAX_POWER_CYCLE)){ host->power_cycle_enable = 1; } + ERR_MSG("Power cycle power_cycle:%d", host->power_cycle); if (mmc_card_sd(card) && (host->hw->host_function == MSDC_SD) && (host->power_cycle < MSDC_MAX_POWER_CYCLE) && (host->power_cycle_enable)) { - // power cycle + // power cycle ERR_MSG("Power cycle start"); spin_unlock(&host->lock); #ifdef FPGA_PLATFORM @@ -2109,11 +2181,21 @@ static u32 msdc_power_tuning(struct msdc_host *host) } host->sw_timeout = sw_timeout; host->error = host_err; +#ifdef CONFIG_AUSTIN_PROJECT + if(!ret) + host->power_cycle = 0; + else + (host->power_cycle)++; + if(host->power_cycle < MSDC_MAX_POWER_CYCLE) + ret = 0; + ERR_MSG("Power cycle host->error(0x%x)",host->error); +#else if(!ret) host->power_cycle_enable = 0; - ERR_MSG("Power cycle host->error(0x%x)",host->error); + ERR_MSG("Power cycle host->error(0x%x)",host->error); (host->power_cycle)++; - ERR_MSG("Power cycle Done"); +#endif + ERR_MSG("Power cycle Done"); } return ret; @@ -2122,17 +2204,17 @@ static u32 msdc_power_tuning(struct msdc_host *host) static void msdc_send_stop(struct msdc_host *host) { - struct mmc_command stop = {0}; + struct mmc_command stop = {0}; struct mmc_request mrq = {0}; - u32 err = -1; - - stop.opcode = MMC_STOP_TRANSMISSION; - stop.arg = 0; + u32 err = -1; + + stop.opcode = MMC_STOP_TRANSMISSION; + stop.arg = 0; stop.flags = MMC_RSP_R1B | MMC_CMD_AC; mrq.cmd = &stop; stop.mrq = &mrq; - stop.data = NULL; - + stop.data = NULL; + err = msdc_do_command(host, &stop, 0, CMD_TIMEOUT); } @@ -2512,6 +2594,14 @@ static void msdc_set_power_mode(struct msdc_host *host, u8 mode) #endif msdc_pin_config(host, MSDC_PIN_PULL_DOWN); } + + if ((host->hw->host_function == MSDC_SD) && mode) { + host->pc_count++; + } + + dev_info(host->dev, "crc/total %d/%d invalcrc %d datato %d cmdto %d total_pc %d pc_sus %d\n", + host->crc_count, host->req_count, host->crc_invalid_count, host->datatimeout_count, + host->cmdtimeout_count, host->pc_count, host->pc_suspend); mdelay(10); msdc_pin_reset (host, MSDC_PIN_PULL_DOWN); } @@ -3032,22 +3122,6 @@ static int msdc_get_data(u8* dst,struct mmc_data *data) return 0; } -/* parse part_info struct, support otp & mtk reserve */ -static struct excel_info* msdc_reserve_part_info(unsigned char* name) -{ - int i; - - /* find reserve partition */ - for (i = 0; i < PART_NUM; i++) { - printk("name = %s\n", PartInfo[i].name); //====================debug - if (0 == strcmp(name, PartInfo[i].name)){ - printk("size = %llu\n", PartInfo[i].size);//=======================debug - return &PartInfo[i]; - } - } - - return NULL; -} static u32 msdc_get_other_capacity(void) { u32 device_other_capacity = 0; @@ -3088,7 +3162,7 @@ int msdc_get_reserve(void) l_offset = msdc_get_offset(); //==========check me - l_mtk_reserve = 0x1500000 >> 9; /* unit is 512B */ + l_mtk_reserve = 0; /* unit is 512B */ #ifdef CONFIG_MTK_EMMC_SUPPORT_OTP l_otp_reserve = 0x2B00000 >> 9; /* unit is 512B */ @@ -3165,6 +3239,7 @@ static unsigned int msdc_command_start(struct msdc_host *host, u32 rawarg; u32 resp; unsigned long tmo; + struct mmc_request *mrq = cmd->mrq; /* Protocol layer does not provide response type, but our hardware needs * to know exact type, not just size! @@ -3215,14 +3290,22 @@ static unsigned int msdc_command_start(struct msdc_host *host, if (opcode == MMC_READ_MULTIPLE_BLOCK) { rawcmd |= (2 << 11); - if (host->autocmd & MSDC_AUTOCMD12) - rawcmd |= (1 << 28); + if ((host->autocmd & MSDC_AUTOCMD12) && mrq->stop) + rawcmd |= (1 << 28); +#ifdef MTK_MSDC_USE_CMD23 + else if((host->autocmd & MSDC_AUTOCMD23)) + rawcmd |= (1 << 29); +#endif /* end of MTK_MSDC_USE_CMD23 */ } else if (opcode == MMC_READ_SINGLE_BLOCK) { rawcmd |= (1 << 11); } else if (opcode == MMC_WRITE_MULTIPLE_BLOCK) { rawcmd |= ((2 << 11) | (1 << 13)); - if (host->autocmd & MSDC_AUTOCMD12) + if ((host->autocmd & MSDC_AUTOCMD12) && mrq->stop) rawcmd |= (1 << 28); +#ifdef MTK_MSDC_USE_CMD23 + else if((host->autocmd & MSDC_AUTOCMD23)) + rawcmd |= (1 << 29); +#endif /* end of MTK_MSDC_USE_CMD23 */ } else if (opcode == MMC_WRITE_BLOCK) { rawcmd |= ((1 << 11) | (1 << 13)); } else if (opcode == SD_IO_RW_EXTENDED) { @@ -3242,6 +3325,7 @@ static unsigned int msdc_command_start(struct msdc_host *host, rawcmd |= (1 << 30); } else if ((opcode == SD_APP_SEND_SCR) || (opcode == SD_APP_SEND_NUM_WR_BLKS) || + (cmd->data && opcode == MMC_SEND_TUNING_BLOCK) || (opcode == SD_SWITCH && (mmc_cmd_type(cmd) == MMC_CMD_ADTC)) || (opcode == SD_APP_SD_STATUS && (mmc_cmd_type(cmd) == MMC_CMD_ADTC)) || (opcode == MMC_SEND_EXT_CSD && (mmc_cmd_type(cmd) == MMC_CMD_ADTC))) { @@ -3263,6 +3347,10 @@ static unsigned int msdc_command_start(struct msdc_host *host, if (time_after(jiffies, tmo)) { ERR_MSG("XXX cmd_busy timeout: before CMD<%d>", opcode); cmd->error = (unsigned int)-ETIMEDOUT; + if (host->hw->host_function == MSDC_SD) { + host->reqtimeout_count++; + } + msdc_reset_hw(host->id); return cmd->error; /* Fix me: error handling */ } @@ -3274,6 +3362,10 @@ static unsigned int msdc_command_start(struct msdc_host *host, if (time_after(jiffies, tmo)) { ERR_MSG("XXX sdc_busy timeout: before CMD<%d>", opcode); cmd->error = (unsigned int)-ETIMEDOUT; + if (host->hw->host_function == MSDC_SD) { + host->reqtimeout_count++; + } + msdc_reset_hw(host->id); return cmd->error; } @@ -3318,7 +3410,8 @@ static unsigned int msdc_command_start(struct msdc_host *host, rawarg = MMC_TRIM_ARG; } #endif - + if (host->hw->host_function == MSDC_SD) + host->req_count++; sdc_send_cmd(rawcmd, rawarg); //end: @@ -3339,6 +3432,18 @@ static unsigned int msdc_command_resp_polling(struct msdc_host *host, u32 cmdsts = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO; +#ifdef MTK_MSDC_USE_CMD23 + struct mmc_command *sbc = NULL; + if (host->autocmd & MSDC_AUTOCMD23){ + if (host->data && host->data->mrq && host->data->mrq->sbc) + sbc = host->data->mrq->sbc; + + /* autocmd interupt disabled, used polling way */ + cmdsts |= MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO; + } +#endif + + resp = host->cmd_rsp; /*polling*/ @@ -3346,25 +3451,41 @@ static unsigned int msdc_command_resp_polling(struct msdc_host *host, while (1){ if (((intsts = sdr_read32(MSDC_INT)) & cmdsts) != 0){ /* clear all int flag */ - intsts &= cmdsts; +#ifdef MTK_MSDC_USE_CMD23 + // need clear autocmd23 comand ready interrupt + intsts &= (cmdsts | MSDC_INT_ACMDRDY); +#else + intsts &= cmdsts; +#endif + sdr_write32(MSDC_INT, intsts); break; } - if (time_after(jiffies, tmo)) { - ERR_MSG("XXX CMD<%d> polling_for_completion timeout ARG<0x%.8x>", cmd->opcode, cmd->arg); - cmd->error = (unsigned int)-ETIMEDOUT; - host->sw_timeout++; - msdc_dump_info(host->id); - msdc_reset_hw(host->id); - goto out; - } - } + if (time_after(jiffies, tmo)) { + ERR_MSG("XXX CMD<%d> polling_for_completion timeout ARG<0x%.8x>", + cmd->opcode, cmd->arg); + cmd->error = (unsigned int)-ETIMEDOUT; + if (host->hw->host_function == MSDC_SD) { + host->cmdtimeout_count++; + } + + host->sw_timeout++; + msdc_dump_info(host->id); + msdc_reset_hw(host->id); + goto out; + } + } /* command interrupts */ if (intsts & cmdsts) { +#ifdef MTK_MSDC_USE_CMD23 + if ((intsts & MSDC_INT_CMDRDY) || (intsts & MSDC_INT_ACMD19_DONE)) { +#else if ((intsts & MSDC_INT_CMDRDY) || (intsts & MSDC_INT_ACMDRDY) || (intsts & MSDC_INT_ACMD19_DONE)) { +#endif + u32 *rsp = NULL; rsp = &cmd->resp[0]; switch (host->cmd_rsp) { @@ -3393,12 +3514,44 @@ static unsigned int msdc_command_resp_polling(struct msdc_host *host, } else if (intsts & MSDC_INT_RSPCRCERR) { cmd->error = (unsigned int)-EIO; IRQ_MSG("XXX CMD<%d> MSDC_INT_RSPCRCERR Arg<0x%.8x>",cmd->opcode, cmd->arg); - msdc_reset_hw(host->id); - } else if (intsts & MSDC_INT_CMDTMO) { - cmd->error = (unsigned int)-ETIMEDOUT; - IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO Arg<0x%.8x>",cmd->opcode, cmd->arg); - msdc_reset_hw(host->id); + /* cmd19 rsp crc error, still need receive data, so cannot call msdc_reset_hw() */ + if (cmd->opcode != MMC_SEND_TUNING_BLOCK) + msdc_reset_hw(host->id); + + if (host->hw->host_function == MSDC_SD) { + if (FILTER_INVALIDCMD(cmd->opcode)) + host->crc_invalid_count++; + else + host->crc_count++; + } + } else if (intsts & MSDC_INT_CMDTMO) { + cmd->error = (unsigned int)-ETIMEDOUT; + IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO Arg<0x%.8x>",cmd->opcode, cmd->arg); + msdc_reset_hw(host->id); + if (host->hw->host_function == MSDC_SD) { + host->cmdtimeout_count++; + } + } +#ifdef MTK_MSDC_USE_CMD23 + if ((sbc != NULL) && (host->autocmd & MSDC_AUTOCMD23)) { + if (intsts & MSDC_INT_ACMDRDY) { + u32 *arsp = &sbc->resp[0]; + *arsp = sdr_read32(SDC_ACMD_RESP); + } else if (intsts & MSDC_INT_ACMDCRCERR) { + printk("autocmd23 crc error\n"); + sbc->error = (unsigned int)-EIO; + cmd->error = (unsigned int)-EIO; // record the error info in current cmd struct + //host->error |= REQ_CMD23_EIO; + msdc_reset_hw(host->id); + } else if (intsts & MSDC_INT_ACMDTMO) { + printk("autocmd23 to error\n"); + sbc->error =(unsigned int)-ETIMEDOUT; + cmd->error = (unsigned int)-ETIMEDOUT; // record the error info in current cmd struct + //host->error |= REQ_CMD23_TMO; + msdc_reset_hw(host->id); + } } +#endif /* end of MTK_MSDC_USE_CMD23 */ } out: host->cmd = NULL; @@ -3539,16 +3692,22 @@ static int msdc_pio_read(struct msdc_host *host, struct mmc_data *data) *ptr++ = msdc_fifo_read32(); left -= 4; } - - u8ptr = (u8 *)ptr; + u8ptr = (u8 *)ptr; while(left) { * u8ptr++ = msdc_fifo_read8(); - left--; + left--; } } - + + if(left) { + ints = sdr_read32(MSDC_INT); + if(ints & MSDC_INT_DATTMO) { + data->error = (unsigned int)-ETIMEDOUT; + break; + } + } if (msdc_pio_abort(host, data, tmo)) { - goto end; + goto end; } } size += sg_dma_len(sg); @@ -3661,7 +3820,7 @@ static void msdc_dma_start(struct msdc_host *host) { u32 base = host->base; u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; - if(host->autocmd == MSDC_AUTOCMD12) + if(host->autocmd == MSDC_AUTOCMD12 || host->autocmd == MSDC_AUTOCMD23) wints |= MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | MSDC_INT_ACMDRDY; sdr_set_bits(MSDC_INTEN, wints); mb(); @@ -3677,7 +3836,7 @@ static void msdc_dma_stop(struct msdc_host *host) int count = 1000; //u32 retries=500; u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; - if(host->autocmd == MSDC_AUTOCMD12) + if(host->autocmd == MSDC_AUTOCMD12 || host->autocmd == MSDC_AUTOCMD23) wints |= MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | MSDC_INT_ACMDRDY; N_MSG(DMA, "DMA status: 0x%.8x",sdr_read32(MSDC_DMA_CFG)); //while (sdr_read32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS); @@ -4244,7 +4403,10 @@ static int msdc_do_request(struct mmc_host*mmc, struct mmc_request*mrq) struct msdc_host *host = mmc_priv(mmc); struct mmc_command *cmd; struct mmc_data *data; - + u32 l_autocmd23_is_set = 0; +#ifdef MTK_MSDC_USE_CMD23 + u32 l_card_no_cmd23 = 0; +#endif u32 base = host->base; //u32 intsts = 0; unsigned int left=0; @@ -4387,18 +4549,69 @@ static int msdc_do_request(struct mmc_host*mmc, struct mmc_request*mrq) msdc_set_timeout(host, data->timeout_ns, data->timeout_clks); } } - + + if (host->hw->host_function == MSDC_SD) { + host->req_count++; + dev_dbg(host->dev, "crc/total %d/%d invalcrc %d datato %d cmdto %d total_pc %d pc_sus %d\n", + host->crc_count, host->req_count, host->crc_invalid_count, host->datatimeout_count, + host->cmdtimeout_count, host->pc_count, host->pc_suspend); + } + msdc_set_blknum(host, data->blocks); //msdc_clr_fifo(); /* no need */ - + + #ifdef MTK_MSDC_USE_CMD23 + if (0 == (host->autocmd & MSDC_AUTOCMD23)){ + /* start the cmd23 first, mrq->sbc is NULL with single r/w */ + if (mrq->sbc){ + host->autocmd &= ~MSDC_AUTOCMD12; + + if(host->hw->host_function == MSDC_EMMC){ + /* remove reliable bit & data tag bit */ + mrq->sbc->arg &= ~(1 << 31); + mrq->sbc->arg &= ~(1 << 29); + } + + if (msdc_command_start(host, mrq->sbc, 0, CMD_TIMEOUT) != 0) + goto done; + + /* then wait command done */ + if (msdc_command_resp_polling(host, mrq->sbc, 0, CMD_TIMEOUT) != 0) { + goto stop; + } + } else { + /* some sd card may not support cmd23, + * some emmc card have problem with cmd23, so use cmd12 here */ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD12; + } + } + } else { + /* enable auto cmd23 */ + if (mrq->sbc){ + host->autocmd &= ~MSDC_AUTOCMD12; + } else { + /* some sd card may not support cmd23, + * some emmc card have problem with cmd23, so use cmd12 here */ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd &= ~MSDC_AUTOCMD23; + host->autocmd |= MSDC_AUTOCMD12; + l_card_no_cmd23 = 1; + } + } + } +#endif /* end of MTK_MSDC_USE_CMD23 */ + if (dma) { msdc_dma_on(); /* enable DMA mode first!! */ init_completion(&host->xfer_done); - - /* start the command first*/ - if(host->hw->host_function != MSDC_SDIO){ - host->autocmd = MSDC_AUTOCMD12; - } +#ifndef MTK_MSDC_USE_CMD23 + /* start the command first*/ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD12; + } +#endif + if (msdc_command_start(host, cmd, 0, CMD_TIMEOUT) != 0) goto done; @@ -4443,7 +4656,10 @@ static int msdc_do_request(struct mmc_host*mmc, struct mmc_request*mrq) host->autocmd = 0; host->dma_xfer = 0; if (msdc_do_command(host, cmd, 0, CMD_TIMEOUT) != 0) { - goto stop; + /* jct, cmd19 at here */ + if (cmd->opcode != MMC_SEND_TUNING_BLOCK || + (cmd->opcode == MMC_SEND_TUNING_BLOCK && cmd->error != -EIO)) + goto stop; } /* Secondly: pio data phase */ @@ -4486,18 +4702,62 @@ static int msdc_do_request(struct mmc_host*mmc, struct mmc_request*mrq) } // PIO mode stop: + /* pio mode will disable autocmd23 */ + if (l_autocmd23_is_set == 1){ + l_autocmd23_is_set = 0; + host->autocmd |= MSDC_AUTOCMD23; + } +#ifndef MTK_MSDC_USE_CMD23 /* Last: stop transfer */ - if (data->stop){ - if(!((cmd->error == 0) && (data->error == 0) && (host->autocmd == MSDC_AUTOCMD12) && (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK))){ - if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { - goto done; - } - } - } + if (data && data->stop){ + if(!((cmd->error == 0) && (data->error == 0) && (host->autocmd & MSDC_AUTOCMD12) && + (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK))){ + if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { + goto done; + } + } + } +#else + if (host->hw->host_function == MSDC_EMMC){ + if (data && data->stop){ + /* multi r/w with no cmd23 and no autocmd12, need send cmd12 manual */ + /* if PIO mode and autocmd23 enable, cmd12 need send, because autocmd23 is disable under PIO */ + if ((((mrq->sbc == NULL) && !(host->autocmd & MSDC_AUTOCMD12)) || + (!dma && mrq->sbc && (host->autocmd & MSDC_AUTOCMD23))) && + (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK)){ + if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { + goto done; + } + } + } + } else { + /* for non emmc card, use old flow */ + if (data && data->stop){ + if(!((cmd->error == 0) && (data->error == 0) && (host->autocmd & MSDC_AUTOCMD12) && + (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK))){ + if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { + goto done; + } + } + } + } +#endif + } done: +#ifdef MTK_MSDC_USE_CMD23 + /* for msdc use cmd23, but card not supported(sbc is NULL), need enable autocmd23 for next request */ + if (1 == l_card_no_cmd23){ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD23; + host->autocmd &= ~MSDC_AUTOCMD12; + l_card_no_cmd23 = 0; + } + } +#endif + if (data != NULL) { host->data = NULL; host->dma_xfer = 0; @@ -4580,6 +4840,12 @@ done: else sdio_tune_flag |= 0x40; } + +#ifdef MTK_MSDC_USE_CMD23 + if (mrq->sbc && (mrq->sbc->error == (unsigned int)-EIO)) host->error |= REQ_CMD_EIO; + if (mrq->sbc && (mrq->sbc->error == (unsigned int)-ETIMEDOUT)) host->error |= REQ_CMD_TMO; +#endif + if (mrq->stop && (mrq->stop->error == (unsigned int)-EIO)) host->error |= REQ_STOP_EIO; if (mrq->stop && (mrq->stop->error == (unsigned int)-ETIMEDOUT)) host->error |= REQ_STOP_TMO; //if (host->error) ERR_MSG("host->error<%d>", host->error); @@ -4592,6 +4858,9 @@ static int msdc_tune_rw_request(struct mmc_host*mmc, struct mmc_request*mrq) struct mmc_command *cmd; struct mmc_data *data; +#ifdef MTK_MSDC_USE_CMD23 + u32 l_autocmd23_is_set = 0; +#endif u32 base = host->base; //u32 intsts = 0; //unsigned int left=0; @@ -4656,9 +4925,22 @@ static int msdc_tune_rw_request(struct mmc_host*mmc, struct mmc_request*mrq) init_completion(&host->xfer_done); /* start the command first*/ - if(host->hw->host_function != MSDC_SDIO){ - host->autocmd = MSDC_AUTOCMD12; - } +#ifndef MTK_MSDC_USE_CMD23 + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD12; + } +#else + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD12; + + /* disable autocmd23 in error tuning flow */ + l_autocmd23_is_set = 0; + if (host->autocmd & MSDC_AUTOCMD23){ + l_autocmd23_is_set = 1; + host->autocmd &= ~MSDC_AUTOCMD23; + } + } +#endif if (msdc_command_start(host, cmd, 0, CMD_TIMEOUT) != 0) goto done; @@ -4750,6 +5032,14 @@ done: if (mrq->data && (mrq->data->error)) host->error |= REQ_DAT_ERR; if (mrq->stop && (mrq->stop->error == (unsigned int)-EIO)) host->error |= REQ_STOP_EIO; if (mrq->stop && (mrq->stop->error == (unsigned int)-ETIMEDOUT)) host->error |= REQ_STOP_TMO; + +#ifdef MTK_MSDC_USE_CMD23 + if (l_autocmd23_is_set == 1){ + /* restore the value */ + host->autocmd |= MSDC_AUTOCMD23; + } +#endif + return host->error; } @@ -4824,6 +5114,9 @@ static int msdc_do_request_async(struct mmc_host*mmc, struct mmc_request*mrq) struct mmc_command *cmd; struct mmc_data *data; u32 base = host->base; +#ifdef MTK_MSDC_USE_CMD23 + u32 l_card_no_cmd23 = 0; +#endif //u32 intsts = 0; //unsigned int left=0; #ifdef MTK_SDIO30_TEST_MODE_SUPPORT @@ -4910,11 +5203,54 @@ static int msdc_do_request_async(struct mmc_host*mmc, struct mmc_request*mrq) //msdc_clr_fifo(); /* no need */ msdc_dma_on(); /* enable DMA mode first!! */ //init_completion(&host->xfer_done); - - /* start the command first*/ - if(host->hw->host_function != MSDC_SDIO){ - host->autocmd = MSDC_AUTOCMD12; - } + #ifdef MTK_MSDC_USE_CMD23 + // if tuning flow run here, no problem?? need check!!!!!!! + if (0 == (host->autocmd & MSDC_AUTOCMD23)){ + /* start the cmd23 first*/ + if (mrq->sbc){ + host->autocmd &= ~MSDC_AUTOCMD12; + + if(host->hw->host_function == MSDC_EMMC){ + /* remove reliable bit & data tag bit */ + mrq->sbc->arg &= ~(1 << 31); + mrq->sbc->arg &= ~(1 << 29); + } + + if (msdc_command_start(host, mrq->sbc, 0, CMD_TIMEOUT) != 0) + goto done; + + /* then wait command done */ + if (msdc_command_resp_polling(host, mrq->sbc, 0, CMD_TIMEOUT) != 0) { + goto stop; + } + } else { + /* some sd card may not support cmd23, + * some emmc card have problem with cmd23, so use cmd12 here */ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD12; + } + } + } else { + if (mrq->sbc){ + host->autocmd &= ~MSDC_AUTOCMD12; + } else { + /* some sd card may not support cmd23, + * some emmc card have problem with cmd23, so use cmd12 here */ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd &= ~MSDC_AUTOCMD23; + host->autocmd |= MSDC_AUTOCMD12; + l_card_no_cmd23 = 1; + } + } + } + +#else + /* start the command first*/ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD12; + } +#endif /* end of MTK_MSDC_USE_CMD23 */ + if (msdc_command_start(host, cmd, 0, CMD_TIMEOUT) != 0) goto done; @@ -4932,21 +5268,56 @@ static int msdc_do_request_async(struct mmc_host*mmc, struct mmc_request*mrq) spin_unlock(&host->lock); met_mmc_issue(host->mmc, host->mrq); +#ifdef MTK_MSDC_USE_CMD23 + /* for msdc use cmd23, but card not supported(sbc is NULL), need enable autocmd23 for next request */ + if (1 == l_card_no_cmd23){ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD23; + host->autocmd &= ~MSDC_AUTOCMD12; + l_card_no_cmd23 = 0; + } + } +#endif + return 0; stop: - /* Last: stop transfer */ - if (data && data->stop){ - if(!((cmd->error == 0) && (data->error == 0) && (host->autocmd == MSDC_AUTOCMD12) && (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK))){ - if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { - goto done; - } - } - } - +#ifndef MTK_MSDC_USE_CMD23 + /* Last: stop transfer */ + if (data && data->stop){ + if(!((cmd->error == 0) && (data->error == 0) && (host->autocmd & MSDC_AUTOCMD12) && (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK))){ + if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { + goto done; + } + } + } +#else + if (host->hw->host_function == MSDC_EMMC) { + /* error handle will do msdc_abort_data() */ + } else { + if (data && data->stop){ + if(!((cmd->error == 0) && (data->error == 0) && (host->autocmd & MSDC_AUTOCMD12) && + (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK))){ + if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { + goto done; + } + } + } + } +#endif done: +#ifdef MTK_MSDC_USE_CMD23 + /* for msdc use cmd23, but card not supported(sbc is NULL), need enable autocmd23 for next request */ + if (1 == l_card_no_cmd23){ + if(host->hw->host_function != MSDC_SDIO){ + host->autocmd |= MSDC_AUTOCMD23; + host->autocmd &= ~MSDC_AUTOCMD12; + l_card_no_cmd23 = 0; + } + } +#endif msdc_dma_clear(host); @@ -4962,7 +5333,12 @@ done: cmd->arg, cmd->resp[0], data->blocks); } } - + +#ifdef MTK_MSDC_USE_CMD23 + if (mrq->sbc && (mrq->sbc->error == (unsigned int)-EIO)) host->error |= REQ_CMD_EIO; + if (mrq->sbc && (mrq->sbc->error == (unsigned int)-ETIMEDOUT)) host->error |= REQ_CMD_TMO; +#endif + if (mrq->cmd->error == (unsigned int)-EIO) host->error |= REQ_CMD_EIO; if (mrq->cmd->error == (unsigned int)-ETIMEDOUT) host->error |= REQ_CMD_TMO; if (mrq->stop && (mrq->stop->error == (unsigned int)-EIO)) host->error |= REQ_STOP_EIO; @@ -5555,6 +5931,7 @@ static void msdc_ops_request_legacy(struct mmc_host *mmc, struct mmc_request *mr struct mmc_command *cmd; struct mmc_data *data; struct mmc_command *stop = NULL; + struct mmc_command *sbc = NULL; int data_abort = 0; int got_polarity = 0; unsigned long flags; @@ -5590,6 +5967,9 @@ static void msdc_ops_request_legacy(struct mmc_host *mmc, struct mmc_request *mr data = mrq->cmd->data; if (data) stop = data->stop; +#ifdef MTK_MSDC_USE_CMD23 + if (data) sbc = mrq->sbc; +#endif msdc_ungate_clock(host); // set sw flag if (sdio_pro_enable) { //=== for sdio profile === @@ -5608,7 +5988,27 @@ static void msdc_ops_request_legacy(struct mmc_host *mmc, struct mmc_request *mr goto out; // sdio not tuning } + if (host->hw->host_function == MSDC_SD && cmd->opcode == MMC_SEND_TUNING_BLOCK) { + /* cmd19 not tuning */ + goto out; + } +#ifdef MTK_MSDC_USE_CMD23 + if ((sbc != NULL) && (sbc->error == (unsigned int)-ETIMEDOUT)) { + if (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK ){ + /* not tuning, go out directly */ + printk("===[%s:%d]==cmd23 timeout==\n", __func__, __LINE__); + goto out; + } + } +#endif + +#ifdef MTK_MSDC_USE_CMD23 + /* cmd->error also set when autocmd23 crc error */ + if ((cmd->error == (unsigned int)-EIO) || (stop && (stop->error == (unsigned int)-EIO)) || + (sbc && (sbc->error == (unsigned int)-EIO))) { +#else if ((cmd->error == (unsigned int)-EIO) || (stop && (stop->error == (unsigned int)-EIO))) { +#endif if (msdc_tune_cmdrsp(host)){ ERR_MSG("failed to updata cmd para"); goto out; @@ -5715,6 +6115,9 @@ static void msdc_ops_request_legacy(struct mmc_host *mmc, struct mmc_request *mr if (data) data->error = 0; if (stop) stop->error = 0; +#ifdef MTK_MSDC_USE_CMD23 + if (sbc) sbc->error = 0; +#endif // check if an app commmand. if (host->app_cmd) { while (msdc_app_cmd(host->mmc, host)) { @@ -5796,6 +6199,7 @@ static void msdc_tune_async_request(struct mmc_host *mmc, struct mmc_request *mr struct mmc_command *cmd; struct mmc_data *data; struct mmc_command *stop = NULL; + struct mmc_command *sbc = NULL; int data_abort = 0; int got_polarity = 0; unsigned long flags; @@ -5831,8 +6235,16 @@ static void msdc_tune_async_request(struct mmc_host *mmc, struct mmc_request *mr cmd = mrq->cmd; data = mrq->cmd->data; if (data) stop = data->stop; - if((cmd->error == 0) && (data && data->error == 0) && (!stop || stop->error == 0)){ - if(cmd->opcode == MMC_READ_SINGLE_BLOCK || cmd->opcode == MMC_READ_MULTIPLE_BLOCK) +#ifdef MTK_MSDC_USE_CMD23 + if (data) sbc = mrq->sbc; +#endif + +#ifdef MTK_MSDC_USE_CMD23 + if(((sbc == NULL) || (sbc && sbc->error == 0)) && (cmd->error == 0) && (data && data->error == 0) && (!stop || stop->error == 0)){ +#else + if((cmd->error == 0) && (data && data->error == 0) && (!stop || stop->error == 0)){ +#endif + if(cmd->opcode == MMC_READ_SINGLE_BLOCK || cmd->opcode == MMC_READ_MULTIPLE_BLOCK) host->read_time_tune = 0; if(cmd->opcode == MMC_WRITE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK) host->write_time_tune = 0; @@ -5863,7 +6275,23 @@ static void msdc_tune_async_request(struct mmc_host *mmc, struct mmc_request *mr spin_lock(&host->lock); goto out; }*/ +#ifdef MTK_MSDC_USE_CMD23 + if ((sbc != NULL) && (sbc->error == (unsigned int)-ETIMEDOUT)) { + if (cmd->opcode == MMC_READ_MULTIPLE_BLOCK || cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK ){ + /* not tuning, go out directly */ + printk("===[%s:%d]==cmd23 timeout==\n", __func__, __LINE__); + goto out; + } + } +#endif + +#ifdef MTK_MSDC_USE_CMD23 + /* cmd->error also set when autocmd23 crc error */ + if ((cmd->error == (unsigned int)-EIO) || (stop && (stop->error == (unsigned int)-EIO)) || + (sbc && (sbc->error == (unsigned int)-EIO))) { +#else if ((cmd->error == (unsigned int)-EIO) || (stop && (stop->error == (unsigned int)-EIO))) { +#endif if (msdc_tune_cmdrsp(host)){ ERR_MSG("failed to updata cmd para"); goto out; @@ -5971,6 +6399,9 @@ static void msdc_tune_async_request(struct mmc_host *mmc, struct mmc_request *mr cmd->error = 0; if (data) data->error = 0; if (stop) stop->error = 0; +#ifdef MTK_MSDC_USE_CMD23 + if (sbc) sbc->error = 0; +#endif host->sw_timeout = 0; if (!is_card_present(host)) { goto out; @@ -6024,6 +6455,313 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq) return; } +static u32 test_delay_bit(u32 delay, u32 bit) +{ + bit %= PAD_DELAY_MAX; + return delay & (1 << bit); +} + +static int get_delay_len(u32 delay, u32 start_bit) +{ + int i; + + for (i = 0; i < (PAD_DELAY_MAX - start_bit); i++) { + if (test_delay_bit(delay, start_bit + i) == 0) + return i; + } + return PAD_DELAY_MAX - start_bit; +} + +static struct msdc_delay_phase get_best_delay(struct msdc_host *host, u32 delay) +{ + int start = 0, len = 0; + int start_final = 0, len_final = 0; + u8 final_phase = 0xff; + struct msdc_delay_phase delay_phase = { 0, }; + + if (delay == 0) { + dev_err(host->dev, "phase error: [map:%x]\n", delay); + dump_stack(); + delay_phase.final_phase = final_phase; + return delay_phase; + } + + while (start < PAD_DELAY_MAX) { + len = get_delay_len(delay, start); + if (len_final < len) { + start_final = start; + len_final = len; + } + start += len ? len : 1; + if (len >= 12 && start_final < 4) + break; + } + + /* The rule is that to find the smallest delay cell */ + if (start_final == 0) + final_phase = (start_final + len_final / 3) % PAD_DELAY_MAX; + else + final_phase = (start_final + len_final / 2) % PAD_DELAY_MAX; + dev_err(host->dev, "phase: [map:%x] [maxlen:%d] [final:%d]\n", + delay, len_final, final_phase); + + delay_phase.maxlen = len_final; + delay_phase.start = start_final; + delay_phase.final_phase = final_phase; + return delay_phase; +} + +static int msdc_send_tuning(struct mmc_host *host, u32 opcode, int *cmd_error) +{ + struct mmc_request mrq = {NULL}; + struct mmc_command cmd = {0}; + struct mmc_data data = {0}; + struct scatterlist sg; + struct mmc_ios *ios = &host->ios; + int size, err = 0; + u8 *data_buf; + + if (ios->bus_width == MMC_BUS_WIDTH_8) + size = 128; + else if (ios->bus_width == MMC_BUS_WIDTH_4) + size = 64; + else + return -EINVAL; + + data_buf = kzalloc(size, GFP_KERNEL); + if (!data_buf) + return -ENOMEM; + + mrq.cmd = &cmd; + mrq.data = &data; + + cmd.opcode = opcode; + cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; + + data.blksz = size; + data.blocks = 1; + data.flags = MMC_DATA_READ; + + /* + * According to the tuning specs, Tuning process + * is normally shorter 40 executions of CMD19, + * and timeout value should be shorter than 150 ms + */ + data.timeout_ns = 150 * NSEC_PER_MSEC; + + data.sg = &sg; + data.sg_len = 1; + sg_init_one(&sg, data_buf, size); + + mmc_wait_for_req(host, &mrq); + + if (cmd_error) + *cmd_error = cmd.error; + + if (cmd.error) { + err = cmd.error; + goto out; + } + + if (data.error) { + err = data.error; + goto out; + } + +out: + kfree(data_buf); + return err; +} + +static int msdc_tune_response(struct mmc_host *mmc, u32 opcode) +{ + struct msdc_host *host = mmc_priv(mmc); + u32 base = host->base; + u32 rise_delay = 0, fall_delay = 0; + struct msdc_delay_phase final_rise_delay, final_fall_delay = { 0,}; + u8 final_delay, final_maxlen; + int cmd_err; + int i, j; + int repeat = 1; +#define VENDOR_SANDISK 0x03 +#define OEMID_SANDISK 0x5344 + if (mmc->card && mmc->card->cid.manfid == VENDOR_SANDISK && + mmc->card->cid.oemid == OEMID_SANDISK) + repeat = 3; + + sdr_clr_bits(MSDC_IOCON, MSDC_IOCON_RSPL); + for (i = 0; i < PAD_DELAY_MAX; i++) { + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRDLY, i); + for (j = 0; j < repeat; j++) { + msdc_send_tuning(mmc, opcode, &cmd_err); + if (!cmd_err) { + rise_delay |= (1 << i); + } else { + rise_delay &= ~(1 << i); + break; + } + } + } + final_rise_delay = get_best_delay(host, rise_delay); + /* if rising edge has enough margin, then do not scan falling edge */ + if (final_rise_delay.maxlen >= 12 || + (final_rise_delay.start == 0 && final_rise_delay.maxlen >= 4)) + goto skip_fall; + + sdr_set_bits(MSDC_IOCON, MSDC_IOCON_RSPL); + for (i = 0; i < PAD_DELAY_MAX; i++) { + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRDLY, i); + for (j = 0; j < repeat; j++) { + msdc_send_tuning(mmc, opcode, &cmd_err); + if (!cmd_err) { + fall_delay |= (1 << i); + } else { + fall_delay &= ~(1 << i); + break; + } + } + } + final_fall_delay = get_best_delay(host, fall_delay); + +skip_fall: + final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen); + if (final_maxlen == final_rise_delay.maxlen) { + sdr_clr_bits(MSDC_IOCON, MSDC_IOCON_RSPL); + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRDLY, + final_rise_delay.final_phase); + final_delay = final_rise_delay.final_phase; + } else { + sdr_set_bits(MSDC_IOCON, MSDC_IOCON_RSPL); + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRDLY, + final_fall_delay.final_phase); + final_delay = final_fall_delay.final_phase; + } + + dev_err(host->dev, "Final cmd pad delay: %x\n", final_delay); + return final_delay == 0xff ? -EIO : 0; +} + +static int msdc_tune_data(struct mmc_host *mmc, u32 opcode) +{ + struct msdc_host *host = mmc_priv(mmc); + u32 base = host->base; + u32 rise_delay = 0, fall_delay = 0; + struct msdc_delay_phase final_rise_delay, final_fall_delay = { 0, }; + u8 final_delay, final_maxlen; + int cmd_err; + int i, ret; + + sdr_clr_bits(MSDC_IOCON, MSDC_IOCON_DSPL); + sdr_clr_bits(MSDC_IOCON, MSDC_IOCON_W_DSPL); + for (i = 0; i < PAD_DELAY_MAX; i++) { + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATRRDLY, i); + ret = msdc_send_tuning(mmc, opcode, &cmd_err); + if (!ret) + rise_delay |= (1 << i); + else if (cmd_err) { + pr_err("++re-tune cmd_err: %d\n", cmd_err); + /* in this case, need retune response */ + ret = msdc_tune_response(mmc, opcode); + if (ret) + break; + } + } + final_rise_delay = get_best_delay(host, rise_delay); + if (final_rise_delay.maxlen >= 12 || + (final_rise_delay.start == 0 && final_rise_delay.maxlen >= 4)) + goto skip_fall; + + sdr_set_bits(MSDC_IOCON, MSDC_IOCON_DSPL); + sdr_set_bits(MSDC_IOCON, MSDC_IOCON_W_DSPL); + for (i = 0; i < PAD_DELAY_MAX; i++) { + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATRRDLY, i); + ret = msdc_send_tuning(mmc, opcode, &cmd_err); + if (!ret) + fall_delay |= (1 << i); + else if (cmd_err) { + pr_err("--re-tune cmd_err: %d\n", cmd_err); + /* in this case, need retune response */ + ret = msdc_tune_response(mmc, opcode); + if (ret) + break; + } + } + final_fall_delay = get_best_delay(host, fall_delay); + +skip_fall: + final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen); + if (final_maxlen == final_rise_delay.maxlen) { + sdr_clr_bits(MSDC_IOCON, MSDC_IOCON_DSPL); + sdr_clr_bits(MSDC_IOCON, MSDC_IOCON_W_DSPL); + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATRRDLY, + final_rise_delay.final_phase); + final_delay = final_rise_delay.final_phase; + } else { + sdr_set_bits(MSDC_IOCON, MSDC_IOCON_DSPL); + sdr_set_bits(MSDC_IOCON, MSDC_IOCON_W_DSPL); + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATRRDLY, + final_fall_delay.final_phase); + final_delay = final_fall_delay.final_phase; + } + + dev_err(host->dev, "Final data pad delay: %x\n", final_delay); + return final_delay == 0xff ? -EIO : 0; +} + +int msdc_execute_tuning(struct mmc_host *mmc, u32 opcode) +{ + struct msdc_host *host = mmc_priv(mmc); + u32 base = host->base; + int ret; + u32 ddr = 0; + u32 clkmode = 0; + + sdr_get_field(MSDC_CFG, MSDC_CFG_CKMOD, clkmode); + ddr = (clkmode == 2) ? 1 : 0; + + if (host->hw->host_function == MSDC_SD) { +retune: + /* do some initialization for tune */ + sdr_write32(MSDC_IOCON, 0); + sdr_write32(MSDC_PAD_TUNE, 0); + sdr_set_bits(MSDC_CFG, MSDC_CFG_CKPDN); + sdr_set_field(MSDC_PATCH_BIT0, MSDC_INT_DAT_LATCH_CK_SEL, 1); + sdr_set_field(MSDC_PATCH_BIT0, MSDC_CKGEN_MSDC_DLY_SEL, 0); + sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_WRDAT_CRCS, 2); + sdr_get_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_WRDAT_CRCS, + host->saved_para.wrdat_crc_ta_cntr); + sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_CMD_RSP, 2); + sdr_get_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_CMD_RSP, + host->saved_para.cmd_resp_ta_cntr); + + if (!is_card_present(host)) { + pr_err("Card was not present!!\n"); + return -ENOMEDIUM; + } + + ret = msdc_tune_response(mmc, opcode); + if (ret == -EIO) { + dev_err(host->dev, "Tune response fail!\n"); + goto out; + } + ret = msdc_tune_data(mmc, opcode); + if (ret == -EIO) { + dev_err(host->dev, "Tune data fail!\n"); + goto out; + } + return ret; + +out: + if (host->mclk < 25000000) { + pr_err("CMD 19 tune fail!\n"); + return -EIO; + } + msdc_set_mclk(host, ddr, host->mclk / 2); /* lower to 50Mhz */ + goto retune; + } + + return 0; +} /* called by ops.set_ios */ static void msdc_set_buswidth(struct msdc_host *host, u32 width) @@ -6052,7 +6790,42 @@ static void msdc_set_buswidth(struct msdc_host *host, u32 width) N_MSG(CFG, "Bus Width = %d", width); } +static void msdc_reset_delay_regs(struct msdc_host *host) +{ + u32 base = host->base; + struct msdc_hw *hw = host->hw; + u32 cur_rxdly0, cur_rxdly1; + sdr_write32(MSDC_PAD_TUNE, 0x00000000); + sdr_write32(MSDC_IOCON, 0x00000000); + + sdr_set_field(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1); + cur_rxdly0 = ((hw->dat0rddly & 0x1F) << 24) | ((hw->dat1rddly & 0x1F) << 16) | + ((hw->dat2rddly & 0x1F) << 8) | ((hw->dat3rddly & 0x1F) << 0); + cur_rxdly1 = ((hw->dat4rddly & 0x1F) << 24) | ((hw->dat5rddly & 0x1F) << 16) | + ((hw->dat6rddly & 0x1F) << 8) | ((hw->dat7rddly & 0x1F) << 0); + + if (MSDC_EMMC == host->hw->host_function){ + //for write tuning, only tuning DAT0 + sdr_write32(MSDC_DAT_RDDLY0, cur_rxdly0); + } else { + sdr_write32(MSDC_DAT_RDDLY0, 0x00000000); + } + + sdr_write32(MSDC_DAT_RDDLY1, 0x00000000); + + if ((host->hw->host_function == MSDC_EMMC) || (host->hw->host_function == MSDC_SD)){ + sdr_write32(MSDC_PATCH_BIT1, 0xFFFF00C9); + } else { + sdr_write32(MSDC_PATCH_BIT1, 0xFFFF0009); + } + host->saved_para.pad_tune = (((hw->cmdrrddly & 0x1F) << 22) | + ((hw->cmdrddly & 0x1F) << 16) | ((hw->datwrddly & 0x1F) << 0)); + host->saved_para.ddly0 = cur_rxdly0; + host->saved_para.ddly1 = cur_rxdly1; + sdr_get_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_CMD_RSP, host->saved_para.cmd_resp_ta_cntr); + sdr_get_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_WRDAT_CRCS, host->saved_para.wrdat_crc_ta_cntr); +} /* ops.set_ios */ @@ -6099,6 +6872,9 @@ static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) switch (ios->power_mode) { case MMC_POWER_OFF: case MMC_POWER_UP: + if (host->hw->host_function == MSDC_SD) { + msdc_reset_delay_regs(host); + } #ifndef FPGA_PLATFORM msdc_set_driving(host,hw,0); #endif @@ -6490,8 +7266,20 @@ static void msdc_ops_stop(struct mmc_host *mmc,struct mmc_request *mrq) return; //sdr_get_field(SDC_CFG ,SDC_CFG_BUSWIDTH ,bus_mode); - if((host->autocmd == MSDC_AUTOCMD12) && (!(host->error & REQ_DAT_ERR))) - return; +#ifndef MTK_MSDC_USE_CMD23 + if((host->autocmd & MSDC_AUTOCMD12)) + return; +#else + if (host->hw->host_function == MSDC_EMMC) { + /* if transfer error occur, cmd12 will send under msdc_abort_data() */ + if (mrq->sbc) + return; + } else { + if ((host->autocmd & MSDC_AUTOCMD12)) + return; + } +#endif /* end of MTK_MSDC_USE_CMD23 */ + N_MSG(OPS, "MSDC Stop for non-autocmd12 host->error(%d)host->autocmd(%d)",host->error,host->autocmd); err = msdc_do_command(host, mrq->stop, 0, CMD_TIMEOUT); if(err){ @@ -6569,6 +7357,7 @@ static struct mmc_host_ops mt_msdc_ops = { .send_stop = msdc_ops_stop, .dma_error_reset = msdc_dma_error_reset, .check_written_data = msdc_check_written_data, + .execute_tuning = msdc_execute_tuning }; /*--------------------------------------------------------------------------*/ @@ -6599,6 +7388,11 @@ static void msdc1_eint_handler(void) } else { mt_eint_set_polarity(CUST_EINT_MSDC1_INS_NUM, MT_POLARITY_HIGH); } + +#ifdef CONFIG_MMC_ERR_REMOVE + if (host->mmc->rest_remove_flags) + host->mmc->rest_remove_flags = false; +#endif //mt_eint_set_polarity(EINT_MSDC1_INS_NUM, host->sd_cd_polarity); if(got_bad_card == 0) @@ -6746,11 +7540,19 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) if (intsts & MSDC_INT_DATTMO){ data->error = (unsigned int)-ETIMEDOUT; IRQ_MSG("XXX CMD<%d> Arg<0x%.8x> MSDC_INT_DATTMO", host->mrq->cmd->opcode, host->mrq->cmd->arg); + if (host->hw->host_function == MSDC_SD) + host->datatimeout_count++; } else if (intsts & MSDC_INT_DATCRCERR){ data->error = (unsigned int)-EIO; IRQ_MSG("XXX CMD<%d> Arg<0x%.8x> MSDC_INT_DATCRCERR, SDC_DCRC_STS<0x%x>", - host->mrq->cmd->opcode, host->mrq->cmd->arg, sdr_read32(SDC_DCRC_STS)); + host->mrq->cmd->opcode, host->mrq->cmd->arg, sdr_read32(SDC_DCRC_STS)); + if (host->hw->host_function == MSDC_SD) { + if (FILTER_INVALIDCMD(host->mrq->cmd->opcode)) + host->crc_invalid_count++; + else + host->crc_count++; + } } //if(sdr_read32(MSDC_INTEN) & MSDC_INT_XFER_COMPL) { @@ -6777,13 +7579,23 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) u32 *arsp = &stop->resp[0]; *arsp = sdr_read32(SDC_ACMD_RESP); } - else if (intsts & MSDC_INT_ACMDCRCERR) { - stop->error =(unsigned int)-EIO; - host->error |= REQ_STOP_EIO; - msdc_reset_hw(host->id); - } + else if (intsts & MSDC_INT_ACMDCRCERR) { + stop->error =(unsigned int)-EIO; + host->error |= REQ_STOP_EIO; + if (host->hw->host_function == MSDC_SD) { + if (FILTER_INVALIDCMD(host->mrq->cmd->opcode)) + host->crc_invalid_count++; + else + host->crc_count++; + } + + msdc_reset_hw(host->id); + } else if (intsts & MSDC_INT_ACMDTMO) { stop->error =(unsigned int)-ETIMEDOUT; + if (host->hw->host_function == MSDC_SD) + host->cmdtimeout_count++; + host->error |= REQ_STOP_TMO; msdc_reset_hw(host->id); } @@ -6824,12 +7636,21 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) *rsp = sdr_read32(SDC_RESP0); break; } - } else if (intsts & MSDC_INT_RSPCRCERR) { - cmd->error = (unsigned int)-EIO; - IRQ_MSG("XXX CMD<%d> MSDC_INT_RSPCRCERR Arg<0x%.8x>",cmd->opcode, cmd->arg); - msdc_reset_hw(host->id); + } else if (intsts & MSDC_INT_RSPCRCERR) { + cmd->error = (unsigned int)-EIO; + IRQ_MSG("XXX CMD<%d> MSDC_INT_RSPCRCERR Arg<0x%.8x>",cmd->opcode, cmd->arg); + if (host->hw->host_function == MSDC_SD) { + if (FILTER_INVALIDCMD(cmd->opcode)) + host->crc_invalid_count++; + else + host->crc_count++; + } + + msdc_reset_hw(host->id); } else if (intsts & MSDC_INT_CMDTMO) { + if (host->hw->host_function == MSDC_SD) + host->cmdtimeout_count++; cmd->error = (unsigned int)-ETIMEDOUT; IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO Arg<0x%.8x>",cmd->opcode, cmd->arg); msdc_reset_hw(host->id); @@ -7186,65 +8007,6 @@ struct gendisk * mmc_get_disk(struct mmc_card *card) return md->disk; } -#if defined(CONFIG_MTK_EMMC_SUPPORT) && defined(CONFIG_PROC_FS) - -static struct proc_dir_entry *proc_emmc; - -static inline int emmc_proc_info(struct seq_file *m, struct hd_struct *this) -{ - int i = 0; - char *no_partition_name = "n/a"; - - for (i = 0; i < PART_NUM; i++) { - if (PartInfo[i].partition_idx != 0 && PartInfo[i].partition_idx == this->partno) { - break; - } - } - - return seq_printf(m, "emmc_p%d: %8.8x %8.8x \"%s\"\n", this->partno, - (unsigned int)this->start_sect, - (unsigned int)this->nr_sects, (i >= PART_NUM ? no_partition_name : PartInfo[i].name)); -} - -static int proc_emmc_show(struct seq_file *m, void *v) -{ - struct disk_part_iter piter; - struct hd_struct *part; - struct msdc_host *host; - struct gendisk *disk; - - /* emmc always in slot0 */ - host = msdc_get_host(MSDC_EMMC,MSDC_BOOT_EN,0); - BUG_ON(!host); - BUG_ON(!host->mmc); - BUG_ON(!host->mmc->card); - disk = mmc_get_disk(host->mmc->card); - - seq_printf(m, "partno: start_sect nr_sects partition_name\n"); - disk_part_iter_init(&piter, disk, 0); - while ((part = disk_part_iter_next(&piter))){ - emmc_proc_info(m, part); - } - disk_part_iter_exit(&piter); - - return 0; -} - -static int proc_emmc_open(struct inode *inode, struct file *file) -{ - return single_open(file, proc_emmc_show, NULL); -} - - -static const struct file_operations proc_emmc_fops = { - .open = proc_emmc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -#endif /* CONFIG_MTK_EMMC_SUPPORT && CONFIG_PROC_FS */ - /* This is called by run_timer_softirq */ static void msdc_timer_pm(unsigned long data) { @@ -7638,7 +8400,15 @@ static int msdc_drv_probe(struct platform_device *pdev) mmc->caps |= MMC_CAP_NONREMOVABLE; //else //mmc->caps2 |= MMC_CAP2_DETECT_ON_ERR; - mmc->caps |= MMC_CAP_ERASE | MMC_CAP_WAIT_WHILE_BUSY; +#ifdef MTK_MSDC_USE_CMD23 + if (hw->host_function == MSDC_EMMC){ + mmc->caps |= MMC_CAP_ERASE | MMC_CAP_CMD23; + } else { + mmc->caps |= MMC_CAP_ERASE; + } +#else + mmc->caps |= MMC_CAP_ERASE | MMC_CAP_WAIT_WHILE_BUSY; +#endif /* MMC core transfer sizes tunable parameters */ //mmc->max_hw_segs = MAX_HW_SGMTS; mmc->max_segs = MAX_HW_SGMTS; @@ -7649,6 +8419,7 @@ static int msdc_drv_probe(struct platform_device *pdev) mmc->max_blk_count = mmc->max_req_size; host = mmc_priv(mmc); + host->dev = &pdev->dev; host->hw = hw; host->mmc = mmc; host->id = pdev->id; @@ -7685,10 +8456,27 @@ static int msdc_drv_probe(struct platform_device *pdev) //host->card_inserted = hw->flags & MSDC_REMOVABLE ? 0 : 1; host->timeout_ns = 0; host->timeout_clks = DEFAULT_DTOC * 1048576; - if(host->hw->host_function != MSDC_SDIO) - host->autocmd = MSDC_AUTOCMD12; - else - host->autocmd = 0; + +#ifndef MTK_MSDC_USE_CMD23 + if(host->hw->host_function != MSDC_SDIO) + host->autocmd |= MSDC_AUTOCMD12; + else + host->autocmd &= ~MSDC_AUTOCMD12; +#else + if (host->hw->host_function == MSDC_EMMC){ + host->autocmd &= ~MSDC_AUTOCMD12; + +#if (1 == MSDC_USE_AUTO_CMD23) + host->autocmd |= MSDC_AUTOCMD23; +#endif + + } else if (host->hw->host_function == MSDC_SD){ + host->autocmd |= MSDC_AUTOCMD12; + } else { + host->autocmd &= ~MSDC_AUTOCMD12; + } +#endif /* end of MTK_MSDC_USE_CMD23 */ + host->mrq = NULL; //init_MUTEX(&host->sem); /* we don't need to support multiple threads access */ @@ -7823,7 +8611,8 @@ static int msdc_drv_probe(struct platform_device *pdev) mt_set_gpio_out(1, 0); //1-high, 0-low #endif - return 0; + msdc_add_device_attrs(host, msdc_attrs); + return 0; free_irq: free_irq(irq, host); @@ -7860,6 +8649,7 @@ static int msdc_drv_remove(struct platform_device *pdev) platform_set_drvdata(pdev, NULL); mmc_remove_host(host->mmc); + msdc_remove_device_attrs(host, msdc_attrs); msdc_deinit_hw(host); tasklet_kill(&host->card_tasklet); @@ -7943,6 +8733,10 @@ static int msdc_drv_resume(struct platform_device *pdev) } state.event = PM_EVENT_RESUME; if (mmc && (host->hw->flags & MSDC_SYS_SUSPEND)) {/* will set for card */ + if (host->hw->host_function == MSDC_SD) { + host->pc_suspend++; + } + msdc_pm(state, (void*)host); } @@ -7978,20 +8772,6 @@ static int __init mt_msdc_init(void) return ret; } - #if defined(CONFIG_MTK_EMMC_SUPPORT) && defined(CONFIG_PROC_FS) - if ((proc_emmc = proc_create( "emmc", 0, NULL, &proc_emmc_fops))) - ; - #endif /* CONFIG_MTK_EMMC_SUPPORT && CONFIG_PROC_FS */ - -//[PLATFORM]Added-begin by SZTCT.leo.guo 04.18.2015, Fixed TF card hotplug issue. -#ifdef CFG_DEV_MSDC1_CORRECTION - printk(KERN_CRIT "Fixed msdc configuration correction.\n "); - mt_set_gpio_mode(GPIO_MSDC1_INSI, GPIO_MODE_00); - mt_set_gpio_dir(GPIO_MSDC1_INSI, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO_MSDC1_INSI, GPIO_PULL_ENABLE); - mt_set_gpio_pull_select(GPIO_MSDC1_INSI, GPIO_PULL_UP); -#endif -//[PLATFORM]Added-end by SZTCT.leo.guo 04.18.2015 printk(KERN_INFO DRV_NAME ": MediaTek MSDC Driver\n"); msdc_debug_proc_init(); diff --git a/drivers/misc/mediatek/mmp/src/Makefile b/drivers/misc/mediatek/mmp/src/Makefile new file mode 100644 index 00000000000..e89bed789f8 --- /dev/null +++ b/drivers/misc/mediatek/mmp/src/Makefile @@ -0,0 +1,3 @@ + +obj-y += mmprofile.o + diff --git a/drivers/misc/mediatek/mmp/src/mmprofile.c b/drivers/misc/mediatek/mmp/src/mmprofile.c new file mode 100644 index 00000000000..162de94186e --- /dev/null +++ b/drivers/misc/mediatek/mmp/src/mmprofile.c @@ -0,0 +1,1842 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +//#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#define MMPROFILE_INTERNAL +#include +/* #pragma GCC optimize ("O0") */ +#define MMP_DEVNAME "mmp" + +#define MMProfileDefaultBufferSize 0x18000 +#define MMProfileDefaultMetaBufferSize 0x800000 + +#define MMProfileDumpBlockSize 1024*4 + +#define TAG_MMPROFILE "mmprofile" + +static bool mmp_log_on = false; + +#define MMP_LOG(prio,fmt, arg...) \ + do { \ + if (mmp_log_on) pr_debug("MMP:%s(): "fmt"\n", __func__,##arg); \ + }while (0) + +#define MMP_MSG(fmt, arg...) \ + do { \ + pr_notice("MMP: %s(): "fmt"\n", __func__,##arg); \ + }while (0) + +typedef struct { + MMProfile_EventInfo_t event_info; + struct list_head list; +} MMProfile_RegTable_t; + +typedef struct { + struct list_head list; + unsigned int block_size; + unsigned int cookie; + MMP_MetaDataType data_type; + unsigned int data_size; + unsigned char meta_data[1]; +} MMProfile_MetaDataBlock_t; + +static int bMMProfileInitBuffer; +static unsigned int MMProfile_MetaDataCookie = 1; +static DEFINE_MUTEX(MMProfile_BufferInitMutex); +static DEFINE_MUTEX(MMProfile_RegTableMutex); +static DEFINE_MUTEX(MMProfile_MetaBufferMutex); +static MMProfile_Event_t *pMMProfileRingBuffer; +static unsigned char *pMMProfileMetaBuffer; +static MMProfile_Global_t MMProfileGlobals __attribute__ ((aligned(PAGE_SIZE))) = { + .buffer_size_record = MMProfileDefaultBufferSize, + .new_buffer_size_record = MMProfileDefaultBufferSize, + .buffer_size_bytes = ((sizeof(MMProfile_Event_t) * MMProfileDefaultBufferSize + (PAGE_SIZE - 1)) & (~(PAGE_SIZE - 1))), + .record_size = sizeof(MMProfile_Event_t), + .meta_buffer_size = MMProfileDefaultMetaBufferSize, + .new_meta_buffer_size = MMProfileDefaultMetaBufferSize, + .selected_buffer = MMProfilePrimaryBuffer, + .reg_event_index = sizeof(MMProfileStaticEvents) / sizeof(MMP_StaticEvent_t), + .max_event_count = MMProfileMaxEventCount, +}; +static MMProfile_RegTable_t MMProfile_RegTable = { + .list = LIST_HEAD_INIT(MMProfile_RegTable.list), +}; + +static struct list_head MMProfile_MetaBufferList = LIST_HEAD_INIT(MMProfile_MetaBufferList); +static unsigned char MMProfileDumpBlock[MMProfileDumpBlockSize]; + +/* Internal functions begin */ +static int MMProfileRegisterStaticEvents(int sync); + +void MMProfileStart(int start); + +unsigned int MMProfileGetDumpSize(void) +{ + unsigned int size; + MMP_LOG(ANDROID_LOG_DEBUG, "+enable %u, start %u", MMProfileGlobals.enable, + MMProfileGlobals.start); + MMProfileStart(0); + if (MMProfileRegisterStaticEvents(0) == 0) + return 0; + size = sizeof(MMProfile_Global_t); + size += sizeof(MMProfile_EventInfo_t) * (MMProfileGlobals.reg_event_index + 1); + size += MMProfileGlobals.buffer_size_bytes; + MMP_LOG(ANDROID_LOG_DEBUG, "-size %u", size); + return size; +} + +static unsigned int MMProfileFillDumpBlock(void *pSrc, void *pDst, + unsigned int *pSrcPos, unsigned int *pDstPos, + unsigned int SrcSize, unsigned int DstSize) +{ + unsigned int SrcLeft = SrcSize - *pSrcPos; + unsigned int DstLeft = DstSize - *pDstPos; + if ((SrcLeft == 0) || (DstLeft == 0)) + return 0; + if (SrcLeft < DstLeft) { + memcpy(((unsigned char *)pDst) + *pDstPos, ((unsigned char *)pSrc) + *pSrcPos, + SrcLeft); + *pSrcPos += SrcLeft; + *pDstPos += SrcLeft; + return SrcLeft; + } else { + memcpy(((unsigned char *)pDst) + *pDstPos, ((unsigned char *)pSrc) + *pSrcPos, + DstLeft); + *pSrcPos += DstLeft; + *pDstPos += DstLeft; + return DstLeft; + } +} + +void MMProfileGetDumpBuffer(unsigned int Start, unsigned long *pAddr, unsigned int *pSize) +{ + unsigned int total_pos = Start; + unsigned int region_pos; + unsigned int block_pos = 0; + unsigned int region_base = 0; + unsigned int copy_size; + *pAddr = (unsigned long)MMProfileDumpBlock; + *pSize = MMProfileDumpBlockSize; + if (!bMMProfileInitBuffer) { + MMP_LOG(ANDROID_LOG_DEBUG, "Ringbuffer is not initialized"); + *pSize = 0; + return; + } + if (total_pos < (region_base + sizeof(MMProfile_Global_t))) { + /* Global structure */ + region_pos = total_pos; + copy_size = + MMProfileFillDumpBlock(&MMProfileGlobals, MMProfileDumpBlock, ®ion_pos, + &block_pos, sizeof(MMProfile_Global_t), + MMProfileDumpBlockSize); + if (block_pos == MMProfileDumpBlockSize) + return; + total_pos = region_base + sizeof(MMProfile_Global_t); + } + region_base += sizeof(MMProfile_Global_t); + if (MMProfileRegisterStaticEvents(0) == 0) { + MMP_LOG(ANDROID_LOG_DEBUG, "static event not register"); + *pSize = 0; + return; + } + if (total_pos < + (region_base + + sizeof(MMProfile_EventInfo_t) * (MMProfileGlobals.reg_event_index + 1))) { + /* Register table */ + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + MMProfile_EventInfo_t EventInfoDummy = { 0, "" }; + unsigned int SrcPos; + unsigned int Pos = 0; + region_pos = total_pos - region_base; + if (mutex_trylock(&MMProfile_RegTableMutex) == 0) { + MMP_LOG(ANDROID_LOG_DEBUG, "fail to get reg lock"); + *pSize = 0; + return; + } + if (Pos + sizeof(MMProfile_EventInfo_t) > region_pos) { + if (region_pos > Pos) + SrcPos = region_pos - Pos; + else + SrcPos = 0; + copy_size = + MMProfileFillDumpBlock(&EventInfoDummy, MMProfileDumpBlock, &SrcPos, + &block_pos, sizeof(MMProfile_EventInfo_t), + MMProfileDumpBlockSize); + if (block_pos == MMProfileDumpBlockSize) { + mutex_unlock(&MMProfile_RegTableMutex); + return; + } + } + Pos += sizeof(MMProfile_EventInfo_t); + index = MMP_RootEvent; + list_for_each_entry(pRegTable, &(MMProfile_RegTable.list), list) { + if (Pos + sizeof(MMProfile_EventInfo_t) > region_pos) { + if (region_pos > Pos) + SrcPos = region_pos - Pos; + else + SrcPos = 0; + copy_size = + MMProfileFillDumpBlock(&(pRegTable->event_info), + MMProfileDumpBlock, &SrcPos, &block_pos, + sizeof(MMProfile_EventInfo_t), + MMProfileDumpBlockSize); + if (block_pos == MMProfileDumpBlockSize) { + mutex_unlock(&MMProfile_RegTableMutex); + return; + } + } + Pos += sizeof(MMProfile_EventInfo_t); + index++; + } + mutex_unlock(&MMProfile_RegTableMutex); + total_pos = + region_base + + sizeof(MMProfile_EventInfo_t) * (MMProfileGlobals.reg_event_index + 1); + } + region_base += sizeof(MMProfile_EventInfo_t) * (MMProfileGlobals.reg_event_index + 1); + if (total_pos < (region_base + MMProfileGlobals.buffer_size_bytes)) { + /* Primary buffer */ + region_pos = total_pos - region_base; + copy_size = + MMProfileFillDumpBlock(pMMProfileRingBuffer, MMProfileDumpBlock, ®ion_pos, + &block_pos, MMProfileGlobals.buffer_size_bytes, + MMProfileDumpBlockSize); + if (block_pos == MMProfileDumpBlockSize) { + return; + } + } else { + *pSize = 0; + } + MMP_LOG(ANDROID_LOG_DEBUG, "end t=%u,r =%u,block_pos=%u", total_pos, region_base, + block_pos); + *pSize = block_pos; +} + +static void MMProfileInitBuffer(void) +{ + if (!MMProfileGlobals.enable) + return; + if (in_interrupt()) + return; + mutex_lock(&MMProfile_BufferInitMutex); + if ((!bMMProfileInitBuffer) || + (MMProfileGlobals.buffer_size_record != MMProfileGlobals.new_buffer_size_record) || + (MMProfileGlobals.meta_buffer_size != MMProfileGlobals.new_meta_buffer_size)) { + /* Initialize */ + /* Allocate memory. */ + unsigned int bResetRingBuffer = 0; + unsigned int bResetMetaBuffer = 0; + if (!pMMProfileRingBuffer) { + MMProfileGlobals.buffer_size_record = + MMProfileGlobals.new_buffer_size_record; + MMProfileGlobals.buffer_size_bytes = + ((sizeof(MMProfile_Event_t) * MMProfileGlobals.buffer_size_record + + (PAGE_SIZE - 1)) & (~(PAGE_SIZE - 1))); + bResetRingBuffer = 1; + } else if (MMProfileGlobals.buffer_size_record != + MMProfileGlobals.new_buffer_size_record) { + vfree(pMMProfileRingBuffer); + MMProfileGlobals.buffer_size_record = + MMProfileGlobals.new_buffer_size_record; + MMProfileGlobals.buffer_size_bytes = + ((sizeof(MMProfile_Event_t) * MMProfileGlobals.buffer_size_record + + (PAGE_SIZE - 1)) & (~(PAGE_SIZE - 1))); + bResetRingBuffer = 1; + } + if (bResetRingBuffer) { + pMMProfileRingBuffer = + (MMProfile_Event_t *) vmalloc(MMProfileGlobals.buffer_size_bytes); + } + MMP_LOG(ANDROID_LOG_DEBUG, "pMMProfileRingBuffer=0x%08lx", + (unsigned long)pMMProfileRingBuffer); + + if (!pMMProfileMetaBuffer) { + MMProfileGlobals.meta_buffer_size = MMProfileGlobals.new_meta_buffer_size; + bResetMetaBuffer = 1; + } else if (MMProfileGlobals.meta_buffer_size != + MMProfileGlobals.new_meta_buffer_size) { + vfree(pMMProfileMetaBuffer); + MMProfileGlobals.meta_buffer_size = MMProfileGlobals.new_meta_buffer_size; + bResetMetaBuffer = 1; + } + if (bResetMetaBuffer) { + pMMProfileMetaBuffer = + (unsigned char *)vmalloc(MMProfileGlobals.meta_buffer_size); + } + MMP_LOG(ANDROID_LOG_DEBUG, "pMMProfileMetaBuffer=0x%08lx", + (unsigned long)pMMProfileMetaBuffer); + + if ((!pMMProfileRingBuffer) || (!pMMProfileMetaBuffer)) { + if (pMMProfileRingBuffer) { + vfree(pMMProfileRingBuffer); + pMMProfileRingBuffer = NULL; + } + if (pMMProfileMetaBuffer) { + vfree(pMMProfileMetaBuffer); + pMMProfileMetaBuffer = NULL; + } + bMMProfileInitBuffer = 0; + mutex_unlock(&MMProfile_BufferInitMutex); + MMP_LOG(ANDROID_LOG_DEBUG, "Cannot allocate buffer"); + return; + } + + if (bResetRingBuffer) + memset((void *)(pMMProfileRingBuffer), 0, + MMProfileGlobals.buffer_size_bytes); + if (bResetMetaBuffer) { + memset((void *)(pMMProfileMetaBuffer), 0, + MMProfileGlobals.meta_buffer_size); + /* Initialize the first block in meta buffer. */ + { + MMProfile_MetaDataBlock_t *pBlock = + (MMProfile_MetaDataBlock_t *) pMMProfileMetaBuffer; + pBlock->block_size = MMProfileGlobals.meta_buffer_size; + INIT_LIST_HEAD(&MMProfile_MetaBufferList); + list_add_tail(&(pBlock->list), &MMProfile_MetaBufferList); + } + } + bMMProfileInitBuffer = 1; + } + mutex_unlock(&MMProfile_BufferInitMutex); +} + +static void MMProfileResetBuffer(void) +{ + if (!MMProfileGlobals.enable) + return; + if (bMMProfileInitBuffer) { + memset((void *)(pMMProfileRingBuffer), 0, MMProfileGlobals.buffer_size_bytes); + MMProfileGlobals.write_pointer = 0; + mutex_lock(&MMProfile_MetaBufferMutex); + MMProfile_MetaDataCookie = 1; + memset((void *)(pMMProfileMetaBuffer), 0, MMProfileGlobals.meta_buffer_size); + /* Initialize the first block in meta buffer. */ + { + MMProfile_MetaDataBlock_t *pBlock = + (MMProfile_MetaDataBlock_t *) pMMProfileMetaBuffer; + pBlock->block_size = MMProfileGlobals.meta_buffer_size; + INIT_LIST_HEAD(&MMProfile_MetaBufferList); + list_add_tail(&(pBlock->list), &MMProfile_MetaBufferList); + } + mutex_unlock(&MMProfile_MetaBufferMutex); + } +} + +void MMProfileStart(int start) +{ + MMP_MSG("start: %d", start); + if (!MMProfileGlobals.enable) + return; + MMP_LOG(ANDROID_LOG_DEBUG, "+start %d", start); + if (start && (!MMProfileGlobals.start)) { + MMProfileInitBuffer(); + MMProfileResetBuffer(); + } + MMProfileGlobals.start = start; + MMP_LOG(ANDROID_LOG_DEBUG, "-start=%d", MMProfileGlobals.start); +} + +void MMProfileEnable(int enable) +{ + MMP_MSG("enable: %d", enable); + if (enable) + MMProfileRegisterStaticEvents(1); + MMProfileGlobals.enable = enable; + if (enable == 0) + MMProfileStart(0); +} + +static MMP_Event MMProfileFindEventInt(MMP_Event parent, const char *name) +{ + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + index = MMP_RootEvent; + list_for_each_entry(pRegTable, &(MMProfile_RegTable.list), list) { + if ((parent == 0) || (pRegTable->event_info.parentId == parent)) { + if (strncmp(pRegTable->event_info.name, name, MMProfileEventNameMaxLen) == + 0) { + return index; + } + } + index++; + } + return 0; +} + +static int MMProfileGetEventName(MMP_Event event, char *name, size_t *size) +{ + MMP_Event curr_event = event; /* current event for seraching */ + MMProfile_EventInfo_t *eventInfo[32]; /* event info for all level of the event */ + int infoCnt = 0; + int found = 0; + int ret = -1; + + if ((NULL == name) || (NULL == size)) { + /* parameters invalid */ + return ret; + } + + while (1) { + MMProfile_RegTable_t *pRegTable; + int curr_found = 0; + MMP_Event index = MMP_RootEvent; + + /* check the event */ + if ((MMP_InvalidEvent == curr_event) + || (curr_event > MMProfileGlobals.reg_event_index)) { + /* the event invalid */ + break; + } + + if (infoCnt >= ARRAY_SIZE(eventInfo)) { + /* the level of event is out of limite */ + found = 1; + break; + } + + /* search the info for the event */ + list_for_each_entry(pRegTable, &(MMProfile_RegTable.list), list) { + if (index == curr_event) { + /* find this event */ + curr_found = 1; + eventInfo[infoCnt] = &pRegTable->event_info; + break; + } + index++; + } + + if (!curr_found) { + /* can not find the event */ + break; + } + + + if ((MMP_RootEvent == eventInfo[infoCnt]->parentId) || + (MMP_InvalidEvent == eventInfo[infoCnt]->parentId)) { + /* find all path for the event */ + found = 1; + infoCnt++; + break; + } + + /* search the parent of the event */ + curr_event = eventInfo[infoCnt]->parentId; + infoCnt++; + } + + if (found) { + size_t needLen = 0; + size_t actualLen = 0; + int infoCntUsed = 0; + int i; + + BUG_ON(!(infoCnt > 0)); + + for (i = 0; i < infoCnt; i++) { + needLen += strlen(eventInfo[i]->name) + 1; /* after each name has a ':' or '\0' */ + if (needLen <= *size) { + /* buffer size is ok */ + infoCntUsed = i + 1; + } + } + + for (i = infoCntUsed - 1; i >= 0; i--) { + strcpy(&name[actualLen], eventInfo[i]->name); + actualLen += strlen(eventInfo[i]->name); + if (i > 0) { + /* not the last name */ + name[actualLen] = ':'; + } + actualLen++; + } + + ret = (int)actualLen; + *size = needLen; + } + + return ret; +} + +static int MMProfileConfigEvent(MMP_Event event, char *name, MMP_Event parent, int sync) +{ + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + if (in_interrupt()) + return 0; + if ((event >= MMP_MaxStaticEvent) || + (event >= MMProfileMaxEventCount) || (event == MMP_InvalidEvent)) { + return 0; + } + if (sync) { + mutex_lock(&MMProfile_RegTableMutex); + } else { + if (mutex_trylock(&MMProfile_RegTableMutex) == 0) + return 0; + } + index = MMProfileFindEventInt(parent, name); + if (index) { + mutex_unlock(&MMProfile_RegTableMutex); + return 1; + } + pRegTable = (MMProfile_RegTable_t *) vmalloc(sizeof(MMProfile_RegTable_t)); + if (!pRegTable) { + mutex_unlock(&MMProfile_RegTableMutex); + return 0; + } + strncpy(pRegTable->event_info.name, name, MMProfileEventNameMaxLen); + pRegTable->event_info.name[MMProfileEventNameMaxLen] = 0; + pRegTable->event_info.parentId = parent; + list_add_tail(&(pRegTable->list), &(MMProfile_RegTable.list)); + + mutex_unlock(&MMProfile_RegTableMutex); + return 1; +} + +static int MMProfileRegisterStaticEvents(int sync) +{ + static unsigned int bStaticEventRegistered; + unsigned int static_event_count = 0; + unsigned int i; + int ret = 1; + if (in_interrupt()) + return 0; + if (bStaticEventRegistered) + return 1; + static_event_count = sizeof(MMProfileStaticEvents) / sizeof(MMP_StaticEvent_t); + for (i = 0; i < static_event_count; i++) { + ret = ret + && MMProfileConfigEvent(MMProfileStaticEvents[i].event, + MMProfileStaticEvents[i].name, + MMProfileStaticEvents[i].parent, sync); + } + bStaticEventRegistered = 1; + return ret; +} + +#ifdef CONFIG_TRACING +static unsigned long __read_mostly tracing_mark_write_addr; +static void inline __mt_update_tracing_mark_write_addr(void) +{ + if (unlikely(0 == tracing_mark_write_addr)) + tracing_mark_write_addr = kallsyms_lookup_name("tracing_mark_write"); +} + +static void inline mmp_kernel_trace_begin(char *name) +{ + __mt_update_tracing_mark_write_addr(); + event_trace_printk(tracing_mark_write_addr, "B|%d|%s\n", current->tgid, name); +} + +static void inline mmp_kernel_trace_counter(char *name, int count) +{ + __mt_update_tracing_mark_write_addr(); + event_trace_printk(tracing_mark_write_addr, + "C|%d|%s|%d\n", in_interrupt() ? -1 : current->tgid, name, count); +} + +static void inline mmp_kernel_trace_end(void) +{ + __mt_update_tracing_mark_write_addr(); + event_trace_printk(tracing_mark_write_addr, "E\n"); +} +#else +static void inline mmp_kernel_trace_begin(char *name) +{ +} + +static void inline mmp_kernel_trace_end(void) +{ +} + +static void inline mmp_kernel_trace_counter(char *name, int count) +{ +} +#endif + +// continue to use 32-bit value to store time value (separate into 2) +static void system_time(unsigned int *low, unsigned int *high) +{ +#ifdef CONFIG_64BIT + unsigned long temp; +#else + unsigned long long temp; +#endif + temp = sched_clock(); + *low = (unsigned int) (temp & 0xffffffff); + *high = (unsigned int) ((temp >> 32) & 0xffffffff); + /* MMP_LOG(ANDROID_LOG_VERBOSE,"system_time,0x%08x,0x%08x", *high, *low); */ +} + +static void MMProfileLog_Int(MMP_Event event, MMP_LogType type, unsigned long data1, + unsigned long data2, unsigned int meta_data_cookie) +{ + char name[256]; + size_t prefix_len; + size_t size; + + if (!MMProfileGlobals.enable) + return; + if ((event >= MMP_MaxStaticEvent) || + (event >= MMProfileMaxEventCount) || (event == MMP_InvalidEvent)) + return; + if (bMMProfileInitBuffer && MMProfileGlobals.start + && (MMProfileGlobals.event_state[event] & MMP_EVENT_STATE_ENABLED)) { + MMProfile_Event_t *pEvent = NULL; + unsigned int index; + unsigned int lock; + /* Event ID 0 and 1 are protected. They are not allowed for logging. */ + if (unlikely(event < 2)) + return; + index = + (atomic_inc_return((atomic_t *) &(MMProfileGlobals.write_pointer)) - 1) + % (MMProfileGlobals.buffer_size_record); + lock = atomic_inc_return((atomic_t *) &(pMMProfileRingBuffer[index].lock)); + if (unlikely(lock > 1)) { + /* Do not reduce lock count since it need to be marked as invalid. */ + /* atomic_dec(&(pMMProfile_Globol->ring_buffer[index].lock)); */ + while (1) { + index = + (atomic_inc_return((atomic_t *) &(MMProfileGlobals.write_pointer)) - 1) + % (MMProfileGlobals.buffer_size_record); + lock = atomic_inc_return((atomic_t *) &(pMMProfileRingBuffer[index].lock)); + /* Do not reduce lock count since it need to be marked as invalid. */ + if (likely(lock == 1)) + break; + } + } + pEvent = (MMProfile_Event_t *) &(pMMProfileRingBuffer[index]); + system_time(&(pEvent->timeLow), &(pEvent->timeHigh)); + pEvent->id = event; + pEvent->flag = type; + pEvent->data1 = (unsigned int)data1; + pEvent->data2 = (unsigned int)data2; + pEvent->meta_data_cookie = meta_data_cookie; + lock = atomic_dec_return((atomic_t *) &(pEvent->lock)); + if (unlikely(lock > 0)) { + /* Someone has marked this record as invalid. Kill this record. */ + pEvent->id = 0; + pEvent->lock = 0; + } + + if ((MMProfileGlobals.event_state[event] & MMP_EVENT_STATE_FTRACE) + || (type & MMProfileFlagSystrace)) { + + /* ignore interrupt */ + if(in_interrupt()) + return; + + memset((void *)name, 0, 256); + name[0] = 'M'; name[1] = 'M'; name[2] = 'P'; name[3] = ':'; + prefix_len = strlen(name); + size = sizeof(name) - prefix_len; + + if (MMProfileGetEventName(event, &name[prefix_len], &size) > 0) { + if (type & MMProfileFlagStart) { + mmp_kernel_trace_begin(name); + } else if (type & MMProfileFlagEnd) { + mmp_kernel_trace_end(); + } else if (type & MMProfileFlagPulse) { + mmp_kernel_trace_counter(name, 1); + mmp_kernel_trace_counter(name, 0); + } + } + } + } +} + +static long MMProfileLogMetaInt(MMP_Event event, MMP_LogType type, MMP_MetaData_t *pMetaData, long bFromUser) +{ + unsigned long retn; + if (!MMProfileGlobals.enable) + return 0; + if ((event >= MMP_MaxStaticEvent) || + (event >= MMProfileMaxEventCount) || (event == MMP_InvalidEvent)) + return 0; + if (bMMProfileInitBuffer && MMProfileGlobals.start + && (MMProfileGlobals.event_state[event] & MMP_EVENT_STATE_ENABLED)) { + MMProfile_MetaDataBlock_t *pNode = NULL; + unsigned long block_size; + if (unlikely(!pMetaData)) + return -1; + block_size = + ((offsetof(MMProfile_MetaDataBlock_t, meta_data) + pMetaData->size) + 3) & (~3); + if (block_size > MMProfileGlobals.meta_buffer_size) + return -2; + mutex_lock(&MMProfile_MetaBufferMutex); + pNode = list_entry(MMProfile_MetaBufferList.prev, MMProfile_MetaDataBlock_t, list); + /* If the tail block has been used, move the first block to tail and use it for new meta data. */ + if (pNode->data_size > 0) { + list_move_tail(MMProfile_MetaBufferList.next, &MMProfile_MetaBufferList); + pNode = + list_entry(MMProfile_MetaBufferList.prev, MMProfile_MetaDataBlock_t, list); + } + /* Migrate a block with enough size. The room is collected by sacrificing least recent used blocks. */ + while (pNode->block_size < block_size) { + MMProfile_MetaDataBlock_t *pNextNode = + list_entry(pNode->list.next, MMProfile_MetaDataBlock_t, list); + if (&(pNextNode->list) == &MMProfile_MetaBufferList) + pNextNode = + list_entry(pNextNode->list.next, MMProfile_MetaDataBlock_t, list); + + list_del(&(pNextNode->list)); + pNode->block_size += pNextNode->block_size; + } + /* Split the block if left memory is enough for a new block. */ + if (((unsigned long)pNode + block_size) < + ((unsigned long)pMMProfileMetaBuffer + MMProfileGlobals.meta_buffer_size) + && ((unsigned long)pNode + block_size) > + ((unsigned long)pMMProfileMetaBuffer + MMProfileGlobals.meta_buffer_size - offsetof(MMProfile_MetaDataBlock_t, meta_data))) { + block_size = + (unsigned long)pMMProfileMetaBuffer + MMProfileGlobals.meta_buffer_size - (unsigned long)pNode; + } + if ((pNode->block_size - block_size) >= + offsetof(MMProfile_MetaDataBlock_t, meta_data)) { + MMProfile_MetaDataBlock_t *pNewNode = + (MMProfile_MetaDataBlock_t *) ((unsigned long)pNode + block_size); + if ((unsigned long)pNewNode >= + ((unsigned long)pMMProfileMetaBuffer + MMProfileGlobals.meta_buffer_size)) + pNewNode = + (MMProfile_MetaDataBlock_t *) ((unsigned long)pNewNode - MMProfileGlobals.meta_buffer_size); + pNewNode->block_size = pNode->block_size - block_size; + pNewNode->data_size = 0; + list_add(&(pNewNode->list), &(pNode->list)); + pNode->block_size = block_size; + } + /* Fill data */ + pNode->data_size = pMetaData->size; + pNode->data_type = pMetaData->data_type; + pNode->cookie = MMProfile_MetaDataCookie; + MMProfileLog_Int(event, type, pMetaData->data1, pMetaData->data2, + MMProfile_MetaDataCookie); + MMProfile_MetaDataCookie++; + if (MMProfile_MetaDataCookie == 0) + MMProfile_MetaDataCookie++; + if (((unsigned long)(pNode->meta_data) + pMetaData->size) > + ((unsigned long)pMMProfileMetaBuffer + MMProfileGlobals.meta_buffer_size)) { + unsigned long left_size = + (unsigned long)pMMProfileMetaBuffer + MMProfileGlobals.meta_buffer_size - (unsigned long)(pNode->meta_data); + if (bFromUser) { + retn = + copy_from_user(pNode->meta_data, pMetaData->pData, left_size); + retn = + copy_from_user(pMMProfileMetaBuffer, + (void *)((unsigned long)(pMetaData->pData) + + left_size), + pMetaData->size - left_size); + } else { + memcpy(pNode->meta_data, pMetaData->pData, left_size); + memcpy(pMMProfileMetaBuffer, + (void *)((unsigned long)(pMetaData->pData) + left_size), + pMetaData->size - left_size); + } + } else { + if (bFromUser) + retn = + copy_from_user(pNode->meta_data, pMetaData->pData, + pMetaData->size); + else + memcpy(pNode->meta_data, pMetaData->pData, pMetaData->size); + } + mutex_unlock(&MMProfile_MetaBufferMutex); + } + return 0; +} + +/* Internal functions end */ + +/* Exposed APIs begin */ +MMP_Event MMProfileRegisterEvent(MMP_Event parent, const char *name) +{ + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + if (!MMProfileGlobals.enable) + return 0; + if (in_interrupt()) + return 0; + mutex_lock(&MMProfile_RegTableMutex); + /* index = atomic_inc_return((atomic_t*)&(MMProfileGlobals.reg_event_index)); */ + if (MMProfileGlobals.reg_event_index >= (MMProfileMaxEventCount - 1)) { + mutex_unlock(&MMProfile_RegTableMutex); + return 0; + } + /* Check if this event has already been registered. */ + index = MMProfileFindEventInt(parent, name); + if (index) { + mutex_unlock(&MMProfile_RegTableMutex); + return index; + } + /* Check if the parent exists. */ + if ((parent == 0) || (parent > MMProfileGlobals.reg_event_index)) { + mutex_unlock(&MMProfile_RegTableMutex); + return 0; + } + /* Now register the new event. */ + pRegTable = (MMProfile_RegTable_t *) vmalloc(sizeof(MMProfile_RegTable_t)); + if (!pRegTable) { + mutex_unlock(&MMProfile_RegTableMutex); + return 0; + } + index = ++(MMProfileGlobals.reg_event_index); + if (strlen(name) > MMProfileEventNameMaxLen) { + memcpy(pRegTable->event_info.name, name, MMProfileEventNameMaxLen); + pRegTable->event_info.name[MMProfileEventNameMaxLen] = 0; + } else + strcpy(pRegTable->event_info.name, name); + pRegTable->event_info.parentId = parent; + list_add_tail(&(pRegTable->list), &(MMProfile_RegTable.list)); + MMProfileGlobals.event_state[index] = 0; + mutex_unlock(&MMProfile_RegTableMutex); + return index; +} +EXPORT_SYMBOL(MMProfileRegisterEvent); + +MMP_Event MMProfileFindEvent(MMP_Event parent, const char *name) +{ + MMP_Event event; + if (!MMProfileGlobals.enable) + return 0; + if (in_interrupt()) + return 0; + mutex_lock(&MMProfile_RegTableMutex); + event = MMProfileFindEventInt(parent, name); + mutex_unlock(&MMProfile_RegTableMutex); + return event; +} +EXPORT_SYMBOL(MMProfileFindEvent); + +void MMProfileEnableFTraceEvent(MMP_Event event, long enable, long ftrace) +{ + unsigned int state; + + if (!MMProfileGlobals.enable) + return; + if ((event < 2) || (event >= MMProfileMaxEventCount)) + return; + state = enable ? MMP_EVENT_STATE_ENABLED : 0; + if (enable && ftrace) + state |= MMP_EVENT_STATE_FTRACE; + MMProfileGlobals.event_state[event] = state; +} +EXPORT_SYMBOL(MMProfileEnableFTraceEvent); + +void MMProfileEnableEvent(MMP_Event event, long enable) +{ + MMProfileEnableFTraceEvent(event, enable, 0); +} +EXPORT_SYMBOL(MMProfileEnableEvent); + +void MMProfileEnableFTraceEventRecursive(MMP_Event event, long enable, long ftrace) +{ + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + index = MMP_RootEvent; + MMProfileEnableFTraceEvent(event, enable, ftrace); + list_for_each_entry(pRegTable, &(MMProfile_RegTable.list), list) { + if (pRegTable->event_info.parentId == event) { + MMProfileEnableFTraceEventRecursive(index, enable, ftrace); + } + index++; + } +} +EXPORT_SYMBOL(MMProfileEnableFTraceEventRecursive); + +void MMProfileEnableEventRecursive(MMP_Event event, long enable) +{ + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + index = MMP_RootEvent; + MMProfileEnableEvent(event, enable); + list_for_each_entry(pRegTable, &(MMProfile_RegTable.list), list) { + if (pRegTable->event_info.parentId == event) { + MMProfileEnableEventRecursive(index, enable); + } + index++; + } +} +EXPORT_SYMBOL(MMProfileEnableEventRecursive); + +long MMProfileQueryEnable(MMP_Event event) +{ + if (!MMProfileGlobals.enable) + return 0; + if ((event >= MMP_MaxStaticEvent) || + (event >= MMProfileMaxEventCount) || (event == MMP_InvalidEvent)) + return MMProfileGlobals.enable; + return !!(MMProfileGlobals.event_state[event] & MMP_EVENT_STATE_ENABLED); +} +EXPORT_SYMBOL(MMProfileQueryEnable); + +void MMProfileLogEx(MMP_Event event, MMP_LogType type, unsigned long data1, unsigned long data2) +{ + MMProfileLog_Int(event, type, data1, data2, 0); +} +EXPORT_SYMBOL(MMProfileLogEx); + +void MMProfileLog(MMP_Event event, MMP_LogType type) +{ + MMProfileLogEx(event, type, 0, 0); +} +EXPORT_SYMBOL(MMProfileLog); + +long MMProfileLogMeta(MMP_Event event, MMP_LogType type, MMP_MetaData_t *pMetaData) +{ + if (!MMProfileGlobals.enable) + return 0; + if (in_interrupt()) + return 0; + return MMProfileLogMetaInt(event, type, pMetaData, 0); +} +EXPORT_SYMBOL(MMProfileLogMeta); + +long MMProfileLogMetaStructure(MMP_Event event, MMP_LogType type, + MMP_MetaDataStructure_t *pMetaData) +{ + int ret = 0; + if (!MMProfileGlobals.enable) + return 0; + if (in_interrupt()) + return 0; + if ((event >= MMP_MaxStaticEvent) || + (event >= MMProfileMaxEventCount) || (event == MMP_InvalidEvent)) + return 0; + if (bMMProfileInitBuffer && MMProfileGlobals.start + && (MMProfileGlobals.event_state[event] & MMP_EVENT_STATE_ENABLED)) { + MMP_MetaData_t MetaData; + MetaData.data1 = pMetaData->data1; + MetaData.data2 = pMetaData->data2; + MetaData.data_type = MMProfileMetaStructure; + MetaData.size = 32 + pMetaData->struct_size; + MetaData.pData = vmalloc(MetaData.size); + if (!MetaData.pData) + return -1; + memcpy(MetaData.pData, pMetaData->struct_name, 32); + memcpy((void *)((unsigned long)(MetaData.pData) + 32), pMetaData->pData, + pMetaData->struct_size); + ret = MMProfileLogMeta(event, type, &MetaData); + vfree(MetaData.pData); + } + return ret; +} +EXPORT_SYMBOL(MMProfileLogMetaStructure); + +long MMProfileLogMetaStringEx(MMP_Event event, MMP_LogType type, unsigned long data1, + unsigned long data2, const char *str) +{ + long ret = 0; + if (!MMProfileGlobals.enable) + return 0; + if (in_interrupt()) + return 0; + if ((event >= MMP_MaxStaticEvent) || + (event >= MMProfileMaxEventCount) || (event == MMP_InvalidEvent)) + return 0; + if (bMMProfileInitBuffer && MMProfileGlobals.start + && (MMProfileGlobals.event_state[event] & MMP_EVENT_STATE_ENABLED)) { + MMP_MetaData_t MetaData; + MetaData.data1 = data1; + MetaData.data2 = data2; + MetaData.data_type = MMProfileMetaStringMBS; + MetaData.size = strlen(str) + 1; + MetaData.pData = vmalloc(MetaData.size); + if (!MetaData.pData) + return -1; + strcpy((char *)MetaData.pData, str); + ret = MMProfileLogMeta(event, type, &MetaData); + vfree(MetaData.pData); + } + return ret; +} +EXPORT_SYMBOL(MMProfileLogMetaStringEx); + +long MMProfileLogMetaString(MMP_Event event, MMP_LogType type, const char *str) +{ + return MMProfileLogMetaStringEx(event, type, 0, 0, str); +} +EXPORT_SYMBOL(MMProfileLogMetaString); + +long MMProfileLogMetaBitmap(MMP_Event event, MMP_LogType type, MMP_MetaDataBitmap_t *pMetaData) +{ + int ret = 0; + if (!MMProfileGlobals.enable) + return 0; + if (in_interrupt()) + return 0; + if ((event >= MMP_MaxStaticEvent) || + (event >= MMProfileMaxEventCount) || (event == MMP_InvalidEvent)) + return 0; + if (bMMProfileInitBuffer && MMProfileGlobals.start + && (MMProfileGlobals.event_state[event] & MMP_EVENT_STATE_ENABLED)) { + MMP_MetaData_t MetaData; + char *pSrc, *pDst; + long pitch; + MetaData.data1 = pMetaData->data1; + MetaData.data2 = pMetaData->data2; + MetaData.data_type = MMProfileMetaBitmap; + MetaData.size = sizeof(MMP_MetaDataBitmap_t) + pMetaData->data_size; + MetaData.pData = vmalloc(MetaData.size); + if (!MetaData.pData) + return -1; + pSrc = (char *)pMetaData->pData + pMetaData->start_pos; + pDst = (char *)((unsigned long)(MetaData.pData) + sizeof(MMP_MetaDataBitmap_t)); + pitch = pMetaData->pitch; + memcpy(MetaData.pData, pMetaData, sizeof(MMP_MetaDataBitmap_t)); + if (pitch < 0) + ((MMP_MetaDataBitmap_t *) (MetaData.pData))->pitch = -pitch; + if ((pitch > 0) && (pMetaData->down_sample_x == 1) + && (pMetaData->down_sample_y == 1)) + memcpy(pDst, pSrc, pMetaData->data_size); + else { + unsigned int x, y, x0, y0; + unsigned int new_width, new_height; + unsigned int Bpp = pMetaData->bpp / 8; + new_width = (pMetaData->width - 1) / pMetaData->down_sample_x + 1; + new_height = (pMetaData->height - 1) / pMetaData->down_sample_y + 1; + MMP_LOG(ANDROID_LOG_DEBUG, "n(%u,%u),o(%u, %u,%d,%u) ", new_width, + new_height, pMetaData->width, pMetaData->height, pMetaData->pitch, + pMetaData->bpp); + for (y = 0, y0 = 0; y < pMetaData->height; + y0++, y += pMetaData->down_sample_y) { + if (pMetaData->down_sample_x == 1) + memcpy(pDst + new_width * Bpp * y0, + pSrc + pMetaData->pitch * y, pMetaData->width * Bpp); + else { + for (x = 0, x0 = 0; x < pMetaData->width; + x0++, x += pMetaData->down_sample_x) { + memcpy(pDst + (new_width * y0 + x0) * Bpp, + pSrc + pMetaData->pitch * y + x * Bpp, Bpp); + } + } + } + MetaData.size = sizeof(MMP_MetaDataBitmap_t) + new_width * Bpp * new_height; + } + ret = MMProfileLogMeta(event, type, &MetaData); + vfree(MetaData.pData); + } + return ret; +} +EXPORT_SYMBOL(MMProfileLogMetaBitmap); + +/* Exposed APIs end */ + +/* Debug FS begin */ +static struct dentry *g_pDebugFSDir; +static struct dentry *g_pDebugFSStart; +static struct dentry *g_pDebugFSBuffer; +static struct dentry *g_pDebugFSGlobal; +static struct dentry *g_pDebugFSReset; +static struct dentry *g_pDebugFSEnable; +static struct dentry *g_pDebugFSMMP; + +static ssize_t mmprofile_dbgfs_reset_write(struct file *file, const char __user *buf, size_t size, + loff_t *ppos) +{ + MMProfileResetBuffer(); + return 1; +} + +static ssize_t mmprofile_dbgfs_start_read(struct file *file, char __user *buf, size_t size, + loff_t *ppos) +{ + char str[32]; + int r; + MMP_LOG(ANDROID_LOG_DEBUG, "start=%d", MMProfileGlobals.start); + r = sprintf(str, "start = %d\n", MMProfileGlobals.start); + return simple_read_from_buffer(buf, size, ppos, str, r); +} + +static ssize_t mmprofile_dbgfs_start_write(struct file *file, const char __user *buf, size_t size, + loff_t *ppos) +{ + unsigned int str; + int start; + ssize_t ret; + ret = simple_write_to_buffer(&str, 4, ppos, buf, size); + if ((str & 0xFF) == 0x30) + start = 0; + else + start = 1; + MMP_LOG(ANDROID_LOG_DEBUG, "start=%d", start); + MMProfileStart(start); + return ret; +} + +static ssize_t mmprofile_dbgfs_enable_read(struct file *file, char __user *buf, size_t size, + loff_t *ppos) +{ + char str[32]; + int r; + MMP_LOG(ANDROID_LOG_DEBUG, "enable=%d", MMProfileGlobals.enable); + r = sprintf(str, "enable = %d\n", MMProfileGlobals.enable); + return simple_read_from_buffer(buf, size, ppos, str, r); +} + +static ssize_t mmprofile_dbgfs_enable_write(struct file *file, const char __user *buf, size_t size, + loff_t *ppos) +{ + unsigned int str; + int enable; + ssize_t ret; + ret = simple_write_to_buffer(&str, 4, ppos, buf, size); + if ((str & 0xFF) == 0x30) + enable = 0; + else + enable = 1; + MMP_LOG(ANDROID_LOG_DEBUG, "enable=%d", enable); + MMProfileEnable(enable); + return ret; +} + +static ssize_t mmprofile_dbgfs_buffer_read(struct file *file, char __user *buf, size_t size, + loff_t *ppos) +{ + static unsigned int backup_state; + unsigned int copy_size = 0; + unsigned int total_copy = 0; + unsigned long Addr; + if (!bMMProfileInitBuffer) + return -EFAULT; + MMP_LOG(ANDROID_LOG_VERBOSE, "size=%ld ppos=%d", (unsigned long)size, (int)(*ppos)); + if (*ppos == 0) { + backup_state = MMProfileGlobals.start; + MMProfileStart(0); + } + while (size > 0) { + MMProfileGetDumpBuffer(*ppos, &Addr, ©_size); + if (copy_size == 0) { + if (backup_state) + MMProfileStart(1); + break; + } + if (size >= copy_size) { + size -= copy_size; + } else { + copy_size = size; + size = 0; + } + if (copy_to_user(buf + total_copy, (void *)Addr, copy_size)) { + MMP_LOG(ANDROID_LOG_DEBUG, "fail to copytouser total_copy=%d", total_copy); + break; + } + *ppos += copy_size; + total_copy += copy_size; + } + return total_copy; + /* return simple_read_from_buffer(buf, size, ppos, pMMProfileRingBuffer, MMProfileGlobals.buffer_size_bytes); */ +} + +static ssize_t mmprofile_dbgfs_global_read(struct file *file, char __user *buf, size_t size, + loff_t *ppos) +{ + return simple_read_from_buffer(buf, size, ppos, &MMProfileGlobals, MMProfileGlobalsSize); +} + +static ssize_t mmprofile_dbgfs_global_write(struct file *file, const char __user *buf, size_t size, + loff_t *ppos) +{ + return simple_write_to_buffer(&MMProfileGlobals, MMProfileGlobalsSize, ppos, buf, size); +} + +static const struct file_operations mmprofile_dbgfs_enable_fops = { + .read = mmprofile_dbgfs_enable_read, + .write = mmprofile_dbgfs_enable_write, + .llseek = generic_file_llseek, +}; + +static const struct file_operations mmprofile_dbgfs_start_fops = { + .read = mmprofile_dbgfs_start_read, + .write = mmprofile_dbgfs_start_write, + .llseek = generic_file_llseek, +}; + +static const struct file_operations mmprofile_dbgfs_reset_fops = { + .write = mmprofile_dbgfs_reset_write, + .llseek = generic_file_llseek, +}; + +static const struct file_operations mmprofile_dbgfs_buffer_fops = { + .read = mmprofile_dbgfs_buffer_read, + .llseek = generic_file_llseek, +}; + +static const struct file_operations mmprofile_dbgfs_global_fops = { + .read = mmprofile_dbgfs_global_read, + .write = mmprofile_dbgfs_global_write, + .llseek = generic_file_llseek, +}; + + +/* Debug FS end */ + +/* Driver specific begin */ +/* +static dev_t mmprofile_devno; +static struct cdev *mmprofile_cdev; +static struct class *mmprofile_class = NULL; +*/ +static int mmprofile_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static int mmprofile_open(struct inode *inode, struct file *file) +{ + return 0; +} + +static ssize_t mmprofile_read(struct file *file, char __user *data, size_t len, loff_t *ppos) +{ + return 0; +} + +static ssize_t mmprofile_write(struct file *file, const char __user *data, size_t len, + loff_t *ppos) +{ + return 0; +} + +static long mmprofile_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret = 0; + unsigned long retn; + switch (cmd) { + case MMP_IOC_ENABLE: + if ((arg == 0) || (arg == 1)) + MMProfileEnable((int)arg); + else + ret = -EINVAL; + break; + case MMP_IOC_START: + if ((arg == 0) || (arg == 1)) + MMProfileStart((int)arg); + else + ret = -EINVAL; + break; + case MMP_IOC_TIME: + { + unsigned long long time; + system_time((unsigned int *)(&time), ((unsigned int *)(&time)) + 1); + put_user(time, (unsigned long long *)arg); + } + break; + case MMP_IOC_REGEVENT: + { + MMProfile_EventInfo_t event_info; + retn = + copy_from_user(&event_info, (void *)arg, sizeof(MMProfile_EventInfo_t)); + event_info.parentId = + MMProfileRegisterEvent(event_info.parentId, event_info.name); + retn = + copy_to_user((void *)arg, &event_info, sizeof(MMProfile_EventInfo_t)); + } + break; + case MMP_IOC_FINDEVENT: + { + MMProfile_EventInfo_t event_info; + retn = + copy_from_user(&event_info, (void *)arg, sizeof(MMProfile_EventInfo_t)); + mutex_lock(&MMProfile_RegTableMutex); + event_info.parentId = + MMProfileFindEventInt(event_info.parentId, event_info.name); + mutex_unlock(&MMProfile_RegTableMutex); + retn = + copy_to_user((void *)arg, &event_info, sizeof(MMProfile_EventInfo_t)); + } + break; + case MMP_IOC_ENABLEEVENT: + { + MMP_Event event; + unsigned int enable; + unsigned int recursive; + unsigned int ftrace; + get_user(event, (unsigned int *)arg); + get_user(enable, (unsigned int *)(arg + 4)); + get_user(recursive, (unsigned int *)(arg + 8)); + get_user(ftrace, (unsigned int *)(arg + 12)); + if (recursive) { + mutex_lock(&MMProfile_RegTableMutex); + MMProfileEnableFTraceEventRecursive(event, enable, ftrace); + mutex_unlock(&MMProfile_RegTableMutex); + } else + MMProfileEnableFTraceEvent(event, enable, ftrace); + } + break; + case MMP_IOC_LOG: + { + MMP_Event event; + MMP_LogType type; + unsigned int data1; + unsigned int data2; + get_user(event, (unsigned int *)arg); + get_user(type, (unsigned int *)(arg + 4)); + get_user(data1, (unsigned int *)(arg + 8)); + get_user(data2, (unsigned int *)(arg + 12)); + MMProfileLogEx(event, type, data1, data2); + } + break; + case MMP_IOC_DUMPEVENTINFO: + { + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + MMProfile_EventInfo_t *pEventInfoUser = (MMProfile_EventInfo_t *) arg; + MMProfile_EventInfo_t EventInfoDummy = { 0, "" }; + MMProfileRegisterStaticEvents(1); + mutex_lock(&MMProfile_RegTableMutex); + retn = + copy_to_user(pEventInfoUser, &EventInfoDummy, + sizeof(MMProfile_EventInfo_t)); + index = MMP_RootEvent; + list_for_each_entry(pRegTable, &(MMProfile_RegTable.list), list) { + retn = + copy_to_user(&pEventInfoUser[index], &(pRegTable->event_info), + sizeof(MMProfile_EventInfo_t)); + index++; + } + for (; index < MMProfileMaxEventCount; index++) { + retn = + copy_to_user(&pEventInfoUser[index], &EventInfoDummy, + sizeof(MMProfile_EventInfo_t)); + } + mutex_unlock(&MMProfile_RegTableMutex); + } + break; + case MMP_IOC_METADATALOG: + { + MMProfile_MetaLog_t MetaLog; + retn = copy_from_user(&MetaLog, (void *)arg, sizeof(MMProfile_MetaLog_t)); + MMProfileLogMetaInt(MetaLog.id, MetaLog.type, &(MetaLog.meta_data), 1); + } + break; + case MMP_IOC_DUMPMETADATA: + { + unsigned int meta_data_count = 0; + unsigned int offset = 0; + unsigned int index; + unsigned int buffer_size = 0; + MMProfile_MetaDataBlock_t *pMetaDataBlock; + MMProfile_MetaData_t *pMetaData = (MMProfile_MetaData_t *) (arg + 8); + mutex_lock(&MMProfile_MetaBufferMutex); + list_for_each_entry(pMetaDataBlock, &MMProfile_MetaBufferList, list) { + if (pMetaDataBlock->data_size > 0) { + put_user(pMetaDataBlock->cookie, + &(pMetaData[meta_data_count].cookie)); + put_user(pMetaDataBlock->data_size, + &(pMetaData[meta_data_count].data_size)); + put_user(pMetaDataBlock->data_type, + &(pMetaData[meta_data_count].data_type)); + buffer_size += pMetaDataBlock->data_size; + meta_data_count++; + } + } + put_user(meta_data_count, (unsigned int *)arg); + /* pr_debug("[mmprofile_ioctl] meta_data_count=%d meta_data_size=%x\n",meta_data_count, buffer_size); */ + offset = 8 + sizeof(MMProfile_MetaData_t) * meta_data_count; + index = 0; + list_for_each_entry(pMetaDataBlock, &MMProfile_MetaBufferList, list) { + if (pMetaDataBlock->data_size > 0) { + put_user(offset - 8, &(pMetaData[index].data_offset)); + /* pr_debug("[mmprofile_ioctl] MetaRecord: offset=%x size=%x\n", offset-8, pMetaDataBlock->data_size); */ + if (((unsigned long)(pMetaDataBlock->meta_data) + + pMetaDataBlock->data_size) > + ((unsigned long)pMMProfileMetaBuffer + + MMProfileGlobals.meta_buffer_size)) { + unsigned long left_size = + (unsigned long)pMMProfileMetaBuffer + + MMProfileGlobals.meta_buffer_size - + (unsigned long)(pMetaDataBlock->meta_data); + retn = + copy_to_user((void *)(arg + offset), + pMetaDataBlock->meta_data, + left_size); + retn = + copy_to_user((void *)(arg + offset + left_size), + pMMProfileMetaBuffer, + pMetaDataBlock->data_size - + left_size); + } else + retn = + copy_to_user((void *)(arg + offset), + pMetaDataBlock->meta_data, + pMetaDataBlock->data_size); + offset = (offset + pMetaDataBlock->data_size + 3) & (~3); + index++; + } + } + put_user(offset - 8, (unsigned int *)(arg + 4)); + /* pr_debug("[mmprofile_ioctl] Finished: offset=%x\n", offset-8); */ + mutex_unlock(&MMProfile_MetaBufferMutex); + } + break; + case MMP_IOC_SELECTBUFFER: + MMProfileGlobals.selected_buffer = arg; + break; + case MMP_IOC_TRYLOG: + if ((!MMProfileGlobals.enable) || + (!bMMProfileInitBuffer) || + (!MMProfileGlobals.start) || + (arg >= MMP_MaxStaticEvent) || + (arg >= MMProfileMaxEventCount) || + (arg == MMP_InvalidEvent)) + ret = -EINVAL; + else if (!(MMProfileGlobals.event_state[arg] & MMP_EVENT_STATE_ENABLED)) + ret = -EINVAL; + break; + case MMP_IOC_ISENABLE: + { + MMP_Event event; + get_user(event, (unsigned int *)arg); + put_user(MMProfileQueryEnable(event), (unsigned int *)arg); + } + break; + case MMP_IOC_TEST: + { + } + break; + default: + ret = -EINVAL; + break; + } + return ret; +} + +#ifdef CONFIG_64BIT +static long mmprofile_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret = 0; + unsigned long retn; + switch (cmd) { + case MMP_IOC_ENABLE: + if ((arg == 0) || (arg == 1)) + MMProfileEnable((int)arg); + else + ret = -EINVAL; + break; + case MMP_IOC_START: + if ((arg == 0) || (arg == 1)) + MMProfileStart((int)arg); + else + ret = -EINVAL; + break; + case MMP_IOC_TIME: + { + unsigned long long time; + system_time((unsigned int *)(&time), ((unsigned int *)(&time)) + 1); + put_user(time, (unsigned long long *)arg); + } + break; + case MMP_IOC_REGEVENT: + { + MMProfile_EventInfo_t event_info; + retn = + copy_from_user(&event_info, (void *)arg, sizeof(MMProfile_EventInfo_t)); + event_info.parentId = + MMProfileRegisterEvent(event_info.parentId, event_info.name); + retn = + copy_to_user((void *)arg, &event_info, sizeof(MMProfile_EventInfo_t)); + } + break; + case MMP_IOC_FINDEVENT: + { + MMProfile_EventInfo_t event_info; + retn = + copy_from_user(&event_info, (void *)arg, sizeof(MMProfile_EventInfo_t)); + mutex_lock(&MMProfile_RegTableMutex); + event_info.parentId = + MMProfileFindEventInt(event_info.parentId, event_info.name); + mutex_unlock(&MMProfile_RegTableMutex); + retn = + copy_to_user((void *)arg, &event_info, sizeof(MMProfile_EventInfo_t)); + } + break; + case MMP_IOC_ENABLEEVENT: + { + MMP_Event event; + unsigned int enable; + unsigned int recursive; + unsigned int ftrace; + get_user(event, (unsigned int *)arg); + get_user(enable, (unsigned int *)(arg + 4)); + get_user(recursive, (unsigned int *)(arg + 8)); + get_user(ftrace, (unsigned int *)(arg + 12)); + if (recursive) { + mutex_lock(&MMProfile_RegTableMutex); + MMProfileEnableFTraceEventRecursive(event, enable, ftrace); + mutex_unlock(&MMProfile_RegTableMutex); + } else + MMProfileEnableFTraceEvent(event, enable, ftrace); + } + break; + case MMP_IOC_LOG: + { + MMP_Event event; + MMP_LogType type; + unsigned int data1; + unsigned int data2; + get_user(event, (unsigned int *)arg); + get_user(type, (unsigned int *)(arg + 4)); + get_user(data1, (unsigned int *)(arg + 8)); + get_user(data2, (unsigned int *)(arg + 12)); + MMProfileLogEx(event, type, data1, data2); + } + break; + case MMP_IOC_DUMPEVENTINFO: + { + MMP_Event index; + MMProfile_RegTable_t *pRegTable; + MMProfile_EventInfo_t *pEventInfoUser = (MMProfile_EventInfo_t *) arg; + MMProfile_EventInfo_t EventInfoDummy = { 0, "" }; + MMProfileRegisterStaticEvents(1); + mutex_lock(&MMProfile_RegTableMutex); + retn = + copy_to_user(pEventInfoUser, &EventInfoDummy, + sizeof(MMProfile_EventInfo_t)); + index = MMP_RootEvent; + list_for_each_entry(pRegTable, &(MMProfile_RegTable.list), list) { + retn = + copy_to_user(&pEventInfoUser[index], &(pRegTable->event_info), + sizeof(MMProfile_EventInfo_t)); + index++; + } + for (; index < MMProfileMaxEventCount; index++) { + retn = + copy_to_user(&pEventInfoUser[index], &EventInfoDummy, + sizeof(MMProfile_EventInfo_t)); + } + mutex_unlock(&MMProfile_RegTableMutex); + } + break; + case MMP_IOC_METADATALOG: + { + MMProfile_MetaLog_t MetaLog; + retn = copy_from_user(&MetaLog, (void *)arg, sizeof(MMProfile_MetaLog_t)); + MMProfileLogMetaInt(MetaLog.id, MetaLog.type, &(MetaLog.meta_data), 1); + } + break; + case MMP_IOC_DUMPMETADATA: + { + unsigned int meta_data_count = 0; + unsigned int offset = 0; + unsigned int index; + unsigned int buffer_size = 0; + MMProfile_MetaDataBlock_t *pMetaDataBlock; + MMProfile_MetaData_t *pMetaData = (MMProfile_MetaData_t *) (arg + 8); + mutex_lock(&MMProfile_MetaBufferMutex); + list_for_each_entry(pMetaDataBlock, &MMProfile_MetaBufferList, list) { + if (pMetaDataBlock->data_size > 0) { + put_user(pMetaDataBlock->cookie, + &(pMetaData[meta_data_count].cookie)); + put_user(pMetaDataBlock->data_size, + &(pMetaData[meta_data_count].data_size)); + put_user(pMetaDataBlock->data_type, + &(pMetaData[meta_data_count].data_type)); + buffer_size += pMetaDataBlock->data_size; + meta_data_count++; + } + } + put_user(meta_data_count, (unsigned int *)arg); + /* pr_debug("[mmprofile_ioctl] meta_data_count=%d meta_data_size=%x\n",meta_data_count, buffer_size); */ + offset = 8 + sizeof(MMProfile_MetaData_t) * meta_data_count; + index = 0; + list_for_each_entry(pMetaDataBlock, &MMProfile_MetaBufferList, list) { + if (pMetaDataBlock->data_size > 0) { + put_user(offset - 8, &(pMetaData[index].data_offset)); + /* pr_debug("[mmprofile_ioctl] MetaRecord: offset=%x size=%x\n", offset-8, pMetaDataBlock->data_size); */ + if (((unsigned long)(pMetaDataBlock->meta_data) + + pMetaDataBlock->data_size) > + ((unsigned long)pMMProfileMetaBuffer + + MMProfileGlobals.meta_buffer_size)) { + unsigned long left_size = + (unsigned long)pMMProfileMetaBuffer + + MMProfileGlobals.meta_buffer_size - + (unsigned long)(pMetaDataBlock->meta_data); + retn = + copy_to_user((void *)(arg + offset), + pMetaDataBlock->meta_data, + left_size); + retn = + copy_to_user((void *)(arg + offset + left_size), + pMMProfileMetaBuffer, + pMetaDataBlock->data_size - + left_size); + } else + retn = + copy_to_user((void *)(arg + offset), + pMetaDataBlock->meta_data, + pMetaDataBlock->data_size); + offset = (offset + pMetaDataBlock->data_size + 3) & (~3); + index++; + } + } + put_user(offset - 8, (unsigned int *)(arg + 4)); + /* pr_debug("[mmprofile_ioctl] Finished: offset=%x\n", offset-8); */ + mutex_unlock(&MMProfile_MetaBufferMutex); + } + break; + case MMP_IOC_SELECTBUFFER: + MMProfileGlobals.selected_buffer = arg; + break; + case MMP_IOC_TRYLOG: + if ((!MMProfileGlobals.enable) || + (!bMMProfileInitBuffer) || + (!MMProfileGlobals.start) || + (arg >= MMP_MaxStaticEvent) || + (arg >= MMProfileMaxEventCount) || + (arg == MMP_InvalidEvent)) + ret = -EINVAL; + else if (!(MMProfileGlobals.event_state[arg] & MMP_EVENT_STATE_ENABLED)) + ret = -EINVAL; + break; + case MMP_IOC_ISENABLE: + { + MMP_Event event; + get_user(event, (unsigned int *)arg); + put_user(MMProfileQueryEnable(event), (unsigned int *)arg); + } + break; + case MMP_IOC_TEST: + { + } + break; + default: + ret = -EINVAL; + break; + } + return ret; +} +#endif + + +static int mmprofile_mmap(struct file *file, struct vm_area_struct *vma) +{ + unsigned int pos = 0; + unsigned int i = 0; + + if (MMProfileGlobals.selected_buffer == MMProfileGlobalsBuffer) { + /* vma->vm_flags |= VM_RESERVED; */ + /* vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); */ + + pos = vma->vm_start; + for (i = 0; i < MMProfileGlobalsSize; i += PAGE_SIZE, pos += PAGE_SIZE) { + unsigned long pfn; + /* pr_debug("[mmprofile_mmap] mmap pos=0x%08x va=0x%08x pa=0x%08x pfn=0x%08x\n", pos, (unsigned long)(&MMProfileGlobals) + i, __virt_to_phys((unsigned long)(&MMProfileGlobals) + i), __phys_to_pfn(__virt_to_phys((unsigned long)(&MMProfileGlobals) + i))); */ + /* flush_dcache_page(virt_to_page((void*)((unsigned long)(&MMProfileGlobals) + i))); */ + pfn = __phys_to_pfn(__virt_to_phys((unsigned long)(&MMProfileGlobals) + i)); + if (remap_pfn_range + (vma, pos, pfn, PAGE_SIZE, vma->vm_page_prot | PAGE_SHARED)) + return -EAGAIN; + /* pr_debug("pfn: 0x%08x\n", pfn); */ + } + } else if (MMProfileGlobals.selected_buffer == MMProfilePrimaryBuffer) { + MMProfileInitBuffer(); + + if (!bMMProfileInitBuffer) + return -EAGAIN; + /* vma->vm_flags |= VM_RESERVED; */ + /* vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); */ + + pos = vma->vm_start; + + for (i = 0; i < MMProfileGlobals.buffer_size_bytes; + i += PAGE_SIZE, pos += PAGE_SIZE) { + /* pr_debug("[mmprofile_mmap] mmap pos=0x%08x va=0x%08x pfn=0x%08x\n", pos, (void*)((unsigned long)pMMProfileRingBuffer + i), vmalloc_to_pfn((void*)((unsigned long)pMMProfileRingBuffer + i))); */ + /* flush_dcache_page(vmalloc_to_page((void*)((unsigned long)(pMMProfileRingBuffer) + i))); */ + if (remap_pfn_range + (vma, pos, + vmalloc_to_pfn((void *)((unsigned long)pMMProfileRingBuffer + i)), + PAGE_SIZE, vma->vm_page_prot | PAGE_SHARED)) + return -EAGAIN; + } + } else + return -EINVAL; + return 0; +} + +struct file_operations mmprofile_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = mmprofile_ioctl, + .open = mmprofile_open, + .release = mmprofile_release, + .read = mmprofile_read, + .write = mmprofile_write, + .mmap = mmprofile_mmap, +#ifdef CONFIG_64BIT +#ifdef CONFIG_COMPAT + .compat_ioctl = mmprofile_ioctl_compat, +#endif +#endif +}; + + +static int mmprofile_probe(void) +{ +#if 0 + struct class_device *class_dev = 0; + int ret = alloc_chrdev_region(&mmprofile_devno, 0, 1, MMP_DEVNAME); + + mmprofile_cdev = cdev_alloc(); + mmprofile_cdev->owner = THIS_MODULE; + mmprofile_cdev->ops = &mmprofile_fops; + ret = cdev_add(mmprofile_cdev, mmprofile_devno, 1); + mmprofile_class = class_create(THIS_MODULE, MMP_DEVNAME); + class_dev = + (struct class_device *)device_create(mmprofile_class, NULL, mmprofile_devno, NULL, + MMP_DEVNAME); +#endif + /* Create debugfs */ + g_pDebugFSDir = debugfs_create_dir("mmprofile", NULL); + if (g_pDebugFSDir) { + /* Create debugfs files. */ + g_pDebugFSMMP = + debugfs_create_file("mmp", S_IFREG | S_IRUGO, g_pDebugFSDir, NULL, + &mmprofile_fops); + g_pDebugFSEnable = + debugfs_create_file("enable", S_IRUSR | S_IWUSR, g_pDebugFSDir, NULL, + &mmprofile_dbgfs_enable_fops); + g_pDebugFSStart = + debugfs_create_file("start", S_IRUSR | S_IWUSR, g_pDebugFSDir, NULL, + &mmprofile_dbgfs_start_fops); + g_pDebugFSBuffer = + debugfs_create_file("buffer", S_IRUSR, g_pDebugFSDir, NULL, + &mmprofile_dbgfs_buffer_fops); + g_pDebugFSGlobal = + debugfs_create_file("global", S_IRUSR, g_pDebugFSDir, NULL, + &mmprofile_dbgfs_global_fops); + g_pDebugFSReset = + debugfs_create_file("reset", S_IWUSR, g_pDebugFSDir, NULL, + &mmprofile_dbgfs_reset_fops); + } + /* // Read NVRAM configuration */ + /* { */ + /* struct file *filp; */ + /* unsigned int enable; */ + /* unsigned int start; */ + /* mm_segment_t old_fs; */ + /* old_fs = get_fs(); */ + /* set_fs(KERNEL_DS); */ + /* filp = filp_open(CONFIG_MMPROFILE_PATH, O_RDONLY, 0777); */ + /* if (IS_ERR(filp)) */ + /* { */ + /* pr_debug("[mmprofile] NVM: Cannot open configuration file %s\n", CONFIG_MMPROFILE_PATH); */ + /* MMProfileEnable(0); */ + /* } */ + /* else */ + /* { */ + /* filp->f_op->llseek(filp, 0, SEEK_SET); */ + /* filp->f_op->read(filp, (char*)(&enable), 4, &filp->f_pos); */ + /* filp->f_op->read(filp, (char*)(&start), 4, &filp->f_pos); */ + /* filp_close(filp, NULL); */ + /* pr_debug("[mmprofile] NVM: enable=%d start=%d.\n", enable, start); */ + /* if (enable == 1) */ + /* { */ + /* MMProfileEnable(1); */ + /* if (start == 1) */ + /* MMProfileStart(1); */ + /* else */ + /* MMProfileStart(0); */ + /* } */ + /* else */ + /* MMProfileEnable(0); */ + /* } */ + /* set_fs(old_fs); */ + /* } */ + return 0; +} + +static int mmprofile_remove(void) +{ + if (g_pDebugFSDir) { + debugfs_remove(g_pDebugFSDir); + if (g_pDebugFSEnable) + debugfs_remove(g_pDebugFSEnable); + if (g_pDebugFSStart) + debugfs_remove(g_pDebugFSStart); + if (g_pDebugFSGlobal) + debugfs_remove(g_pDebugFSGlobal); + if (g_pDebugFSBuffer) + debugfs_remove(g_pDebugFSBuffer); + if (g_pDebugFSReset) + debugfs_remove(g_pDebugFSReset); + if (g_pDebugFSMMP) + debugfs_remove(g_pDebugFSMMP); + } + return 0; +} + +#if 0 +static struct platform_driver mmprofile_driver = { + .probe = mmprofile_probe, + .remove = mmprofile_remove, + .driver = {.name = MMP_DEVNAME} +}; + +static struct platform_device mmprofile_device = { + .name = MMP_DEVNAME, + .id = 0, +}; +#endif +static int __init mmprofile_init(void) +{ +#if 0 + if (platform_device_register(&mmprofile_device)) { + return -ENODEV; + } + if (platform_driver_register(&mmprofile_driver)) { + platform_device_unregister(&mmprofile_device); + return -ENODEV; + } +#endif + mmprofile_probe(); + return 0; +} + +static void __exit mmprofile_exit(void) +{ +#if 0 + device_destroy(mmprofile_class, mmprofile_devno); + class_destroy(mmprofile_class); + cdev_del(mmprofile_cdev); + unregister_chrdev_region(mmprofile_devno, 1); + + platform_driver_unregister(&mmprofile_driver); + platform_device_unregister(&mmprofile_device); +#endif + mmprofile_remove(); +} + +/* Driver specific end */ + +module_init(mmprofile_init); +module_exit(mmprofile_exit); +MODULE_AUTHOR("Tianshu Qiu "); +MODULE_DESCRIPTION("MMProfile Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mediatek/mrdump/mt8127/mrdump_setup.c b/drivers/misc/mediatek/mrdump/mt8127/mrdump_setup.c index d3edebb1b27..3d784769524 100644 --- a/drivers/misc/mediatek/mrdump/mt8127/mrdump_setup.c +++ b/drivers/misc/mediatek/mrdump/mt8127/mrdump_setup.c @@ -33,7 +33,7 @@ void mrdump_reserve_memory(void) /* We must reserved the lk block, can we pass it from lk? */ memblock_reserve(LK_LOAD_ADDR, LK_LOAD_SIZE); - memblock_reserve(MRDUMP_CB_ADDR, PAGE_ALIGN(sizeof(struct mrdump_control_block))); + memblock_reserve(MRDUMP_CB_ADDR, MRDUMP_CB_SIZE); cblock = (struct mrdump_control_block *)__va(MRDUMP_CB_ADDR); mrdump_platform_init(cblock, &mrdump_mt6582_platform); diff --git a/drivers/misc/mediatek/mtprof/mt_printk_ctrl.c b/drivers/misc/mediatek/mtprof/mt_printk_ctrl.c index f2acc302f3f..086be748007 100644 --- a/drivers/misc/mediatek/mtprof/mt_printk_ctrl.c +++ b/drivers/misc/mediatek/mtprof/mt_printk_ctrl.c @@ -115,22 +115,6 @@ static ssize_t mt_printk_ctrl_write(struct file *filp, const char *ubuf, ssize_t return cnt; } -//[BUGFIX]-Add-BEGIN by SCDTABLET.(fangyou.wang),10/10/2015,1097303, -//auto reboot after power off -void force_enable_uart_log(void) -{ - if(mt_need_uart_console){ - pr_err("uart log alrady opened!!!!\n"); - return; - } - - mt_need_uart_console = 1; - mt_enable_uart(); - pr_err("--------------need uart log,force open uart log now-------------\n"); - -} -//[BUGFIX]-Add-END by SCDTABLET.(fangyou.wang) - static int __init init_mt_printk_ctrl(void) { struct proc_dir_entry *pe; diff --git a/drivers/misc/mediatek/nand/mt8127/mtk_nand.c b/drivers/misc/mediatek/nand/mt8127/mtk_nand.c index 6e4484e7328..cbbf73bde9f 100644 --- a/drivers/misc/mediatek/nand/mt8127/mtk_nand.c +++ b/drivers/misc/mediatek/nand/mt8127/mtk_nand.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -343,8 +342,8 @@ static int g_block_size; static u32 PAGES_PER_BLOCK = 255; static bool g_bSyncOrToggle = false; static int g_iNFI2X_CLKSRC = ARMPLL; -//extern unsigned int flash_number; -//extern flashdev_info_t gen_FlashTable_p[MAX_FLASH]; +extern unsigned int flash_number; +extern flashdev_info_t gen_FlashTable_p[MAX_FLASH]; extern int part_num; #if CFG_2CS_NAND @@ -474,6 +473,7 @@ u32 MICRON_TRANSFER(u32 pageNo) u32 sandisk_pairpage_mapping(u32 page, bool high_to_low) { + int offset; if(TRUE == high_to_low) { if(page == 255) @@ -503,10 +503,9 @@ u32 sandisk_pairpage_mapping(u32 page, bool high_to_low) } } } - u32 hynix_pairpage_mapping(u32 page, bool high_to_low) { - u32 offset; + int offset; if(TRUE == high_to_low) { //Micron 256pages @@ -547,10 +546,9 @@ u32 hynix_pairpage_mapping(u32 page, bool high_to_low) } } } - u32 micron_pairpage_mapping(u32 page, bool high_to_low) { - u32 offset; + int offset; if(TRUE == high_to_low) { //Micron 256pages @@ -1639,12 +1637,10 @@ static bool mtk_nand_check_bch_error(struct mtd_info *mtd, u8 * pDataBuf,u8 * sp { failed_sec++; ret = false; - //xlog_printk(ANDROID_LOG_WARN,"NFI", "UnCorrectable ECC errors at PageAddr=%d, Sector=%d\n", u4PageAddr, i); - MSG(INIT,"UnCorrectable ECC errors at PageAddr=%d, Sector=%d\n", u4PageAddr, i); + xlog_printk(ANDROID_LOG_WARN,"NFI", "UnCorrectable ECC errors at PageAddr=%d, Sector=%d\n", u4PageAddr, i); } else { - if(bitmap) - *bitmap |= 1 << i; + *bitmap |= 1 << u4SecIndex; if (u4ErrNum) { if(maxSectorBitErr < u4ErrNum) @@ -1654,10 +1650,24 @@ static bool mtk_nand_check_bch_error(struct mtd_info *mtd, u8 * pDataBuf,u8 * sp } } } + if(ret == false){ + if(failed_sec == (u4SecIndex+1)) + { + if(0 != (DRV_Reg32(NFI_STA_REG32) & STA_READ_EMPTY)) + { + ret=true; + MSG(INIT,"NFI empty page have few filped bit(s) , fake buffer returned\n"); + memset(pDataBuf,0xff,page_size); + memset(spareBuf,0xff,sec_num*8); + failed_sec=0; + maxSectorBitErr = 0; + } + } + } mtd->ecc_stats.failed+=failed_sec; - if ((maxSectorBitErr > ecc_threshold) && (FALSE != ret)) + if (maxSectorBitErr > ecc_threshold) { - MSG(INIT,"ECC bit flips (0x%x) exceed eccthreshold (0x%x),u4PageAddr 0x%x\n",maxSectorBitErr,ecc_threshold,u4PageAddr); + MSG(INIT,"ECC bit flips (0x%x) exceed eccthreshold (0x%x)\n",maxSectorBitErr,ecc_threshold); mtd->ecc_stats.corrected++; } else { @@ -1665,17 +1675,6 @@ static bool mtk_nand_check_bch_error(struct mtd_info *mtd, u8 * pDataBuf,u8 * sp } } } - - if(0 != (DRV_Reg32(NFI_STA_REG32) & STA_READ_EMPTY)) - { - ret=true; - //MSG(INIT, "empty page, empty buffer returned\n"); - memset(pDataBuf,0xff,page_size); - memset(spareBuf,0xff,sec_num*8); - maxSectorBitErr = 0; - failed_sec=0; - } - #else /* We will manually correct the error bits in the last sector, not all the sectors of the page! */ memset(au4ErrBitLoc, 0x0, sizeof(au4ErrBitLoc)); @@ -2994,6 +2993,18 @@ bool mtk_nand_GetFeature(struct mtd_info *mtd, u16 cmd, u32 addr, u8 *value, u8 } #if 1 +const u8 addr_tbl[8][5] = +{ + {0x04, 0x05, 0x06, 0x07, 0x0D}, + {0x04, 0x05, 0x06, 0x07, 0x0D}, + {0x04, 0x05, 0x06, 0x07, 0x0D}, + {0x04, 0x05, 0x06, 0x07, 0x0D}, + {0x04, 0x05, 0x06, 0x07, 0x0D}, + {0x04, 0x05, 0x06, 0x07, 0x0D}, + {0x04, 0x05, 0x06, 0x07, 0x0D}, + {0x04, 0x05, 0x06, 0x07, 0x0D} +}; + const u8 data_tbl[8][5] = { {0x04, 0x04, 0x7C, 0x7E, 0x00}, @@ -3043,14 +3054,19 @@ static void mtk_nand_sprmset_rrtry(u32 addr, u32 data) //single parameter settin reg_val |= (CNFG_OP_CUST | CNFG_BYTE_RW); DRV_WriteReg(NFI_CNFG_REG16, reg_val); + mtk_nand_set_command(0x55); mtk_nand_set_address(addr, 0, 1, 0); + mtk_nand_status_ready(STA_NFI_OP_MASK); + DRV_WriteReg32(NFI_CON_REG16, 1 << CON_NFI_SEC_SHIFT); NFI_SET_REG32(NFI_CON_REG16, CON_NFI_BWR); DRV_WriteReg(NFI_STRDATA_REG16, 0x1); + + WAIT_NFI_PIO_READY(timeout); - timeout=TIMEOUT_3; + DRV_WriteReg8(NFI_DATAW_REG32, data); while(!(DRV_Reg32(NFI_STA_REG32) & STA_NAND_BUSY_RETURN) && (timeout--)); @@ -3059,19 +3075,18 @@ static void mtk_nand_sprmset_rrtry(u32 addr, u32 data) //single parameter settin static void mtk_nand_toshiba_rrtry(struct mtd_info *mtd,flashdev_info_t deviceinfo, u32 retryCount, bool defValue) { u32 acccon; - u8 cnt = 0; - u8 add_reg[6] = {0x04, 0x05, 0x06, 0x07, 0x0D}; - + acccon = DRV_Reg32(NFI_ACCCON_REG32); - DRV_WriteReg32(NFI_ACCCON_REG32, 0x31C08669); //to fit read retry timing + DRV_WriteReg32(NFI_ACCCON_REG32, 0x31C083F9); //to fit read retry timing if(0 == retryCount) mtk_nand_modeentry_rrtry(); - - for(cnt = 0; cnt < 5; cnt ++) - { - mtk_nand_sprmset_rrtry(add_reg[cnt], data_tbl[retryCount][cnt]); - } + + mtk_nand_sprmset_rrtry(addr_tbl[retryCount][0], data_tbl[retryCount][0]); + mtk_nand_sprmset_rrtry(addr_tbl[retryCount][1], data_tbl[retryCount][1]); + mtk_nand_sprmset_rrtry(addr_tbl[retryCount][2], data_tbl[retryCount][2]); + mtk_nand_sprmset_rrtry(addr_tbl[retryCount][3], data_tbl[retryCount][3]); + mtk_nand_sprmset_rrtry(addr_tbl[retryCount][4], data_tbl[retryCount][4]); if(3 == retryCount) mtk_nand_rren_rrtry(TRUE); @@ -3080,9 +3095,10 @@ static void mtk_nand_toshiba_rrtry(struct mtd_info *mtd,flashdev_info_t devicein if(7 == retryCount) // to exit { - mtk_nand_device_reset(); + mtk_nand_set_mode(CNFG_OP_RESET); + NFI_ISSUE_COMMAND (NAND_CMD_RESET, 0, 0, 0, 0); mtk_nand_reset(); - //should do NAND DEVICE interface change under sync mode + //should do NAND DEVICE interface change under sync mode xiaolei } DRV_WriteReg32(NFI_ACCCON_REG32, acccon); @@ -3097,74 +3113,36 @@ static void mtk_nand_micron_rrtry(struct mtd_info *mtd,flashdev_info_t deviceinf (u8 *)&feature,4); } -static int g_sandisk_retry_case = 0; //for new read retry table case 1,2,3,4 static void mtk_nand_sandisk_rrtry(struct mtd_info *mtd,flashdev_info_t deviceinfo, u32 feature, bool defValue) { //u32 feature = deviceinfo.feature_set.FeatureSet.readRetryStart+retryCount; if(FALSE == defValue) { - mtk_nand_reset(); + mtk_nand_reset(); } else { - mtk_nand_device_reset(); + mtk_nand_set_mode(CNFG_OP_RESET); + NFI_ISSUE_COMMAND (NAND_CMD_RESET, 0, 0, 0, 0); mtk_nand_reset(); - //should do NAND DEVICE interface change under sync mode + //should do NAND DEVICE interface change under sync mode xiaolei } mtk_nand_SetFeature(mtd, deviceinfo.feature_set.FeatureSet.sfeatureCmd,\ deviceinfo.feature_set.FeatureSet.readRetryAddress,\ (u8 *)&feature,4); if(FALSE == defValue) - { - if(g_sandisk_retry_case > 1) //case 3 - { - if(g_sandisk_retry_case == 3) - { - u32 timeout=TIMEOUT_3; - mtk_nand_reset(); - DRV_WriteReg(NFI_CNFG_REG16, (CNFG_OP_CUST | CNFG_BYTE_RW)); - mtk_nand_set_command(0x5C); - mtk_nand_set_command(0xC5); - mtk_nand_set_command(0x55); - mtk_nand_set_address(0x00, 0, 1, 0); // test mode entry - mtk_nand_status_ready(STA_NFI_OP_MASK); - DRV_WriteReg32(NFI_CON_REG16, 1 << CON_NFI_SEC_SHIFT); - NFI_SET_REG32(NFI_CON_REG16, CON_NFI_BWR); - DRV_WriteReg(NFI_STRDATA_REG16, 0x1); - WAIT_NFI_PIO_READY(timeout); - DRV_WriteReg8(NFI_DATAW_REG32, 0x01); - while(!(DRV_Reg32(NFI_STA_REG32) & STA_NAND_BUSY_RETURN) && (timeout--)); - mtk_nand_reset(); - timeout=TIMEOUT_3; - mtk_nand_set_command(0x55); - mtk_nand_set_address(0x23, 0, 1, 0); //changing parameter LMFLGFIX_NEXT = 1 to all die - mtk_nand_status_ready(STA_NFI_OP_MASK); - DRV_WriteReg32(NFI_CON_REG16, 1 << CON_NFI_SEC_SHIFT); - NFI_SET_REG32(NFI_CON_REG16, CON_NFI_BWR); - DRV_WriteReg(NFI_STRDATA_REG16, 0x1); - WAIT_NFI_PIO_READY(timeout); - DRV_WriteReg8(NFI_DATAW_REG32, 0xC0); - while(!(DRV_Reg32(NFI_STA_REG32) & STA_NAND_BUSY_RETURN) && (timeout--)); - mtk_nand_reset(); - printk("Case3# Set LMFLGFIX_NEXT=1\n"); - } - mtk_nand_set_command(0x25); - printk("Case2#3# Set cmd 25\n"); - } mtk_nand_set_command(deviceinfo.feature_set.FeatureSet.readRetryPreCmd); - } } -//sandisk 19nm read retry -u16 sandisk_19nm_rr_table[18] = +#if 1 //sandisk 19nm read retry +u16 sandisk_19nm_rr_table[17] = { 0x0000, 0xFF0F, 0xEEFE, 0xDDFD, 0x11EE, //04h[7:4] | 07h[7:4] | 04h[3:0] | 05h[7:4] 0x22ED, 0x33DF, 0xCDDE, 0x01DD, 0x0211, 0x1222, 0xBD21, 0xAD32, - 0x9DF0, 0xBCEF, 0xACDC, 0x9CFF, - 0x0000 //align + 0x9DF0, 0xBCEF, 0xACDC, 0x9CFF }; static void sandisk_19nm_rr_init(void) @@ -3176,24 +3154,37 @@ static void sandisk_19nm_rr_init(void) u32 acccon; acccon = DRV_Reg32(NFI_ACCCON_REG32); - DRV_WriteReg32(NFI_ACCCON_REG32, 0x31C08669); //to fit read retry timing + DRV_WriteReg32(NFI_ACCCON_REG32, 0x31C083F9); //to fit read retry timing mtk_nand_reset(); + + if(use_randomizer) + { + u4RandomSetting = DRV_Reg32(NFI_RANDOM_CNFG_REG32); + DRV_WriteReg32(NFI_RANDOM_CNFG_REG32, (u4RandomSetting & (~(RAN_CNFG_ENCODE_EN | RAN_CNFG_DECODE_EN)))); + } reg_val = (CNFG_OP_CUST | CNFG_BYTE_RW); DRV_WriteReg(NFI_CNFG_REG16, reg_val); - mtk_nand_set_command(0x3B); - mtk_nand_set_command(0xB9); + + DRV_WriteReg(NFI_CMD_REG16,0x3B); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); + DRV_WriteReg(NFI_CMD_REG16,0xB9); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); for(count = 0; count < 9; count++) { - mtk_nand_set_command(0x53); - mtk_nand_set_address((0x04 + count), 0, 1, 0); + DRV_WriteReg(NFI_CMD_REG16,0x53); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); + DRV_WriteReg32(NFI_COLADDR_REG32, (0x04 + count)); + DRV_WriteReg32(NFI_ROWADDR_REG32, 0); + DRV_WriteReg(NFI_ADDRNOB_REG16, 0x1); + while (DRV_Reg32(NFI_STA_REG32) & STA_ADDR_STATE); DRV_WriteReg(NFI_CON_REG16, (CON_NFI_BWR | (1 << CON_NFI_SEC_SHIFT))); DRV_WriteReg(NFI_STRDATA_REG16, 1); - timeout = 0xffff; WAIT_NFI_PIO_READY(timeout); - DRV_WriteReg32(NFI_DATAW_REG32, 0x00); + DRV_WriteReg32(NFI_DATAW_REG32, 0x00); + mtk_nand_reset(); } @@ -3204,45 +3195,75 @@ static void sandisk_19nm_rr_loading(u32 retryCount, bool defValue) { u32 reg_val = 0; u32 timeout = 0xffff; + u32 u4RandomSetting; u32 acccon; - u8 count; - u8 cmd_reg[4] = {0x4, 0x5, 0x7}; + acccon = DRV_Reg32(NFI_ACCCON_REG32); - DRV_WriteReg32(NFI_ACCCON_REG32, 0x31C08669); //to fit read retry timing + DRV_WriteReg32(NFI_ACCCON_REG32, 0x31C083F9); //to fit read retry timing mtk_nand_reset(); + + if(use_randomizer) + { + u4RandomSetting = DRV_Reg32(NFI_RANDOM_CNFG_REG32); + DRV_WriteReg32(NFI_RANDOM_CNFG_REG32, (u4RandomSetting & (~(RAN_CNFG_ENCODE_EN | RAN_CNFG_DECODE_EN)))); + } reg_val = (CNFG_OP_CUST | CNFG_BYTE_RW); DRV_WriteReg(NFI_CNFG_REG16, reg_val); if((0 != retryCount) || defValue) { - mtk_nand_set_command(0xD6); + DRV_WriteReg(NFI_CMD_REG16,0xD6); //disable rr + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); } - mtk_nand_set_command(0x3B); - mtk_nand_set_command(0xB9); - for(count = 0; count < 3; count++) - { - mtk_nand_set_command(0x53); - mtk_nand_set_address(cmd_reg[count], 0, 1, 0); - DRV_WriteReg(NFI_CON_REG16, (CON_NFI_BWR | (1 << CON_NFI_SEC_SHIFT))); - DRV_WriteReg(NFI_STRDATA_REG16, 1); - timeout = 0xffff; - WAIT_NFI_PIO_READY(timeout); - if(count == 0) - DRV_WriteReg32(NFI_DATAW_REG32, (((sandisk_19nm_rr_table[retryCount] & 0xF000) >> 8) | ((sandisk_19nm_rr_table[retryCount] & 0x00F0) >> 4))); - else if(count == 1) - DRV_WriteReg32(NFI_DATAW_REG32, ((sandisk_19nm_rr_table[retryCount] & 0x000F) << 4)); - else if(count == 2) - DRV_WriteReg32(NFI_DATAW_REG32, ((sandisk_19nm_rr_table[retryCount] & 0x0F00) >> 4)); - - mtk_nand_reset(); - } + DRV_WriteReg(NFI_CMD_REG16,0x3B); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); + DRV_WriteReg(NFI_CMD_REG16,0xB9); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); + + DRV_WriteReg(NFI_CMD_REG16,0x53); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); + DRV_WriteReg32(NFI_COLADDR_REG32, 0x04); + DRV_WriteReg32(NFI_ROWADDR_REG32, 0); + DRV_WriteReg(NFI_ADDRNOB_REG16, 0x1); + while (DRV_Reg32(NFI_STA_REG32) & STA_ADDR_STATE); + DRV_WriteReg(NFI_CON_REG16, (CON_NFI_BWR | (1 << CON_NFI_SEC_SHIFT))); + DRV_WriteReg(NFI_STRDATA_REG16, 1); + WAIT_NFI_PIO_READY(timeout); + DRV_WriteReg32(NFI_DATAW_REG32, (((sandisk_19nm_rr_table[retryCount] & 0xF000) >> 8) | ((sandisk_19nm_rr_table[retryCount] & 0x00F0) >> 4))); + + mtk_nand_reset(); + + DRV_WriteReg(NFI_CMD_REG16,0x53); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); + DRV_WriteReg32(NFI_COLADDR_REG32, 0x05); + DRV_WriteReg32(NFI_ROWADDR_REG32, 0); + DRV_WriteReg(NFI_ADDRNOB_REG16, 0x1); + while (DRV_Reg32(NFI_STA_REG32) & STA_ADDR_STATE); + DRV_WriteReg(NFI_CON_REG16, (CON_NFI_BWR | (1 << CON_NFI_SEC_SHIFT))); + DRV_WriteReg(NFI_STRDATA_REG16, 1); + WAIT_NFI_PIO_READY(timeout); + DRV_WriteReg32(NFI_DATAW_REG32, ((sandisk_19nm_rr_table[retryCount] & 0x000F) << 4)); + + mtk_nand_reset(); + + DRV_WriteReg(NFI_CMD_REG16,0x53); + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); + DRV_WriteReg32(NFI_COLADDR_REG32, 0x07); + DRV_WriteReg32(NFI_ROWADDR_REG32, 0); + DRV_WriteReg(NFI_ADDRNOB_REG16, 0x1); + while (DRV_Reg32(NFI_STA_REG32) & STA_ADDR_STATE); + DRV_WriteReg(NFI_CON_REG16, (CON_NFI_BWR | (1 << CON_NFI_SEC_SHIFT))); + DRV_WriteReg(NFI_STRDATA_REG16, 1); + WAIT_NFI_PIO_READY(timeout); + DRV_WriteReg32(NFI_DATAW_REG32, ((sandisk_19nm_rr_table[retryCount] & 0x0F00) >> 4)); if(!defValue) { - mtk_nand_set_command(0xB6); + DRV_WriteReg(NFI_CMD_REG16,0xB6); //enable rr + while (DRV_Reg32(NFI_STA_REG32) & STA_CMD_STATE); } DRV_WriteReg32(NFI_ACCCON_REG32, acccon); @@ -3254,20 +3275,19 @@ static void mtk_nand_sandisk_19nm_rrtry(struct mtd_info *mtd,flashdev_info_t dev sandisk_19nm_rr_init(); sandisk_19nm_rr_loading(retryCount, defValue); } +#endif #define HYNIX_RR_TABLE_SIZE (1026) //hynix read retry table size #define SINGLE_RR_TABLE_SIZE (64) -#define READ_RETRY_STEP (devinfo.feature_set.FeatureSet.readRetryCnt + devinfo.feature_set.FeatureSet.readRetryStart) // 8 step or 12 step to fix read retry table -#define HYNIX_16NM_RR_TABLE_SIZE ((READ_RETRY_STEP == 12)?(784):(528)) //hynix read retry table size -#define SINGLE_RR_TABLE_16NM_SIZE ((READ_RETRY_STEP == 12)?(48):(32)) +#define HYNIX_16NM_RR_TABLE_SIZE (528) //hynix read retry table size +#define SINGLE_RR_TABLE_16NM_SIZE (32) u8 nand_hynix_rr_table[(HYNIX_RR_TABLE_SIZE+16)/16*16]; //align as 16 byte #define NAND_HYX_RR_TBL_BUF nand_hynix_rr_table -static u8 real_hynix_rr_table_idx = 0; -static u32 g_hynix_retry_count = 0; +u8 real_hynix_rr_table_idx = 0; static bool hynix_rr_table_select(u8 table_index, flashdev_info_t *deviceinfo) { @@ -3286,17 +3306,7 @@ static bool hynix_rr_table_select(u8 table_index, flashdev_info_t *deviceinfo) if(0xFF != (temp_rr_table[i] ^ temp_inversed_rr_table[i])) return FALSE; // error table } -// print table - if(deviceinfo->feature_set.FeatureSet.rtype == RTYPE_HYNIX_16NM) - table_size += 16; - else - table_size += 2; - for(i = 0; i < table_size; i++) - { - printk("%02X ", NAND_HYX_RR_TBL_BUF[i]); - if((i + 1)%8 == 0) - printk("\n"); - } + return TRUE; // correct table } @@ -3318,10 +3328,6 @@ static void HYNIX_RR_TABLE_READ(flashdev_info_t *deviceinfo) add_reg1[1]= 0x38; data_reg1[1] = 0x52; max_count = HYNIX_16NM_RR_TABLE_SIZE; - if(READ_RETRY_STEP == 12) - { - add_reg2[2] = 0x1F; - } } mtk_nand_device_reset(); // take care under sync mode. need change nand device inferface xiaolei @@ -3457,114 +3463,41 @@ static void HYNIX_Set_RR_Para(u32 rr_index, flashdev_info_t *deviceinfo) mtk_nand_reset(); DRV_WriteReg(NFI_CNFG_REG16, (CNFG_OP_CUST | CNFG_BYTE_RW)); - //mtk_nand_set_command(0x36); + mtk_nand_set_command(0x36); for(count = 0; count < max_count; count++) { - mtk_nand_set_command(0x36); mtk_nand_set_address(add_reg[count], 0, 1, 0); DRV_WriteReg(NFI_CON_REG16, (CON_NFI_BWR | (1 << CON_NFI_SEC_SHIFT))); DRV_WriteReg(NFI_STRDATA_REG16, 1); timeout = 0xffff; WAIT_NFI_PIO_READY(timeout); - if(timeout == 0) - { - printk("HYNIX_Set_RR_Para timeout\n"); - break; - } DRV_WriteReg32(NFI_DATAW_REG32, hynix_rr_table[rr_index*max_count + count]); mtk_nand_reset(); } mtk_nand_set_command(0x16); } -static void HYNIX_Get_RR_Para(u32 rr_index, flashdev_info_t *deviceinfo) +static void mtk_nand_hynix_rrtry(flashdev_info_t deviceinfo, u32 retryCount, bool defValue) { - u32 reg_val = 0; - u32 timeout=0xffff; - u8 count, max_count = 8; - u8 add_reg[9] = {0xCC, 0xBF, 0xAA, 0xAB, 0xCD, 0xAD, 0xAE, 0xAF}; - u8 *hynix_rr_table = (u8 *)NAND_HYX_RR_TBL_BUF+SINGLE_RR_TABLE_SIZE*real_hynix_rr_table_idx*2+2; - if(deviceinfo->feature_set.FeatureSet.rtype == RTYPE_HYNIX_16NM) - { - add_reg[0] = 0x38; //0x38, 0x39, 0x3A, 0x3B - for(count =1; count < 4; count++) - { - add_reg[count] = add_reg[0] + count; - } - hynix_rr_table += 14; - max_count = 4; - } - mtk_nand_reset(); - - DRV_WriteReg(NFI_CNFG_REG16, (CNFG_OP_CUST | CNFG_BYTE_RW | CNFG_READ_EN)); - //mtk_nand_set_command(0x37); - - for(count = 0; count < max_count; count++) - { - mtk_nand_set_command(0x37); - mtk_nand_set_address(add_reg[count], 0, 1, 0); - - DRV_WriteReg(NFI_CON_REG16, (CON_NFI_SRD | (1 << CON_NFI_NOB_SHIFT))); - DRV_WriteReg(NFI_STRDATA_REG16, 1); - - timeout = 0xffff; - WAIT_NFI_PIO_READY(timeout); - if(timeout == 0) - { - printk("HYNIX_Get_RR_Para timeout\n"); - } - //DRV_WriteReg32(NFI_DATAW_REG32, hynix_rr_table[rr_index*max_count + count]); - printk("Get[%02X]%02X\n",add_reg[count], DRV_Reg8(NFI_DATAR_REG32)); - mtk_nand_reset(); - } -} - -static void mtk_nand_hynix_rrtry(struct mtd_info *mtd, flashdev_info_t deviceinfo, u32 retryCount, bool defValue) -{ - if(defValue == FALSE) - { - if(g_hynix_retry_count == READ_RETRY_STEP) - { - g_hynix_retry_count = 0; - } - printk("Hynix Retry %d\n", g_hynix_retry_count); - HYNIX_Set_RR_Para(g_hynix_retry_count, &deviceinfo); - //HYNIX_Get_RR_Para(g_hynix_retry_count, &deviceinfo); - g_hynix_retry_count ++; - } + HYNIX_Set_RR_Para(retryCount, &deviceinfo); } -static void mtk_nand_hynix_16nm_rrtry(struct mtd_info *mtd, flashdev_info_t deviceinfo, u32 retryCount, bool defValue) +static void mtk_nand_hynix_16nm_rrtry(flashdev_info_t deviceinfo, u32 retryCount, bool defValue) { - if(defValue == FALSE) - { - if(g_hynix_retry_count == READ_RETRY_STEP) - { - g_hynix_retry_count = 0; - } - printk("Hynix 16nm Retry %d\n", g_hynix_retry_count); - HYNIX_Set_RR_Para(g_hynix_retry_count, &deviceinfo); - //mb(); - //HYNIX_Get_RR_Para(g_hynix_retry_count, &deviceinfo); - g_hynix_retry_count ++; - - } + HYNIX_Set_RR_Para(retryCount, &deviceinfo); } -// sandisk 1y nm -u32 special_rrtry_setting[36]= +u32 special_rrtry_setting[32]= { -0x00000000,0x7C00007C,0x787C0004,0x74780078, -0x7C007C08,0x787C7C00,0x74787C7C,0x70747C00, -0x7C007800,0x787C7800,0x74787800,0x70747800, -0x6C707800,0x00040400,0x7C000400,0x787C040C, -0x7478040C,0x7C000810,0x00040810,0x04040C0C, -0x00040C10,0x00081014,0x000C1418,0x7C040C0C, -0x74787478,0x70747478,0x6C707478,0x686C7478, -0x74787078,0x70747078,0x686C7078,0x6C707078, -0x6C706C78,0x686C6C78,0x64686C78,0x686C6874, -0x64686874, +0x00000000,0x7C00007C,0x04007C78,0x78007874, +0x087C007C,0x007C7C78,0x7C7C7874,0x007C7470, +0x0078007C,0x00787C78,0x00787874,0x00787470, +0x0078706C,0x00040400,0x0004007C,0x0C047C78, +0x0C047874,0x1008007C,0x10080400,0x78747874, +0x78747470,0x7874706C,0x78746C68,0x78707874, +0x78707470,0x78706C68,0x7870706C,0x786C706C, +0x786C6C68,0x786C6864,0x74686C68,0x74686864, }; static u32 mtk_nand_rrtry_setting(flashdev_info_t deviceinfo, enum readRetryType type, u32 retryStart, u32 loopNo) @@ -3626,11 +3559,13 @@ int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, int bRet = ERR_RTN_SUCCESS; struct nand_chip *nand = mtd->priv; u32 u4SecNum = u4PageSize >> host->hw->nand_sec_shift; + u32 u4SecSize = host->hw->nand_sec_size; u32 backup_corrected, backup_failed; bool readRetry = FALSE; int retryCount = 0; u32 val; u32 tempBitMap, bitMap, i; + u32 feature ; #ifdef NAND_PFM struct timeval pfm_time_read; #endif @@ -3643,24 +3578,30 @@ int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, //MSG(INIT, "mtk_nand_exec_read_page,u4RowAddr: 0x%x\n", u4RowAddr); PFM_BEGIN(pfm_time_read); tempBitMap = 0; + bitMap = 0; if (((u32) pPageBuf % 16) && local_buffer_16_align) { buf = local_buffer_16_align; } else - { - if(virt_addr_valid (pPageBuf)==0) - { // It should be allocated by vmalloc - buf = local_buffer_16_align; - } - else - { - buf = pPageBuf; - } - } + buf = pPageBuf; backup_corrected = mtd->ecc_stats.corrected; backup_failed = mtd->ecc_stats.failed; - +#if 0 + { + val = devinfo.feature_set.FeatureSet.readRetryDefault; + mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + devinfo.feature_set.FeatureSet.readRetryAddress,\ + (u8 *)&val,4); + mtk_nand_GetFeature(mtd, devinfo.feature_set.FeatureSet.gfeatureCmd,\ + devinfo.feature_set.FeatureSet.readRetryAddress,\ + (u8 *)&val,4); + if((val&0xFF) != (devinfo.feature_set.FeatureSet.readRetryDefault&0xFF)) + { + MSG(INIT, "mtk_nand_exec_read_page check read retry defalut value fail 0x%x\n",val); + } + } +#endif #if CFG_2CS_NAND if (g_bTricky_CS) @@ -3715,9 +3656,15 @@ int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, MSG(INIT,"NFI read retry read empty page, return as uncorrectable\n"); mtd->ecc_stats.failed+=u4SecNum; bRet = ERR_RTN_BCH_FAIL; - } - } - } + }else + { + memset(buf,0xff,u4PageSize); + memset(pFDMBuf,0xff,u4SecNum*8); + readRetry = FALSE; + bRet = ERR_RTN_SUCCESS; + } + } + } } mtk_nand_stop_read(); } @@ -3725,7 +3672,6 @@ int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, { mtk_nand_turn_off_randomizer();} else if(pre_randomizer && u4RowAddr < RAND_START_ADDR) { mtk_nand_turn_off_randomizer();} -#if 0 if (bRet == ERR_RTN_BCH_FAIL) { tempBitMap -= (tempBitMap&bitMap); @@ -3752,10 +3698,8 @@ int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, bRet = ERR_RTN_SUCCESS; } } -#endif if (bRet == ERR_RTN_BCH_FAIL) { - u32 feature ; tempBitMap = 0; //feature= devinfo.feature_set.FeatureSet.readRetryStart+retryCount; feature = mtk_nand_rrtry_setting(devinfo, devinfo.feature_set.FeatureSet.rtype,devinfo.feature_set.FeatureSet.readRetryStart,retryCount); @@ -3763,70 +3707,62 @@ int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, { mtd->ecc_stats.corrected = backup_corrected; mtd->ecc_stats.failed = backup_failed; - mtk_nand_rrtry_func(mtd,devinfo,feature,FALSE); + if(MLC_DEVICE) + { + //printk("[Bean]feature=%x\n", feature); + mtk_nand_rrtry_func(mtd,devinfo,feature,FALSE); + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); + } retryCount++; } else { + if(MLC_DEVICE) + { feature = devinfo.feature_set.FeatureSet.readRetryDefault; - // sandisk case 2/3/4 - if((devinfo.feature_set.FeatureSet.rtype == RTYPE_SANDISK) && (g_sandisk_retry_case < 3)) - { - g_sandisk_retry_case++; - printk("Sandisk read retry case#%d\n", g_sandisk_retry_case); - tempBitMap = 0; - mtd->ecc_stats.corrected = backup_corrected; - mtd->ecc_stats.failed = backup_failed; - mtk_nand_rrtry_func(mtd,devinfo,feature,FALSE); - //if((g_sandisk_retry_case == 0) || (g_sandisk_retry_case == 2)) - //{ - // mtk_nand_set_command(0x26); - //} - retryCount = 0; - }else - { - mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); - readRetry = FALSE; - g_sandisk_retry_case = 0; + mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); } - } - if((g_sandisk_retry_case == 1) || (g_sandisk_retry_case == 3)) - { - mtk_nand_set_command(0x26); - printk("Case1#3# Set cmd 26\n"); - } + readRetry = FALSE; + } } else { if((retryCount != 0) && MLC_DEVICE) { - u32 feature = devinfo.feature_set.FeatureSet.readRetryDefault; + feature = devinfo.feature_set.FeatureSet.readRetryDefault; mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); } readRetry = FALSE; - g_sandisk_retry_case = 0; } if(TRUE == readRetry) bRet = ERR_RTN_SUCCESS; }while(readRetry); if(retryCount != 0) { - u32 feature = devinfo.feature_set.FeatureSet.readRetryDefault; + feature = devinfo.feature_set.FeatureSet.readRetryDefault; if(bRet == ERR_RTN_SUCCESS) { MSG(INIT, "u4RowAddr:0x%x read retry pass, retrycnt:%d ENUM0:%x,ENUM1:%x,mtd_ecc(A):%x,mtd_ecc(B):%x \n",u4RowAddr,retryCount,DRV_Reg32(ECC_DECENUM1_REG32),DRV_Reg32(ECC_DECENUM0_REG32),mtd->ecc_stats.failed,backup_failed); - mtd->ecc_stats.corrected++; - if((devinfo.feature_set.FeatureSet.rtype == RTYPE_HYNIX_16NM) || (devinfo.feature_set.FeatureSet.rtype == RTYPE_HYNIX)) - { - g_hynix_retry_count--; - } } else { - MSG(INIT, "u4RowAddr:0x%x read retry fail, mtd_ecc(A):%x ,fail, mtd_ecc(B):%x\n",u4RowAddr,mtd->ecc_stats.failed,backup_failed); + MSG(INIT, "u4RowAddr:0x%x read retry fail, mtd_ecc(A):%x ,fail, mtd_ecc(B):%x\n",u4RowAddr,mtd->ecc_stats.failed,backup_failed); } - mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); - g_sandisk_retry_case = 0; + if(MLC_DEVICE) + { + mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); + } } if (buf == local_buffer_16_align) @@ -3835,7 +3771,7 @@ int mtk_nand_exec_read_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize, } if(bRet != ERR_RTN_SUCCESS) { - MSG(INIT,"ECC uncorrectable , fake buffer returned\n"); + MSG(INIT,"NFI ECC uncorrectable , fake buffer returned\n"); memset(pPageBuf,0xff,u4PageSize); memset(pFDMBuf,0xff,u4SecNum*8); } @@ -3871,16 +3807,7 @@ bool mtk_nand_exec_read_sector(struct mtd_info *mtd, u32 u4RowAddr, u32 u4ColAd { buf = local_buffer_16_align; } else - { - if(virt_addr_valid (pPageBuf)==0) - { // It should be allocated by vmalloc - buf = local_buffer_16_align; - } - else - { - buf = pPageBuf; - } - } + buf = pPageBuf; backup_corrected = mtd->ecc_stats.corrected; backup_failed = mtd->ecc_stats.failed; #if CFG_2CS_NAND @@ -3918,7 +3845,7 @@ bool mtk_nand_exec_read_sector(struct mtd_info *mtd, u32 u4RowAddr, u32 u4ColAd mtk_nand_read_fdm_data(pFDMBuf, u4SecNum); if (g_bHwEcc) { - if (!mtk_nand_check_bch_error(mtd, buf, pFDMBuf,u4SecNum - 1, u4RowAddr, NULL)) + if (!mtk_nand_check_bch_error(mtd, buf, pFDMBuf,u4SecNum - 1, u4RowAddr, &tempBitMap)) { if(devinfo.vendor != VEND_NONE){ readRetry = TRUE; @@ -3935,8 +3862,14 @@ bool mtk_nand_exec_read_sector(struct mtd_info *mtd, u32 u4RowAddr, u32 u4ColAd MSG(INIT,"NFI read retry read empty page, return as uncorrectable\n"); mtd->ecc_stats.failed+=u4SecNum; bRet = ERR_RTN_BCH_FAIL; - } - } + }else + { + memset(buf,0xff,u4PageSize); + memset(pFDMBuf,0xff,u4SecNum*8); + readRetry = FALSE; + bRet = ERR_RTN_SUCCESS; + } + } } } mtk_nand_stop_read(); @@ -3947,43 +3880,33 @@ bool mtk_nand_exec_read_sector(struct mtd_info *mtd, u32 u4RowAddr, u32 u4ColAd { mtk_nand_turn_off_randomizer();} if (bRet == ERR_RTN_BCH_FAIL) { + //u32 feature = devinfo.feature_set.FeatureSet.readRetryStart+retryCount; u32 feature = mtk_nand_rrtry_setting(devinfo, devinfo.feature_set.FeatureSet.rtype,devinfo.feature_set.FeatureSet.readRetryStart,retryCount); if(retryCount < devinfo.feature_set.FeatureSet.readRetryCnt) { mtd->ecc_stats.corrected = backup_corrected; mtd->ecc_stats.failed = backup_failed; - mtk_nand_rrtry_func(mtd,devinfo,feature,FALSE); + if(MLC_DEVICE) + { + mtk_nand_rrtry_func(mtd,devinfo,feature,FALSE); + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); + } retryCount++; } else { - feature = devinfo.feature_set.FeatureSet.readRetryDefault; - // sandisk case 2/3/4 - if((devinfo.feature_set.FeatureSet.rtype == RTYPE_SANDISK) && (g_sandisk_retry_case < 3)) - { - g_sandisk_retry_case++; - printk("Sandisk read retry case#%d\n", g_sandisk_retry_case); - tempBitMap = 0; - mtd->ecc_stats.corrected = backup_corrected; - mtd->ecc_stats.failed = backup_failed; - mtk_nand_rrtry_func(mtd,devinfo,feature,FALSE); - //if((g_sandisk_retry_case == 0) || (g_sandisk_retry_case == 2)) - //{ - // mtk_nand_set_command(0x26); - //} - retryCount = 0; - }else - { - mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); - readRetry = FALSE; - g_sandisk_retry_case = 0; + if(MLC_DEVICE) + { + feature = devinfo.feature_set.FeatureSet.readRetryDefault; + mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); } - } - if((g_sandisk_retry_case == 1) || (g_sandisk_retry_case == 3)) - { - mtk_nand_set_command(0x26); - printk("Case1#3# Set cmd 26\n"); - } + readRetry = FALSE; + } } else { @@ -3991,9 +3914,11 @@ bool mtk_nand_exec_read_sector(struct mtd_info *mtd, u32 u4RowAddr, u32 u4ColAd { u32 feature = devinfo.feature_set.FeatureSet.readRetryDefault; mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); } readRetry = FALSE; - g_sandisk_retry_case = 0; } if(TRUE == readRetry) bRet = ERR_RTN_SUCCESS; @@ -4004,25 +3929,23 @@ bool mtk_nand_exec_read_sector(struct mtd_info *mtd, u32 u4RowAddr, u32 u4ColAd if(bRet == ERR_RTN_SUCCESS) { MSG(INIT, "u4RowAddr:0x%x read retry pass, retrycnt:%d ENUM0:%x,ENUM1:%x,\n",u4RowAddr,retryCount,DRV_Reg32(ECC_DECENUM1_REG32),DRV_Reg32(ECC_DECENUM0_REG32)); - mtd->ecc_stats.corrected++; - if((devinfo.feature_set.FeatureSet.rtype == RTYPE_HYNIX_16NM) || (devinfo.feature_set.FeatureSet.rtype == RTYPE_HYNIX)) - { - g_hynix_retry_count--; - } } + if(MLC_DEVICE) + { mtk_nand_rrtry_func(mtd,devinfo,feature,TRUE); - g_sandisk_retry_case = 0; + //mtk_nand_SetFeature(mtd, devinfo.feature_set.FeatureSet.sfeatureCmd,\ + // devinfo.feature_set.FeatureSet.readRetryAddress,\ + // (u8*)&feature,4); + } } if (buf == local_buffer_16_align) memcpy(pPageBuf, buf, u4PageSize); PFM_END_R(pfm_time_read, u4PageSize + 32); - if(bRet != ERR_RTN_SUCCESS) - { - MSG(INIT,"ECC uncorrectable , fake buffer returned\n"); - memset(pPageBuf,0xff,u4PageSize); - memset(pFDMBuf,0xff,u4SecNum*8); - } + //if(use_randomizer /*&& u4RowAddr >= RAND_START_ADDR*/) + //{ mtk_nand_turn_off_randomizer();} + //else if(pre_randomizer && u4RowAddr < RAND_START_ADDR) + //{ mtk_nand_turn_off_randomizer();} return bRet; } @@ -4100,22 +4023,11 @@ int mtk_nand_exec_write_page(struct mtd_info *mtd, u32 u4RowAddr, u32 u4PageSize PFM_BEGIN(pfm_time_write); if (((u32) pPageBuf % 16) && local_buffer_16_align) { - printk(KERN_INFO "Data buffer not 16 bytes aligned: %p\n", pPageBuf); + printk("Data buffer not 16 bytes aligned: %p\n", pPageBuf); memcpy(local_buffer_16_align, pPageBuf, mtd->writesize); buf = local_buffer_16_align; - } - else - { - if(virt_addr_valid (pPageBuf)==0) - { // It should be allocated by vmalloc - memcpy(local_buffer_16_align, pPageBuf, mtd->writesize); - buf = local_buffer_16_align; - } - else - { - buf = pPageBuf; - } - } + } else + buf = pPageBuf; if (mtk_nand_ready_for_write(chip, u4RowAddr, 0, true, buf)) { @@ -4189,7 +4101,7 @@ static int mtk_nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, { set_bad_index_to_oob(chip->oob_poi, FAKE_INDEX); } - + //printk("[xiaolei] mtk_nand_write_page 0x%x\n", (u32)buf); if (mtk_nand_exec_write_page(mtd, page_in_block + mapped_block * page_per_block, mtd->writesize, (u8 *) buf, chip->oob_poi)) { MSG(INIT, "write fail at block: 0x%x, page: 0x%x\n", mapped_block, page_in_block); @@ -4289,6 +4201,7 @@ static void mtk_nand_command_bp(struct mtd_info *mtd, unsigned int command, int if (g_kCMD.pDataBuf || (0xFF != g_kCMD.au1OOB[0])) { u8 *pDataBuf = g_kCMD.pDataBuf ? g_kCMD.pDataBuf : nand->buffers->databuf; + //printk("[xiaolei] mtk_nand_command_bp 0x%x\n", (u32)pDataBuf); mtk_nand_exec_write_page(mtd, g_kCMD.u4RowAddr, mtd->writesize, pDataBuf, g_kCMD.au1OOB); g_kCMD.u4RowAddr = (u32) - 1; g_kCMD.u4OOBRowAddr = (u32) - 1; @@ -5680,7 +5593,6 @@ static void mtk_nand_init_hw(struct mtk_nand_host *host) DRV_WriteReg32(NFI_ACCCON_REG32, hw->nfi_access_timing); DRV_WriteReg16(NFI_CNFG_REG16, 0); DRV_WriteReg16(NFI_PAGEFMT_REG16, 4); - DRV_WriteReg32(NFI_ENMPTY_THRESH_REG32, 40); /* Reset the state machine and data FIFO, because flushing FIFO */ (void)mtk_nand_reset(); @@ -6374,6 +6286,20 @@ static int mtk_nand_probe(struct platform_device *pdev) #if CFG_RANDOMIZER if(devinfo.vendor != VEND_NONE) { + //mtk_nand_randomizer_config(&devinfo.feature_set.randConfig); + #if 0 + if ((devinfo.feature_set.randConfig.type == RAND_TYPE_SAMSUNG) || + (devinfo.feature_set.randConfig.type == RAND_TYPE_TOSHIBA)) + { + MSG(INIT, "[NAND]USE Randomizer\n"); + use_randomizer = TRUE; + } + else + { + MSG(INIT, "[NAND]OFF Randomizer\n"); + use_randomizer = FALSE; + } + #endif // only charge for efuse bonding if((*EFUSE_RANDOM_CFG)&EFUSE_RANDOM_ENABLE) { MSG(INIT, "[NAND]EFUSE RANDOM CFG is ON\n"); @@ -6709,10 +6635,6 @@ static int mtk_nand_resume(struct platform_device *pdev) // struct nand_chip *chip = mtd->priv; //struct gFeatureSet *feature_set = &(devinfo.feature_set.FeatureSet); //for test //int val = -1; // for test - //[BUGFIX]-Add-BEGIN by SCDTABLET.(lilin.liu@jrdcom.com), PR981151,981152 04/24/2015 - u32 timeout = 2000; - bool ret = true; - //[BUGFIX]-Add-END by SCDTABLET.(lilin.liu@jrdcom.com) #ifdef CONFIG_PM @@ -6725,22 +6647,7 @@ static int mtk_nand_resume(struct platform_device *pdev) #else hwPowerOn(MT6323_POWER_LDO_VMCH, VOL_3300, "NFI"); #endif - - //[BUGFIX]-Add-BEGIN by SCDTABLET.(lilin.liu@jrdcom.com), PR981151,981152 04/24/2015 - MSG(INIT, "[NFI] Resume Add extera 1ms Delay and wait for device reset ready !\n"); - mdelay(1); - while (timeout--){ - ret = mtk_nand_device_reset(); - if(ret == true) - break; - - udelay(100); //total 200ms polling nand reset status - } - - if(ret == false){ - MSG(INIT, "[NFI] Resume Error, device reset failed here!\n"); - } - //[BUGFIX]-Add-END by SCDTABLET.(lilin.liu@jrdcom.com) + mtk_nand_device_reset(); DRV_WriteReg16(NFI_CNFG_REG16 ,host->saved_para.sNFI_CNFG_REG16); DRV_WriteReg16(NFI_PAGEFMT_REG16 ,host->saved_para.sNFI_PAGEFMT_REG16); DRV_WriteReg32(NFI_CON_REG16 ,host->saved_para.sNFI_CON_REG16); @@ -7266,83 +7173,9 @@ static struct platform_driver mtk_nand_driver = { * None * ******************************************************************************/ - #define SEQ_printf(m, x...) \ - do { \ - if (m) \ - seq_printf(m, x); \ - else \ - printk(x); \ - } while (0) - -int mtk_nand_proc_show(struct seq_file *m, void *v) -{ - int i; - SEQ_printf(m, "ID:"); - for(i=0;ii_private); -} - - static const struct file_operations mtk_nand_fops = { - .open = mt_nand_proc_open, - .write = mtk_nand_proc_write, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, + .read = mtk_nand_proc_read, + .write = mtk_nand_proc_write, }; static int __init mtk_nand_init(void) { diff --git a/drivers/misc/mediatek/pmt/Makefile b/drivers/misc/mediatek/pmt/Makefile deleted file mode 100755 index 9c5369463a3..00000000000 --- a/drivers/misc/mediatek/pmt/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -obj-$(CONFIG_ARCH_MT6582) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ -obj-$(CONFIG_ARCH_MT6592) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ -obj-$(CONFIG_ARCH_MT8127) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ -obj-$(CONFIG_ARCH_MT6572) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ diff --git a/drivers/misc/mediatek/pmt/mt8127/Makefile b/drivers/misc/mediatek/pmt/mt8127/Makefile deleted file mode 100755 index c3a6bd0abb1..00000000000 --- a/drivers/misc/mediatek/pmt/mt8127/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -include $(srctree)/drivers/misc/mediatek/Makefile.custom -obj-$(CONFIG_MTK_MMC) := pmt.o diff --git a/drivers/misc/mediatek/pmt/mt8127/pmt.c b/drivers/misc/mediatek/pmt/mt8127/pmt.c deleted file mode 100644 index a2487b59c9d..00000000000 --- a/drivers/misc/mediatek/pmt/mt8127/pmt.c +++ /dev/null @@ -1,1055 +0,0 @@ -#include /* printk() */ -#include -#include /* size_t */ -#include /* toupper */ -#include /* strlen */ -#include /* kmalloc() */ -#include -#include /*proc*/ -#include //special -#include -#include /*set_fs get_fs mm_segment_t*/ - -#include "partition_define.h" -#include "pmt.h" -#include - -//#define USING_XLOG - -#ifdef USING_XLOG -#include - -#define TAG "PMT" - -#define pmt_err(fmt, args...) \ - xlog_printk(ANDROID_LOG_ERROR, TAG, fmt, ##args) -#define pmt_info(fmt, args...) \ - xlog_printk(ANDROID_LOG_INFO, TAG, fmt, ##args) - -#else - -#define TAG "[PMT]" - -#define pmt_err(fmt, args...) \ - printk(KERN_ERR TAG); \ - printk(KERN_CONT fmt, ##args) -#define pmt_info(fmt, args...) \ - printk(KERN_NOTICE TAG); \ - printk(KERN_CONT fmt, ##args) - -#endif - -#define CONFIG_PMT_ENABLE - - -#ifdef CONFIG_MTK_EMMC_SUPPORT - -static struct MBR_EBR_struct MBR_EBR_px[XBR_COUNT]={ - {"mbr", {0, 0, 0, 0, }}, - {"", {0, 0, 0, 0, }}, - {"", {0, 0, 0, 0, }}, -}; - -int PART_NUM = 0; - -static unsigned long long emmc_total_size = 0; -static unsigned long long emmc_user_size = 0; - -static pt_resident *last_part; -static struct pt_info pi; - -static int pmt_done = 0; - -extern int eMMC_rw_x(loff_t addr,u32 *buffer, int host_num, int iswrite, u32 totalsize, int transtype, Region part); -extern void msdc_check_init_done(void); - -#define PMT_REGION_SIZE (0x1000) -#define PMT_REGION_OFFSET (0x100000) - -#define PMT_VER_V1P1 ("1.1") -#define PMT_VER_SIZE (4) - -#define MAIN_PT 0 -#define MIRROR_PT 1 - -struct pmt_region; -struct pmt_region_ops { - //int (*valid)(struct pmt_region *region, unsigned char *buf); - int (*read)(struct pmt_region *region, void *buf); - int (*write)(struct pmt_region *region, void *buf); - int (*pack)(struct pmt_region *region, void *buf, pt_resident *part); - int (*unpack)(struct pmt_region *region, void *buf, pt_resident *part); -}; - -struct pmt_region { - unsigned long long base_addr; - unsigned int size; - unsigned int sig; - unsigned char name[32]; - struct pmt_region_ops *ops; -}; - -#ifdef CONFIG_PMT_ENABLE -static int pmt_region_read(struct pmt_region *region, void *buf) -{ - int err; - - err = eMMC_rw_x(region->base_addr, (unsigned int *)buf, 0, 0, region->size, 1, EMMC_PART_USER); - if (err) { - pmt_err("[%s]read %s error\n", __func__, region->name); - } - - return err; -} - -static int pmt_region_write(struct pmt_region *region, void *buf) -{ - int err; - - err = eMMC_rw_x(region->base_addr, (unsigned int *)buf, 0, 1, region->size, 1, EMMC_PART_USER); - if (err) { - pmt_err("[%s]write %s error\n", __func__, region->name); - } - - return err; -} - -static int pmt_region_pack(struct pmt_region *region, void *buf, pt_resident *part) -{ - void *ptr; - unsigned char sig[PT_SIG_SIZE]; - - memset(buf, 0x0, region->size); - - *(int *)sig = region->sig; - - /* head sig info */ - ptr = buf; - memcpy(ptr, sig, PT_SIG_SIZE); - - /* version info */ - ptr += PT_SIG_SIZE; - memcpy(ptr, PMT_VER_V1P1, PMT_VER_SIZE); - - /* partition info */ - ptr += PMT_VER_SIZE; - memcpy(ptr, part, PART_NUM * sizeof(pt_resident)); - - /* pt_info info */ - ptr = buf + region->size - PT_SIG_SIZE - sizeof(pi); - memcpy(ptr, &pi, sizeof(pi)); - - /* tail sig info */ - ptr += sizeof(pi); - memcpy(ptr, sig, PT_SIG_SIZE); - - return 0; -} - -static int pmt_region_unpack(struct pmt_region *region, void *buf, pt_resident *part) -{ - int err; - unsigned int head_sig, tail_sig; - void *ptr; - - /* head sig info */ - ptr = buf; - head_sig = *(unsigned int *)ptr; - - /* tail sig info */ - ptr += region->size - PT_SIG_SIZE; - tail_sig = *(unsigned int *)ptr; - - if (head_sig != region->sig || tail_sig != region->sig) { - err = -EINVAL; - pmt_err("[%s]%s: head_sig = 0x%08x, tail_sig = 0x%08x\n", - __func__, region->name, head_sig, tail_sig); - goto out; - } - - /* version info */ - ptr = buf + PT_SIG_SIZE; - if (!memcmp(ptr, PMT_VER_V1P1, PMT_VER_SIZE)) { - /* partition info */ - ptr += PMT_VER_SIZE; - memcpy(part, ptr, PART_MAX_COUNT* sizeof(pt_resident)); - err = DM_ERR_OK; - pmt_info(KERN_NOTICE "find %s at 0x%llx, ver %s\n", - region->name, region->base_addr, PMT_VER_V1P1); - } else { - pmt_err(KERN_ERR "invalid pt version 0x%x\n", *((u32 *)ptr)); - err = ERR_NO_EXIST; - goto out; - } - - /* pt_info info */ - ptr = buf + region->size - PT_SIG_SIZE - sizeof(pi); - pi.sequencenumber = *(unsigned char *)ptr; - ptr++; - pi.tool_or_sd_update = *(unsigned char *)ptr & 0xF; - -out: - return err; -} - -#else - -static inline int pmt_region_read(struct pmt_region *region, void *buf) -{ - return -EBUSY; -} - -static inline int pmt_region_write(struct pmt_region *region, void *buf) -{ - return -EBUSY; -} - -static inline int pmt_region_pack(struct pmt_region *region, void *buf, pt_resident *part) -{ - return -EBUSY; -} - -static inline int pmt_region_unpack(struct pmt_region *region, void *buf, pt_resident *part) -{ - return -EBUSY; -} - - -#endif - - -static struct pmt_region_ops pmt_ops = { - .read = pmt_region_read, - .write = pmt_region_write, - .pack = pmt_region_pack, - .unpack = pmt_region_unpack, -}; - - -#define PMT_REGION_IDX_MAIN (0) -#define PMT_REGION_IDX_MIRROR (1) -#define PMT_REGION_NRS (2) - -static struct pmt_region pmt_regions[] = { - { - .size = PMT_REGION_SIZE, - .sig = PT_SIG, - .name = "main-pt", - .ops = &pmt_ops, - }, { - .size = PMT_REGION_SIZE, - .sig = MPT_SIG, - .name = "mirror-pt", - .ops = &pmt_ops, - }, -}; - -static void init_pmt_region(void) -{ - unsigned long long pt_start; - unsigned long long mpt_start; - - pt_start = emmc_user_size - PMT_REGION_OFFSET; - mpt_start = pt_start + PMT_REGION_SIZE; - - pmt_regions[PMT_REGION_IDX_MAIN].base_addr = pt_start; - pmt_regions[PMT_REGION_IDX_MIRROR].base_addr = mpt_start; -} - - -static int __load_pmt(struct pmt_region *region, pt_resident *part) -{ - int err; - void *buf; - - buf = kzalloc(region->size, GFP_KERNEL); - if (!buf) { - err = -ENOMEM; - pmt_err("[%s]fail to malloc buf\n", __func__); - goto fail_malloc; - } - - err = region->ops->read(region, buf); - if (err) { - goto out; - } - - err = region->ops->unpack(region, buf, part); - if (err) { - goto out; - } - -out: - kfree(buf); - -fail_malloc: - return err; -} - -static int __store_pmt(struct pmt_region *region, pt_resident *new_part) -{ - int err; - void *buf; - - buf = kzalloc(region->size, GFP_KERNEL); - if (!buf) { - err = -ENOMEM; - pmt_err("[%s]fail to malloc buf\n", __func__); - goto fail_malloc; - } - - err = region->ops->write(region, buf); - if (err) { - goto out; - } - - err = region->ops->pack(region, buf, new_part); - if (err) { - goto out; - } - - err = region->ops->write(region, buf); - if (err) { - goto out; - } - -out: - kfree(buf); - -fail_malloc: - return err; -} - -static int load_pmt(void) -{ - int err; - int i; - - for (i = 0; i < PMT_REGION_NRS; i++) { - err = __load_pmt(pmt_regions + i, last_part); - if (!err) { - break; - } - } - - return err; -} - -#define PMT_UPDATE_BY_UNKNOWN (0) -#define PMT_UPDATE_BY_TEST (1) -#define PMT_UPDATE_BY_UPGRADE (2) -#define PMT_UPDATE_BY_TOOL (3) -#define PMT_UPDATE_REASONS (4) - -static const char *const pmt_update_reason[] = { - [PMT_UPDATE_BY_UNKNOWN] = "unknown", - [PMT_UPDATE_BY_TOOL] = "tool", - [PMT_UPDATE_BY_TEST] = "test", - [PMT_UPDATE_BY_UPGRADE] = "upgrade", -}; - -static int store_pmt(int reason) -{ - int err; - int i; - - BUG_ON(reason >= PMT_UPDATE_REASONS || reason < 0); - pi.sequencenumber += 1; - pi.tool_or_sd_update = reason; - - for (i = 1; i >= 0; i--) { - err = __store_pmt(pmt_regions + i, last_part); - if (err) { - break; - } - } - - return err; -} - - -static int read_pmt(void __user *arg) -{ - pmt_info("read_pmt\n"); - if (copy_to_user(arg, last_part, sizeof(pt_resident) * PART_NUM)) { - return -EFAULT; - } - return 0; -} - - -static int write_pmt(void __user *arg) -{ - int err = 0; - pt_resident *new_part; - - new_part = kmalloc(PART_NUM * sizeof(pt_resident), GFP_KERNEL); - if (!new_part) { - err = -ENOMEM; - pmt_err("write_pmt: malloc new_part fail\n"); - goto fail_malloc; - } - - if (copy_from_user(new_part, arg, PART_NUM * sizeof(pt_resident))) { - err = -EFAULT; - goto out; - } - - err = store_pmt(PMT_UPDATE_BY_TEST); - -out: - kfree(new_part); - -fail_malloc: - return err; -} - - -static void init_storage_info(void) -{ - struct storage_info s_info = {0}; - - msdc_check_init_done(); - - BUG_ON(!msdc_get_info(EMMC_CARD_BOOT, EMMC_CAPACITY, &s_info)); - BUG_ON(!msdc_get_info(EMMC_CARD_BOOT, EMMC_USER_CAPACITY, &s_info)); - - emmc_user_size = s_info.emmc_user_capacity * 512; - emmc_total_size = s_info.emmc_capacity * 512; - pmt_info("[%s]emmc_total_size = 0x%llx, user_region_size = 0x%llx\n", __func__, - emmc_total_size, emmc_user_size); -} - -#ifdef CONFIG_MSDOS_PARTITION - -#define MSDOS_LABEL_MAGIC1 0x55 -#define MSDOS_LABEL_MAGIC2 0xAA - -static inline int msdos_magic_present(unsigned char *p) -{ - return (p[0] == MSDOS_LABEL_MAGIC1 && p[1] == MSDOS_LABEL_MAGIC2); -} - -#endif - -static int parsing_xbr(u64 *xbr_addr, u64 *off2mbr) -{ - int err; - int slot; - u8 xbr_buf[512]; - struct partition *p; - u64 offset; - - u64 this_addr; - int is_mbr; - int next; - - this_addr = *xbr_addr; - is_mbr = (this_addr == 0ULL) ? 1 : 0; - next = 0; - - err = eMMC_rw_x(this_addr, (unsigned int *)xbr_buf, 0, 0, 512, 1, EMMC_PART_USER); - if (err || !msdos_magic_present(xbr_buf + 510)) { - pmt_info("read xbr(0x%llx) error %d (0x%x 0x%x)\n", - this_addr, err, xbr_buf[510], xbr_buf[511]); - next = 0; - goto out; - } - - p = (struct partition *)(xbr_buf + 0x1be); - - for (slot = 0; slot < 4; slot++, p++) { - if (!p->nr_sects) - continue; - - offset = (u64)p->start_sect * 512 + this_addr; - if (p->sys_ind == LINUX_DATA_PARTITION) { - off2mbr[slot] = offset; - } - } - - p -= 4; - for (slot = 0; slot < 4; slot++, p++) { - offset = (u64)p->start_sect * 512 + this_addr; - if (p->sys_ind == DOS_EXTENDED_PARTITION) { - if (is_mbr) { - off2mbr[slot] = offset; - } - *xbr_addr = offset; - next = 1; - break; - } - } - -out: - return next; -} - -static void construct_xbr_pmt_mapping(void) -{ - u64 off2mbr[XBR_COUNT][4]; - u64 xbr_addr; - int next; - - int xbr_idx, xbr_loops; - int slot; - int pmt_idx; - int partno; - - memset(off2mbr, 0x0, sizeof(u64) * 4 * XBR_COUNT); - - xbr_addr = 0; - for (xbr_idx = 0; xbr_idx < XBR_COUNT; xbr_idx++) { - next = parsing_xbr(&xbr_addr, off2mbr[xbr_idx]); - if (!next) { - break; - } - } - xbr_loops = min(xbr_idx + 1, XBR_COUNT); - - partno = 1; - for (xbr_idx = 0; xbr_idx < xbr_loops; xbr_idx++) { - if (xbr_idx) { - snprintf(MBR_EBR_px[xbr_idx].xbr_name, - sizeof(MBR_EBR_px[xbr_idx].xbr_name),"%s%d", "ebr", xbr_idx); - } - - for (slot = 0; slot < 4; slot++) { - if (!off2mbr[xbr_idx][slot]) - continue; - - for (pmt_idx = 0; pmt_idx < PART_NUM; pmt_idx++) { - if (PartInfo[pmt_idx].partition_idx) - continue; - - if (last_part[pmt_idx].offset == - off2mbr[xbr_idx][slot] ) { - MBR_EBR_px[xbr_idx].part_index[slot] = partno; - PartInfo[pmt_idx].partition_idx = partno; - partno++; - continue; - } - } - } - } -} - -int init_pmt(void) -{ - int err; - int i = 0, j = 0, len; - -#ifdef CONFIG_PMT_ENABLE - pmt_info("[%s]start...(CONFIG_PMT_ENABLE=y)\n", __func__); -#else - pmt_info("[%s]start...(CONFIG_PMT_ENABLE=n)\n", __func__); -#endif - - if (pmt_done) { - pmt_info("[%s]skip since init already\n", __func__); - return 0; - } - - init_storage_info(); - - init_pmt_region(); - - last_part = kzalloc(PART_MAX_COUNT* sizeof(pt_resident), GFP_KERNEL); - if (!last_part) { - err = -ENOMEM; - pmt_err("[%s]fail to malloc last_part\n", __func__); - goto fail_malloc; - } - - memset(&pi, 0, sizeof(struct pt_info)); - - err = load_pmt(); - if (err) { - err = -ENODEV; - pmt_err("[%s]No pmt found\n", __func__); - goto fail_find; - } - - while (i < PART_MAX_COUNT && last_part[i].size) { - PartInfo[i].start_address = last_part[i].offset; - PartInfo[i].size = last_part[i].size; - PartInfo[i].type = EMMC; - PartInfo[i].partition_idx = 0; - - len = strlen(last_part[i].name); - PartInfo[i].name = kzalloc(len + 1, GFP_KERNEL);//IPOH ?? - for (j = 0; j < len; j++) { - PartInfo[i].name[j] = tolower(last_part[i].name[j]); - } - PartInfo[i].name[len] = '\0'; - - if (!strcmp(PartInfo[i].name, "preloader")) { - PartInfo[i].region = EMMC_PART_BOOT1; - } else { - PartInfo[i].region = EMMC_PART_USER; - } - - i++; - } - - PART_NUM = i; - - if (!PART_NUM) { - err = -EINVAL; - pmt_err("PART_NUM invald: PART_NUM=%d\n", PART_NUM); - goto fail_find; - } - - - construct_xbr_pmt_mapping(); - - for (i = 0; i < PART_NUM; i++) { - pmt_info("Partition[%2d](%-16s) - start(0x%16llx) - size(0x%16llx)\n", - i, PartInfo[i].name, PartInfo[i].start_address, PartInfo[i].size); - } - - pmt_done = 1; - err = 0; - return err; - -fail_find: - kfree(last_part); -fail_malloc: - return err; -} -EXPORT_SYMBOL(init_pmt); - - -static int unpack_and_verify(struct DM_PARTITION_INFO_PACKET_x *packet, - pt_resident *new_part, int *changed, int *pt_change_tb) -{ - int err = 0; - int i; - - //copy new part - for (i = 0; i < PART_NUM; i++) { - memcpy(new_part[i].name, packet->part_info[i].part_name, MAX_PARTITION_NAME_LEN); - new_part[i].part_id = packet->part_info[i].part_id; - new_part[i].offset = packet->part_info[i].start_addr; - new_part[i].size = packet->part_info[i].part_len; - new_part[i].mask_flags = 0; - pmt_info("[SD_UPGRADE]new_pt %s size %llx \n", new_part[i].name, new_part[i].size); - } - - //compare new part and lastest part. - for (i = 0; i < PART_NUM; i++) { - if (new_part[i].size != last_part[i].size - || new_part[i].part_id != last_part[i].part_id - || new_part[i].offset != last_part[i].offset) { - pmt_info("[SD_UPGRADE]new_pt %d size changed from %llx to %llx\n", i, last_part[i].size, new_part[i].size); - *changed = 1; - pt_change_tb[i] = 1; - if ((packet->part_info[i].dl_selected == 0) - && (packet->part_info[i].visible == 1)) { - pmt_err("[SD_UPGRADE]please download all image\n"); - err = -EINVAL; - break; - } - } - } - - return err; -} - -static void update_part_size(pt_resident *new_part, int *pt_change_tb) -{ - int i; - struct storage_info s_info = {0}; - - BUG_ON(!msdc_get_info(EMMC_CARD_BOOT, EMMC_RESERVE, &s_info)); - for (i = 0; i < PART_NUM; i++) { - if (pt_change_tb[i] == 1 && new_part[i].size == 0) { - new_part[i].size = emmc_user_size - new_part[i].offset - s_info.emmc_reserve * 512; - } - } -} - - - -static int __update_msdos_partition(int px, unsigned long long start, unsigned long long size) -{ - int err = 0; - - int i, slot; - int xbr_idx = 0; - char *this_name = NULL; - unsigned long long this_addr; - - unsigned char *buf = NULL; - struct partition *p; - - buf = kzalloc(512, GFP_KERNEL); - if (!buf) { - err = -ENOMEM; - pmt_err("update_msdos_partition: malloc buf fail\n"); - goto fail_malloc; - } - - //find px in which mbr/ebr. - for (i = 0;i < XBR_COUNT; i++) { - for (slot = 0; slot < 4; slot++) { - if (MBR_EBR_px[i].part_index[slot] == px) { - /* this_name is mbr or ebrx */ - xbr_idx = i; - this_name = MBR_EBR_px[i].xbr_name; - goto found; - } - } - } - - if (slot >= 4) { - pmt_err("p%d can not be found in mbr\n", px); - err = -EINVAL; - goto out; - } - -found: - pmt_info("update %s\n", this_name); - - /* check mbr or ebrx partition info */ - for (i = 0; i < PART_NUM; i++) { - if (!strcmp(this_name, PartInfo[i].name)) { - //this_addr = PartInfo[i].start_address; - //pmt_info("update %s addr %llx\n", this_name, this_addr); - break; - } - } - - if (i == PART_NUM) { - pmt_err("can not find %s\n", this_name); - err = -EINVAL; - goto out; - } - - this_addr = PartInfo[i].start_address; - pmt_info("update %s addr %llx\n", this_name, this_addr); - - /* read mbr or ebr into buf */ - err = eMMC_rw_x(this_addr, (u32*)buf, 0, 0, 512, 1, EMMC_PART_USER); - if (err || !msdos_magic_present(buf + 510)) { - pmt_err("read %s error\n", this_name); - err = -EIO; - goto out; - } - - if (!msdos_magic_present(buf + 510)) { - pmt_err("read MBR/EBR fail\n"); - err = -1; - goto out; - } - - p = (struct partition *) (buf + 0x1be); - - p[slot].start_sect = (unsigned int)((start - this_addr) / 512); - p[slot].nr_sects = (unsigned int)(size / 512); - - err = eMMC_rw_x(this_addr, (u32*)buf, 0, 1, 512, 1, EMMC_PART_USER); - if (err) { - pmt_err("write %s error\n", this_name); - err = -EIO; - goto out; - } - -out: - kfree(buf); -fail_malloc: - return err; -} - -static int update_msdos_partition(pt_resident *new_part, int *pt_change_tb) -{ - int err = 0; - int i; - int px; - unsigned long long start; - unsigned long long size; - - for (i = 0; i < PART_NUM; i++) { - if (pt_change_tb[i] == 1 && PartInfo[i].partition_idx != 0) { - px = PartInfo[i].partition_idx; - start = new_part[i].offset; - size = new_part[i].size; - pmt_info("update p %d %llx %llx\n", px, start, size); - err = __update_msdos_partition(px, start, size); - if (err) { - err = -1; - pmt_err("[SD_UPGRADE]update_msdos_partition fail\n"); - break; - } - } - } - - return err; -} - -#ifdef CONFIG_MTK_EMMC_SUPPORT -static int __update_disk_info(unsigned int px, unsigned int start, unsigned int size) -{ - int found; - struct disk_part_iter piter; - struct hd_struct *part; - struct gendisk *disk; - struct storage_info s_info = {0}; - - BUG_ON(!msdc_get_info(EMMC_CARD_BOOT, DISK_INFO, &s_info)); - disk = s_info.disk; - - found = 0; - - disk_part_iter_init(&piter, disk, 0); - - while ((part = disk_part_iter_next(&piter))) { - if (px != 0 && px == part->partno) { - found = 1; - pmt_info("[update_disk_info]px = %d size %llx -> %x offset %llx -> %x\n", - px, part->nr_sects, size, part->start_sect, start); - part->start_sect = start; - part->nr_sects = size; - break; - } - } - - disk_part_iter_exit(&piter); - - return !found; -} - - -static int update_disk_info(pt_resident *new_part, int *pt_change_tb) -{ - int err = 0; - int i; - int px; - unsigned long long start; - unsigned long long size; - - - for (i = 0; i < PART_NUM; i++) { - if (pt_change_tb[i] == 1 && PartInfo[i].partition_idx != 0) { - px = PartInfo[i].partition_idx; - start = new_part[i].offset; - size = new_part[i].size; - pmt_info("update p %d %llx %llx\n", px, start, size); - err = __update_disk_info(px, (u32)(start / 512), (u32)(size/512)); - if (err) { - err = -1; - pmt_err("[SD_UPGRADE]update part device offset and size fail\n"); - break; - } - } - } - - return err; -} - -#endif - -static int pmt_upgrade_handler(struct DM_PARTITION_INFO_PACKET_x *packet) -{ - int err; - pt_resident *new_part; - int pt_changed = 0; - int pt_change_tb[PART_MAX_COUNT] = {0}; - - new_part = kzalloc(PART_NUM * sizeof(pt_resident), GFP_KERNEL); - if (!new_part) { - err = -ENOMEM; - pmt_err("sd_upgrade_handler: fail to malloc new_part\n"); - goto fail_malloc; - } - - err = unpack_and_verify(packet, new_part, &pt_changed, pt_change_tb); - if (err) { - goto out; - } - - if (!pt_changed) { - pmt_info("[SD_UPGRADE]layout can not change,skip update PMT/MBR\n"); - goto out; - } - - memcpy(last_part, new_part, PART_NUM * sizeof(pt_resident)); - err = store_pmt(PMT_UPDATE_BY_UPGRADE); - - update_part_size(new_part, pt_change_tb); - - err = update_msdos_partition(new_part, pt_change_tb); - if (err) { - goto out; - } - - err = update_disk_info(new_part, pt_change_tb); - if (err) { - goto out; - } - -out: - kfree(new_part); - -fail_malloc: - return err; -} - -static int pmt_upgrade_proc_write(struct file *file, const char __user *buffer, - size_t size, loff_t *ppos) -{ - struct DM_PARTITION_INFO_PACKET_x *packet; - int err; - - packet = kzalloc(sizeof(*packet), GFP_KERNEL); - if (!packet) { - err = -ENOMEM; - pmt_err("upgrade_proc_write: fail to malloc packet\n"); - goto fail_malloc; - } - - if (copy_from_user(packet, buffer, sizeof(*packet))) { - err = -EFAULT; - goto out; - } - - err = pmt_upgrade_handler(packet); - -out: - kfree(packet); -fail_malloc: - if (err) - return err; - else - return size; -} - -static const struct file_operations pmt_upgrade_proc_fops = { - .write = pmt_upgrade_proc_write, -}; - - -#define PMT_MAGIC 'p' -#define PMT_READ _IOW(PMT_MAGIC, 1, int) -#define PMT_WRITE _IOW(PMT_MAGIC, 2, int) - - -static long pmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - long err; - void __user *argp = (void __user *)arg; - - switch (cmd) - { - case PMT_READ: - err = read_pmt(argp); - break; - case PMT_WRITE: - err = write_pmt(argp); - break; - default: - err = -EINVAL; - } - return err; -} - - -static unsigned int major; -static struct class *pmt_class; -static struct cdev *pmt_cdev; -static struct file_operations pmt_cdev_ops = { - .owner = THIS_MODULE, - .unlocked_ioctl = pmt_ioctl, -}; - -static void create_pmt_cdev(void) -{ - int err; - dev_t devno; - struct device *pmt_dev; - - err = alloc_chrdev_region(&devno, 0, 1, "pmt"); - if (err) { - pmt_err("[%s]fail to alloc devno\n", __func__); - goto fail_alloc_devno; - } - - major = MAJOR(devno); - - pmt_cdev = cdev_alloc(); - if (!pmt_cdev) { - pmt_err("[%s]fail to alloc cdev\n", __func__); - goto fail_alloc_cdev; - } - - pmt_cdev->owner = THIS_MODULE; - pmt_cdev->ops = &pmt_cdev_ops; - - err = cdev_add(pmt_cdev, devno, 1); - if (err) { - pmt_err("[%s]fail to add cdev\n", __func__); - goto fail_add_cdev; - } - - pmt_class = class_create(THIS_MODULE, "pmt"); - if (IS_ERR(pmt_class)) { - pmt_err("[%s]fail to create class pmt\n", __func__); - goto fail_create_class; - } - - pmt_dev = device_create(pmt_class, NULL, devno, NULL, "pmt"); - if (IS_ERR(pmt_dev)) { - pmt_err("[%s]fail to create class pmt\n", __func__); - goto fail_create_device; - } - - return; - -fail_create_device: - class_destroy(pmt_class); -fail_create_class: -fail_add_cdev: - cdev_del(pmt_cdev); -fail_alloc_cdev: - unregister_chrdev_region(devno, 1); -fail_alloc_devno: - return; -} - -static void remove_pmt_cdev(void) -{ - device_destroy(pmt_class, MKDEV(major, 0)); - class_destroy(pmt_class); - cdev_del(pmt_cdev); - unregister_chrdev_region(MKDEV(major, 0), 1); -} - -static int __init pmt_init(void) -{ - struct proc_dir_entry *pmt_upgrade_proc; - - pmt_upgrade_proc = proc_create("sd_upgrade", 0600, NULL, &pmt_upgrade_proc_fops); - if (!pmt_upgrade_proc) { - pmt_err("[%s]fail to register /proc/sd_upgrade\n", __func__); - } - - create_pmt_cdev(); - - return 0; -} - -static void __exit pmt_exit(void) -{ - remove_proc_entry("sd_upgrade", NULL); - - remove_pmt_cdev(); -} - -module_init(pmt_init); -module_exit(pmt_exit); - -#endif - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("MediaTek Partition Table Management Driver"); -MODULE_AUTHOR("Jiequn.Chen "); diff --git a/drivers/misc/mediatek/pmt/mt8127/pmt.h b/drivers/misc/mediatek/pmt/mt8127/pmt.h deleted file mode 100644 index df2184701d4..00000000000 --- a/drivers/misc/mediatek/pmt/mt8127/pmt.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef _PMT_H -#define _PMT_H - -#include "partition_define.h" -//mt6516_partition.h has defination -//mt6516_download.h define again, both is 20 - -#define MAX_PARTITION_NAME_LEN 64 -#if defined(MTK_EMMC_SUPPORT) || defined(CONFIG_MTK_EMMC_SUPPORT) -/*64bit*/ -typedef struct -{ - char name[MAX_PARTITION_NAME_LEN]; /* partition name */ - unsigned long long size; /* partition size */ - unsigned long long part_id; /* partition region */ - unsigned long long offset; /* partition start */ - unsigned long long mask_flags; /* partition flags */ - -} pt_resident; -/*32bit*/ -typedef struct -{ - char name[MAX_PARTITION_NAME_LEN]; /* partition name */ - unsigned long size; /* partition size */ - unsigned long offset; /* partition start */ - unsigned long mask_flags; /* partition flags */ - -} pt_resident32; -#else - -typedef struct -{ - char name[MAX_PARTITION_NAME_LEN]; /* partition name */ - unsigned long long size; /* partition size */ - unsigned long long part_id; /* partition region */ - unsigned long long offset; /* partition start */ - unsigned long long mask_flags; /* partition flags */ - -} pt_resident; -#endif - - -#define DM_ERR_OK 0 -#define DM_ERR_NO_VALID_TABLE 9 -#define DM_ERR_NO_SPACE_FOUND 10 -#define ERR_NO_EXIST 1 - -//Sequnce number - - -//#define PT_LOCATION 4090 // (4096-80) -//#define MPT_LOCATION 4091 // (4096-81) -#define PT_SIG 0x50547633 //"PTv3" -#define MPT_SIG 0x4D505433 //"MPT3" -#define PT_SIG_SIZE 4 -//#define is_valid_mpt(buf) ((*(unsigned int *)(buf))==MPT_SIG) -//#define is_valid_pt(buf) ((*(unsigned int *)(buf))==PT_SIG) -#define is_valid_pt(buf) (!memcmp(buf, "3vTP", 4)) -#define is_valid_mpt(buf) (!memcmp(buf, "3TPM", 4)) -#define RETRY_TIMES 5 - -/*MBR or EBR struct*/ - -struct MBR_EBR_struct{ - char xbr_name[8]; - int part_index[4]; -}; - -#define XBR_COUNT 8 -//extern struct MBR_EBR_struct MBR_EBR_px[XBR_COUNT]; - -struct DM_PARTITION_INFO_x { - char part_name[MAX_PARTITION_NAME_LEN]; /* the name of partition */ - unsigned long long part_id; /* the region of partition */ - unsigned long long start_addr; /* the start address of partition */ - unsigned long long part_len; /* the length of partition */ - unsigned char visible; /* part_visibility is 0: this partition is hidden and CANNOT download */ - /* part_visibility is 1: this partition is visible and can download */ - unsigned char dl_selected; /* dl_selected is 0: this partition is NOT selected to download */ - /* dl_selected is 1: this partition is selected to download */ -}; - -struct DM_PARTITION_INFO_PACKET_x { - unsigned int pattern; - unsigned int part_num; /* The actual number of partitions */ - struct DM_PARTITION_INFO_x part_info[PART_MAX_COUNT]; -}; - -struct pt_info { - int sequencenumber:8; - int tool_or_sd_update:8; - int mirror_pt_dl:4; //mirror download OK - int mirror_pt_has_space:4; - int pt_changed:4; - int pt_has_space:4; -}; - -#endif - diff --git a/drivers/misc/mediatek/power/mt8127/Makefile b/drivers/misc/mediatek/power/mt8127/Makefile index 67199553a60..53828a6e56a 100755 --- a/drivers/misc/mediatek/power/mt8127/Makefile +++ b/drivers/misc/mediatek/power/mt8127/Makefile @@ -56,3 +56,7 @@ endif endif endif +ifeq ($(CONFIG_MTK_SN2871_SUPPORT),y) + obj-$(CONFIG_MTK_SMART_BATTERY) += sn2871.o charging_hw_sn2871.o +endif + diff --git a/drivers/misc/mediatek/power/mt8127/bq24296.c b/drivers/misc/mediatek/power/mt8127/bq24296.c index 64797f860a1..ba2897c0dc0 100644 --- a/drivers/misc/mediatek/power/mt8127/bq24296.c +++ b/drivers/misc/mediatek/power/mt8127/bq24296.c @@ -31,35 +31,35 @@ /********************************************************** * - * [I2C Slave Setting] + * [I2C Slave Setting] * *********************************************************/ #define bq24296_SLAVE_ADDR_WRITE 0xD6 #define bq24296_SLAVE_ADDR_READ 0xD7 -static struct i2c_client *new_client = NULL; -static const struct i2c_device_id bq24296_i2c_id[] = {{"bq24296",0},{}}; +static struct i2c_client *new_client; +static const struct i2c_device_id bq24296_i2c_id[] = {{"bq24296", 0}, {} }; kal_bool chargin_hw_init_done = KAL_FALSE; static int bq24296_driver_probe(struct i2c_client *client, const struct i2c_device_id *id); static void bq24296_shutdown(struct i2c_client *client) { - printk("[bq24296_shutdown] driver shutdown \n"); - bq24296_set_chg_config(0x0); + pr_info("[bq24296_shutdown] driver shutdown\n"); + bq24296_set_chg_config(0x0); } static struct i2c_driver bq24296_driver = { - .driver = { - .name = "bq24296", - }, - .probe = bq24296_driver_probe, - .id_table = bq24296_i2c_id, - .shutdown = bq24296_shutdown, + .driver = { + .name = "bq24296", + }, + .probe = bq24296_driver_probe, + .id_table = bq24296_i2c_id, + .shutdown = bq24296_shutdown, }; /********************************************************** * - * [Global Variable] + * [Global Variable] * *********************************************************/ #define bq24296_REG_NUM 11 @@ -68,633 +68,662 @@ kal_uint8 bq24296_reg[bq24296_REG_NUM] = {0}; static DEFINE_MUTEX(bq24296_i2c_access); /********************************************************** * - * [I2C Function For Read/Write bq24296] + * [I2C Function For Read/Write bq24296] * *********************************************************/ int bq24296_read_byte(kal_uint8 cmd, kal_uint8 *returnData) { - char cmd_buf[1]={0x00}; - char readData = 0; - int ret=0; + char cmd_buf[1] = {0x00}; + char readData = 0; + int ret = 0; - mutex_lock(&bq24296_i2c_access); - - //new_client->addr = ((new_client->addr) & I2C_MASK_FLAG) | I2C_WR_FLAG; - new_client->ext_flag=((new_client->ext_flag ) & I2C_MASK_FLAG ) | I2C_WR_FLAG | I2C_DIRECTION_FLAG; + mutex_lock(&bq24296_i2c_access); - cmd_buf[0] = cmd; - ret = i2c_master_send(new_client, &cmd_buf[0], (1<<8 | 1)); - if (ret < 0) - { - //new_client->addr = new_client->addr & I2C_MASK_FLAG; - new_client->ext_flag=0; - - mutex_unlock(&bq24296_i2c_access); - return 0; - } - - readData = cmd_buf[0]; - *returnData = readData; + /* new_client->addr = ((new_client->addr) & I2C_MASK_FLAG) | I2C_WR_FLAG; */ + new_client->ext_flag = ((new_client->ext_flag) & I2C_MASK_FLAG) | I2C_WR_FLAG | I2C_DIRECTION_FLAG; - //new_client->addr = new_client->addr & I2C_MASK_FLAG; - new_client->ext_flag=0; - - mutex_unlock(&bq24296_i2c_access); - return 1; + cmd_buf[0] = cmd; + ret = i2c_master_send(new_client, &cmd_buf[0], (1<<8 | 1)); + if (ret < 0) { + /* new_client->addr = new_client->addr & I2C_MASK_FLAG; */ + new_client->ext_flag = 0; + + mutex_unlock(&bq24296_i2c_access); + return 0; + } + + readData = cmd_buf[0]; + *returnData = readData; + + /* new_client->addr = new_client->addr & I2C_MASK_FLAG; */ + new_client->ext_flag = 0; + + mutex_unlock(&bq24296_i2c_access); + return 1; } int bq24296_write_byte(kal_uint8 cmd, kal_uint8 writeData) { - char write_data[2] = {0}; - int ret=0; - - mutex_lock(&bq24296_i2c_access); - - write_data[0] = cmd; - write_data[1] = writeData; + char write_data[2] = {0}; + int ret = 0; - new_client->ext_flag=((new_client->ext_flag ) & I2C_MASK_FLAG ) | I2C_DIRECTION_FLAG; - - ret = i2c_master_send(new_client, write_data, 2); - if (ret < 0) - { - new_client->ext_flag=0; - mutex_unlock(&bq24296_i2c_access); - return 0; - } + mutex_lock(&bq24296_i2c_access); - new_client->ext_flag=0; - mutex_unlock(&bq24296_i2c_access); - return 1; + write_data[0] = cmd; + write_data[1] = writeData; + + new_client->ext_flag = ((new_client->ext_flag) & I2C_MASK_FLAG) | I2C_DIRECTION_FLAG; + + ret = i2c_master_send(new_client, write_data, 2); + if (ret < 0) { + new_client->ext_flag = 0; + mutex_unlock(&bq24296_i2c_access); + return 0; + } + + new_client->ext_flag = 0; + mutex_unlock(&bq24296_i2c_access); + return 1; } /********************************************************** * - * [Read / Write Function] + * [Read / Write Function] * *********************************************************/ -kal_uint32 bq24296_read_interface (kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT) +kal_uint32 bq24296_read_interface(kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT) { - kal_uint8 bq24296_reg = 0; - int ret = 0; + kal_uint8 bq24296_reg = 0; + int ret = 0; - printk("--------------------------------------------------\n"); + ret = bq24296_read_byte(RegNum, &bq24296_reg); - ret = bq24296_read_byte(RegNum, &bq24296_reg); - printk("[bq24296_read_interface] Reg[%x]=0x%x\n", RegNum, bq24296_reg); - - bq24296_reg &= (MASK << SHIFT); - *val = (bq24296_reg >> SHIFT); - printk("[bq24296_read_interface] Val=0x%x\n", *val); + bq24296_reg &= (MASK << SHIFT); + *val = (bq24296_reg >> SHIFT); - return ret; + return ret; } -kal_uint32 bq24296_config_interface (kal_uint8 RegNum, kal_uint8 val, kal_uint8 MASK, kal_uint8 SHIFT) +kal_uint32 bq24296_config_interface(kal_uint8 RegNum, kal_uint8 val, kal_uint8 MASK, kal_uint8 SHIFT) { - kal_uint8 bq24296_reg = 0; - int ret = 0; + kal_uint8 bq24296_reg = 0; + int ret = 0; - printk("--------------------------------------------------\n"); + ret = bq24296_read_byte(RegNum, &bq24296_reg); - ret = bq24296_read_byte(RegNum, &bq24296_reg); - //printk("[bq24296_config_interface] Reg[%x]=0x%x\n", RegNum, bq24296_reg); - - bq24296_reg &= ~(MASK << SHIFT); - bq24296_reg |= (val << SHIFT); + bq24296_reg &= ~(MASK << SHIFT); + bq24296_reg |= (val << SHIFT); - ret = bq24296_write_byte(RegNum, bq24296_reg); - //printk("[bq24296_config_interface] Write Reg[%x]=0x%x\n", RegNum, bq24296_reg); + ret = bq24296_write_byte(RegNum, bq24296_reg); - // Check - //bq24296_read_byte(RegNum, &bq24296_reg); - //printk("[bq24296_config_interface] Check Reg[%x]=0x%x\n", RegNum, bq24296_reg); - - return ret; + return ret; } /********************************************************** * - * [Internal Function] + * [Internal Function] * *********************************************************/ -//CON0---------------------------------------------------- +/* CON0---------------------------------------------------- */ void bq24296_set_en_hiz(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON0), - (kal_uint8)(val), - (kal_uint8)(CON0_EN_HIZ_MASK), - (kal_uint8)(CON0_EN_HIZ_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON0), + (kal_uint8)(val), + (kal_uint8)(CON0_EN_HIZ_MASK), + (kal_uint8)(CON0_EN_HIZ_SHIFT) + ); } void bq24296_set_vindpm(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON0), - (kal_uint8)(val), - (kal_uint8)(CON0_VINDPM_MASK), - (kal_uint8)(CON0_VINDPM_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON0), + (kal_uint8)(val), + (kal_uint8)(CON0_VINDPM_MASK), + (kal_uint8)(CON0_VINDPM_SHIFT) + ); } void bq24296_set_iinlim(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON0), - (kal_uint8)(val), - (kal_uint8)(CON0_IINLIM_MASK), - (kal_uint8)(CON0_IINLIM_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON0), + (kal_uint8)(val), + (kal_uint8)(CON0_IINLIM_MASK), + (kal_uint8)(CON0_IINLIM_SHIFT) + ); } -//CON1---------------------------------------------------- +/* CON1---------------------------------------------------- */ void bq24296_set_reg_rst(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON1), - (kal_uint8)(val), - (kal_uint8)(CON1_REG_RST_MASK), - (kal_uint8)(CON1_REG_RST_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON1), + (kal_uint8)(val), + (kal_uint8)(CON1_REG_RST_MASK), + (kal_uint8)(CON1_REG_RST_SHIFT) + ); } void bq24296_set_wdt_rst(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON1), - (kal_uint8)(val), - (kal_uint8)(CON1_WDT_RST_MASK), - (kal_uint8)(CON1_WDT_RST_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON1), + (kal_uint8)(val), + (kal_uint8)(CON1_WDT_RST_MASK), + (kal_uint8)(CON1_WDT_RST_SHIFT) + ); } void bq24296_set_otg_config(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON1), - (kal_uint8)(val), - (kal_uint8)(CON1_OTG_CONFIG_MASK), - (kal_uint8)(CON1_OTG_CONFIG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON1), + (kal_uint8)(val), + (kal_uint8)(CON1_OTG_CONFIG_MASK), + (kal_uint8)(CON1_OTG_CONFIG_SHIFT) + ); } void bq24296_set_chg_config(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON1), - (kal_uint8)(val), - (kal_uint8)(CON1_CHG_CONFIG_MASK), - (kal_uint8)(CON1_CHG_CONFIG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON1), + (kal_uint8)(val), + (kal_uint8)(CON1_CHG_CONFIG_MASK), + (kal_uint8)(CON1_CHG_CONFIG_SHIFT) + ); } void bq24296_set_sys_min(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON1), - (kal_uint8)(val), - (kal_uint8)(CON1_SYS_MIN_MASK), - (kal_uint8)(CON1_SYS_MIN_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON1), + (kal_uint8)(val), + (kal_uint8)(CON1_SYS_MIN_MASK), + (kal_uint8)(CON1_SYS_MIN_SHIFT) + ); } void bq24296_set_boost_lim(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON1), - (kal_uint8)(val), - (kal_uint8)(CON1_BOOST_LIM_MASK), - (kal_uint8)(CON1_BOOST_LIM_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON1), + (kal_uint8)(val), + (kal_uint8)(CON1_BOOST_LIM_MASK), + (kal_uint8)(CON1_BOOST_LIM_SHIFT) + ); } -//CON2---------------------------------------------------- +/* CON2---------------------------------------------------- */ void bq24296_set_ichg(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON2), - (kal_uint8)(val), - (kal_uint8)(CON2_ICHG_MASK), - (kal_uint8)(CON2_ICHG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON2), + (kal_uint8)(val), + (kal_uint8)(CON2_ICHG_MASK), + (kal_uint8)(CON2_ICHG_SHIFT) + ); } void bq24296_set_bcold(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON2), - (kal_uint8)(val), - (kal_uint8)(CON2_BCOLD_MASK), - (kal_uint8)(CON2_BCOLD_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON2), + (kal_uint8)(val), + (kal_uint8)(CON2_BCOLD_MASK), + (kal_uint8)(CON2_BCOLD_SHIFT) + ); } void bq24296_set_force_20pct(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON2), - (kal_uint8)(val), - (kal_uint8)(CON2_FORCE_20PCT_MASK), - (kal_uint8)(CON2_FORCE_20PCT_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON2), + (kal_uint8)(val), + (kal_uint8)(CON2_FORCE_20PCT_MASK), + (kal_uint8)(CON2_FORCE_20PCT_SHIFT) + ); } -//CON3---------------------------------------------------- +/* CON3---------------------------------------------------- */ void bq24296_set_iprechg(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON3), - (kal_uint8)(val), - (kal_uint8)(CON3_IPRECHG_MASK), - (kal_uint8)(CON3_IPRECHG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON3), + (kal_uint8)(val), + (kal_uint8)(CON3_IPRECHG_MASK), + (kal_uint8)(CON3_IPRECHG_SHIFT) + ); } void bq24296_set_iterm(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON3), - (kal_uint8)(val), - (kal_uint8)(CON3_ITERM_MASK), - (kal_uint8)(CON3_ITERM_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON3), + (kal_uint8)(val), + (kal_uint8)(CON3_ITERM_MASK), + (kal_uint8)(CON3_ITERM_SHIFT) + ); } -//CON4---------------------------------------------------- +/* CON4---------------------------------------------------- */ void bq24296_set_vreg(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON4), - (kal_uint8)(val), - (kal_uint8)(CON4_VREG_MASK), - (kal_uint8)(CON4_VREG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON4), + (kal_uint8)(val), + (kal_uint8)(CON4_VREG_MASK), + (kal_uint8)(CON4_VREG_SHIFT) + ); } void bq24296_set_batlowv(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON4), - (kal_uint8)(val), - (kal_uint8)(CON4_BATLOWV_MASK), - (kal_uint8)(CON4_BATLOWV_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON4), + (kal_uint8)(val), + (kal_uint8)(CON4_BATLOWV_MASK), + (kal_uint8)(CON4_BATLOWV_SHIFT) + ); } void bq24296_set_vrechg(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON4), - (kal_uint8)(val), - (kal_uint8)(CON4_VRECHG_MASK), - (kal_uint8)(CON4_VRECHG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON4), + (kal_uint8)(val), + (kal_uint8)(CON4_VRECHG_MASK), + (kal_uint8)(CON4_VRECHG_SHIFT) + ); } -//CON5---------------------------------------------------- +/* CON5---------------------------------------------------- */ void bq24296_set_en_term(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON5), - (kal_uint8)(val), - (kal_uint8)(CON5_EN_TERM_MASK), - (kal_uint8)(CON5_EN_TERM_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON5), + (kal_uint8)(val), + (kal_uint8)(CON5_EN_TERM_MASK), + (kal_uint8)(CON5_EN_TERM_SHIFT) + ); } void bq24296_set_watchdog(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON5), - (kal_uint8)(val), - (kal_uint8)(CON5_WATCHDOG_MASK), - (kal_uint8)(CON5_WATCHDOG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON5), + (kal_uint8)(val), + (kal_uint8)(CON5_WATCHDOG_MASK), + (kal_uint8)(CON5_WATCHDOG_SHIFT) + ); } void bq24296_set_en_timer(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON5), - (kal_uint8)(val), - (kal_uint8)(CON5_EN_TIMER_MASK), - (kal_uint8)(CON5_EN_TIMER_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON5), + (kal_uint8)(val), + (kal_uint8)(CON5_EN_TIMER_MASK), + (kal_uint8)(CON5_EN_TIMER_SHIFT) + ); } void bq24296_set_chg_timer(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON5), - (kal_uint8)(val), - (kal_uint8)(CON5_CHG_TIMER_MASK), - (kal_uint8)(CON5_CHG_TIMER_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON5), + (kal_uint8)(val), + (kal_uint8)(CON5_CHG_TIMER_MASK), + (kal_uint8)(CON5_CHG_TIMER_SHIFT) + ); } -//CON6---------------------------------------------------- +/* CON6---------------------------------------------------- */ void bq24296_set_treg(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON6), - (kal_uint8)(val), - (kal_uint8)(CON6_TREG_MASK), - (kal_uint8)(CON6_TREG_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON6), + (kal_uint8)(val), + (kal_uint8)(CON6_TREG_MASK), + (kal_uint8)(CON6_TREG_SHIFT) + ); } void bq24296_set_boostv(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON6), - (kal_uint8)(val), - (kal_uint8)(CON6_BOOSTV_MASK), - (kal_uint8)(CON6_BOOSTV_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON6), + (kal_uint8)(val), + (kal_uint8)(CON6_BOOSTV_MASK), + (kal_uint8)(CON6_BOOSTV_SHIFT) + ); } void bq24296_set_bhot(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON6), - (kal_uint8)(val), - (kal_uint8)(CON6_BHOT_MASK), - (kal_uint8)(CON6_BHOT_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON6), + (kal_uint8)(val), + (kal_uint8)(CON6_BHOT_MASK), + (kal_uint8)(CON6_BHOT_SHIFT) + ); } -//CON7---------------------------------------------------- +/* CON7---------------------------------------------------- */ void bq24296_set_tmr2x_en(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON7), - (kal_uint8)(val), - (kal_uint8)(CON7_TMR2X_EN_MASK), - (kal_uint8)(CON7_TMR2X_EN_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON7), + (kal_uint8)(val), + (kal_uint8)(CON7_TMR2X_EN_MASK), + (kal_uint8)(CON7_TMR2X_EN_SHIFT) + ); } void bq24296_set_batfet_disable(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON7), - (kal_uint8)(val), - (kal_uint8)(CON7_BATFET_Disable_MASK), - (kal_uint8)(CON7_BATFET_Disable_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON7), + (kal_uint8)(val), + (kal_uint8)(CON7_BATFET_Disable_MASK), + (kal_uint8)(CON7_BATFET_Disable_SHIFT) + ); } void bq24296_set_int_mask(kal_uint32 val) { - kal_uint32 ret=0; + kal_uint32 ret = 0; - ret=bq24296_config_interface( (kal_uint8)(bq24296_CON7), - (kal_uint8)(val), - (kal_uint8)(CON7_INT_MASK_MASK), - (kal_uint8)(CON7_INT_MASK_SHIFT) - ); + ret = bq24296_config_interface((kal_uint8)(bq24296_CON7), + (kal_uint8)(val), + (kal_uint8)(CON7_INT_MASK_MASK), + (kal_uint8)(CON7_INT_MASK_SHIFT) + ); } -//CON8---------------------------------------------------- +/* CON8---------------------------------------------------- */ kal_uint32 bq24296_get_system_status(void) { - kal_uint32 ret=0; - kal_uint8 val=0; + kal_uint32 ret = 0; + kal_uint8 val = 0; - ret=bq24296_read_interface( (kal_uint8)(bq24296_CON8), - (&val), - (kal_uint8)(0xFF), - (kal_uint8)(0x0) - ); - return val; + ret = bq24296_read_interface((kal_uint8)(bq24296_CON8), + (&val), + (kal_uint8)(0xFF), + (kal_uint8)(0x0) + ); + return val; } kal_uint32 bq24296_get_vbus_stat(void) { - kal_uint32 ret=0; - kal_uint8 val=0; + kal_uint32 ret = 0; + kal_uint8 val = 0; - ret=bq24296_read_interface( (kal_uint8)(bq24296_CON8), - (&val), - (kal_uint8)(CON8_VBUS_STAT_MASK), - (kal_uint8)(CON8_VBUS_STAT_SHIFT) - ); - return val; + ret = bq24296_read_interface((kal_uint8)(bq24296_CON8), + (&val), + (kal_uint8)(CON8_VBUS_STAT_MASK), + (kal_uint8)(CON8_VBUS_STAT_SHIFT) + ); + return val; } kal_uint32 bq24296_get_chrg_stat(void) { - kal_uint32 ret=0; - kal_uint8 val=0; + kal_uint32 ret = 0; + kal_uint8 val = 0; - ret=bq24296_read_interface( (kal_uint8)(bq24296_CON8), - (&val), - (kal_uint8)(CON8_CHRG_STAT_MASK), - (kal_uint8)(CON8_CHRG_STAT_SHIFT) - ); - return val; + ret = bq24296_read_interface((kal_uint8)(bq24296_CON8), + (&val), + (kal_uint8)(CON8_CHRG_STAT_MASK), + (kal_uint8)(CON8_CHRG_STAT_SHIFT) + ); + return val; } kal_uint32 bq24296_get_vsys_stat(void) { - kal_uint32 ret=0; - kal_uint8 val=0; + kal_uint32 ret = 0; + kal_uint8 val = 0; - ret=bq24296_read_interface( (kal_uint8)(bq24296_CON8), - (&val), - (kal_uint8)(CON8_VSYS_STAT_MASK), - (kal_uint8)(CON8_VSYS_STAT_SHIFT) - ); - return val; + ret = bq24296_read_interface((kal_uint8)(bq24296_CON8), + (&val), + (kal_uint8)(CON8_VSYS_STAT_MASK), + (kal_uint8)(CON8_VSYS_STAT_SHIFT) + ); + return val; +} + +kal_uint32 bq24296_get_pn(void) +{ + kal_uint8 val = 0; + kal_uint32 ret = 0; + ret = bq24296_read_interface((kal_uint8) (bq24296_CON10), + (&val), + (kal_uint8) (CON10_PN_MASK), + (kal_uint8) (CON10_PN_SHIFT) + ); + + if (ret) + return val; + else + return 0; } /********************************************************** * - * [Internal Function] + * [Internal Function] * *********************************************************/ +static unsigned char bq24296_get_reg9_fault_type(unsigned char reg9_fault) +{ + unsigned char ret = 0; + + if ((reg9_fault & (CON9_OTG_FAULT_MASK << CON9_OTG_FAULT_SHIFT)) != 0) { + ret = BQ_OTG_FAULT; + } else if ((reg9_fault & (CON9_CHRG_FAULT_MASK << CON9_CHRG_FAULT_SHIFT)) != 0) { + if ((reg9_fault & (CON9_CHRG_INPUT_FAULT_MASK << CON9_CHRG_FAULT_SHIFT)) != 0) + ret = BQ_CHRG_INPUT_FAULT; + else if ((reg9_fault & + (CON9_CHRG_THERMAL_SHUTDOWN_FAULT_MASK << CON9_CHRG_FAULT_SHIFT)) != 0) + ret = BQ_CHRG_THERMAL_FAULT; + else if ((reg9_fault & + (CON9_CHRG_TIMER_EXPIRATION_FAULT_MASK << CON9_CHRG_FAULT_SHIFT)) != 0) + ret = BQ_CHRG_TIMER_EXPIRATION_FAULT; + } else if ((reg9_fault & (CON9_BAT_FAULT_MASK << CON9_BAT_FAULT_SHIFT)) != 0) + ret = BQ_BAT_FAULT; + else if ((reg9_fault & (CON9_NTC_FAULT_MASK << CON9_NTC_FAULT_SHIFT)) != 0) { + if ((reg9_fault & (CON9_NTC_COLD_FAULT_MASK << CON9_NTC_FAULT_SHIFT)) != 0) + ret = BQ_NTC_COLD_FAULT; + else if ((reg9_fault & (CON9_NTC_HOT_FAULT_MASK << CON9_NTC_FAULT_SHIFT)) != 0) + ret = BQ_NTC_HOT_FAULT; + } + return ret; +} + +void bq24296_get_fault_type(unsigned char *type) +{ + *type = bq24296_get_reg9_fault_type(bq24296_reg[bq24296_CON9]); +} +EXPORT_SYMBOL(bq24296_get_fault_type); + void bq24296_dump_register(void) { - int i=0; - for (i=0;i 3) - { - reg_value = simple_strtoul((pvalue+1),NULL,16); - printk("[store_bq24296_access] write bq24296 reg 0x%x with value 0x%x !\n",reg_address,reg_value); - ret=bq24296_config_interface(reg_address, reg_value, 0xFF, 0x0); - } - else - { - ret=bq24296_read_interface(reg_address, &g_reg_value_bq24296, 0xFF, 0x0); - printk("[store_bq24296_access] read bq24296 reg 0x%x with value 0x%x !\n",reg_address,g_reg_value_bq24296); - printk("[store_bq24296_access] Please use \"cat bq24296_access\" to get value\r\n"); - } - } - return size; + int ret = 0; + char *pvalue = NULL; + unsigned int reg_value = 0; + unsigned int reg_address = 0; + + pr_info("[store_bq24296_access]\n"); + + if (buf != NULL && size != 0) { + pr_info("[store_bq24296_access] buf is %s and size is %d\n", buf, size); + reg_address = simple_strtoul(buf, &pvalue, 16); + + if (size > 3) { + reg_value = simple_strtoul((pvalue+1), NULL, 16); + pr_notice("[store_bq24296_access] write bq24296 reg 0x%x with value 0x%x !\n", + reg_address, reg_value); + ret = bq24296_config_interface(reg_address, reg_value, 0xFF, 0x0); + } else { + ret = bq24296_read_interface(reg_address, &g_reg_value_bq24296, 0xFF, 0x0); + pr_notice("[store_bq24296_access] read bq24296 reg 0x%x with value 0x%x !\n", + reg_address, g_reg_value_bq24296); + pr_notice("[store_bq24296_access] Please use \"cat bq24296_access\" to get value\n"); + } + } + return size; } -static DEVICE_ATTR(bq24296_access, 0664, show_bq24296_access, store_bq24296_access); //664 +static DEVICE_ATTR(bq24296_access, 0664, show_bq24296_access, store_bq24296_access); /* 664 */ -static int bq24296_user_space_probe(struct platform_device *dev) -{ - int ret_device_file = 0; +static int bq24296_user_space_probe(struct platform_device *dev) +{ + int ret_device_file = 0; - printk("******** bq24296_user_space_probe!! ********\n" ); - - ret_device_file = device_create_file(&(dev->dev), &dev_attr_bq24296_access); - - return 0; + pr_info("******** bq24296_user_space_probe!! ********\n"); + + ret_device_file = device_create_file(&(dev->dev), &dev_attr_bq24296_access); + + return 0; } struct platform_device bq24296_user_space_device = { - .name = "bq24296-user", - .id = -1, + .name = "bq24296-user", + .id = -1, }; static struct platform_driver bq24296_user_space_driver = { - .probe = bq24296_user_space_probe, - .driver = { - .name = "bq24296-user", - }, + .probe = bq24296_user_space_probe, + .driver = { + .name = "bq24296-user", + }, }; #ifndef BQ24296_BUSNUM #define BQ24296_BUSNUM 1 #endif -static struct i2c_board_info __initdata i2c_bq24296 = { I2C_BOARD_INFO("bq24296", (0xd6>>1))}; +static struct i2c_board_info i2c_bq24296 __initdata = { I2C_BOARD_INFO("bq24296", (0xd6>>1))}; static int __init bq24296_init(void) -{ - int ret=0; - - printk("[bq24296_init] init start\n"); - - i2c_register_board_info(BQ24296_BUSNUM, &i2c_bq24296, 1); +{ + int ret = 0; - if(i2c_add_driver(&bq24296_driver)!=0) - { - printk("[bq24296_init] failed to register bq24296 i2c driver.\n"); - } - else - { - printk("[bq24296_init] Success to register bq24296 i2c driver.\n"); - } + pr_info("[bq24296_init] init start\n"); - // bq24296 user space access interface - ret = platform_device_register(&bq24296_user_space_device); - if (ret) { - printk("****[bq24296_init] Unable to device register(%d)\n", ret); - return ret; - } - ret = platform_driver_register(&bq24296_user_space_driver); - if (ret) { - printk("****[bq24296_init] Unable to register driver (%d)\n", ret); - return ret; - } - - return 0; + i2c_register_board_info(BQ24296_BUSNUM, &i2c_bq24296, 1); + + if (i2c_add_driver(&bq24296_driver) != 0) + pr_err("[bq24296_init] failed to register bq24296 i2c driver.\n"); + else + pr_notice("[bq24296_init] Success to register bq24296 i2c driver.\n"); + + /* bq24296 user space access interface */ + ret = platform_device_register(&bq24296_user_space_device); + if (ret) { + pr_err("****[bq24296_init] Unable to device register(%d)\n", ret); + return ret; + } + ret = platform_driver_register(&bq24296_user_space_driver); + if (ret) { + pr_err("****[bq24296_init] Unable to register driver (%d)\n", ret); + return ret; + } + + return 0; } static void __exit bq24296_exit(void) { - i2c_del_driver(&bq24296_driver); + i2c_del_driver(&bq24296_driver); } - module_init(bq24296_init); module_exit(bq24296_exit); - + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("I2C bq24296 Driver"); MODULE_AUTHOR("YT Lee"); diff --git a/drivers/misc/mediatek/power/mt8127/bq24296.h b/drivers/misc/mediatek/power/mt8127/bq24296.h index c36484b37a0..47282b3ef67 100644 --- a/drivers/misc/mediatek/power/mt8127/bq24296.h +++ b/drivers/misc/mediatek/power/mt8127/bq24296.h @@ -155,22 +155,43 @@ #define CON9_CHRG_FAULT_MASK 0x03 #define CON9_CHRG_FAULT_SHIFT 4 +#define CON9_CHRG_INPUT_FAULT_MASK 0x01 +#define CON9_CHRG_THERMAL_SHUTDOWN_FAULT_MASK 0x02 +#define CON9_CHRG_TIMER_EXPIRATION_FAULT_MASK 0x03 + #define CON9_BAT_FAULT_MASK 0x01 #define CON9_BAT_FAULT_SHIFT 3 -#define CON9_NTC_FAULT_MASK 0x07 +#define CON9_NTC_FAULT_MASK 0x03 #define CON9_NTC_FAULT_SHIFT 0 +#define CON9_NTC_COLD_FAULT_MASK 0x02 +#define CON9_NTC_HOT_FAULT_MASK 0x01 //CON10 #define CON10_PN_MASK 0x07 -#define CON10_PN_SHIFT 3 +#define CON10_PN_SHIFT 5 #define CON10_Rev_MASK 0x07 #define CON10_Rev_SHIFT 0 +/* REG09 status */ +enum BQ_FAULT { + BQ_NORMAL_FAULT = 0, + BQ_WATCHDOG_FAULT, + BQ_OTG_FAULT, + BQ_CHRG_NORMAL_FAULT, + BQ_CHRG_INPUT_FAULT, + BQ_CHRG_THERMAL_FAULT, + BQ_CHRG_TIMER_EXPIRATION_FAULT, + BQ_BAT_FAULT, + BQ_NTC_COLD_FAULT, + BQ_NTC_HOT_FAULT, + BQ_FAULT_MAX +}; + /********************************************************** * - * [Extern Function] + * [Extern Function] * *********************************************************/ //CON0---------------------------------------------------- @@ -213,6 +234,7 @@ extern kal_uint32 bq24296_get_system_status(void); extern kal_uint32 bq24296_get_vbus_stat(void); extern kal_uint32 bq24296_get_chrg_stat(void); extern kal_uint32 bq24296_get_vsys_stat(void); +extern kal_bool bq24296_is_found; //--------------------------------------------------------- extern void bq24296_dump_register(void); extern kal_uint32 bq24296_read_interface (kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT); diff --git a/drivers/misc/mediatek/power/mt8127/charging_hw_bq24196.c b/drivers/misc/mediatek/power/mt8127/charging_hw_bq24196.c index e883fbee983..f4b85d4d469 100644 --- a/drivers/misc/mediatek/power/mt8127/charging_hw_bq24196.c +++ b/drivers/misc/mediatek/power/mt8127/charging_hw_bq24196.c @@ -201,7 +201,7 @@ const kal_uint32 CS_VTH[]= } else { - battery_xlog_printk(BAT_LOG_CRTI, "Can't find the parameter \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "Can't find the parameter \n"); return parameter[0]; } } @@ -211,7 +211,7 @@ const kal_uint32 CS_VTH[]= { kal_uint32 i; - battery_xlog_printk(BAT_LOG_CRTI, "array_size = %d \r\n", array_size); + battery_xlog_printk(BAT_LOG_CRTI, "array_size = %d \n", array_size); for(i=0;i #include #include +#include #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT #include @@ -82,14 +83,14 @@ static CHARGER_TYPE g_charger_type = CHARGER_UNKNOWN; #define GPIO_CHR_CE_PIN (19 | 0x80000000) #endif #endif -int gpio_off_dir = GPIO_DIR_OUT; -int gpio_off_out = GPIO_OUT_ONE; -int gpio_on_dir = GPIO_DIR_OUT; -int gpio_on_out = GPIO_OUT_ZERO; +static int gpio_off_dir = GPIO_DIR_OUT; +static int gpio_off_out = GPIO_OUT_ONE; +static int gpio_on_dir = GPIO_DIR_OUT; +static int gpio_on_out = GPIO_OUT_ZERO; -kal_bool charging_type_det_done = KAL_TRUE; +static kal_bool charging_type_det_done = KAL_TRUE; -const kal_uint32 VBAT_CV_VTH[]= +static const kal_uint32 VBAT_CV_VTH[]= { 3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000, @@ -106,7 +107,7 @@ const kal_uint32 VBAT_CV_VTH[]= 4272000, 4288000, 4304000 }; -const kal_uint32 CS_VTH[]= +static const kal_uint32 CS_VTH[]= { 51200, 57600, 64000, 70400, 76800, 83200, 89600, 96000, @@ -117,13 +118,13 @@ const kal_uint32 CS_VTH[]= 204800, 211200, 217600, 224000 }; -const kal_uint32 INPUT_CS_VTH[]= +static const kal_uint32 INPUT_CS_VTH[]= { CHARGE_CURRENT_100_00_MA, CHARGE_CURRENT_150_00_MA, CHARGE_CURRENT_500_00_MA, CHARGE_CURRENT_900_00_MA, CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1500_00_MA, CHARGE_CURRENT_2000_00_MA, CHARGE_CURRENT_MAX }; -const kal_uint32 VCDT_HV_VTH[]= +static const kal_uint32 VCDT_HV_VTH[]= { BATTERY_VOLT_04_200000_V, BATTERY_VOLT_04_250000_V, BATTERY_VOLT_04_300000_V, BATTERY_VOLT_04_350000_V, BATTERY_VOLT_04_400000_V, BATTERY_VOLT_04_450000_V, BATTERY_VOLT_04_500000_V, BATTERY_VOLT_04_550000_V, @@ -188,8 +189,14 @@ extern void mt_power_off(void); static kal_uint32 charging_error = false; static kal_uint32 charging_get_error_state(void); static kal_uint32 charging_set_error_state(void *data); + +static DEFINE_MUTEX(g_charging_enable_mutex); +static kal_uint16 g_charging_enable_testmode = TESTMODE_NONE; +/* By default enable charging */ +static kal_uint32 g_last_charging_enable = KAL_FALSE; + // ============================================================ // -kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_uint32 array_size, const kal_uint32 val) +static kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_uint32 array_size, const kal_uint32 val) { if (val < array_size) { @@ -197,17 +204,17 @@ kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_ui } else { - battery_xlog_printk(BAT_LOG_CRTI, "Can't find the parameter \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "Can't find the parameter \n"); return parameter[0]; } } -kal_uint32 charging_parameter_to_value(const kal_uint32 *parameter, const kal_uint32 array_size, const kal_uint32 val) +static kal_uint32 charging_parameter_to_value(const kal_uint32 *parameter, const kal_uint32 array_size, const kal_uint32 val) { kal_uint32 i; - battery_xlog_printk(BAT_LOG_CRTI, "array_size = %d \r\n", array_size); + battery_xlog_printk(BAT_LOG_FULL, "array_size = %d \n", array_size); for(i=0;i> 16; + bool commit = true; + enable = (enable & 0x0000ffff); + mutex_lock(&g_charging_enable_mutex); + + if (TESTMODE_NONE == g_charging_enable_testmode) { + if (TESTMODE_DISABLE_CHARGING == charging_test_mode) { + /* test mode: disable charging */ + pr_info("[Battery] disable charging\n"); + g_charging_enable_testmode = TESTMODE_DISABLE_CHARGING; + + /* Cut usb power path */ + bq24296_set_en_hiz(0x1); + + /* Disable battery charging */ + bq24296_set_chg_config(0x0); + + /* Disable battery watchdog */ + bq24296_set_watchdog(0x0); + + mutex_unlock(&g_charging_enable_mutex); + return status; + } else if (TESTMODE_NONE == charging_test_mode) { + /* normal mode: save charging setting then commit change to hw */ + g_last_charging_enable = enable; + } else { + pr_warn("[Battery] unexpected charging mode input\n"); + commit = false; + } + } else if (TESTMODE_DISABLE_CHARGING == g_charging_enable_testmode) { + if (TESTMODE_NONE == charging_test_mode) { + /* test mode: don't commit change to hw, save charging setting */ + pr_info("[Battery] charging is disabled"); + pr_info("[Battery] req(%d) will be commited to hw \ + when charging is enabled\n", enable); + g_last_charging_enable = enable; + commit = false; + } else if (TESTMODE_ENABLE_CHARGING == charging_test_mode) { + /* test mode: enable charging, restore to normal mode */ + pr_info("[Battery] enable charging"); + g_charging_enable_testmode = TESTMODE_NONE; + + /* Restore usb power path */ + bq24296_set_en_hiz(0x0); + + /* restore saved charging setting */ + enable = g_last_charging_enable; + if (KAL_TRUE == enable) { + /* Enable battery charging */ + bq24296_set_chg_config(0x1); + } else { + /* Disable battery charging */ + bq24296_set_chg_config(0x0); + } + + /* Enable battery watchdog */ + bq24296_set_watchdog(0x1); + + mutex_unlock(&g_charging_enable_mutex); + return status; + } + } else { + pr_warn("[Battery] unexpected g_charging_enable_testmode:%d\n", + g_charging_enable_testmode); + commit = false; + } + + if (!commit) { + mutex_unlock(&g_charging_enable_mutex); + return status; + } if(KAL_TRUE == enable) { - bq24296_set_en_hiz(0x0); - bq24296_set_chg_config(0x1); // charger enable + bq24296_set_en_hiz(0x0); + bq24296_set_chg_config(0x1); // charger enable + bq24296_set_otg_config(0x0); // disable otg mode when charging } else { #if defined(CONFIG_USB_MTK_HDRC_HCD) if(mt_usb_is_device()) - #endif + #endif { - bq24296_set_chg_config(0x0); + bq24296_set_chg_config(0x0); //charger disable } } + mutex_unlock(&g_charging_enable_mutex); return status; } - static kal_uint32 charging_set_cv_voltage(void *data) { kal_uint32 status = STATUS_OK; + kal_uint32 set_chr_cv; kal_uint16 register_value; kal_uint32 cv_value = *(kal_uint32 *)(data); - - if(cv_value == BATTERY_VOLT_04_200000_V) - { + if (cv_value == BATTERY_VOLT_04_200000_V) { #if defined(HIGH_BATTERY_VOLTAGE_SUPPORT) - //highest of voltage will be 4.3V, because powerpath limitation - cv_value = 4304000; + /*highest of voltage will be 4.3V, because powerpath limitation*/ + cv_value = 4304000; #else - //use nearest value + /*use nearest value*/ cv_value = 4208000; - #endif + #endif } - register_value = charging_parameter_to_value(VBAT_CV_VTH, GETARRAYNUM(VBAT_CV_VTH), cv_value); - bq24296_set_vreg(register_value); + + set_chr_cv = bmt_find_closest_level(VBAT_CV_VTH, GETARRAYNUM(VBAT_CV_VTH), cv_value); + register_value = charging_parameter_to_value(VBAT_CV_VTH, GETARRAYNUM(VBAT_CV_VTH), set_chr_cv); + bq24296_set_vreg(register_value); return status; } @@ -660,41 +744,27 @@ static kal_uint32 charging_set_cv_voltage(void *data) static kal_uint32 charging_get_current(void *data) { kal_uint32 status = STATUS_OK; - //kal_uint32 array_size; - //kal_uint8 reg_value; - kal_uint8 ret_val=0; - kal_uint8 ret_force_20pct=0; + kal_uint32 data_val = 0; + kal_uint8 ret_val = 0; + kal_uint8 ret_force_20pct = 0; - //Get current level + /* Get current level */ bq24296_read_interface(bq24296_CON2, &ret_val, CON2_ICHG_MASK, CON2_ICHG_SHIFT); - //Get Force 20% option + /* Get Force 20% option */ bq24296_read_interface(bq24296_CON2, &ret_force_20pct, CON2_FORCE_20PCT_MASK, CON2_FORCE_20PCT_SHIFT); - //Parsing - ret_val = (ret_val*64) + 512; + /* Parsing */ + data_val = (ret_val*64) + 512; if (ret_force_20pct == 0) - { - //Get current level - //array_size = GETARRAYNUM(CS_VTH); - //*(kal_uint32 *)data = charging_value_to_parameter(CS_VTH,array_size,reg_value); - *(kal_uint32 *)data = ret_val; - } + *(kal_uint32 *)data = data_val; else - { - //Get current level - //array_size = GETARRAYNUM(CS_VTH_20PCT); - //*(kal_uint32 *)data = charging_value_to_parameter(CS_VTH,array_size,reg_value); - //return (int)(ret_val<<1)/10; - *(kal_uint32 *)data = (int)(ret_val<<1)/10; - } + *(kal_uint32 *)data = data_val / 5; return status; -} - - +} static kal_uint32 charging_set_current(void *data) { @@ -704,14 +774,20 @@ static kal_uint32 charging_set_current(void *data) kal_uint32 register_value; kal_uint32 current_value = *(kal_uint32 *)data; + if (current_value == 30000) { + current_value = 150000; + bq24296_set_force_20pct(1); + } else { + bq24296_set_force_20pct(0); + } array_size = GETARRAYNUM(CS_VTH); set_chr_current = bmt_find_closest_level(CS_VTH, array_size, current_value); register_value = charging_parameter_to_value(CS_VTH, array_size ,set_chr_current); bq24296_set_ichg(register_value); return status; -} - +} + static kal_uint32 charging_set_input_current(void *data) { @@ -750,7 +826,7 @@ static kal_uint32 charging_reset_watch_dog_timer(void *data) { kal_uint32 status = STATUS_OK; - battery_xlog_printk(BAT_LOG_CRTI, "charging_reset_watch_dog_timer\r\n"); + battery_xlog_printk(BAT_LOG_FULL, "charging_reset_watch_dog_timer\n"); bq24296_set_wdt_rst(0x1); //Kick watchdog @@ -827,7 +903,7 @@ static kal_uint32 charging_get_charger_det_status(void *data) -kal_bool charging_type_detection_done(void) +static kal_bool charging_type_detection_done(void) { return charging_type_det_done; } @@ -844,7 +920,7 @@ static kal_uint32 charging_get_charger_type(void *data) charging_type_det_done = KAL_FALSE; charger_type = hw_charger_type_detection(); - battery_xlog_printk(BAT_LOG_CRTI, "charging_get_charger_type = %d\r\n", charger_type); + battery_xlog_printk(BAT_LOG_CRTI, "charging_get_charger_type = %d\n", charger_type); *(CHARGER_TYPE*)(data) = charger_type; @@ -862,16 +938,16 @@ static kal_uint32 charging_get_charger_type(void *data) if(1 == hw_bc11_stepB1()) { //*(CHARGER_TYPE*)(data) = NONSTANDARD_CHARGER; - //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\r\n"); + //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\n"); *(CHARGER_TYPE*)(data) = APPLE_2_1A_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\n"); } else { //*(CHARGER_TYPE*)(data) = APPLE_2_1A_CHARGER; - //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\r\n"); + //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\n"); *(CHARGER_TYPE*)(data) = NONSTANDARD_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\n"); } } else @@ -880,12 +956,12 @@ static kal_uint32 charging_get_charger_type(void *data) if(1 == hw_bc11_stepC1()) { *(CHARGER_TYPE*)(data) = APPLE_1_0A_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 1A CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 1A CHARGER!\n"); } else { *(CHARGER_TYPE*)(data) = APPLE_0_5A_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 0.5A CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 0.5A CHARGER!\n"); } } @@ -899,18 +975,18 @@ static kal_uint32 charging_get_charger_type(void *data) if(1 == hw_bc11_stepB2()) { *(CHARGER_TYPE*)(data) = STANDARD_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step B2 : STANDARD CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B2 : STANDARD CHARGER!\n"); } else { *(CHARGER_TYPE*)(data) = CHARGING_HOST; - battery_xlog_printk(BAT_LOG_CRTI, "step B2 : Charging Host!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B2 : Charging Host!\n"); } } else { *(CHARGER_TYPE*)(data) = STANDARD_HOST; - battery_xlog_printk(BAT_LOG_CRTI, "step A2 : Standard USB Host!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step A2 : Standard USB Host!\n"); } } @@ -942,13 +1018,13 @@ static kal_uint32 charging_get_is_pcm_timer_trigger(void *data) static kal_uint32 charging_set_platform_reset(void *data) { - kal_uint32 status = STATUS_OK; + kal_uint32 status = STATUS_OK; - battery_xlog_printk(BAT_LOG_CRTI, "charging_set_platform_reset\n"); - - //arch_reset(0,NULL); - - return status; + battery_xlog_printk(BAT_LOG_CRTI, "charging_set_platform_reset\n"); + + arch_reset(0,NULL); + + return status; } static kal_uint32 charging_get_platfrom_boot_mode(void *data) @@ -1655,7 +1731,7 @@ static kal_uint32 (* const charging_func[CHARGING_CMD_NUMBER])(void *data)= * GLOBALS AFFECTED * None */ -kal_int32 chr_control_interface(CHARGING_CTRL_CMD cmd, void *data) +kal_int32 chr_control_interface_bq24296(CHARGING_CTRL_CMD cmd, void *data) { kal_int32 status; if(cmd < CHARGING_CMD_NUMBER) diff --git a/drivers/misc/mediatek/power/mt8127/charging_hw_fan5405.c b/drivers/misc/mediatek/power/mt8127/charging_hw_fan5405.c index b5748cf4021..c8f9fff5607 100644 --- a/drivers/misc/mediatek/power/mt8127/charging_hw_fan5405.c +++ b/drivers/misc/mediatek/power/mt8127/charging_hw_fan5405.c @@ -564,7 +564,7 @@ static void hw_bc11_dump_register(void) upmu_set_rg_usbdl_rst(1); //force leave USBDL mode #if defined(HIGH_BATTERY_VOLTAGE_SUPPORT) - fan5405_reg_config_interface(0x06,0x78); // ISAFE = 1250mA, VSAFE = 4.36V + fan5405_reg_config_interface(0x06,0x77); // ISAFE = 1250mA, VSAFE = 4.34V #else fan5405_reg_config_interface(0x06,0x70); #endif @@ -631,7 +631,6 @@ static void hw_bc11_dump_register(void) kal_uint16 register_value; register_value = charging_parameter_to_value(VBAT_CV_VTH, GETARRAYNUM(VBAT_CV_VTH) ,*(kal_uint32 *)(data)); - fan5405_set_oreg(register_value); return status; diff --git a/drivers/misc/mediatek/power/mt8127/charging_hw_pmic.c b/drivers/misc/mediatek/power/mt8127/charging_hw_pmic.c index ed5a2658266..521c22a5595 100644 --- a/drivers/misc/mediatek/power/mt8127/charging_hw_pmic.c +++ b/drivers/misc/mediatek/power/mt8127/charging_hw_pmic.c @@ -203,7 +203,7 @@ kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_ui } else { - battery_xlog_printk(BAT_LOG_CRTI, "Can't find the parameter \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "Can't find the parameter \n"); return parameter[0]; } } @@ -221,7 +221,7 @@ kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_ui } } - battery_xlog_printk(BAT_LOG_CRTI, "NO register value match \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "NO register value match \n"); //TODO: ASSERT(0); // not find the value return 0; } @@ -247,7 +247,7 @@ kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_ui } } - battery_xlog_printk(BAT_LOG_CRTI, "Can't find closest level \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "Can't find closest level \n"); return pList[0]; //return CHARGE_CURRENT_0_00_MA; } @@ -261,7 +261,7 @@ kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_ui } } - battery_xlog_printk(BAT_LOG_CRTI, "Can't find closest level \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "Can't find closest level \n"); return pList[number -1]; //return CHARGE_CURRENT_0_00_MA; } @@ -278,7 +278,7 @@ static void hw_bc11_dump_register(void) for(i=reg_num ; i<=CHR_CON19 ; i+=2) { reg_val = upmu_get_reg_value(i); - battery_xlog_printk(BAT_LOG_FULL, "Chr Reg[0x%x]=0x%x \r\n", i, reg_val); + battery_xlog_printk(BAT_LOG_FULL, "Chr Reg[0x%x]=0x%x \n", i, reg_val); } } @@ -311,7 +311,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_init() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_init() \n"); hw_bc11_dump_register(); } @@ -338,7 +338,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_DCD() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_DCD() \n"); hw_bc11_dump_register(); } @@ -373,7 +373,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepA1() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepA1() \n"); hw_bc11_dump_register(); } @@ -406,7 +406,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepB1() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepB1() \n"); hw_bc11_dump_register(); } @@ -439,7 +439,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepC1() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepC1() \n"); hw_bc11_dump_register(); } @@ -474,7 +474,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepA2() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepA2() \n"); hw_bc11_dump_register(); } @@ -507,7 +507,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepB2() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_stepB2() \n"); hw_bc11_dump_register(); } @@ -542,7 +542,7 @@ static void hw_bc11_dump_register(void) if(Enable_BATDRV_LOG == BAT_LOG_FULL) { - battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_done() \r\n"); + battery_xlog_printk(BAT_LOG_FULL, "hw_bc11_done() \n"); hw_bc11_dump_register(); } @@ -628,7 +628,7 @@ static void hw_bc11_dump_register(void) for(i=reg_num ; i<=CHR_CON29 ; i+=2) { reg_val = upmu_get_reg_value(i); - battery_xlog_printk(BAT_LOG_FULL, "Chr Reg[0x%x]=0x%x \r\n", i, reg_val); + battery_xlog_printk(BAT_LOG_FULL, "Chr Reg[0x%x]=0x%x \n", i, reg_val); } return status; @@ -830,7 +830,7 @@ kal_bool charging_type_detection_done(void) if(wireless_state == WIRELESS_CHARGER_EXIST_STATE) { *(CHARGER_TYPE*)(data) = WIRELESS_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "WIRELESS_CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "WIRELESS_CHARGER!\n"); return status; } #endif @@ -838,7 +838,7 @@ kal_bool charging_type_detection_done(void) if(g_charger_type!=CHARGER_UNKNOWN && g_charger_type!=WIRELESS_CHARGER) { *(CHARGER_TYPE*)(data) = g_charger_type; - battery_xlog_printk(BAT_LOG_CRTI, "return %d!\r\n", g_charger_type); + battery_xlog_printk(BAT_LOG_CRTI, "return %d!\n", g_charger_type); return status; } @@ -857,16 +857,16 @@ kal_bool charging_type_detection_done(void) if(1 == hw_bc11_stepB1()) { //*(CHARGER_TYPE*)(data) = NONSTANDARD_CHARGER; - //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\r\n"); + //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\n"); *(CHARGER_TYPE*)(data) = APPLE_2_1A_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\n"); } else { //*(CHARGER_TYPE*)(data) = APPLE_2_1A_CHARGER; - //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\r\n"); + //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\n"); *(CHARGER_TYPE*)(data) = NONSTANDARD_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\n"); } } else @@ -875,12 +875,12 @@ kal_bool charging_type_detection_done(void) if(1 == hw_bc11_stepC1()) { *(CHARGER_TYPE*)(data) = APPLE_1_0A_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 1A CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 1A CHARGER!\n"); } else { *(CHARGER_TYPE*)(data) = APPLE_0_5A_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 0.5A CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 0.5A CHARGER!\n"); } } @@ -894,18 +894,18 @@ kal_bool charging_type_detection_done(void) if(1 == hw_bc11_stepB2()) { *(CHARGER_TYPE*)(data) = STANDARD_CHARGER; - battery_xlog_printk(BAT_LOG_CRTI, "step B2 : STANDARD CHARGER!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B2 : STANDARD CHARGER!\n"); } else { *(CHARGER_TYPE*)(data) = CHARGING_HOST; - battery_xlog_printk(BAT_LOG_CRTI, "step B2 : Charging Host!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step B2 : Charging Host!\n"); } } else { *(CHARGER_TYPE*)(data) = STANDARD_HOST; - battery_xlog_printk(BAT_LOG_CRTI, "step A2 : Standard USB Host!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "step A2 : Standard USB Host!\n"); } } diff --git a/drivers/misc/mediatek/power/mt8127/charging_hw_sn2871.c b/drivers/misc/mediatek/power/mt8127/charging_hw_sn2871.c new file mode 100644 index 00000000000..952a88ba171 --- /dev/null +++ b/drivers/misc/mediatek/power/mt8127/charging_hw_sn2871.c @@ -0,0 +1,1669 @@ +/***************************************************************************** + * + * Filename: + * --------- + * charging_pmic.c + * + * Project: + * -------- + * ALPS_Software + * + * Description: + * ------------ + * This file implements the interface between BMT and ADC scheduler. + * + * Author: + * ------- + * Oscar Liu + * + *============================================================================ + * $Revision: 1.0 $ + * $Modtime: 11 Aug 2005 10:28:16 $ + * $Log: //mtkvs01/vmdata/Maui_sw/archives/mcu/hal/peripheral/inc/bmt_chr_setting.h-arc $ + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================ + ****************************************************************************/ +#include +#include "sn2871.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT +#include +#include "cust_diso.h" +#include +#include +#ifdef MTK_DISCRETE_SWITCH +#include +#include +#include +#include +#endif +#if !defined(MTK_AUXADC_IRQ_SUPPORT) +#include +#include +#include +#include +#include +#endif +#endif + + + // ============================================================ // + //define + // ============================================================ // +#define STATUS_OK 0 +#define STATUS_UNSUPPORTED -1 +#define GETARRAYNUM(array) (sizeof(array)/sizeof(array[0])) + + + // ============================================================ // + //global variable + // ============================================================ // +extern int g_runin_battery_test_flag; +static CHARGER_TYPE g_charger_type = CHARGER_UNKNOWN; + +#if !defined(GPIO_CHR_CE_PIN) +#ifdef GPIO_SWCHARGER_EN_PIN +#define GPIO_CHR_CE_PIN GPIO_SWCHARGER_EN_PIN +#else +#define GPIO_CHR_CE_PIN (19 | 0x80000000) +#endif +#endif +static int gpio_off_dir = GPIO_DIR_OUT; +static int gpio_off_out = GPIO_OUT_ONE; +static int gpio_on_dir = GPIO_DIR_OUT; +static int gpio_on_out = GPIO_OUT_ZERO; + +static kal_bool charging_type_det_done = KAL_TRUE; + +static const kal_uint32 VBAT_CV_VTH[]= +{ + 3840000, 3856000, 3872000, 3888000, + 3904000, 3920000, 3936000, 3952000, + 3968000, 3984000, 4000000, 4016000, + 4032000, 4048000, 4064000, 4080000, + 4096000, 4112000, 4128000, 4144000, + 4160000, 4176000, 4192000, 4208000, + 4224000, 4240000, 4256000, 4272000, + 4288000, 4304000 +}; + +static const kal_uint32 CS_VTH[]= +{ + 0, 6400, 12800, 19200, + 25600, 32000, 38400, 44800, + 51200, 57600, 64000, 70400, + 76800, 83200, 89600, 96000, + 102400, 108800, 115200, 121600, + 128000, 134400, 140800, 147200, + 153600, 160000, 166400, 172800, + 179200, 185600, 192000, 198400, + 204800 +}; + +static const kal_uint32 INPUT_CS_VTH[]= +{ + CHARGE_CURRENT_100_00_MA, CHARGE_CURRENT_150_00_MA, CHARGE_CURRENT_200_00_MA, CHARGE_CURRENT_250_00_MA, + CHARGE_CURRENT_300_00_MA, CHARGE_CURRENT_350_00_MA, CHARGE_CURRENT_400_00_MA, CHARGE_CURRENT_450_00_MA, + CHARGE_CURRENT_500_00_MA, CHARGE_CURRENT_550_00_MA, CHARGE_CURRENT_600_00_MA, CHARGE_CURRENT_650_00_MA, + CHARGE_CURRENT_700_00_MA, CHARGE_CURRENT_750_00_MA, CHARGE_CURRENT_800_00_MA, CHARGE_CURRENT_850_00_MA, + CHARGE_CURRENT_900_00_MA, CHARGE_CURRENT_950_00_MA, CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1050_00_MA, + CHARGE_CURRENT_1100_00_MA, CHARGE_CURRENT_1150_00_MA, CHARGE_CURRENT_1200_00_MA, CHARGE_CURRENT_1250_00_MA, + CHARGE_CURRENT_1300_00_MA, CHARGE_CURRENT_1350_00_MA, CHARGE_CURRENT_1400_00_MA, CHARGE_CURRENT_1450_00_MA, + CHARGE_CURRENT_1500_00_MA, CHARGE_CURRENT_1550_00_MA, CHARGE_CURRENT_1600_00_MA, CHARGE_CURRENT_1650_00_MA, + CHARGE_CURRENT_1700_00_MA, CHARGE_CURRENT_1750_00_MA, CHARGE_CURRENT_1800_00_MA, CHARGE_CURRENT_1850_00_MA, + CHARGE_CURRENT_1900_00_MA, CHARGE_CURRENT_1950_00_MA, CHARGE_CURRENT_2000_00_MA, CHARGE_CURRENT_2050_00_MA, + CHARGE_CURRENT_2100_00_MA, CHARGE_CURRENT_2150_00_MA, CHARGE_CURRENT_2200_00_MA, CHARGE_CURRENT_2250_00_MA, +}; + +static const kal_uint32 VCDT_HV_VTH[]= +{ + BATTERY_VOLT_04_200000_V, BATTERY_VOLT_04_250000_V, BATTERY_VOLT_04_300000_V, BATTERY_VOLT_04_350000_V, + BATTERY_VOLT_04_400000_V, BATTERY_VOLT_04_450000_V, BATTERY_VOLT_04_500000_V, BATTERY_VOLT_04_550000_V, + BATTERY_VOLT_04_600000_V, BATTERY_VOLT_06_000000_V, BATTERY_VOLT_06_500000_V, BATTERY_VOLT_07_000000_V, + BATTERY_VOLT_07_500000_V, BATTERY_VOLT_08_500000_V, BATTERY_VOLT_09_500000_V, BATTERY_VOLT_10_500000_V +}; + +#ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT +#ifndef CUST_GPIO_VIN_SEL +#define CUST_GPIO_VIN_SEL 18 +#endif +#if !defined(MTK_AUXADC_IRQ_SUPPORT) +#define SW_POLLING_PERIOD 100 //100 ms +#define MSEC_TO_NSEC(x) (x * 1000000UL) + + static DEFINE_MUTEX(diso_polling_mutex); + static DECLARE_WAIT_QUEUE_HEAD(diso_polling_thread_wq); + static struct hrtimer diso_kthread_timer; + static kal_bool diso_thread_timeout = KAL_FALSE; + static struct delayed_work diso_polling_work; + static void diso_polling_handler(struct work_struct *work); + static DISO_Polling_Data DISO_Polling; +#else + DISO_IRQ_Data DISO_IRQ; +#endif + int g_diso_state = 0; + int vin_sel_gpio_number = (CUST_GPIO_VIN_SEL | 0x80000000); + static kal_bool g_diso_otg = KAL_FALSE; + + static char *DISO_state_s[8] = { + "IDLE", + "OTG_ONLY", + "USB_ONLY", + "USB_WITH_OTG", + "DC_ONLY", + "DC_WITH_OTG", + "DC_WITH_USB", + "DC_USB_OTG", + }; +#endif + + +// ============================================================ // +// function prototype +// ============================================================ // + + +// ============================================================ // +//extern variable +// ============================================================ // + +// ============================================================ // +//extern function +// ============================================================ // +extern void do_chrdet_int_task(void); +extern kal_uint32 upmu_get_reg_value(kal_uint32 reg); +extern bool mt_usb_is_device(void); +extern void Charger_Detect_Init(void); +extern void Charger_Detect_Release(void); +extern void mt_power_off(void); + +static kal_uint32 charging_error = false; +static kal_uint32 charging_get_error_state(void); +static kal_uint32 charging_set_error_state(void *data); + // ============================================================ // +static kal_uint32 charging_value_to_parameter(const kal_uint32 *parameter, const kal_uint32 array_size, const kal_uint32 val) +{ + if (val < array_size) + { + return parameter[val]; + } + else + { + battery_xlog_printk(BAT_LOG_CRTI, "Can't find the parameter \n"); + return parameter[0]; + } +} + + +static kal_uint32 charging_parameter_to_value(const kal_uint32 *parameter, const kal_uint32 array_size, const kal_uint32 val) +{ + kal_uint32 i; + + battery_xlog_printk(BAT_LOG_CRTI, "array_size = %d \n", array_size); + + for(i=0;i> 1) & 0x3) != 0x0 || (upmu_get_rgs_chrdet() && !g_diso_otg)) + val = KAL_TRUE; + else + val = KAL_FALSE; + #endif + +#endif + + *(kal_bool*)(data) = val; + if(val == 0) + g_charger_type = CHARGER_UNKNOWN; + + return status; +} + + + +static kal_bool charging_type_detection_done(void) +{ + return charging_type_det_done; +} + +extern CHARGER_TYPE hw_charger_type_detection(void); + +static kal_uint32 charging_get_charger_type(void *data) +{ + kal_uint32 status = STATUS_OK; + CHARGER_TYPE charger_type = CHARGER_UNKNOWN; +#if defined(CONFIG_POWER_EXT) + *(CHARGER_TYPE*)(data) = STANDARD_HOST; +#else + charging_type_det_done = KAL_FALSE; + + charger_type = hw_charger_type_detection(); + battery_xlog_printk(BAT_LOG_CRTI, "charging_get_charger_type = %d\n", charger_type); + + *(CHARGER_TYPE*)(data) = charger_type; + +#if 0 + /********* Step initial ***************/ + hw_bc11_init(); + + /********* Step DCD ***************/ + if(1 == hw_bc11_DCD()) + { + /********* Step A1 ***************/ + if(1 == hw_bc11_stepA1()) + { + /********* Step B1 ***************/ + if(1 == hw_bc11_stepB1()) + { + //*(CHARGER_TYPE*)(data) = NONSTANDARD_CHARGER; + //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\n"); + *(CHARGER_TYPE*)(data) = APPLE_2_1A_CHARGER; + battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\n"); + } + else + { + //*(CHARGER_TYPE*)(data) = APPLE_2_1A_CHARGER; + //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\n"); + *(CHARGER_TYPE*)(data) = NONSTANDARD_CHARGER; + battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\n"); + } + } + else + { + /********* Step C1 ***************/ + if(1 == hw_bc11_stepC1()) + { + *(CHARGER_TYPE*)(data) = APPLE_1_0A_CHARGER; + battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 1A CHARGER!\n"); + } + else + { + *(CHARGER_TYPE*)(data) = APPLE_0_5A_CHARGER; + battery_xlog_printk(BAT_LOG_CRTI, "step C1 : Apple 0.5A CHARGER!\n"); + } + } + + } + else + { + /********* Step A2 ***************/ + if(1 == hw_bc11_stepA2()) + { + /********* Step B2 ***************/ + if(1 == hw_bc11_stepB2()) + { + *(CHARGER_TYPE*)(data) = STANDARD_CHARGER; + battery_xlog_printk(BAT_LOG_CRTI, "step B2 : STANDARD CHARGER!\n"); + } + else + { + *(CHARGER_TYPE*)(data) = CHARGING_HOST; + battery_xlog_printk(BAT_LOG_CRTI, "step B2 : Charging Host!\n"); + } + } + else + { + *(CHARGER_TYPE*)(data) = STANDARD_HOST; + battery_xlog_printk(BAT_LOG_CRTI, "step A2 : Standard USB Host!\n"); + } + + } + + /********* Finally setting *******************************/ + hw_bc11_done(); +#endif + + charging_type_det_done = KAL_TRUE; + g_charger_type = *(CHARGER_TYPE*)(data); + +#endif + return status; +} + +static kal_uint32 charging_get_is_pcm_timer_trigger(void *data) +{ + kal_uint32 status = STATUS_OK; + + if(slp_get_wake_reason() == WR_PCM_TIMER) + *(kal_bool*)(data) = KAL_TRUE; + else + *(kal_bool*)(data) = KAL_FALSE; + + battery_xlog_printk(BAT_LOG_CRTI, "slp_get_wake_reason=%d\n", slp_get_wake_reason()); + + return status; +} + +static kal_uint32 charging_set_platform_reset(void *data) +{ + kal_uint32 status = STATUS_OK; + + battery_xlog_printk(BAT_LOG_CRTI, "charging_set_platform_reset\n"); + + //arch_reset(0,NULL); + + return status; +} + +static kal_uint32 charging_get_platfrom_boot_mode(void *data) +{ + kal_uint32 status = STATUS_OK; + + *(kal_uint32*)(data) = get_boot_mode(); + + battery_xlog_printk(BAT_LOG_CRTI, "get_boot_mode=%d\n", get_boot_mode()); + + return status; +} + +static kal_uint32 charging_set_power_off(void *data) +{ + kal_uint32 status = STATUS_OK; + + battery_xlog_printk(BAT_LOG_CRTI, "charging_set_power_off\n"); + mt_power_off(); + + return status; +} + +static kal_uint32 charging_get_power_source(void *data) +{ + kal_uint32 status = STATUS_OK; + +#if 0 //#if defined(MTK_POWER_EXT_DETECT) + if (MT_BOARD_PHONE == mt_get_board_type()) + *(kal_bool *)data = KAL_FALSE; + else + *(kal_bool *)data = KAL_TRUE; +#else + *(kal_bool *)data = KAL_FALSE; +#endif + + return status; +} + +static kal_uint32 charging_get_csdac_full_flag(void *data) +{ + return STATUS_UNSUPPORTED; +} + +static kal_uint32 charging_set_ta_current_pattern(void *data) +{ + return STATUS_UNSUPPORTED; +} + +#if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) +void set_diso_otg(bool enable) +{ + g_diso_otg = enable; +} + +void set_vusb_auxadc_irq(bool enable, bool flag) +{ +#if !defined(MTK_AUXADC_IRQ_SUPPORT) + hrtimer_cancel(&diso_kthread_timer); + + DISO_Polling.reset_polling = KAL_TRUE; + DISO_Polling.vusb_polling_measure.notify_irq_en = enable; + DISO_Polling.vusb_polling_measure.notify_irq = flag; + + hrtimer_start(&diso_kthread_timer, ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD)), HRTIMER_MODE_REL); +#else + kal_uint16 threshold = 0; + if (enable) { + if (flag == 0) + threshold = DISO_IRQ.vusb_measure_channel.falling_threshold; + else + threshold = DISO_IRQ.vusb_measure_channel.rising_threshold; + + threshold = (threshold *R_DISO_VBUS_PULL_DOWN)/(R_DISO_VBUS_PULL_DOWN + R_DISO_VBUS_PULL_UP); + mt_auxadc_enableBackgroundDection(DISO_IRQ.vusb_measure_channel.number, threshold, \ + DISO_IRQ.vusb_measure_channel.period, DISO_IRQ.vusb_measure_channel.debounce, flag); + } else { + mt_auxadc_disableBackgroundDection(DISO_IRQ.vusb_measure_channel.number); + } +#endif + battery_xlog_printk(BAT_LOG_FULL, " [%s] enable: %d, flag: %d!\n", __func__, enable, flag); +} + +void set_vdc_auxadc_irq(bool enable, bool flag) +{ +#if !defined(MTK_AUXADC_IRQ_SUPPORT) + hrtimer_cancel(&diso_kthread_timer); + + DISO_Polling.reset_polling = KAL_TRUE; + DISO_Polling.vdc_polling_measure.notify_irq_en = enable; + DISO_Polling.vdc_polling_measure.notify_irq = flag; + + hrtimer_start(&diso_kthread_timer, ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD)), HRTIMER_MODE_REL); +#else + kal_uint16 threshold = 0; + if(enable) { + if(flag == 0) + threshold = DISO_IRQ.vdc_measure_channel.falling_threshold; + else + threshold = DISO_IRQ.vdc_measure_channel.rising_threshold; + + threshold = (threshold *R_DISO_DC_PULL_DOWN)/(R_DISO_DC_PULL_DOWN + R_DISO_DC_PULL_UP); + mt_auxadc_enableBackgroundDection(DISO_IRQ.vdc_measure_channel.number, threshold, \ + DISO_IRQ.vdc_measure_channel.period, DISO_IRQ.vdc_measure_channel.debounce, flag); + } else { + mt_auxadc_disableBackgroundDection(DISO_IRQ.vdc_measure_channel.number); + } +#endif + battery_xlog_printk(BAT_LOG_FULL, " [%s] enable: %d, flag: %d!\n", __func__, enable, flag); +} + +#if !defined(MTK_AUXADC_IRQ_SUPPORT) +static void diso_polling_handler(struct work_struct *work) +{ + int trigger_channel = -1; + int trigger_flag = -1; + + if(DISO_Polling.vdc_polling_measure.notify_irq_en) + trigger_channel = AP_AUXADC_DISO_VDC_CHANNEL; + else if(DISO_Polling.vusb_polling_measure.notify_irq_en) + trigger_channel = AP_AUXADC_DISO_VUSB_CHANNEL; + + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]auxadc handler triggered\n" ); + switch(trigger_channel) + { + case AP_AUXADC_DISO_VDC_CHANNEL: + trigger_flag = DISO_Polling.vdc_polling_measure.notify_irq; + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]VDC IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel, trigger_flag ); +#ifdef MTK_DISCRETE_SWITCH /*for DSC DC plugin handle */ + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_ENABLE, DISO_IRQ_FALLING); + if (trigger_flag == DISO_IRQ_RISING) { + DISO_data.diso_state.pre_vusb_state = DISO_ONLINE; + DISO_data.diso_state.pre_vdc_state = DISO_OFFLINE; + DISO_data.diso_state.pre_otg_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vusb_state = DISO_ONLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_OFFLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[2]); + } +#else //for load switch OTG leakage handle + set_vdc_auxadc_irq(DISO_IRQ_ENABLE, (~trigger_flag) & 0x1); + if (trigger_flag == DISO_IRQ_RISING) { + DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.pre_vdc_state = DISO_OFFLINE; + DISO_data.diso_state.pre_otg_state = DISO_ONLINE; + DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_ONLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[5]); + } else if (trigger_flag == DISO_IRQ_FALLING) { + DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.pre_vdc_state = DISO_ONLINE; + DISO_data.diso_state.pre_otg_state = DISO_ONLINE; + DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vdc_state = DISO_OFFLINE; + DISO_data.diso_state.cur_otg_state = DISO_ONLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[1]); + } + else + battery_xlog_printk(BAT_LOG_CRTI, "[%s] wrong trigger flag!\n",__func__); +#endif + break; + case AP_AUXADC_DISO_VUSB_CHANNEL: + trigger_flag = DISO_Polling.vusb_polling_measure.notify_irq; + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]VUSB IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel, trigger_flag); + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + if(trigger_flag == DISO_IRQ_FALLING) { + DISO_data.diso_state.pre_vusb_state = DISO_ONLINE; + DISO_data.diso_state.pre_vdc_state = DISO_ONLINE; + DISO_data.diso_state.pre_otg_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_OFFLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[4]); + } else if (trigger_flag == DISO_IRQ_RISING) { + DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.pre_vdc_state = DISO_ONLINE; + DISO_data.diso_state.pre_otg_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vusb_state = DISO_ONLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_OFFLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[6]); + } + else + battery_xlog_printk(BAT_LOG_CRTI, "[%s] wrong trigger flag!\n",__func__); + set_vusb_auxadc_irq(DISO_IRQ_ENABLE, (~trigger_flag)&0x1); + break; + default: + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]VUSB auxadc IRQ triggered ERROR OR TEST\n"); + return; /* in error or unexecpt state just return */ + } + + g_diso_state = *(int*)&DISO_data.diso_state; + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]g_diso_state: 0x%x\n", g_diso_state); + DISO_data.irq_callback_func(0, NULL); + + return ; +} +#else +static irqreturn_t diso_auxadc_irq_handler(int irq, void *dev_id) +{ + int trigger_channel = -1; + int trigger_flag = -1; + trigger_channel = mt_auxadc_getCurrentChannel(); + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]auxadc handler triggered\n" ); + switch(trigger_channel) + { + case AP_AUXADC_DISO_VDC_CHANNEL: + trigger_flag = mt_auxadc_getCurrentTrigger(); + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]VDC IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel, trigger_flag ); +#ifdef MTK_DISCRETE_SWITCH /*for DSC DC plugin handle */ + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_ENABLE, DISO_IRQ_FALLING); + if (trigger_flag == DISO_IRQ_RISING) { + DISO_data.diso_state.pre_vusb_state = DISO_ONLINE; + DISO_data.diso_state.pre_vdc_state = DISO_OFFLINE; + DISO_data.diso_state.pre_otg_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vusb_state = DISO_ONLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_OFFLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[2]); + } +#else //for load switch OTG leakage handle + set_vdc_auxadc_irq(DISO_IRQ_ENABLE, (~trigger_flag) & 0x1); + if (trigger_flag == DISO_IRQ_RISING) { + DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.pre_vdc_state = DISO_OFFLINE; + DISO_data.diso_state.pre_otg_state = DISO_ONLINE; + DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_ONLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[5]); + } else { + DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.pre_vdc_state = DISO_ONLINE; + DISO_data.diso_state.pre_otg_state = DISO_ONLINE; + DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vdc_state = DISO_OFFLINE; + DISO_data.diso_state.cur_otg_state = DISO_ONLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[1]); + } +#endif + break; + case AP_AUXADC_DISO_VUSB_CHANNEL: + trigger_flag = mt_auxadc_getCurrentTrigger(); + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]VUSB IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel, trigger_flag); + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + if(trigger_flag == DISO_IRQ_FALLING) { + DISO_data.diso_state.pre_vusb_state = DISO_ONLINE; + DISO_data.diso_state.pre_vdc_state = DISO_ONLINE; + DISO_data.diso_state.pre_otg_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_OFFLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[4]); + } else { + DISO_data.diso_state.pre_vusb_state = DISO_OFFLINE; + DISO_data.diso_state.pre_vdc_state = DISO_ONLINE; + DISO_data.diso_state.pre_otg_state = DISO_OFFLINE; + DISO_data.diso_state.cur_vusb_state = DISO_ONLINE; + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + DISO_data.diso_state.cur_otg_state = DISO_OFFLINE; + battery_xlog_printk(BAT_LOG_CRTI, " cur diso_state is %s!\n",DISO_state_s[6]); + } + + set_vusb_auxadc_irq(DISO_IRQ_ENABLE, (~trigger_flag)&0x1); + break; + default: + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + battery_xlog_printk(BAT_LOG_CRTI, "[DISO]VUSB auxadc IRQ triggered ERROR OR TEST\n"); + return IRQ_HANDLED; /* in error or unexecpt state just return */ + } + g_diso_state = *(int*)&DISO_data.diso_state; + return IRQ_WAKE_THREAD; +} +#endif + +#if defined(MTK_DISCRETE_SWITCH) && defined(MTK_DSC_USE_EINT) +void vdc_eint_handler() +{ + battery_xlog_printk(BAT_LOG_CRTI, "[diso_eint] vdc eint irq triger\n"); + DISO_data.diso_state.cur_vdc_state = DISO_ONLINE; + mt_eint_mask(CUST_EINT_VDC_NUM); + do_chrdet_int_task(); +} +#endif + +static kal_uint32 diso_get_current_voltage(int Channel) +{ + int ret = 0, data[4], i, ret_value = 0, ret_temp = 0, times = 5; + + if( IMM_IsAdcInitReady() == 0 ) { + battery_xlog_printk(BAT_LOG_CRTI, "[DISO] AUXADC is not ready"); + return 0; + } + + i = times; + while (i--) + { + ret_value = IMM_GetOneChannelValue(Channel, data, &ret_temp); + if(ret_value == 0) { + ret += ret_temp; + } else { + times = times > 1 ? times - 1 : 1; + battery_xlog_printk(BAT_LOG_CRTI, "[diso_get_current_voltage] ret_value=%d, times=%d\n", + ret_value, times); + } + } + + ret = ret*1500/4096 ; + ret = ret/times; + + return ret; +} + +static void _get_diso_interrupt_state(void) +{ + int vol = 0; + int diso_state =0; + int check_times = 30; + kal_bool vin_state = KAL_FALSE; + +#ifndef VIN_SEL_FLAG + mdelay(AUXADC_CHANNEL_DELAY_PERIOD); +#endif + + vol = diso_get_current_voltage(AP_AUXADC_DISO_VDC_CHANNEL); + vol =(R_DISO_DC_PULL_UP + R_DISO_DC_PULL_DOWN)*100*vol/(R_DISO_DC_PULL_DOWN)/100; + battery_xlog_printk(BAT_LOG_CRTI, "[DISO] Current DC voltage mV = %d\n", vol); + +#ifdef VIN_SEL_FLAG + /* set gpio mode for kpoc issue as DWS has no default setting */ + mt_set_gpio_mode(vin_sel_gpio_number,0); // 0:GPIO mode + mt_set_gpio_dir(vin_sel_gpio_number,0); // 0: input, 1: output + + if (vol > VDC_MIN_VOLTAGE/1000 && vol < VDC_MAX_VOLTAGE/1000) { + /* make sure load switch already switch done */ + do{ + check_times--; +#ifdef VIN_SEL_FLAG_DEFAULT_LOW + vin_state = mt_get_gpio_in(vin_sel_gpio_number); +#else + vin_state = mt_get_gpio_in(vin_sel_gpio_number); + vin_state = (~vin_state) & 0x1; +#endif + if(!vin_state) + mdelay(5); + } while ((!vin_state) && check_times); + battery_xlog_printk(BAT_LOG_CRTI, "[DISO] i==%d gpio_state= %d\n", + check_times, mt_get_gpio_in(vin_sel_gpio_number)); + + if (0 == check_times) + diso_state &= ~0x4; //SET DC bit as 0 + else + diso_state |= 0x4; //SET DC bit as 1 + } else { + diso_state &= ~0x4; //SET DC bit as 0 + } +#else + mdelay(SWITCH_RISING_TIMING + LOAD_SWITCH_TIMING_MARGIN); /* force delay for switching as no flag for check switching done */ + if (vol > VDC_MIN_VOLTAGE/1000 && vol < VDC_MAX_VOLTAGE/1000) + diso_state |= 0x4; //SET DC bit as 1 + else + diso_state &= ~0x4; //SET DC bit as 0 +#endif + + + vol = diso_get_current_voltage(AP_AUXADC_DISO_VUSB_CHANNEL); + vol =(R_DISO_VBUS_PULL_UP + R_DISO_VBUS_PULL_DOWN)*100*vol/(R_DISO_VBUS_PULL_DOWN)/100; + battery_xlog_printk(BAT_LOG_CRTI, "[DISO] Current VBUS voltage mV = %d\n",vol); + + if (vol > VBUS_MIN_VOLTAGE/1000 && vol < VBUS_MAX_VOLTAGE/1000) { + if(!mt_usb_is_device()) { + diso_state |= 0x1; //SET OTG bit as 1 + diso_state &= ~0x2; //SET VBUS bit as 0 + } else { + diso_state &= ~0x1; //SET OTG bit as 0 + diso_state |= 0x2; //SET VBUS bit as 1; + } + + } else { + diso_state &= 0x4; //SET OTG and VBUS bit as 0 + } + battery_xlog_printk(BAT_LOG_CRTI, "[DISO] DISO_STATE==0x%x \n",diso_state); + g_diso_state = diso_state; + return; +} +#if !defined(MTK_AUXADC_IRQ_SUPPORT) +int _get_irq_direction(int pre_vol, int cur_vol) +{ + int ret = -1; + + //threshold 1000mv + if((cur_vol - pre_vol) > 1000) + ret = DISO_IRQ_RISING; + else if((pre_vol - cur_vol) > 1000) + ret = DISO_IRQ_FALLING; + + return ret; +} + +static void _get_polling_state(void) +{ + int vdc_vol = 0, vusb_vol = 0; + int vdc_vol_dir = -1; + int vusb_vol_dir = -1; + + DISO_polling_channel* VDC_Polling = &DISO_Polling.vdc_polling_measure; + DISO_polling_channel* VUSB_Polling = &DISO_Polling.vusb_polling_measure; + + vdc_vol = diso_get_current_voltage(AP_AUXADC_DISO_VDC_CHANNEL); + vdc_vol =(R_DISO_DC_PULL_UP + R_DISO_DC_PULL_DOWN)*100*vdc_vol/(R_DISO_DC_PULL_DOWN)/100; + + vusb_vol = diso_get_current_voltage(AP_AUXADC_DISO_VUSB_CHANNEL); + vusb_vol =(R_DISO_VBUS_PULL_UP + R_DISO_VBUS_PULL_DOWN)*100*vusb_vol/(R_DISO_VBUS_PULL_DOWN)/100; + + VDC_Polling->preVoltage = VDC_Polling->curVoltage; + VUSB_Polling->preVoltage = VUSB_Polling->curVoltage; + VDC_Polling->curVoltage = vdc_vol; + VUSB_Polling->curVoltage = vusb_vol; + + if (DISO_Polling.reset_polling) + { + DISO_Polling.reset_polling = KAL_FALSE; + VDC_Polling->preVoltage = vdc_vol; + VUSB_Polling->preVoltage = vusb_vol; + + if(vdc_vol > 1000) + vdc_vol_dir = DISO_IRQ_RISING; + else + vdc_vol_dir = DISO_IRQ_FALLING; + + if(vusb_vol > 1000) + vusb_vol_dir = DISO_IRQ_RISING; + else + vusb_vol_dir = DISO_IRQ_FALLING; + } + else + { + //get voltage direction + vdc_vol_dir = _get_irq_direction(VDC_Polling->preVoltage, VDC_Polling->curVoltage); + vusb_vol_dir = _get_irq_direction(VUSB_Polling->preVoltage, VUSB_Polling->curVoltage); + } + + if(VDC_Polling->notify_irq_en && + (vdc_vol_dir == VDC_Polling->notify_irq)) { + schedule_delayed_work(&diso_polling_work, 10*HZ/1000); //10ms + battery_xlog_printk(BAT_LOG_CRTI, "[%s] ready to trig VDC irq, irq: %d\n", + __func__,VDC_Polling->notify_irq); + } else if(VUSB_Polling->notify_irq_en && + (vusb_vol_dir == VUSB_Polling->notify_irq)) { + schedule_delayed_work(&diso_polling_work, 10*HZ/1000); + battery_xlog_printk(BAT_LOG_CRTI, "[%s] ready to trig VUSB irq, irq: %d\n", + __func__, VUSB_Polling->notify_irq); + } else if((vdc_vol == 0) && (vusb_vol == 0)) { + VDC_Polling->notify_irq_en = 0; + VUSB_Polling->notify_irq_en = 0; + } + + return; +} + +enum hrtimer_restart diso_kthread_hrtimer_func(struct hrtimer *timer) +{ + diso_thread_timeout = KAL_TRUE; + wake_up(&diso_polling_thread_wq); + + return HRTIMER_NORESTART; +} + +int diso_thread_kthread(void *x) +{ + /* Run on a process content */ + while (1) { + wait_event(diso_polling_thread_wq, (diso_thread_timeout == KAL_TRUE)); + + diso_thread_timeout = KAL_FALSE; + + mutex_lock(&diso_polling_mutex); + + _get_polling_state(); + + if (DISO_Polling.vdc_polling_measure.notify_irq_en || + DISO_Polling.vusb_polling_measure.notify_irq_en) + hrtimer_start(&diso_kthread_timer,ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD)),HRTIMER_MODE_REL); + else + hrtimer_cancel(&diso_kthread_timer); + + mutex_unlock(&diso_polling_mutex); + } + + return 0; +} +#endif +#endif + + +static kal_uint32 charging_get_error_state(void) +{ + return charging_error; +} + +static kal_uint32 charging_set_error_state(void *data) +{ + kal_uint32 status = STATUS_OK; + charging_error = *(kal_uint32*)(data); + + return status; +} + +static kal_uint32 charging_diso_init(void *data) +{ + kal_uint32 status = STATUS_OK; + +#if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) + DISO_ChargerStruct *pDISO_data = (DISO_ChargerStruct *)data; + + /* Initialization DISO Struct */ + pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE; + pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE; + pDISO_data->diso_state.cur_vdc_state = DISO_OFFLINE; + + pDISO_data->diso_state.pre_otg_state = DISO_OFFLINE; + pDISO_data->diso_state.pre_vusb_state = DISO_OFFLINE; + pDISO_data->diso_state.pre_vdc_state = DISO_OFFLINE; + + pDISO_data->chr_get_diso_state = KAL_FALSE; + pDISO_data->hv_voltage = VBUS_MAX_VOLTAGE; + +#if !defined(MTK_AUXADC_IRQ_SUPPORT) + hrtimer_init(&diso_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + diso_kthread_timer.function = diso_kthread_hrtimer_func; + INIT_DELAYED_WORK(&diso_polling_work, diso_polling_handler); + + kthread_run(diso_thread_kthread, NULL, "diso_thread_kthread"); + battery_xlog_printk(BAT_LOG_CRTI, "[%s] done\n", __func__); +#else + struct device_node *node; + int ret; + + //Initial AuxADC IRQ + DISO_data.irq_line_number = LOWBATTERY_IRQ_ID; + DISO_IRQ.vdc_measure_channel.number = AP_AUXADC_DISO_VDC_CHANNEL; + DISO_IRQ.vusb_measure_channel.number = AP_AUXADC_DISO_VUSB_CHANNEL; + DISO_IRQ.vdc_measure_channel.period = AUXADC_CHANNEL_DELAY_PERIOD; + DISO_IRQ.vusb_measure_channel.period = AUXADC_CHANNEL_DELAY_PERIOD; + DISO_IRQ.vdc_measure_channel.debounce = AUXADC_CHANNEL_DEBOUNCE; + DISO_IRQ.vusb_measure_channel.debounce = AUXADC_CHANNEL_DEBOUNCE; + + /* use default threshold voltage, if use high voltage,maybe refine*/ + DISO_IRQ.vusb_measure_channel.falling_threshold = VBUS_MIN_VOLTAGE/1000; + DISO_IRQ.vdc_measure_channel.falling_threshold = VDC_MIN_VOLTAGE/1000; + DISO_IRQ.vusb_measure_channel.rising_threshold = VBUS_MIN_VOLTAGE/1000; + DISO_IRQ.vdc_measure_channel.rising_threshold = VDC_MIN_VOLTAGE/1000; + + mt_irq_set_sens(pDISO_data->irq_line_number, MT_EDGE_SENSITIVE); + mt_irq_set_polarity(pDISO_data->irq_line_number, MT_POLARITY_LOW); + + ret = request_threaded_irq(pDISO_data->irq_line_number, diso_auxadc_irq_handler, \ + pDISO_data->irq_callback_func, IRQF_ONESHOT , "DISO_ADC_IRQ", NULL); + + if (ret) { + battery_xlog_printk(BAT_LOG_CRTI, "[diso_adc]: request_irq failed.\n"); + } else { + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + battery_xlog_printk(BAT_LOG_CRTI, "[diso_adc]: diso_init success.\n"); + } +#endif + +#if defined(MTK_DISCRETE_SWITCH) && defined(MTK_DSC_USE_EINT) + battery_xlog_printk(BAT_LOG_CRTI, "[diso_eint]vdc eint irq registitation\n"); + mt_eint_set_hw_debounce(CUST_EINT_VDC_NUM, CUST_EINT_VDC_DEBOUNCE_CN); + mt_eint_registration(CUST_EINT_VDC_NUM, CUST_EINTF_TRIGGER_LOW, vdc_eint_handler, 0); + mt_eint_mask(CUST_EINT_VDC_NUM); +#endif +#endif + + return status; +} + +static kal_uint32 charging_get_diso_state(void *data) +{ + kal_uint32 status = STATUS_OK; + +#if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) + int diso_state = 0x0; + DISO_ChargerStruct *pDISO_data = (DISO_ChargerStruct *)data; + + _get_diso_interrupt_state(); + diso_state = g_diso_state; + battery_xlog_printk(BAT_LOG_CRTI, "[do_chrdet_int_task] current diso state is %s!\n", DISO_state_s[diso_state]); + if(((diso_state >> 1) & 0x3) != 0x0) + { + switch (diso_state){ + case USB_ONLY: + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); +#ifdef MTK_DISCRETE_SWITCH +#ifdef MTK_DSC_USE_EINT + mt_eint_unmask(CUST_EINT_VDC_NUM); +#else + set_vdc_auxadc_irq(DISO_IRQ_ENABLE, 1); +#endif +#endif + pDISO_data->diso_state.cur_vusb_state = DISO_ONLINE; + pDISO_data->diso_state.cur_vdc_state = DISO_OFFLINE; + pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE; + break; + case DC_ONLY: + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_ENABLE, DISO_IRQ_RISING); + pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE; + pDISO_data->diso_state.cur_vdc_state = DISO_ONLINE; + pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE; + break; + case DC_WITH_USB: + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_ENABLE,DISO_IRQ_FALLING); + pDISO_data->diso_state.cur_vusb_state = DISO_ONLINE; + pDISO_data->diso_state.cur_vdc_state = DISO_ONLINE; + pDISO_data->diso_state.cur_otg_state = DISO_OFFLINE; + break; + case DC_WITH_OTG: + set_vdc_auxadc_irq(DISO_IRQ_DISABLE, 0); + set_vusb_auxadc_irq(DISO_IRQ_DISABLE, 0); + pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE; + pDISO_data->diso_state.cur_vdc_state = DISO_ONLINE; + pDISO_data->diso_state.cur_otg_state = DISO_ONLINE; + break; + default: // OTG only also can trigger vcdt IRQ + pDISO_data->diso_state.cur_vusb_state = DISO_OFFLINE; + pDISO_data->diso_state.cur_vdc_state = DISO_OFFLINE; + pDISO_data->diso_state.cur_otg_state = DISO_ONLINE; + battery_xlog_printk(BAT_LOG_CRTI, " switch load vcdt irq triggerd by OTG Boost!\n"); + break; // OTG plugin no need battery sync action + } + } + + if (DISO_ONLINE == pDISO_data->diso_state.cur_vdc_state) + pDISO_data->hv_voltage = VDC_MAX_VOLTAGE; + else + pDISO_data->hv_voltage = VBUS_MAX_VOLTAGE; +#endif + + return status; +} + + +static kal_uint32 (* const charging_func[CHARGING_CMD_NUMBER])(void *data)= +{ + charging_hw_init + ,charging_dump_register + ,charging_enable + ,charging_set_cv_voltage + ,charging_get_current + ,charging_set_current + ,charging_set_input_current + ,charging_get_charging_status + ,charging_reset_watch_dog_timer + ,charging_set_hv_threshold + ,charging_get_hv_status + ,charging_get_battery_status + ,charging_get_charger_det_status + ,charging_get_charger_type + ,charging_get_is_pcm_timer_trigger + ,charging_set_platform_reset + ,charging_get_platfrom_boot_mode + ,charging_set_power_off + ,charging_get_power_source + ,charging_get_csdac_full_flag + ,charging_set_ta_current_pattern + ,charging_set_error_state + ,charging_diso_init + ,charging_get_diso_state +}; + + + /* + * FUNCTION + * Internal_chr_control_handler + * + * DESCRIPTION + * This function is called to set the charger hw + * + * CALLS + * + * PARAMETERS + * None + * + * RETURNS + * + * + * GLOBALS AFFECTED + * None + */ +kal_int32 chr_control_interface_sn2871(CHARGING_CTRL_CMD cmd, void *data) +{ + kal_int32 status; + if(cmd < CHARGING_CMD_NUMBER) + status = charging_func[cmd](data); + else + return STATUS_UNSUPPORTED; + + return status; +} + + diff --git a/drivers/misc/mediatek/power/mt8127/fan5405.h b/drivers/misc/mediatek/power/mt8127/fan5405.h index 5cb2d7e6c7a..320feed4122 100644 --- a/drivers/misc/mediatek/power/mt8127/fan5405.h +++ b/drivers/misc/mediatek/power/mt8127/fan5405.h @@ -20,7 +20,7 @@ #ifndef _fan5405_SW_H_ #define _fan5405_SW_H_ -#define HIGH_BATTERY_VOLTAGE_SUPPORT +//#define HIGH_BATTERY_VOLTAGE_SUPPORT #define fan5405_CON0 0x00 #define fan5405_CON1 0x01 diff --git a/drivers/misc/mediatek/power/mt8127/pmic_chr_type_det.c b/drivers/misc/mediatek/power/mt8127/pmic_chr_type_det.c index b13ef90a5de..b43199863fe 100644 --- a/drivers/misc/mediatek/power/mt8127/pmic_chr_type_det.c +++ b/drivers/misc/mediatek/power/mt8127/pmic_chr_type_det.c @@ -39,6 +39,12 @@ #include #include +#if defined(CONFIG_AUSTIN_PROJECT) +#ifdef CONFIG_MTK_BQ24296_SUPPORT +#include "bq24296.h" +#endif +#endif + // ============================================================ // //extern function // ============================================================ // @@ -240,16 +246,17 @@ CHARGER_TYPE hw_charger_type_detection(void) CHARGER_TYPE hw_charger_type_detection(void) { CHARGER_TYPE ret = CHARGER_UNKNOWN; + +#if defined(CONFIG_AUSTIN_PROJECT) +#ifdef CONFIG_MTK_BQ24296_SUPPORT + bq24296_set_vindpm(0x9); /*VIN DPM check 4.6V*/ +#endif +#endif + hw_bc11_init(); - - if(1 == hw_bc11_DCD()) - { - if(1 == hw_bc11_stepA1()) - { - ret = APPLE_2_1A_CHARGER; - } else { - ret = NONSTANDARD_CHARGER; - } + + if(1 == hw_bc11_DCD()) { + ret = NONSTANDARD_CHARGER; } else { if(1 == hw_bc11_stepA2()) { diff --git a/drivers/misc/mediatek/power/mt8127/pmic_mt6323.c b/drivers/misc/mediatek/power/mt8127/pmic_mt6323.c index 53878faad2b..14154392b41 100644 --- a/drivers/misc/mediatek/power/mt8127/pmic_mt6323.c +++ b/drivers/misc/mediatek/power/mt8127/pmic_mt6323.c @@ -42,6 +42,7 @@ #include #include #include +#include #include @@ -107,9 +108,12 @@ void pmic_disable_pll(int id, char *mod_name) #define VOLTAGE_FULL_RANGE 1800 #define ADC_PRECISE 32768 // 10 bits +static void deferred_restart(struct work_struct *dummy); + static DEFINE_MUTEX(pmic_lock_mutex); static DEFINE_MUTEX(pmic_adc_mutex); static DEFINE_SPINLOCK(pmic_adc_lock); +static DECLARE_WORK(restart_work, deferred_restart); //============================================================================== // Extern @@ -134,6 +138,10 @@ static unsigned long timer_pre = 0; static unsigned long timer_pos = 0; #define LONG_PWRKEY_PRESS_TIME 500*1000000 //500ms #endif + +static struct hrtimer long_press_pwrkey_shutdown_timer; +#define LONG_PRESS_PWRKEY_SHUTDOWN_TIME (6) /* 6sec */ + //============================================================================== // PMIC lock/unlock APIs //============================================================================== @@ -559,6 +567,27 @@ EXPORT_SYMBOL(wake_up_pmic); #define WAKE_LOCK_INITIALIZED (1U << 8) +static void deferred_restart(struct work_struct *dummy) +{ + mutex_lock(&pmic_mutex); + + pr_notice("[deferred_restart] -- Long key press power off\n"); + + unsigned int pwrkey_deb = 0; + pwrkey_deb = upmu_get_pwrkey_deb(); + if (pwrkey_deb == 1) { + pr_err("[deferred_restart] -- pwrkey release, do nothing\n"); + } + else { + sys_sync(); + rtc_mark_enter_sw_lprst(); /* for long press power off */ + if (upmu_get_rgs_chrdet()) + rtc_mark_enter_kpoc(); + + orderly_reboot(true); + } + mutex_unlock(&pmic_mutex); +} void cust_pmic_interrupt_en_setting(void) { @@ -639,13 +668,23 @@ void watchdog_int_handler(void) extern void kpd_pwrkey_pmic_handler(unsigned long pressed); +enum hrtimer_restart long_press_pwrkey_shutdown_timer_func(struct hrtimer *timer) +{ + queue_work(system_highpri_wq, &restart_work); + return HRTIMER_NORESTART; +} + void pwrkey_int_handler(void) { kal_uint32 ret=0; + ktime_t ktime; + U32 pwrkey_deb = 0; xlog_printk(ANDROID_LOG_INFO, "Power/PMIC", "[pwrkey_int_handler]....\n"); - - if(upmu_get_pwrkey_deb()==1) + + pwrkey_deb = upmu_get_pwrkey_deb(); + + if (pwrkey_deb == 1) { xlog_printk(ANDROID_LOG_INFO, "Power/PMIC", "[pwrkey_int_handler] Release pwrkey\n"); #if defined (CONFIG_MTK_KERNEL_POWER_OFF_CHARGING) @@ -664,6 +703,8 @@ void pwrkey_int_handler(void) } } #endif + hrtimer_cancel(&long_press_pwrkey_shutdown_timer); + kpd_pwrkey_pmic_handler(0x0); upmu_set_rg_pwrkey_int_sel(0); } @@ -676,6 +717,9 @@ void pwrkey_int_handler(void) timer_pre = sched_clock(); } #endif + ktime = ktime_set(LONG_PRESS_PWRKEY_SHUTDOWN_TIME, 0); + hrtimer_start(&long_press_pwrkey_shutdown_timer, ktime, HRTIMER_MODE_REL); + kpd_pwrkey_pmic_handler(0x1); upmu_set_rg_pwrkey_int_sel(1); } @@ -3651,6 +3695,9 @@ static int pmic_mt6323_probe(struct platform_device *dev) upmu_get_reg_value(0x402)); #endif + hrtimer_init(&long_press_pwrkey_shutdown_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + long_press_pwrkey_shutdown_timer.function = long_press_pwrkey_shutdown_timer_func; + return 0; } diff --git a/drivers/misc/mediatek/power/mt8127/sn2871.c b/drivers/misc/mediatek/power/mt8127/sn2871.c new file mode 100644 index 00000000000..fd390040c18 --- /dev/null +++ b/drivers/misc/mediatek/power/mt8127/sn2871.c @@ -0,0 +1,1168 @@ +#if 0 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "sn2871.h" +#include +#include + +#if defined(CONFIG_MTK_FPGA) +#else +#ifdef CONFIG_OF +#else +#include +#endif +#endif +#endif +#include +#include /* For init/exit macros */ +#include /* For MODULE_ marcros */ +#include +#include +#include +#include +#ifdef CONFIG_OF +#include +#include +#include +#endif +#include +//#include "charge.h" +#include "sn2871.h" +/********************************************************** + * + * [I2C Slave Setting] + * + *********************************************************/ + + +#ifdef CONFIG_OF +#else + +#define sn2871_SLAVE_ADDR_WRITE 0xD6 +#define sn2871_SLAVE_ADDR_Read 0xD7 + +#define sn2871_BUSNUM 2 + +#endif +static struct i2c_client *new_client; +static const struct i2c_device_id sn2871_i2c_id[] = { {"sn2871", 0}, {} }; + +extern kal_bool chargin_hw_init_done; +static int sn2871_driver_probe(struct i2c_client *client, const struct i2c_device_id *id); + + +/********************************************************** + * + * [Global Variable] + * + *********************************************************/ +unsigned char sn2871_reg[sn2871_REG_NUM] = { 0 }; + +static DEFINE_MUTEX(sn2871_i2c_access); + +int g_sn2871_hw_exist = 0; + +/********************************************************** + * + * [I2C Function For Read/Write sn2871] + * + *********************************************************/ +#ifdef CONFIG_MTK_I2C_EXTENSION +unsigned int sn2871_read_byte(unsigned char cmd, unsigned char *returnData) +{ + char cmd_buf[1] = { 0x00 }; + char readData = 0; + int ret = 0; + + mutex_lock(&sn2871_i2c_access); + + /* new_client->addr = ((new_client->addr) & I2C_MASK_FLAG) | I2C_WR_FLAG; */ + new_client->ext_flag = + ((new_client->ext_flag) & I2C_MASK_FLAG) | I2C_WR_FLAG | I2C_DIRECTION_FLAG; + + cmd_buf[0] = cmd; + ret = i2c_master_send(new_client, &cmd_buf[0], (1 << 8 | 1)); + if (ret < 0) { + /* new_client->addr = new_client->addr & I2C_MASK_FLAG; */ + new_client->ext_flag = 0; + mutex_unlock(&sn2871_i2c_access); + + return 0; + } + + readData = cmd_buf[0]; + *returnData = readData; + + /* new_client->addr = new_client->addr & I2C_MASK_FLAG; */ + new_client->ext_flag = 0; + mutex_unlock(&sn2871_i2c_access); + + return 1; +} + +unsigned int sn2871_write_byte(unsigned char cmd, unsigned char writeData) +{ + char write_data[2] = { 0 }; + int ret = 0; + + mutex_lock(&sn2871_i2c_access); + + write_data[0] = cmd; + write_data[1] = writeData; + + new_client->ext_flag = ((new_client->ext_flag) & I2C_MASK_FLAG) | I2C_DIRECTION_FLAG; + + ret = i2c_master_send(new_client, write_data, 2); + if (ret < 0) { + new_client->ext_flag = 0; + mutex_unlock(&sn2871_i2c_access); + return 0; + } + + new_client->ext_flag = 0; + mutex_unlock(&sn2871_i2c_access); + return 1; +} +#else +unsigned int sn2871_read_byte(unsigned char cmd, unsigned char *returnData) +{ + unsigned char xfers = 2; + int ret, retries = 1; + + mutex_lock(&sn2871_i2c_access); + + do { + struct i2c_msg msgs[2] = { + { + .addr = new_client->addr, + .flags = 0, + .len = 1, + .buf = &cmd, + }, + { + + .addr = new_client->addr, + .flags = I2C_M_RD, + .len = 1, + .buf = returnData, + } + }; + + /* + * Avoid sending the segment addr to not upset non-compliant + * DDC monitors. + */ + ret = i2c_transfer(new_client->adapter, msgs, xfers); + + if (ret == -ENXIO) { + battery_xlog_printk(BAT_LOG_CRTI, "skipping non-existent adapter %s\n", new_client->adapter->name); + break; + } + } while (ret != xfers && --retries); + + mutex_unlock(&sn2871_i2c_access); + + return ret == xfers ? 1 : -1; +} + +unsigned int sn2871_write_byte(unsigned char cmd, unsigned char writeData) +{ + unsigned char xfers = 1; + int ret, retries = 1; + unsigned char buf[8]; + + mutex_lock(&sn2871_i2c_access); + + buf[0] = cmd; + memcpy(&buf[1], &writeData, 1); + + do { + struct i2c_msg msgs[1] = { + { + .addr = new_client->addr, + .flags = 0, + .len = 1 + 1, + .buf = buf, + }, + }; + + /* + * Avoid sending the segment addr to not upset non-compliant + * DDC monitors. + */ + ret = i2c_transfer(new_client->adapter, msgs, xfers); + + if (ret == -ENXIO) { + battery_xlog_printk(BAT_LOG_CRTI, "skipping non-existent adapter %s\n", new_client->adapter->name); + break; + } + } while (ret != xfers && --retries); + + mutex_unlock(&sn2871_i2c_access); + + return ret == xfers ? 1 : -1; +} +#endif +/********************************************************** + * + * [Read / Write Function] + * + *********************************************************/ +unsigned int sn2871_read_interface(unsigned char RegNum, unsigned char *val, unsigned char MASK, + unsigned char SHIFT) +{ + unsigned char sn2871_reg = 0; + unsigned int ret = 0; + + ret = sn2871_read_byte(RegNum, &sn2871_reg); + + + sn2871_reg &= (MASK << SHIFT); + *val = (sn2871_reg >> SHIFT); + + battery_xlog_printk(BAT_LOG_FULL, "[sn2871_read_interface] val=0x%x\n", *val); + + return ret; +} + +unsigned int sn2871_config_interface(unsigned char RegNum, unsigned char val, unsigned char MASK, + unsigned char SHIFT) +{ + unsigned char sn2871_reg = 0; + unsigned int ret = 0; + + ret = sn2871_read_byte(RegNum, &sn2871_reg); + battery_xlog_printk(BAT_LOG_FULL, "[sn2871_config_interface] Reg[%x]=0x%x\n", RegNum, sn2871_reg); + + sn2871_reg &= ~(MASK << SHIFT); + sn2871_reg |= (val << SHIFT); + + ret = sn2871_write_byte(RegNum, sn2871_reg); + battery_xlog_printk(BAT_LOG_FULL, "[sn2871_config_interface] write Reg[%x]=0x%x\n", RegNum, + sn2871_reg); + + /* Check */ + /* sn2871_read_byte(RegNum, &sn2871_reg); */ + /* printk("[sn2871_config_interface] Check Reg[%x]=0x%x\n", RegNum, sn2871_reg); */ + + return ret; +} + +/* write one register directly */ +unsigned int sn2871_reg_config_interface(unsigned char RegNum, unsigned char val) +{ + unsigned int ret = 0; + + ret = sn2871_write_byte(RegNum, val); + + return ret; +} + +/********************************************************** + * + * [Internal Function] + * + *********************************************************/ +/* CON0---------------------------------------------------- */ + +void sn2871_set_en_hiz(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON0), + (unsigned char) (val), + (unsigned char) (CON0_EN_HIZ_MASK), + (unsigned char) (CON0_EN_HIZ_SHIFT) + ); +} + +void sn2871_set_en_ilim(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON0), + (unsigned char) (val), + (unsigned char) (CON0_EN_ILIM_MASK), + (unsigned char) (CON0_EN_ILIM_SHIFT) + ); +} + +void sn2871_set_iinlim(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON0), + (val), + (unsigned char) (CON0_IINLIM_MASK), + (unsigned char) (CON0_IINLIM_SHIFT) + ); +} + +unsigned int sn2871_get_iinlim(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON0), + (&val), + (unsigned char) (CON0_IINLIM_MASK), (unsigned char) (CON0_IINLIM_SHIFT) + ); + return val; +} + + + +/* CON1---------------------------------------------------- */ + +void sn2871_ADC_start(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON2), + (unsigned char) (val), + (unsigned char) (CON2_CONV_START_MASK), + (unsigned char) (CON2_CONV_START_SHIFT) + ); +} + +void sn2871_set_ADC_rate(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON2), + (unsigned char) (val), + (unsigned char) (CON2_CONV_RATE_MASK), + (unsigned char) (CON2_CONV_RATE_SHIFT) + ); +} + +void sn2871_set_vindpm_os(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON1), + (unsigned char) (val), + (unsigned char) (CON1_VINDPM_OS_MASK), + (unsigned char) (CON1_VINDPM_OS_SHIFT) + ); +} + +/* CON2---------------------------------------------------- */ + +void sn2871_set_ico_en_start(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON2), + (unsigned char) (val), + (unsigned char) (CON2_ICO_EN_MASK), + (unsigned char) (CON2_ICO_EN_RATE_SHIFT) + ); +} + + + +/* CON3---------------------------------------------------- */ + +void sn2871_wd_reset(unsigned int val) +{ + unsigned int ret = 0; + + + ret = sn2871_config_interface((unsigned char) (sn2871_CON3), + (val), + (unsigned char) (CON3_WD_MASK), (unsigned char) (CON3_WD_SHIFT) + ); + +} + +void sn2871_otg_en(unsigned int val) +{ + unsigned int ret = 0; + + + ret = sn2871_config_interface((unsigned char) (sn2871_CON3), + (val), + (unsigned char) (CON3_OTG_CONFIG_MASK), + (unsigned char) (CON3_OTG_CONFIG_SHIFT) + ); + +} + +void sn2871_chg_en(unsigned int val) +{ + unsigned int ret = 0; + + + ret = sn2871_config_interface((unsigned char) (sn2871_CON3), + (val), + (unsigned char) (CON3_CHG_CONFIG_MASK), + (unsigned char) (CON3_CHG_CONFIG_SHIFT) + ); + +} + +unsigned int sn2871_get_chg_en(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON3), + (&val), + (unsigned char) (CON3_CHG_CONFIG_MASK), + (unsigned char) (CON3_CHG_CONFIG_SHIFT) + ); + return val; +} + + +void sn2871_set_sys_min(unsigned int val) +{ + unsigned int ret = 0; + + + ret = sn2871_config_interface((unsigned char) (sn2871_CON3), + (val), + (unsigned char) (CON3_SYS_V_LIMIT_MASK), + (unsigned char) (CON3_SYS_V_LIMIT_SHIFT) + ); + +} + +/* CON4---------------------------------------------------- */ + +void sn2871_en_pumpx(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON4), + (unsigned char) (val), + (unsigned char) (CON4_EN_PUMPX_MASK), + (unsigned char) (CON4_EN_PUMPX_SHIFT) + ); +} + + +void sn2871_set_ichg(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON4), + (unsigned char) (val), + (unsigned char) (CON4_ICHG_MASK), (unsigned char) (CON4_ICHG_SHIFT) + ); +} + +unsigned int sn2871_get_reg_ichg(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON4), + (&val), + (unsigned char) (CON4_ICHG_MASK), (unsigned char) (CON4_ICHG_SHIFT) + ); + return val; +} + +/* CON5---------------------------------------------------- */ + +void sn2871_set_iprechg(unsigned int val) +{ + unsigned int ret = 0; + + + ret = sn2871_config_interface((unsigned char) (sn2871_CON5), + (val), + (unsigned char) (CON5_IPRECHG_MASK), + (unsigned char) (CON5_IPRECHG_SHIFT) + ); + +} + +void sn2871_set_iterml(unsigned int val) +{ + unsigned int ret = 0; + + + ret = sn2871_config_interface((unsigned char) (sn2871_CON5), + (val), + (unsigned char) (CON5_ITERM_MASK), (unsigned char) (CON5_ITERM_SHIFT) + ); + +} + + + +/* CON6---------------------------------------------------- */ + +void sn2871_set_vreg(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON6), + (unsigned char) (val), + (unsigned char) (CON6_2XTMR_EN_MASK), + (unsigned char) (CON6_2XTMR_EN_SHIFT) + ); +} + +void sn2871_set_batlowv(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON6), + (unsigned char) (val), + (unsigned char) (CON6_BATLOWV_MASK), + (unsigned char) (CON6_BATLOWV_SHIFT) + ); +} + +void sn2871_set_vrechg(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON6), + (unsigned char) (val), + (unsigned char) (CON6_VRECHG_MASK), + (unsigned char) (CON6_VRECHG_SHIFT) + ); +} + +/* CON7---------------------------------------------------- */ + + +void sn2871_en_term_chg(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON7), + (unsigned char) (val), + (unsigned char) (CON7_EN_TERM_CHG_MASK), + (unsigned char) (CON7_EN_TERM_CHG_SHIFT) + ); +} + +void sn2871_en_state_dis(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON7), + (unsigned char) (val), + (unsigned char) (CON7_STAT_DIS_MASK), + (unsigned char) (CON7_STAT_DIS_SHIFT) + ); +} + +void sn2871_set_wd_timer(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON7), + (unsigned char) (val), + (unsigned char) (CON7_WTG_TIM_SET_MASK), + (unsigned char) (CON7_WTG_TIM_SET_SHIFT) + ); +} + +void sn2871_en_chg_timer(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON7), + (unsigned char) (val), + (unsigned char) (CON7_EN_TIMER_MASK), + (unsigned char) (CON7_EN_TIMER_SHIFT) + ); +} + +void sn2871_set_chg_timer(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON7), + (unsigned char) (val), + (unsigned char) (CON7_SET_CHG_TIM_MASK), + (unsigned char) (CON7_SET_CHG_TIM_SHIFT) + ); +} + +/* CON8--------------------------------------------------- */ +void sn2871_set_thermal_regulation(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON8), + (unsigned char) (val), + (unsigned char) (CON8_TREG_MASK), (unsigned char) (CON8_TREG_SHIFT) + ); +} + +void sn2871_set_VBAT_clamp(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON8), + (unsigned char) (val), + (unsigned char) (CON8_VCLAMP_MASK), + (unsigned char) (CON8_VCLAMP_SHIFT) + ); +} + +void sn2871_set_VBAT_IR_compensation(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CON8), + (unsigned char) (val), + (unsigned char) (CON8_BAT_COMP_MASK), + (unsigned char) (CON8_BAT_COMP_SHIFT) + ); +} + +/* CON9---------------------------------------------------- */ +void sn2871_pumpx_up(unsigned int val) +{ + unsigned int ret = 0; + + sn2871_en_pumpx(1); + if (val == 1) { + ret = sn2871_config_interface((unsigned char) (sn2871_CON9), + (unsigned char) (1), + (unsigned char) (CON9_PUMPX_UP), + (unsigned char) (CON9_PUMPX_UP_SHIFT) + ); + } else { + ret = sn2871_config_interface((unsigned char) (sn2871_CON9), + (unsigned char) (1), + (unsigned char) (CON9_PUMPX_DN), + (unsigned char) (CON9_PUMPX_DN_SHIFT) + ); + } +/* Input current limit = 800 mA, changes after port detection*/ + sn2871_set_iinlim(0x14); +/* CC mode current = 2048 mA*/ + sn2871_set_ichg(0x20); + msleep(3000); +} + +/* CONA---------------------------------------------------- */ +void sn2871_set_boost_ilim(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CONA), + (unsigned char) (val), + (unsigned char) (CONA_BOOST_ILIM_MASK), + (unsigned char) (CONA_BOOST_ILIM_SHIFT) + ); +} + +void sn2871_set_boost_vlim(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_CONA), + (unsigned char) (val), + (unsigned char) (CONA_BOOST_VLIM_MASK), + (unsigned char) (CONA_BOOST_VLIM_SHIFT) + ); +} + +/* CONB---------------------------------------------------- */ + + +unsigned int sn2871_get_vbus_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONB), + (&val), + (unsigned char) (CONB_VBUS_STAT_MASK), + (unsigned char) (CONB_VBUS_STAT_SHIFT) + ); + return val; +} + + +unsigned int sn2871_get_chrg_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONB), + (&val), + (unsigned char) (CONB_CHRG_STAT_MASK), + (unsigned char) (CONB_CHRG_STAT_SHIFT) + ); + return val; +} + +unsigned int sn2871_get_pg_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONB), + (&val), + (unsigned char) (CONB_PG_STAT_MASK), + (unsigned char) (CONB_PG_STAT_SHIFT) + ); + return val; +} + + + +unsigned int sn2871_get_sdp_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONB), + (&val), + (unsigned char) (CONB_SDP_STAT_MASK), + (unsigned char) (CONB_SDP_STAT_SHIFT) + ); + return val; +} + +unsigned int sn2871_get_vsys_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONB), + (&val), + (unsigned char) (CONB_VSYS_STAT_MASK), + (unsigned char) (CONB_VSYS_STAT_SHIFT) + ); + return val; +} + +/* CON0C---------------------------------------------------- */ +unsigned int sn2871_get_wdt_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONC), + (&val), + (unsigned char) (CONB_WATG_STAT_MASK), + (unsigned char) (CONB_WATG_STAT_SHIFT) + ); + return val; +} + +unsigned int sn2871_get_boost_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONC), + (&val), + (unsigned char) (CONB_BOOST_STAT_MASK), + (unsigned char) (CONB_BOOST_STAT_SHIFT) + ); + return val; +} + +unsigned int sn2871_get_chrg_fault_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONC), + (&val), + (unsigned char) (CONC_CHRG_FAULT_MASK), + (unsigned char) (CONC_CHRG_FAULT_SHIFT) + ); + return val; +} + +unsigned int sn2871_get_bat_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONC), + (&val), + (unsigned char) (CONB_BAT_STAT_MASK), + (unsigned char) (CONB_BAT_STAT_SHIFT) + ); + return val; +} + + +/* COND */ +void sn2871_set_FORCE_VINDPM(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_COND), + (unsigned char) (val), + (unsigned char) (COND_FORCE_VINDPM_MASK), + (unsigned char) (COND_FORCE_VINDPM_SHIFT) + ); +} + +void sn2871_set_VINDPM(unsigned int val) +{ + unsigned int ret = 0; + + ret = sn2871_config_interface((unsigned char) (sn2871_COND), + (unsigned char) (val), + (unsigned char) (COND_VINDPM_MASK), + (unsigned char) (COND_VINDPM_SHIFT) + ); +} + +/* CONDE */ +unsigned int sn2871_get_vbat(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CONE), + (&val), + (unsigned char) (CONE_VBAT_MASK), (unsigned char) (CONE_VBAT_SHIFT) + ); + return val; +} + +/* CON11 */ +unsigned int sn2871_get_vbus(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON11), + (&val), + (unsigned char) (CON11_VBUS_MASK), (unsigned char) (CON11_VBUS_SHIFT) + ); + return val; +} + +/* CON12 */ +unsigned int sn2871_get_ichg(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON12), + (&val), + (unsigned char) (CONB_ICHG_STAT_MASK), + (unsigned char) (CONB_ICHG_STAT_SHIFT) + ); + return val; +} + + + +/* CON13 /// */ + + +unsigned int sn2871_get_idpm_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON13), + (&val), + (unsigned char) (CON13_IDPM_STAT_MASK), + (unsigned char) (CON13_IDPM_STAT_SHIFT) + ); + return val; +} + +unsigned int sn2871_get_vdpm_state(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON13), + (&val), + (unsigned char) (CON13_VDPM_STAT_MASK), + (unsigned char) (CON13_VDPM_STAT_SHIFT) + ); + return val; +} + + +unsigned int sn2871_get_device_revision(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface((unsigned char) (sn2871_CON14), + (&val), + (unsigned char) (CON14_DEV_REV_MASK), + (unsigned char) (CON14_DEV_REV_SHIFT) + ); + battery_xlog_printk(BAT_LOG_CRTI, "%s 0x%x", __func__, val); + return val; +} + + +/********************************************************** + * + * [Internal Function] + * + *********************************************************/ +void sn2871_hw_component_detect(void) +{ + unsigned int ret = 0; + unsigned char val = 0; + + ret = sn2871_read_interface(0x03, &val, 0xFF, 0x0); + + if (val == 0) + g_sn2871_hw_exist = 0; + else + g_sn2871_hw_exist = 1; + + pr_debug("[sn2871_hw_component_detect] exist=%d, Reg[0x03]=0x%x\n", + g_sn2871_hw_exist, val); +} + +int is_sn2871_exist(void) +{ + pr_debug("[is_sn2871_exist] g_sn2871_hw_exist=%d\n", g_sn2871_hw_exist); + + return g_sn2871_hw_exist; +} + +void sn2871_dump_register(void) +{ + unsigned char i = 0; + unsigned char ichg = 0; + unsigned char ichg_reg = 0; + unsigned char iinlim = 0; + unsigned char vbat = 0; + unsigned char chrg_state = 0; + unsigned char chr_en = 0; + unsigned char vbus = 0; + unsigned char vdpm = 0; + unsigned char fault = 0; + + /*sn2871_ADC_start(1);*/ + for (i = 0; i < sn2871_REG_NUM; i++) { + sn2871_read_byte(i, &sn2871_reg[i]); + battery_xlog_printk(BAT_LOG_CRTI, "[sn2871 reg@][0x%x]=0x%x ", i, sn2871_reg[i]); + } + sn2871_ADC_start(1); + iinlim = sn2871_get_iinlim(); + chrg_state = sn2871_get_chrg_state(); + chr_en = sn2871_get_chg_en(); + ichg_reg = sn2871_get_reg_ichg(); + ichg = sn2871_get_ichg(); + vbat = sn2871_get_vbat(); + vbus = sn2871_get_vbus(); + vdpm = sn2871_get_vdpm_state(); + fault = sn2871_get_chrg_fault_state(); + battery_xlog_printk(BAT_LOG_CRTI, + "[PE+]Ibat=%d, Ilim=%d, Vbus=%d, err=%d, Ichg=%d, Vbat=%d, ChrStat=%d, CHGEN=%d, VDPM=%d\n", + ichg_reg * 64, iinlim * 50 + 100, vbus * 100 + 2600, fault, + ichg * 50, vbat * 20 + 2304, chrg_state, chr_en, vdpm); + +} + +void sn2871_hw_init(void) +{ + /*battery_log(BAT_LOG_CRTI, "[sn2871_hw_init] After HW init\n");*/ + sn2871_dump_register(); +} + +kal_bool sn2871_is_found = KAL_FALSE; +static int sn2871_driver_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + + battery_xlog_printk(BAT_LOG_CRTI, "[sn2871_driver_probe]\n"); + + new_client = client; + new_client->addr = 0x6B; + + if (sn2871_get_device_revision() == 0x2) { + battery_xlog_printk(BAT_LOG_CRTI, "find SN2871 device and register charger control. \n"); + sn2871_dump_register(); + chargin_hw_init_done = KAL_TRUE; + sn2871_is_found = KAL_TRUE; + return 0; + } else { + battery_xlog_printk(BAT_LOG_CRTI, "no SN2871 device is found.\n"); + return -1; + } + /* --------------------- */ + //sn2871_hw_component_detect(); + //sn2871_dump_register(); + /* sn2871_hw_init(); //move to charging_hw_xxx.c */ + //return 0; +} + +/********************************************************** + * + * [platform_driver API] + * + *********************************************************/ +unsigned char g_reg_value_sn2871 = 0; +static ssize_t show_sn2871_access(struct device *dev, struct device_attribute *attr, char *buf) +{ + battery_xlog_printk(BAT_LOG_CRTI, "[show_sn2871_access] 0x%x\n", g_reg_value_sn2871); + return sprintf(buf, "%u\n", g_reg_value_sn2871); +} + +static ssize_t store_sn2871_access(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = 0; + /*char *pvalue = NULL;*/ + unsigned int reg_value = 0; + unsigned long int reg_address = 0; + int rv; + + battery_xlog_printk(BAT_LOG_CRTI, "[store_sn2871_access]\n"); + + if (buf != NULL && size != 0) { + battery_xlog_printk(BAT_LOG_CRTI, "[store_sn2871_access] buf is %s and size is %zu\n", buf, + size); + /*reg_address = simple_strtoul(buf, &pvalue, 16);*/ + rv = kstrtoul(buf, 0, ®_address); + if (rv != 0) + return -EINVAL; + /*ret = kstrtoul(buf, 16, reg_address); *//* This must be a null terminated string */ + if (size > 3) { + /*NEED to check kstr*/ + /*reg_value = simple_strtoul((pvalue + 1), NULL, 16);*/ + /*ret = kstrtoul(buf + 3, 16, reg_value); */ + battery_xlog_printk(BAT_LOG_CRTI, + "[store_sn2871_access] write sn2871 reg 0x%x with value 0x%x !\n", + (unsigned int) reg_address, reg_value); + ret = sn2871_config_interface(reg_address, reg_value, 0xFF, 0x0); + } else { + ret = sn2871_read_interface(reg_address, &g_reg_value_sn2871, 0xFF, 0x0); + battery_xlog_printk(BAT_LOG_CRTI, + "[store_sn2871_access] read sn2871 reg 0x%x with value 0x%x !\n", + (unsigned int) reg_address, g_reg_value_sn2871); + battery_xlog_printk(BAT_LOG_CRTI, + "[store_sn2871_access] Please use \"cat sn2871_access\" to get value\r\n"); + } + } + return size; +} + +static DEVICE_ATTR(sn2871_access, 0664, show_sn2871_access, store_sn2871_access); /* 664 */ + +static int sn2871_user_space_probe(struct platform_device *dev) +{ + int ret_device_file = 0; + + battery_xlog_printk(BAT_LOG_CRTI, "******** sn2871_user_space_probe!! ********\n"); + + ret_device_file = device_create_file(&(dev->dev), &dev_attr_sn2871_access); + + return 0; +} + +struct platform_device sn2871_user_space_device = { + .name = "sn2871-user", + .id = -1, +}; + +static struct platform_driver sn2871_user_space_driver = { + .probe = sn2871_user_space_probe, + .driver = { + .name = "sn2871-user", + }, +}; + +#ifdef CONFIG_OF +static const struct of_device_id sn2871_of_match[] = { + {.compatible = "mediatek,sw_charger"}, + {}, +}; +#else +static struct i2c_board_info i2c_sn2871 __initdata = { + I2C_BOARD_INFO("sn2871", (0x5b)) +}; +#endif + +static struct i2c_driver sn2871_driver = { + .driver = { + .name = "sn2871", +#ifdef CONFIG_OF + .of_match_table = sn2871_of_match, +#endif + }, + .probe = sn2871_driver_probe, + .id_table = sn2871_i2c_id, +}; + +static int __init sn2871_init(void) +{ + int ret = 0; + + /* i2c registeration using DTS instead of boardinfo*/ +#ifdef CONFIG_OF + battery_xlog_printk(BAT_LOG_CRTI, "[sn2871_init] init start with i2c DTS"); +#else + battery_xlog_printk(BAT_LOG_CRTI, "[sn2871_init] init start. ch=%d\n", sn2871_BUSNUM); + i2c_register_board_info(sn2871_BUSNUM, &i2c_sn2871, 1); +#endif + if (i2c_add_driver(&sn2871_driver) != 0) { + battery_xlog_printk(BAT_LOG_CRTI, + "[sn2871_init] failed to register sn2871 i2c driver.\n"); + } else { + battery_xlog_printk(BAT_LOG_CRTI, + "[sn2871_init] Success to register sn2871 i2c driver.\n"); + } + + /* sn2871 user space access interface */ + ret = platform_device_register(&sn2871_user_space_device); + if (ret) { + battery_xlog_printk(BAT_LOG_CRTI, "****[sn2871_init] Unable to device register(%d)\n", + ret); + return ret; + } + ret = platform_driver_register(&sn2871_user_space_driver); + if (ret) { + battery_xlog_printk(BAT_LOG_CRTI, "****[sn2871_init] Unable to register driver (%d)\n", + ret); + return ret; + } + + return 0; +} + +static void __exit sn2871_exit(void) +{ + i2c_del_driver(&sn2871_driver); +} +module_init(sn2871_init); +module_exit(sn2871_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("I2C sn2871 Driver"); +MODULE_AUTHOR("will cai "); diff --git a/drivers/misc/mediatek/power/mt8127/sn2871.h b/drivers/misc/mediatek/power/mt8127/sn2871.h new file mode 100644 index 00000000000..482475659e0 --- /dev/null +++ b/drivers/misc/mediatek/power/mt8127/sn2871.h @@ -0,0 +1,377 @@ +/***************************************************************************** +* +* Filename: +* --------- +* sn2871.h +* +* Project: +* -------- +* Android +* +* Description: +* ------------ +* sn2871 header file +* +* Author: +* ------- +* +****************************************************************************/ +#ifndef _sn2871_SW_H_ +#define _sn2871_SW_H_ + +#define sn2871_CON0 0x00 +#define sn2871_CON1 0x01 +#define sn2871_CON2 0x02 +#define sn2871_CON3 0x03 +#define sn2871_CON4 0x04 +#define sn2871_CON5 0x05 +#define sn2871_CON6 0x06 +#define sn2871_CON7 0x07 +#define sn2871_CON8 0x08 +#define sn2871_CON9 0x09 +#define sn2871_CONA 0x0A +#define sn2871_CONB 0x0B +#define sn2871_CONC 0x0C +#define sn2871_COND 0x0D +#define sn2871_CONE 0x0E +#define sn2871_CON11 0X11 +#define sn2871_CON12 0x12 +#define sn2871_CON13 0x13 +#define sn2871_CON14 0x14 + +#define sn2871_REG_NUM 21 +#define CON1_RESET_MASK 0x1 +#define CON1_RESET_SHIFT 7 + + + + + + +/* CON0 */ +#define CON0_EN_HIZ_MASK 0x1 +#define CON0_EN_HIZ_SHIFT 7 + +#define CON0_EN_ILIM_MASK 0x1 +#define CON0_EN_ILIM_SHIFT 6 + +#define CON0_IINLIM_MASK 0x3F +#define CON0_IINLIM_SHIFT 0 + + +/* CON1 */ +#define CON1_VINDPM_OS_MASK 0x1F +#define CON1_VINDPM_OS_SHIFT 0 + + +/* CON2 */ +#define CON2_CONV_START_MASK 0x1 +#define CON2_CONV_START_SHIFT 7 + +#define CON2_CONV_RATE_MASK 0x1 +#define CON2_CONV_RATE_SHIFT 6 + +#define CON2_BOOST_FREQ_MASK 0x1 +#define CON2_BOOST_FREQ_SHIFT 5 + +#define CON2_ICO_EN_MASK 0x1 +#define CON2_ICO_EN_RATE_SHIFT 4 + +#define CON2_HVDCP_EN_MASK 0x1 +#define CON2_HVDCP_EN_SHIFT 3 + +#define CON2_MAX_EN_MASK 0x1 +#define CON2_MAX_EN_SHIFT 2 + +#define CON2_FORCE_DPDM_MASK 0x1 +#define CON2_FORCE_DPDM_SHIFT 1 + +#define CON2_AUTO_DPDM_EN_MASK 0x1 +#define CON2_AUTO_DPDM_EN_SHIFT 0 + + + + +/* CON3 */ +#define CON3_BAT_LOADEN_MASK 0x1 +#define CON3_BAT_LOADEN_SHIFT 7 + +#define CON3_WD_MASK 0x1 +#define CON3_WD_SHIFT 6 + +#define CON3_OTG_CONFIG_MASK 0x1 +#define CON3_OTG_CONFIG_SHIFT 5 + +#define CON3_CHG_CONFIG_MASK 0x1 +#define CON3_CHG_CONFIG_SHIFT 4 + +#define CON3_SYS_V_LIMIT_MASK 0x7 +#define CON3_SYS_V_LIMIT_SHIFT 1 + + + +/* CON4 */ +#define CON4_EN_PUMPX_MASK 0x1 +#define CON4_EN_PUMPX_SHIFT 7 + +#define CON4_ICHG_MASK 0x7F +#define CON4_ICHG_SHIFT 0 + +/* CON5 */ +#define CON5_IPRECHG_MASK 0xF +#define CON5_IPRECHG_SHIFT 4 + +#define CON5_ITERM_MASK 0xF +#define CON5_ITERM_SHIFT 0 + + + +/* CON6 */ +#define CON6_2XTMR_EN_MASK 0x3F +#define CON6_2XTMR_EN_SHIFT 2 + +#define CON6_BATLOWV_MASK 0x1 +#define CON6_BATLOWV_SHIFT 1 + +#define CON6_VRECHG_MASK 0x1 +#define CON6_VRECHG_SHIFT 0 + +/* CON7 */ + +#define CON7_EN_TERM_CHG_MASK 0x1 +#define CON7_EN_TERM_CHG_SHIFT 7 + +#define CON7_STAT_DIS_MASK 0x1 +#define CON7_STAT_DIS_SHIFT 6 + +#define CON7_WTG_TIM_SET_MASK 0x3 +#define CON7_WTG_TIM_SET_SHIFT 4 + +#define CON7_EN_TIMER_MASK 0x1 +#define CON7_EN_TIMER_SHIFT 3 + +#define CON7_SET_CHG_TIM_MASK 0x3 +#define CON7_SET_CHG_TIM_SHIFT 1 + +#define CON7_JEITA_ISET_MASK 0x1 +#define CON7_JEITA_ISET_SHIFT 0 +/* CON8 */ +#define CON8_TREG_MASK 0x3 +#define CON8_TREG_SHIFT 0 + +#define CON8_VCLAMP_MASK 0x7 +#define CON8_VCLAMP_SHIFT 2 + +#define CON8_BAT_COMP_MASK 0x7 +#define CON8_BAT_COMP_SHIFT 5 +/* CON9 */ + +#define CON9_PUMPX_UP 0x1 +#define CON9_PUMPX_UP_SHIFT 1 + +#define CON9_PUMPX_DN 0x1 +#define CON9_PUMPX_DN_SHIFT 0 + +/* CONA */ +#define CONA_BOOST_VLIM_MASK 0xF +#define CONA_BOOST_VLIM_SHIFT 4 + +#define CONA_BOOST_ILIM_MASK 0x07 +#define CONA_BOOST_ILIM_SHIFT 0 + + +/* CONB */ + +#define CONB_VBUS_STAT_MASK 0x7 +#define CONB_VBUS_STAT_SHIFT 5 + +#define CONB_CHRG_STAT_MASK 0x3 +#define CONB_CHRG_STAT_SHIFT 3 + +#define CONB_PG_STAT_MASK 0x1 +#define CONB_PG_STAT_SHIFT 2 + +#define CONB_SDP_STAT_MASK 0x1 +#define CONB_SDP_STAT_SHIFT 1 + +#define CONB_VSYS_STAT_MASK 0x1 +#define CONB_VSYS_STAT_SHIFT 0 + + +/* CONC */ + +#define CONB_WATG_STAT_MASK 0x1 +#define CONB_WATG_STAT_SHIFT 7 + +#define CONB_BOOST_STAT_MASK 0x1 +#define CONB_BOOST_STAT_SHIFT 6 + +#define CONC_CHRG_FAULT_MASK 0x3 +#define CONC_CHRG_FAULT_SHIFT 4 + +#define CONB_BAT_STAT_MASK 0x1 +#define CONB_BAT_STAT_SHIFT 3 + +/* COND */ +#define COND_FORCE_VINDPM_MASK 0x01 +#define COND_FORCE_VINDPM_SHIFT 7 + +#define COND_VINDPM_MASK 0x7F +#define COND_VINDPM_SHIFT 0 + +/* CONE */ +#define CONE_VBAT_MASK 0x7F +#define CONE_VBAT_SHIFT 0 + +/* CON11 */ +#define CON11_VBUS_MASK 0x7F +#define CON11_VBUS_SHIFT 0 +/* CON12 */ + +#define CONB_ICHG_STAT_MASK 0x7F +#define CONB_ICHG_STAT_SHIFT 0 + +/* CON13 */ +#define CON13_IDPM_STAT_MASK 0x1 +#define CON13_IDPM_STAT_SHIFT 6 + +#define CON13_VDPM_STAT_MASK 0x1 +#define CON13_VDPM_STAT_SHIFT 7 + +/* CON14*/ +#define CON14_DEV_REV_MASK 0x3 +#define CON14_DEV_REV_SHIFT 0 + + +/********************************************************** + * + * [Extern Function] + * + *********************************************************/ +/* CON0---------------------------------------------------- */ +extern void sn2871_set_en_hiz(unsigned int val); +extern void sn2871_set_en_ilim(unsigned int val); +void sn2871_set_iinlim(unsigned int val); + +/* CON1---------------------------------------------------- */ +/* willcai */ +extern void sn2871_set_vindpm(unsigned int val); +/* */ + +/* CON2---------------------------------------------------- */ +extern void sn2871_ADC_start(unsigned int val); +extern void sn2871_set_ADC_rate(unsigned int val); +extern void sn2871_set_ico_en_start(unsigned int val); +/* */ + + +/* CON3---------------------------------------------------- */ +/* willcai */ +extern void sn2871_wd_reset(unsigned int val); +extern void sn2871_otg_en(unsigned int val); +extern void sn2871_chg_en(unsigned int val); +extern void sn2871_set_sys_min(unsigned int val); +/* */ + + +/* CON4---------------------------------------------------- */ + +/* willcai */ +extern void sn2871_en_pumpx(unsigned int val); +extern void sn2871_set_ichg(unsigned int val); + +/* */ + +/* CON5---------------------------------------------------- */ + +/* willcai */ +extern void sn2871_set_iprechg(unsigned int val); +extern void sn2871_set_iterml(unsigned int val); +/* */ + + +/* CON6---------------------------------------------------- */ +/* willcai */ +extern void sn2871_set_vreg(unsigned int val); +extern void sn2871_set_batlowv(unsigned int val); +extern void sn2871_set_vrechg(unsigned int val); + + +/* con7 */ + +extern void sn2871_en_term_chg(unsigned int val); +extern void sn2871_en_state_dis(unsigned int val); +extern void sn2871_set_wd_timer(unsigned int val); +extern void sn2871_en_chg_timer(unsigned int val); + +extern void sn2871_set_chg_timer(unsigned int val); + + +/* con8 */ +extern void sn2871_set_thermal_regulation(unsigned int val); +extern void sn2871_set_VBAT_clamp(unsigned int val); +extern void sn2871_set_VBAT_IR_compensation(unsigned int val); +/* con9 */ +void sn2871_pumpx_up(unsigned int val); + + + + +/* --------------------------------------------------------- */ +extern void sn2871_dump_register(void); +extern unsigned int sn2871_reg_config_interface(unsigned char RegNum, unsigned char val); + +extern unsigned int sn2871_read_interface(unsigned char RegNum, unsigned char *val, unsigned char MASK, + unsigned char SHIFT); +extern unsigned int sn2871_config_interface(unsigned char RegNum, unsigned char val, unsigned char MASK, + unsigned char SHIFT); +/* +*static void hw_bc11_dump_register(void); +*static void hw_bc11_init(void); +*static U32 hw_bc11_DCD(void); +*static U32 hw_bc11_stepA1(void); +*static U32 hw_bc11_stepB1(void); +*static U32 hw_bc11_stepC1(void); +*static U32 hw_bc11_stepA2(void); +*static U32 hw_bc11_stepB2(void); +*static void hw_bc11_done(void); +*/ +/* CONA */ +extern void sn2871_set_boost_ilim(unsigned int val); +extern void sn2871_set_boost_vlim(unsigned int val); + +/* CONB */ +unsigned int sn2871_get_vbus_state(void); +unsigned int sn2871_get_chrg_state(void); +unsigned int sn2871_get_pg_state(void); +unsigned int sn2871_get_sdp_state(void); +unsigned int sn2871_get_vsys_state(void); +unsigned int sn2871_get_wdt_state(void); +unsigned int sn2871_get_boost_state(void); +unsigned int sn2871_get_chrg_fault_state(void); +unsigned int sn2871_get_bat_state(void); +unsigned int sn2871_get_ichg(void); + +/* CON0D */ +extern void sn2871_set_FORCE_VINDPM(unsigned int val); +extern void sn2871_set_VINDPM(unsigned int val); + +/* CON11 */ +extern unsigned int sn2871_get_vbus(void); + +/* aggregated APIs */ +extern void sn2871_hw_init(void); +extern void sn2871_charging_enable(unsigned int bEnable); +extern void sn2871_dump_register(void); +extern unsigned int sn2871_get_chrg_stat(void); + +extern kal_bool sn2871_is_found; + + +/*CON13*/ +unsigned int sn2871_get_idpm_state(void); +unsigned int sn2871_get_vdpm_state(void); + +/*Added for debuging to check power off caller*/ +extern void dump_stack(void); +#endif diff --git a/drivers/misc/mediatek/power/mt8127/tbl_helper_func.c b/drivers/misc/mediatek/power/mt8127/tbl_helper_func.c index a932e20d7a7..efb16e1f9e1 100644 --- a/drivers/misc/mediatek/power/mt8127/tbl_helper_func.c +++ b/drivers/misc/mediatek/power/mt8127/tbl_helper_func.c @@ -21,6 +21,10 @@ #include "bq24296.h" #endif +#ifdef CONFIG_MTK_SN2871_SUPPORT +#include "sn2871.h" +#endif + #ifdef CONFIG_MTK_NCP1851_SUPPORT #include "ncp1851.h" #endif @@ -65,12 +69,32 @@ void tbl_charger_otg_vbus(int mode) bq24297_set_en_hiz(0x0); #endif -#ifdef CONFIG_MTK_BQ24296_SUPPORT +#if defined(CONFIG_MTK_BQ24296_SUPPORT) && defined(CONFIG_MTK_SN2871_SUPPORT) + if (bq24296_is_found == KAL_TRUE) { bq24296_set_chg_config(0x0); //disable charge bq24296_set_otg_config(0x1); //OTG bq24296_set_boostv(0x7); //boost voltage 4.998V bq24296_set_boost_lim(0x1); //1.5A on VBUS bq24296_set_en_hiz(0x0); + } else if (sn2871_is_found == KAL_TRUE) { + sn2871_chg_en(0x0); //OTG + sn2871_otg_en(0x1); //OTG + sn2871_set_boost_vlim(0x7); //boost voltage 4.998V + sn2871_set_boost_ilim(0x3); //1.4A on VBUS + sn2871_set_en_hiz(0x0); + } else { + bq24296_set_chg_config(0x0); //disable charge + bq24296_set_otg_config(0x1); //OTG + bq24296_set_boostv(0x7); //boost voltage 4.998V + bq24296_set_boost_lim(0x1); //1.5A on VBUS + bq24296_set_en_hiz(0x0); + } +#elif defined(CONFIG_MTK_BQ24296_SUPPORT) + bq24296_set_chg_config(0x0); //disable charge + bq24296_set_otg_config(0x1); //OTG + bq24296_set_boostv(0x7); //boost voltage 4.998V + bq24296_set_boost_lim(0x1); //1.5A on VBUS + bq24296_set_en_hiz(0x0); #endif #ifdef CONFIG_MTK_NCP1851_SUPPORT @@ -104,9 +128,20 @@ void tbl_charger_otg_vbus(int mode) bq24297_set_otg_config(0x0); //OTG & Charge disabled #endif -#ifdef CONFIG_MTK_BQ24296_SUPPORT +#if defined(CONFIG_MTK_BQ24296_SUPPORT) && defined(CONFIG_MTK_SN2871_SUPPORT) + if (bq24296_is_found == KAL_TRUE) { bq24296_set_otg_config(0x0); //OTG disabled bq24296_set_chg_config(0x0); //Charge disabled + } else if (sn2871_is_found == KAL_TRUE) { + sn2871_otg_en(0x0); + sn2871_chg_en(0x0); + } else { + bq24296_set_otg_config(0x0); //OTG disabled + bq24296_set_chg_config(0x0); //Charge disabled + } +#elif defined(CONFIG_MTK_BQ24296_SUPPORT) + bq24296_set_otg_config(0x0); //OTG disabled + bq24296_set_chg_config(0x0); //Charge disabled #endif #ifdef CONFIG_MTK_NCP1851_SUPPORT diff --git a/drivers/misc/mediatek/ptgen/.gitignore b/drivers/misc/mediatek/ptgen/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/drivers/misc/mediatek/ram_console/mtk_ram_console.c b/drivers/misc/mediatek/ram_console/mtk_ram_console.c index 069b92cbd9c..dae0676f32d 100644 --- a/drivers/misc/mediatek/ram_console/mtk_ram_console.c +++ b/drivers/misc/mediatek/ram_console/mtk_ram_console.c @@ -131,7 +131,6 @@ static size_t ram_console_buffer_size; static DEFINE_SPINLOCK(ram_console_lock); -static atomic_t rc_in_fiq = ATOMIC_INIT(0); #ifdef __aarch64__ static void *_memcpy(void *dest, const void *src, size_t count) @@ -350,7 +349,6 @@ void aee_sram_fiq_save_bin(const char *msg, size_t len) len -= len % 4; } - atomic_set(&rc_in_fiq, 1); while ((delay > 0) && (spin_is_locked(&ram_console_lock))) { udelay(1); @@ -373,8 +371,6 @@ void aee_sram_fiq_save_bin(const char *msg, size_t len) void aee_disable_ram_console_write(void) { - atomic_set(&rc_in_fiq, 1); - return; } void aee_sram_fiq_log(const char *msg) @@ -386,7 +382,6 @@ void aee_sram_fiq_log(const char *msg) return; } - atomic_set(&rc_in_fiq, 1); while ((delay > 0) && (spin_is_locked(&ram_console_lock))) { udelay(1); @@ -401,8 +396,6 @@ void ram_console_write(struct console *console, const char *s, unsigned int coun { unsigned long flags; - if (atomic_read(&rc_in_fiq)) - return; spin_lock_irqsave(&ram_console_lock, flags); @@ -455,6 +448,12 @@ static void __init ram_console_save_old(struct ram_console_buffer *buffer) header_size = buffer->off_console; else header_size = buffer->off_linux + ALIGN(sizeof(struct last_reboot_reason), 64); + + if (header_size > 8192) { + pr_err("ram_console: invalid head_size[%x], skip saving old log\n", header_size); + return; + } + pr_err("ram_console: old_header[%p], buffer[%p], header_size[%x]\n", ram_console_old_header, buffer, header_size); memcpy(ram_console_old_header, buffer, header_size); if (ram_console_old_header->off_pl == 0 || ram_console_old_header->off_pl + ALIGN(ram_console_old_header->sz_pl, 64) != ram_console_old_header->off_lpl) { @@ -466,18 +465,18 @@ static void __init ram_console_save_old(struct ram_console_buffer *buffer) } pr_err("ram_console:bin_log_count[%x]\n", buffer->bin_log_count); if (buffer->bin_log_count == 0) { - ram_console_old_log_init_buffer = kmalloc(total_size, GFP_KERNEL); + ram_console_old_log_init_buffer = kmalloc(old_log_size, GFP_KERNEL); if (ram_console_old_log_init_buffer == NULL) { pr_err("ram_console: failed to allocate old buffer\n"); return; } ram_console_old_log = ram_console_old_log_init_buffer; - ram_console_old_log_size = total_size; + ram_console_old_log_size = old_log_size; memcpy(ram_console_old_log_init_buffer, - rc_console + buffer->start, buffer->size - buffer->start); - memcpy(ram_console_old_log_init_buffer + buffer->size - buffer->start, + rc_console + buffer->start, old_log_size - buffer->start); + memcpy(ram_console_old_log_init_buffer + old_log_size - buffer->start, rc_console, buffer->start); } else { bin_log_size = buffer->bin_log_count * 5 / 4; /* bin: 12 34 56 78-->ascill: 78654321z */ @@ -546,23 +545,29 @@ static int __init ram_console_init(struct ram_console_buffer *buffer, size_t buf if (ram_console_old_header == 0) { pr_err("ram_console: failed to kmalloc 0x%zx\n", buffer_size); } + if (buffer->sig != REBOOT_REASON_SIG) { pr_err("ram_console: sig mismatch(0x%08x)\n", buffer->sig); memset((void*)buffer, 0, buffer_size); buffer->sig = REBOOT_REASON_SIG; } - if (buffer->off_console != 0 && buffer->off_linux + ALIGN(sizeof(struct last_reboot_reason), 64) == buffer->off_console) { - pr_err("ram_console: log size 0x%x, start 0x%x\n", buffer->size, buffer->start); + if ((buffer->off_console != 0 && buffer->off_linux + ALIGN(sizeof(struct last_reboot_reason), 64) == buffer->off_console) && + (buffer->size != 0)) { + pr_err("ram_console: log size 0x%x, start 0x%x, off_console 0x%x, buffer_size 0x%x\n", buffer->size, buffer->start, buffer->off_console, buffer_size); ram_console_save_old(buffer); } else { + pr_err("ram_console: no valid old log is found\n"); if (buffer->sz_lk != 0 && buffer->off_lk + ALIGN(buffer->sz_lk, 64) == buffer->off_llk) buffer->off_linux = buffer->off_llk + ALIGN(buffer->sz_lk, 64); else buffer->off_linux = 512; /* OTA:leave enough space for pl/lk */ + + /* Avoid invalid off_linux overflows buffer */ + buffer->off_linux = min(buffer->off_linux, (uint32_t)((char*)buffer + (buffer_size / 2))); buffer->off_console = buffer->off_linux + ALIGN(sizeof(struct last_reboot_reason), 64); } ram_console_buffer_size = buffer_size - buffer->off_console; - memset((void*)buffer + buffer->off_linux, 0, buffer_size - buffer->off_linux); + memset((char*)buffer + buffer->off_linux, 0, buffer_size - buffer->off_linux); register_console(&ram_console); @@ -725,23 +730,26 @@ static int __init ram_console_late_init(void) str_real_len = - sprintf(ram_console_header_buffer, "ram console header, hw_status: %u, fiq step %u.\n", - LAST_RRPL_VAL(wdt_status), LAST_RRR_VAL(fiq_step)); + sprintf(ram_console_header_buffer, "ram console header, hw_status: %u, fiq step %u, dpidle %u.\n", + LAST_RRPL_VAL(wdt_status), LAST_RRR_VAL(fiq_step), LAST_RRR_VAL(deepidle_data)); str_real_len += sprintf(ram_console_header_buffer + str_real_len, "bin log %d.\n", ram_console_old_header->bin_log_count); - ram_console_old_log = kmalloc(ram_console_old_log_size + str_real_len, GFP_KERNEL); + ram_console_old_log = kmalloc(ram_console_old_log_size + str_real_len + 1, GFP_KERNEL); if (ram_console_old_log == NULL) { pr_err("ram_console: failed to allocate buffer for old log\n"); ram_console_old_log_size = 0; kfree(ram_console_header_buffer); return 0; } - memcpy(ram_console_old_log, ram_console_header_buffer, str_real_len); - memcpy(ram_console_old_log + str_real_len, + memcpy(ram_console_old_log, ram_console_old_log_init_buffer, ram_console_old_log_size); + memcpy(ram_console_old_log + ram_console_old_log_size, ram_console_header_buffer, str_real_len); + + /* append string terminator at the end of buffer */ + ram_console_old_log[ram_console_old_log_size + str_real_len] = 0; kfree(ram_console_header_buffer); kfree(ram_console_old_log_init_buffer); diff --git a/drivers/misc/mediatek/rtc/mt8127/mtk_rtc_hal.c b/drivers/misc/mediatek/rtc/mt8127/mtk_rtc_hal.c index ccf10cf9fcf..637a8010228 100644 --- a/drivers/misc/mediatek/rtc/mt8127/mtk_rtc_hal.c +++ b/drivers/misc/mediatek/rtc/mt8127/mtk_rtc_hal.c @@ -206,6 +206,28 @@ u16 hal_rtc_get_register_status(const char * cmd) return 0; else return 1; + } else if (!strcmp(cmd, "LPRST")) { + spar0 = rtc_read(RTC_SPAR0); + hal_rtc_xinfo("LPRST status(RTC_SPAR0=0x%x\n", spar0); + + if (spar0 & RTC_SPAR0_LONG_PRESS_RST) + return 1; + else + return 0; + } else if (!strcmp(cmd, "ENTER_KPOC")) { + spar0 = rtc_read(RTC_SPAR0); + hal_rtc_xinfo("ENTER_KPOC status(RTC_SPAR0=0x%x\n", spar0); + + if (spar0 & RTC_SPAR0_ENTER_KPOC) + return 1; + else + return 0; + } else if (!strcmp(cmd, "REBOOT_REASON")) { + spar0 = rtc_read(RTC_SPAR0); + hal_rtc_xinfo("REBOOT_REASON status(RTC_SPAR0=0x%x)\n", spar0); + + return (spar0 >> RTC_SPAR0_REBOOT_REASON_SHIFT) + & RTC_SPAR0_REBOOT_REASON_MASK; } return 0; @@ -285,7 +307,7 @@ void hal_rtc_set_writeif(bool enable) void hal_rtc_mark_mode(const char *cmd) { - u16 pdn1; + u16 pdn1, spar0; if (!strcmp(cmd, "recv")) { pdn1 = rtc_read(RTC_PDN1) & (~RTC_PDN1_RECOVERY_MASK); @@ -298,7 +320,29 @@ void hal_rtc_mark_mode(const char *cmd) else if (!strcmp(cmd, "fast")) { pdn1 = rtc_read(RTC_PDN1) & (~RTC_PDN1_FAST_BOOT); rtc_write(RTC_PDN1, pdn1 | RTC_PDN1_FAST_BOOT); + } else if (!strcmp(cmd, "enter_kpoc")) { + spar0 = rtc_read(RTC_SPAR0) & (~RTC_SPAR0_ENTER_KPOC); + rtc_write(RTC_SPAR0, spar0 | RTC_SPAR0_ENTER_KPOC); + } else if (!strcmp(cmd, "clear_lprst")) { + spar0 = rtc_read(RTC_SPAR0) & (~RTC_SPAR0_LONG_PRESS_RST); + rtc_write(RTC_SPAR0, spar0); + } else if (!strcmp(cmd, "enter_lprst")) { + spar0 = rtc_read(RTC_SPAR0) & (~RTC_SPAR0_LONG_PRESS_RST); + rtc_write(RTC_SPAR0, spar0 | RTC_SPAR0_LONG_PRESS_RST); + } else if (!strcmp(cmd, "enter_sw_lprst")) { + spar0 = rtc_read(RTC_SPAR0) & (~RTC_SPAR0_SW_LONG_PRESS_RST); + rtc_write(RTC_SPAR0, spar0 | RTC_SPAR0_SW_LONG_PRESS_RST); + } else if (!strncmp(cmd, "reboot", 6)) { + u16 spar0, reason; + spar0 = rtc_read(RTC_SPAR0) & RTC_SPAR0_CLEAR_REBOOT_REASON; + reason = (cmd[6] - '0') & RTC_SPAR0_REBOOT_REASON_MASK; + rtc_write(RTC_SPAR0, spar0 + | (reason << RTC_SPAR0_REBOOT_REASON_SHIFT)); + } else if (!strcmp(cmd, "rpmbp")) { + spar0 = rtc_read(RTC_SPAR0) & (~RTC_SPAR0_RPMB_PROGRAM_FLAG); + rtc_write(RTC_SPAR0, spar0 | RTC_SPAR0_RPMB_PROGRAM_FLAG); } + rtc_write_trigger(); } @@ -442,6 +486,11 @@ static void rtc_get_tick(struct rtc_time *tm) { tm->tm_year = rtc_read(RTC_TC_YEA); } void hal_rtc_get_tick_time(struct rtc_time *tm) { + u16 bbpu; + + bbpu = rtc_read(RTC_BBPU) | RTC_BBPU_KEY | RTC_BBPU_RELOAD; + rtc_write(RTC_BBPU, bbpu); + rtc_write_trigger(); rtc_get_tick(tm); if (rtc_read(RTC_TC_SEC) < tm->tm_sec) { /* SEC has carried */ rtc_get_tick(tm); @@ -493,12 +542,12 @@ void hal_rtc_get_alarm_time(struct rtc_time *tm, struct rtc_wkalrm *alm) { u16 irqen, pdn2; irqen = rtc_read(RTC_IRQ_EN); - tm->tm_sec = rtc_read(RTC_AL_SEC); + tm->tm_sec = rtc_read(RTC_AL_SEC) & RTC_AL_SEC_MASK; tm->tm_min = rtc_read(RTC_AL_MIN); tm->tm_hour = rtc_read(RTC_AL_HOU) & RTC_AL_HOU_MASK; tm->tm_mday = rtc_read(RTC_AL_DOM) & RTC_AL_DOM_MASK; tm->tm_mon = rtc_read(RTC_AL_MTH) & RTC_AL_MTH_MASK; - tm->tm_year = rtc_read(RTC_AL_YEA); + tm->tm_year = rtc_read(RTC_AL_YEA) & RTC_AL_YEA_MASK; pdn2 = rtc_read(RTC_PDN2); alm->enabled = !!(irqen & RTC_IRQ_EN_AL); alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM); /* return Power-On Alarm bit */ @@ -512,12 +561,12 @@ void hal_rtc_set_alarm_time(struct rtc_time *tm) { hal_rtc_xinfo("a = %d\n",(rtc_read(RTC_AL_MTH)& (RTC_NEW_SPARE3))|tm->tm_mon); hal_rtc_xinfo("b = %d\n",(rtc_read(RTC_AL_DOM)& (RTC_NEW_SPARE1))|tm->tm_mday); hal_rtc_xinfo("c = %d\n",(rtc_read(RTC_AL_HOU)& (RTC_NEW_SPARE_FG_MASK))|tm->tm_hour); - rtc_write(RTC_AL_YEA, tm->tm_year); + rtc_write(RTC_AL_YEA, (rtc_read(RTC_AL_YEA) & ~(RTC_AL_YEA_MASK)) | (tm->tm_year & RTC_AL_YEA_MASK)); rtc_write(RTC_AL_MTH, (rtc_read(RTC_AL_MTH) & (RTC_NEW_SPARE3))|tm->tm_mon); rtc_write(RTC_AL_DOM, (rtc_read(RTC_AL_DOM) & (RTC_NEW_SPARE1))|tm->tm_mday); rtc_write(RTC_AL_HOU, (rtc_read(RTC_AL_HOU) & (RTC_NEW_SPARE_FG_MASK))|tm->tm_hour); rtc_write(RTC_AL_MIN, tm->tm_min); - rtc_write(RTC_AL_SEC, tm->tm_sec); + rtc_write(RTC_AL_SEC, rtc_read(RTC_AL_SEC) & (~RTC_AL_SEC_MASK) | (tm->tm_sec & RTC_AL_SEC_MASK)); rtc_write(RTC_AL_MASK, RTC_AL_MASK_DOW); /* mask DOW */ rtc_write_trigger(); irqen = rtc_read(RTC_IRQ_EN) | RTC_IRQ_EN_ONESHOT_AL; @@ -525,7 +574,8 @@ void hal_rtc_set_alarm_time(struct rtc_time *tm) { rtc_write_trigger(); } -void hal_rtc_clear_alarm(void) { +void hal_rtc_clear_alarm(struct rtc_time *tm) +{ u16 irqsta, irqen, pdn2; irqen = rtc_read(RTC_IRQ_EN) & ~RTC_IRQ_EN_AL; @@ -534,6 +584,13 @@ void hal_rtc_clear_alarm(void) { rtc_write(RTC_PDN2, pdn2); rtc_write_trigger(); irqsta = rtc_read(RTC_IRQ_STA); /* read clear */ + + rtc_write(RTC_AL_YEA, (rtc_read(RTC_AL_YEA) & ~(RTC_AL_YEA_MASK)) | (tm->tm_year & RTC_AL_YEA_MASK)); + rtc_write(RTC_AL_MTH, (rtc_read(RTC_AL_MTH)&0xff00)|tm->tm_mon); + rtc_write(RTC_AL_DOM, (rtc_read(RTC_AL_DOM)&0xff00)|tm->tm_mday); + rtc_write(RTC_AL_HOU, (rtc_read(RTC_AL_HOU)&0xff00)|tm->tm_hour); + rtc_write(RTC_AL_MIN, tm->tm_min); + rtc_write(RTC_AL_SEC, tm->tm_sec); } void hal_rtc_set_lp_irq(void) { diff --git a/drivers/misc/mediatek/rtc/mtk_rtc_common.c b/drivers/misc/mediatek/rtc/mtk_rtc_common.c index 4c21e7e12f7..5236933b091 100644 --- a/drivers/misc/mediatek/rtc/mtk_rtc_common.c +++ b/drivers/misc/mediatek/rtc/mtk_rtc_common.c @@ -1,4 +1,5 @@ /* + * Copyright (C) 2010 MediaTek, Inc. * * @@ -63,6 +64,7 @@ #include #include #endif +#include #include /* custom file */ /* #include */ @@ -231,6 +233,56 @@ bool crystal_exist_status(void) } EXPORT_SYMBOL(crystal_exist_status); +static unsigned long rtc_lock_flags; +void rtc_acquire_lock(void) +{ + spin_lock_irqsave(&rtc_lock, rtc_lock_flags); +} +EXPORT_SYMBOL(rtc_acquire_lock); + +void rtc_release_lock(void) +{ + spin_unlock_irqrestore(&rtc_lock, rtc_lock_flags); +} +EXPORT_SYMBOL(rtc_release_lock); + +bool rtc_lprst_detected(void) +{ + unsigned long flags; + u16 ret; + + spin_lock_irqsave(&rtc_lock, flags); + ret = hal_rtc_get_register_status("LPRST"); + spin_unlock_irqrestore(&rtc_lock, flags); + + return ret; +} + +bool rtc_enter_kpoc_detected(void) +{ + unsigned long flags; + u16 ret; + + spin_lock_irqsave(&rtc_lock, flags); + ret = hal_rtc_get_register_status("ENTER_KPOC"); + spin_unlock_irqrestore(&rtc_lock, flags); + + return ret; +} + +int rtc_get_reboot_reason(void) +{ + unsigned long flags; + u16 ret; + + spin_lock_irqsave(&rtc_lock, flags); + ret = hal_rtc_get_register_status("REBOOT_REASON"); + spin_unlock_irqrestore(&rtc_lock, flags); + + return ret; +} +EXPORT_SYMBOL(rtc_get_reboot_reason); + /* * Only for GPS to check the status. * Others do not use this API @@ -348,6 +400,15 @@ void rtc_mark_kpoc(void) hal_rtc_mark_mode("kpoc"); spin_unlock_irqrestore(&rtc_lock, flags); } + +void rtc_mark_enter_kpoc(void) +{ + unsigned long flags; + + spin_lock_irqsave(&rtc_lock, flags); + hal_rtc_mark_mode("enter_kpoc"); + spin_unlock_irqrestore(&rtc_lock, flags); +} #endif void rtc_mark_fast(void) { @@ -358,6 +419,55 @@ void rtc_mark_fast(void) spin_unlock_irqrestore(&rtc_lock, flags); } +void rtc_mark_clear_lprst(void) +{ + unsigned long flags; + + spin_lock_irqsave(&rtc_lock, flags); + hal_rtc_mark_mode("clear_lprst"); + spin_unlock_irqrestore(&rtc_lock, flags); +} + +void rtc_mark_enter_lprst(void) +{ + unsigned long flags; + + spin_lock_irqsave(&rtc_lock, flags); + hal_rtc_mark_mode("enter_lprst"); + spin_unlock_irqrestore(&rtc_lock, flags); +} + +void rtc_mark_enter_sw_lprst(void) +{ + unsigned long flags; + + spin_lock_irqsave(&rtc_lock, flags); + hal_rtc_mark_mode("enter_sw_lprst"); + spin_unlock_irqrestore(&rtc_lock, flags); +} + +void rtc_mark_reboot_reason(int reason) +{ + unsigned long flags; + char buf[8]; + + strcpy(buf, "reboot?"); + buf[6] = (reason & RTC_SPAR0_REBOOT_REASON_MASK) + '0'; + spin_lock_irqsave(&rtc_lock, flags); + hal_rtc_mark_mode(buf); + spin_unlock_irqrestore(&rtc_lock, flags); +} +EXPORT_SYMBOL(rtc_mark_reboot_reason); + +void rtc_mark_rpmbp(void) +{ + unsigned long flags; + + spin_lock_irqsave(&rtc_lock, flags); + hal_rtc_mark_mode("rpmbp"); + spin_unlock_irqrestore(&rtc_lock, flags); +} + u16 rtc_rdwr_uart_bits(u16 *val) { u16 ret; @@ -413,6 +523,10 @@ static void rtc_handler(void) spin_unlock(&rtc_lock); return; } + if (unlikely(NULL == rtc)) { + spin_unlock(&rtc_lock); + return; + } #if RTC_RELPWR_WHEN_XRST /* set AUTO bit because AUTO = 0 when PWREN = 1 and alarm occurs */ hal_rtc_reload_power(); @@ -449,7 +563,12 @@ static void rtc_handler(void) pwron_alm = true; #endif } else if (now_time < time) { /* set power-on alarm */ + if (tm.tm_sec == 0) { + tm.tm_sec = 59; + tm.tm_min -= 1; + } else { tm.tm_sec -= 1; + } hal_rtc_set_alarm_time(&tm); } } @@ -608,7 +727,7 @@ static int rtc_ops_set_alarm(struct device *dev, struct rtc_wkalrm *alm) } /* disable alarm and clear Power-On Alarm bit */ - hal_rtc_clear_alarm(); + hal_rtc_clear_alarm(tm); if (alm->enabled) { hal_rtc_set_alarm_time(tm); diff --git a/drivers/misc/mediatek/smi/mt8127/smi_common.c b/drivers/misc/mediatek/smi/mt8127/smi_common.c index a3b5b056409..90d18cd0a85 100644 --- a/drivers/misc/mediatek/smi/mt8127/smi_common.c +++ b/drivers/misc/mediatek/smi/mt8127/smi_common.c @@ -440,7 +440,7 @@ static int smi_larb_init(unsigned int larb, int force_init){ if(0 == regval) { - SMIMSG("Init OSTD for larb_base: 0x%x\n" , larb_base); + SMIDBG(1, "Init OSTD for larb_base: 0x%x\n" , larb_base); M4U_WriteReg32(larb_base , SMI_LARB_OSTD_CTRL_EN , 0xffffffff); } else diff --git a/drivers/misc/mediatek/smi/mt8127/smi_common_decouple.c b/drivers/misc/mediatek/smi/mt8127/smi_common_decouple.c index a68c9d1357a..ef453a39693 100644 --- a/drivers/misc/mediatek/smi/mt8127/smi_common_decouple.c +++ b/drivers/misc/mediatek/smi/mt8127/smi_common_decouple.c @@ -422,7 +422,7 @@ static int smi_larb_init(unsigned int larb, int force_init){ if(0 == regval) { - SMIMSG("Init OSTD for larb_base: 0x%x\n" , larb_base); + SMIDBG(1, "Init OSTD for larb_base: 0x%x\n" , larb_base); M4U_WriteReg32(larb_base , SMI_LARB_OSTD_CTRL_EN , 0xffffffff); } else diff --git a/drivers/misc/mediatek/smi/mt8127/smi_debug.c b/drivers/misc/mediatek/smi/mt8127/smi_debug.c index eeb2a323f14..d5cdaeeb804 100644 --- a/drivers/misc/mediatek/smi/mt8127/smi_debug.c +++ b/drivers/misc/mediatek/smi/mt8127/smi_debug.c @@ -40,6 +40,211 @@ static char debug_buffer[4096]; + +static char STR_HELP[] = + "\n" + "USAGE\n" + " echo [ACTION]... > mau_dbg\n" + "\n" + "ACTION\n" + " module1|module2?R/W/RW(startPhyAddr,endPhyAddr)@MAU_Enty_ID\n" + " MAU will monitor specified module whether R/W specified range of memory\n" + " example: echo tvc|lcd_r?R(0,0x1000)@1 > mau_dbg\n" + " you can use [all] to specify all modules\n" + " example: echo all?W(0x2000,0x9000)@2 > mau_dbg\n" + "\n" + " module1|module2@MAU_Enty_ID:off\n" + " Turn off specified module on specified MAU Entry\n" + " example: echo tvc|lcd_r@1:off > mau_dbg\n" + "\n" + "\n" + " all:off\n" + " Turn off all of modules\n" + " example: echo all:off > mau_dbg\n" + "\n" + " list modules\n" + " list all module names MAU could monitor\n" + "\n" + " reg:[MPU|MAU1|MAU2]\n" + " dump hw register values\n" + "\n" + " regr:addr\n" + " read hw register\n" + "\n" + " m4u_log:on\n" + " start to print m4u translate miss rate every second \n" + "\n" + " m4u_log:off\n" + " stop to print m4u translate miss rate every second \n" + "\n" + " m4u_debug:[command] \n" + " input a command, used for debug \n" + "\n" + " m4u_monitor:on\n" + " start to print m4u translate miss rate every second \n" + "\n" + " m4u_monitor:off\n" + " stop to print m4u translate miss rate every second \n"; + + +static void process_dbg_opt(const char *opt) +{ + //m4u log + if (0 == strncmp(opt, "m4u_log:", 8)) + { + if (0 == strncmp(opt + 8, "on", 2)) + m4u_log_on(); + else if (0 == strncmp(opt + 8, "off", 3)) + m4u_log_off(); + else + goto Error; + } + //m4u debug + if (0 == strncmp(opt, "m4u_debug:", 10)) + { + unsigned int command; + char *p = (char *)opt + 10; + command = (unsigned int) simple_strtoul(p, &p, 10); + SMIMSG("m4u_debug_command, command=%d ", command); + m4u_debug_command(command); + } + +#ifdef __MAU_SPC_ENABLE__ + //mau dump + if (0 == strncmp(opt, "mau_stat:", 9)) + { + char *p = (char *)opt + 9; + unsigned int larb=(unsigned int)simple_strtoul(p, &p, 16); + if(larb>SMI_LARB_NR) + SMIERR("debug error: larb=%d\n", larb); + mau_dump_status(larb); + } + + if (0 == strncmp(opt, "mau_config:", 11 )) + { + MTK_MAU_CONFIG MauConf; + unsigned int larb,entry, rd, wt, vir, start, end, port_msk; + char *p = (char *)opt + 11; + larb = (unsigned int) simple_strtoul(p, &p, 16); + p++; + entry = (unsigned int) simple_strtoul(p, &p, 16); + p++; + rd = (unsigned int) simple_strtoul(p, &p, 16); + p++; + wt = (unsigned int) simple_strtoul(p, &p, 16); + p++; + vir = (unsigned int) simple_strtoul(p, &p, 16); + p++; + start = (unsigned int) simple_strtoul(p, &p, 16); + p++; + end = (unsigned int) simple_strtoul(p, &p, 16); + p++; + port_msk = (unsigned int) simple_strtoul(p, &p, 16); + + SMIMSG("larb=%d,entry=%d,rd=%d wt=%d vir=%d \n" + "start=0x%x end=0x%x msk=0x%x \n", + larb, entry, rd, wt, vir, start, end, port_msk); + + MauConf.larb = larb; + MauConf.entry = entry; + MauConf.monitor_read = rd; + MauConf.monitor_write = wt; + MauConf.virt = vir; + MauConf.start = start; + MauConf.end = end; + MauConf.port_msk = port_msk; + mau_config(&MauConf); + + } + + + if (0 == strncmp(opt, "spc_config:", 11 )) + { + MTK_SPC_CONFIG pCfg; + char *p = (char *)opt + 11; + + SMIMSG("%s", p); + //0-no protect; 1-sec rw; 2-sec_rw nonsec_r; 3-no access + pCfg.domain_0_prot = (unsigned int) simple_strtoul(p, &p, 16); + + SMIMSG("%d,%s", pCfg.domain_0_prot, p); + p++; + pCfg.domain_1_prot = (unsigned int) simple_strtoul(p, &p, 16); + p++; + SMIMSG("%d", pCfg.domain_1_prot); + pCfg.domain_2_prot = (unsigned int) simple_strtoul(p, &p, 16); + p++; + SMIMSG("%d", pCfg.domain_2_prot); + pCfg.domain_3_prot = (unsigned int) simple_strtoul(p, &p, 16); + p++; + SMIMSG("%d", pCfg.domain_3_prot); + pCfg.start = (unsigned int) simple_strtoul(p, &p, 16); + p++; + SMIMSG("%d", pCfg.domain_0_prot); + pCfg.end = (unsigned int) simple_strtoul(p, &p, 16); + + SMIMSG("prot=(%d,%d,%d,%d), start=0x%x, end=0x%x\n", + pCfg.domain_0_prot,pCfg.domain_1_prot, + pCfg.domain_2_prot,pCfg.domain_3_prot, + pCfg.start,pCfg.end); + + spc_config(&pCfg); + + } + + if (0 == strncmp(opt, "spc_status", 10 )) + { + spc_status_check(); + } + + if (0 == strncmp(opt, "spc_dump_reg", 12 )) + { + spc_dump_reg(); + } +#endif + + if (0 == strncmp(opt, "touch_sysram", 10 )) + { + volatile unsigned int *va; + unsigned int i; + + //va = ioremap_nocache(0x1200C000, 1024*80); + va=(volatile unsigned int *)0xf2000000; + + for(i=0; i<1024*80/4; i++) + { + va[i] = i; + } + + SMIMSG("cpu read sysram: 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x", + va[0],va[1],va[2],va[3],va[100],va[222],va[444]); + + } + + if (0 == strncmp(opt, "get_reg:", 8 )) + { + unsigned int addr; + char *p = (char *)opt + 8; + + addr = (unsigned int) simple_strtoul(p, &p, 16); + SMIMSG("get register: 0x%x = 0x%x \n", addr, COM_ReadReg32(addr)); + } + + return; +Error: + SMIERR("parse command error!\n"); + SMIMSG("%s", STR_HELP); +} + +static void process_dbg_cmd(char *cmd) +{ + char *tok; + while ((tok = strsep(&cmd, " ")) != NULL) + { + process_dbg_opt(tok); + } +} + // --------------------------------------------------------------------------- // Debug FileSystem Routines // --------------------------------------------------------------------------- @@ -60,8 +265,32 @@ static ssize_t debug_read(struct file *file, return simple_read_from_buffer(ubuf, count, ppos, debug_buffer, n); } + +static ssize_t debug_write(struct file *file, + const char __user *ubuf, size_t count, loff_t *ppos) +{ + const int debug_bufmax = sizeof(debug_buffer) - 1; + size_t ret; + + ret = count; + + if (count > debug_bufmax) + count = debug_bufmax; + + if (copy_from_user(&debug_buffer, ubuf, count)) + return -EFAULT; + + debug_buffer[count] = 0; + + process_dbg_cmd(debug_buffer); + + return ret; +} + + static struct file_operations debug_fops = { .read = debug_read, + .write = debug_write, .open = debug_open, }; diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.c b/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.c index 9953d83d221..45a61ae1b12 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.c +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.c @@ -1,44 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudioAfe.c - * - * Project: - * -------- - * MT8127 Audio Driver Afe Register setting - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Luke Liu - * Chipeng Chang - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ /***************************************************************************** * C O M P I L E R F L A G S @@ -72,6 +42,8 @@ uint32 Afe_Get_Reg(uint32 offset); void Afe_Set_Reg(uint32 offset, uint32 value, uint32 mask) { + if (offset > AFE_MAX_ADDR_OFFSET) + return; #ifdef AUDIO_MEM_IOREMAP extern void *AFE_BASE_ADDRESS; //PRINTK_AUDDRV("Afe_Set_Reg AUDIO_MEM_IOREMAP AFE_BASE_ADDRESS = %p\n",AFE_BASE_ADDRESS); @@ -83,10 +55,7 @@ void Afe_Set_Reg(uint32 offset, uint32 value, uint32 mask) volatile uint32 *AFE_Register = (volatile uint32 *)address; volatile uint32 val_tmp; - if (offset > AFE_MAX_ADDR_OFFSET) - return; - - + //PRINTK_AFE_REG("Afe_Set_Reg offset=%x, value=%x, mask=%x \n",offset,value,mask); val_tmp = Afe_Get_Reg(offset); val_tmp &= (~mask); val_tmp |= (value & mask); @@ -95,6 +64,8 @@ void Afe_Set_Reg(uint32 offset, uint32 value, uint32 mask) uint32 Afe_Get_Reg(uint32 offset) { + if (offset > AFE_MAX_ADDR_OFFSET) + return 0; #ifdef AUDIO_MEM_IOREMAP extern void *AFE_BASE_ADDRESS; //PRINTK_AUDDRV("Afe_Get_Reg AUDIO_MEM_IOREMAP AFE_BASE_ADDRESS = %p\ offset = %xn",AFE_BASE_ADDRESS,offset); @@ -103,11 +74,7 @@ uint32 Afe_Get_Reg(uint32 offset) volatile uint32 address = (AFE_BASE + offset); #endif volatile uint32 *value; - - if (offset > AFE_MAX_ADDR_OFFSET) - return 0; - - + //PRINTK_AFE_REG("Afe_Get_Reg offset=%x address = %x \n",offset,address); value = (volatile uint32 *)(address); return *value; } diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.h index cadacdaa718..ec329f7cbb0 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Afe.h @@ -1,45 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudioAfe.h - * - * Project: - * -------- - * MT8127 Audio Driver Afe Register setting - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Ir Lian (mtk00976) - * Harvey Huang (mtk03996) - * Chipeng Chang (mtk02308) - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ #ifndef _AUDDRV_AFE_H_ #define _AUDDRV_AFE_H_ @@ -608,6 +577,8 @@ typedef struct #define AFE_ASRC_CON20 (AFE_BASE + 0x56C) #define AFE_ASRC_CON21 (AFE_BASE + 0x570) +/* The maximum address offset of Audio Front End */ +#define AFE_MAX_ADDR_OFFSET (0x570) /********************************** * Detailed Definitions @@ -917,8 +888,6 @@ typedef struct #define AUDPLL_TUNER_EN_LEN 1 #define AUDPLL_TUNER_EN_MASK 0x80000000 -/* The maximum address offset of Audio Front End */ -#define AFE_MAX_ADDR_OFFSET (0x570) #define CLK_APLL_SEL_POS 16 #define CLK_APLL_SEL_LEN 3 #define CLKSQ_MUX_CK 0 diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.c b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.c index bc28a956cfe..162819b7ada 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.c +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.c @@ -1,43 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Ana.c - * - * Project: - * -------- - * MT6583 Audio Driver ana Register setting - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Chipeng Chang - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ /***************************************************************************** @@ -68,13 +39,11 @@ void Ana_Set_Reg(uint32 offset, uint32 value, uint32 mask) { // set pmic register or analog CONTROL_IFACE_PATH int ret = 0; + if (!(offset <= AUDTOP_MAX_ADDR_OFFSET || + (offset >= ABB_AFE_ADDR_START && offset <= ABB_AFE_ADDR_END))) + return; #ifdef AUDIO_USING_WRAP_DRIVER uint32 Reg_Value = Ana_Get_Reg(offset); - - if (!(offset <= AUDTOP_MAX_ADDR_OFFSET || - (offset >= ABB_AFE_ADDR_START && offset <= ABB_AFE_ADDR_END))) - return; - Reg_Value &= (~mask); Reg_Value |= (value & mask); ret = pwrap_write(offset, Reg_Value); @@ -91,11 +60,9 @@ uint32 Ana_Get_Reg(uint32 offset) // get pmic register int ret = 0; uint32 Rdata = 0; - - if (!(offset <= AUDTOP_MAX_ADDR_OFFSET || - (offset >= ABB_AFE_ADDR_START && offset <= ABB_AFE_ADDR_END))) - return 0; - + if (!(offset <= AUDTOP_MAX_ADDR_OFFSET || + (offset >= ABB_AFE_ADDR_START && offset <= ABB_AFE_ADDR_END))) + return 0; #ifdef AUDIO_USING_WRAP_DRIVER ret = pwrap_read(offset, &Rdata); #endif diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.h index 59b16cb1b68..cc84a8635d9 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6323.h @@ -1,43 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Ana.h - * - * Project: - * -------- - * MT6583 Audio Driver Ana - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Chipeng Chang (mtk02308) - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ #ifndef _AUDDRV_ANA_H_ #define _AUDDRV_ANA_H_ @@ -94,10 +65,9 @@ #define ABB_AFE_TOP_CON0 (PMIC_ABB_AFE_REG_BASE+0x002C) #define ABB_AFE_MON_DEBUG0 (PMIC_ABB_AFE_REG_BASE+0x002E) - /* The valid range of audio digital hardware in PMIC */ #define ABB_AFE_ADDR_START ABB_AFE_CON0 -#define ABB_AFE_ADDR_END ABB_AFE_MON_DEBUG0 +#define ABB_AFE_ADDR_END ABB_AFE_MON_DEBUG0 //---------------digital pmic register define ------------------------------------------- #if 0// @@ -188,8 +158,6 @@ #include #endif -/* The valid range of audio analog hardware in PMIC */ -#define AUDTOP_MAX_ADDR_OFFSET (0x079A) typedef struct { volatile uint16 Suspend_Ana_ABB_AFE_CON0; diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.c b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.c index ce7fb589749..b668ec683bc 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.c +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.c @@ -1,45 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Ana.c - * - * Project: - * -------- - * MT8127 Audio Driver ana Register setting - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Luke Liu - * Chipeng Chang - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ - /***************************************************************************** * C O M P I L E R F L A G S @@ -71,11 +40,6 @@ void Ana_Set_Reg(uint32 offset, uint32 value, uint32 mask) int ret = 0; #ifdef AUDIO_USING_WRAP_DRIVER uint32 Reg_Value = Ana_Get_Reg(offset); - - if (!(offset <= AUDTOP_MAX_ADDR_OFFSET || - (offset >= AFE_ADDR_START && offset <= AFE_ADDR_END))) - return; - Reg_Value &= (~mask); Reg_Value |= (value & mask); ret = pwrap_write(offset, Reg_Value); @@ -92,11 +56,6 @@ uint32 Ana_Get_Reg(uint32 offset) // get pmic register int ret = 0; uint32 Rdata = 0; - - if (!(offset <= AUDTOP_MAX_ADDR_OFFSET || - (offset >= AFE_ADDR_START && offset <= AFE_ADDR_END))) - return 0; - #ifdef AUDIO_USING_WRAP_DRIVER ret = pwrap_read(offset, &Rdata); #endif diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.h index 5a5ae83bb03..349ee157248 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Ana_6397.h @@ -1,45 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Ana.h - * - * Project: - * -------- - * MT6397 Audio Driver Digital/Analog - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Luke Liu - * Daniel Hsiao (mtk00469) - * Chipeng Chang (mtk02308) - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ #ifndef _AUDDRV_ANA_H_ #define _AUDDRV_ANA_H_ @@ -69,7 +38,7 @@ /***************************************************************************** * R E G I S T E R D E F I N I T I O N *****************************************************************************/ - + //---------------digital pmic register define start ------------------------------------------- #define AFE_PMICDIG_AUDIO_BASE (0x4000) #define AFE_UL_DL_CON0 (AFE_PMICDIG_AUDIO_BASE+0x0000) @@ -108,10 +77,6 @@ #define AFE_SGEN_CFG1 (AFE_PMICDIG_AUDIO_BASE + 0x0042) //---------------digital pmic register define end --------------------------------------- -/* The valid range of audio digital hardware in PMIC */ -#define AFE_ADDR_START AFE_UL_DL_CON0 -#define AFE_ADDR_END AFE_SGEN_CFG1 - //---------------analog pmic register define start -------------------------------------- #if 0 #define AFE_PMICANA_AUDIO_BASE (0x0) @@ -177,8 +142,6 @@ #include #endif -/* The valid range of audio analog hardware in PMIC */ -#define AUDTOP_MAX_ADDR_OFFSET (0x079A) //---------------analog pmic register define end --------------------------------------- typedef struct diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.c b/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.c index 71027c4a7d9..075d3543a75 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.c +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.c @@ -1,44 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Clk.c - * - * Project: - * -------- - * MT8127 Audio Driver clock control implement - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Chipeng Chang (MTK02308) - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ - /***************************************************************************** * C O M P I L E R F L A G S diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.h index 1c49cfd52d7..e250005b1f1 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Clk.h @@ -1,43 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Clk.h - * - * Project: - * -------- - * MT8127 Audio Driver clock control - * - * Description: - * ------------ - * Audio clcok control - * - * Author: - * ------- - * Chipeng Chang (mtk02308) - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ #ifndef _AUDDRV_CLK_H_ #define _AUDDRV_CLK_H_ diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Common.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_Common.h index 4c5d9f69b9f..04c6f641ad0 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Common.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Common.h @@ -1,31 +1,14 @@ -/****************************************************************************** -* +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Filename: - * --------- - * AudDrv_Common.h + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * Project: - * -------- - * MT6583 FPGA LDVT Audio Driver - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Chipeng Chang (MTK02308) - * - *--------------------------------------------------------------------------- ---- - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - -*******************************************************************************/ + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ #ifndef AUDIO_GLOBAL_H #define AUDIO_GLOBAL_H diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Def.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_Def.h index a965ea06ae9..e36ebdaa48d 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Def.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Def.h @@ -1,31 +1,14 @@ -/****************************************************************************** -* +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Filename: - * --------- - * AudDrv_Common.h + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * Project: - * -------- - * MT6583 FPGA LDVT Audio Driver - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Chipeng Chang (MTK02308) - * - *--------------------------------------------------------------------------- ---- - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - -*******************************************************************************/ + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ #ifndef AUDIO_DEF_H #define AUDIO_DEF_H diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.c b/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.c index b3ca85f70b0..04d4ce78003 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.c +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.c @@ -1,45 +1,14 @@ -/* - * Copyright (C) 2007 The Android Open Source Project +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/******************************************************************************* - * - * Filename: - * --------- - * AudDrv_Kernelc - * - * Project: - * -------- - * MT8127 Audio Driver Kernel Function - * - * Description: - * ------------ - * Audio register - * - * Author: - * ------- - * Luke Liu - * Chipeng Chang - * - *------------------------------------------------------------------------------ - * $Revision: #1 $ - * $Modtime:$ - * $Log:$ - * - * - *******************************************************************************/ - /***************************************************************************** * C O M P I L E R F L A G S @@ -490,7 +459,6 @@ static int AudDrv_Read_Procmem(char *buf, char **start, off_t offset, int count PRINTK_AUDDRV("+AudDrv_Read_Procmem \n"); AudDrv_Clk_On(); -#ifdef CONFIG_MTK_PMIC_MT6397 len += sprintf(buf + len , "Afe_Mem_Pwr_on =0x%x\n", Afe_Mem_Pwr_on); len += sprintf(buf + len , "Aud_AFE_Clk_cntr = 0x%x\n", Aud_AFE_Clk_cntr); len += sprintf(buf + len , "Aud_ANA_Clk_cntr = 0x%x\n", Aud_ANA_Clk_cntr); @@ -656,7 +624,37 @@ static int AudDrv_Read_Procmem(char *buf, char **start, off_t offset, int count len += sprintf(buf + len , "AFE_ASRC_CON19 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON19)); len += sprintf(buf + len , "AFE_ASRC_CON20 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON20)); len += sprintf(buf + len , "AFE_ASRC_CON21 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON21)); + PRINTK_AUDDRV("AudDrv_Read_Procmem len = %d\n", len); + AudDrv_Clk_Off(); + PRINTK_AUDDRV("-AudDrv_Read_Procmem \n"); + return len; +} + + + +/**************************************************************************** + * FUNCTION + * AudDrv_Read_Procmem_PMIC + * + * DESCRIPTION + * dump pmic digital/analog register + * cat /proc/pmicaudio + * + * PARAMETERS + * + * + * RETURNS + * length + * + ***************************************************************************** */ +static int AudDrv_Read_Procmem_PMIC(char *buf, char **start, off_t offset, int count , int *eof, void *data) +{ + int len = 0; + PRINTK_AUDDRV("+AudDrv_Read_Procmem_PMIC \n"); + AudDrv_Clk_On(); + +#ifdef CONFIG_MTK_PMIC_MT6397 len += sprintf(buf + len , "UL_DL_CON0 = 0x%x\n", Ana_Get_Reg(AFE_UL_DL_CON0)); len += sprintf(buf + len , "DL_SRC2_CON0_H = 0x%x\n", Ana_Get_Reg(AFE_DL_SRC2_CON0_H)); len += sprintf(buf + len , "DL_SRC2_CON0_L = 0x%x\n", Ana_Get_Reg(AFE_DL_SRC2_CON0_L)); @@ -735,171 +733,6 @@ static int AudDrv_Read_Procmem(char *buf, char **start, off_t offset, int count //len += sprintf(buf + len , "CLK_CFG_5 = 0x%x\n", AP_Get_Reg(CLK_CFG_5)); #else - len += sprintf(buf + len , "Afe_Mem_Pwr_on =0x%x\n", Afe_Mem_Pwr_on); - len += sprintf(buf + len , "Aud_AFE_Clk_cntr = 0x%x\n", Aud_AFE_Clk_cntr); - len += sprintf(buf + len , "Aud_ANA_Clk_cntr = 0x%x\n", Aud_ANA_Clk_cntr); - len += sprintf(buf + len , "Aud_HDMI_Clk_cntr = 0x%x\n", Aud_HDMI_Clk_cntr); - len += sprintf(buf + len , "Aud_I2S_Clk_cntr = 0x%x\n", Aud_I2S_Clk_cntr); - len += sprintf(buf + len , "Aud_APLL_Tuner_Clk_cntr = 0x%x\n", Aud_APLL_Tuner_Clk_cntr); - len += sprintf(buf + len , "Aud_SPDIF_Clk_cntr = 0x%x\n", Aud_SPDIF_Clk_cntr); - len += sprintf(buf + len , "Aud_Int_Mem_Flag = 0x%x\n", Aud_Int_Mem_Flag); - len += sprintf(buf + len , "Aud_Ext_Mem_Flag = 0x%x\n", Aud_Ext_Mem_Flag); - len += sprintf(buf + len , "AuddrvSpkStatus = 0x%x\n", AuddrvSpkStatus); - len += sprintf(buf + len , "AUDIO_TOP_CON0 = 0x%x\n", Afe_Get_Reg(AUDIOAFE_TOP_CON0)); - len += sprintf(buf + len , "AUDIO_TOP_CON1 = 0x%x\n", Afe_Get_Reg(AUDIO_TOP_CON1)); - len += sprintf(buf + len , "AUDIO_TOP_CON2 = 0x%x\n", Afe_Get_Reg(AUDIO_TOP_CON2)); - len += sprintf(buf + len , "AUDIO_TOP_CON3 = 0x%x\n", Afe_Get_Reg(AUDIO_TOP_CON3)); - len += sprintf(buf + len , "AFE_DAC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_DAC_CON0)); - len += sprintf(buf + len , "AFE_DAC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_DAC_CON1)); - len += sprintf(buf + len , "AFE_I2S_CON = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON)); - - len += sprintf(buf + len , "AFE_CONN0 = 0x%x\n", Afe_Get_Reg(AFE_CONN0)); - len += sprintf(buf + len , "AFE_CONN1 = 0x%x\n", Afe_Get_Reg(AFE_CONN1)); - len += sprintf(buf + len , "AFE_CONN2 = 0x%x\n", Afe_Get_Reg(AFE_CONN2)); - len += sprintf(buf + len , "AFE_CONN3 = 0x%x\n", Afe_Get_Reg(AFE_CONN3)); - len += sprintf(buf + len , "AFE_CONN4 = 0x%x\n", Afe_Get_Reg(AFE_CONN4)); - len += sprintf(buf + len , "AFE_I2S_CON1 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON1)); - len += sprintf(buf + len , "AFE_I2S_CON2 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON2)); - - //len += sprintf(buf+len ,"AFE_MRGIF_CON = 0x%x\n",Afe_Get_Reg(AFE_MRGIF_CON)); - len += sprintf(buf + len , "AFE_DL1_BASE = 0x%x\n", Afe_Get_Reg(AFE_DL1_BASE)); - len += sprintf(buf + len , "AFE_DL1_CUR = 0x%x\n", Afe_Get_Reg(AFE_DL1_CUR)); - len += sprintf(buf + len , "AFE_DL1_END = 0x%x\n", Afe_Get_Reg(AFE_DL1_END)); - len += sprintf(buf + len , "AFE_I2S_CON3 = 0x%x\n", Afe_Get_Reg(AFE_I2S_CON3)); // - len += sprintf(buf + len , "AFE_DL2_BASE = 0x%x\n", Afe_Get_Reg(AFE_DL2_BASE)); - len += sprintf(buf + len , "AFE_DL2_CUR = 0x%x\n", Afe_Get_Reg(AFE_DL2_CUR)); - len += sprintf(buf + len , "AFE_DL2_END = 0x%x\n", Afe_Get_Reg(AFE_DL2_END)); - len += sprintf(buf + len , "AFE_AWB_BASE = 0x%x\n", Afe_Get_Reg(AFE_AWB_BASE)); - len += sprintf(buf + len , "AFE_AWB_END = 0x%x\n", Afe_Get_Reg(AFE_AWB_END)); - len += sprintf(buf + len , "AFE_AWB_CUR = 0x%x\n", Afe_Get_Reg(AFE_AWB_CUR)); - len += sprintf(buf + len , "AFE_VUL_BASE = 0x%x\n", Afe_Get_Reg(AFE_VUL_BASE)); - len += sprintf(buf + len , "AFE_VUL_END = 0x%x\n", Afe_Get_Reg(AFE_VUL_END)); - len += sprintf(buf + len , "AFE_VUL_CUR = 0x%x\n", Afe_Get_Reg(AFE_VUL_CUR)); - - - len += sprintf(buf + len , "MEMIF_MON0 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON0)); - len += sprintf(buf + len , "MEMIF_MON1 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON1)); - len += sprintf(buf + len , "MEMIF_MON2 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON2)); - len += sprintf(buf + len , "MEMIF_MON4 = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MON4)); - - len += sprintf(buf + len , "AFE_ADDA_DL_SRC2_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_DL_SRC2_CON0)); - len += sprintf(buf + len , "AFE_ADDA_DL_SRC2_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_DL_SRC2_CON1)); - len += sprintf(buf + len , "AFE_ADDA_UL_SRC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_UL_SRC_CON0)); - len += sprintf(buf + len , "AFE_ADDA_UL_SRC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_UL_SRC_CON1)); - len += sprintf(buf + len , "AFE_ADDA_TOP_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_TOP_CON0)); - len += sprintf(buf + len , "AFE_ADDA_UL_DL_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_UL_DL_CON0)); - len += sprintf(buf + len , "AFE_ADDA_SRC_DEBUG = 0x%x\n", Afe_Get_Reg(AFE_ADDA_SRC_DEBUG)); - len += sprintf(buf + len , "AFE_ADDA_SRC_DEBUG_MON0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_SRC_DEBUG_MON0)); - len += sprintf(buf + len , "AFE_ADDA_SRC_DEBUG_MON1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_SRC_DEBUG_MON1)); - len += sprintf(buf + len , "AFE_ADDA_NEWIF_CFG0 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_NEWIF_CFG0)); - len += sprintf(buf + len , "AFE_ADDA_NEWIF_CFG1 = 0x%x\n", Afe_Get_Reg(AFE_ADDA_NEWIF_CFG1)); - - len += sprintf(buf + len , "SIDETONE_DEBUG = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_DEBUG)); - len += sprintf(buf + len , "SIDETONE_MON = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_MON)); - len += sprintf(buf + len , "SIDETONE_CON0 = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_CON0)); - len += sprintf(buf + len , "SIDETONE_COEFF = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_COEFF)); - len += sprintf(buf + len , "SIDETONE_CON1 = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_CON1)); - len += sprintf(buf + len , "SIDETONE_GAIN = 0x%x\n", Afe_Get_Reg(AFE_SIDETONE_GAIN)); - len += sprintf(buf + len , "SGEN_CON0 = 0x%x\n", Afe_Get_Reg(AFE_SGEN_CON0)); - - len += sprintf(buf + len , "TOP_CON0 = 0x%x\n", Afe_Get_Reg(AFE_TOP_CON0)); - - len += sprintf(buf + len , "HDMI_OUT_CON0 = 0x%x\n", Afe_Get_Reg(AFE_HDMI_OUT_CON0)); - len += sprintf(buf + len , "HDMI_OUT_BASE = 0x%x\n", Afe_Get_Reg(AFE_HDMI_OUT_BASE)); - len += sprintf(buf + len , "HDMI_OUT_CUR = 0x%x\n", Afe_Get_Reg(AFE_HDMI_OUT_CUR)); - len += sprintf(buf + len , "HDMI_OUT_END = 0x%x\n", Afe_Get_Reg(AFE_HDMI_OUT_END)); - len += sprintf(buf + len , "SPDIF_OUT_CON0 = 0x%x\n", Afe_Get_Reg(AFE_SPDIF_OUT_CON0)); - len += sprintf(buf + len , "SPDIF_BASE = 0x%x\n", Afe_Get_Reg(AFE_SPDIF_BASE)); - len += sprintf(buf + len , "SPDIF_CUR = 0x%x\n", Afe_Get_Reg(AFE_SPDIF_CUR)); - len += sprintf(buf + len , "SPDIF_END = 0x%x\n", Afe_Get_Reg(AFE_SPDIF_END)); - len += sprintf(buf + len , "HDMI_CONN0 = 0x%x\n", Afe_Get_Reg(AFE_HDMI_CONN0)); - len += sprintf(buf + len , "8CH_I2S_OUT_CON = 0x%x\n", Afe_Get_Reg(AFE_8CH_I2S_OUT_CON)); - len += sprintf(buf + len , "IEC_CFG = 0x%x\n", Afe_Get_Reg(AFE_IEC_CFG)); - len += sprintf(buf + len , "IEC_NSNUM = 0x%x\n", Afe_Get_Reg(AFE_IEC_NSNUM)); - len += sprintf(buf + len , "IEC_BURST_INFO = 0x%x\n", Afe_Get_Reg(AFE_IEC_BURST_INFO)); - len += sprintf(buf + len , "IEC_BURST_LEN = 0x%x\n", Afe_Get_Reg(AFE_IEC_BURST_LEN)); - len += sprintf(buf + len , "IEC_NSADR = 0x%x\n", Afe_Get_Reg(AFE_IEC_NSADR)); - len += sprintf(buf + len , "IEC_CHL_STAT0 = 0x%x\n", Afe_Get_Reg(AFE_IEC_CHL_STAT0)); - len += sprintf(buf + len , "IEC_CHL_STAT1 = 0x%x\n", Afe_Get_Reg(AFE_IEC_CHL_STAT1)); - len += sprintf(buf + len , "IEC_CHR_STAT0 = 0x%x\n", Afe_Get_Reg(AFE_IEC_CHR_STAT0)); - len += sprintf(buf + len , "IEC_CHR_STAT1 = 0x%x\n", Afe_Get_Reg(AFE_IEC_CHR_STAT1)); - - len += sprintf(buf + len , "AFE_PREDIS_CON0 = 0x%x\n", Afe_Get_Reg(AFE_PREDIS_CON0)); - len += sprintf(buf + len , "AFE_PREDIS_CON1 = 0x%x\n", Afe_Get_Reg(AFE_PREDIS_CON1)); - len += sprintf(buf + len , "AFE_MOD_PCM_BASE = 0x%x\n", Afe_Get_Reg(AFE_MOD_PCM_BASE)); - len += sprintf(buf + len , "AFE_MOD_PCM_END = 0x%x\n", Afe_Get_Reg(AFE_MOD_PCM_END)); - len += sprintf(buf + len , "AFE_MOD_PCM_CUR = 0x%x\n", Afe_Get_Reg(AFE_MOD_PCM_CUR)); - - len += sprintf(buf + len , "IRQ_MCU_CON = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CON)); //ccc - len += sprintf(buf + len , "IRQ_MCU_STATUS = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_STATUS)); - len += sprintf(buf + len , "IRQ_CLR = 0x%x\n", Afe_Get_Reg(AFE_IRQ_CLR)); - len += sprintf(buf + len , "IRQ_MCU_CNT1 = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CNT1)); - len += sprintf(buf + len , "IRQ_MCU_CNT2 = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CNT2)); - len += sprintf(buf + len , "IRQ_MCU_MON2 = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_MON2)); - len += sprintf(buf + len , "IRQ_MCU_CNT5 = 0x%x\n", Afe_Get_Reg(AFE_IRQ_MCU_CNT5)); - len += sprintf(buf + len , "IRQ1_MCU_CNT_MON = 0x%x\n", Afe_Get_Reg(AFE_IRQ1_MCU_CNT_MON)); - len += sprintf(buf + len , "IRQ2_MCU_CNT_MON = 0x%x\n", Afe_Get_Reg(AFE_IRQ2_MCU_CNT_MON)); - len += sprintf(buf + len , "IRQ1_MCU_EN_CNT_MON = 0x%x\n", Afe_Get_Reg(AFE_IRQ1_MCU_EN_CNT_MON)); - len += sprintf(buf + len , "IRQ5_MCU_EN_CNT_MON = 0x%x\n", Afe_Get_Reg(AFE_IRQ5_MCU_EN_CNT_MON)); - - //len += sprintf(buf + len , "AFE_MEMIF_MINLEN = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MINLEN)); - len += sprintf(buf + len , "AFE_MEMIF_MAXLEN = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_MAXLEN)); - len += sprintf(buf + len , "AFE_MEMIF_PBUF_SIZE = 0x%x\n", Afe_Get_Reg(AFE_MEMIF_PBUF_SIZE)); - - len += sprintf(buf + len , "AFE_GAIN1_CON0 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON0)); - len += sprintf(buf + len , "AFE_GAIN1_CON1 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON1)); - len += sprintf(buf + len , "AFE_GAIN1_CON2 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON2)); - len += sprintf(buf + len , "AFE_GAIN1_CON3 = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CON3)); - len += sprintf(buf + len , "AFE_GAIN1_CONN = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CONN)); - len += sprintf(buf + len , "AFE_GAIN1_CUR = 0x%x\n", Afe_Get_Reg(AFE_GAIN1_CUR)); - - len += sprintf(buf + len , "AFE_GAIN2_CON0 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON0)); - len += sprintf(buf + len , "AFE_GAIN2_CON1 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON1)); - len += sprintf(buf + len , "AFE_GAIN2_CON2 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON2)); - - len += sprintf(buf + len , "AFE_GAIN2_CON3 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CON3)); - len += sprintf(buf + len , "AFE_GAIN2_CONN = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CONN)); - len += sprintf(buf + len , "AFE_GAIN2_CUR = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CUR)); - len += sprintf(buf + len , "AFE_GAIN2_CONN2 = 0x%x\n", Afe_Get_Reg(AFE_GAIN2_CONN2)); - - - len += sprintf(buf + len , "FPGA_CFG2 = 0x%x\n", Afe_Get_Reg(FPGA_CFG2)); - len += sprintf(buf + len , "FPGA_CFG3 = 0x%x\n", Afe_Get_Reg(FPGA_CFG3)); - len += sprintf(buf + len , "FPGA_CFG0 = 0x%x\n", Afe_Get_Reg(FPGA_CFG0)); - len += sprintf(buf + len , "FPGA_CFG1 = 0x%x\n", Afe_Get_Reg(FPGA_CFG1)); - len += sprintf(buf + len , "FPGA_STC = 0x%x\n", Afe_Get_Reg(FPGA_STC)); - - len += sprintf(buf + len , "AFE_ASRC_CON0 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON0)); - len += sprintf(buf + len , "AFE_ASRC_CON1 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON1)); - len += sprintf(buf + len , "AFE_ASRC_CON2 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON2)); - len += sprintf(buf + len , "AFE_ASRC_CON3 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON3)); - len += sprintf(buf + len , "AFE_ASRC_CON4 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON4)); - len += sprintf(buf + len , "AFE_ASRC_CON5 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON5)); - len += sprintf(buf + len , "AFE_ASRC_CON6 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON6)); - len += sprintf(buf + len , "AFE_ASRC_CON7 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON7)); - len += sprintf(buf + len , "AFE_ASRC_CON8 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON8)); - len += sprintf(buf + len , "AFE_ASRC_CON9 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON9)); - len += sprintf(buf + len , "AFE_ASRC_CON10 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON10)); - len += sprintf(buf + len , "AFE_ASRC_CON11 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON11)); - - len += sprintf(buf + len , "PCM_INTF_CON1 = 0x%x\n", Afe_Get_Reg(PCM_INTF_CON1)); - len += sprintf(buf + len , "PCM_INTF_CON2 = 0x%x\n", Afe_Get_Reg(PCM_INTF_CON2)); - len += sprintf(buf + len , "PCM2_INTF_CON = 0x%x\n", Afe_Get_Reg(PCM2_INTF_CON)); - - - - - - len += sprintf(buf + len , "AFE_ASRC_CON13 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON13)); - len += sprintf(buf + len , "AFE_ASRC_CON14 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON14)); - len += sprintf(buf + len , "AFE_ASRC_CON15 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON15)); - len += sprintf(buf + len , "AFE_ASRC_CON16 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON16)); - len += sprintf(buf + len , "AFE_ASRC_CON17 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON17)); - len += sprintf(buf + len , "AFE_ASRC_CON18 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON18)); - len += sprintf(buf + len , "AFE_ASRC_CON19 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON19)); - len += sprintf(buf + len , "AFE_ASRC_CON20 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON20)); - len += sprintf(buf + len , "AFE_ASRC_CON21 = 0x%x\n", Afe_Get_Reg(AFE_ASRC_CON21)); - len += sprintf(buf + len , "ABB_AFE_CON0 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON0)); len += sprintf(buf + len , "ABB_AFE_CON1 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON1)); len += sprintf(buf + len , "ABB_AFE_CON2 = 0x%x\n", Ana_Get_Reg(ABB_AFE_CON2)); @@ -941,7 +774,6 @@ static int AudDrv_Read_Procmem(char *buf, char **start, off_t offset, int count len += sprintf(buf + len , "TOP_CKPDN0 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN0)); len += sprintf(buf + len , "TOP_CKPDN0_SET = 0x%x\n", Ana_Get_Reg(TOP_CKPDN0_SET)); len += sprintf(buf + len , "TOP_CKPDN0_CLR = 0x%x\n", Ana_Get_Reg(TOP_CKPDN0_CLR)); - len += sprintf(buf + len , "TOP_CKPDN1 = 0x%x\n", Ana_Get_Reg(TOP_CKPDN1)); len += sprintf(buf + len , "TOP_CKPDN1_SET = 0x%x\n", Ana_Get_Reg(TOP_CKPDN1_SET)); len += sprintf(buf + len , "TOP_CKPDN1_CLR = 0x%x\n", Ana_Get_Reg(TOP_CKPDN1_CLR)); @@ -961,13 +793,14 @@ static int AudDrv_Read_Procmem(char *buf, char **start, off_t offset, int count len += sprintf(buf + len , "AUDTOP_CON8 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON8)); len += sprintf(buf + len , "AUDTOP_CON9 = 0x%x\n", Ana_Get_Reg(AUDTOP_CON9)); #endif - PRINTK_AUDDRV("AudDrv_Read_Procmem len = %d\n", len); + PRINTK_AUDDRV("AudDrv_Read_Procmem_PMIC len = %d\n", len); AudDrv_Clk_Off(); - PRINTK_AUDDRV("-AudDrv_Read_Procmem \n"); + PRINTK_AUDDRV("-AudDrv_Read_Procmem_PMIC \n"); return len; } + void Auddrv_Handle_Mem_context(AFE_MEM_CONTROL_T *Mem_Block) { kal_uint32 HW_Cur_ReadIdx = 0; @@ -1021,7 +854,7 @@ void Auddrv_Handle_Mem_context(AFE_MEM_CONTROL_T *Mem_Block) Hw_Get_bytes,HW_Cur_ReadIdx,mBlock->u4DMAReadIdx,mBlock->u4WriteIdx,mBlock->pucPhysBufAddr,Mem_Block->MemIfNum);*/ spin_lock_irqsave(&auddrv_ULInCtl_lock, flags); - + mBlock->u4WriteIdx += Hw_Get_bytes; mBlock->u4WriteIdx %= mBlock->u4BufferSize; mBlock->u4DataRemained += Hw_Get_bytes; @@ -3202,6 +3035,7 @@ int AudDrv_GET_UL_REMAIN_TIME(struct file *fp) AFE_MEM_CONTROL_T *pAfe_MEM_ConTrol = NULL; AFE_BLOCK_T *Afe_Block = NULL; unsigned long flags; + unsigned long flagsUL; kal_uint32 samplerate = 0; kal_uint32 HW_Cur_ReadIdx = 0; kal_int32 Hw_Get_bytes = 0; @@ -3280,6 +3114,7 @@ int AudDrv_GET_UL_REMAIN_TIME(struct file *fp) } spin_lock_irqsave(&auddrv_irqstatus_lock, flags); + spin_lock_irqsave(&auddrv_ULInCtl_lock, flagsUL); // HW already fill in Hw_Get_bytes = (HW_Cur_ReadIdx - Afe_Block->pucPhysBufAddr) - Afe_Block->u4WriteIdx; if (Hw_Get_bytes < 0) @@ -3288,7 +3123,7 @@ int AudDrv_GET_UL_REMAIN_TIME(struct file *fp) } HW_Remain_Size = Afe_Block->u4DataRemained + Hw_Get_bytes; - + spin_unlock_irqrestore(&auddrv_ULInCtl_lock, flagsUL); spin_unlock_irqrestore(&auddrv_irqstatus_lock, flags); // buffer overflow @@ -3318,6 +3153,115 @@ void AudDrv_AUDIO_REMAINING(struct file *fp, Data_Remaining *time) time->bytes_remaining = AudDrv_GET_DL1_REMAIN_TIME(fp); } +/***************************************************************************** + * FUNCTION + * AudDrv_AUDIO_CAPTURE_REMAINING + * + * DESCRIPTION + * Get UL buffer remaining size and time stamp + * + ******************************************************************************/ + +void AudDrv_AUDIO_CAPTURE_REMAINING(struct file *fp, Data_Remaining *time) +{ + //PRINTK_AUDDRV("+AUDDRV_AUDIO_CAPTURE_REMAINING "); + + //get time + do_posix_clock_monotonic_gettime(&(time->time)); + + //get remain size + AFE_MEM_CONTROL_T *pAfe_MEM_ConTrol = NULL; + AFE_BLOCK_T *Afe_Block = NULL; + unsigned long flags; + unsigned long flagsUL; + kal_uint32 samplerate = 0; + kal_uint32 HW_Cur_ReadIdx = 0; + kal_int32 Hw_Get_bytes = 0; + kal_uint32 HW_Remain_Size = 0; + int ret = 0; + + // check which memif need to be read + pAfe_MEM_ConTrol = Auddrv_Find_MemIF_Fp(fp); + Afe_Block = &(pAfe_MEM_ConTrol->rBlock); + if (pAfe_MEM_ConTrol == NULL) + { + PRINTK_AUDDRV("AUDDRV_AUDIO_CAPTURE_REMAINING cannot find MEM control !!!!!!!"); + return -1; + } + if (!Auddrv_CheckRead_MemIF_Fp(pAfe_MEM_ConTrol->MemIfNum)) + { + PRINTK_AUDDRV("AUDDRV_AUDIO_CAPTURE_REMAINING cannot find matcg MemIfNum!!!"); + return -1; + } + + if (Afe_Block->u4BufferSize <= 0) + { + PRINTK_AUDDRV("AUDDRV_AUDIO_CAPTURE_REMAINING wrong buffer size!!!"); + return -1; + } + + samplerate = Afe_Get_Reg(AFE_DAC_CON1); + + switch (pAfe_MEM_ConTrol->MemIfNum) + { + case MEM_VUL: + HW_Cur_ReadIdx = Afe_Get_Reg(AFE_VUL_CUR); + samplerate = (samplerate >> 16) & 0x0000000f; + samplerate = AudDrv_SampleRateIndexConvert(samplerate); + break; + case MEM_AWB: + HW_Cur_ReadIdx = Afe_Get_Reg(AFE_AWB_CUR); + samplerate = (samplerate >> 12) & 0x0000000f; + samplerate = AudDrv_SampleRateIndexConvert(samplerate); + break; + case MEM_MOD_DAI: + HW_Cur_ReadIdx = Afe_Get_Reg(AFE_MOD_PCM_CUR); + samplerate = (samplerate >> 30) & 0x00000001; + if (samplerate == 0) + { + samplerate = 8000; + } + else + { + samplerate = 16000; + } + break; + } + + if (CheckSize(HW_Cur_ReadIdx)) + { + return -1; + } + if (Afe_Block->pucVirtBufAddr == NULL) + { + return -1; + } + + spin_lock_irqsave(&auddrv_irqstatus_lock, flags); + spin_lock_irqsave(&auddrv_ULInCtl_lock, flagsUL); + // HW already fill in + Hw_Get_bytes = (HW_Cur_ReadIdx - Afe_Block->pucPhysBufAddr) - Afe_Block->u4WriteIdx; + if (Hw_Get_bytes < 0) + { + Hw_Get_bytes += Afe_Block->u4BufferSize; + } + + HW_Remain_Size = Afe_Block->u4DataRemained + Hw_Get_bytes; + spin_unlock_irqrestore(&auddrv_ULInCtl_lock, flagsUL); + spin_unlock_irqrestore(&auddrv_irqstatus_lock, flags); + + // buffer overflow + if (HW_Remain_Size > Afe_Block->u4BufferSize) + { + HW_Remain_Size = Afe_Block->u4BufferSize; + } + + time->bytes_remaining = HW_Remain_Size; + //ret = (((HW_Remain_Size * 1000) / 4) / samplerate); + //PRINTK_AUDDRV("-AUDDRV_AUDIO_CAPTURE_REMAINING HW_Remain_Size=%d, samplerate=%d",HW_Remain_Size, samplerate); +} + + /***************************************************************************** * FILE OPERATION FUNCTION * AudDrv_ioctl @@ -3331,6 +3275,7 @@ static long AudDrv_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { int ret = 0; Register_Control Reg_Data; + switch (cmd) { PRINTK_AUDDRV("AudDrv_ioctl cmd = %u arg = %lu\n", cmd, arg); @@ -3340,6 +3285,11 @@ static long AudDrv_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { return -EFAULT; } + if (((Reg_Data.offset >= 0x800) && (Reg_Data.offset < 0x1000)) || (Reg_Data.offset > 0xD000)) + { + PRINTK_AUDDRV("Invalid off set!\n"); + return -EFAULT; + } AudDrv_Clk_On(); spin_lock(&auddrv_lock); Afe_Set_Reg(Reg_Data.offset, Reg_Data.value, Reg_Data.mask); @@ -3353,6 +3303,11 @@ static long AudDrv_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { return -EFAULT; } + if (((Reg_Data.offset >= 0x800) && (Reg_Data.offset < 0x1000)) || (Reg_Data.offset > 0xD000)) + { + PRINTK_AUDDRV("Invalid off set!\n"); + return -EFAULT; + } AudDrv_Clk_On(); spin_lock(&auddrv_lock); Reg_Data.value = Afe_Get_Reg(Reg_Data.offset); @@ -3371,11 +3326,19 @@ static long AudDrv_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { return -EFAULT; } - AudDrv_Clk_On(); - spin_lock(&auddrv_lock); - AP_Set_Reg(Reg_Data.offset, Reg_Data.value, Reg_Data.mask); - spin_unlock(&auddrv_lock); - AudDrv_Clk_Off(); + if ((Reg_Data.offset >= 0x10000000) && (Reg_Data.offset < 0x12000000)) + { + AudDrv_Clk_On(); + spin_lock(&auddrv_lock); + AP_Set_Reg(Reg_Data.offset, Reg_Data.value, Reg_Data.mask); + spin_unlock(&auddrv_lock); + AudDrv_Clk_Off(); + } + else + { + printk("Invalid registers offset!\n"); + return -EFAULT; + } break; } case GET_AP_REG: @@ -3385,14 +3348,22 @@ static long AudDrv_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { return -EFAULT; } - AudDrv_Clk_On(); - spin_lock(&auddrv_lock); - Reg_Data.value = AP_Get_Reg(Reg_Data.offset); - spin_unlock(&auddrv_lock); - AudDrv_Clk_Off(); - if (copy_to_user((void __user *)(arg), (void *)(&Reg_Data), sizeof(Reg_Data))) + if ((Reg_Data.offset >= 0x10000000) && (Reg_Data.offset < 0x12000000)) { - return -EFAULT; + AudDrv_Clk_On(); + spin_lock(&auddrv_lock); + Reg_Data.value = AP_Get_Reg(Reg_Data.offset); + spin_unlock(&auddrv_lock); + AudDrv_Clk_Off(); + if (copy_to_user((void __user *)(arg), (void *)(&Reg_Data), sizeof(Reg_Data))) + { + return -EFAULT; + } + } + else + { + printk("Invalid registers offset!\n"); + return -EFAULT; } break; } @@ -4142,6 +4113,17 @@ static long AudDrv_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) break; } + case AUDDRV_AUDIO_CAPTURE_REMAINING: + { + Data_Remaining data; + AudDrv_AUDIO_CAPTURE_REMAINING(fp, &data); + if (copy_to_user((void __user *)(arg), (void *)(&data), sizeof(Data_Remaining))) + { + return -EFAULT; + } + + break; + } default: { PRINTK_AUD_ERROR("AudDrv Fail IOCTL command no such ioctl cmd = %x \n", cmd); @@ -4511,12 +4493,12 @@ ssize_t AudDrv_MEMIF_Read(struct file *fp, char __user *data, size_t count, lof copy_to_user_fake(Read_Data_Ptr , read_size); #endif read_count += read_size; - spin_lock(&auddrv_ULInCtl_lock); + spin_lock_irqsave(&auddrv_ULInCtl_lock, flags); Afe_Block->u4DataRemained -= read_size; Afe_Block->u4DMAReadIdx += read_size; Afe_Block->u4DMAReadIdx %= Afe_Block->u4BufferSize; DMA_Read_Ptr = Afe_Block->u4DMAReadIdx; - spin_unlock(&auddrv_ULInCtl_lock); + spin_unlock_irqrestore(&auddrv_ULInCtl_lock, flags); Read_Data_Ptr += read_size; count -= read_size; @@ -4554,12 +4536,12 @@ ssize_t AudDrv_MEMIF_Read(struct file *fp, char __user *data, size_t count, lof copy_to_user_fake(Read_Data_Ptr, size_1); #endif read_count += size_1; - spin_lock(&auddrv_ULInCtl_lock); + spin_lock_irqsave(&auddrv_ULInCtl_lock, flags); Afe_Block->u4DataRemained -= size_1; Afe_Block->u4DMAReadIdx += size_1; Afe_Block->u4DMAReadIdx %= Afe_Block->u4BufferSize; DMA_Read_Ptr = Afe_Block->u4DMAReadIdx; - spin_unlock(&auddrv_ULInCtl_lock); + spin_unlock_irqrestore(&auddrv_ULInCtl_lock, flags); /* PRINTK_AUDDRV("AudDrv_MEMIF_Read finish2, copy size_1:%x, u4DMAReadIdx:0x%x, u4WriteIdx:0x%x, u4DataRemained:%x \r\n", size_1,Afe_Block->u4DMAReadIdx,Afe_Block->u4WriteIdx,Afe_Block->u4DataRemained );*/ @@ -4588,11 +4570,11 @@ ssize_t AudDrv_MEMIF_Read(struct file *fp, char __user *data, size_t count, lof copy_to_user_fake((Read_Data_Ptr + size_1), size_2); #endif read_count += size_2; - spin_lock(&auddrv_ULInCtl_lock); + spin_lock_irqsave(&auddrv_ULInCtl_lock, flags); Afe_Block->u4DataRemained -= size_2; Afe_Block->u4DMAReadIdx += size_2; DMA_Read_Ptr = Afe_Block->u4DMAReadIdx; - spin_unlock(&auddrv_ULInCtl_lock); + spin_unlock_irqrestore(&auddrv_ULInCtl_lock, flags); count -= read_size; Read_Data_Ptr += read_size; @@ -4882,11 +4864,49 @@ static ssize_t audio_read_proc(struct file *fp, char __user *data, size_t count } +static ssize_t pmic_audio_read_proc(struct file *fp, char __user *data, size_t count, loff_t *offset) +{ + #define AUDIOREG_CAT_LEN (4096) + static bool bPrintDone = false; + char* stAudioInfo; + PRINTK_AUDDRV("pmic_audio_read_proc+\n"); + + if (bPrintDone == true) + { + bPrintDone = false; + return 0; + } + + stAudioInfo = vmalloc(AUDIOREG_CAT_LEN); + if (!stAudioInfo) + { + PRINTK_AUDDRV("pmic_audio_read_proc Null stAudioInfo\n"); + return 0; + } + AudDrv_Read_Procmem_PMIC(stAudioInfo,NULL,0,AUDIOREG_CAT_LEN,NULL,NULL); + if(copy_to_user(data,stAudioInfo, AUDIOREG_CAT_LEN)) + { + PRINTK_AUDDRV("pmic_audio_read_proc copy_to_user fail\n"); + } + vfree(stAudioInfo); + bPrintDone = true; + PRINTK_AUDDRV("pmic_audio_read_proc-\n"); + return AUDIOREG_CAT_LEN; + +} + + static struct file_operations audio_proc_fops = { .read = audio_read_proc, }; +static struct file_operations pmic_audio_proc_fops = +{ + .read = pmic_audio_read_proc, +}; + + static int AudDrv_mod_init(void) { int ret = 0; @@ -4919,6 +4939,7 @@ static int AudDrv_mod_init(void) */ #endif proc_create_data("audio",0,NULL,&audio_proc_fops,NULL); + proc_create_data("audiopmic",0,NULL,&pmic_audio_proc_fops,NULL); wake_lock_init(&Audio_wake_lock, WAKE_LOCK_SUSPEND, "Audio_WakeLock"); diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.h index 4ad6dafc814..e050c4d60dd 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_Kernel.h @@ -1,3 +1,15 @@ +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef AUDDRV_KERNEL_H #define AUDDRV_KERNEL_H diff --git a/drivers/misc/mediatek/sound/mt8127/AudDrv_ioctl.h b/drivers/misc/mediatek/sound/mt8127/AudDrv_ioctl.h index ecdeeb2a03a..30689c5322e 100644 --- a/drivers/misc/mediatek/sound/mt8127/AudDrv_ioctl.h +++ b/drivers/misc/mediatek/sound/mt8127/AudDrv_ioctl.h @@ -1,34 +1,15 @@ -/******************************************************************************* +/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. * - * Filename: - * --------- - * auddrv_ioctl.h + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. * - * Project: - * -------- - * Android Audio Driver - * - * Description: - * ------------ - * ioctl control message - * - * Author: - * ------- - * Chipeng (mtk02308) - * - * - *------------------------------------------------------------------------------ - * $Revision$ - * $Modtime:$ - * $Log:$ - * - * 09 28 2011 weiguo.li - * [ALPS00076254] [Need Patch] [Volunteer Patch]LGE audio driver using Voicebuffer for incall - * . - * - * - * - *******************************************************************************/ + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef _AUDDRV_IOCTL_MSG_H #define _AUDDRV_IOCTL_MSG_H @@ -59,6 +40,7 @@ #define AUDDRV_GET_UL_REMAINDATA_TIME _IOWR(AUD_DRV_IOC_MAGIC, 0x0B, int) // used audio get time stamp #define AUDDRV_AUDIO_REMAINING _IOWR(AUD_DRV_IOC_MAGIC, 0x0C, struct Data_Remaining*) +#define AUDDRV_AUDIO_CAPTURE_REMAINING _IOWR(AUD_DRV_IOC_MAGIC, 0x0D, struct Data_Remaining*) // Allocate mean allocate buffer and set stream into ready state. #define ALLOCATE_MEMIF_DL1 _IOWR(AUD_DRV_IOC_MAGIC, 0x10,unsigned int) diff --git a/drivers/misc/mediatek/ssw/Makefile b/drivers/misc/mediatek/ssw/Makefile index 34ca0fa115d..0708db48d64 100755 --- a/drivers/misc/mediatek/ssw/Makefile +++ b/drivers/misc/mediatek/ssw/Makefile @@ -2,9 +2,9 @@ SSW_DIR=$(srctree)/drivers/misc/mediatek/ssw/$(subst ",,$(CONFIG_CUSTOM_KERNEL_S ssw_exist=$(shell if [ -d ${SSW_DIR} ]; then echo "y"; else echo "n"; fi;) ifeq ($(ssw_exist), y) obj-y += $(subst ",,$(CONFIG_CUSTOM_KERNEL_SSW))/ -#$(warning "SSW_DIR=$(SSW_DIR)ssw_exist=$(ssw_exist)") +$(warning "SSW_DIR=$(SSW_DIR)ssw_exist=$(ssw_exist)") else -#$(warning "no $(SSW_DIR) folder, need check config ssw_exist=$(ssw_exist)") +$(warning "no $(SSW_DIR) folder, need check config ssw_exist=$(ssw_exist)") obj- := dummy.o # avoid build error endif diff --git a/drivers/misc/mediatek/tc1_interface/Makefile b/drivers/misc/mediatek/tc1_interface/Makefile new file mode 100755 index 00000000000..aef890a08ec --- /dev/null +++ b/drivers/misc/mediatek/tc1_interface/Makefile @@ -0,0 +1,5 @@ +ifeq ($(CONFIG_MTK_GPT_SCHEME_SUPPORT), y) +obj-y += gpt/ +else +obj-y += pmt/ +endif \ No newline at end of file diff --git a/drivers/misc/mediatek/tc1_interface/gpt/Makefile b/drivers/misc/mediatek/tc1_interface/gpt/Makefile new file mode 100755 index 00000000000..3fb215c60ea --- /dev/null +++ b/drivers/misc/mediatek/tc1_interface/gpt/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_MTK_TC1_FEATURE) += lg_partition.o +obj-$(CONFIG_MTK_TC1_FEATURE) += lgtest.o + diff --git a/drivers/misc/mediatek/tc1_interface/gpt/lg_partition.c b/drivers/misc/mediatek/tc1_interface/gpt/lg_partition.c new file mode 100644 index 00000000000..e480d5c5e52 --- /dev/null +++ b/drivers/misc/mediatek/tc1_interface/gpt/lg_partition.c @@ -0,0 +1,387 @@ +#include +#include +#include +#include /* printk() */ +#include /* kmalloc() */ +#include /* everything... filp_open */ +#include /* error codes */ +#include /* size_t */ +#include /*proc */ +#include /* O_ACCMODE */ +#include +#include /*set_fs get_fs mm_segment_t */ +#include +#include +#include +#include +#include +#include +//#include +#include "lg_partition.h" + +//#define PART_NAME "/dev/misc2" +#define PART_NAME "/dev/block/platform/mtk-msdc.0/by-name/misc2" + +#define PRINT printk +int g_init_write_size = 1; + +bool _LGE_GENERIC_WRITE_FUN(unsigned char *buff, unsigned int offset, unsigned int length) +{ + + int ret; + struct file *filp; + unsigned char *tmp; + mm_segment_t curr_fs; + filp = filp_open(PART_NAME, O_RDWR, 0666); + if (IS_ERR(filp)) + { + ret = PTR_ERR(filp); + printk("Open MISC2 partition fail! errno=%d\n", ret); + return -1; + } + printk("WRITE - Open MISC2 partition OK!\n"); + if (g_init_write_size ==0) + { + struct mtd_info_user info; + if (filp->f_op->unlocked_ioctl) + { + filp->f_op->unlocked_ioctl(filp, MEMGETINFO, (unsigned long) &info); + } else if (filp->f_op->compat_ioctl) + { + filp->f_op->compat_ioctl(filp, MEMGETINFO, (unsigned long) &info); + } + if (info.writesize != EMMC_BLOCK_SIZE) + { + printk("write size error!info.writesize=%d,EMMC_BLOCK_SIZE=%d\n", info.writesize, EMMC_BLOCK_SIZE); + g_init_write_size = 0; + filp_close(filp, NULL); + return false; + } else + { + g_init_write_size = 1; + } + } + + filp->f_op->llseek(filp, offset * EMMC_BLOCK_SIZE, SEEK_SET); + tmp = kzalloc(EMMC_BLOCK_SIZE, GFP_KERNEL); + if (!tmp) + { + printk("malloc memory fail!\n"); + filp_close(filp, NULL); + return false; + } + memset(tmp, 0x0, EMMC_BLOCK_SIZE); + curr_fs = get_fs(); + set_fs(KERNEL_DS); + memcpy(tmp, buff, length); + ret = filp->f_op->write(filp, tmp, EMMC_BLOCK_SIZE, &(filp->f_pos)); + if (EMMC_BLOCK_SIZE != ret) + { + printk("write fail!errno=%d\n", ret); + filp_close(filp, NULL); + kfree(tmp); + set_fs(curr_fs); + return false; + + } + set_fs(curr_fs); + kfree(tmp); + filp_close(filp, NULL); + printk("WRITE - OK!\n"); + + return true; +} + +bool _LGE_GENERIC_READ_FUN(unsigned char *buff, unsigned int offset, unsigned int length) +{ + + int ret; + struct file *filp; + unsigned char *tmp; + mm_segment_t curr_fs; + filp = filp_open(PART_NAME, O_RDWR, 0666); + if (IS_ERR(filp)) + { + ret = PTR_ERR(filp); + printk("Open MISC2 partition fail! errno=%d\n", ret); + return -1; + } + printk("READ - Open MISC2 partition OK!\n"); + if (g_init_write_size == 0) + { + struct mtd_info_user info; + if (filp->f_op->unlocked_ioctl) + { + filp->f_op->unlocked_ioctl(filp, MEMGETINFO, (unsigned long) &info); + } else if (filp->f_op->compat_ioctl) + { + filp->f_op->compat_ioctl(filp, MEMGETINFO, (unsigned long) &info); + } + if (info.writesize != EMMC_BLOCK_SIZE) + { + printk("write size error!info.writesize=%d,EMMC_BLOCK_SIZE=%d\n", info.writesize, EMMC_BLOCK_SIZE); + g_init_write_size = 0; + filp_close(filp, NULL); + return false; + } else + { + g_init_write_size = 1; + } + } + + filp->f_op->llseek(filp, offset * EMMC_BLOCK_SIZE, SEEK_SET); + tmp = kzalloc(EMMC_BLOCK_SIZE, GFP_KERNEL); + if (!tmp) + { + printk("malloc memory fail!\n"); + filp_close(filp, NULL); + return false; + } + memset(tmp, 0x0, EMMC_BLOCK_SIZE); + curr_fs = get_fs(); + set_fs(KERNEL_DS); + + ret = filp->f_op->read(filp, tmp, EMMC_BLOCK_SIZE, &(filp->f_pos)); + if (EMMC_BLOCK_SIZE != ret) + { + printk("read fail!errno=%d\n", ret); + filp_close(filp, NULL); + kfree(tmp); + set_fs(curr_fs); + return false; + + } + memcpy(buff, tmp, length); + set_fs(curr_fs); + kfree(tmp); + filp_close(filp, NULL); + printk("READ - OK!\n"); + + return true; +} + +bool LGE_FacWriteWifiMacAddr(unsigned char *wifiMacAddr, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(wifiMacAddr, LGE_FAC_WIFI_MAC_ADDR_OFFSET, LGE_FAC_WIFI_MAC_ADDR_LEN); +} + +bool LGE_FacReadWifiMacAddr(unsigned char *wifiMacAddr) +{ + return _LGE_GENERIC_READ_FUN(wifiMacAddr, LGE_FAC_WIFI_MAC_ADDR_OFFSET, LGE_FAC_WIFI_MAC_ADDR_LEN); +} + +bool LGE_FacWriteBtAddr(unsigned char *btAddr, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(btAddr, LGE_FAC_BT_ADDR_OFFSET, LGE_FAC_BT_ADDR_LEN); +} + +bool LGE_FacReadBtAddr(unsigned char *btAddr) +{ + return _LGE_GENERIC_READ_FUN(btAddr, LGE_FAC_BT_ADDR_OFFSET, LGE_FAC_BT_ADDR_LEN); +} + +const unsigned int imei_mapping_table[4] = { LGE_FAC_IMEI_1_OFFSET, LGE_FAC_IMEI_0_OFFSET, LGE_FAC_IMEI_2_OFFSET, LGE_FAC_IMEI_3_OFFSET}; + +bool LGE_FacWriteImei(unsigned char imei_type, unsigned char *imei, bool needFlashProgram) +{ + if(imei_mapping_table[imei_type]==LGE_FAC_IMEI_ENDMARK) return false; + + return _LGE_GENERIC_WRITE_FUN(imei, imei_mapping_table[imei_type], LGE_FAC_IMEI_LEN); +} + +bool LGE_FacReadImei(unsigned char imei_type, unsigned char *imei) +{ + if(imei_mapping_table[imei_type]==LGE_FAC_IMEI_ENDMARK) return false; + + return _LGE_GENERIC_READ_FUN(imei, imei_mapping_table[imei_type], LGE_FAC_IMEI_LEN); +} + +bool LGE_FacWriteSimLockType(unsigned char simLockType, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(&simLockType, LGE_FAC_SIM_LOCK_TYPE_OFFSET, LGE_FAC_SIM_LOCK_TYPE_LEN); +} + +bool LGE_FacReadSimLockType(unsigned char *simLockType) +{ + return _LGE_GENERIC_READ_FUN(simLockType, LGE_FAC_SIM_LOCK_TYPE_OFFSET, LGE_FAC_SIM_LOCK_TYPE_LEN); +} + +bool LGE_FacWriteNetworkCodeListNum(unsigned short *networkCodeListNum, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN((unsigned char *)&networkCodeListNum, LGE_FAC_NETWORK_CODE_LIST_NUM_OFFSET, LGE_FAC_NETWORK_CODE_LIST_NUM_LEN); +} + +bool LGE_FacReadNetworkCodeListNum(unsigned short *networkCodeListNum) +{ + return _LGE_GENERIC_READ_FUN((unsigned char *)networkCodeListNum, LGE_FAC_NETWORK_CODE_LIST_NUM_OFFSET, LGE_FAC_NETWORK_CODE_LIST_NUM_LEN); +} + +bool LGE_FacWriteUnlockCodeVerifyFailCount(unsigned char failCount, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(&failCount, LGE_FAC_UNLOCK_CODE_VERIFY_FAIL_COUNT_OFFSET, LGE_FAC_UNLOCK_CODE_VERIFY_FAIL_COUNT_LEN); +} + +bool LGE_FacReadUnlockCodeVerifyFailCount(unsigned char *failCount) +{ + return _LGE_GENERIC_READ_FUN(failCount, LGE_FAC_UNLOCK_CODE_VERIFY_FAIL_COUNT_OFFSET, LGE_FAC_UNLOCK_CODE_VERIFY_FAIL_COUNT_LEN); +} + +bool LGE_FacWriteUnlockFailCount(unsigned char simLockType, unsigned char failCount, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(&failCount, LGE_FAC_UNLOCK_FAIL_COUNT_OFFSET, LGE_FAC_UNLOCK_FAIL_COUNT_LEN); +} + +bool LGE_FacReadUnlockFailCount(unsigned char simLockType, unsigned char *failCount) +{ + return _LGE_GENERIC_READ_FUN(failCount, LGE_FAC_UNLOCK_FAIL_COUNT_OFFSET, LGE_FAC_UNLOCK_FAIL_COUNT_LEN); + +} + +bool LGE_FacWriteUnlockCode(FactoryUnlockCode * unlockCode, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN((unsigned char *)unlockCode, LGE_FAC_UNLOCK_CODE_OFFSET, LGE_FAC_UNLOCK_CODE_LEN); +} + +bool LGE_FacVerifyUnlockCode(unsigned char simLockType, unsigned char *unlockCode, bool * isOk) +{ + *isOk = true; + return true; +} + +bool LGE_FacCheckUnlockCodeValidness(bool * isValid) +{ + *isValid = true; + return true; +} + +bool LGE_FacWriteNetworkCode(FactoryNetworkCode * networkCode, unsigned short networkCodeListNum, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN((unsigned char *)networkCode, LGE_FAC_NETWORK_CODE_OFFSET, LGE_FAC_NETWORK_CODE_LEN); +} + +bool LGE_FacReadNetworkCode(FactoryNetworkCode * networkCode, unsigned short networkCodeListNum) +{ + return _LGE_GENERIC_READ_FUN((unsigned char *)networkCode, LGE_FAC_NETWORK_CODE_OFFSET, LGE_FAC_NETWORK_CODE_LEN); + +} + +bool LGE_FacCheckNetworkCodeValidness(unsigned char simLockType, bool * isValid) +{ + *isValid = true; + return true; +} + +bool LGE_FacInitSimLockData(void) +{ + return true; +} + +bool LGE_FacReadFusgFlag(unsigned char *fusgFlag) +{ + return _LGE_GENERIC_READ_FUN(fusgFlag, LGE_FAC_FUSG_FLAG_OFFSET, LGE_FAC_FUSG_FLAG_LEN); +} + +bool LGE_FacWriteFusgFlag(unsigned char fusgFlag, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(&fusgFlag, LGE_FAC_FUSG_FLAG_OFFSET, LGE_FAC_FUSG_FLAG_LEN); +} + +bool LGE_FacReadDataVersion(unsigned char *dataVersion) +{ + return _LGE_GENERIC_READ_FUN(dataVersion, LGE_FAC_DATA_VERSION_OFFSET, LGE_FAC_DATA_VERSION_LEN); +} + +bool LGE_FacWriteDataVersion(unsigned char *dataVersion, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(dataVersion, LGE_FAC_DATA_VERSION_OFFSET, LGE_FAC_DATA_VERSION_LEN); +} + +bool LGE_FacReadPid(unsigned char *pid) +{ + return _LGE_GENERIC_READ_FUN(pid, LGE_FAC_PID_OFFSET, LGE_FAC_PID_LEN); +} + +bool LGE_FacWritePid(unsigned char *pid, bool needFlashProgram) +{ + return _LGE_GENERIC_WRITE_FUN(pid, LGE_FAC_PID_OFFSET, LGE_FAC_PID_LEN); +} + +void LGE_FacGetSoftwareversion(bool isOriginalVersion, unsigned char *pVersion) +{ + int index = 0; + for (index = 0; index < LGE_FAC_SV_LEN; index++) + { + pVersion[index] = index; + } + return; +} + +int LGE_API_test(void) +{ + unsigned char buff[EMMC_BLOCK_SIZE]; + int index = 0; + memset(buff, 0xa, EMMC_BLOCK_SIZE); + for (index = 0; index < LGE_FAC_WIFI_MAC_ADDR_LEN; index++) + { + buff[index] = LGE_FAC_WIFI_MAC_ADDR_OFFSET+index; + } + LGE_FacWriteWifiMacAddr(buff, true); + memset(buff, 0x0, EMMC_BLOCK_SIZE); + LGE_FacReadWifiMacAddr(buff); + PRINT("kernel wifi data:"); + for (index = 0; index < LGE_FAC_WIFI_MAC_ADDR_LEN; index++) + { + PRINT(" 0x%x", buff[index]); + } + PRINT("\n"); + + memset(buff, 0xc, EMMC_BLOCK_SIZE); + for (index = 0; index < LGE_FAC_BT_ADDR_LEN; index++) + { + buff[index] = LGE_FAC_BT_ADDR_OFFSET+index; + } + LGE_FacWriteBtAddr(buff, true); + memset(buff, 0x1, EMMC_BLOCK_SIZE); + LGE_FacReadBtAddr(buff); + PRINT("kernel BT data:"); + for (index = 0; index < LGE_FAC_BT_ADDR_LEN; index++) + { + PRINT(" 0x%x", buff[index]); + } + PRINT("\n"); + return 0; +} + +EXPORT_SYMBOL(LGE_FacWriteWifiMacAddr); +EXPORT_SYMBOL(LGE_FacReadWifiMacAddr); +EXPORT_SYMBOL(LGE_FacWriteBtAddr); +EXPORT_SYMBOL(LGE_FacReadBtAddr); +EXPORT_SYMBOL(LGE_FacWriteImei); +EXPORT_SYMBOL(LGE_FacReadImei); +EXPORT_SYMBOL(LGE_FacWriteSimLockType); +EXPORT_SYMBOL(LGE_FacReadSimLockType); +EXPORT_SYMBOL(LGE_FacWriteUnlockCodeVerifyFailCount); +EXPORT_SYMBOL(LGE_FacReadUnlockCodeVerifyFailCount); +EXPORT_SYMBOL(LGE_FacWriteUnlockFailCount); +EXPORT_SYMBOL(LGE_FacReadUnlockFailCount); +EXPORT_SYMBOL(LGE_FacWriteUnlockCode); +EXPORT_SYMBOL(LGE_FacVerifyUnlockCode); +EXPORT_SYMBOL(LGE_FacCheckUnlockCodeValidness); +EXPORT_SYMBOL(LGE_FacWriteNetworkCode); +EXPORT_SYMBOL(LGE_FacReadNetworkCode); +EXPORT_SYMBOL(LGE_FacWriteNetworkCodeListNum); +EXPORT_SYMBOL(LGE_FacReadNetworkCodeListNum); +EXPORT_SYMBOL(LGE_FacCheckNetworkCodeValidness); +EXPORT_SYMBOL(LGE_FacInitSimLockData); +EXPORT_SYMBOL(LGE_FacReadFusgFlag); +EXPORT_SYMBOL(LGE_FacWriteFusgFlag); +EXPORT_SYMBOL(LGE_FacReadDataVersion); +EXPORT_SYMBOL(LGE_FacWriteDataVersion); +EXPORT_SYMBOL(LGE_FacReadPid); +EXPORT_SYMBOL(LGE_FacWritePid); +EXPORT_SYMBOL(LGE_FacGetSoftwareversion); +EXPORT_SYMBOL(LGE_API_test); + +MODULE_AUTHOR("Kai Zhu@mediatek.com"); +MODULE_DESCRIPTION("access partition API"); +MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mediatek/tc1_interface/gpt/lg_partition.h b/drivers/misc/mediatek/tc1_interface/gpt/lg_partition.h new file mode 100644 index 00000000000..0055b22170b --- /dev/null +++ b/drivers/misc/mediatek/tc1_interface/gpt/lg_partition.h @@ -0,0 +1,133 @@ +#ifndef __LG_PARTITION_H +#define __LG_PARTITION_H +/* DATA layout*/ +#define LGE_FAC_WIFI_MAC_ADDR_OFFSET (1) +#define LGE_FAC_BT_ADDR_OFFSET (2) +#define LGE_FAC_IMEI_MASTER_OFFSET (3) +#define LGE_FAC_IMEI_NOT_MASTER_OFFSET (4) +#define LGE_FAC_SIM_LOCK_TYPE_OFFSET (5) +#define LGE_FAC_NETWORK_CODE_LIST_NUM_OFFSET (6) +#define LGE_FAC_UNLOCK_CODE_VERIFY_FAIL_COUNT_OFFSET (7) +#define LGE_FAC_UNLOCK_FAIL_COUNT_OFFSET (8) +#define LGE_FAC_UNLOCK_CODE_OFFSET (9) +#define LGE_FAC_VERIFY_UNLOCK_CODE_OFFSET (10) +#define LGE_FAC_UNLOCK_CODE_VALIDNESS_OFFSET (11) +#define LGE_FAC_NETWORK_CODE_OFFSET (12) +#define LGE_FAC_NETWORK_CODE_VALIDNESS_OFFSET (13) +#define LGE_FAC_INIT_SIM_LOCK_DATA_OFFSET (14) +#define LGE_FAC_FUSG_FLAG_OFFSET (15) +#define LGE_FAC_DATA_VERSION_OFFSET (16) +#define LGE_FAC_PID_OFFSET (17) +#define LGE_FAC_SOFTWARE_VERSION_OFFSET (18) +#define LGE_FAC_IMEI_TRIPLE_OFFSET (19) +#define LGE_FAC_IMEI_QUADRUPLE_OFFSET (20) + +#define LGE_FAC_IMEI_ENDMARK (0xFFFFFFFF) + +#define LGE_FAC_IMEI_0_OFFSET LGE_FAC_IMEI_MASTER_OFFSET +#define LGE_FAC_IMEI_1_OFFSET LGE_FAC_IMEI_NOT_MASTER_OFFSET +#define LGE_FAC_IMEI_2_OFFSET LGE_FAC_IMEI_TRIPLE_OFFSET +#define LGE_FAC_IMEI_3_OFFSET LGE_FAC_IMEI_QUADRUPLE_OFFSET + +/*data length*/ +#define LGE_FAC_PID_PART_1_LEN 22 +#define LGE_FAC_PID_PART_2_LEN 10 +#define LGE_FAC_PID_LEN ( LGE_FAC_PID_PART_1_LEN + LGE_FAC_PID_PART_2_LEN ) /* decimal(22) + ASCII(10) */ +#define LGE_FAC_DATA_VERSION_LEN 4 +#define LGE_FAC_FUSG_FLAG 1 +#define LGE_FAC_UNLOCK_FAIL_COUNT_LEN 1 +#define LGE_FAC_UNLOCK_CODE_VERIFY_FAIL_COUNT_LEN 1 +#define LGE_FAC_VERIFY_UNLOCK_CODE_LEN 1 +#define LGE_FAC_NETWORK_CODE_LIST_NUM_LEN 2 +#define LGE_FAC_SIM_LOCK_TYPE_LEN 1 +#define LGE_FAC_BT_ADDR_LEN (0x6) /* hexadecimal */ +#define LGE_FAC_IMEI_LEN (15) /* decimal */ +#define LGE_FAC_WIFI_MAC_ADDR_LEN (6) +#define LGE_FAC_SUFFIX_STR_LEN (15) +#define LGE_FAC_NC_MCC_LEN 3 +#define LGE_FAC_NC_MNC_LEN 3 +#define LGE_FAC_NC_GID1_LEN 8 +#define LGE_FAC_NC_GID2_LEN 8 +#define LGE_FAC_NC_SUBSET_LEN 2 +#define LGE_FAC_NETWORK_CODE_LEN ( LGE_FAC_NC_MCC_LEN + LGE_FAC_NC_MNC_LEN + LGE_FAC_NC_GID1_LEN + LGE_FAC_NC_GID2_LEN + LGE_FAC_NC_SUBSET_LEN ) +#define LGE_FAC_SV_LEN 60 +#define LGE_FAC_FUSG_FLAG_LEN 1 +#define LGE_FAC_MAX_NETWORK_CODE_LIST_NUM (40) /* This number may be increased in the future */ +#define LGE_FAC_UNLOCK_CODE_LEN (16) +#define LGE_FAC_SLTYPE_VALID_MASK 0x1F +#define LGE_FAC_SLTYPE_MASK_NETWORK 0x01 +#define LGE_FAC_SLTYPE_MASK_SERVICE_PROVIDER 0x02 +#define LGE_FAC_SLTYPE_MASK_NETWORK_SUBSET 0x04 +#define LGE_FAC_SLTYPE_MASK_COOPERATE 0x08 +#define LGE_FAC_SLTYPE_MASK_LOCK_TO_SIM 0x10 +#define LGE_FAC_SLTYPE_MASK_HARDLOCK 0x20 +#define LGE_FAC_SLTYPE_MASK_RESERVED_1 0x40 /* T.B.D */ +#define LGE_FAC_SLTYPE_MASK_RESERVED_2 0x80 /* T.B.D */ +#define LGE_FAC_MAX_UNLOCK_CODE_VERIFY_FAIL_COUNT 3 + +#define EMMC_BLOCK_SIZE 512 + +#ifndef bool +#define bool unsigned char +#define true 1 +#define false 0 +#endif + +typedef struct FactoryNetworkCodeTag +{ + unsigned char Mcc[LGE_FAC_NC_MCC_LEN]; /* Ex) { 2, 4, 5 } */ + unsigned char Mnc[LGE_FAC_NC_MNC_LEN]; /* Ex) { 4, 3, 0xF } */ + unsigned char Gid1[LGE_FAC_NC_GID1_LEN]; /* Ex) { 0xB, 2, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF } */ + unsigned char Gid2[LGE_FAC_NC_GID2_LEN]; /* Ex) { 8, 0xA, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF } */ + unsigned char Subset[LGE_FAC_NC_SUBSET_LEN]; /* Ex) { 6, 2 } */ + unsigned char dummy[8]; +} FactoryNetworkCode; + +typedef struct FactoryUnlockCodeTag +{ + unsigned char network[LGE_FAC_UNLOCK_CODE_LEN]; + unsigned char serviceProvider[LGE_FAC_UNLOCK_CODE_LEN]; + unsigned char networkSubset[LGE_FAC_UNLOCK_CODE_LEN]; + unsigned char cooperate[LGE_FAC_UNLOCK_CODE_LEN]; + unsigned char lockToSim[LGE_FAC_UNLOCK_CODE_LEN]; + unsigned char hardlock[LGE_FAC_UNLOCK_CODE_LEN]; + unsigned char reserved_1[LGE_FAC_UNLOCK_CODE_LEN]; + unsigned char reserved_2[LGE_FAC_UNLOCK_CODE_LEN]; +} FactoryUnlockCode; + +bool LGE_FacWriteWifiMacAddr(unsigned char *wifiMacAddr, bool needFlashProgram); +bool LGE_FacReadWifiMacAddr(unsigned char *wifiMacAddr); +bool LGE_FacWriteBtAddr(unsigned char *btAddr, bool needFlashProgram); +bool LGE_FacReadBtAddr(unsigned char *btAddr); +bool LGE_FacWriteImei(unsigned char imei_type, unsigned char *imei, bool needFlashProgram); +bool LGE_FacReadImei(unsigned char imei_type, unsigned char *imei); +bool LGE_FacWriteSimLockType(unsigned char simLockType, bool needFlashProgram); +bool LGE_FacReadSimLockType(unsigned char *simLockType); +bool LGE_FacWriteUnlockCodeVerifyFailCount(unsigned char failCount, bool needFlashProgram); +bool LGE_FacReadUnlockCodeVerifyFailCount(unsigned char *failCount); +bool LGE_FacWriteUnlockFailCount(unsigned char simLockType, unsigned char failCount, bool needFlashProgram); +bool LGE_FacReadUnlockFailCount(unsigned char simLockType, unsigned char *failCount); +bool LGE_FacWriteUnlockCode(FactoryUnlockCode * unlockCode, bool needFlashProgram); +bool LGE_FacVerifyUnlockCode(unsigned char simLockType, unsigned char *unlockCode, bool * isOk); +bool LGE_FacCheckUnlockCodeValidness(bool * isValid); +bool LGE_FacWriteNetworkCode(FactoryNetworkCode * networkCode, unsigned short networkCodeListNum, bool needFlashProgram); +bool LGE_FacReadNetworkCode(FactoryNetworkCode * networkCode, unsigned short networkCodeListNum); +bool LGE_FacWriteNetworkCodeListNum(unsigned short *networkCodeListNum, bool needFlashProgram); +bool LGE_FacReadNetworkCodeListNum(unsigned short *networkCodeListNum); +bool LGE_FacCheckNetworkCodeValidness(unsigned char simLockType, bool * isValid); +bool LGE_FacInitSimLockData(void); +bool LGE_FacReadFusgFlag(unsigned char *fusgFlag); +bool LGE_FacWriteFusgFlag(unsigned char fusgFlag, bool needFlashProgram); +bool LGE_FacReadDataVersion(unsigned char *dataVersion); +bool LGE_FacWriteDataVersion(unsigned char *dataVersion, bool needFlashProgram); +bool LGE_FacReadPid(unsigned char *pid); +bool LGE_FacWritePid(unsigned char *pid, bool needFlashProgram); +void LGE_FacGetSoftwareversion(bool isOriginalVersion, unsigned char *pVersion); +int LGE_API_test(void); + +/*#define TC1_GET_NAME(fname) "LGE_"#fname +#define TC1_FAC_NAME(fname) LGE_##fname +#define TC1_FAC_IMEI_LEN LGE_FAC_IMEI_LEN +#define TC1_FAC_NETWORK_CODE_LEN LGE_FAC_NETWORK_CODE_LEN +*/ +#endif diff --git a/drivers/misc/mediatek/tc1_interface/gpt/lgtest.c b/drivers/misc/mediatek/tc1_interface/gpt/lgtest.c new file mode 100644 index 00000000000..c765efff145 --- /dev/null +++ b/drivers/misc/mediatek/tc1_interface/gpt/lgtest.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lg_partition.h" + +static int __init test_init(void) +{ + msleep(3000); + printk("start test kernel LG API ....\n"); + LGE_API_test(); + printk("end test kernel LG API...\n"); + + return 1; +} + +/* should never be called */ +static void __exit test_exit(void) +{ + +} + +late_initcall(test_init); +module_exit(test_exit); + +MODULE_AUTHOR("kai.zhu@mediatek.com"); +MODULE_DESCRIPTION("test module"); +MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mediatek/tc1_interface/gpt/tc1_partition.h b/drivers/misc/mediatek/tc1_interface/gpt/tc1_partition.h new file mode 100644 index 00000000000..35a4c143a52 --- /dev/null +++ b/drivers/misc/mediatek/tc1_interface/gpt/tc1_partition.h @@ -0,0 +1,13 @@ +#ifndef _TC1_PARTITION_H +#define __TC1_PARTITION_H + +#include "lg_partition.h" + +#define TC1_GET_NAME(fname) ("LGE_"#fname) +#define TC1_FAC_NAME(fname) LGE_##fname + + +#define TC1_FAC_IMEI_LEN LGE_FAC_IMEI_LEN +#define TC1_FAC_NETWORK_CODE_LEN LGE_FAC_NETWORK_CODE_LEN + +#endif diff --git a/drivers/misc/mediatek/thermal/Makefile b/drivers/misc/mediatek/thermal/Makefile index ce3bc28435e..c7d1df0c9c8 100755 --- a/drivers/misc/mediatek/thermal/Makefile +++ b/drivers/misc/mediatek/thermal/Makefile @@ -1,15 +1,4 @@ ccflags-y += -I$(srctree) obj-$(CONFIG_THERMAL) += mtk_thermal_monitor.o -obj-$(CONFIG_THERMAL) += mtk_cooler_shutdown.o -ifeq ($(CONFIG_MTK_LEDS), y) - # setMaxbrightness() defined in mediatek/kernel/drivers/leds/leds_drv.c only built when CONFIG_MTK_LEDS is set - obj-$(CONFIG_THERMAL) += mtk_cooler_backlight.o -endif -obj-$(CONFIG_THERMAL) += mtk_cooler_kshutdown.o -#obj-$(CONFIG_THERMAL) += mtk_cooler_spkrvol.o -#obj-$(CONFIG_THERMAL) += mtk_cooler_dropcall.o -obj-$(CONFIG_THERMAL) += mtk_cooler_cam.o -#obj-$(CONFIG_THERMAL) += mtk_cooler_vrt.o - -obj-y += $(subst ",,$(CONFIG_MTK_PLATFORM))/ - +obj-$(CONFIG_THERMAL) += mt8127/ +obj-$(CONFIG_THERMAL) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ diff --git a/drivers/misc/mediatek/thermal/mt8127/Makefile b/drivers/misc/mediatek/thermal/mt8127/Makefile index 5414616b7e3..a6577d47894 100755 --- a/drivers/misc/mediatek/thermal/mt8127/Makefile +++ b/drivers/misc/mediatek/thermal/mt8127/Makefile @@ -1,78 +1,24 @@ include $(srctree)/drivers/misc/mediatek/Makefile.custom +ccflags-y += -I$(srctree)/drivers/thermal -ccflags-y += -I$(srctree) -obj- := dummy.o - -ifeq ($(CONFIG_THERMAL), y) -else - obj-y += mtk_thermal_dummy.o -endif - -obj-$(CONFIG_THERMAL) += mtk_thermal_platform.o +obj-$(CONFIG_THERMAL) := mtk_thermal_platform.o obj-$(CONFIG_THERMAL) += mtk_ts_pa_thput.o -#obj-$(CONFIG_THERMAL) += mtk_ts_skin.o + +obj-$(CONFIG_THERMAL) += mtk_cpufreq_cooling.o +obj-$(CONFIG_THERMAL) += mtk_hotplug_cooling.o +obj-$(CONFIG_THERMAL) += mtk_backlight_cooling.o +obj-$(CONFIG_THERMAL) += mtk_charger_cooling.o +obj-$(CONFIG_THERMAL) += mtk_ts_cpu.o +obj-$(CONFIG_THERMAL) += mtk_ts_abb.o +obj-$(CONFIG_THERMAL) += mtk_ts_battery.o +obj-$(CONFIG_THERMAL) += mtk_ts_bts.o + +ifeq ($(CONFIG_MTK_PMIC_MT6397),y) + obj-$(CONFIG_THERMAL) += mtk_ts_pmic6397.o +else + obj-$(CONFIG_THERMAL) += mtk_ts_pmic6323.o +endif ifneq ($(CONFIG_MTK_COMBO_WIFI),) obj-$(CONFIG_THERMAL) += mtk_ts_wmt.o endif - -# Only included in non-EVB projects -ifeq ($(CONFIG_POWER_EXT), y) -else - ifeq ($(CONFIG_MTK_SMART_BATTERY), y) - # Always align the Makefile in mediatek/platform/mt6582/kernel/drivers/power/ - ifeq ($(CONFIG_MTK_NCP1851_SUPPORT),y) - obj-$(CONFIG_THERMAL) += mtk_cooler_bcct.o - else - ifeq ($(CONFIG_MTK_BQ24196_SUPPORT),y) - obj-$(CONFIG_THERMAL) += mtk_cooler_bcct.o - else - # FAN5405 or PMIC6320 pulse charging or new charger IC - obj-$(CONFIG_THERMAL) += mtk_cooler_bcct.o - endif - endif - endif -endif - -obj-y += mtk_ts_cpu.o - -ifeq ($(CONFIG_THERMAL),y) - ifeq ($(CONFIG_MTK_PMIC_MT6397),y) - obj-y += mtk_ts_pmic6397.o - else - obj-y += mtk_ts_pmic6323.o - endif - obj-y += mtk_ts_pa.o - obj-y += mtk_ts_abb.o - #obj-y += mtk_ts_xtal.o - ifeq ($(CONFIG_MTK_ENABLE_MD2),y) - ifeq ($(CONFIG_MTK_MD2_SUPPORT),3) - obj-y += mtk_ts_tdpa.o - endif - endif - - ifeq ($(CONFIG_POWER_EXT), y) - else - ifeq ($(CONFIG_MTK_SMART_BATTERY), y) - # Always align the Makefile in mediatek/platform/mt6589/kernel/drivers/power/ - ifeq ($(CONFIG_MTK_NCP1851_SUPPORT),y) - obj-y += mtk_ts_battery.o - else - ifeq ($(CONFIG_MTK_BQ24196_SUPPORT),y) - obj-y += mtk_ts_battery.o - else - # FAN5405 or PMIC pulse charging - obj-y += mtk_ts_battery.o - endif - endif - endif - endif - ifeq ($(CONFIG_MTK_PCB_BATTERY_SENSOR), y) - obj-y += mtk_ts_battery2.o - endif -endif - - -ifeq ($(CONFIG_MTK_TMP103_SUPPORT),y) -#obj-$(CONFIG_THERMAL) += mtk_ts_pcb.o -endif diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_backlight_cooling.c b/drivers/misc/mediatek/thermal/mt8127/mtk_backlight_cooling.c new file mode 100644 index 00000000000..023086c7cfb --- /dev/null +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_backlight_cooling.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2015 Lab126, Inc. All rights reserved. + * Author: Akwasi Boateng + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef pr_fmt +#undef pr_fmt +#endif +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + + +#include +#include +#include +#include +#include +#include + +#include "mach/mtk_thermal_monitor.h" +#include "linux/platform_data/mtk_thermal.h" + +extern int setMaxbrightness(int max_level, int enable); + +static int mtk_backlight_cooling_get_max_state(struct thermal_cooling_device *cdev, unsigned long *state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + *state = pdata->max_state; + return 0; +} + +static int mtk_backlight_cooling_get_cur_state(struct thermal_cooling_device *cdev, unsigned long *state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + *state = pdata->state; + return 0; +} + +static int mtk_backlight_cooling_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + int level = pdata->levels[state]; + pdata->level = level; + setMaxbrightness(level, true); + pr_info("%s thermal limit %d\n", __func__, level); + pdata->state = state; + return 0; +} + +static ssize_t levels_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct mtk_cooler_platform_data *pdata = cdev->devdata; + int i; + int offset = 0; + + if (!pdata) + return -EINVAL; + for (i = 0; i < THERMAL_MAX_TRIPS; i++) + offset += sprintf(buf + offset, "%d %d\n", i, pdata->levels[i]); + return offset; +} + +static ssize_t levels_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int level, state; + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct mtk_cooler_platform_data *pdata = cdev->devdata; + + if (!pdata) + return -EINVAL; + if (sscanf(buf, "%d %d\n", &state, &level) != 2) + return -EINVAL; + if (state > THERMAL_MAX_TRIPS) + return -EINVAL; + pdata->levels[state] = level; + return count; +} + +static DEVICE_ATTR(levels, S_IRUGO | S_IWUSR, levels_show, levels_store); + +static struct thermal_cooling_device_ops mtk_backlight_cooling_ops = { + .get_max_state = mtk_backlight_cooling_get_max_state, + .get_cur_state = mtk_backlight_cooling_get_cur_state, + .set_cur_state = mtk_backlight_cooling_set_cur_state, +}; + +static int mtk_backlight_cooling_probe(struct platform_device *pdev) +{ + struct mtk_cooler_platform_data *pdata = dev_get_platdata(&pdev->dev); + + if (!pdata) + return -EINVAL; + + pdata->cdev = thermal_cooling_device_register(pdata->type, pdata, &mtk_backlight_cooling_ops); + + if (IS_ERR(pdata->cdev)) { + dev_err(&pdev->dev, "Failed to register backlight cooling device\n"); + return PTR_ERR(pdata->cdev); + } + + platform_set_drvdata(pdev, pdata->cdev); + device_create_file(&pdata->cdev->device, &dev_attr_levels); + dev_info(&pdev->dev, "Cooling device registered: %s\n", pdata->cdev->type); + + return 0; +} + +static int mtk_backlight_cooling_remove(struct platform_device *pdev) +{ + struct thermal_cooling_device *cdev = platform_get_drvdata(pdev); + + thermal_cooling_device_unregister(cdev); + + return 0; +} + +static struct platform_driver mtk_backlight_cooling_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "mtk-backlight-cooling", + }, + .probe = mtk_backlight_cooling_probe, + .remove = mtk_backlight_cooling_remove, +}; + +struct mtk_cooler_platform_data mtk_backlight_cooling_pdata = { + .type = "backlight", + .state = 0, + .max_state = 4, + .level = 255, + .levels = { + 255, 204, 153, 102, 51 + }, +}; + +static struct platform_device mtk_backlight_cooling_device = { + .name = "mtk-backlight-cooling", + .id = -1, + .dev = { + .platform_data = &mtk_backlight_cooling_pdata, + }, +}; + +static int __init mtk_backlight_cooling_init(void) +{ + int ret; + ret = platform_driver_register(&mtk_backlight_cooling_driver); + if (ret) { + pr_err("Unable to register backlight cooling driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtk_backlight_cooling_device); + if (ret) { + pr_err("Unable to register backlight cooling device (%d)\n", ret); + return ret; + } + return 0; +} + +static void __exit mtk_backlight_cooling_exit(void) +{ + platform_driver_unregister(&mtk_backlight_cooling_driver); + platform_device_unregister(&mtk_backlight_cooling_device); +} + +module_init(mtk_backlight_cooling_init); +module_exit(mtk_backlight_cooling_exit); + +MODULE_AUTHOR("Akwasi Boateng "); +MODULE_DESCRIPTION("MTK backlight cooling driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_charger_cooling.c b/drivers/misc/mediatek/thermal/mt8127/mtk_charger_cooling.c new file mode 100644 index 00000000000..83b9accfa4e --- /dev/null +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_charger_cooling.c @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2015 Lab126, Inc. All rights reserved. + * Author: Akwasi Boateng + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef pr_fmt +#undef pr_fmt +#endif +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + + +#include +#include +#include +#include +#include +#include +#include + +#include "mach/mtk_thermal_monitor.h" +#include "linux/platform_data/mtk_thermal.h" + +/** + * current_limit means limit of charging current in mA + * -1 means no limit + */ +extern int set_bat_charging_current_limit(int current_limit); + +static int mtk_charger_cooling_get_max_state(struct thermal_cooling_device *cdev, unsigned long *state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + *state = pdata->max_state; + return 0; +} + +static int mtk_charger_cooling_get_cur_state(struct thermal_cooling_device *cdev, unsigned long *state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + *state = pdata->state; + return 0; +} + +static int mtk_charger_cooling_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + int level = pdata->levels[state]; + pdata->level = level; + set_bat_charging_current_limit(level); + pr_info("%s thermal limit %d\n", __func__, level); + pdata->state = state; + return 0; +} + +static ssize_t levels_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct mtk_cooler_platform_data *pdata = cdev->devdata; + int i; + int offset = 0; + + if (!pdata) + return -EINVAL; + for (i = 0; i < THERMAL_MAX_TRIPS; i++) + offset += sprintf(buf + offset, "%d %d\n", i, pdata->levels[i]); + return offset; +} + +static ssize_t levels_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int level, state; + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct mtk_cooler_platform_data *pdata = cdev->devdata; + + if (!pdata) + return -EINVAL; + if (sscanf(buf, "%d %d\n", &state, &level) != 2) + return -EINVAL; + if (state > THERMAL_MAX_TRIPS) + return -EINVAL; + pdata->levels[state] = level; + return count; +} + +static DEVICE_ATTR(levels, S_IRUGO | S_IWUSR, levels_show, levels_store); + +static struct thermal_cooling_device_ops mtk_charger_cooling_ops = { + .get_max_state = mtk_charger_cooling_get_max_state, + .get_cur_state = mtk_charger_cooling_get_cur_state, + .set_cur_state = mtk_charger_cooling_set_cur_state, +}; + +static int mtk_charger_cooling_probe(struct platform_device *pdev) +{ + struct mtk_cooler_platform_data *pdata = dev_get_platdata(&pdev->dev); + + if (!pdata) + return -EINVAL; + + pdata->cdev = thermal_cooling_device_register(pdata->type, pdata, &mtk_charger_cooling_ops); + + if (IS_ERR(pdata->cdev)) { + dev_err(&pdev->dev, "Failed to register charger cooling device\n"); + return PTR_ERR(pdata->cdev); + } + + platform_set_drvdata(pdev, pdata->cdev); + device_create_file(&pdata->cdev->device, &dev_attr_levels); + dev_info(&pdev->dev, "Cooling device registered: %s\n", pdata->cdev->type); + + return 0; +} + +static int mtk_charger_cooling_remove(struct platform_device *pdev) +{ + struct thermal_cooling_device *cdev = platform_get_drvdata(pdev); + + thermal_cooling_device_unregister(cdev); + + return 0; +} + +static struct platform_driver mtk_charger_cooling_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "mtk-charger-cooling", + }, + .probe = mtk_charger_cooling_probe, + .remove = mtk_charger_cooling_remove, +}; + +struct mtk_cooler_platform_data mtk_charger_cooling_pdata = { + .type = "charger", + .state = 0, + .max_state = 11, + .level = CHARGE_CURRENT_1000_00_MA, + .levels = { + CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, + CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, + CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, + CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, CHARGE_CURRENT_1000_00_MA, + }, +}; + +static struct platform_device mtk_charger_cooling_device = { + .name = "mtk-charger-cooling", + .id = -1, + .dev = { + .platform_data = &mtk_charger_cooling_pdata, + }, +}; + +static int __init mtk_charger_cooling_init(void) +{ + int ret; + ret = platform_driver_register(&mtk_charger_cooling_driver); + if (ret) { + pr_err("Unable to register charger cooling driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtk_charger_cooling_device); + if (ret) { + pr_err("Unable to register charger cooling device (%d)\n", ret); + return ret; + } + return 0; +} + +static void __exit mtk_charger_cooling_exit(void) +{ + platform_driver_unregister(&mtk_charger_cooling_driver); + platform_device_unregister(&mtk_charger_cooling_device); +} + +module_init(mtk_charger_cooling_init); +module_exit(mtk_charger_cooling_exit); + +MODULE_AUTHOR("Akwasi Boateng "); +MODULE_DESCRIPTION("MTK charger cooling driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_cooler_bcct.c b/drivers/misc/mediatek/thermal/mt8127/mtk_cooler_bcct.c index ba1e5727b89..80da2591f9c 100644 --- a/drivers/misc/mediatek/thermal/mt8127/mtk_cooler_bcct.c +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_cooler_bcct.c @@ -290,7 +290,8 @@ static ssize_t _cl_bcct_write(struct file *filp, const char __user *buf, size_t char tmp[128] = { 0 }; int klog_on, limit0, limit1, limit2; - len = (len < 127) ? len : 127; + len = (len < (128-1)) ? len : (128-1); + /* write data to the buffer */ if (copy_from_user(tmp, buf, len)) { return -EFAULT; diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_cpufreq_cooling.c b/drivers/misc/mediatek/thermal/mt8127/mtk_cpufreq_cooling.c new file mode 100644 index 00000000000..00c6e2dd4d8 --- /dev/null +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_cpufreq_cooling.c @@ -0,0 +1,158 @@ +/* + * mtk_cpufreq_cooling.c - MTK cpufreq works as cooling device. + * + * Copyright (C) 2015 Amazon, Inc. All rights reserved. + * + * Author: Akwasi Boateng + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_STATE 4 /* 0-4 total 5 */ + +static ssize_t levels_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct cpufreq_cooling_device *cpufreq_device; + struct cpumask *mask; + int offset = 0; + unsigned int freq; + unsigned int cpu; + int i; + unsigned int cpu_freq_level; + if (!cdev) + return -EINVAL; + cpufreq_device = (struct cpufreq_cooling_device *)cdev->devdata; + if (!cpufreq_device) + return -EINVAL; + mask = &cpufreq_device->allowed_cpus; + cpu = cpumask_any(mask); + mutex_lock(&cdev->lock); + for (i=0; i<=MAX_STATE; i++) { + cpu_freq_level = cpufreq_device->levels[i]; + freq = cpufreq_cooling_get_frequency(cpu, cpu_freq_level); + offset += sprintf(buf + offset, "%u %u\n", i, freq); + } + mutex_unlock(&cdev->lock); + return offset; +} + +static ssize_t levels_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct cpufreq_cooling_device *cpufreq_device; + struct cpumask *mask; + unsigned int freq, cpufreq_state; + unsigned long level; + unsigned int cpu; + + if (!cdev) + return -EINVAL; + cpufreq_device = (struct cpufreq_cooling_device *)cdev->devdata; + if (!cpufreq_device) + return -EINVAL; + mask = &cpufreq_device->allowed_cpus; + cpu = cpumask_any(mask); + + if (sscanf(buf, "%u %u\n", &cpufreq_state, &freq) != 2) + return -EINVAL; + if (cpufreq_state > MAX_STATE) + return -EINVAL; + mutex_lock(&cdev->lock); + level = cpufreq_cooling_get_level(cpu, freq); + pr_debug("\n%s mtk_cpufreq_cooling cpufreq_state=%u freq=%u level=%lu", __func__, cpufreq_state, freq, level); + + /* Verify a cpufreq level exists for the desired frequency */ + if (level == THERMAL_CSTATE_INVALID) + return -EINVAL; + + /* cpufreq level exits for this cpufreq, set it for this state */ + cpufreq_device->levels[cpufreq_state] = level; + + mutex_unlock(&cdev->lock); + + return count; +} + +static DEVICE_ATTR(levels, S_IRUGO | S_IWUSR, levels_show, levels_store); + + +static int mtk_cpufreq_cooling_probe(struct platform_device *pdev) +{ + struct thermal_cooling_device *cdev; + struct cpumask mask_val; + + if (!cpufreq_frequency_get_table(0)) + return -EPROBE_DEFER; + + cpumask_set_cpu(0, &mask_val); + cdev = cpufreq_cooling_register(&mask_val); + + if (IS_ERR(cdev)) { + dev_err(&pdev->dev, "Failed to register cooling device\n"); + return PTR_ERR(cdev); + } + + device_create_file(&cdev->device, &dev_attr_levels); + platform_set_drvdata(pdev, cdev); + + dev_info(&pdev->dev, "Cooling device registered: %s\n", cdev->type); + + return 0; +} + +static int mtk_cpufreq_cooling_remove(struct platform_device *pdev) +{ + struct thermal_cooling_device *cdev = platform_get_drvdata(pdev); + + cpufreq_cooling_unregister(cdev); + + return 0; +} + +static struct platform_driver mtk_cpufreq_cooling_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "mtk-cpufreq-cooling", + }, + .probe = mtk_cpufreq_cooling_probe, + .remove = mtk_cpufreq_cooling_remove, +}; + +static int __init mtk_cpufreq_cooling_init(void) +{ + return platform_driver_register(&mtk_cpufreq_cooling_driver); +} + +static void __exit mtk_cpufreq_cooling_exit(void) +{ + platform_driver_unregister(&mtk_cpufreq_cooling_driver); +} + +late_initcall(mtk_cpufreq_cooling_init); +module_exit(mtk_cpufreq_cooling_exit); + +MODULE_AUTHOR("Akwasi Boateng "); +MODULE_DESCRIPTION("MTK cpufreq cooling driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_hotplug_cooling.c b/drivers/misc/mediatek/thermal/mt8127/mtk_hotplug_cooling.c new file mode 100644 index 00000000000..1b2252b387c --- /dev/null +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_hotplug_cooling.c @@ -0,0 +1,172 @@ +#ifdef pr_fmt +#undef pr_fmt +#endif +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include "linux/platform_data/mtk_thermal.h" +#include "mach/mtk_thermal_monitor.h" + +#define MAX_UNPLUG_CORE 3 + +extern void hp_limited_cpu_num(int num); + +static int mtk_hotplug_get_max_state(struct thermal_cooling_device *cdev, unsigned long *state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + *state = pdata->max_state; + return 0; +} + +static int mtk_hotplug_get_cur_state(struct thermal_cooling_device *cdev, unsigned long *state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + *state = pdata->state; + return 0; +} + +static int mtk_hotplug_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) +{ + struct mtk_cooler_platform_data *pdata = cdev->devdata; + int level = pdata->levels[state]; + + pdata->level = level; + if (level >= 0 && level <= MAX_UNPLUG_CORE) { // only can unplug 3 cpu max + hp_limited_cpu_num(4-level); + pr_info("%s state %ld, level %d\n", __func__, state, level); + } + else + pr_err("%s wrong level state %ld, level %d\n", __func__, state, level); + pdata->state = state; + + return 0; +} + +static ssize_t levels_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct mtk_cooler_platform_data *pdata = cdev->devdata; + int i; + int offset = 0; + + if (!pdata) + return -EINVAL; + for (i = 0; i < THERMAL_MAX_TRIPS; i++) + offset += sprintf(buf + offset, "%d %d\n", i, pdata->levels[i]); + return offset; +} + +static ssize_t levels_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int level, state; + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct mtk_cooler_platform_data *pdata = cdev->devdata; + + if (!pdata) + return -EINVAL; + if (sscanf(buf, "%d %d\n", &state, &level) != 2) + return -EINVAL; + if (state > THERMAL_MAX_TRIPS) + return -EINVAL; + if (level < 0 || level > MAX_UNPLUG_CORE) + return -EINVAL; + + pdata->levels[state] = level; + return count; +} + +static DEVICE_ATTR(levels, S_IRUGO | S_IWUSR, levels_show, levels_store); + + +static struct thermal_cooling_device_ops mtk_hotplug_cooling_ops = { + .get_max_state = mtk_hotplug_get_max_state, + .get_cur_state = mtk_hotplug_get_cur_state, + .set_cur_state = mtk_hotplug_set_cur_state, +}; + + +static int mtk_hotplug_cooling_probe(struct platform_device *pdev) +{ + struct mtk_cooler_platform_data *pdata = dev_get_platdata(&pdev->dev); + + if (!pdata) + return -EINVAL; + + pdata->cdev = thermal_cooling_device_register(pdata->type, pdata, &mtk_hotplug_cooling_ops); + + if (IS_ERR(pdata->cdev)) { + dev_err(&pdev->dev, "Failed to register hotplug cooling device\n"); + return PTR_ERR(pdata->cdev); + } + + platform_set_drvdata(pdev, pdata->cdev); + device_create_file(&pdata->cdev->device, &dev_attr_levels); + dev_info(&pdev->dev, "Cooling device registered: %s\n", pdata->cdev->type); + + return 0; +} + +static int mtk_hotplug_cooling_remove(struct platform_device *pdev) +{ + struct thermal_cooling_device *cdev = platform_get_drvdata(pdev); + + thermal_cooling_device_unregister(cdev); + return 0; +} + +static struct platform_driver mtk_hotplug_cooling_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "mtk-hotplug-cooling", + }, + .probe = mtk_hotplug_cooling_probe, + .remove = mtk_hotplug_cooling_remove, +}; + +struct mtk_cooler_platform_data mtk_hotplug_cooling_pdata = { + .type = "cpuhotplug", + .state = 0, + .max_state = 4, /* 0-4 total 5 */ + .level = 0, + .levels = { + 0, 0, 0, 0, 0 + }, +}; + +static struct platform_device mtk_hotplug_cooling_device = { + .name = "mtk-hotplug-cooling", + .id = -1, + .dev = { + .platform_data = &mtk_hotplug_cooling_pdata, + }, +}; + +static int __init mtk_cooler_hotplug_init(void) +{ + int ret; + ret = platform_driver_register(&mtk_hotplug_cooling_driver); + if (ret) { + pr_err("Unable to register hotplug cooling driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtk_hotplug_cooling_device); + if (ret) { + pr_err("Unable to register hotplug cooling device (%d)\n", ret); + return ret; + } + return 0; +} + +static void __exit mtk_cooler_hotplug_exit(void) +{ + platform_driver_unregister(&mtk_hotplug_cooling_driver); + platform_device_unregister(&mtk_hotplug_cooling_device); +} +module_init(mtk_cooler_hotplug_init); +module_exit(mtk_cooler_hotplug_exit); diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_abb.c b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_abb.c index bb7491e8698..667e5a023cb 100644 --- a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_abb.c +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_abb.c @@ -1,10 +1,10 @@ /* * Copyright (C) 2011-2014 MediaTek Inc. -* -* This program is free software: you can redistribute it and/or modify it under the terms of the +* +* 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. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * @@ -12,570 +12,282 @@ * If not, see . */ -#ifdef pr_fmt -#undef pr_fmt -#endif -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include -#include -#include -#include -#include +#include +#include #include #include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include -#include +#include +#include -#include "mach/mtk_thermal_monitor.h" #include - #include "mach/mt_typedefs.h" #include "mach/mt_thermal.h" -#define MTK_TS_ABB_SW_FILTER (1) +#include +#include -extern struct proc_dir_entry * mtk_thermal_get_proc_drv_therm_dir_entry(void); +#define MTKTSABB_TEMP_CRIT 118000 /* 120.000 degree Celsius */ +static DEFINE_MUTEX(therm_lock); -static unsigned int interval = 0; /* seconds, 0 : no auto polling */ -static unsigned int trip_temp[10] = {120000,110000,100000,90000,80000,70000,65000,60000,55000,50000}; +struct mtktsabb_thermal_zone { + struct thermal_zone_device *tz; + struct work_struct therm_work; + struct mtk_thermal_platform_data *pdata; + struct thermal_dev *therm_fw; +}; -static unsigned int cl_dev_sysrst_state = 0; -static struct thermal_zone_device *thz_dev; - -static struct thermal_cooling_device *cl_dev_sysrst; -static int mtktsabb_debug_log = 0; -static int kernelmode = 0; -static int g_THERMAL_TRIP[10] = {0,0,0,0,0,0,0,0,0,0}; -static int num_trip=0; -static char g_bind0[20]={0}; -static char g_bind1[20]={0}; -static char g_bind2[20]={0}; -static char g_bind3[20]={0}; -static char g_bind4[20]={0}; -static char g_bind5[20]={0}; -static char g_bind6[20]={0}; -static char g_bind7[20]={0}; -static char g_bind8[20]={0}; -static char g_bind9[20]={0}; - -#define MTKTSabb_TEMP_CRIT 120000 /* 120.000 degree Celsius */ -//#define THERMAL_CHANNEL 0x5 - -#if 1 -#define ABB_TAG_NAME "[Power/ABB_Thermal] " -#define mtktsabb_dprintk(fmt, args...) \ -do { \ - if (mtktsabb_debug_log) { \ - pr_debug(ABB_TAG_NAME fmt, ##args); \ - } \ -} while(0) - - -#define mtktsabb_printk(fmt, args...) \ -do { \ - pr_notice(ABB_TAG_NAME fmt, ##args); \ -} while (0) - - -#define mtktsabb_err_printk(fmt, args...) \ -do { \ - pr_err("ABB_TAG_NAME " fmt, ##args);\ -} while (0) - -#else -#define mtktsabb_dprintk(fmt, args...) \ -do { \ - if (mtktsabb_debug_log) { \ - xlog_printk(ANDROID_LOG_INFO, "Power/ABB_Thermal", fmt, ##args); \ - } \ -} while (0) -#endif -extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); -extern int IMM_IsAdcInitReady(void); -//extern int last_abb_t; -//extern int last_CPU2_t; -extern int get_immediate_temp2_wrap(void); static int mtktsabb_get_hw_temp(void) { int t_ret = 0; - t_ret = get_immediate_temp2_wrap();//last_CPU2_t; - //mtktsabb_dprintk("[mtktsabb_get_hw_temp] T_CPU2, %d\n", t_ret); + t_ret = get_immediate_temp2_wrap(); return t_ret; } static int mtktsabb_get_temp(struct thermal_zone_device *thermal, unsigned long *t) { -#if MTK_TS_ABB_SW_FILTER == 1 int curr_temp; - int temp_temp; - int ret = 0; - static int last_abb_read_temp = 0; - + int temp_temp; + int ret = 0; + static int last_abb_read_temp; + curr_temp = mtktsabb_get_hw_temp(); - mtktsabb_dprintk("mtktsabb_get_temp TSABB =%d\n", curr_temp); - - if ((curr_temp > (trip_temp[0] - 15000)) || (curr_temp < -30000) || (curr_temp > 85000)) /* abnormal high temp */ - mtktsabb_printk(" ABB T=%d\n", curr_temp); + if ((curr_temp < -30000) || (curr_temp > 85000)) /* abnormal high temp */ + pr_err(" ABB T=%d\n", curr_temp); temp_temp = curr_temp; - if (curr_temp != 0) // not the first temp read after resume from suspension - { - if ((curr_temp > 150000) || (curr_temp < -20000)) // invalid range - { - mtktsabb_printk(" ABB temp invalid=%d\n", curr_temp); + if (curr_temp != 0) { + if ((curr_temp > 150000) || (curr_temp < -20000)) { temp_temp = 50000; ret = -1; - } - else if (last_abb_read_temp != 0) - { - if ((curr_temp - last_abb_read_temp > 20000) ||(last_abb_read_temp - curr_temp > 20000)) //delta 20C, invalid change - { - mtktsabb_printk(" ABB temp float hugely temp=%d, lasttemp=%d\n", - curr_temp, last_abb_read_temp); + } else if (last_abb_read_temp != 0) { + if ((curr_temp - last_abb_read_temp > 20000) || (last_abb_read_temp - curr_temp > 20000)) { + pr_info(" ABB temp float hugely temp=%d, lasttemp=%d\n", + curr_temp, last_abb_read_temp); temp_temp = 50000; - ret = -1; - } - } + ret = -1; + } + } } - + last_abb_read_temp = curr_temp; curr_temp = temp_temp; *t = (unsigned long) curr_temp; return ret; -#else - int curr_temp; - curr_temp = mtktsabb_get_hw_temp(); - mtktsabb_dprintk(" mtktsabb_get_temp CPU T2=%d\n", curr_temp); - - if ((curr_temp > (trip_temp[0] - 15000)) || (curr_temp < -30000)) - mtktsabb_printk(" ABB T=%d\n", curr_temp); - - *t = curr_temp; - - return 0; -#endif } -static int mtktsabb_bind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktsabb_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) { - int table_val=0; + struct mtktsabb_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktsabb_dprintk("[mtktsabb_bind] %s\n", cdev->type); - } - else - { - return 0; - } - - if (mtk_thermal_zone_bind_cooling_device(thermal, table_val, cdev)) { - mtktsabb_dprintk("[mtktsabb_bind] error binding cooling dev\n"); + if (!pdata) return -EINVAL; - } else { - mtktsabb_dprintk("[mtktsabb_bind] binding OK, %d\n", table_val); - } - + *mode = pdata->mode; return 0; } -static int mtktsabb_unbind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktsabb_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) { - int table_val=0; + struct mtktsabb_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktsabb_dprintk("[mtktsabb_unbind] %s\n", cdev->type); - } - else - return 0; - - if (thermal_zone_unbind_cooling_device(thermal, table_val, cdev)) { - mtktsabb_dprintk("[mtktsabb_unbind] error unbinding cooling dev\n"); + if (!pdata) return -EINVAL; - } else { - mtktsabb_dprintk("[mtktsabb_unbind] unbinding OK\n"); - } + pdata->mode = mode; + schedule_work(&tzone->therm_work); return 0; } -static int mtktsabb_get_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode *mode) +static int mtktsabb_get_trip_type(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type *type) { - *mode = (kernelmode) ? THERMAL_DEVICE_ENABLED - : THERMAL_DEVICE_DISABLED; - return 0; + struct mtktsabb_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *type = pdata->trips[trip].type; + return 0; } -static int mtktsabb_set_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode mode) +static int mtktsabb_get_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long *t) { - kernelmode = mode; - return 0; + struct mtktsabb_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *t = pdata->trips[trip].temp; + return 0; } -static int mtktsabb_get_trip_type(struct thermal_zone_device *thermal, int trip, - enum thermal_trip_type *type) +static int mtktsabb_set_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long t) { - *type = g_THERMAL_TRIP[trip]; - return 0; + struct mtktsabb_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + pdata->trips[trip].temp = t; + return 0; } -static int mtktsabb_get_trip_temp(struct thermal_zone_device *thermal, int trip, - unsigned long *temp) +static int mtktsabb_get_crit_temp(struct thermal_zone_device *thermal, unsigned long *t) { - *temp = trip_temp[trip]; - return 0; + int i; + struct mtktsabb_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + + for (i = 0; i < pdata->num_trips; i++) { + if (pdata->trips[i].type == THERMAL_TRIP_CRITICAL) { + *t = pdata->trips[i].temp; + return 0; + } + } + return -EINVAL; } -static int mtktsabb_get_crit_temp(struct thermal_zone_device *thermal, - unsigned long *temperature) -{ - *temperature = MTKTSabb_TEMP_CRIT; - return 0; -} - -/* bind callback functions to thermalzone */ static struct thermal_zone_device_ops mtktsabb_dev_ops = { - .bind = mtktsabb_bind, - .unbind = mtktsabb_unbind, .get_temp = mtktsabb_get_temp, .get_mode = mtktsabb_get_mode, .set_mode = mtktsabb_set_mode, .get_trip_type = mtktsabb_get_trip_type, .get_trip_temp = mtktsabb_get_trip_temp, + .set_trip_temp = mtktsabb_set_trip_temp, .get_crit_temp = mtktsabb_get_crit_temp, }; +static void mtktsabb_work(struct work_struct *work) +{ + struct mtktsabb_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata; -static int tsabb_sysrst_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - *state = 1; - return 0; -} -static int tsabb_sysrst_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - *state = cl_dev_sysrst_state; - return 0; + mutex_lock(&therm_lock); + tzone = container_of(work, struct mtktsabb_thermal_zone, therm_work); + if (!tzone) + return; + pdata = tzone->pdata; + if (!pdata) + return; + if (pdata->mode == THERMAL_DEVICE_ENABLED) + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); } -static int tsabb_sysrst_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) +static int mtktsabb_probe(struct platform_device *pdev) { - cl_dev_sysrst_state = state; + struct mtktsabb_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata = dev_get_platdata(&pdev->dev); - if (cl_dev_sysrst_state == 1) { - mtktsabb_printk("Power/abb_Thermal: reset, reset, reset!!!"); + if (!pdata) + return -EINVAL; + tzone = devm_kzalloc(&pdev->dev, sizeof(*tzone), GFP_KERNEL); + if (!tzone) + return -ENOMEM; - BUG(); - /* arch_reset(0,NULL); */ - } - return 0; -} - -static struct thermal_cooling_device_ops mtktsabb_cooling_sysrst_ops = { - .get_max_state = tsabb_sysrst_get_max_state, - .get_cur_state = tsabb_sysrst_get_cur_state, - .set_cur_state = tsabb_sysrst_set_cur_state, -}; - -static int mtktsabb_read(struct seq_file *m, void *v) -{ - seq_printf(m, "[ mtktsabb_read] trip_0_temp=%d,trip_1_temp=%d,trip_2_temp=%d,trip_3_temp=%d,trip_4_temp=%d,\n\ -trip_5_temp=%d,trip_6_temp=%d,trip_7_temp=%d,trip_8_temp=%d,trip_9_temp=%d,\n\ -g_THERMAL_TRIP_0=%d,g_THERMAL_TRIP_1=%d,g_THERMAL_TRIP_2=%d,g_THERMAL_TRIP_3=%d,g_THERMAL_TRIP_4=%d,\n\ -g_THERMAL_TRIP_5=%d,g_THERMAL_TRIP_6=%d,g_THERMAL_TRIP_7=%d,g_THERMAL_TRIP_8=%d,g_THERMAL_TRIP_9=%d,\n\ -cooldev0=%s,cooldev1=%s,cooldev2=%s,cooldev3=%s,cooldev4=%s,\n\ -cooldev5=%s,cooldev6=%s,cooldev7=%s,cooldev8=%s,cooldev9=%s,time_ms=%d\n", - trip_temp[0], trip_temp[1], trip_temp[2], trip_temp[3], trip_temp[4], trip_temp[5], trip_temp[6], trip_temp[7], trip_temp[8], trip_temp[9], g_THERMAL_TRIP[0], g_THERMAL_TRIP[1], g_THERMAL_TRIP[2], g_THERMAL_TRIP[3], g_THERMAL_TRIP[4], g_THERMAL_TRIP[5], g_THERMAL_TRIP[6], g_THERMAL_TRIP[7], g_THERMAL_TRIP[8], g_THERMAL_TRIP[9], g_bind0, g_bind1, g_bind2, g_bind3, g_bind4, g_bind5, g_bind6, g_bind7, g_bind8, g_bind9, interval); + memset(tzone, 0, sizeof(*tzone)); + tzone->pdata = pdata; + tzone->tz = thermal_zone_device_register("mtktsabb", + pdata->num_trips, + 1, + tzone, + &mtktsabb_dev_ops, + NULL, + 0, + pdata->polling_delay); + if (IS_ERR(tzone->tz)) { + pr_err("%s Failed to register mtktsabb thermal zone device\n", __func__); + return -EINVAL; + } + INIT_WORK(&tzone->therm_work, mtktsabb_work); + platform_set_drvdata(pdev, tzone); + pdata->mode = THERMAL_DEVICE_ENABLED; return 0; } -int mtktsabb_register_thermal(void); -void mtktsabb_unregister_thermal(void); - -static ssize_t mtktsabb_write(struct file *file, const char __user *buffer, size_t count, - loff_t *data) +static int mtktsabb_remove(struct platform_device *pdev) { - int len=0,time_msec=0; - int trip[10]={0}; - int t_type[10]={0}; - int i; - char bind0[20],bind1[20],bind2[20],bind3[20],bind4[20]; - char bind5[20],bind6[20],bind7[20],bind8[20],bind9[20]; - char desc[512]; - - - len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1); - if (copy_from_user(desc, buffer, len)) - { - return 0; - } - desc[len] = '\0'; - - if (sscanf(desc, "%d %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d", - &num_trip, &trip[0],&t_type[0],bind0, &trip[1],&t_type[1],bind1, - &trip[2],&t_type[2],bind2, &trip[3],&t_type[3],bind3, - &trip[4],&t_type[4],bind4, &trip[5],&t_type[5],bind5, - &trip[6],&t_type[6],bind6, &trip[7],&t_type[7],bind7, - &trip[8],&t_type[8],bind8, &trip[9],&t_type[9],bind9, - &time_msec) == 32) - { - mtktsabb_dprintk("[mtktsabb_write] mtktsabb_unregister_thermal\n"); - mtktsabb_unregister_thermal(); - - for(i=0; itherm_work); + if (tzone->tz) + thermal_zone_device_unregister(tzone->tz); + kfree(tzone); + } + return 0; } -int mtktsabb_register_cooler(void) -{ - cl_dev_sysrst = mtk_thermal_cooling_device_register("mtktsabb-sysrst", NULL, - &mtktsabb_cooling_sysrst_ops); - return 0; -} +static struct platform_driver mtktsabb_driver = { + .probe = mtktsabb_probe, + .remove = mtktsabb_remove, + .driver = { + .name = "mtktsabb", + .owner = THIS_MODULE, + }, +}; -int mtktsabb_register_thermal(void) -{ - mtktsabb_dprintk("[mtktsabb_register_thermal] \n"); +static struct mtk_thermal_platform_data mtktsabb_thermal_data = { + .num_trips = 1, + .mode = THERMAL_DEVICE_DISABLED, + .polling_delay = 1000, + .trips[0] = {.temp = MTKTSABB_TEMP_CRIT, .type = THERMAL_TRIP_CRITICAL, .hyst = 0}, +}; - /* trips : trip 0~3 */ - thz_dev = mtk_thermal_zone_device_register("mtktsabb", num_trip, NULL, - &mtktsabb_dev_ops, 0, 0, 0, interval*1000); - - return 0; -} - -void mtktsabb_unregister_cooler(void) -{ - if (cl_dev_sysrst) { - mtk_thermal_cooling_device_unregister(cl_dev_sysrst); - cl_dev_sysrst = NULL; - } -} - -void mtktsabb_unregister_thermal(void) -{ - mtktsabb_dprintk("[mtktsabb_unregister_thermal] \n"); - - if (thz_dev) { - mtk_thermal_zone_device_unregister(thz_dev); - thz_dev = NULL; - } -} - -static int mtktsabb_open(struct inode *inode, struct file *file) -{ - return single_open(file, mtktsabb_read, NULL); -} - -static const struct file_operations mtktsabb_fops = { - .owner = THIS_MODULE, - .open = mtktsabb_open, - .read = seq_read, - .llseek = seq_lseek, - .write = mtktsabb_write, - .release = single_release, +static struct platform_device mtktsabb_device = { + .name = "mtktsabb", + .id = -1, + .dev = { + .platform_data = &mtktsabb_thermal_data, + }, }; static int __init mtktsabb_init(void) { - int err = 0; - struct proc_dir_entry *entry = NULL; - struct proc_dir_entry *mtktsabb_dir = NULL; - - mtktsabb_dprintk("[%s]\n", __func__); - - err = mtktsabb_register_cooler(); - if(err) - return err; - - err = mtktsabb_register_thermal(); - if (err) - goto err_unreg; - - //mtktsabb_dprintk("[mtktsabb_init] \n"); - - mtktsabb_dir = mtk_thermal_get_proc_drv_therm_dir_entry(); - if (!mtktsabb_dir) { - mtktsabb_err_printk("[%s]: mkdir /proc/driver/thermal failed\n", __func__); - } - - entry = proc_create("tzabb", S_IRUGO | S_IWUSR | S_IWGRP, mtktsabb_dir, &mtktsabb_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - - return 0; - -err_unreg: - mtktsabb_unregister_cooler(); - return err; + int ret; + ret = platform_driver_register(&mtktsabb_driver); + if (ret) { + pr_err("Unable to register mtktsabb thermal driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtktsabb_device); + if (ret) { + pr_err("Unable to register mtktsabb device (%d)\n", ret); + return ret; + } + return 0; } static void __exit mtktsabb_exit(void) { - mtktsabb_dprintk("[mtktsabb_exit] \n"); - mtktsabb_unregister_thermal(); - mtktsabb_unregister_cooler(); + platform_driver_unregister(&mtktsabb_driver); + platform_device_unregister(&mtktsabb_device); } module_init(mtktsabb_init); diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_battery.c b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_battery.c index 003723bf2df..cdaa5584a0d 100644 --- a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_battery.c +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_battery.c @@ -1,10 +1,10 @@ /* * Copyright (C) 2011-2014 MediaTek Inc. -* -* This program is free software: you can redistribute it and/or modify it under the terms of the +* +* 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. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * @@ -15,156 +15,75 @@ #include #include #include -#include -#include +#include +#include #include #include -#include -#include -#include +#include +#include +#include #include -#include -#include -#include -#include -#include +#include +#include #include #include "mach/mtk_thermal_monitor.h" #include "mach/mt_typedefs.h" #include "mach/mt_thermal.h" -extern struct proc_dir_entry * mtk_thermal_get_proc_drv_therm_dir_entry(void); +#include +#include -static unsigned int interval = 0; /* seconds, 0 : no auto polling */ -static unsigned int trip_temp[10] = {120000,110000,100000,90000,80000,70000,65000,60000,55000,50000}; -//static unsigned int cl_dev_dis_charge_state = 0; -static unsigned int cl_dev_sysrst_state = 0; -static struct thermal_zone_device *thz_dev; -//static struct thermal_cooling_device *cl_dev_dis_charge; -static struct thermal_cooling_device *cl_dev_sysrst; -static int mtktsbattery_debug_log = 0; -static int kernelmode = 0; -static int g_THERMAL_TRIP[10] = {0,0,0,0,0,0,0,0,0,0}; -static int num_trip=0; -static char g_bind0[20]={0}; -static char g_bind1[20]={0}; -static char g_bind2[20]={0}; -static char g_bind3[20]={0}; -static char g_bind4[20]={0}; -static char g_bind5[20]={0}; -static char g_bind6[20]={0}; -static char g_bind7[20]={0}; -static char g_bind8[20]={0}; -static char g_bind9[20]={0}; +#define MTKTSBATTERY_TEMP_CRIT 58000 +static DEFINE_MUTEX(therm_lock); -extern int read_tbat_value(void); -//static int battery_write_flag=0; +struct mtktsbattery_thermal_zone { + struct thermal_zone_device *tz; + struct work_struct therm_work; + struct mtk_thermal_platform_data *pdata; + struct thermal_dev *therm_fw; +}; -#define mtktsbattery_TEMP_CRIT 60000 /* 60.000 degree Celsius */ - -#define mtktsbattery_dprintk(fmt, args...) \ -do { \ - if (mtktsbattery_debug_log) { \ - xlog_printk(ANDROID_LOG_INFO, "Power/Battery_Thermal", fmt, ##args); \ - } \ -} while(0) - -/* - * kernel fopen/fclose - */ -/* -static mm_segment_t oldfs; - -static void my_close(int fd) -{ - set_fs(oldfs); - sys_close(fd); -} - -static int my_open(char *fname, int flag) -{ - oldfs = get_fs(); - set_fs(KERNEL_DS); - return sys_open(fname, flag, 0); -} -*/ static int get_hw_battery_temp(void) { -/* - int fd; - char buf[64]; - char *pmtdbufp = NULL; - ssize_t pmtdsize; - - char *pvalue = NULL; - int got_value=0; - - //open file and read current value - fd = my_open("/sys/class/power_supply/battery/batt_temp", O_RDONLY); - if (fd < 0) - { - mtktsbattery_dprintk("[get_hw_battery_temp]: open file fail"); - return 0; - } - mtktsbattery_dprintk("[get_hw_battery_temp]: open file ok"); - buf[sizeof(buf) - 1] = '\0'; - pmtdsize = sys_read(fd, buf, sizeof(buf) - 1); - pmtdbufp = buf; - got_value = simple_strtol(pmtdbufp,&pvalue,10); - - // close file - my_close(fd); - - // debug - mtktsbattery_dprintk("[get_hw_battery_temp]: got_value=%d\n", got_value); - - return got_value; -*/ int ret=0; #if defined(CONFIG_POWER_EXT) - //EVB ret = -1270; #else - //Phone ret = read_tbat_value(); ret = ret * 10; #endif - return ret; } static DEFINE_MUTEX(Battery_lock); -int ts_battery_at_boot_time=0; +int ts_battery_at_boot_time = 0; + static int mtktsbattery_get_hw_temp(void) { - int t_ret=0; - static int battery[60]={0}; - static int counter=0, first_time=0; + int t_ret = 0; + static int battery[60]; + static int counter, first_time; - if(ts_battery_at_boot_time==0) - { - ts_battery_at_boot_time=1; - mtktsbattery_dprintk("[mtktsbattery_get_hw_temp] at boot time, return 25000 as default\n"); - battery[counter]=25000; + if (ts_battery_at_boot_time == 0) { + ts_battery_at_boot_time = 1; + battery[counter] = 25000; counter++; return 25000; } mutex_lock(&Battery_lock); - - //get HW battery temp (TSBATTERY) - //cat /sys/class/power_supply/battery/batt_temp t_ret = get_hw_battery_temp(); t_ret = t_ret * 100; mutex_unlock(&Battery_lock); - if(t_ret) + if (t_ret) { + pr_debug("%s counter=%d, first_time =%d\n", __func__, counter, first_time); + pr_debug("%s T_Battery, %d\n", __func__, t_ret); + } - mtktsbattery_dprintk("[mtktsbattery_get_hw_temp] counter=%d, first_time =%d\n", counter, first_time); - mtktsbattery_dprintk("[mtktsbattery_get_hw_temp] T_Battery, %d\n", t_ret); return t_ret; } @@ -175,455 +94,308 @@ static int mtktsbattery_get_temp(struct thermal_zone_device *thermal, return 0; } -static int mtktsbattery_bind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktsbattery_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) { - int table_val=0; + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktsbattery_dprintk("[mtktsbattery_bind] %s\n", cdev->type); - } - else - { - return 0; - } - - if (mtk_thermal_zone_bind_cooling_device(thermal, table_val, cdev)) { - mtktsbattery_dprintk("[mtktsbattery_bind] error binding cooling dev\n"); + if (!pdata) return -EINVAL; - } else { - mtktsbattery_dprintk("[mtktsbattery_bind] binding OK, %d\n", table_val); - } - + *mode = pdata->mode; return 0; } -static int mtktsbattery_unbind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktsbattery_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) { - int table_val=0; + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktsbattery_dprintk("[mtktsbattery_unbind] %s\n", cdev->type); - } - else - return 0; - - if (thermal_zone_unbind_cooling_device(thermal, table_val, cdev)) { - mtktsbattery_dprintk("[mtktsbattery_unbind] error unbinding cooling dev\n"); + if (!pdata) return -EINVAL; - } else { - mtktsbattery_dprintk("[mtktsbattery_unbind] unbinding OK\n"); + + pdata->mode = mode; + schedule_work(&tzone->therm_work); + return 0; +} + +static int mtktsbattery_get_trip_type(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type *type) +{ + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *type = pdata->trips[trip].type; + return 0; +} + +static int mtktsbattery_get_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long *t) +{ + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *t = pdata->trips[trip].temp; + return 0; +} + +static int mtktsbattery_get_crit_temp(struct thermal_zone_device *thermal, unsigned long *t) +{ + int i; + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + + for (i = 0; i < pdata->num_trips; i++) { + if (pdata->trips[i].type == THERMAL_TRIP_CRITICAL) { + *t = pdata->trips[i].temp; + return 0; + } } - - return 0; + return -EINVAL; } -static int mtktsbattery_get_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode *mode) +static int mtktsbattery_set_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long t) { - *mode = (kernelmode) ? THERMAL_DEVICE_ENABLED - : THERMAL_DEVICE_DISABLED; + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + pdata->trips[trip].temp = t; return 0; } -static int mtktsbattery_set_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode mode) +#ifdef CONFIG_AUSTIN_PROJECT +static int mtktsbattery_thermal_notify(struct thermal_zone_device *thermal, + int trip, enum thermal_trip_type type) { - kernelmode = mode; + pr_err("%s: thermal_shutdown notify\n", __func__); + last_kmsg_thermal_shutdown(); + pr_err("%s: thermal_shutdown notify end\n", __func__); + return 0; } +#endif -static int mtktsbattery_get_trip_type(struct thermal_zone_device *thermal, int trip, - enum thermal_trip_type *type) -{ - *type = g_THERMAL_TRIP[trip]; - return 0; -} - -static int mtktsbattery_get_trip_temp(struct thermal_zone_device *thermal, int trip, - unsigned long *temp) -{ - *temp = trip_temp[trip]; - return 0; -} - -static int mtktsbattery_get_crit_temp(struct thermal_zone_device *thermal, - unsigned long *temperature) -{ - *temperature = mtktsbattery_TEMP_CRIT; - return 0; -} - -/* bind callback functions to thermalzone */ static struct thermal_zone_device_ops mtktsbattery_dev_ops = { - .bind = mtktsbattery_bind, - .unbind = mtktsbattery_unbind, .get_temp = mtktsbattery_get_temp, .get_mode = mtktsbattery_get_mode, .set_mode = mtktsbattery_set_mode, .get_trip_type = mtktsbattery_get_trip_type, .get_trip_temp = mtktsbattery_get_trip_temp, .get_crit_temp = mtktsbattery_get_crit_temp, + .set_trip_temp = mtktsbattery_set_trip_temp, +#ifdef CONFIG_AUSTIN_PROJECT + .notify = mtktsbattery_thermal_notify, +#endif }; -/* -static int dis_charge_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) +static void mtktsbattery_work(struct work_struct *work) { - *state = 1; - return 0; -} -static int dis_charge_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - *state = cl_dev_dis_charge_state; - return 0; -} -static int dis_charge_set_cur_state(struct thermal_cooling_device *cdev, - unsigned long state) -{ - cl_dev_dis_charge_state = state; - if(cl_dev_dis_charge_state == 1) { - mtktsbattery_dprintk("[dis_charge_set_cur_state] disable charging\n"); - } - return 0; -} -*/ + struct mtktsbattery_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata; -static int tsbat_sysrst_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - *state = 1; - return 0; -} -static int tsbat_sysrst_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - *state = cl_dev_sysrst_state; - return 0; -} -static int tsbat_sysrst_set_cur_state(struct thermal_cooling_device *cdev, - unsigned long state) -{ - cl_dev_sysrst_state = state; - if(cl_dev_sysrst_state == 1) - { - printk("Power/battery_Thermal: reset, reset, reset!!!"); - printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); - printk("*****************************************"); - printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); - - BUG(); - //arch_reset(0,NULL); - } - return 0; + mutex_lock(&therm_lock); + tzone = container_of(work, struct mtktsbattery_thermal_zone, therm_work); + if (!tzone) + return; + pdata = tzone->pdata; + if (!pdata) + return; + if (pdata->mode == THERMAL_DEVICE_ENABLED) + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); } -/* -static struct thermal_cooling_device_ops mtktsbattery_cooling_dis_charge_ops = { - .get_max_state = dis_charge_get_max_state, - .get_cur_state = dis_charge_get_cur_state, - .set_cur_state = dis_charge_set_cur_state, -};*/ -static struct thermal_cooling_device_ops mtktsbattery_cooling_sysrst_ops = { - .get_max_state = tsbat_sysrst_get_max_state, - .get_cur_state = tsbat_sysrst_get_cur_state, - .set_cur_state = tsbat_sysrst_set_cur_state, +static int mtktsbattery_read_temp(struct thermal_dev *tdev) +{ + return mtktsbattery_get_hw_temp(); +} + +static struct thermal_dev_ops mtktsbattery_fops = { + .get_temp = mtktsbattery_read_temp, }; +#ifdef CONFIG_AUSTIN_PROJECT +struct thermal_dev_params mtktsbattery_tdp = { + .offset = -13000, + .alpha = 7, + .weight = 500 +}; +#else +struct thermal_dev_params mtktsbattery_tdp = { + .offset = -9500, + .alpha = 7, + .weight = 437 +}; +#endif -static int mtktsbattery_read(struct seq_file *m, void *v) -/* static int mtktsbattery_read(char *buf, char **start, off_t off, int count, int *eof, void *data) */ +static int mtktsbattery_show_params(struct device *dev, + struct device_attribute *devattr, + char *buf) { + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; - - seq_printf(m, "[mtktsbattery_read] trip_0_temp=%d,trip_1_temp=%d,trip_2_temp=%d,trip_3_temp=%d,trip_4_temp=%d,\n\ -trip_5_temp=%d,trip_6_temp=%d,trip_7_temp=%d,trip_8_temp=%d,trip_9_temp=%d,\n\ -g_THERMAL_TRIP_0=%d,g_THERMAL_TRIP_1=%d,g_THERMAL_TRIP_2=%d,g_THERMAL_TRIP_3=%d,g_THERMAL_TRIP_4=%d,\n\ -g_THERMAL_TRIP_5=%d,g_THERMAL_TRIP_6=%d,g_THERMAL_TRIP_7=%d,g_THERMAL_TRIP_8=%d,g_THERMAL_TRIP_9=%d,\n\ -cooldev0=%s,cooldev1=%s,cooldev2=%s,cooldev3=%s,cooldev4=%s,\n\ -cooldev5=%s,cooldev6=%s,cooldev7=%s,cooldev8=%s,cooldev9=%s,time_ms=%d\n", - trip_temp[0], trip_temp[1], trip_temp[2], trip_temp[3], trip_temp[4], trip_temp[5], trip_temp[6], trip_temp[7], trip_temp[8], trip_temp[9], g_THERMAL_TRIP[0], g_THERMAL_TRIP[1], g_THERMAL_TRIP[2], g_THERMAL_TRIP[3], g_THERMAL_TRIP[4], g_THERMAL_TRIP[5], g_THERMAL_TRIP[6], g_THERMAL_TRIP[7], g_THERMAL_TRIP[8], g_THERMAL_TRIP[9], g_bind0, g_bind1, g_bind2, g_bind3, g_bind4, g_bind5, g_bind6, g_bind7, g_bind8, g_bind9, interval * 1000); - - - return 0; + if (!tzone) + return -EINVAL; + return sprintf(buf, "offset=%d alpha=%d weight=%d\n", + tzone->therm_fw->tdp->offset, + tzone->therm_fw->tdp->alpha, + tzone->therm_fw->tdp->weight); } -int mtktsbattery_register_thermal(void); -void mtktsbattery_unregister_thermal(void); - -static ssize_t mtktsbattery_write(struct file *file, const char __user *buffer, size_t count, - loff_t *data) -/* static ssize_t mtktsbattery_write(struct file *file, const char *buffer, unsigned long count, void *data) */ +static ssize_t mtktsbattery_store_params(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) { - int len=0,time_msec=0; - int trip[10]={0}; - int t_type[10]={0}; - int i; - char bind0[20],bind1[20],bind2[20],bind3[20],bind4[20]; - char bind5[20],bind6[20],bind7[20],bind8[20],bind9[20]; - char desc[512]; + char param[20]; + int value = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtktsbattery_thermal_zone *tzone = thermal->devdata; - - len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1); - if (copy_from_user(desc, buffer, len)) - { - return 0; - } - desc[len] = '\0'; - - if (sscanf(desc, "%d %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d", - &num_trip, &trip[0],&t_type[0],bind0, &trip[1],&t_type[1],bind1, - &trip[2],&t_type[2],bind2, &trip[3],&t_type[3],bind3, - &trip[4],&t_type[4],bind4, &trip[5],&t_type[5],bind5, - &trip[6],&t_type[6],bind6, &trip[7],&t_type[7],bind7, - &trip[8],&t_type[8],bind8, &trip[9],&t_type[9],bind9, - &time_msec) == 32) - { - mtktsbattery_dprintk("[mtktsbattery_write] mtktsbattery_unregister_thermal\n"); - mtktsbattery_unregister_thermal(); - - for(i=0; itherm_fw->tdp->offset = value; + if (!strcmp(param, "alpha")) + tzone->therm_fw->tdp->alpha = value; + if (!strcmp(param, "weight")) + tzone->therm_fw->tdp->weight = value; return count; } - else - { - mtktsbattery_dprintk("[mtktsbattery_write] bad argument\n"); - } - return -EINVAL; } +static DEVICE_ATTR(params, S_IRUGO | S_IWUSR, mtktsbattery_show_params, mtktsbattery_store_params); -int mtktsbattery_register_cooler(void) +static int mtktsbattery_probe(struct platform_device *pdev) { - /* cooling devices */ - cl_dev_sysrst = mtk_thermal_cooling_device_register("mtktsbattery-sysrst", NULL, - &mtktsbattery_cooling_sysrst_ops); + int ret = 0; + struct mtktsbattery_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata = dev_get_platdata(&pdev->dev); + + if (!pdata) + return -EINVAL; + + tzone = devm_kzalloc(&pdev->dev, sizeof(*tzone), GFP_KERNEL); + if (!tzone) + return -ENOMEM; + + memset(tzone, 0, sizeof(*tzone)); + tzone->pdata = pdata; + tzone->tz = thermal_zone_device_register("mtktsbattery", + pdata->num_trips, + 1, + tzone, + &mtktsbattery_dev_ops, + NULL, + 0, + pdata->polling_delay); + if (IS_ERR(tzone->tz)) { + pr_err("%s Failed to register mtktsbattery thermal zone device\n", __func__); + return -EINVAL; + } + tzone->therm_fw = kzalloc(sizeof(struct thermal_dev), GFP_KERNEL); + if (!tzone->therm_fw) + return -ENOMEM; + tzone->therm_fw->name = "mtktsbattery"; + tzone->therm_fw->dev = &(pdev->dev); + tzone->therm_fw->dev_ops = &mtktsbattery_fops; + tzone->therm_fw->tdp = &mtktsbattery_tdp; + + ret = thermal_dev_register(tzone->therm_fw); + if (ret) { + pr_err("Error registering therml mtktsbattery device\n"); + return -EINVAL; + } + + INIT_WORK(&tzone->therm_work, mtktsbattery_work); + ret = device_create_file(&tzone->tz->device, &dev_attr_params); + if (ret) + pr_err("%s Failed to create params attr\n", __func__); + pdata->mode = THERMAL_DEVICE_ENABLED; + platform_set_drvdata(pdev, tzone); return 0; } -int mtktsbattery_register_thermal(void) +static int mtktsbattery_remove(struct platform_device *pdev) { - mtktsbattery_dprintk("[mtktsbattery_register_thermal] \n"); - - /* trips : trip 0~1 */ - thz_dev = mtk_thermal_zone_device_register("mtktsbattery", num_trip, NULL, - &mtktsbattery_dev_ops, 0, 0, 0, interval*1000); - + struct mtktsbattery_thermal_zone *tzone = platform_get_drvdata(pdev); + if (tzone) { + cancel_work_sync(&tzone->therm_work); + if (tzone->tz) + thermal_zone_device_unregister(tzone->tz); + kfree(tzone); + } return 0; } -void mtktsbattery_unregister_cooler(void) -{ - if (cl_dev_sysrst) { - mtk_thermal_cooling_device_unregister(cl_dev_sysrst); - cl_dev_sysrst = NULL; - } -} -void mtktsbattery_unregister_thermal(void) -{ - mtktsbattery_dprintk("[mtktsbattery_unregister_thermal] \n"); +static struct platform_driver mtktsbattery_driver = { + .probe = mtktsbattery_probe, + .remove = mtktsbattery_remove, + .driver = { + .name = "mtktsbattery", + .owner = THIS_MODULE, + }, +}; - if (thz_dev) { - mtk_thermal_zone_device_unregister(thz_dev); - thz_dev = NULL; - } -} +static struct mtk_thermal_platform_data mtktsbattery_thermal_data = { + .num_trips = 1, + .mode = THERMAL_DEVICE_DISABLED, + .polling_delay = 1000, + .trips[0] = {.temp = MTKTSBATTERY_TEMP_CRIT, .type = THERMAL_TRIP_CRITICAL, .hyst = 0}, +}; -static int mtkts_battery_open(struct inode *inode, struct file *file) -{ - return single_open(file, mtktsbattery_read, NULL); -} - -static const struct file_operations mtkts_battery_fops = { - .owner = THIS_MODULE, - .open = mtkts_battery_open, - .read = seq_read, - .llseek = seq_lseek, - .write = mtktsbattery_write, - .release = single_release, +static struct platform_device mtktsbattery_device = { + .name = "mtktsbattery", + .id = -1, + .dev = { + .platform_data = &mtktsbattery_thermal_data, + }, }; static int __init mtktsbattery_init(void) { - int err = 0; - struct proc_dir_entry *entry = NULL; - struct proc_dir_entry *mtktsbattery_dir = NULL; - - mtktsbattery_dprintk("[%s]\n", __func__); - - err = mtktsbattery_register_cooler(); - if(err) - return err; - - err = mtktsbattery_register_thermal(); - if (err) - goto err_unreg; - - mtktsbattery_dir = mtk_thermal_get_proc_drv_therm_dir_entry(); - if (!mtktsbattery_dir) { - mtktsbattery_dprintk("%s mkdir /proc/driver/thermal failed\n", __func__); + int ret; + ret = platform_driver_register(&mtktsbattery_driver); + if (ret) { + pr_err("Unable to register mtktsbattery thermal driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtktsbattery_device); + if (ret) { + pr_err("Unable to register mtktsbattery device (%d)\n", ret); + return ret; } - - entry = proc_create("tzbattery", S_IRUGO | S_IWUSR | S_IWGRP, mtktsbattery_dir, &mtkts_battery_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - return 0; - -err_unreg: - mtktsbattery_unregister_cooler(); - return err; } static void __exit mtktsbattery_exit(void) { - mtktsbattery_dprintk("[mtktsbattery_exit] \n"); - mtktsbattery_unregister_thermal(); - mtktsbattery_unregister_cooler(); + platform_driver_unregister(&mtktsbattery_driver); + platform_device_unregister(&mtktsbattery_device); } module_init(mtktsbattery_init); diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_bts.c b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_bts.c new file mode 100644 index 00000000000..fbb8f3651bf --- /dev/null +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_bts.c @@ -0,0 +1,798 @@ +/* +* Copyright (C) 2011-2014 MediaTek 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. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program. +* If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mach/mt_typedefs.h" +#include "mach/mt_thermal.h" + +#include +#include + +static DEFINE_MUTEX(therm_lock); + +struct mtkts_bts_thermal_zone { + struct thermal_zone_device *tz; + struct work_struct therm_work; + struct mtk_thermal_platform_data *pdata; + struct thermal_dev *therm_fw; +}; + +#define MTKTS_BTS_TEMP_CRIT 100000 /* 100.000 degree Celsius */ + +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); +extern int IMM_IsAdcInitReady(void); +typedef struct{ + INT32 BTS_Temp; + INT32 TemperatureR; +}BTS_TEMPERATURE; + +extern struct proc_dir_entry * mtk_thermal_get_proc_drv_therm_dir_entry(void); + +#define AUX_IN0_NTC (0) //NTC6301 + +static int g_RAP_pull_up_R = 39000;//39K,pull up resister +static int g_TAP_over_critical_low = 195652 ;//base on 100K NTC temp default value -40 deg +static int g_RAP_pull_up_voltage = 1800;//1.8V ,pull up voltage +static int g_RAP_ntc_table = 7; //default is //NTCG104EF104F(100K) +static int g_RAP_ADC_channel = AUX_IN0_NTC; //default is 0 + +static int g_AP_TemperatureR = 0; + +static BTS_TEMPERATURE BTS_Temperature_Table[] = { + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0} +}; + +/*AP_NTC_BL197 */ +BTS_TEMPERATURE BTS_Temperature_Table1[] = { + {-40,74354}, {-35,74354}, {-30,74354}, {-25,74354}, {-20,74354}, + {-15,57626}, {-10,45068}, { -5,35548}, { 0,28267}, { 5,22650}, + { 10,18280}, { 15,14855}, { 20,12151}, { 25,10000},/*10K*/ { 30,8279}, + { 35,6892}, { 40,5768}, { 45,4852}, { 50,4101}, { 55,3483}, + { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, + { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, + { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970} +}; + +/*AP_NTC_TSM_1*/ +BTS_TEMPERATURE BTS_Temperature_Table2[] = { + {-40,70603}, {-35,70603}, {-30,70603}, {-25,70603}, {-20,70603}, + {-15,55183}, {-10,43499}, { -5,34569}, { 0,27680}, { 5,22316}, + { 10,18104}, { 15,14773}, { 20,12122}, { 25,10000},/*10K*/ { 30,8294}, + { 35,6915}, { 40,5795}, { 45,4882}, { 50,4133}, { 55,3516}, + { 60,3004}, { 60,3004}, { 60,3004}, { 60,3004}, { 60,3004}, + { 60,3004}, { 60,3004}, { 60,3004}, { 60,3004}, { 60,3004}, + { 60,3004}, { 60,3004}, { 60,3004}, { 60,3004} +}; + +/*AP_NTC_10_SEN_1*/ +BTS_TEMPERATURE BTS_Temperature_Table3[] = { + {-40,74354}, {-35,74354}, {-30,74354}, {-25,74354}, {-20,74354}, + {-15,57626}, {-10,45068}, { -5,35548}, { 0,28267}, { 5,22650}, + { 10,18280}, { 15,14855}, { 20,12151}, { 25,10000},/*10K*/ { 30,8279}, + { 35,6892}, { 40,5768}, { 45,4852}, { 50,4101}, { 55,3483}, + { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, + { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970}, + { 60,2970}, { 60,2970}, { 60,2970}, { 60,2970} +}; + +/*AP_NTC_10(TSM0A103F34D1RZ)*/ +BTS_TEMPERATURE BTS_Temperature_Table4[] = { + {-40,188500}, {-35,144290}, {-30,111330}, {-25,86560}, {-20,67790}, + {-15,53460}, {-10,42450}, { -5,33930}, { 0,27280}, { 5,22070}, + { 10,17960}, { 15,14700}, { 20,12090}, { 25,10000},/*10K*/ { 30,8310}, + { 35,6940}, { 40,5830}, { 45,4910}, { 50,4160}, { 55,3540}, + { 60,3020}, { 65,2590}, { 70,2230}, { 75,1920}, { 80,1670}, + { 85,1450}, { 90,1270}, { 95,1110}, { 100,975}, { 105,860}, + { 110,760}, { 115,674}, { 120,599}, { 125,534} +}; + +/*AP_NTC_47*/ +BTS_TEMPERATURE BTS_Temperature_Table5[] = { + {-40,483954}, {-35,483954}, {-30,483954}, {-25,483954}, {-20,483954}, + {-15,360850}, {-10,271697}, { -5,206463}, { 0,158214}, { 5,122259}, + { 10,95227}, { 15,74730}, { 20,59065}, { 25,47000},/*47K*/ { 30,37643}, + { 35,30334}, { 40,24591}, { 45,20048}, { 50,16433}, { 55,13539}, + { 60,11210}, { 60,11210}, { 60,11210}, { 60,11210}, { 60,11210}, + { 60,11210}, { 60,11210}, { 60,11210}, { 60,11210}, { 60,11210}, + { 60,11210}, { 60,11210}, { 60,11210}, { 60,11210} +}; + + +/*NTCG104EF104F(100K)*/ +BTS_TEMPERATURE BTS_Temperature_Table6[] = { + {-40,4251000}, {-35,3005000}, {-30,2149000}, {-25,1554000}, {-20,1135000}, + {-15,837800}, {-10,624100}, { -5,469100}, { 0,355600}, { 5,271800}, + { 10,209400}, { 15,162500}, { 20,127000}, { 25,100000},/*100K*/ { 30,79230}, + { 35,63180}, { 40,50680}, { 45,40900}, { 50,33190}, { 55,27090}, + { 60,22220}, { 65,18320}, { 70,15180}, { 75,12640}, { 80,10580}, + { 85, 8887}, { 90, 7500}, { 95, 6357}, { 100,5410}, { 105,4623}, + { 110,3965}, { 115,3415}, { 120,2951}, { 125,2560} +}; + +BTS_TEMPERATURE BTS_Temperature_Table7[] = { + {-40,195652}, {-35,148171}, {-30,113347}, {-25,87558}, {-20,68236}, + {-15,53649}, {-10,42506}, { -5,33892}, { 0,27218}, { 5,22021}, + { 10,17925}, { 15,14673}, { 20,12080}, { 25,10000},/*100K*/ { 30,8314}, + { 35,6947}, { 40,5833}, { 45,4916}, { 50,4160}, { 55,3535}, + { 60,3014}, { 65,2586}, { 70,2227}, { 75,1924}, { 80,1668}, + { 85,1452}, { 90,1268}, { 95,1109}, { 100,973}, { 105,858}, + { 110,758}, { 115,671}, { 120,596}, { 125,531} +}; + + +/* =========== bts temp read ========== */ + +/* convert register to temperature */ +static INT16 mtkts_bts_thermistor_conver_temp(INT32 Res) +{ + int i=0; + int asize=0; + INT32 RES1=0,RES2=0; + INT32 TAP_Value=-200,TMP1=0,TMP2=0; + + asize = (sizeof(BTS_Temperature_Table)/sizeof(BTS_TEMPERATURE)); + if(Res >= BTS_Temperature_Table[0].TemperatureR) + { + TAP_Value = -40; /* min */ + } + else if(Res <= BTS_Temperature_Table[asize-1].TemperatureR) + { + TAP_Value = 125; /* max */ + } + else + { + RES1 = BTS_Temperature_Table[0].TemperatureR; + TMP1 = BTS_Temperature_Table[0].BTS_Temp; + + for(i=0; i < asize; i++) + { + if(Res >= BTS_Temperature_Table[i].TemperatureR) + { + RES2 = BTS_Temperature_Table[i].TemperatureR; + TMP2 = BTS_Temperature_Table[i].BTS_Temp; + break; + } + else + { + RES1 = BTS_Temperature_Table[i].TemperatureR; + TMP1 = BTS_Temperature_Table[i].BTS_Temp; + } + } + TAP_Value = (((Res-RES2)*TMP1)+((RES1-Res)*TMP2))/(RES1-RES2); + } + + return TAP_Value; +} + +/* convert ADC_AP_temp_volt to register */ +/* Volt to Temp formula same with 6589 */ +static INT16 mtk_ts_bts_volt_to_temp(UINT32 dwVolt) +{ + INT32 TRes; + INT32 dwVCriAP = 0; + INT32 BTS_TMP = -100; + + /* SW workaround----------------------------------------------------- + dwVCriAP = (TAP_OVER_CRITICAL_LOW * 1800) / (TAP_OVER_CRITICAL_LOW + 39000); + dwVCriAP = (TAP_OVER_CRITICAL_LOW * RAP_PULL_UP_VOLT) / (TAP_OVER_CRITICAL_LOW + RAP_PULL_UP_R); + */ + dwVCriAP = (g_TAP_over_critical_low * g_RAP_pull_up_voltage) / (g_TAP_over_critical_low + g_RAP_pull_up_R); + + if(dwVolt > dwVCriAP) + { + TRes = g_TAP_over_critical_low; + } + else + { + TRes = (g_RAP_pull_up_R*dwVolt) / (g_RAP_pull_up_voltage-dwVolt); + } + + g_AP_TemperatureR = TRes; + + /* convert register to temperature */ + BTS_TMP = mtkts_bts_thermistor_conver_temp(TRes); + pr_debug("Thermal %s: TRes = %d, BTS_TMP=%d\n", __func__, TRes, BTS_TMP); + + return BTS_TMP; +} + +static int get_hw_bts_temp(void) +{ + + int ret = 0, data[4], i, ret_value = 0, ret_temp = 0, output; + int times=1, Channel=g_RAP_ADC_channel; + static int valid_temp; + + if( IMM_IsAdcInitReady() == 0 ) + { + pr_err("[thermal_auxadc_get_data]: AUXADC is not ready\n"); + return 0; + } + + i = times; + while (i--) + { + ret_value = IMM_GetOneChannelValue(Channel, data, &ret_temp); + if (ret_value == -1) /* AUXADC is busy */ + { + ret_temp = valid_temp; + } + else + { + valid_temp = ret_temp; + } + ret += ret_temp; + pr_debug("[thermal_auxadc_get_data(AUX_IN0_NTC)]: ret_temp=%d\n",ret_temp); + } + + ret = ret*1500/4096; /* 82's ADC power */ + pr_debug("APtery output mV = %d\n",ret); + output = mtk_ts_bts_volt_to_temp(ret); + pr_debug("BTS output temperature = %d\n",output); + + return output; +} + +static DEFINE_MUTEX(BTS_lock); +int mtkts_bts_get_hw_temp(void) +{ + int t_ret=0; + + mutex_lock(&BTS_lock); + + /* get HW AP temp (TSAP) + cat /sys/class/power_supply/AP/AP_temp + */ + t_ret = get_hw_bts_temp(); + t_ret = t_ret * 1000; + + mutex_unlock(&BTS_lock); + + if (t_ret > 60000) /* abnormal high temp */ + pr_info("[Power/BTS_Thermal] T_AP=%d\n", t_ret); + + pr_debug("[mtkts_bts_get_hw_temp] T_AP, %d\n", t_ret); + return t_ret; +} + +/* =========== bts thermal zone callbacks ========== */ + +static int mtkts_bts_get_temp(struct thermal_zone_device *thermal, + unsigned long *t) +{ + *t = mtkts_bts_get_hw_temp(); + return 0; +} + + +static int mtkts_bts_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) +{ + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + *mode = pdata->mode; + return 0; +} + +static int mtkts_bts_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) +{ + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + + pdata->mode = mode; + schedule_work(&tzone->therm_work); + return 0; +} + +static int mtkts_bts_get_trip_type(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type *type) +{ + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *type = pdata->trips[trip].type; + return 0; +} + +static int mtkts_bts_get_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long *t) +{ + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *t = pdata->trips[trip].temp; + return 0; +} + +static int mtkts_bts_set_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long t) +{ + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + pdata->trips[trip].temp = t; + return 0; +} + +static int mtkts_bts_get_crit_temp(struct thermal_zone_device *thermal, unsigned long *t) +{ + int i; + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + + for (i = 0; i < pdata->num_trips; i++) { + if (pdata->trips[i].type == THERMAL_TRIP_CRITICAL) { + *t = pdata->trips[i].temp; + return 0; + } + } + return -EINVAL; +} + +#ifdef CONFIG_AUSTIN_PROJECT +static int mtkts_bts_thermal_notify(struct thermal_zone_device *thermal, + int trip, enum thermal_trip_type type) +{ + pr_err("%s: thermal_shutdown notify\n", __func__); + last_kmsg_thermal_shutdown(); + pr_err("%s: thermal_shutdown notify end\n", __func__); + + return 0; +} +#endif + +/* bind callback functions to thermalzone */ +static struct thermal_zone_device_ops mtkts_bts_dev_ops = { + .get_temp = mtkts_bts_get_temp, + .get_mode = mtkts_bts_get_mode, + .set_mode = mtkts_bts_set_mode, + .get_trip_type = mtkts_bts_get_trip_type, + .get_trip_temp = mtkts_bts_get_trip_temp, + .set_trip_temp = mtkts_bts_set_trip_temp, + .get_crit_temp = mtkts_bts_get_crit_temp, +#ifdef CONFIG_AUSTIN_PROJECT + .notify = mtkts_bts_thermal_notify, +#endif +}; + +/* =========== bts thermal param handling ========== */ + +#ifdef CONFIG_AUSTIN_PROJECT +struct thermal_dev_params mtkts_bts_tdp = { + .offset = -2500, + .alpha = 15, + .weight = 250 +}; +#else +struct thermal_dev_params mtkts_bts_tdp = { + .offset = -1000, + .alpha = 15, + .weight = 113 +}; +#endif + +static int mtkts_bts_show_params(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + + if (!tzone) + return -EINVAL; + return sprintf(buf, "offset=%d alpha=%d weight=%d\n", + tzone->therm_fw->tdp->offset, + tzone->therm_fw->tdp->alpha, + tzone->therm_fw->tdp->weight); +} + +static ssize_t mtkts_bts_store_params(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) +{ + char param[20]; + int value = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtkts_bts_thermal_zone *tzone = thermal->devdata; + + if (!tzone) + return -EINVAL; + if (sscanf(buf, "%19s %d", param, &value) == 2) { + if (!strcmp(param, "offset")) + tzone->therm_fw->tdp->offset = value; + if (!strcmp(param, "alpha")) + tzone->therm_fw->tdp->alpha = value; + if (!strcmp(param, "weight")) + tzone->therm_fw->tdp->weight = value; + return count; + } + return -EINVAL; +} + +static DEVICE_ATTR(params, S_IRUGO | S_IWUSR, mtkts_bts_show_params, mtkts_bts_store_params); + +/* ========= bts table/tzbts_param handling =========== */ + +void mtkts_bts_copy_table(BTS_TEMPERATURE *des,BTS_TEMPERATURE *src) +{ + int i=0; + int j=0; + + j = (sizeof(BTS_Temperature_Table)/sizeof(BTS_TEMPERATURE)); + for(i=0; i= 2) && (adc_channel <= 11)){ + /* check unsupport pin value, + if unsupport, set channel = 1 as default setting. + */ + g_RAP_ADC_channel = AUX_IN0_NTC; + }else{ + if(adc_channel!=11){ + /* check if there is any param input, + if not using default g_RAP_ADC_channel:1 + */ + g_RAP_ADC_channel = adc_channel; + } + else{ + g_RAP_ADC_channel = AUX_IN0_NTC; + } + } + + mtkts_bts_prepare_table(g_RAP_ntc_table); + + return count; +} + +static int mtkts_bts_param_open(struct inode *inode, struct file *file) +{ + return single_open(file, mtkts_bts_param_read, NULL); +} + +static const struct file_operations mtkts_AP_param_fops = { + .owner = THIS_MODULE, + .open = mtkts_bts_param_open, + .read = seq_read, + .llseek = seq_lseek, + .write = mtkts_bts_param_write, + .release = single_release, +}; + +/* ========= bts device/driver handling =========== */ + +static void mtkts_bts_work(struct work_struct *work) +{ + struct mtkts_bts_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata; + + mutex_lock(&therm_lock); + tzone = container_of(work, struct mtkts_bts_thermal_zone, therm_work); + if (!tzone) + return; + pdata = tzone->pdata; + if (!pdata) + return; + if (pdata->mode == THERMAL_DEVICE_ENABLED) + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); +} + +static int mtkts_bts_read_temp(struct thermal_dev *tdev) +{ + return mtkts_bts_get_hw_temp(); +} +static struct thermal_dev_ops mtkts_bts_fops = { + .get_temp = mtkts_bts_read_temp, +}; + +static int mtkts_bts_probe(struct platform_device *pdev) +{ + int ret = 0; + struct proc_dir_entry *entry = NULL; + struct proc_dir_entry *mtkts_AP_dir = NULL; + struct mtkts_bts_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata = dev_get_platdata(&pdev->dev); + + if (!pdata) { + pr_err("%s: Error getting platform data\n", __func__); + return -EINVAL; + } + pr_info("%s thermal bts\n", __func__); + + /* setup default table */ + mtkts_bts_prepare_table(g_RAP_ntc_table); + + mtkts_AP_dir = mtk_thermal_get_proc_drv_therm_dir_entry(); + if (!mtkts_AP_dir) + pr_err("%s: mkdir /proc/driver/thermal failed\n", __func__); + else { + entry = proc_create("tzbts_param", S_IRUGO | S_IWUSR | S_IWGRP, + mtkts_AP_dir, &mtkts_AP_param_fops); + if (entry) + proc_set_user(entry, 0, 1000); + } + + tzone = devm_kzalloc(&pdev->dev, sizeof(*tzone), GFP_KERNEL); + if (!tzone) + return -ENOMEM; + + memset(tzone, 0, sizeof(*tzone)); + tzone->pdata = pdata; + tzone->tz = thermal_zone_device_register("mtkts_bts", + pdata->num_trips, + (1 << pdata->num_trips) - 1, + tzone, + &mtkts_bts_dev_ops, + NULL, + 0, + pdata->polling_delay); + if (IS_ERR(tzone->tz)) { + pr_err("%s Failed to register thermal zone device\n", __func__); + return -EINVAL; + } + tzone->therm_fw = kzalloc(sizeof(struct thermal_dev), GFP_KERNEL); + if (!tzone->therm_fw) + return -ENOMEM; + tzone->therm_fw->name = "mtkts_bts"; + tzone->therm_fw->dev = &(pdev->dev); + tzone->therm_fw->dev_ops = &mtkts_bts_fops; + tzone->therm_fw->tdp = &mtkts_bts_tdp; + + ret = thermal_dev_register(tzone->therm_fw); + if (ret) { + pr_err("%s: Error registering thermal device\n", __func__); + return -EINVAL; + } + + INIT_WORK(&tzone->therm_work, mtkts_bts_work); + ret = device_create_file(&tzone->tz->device, &dev_attr_params); + if (ret) + pr_err("%s Failed to create params attr\n", __func__); + pdata->mode = THERMAL_DEVICE_ENABLED; + platform_set_drvdata(pdev, tzone); + return 0; +} + +static int mtkts_bts_remove(struct platform_device *pdev) +{ + struct mtkts_bts_thermal_zone *tzone = platform_get_drvdata(pdev); + if (tzone) { + cancel_work_sync(&tzone->therm_work); + if (tzone->tz) + thermal_zone_device_unregister(tzone->tz); + kfree(tzone); + } + return 0; +} + +static struct platform_driver mtkts_bts_driver = { + .probe = mtkts_bts_probe, + .remove = mtkts_bts_remove, + .driver = { + .name = "mtkts_bts", + .owner = THIS_MODULE, + }, +}; + +static struct mtk_thermal_platform_data mtkts_bts_thermal_data = { + .num_trips = 0, + .mode = THERMAL_DEVICE_DISABLED, + .polling_delay = 1000, + /* original trip temps: + {120000,110000,100000,90000,80000,70000,65000,60000,55000,50000}; + Only use the ones below critical temp + .trips[0] = {.temp = 85000, .type = THERMAL_TRIP_ACTIVE, .hyst = 0}, + .trips[1] = {.temp = 90000, .type = THERMAL_TRIP_ACTIVE, .hyst = 0}, + .trips[2] = {.temp = MTKTS_BTS_TEMP_CRIT, .type = THERMAL_TRIP_CRITICAL, .hyst = 0}, + */ +}; + +static struct platform_device mtkts_bts_device = { + .name = "mtkts_bts", + .id = -1, + .dev = { + .platform_data = &mtkts_bts_thermal_data, + }, +}; + +static int __init mtkts_bts_init(void) +{ + int ret; + ret = platform_driver_register(&mtkts_bts_driver); + if (ret) { + pr_err("Unable to register mtkts_bts thermal driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtkts_bts_device); + if (ret) { + pr_err("Unable to register mtkts_bts device (%d)\n", ret); + return ret; + } + return 0; +} + +static void __exit mtkts_bts_exit(void) +{ + platform_driver_unregister(&mtkts_bts_driver); + platform_device_unregister(&mtkts_bts_device); +} + +module_init(mtkts_bts_init); +module_exit(mtkts_bts_exit); + diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_cpu.c b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_cpu.c index 17b2b3e2832..1ecf501d68a 100644 --- a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_cpu.c +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_cpu.c @@ -1,10 +1,10 @@ /* * Copyright (C) 2011-2014 MediaTek Inc. -* -* This program is free software: you can redistribute it and/or modify it under the terms of the +* +* 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. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * @@ -32,196 +32,94 @@ #include #include #include -//#include "mach/mtk_cpu_management.h" #include "mach/mt_typedefs.h" #include "mach/mt_thermal.h" #include "mach/mt_gpufreq.h" #include -//#include -// 1: turn on adaptive AP cooler; 0: turn off -#define CPT_ADAPTIVE_AP_COOLER (0) +#include +#include -// 1: turn on supports to MET logging; 0: turn off +/* 1: turn on supports to MET logging; 0: turn off */ #define CONFIG_SUPPORT_MET_MTKTSCPU (1) -// Thermal controller HW filtering function. Only 1, 2, 4, 8, 16 are valid values, they means one reading is a avg of X samples -#define THERMAL_CONTROLLER_HW_FILTER (1) // 1, 2, 4, 8, 16 +/* Thermal controller HW filtering function. + Only 1, 2, 4, 8, 16 are valid values, + they means one reading is a avg of X samples +*/ +#define THERMAL_CONTROLLER_HW_FILTER (1) -// 1: turn on thermal controller HW thermal protection; 0: turn off +/* 1: turn on thermal controller HW thermal protection; 0: turn off */ #define THERMAL_CONTROLLER_HW_TP (1) -// 1: turn on SW filtering in this sw module; 0: turn off -#define MTK_TS_CPU_SW_FILTER (1) - -#if CPT_ADAPTIVE_AP_COOLER -#define MAX_CPT_ADAPTIVE_COOLERS (3) -#endif - #define MIN(_a_, _b_) ((_a_) > (_b_) ? (_b_) : (_a_)) #define MAX(_a_, _b_) ((_a_) > (_b_) ? (_a_) : (_b_)) -#if CPT_ADAPTIVE_AP_COOLER -static int g_curr_temp = 0; -static int g_prev_temp = 0; -#endif - -static unsigned int interval = 0; /* seconds, 0 : no auto polling */ -// trip_temp[0] must be initialized to the thermal HW protection point. -static unsigned int trip_temp[10] = {117000,110000,100000,90000,80000,70000,65000,60000,55000,50000}; - -static unsigned int *cl_dev_state; -static unsigned int cl_dev_sysrst_state=0; -#if CPT_ADAPTIVE_AP_COOLER -static unsigned int cl_dev_adp_cpu_state[MAX_CPT_ADAPTIVE_COOLERS] = {0}; -static unsigned int cl_dev_adp_cpu_state_active = 0; -#endif -static struct thermal_zone_device *thz_dev; - -static struct thermal_cooling_device **cl_dev = NULL; -static struct thermal_cooling_device *cl_dev_sysrst = NULL; -#if CPT_ADAPTIVE_AP_COOLER -static struct thermal_cooling_device *cl_dev_adp_cpu[MAX_CPT_ADAPTIVE_COOLERS] = {NULL}; -#endif - -#if CPT_ADAPTIVE_AP_COOLER -static int TARGET_TJS[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int PACKAGE_THETA_JA_RISES[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int PACKAGE_THETA_JA_FALLS[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int MINIMUM_CPU_POWERS[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int MAXIMUM_CPU_POWERS[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int MINIMUM_GPU_POWERS[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int MAXIMUM_GPU_POWERS[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int FIRST_STEP_TOTAL_POWER_BUDGETS[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -static int MINIMUM_BUDGET_CHANGES[MAX_CPT_ADAPTIVE_COOLERS] = { 0 }; -#endif - -static int mtktscpu_debug_log = 0; -static int kernelmode = 0; -static int g_THERMAL_TRIP[10] = {0,0,0,0,0,0,0,0,0,0}; - -static int num_trip=10; -//int MA_len=5; -int MA_len_temp=0; -static int proc_write_flag=0; -static char *cooler_name; +int MA_len_temp = 0; +int mtktscpu_limited_dmips = 0; static DEFINE_MUTEX(TS_lock); -//static int MA_counter=0, MA_first_time=0; -#if CPT_ADAPTIVE_AP_COOLER -static char adaptive_cooler_name[] = "cpu_adaptive_"; -#endif - -static char g_bind0[20]="mtktscpu-sysrst"; -static char g_bind1[20]="2300"; -static char g_bind2[20]="2100"; -static char g_bind3[20]="1900"; -static char g_bind4[20]="1700"; -static char g_bind5[20]="1500"; -static char g_bind6[20]="1300"; -static char g_bind7[20]="1100"; -static char g_bind8[20]="900"; -static char g_bind9[20]="700"; - -static int read_curr_temp; - -//#define NEW_6582_CODE #define NEW_6582_NON_DVFS_GPU #define MTKTSCPU_TEMP_CRIT 120000 /* 120.000 degree Celsius */ +static DEFINE_MUTEX(therm_lock); -#define mtktscpu_dprintk(fmt, args...) \ +struct mtktscpu_thermal_zone { + struct thermal_zone_device *tz; + struct work_struct therm_work; + struct mtk_thermal_platform_data *pdata; + struct thermal_dev *therm_fw; +}; + +static int mtktscpu_debug_log; + +#define mtktscpu_dprintk(fmt, args...) \ do { \ if (mtktscpu_debug_log) { \ xlog_printk(ANDROID_LOG_INFO, "Power/CPU_Thermal", fmt, ##args); \ } \ -} while(0) +} while (0) -//extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); -//extern int IMM_IsAdcInitReady(void); -extern void mt_cpufreq_thermal_protect(unsigned int limited_power); -extern u32 get_devinfo_with_index(u32 index); - -extern struct proc_dir_entry * mtk_thermal_get_proc_drv_therm_dir_entry(void); - -//Jerry 2013.3.24 extern void mt_gpufreq_thermal_protect(unsigned int limited_power); static kal_int32 temperature_to_raw_abb(kal_uint32 ret); -//static int last_cpu_t=0; -int last_abb_t=0; -int last_CPU1_t=0; -int last_CPU2_t=0; -//int last_pa_t=0; -//extern void mt_get_cpu_infor(void); +int last_abb_t = 0; +int last_CPU1_t = 0; +int last_CPU2_t = 0; -//static kal_int32 g_adc_ge = 0; -//static kal_int32 g_adc_oe = 0; -static kal_int32 g_adc_ge_t = 0; -static kal_int32 g_adc_oe_t = 0; -//static kal_int32 g_corner_TS = 0; -static kal_int32 g_o_vtsmcu1 = 0; -static kal_int32 g_o_vtsmcu2 = 0; -//static kal_int32 g_o_vtsmcu3 = 0; -static kal_int32 g_o_vtsabb = 0; -static kal_int32 g_degc_cali = 0; -//static kal_int32 g_adc_cali_en = 0; -static kal_int32 g_adc_cali_en_t = 0; -static kal_int32 g_o_slope = 0; -static kal_int32 g_o_slope_sign = 0; -static kal_int32 g_id = 0; +static kal_int32 g_adc_ge_t; +static kal_int32 g_adc_oe_t; +static kal_int32 g_o_vtsmcu1; +static kal_int32 g_o_vtsmcu2; +static kal_int32 g_o_vtsabb; +static kal_int32 g_degc_cali; +static kal_int32 g_adc_cali_en_t; +static kal_int32 g_o_slope; +static kal_int32 g_o_slope_sign; +static kal_int32 g_id; -static kal_int32 g_ge = 0; -static kal_int32 g_oe = 0; -static kal_int32 g_gain = 0; +static kal_int32 g_ge; +static kal_int32 g_oe; +static kal_int32 g_gain; -static kal_int32 g_x_roomt1 = 0; -static kal_int32 g_x_roomt2 = 0; -//static kal_int32 g_x_roomt3 = 0; -static kal_int32 g_x_roomtabb = 0; -static int Num_of_OPP=0; - -#ifdef NEW_6582_NON_DVFS_GPU -static int Num_of_GPU_OPP=1; //Set this value =1 for non-DVS GPU -#else -static int Num_of_GPU_OPP=0; -#endif - -//static int curr_high=0, curr_low=0; +static kal_int32 g_x_roomt1; +static kal_int32 g_x_roomt2; +static kal_int32 g_x_roomtabb; #define y_curr_repeat_times 1 #define THERMAL_NAME "mtk-thermal" -//#define GPU_Default_POWER 456 - -struct mtk_cpu_power_info -{ - unsigned int cpufreq_khz; - unsigned int cpufreq_ncpu; - unsigned int cpufreq_power; -}; -struct mtk_gpu_power_info -{ - unsigned int gpufreq_khz; - unsigned int gpufreq_power; -}; -static struct mtk_cpu_power_info *mtk_cpu_power; -static int tscpu_num_opp = 0; -static struct mtk_gpu_power_info *mtk_gpu_power; - -static int tscpu_cpu_dmips[20] = {0}; -int mtktscpu_limited_dmips = 0; #if CONFIG_SUPPORT_MET_MTKTSCPU /* MET */ #include #include -static char header[] = +static char header[] = "met-info [000] 0.0: ms_ud_sys_header: CPU_Temp," "TS1_temp,TS2_temp,d,d\n" "met-info [000] 0.0: ms_ud_sys_header: P_static," "CPU_power,GPU_power,d,d\n"; -static char help[] = " --mtktscpu monitor mtktscpu\n"; +static const char help[] = " --mtktscpu monitor mtktscpu\n"; static int sample_print_help(char *buf, int len) { return snprintf(buf, PAGE_SIZE, help); @@ -232,16 +130,16 @@ static int sample_print_header(char *buf, int len) return snprintf(buf, PAGE_SIZE, header); } -unsigned int met_mtktscpu_dbg=0; +unsigned int met_mtktscpu_dbg = 0; static void sample_start(void) { - met_mtktscpu_dbg=1; + met_mtktscpu_dbg = 1; return; } static void sample_stop(void) { - met_mtktscpu_dbg=0; + met_mtktscpu_dbg = 0; return; } @@ -257,86 +155,60 @@ struct metdevice met_mtktscpu = { EXPORT_SYMBOL(met_mtktscpu); #endif -static bool talking_flag=false; +static bool talking_flag; void set_taklking_flag(bool flag) { talking_flag = flag; - printk("Power/CPU_Thermal: talking_flag=%d", talking_flag); + mtktscpu_dprintk("Power/CPU_Thermal: talking_flag=%d", talking_flag); return; } -static unsigned int adaptive_cpu_power_limit = 0x7FFFFFFF, static_cpu_power_limit = 0x7FFFFFFF; - -#if CPT_ADAPTIVE_AP_COOLER -static void set_adaptive_cpu_power_limit(unsigned int limit) -{ - unsigned int final_limit; - - adaptive_cpu_power_limit = (limit != 0) ? limit : 0x7FFFFFFF; - final_limit = MIN(adaptive_cpu_power_limit, static_cpu_power_limit); - mt_cpufreq_thermal_protect((final_limit != 0x7FFFFFFF) ? final_limit : 0); -} -#endif - -static void set_static_cpu_power_limit(unsigned int limit) -{ - unsigned int final_limit; - - adaptive_cpu_power_limit = (limit != 0) ? limit : 0x7FFFFFFF; - final_limit = MIN(adaptive_cpu_power_limit, static_cpu_power_limit); - mt_cpufreq_thermal_protect((final_limit != 0x7FFFFFFF) ? final_limit : 0); -} - -// TODO: We also need a pair of setting functions for GPU power limit, which is not supported on MT6582. - int mtktscpu_thermal_clock_on(void) { - mtktscpu_dprintk("mtktscpu_thermal_clock_on \n"); - enable_clock(MT_CG_PERI_THERM, "THERMAL"); - return 0; + enable_clock(MT_CG_PERI_THERM, "THERMAL"); + return 0; } int mtktscpu_thermal_clock_off(void) { - mtktscpu_dprintk("mtktscpu_thermal_clock_off \n"); - disable_clock(MT_CG_PERI_THERM, "THERMAL"); - return 0; + disable_clock(MT_CG_PERI_THERM, "THERMAL"); + return 0; } void get_thermal_all_register(void) { mtktscpu_dprintk("get_thermal_all_register\n"); - mtktscpu_dprintk("TEMPMSR1 = 0x%8x\n", DRV_Reg32(TEMPMSR1)); + mtktscpu_dprintk("TEMPMSR1 = 0x%8x\n", DRV_Reg32(TEMPMSR1)); mtktscpu_dprintk("TEMPMSR2 = 0x%8x\n", DRV_Reg32(TEMPMSR2)); - mtktscpu_dprintk("TEMPMONCTL0 = 0x%8x\n", DRV_Reg32(TEMPMONCTL0)); - mtktscpu_dprintk("TEMPMONCTL1 = 0x%8x\n", DRV_Reg32(TEMPMONCTL1)); - mtktscpu_dprintk("TEMPMONCTL2 = 0x%8x\n", DRV_Reg32(TEMPMONCTL2)); - mtktscpu_dprintk("TEMPMONINT = 0x%8x\n", DRV_Reg32(TEMPMONINT)); - mtktscpu_dprintk("TEMPMONINTSTS = 0x%8x\n", DRV_Reg32(TEMPMONINTSTS)); - mtktscpu_dprintk("TEMPMONIDET0 = 0x%8x\n", DRV_Reg32(TEMPMONIDET0)); + mtktscpu_dprintk("TEMPMONCTL0 = 0x%8x\n", DRV_Reg32(TEMPMONCTL0)); + mtktscpu_dprintk("TEMPMONCTL1 = 0x%8x\n", DRV_Reg32(TEMPMONCTL1)); + mtktscpu_dprintk("TEMPMONCTL2 = 0x%8x\n", DRV_Reg32(TEMPMONCTL2)); + mtktscpu_dprintk("TEMPMONINT = 0x%8x\n", DRV_Reg32(TEMPMONINT)); + mtktscpu_dprintk("TEMPMONINTSTS = 0x%8x\n", DRV_Reg32(TEMPMONINTSTS)); + mtktscpu_dprintk("TEMPMONIDET0 = 0x%8x\n", DRV_Reg32(TEMPMONIDET0)); - mtktscpu_dprintk("TEMPMONIDET1 = 0x%8x\n", DRV_Reg32(TEMPMONIDET1)); - mtktscpu_dprintk("TEMPMONIDET2 = 0x%8x\n", DRV_Reg32(TEMPMONIDET2)); - mtktscpu_dprintk("TEMPH2NTHRE = 0x%8x\n", DRV_Reg32(TEMPH2NTHRE)); - mtktscpu_dprintk("TEMPHTHRE = 0x%8x\n", DRV_Reg32(TEMPHTHRE)); - mtktscpu_dprintk("TEMPCTHRE = 0x%8x\n", DRV_Reg32(TEMPCTHRE)); - mtktscpu_dprintk("TEMPOFFSETH = 0x%8x\n", DRV_Reg32(TEMPOFFSETH)); + mtktscpu_dprintk("TEMPMONIDET1 = 0x%8x\n", DRV_Reg32(TEMPMONIDET1)); + mtktscpu_dprintk("TEMPMONIDET2 = 0x%8x\n", DRV_Reg32(TEMPMONIDET2)); + mtktscpu_dprintk("TEMPH2NTHRE = 0x%8x\n", DRV_Reg32(TEMPH2NTHRE)); + mtktscpu_dprintk("TEMPHTHRE = 0x%8x\n", DRV_Reg32(TEMPHTHRE)); + mtktscpu_dprintk("TEMPCTHRE = 0x%8x\n", DRV_Reg32(TEMPCTHRE)); + mtktscpu_dprintk("TEMPOFFSETH = 0x%8x\n", DRV_Reg32(TEMPOFFSETH)); - mtktscpu_dprintk("TEMPOFFSETL = 0x%8x\n", DRV_Reg32(TEMPOFFSETL)); - mtktscpu_dprintk("TEMPMSRCTL0 = 0x%8x\n", DRV_Reg32(TEMPMSRCTL0)); - mtktscpu_dprintk("TEMPMSRCTL1 = 0x%8x\n", DRV_Reg32(TEMPMSRCTL1)); - mtktscpu_dprintk("TEMPAHBPOLL = 0x%8x\n", DRV_Reg32(TEMPAHBPOLL)); - mtktscpu_dprintk("TEMPAHBTO = 0x%8x\n", DRV_Reg32(TEMPAHBTO)); - mtktscpu_dprintk("TEMPADCPNP0 = 0x%8x\n", DRV_Reg32(TEMPADCPNP0)); + mtktscpu_dprintk("TEMPOFFSETL = 0x%8x\n", DRV_Reg32(TEMPOFFSETL)); + mtktscpu_dprintk("TEMPMSRCTL0 = 0x%8x\n", DRV_Reg32(TEMPMSRCTL0)); + mtktscpu_dprintk("TEMPMSRCTL1 = 0x%8x\n", DRV_Reg32(TEMPMSRCTL1)); + mtktscpu_dprintk("TEMPAHBPOLL = 0x%8x\n", DRV_Reg32(TEMPAHBPOLL)); + mtktscpu_dprintk("TEMPAHBTO = 0x%8x\n", DRV_Reg32(TEMPAHBTO)); + mtktscpu_dprintk("TEMPADCPNP0 = 0x%8x\n", DRV_Reg32(TEMPADCPNP0)); - mtktscpu_dprintk("TEMPADCPNP1 = 0x%8x\n", DRV_Reg32(TEMPADCPNP1)); - mtktscpu_dprintk("TEMPADCPNP2 = 0x%8x\n", DRV_Reg32(TEMPADCPNP2)); - mtktscpu_dprintk("TEMPADCMUX = 0x%8x\n", DRV_Reg32(TEMPADCMUX)); - mtktscpu_dprintk("TEMPADCEXT = 0x%8x\n", DRV_Reg32(TEMPADCEXT)); - mtktscpu_dprintk("TEMPADCEXT1 = 0x%8x\n", DRV_Reg32(TEMPADCEXT1)); - mtktscpu_dprintk("TEMPADCEN = 0x%8x\n", DRV_Reg32(TEMPADCEN)); + mtktscpu_dprintk("TEMPADCPNP1 = 0x%8x\n", DRV_Reg32(TEMPADCPNP1)); + mtktscpu_dprintk("TEMPADCPNP2 = 0x%8x\n", DRV_Reg32(TEMPADCPNP2)); + mtktscpu_dprintk("TEMPADCMUX = 0x%8x\n", DRV_Reg32(TEMPADCMUX)); + mtktscpu_dprintk("TEMPADCEXT = 0x%8x\n", DRV_Reg32(TEMPADCEXT)); + mtktscpu_dprintk("TEMPADCEXT1 = 0x%8x\n", DRV_Reg32(TEMPADCEXT1)); + mtktscpu_dprintk("TEMPADCEN = 0x%8x\n", DRV_Reg32(TEMPADCEN)); mtktscpu_dprintk("TEMPPNPMUXADDR = 0x%8x\n", DRV_Reg32(TEMPPNPMUXADDR)); @@ -360,187 +232,57 @@ void get_thermal_all_register(void) mtktscpu_dprintk("TEMPPROTCTL = 0x%8x\n", DRV_Reg32(TEMPPROTCTL)); mtktscpu_dprintk("TEMPPROTTA = 0x%8x\n", DRV_Reg32(TEMPPROTTA)); - mtktscpu_dprintk("TEMPPROTTB = 0x%8x\n", DRV_Reg32(TEMPPROTTB)); - mtktscpu_dprintk("TEMPPROTTC = 0x%8x\n", DRV_Reg32(TEMPPROTTC)); - mtktscpu_dprintk("TEMPSPARE0 = 0x%8x\n", DRV_Reg32(TEMPSPARE0)); - mtktscpu_dprintk("TEMPSPARE1 = 0x%8x\n", DRV_Reg32(TEMPSPARE1)); - mtktscpu_dprintk("TEMPSPARE2 = 0x%8x\n", DRV_Reg32(TEMPSPARE2)); - mtktscpu_dprintk("TEMPSPARE3 = 0x%8x\n", DRV_Reg32(TEMPSPARE3)); - mtktscpu_dprintk("0x11001040 = 0x%8x\n", DRV_Reg32(0xF1001040)); - + mtktscpu_dprintk("TEMPPROTTB = 0x%8x\n", DRV_Reg32(TEMPPROTTB)); + mtktscpu_dprintk("TEMPPROTTC = 0x%8x\n", DRV_Reg32(TEMPPROTTC)); + mtktscpu_dprintk("TEMPSPARE0 = 0x%8x\n", DRV_Reg32(TEMPSPARE0)); + mtktscpu_dprintk("TEMPSPARE1 = 0x%8x\n", DRV_Reg32(TEMPSPARE1)); + mtktscpu_dprintk("TEMPSPARE2 = 0x%8x\n", DRV_Reg32(TEMPSPARE2)); + mtktscpu_dprintk("TEMPSPARE3 = 0x%8x\n", DRV_Reg32(TEMPSPARE3)); + mtktscpu_dprintk("0x11001040 = 0x%8x\n", DRV_Reg32(0xF1001040)); } void get_thermal_slope_intercept(struct TS_PTPOD *ts_info) { unsigned int temp0, temp1, temp2; struct TS_PTPOD ts_ptpod; - - //mtktscpu_dprintk("get_thermal_slope_intercept\n"); - - //temp0 = (10000*100000/4096/g_gain)*15/18; temp0 = (10000*100000/g_gain)*15/18; -// printk("temp0=%d\n", temp0); - if(g_o_slope_sign==0) - { + if (g_o_slope_sign == 0) temp1 = temp0/(165+g_o_slope); - } else - { temp1 = temp0/(165-g_o_slope); - } -// printk("temp1=%d\n", temp1); - //ts_ptpod.ts_MTS = temp1 - (2*temp1) + 2048; ts_ptpod.ts_MTS = temp1; - temp0 = (g_degc_cali *10 / 2); + temp0 = (g_degc_cali*10 / 2); temp1 = ((10000*100000/4096/g_gain)*g_oe + g_x_roomtabb*10)*15/18; -// printk("temp1=%d\n", temp1); - if(g_o_slope_sign==0) - { + if (g_o_slope_sign == 0) temp2 = temp1*10/(165+g_o_slope); - } else - { temp2 = temp1*10/(165-g_o_slope); - } -// printk("temp2=%d\n", temp2); ts_ptpod.ts_BTS = (temp0+temp2-250)*4/10; - - //ts_info = &ts_ptpod; ts_info->ts_MTS = ts_ptpod.ts_MTS; ts_info->ts_BTS = ts_ptpod.ts_BTS; - printk("ts_MTS=%d, ts_BTS=%d\n",ts_ptpod.ts_MTS, ts_ptpod.ts_BTS); + mtktscpu_dprintk("ts_MTS=%d, ts_BTS=%d\n", ts_ptpod.ts_MTS, ts_ptpod.ts_BTS); return; } EXPORT_SYMBOL(get_thermal_slope_intercept); - -/* -static void set_high_low_threshold(int high, int low) -{ - int temp=0; - int raw_low=0, raw_high=0, raw_high_offset=0, raw_hot_normal=0, raw_low_offset=0; - - if( (curr_high==high) && (curr_low==low) ) - return; - - curr_high = high; - curr_low = low; -// mtktscpu_dprintk("Set_high_low_threshold: curr_high=%d, curr_low=%d\n", curr_high, curr_low); - - raw_low = temperature_to_raw_abb(low); //bigger - raw_high = temperature_to_raw_abb(high);//smaller - - mtktscpu_dprintk("[set_high_low_threshold]: raw_low=%d, raw_high=%d\n",raw_low, raw_high); - //calculate high offset threshold, hot to normal threshold, low offset threshold - temp = (raw_low - raw_high)/4; - raw_high_offset = raw_high + temp; - raw_hot_normal = raw_high_offset + temp; - raw_low_offset = raw_hot_normal + temp; -// mtktscpu_dprintk("set_high_low_threshold, raw_high_offset=%d, raw_hot_normal=%d, raw_low_offset=%d\n", raw_high_offset, raw_hot_normal, raw_low_offset); - -// THERMAL_WRAP_WR32(0x0, TEMPMONCTL0); // disable periodoc temperature sensing point 0 - temp = DRV_Reg32(TEMPMONINT); - THERMAL_WRAP_WR32(temp & 0xFFFFFFFC, TEMPMONINT); // disable interrupt - - THERMAL_WRAP_WR32(raw_high, TEMPHTHRE); // set hot threshold - THERMAL_WRAP_WR32(raw_high_offset, TEMPOFFSETH); // set high offset threshold - THERMAL_WRAP_WR32(raw_hot_normal, TEMPH2NTHRE); // set hot to normal threshold - THERMAL_WRAP_WR32(raw_low_offset, TEMPOFFSETL); // set low offset threshold - THERMAL_WRAP_WR32(raw_low, TEMPCTHRE); // set cold threshold - -// THERMAL_WRAP_WR32(0x1, TEMPMONCTL0); // enable periodoc temperature sensing point 0 - temp = temp | 3; - THERMAL_WRAP_WR32(temp, TEMPMONINT); // enable cold threshold, and high threshold interrupt -// THERMAL_WRAP_WR32(temp | 0x00ffff, TEMPMONINT); -// mtktscpu_dprintk("set_high_low_threshold end, temp=0x%x", temp); - -} -*/ static irqreturn_t thermal_interrupt_handler(int irq, void *dev_id) { kal_uint32 ret = 0; -// int i=0; - - //for SPM reset debug - /* - mtktscpu_dprintk("SPM_SLEEP_ISR_RAW_STA =0x%08x\n",spm_read(SPM_SLEEP_ISR_RAW_STA)); - mtktscpu_dprintk("SPM_PCM_REG13_DATA =0x%08x\n",spm_read(SPM_PCM_REG13_DATA)); - mtktscpu_dprintk("SPM_SLEEP_WAKEUP_EVENT_MASK=0x%08x\n",spm_read(SPM_SLEEP_WAKEUP_EVENT_MASK)); - mtktscpu_dprintk("SPM_POWERON_CONFIG_SET =0x%08x\n",spm_read(SPM_POWERON_CONFIG_SET)); - mtktscpu_dprintk("SPM_POWER_ON_VAL1 =0x%08x\n",spm_read(SPM_POWER_ON_VAL1)); - mtktscpu_dprintk("SPM_PCM_IM_LEN =0x%08x\n",spm_read(SPM_PCM_IM_LEN)); - mtktscpu_dprintk("SPM_PCM_PWR_IO_EN =0x%08x\n",spm_read(SPM_PCM_PWR_IO_EN)); - mtktscpu_dprintk("SPM_PCM_REG7_DATA =0x%08x\n",spm_read(SPM_PCM_REG7_DATA)); - - mtktscpu_dprintk("SPM_PCM_CON0 =0x%08x\n",spm_read(SPM_PCM_CON0)); - mtktscpu_dprintk("SPM_PCM_CON1 =0x%08x\n",spm_read(SPM_PCM_CON1)); - mtktscpu_dprintk("SPM_PCM_IM_PTR =0x%08x\n",spm_read(SPM_PCM_IM_PTR)); - mtktscpu_dprintk("SPM_PCM_REG1_DATA =0x%08x\n",spm_read(SPM_PCM_REG1_DATA)); - mtktscpu_dprintk("SPM_PCM_REG2_DATA =0x%08x\n",spm_read(SPM_PCM_REG2_DATA)); - mtktscpu_dprintk("SPM_PCM_REG3_DATA =0x%08x\n",spm_read(SPM_PCM_REG3_DATA)); - mtktscpu_dprintk("SPM_PCM_REG12_DATA =0x%08x\n",spm_read(SPM_PCM_REG12_DATA)); - mtktscpu_dprintk("SPM_PCM_REG14_DATA =0x%08x\n",spm_read(SPM_PCM_REG14_DATA)); - mtktscpu_dprintk("SPM_PCM_FSM_STA =0x%08x\n",spm_read(SPM_PCM_FSM_STA)); - */ - ret = DRV_Reg32(TEMPMONINTSTS); - mtktscpu_dprintk("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); - mtktscpu_dprintk("thermal_interrupt_handler,ret=0x%08x\n",ret); - mtktscpu_dprintk("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); - - - - xlog_printk(ANDROID_LOG_DEBUG, "[Power/CPU_Thermal]", "thermal_isr: [Interrupt trigger]: status = 0x%x\n", ret); + mtktscpu_dprintk("thermal_isr: [Interrupt trigger]: status = 0x%x\n", ret); if (ret & THERMAL_MON_CINTSTS0) - { - xlog_printk(ANDROID_LOG_DEBUG, "[Power/CPU_Thermal]", "thermal_isr: thermal sensor point 0 - cold interrupt trigger\n"); - //call thermal monitor interrupt, mode=0 -/* mtk_thermal_zone_bind_trigger_trip(thz_dev, curr_low, 0); - for(i=0; i>22);//ADC_GE_T [9:0] *(0x10206104)[31:22] - g_adc_oe_t = ((temp1 & 0x003FF000)>>12);//ADC_OE_T [9:0] *(0x10206104)[21:12] + g_adc_ge_t = ((temp1 & 0xFFC00000)>>22); + g_adc_oe_t = ((temp1 & 0x003FF000)>>12); - g_o_vtsmcu1 = (temp0 & 0x03FE0000)>>17; //O_VTSMCU1 (9b) *(0x10206100)[25:17] - g_o_vtsmcu2 = (temp0 & 0x0001FF00)>>8; //O_VTSMCU2 (9b) *(0x10206100)[16:8] + g_o_vtsmcu1 = (temp0 & 0x03FE0000)>>17; + g_o_vtsmcu2 = (temp0 & 0x0001FF00)>>8; - g_o_vtsabb = (temp1 & 0x000001FF); //O_VTSABB (9b) *(0x10206104)[8:0] + g_o_vtsabb = (temp1 & 0x000001FF); - g_degc_cali = (temp0 & 0x0000007E)>>1; //DEGC_cali (6b) *(0x10206100)[6:1] - g_adc_cali_en_t= (temp0 & 0x00000001); //ADC_CALI_EN_T(1b) *(0x10206100)[0] - g_o_slope = (temp0 & 0xFC000000)>>26; //O_SLOPE (6b) *(0x10206100)[31:26] - g_o_slope_sign = (temp0 & 0x00000080)>>7; //O_SLOPE_SIGN (1b) *(0x10206100)[7] + g_degc_cali = (temp0 & 0x0000007E)>>1; + g_adc_cali_en_t = (temp0 & 0x00000001); + g_o_slope = (temp0 & 0xFC000000)>>26; + g_o_slope_sign = (temp0 & 0x00000080)>>7; - g_id = (temp1 & 0x00000200)>>9; //ID (1b) *(0x10206104)[9] + g_id = (temp1 & 0x00000200)>>9; - if(g_id==0) - { - g_o_slope=0; - } + if (g_id == 0) + g_o_slope = 0; - if(g_adc_cali_en_t == 1) - { - //thermal_enable = true; - } - else - { - printk(KERN_CRIT "This sample is not Thermal calibrated\n"); + if (g_adc_cali_en_t == 1) + pr_info("thermal_enable = true\n"); + else { + pr_crit("This sample is not Thermal calibrated\n"); g_adc_ge_t = 512; g_adc_oe_t = 512; g_degc_cali = 40; @@ -991,29 +540,26 @@ static void thermal_cal_prepare(void) g_o_vtsmcu2 = 260; g_o_vtsabb = 260; } - //printk("[Power/CPU_Thermal] [Thermal calibration] g_adc_ge_t = 0x%x,g_adc_oe_t = 0x%x, g_degc_cali = 0x%x, g_adc_cali_en_t = 0x%x, g_o_slope = 0x%x, g_o_slope_sign = 0x%x, g_id = 0x%x\n", g_adc_ge_t, g_adc_oe_t, g_degc_cali, g_adc_cali_en_t, g_o_slope, g_o_slope_sign, g_id); - //printk("[Power/CPU_Thermal] [Thermal calibration] g_o_vtsmcu1 = 0x%x,g_o_vtsmcu2 = 0x%x, g_o_vtsabb = 0x%x\n", g_o_vtsmcu1, g_o_vtsmcu2, g_o_vtsabb); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_adc_ge_t = 0x%x\n",g_adc_ge_t); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_adc_oe_t = 0x%x\n",g_adc_oe_t); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_degc_cali = 0x%x\n",g_degc_cali); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_adc_cali_en_t = 0x%x\n",g_adc_cali_en_t); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_o_slope = 0x%x\n",g_o_slope); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_o_slope_sign = 0x%x\n",g_o_slope_sign); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_id = 0x%x\n",g_id); + + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_adc_ge_t = 0x%x\n", g_adc_ge_t); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_adc_oe_t = 0x%x\n", g_adc_oe_t); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_degc_cali = 0x%x\n", g_degc_cali); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_adc_cali_en_t = 0x%x\n", g_adc_cali_en_t); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_o_slope = 0x%x\n", g_o_slope); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_o_slope_sign = 0x%x\n", g_o_slope_sign); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_id = 0x%x\n", g_id); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_o_vtsmcu1 = 0x%x\n",g_o_vtsmcu1); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_o_vtsmcu2 = 0x%x\n",g_o_vtsmcu2); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_o_vtsabb = 0x%x\n",g_o_vtsabb); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_o_vtsmcu1 = 0x%x\n", g_o_vtsmcu1); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_o_vtsmcu2 = 0x%x\n", g_o_vtsmcu2); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_o_vtsabb = 0x%x\n", g_o_vtsabb); } static void thermal_cal_prepare_2(kal_uint32 ret) { - kal_int32 format_1, format_2, format_abb= 0; + kal_int32 format_1, format_2, format_abb = 0; - //mtktscpu_dprintk("thermal_cal_prepare_2\n"); - - g_ge = ((g_adc_ge_t - 512) * 10000 ) / 4096; // ge * 10000 + g_ge = ((g_adc_ge_t - 512) * 10000) / 4096; g_oe = (g_adc_oe_t - 512); g_gain = (10000 + g_ge); @@ -1022,55 +568,38 @@ static void thermal_cal_prepare_2(kal_uint32 ret) format_2 = (g_o_vtsmcu2 + 3350 - g_oe); format_abb = (g_o_vtsabb + 3350 - g_oe); - g_x_roomt1 = (((format_1 * 10000) / 4096) * 10000) / g_gain; // x_roomt * 10000 - g_x_roomt2 = (((format_2 * 10000) / 4096) * 10000) / g_gain; // x_roomt * 10000 - g_x_roomtabb = (((format_abb * 10000) / 4096) * 10000) / g_gain; // x_roomt * 10000 + g_x_roomt1 = (((format_1 * 10000) / 4096) * 10000) / g_gain; + g_x_roomt2 = (((format_2 * 10000) / 4096) * 10000) / g_gain; + g_x_roomtabb = (((format_abb * 10000) / 4096) * 10000) / g_gain; - //printk("[Power/CPU_Thermal] [Thermal calibration] g_ge = %d, g_oe = %d, g_gain = %d, g_x_roomt1 = %d, g_x_roomt2 = %d, g_x_roomtabb = %d\n", - // g_ge, g_oe, g_gain,g_x_roomt1,g_x_roomt2, g_x_roomtabb); - - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_ge = 0x%x\n",g_ge); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_gain = 0x%x\n",g_gain); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_gain = 0x%x\n",g_gain); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_x_roomt1 = 0x%x\n",g_x_roomt1); - printk(KERN_CRIT "[Power/CPU_Thermal] [Thermal calibration] g_x_roomt2 = 0x%x\n",g_x_roomt2); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_ge = 0x%x\n", g_ge); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_gain = 0x%x\n", g_gain); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_gain = 0x%x\n", g_gain); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_x_roomt1 = 0x%x\n", g_x_roomt1); + pr_crit("[Power/CPU_Thermal] [Thermal calibration] g_x_roomt2 = 0x%x\n", g_x_roomt2); } static kal_int32 temperature_to_raw_abb(kal_uint32 ret) { - // Ycurr = [(Tcurr - DEGC_cali/2)*(165+O_slope)*(18/15)*(1/10000)+X_roomtabb]*Gain*4096 + OE - kal_int32 t_curr = ret; -// kal_int32 y_curr = 0; kal_int32 format_1 = 0; kal_int32 format_2 = 0; kal_int32 format_3 = 0; kal_int32 format_4 = 0; - //mtktscpu_dprintk("[temperature_to_raw_abb]\n"); - - if(g_o_slope_sign==0) - { - //format_1 = t_curr-(g_degc_cali/2)*1000; + if (g_o_slope_sign == 0) { format_1 = t_curr-(g_degc_cali*1000/2); format_2 = format_1 * (165+g_o_slope) * 18/15; format_2 = format_2 - 2*format_2; format_3 = format_2/1000 + g_x_roomt1*10; format_4 = (format_3*4096/10000*g_gain)/100000 + g_oe; - //mtktscpu_dprintk("[Temperature_to_raw_abb] format_1=%d, format_2=%d, format_3=%d, format_4=%d\n", format_1, format_2, format_3, format_4); - } - else - { - //format_1 = t_curr-(g_degc_cali/2)*1000; + } else { format_1 = t_curr-(g_degc_cali*1000/2); format_2 = format_1 * (165-g_o_slope) * 18/15; format_2 = format_2 - 2*format_2; format_3 = format_2/1000 + g_x_roomt1*10; format_4 = (format_3*4096/10000*g_gain)/100000 + g_oe; - //mtktscpu_dprintk("[temperature_to_raw_abb] format_1=%d, format_2=%d, format_3=%d, format_4=%d\n", format_1, format_2, format_3, format_4); } - - //mtktscpu_dprintk("[temperature_to_raw_abb] temperature=%d, raw=%d", ret, format_4); return format_4; } @@ -1083,34 +612,22 @@ static kal_int32 raw_to_temperature_MCU1(kal_uint32 ret) kal_int32 format_3 = 0; kal_int32 format_4 = 0; - - //mtktscpu_dprintk("raw_to_temperature_MCU1\n"); - if(ret==0) - { + if (ret == 0) return 0; - } - //format_1 = (g_degc_cali / 2); format_1 = (g_degc_cali*10 / 2); format_2 = (y_curr - g_oe); format_3 = (((((format_2) * 10000) / 4096) * 10000) / g_gain) - g_x_roomt1; format_3 = format_3 * 15/18; - //format_4 = ((format_3 * 100) / 139); // uint = 0.1 deg - if(g_o_slope_sign==0) - { - //format_4 = ((format_3 * 100) / (139+g_o_slope)); // uint = 0.1 deg - format_4 = ((format_3 * 100) / (165+g_o_slope)); // uint = 0.1 deg - } - else - { - //format_4 = ((format_3 * 100) / (139-g_o_slope)); // uint = 0.1 deg - format_4 = ((format_3 * 100) / (165-g_o_slope)); // uint = 0.1 deg - } - format_4 = format_4 - (2 * format_4); - //t_current = (format_1 * 10) + format_4; // uint = 0.1 deg - t_current = format_1 + format_4; // uint = 0.1 deg + if (g_o_slope_sign == 0) + format_4 = ((format_3 * 100) / (165+g_o_slope)); + else + format_4 = ((format_3 * 100) / (165-g_o_slope)); + + format_4 = format_4 - (2 * format_4); + t_current = format_1 + format_4; return t_current; } @@ -1124,150 +641,34 @@ static kal_int32 raw_to_temperature_MCU2(kal_uint32 ret) kal_int32 format_3 = 0; kal_int32 format_4 = 0; - - //mtktscpu_dprintk("raw_to_temperature_MCU2\n"); - if(ret==0) - { + if (ret == 0) return 0; - } - //format_1 = (g_degc_cali / 2); + format_1 = (g_degc_cali*10 / 2); format_2 = (y_curr - g_oe); format_3 = (((((format_2) * 10000) / 4096) * 10000) / g_gain) - g_x_roomt2; format_3 = format_3 * 15/18; - //format_4 = ((format_3 * 100) / 139); // uint = 0.1 deg - if(g_o_slope_sign==0) - { - //format_4 = ((format_3 * 100) / (139+g_o_slope)); // uint = 0.1 deg - format_4 = ((format_3 * 100) / (165+g_o_slope)); // uint = 0.1 deg - } - else - { - //format_4 = ((format_3 * 100) / (139-g_o_slope)); // uint = 0.1 deg - format_4 = ((format_3 * 100) / (165-g_o_slope)); // uint = 0.1 deg - } - format_4 = format_4 - (2 * format_4); - //t_current = (format_1 * 10) + format_4; // uint = 0.1 deg - t_current = format_1 + format_4; // uint = 0.1 deg + if (g_o_slope_sign == 0) + format_4 = ((format_3 * 100) / (165+g_o_slope)); + else + format_4 = ((format_3 * 100) / (165-g_o_slope)); + + format_4 = format_4 - (2 * format_4); + t_current = format_1 + format_4; return t_current; } -/* -static int thermal_auxadc_get_data(int times, int Channel) -{ - int ret = 0, data[4], i, ret_value = 0, ret_temp = 0; - - if( IMM_IsAdcInitReady() == 0 ) - { - mtktscpu_dprintk("[thermal_auxadc_get_data]: AUXADC is not ready\n"); - return 0; - } - - i = times; - while (i--) - { - ret_value = IMM_GetOneChannelValue(Channel, data, &ret_temp); - ret += ret_temp; - mtktscpu_dprintk("[thermal_auxadc_get_data(ADCIN5)]: ret_temp=%d\n",ret_temp); - } - - ret = ret / times; - return ret; -} -*/ - static void thermal_calibration(void) { if (g_adc_cali_en_t == 0) - printk(KERN_CRIT "Not Calibration\n"); - - //mtktscpu_dprintk("thermal_calibration\n"); + pr_crit("Not Calibration\n"); thermal_cal_prepare_2(0); } -/* -static int mtktscpu_get_hw_temp(void) -{ - int ret=0, len=0; - int t_ret1=0; - static int abb[60]={0}; - int i=0; - - mutex_lock(&TS_lock); - - if(proc_write_flag==1) - { - MA_counter=0, MA_first_time=0; - MA_len=MA_len_temp; - proc_write_flag=0; - mtktscpu_dprintk("[mtktscpu_get_hw_temp]:MA_len=%d",MA_len); - } - - //get HW Abb temp(TS_abb) - THERMAL_WRAP_WR32(TS_CON0, 0x40); //abb - msleep(1); - ret = thermal_auxadc_get_data(y_curr_repeat_times, 11); - mtktscpu_dprintk("[mtktsabb_get_hw_temp]: TSABB average %d times channel 11 (0x%x,0x%x) = %d\n", - y_curr_repeat_times, DRV_Reg32(TS_CON0), DRV_Reg32(TS_CON1), ret); - - t_ret1 = raw_to_temperature_abb(ret); - t_ret1 = t_ret1 * 100; - abb[MA_counter] = t_ret1; - mtktscpu_dprintk("[mtktscpu_get_hw_temp] T_ABB, %d\n", t_ret1); - - - if(MA_counter==0 && MA_first_time==0 && MA_len!=1) - { - MA_counter++; - - //get HW Abb temp(TS_abb) - THERMAL_WRAP_WR32(TS_CON0, 0x40); //abb - msleep(1); - ret = thermal_auxadc_get_data(y_curr_repeat_times, 11); - mtktscpu_dprintk("[mtktsabb_get_hw_temp]: TSABB average %d times channel 11 (0x%x,0x%x) = %d\n", - y_curr_repeat_times, DRV_Reg32(TS_CON0), DRV_Reg32(TS_CON1), ret); - - t_ret1 = raw_to_temperature_abb(ret); - t_ret1 = t_ret1 * 100; - abb[MA_counter] = t_ret1; - mtktscpu_dprintk("[mtktscpu_get_hw_temp] T_ABB, %d\n", t_ret1); - - } - THERMAL_WRAP_WR32(TS_CON0, DRV_Reg32(TS_CON0) | 0x000000C0); // turn off the sensor buffer to save power - - - MA_counter++; - if(MA_first_time==0) - len = MA_counter; - else - len = MA_len; - - t_ret1 = 0; - for(i=0; i (trip_temp[0] - 15000)) || (curr_temp<-30000)) - printk("[Power/CPU_Thermal] CPU T=%d\n",curr_temp); - - temp_temp = curr_temp; - if (curr_temp != 0) // not resumed from suspensio... - { - if ((curr_temp > 150000) || (curr_temp < -20000)) // invalid range - { - printk("[Power/CPU_Thermal] CPU temp invalid=%d\n", curr_temp); - temp_temp = 50000; - ret = -1; - } - else if (last_cpu_real_temp != 0) - { - if ((curr_temp - last_cpu_real_temp > 20000) || (last_cpu_real_temp - curr_temp > 20000)) //delta 20C, invalid change - { - printk("[Power/CPU_Thermal] CPU temp float hugely temp=%d, lasttemp=%d\n", curr_temp, last_cpu_real_temp); - temp_temp = 50000; - ret = -1; - } - } - } - - last_cpu_real_temp = curr_temp; - curr_temp = temp_temp; - -#else - int ret = 0; - int curr_temp; - - curr_temp = CPU_Temp();//mtktscpu_get_TC_temp(); - - mtktscpu_dprintk(" mtktscpu_get_temp CPU T1=%d\n", curr_temp); - - if ((curr_temp > (trip_temp[0] - 15000)) || (curr_temp < -30000)) - printk("[Power/CPU_Thermal] CPU T=%d\n", curr_temp); -#endif - - read_curr_temp = curr_temp; - *t = (unsigned long) curr_temp; - -#if CPT_ADAPTIVE_AP_COOLER - g_prev_temp = g_curr_temp; - g_curr_temp = curr_temp; -#endif - - return ret; -} - int mtktscpu_get_cpu_temp(void) { int curr_temp; - curr_temp = get_immediate_temp1();//mtktscpu_get_TC_temp(); + curr_temp = get_immediate_temp1(); + if ((curr_temp > MTKTSCPU_TEMP_CRIT) || (curr_temp < -30000)) + mtktscpu_dprintk("[Power/CPU_Thermal] CPU T=%d\n", curr_temp); - mtktscpu_dprintk(" mtktscpu_get_cpu_temp CPU T1=%d\n",curr_temp); - - if((curr_temp > (trip_temp[0] - 15000)) || (curr_temp<-30000)) - printk("[Power/CPU_Thermal] CPU T=%d\n",curr_temp); - - - return ((unsigned long) curr_temp); + return (unsigned long) curr_temp; } -static int mtktscpu_bind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktscpu_match_cdev(struct thermal_cooling_device *cdev, + struct trip_t *trip, + int *index) { - int table_val=0; - - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - //set_thermal_ctrl_trigger_SPM(trip_temp[0]); // not overwritten by thermal policy - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktscpu_dprintk("[mtktscpu_bind] %s\n", cdev->type); - } - else - { - return 0; - } - - if (mtk_thermal_zone_bind_cooling_device(thermal, table_val, cdev)) { - printk("[mtktscpu_bind] error binding cooling dev\n"); + int i; + if (!strlen(cdev->type)) return -EINVAL; - } else { - printk("[mtktscpu_bind] binding OK, %d\n", table_val); - } + for (i = 0; i < THERMAL_MAX_TRIPS; i++) + if (!strcmp(cdev->type, trip->cdev[i].type)) { + *index = i; + return 0; + } + return -ENODEV; +} + +static int mtktscpu_cdev_bind(struct thermal_zone_device *thermal, + struct thermal_cooling_device *cdev) +{ + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + struct trip_t *trip = NULL; + int index = -1; + struct cdev_t *cool_dev; + unsigned long max_state, upper, lower; + int i, ret = -EINVAL; + + cdev->ops->get_max_state(cdev, &max_state); + + for (i = 0; i < pdata->num_trips; i++) { + trip = &pdata->trips[i]; + + if (mtktscpu_match_cdev(cdev, trip, &index)) + continue; + + if (index == -1) + return -EINVAL; + + cool_dev = &(trip->cdev[index]); + lower = cool_dev->lower; + upper = cool_dev->upper > max_state ? max_state : cool_dev->upper; + ret = thermal_zone_bind_cooling_device(thermal, + i, + cdev, + upper, + lower); + dev_info(&cdev->device, "%s bind to %d: idx=%d: u=%ld: l=%ld: %d-%s\n", cdev->type, + i, index, upper, lower, ret, ret ? "fail" : "succeed"); + } + return ret; +} + +static int mtktscpu_cdev_unbind(struct thermal_zone_device *thermal, + struct thermal_cooling_device *cdev) +{ + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + struct trip_t *trip; + int i, ret = -EINVAL; + int index = -1; + + for (i = 0; i < pdata->num_trips; i++) { + trip = &pdata->trips[i]; + if (mtktscpu_match_cdev(cdev, trip, &index)) + continue; + ret = thermal_zone_unbind_cooling_device(thermal, i, cdev); + dev_info(&cdev->device, "%s unbind from %d: %s\n", cdev->type, + i, ret ? "fail" : "succeed"); + } + return ret; +} + +static int mtktscpu_get_temp(struct thermal_zone_device *thermal, + unsigned long *t) +{ + int curr_temp = CPU_Temp(); + + if ((curr_temp > MTKTSCPU_TEMP_CRIT) || (curr_temp < -30000)) + pr_notice("[Power/CPU_Thermal] CPU T=%d\n", curr_temp); + + *t = (unsigned long)curr_temp; return 0; } -static int mtktscpu_unbind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktscpu_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) { - int table_val=0; + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktscpu_dprintk("[mtktscpu_unbind] %s\n", cdev->type); - } - else - return 0; + if (!pdata) + return -EINVAL; + *mode = pdata->mode; + return 0; +} - if (thermal_zone_unbind_cooling_device(thermal, table_val, cdev)) { - printk("[mtktscpu_unbind] error unbinding cooling dev\n"); +static int mtktscpu_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) +{ + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + + pdata->mode = mode; + schedule_work(&tzone->therm_work); + return 0; +} + +static int mtktscpu_get_trip_type(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type *type) +{ + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *type = pdata->trips[trip].type; + return 0; +} + +static int mtktscpu_get_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long *t) +{ + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *t = pdata->trips[trip].temp; + return 0; +} + +static int mtktscpu_set_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long t) +{ + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + pdata->trips[trip].temp = t; + return 0; +} + +static int mtktscpu_get_crit_temp(struct thermal_zone_device *thermal, unsigned long *t) +{ + int i; + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + + for (i = 0; i < pdata->num_trips; i++) { + if (pdata->trips[i].type == THERMAL_TRIP_CRITICAL) { + *t = pdata->trips[i].temp; + return 0; + } + } return -EINVAL; - } else { - printk("[mtktscpu_unbind] unbinding OK\n"); - } - - return 0; } -static int mtktscpu_get_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode *mode) +static int mtktscpu_get_trip_hyst(struct thermal_zone_device *thermal, + int trip, + unsigned long *hyst) { - *mode = (kernelmode) ? THERMAL_DEVICE_ENABLED - : THERMAL_DEVICE_DISABLED; + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + *hyst = pdata->trips[trip].hyst; return 0; } -static int mtktscpu_set_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode mode) +static int mtktscpu_set_trip_hyst(struct thermal_zone_device *thermal, + int trip, + unsigned long hyst) { - kernelmode = mode; + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + pdata->trips[trip].hyst = hyst; return 0; } -static int mtktscpu_get_trip_type(struct thermal_zone_device *thermal, int trip, - enum thermal_trip_type *type) +#ifdef CONFIG_AUSTIN_PROJECT +static int mtktscpu_thermal_notify(struct thermal_zone_device *thermal, + int trip, enum thermal_trip_type type) { - *type = g_THERMAL_TRIP[trip]; + pr_err("%s: thermal_shutdown notify\n", __func__); + last_kmsg_thermal_shutdown(); + pr_err("%s: thermal_shutdown notify end\n", __func__); + return 0; } +#endif -static int mtktscpu_get_trip_temp(struct thermal_zone_device *thermal, int trip, - unsigned long *temp) -{ - *temp = trip_temp[trip]; - return 0; -} - -static int mtktscpu_get_crit_temp(struct thermal_zone_device *thermal, - unsigned long *temperature) -{ - *temperature = MTKTSCPU_TEMP_CRIT; - return 0; -} - -/* bind callback functions to thermalzone */ static struct thermal_zone_device_ops mtktscpu_dev_ops = { - .bind = mtktscpu_bind, - .unbind = mtktscpu_unbind, + .bind = mtktscpu_cdev_bind, + .unbind = mtktscpu_cdev_unbind, .get_temp = mtktscpu_get_temp, .get_mode = mtktscpu_get_mode, .set_mode = mtktscpu_set_mode, .get_trip_type = mtktscpu_get_trip_type, .get_trip_temp = mtktscpu_get_trip_temp, + .set_trip_temp = mtktscpu_set_trip_temp, .get_crit_temp = mtktscpu_get_crit_temp, + .get_trip_hyst = mtktscpu_get_trip_hyst, + .set_trip_hyst = mtktscpu_set_trip_hyst, +#ifdef CONFIG_AUSTIN_PROJECT + .notify = mtktscpu_thermal_notify, +#endif }; -static int previous_step=-1; - -/* -static int step0_mask[11] = {1,1,1,1,1,1,1,1,1,1,1}; -static int step1_mask[11] = {0,1,1,1,1,1,1,1,1,1,1}; -static int step2_mask[11] = {0,0,1,1,1,1,1,1,1,1,1}; -static int step3_mask[11] = {0,0,0,1,1,1,1,1,1,1,1}; -static int step4_mask[11] = {0,0,0,0,1,1,1,1,1,1,1}; -static int step5_mask[11] = {0,0,0,0,0,1,1,1,1,1,1}; -static int step6_mask[11] = {0,0,0,0,0,0,1,1,1,1,1}; -static int step7_mask[11] = {0,0,0,0,0,0,0,1,1,1,1}; -static int step8_mask[11] = {0,0,0,0,0,0,0,0,1,1,1}; -static int step9_mask[11] = {0,0,0,0,0,0,0,0,0,1,1}; -static int step10_mask[11]= {0,0,0,0,0,0,0,0,0,0,1}; -*/ -int P_static(void) +static void mtktscpu_work(struct work_struct *work) { - int i=0; - int power=0; - int gpu_power=0; + struct mtktscpu_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata; - mtktscpu_dprintk("_mtktscpu_set_power_consumption_state ,Num_of_OPP=%d\n",Num_of_OPP); - - - for(i=0; i2) - { - gpu_power = mtk_gpu_power[Num_of_GPU_OPP-2].gpufreq_power; - power = (i*100+700) - gpu_power; - set_static_cpu_power_limit(power); - //Jerry 2013.3.24 mt_gpufreq_thermal_protect(mtk_gpu_power[Num_of_GPU_OPP-2].gpufreq_power); - } - else if(Num_of_GPU_OPP==2) - { - gpu_power = mtk_gpu_power[1].gpufreq_power; - power = (i*100+700) - gpu_power; - set_static_cpu_power_limit(power); - //Jerry 2013.3.24 mt_gpufreq_thermal_protect(mtk_gpu_power[1].gpufreq_power); - } - else if(Num_of_GPU_OPP==1) - { - #ifdef NEW_6582_NON_DVFS_GPU - // +7 is for 4*600MHz OPP - gpu_power = 676 - 7; - power = (i*100+700) - gpu_power; //676mW GPU_Default_POWER - #else - gpu_power = mtk_gpu_power[0].gpufreq_power; - power = (i*100+700) - gpu_power; - #endif - set_static_cpu_power_limit(power); - } -#if CONFIG_SUPPORT_MET_MTKTSCPU - if(met_mtktscpu_dbg) - { - trace_printk("%d,%d\n",power,gpu_power); - } -#endif - } - break; - } - } - - //If temp drop to our expect value, we need to restore initial cpu freq setting - if(i==Num_of_OPP) - { - if(previous_step!=-1) - { - previous_step = -1; - mtktscpu_limited_dmips = tscpu_cpu_dmips[19]; // highest dmips - xlog_printk(ANDROID_LOG_INFO, "Power/CPU_Thermal", "Free all thermal limit, previous_opp=%d\n", previous_step); - set_static_cpu_power_limit(0); -#if CONFIG_SUPPORT_MET_MTKTSCPU - if(met_mtktscpu_dbg) - { - trace_printk("%d,%d\n",5000,5000); - } -#endif - //Jerry 2013.3.24 mt_gpufreq_thermal_protect(0); - } - } - return 0; + mutex_lock(&therm_lock); + tzone = container_of(work, struct mtktscpu_thermal_zone, therm_work); + if (!tzone) + return; + pdata = tzone->pdata; + if (!pdata) + return; + if (pdata->mode == THERMAL_DEVICE_ENABLED) + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); } -#if CPT_ADAPTIVE_AP_COOLER - -extern unsigned long (*mtk_thermal_get_gpu_loading_fp)(void); - -static int TARGET_TJ = 65000; -static int TARGET_TJ_HIGH = 66000; -static int TARGET_TJ_LOW = 64000; -//static int PACKAGE_THETA_JA = 10; -static int PACKAGE_THETA_JA_RISE = 10; -static int PACKAGE_THETA_JA_FALL = 10; -static int MINIMUM_CPU_POWER = 500; // 598 * 3 -static int MAXIMUM_CPU_POWER = 1240; // 1.3 * 4 -static int MINIMUM_GPU_POWER = 676; -static int MAXIMUM_GPU_POWER = 676; -static int MINIMUM_TOTAL_POWER = 500+676; -static int MAXIMUM_TOTAL_POWER = 1240+676; -static int FIRST_STEP_TOTAL_POWER_BUDGET = 1750; // TODO: what is this? once TARGET_TJ reached, total power cannot exceed this hard limit! // 1.2 * 4 - -// 1. MINIMUM_BUDGET_CHANGE = 0 ==> thermal equilibrium maybe at higher than TARGET_TJ_HIGH -// 2. Set MINIMUM_BUDGET_CHANGE > 0 if to keep Tj at TARGET_TJ -static int MINIMUM_BUDGET_CHANGE = 50; //mW - -static int P_adaptive(int total_power, unsigned int gpu_loading) +static ssize_t trips_show(struct device *dev, struct device_attribute *attr, char *buf) { - static int cpu_power = 0, gpu_power = 0; - static int last_cpu_power = 0, last_gpu_power = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + return sprintf(buf, "%d\n", thermal->trips); +} +static ssize_t trips_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int trips = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if (total_power == 0) - { - set_adaptive_cpu_power_limit(0); - //mt_gpufreq_thermal_protect(0); -#if CONFIG_SUPPORT_MET_MTKTSCPU - if(met_mtktscpu_dbg) - { - trace_printk("%d,%d\n", 5000, 5000); - } -#endif - return 0; + if (!tzone || !pdata) + return -EINVAL; + if (sscanf(buf, "%d\n", &trips) != 1) + return -EINVAL; + if (trips < 0) + return -EINVAL; + + pdata->num_trips = trips; + thermal->trips = pdata->num_trips; + return count; +} +static ssize_t polling_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + return sprintf(buf, "%d\n", thermal->polling_delay); +} +static ssize_t polling_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int polling_delay = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtktscpu_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + + if (sscanf(buf, "%d\n", &polling_delay) != 1) + return -EINVAL; + if (polling_delay < 0) + return -EINVAL; + + pdata->polling_delay = polling_delay; + thermal->polling_delay = pdata->polling_delay; + thermal_zone_device_update(thermal); + return count; +} + +static DEVICE_ATTR(trips, S_IRUGO | S_IWUSR, trips_show, trips_store); +static DEVICE_ATTR(polling, S_IRUGO | S_IWUSR, polling_show, polling_store); + +static int mtktscpu_create_sysfs(struct mtktscpu_thermal_zone *tzone) +{ + int ret = 0; + ret = device_create_file(&tzone->tz->device, &dev_attr_polling); + if (ret) + pr_err("%s Failed to create polling attr\n", __func__); + ret = device_create_file(&tzone->tz->device, &dev_attr_trips); + if (ret) + pr_err("%s Failed to create trips attr\n", __func__); + return ret; +} + +static int mtktscpu_probe(struct platform_device *pdev) +{ + int ret = 0; + struct mtktscpu_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata = dev_get_platdata(&pdev->dev); + + if (!pdata) + return -EINVAL; + + thermal_cal_prepare(); + thermal_calibration(); + /* turn off the sensor buffer to save power */ + THERMAL_WRAP_WR32(DRV_Reg32(TS_CON0) | 0x000000C0, TS_CON0); + thermal_reset_and_initial(); + set_thermal_ctrl_trigger_SPM(MTKTSCPU_TEMP_CRIT); + + tzone = devm_kzalloc(&pdev->dev, sizeof(*tzone), GFP_KERNEL); + if (!tzone) + return -ENOMEM; + + memset(tzone, 0, sizeof(*tzone)); + tzone->pdata = pdata; + tzone->tz = thermal_zone_device_register("mtktscpu", + pdata->num_trips, + (1 << pdata->num_trips) - 1, + tzone, + &mtktscpu_dev_ops, + NULL, + 0, + pdata->polling_delay); + if (IS_ERR(tzone->tz)) { + pr_err("%s Failed to register mtktscpu thermal zone device\n", __func__); + return -EINVAL; } - last_cpu_power = cpu_power; - last_gpu_power = gpu_power; + ret = request_irq(THERM_CTRL_IRQ_ID, thermal_interrupt_handler, IRQF_TRIGGER_LOW, THERMAL_NAME, NULL); + if (ret) + pr_err("%s IRQ register fail\n", __func__); - // TODO: FIXME: to modify as generic GPU DVFS loading/power calculation - if (Num_of_GPU_OPP >= 2) - { - if (gpu_loading > 80) - gpu_power = MAXIMUM_GPU_POWER; - else - gpu_power = MINIMUM_GPU_POWER; - } - else - { - gpu_power = MINIMUM_GPU_POWER; - } - - cpu_power = total_power - gpu_power; - if (cpu_power < MINIMUM_CPU_POWER) - { - cpu_power = MINIMUM_CPU_POWER; - gpu_power = total_power - MINIMUM_CPU_POWER; - } - - if (cpu_power != last_cpu_power) - { - set_adaptive_cpu_power_limit(cpu_power); - } - if (gpu_power != last_gpu_power) - { - // No GPU thermal throttling available - //mt_gpufreq_thermal_protect(gpu_power); - } - - mtktscpu_dprintk("P_adaptive: cpu %d, gpu %d\n", cpu_power, gpu_power); -#if CONFIG_SUPPORT_MET_MTKTSCPU - if(met_mtktscpu_dbg) - { - trace_printk("%d,%d\n", cpu_power, gpu_power); - } -#endif + ret = mtktscpu_create_sysfs(tzone); + INIT_WORK(&tzone->therm_work, mtktscpu_work); + platform_set_drvdata(pdev, tzone); + pdata->mode = THERMAL_DEVICE_ENABLED; return 0; } -static int _adaptive_power(long prev_temp, long curr_temp, unsigned int gpu_loading) +static int mtktscpu_remove(struct platform_device *pdev) { - static int triggered = 0, total_power = 0; - int delta_power = 0; - - if (cl_dev_adp_cpu_state_active == 1) - { - mtktscpu_dprintk("[_adaptive_power] %d %d %d %d %d %d %d\n", FIRST_STEP_TOTAL_POWER_BUDGET, PACKAGE_THETA_JA_RISE, PACKAGE_THETA_JA_FALL, MINIMUM_BUDGET_CHANGE, MINIMUM_CPU_POWER, MAXIMUM_CPU_POWER, MINIMUM_GPU_POWER, MAXIMUM_GPU_POWER); - - /* Check if it is triggered */ - if (!triggered) - { - if (curr_temp < TARGET_TJ) - return 0; - else - { - triggered = 1; - total_power = FIRST_STEP_TOTAL_POWER_BUDGET; - mtktscpu_dprintk("_adaptive_power: Tp %d, Tc %d, Pt %d\n", prev_temp, curr_temp, total_power); - return P_adaptive(total_power, gpu_loading); - } - } - - /* Adjust total power budget if necessary */ - if ((curr_temp > TARGET_TJ_HIGH) && (curr_temp >= prev_temp)) - { - delta_power = (curr_temp - prev_temp) / PACKAGE_THETA_JA_RISE; - if (prev_temp > TARGET_TJ_HIGH) - { - delta_power = (delta_power > MINIMUM_BUDGET_CHANGE) ? delta_power : MINIMUM_BUDGET_CHANGE; - } - total_power -= delta_power; - total_power = (total_power > MINIMUM_TOTAL_POWER) ? total_power : MINIMUM_TOTAL_POWER; - } - - if ((curr_temp < TARGET_TJ_LOW) && (curr_temp <= prev_temp)) - { - delta_power = (prev_temp - curr_temp) / PACKAGE_THETA_JA_FALL; - if (prev_temp < TARGET_TJ_LOW) - { - delta_power = (delta_power > MINIMUM_BUDGET_CHANGE) ? delta_power : MINIMUM_BUDGET_CHANGE; - } - total_power += delta_power; - total_power = (total_power < MAXIMUM_TOTAL_POWER) ? total_power : MAXIMUM_TOTAL_POWER; - } - - mtktscpu_dprintk("_adaptive_power: Tp %d, Tc %d, Pt %d\n", prev_temp, curr_temp, total_power); - return P_adaptive(total_power, gpu_loading); - } - else - { - if (triggered) - { - triggered = 0; - mtktscpu_dprintk("_adaptive_power: Tp %d, Tc %d, Pt %d\n", prev_temp, curr_temp, total_power); - return P_adaptive(0,0); - } - } - - return 0; -} - -static int decide_ttj(void) -{ - int i = 0; - int active_cooler_id = -1; - int ret = 117000; // highest allowable TJ - for (; i < MAX_CPT_ADAPTIVE_COOLERS; i++) - { - if (cl_dev_adp_cpu_state[i]) - { - ret = MIN(ret, TARGET_TJS[i]); - cl_dev_adp_cpu_state_active = 1; - - if (ret == TARGET_TJS[i]) - active_cooler_id = i; - } - } - TARGET_TJ = ret; - TARGET_TJ_HIGH = TARGET_TJ + 1000; - TARGET_TJ_LOW = TARGET_TJ - 1000; - - if (0 <= active_cooler_id && MAX_CPT_ADAPTIVE_COOLERS > active_cooler_id) - { - PACKAGE_THETA_JA_RISE = PACKAGE_THETA_JA_RISES[active_cooler_id]; - PACKAGE_THETA_JA_FALL = PACKAGE_THETA_JA_FALLS[active_cooler_id]; - MINIMUM_CPU_POWER = MINIMUM_CPU_POWERS[active_cooler_id]; - MAXIMUM_CPU_POWER = MAXIMUM_CPU_POWERS[active_cooler_id]; - MINIMUM_GPU_POWER = MINIMUM_GPU_POWERS[active_cooler_id]; - MAXIMUM_GPU_POWER = MAXIMUM_GPU_POWERS[active_cooler_id]; - MINIMUM_TOTAL_POWER = MINIMUM_CPU_POWER+MINIMUM_GPU_POWER; - MAXIMUM_TOTAL_POWER = MAXIMUM_CPU_POWER+MAXIMUM_GPU_POWER; - FIRST_STEP_TOTAL_POWER_BUDGET = FIRST_STEP_TOTAL_POWER_BUDGETS[active_cooler_id]; - MINIMUM_BUDGET_CHANGE = MINIMUM_BUDGET_CHANGES[active_cooler_id]; - } - - return ret; -} -#endif - -static int cpufreq_F0x2_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - mtktscpu_dprintk("cpufreq_F0x2_get_max_state\n"); - *state = 1; - return 0; -} - -static int cpufreq_F0x2_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - int i=0; - mtktscpu_dprintk("get_cur_state, %s\n", cdev->type); - - for(i=0; itype, &cooler_name[i*20])) - { - *state = cl_dev_state[i]; - //mtktscpu_dprintk("get_cur_state: cl_dev_state[%d]=%d\n",i, cl_dev_state[i]); - } + struct mtktscpu_thermal_zone *tzone = platform_get_drvdata(pdev); + if (tzone) { + cancel_work_sync(&tzone->therm_work); + if (tzone->tz) + thermal_zone_device_unregister(tzone->tz); + kfree(tzone); } return 0; } -static int cpufreq_F0x2_set_cur_state(struct thermal_cooling_device *cdev, - unsigned long state) -{ - int i=0; - mtktscpu_dprintk("set_cur_state, %s\n", cdev->type); - - for(i=0; itype, &cooler_name[i*20])) - { - cl_dev_state[i]=state; - //mtktscpu_dprintk("set_cur_state: cl_dev_state[%d]=%d\n",i, cl_dev_state[i]); - P_static(); - break; - } - } - return 0; -} - -/* - * cooling device callback functions (mtktscpu_cooling_sysrst_ops) - * 1 : ON and 0 : OFF - */ -static int tscpu_sysrst_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - mtktscpu_dprintk("sysrst_get_max_state\n"); - *state = 1; - return 0; -} - -static int tscpu_sysrst_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - mtktscpu_dprintk("sysrst_get_cur_state\n"); - *state = cl_dev_sysrst_state; - return 0; -} - -static int tscpu_sysrst_set_cur_state(struct thermal_cooling_device *cdev, - unsigned long state) -{ - //mtktscpu_dprintk("sysrst_set_cur_state,state=%d\n",state); - cl_dev_sysrst_state = state; - if(cl_dev_sysrst_state == 1) - { - printk("Power/CPU_Thermal: reset, reset, reset!!!"); - printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); - printk("*****************************************"); - printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); - - BUG(); - //arch_reset(0,NULL); - } - return 0; -} - -#if CPT_ADAPTIVE_AP_COOLER -static int adp_cpu_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - mtktscpu_dprintk("adp_cpu_get_max_state\n"); - *state = 1; - return 0; -} - -static int adp_cpu_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - mtktscpu_dprintk("adp_cpu_get_cur_state\n"); - *state = cl_dev_adp_cpu_state[(cdev->type[13] - '0')]; - //*state = cl_dev_adp_cpu_state; - return 0; -} - -static int adp_cpu_set_cur_state(struct thermal_cooling_device *cdev, - unsigned long state) -{ - int ttj = 117000; - - cl_dev_adp_cpu_state[(cdev->type[13] - '0')] = state; - - ttj = decide_ttj(); - - mtktscpu_dprintk("adp_cpu_set_cur_state[%d] =%d, ttj=%d\n", (cdev->type[13] - '0'), state, ttj); - - { - unsigned int gpu_loading = (NULL == mtk_thermal_get_gpu_loading_fp) ? 0 : mtk_thermal_get_gpu_loading_fp(); - _adaptive_power(g_prev_temp, g_curr_temp, (unsigned int) gpu_loading); - } - return 0; -} -#endif - -/* bind fan callbacks to fan device */ - -static struct thermal_cooling_device_ops mtktscpu_cooling_F0x2_ops = { - .get_max_state = cpufreq_F0x2_get_max_state, - .get_cur_state = cpufreq_F0x2_get_cur_state, - .set_cur_state = cpufreq_F0x2_set_cur_state, -}; - -#if CPT_ADAPTIVE_AP_COOLER -static struct thermal_cooling_device_ops mtktscpu_cooler_adp_cpu_ops = { - .get_max_state = adp_cpu_get_max_state, - .get_cur_state = adp_cpu_get_cur_state, - .set_cur_state = adp_cpu_set_cur_state, -}; -#endif - -static struct thermal_cooling_device_ops mtktscpu_cooling_sysrst_ops = { - .get_max_state = tscpu_sysrst_get_max_state, - .get_cur_state = tscpu_sysrst_get_cur_state, - .set_cur_state = tscpu_sysrst_set_cur_state, -}; - -static int tscpu_read_opp(struct seq_file *m, void *v) -{ - int i=0; - for(i=0; i= 0 && i_id < MAX_CPT_ADAPTIVE_COOLERS) - { - if (i_first_step>0) FIRST_STEP_TOTAL_POWER_BUDGETS[i_id] = i_first_step; - if (i_theta_r>0) PACKAGE_THETA_JA_RISES[i_id] = i_theta_r; - if (i_theta_f>0) PACKAGE_THETA_JA_FALLS[i_id] = i_theta_f; - if (i_budget_change>0) MINIMUM_BUDGET_CHANGES[i_id] = i_budget_change; - if (i_min_cpu_pwr>0) MINIMUM_CPU_POWERS[i_id] = i_min_cpu_pwr; - if (i_max_cpu_pwr>0) MAXIMUM_CPU_POWERS[i_id] = i_max_cpu_pwr; - if (i_min_gpu_pwr>0) MINIMUM_GPU_POWERS[i_id] = i_min_gpu_pwr; - if (i_min_gpu_pwr>0) MAXIMUM_GPU_POWERS[i_id] = i_min_gpu_pwr; - - printk(KERN_CRIT "[Power/CPU_Thermal][mtktscpu_write_dtm_setting] applied %d %d %d %d %d %d %d %d\n", i_id, FIRST_STEP_TOTAL_POWER_BUDGETS[i_id], PACKAGE_THETA_JA_RISES[i_id], PACKAGE_THETA_JA_FALLS[i_id], MINIMUM_BUDGET_CHANGES[i_id], MINIMUM_CPU_POWERS[i_id], MAXIMUM_CPU_POWERS[i_id], MINIMUM_GPU_POWERS[i_id], MAXIMUM_GPU_POWERS[i_id]); - } - else - { - mtktscpu_dprintk("[mtktscpu_write_dtm_setting] out of range\n"); - } - - //MINIMUM_TOTAL_POWER = MINIMUM_CPU_POWER + MINIMUM_GPU_POWER; - //MAXIMUM_TOTAL_POWER = MAXIMUM_CPU_POWER + MAXIMUM_GPU_POWER; - - return count; - } - else - { - mtktscpu_dprintk("[mtktscpu_write_dtm_setting] bad argument\n"); - } - return -EINVAL; -} -#endif - -int mtktscpu_register_thermal(void); -void mtktscpu_unregister_thermal(void); - -static ssize_t tscpu_write(struct file *file, const char __user *buffer, size_t count, - loff_t *data) -{ - int len=0,time_msec=0; - int trip[10]={0}; - int t_type[10]={0}; - int i; - char bind0[20],bind1[20],bind2[20],bind3[20],bind4[20]; - char bind5[20],bind6[20],bind7[20],bind8[20],bind9[20]; - char desc[512]; - -// int curr_temp; - -// return 0; //test - - len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1); - if (copy_from_user(desc, buffer, len)) - { - return 0; - } - desc[len] = '\0'; - - if (sscanf(desc, "%d %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d", - &num_trip, &trip[0],&t_type[0],bind0, &trip[1],&t_type[1],bind1, - &trip[2],&t_type[2],bind2, &trip[3],&t_type[3],bind3, - &trip[4],&t_type[4],bind4, &trip[5],&t_type[5],bind5, - &trip[6],&t_type[6],bind6, &trip[7],&t_type[7],bind7, - &trip[8],&t_type[8],bind8, &trip[9],&t_type[9],bind9, - &time_msec, &MA_len_temp) == 33) - { - - mtktscpu_dprintk("[mtktscpu_write] mtktscpu_unregister_thermal,MA_len_temp=%d\n",MA_len_temp); - - /* modify for PTPOD, if disable Thermal, - PTPOD still need to use this function for getting temperature - */ - #if defined(CONFIG_THERMAL) - mtktscpu_unregister_thermal(); - #endif - - for(i=0; itrip_temp[i]) - break; - } - if(i==0) - { - printk("Power/CPU_Thermal: [mtktscpu_write] setting error"); - } - else if(i==num_trip) - set_high_low_threshold(trip_temp[i-1], 10000); - else - set_high_low_threshold(trip_temp[i-1], trip_temp[i]); -*/ - #if defined(CONFIG_THERMAL) - mtktscpu_dprintk("[mtktscpu_write] mtktscpu_register_thermal\n"); - mtktscpu_register_thermal(); - #endif - proc_write_flag=1; - - set_thermal_ctrl_trigger_SPM(trip_temp[0]); - - return count; - } - else - { - mtktscpu_dprintk("[mtktscpu_write] bad argument\n"); - } - - return -EINVAL; -} - -int mtktscpu_register_DVFS_hotplug_cooler(void) -{ -#if defined(CONFIG_THERMAL) - int i; - - mtktscpu_dprintk("[mtktscpu_register_DVFS_hotplug_cooler] \n"); - for(i=0; i= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - - - entry = - proc_create("tzcpu_log", S_IRUGO | S_IWUSR, mtktscpu_dir, - &mtktscpu_log_fops); - - entry = proc_create("thermlmt", S_IRUGO, NULL, &mtktscpu_opp_fops); // TODO: needs to modify ES... - - entry = proc_create("tzcpu_cal", S_IRUSR, mtktscpu_dir, &mtktscpu_cal_fops); - - entry = - proc_create("tzcpu_read_temperature", S_IRUGO, mtktscpu_dir, - &mtktscpu_read_temperature_fops); - -#if CPT_ADAPTIVE_AP_COOLER - entry = - proc_create("clatm_setting", S_IRUGO | S_IWUSR | S_IWGRP, mtktscpu_dir, - &mtktscpu_dtm_setting_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } -#endif - } -#endif -// get_thermal_slope_intercept(&ts); -// printk("INIT: ts_MTS=%d, ts_BTS=%d \n", ts.ts_MTS, ts.ts_BTS); - - return 0; - - /* modify for PTPOD, if disable Thermal, - PTPOD still need to use this function for getting temperature - */ -#if defined(CONFIG_THERMAL) -err_unreg: - mtktscpu_unregister_DVFS_hotplug_cooler(); - return err; -#endif + return platform_driver_register(&mtk_thermal_driver); } static void __exit mtktscpu_exit(void) { -#if defined(CONFIG_THERMAL) - mtktscpu_dprintk("[mtktscpu_exit] \n"); - mtktscpu_unregister_thermal(); - mtktscpu_unregister_DVFS_hotplug_cooler(); -#endif + platform_driver_unregister(&mtk_thermal_driver); } module_init(mtktscpu_init); module_exit(mtktscpu_exit); - -//late_initcall(thermal_late_init); -device_initcall(thermal_late_init); - - diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pcb.c b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pcb.c index 098e43598a6..d0c255dbc32 100644 --- a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pcb.c +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pcb.c @@ -244,19 +244,19 @@ static struct i2c_driver TMP103_HW_i2c_driver = { static char cmd_buf[10]; static ssize_t TMP103_HW_Write_Proc(struct file *file, const char *buf, unsigned long len, void *data) { - int ret; - int i_par=0; - - ret = copy_from_user(cmd_buf, buf, len); - if (ret < 0)return -1; + int i_par=0; + + len = (len < (sizeof(cmd_buf) - 1)) ? len : (sizeof(cmd_buf) - 1); + if (copy_from_user(cmd_buf, buf, len)) + return -1; - cmd_buf[len] = '\0'; - printk("[****TMP103_HW_Write_Proc****] %s\n", cmd_buf); + cmd_buf[len] = '\0'; + printk("[****TMP103_HW_Write_Proc****] %s\n", cmd_buf); - sscanf(cmd_buf, "%d ", &i_par); - i_enable_dbg = i_par; + sscanf(cmd_buf, "%d ", &i_par); + i_enable_dbg = i_par; - return -1; + return -1; } static int TMP103_HW_Read_Proc(char *buf, char **start, off_t off, int count, int *eof, void *data) diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pmic6323.c b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pmic6323.c index 93e5ce517aa..3020cd7488d 100644 --- a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pmic6323.c +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_pmic6323.c @@ -1,10 +1,10 @@ /* * Copyright (C) 2011-2014 MediaTek Inc. -* -* This program is free software: you can redistribute it and/or modify it under the terms of the +* +* 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. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * @@ -12,82 +12,54 @@ * If not, see . */ -#include -#include -#include -#include -#include +#include +#include #include #include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include +#include +#include #include -#include "mach/mtk_thermal_monitor.h" #include "mach/mt_typedefs.h" -#include "mach/mt_thermal.h" - -//#include -//#include -//#include -//#include #include #include #include +#include "mach/mt_thermal.h" -extern struct proc_dir_entry * mtk_thermal_get_proc_drv_therm_dir_entry(void); +#include +#include -static unsigned int interval = 0; /* seconds, 0 : no auto polling */ -static unsigned int trip_temp[10] = {120000,110000,100000,90000,80000,70000,65000,60000,55000,50000}; +#define MTKTSPMIC_TEMP_CRIT 148000 /* 150.000 degree Celsius */ +static DEFINE_MUTEX(therm_lock); -static unsigned int cl_dev_sysrst_state = 0; -static struct thermal_zone_device *thz_dev; - -static struct thermal_cooling_device *cl_dev_sysrst; -static int mtktspmic_debug_log = 0; -static int kernelmode = 0; - -static int g_THERMAL_TRIP[10] = {0,0,0,0,0,0,0,0,0,0}; -static int num_trip=0; -static char g_bind0[20]={0}; -static char g_bind1[20]={0}; -static char g_bind2[20]={0}; -static char g_bind3[20]={0}; -static char g_bind4[20]={0}; -static char g_bind5[20]={0}; -static char g_bind6[20]={0}; -static char g_bind7[20]={0}; -static char g_bind8[20]={0}; -static char g_bind9[20]={0}; - -#define mtktspmic_TEMP_CRIT 150000 /* 150.000 degree Celsius */ - -#define mtktspmic_dprintk(fmt, args...) \ -do { \ - if (mtktspmic_debug_log) { \ - xlog_printk(ANDROID_LOG_INFO, "Power/PMIC_Thermal", fmt, ##args); \ - } \ -} while(0) +struct mtktspmic_thermal_zone { + struct thermal_zone_device *tz; + struct work_struct therm_work; + struct mtk_thermal_platform_data *pdata; + struct thermal_dev *therm_fw; +}; /* Cali */ -static kal_int32 g_o_vts = 0; -static kal_int32 g_degc_cali = 0; -static kal_int32 g_adc_cali_en = 0; -static kal_int32 g_o_slope = 0; -static kal_int32 g_o_slope_sign = 0; -static kal_int32 g_id = 0; +static kal_int32 g_o_vts; +static kal_int32 g_degc_cali; +static kal_int32 g_adc_cali_en; +static kal_int32 g_o_slope; +static kal_int32 g_o_slope_sign; +static kal_int32 g_id; static kal_int32 g_slope1; static kal_int32 g_slope2; static kal_int32 g_intercept; -extern int PMIC_IMM_GetOneChannelValue(int dwChannel, int deCount, int trimd); + #define y_pmic_repeat_times 1 + static u16 pmic_read(u16 addr) { - u32 rdata=0; + u32 rdata = 0; pwrap_read((u32)addr, &rdata); return (u16)rdata; } @@ -99,7 +71,7 @@ static void pmic_cali_prepare(void) temp0 = pmic_read(0x63A); temp1 = pmic_read(0x63C); - printk("Power/PMIC_Thermal: Reg(0x63a)=0x%x, Reg(0x63c)=0x%x\n", temp0, temp1); + pr_info("Power/PMIC_Thermal: Reg(0x63a)=0x%x, Reg(0x63c)=0x%x\n", temp0, temp1); g_o_vts = ((temp1&0x001F) << 8) + ((temp0>>8) & 0x00FF); g_degc_cali = (temp0>>2) & 0x003f; @@ -107,70 +79,58 @@ static void pmic_cali_prepare(void) g_o_slope_sign = (temp1>>5) & 0x0001; /* - CHIP ID - E1 : 16'h1023 - E2 : 16'h2023 - E3 : 16'h3023 + CHIP ID + E1 : 16'h1023 + E2 : 16'h2023 + E3 : 16'h3023 */ - if(upmu_get_cid() == 0x1023) - { - g_id= (temp1>>12) & 0x0001; - g_o_slope = (temp1>>6) & 0x003f; - } - else - { - g_id= (temp1>>14) & 0x0001; - g_o_slope = (((temp1>>11) & 0x0007) << 3) + ((temp1>>6) & 0x007); + if (upmu_get_cid() == 0x1023) { + g_id = (temp1>>12) & 0x0001; + g_o_slope = (temp1>>6) & 0x003f; + } else { + g_id = (temp1>>14) & 0x0001; + g_o_slope = (((temp1>>11) & 0x0007) << 3) + ((temp1>>6) & 0x007); } - if(g_id==0) - { - g_o_slope=0; - } + if (g_id == 0) + g_o_slope = 0; - if(g_adc_cali_en == 0) //no calibration - { + if (g_adc_cali_en == 0) { g_o_vts = 3698; g_degc_cali = 50; g_o_slope = 0; g_o_slope_sign = 0; } - printk("Power/PMIC_Thermal: g_ver= 0x%x, g_o_vts = 0x%x, g_degc_cali = 0x%x, g_adc_cali_en = 0x%x, g_o_slope = 0x%x, g_o_slope_sign = 0x%x, g_id = 0x%x\n", - upmu_get_cid(),g_o_vts, g_degc_cali, g_adc_cali_en, g_o_slope, g_o_slope_sign, g_id); - mtktspmic_dprintk("Power/PMIC_Thermal: chip ver = 0x%x\n", upmu_get_cid()); - mtktspmic_dprintk("Power/PMIC_Thermal: g_o_vts = 0x%x\n", g_o_vts); - mtktspmic_dprintk("Power/PMIC_Thermal: g_degc_cali = 0x%x\n", g_degc_cali); - mtktspmic_dprintk("Power/PMIC_Thermal: g_adc_cali_en = 0x%x\n", g_adc_cali_en); - mtktspmic_dprintk("Power/PMIC_Thermal: g_o_slope = 0x%x\n", g_o_slope); - mtktspmic_dprintk("Power/PMIC_Thermal: g_o_slope_sign = 0x%x\n", g_o_slope_sign); - mtktspmic_dprintk("Power/PMIC_Thermal: g_id = 0x%x\n", g_id); + pr_info("Power/PMIC_Thermal: g_ver= 0x%x, g_o_vts = 0x%x, g_degc_cali = 0x%x, g_adc_cali_en = 0x%x, g_o_slope = 0x%x, g_o_slope_sign = 0x%x, g_id = 0x%x\n", + upmu_get_cid(), g_o_vts, g_degc_cali, g_adc_cali_en, g_o_slope, g_o_slope_sign, g_id); + pr_info("Power/PMIC_Thermal: chip ver = 0x%x\n", upmu_get_cid()); + pr_info("Power/PMIC_Thermal: g_o_vts = 0x%x\n", g_o_vts); + pr_info("Power/PMIC_Thermal: g_degc_cali = 0x%x\n", g_degc_cali); + pr_info("Power/PMIC_Thermal: g_adc_cali_en = 0x%x\n", g_adc_cali_en); + pr_info("Power/PMIC_Thermal: g_o_slope = 0x%x\n", g_o_slope); + pr_info("Power/PMIC_Thermal: g_o_slope_sign = 0x%x\n", g_o_slope_sign); + pr_info("Power/PMIC_Thermal: g_id = 0x%x\n", g_id); } static void pmic_cali_prepare2(void) { kal_int32 vbe_t; - g_slope1 = (100 * 1000); //1000 is for 0.001 degree - if(g_o_slope_sign==0) - { + g_slope1 = (100 * 1000); /*1000 is for 0.001 degree*/ + + if (g_o_slope_sign == 0) g_slope2 = -(171+g_o_slope); - } else - { g_slope2 = -(171-g_o_slope); - } - vbe_t= (-1) * (((g_o_vts + 9102)*1800)/32768) * 1000; - if(g_o_slope_sign==0) - { - g_intercept = (vbe_t * 100) / (-(171+g_o_slope)); //0.001 degree - } + + vbe_t = (-1) * (((g_o_vts + 9102)*1800)/32768) * 1000; + if (g_o_slope_sign == 0) + g_intercept = (vbe_t * 100) / (-(171+g_o_slope)); /*0.001 degree*/ else - { - g_intercept = (vbe_t * 100) / (-(171-g_o_slope)); //0.001 degree - } - g_intercept = g_intercept + (g_degc_cali*(1000/2)); // 1000 is for 0.1 degree - printk("[Power/PMIC_Thermal] [Thermal calibration] SLOPE1=%d SLOPE2=%d INTERCEPT=%d, Vbe = %d\n", - g_slope1, g_slope2, g_intercept,vbe_t); + g_intercept = (vbe_t * 100) / (-(171-g_o_slope)); /*0.001 degree*/ + g_intercept = g_intercept + (g_degc_cali*(1000/2)); /*1000 is for 0.1 degree*/ + pr_info("[Power/PMIC_Thermal] [Thermal calibration] SLOPE1=%d SLOPE2=%d INTERCEPT=%d, Vbe = %d\n", + g_slope1, g_slope2, g_intercept, vbe_t); } @@ -179,478 +139,352 @@ static kal_int32 pmic_raw_to_temp(kal_uint32 ret) kal_int32 y_curr = ret; kal_int32 t_current; t_current = g_intercept + ((g_slope1 * y_curr) / (g_slope2)); - //mtktspmic_dprintk("[pmic_raw_to_temp] t_current=%d\n",t_current); return t_current; } -//Jerry 2013.3.24extern void pmic_thermal_dump_reg(void); -//int ts_pmic_at_boot_time=0; static DEFINE_MUTEX(TSPMIC_lock); -static int pre_temp1=0, PMIC_counter=0; +static int pre_temp1, PMIC_counter; static int mtktspmic_get_hw_temp(void) { - int temp=0, temp1=0; - //int temp3=0; + int temp = 0, temp1 = 0; mutex_lock(&TSPMIC_lock); - - temp = PMIC_IMM_GetOneChannelValue(3, y_pmic_repeat_times , 2); - temp1 = pmic_raw_to_temp(temp); - //temp2 = pmic_raw_to_temp(675); + temp1 = pmic_raw_to_temp(temp); - mtktspmic_dprintk("[mtktspmic_get_hw_temp] PMIC_IMM_GetOneChannel 3=%d, T=%d\n",temp, temp1); + pr_debug("[mtktspmic_get_hw_temp] PMIC_IMM_GetOneChannel 3=%d, T=%d\n", temp, temp1); -// pmic_thermal_dump_reg(); // test + if ((temp1 > 100000) || (temp1 < -30000)) + pr_info("[Power/PMIC_Thermal] raw=%d, PMIC T=%d", temp, temp1); - if((temp1>100000) || (temp1<-30000)) - { - printk("[Power/PMIC_Thermal] raw=%d, PMIC T=%d", temp, temp1); -//Jerry 2013.3.24 pmic_thermal_dump_reg(); - } - - if((temp1>150000) || (temp1<-50000)) - { - printk("[Power/PMIC_Thermal] drop this data\n"); + if ((temp1 > 150000) || (temp1 < -50000)) { + pr_info("[Power/PMIC_Thermal] drop this data\n"); temp1 = pre_temp1; - } - else if( (PMIC_counter!=0) && (((pre_temp1-temp1)>30000) || ((temp1-pre_temp1)>30000)) ) - { - printk("[Power/PMIC_Thermal] drop this data 2\n"); + } else if ((PMIC_counter != 0) && (((pre_temp1-temp1) > 30000) || ((temp1-pre_temp1) > 30000))) { + pr_info("[Power/PMIC_Thermal] drop this data 2\n"); temp1 = pre_temp1; - } - else - { - //update previous temp + } else { pre_temp1 = temp1; - mtktspmic_dprintk("[Power/PMIC_Thermal] pre_temp1=%d\n", pre_temp1); + pr_debug("[Power/PMIC_Thermal] pre_temp1=%d\n", pre_temp1); - if(PMIC_counter==0) + if (PMIC_counter == 0) PMIC_counter++; } - - mutex_unlock(&TSPMIC_lock); return temp1; } -static int mtktspmic_get_temp(struct thermal_zone_device *thermal, - unsigned long *t) +static int mtktspmic_get_temp(struct thermal_zone_device *thermal, unsigned long *t) { *t = mtktspmic_get_hw_temp(); return 0; } -static int mtktspmic_bind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktspmic_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) { - int table_val=0; + struct mtktspmic_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktspmic_dprintk("[mtktspmic_bind] %s\n", cdev->type); - } - else - { - return 0; - } - - if (mtk_thermal_zone_bind_cooling_device(thermal, table_val, cdev)) { - mtktspmic_dprintk("[mtktspmic_bind] error binding cooling dev\n"); + if (!pdata) return -EINVAL; - } else { - mtktspmic_dprintk("[mtktspmic_bind] binding OK, %d\n", table_val); - } - + *mode = pdata->mode; return 0; } -static int mtktspmic_unbind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) +static int mtktspmic_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) { - int table_val=0; + struct mtktspmic_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if(!strcmp(cdev->type, g_bind0)) - { - table_val = 0; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind1)) - { - table_val = 1; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind2)) - { - table_val = 2; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind3)) - { - table_val = 3; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind4)) - { - table_val = 4; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind5)) - { - table_val = 5; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind6)) - { - table_val = 6; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind7)) - { - table_val = 7; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind8)) - { - table_val = 8; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else if(!strcmp(cdev->type, g_bind9)) - { - table_val = 9; - mtktspmic_dprintk("[mtktspmic_unbind] %s\n", cdev->type); - } - else - return 0; - - if (thermal_zone_unbind_cooling_device(thermal, table_val, cdev)) { - mtktspmic_dprintk("[mtktspmic_unbind] error unbinding cooling dev\n"); + if (!pdata) return -EINVAL; - } else { - mtktspmic_dprintk("[mtktspmic_unbind] unbinding OK\n"); + + pdata->mode = mode; + schedule_work(&tzone->therm_work); + return 0; +} + +static int mtktspmic_get_trip_type(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type *type) +{ + struct mtktspmic_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *type = pdata->trips[trip].type; + return 0; +} + +static int mtktspmic_get_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long *t) +{ + struct mtktspmic_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *t = pdata->trips[trip].temp; + return 0; +} + +static int mtktspmic_set_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long t) +{ + struct mtktspmic_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + pdata->trips[trip].temp = t; + return 0; +} + +static int mtktspmic_get_crit_temp(struct thermal_zone_device *thermal, unsigned long *t) +{ + int i; + struct mtktspmic_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + + for (i = 0; i < pdata->num_trips; i++) { + if (pdata->trips[i].type == THERMAL_TRIP_CRITICAL) { + *t = pdata->trips[i].temp; + return 0; + } } - - return 0; + return -EINVAL; } -static int mtktspmic_get_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode *mode) +#ifdef CONFIG_AUSTIN_PROJECT +static int mtktspmic_thermal_notify(struct thermal_zone_device *thermal, + int trip, enum thermal_trip_type type) { - *mode = (kernelmode) ? THERMAL_DEVICE_ENABLED - : THERMAL_DEVICE_DISABLED; + pr_err("%s: thermal_shutdown notify\n", __func__); + last_kmsg_thermal_shutdown(); + pr_err("%s: thermal_shutdown notify end\n", __func__); + return 0; } +#endif -static int mtktspmic_set_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode mode) -{ - kernelmode = mode; - return 0; -} - -static int mtktspmic_get_trip_type(struct thermal_zone_device *thermal, int trip, - enum thermal_trip_type *type) -{ - *type = g_THERMAL_TRIP[trip]; - return 0; -} - -static int mtktspmic_get_trip_temp(struct thermal_zone_device *thermal, int trip, - unsigned long *temp) -{ - *temp = trip_temp[trip]; - return 0; -} - -static int mtktspmic_get_crit_temp(struct thermal_zone_device *thermal, - unsigned long *temperature) -{ - *temperature = mtktspmic_TEMP_CRIT; - return 0; -} - -/* bind callback functions to thermalzone */ static struct thermal_zone_device_ops mtktspmic_dev_ops = { - .bind = mtktspmic_bind, - .unbind = mtktspmic_unbind, .get_temp = mtktspmic_get_temp, .get_mode = mtktspmic_get_mode, .set_mode = mtktspmic_set_mode, .get_trip_type = mtktspmic_get_trip_type, .get_trip_temp = mtktspmic_get_trip_temp, + .set_trip_temp = mtktspmic_set_trip_temp, .get_crit_temp = mtktspmic_get_crit_temp, +#ifdef CONFIG_AUSTIN_PROJECT + .notify = mtktspmic_thermal_notify, +#endif }; -static int tspmic_sysrst_get_max_state(struct thermal_cooling_device *cdev, - unsigned long *state) +static void mtktspmic_work(struct work_struct *work) { - *state = 1; - return 0; -} -static int tspmic_sysrst_get_cur_state(struct thermal_cooling_device *cdev, - unsigned long *state) -{ - *state = cl_dev_sysrst_state; - return 0; -} -static int tspmic_sysrst_set_cur_state(struct thermal_cooling_device *cdev, - unsigned long state) -{ - cl_dev_sysrst_state = state; - if(cl_dev_sysrst_state == 1) - { - printk("Power/PMIC_Thermal: reset, reset, reset!!!"); - printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); - printk("*****************************************"); - printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); + struct mtktspmic_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata; - BUG(); - //arch_reset(0,NULL); - } - return 0; + mutex_lock(&therm_lock); + tzone = container_of(work, struct mtktspmic_thermal_zone, therm_work); + if (!tzone) + return; + pdata = tzone->pdata; + if (!pdata) + return; + if (pdata->mode == THERMAL_DEVICE_ENABLED) + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); } -static struct thermal_cooling_device_ops mtktspmic_cooling_sysrst_ops = { - .get_max_state = tspmic_sysrst_get_max_state, - .get_cur_state = tspmic_sysrst_get_cur_state, - .set_cur_state = tspmic_sysrst_set_cur_state, +static int mtktspmic_read_temp(struct thermal_dev *tdev) +{ + return mtktspmic_get_hw_temp(); +} +static struct thermal_dev_ops mtktspmic_fops = { + .get_temp = mtktspmic_read_temp, }; +#ifdef CONFIG_AUSTIN_PROJECT +struct thermal_dev_params mtktspmic_tdp = { + .offset = 14500, + .alpha = 4, + .weight = 250 +}; +#else +struct thermal_dev_params mtktspmic_tdp = { + .offset = 18000, + .alpha = 4, + .weight = 450 +}; +#endif -static int mtktspmic_read(struct seq_file *m, void *v) +static int mtktspmic_show_params(struct device *dev, + struct device_attribute *devattr, + char *buf) { - seq_printf(m, "[ mtktspmic_read] trip_0_temp=%d,trip_1_temp=%d,trip_2_temp=%d,trip_3_temp=%d,trip_4_temp=%d,\n\ -trip_5_temp=%d,trip_6_temp=%d,trip_7_temp=%d,trip_8_temp=%d,trip_9_temp=%d,\n\ -g_THERMAL_TRIP_0=%d,g_THERMAL_TRIP_1=%d,g_THERMAL_TRIP_2=%d,g_THERMAL_TRIP_3=%d,g_THERMAL_TRIP_4=%d,\n\ -g_THERMAL_TRIP_5=%d,g_THERMAL_TRIP_6=%d,g_THERMAL_TRIP_7=%d,g_THERMAL_TRIP_8=%d,g_THERMAL_TRIP_9=%d,\n\ -cooldev0=%s,cooldev1=%s,cooldev2=%s,cooldev3=%s,cooldev4=%s,\n\ -cooldev5=%s,cooldev6=%s,cooldev7=%s,cooldev8=%s,cooldev9=%s,time_ms=%d\n", - trip_temp[0], trip_temp[1], trip_temp[2], trip_temp[3], trip_temp[4], trip_temp[5], trip_temp[6], trip_temp[7], trip_temp[8], trip_temp[9], g_THERMAL_TRIP[0], g_THERMAL_TRIP[1], g_THERMAL_TRIP[2], g_THERMAL_TRIP[3], g_THERMAL_TRIP[4], g_THERMAL_TRIP[5], g_THERMAL_TRIP[6], g_THERMAL_TRIP[7], g_THERMAL_TRIP[8], g_THERMAL_TRIP[9], g_bind0, g_bind1, g_bind2, g_bind3, g_bind4, g_bind5, g_bind6, g_bind7, g_bind8, g_bind9, interval * 1000); + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtktspmic_thermal_zone *tzone = thermal->devdata; - return 0; + if (!tzone) + return -EINVAL; + return sprintf(buf, "offset=%d alpha=%d weight=%d\n", + tzone->therm_fw->tdp->offset, + tzone->therm_fw->tdp->alpha, + tzone->therm_fw->tdp->weight); } -int mtktspmic_register_thermal(void); -void mtktspmic_unregister_thermal(void); - -static ssize_t mtktspmic_write(struct file *file, const char __user *buffer, size_t count, - loff_t *data) +static ssize_t mtktspmic_store_params(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) { - int len=0,time_msec=0; - int trip[10]={0}; - int t_type[10]={0}; - int i; - char bind0[20],bind1[20],bind2[20],bind3[20],bind4[20]; - char bind5[20],bind6[20],bind7[20],bind8[20],bind9[20]; - char desc[512]; - - - len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1); - if (copy_from_user(desc, buffer, len)) { - return 0; - } - desc[len] = '\0'; - - if (sscanf(desc, "%d %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d", - &num_trip, &trip[0],&t_type[0],bind0, &trip[1],&t_type[1],bind1, - &trip[2],&t_type[2],bind2, &trip[3],&t_type[3],bind3, - &trip[4],&t_type[4],bind4, &trip[5],&t_type[5],bind5, - &trip[6],&t_type[6],bind6, &trip[7],&t_type[7],bind7, - &trip[8],&t_type[8],bind8, &trip[9],&t_type[9],bind9, - &time_msec) == 32) - { - mtktspmic_dprintk("[mtktspmic_write] mtktspmic_unregister_thermal\n"); - mtktspmic_unregister_thermal(); - - for(i=0; idevdata; + if (!tzone) + return -EINVAL; + if (sscanf(buf, "%s %d", param, &value) == 2) { + if (!strcmp(param, "offset")) + tzone->therm_fw->tdp->offset = value; + if (!strcmp(param, "alpha")) + tzone->therm_fw->tdp->alpha = value; + if (!strcmp(param, "weight")) + tzone->therm_fw->tdp->weight = value; return count; - } else { - mtktspmic_dprintk("[mtktspmic_write] bad argument\n"); } - return -EINVAL; } -int mtktspmic_register_cooler(void) +static DEVICE_ATTR(params, S_IRUGO | S_IWUSR, mtktspmic_show_params, mtktspmic_store_params); + +static int mtktspmic_probe(struct platform_device *pdev) { - cl_dev_sysrst = mtk_thermal_cooling_device_register("mtktspmic-sysrst", NULL, - &mtktspmic_cooling_sysrst_ops); - return 0; -} + int ret = 0; + struct mtktspmic_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata = dev_get_platdata(&pdev->dev); -int mtktspmic_register_thermal(void) -{ - mtktspmic_dprintk("[mtktspmic_register_thermal] \n"); + if (!pdata) + return -EINVAL; - /* trips : trip 0~2 */ - thz_dev = mtk_thermal_zone_device_register("mtktspmic", num_trip, NULL, - &mtktspmic_dev_ops, 0, 0, 0, interval*1000); + pmic_cali_prepare(); + pmic_cali_prepare2(); + tzone = devm_kzalloc(&pdev->dev, sizeof(*tzone), GFP_KERNEL); + if (!tzone) + return -ENOMEM; + + memset(tzone, 0, sizeof(*tzone)); + tzone->pdata = pdata; + tzone->tz = thermal_zone_device_register("mtktspmic", + pdata->num_trips, + 1, + tzone, + &mtktspmic_dev_ops, + NULL, + 0, + pdata->polling_delay); + if (IS_ERR(tzone->tz)) { + pr_err("%s Failed to register mtktspmic thermal zone device\n", __func__); + return -EINVAL; + } + tzone->therm_fw = kzalloc(sizeof(struct thermal_dev), GFP_KERNEL); + if (!tzone->therm_fw) + return -ENOMEM; + tzone->therm_fw->name = "mtktspmic"; + tzone->therm_fw->dev = &(pdev->dev); + tzone->therm_fw->dev_ops = &mtktspmic_fops; + tzone->therm_fw->tdp = &mtktspmic_tdp; + + ret = thermal_dev_register(tzone->therm_fw); + if (ret) { + pr_err("Error registering therml mtktspmic device\n"); + return -EINVAL; + } + + INIT_WORK(&tzone->therm_work, mtktspmic_work); + ret = device_create_file(&tzone->tz->device, &dev_attr_params); + if (ret) + pr_err("%s Failed to create params attr\n", __func__); + pdata->mode = THERMAL_DEVICE_ENABLED; + platform_set_drvdata(pdev, tzone); return 0; } -void mtktspmic_unregister_cooler(void) +static int mtktspmic_remove(struct platform_device *pdev) { - if (cl_dev_sysrst) { - mtk_thermal_cooling_device_unregister(cl_dev_sysrst); - cl_dev_sysrst = NULL; + struct mtktspmic_thermal_zone *tzone = platform_get_drvdata(pdev); + if (tzone) { + cancel_work_sync(&tzone->therm_work); + if (tzone->tz) + thermal_zone_device_unregister(tzone->tz); + kfree(tzone); } + return 0; } -void mtktspmic_unregister_thermal(void) -{ - mtktspmic_dprintk("[mtktspmic_unregister_thermal] \n"); +static struct platform_driver mtktspmic_driver = { + .probe = mtktspmic_probe, + .remove = mtktspmic_remove, + .driver = { + .name = "mtktspmic", + .owner = THIS_MODULE, + }, +}; - if (thz_dev) { - mtk_thermal_zone_device_unregister(thz_dev); - thz_dev = NULL; - } -} +static struct mtk_thermal_platform_data mtktspmic_thermal_data = { + .num_trips = 1, + .mode = THERMAL_DEVICE_DISABLED, + .polling_delay = 1000, + .trips[0] = {.temp = MTKTSPMIC_TEMP_CRIT, .type = THERMAL_TRIP_CRITICAL, .hyst = 0}, +}; -static int mtktspmic_open(struct inode *inode, struct file *file) -{ - return single_open(file, mtktspmic_read, NULL); -} - -static const struct file_operations mtktspmic_fops = { - .owner = THIS_MODULE, - .open = mtktspmic_open, - .read = seq_read, - .llseek = seq_lseek, - .write = mtktspmic_write, - .release = single_release, +static struct platform_device mtktspmic_device = { + .name = "mtktspmic", + .id = -1, + .dev = { + .platform_data = &mtktspmic_thermal_data, + }, }; static int __init mtktspmic_init(void) { - int err = 0; - struct proc_dir_entry *entry = NULL; - struct proc_dir_entry *mtktspmic_dir = NULL; - - mtktspmic_dprintk("[%s]\n", __func__); - pmic_cali_prepare(); - pmic_cali_prepare2(); - - err = mtktspmic_register_cooler(); - if(err) - return err; - err = mtktspmic_register_thermal(); - if (err) - goto err_unreg; - - mtktspmic_dir = mtk_thermal_get_proc_drv_therm_dir_entry(); - if (!mtktspmic_dir) { - mtktspmic_dprintk("[%s]: mkdir /proc/driver/thermal failed\n", __func__); - } - entry = proc_create("tzpmic", S_IRUGO | S_IWUSR | S_IWGRP, mtktspmic_dir, &mtktspmic_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - - return 0; - -err_unreg: - mtktspmic_unregister_cooler(); - return err; + int ret; + ret = platform_driver_register(&mtktspmic_driver); + if (ret) { + pr_err("Unable to register mtktspmic thermal driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtktspmic_device); + if (ret) { + pr_err("Unable to register mtktspmic device (%d)\n", ret); + return ret; + } + return 0; } static void __exit mtktspmic_exit(void) { - mtktspmic_dprintk("[mtktspmic_exit] \n"); - mtktspmic_unregister_thermal(); - mtktspmic_unregister_cooler(); + platform_driver_unregister(&mtktspmic_driver); + platform_device_unregister(&mtktspmic_device); } module_init(mtktspmic_init); diff --git a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_wmt.c b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_wmt.c index a2833aa122b..9a875372efe 100644 --- a/drivers/misc/mediatek/thermal/mt8127/mtk_ts_wmt.c +++ b/drivers/misc/mediatek/thermal/mt8127/mtk_ts_wmt.c @@ -1,10 +1,10 @@ /* * Copyright (C) 2011-2014 MediaTek Inc. -* -* This program is free software: you can redistribute it and/or modify it under the terms of the +* +* 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. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * @@ -18,11 +18,18 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include +#include +#include #include +#include +#include +#include #include #include #include -#include +#include +#include +#include /* #include "wmt_tm.h" */ #include #include @@ -32,1516 +39,334 @@ /* For using net dev - */ #include +#include +#include -static int wmt_tm_debug_log = 0; -#define wmt_tm_dprintk(fmt, args...) \ -do { \ - if (wmt_tm_debug_log) { \ - pr_debug("tz/mtktswmt " fmt, ##args); \ - } \ -} while(0) +#define MTKTSWMT_TEMP_CRIT 118000 /* value from MTK */ +static DEFINE_MUTEX(therm_lock); -#define wmt_tm_printk(fmt, args...) \ -do { \ - pr_debug("tz/mtktswmt " fmt, ##args); \ -} while(0) - -#define wmt_tm_info(fmt, args...) \ -do { \ - pr_debug("tz/mtktswmt " fmt, ##args); \ -} while(0) - -struct linux_thermal_ctrl_if { - int kernel_mode; - int interval; - struct thermal_zone_device *thz_dev; - struct thermal_cooling_device *cl_dev; - struct thermal_cooling_device *cl_pa1_dev; - struct thermal_cooling_device *cl_pa2_dev; - struct thermal_cooling_device *cl_pa3_dev; +struct mtktswmt_thermal_zone { + struct thermal_zone_device *tz; + struct work_struct therm_work; + struct mtk_thermal_platform_data *pdata; + struct thermal_dev *therm_fw; }; -#if 0 -struct wmt_thermal_ctrl_if { - struct wmt_thermal_ctrl_ops ops; -}; -#endif - -typedef struct wmt_tm { - struct linux_thermal_ctrl_if linux_if; - /* struct wmt_thermal_ctrl_if wmt_if; */ -}wmt_tm_t; - -struct wmt_stats { - unsigned long pre_time; - unsigned long pre_tx_bytes; -}; - -extern struct proc_dir_entry * mtk_thermal_get_proc_drv_therm_dir_entry(void); - -static struct timer_list wmt_stats_timer; -static struct wmt_stats wmt_stats_info; -static unsigned long pre_time; -static unsigned long tx_throughput; - -/*New Wifi throttling Algo+*/ -//over_up_time * polling interval > up_duration --> throttling -static unsigned int over_up_time = 0; //polling time -static unsigned int up_duration = 30; //sec -static unsigned int up_denominator = 2; -static unsigned int up_numerator = 1; - -//below_low_time * polling interval > low_duration --> throttling -static unsigned int below_low_time = 0; //polling time -static unsigned int low_duration = 10; //sec -static unsigned int low_denominator = 2; -static unsigned int low_numerator = 3; - -static unsigned int low_rst_time = 0; -static unsigned int low_rst_max = 3; -/*New Wifi throttling Algo-*/ - -#define MAX_LEN 256 -#define COOLER_THRO_NUM 3 -#define COOLER_NUM 10 -#define ONE_MBITS_PER_SEC 1000 - -static unsigned int tm_pid = 0; -static unsigned int tm_input_pid = 0; -static unsigned int tm_wfd_stat = 0; -static struct task_struct g_task; -static struct task_struct *pg_task = &g_task; - -/* +Cooler info+ */ -static int g_num_trip = COOLER_THRO_NUM + 1; -static char g_bind0[20]="mtktswmt-pa1"; -static char g_bind1[20]="mtktswmt-pa2"; -static char g_bind2[20]="mtktswmt-pa3"; -static char g_bind3[20]="mtktswmt-sysrst"; -static char g_bind4[20]={0}; -static char g_bind5[20]={0}; -static char g_bind6[20]={0}; -static char g_bind7[20]={0}; -static char g_bind8[20]={0}; -static char g_bind9[20]={0}; - -/** - * If curr_temp >= polling_trip_temp1, use interval - * else if cur_temp >= polling_trip_temp2 && curr_temp < polling_trip_temp1, use interval*polling_factor1 - * else, use interval*polling_factor2 - */ -static int polling_trip_temp1 = 40000; -static int polling_trip_temp2 = 20000; -static int polling_factor1 = 5; -static int polling_factor2 = 10; - -static unsigned int cl_dev_state =0; -static unsigned int cl_pa1_dev_state =0; -static unsigned int cl_pa2_dev_state =0; -/*static unsigned int cl_pa3_dev_state =0;*/ -static unsigned int g_trip_temp[COOLER_NUM] = {85000,85000,85000,85000,0,0,0,0,0,0}; - -/*static int g_thro[COOLER_THRO_NUM] = {10 * ONE_MBITS_PER_SEC, 5 * ONE_MBITS_PER_SEC, 1 * ONE_MBITS_PER_SEC};*/ -static int g_thermal_trip[COOLER_NUM] = {0,0,0,0,0,0,0,0,0,0}; - -/* -Cooler info- */ - -wmt_tm_t g_wmt_tm; -wmt_tm_t *pg_wmt_tm = &g_wmt_tm; - -static int wmt_thz_bind(struct thermal_zone_device *, - struct thermal_cooling_device *); -static int wmt_thz_unbind(struct thermal_zone_device *, - struct thermal_cooling_device *); -static int wmt_thz_get_temp(struct thermal_zone_device *, - unsigned long *); -static int wmt_thz_get_mode(struct thermal_zone_device *, - enum thermal_device_mode *); -static int wmt_thz_set_mode(struct thermal_zone_device *, - enum thermal_device_mode); -static int wmt_thz_get_trip_type(struct thermal_zone_device *, int, - enum thermal_trip_type *); -static int wmt_thz_get_trip_temp(struct thermal_zone_device *, int, - unsigned long *); -static int wmt_thz_get_crit_temp(struct thermal_zone_device *, - unsigned long *); -static int wmt_cl_get_max_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_get_cur_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_set_cur_state(struct thermal_cooling_device *, - unsigned long); - -static int wmt_cl_pa1_get_max_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_pa1_get_cur_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_pa1_set_cur_state(struct thermal_cooling_device *, - unsigned long); - -static int wmt_cl_pa2_get_max_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_pa2_get_cur_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_pa2_set_cur_state(struct thermal_cooling_device *, - unsigned long); - -#ifdef NEVER -static int wmt_cl_pa3_get_max_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_pa3_get_cur_state(struct thermal_cooling_device *, - unsigned long *); -static int wmt_cl_pa3_set_cur_state(struct thermal_cooling_device *, - unsigned long); -#endif /* NEVER */ - -static struct thermal_zone_device_ops wmt_thz_dev_ops = { - .bind = wmt_thz_bind, - .unbind = wmt_thz_unbind, - .get_temp = wmt_thz_get_temp, - .get_mode = wmt_thz_get_mode, - .set_mode = wmt_thz_set_mode, - .get_trip_type = wmt_thz_get_trip_type, - .get_trip_temp = wmt_thz_get_trip_temp, - .get_crit_temp = wmt_thz_get_crit_temp, -}; - -static struct thermal_cooling_device_ops mtktspa_cooling_sysrst_ops = { - .get_max_state = wmt_cl_get_max_state, - .get_cur_state = wmt_cl_get_cur_state, - .set_cur_state = wmt_cl_set_cur_state, -}; - -static struct thermal_cooling_device_ops mtktspa_cooling_pa1_ops = { - .get_max_state = wmt_cl_pa1_get_max_state, - .get_cur_state = wmt_cl_pa1_get_cur_state, - .set_cur_state = wmt_cl_pa1_set_cur_state, -}; - -static struct thermal_cooling_device_ops mtktspa_cooling_pa2_ops = { - .get_max_state = wmt_cl_pa2_get_max_state, - .get_cur_state = wmt_cl_pa2_get_cur_state, - .set_cur_state = wmt_cl_pa2_set_cur_state, -}; - -#ifdef NEVER -static struct thermal_cooling_device_ops mtktspa_cooling_pa3_ops = { - .get_max_state = wmt_cl_pa3_get_max_state, - .get_cur_state = wmt_cl_pa3_get_cur_state, - .set_cur_state = wmt_cl_pa3_set_cur_state, -}; -#endif /* NEVER */ - -static unsigned long get_tx_bytes(void) +static int mtktswmt_get_temp(struct thermal_zone_device *thermal, unsigned long *t) { - struct net_device *dev; - struct net *net; - unsigned long tx_bytes = 0; - - read_lock(&dev_base_lock); - for_each_net(net) { - for_each_netdev(net, dev) { - if(!strncmp(dev->name, "wlan", 4) || !strncmp(dev->name, "ap", 2) || !strncmp(dev->name, "p2p", 3)) { - struct rtnl_link_stats64 temp; - const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp); - tx_bytes = tx_bytes + stats->tx_bytes; - } - } - } - read_unlock(&dev_base_lock); - return tx_bytes; -} - -static int wmt_cal_stats(unsigned long data) -{ - struct wmt_stats *stats_info = (struct wmt_stats*) data; - struct timeval cur_time; - - wmt_tm_dprintk("[%s] pre_time=%lu, pre_data=%lu\n", __func__, pre_time, stats_info->pre_tx_bytes); - - do_gettimeofday(&cur_time); - - if (pre_time != 0 && cur_time.tv_sec > pre_time) { - unsigned long tx_bytes = get_tx_bytes(); - if (tx_bytes > stats_info->pre_tx_bytes) { - - tx_throughput = ((tx_bytes - stats_info->pre_tx_bytes) / (cur_time.tv_sec - pre_time)) >> 7; - - wmt_tm_dprintk("[%s] cur_time=%lu, cur_data=%lu, tx_throughput=%luKb/s\n", __func__, cur_time.tv_sec, tx_bytes, tx_throughput ); - - stats_info->pre_tx_bytes = tx_bytes; - } else if (tx_bytes < stats_info->pre_tx_bytes) { - /* Overflow */ - tx_throughput = ((0xffffffff - stats_info->pre_tx_bytes + tx_bytes) / (cur_time.tv_sec - pre_time)) >> 7;; - stats_info->pre_tx_bytes = tx_bytes; - wmt_tm_dprintk("[%s] cur_tx(%lu) < pre_tx\n", __func__, tx_bytes); - } else { - /* No traffic */ - tx_throughput = 0; - wmt_tm_dprintk("[%s] cur_tx(%lu) = pre_tx\n", __func__, tx_bytes); - } - } else { - /* Overflow possible ??*/ - tx_throughput = 0; - wmt_tm_printk("[%s] cur_time(%lu) < pre_time\n", __func__, cur_time.tv_sec); - } - - pre_time = cur_time.tv_sec; - wmt_tm_dprintk("[%s] pre_time=%lu, tv_sec=%lu\n",__func__, pre_time, cur_time.tv_sec); - - wmt_stats_timer.expires = jiffies + 1 * HZ; - add_timer(&wmt_stats_timer); - return 0; -} - -static int wmt_thz_bind(struct thermal_zone_device *thz_dev, - struct thermal_cooling_device *cool_dev) -{ - struct linux_thermal_ctrl_if *p_linux_if = 0; - int table_val = 0; - - wmt_tm_dprintk("[%s]\n", __func__); - - if (pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - return -EINVAL; - } - #ifdef NEVER - /* cooling devices */ - if (cool_dev != p_linux_if->cl_dev) { - return 0; - } - #endif - - if(!strcmp(cool_dev->type, g_bind0)) { - table_val = 0; - wmt_tm_dprintk("[%s] %s\n", __func__, cool_dev->type); - } else if(!strcmp(cool_dev->type, g_bind1)) { - table_val = 1; - wmt_tm_dprintk("[%s] %s\n", __func__, cool_dev->type); - } else if(!strcmp(cool_dev->type, g_bind2)) { - table_val = 2; - wmt_tm_dprintk("[%s]] %s\n", __func__, cool_dev->type); - } else if(!strcmp(cool_dev->type, g_bind3)) { - table_val = 3; - wmt_tm_dprintk("[%s]] %s\n", __func__, cool_dev->type); - } else - return 0; - - if (mtk_thermal_zone_bind_cooling_device(thz_dev, table_val, cool_dev)) { - wmt_tm_info("[%s] binding fail\n", __func__); - return -EINVAL; - } else { - wmt_tm_dprintk("[%s]] binding OK\n", __func__); - } - - return 0; - -} - -static int wmt_thz_unbind(struct thermal_zone_device *thz_dev, - struct thermal_cooling_device *cool_dev) -{ - struct linux_thermal_ctrl_if *p_linux_if = 0; - int table_val = 0; - - wmt_tm_dprintk("[wmt_thz_unbind] \n"); - - if (pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - return -EINVAL; - } -#if 0 - /* cooling devices */ - if (cool_dev == p_linux_if->cl_dev) { - table_val= 0; - } else { - wmt_tm_dprintk("[wmt_thz_unbind] unbind device fail..!\n"); - return -EINVAL; - } -#endif - - if(!strcmp(cool_dev->type, g_bind0)) { - table_val = 0; - wmt_tm_dprintk("[wmt_thz_unbind] %s\n", cool_dev->type); - } else if(!strcmp(cool_dev->type, g_bind1)) { - table_val = 1; - wmt_tm_dprintk("[wmt_thz_unbind] %s\n", cool_dev->type); - } else if(!strcmp(cool_dev->type, g_bind2)) { - table_val = 2; - wmt_tm_dprintk("[wmt_thz_unbind] %s\n", cool_dev->type); - } else if(!strcmp(cool_dev->type, g_bind3)) { - table_val = 3; - wmt_tm_dprintk("[wmt_thz_unbind] %s\n", cool_dev->type); - } else - return 0; - - if (thermal_zone_unbind_cooling_device(thz_dev, table_val, cool_dev)) { - wmt_tm_info("[wmt_thz_unbind] error unbinding cooling dev\n"); + int temp = mtk_wcn_cmb_stub_query_ctrl(); + if (temp > 100 || temp < -30) return -EINVAL; - } else { - wmt_tm_dprintk("[wmt_thz_unbind] unbinding OK\n"); - } - + *t = (temp < 0) ? 0 : (unsigned long)temp * 1000; return 0; } -static int wmt_thz_get_temp(struct thermal_zone_device *thz_dev, unsigned long *pv) +static int mtktswmt_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) { - /* struct wmt_thermal_ctrl_ops *p_des; */ - int temp = 0; - - *pv = 0; - - /* if(pg_wmt_tm) { */ - { - /* p_des = &pg_wmt_tm->wmt_if.ops; */ - /* temp = p_des->query_temp(); */ - temp = mtk_wcn_cmb_stub_query_ctrl(); - - if (temp >= 255) /* dummy values */ - temp = -127; - - /* temp = ((temp & 0x80) == 0x0)?temp:(-1)*temp ; */ - /* temp = ((temp & 0x80) == 0x0)?temp:(-1)*(temp & 0x7f); */ - *pv = temp*1000; - - wmt_tm_dprintk("[wmt_thz_get_temp] temp = %d\n", temp); - - if (temp != -127) { - if(temp > 100 || temp < -30) - wmt_tm_info("[wmt_thz_get_temp] temp = %d\n", temp); - } - } - - if ((int)*pv >= polling_trip_temp1) - thz_dev->polling_delay = g_wmt_tm.linux_if.interval; - else if ((int)*pv < polling_trip_temp2) - thz_dev->polling_delay = g_wmt_tm.linux_if.interval * polling_factor2; - else - thz_dev->polling_delay = g_wmt_tm.linux_if.interval * polling_factor1; - - return 0; -} - -static int wmt_thz_get_mode(struct thermal_zone_device *thz_dev, enum thermal_device_mode *mode) -{ - struct linux_thermal_ctrl_if *p_linux_if = 0; -/* int kernel_mode = 0; */ - - wmt_tm_dprintk("[%s]\n", __func__); - - if (pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - wmt_tm_dprintk("[%s] fail! \n", __func__); - return -EINVAL; - } - - wmt_tm_dprintk("[%s] %d\n", __func__, p_linux_if->kernel_mode); - - *mode = (p_linux_if->kernel_mode) ? THERMAL_DEVICE_ENABLED : THERMAL_DEVICE_DISABLED; + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + if (!pdata) + return -EINVAL; + *mode = pdata->mode; return 0; } -static int wmt_thz_set_mode(struct thermal_zone_device *thz_dev, enum thermal_device_mode mode) +static int mtktswmt_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) { - struct linux_thermal_ctrl_if *p_linux_if = 0; + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - wmt_tm_dprintk("[%s]\n", __func__); - - - if(pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - wmt_tm_dprintk("[%s] fail! \n", __func__); - return -EINVAL; - } - - wmt_tm_dprintk("[%s] %d\n", __func__, mode); - - p_linux_if->kernel_mode = mode; - - return 0; - -} - -static int wmt_thz_get_trip_type(struct thermal_zone_device *thz_dev, int trip, - enum thermal_trip_type *type) -{ - wmt_tm_dprintk("[mtktspa_get_trip_type] %d\n", trip); - *type = g_thermal_trip[trip]; - return 0; -} - -static int wmt_thz_get_trip_temp(struct thermal_zone_device *thz_dev, int trip, unsigned long *pv) -{ - wmt_tm_dprintk("[mtktspa_get_trip_temp] %d\n", trip); - *pv = g_trip_temp[trip]; - return 0; -} - -static int wmt_thz_get_crit_temp(struct thermal_zone_device *thz_dev, unsigned long *pv) -{ - wmt_tm_dprintk("[%s]\n", __func__); -#define WMT_TM_TEMP_CRIT 85000 /* 85.000 degree Celsius */ - *pv = WMT_TM_TEMP_CRIT; - - return 0; -} - -/* +mtktspa_cooling_sysrst_ops+ */ -static int wmt_cl_get_max_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) -{ - *pv = 1; - /* wmt_tm_dprintk("[%s] %d\n", __func__, *pv); */ + if (!pdata) + return -EINVAL; + pdata->mode = mode; + schedule_work(&tzone->therm_work); return 0; } -static int wmt_cl_get_cur_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) +static int mtktswmt_get_trip_type(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type *type) { - *pv = cl_dev_state; - /* wmt_tm_dprintk("[%s] %d\n", __func__, *pv); */ + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; + + *type = pdata->trips[trip].type; return 0; } -static int wmt_cl_set_cur_state(struct thermal_cooling_device *cool_dev, unsigned long v) +static int mtktswmt_get_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long *t) { - /* wmt_tm_dprintk("[%s] %d\n", __func__, v); */ - cl_dev_state = v; + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if (cl_dev_state == 1) { - /* the temperature is over than the critical, system reboot. */ - BUG(); - } + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; - return 0; + *t = pdata->trips[trip].temp; + return 0; } -/* -mtktspa_cooling_sysrst_ops- */ - -static int wmt_send_signal(int level) +static int mtktswmt_set_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long t) { - int ret = 0; - int thro = level; + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - if (tm_input_pid == 0) { - wmt_tm_dprintk("[%s] pid is empty\n", __func__); - ret = -1; - } + if (!pdata) + return -EINVAL; + if (trip >= pdata->num_trips) + return -EINVAL; - wmt_tm_printk("[%s] pid is %d, %d, %d\n", __func__, tm_pid, tm_input_pid, thro); - - if (ret == 0 && tm_input_pid != tm_pid) { - tm_pid = tm_input_pid; - pg_task = get_pid_task(find_vpid(tm_pid), PIDTYPE_PID); - } - - if (ret == 0 && pg_task) { - siginfo_t info; - info.si_signo = SIGIO; - info.si_errno = 0; - info.si_code = thro; - info.si_addr = NULL; - ret = send_sig_info(SIGIO, &info, pg_task); - } - - if (ret != 0) - wmt_tm_info("[%s] ret=%d\n", __func__, ret); - - return ret; + pdata->trips[trip].temp = t; + return 0; } -#define UNK_STAT -1 -#define LOW_STAT 0 -#define MID_STAT 1 -#define HIGH_STAT 2 -#define WFD_STAT 3 - -static inline unsigned long thro(unsigned long a, unsigned int b, unsigned int c) +static int mtktswmt_get_crit_temp(struct thermal_zone_device *thermal, unsigned long *t) { + int i; + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; - unsigned long tmp; + if (!pdata) + return -EINVAL; - tmp = (a << 10) * b / c; - - return tmp >> 10; -} - -static int wmt_judge_throttling(int index, int is_on, int interval) -{ - /* - * throttling_stat - * 2 ( pa1=1,pa2=1 ) - * UPPER ---- - * 1 ( pa1=1,pa2=0 ) - * LOWER ---- - * 0 ( pa1=0,pa2=0 ) - */ - static unsigned int throttling_pre_stat = 0; - static int mail_box[2] = {-1,-1}; - - static bool is_reset = false; - - unsigned long cur_thro = tx_throughput; - static unsigned long thro_constraint = 99 * 1000; - - int cur_wifi_stat = 0; - - wmt_tm_dprintk("[%s]+ [0]=%d, [1]=%d || [%d] is %s\n", __func__, mail_box[0], mail_box[1], - index, (is_on==1?"ON":"OFF")); - mail_box[index] = is_on; - - if (mail_box[0] >= 0 && mail_box[1] >= 0) { - cur_wifi_stat = mail_box[0] + mail_box[1]; - - /* - * If Wifi-display is on, go to WFD_STAT state, and reset the throttling. - */ - if (tm_wfd_stat == 2) - cur_wifi_stat = WFD_STAT; - - switch(cur_wifi_stat) { - case WFD_STAT: - if (throttling_pre_stat != WFD_STAT) { - /* - * Enter Wifi-Display status, reset all throttling. Dont affect the performance of Wifi-Display. - */ - wmt_send_signal(-1); - below_low_time = 0; - over_up_time = 0; - throttling_pre_stat = WFD_STAT; - wmt_tm_printk("WFD is on, reset everything!"); - } - break; - - case HIGH_STAT: - if (throttling_pre_stat < HIGH_STAT || throttling_pre_stat == WFD_STAT) { - if (cur_thro > 0) /*Wifi is working!!*/ - thro_constraint = thro(cur_thro, up_numerator, up_denominator); - else /*At this moment, current throughput is none. Use the previous constraint.*/ - thro_constraint = thro(thro_constraint, up_numerator, up_denominator); - - wmt_tm_printk("LOW/MID-->HIGH:%lu <- (%d / %d) %lu", thro_constraint, up_numerator, up_denominator, cur_thro); - - wmt_send_signal( thro_constraint / 1000); - throttling_pre_stat = HIGH_STAT; - over_up_time = 0; - } else if (throttling_pre_stat == HIGH_STAT) { - over_up_time++; - if ( (over_up_time * interval) >= up_duration) { - if (cur_thro < thro_constraint) /*real throughput may have huge variant*/ - thro_constraint = thro(cur_thro, up_numerator, up_denominator); - else /* current throughput is large than constraint. WHAT!!!*/ - thro_constraint = thro(thro_constraint, up_numerator, up_denominator); - - wmt_tm_printk("HIGH-->HIGH:%lu <- (%d / %d) %lu", thro_constraint, up_numerator, up_denominator, cur_thro); - - wmt_send_signal( thro_constraint / 1000); - over_up_time = 0; - } - } else { - wmt_tm_info("[%s] Error state1!! %u\n", __func__, - throttling_pre_stat); - } - wmt_tm_printk("case2 time=%d\n", over_up_time); - break; - - case MID_STAT: - if (throttling_pre_stat == LOW_STAT) { - below_low_time = 0; - throttling_pre_stat = MID_STAT; - wmt_tm_printk("[%s] Go up!!\n", __func__); - } else if (throttling_pre_stat == HIGH_STAT) { - over_up_time = 0; - throttling_pre_stat = MID_STAT; - wmt_tm_printk("[%s] Go down!!\n", __func__); - } else { - throttling_pre_stat = MID_STAT; - wmt_tm_dprintk("[%s] pre_stat=%d!!\n", __func__, throttling_pre_stat); - } - break; - - case LOW_STAT: - if (throttling_pre_stat == WFD_STAT) { - throttling_pre_stat = LOW_STAT; - wmt_tm_dprintk("[%s] pre_stat=%d!!\n", __func__, throttling_pre_stat); - } else if (throttling_pre_stat > LOW_STAT) { - if (cur_thro < 5000 && cur_thro > 0) { - thro_constraint = cur_thro * 3; - } else if (cur_thro >= 5000) { - thro_constraint = thro(cur_thro, low_numerator, low_denominator); - } else { - thro_constraint = thro(thro_constraint, low_numerator, low_denominator); - } - - wmt_tm_printk("MID/HIGH-->LOW:%lu <- (%d / %d) %lu", thro_constraint, low_numerator, low_denominator, cur_thro); - wmt_send_signal( thro_constraint / 1000); - throttling_pre_stat = LOW_STAT; - below_low_time = 0; - low_rst_time = 0; - is_reset = false; - } else if (throttling_pre_stat == LOW_STAT) { - below_low_time++; - if ( (below_low_time*interval) >= low_duration) { - if (low_rst_time >= low_rst_max && !is_reset) { - wmt_tm_printk("over rst time=%d", low_rst_time); - - wmt_send_signal(-1); //reset - low_rst_time = low_rst_max; - is_reset = true; - } else if(!is_reset) { - if (cur_thro < 5000 && cur_thro > 0) { - thro_constraint = cur_thro * 3; - } else if (cur_thro >= 5000) { - thro_constraint = thro(cur_thro, low_numerator, low_denominator); - low_rst_time++; - } else { - thro_constraint = thro(thro_constraint, low_numerator, low_denominator); - low_rst_time++; - } - - wmt_tm_printk("LOW-->LOW:%lu <-(%d / %d) %lu", thro_constraint, low_numerator, low_denominator, cur_thro); - - wmt_send_signal( thro_constraint / 1000); - below_low_time = 0; - } else { - wmt_tm_dprintk("Have reset, no control!!"); - } - } - } else { - wmt_tm_info("[%s] Error state3 %d!!\n", __func__, throttling_pre_stat); - } - wmt_tm_dprintk("case0 time=%d, rst=%d %d\n", below_low_time, low_rst_time, is_reset); - break; - - default: - wmt_tm_info("[%s] Error cur_wifi_stat=%d!!\n", __func__, cur_wifi_stat); - break; + for (i = 0; i < pdata->num_trips; i++) { + if (pdata->trips[i].type == THERMAL_TRIP_CRITICAL) { + *t = pdata->trips[i].temp; + return 0; } - - mail_box[0] = UNK_STAT; - mail_box[1] = UNK_STAT; - } else { - wmt_tm_dprintk("[%s] dont get all info!!\n", __func__); } - return 0; + return -EINVAL; } -/* +mtktspa_cooling_pa1_ops+ */ -static int wmt_cl_pa1_get_max_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) +#ifdef CONFIG_AUSTIN_PROJECT +static int mtktswmt_thermal_notify(struct thermal_zone_device *thermal, + int trip, enum thermal_trip_type type) { - *pv = 1; - /* wmt_tm_dprintk("[%s] %d\n", __func__, *pv); */ - return 0; -} - -static int wmt_cl_pa1_get_cur_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) -{ - *pv = cl_pa1_dev_state; - /* wmt_tm_dprintk("[%s] %d\n", __func__, *pv); */ - return 0; -} - -static int wmt_cl_pa1_set_cur_state(struct thermal_cooling_device *cool_dev, unsigned long v) -{ - struct linux_thermal_ctrl_if *p_linux_if = 0; - int ret = 0; - - /* wmt_tm_dprintk("[%s] %d\n", __func__, v); */ - - if (pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - ret = -1; - } - - cl_pa1_dev_state = (unsigned int)v; - - if (cl_pa1_dev_state == 1) { - ret = wmt_judge_throttling(0, 1, p_linux_if->interval/1000); - } else { - ret = wmt_judge_throttling(0, 0, p_linux_if->interval/1000); - } - if (ret != 0) - wmt_tm_info("[%s] ret=%d\n", __func__, ret); - return ret; -} - -/* -mtktspa_cooling_pa1_ops- */ - -/* +mtktspa_cooling_pa2_ops+ */ -static int wmt_cl_pa2_get_max_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) -{ - *pv = 1; - /* wmt_tm_dprintk("[%s] %d\n", __func__, *pv); */ - return 0; -} - -static int wmt_cl_pa2_get_cur_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) -{ - *pv = cl_pa2_dev_state; - /* wmt_tm_dprintk("[%s] %d\n", __func__, *pv); */ - return 0; -} - -static int wmt_cl_pa2_set_cur_state(struct thermal_cooling_device *cool_dev, unsigned long v) -{ - struct linux_thermal_ctrl_if *p_linux_if = 0; - int ret = 0; - - /* wmt_tm_dprintk("[%s] %d\n", __func__, v); */ - - if (pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - ret = -1; - } - - cl_pa2_dev_state = (unsigned int)v; - - if (cl_pa2_dev_state == 1) { - ret = wmt_judge_throttling(1, 1, p_linux_if->interval/1000); - } else { - ret = wmt_judge_throttling(1, 0, p_linux_if->interval/1000); - } - if (ret != 0) - wmt_tm_info("[%s] ret=%d\n", __func__, ret); - return ret; -} - -/* -mtktspa_cooling_pa2_ops- */ - -#ifdef NEVER -/* +mtktspa_cooling_pa3_ops+ */ -static int wmt_cl_pa3_get_max_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) -{ - *pv = 1; - wmt_tm_dprintk("[%s] %d\n", __func__, *pv); - return 0; -} - -static int wmt_cl_pa3_get_cur_state(struct thermal_cooling_device *cool_dev, unsigned long *pv) -{ - *pv = cl_pa3_dev_state; - wmt_tm_dprintk("[%s] %d\n", __func__, *pv); - return 0; -} - -static int wmt_cl_pa3_set_cur_state(struct thermal_cooling_device *cool_dev, unsigned long v) -{ - struct linux_thermal_ctrl_if *p_linux_if = 0; - int ret = 0; - - wmt_tm_dprintk("[%s] %d\n", __func__, v); - - if (pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - ret = -1; - } - - cl_pa3_dev_state = (unsigned int)v; - - if (cl_pa3_dev_state == 1) { - /* ret = wmt_arbitrate_thro(2,3); */ - } else { - /* ret = wmt_arbitrate_thro(2,0); */ - } - if (ret != 0) - wmt_tm_printk("[%s] ret=%d\n", __func__, ret); - return ret; -} - -/* -mtktspa_cooling_pa3_ops- */ -#endif /* NEVER */ - -int wmt_wifi_tx_thro_read(struct seq_file *m, void *v) -{ - seq_printf(m, "%lu\n", tx_throughput); - - wmt_tm_dprintk("[%s] tx=%lu\n", __func__, tx_throughput); + pr_err("%s: thermal_shutdown notify\n", __func__); + last_kmsg_thermal_shutdown(); + pr_err("%s: thermal_shutdown notify end\n", __func__); return 0; } - -static int wmt_wifi_tx_thro_open(struct inode *inode, struct file *file) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - return single_open(file, wmt_wifi_tx_thro_read, PDE_DATA(inode)); -#else - return single_open(file, wmt_wifi_tx_thro_read, PDE(inode)->data); #endif -} -/*New Wifi throttling Algo+*/ -ssize_t wmt_wifi_algo_write(struct file *filp, const char __user *buf, size_t len, loff_t *data) -{ - char desc[MAX_LEN] = {0}; - - unsigned int tmp_up_dur = 30; - unsigned int tmp_up_den = 2; - unsigned int tmp_up_num = 1; - - unsigned int tmp_low_dur = 3; - unsigned int tmp_low_den = 2; - unsigned int tmp_low_num = 3; - - unsigned int tmp_low_rst_max = 3; - - unsigned int tmp_log = 0; - - len = (len < (sizeof(desc) - 1)) ? len : (sizeof(desc) - 1); - - /* write data to the buffer */ - if (copy_from_user(desc, buf, len)) { - return -EFAULT; - } - - if (sscanf(desc, "%d %d/%d %d %d/%d %d", &tmp_up_dur, &tmp_up_num, &tmp_up_den, &tmp_low_dur, \ - &tmp_low_num, &tmp_low_den, &tmp_low_rst_max) == 7) { - - up_duration = tmp_up_dur; - up_denominator = tmp_up_den; - up_numerator = tmp_up_num; - - low_duration = tmp_low_dur; - low_denominator = tmp_low_den; - low_numerator = tmp_low_num; - - low_rst_max = tmp_low_rst_max; - - over_up_time = 0; - below_low_time = 0; - low_rst_time = 0; - - wmt_tm_printk("[%s] %s [up]%d %d/%d, [low]%d %d/%d, rst=%d\n", __func__, desc, up_duration, \ - up_numerator, up_denominator, low_duration, low_numerator, low_denominator, low_rst_max); - - return len; - } else if (sscanf(desc, "log=%d", &tmp_log) == 1) { - if (tmp_log == 1) - wmt_tm_debug_log = 1; - else - wmt_tm_debug_log = 0; - - return len; - } else { - wmt_tm_printk("[%s] bad argument = %s\n", __func__, desc); - } - return -EINVAL; -} - -int wmt_wifi_algo_read(struct seq_file *m, void *v) -{ - /* int ret; */ - /* char tmp[MAX_LEN] = {0}; */ - - seq_printf(m, "[up]\t%3d(sec)\t%2d/%2d\n[low]\t%3d(sec)\t%2d/%2d\nrst=%2d\n", up_duration, - up_numerator, up_denominator, low_duration, low_numerator, low_denominator, - low_rst_max); - /* ret = strlen(tmp); */ - - /* memcpy(buf, tmp, ret*sizeof(char)); */ - - wmt_tm_printk("[%s] [up]%d %d/%d, [low]%d %d/%d, rst=%d\n", __func__, up_duration, \ - up_numerator, up_denominator, low_duration, low_numerator, low_denominator, low_rst_max); - - return 0; -} - -static int wmt_wifi_algo_open(struct inode *inode, struct file *file) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - return single_open(file, wmt_wifi_algo_read, PDE_DATA(inode)); -#else - return single_open(file, wmt_wifi_algo_read, PDE(inode)->data); +static struct thermal_zone_device_ops mtktswmt_dev_ops = { + .get_temp = mtktswmt_get_temp, + .get_mode = mtktswmt_get_mode, + .set_mode = mtktswmt_set_mode, + .get_trip_type = mtktswmt_get_trip_type, + .get_trip_temp = mtktswmt_get_trip_temp, + .set_trip_temp = mtktswmt_set_trip_temp, + .get_crit_temp = mtktswmt_get_crit_temp, +#ifdef CONFIG_AUSTIN_PROJECT + .notify = mtktswmt_thermal_notify, #endif +}; + +static void mtktswmt_work(struct work_struct *work) +{ + struct mtktswmt_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata; + + mutex_lock(&therm_lock); + tzone = container_of(work, struct mtktswmt_thermal_zone, therm_work); + if (!tzone) + return; + pdata = tzone->pdata; + if (!pdata) + return; + if (pdata->mode == THERMAL_DEVICE_ENABLED) + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); } -/*New Wifi throttling Algo-*/ +static int mtktswmt_read_temp(struct thermal_dev *tdev) +{ + int temp = mtk_wcn_cmb_stub_query_ctrl(); + if (temp > 100 || temp < -30) + return -EINVAL; + temp = (temp < 0) ? 0 : (temp * 1000); + return temp; +} +static struct thermal_dev_ops mtktswmt_fops = { + .get_temp = mtktswmt_read_temp, +}; -ssize_t wmt_tm_wfd_write(struct file *filp, const char __user *buf, size_t len, loff_t *data) +#ifdef CONFIG_AUSTIN_PROJECT +struct thermal_dev_params mtktswmt_tdp = { + .offset = -4000, + .alpha = 1000, + .weight = 0 +}; +#else +struct thermal_dev_params mtktswmt_tdp = { + .offset = -5000, + .alpha = 1000, + .weight = 0 +}; +#endif + +static int mtktswmt_show_params(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + + if (!tzone) + return -EINVAL; + + return sprintf(buf, "offset=%d alpha=%d weight=%d\n", + tzone->therm_fw->tdp->offset, + tzone->therm_fw->tdp->alpha, + tzone->therm_fw->tdp->weight); +} + +static ssize_t mtktswmt_store_params(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) +{ + char param[20]; + int value = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct mtktswmt_thermal_zone *tzone = thermal->devdata; + + if (!tzone) + return -EINVAL; + + if (sscanf(buf, "%s %d", param, &value) == 2) { + if (!strcmp(param, "offset")) + tzone->therm_fw->tdp->offset = value; + if (!strcmp(param, "alpha")) + tzone->therm_fw->tdp->alpha = value; + if (!strcmp(param, "weight")) + tzone->therm_fw->tdp->weight = value; + return count; + } + return -EINVAL; +} +static DEVICE_ATTR(params, S_IRUGO | S_IWUSR, mtktswmt_show_params, mtktswmt_store_params); + +static int mtktswmt_probe(struct platform_device *pdev) { int ret = 0; - char tmp[MAX_LEN] = {0}; + struct mtktswmt_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata = dev_get_platdata(&pdev->dev); - len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); - /* write data to the buffer */ - if (copy_from_user(tmp, buf, len)) { - return -EFAULT; + if (!pdata) + return -EINVAL; + + tzone = devm_kzalloc(&pdev->dev, sizeof(*tzone), GFP_KERNEL); + if (!tzone) + return -ENOMEM; + + memset(tzone, 0, sizeof(*tzone)); + tzone->pdata = pdata; + tzone->tz = thermal_zone_device_register("mtktswmt", + pdata->num_trips, + 1, + tzone, + &mtktswmt_dev_ops, + NULL, + 0, + pdata->polling_delay); + if (IS_ERR(tzone->tz)) { + pr_err("%s Failed to register mtktswmt thermal zone device\n", __func__); + return -EINVAL; + } + tzone->therm_fw = kzalloc(sizeof(struct thermal_dev), GFP_KERNEL); + if (!tzone->therm_fw) + return -ENOMEM; + tzone->therm_fw->name = "mtktswmt"; + tzone->therm_fw->dev = &(pdev->dev); + tzone->therm_fw->dev_ops = &mtktswmt_fops; + tzone->therm_fw->tdp = &mtktswmt_tdp; + + ret = thermal_dev_register(tzone->therm_fw); + if (ret) { + pr_err("Error registering therml mtktswmt device\n"); + return -EINVAL; } - ret = sscanf(tmp, "%d", &tm_wfd_stat); - - wmt_tm_printk("[%s] %s = %d, len=%d, ret=%d\n", __func__, tmp, tm_wfd_stat, len, ret); - - return len; -} - -int wmt_tm_wfd_read(struct seq_file *m, void *v) -{ - /* int len; */ - /* int ret = 0; */ - /* char tmp[MAX_LEN] = {0}; */ - - seq_printf(m, "%d\n", tm_wfd_stat); - /* len = strlen(tmp); */ - - /* memcpy(buf, tmp, ret*sizeof(char)); */ - - wmt_tm_printk("[%s] %d\n", __func__, tm_wfd_stat); - - return 0; -} - -static int wmt_tm_wfd_open(struct inode *inode, struct file *file) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - return single_open(file, wmt_tm_wfd_read, PDE_DATA(inode)); -#else - return single_open(file, wmt_tm_wfd_read, PDE(inode)->data); -#endif -} - -ssize_t wmt_tm_pid_write(struct file *filp, const char __user *buf, size_t len, loff_t *data) -{ - int ret = 0; - char tmp[MAX_LEN] = {0}; - - len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); - /* write data to the buffer */ - if ( copy_from_user(tmp, buf, len) ) { - return -EFAULT; - } - - ret = kstrtouint(tmp, 10, &tm_input_pid); + INIT_WORK(&tzone->therm_work, mtktswmt_work); + ret = device_create_file(&tzone->tz->device, &dev_attr_params); if (ret) - WARN_ON(1); - - wmt_tm_printk("[%s] %s = %d\n", __func__, tmp, tm_input_pid); - - return len; -} - -int wmt_tm_pid_read(struct seq_file *m, void *v) -{ - /* int ret; */ - /* char tmp[MAX_LEN] = {0}; */ - - seq_printf(m, "%d\n", tm_input_pid); - /* ret = strlen(tmp); */ - - /* memcpy(buf, tmp, ret*sizeof(char)); */ - - wmt_tm_printk("[%s] %d\n", __func__, tm_input_pid); - + pr_err("%s Failed to create params attr\n", __func__); + pdata->mode = THERMAL_DEVICE_ENABLED; + platform_set_drvdata(pdev, tzone); return 0; } -static int wmt_tm_pid_open(struct inode *inode, struct file *file) +static int mtktswmt_remove(struct platform_device *pdev) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - return single_open(file, wmt_tm_pid_read, PDE_DATA(inode)); -#else - return single_open(file, wmt_tm_pid_read, PDE(inode)->data); -#endif -} - -#define check_str(x) (x[0]=='\0'?"none\t":x) - -static int wmt_tm_read(struct seq_file *m, void *v) -{ - /* int len = 0; */ - /* char *p = buf; */ - struct linux_thermal_ctrl_if *p_linux_if = 0; - - wmt_tm_printk("[%s]\n", __func__); - - /* sanity */ - if(pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - wmt_tm_info("[wmt_tm_read] fail! \n"); - return -EINVAL; - } - - seq_printf(m, "[wmt_tm_read]" - "\n \tcooler\t\ttrip_temp\ttrip_type" - "\n [0] %s\t%d\t\t%d" - "\n [1] %s\t%d\t\t%d" - "\n [2] %s\t%d\t\t%d" - "\n [3] %s\t%d\t\t%d" - "\n [4] %s\t%d\t\t%d" - "\n [5] %s\t%d\t\t%d" - "\n [6] %s\t%d\t\t%d" - "\n [7] %s\t%d\t\t%d" - "\n [8] %s\t%d\t\t%d" - "\n [9] %s\t%d\t\t%d" - "\ntime_ms=%d\n", - check_str(g_bind0), g_trip_temp[0], g_thermal_trip[0], check_str(g_bind1), - g_trip_temp[1], g_thermal_trip[1], check_str(g_bind2), g_trip_temp[2], - g_thermal_trip[2], check_str(g_bind3), g_trip_temp[3], g_thermal_trip[3], - check_str(g_bind4), g_trip_temp[4], g_thermal_trip[4], check_str(g_bind5), - g_trip_temp[5], g_thermal_trip[5], check_str(g_bind6), g_trip_temp[6], - g_thermal_trip[6], check_str(g_bind7), g_trip_temp[7], g_thermal_trip[7], - check_str(g_bind8), g_trip_temp[8], g_thermal_trip[8], check_str(g_bind9), - g_trip_temp[9], g_thermal_trip[9], p_linux_if->interval); - + struct mtktswmt_thermal_zone *tzone = platform_get_drvdata(pdev); + if (tzone) { + cancel_work_sync(&tzone->therm_work); + if (tzone->tz) + thermal_zone_device_unregister(tzone->tz); + kfree(tzone); + } return 0; } -static int wmt_tm_open(struct inode *inode, struct file *file) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - return single_open(file, wmt_tm_read, PDE_DATA(inode)); -#else - return single_open(file, wmt_tm_read, PDE(inode)->data); -#endif -} - -static ssize_t wmt_tm_write(struct file *filp, const char __user *buf, size_t count, loff_t *data) -{ - int i = 0; - int len=0,time_msec=0; - int trip_temp[COOLER_NUM] = {0}; - int thermal_trip[COOLER_NUM] = {0}; - - char desc[512]; - char bind0[20],bind1[20],bind2[20],bind3[20],bind4[20]; - char bind5[20],bind6[20],bind7[20],bind8[20],bind9[20]; - - struct linux_thermal_ctrl_if *p_linux_if = 0; - - wmt_tm_printk("[%s]\n", __func__); - - /* sanity */ - if(pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - wmt_tm_info("[wmt_thz_write] fail! \n"); - return -EINVAL; - } - - len = (count < (sizeof(desc) - 1)) ? count : (sizeof(desc) - 1); - - if (copy_from_user(desc, buf, len)) { - return 0; - } - - desc[len] = '\0'; - - if (sscanf - (desc, - "%d %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d %d %s %d", - &g_num_trip, &trip_temp[0], &thermal_trip[0], bind0, &trip_temp[1], &thermal_trip[1], - bind1, &trip_temp[2], &thermal_trip[2], bind2, &trip_temp[3], &thermal_trip[3], bind3, - &trip_temp[4], &thermal_trip[4], bind4, &trip_temp[5], &thermal_trip[5], bind5, - &trip_temp[6], &thermal_trip[6], bind6, &trip_temp[7], &thermal_trip[7], bind7, - &trip_temp[8], &thermal_trip[8], bind8, &trip_temp[9], &thermal_trip[9], bind9, - &time_msec) == 32) { - /* unregister */ - if (p_linux_if->thz_dev) { - mtk_thermal_zone_device_unregister(p_linux_if->thz_dev); - p_linux_if->thz_dev = NULL; - } - - for ( i = 0; i < g_num_trip; i++) { - g_thermal_trip[i] = thermal_trip[i]; - } - - g_bind0[0]=g_bind1[0]=g_bind2[0]=g_bind3[0]=g_bind4[0]='\0'; - g_bind5[0]=g_bind6[0]=g_bind7[0]=g_bind8[0]=g_bind9[0]='\0'; - - for ( i = 0; i < 20; i++ ) { - g_bind0[i]=bind0[i]; - g_bind1[i]=bind1[i]; - g_bind2[i]=bind2[i]; - g_bind3[i]=bind3[i]; - g_bind4[i]=bind4[i]; - g_bind5[i]=bind5[i]; - g_bind6[i]=bind6[i]; - g_bind7[i]=bind7[i]; - g_bind8[i]=bind8[i]; - g_bind9[i]=bind9[i]; - } - - for ( i = 0; i < g_num_trip; i++) { - g_trip_temp[i] = trip_temp[i]; - } - - p_linux_if->interval = time_msec; - - wmt_tm_dprintk("[wmt_tm_write] g_trip_temp [0]=%d, [1]=%d, [2]=%d, [3]=%d, [4]=%d\n", - g_thermal_trip[0], g_thermal_trip[1], g_thermal_trip[2], - g_thermal_trip[3], g_thermal_trip[4]); - - wmt_tm_dprintk("[wmt_tm_write] g_trip_temp [5]=%d, [6]=%d, [7]=%d, [8]=%d, [9]=%d\n", - g_thermal_trip[5], g_thermal_trip[6], g_thermal_trip[7], - g_thermal_trip[8], g_thermal_trip[9]); - - wmt_tm_dprintk("[wmt_tm_write] cooldev [0]=%s, [1]=%s, [2]=%s, [3]=%s, [4]=%s,\n", - g_bind0, g_bind1, g_bind2, g_bind3, g_bind4); - - wmt_tm_dprintk("[wmt_tm_write] cooldev [5]=%s, [6]=%s, [7]=%s, [8]=%s, [9]=%s,\n", - g_bind5, g_bind6, g_bind7, g_bind8, g_bind9); - - wmt_tm_dprintk("[wmt_tm_write] trip_temp [0]=%d, [1]=%d, [2]=%d, [3]=%d, [4]=%d\n", - trip_temp[0], trip_temp[1], trip_temp[2], trip_temp[3], trip_temp[4]); - - wmt_tm_dprintk("[wmt_tm_write] trip_temp [5]=%d, [6]=%d, [7]=%d, [8]=%d, [9]=%d\n", - trip_temp[5], trip_temp[6], trip_temp[7], trip_temp[8], trip_temp[9]); - - wmt_tm_dprintk("[wmt_tm_write] polling time=%d\n", p_linux_if->interval); - - /* p_linux_if->thz_dev->polling_delay = p_linux_if->interval*1000; */ - - /* thermal_zone_device_update(p_linux_if->thz_dev); */ - - /* register */ - p_linux_if->thz_dev = mtk_thermal_zone_device_register("mtktswmt", g_num_trip, NULL, - &wmt_thz_dev_ops, 0, 0, 0, p_linux_if->interval); - - wmt_tm_dprintk("[wmt_tm_write] time_ms=%d\n", p_linux_if->interval); - - return count; - } else { - wmt_tm_info("[%s] bad argument = %s\n", __func__, desc); - } - - return -EINVAL; -} - -static const struct file_operations _wmt_tm_fops = { - .owner = THIS_MODULE, - .open = wmt_tm_open, - .read = seq_read, - .llseek = seq_lseek, - .write = wmt_tm_write, - .release = single_release, +static struct platform_driver mtktswmt_driver = { + .probe = mtktswmt_probe, + .remove = mtktswmt_remove, + .driver = { + .name = "mtktswmt", + .owner = THIS_MODULE, + }, }; -static const struct file_operations _tm_pid_fops = { - .owner = THIS_MODULE, - .open = wmt_tm_pid_open, - .read = seq_read, - .llseek = seq_lseek, - .write = wmt_tm_pid_write, - .release = single_release, +static struct mtk_thermal_platform_data mtktswmt_thermal_data = { + .num_trips = 1, + .mode = THERMAL_DEVICE_DISABLED, + .polling_delay = 1000, + .trips[0] = {.temp = MTKTSWMT_TEMP_CRIT, .type = THERMAL_TRIP_CRITICAL, .hyst = 0}, }; -static const struct file_operations _wmt_val_fops = { - .owner = THIS_MODULE, - .open = wmt_wifi_algo_open, - .read = seq_read, - .llseek = seq_lseek, - .write = wmt_wifi_algo_write, - .release = single_release, +static struct platform_device mtktswmt_device = { + .name = "mtktswmt", + .id = -1, + .dev = { + .platform_data = &mtktswmt_thermal_data, + }, }; -static const struct file_operations _tx_thro_fops = { - .owner = THIS_MODULE, - .open = wmt_wifi_tx_thro_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static const struct file_operations _wfd_stat_fops = { - .owner = THIS_MODULE, - .open = wmt_tm_wfd_open, - .read = seq_read, - .llseek = seq_lseek, - .write = wmt_tm_wfd_write, - .release = single_release, -}; - -static int wmt_tm_proc_register(void) +static int __init mtktswmt_init(void) { - struct proc_dir_entry *entry = NULL; - struct proc_dir_entry *wmt_tm_proc_dir = NULL; - - wmt_tm_dprintk("[%s]\n", __func__); - - wmt_tm_proc_dir = mtk_thermal_get_proc_drv_therm_dir_entry(); - if (!wmt_tm_proc_dir) { - wmt_tm_printk("[%s]: mkdir /proc/driver/thermal failed\n", __func__); - } else { - entry = - proc_create("tzwmt", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, wmt_tm_proc_dir, - &_wmt_tm_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - - entry = - proc_create("clwmt_pid", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, wmt_tm_proc_dir, - &_tm_pid_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - - entry = - proc_create("clwmt_val", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, wmt_tm_proc_dir, - &_wmt_val_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - - entry = proc_create("wifi_tx_thro", S_IRUGO | S_IWUSR, wmt_tm_proc_dir, &_tx_thro_fops); - - entry = - proc_create("clwmt_wfdstat", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, wmt_tm_proc_dir, - &_wfd_stat_fops); - if (entry) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) - proc_set_user(entry, 0, 1000); -#else - entry->gid = 1000; -#endif - } - } - return 0; + int ret; + ret = platform_driver_register(&mtktswmt_driver); + if (ret) { + pr_err("Unable to register mtktswmt thermal driver (%d)\n", ret); + return ret; + } + ret = platform_device_register(&mtktswmt_device); + if (ret) { + pr_err("Unable to register mtktswmt device (%d)\n", ret); + return ret; + } + return 0; } -static int wmt_tm_proc_unregister(void) +static void __exit mtktswmt_exit(void) { - wmt_tm_dprintk("[%s]\n", __func__); - /* remove_proc_entry("wmt_tm", proc_entry); */ - return 0; + platform_driver_unregister(&mtktswmt_driver); + platform_device_unregister(&mtktswmt_device); } -static int wmt_tm_thz_cl_register(void) -{ - #define DEFAULT_POLL_TIME 0 /*Default disable, turn on by thermal policy*/ - - struct linux_thermal_ctrl_if *p_linux_if = 0; - - wmt_tm_dprintk("[%s]\n", __func__); - - if(pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - return -1; - } - - /* cooling devices */ - p_linux_if->cl_dev = mtk_thermal_cooling_device_register("mtktswmt-sysrst", NULL, - &mtktspa_cooling_sysrst_ops); - - p_linux_if->cl_pa1_dev = mtk_thermal_cooling_device_register("mtktswmt-pa1", NULL, - &mtktspa_cooling_pa1_ops); - - p_linux_if->cl_pa2_dev = mtk_thermal_cooling_device_register("mtktswmt-pa2", NULL, - &mtktspa_cooling_pa2_ops); - -#ifdef NEVER - p_linux_if->cl_pa3_dev = mtk_thermal_cooling_device_register("mtktswmt-pa3", NULL, - &mtktspa_cooling_pa3_ops); -#endif /* NEVER */ - - p_linux_if->interval = DEFAULT_POLL_TIME; - - /* trips */ - p_linux_if->thz_dev = mtk_thermal_zone_device_register("mtktswmt", g_num_trip, NULL, - &wmt_thz_dev_ops, 0, 0, 0, p_linux_if->interval); - - return 0; -} - -static int wmt_tm_thz_cl_unregister(void) -{ - struct linux_thermal_ctrl_if *p_linux_if = 0; - - wmt_tm_dprintk("[%s]\n", __func__); - - if(pg_wmt_tm) { - p_linux_if = &pg_wmt_tm->linux_if; - } else { - return -1; - } - - if (p_linux_if->cl_dev) { - mtk_thermal_cooling_device_unregister(p_linux_if->cl_dev); - p_linux_if->cl_dev = NULL; - } - - if (p_linux_if->cl_pa1_dev) { - mtk_thermal_cooling_device_unregister(p_linux_if->cl_pa1_dev); - p_linux_if->cl_pa1_dev = NULL; - } - - if (p_linux_if->cl_pa2_dev) { - mtk_thermal_cooling_device_unregister(p_linux_if->cl_pa2_dev); - p_linux_if->cl_pa2_dev = NULL; - } - -#ifdef NEVER - if (p_linux_if->cl_pa3_dev) { - mtk_thermal_cooling_device_unregister(p_linux_if->cl_pa3_dev); - p_linux_if->cl_pa3_dev = NULL; - } -#endif /* NEVER */ - - if (p_linux_if->thz_dev) { - mtk_thermal_zone_device_unregister(p_linux_if->thz_dev); - p_linux_if->thz_dev = NULL; - } - - return 0; -} - -#if 0 -static int wmt_tm_ops_register(struct wmt_thermal_ctrl_ops *ops) -{ - struct wmt_thermal_ctrl_ops *p_des; - - wmt_tm_printk("[%s]\n", __func__); - - if (pg_wmt_tm) { -#if 1 - p_des = &pg_wmt_tm->wmt_if.ops; - if (ops!=NULL) { - wmt_tm_printk("[wmt_tm_ops_register] reg start ...\n"); - p_des->query_temp = ops->query_temp; - p_des->set_temp = ops->set_temp; - wmt_tm_printk("[wmt_tm_ops_register] reg end ...\n"); - } else { - p_des->query_temp = 0; - p_des->set_temp = 0; - } -#endif - return 0; - } else { - return -1; - } -} - -static int wmt_tm_ops_unregister(void) -{ - struct wmt_thermal_ctrl_ops *p_des; - - wmt_tm_printk("[%s]\n", __func__); - - if (pg_wmt_tm) { - p_des = &pg_wmt_tm->wmt_if.ops; - p_des->query_temp = 0; - p_des->set_temp = 0; - - return 0; - } else { - return -1; - } -} -#endif - -static int __init wmt_tm_init(void) -{ - int err = 0; - - wmt_tm_printk("[wmt_tm_init] start -->\n"); - -#if 0 - err = wmt_tm_ops_register(ops); - if(err) - return err; -#endif - - err = wmt_tm_proc_register(); - if(err) - return err; - - /* init a timer for stats tx bytes */ - wmt_stats_info.pre_time = 0; - wmt_stats_info.pre_tx_bytes = 0; - - init_timer(&wmt_stats_timer); - wmt_stats_timer.function = (void *)&wmt_cal_stats; - wmt_stats_timer.data = (unsigned long) &wmt_stats_info; - wmt_stats_timer.expires = jiffies + 1 * HZ; - add_timer(&wmt_stats_timer); - -#if 1 - err = wmt_tm_thz_cl_register(); - if(err) - return err; -#endif - wmt_tm_printk("[wmt_tm_init] end <--\n"); - - return 0; -} - -#if 0 -int wmt_tm_init_rt(void) -{ - int err = 0; - - wmt_tm_printk("[wmt_tm_init_rt] start -->\n"); - - err = wmt_tm_thz_cl_register(); - if(err) - return err; - - wmt_tm_printk("[wmt_tm_init_rt] end <--\n"); - - return 0; -} - -int wmt_tm_deinit_rt(void) -{ - int err = 0; - - wmt_tm_printk("[wmt_tm_deinit_rt] start -->\n"); - - err = wmt_tm_thz_cl_unregister(); - if(err) - return err; - - wmt_tm_printk("[wmt_tm_deinit_rt] end <--\n"); - - return 0; -} -#endif - -static void __exit wmt_tm_deinit(void) -{ - int err = 0; - - wmt_tm_printk("[%s]\n", __func__); -#if 1 - err = wmt_tm_thz_cl_unregister(); - if(err) - return; -#endif - err = wmt_tm_proc_unregister(); - if(err) - return; - -#if 0 - err = wmt_tm_ops_unregister(); - if(err) - return; -#endif - - del_timer(&wmt_stats_timer); - - return; -} -module_init(wmt_tm_init); -module_exit(wmt_tm_deinit); - +late_initcall(mtktswmt_init); +module_exit(mtktswmt_exit); diff --git a/drivers/misc/mediatek/thermal/mtk_cooler_cam.c b/drivers/misc/mediatek/thermal/mtk_cooler_cam.c index 4af8fee2ae8..783e2c33249 100644 --- a/drivers/misc/mediatek/thermal/mtk_cooler_cam.c +++ b/drivers/misc/mediatek/thermal/mtk_cooler_cam.c @@ -38,7 +38,8 @@ static ssize_t _cl_cam_write(struct file *filp, const char __user *buf, size_t l int ret = 0; char tmp[MAX_LEN] = { 0 }; - len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); + len = min(len,MAX_LEN-1); + /* write data to the buffer */ if (copy_from_user(tmp, buf, len)) { return -EFAULT; diff --git a/drivers/misc/mediatek/thermal/mtk_cooler_shutdown.c b/drivers/misc/mediatek/thermal/mtk_cooler_shutdown.c index 17fee69c8e5..9ba1cd81c97 100644 --- a/drivers/misc/mediatek/thermal/mtk_cooler_shutdown.c +++ b/drivers/misc/mediatek/thermal/mtk_cooler_shutdown.c @@ -64,7 +64,8 @@ static ssize_t _mtk_cl_sd_rst_write(struct file *filp, const char __user *buf, s int ret = 0; char tmp[MAX_LEN] = { 0 }; - len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); + len = min(len,MAX_LEN-1); + /* write data to the buffer */ if (copy_from_user(tmp, buf, len)) { return -EFAULT; @@ -119,7 +120,8 @@ static ssize_t _mtk_cl_sd_pid_write(struct file *filp, const char __user *buf, s int ret = 0; char tmp[MAX_LEN] = { 0 }; - len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); + len = min(len,MAX_LEN-1); + /* write data to the buffer */ if (copy_from_user(tmp, buf, len)) { return -EFAULT; @@ -165,7 +167,8 @@ static ssize_t _mtk_cl_sd_debouncet_write(struct file *filp, const char __user * char desc[MAX_LEN] = {0}; int tmp_dbt = -1; - len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); + len = min(len,MAX_LEN-1); + /* write data to the buffer */ if (copy_from_user(desc, buf, len)) { return -EFAULT; diff --git a/drivers/misc/mediatek/thermal/mtk_cooler_vrt.c b/drivers/misc/mediatek/thermal/mtk_cooler_vrt.c index ea6e459d61f..7c10fb68270 100644 --- a/drivers/misc/mediatek/thermal/mtk_cooler_vrt.c +++ b/drivers/misc/mediatek/thermal/mtk_cooler_vrt.c @@ -35,7 +35,8 @@ static ssize_t _cl_vrt_write(struct file *filp, const char __user *buf, size_t l int ret = 0; char tmp[MAX_LEN] = { 0 }; - len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); + len = min(len,MAX_LEN-1); + /* write data to the buffer */ if (copy_from_user(tmp, buf, len)) { return -EFAULT; diff --git a/drivers/misc/mediatek/trustzone/kree_mem.c b/drivers/misc/mediatek/trustzone/kree_mem.c index 56e4235086f..a66d8f3f2d8 100644 --- a/drivers/misc/mediatek/trustzone/kree_mem.c +++ b/drivers/misc/mediatek/trustzone/kree_mem.c @@ -89,16 +89,21 @@ static inline TZ_RESULT _handleOpFunc_1 (uint32_t cmd, KREE_SESSION_HANDLE sessi TZ_RESULT kree_register_sharedmem (KREE_SESSION_HANDLE session, KREE_SHAREDMEM_HANDLE *mem_handle, - uint32_t start, uint32_t size, uint32_t map_p) + uint32_t start, uint32_t size, void *map_p) { MTEEC_PARAM p[4]; TZ_RESULT ret; p[0].value.a = start; p[1].value.a = size; - p[2].value.a = map_p; + p[2].mem.buffer = (void *)map_p; + if(map_p != NULL) + p[2].mem.size = ((*(uint32_t *)map_p)+1)*sizeof(uint32_t); + else + p[2].mem.size = 0; + ret = KREE_TeeServiceCall(session, TZCMD_MEM_SHAREDMEM_REG, - TZ_ParamTypes4(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT, TZPT_VALUE_INPUT, TZPT_VALUE_OUTPUT), p); + TZ_ParamTypes4(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT, TZPT_MEM_INPUT, TZPT_VALUE_OUTPUT), p); if (ret != TZ_RESULT_SUCCESS) { *mem_handle = 0; diff --git a/drivers/misc/mediatek/trustzone/sys_ipc.h b/drivers/misc/mediatek/trustzone/sys_ipc.h index 5cf9825340f..99b155d779c 100644 --- a/drivers/misc/mediatek/trustzone/sys_ipc.h +++ b/drivers/misc/mediatek/trustzone/sys_ipc.h @@ -34,6 +34,7 @@ TZ_RESULT KREE_ServSemaphoreDowntrylock (u32 op, u8 param[REE_SERVICE_BUFFER_SIZ TZ_RESULT KREE_ServSemaphoreUp (u32 op, u8 param[REE_SERVICE_BUFFER_SIZE]); +TZ_RESULT KREE_ServSemaphoreDownInterruptible (u32 op, u8 param[REE_SERVICE_BUFFER_SIZE]); #if 0 /* wait queue */ diff --git a/drivers/misc/mediatek/trustzone/tz_irq.c b/drivers/misc/mediatek/trustzone/tz_irq.c index b8510038506..dd3d4824db9 100644 --- a/drivers/misc/mediatek/trustzone/tz_irq.c +++ b/drivers/misc/mediatek/trustzone/tz_irq.c @@ -58,7 +58,7 @@ TZ_RESULT KREE_ServRequestIrq(u32 op, u8 uparam[REE_SERVICE_BUFFER_SIZE]) if (!token) return TZ_RESULT_ERROR_OUT_OF_MEMORY; *token = param->irq; - param->token = (unsigned int)token; + param->token = token; } rret = request_irq(param->irq, KREE_IrqHandler, flags, "TEE IRQ", (void*)param->token); if (rret) @@ -244,3 +244,18 @@ void kree_irq_mask_restore(unsigned int *pmask, unsigned int size) printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret)); } } + +int kree_set_fiq_affinity(int irq, int cpuid) +{ + MTEEC_PARAM param[4]; + TZ_RESULT ret; + + param[0].value.a = irq; + param[1].value.a = cpuid; + ret = KREE_TeeServiceCall(irq_session, TZCMD_IRQ_SET_FIQ_AFFINITY, + TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT), param); + if (ret != TZ_RESULT_SUCCESS) + pr_info("%s error: %s\n", __func__, TZ_GetErrorString(ret)); + + return ret; +} diff --git a/drivers/misc/mediatek/trustzone/tz_mod.c b/drivers/misc/mediatek/trustzone/tz_mod.c index ad343da25eb..963a2e7b8c6 100644 --- a/drivers/misc/mediatek/trustzone/tz_mod.c +++ b/drivers/misc/mediatek/trustzone/tz_mod.c @@ -874,7 +874,7 @@ static long tz_client_reg_sharedmem (struct file *file, unsigned long arg) /* register it ... */ - ret = kree_register_sharedmem (session, &mem_handle, (uint32_t) pin->start, pin->size, (uint32_t) map_p); + ret = kree_register_sharedmem (session, &mem_handle, (uint32_t) pin->start, pin->size, map_p); if (ret != TZ_RESULT_SUCCESS) { printk ("tz_client_reg_sharedmem fail: register shm 0x%x\n", ret); diff --git a/drivers/misc/mediatek/trustzone/tz_pm.c b/drivers/misc/mediatek/trustzone/tz_pm.c index e022da0ba0d..dd1d54086ec 100644 --- a/drivers/misc/mediatek/trustzone/tz_pm.c +++ b/drivers/misc/mediatek/trustzone/tz_pm.c @@ -22,10 +22,11 @@ void kree_pm_cpu_lowpower(volatile int *ppen_release, int logical_cpuid) MTEEC_PARAM param[4]; TZ_RESULT ret; - param[0].value.a = (unsigned int)ppen_release; + param[0].mem.buffer = (void *)ppen_release; + param[0].mem.size = sizeof(unsigned int); param[1].value.a = logical_cpuid; ret = KREE_TeeServiceCall(pm_session, TZCMD_PM_CPU_LOWPOWER, - TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT), + TZ_ParamTypes2(TZPT_MEM_INPUT, TZPT_VALUE_INPUT), param); if (ret != TZ_RESULT_SUCCESS) { diff --git a/drivers/misc/mediatek/trustzone/tz_secure_clock.c b/drivers/misc/mediatek/trustzone/tz_secure_clock.c index d641c44268a..1931191690e 100644 --- a/drivers/misc/mediatek/trustzone/tz_secure_clock.c +++ b/drivers/misc/mediatek/trustzone/tz_secure_clock.c @@ -151,7 +151,7 @@ struct rtc_time tm; int err = -ENODEV; ret = err; -pr_err("enter TEE_Icnt_time \n"); +//pr_err("enter TEE_Icnt_time \n"); shm_p = kmalloc(sizeof(struct TM_GB), GFP_KERNEL); @@ -185,7 +185,7 @@ if (err) { rtc_tm_to_time(&tm, &time_count); #if 1 -pr_info("securetime increase result: %d %d %d %d %d %d %d\n", tm.tm_yday, tm.tm_year, tm.tm_mon +pr_notice("securetime increase result: %d %d %d %d %d %d %d\n", tm.tm_yday, tm.tm_year, tm.tm_mon , tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); #endif param[0].value.a = time_count; @@ -195,7 +195,7 @@ if (ret != TZ_RESULT_SUCCESS) pr_err("ServiceCall error %d\n", ret); #if 1 -pr_info("securetime increase result: %d %d %d %d %d %d %d\n", ((struct TM_GB *) shm_p)->tm_yday +pr_notice("securetime increase result: %d %d %d %d %d %d %d\n", ((struct TM_GB *) shm_p)->tm_yday , ((struct TM_GB *) shm_p)->tm_year, ((struct TM_GB *) shm_p)->tm_mon, ((struct TM_GB *) shm_p)->tm_mday , ((struct TM_GB *) shm_p)->tm_hour, ((struct TM_GB *) shm_p)->tm_min, ((struct TM_GB *) shm_p)->tm_sec); #endif @@ -338,7 +338,7 @@ for (;;) { } } - pr_err("update_securetime_thread_gb updata inc count\n"); + //pr_err("update_securetime_thread_gb updata inc count\n"); } diff --git a/drivers/misc/mediatek/trustzone/tz_sys_ipc.c b/drivers/misc/mediatek/trustzone/tz_sys_ipc.c index d9720f89516..36706d2ad9a 100644 --- a/drivers/misc/mediatek/trustzone/tz_sys_ipc.c +++ b/drivers/misc/mediatek/trustzone/tz_sys_ipc.c @@ -157,6 +157,21 @@ TZ_RESULT KREE_ServSemaphoreDown (u32 op, u8 param[REE_SERVICE_BUFFER_SIZE]) return TZ_RESULT_SUCCESS; } +TZ_RESULT KREE_ServSemaphoreDownInterruptible(u32 op, u8 param[REE_SERVICE_BUFFER_SIZE]) +{ + struct semaphore *sema; + unsigned long *in; + int *out; + + in = (unsigned long *)¶m[0]; + sema = (struct semaphore *)*in; + out = (int *)¶m[0]; + + *out = down_interruptible(sema); + + return TZ_RESULT_SUCCESS; +} + TZ_RESULT KREE_ServSemaphoreDownTimeout (u32 op, u8 param[REE_SERVICE_BUFFER_SIZE]) { struct semaphore *sema; diff --git a/drivers/misc/mediatek/trustzone/tz_system.c b/drivers/misc/mediatek/trustzone/tz_system.c index 05e7826f0bf..06debf4fb5b 100644 --- a/drivers/misc/mediatek/trustzone/tz_system.c +++ b/drivers/misc/mediatek/trustzone/tz_system.c @@ -47,6 +47,8 @@ static const KREE_REE_Service_Func ree_service_funcs[] = KREE_ServEnableClock, KREE_ServDisableClock, KREE_ServThread_Create, + + KREE_ServSemaphoreDownInterruptible, }; #define ree_service_funcs_num (sizeof(ree_service_funcs)/sizeof(ree_service_funcs[0])) diff --git a/drivers/misc/mediatek/usb20/mt8127/usb20.c b/drivers/misc/mediatek/usb20/mt8127/usb20.c index d7f6d032cf8..25e2d70f30c 100644 --- a/drivers/misc/mediatek/usb20/mt8127/usb20.c +++ b/drivers/misc/mediatek/usb20/mt8127/usb20.c @@ -286,16 +286,30 @@ void mt_usb_disconnect(void) bool usb_cable_connected(void) { +#if CONFIG_AUSTIN_PROJECT + int i = 0; +#endif #ifdef FPGA_PLATFORM return true; #else #ifdef CONFIG_USB_MTK_OTG //ALPS00775710 - int iddig_state = 1; + int iddig_state = 1; - iddig_state = mt_get_gpio_in(GPIO_OTG_IDDIG_EINT_PIN); - DBG(0,"iddig_state = %d\n", iddig_state); + iddig_state = mt_get_gpio_in(GPIO_OTG_IDDIG_EINT_PIN); + DBG(0, "iddig_state = %d\n", iddig_state); +#if CONFIG_AUSTIN_PROJECT + for (i=0; i<3; i++) { + if (likely(iddig_state)) { + break; + } else { + msleep(50); /* anti-shake */ + iddig_state = mt_get_gpio_in(GPIO_OTG_IDDIG_EINT_PIN); + DBG(0, "iddig_state = %d after sleep 50ms\n", iddig_state); + } + } +#endif if(!iddig_state) return false; @@ -472,9 +486,6 @@ static ssize_t mt_usb_store_cmode(struct device* dev, struct device_attribute *a if (wake_lock_active(&mtk_musb->usb_lock)) wake_unlock(&mtk_musb->usb_lock); musb_platform_set_vbus(mtk_musb, 0); - - msleep(100); - musb_stop(mtk_musb); MUSB_DEV_MODE(mtk_musb); /* Think about IPO shutdown with A-cable, then switch to B-cable and IPO bootup. We need a point to clear session bit */ diff --git a/drivers/misc/mediatek/usb20/mt8127/usb20_host.c b/drivers/misc/mediatek/usb20/mt8127/usb20_host.c index fe5acf2c853..42419d95951 100644 --- a/drivers/misc/mediatek/usb20/mt8127/usb20_host.c +++ b/drivers/misc/mediatek/usb20/mt8127/usb20_host.c @@ -125,7 +125,7 @@ int mt_usb_get_vbus_status(struct musb *musb) void mt_usb_init_drvvbus(void) { #ifndef MTK_ALPS_BOX_SUPPORT //because 8127 box have no charger IC -#if !(defined(OTG_BOOST_BY_SWITCH_CHARGER) || defined(FPGA_PLATFORM)) +#if !(defined(SWITCH_CHARGER) || defined(FPGA_PLATFORM)) mt_set_gpio_mode(GPIO_OTG_DRVVBUS_PIN,GPIO_OTG_DRVVBUS_PIN_M_GPIO);//should set GPIO2 as gpio mode. mt_set_gpio_dir(GPIO_OTG_DRVVBUS_PIN,GPIO_DIR_OUT); mt_get_gpio_pull_enable(GPIO_OTG_DRVVBUS_PIN); @@ -142,23 +142,38 @@ extern int ep_config_from_table_for_host(struct musb *musb); static bool musb_is_host(void) { u8 devctl = 0; - int iddig_state = 1; - bool usb_is_host = 0; + int iddig_state = 1; + bool usb_is_host = 0; +#if CONFIG_AUSTIN_PROJECT + int i = 0; +#endif - DBG(0,"will mask PMIC charger detection\n"); + DBG(0,"will mask PMIC charger detection\n"); #ifndef FPGA_PLATFORM #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT #ifdef CONFIG_MTK_LOAD_SWITCH_FPF3040 - pmic_chrdet_int_en(0); + pmic_chrdet_int_en(0); #endif #endif #endif - musb_platform_enable(mtk_musb); + musb_platform_enable(mtk_musb); #ifdef ID_PIN_USE_EX_EINT - iddig_state = mt_get_gpio_in(GPIO38); + /* iddig_state = mt_get_gpio_in(GPIO38); */ + iddig_state = mt_get_gpio_in(GPIO_OTG_IDDIG_EINT_PIN); DBG(0,"iddig_state = %d\n", iddig_state); +#if CONFIG_AUSTIN_PROJECT + for (i=0; i<3; i++) { + if (likely(iddig_state)) { + break; + } else { + mdelay(delay_time1); /* anti-shake */ + iddig_state = mt_get_gpio_in(GPIO_OTG_IDDIG_EINT_PIN); + DBG(0,"iddig_state = %d after sleep 50ms\n", iddig_state); + } + } +#endif #else iddig_state = 0 ; devctl = musb_readb(mtk_musb->mregs,MUSB_DEVCTL); @@ -261,7 +276,9 @@ static void musb_id_pin_work(struct work_struct *data) DBG(0, "do nothing due to in_ipo_off\n"); goto out; } - + #if CONFIG_AUSTIN_PROJECT + wake_lock(&mtk_musb->usb_lock); + #endif mtk_musb ->is_host = musb_is_host(); DBG(0,"musb is as %s\n",mtk_musb->is_host?"host":"device"); switch_set_state((struct switch_dev *)&otg_state, mtk_musb->is_host); @@ -272,7 +289,12 @@ static void musb_id_pin_work(struct work_struct *data) #endif //setup fifo for host mode ep_config_from_table_for_host(mtk_musb); - wake_lock(&mtk_musb->usb_lock); + #if CONFIG_AUSTIN_PROJECT + if (!wake_lock_active(&mtk_musb->usb_lock)) + wake_lock(&mtk_musb->usb_lock); + #else + wake_lock(&mtk_musb->usb_lock); + #endif musb_platform_set_vbus(mtk_musb, 1); /* for no VBUS sensing IP*/ @@ -336,8 +358,8 @@ out: static void mt_usb_ext_iddig_int(void) { if (!mtk_musb->is_ready) { - /* dealy 5 sec if usb function is not ready */ - schedule_delayed_work(&mtk_musb->id_pin_work,5000*HZ/1000); + /* dealy 7 sec if usb function is not ready */ + schedule_delayed_work(&mtk_musb->id_pin_work,7000*HZ/1000); } else { schedule_delayed_work(&mtk_musb->id_pin_work,sw_deboun_time*HZ/1000); } @@ -369,13 +391,13 @@ void mt_usb_iddig_int(struct musb *musb) void static otg_int_init(void) { #ifdef ID_PIN_USE_EX_EINT - mt_set_gpio_mode(GPIO38, GPIO_MODE_02); - mt_set_gpio_dir(GPIO38, GPIO_DIR_IN); - mt_set_gpio_pull_enable(GPIO38, GPIO_PULL_ENABLE); - mt_set_gpio_pull_select(GPIO38, GPIO_PULL_UP); - mt_eint_set_sens(49, MT_LEVEL_SENSITIVE); - mt_eint_set_hw_debounce(49,64); - mt_eint_registration(49, EINTF_TRIGGER_LOW, mt_usb_ext_iddig_int, FALSE); + mt_set_gpio_mode(GPIO_OTG_IDDIG_EINT_PIN, GPIO_MODE_00); + mt_set_gpio_dir(GPIO_OTG_IDDIG_EINT_PIN, GPIO_DIR_IN); + mt_set_gpio_pull_enable(GPIO_OTG_IDDIG_EINT_PIN, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(GPIO_OTG_IDDIG_EINT_PIN, GPIO_PULL_UP); + mt_eint_set_sens(49, MT_LEVEL_SENSITIVE); + mt_eint_set_hw_debounce(49,64); + mt_eint_registration(49, EINTF_TRIGGER_LOW, mt_usb_ext_iddig_int, FALSE); #if 0 mt_set_gpio_mode(GPIO_OTG_IDDIG_EINT_PIN, GPIO_OTG_IDDIG_EINT_PIN_M_IDDIG); mt_set_gpio_dir(GPIO_OTG_IDDIG_EINT_PIN, GPIO_DIR_IN); diff --git a/drivers/misc/mediatek/usb20/musb_core.c b/drivers/misc/mediatek/usb20/musb_core.c index b8425ae2077..13b65ffecd9 100644 --- a/drivers/misc/mediatek/usb20/musb_core.c +++ b/drivers/misc/mediatek/usb20/musb_core.c @@ -111,6 +111,10 @@ #include #endif +int musb_host_dynamic_fifo = 1; +int musb_host_dynamic_fifo_usage_msk; +module_param(musb_host_dynamic_fifo, int, 0644); +module_param(musb_host_dynamic_fifo_usage_msk, int, 0644); @@ -158,6 +162,12 @@ MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:" MUSB_DRIVER_NAME); +void musb_bug(void) +{ + /* make KE happen */ + char *ptr = NULL; + *ptr = 10; +} void dumpTime(writeFunc_enum func, int epnum) { #if 0 @@ -855,6 +865,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, musb->ep0_stage = MUSB_EP0_START; + if (musb_host_dynamic_fifo) + musb_host_dynamic_fifo_usage_msk = 0; /* flush endpoints when transitioning from Device Mode */ if (is_peripheral_active(musb)) { /* REVISIT HNP; just force disconnect */ @@ -1436,6 +1448,8 @@ int ep_config_from_table_for_host(struct musb *musb) unsigned i, n; int offset; struct musb_hw_ep *hw_ep = musb->endpoints; + if (musb_host_dynamic_fifo) + musb_host_dynamic_fifo_usage_msk = 0; if (musb->fifo_cfg_host) { cfg = musb->fifo_cfg_host; n = musb->fifo_cfg_host_size; diff --git a/drivers/misc/mediatek/usb20/musb_host.c b/drivers/misc/mediatek/usb20/musb_host.c index 3ec6d6256f0..7c97b9a0fc2 100644 --- a/drivers/misc/mediatek/usb20/musb_host.c +++ b/drivers/misc/mediatek/usb20/musb_host.c @@ -98,6 +98,160 @@ * of transfers between endpoints, or anything clever. */ +static u8 dynamic_fifo_total_slot = 15; +int musb_host_alloc_ep_fifo(struct musb *musb, struct musb_qh *qh, u8 is_in) +{ + void __iomem *mbase = musb->mregs; + int epnum = qh->hw_ep->epnum; + u16 maxpacket; + u16 request_fifo_sz = 0, fifo_unit_nr = 0; + u16 idx_start = 0; + u8 index, i; + u16 c_off = 0; + u8 c_size = 0; + u16 free_uint = 0; + u8 found = 0; + + if (qh->hb_mult) + maxpacket = qh->maxpacket * qh->hb_mult; + else + maxpacket = qh->maxpacket; + + if (maxpacket <= 512) { + request_fifo_sz = 512; + fifo_unit_nr = 1; + c_size = 6; + } else if (maxpacket <= 1024) { + request_fifo_sz = 1024; + fifo_unit_nr = 2; + c_size = 7; + } else if (maxpacket <= 2048) { + request_fifo_sz = 2048; + fifo_unit_nr = 4; + c_size = 8; + } else if (maxpacket <= 4096) { + request_fifo_sz = 4096; + fifo_unit_nr = 8; + c_size = 9; + } else { + DBG(0, "should not be here qh maxp:%d maxp:%d\n", + qh->maxpacket, maxpacket); + request_fifo_sz = 0; + fifo_unit_nr = 0; + musb_bug(); + return -ENOSPC; + } + + for (i = 0; i < dynamic_fifo_total_slot; i++) { + if (!(musb_host_dynamic_fifo_usage_msk & (1 << i))) + free_uint++; + else + free_uint = 0; + + if (free_uint == fifo_unit_nr) { + found = 1; + break; + } + } + + if (found == 0) { + DBG(0, "!enough, dynamic_fifo_usage_msk:0x%x,maxp:%d\n", + musb_host_dynamic_fifo_usage_msk, maxpacket); + DBG(0, "req_len:%d,ep%d-%s\n", + request_fifo_sz, epnum, is_in ? "in":"out"); + return -1; + } + + idx_start = i - (fifo_unit_nr - 1); + c_off = (64 >> 3) + idx_start * (512 >> 3); + + for (i = 0; i < fifo_unit_nr; i++) + musb_host_dynamic_fifo_usage_msk |= (1 << (idx_start + i)); + + index = musb_readb(mbase, MUSB_INDEX); + musb_writeb(musb->mregs, MUSB_INDEX, epnum); + if (is_in) { + musb_write_rxfifosz(mbase, c_size); + musb_write_rxfifoadd(mbase, c_off); + + DBG(1, "addr:0x%x, size:0x%x\n", + musb_read_rxfifoadd(mbase), musb_read_rxfifosz(mbase)); + } else { + musb_write_txfifosz(mbase, c_size); + musb_write_txfifoadd(mbase, c_off); + DBG(1, "addr:0x%x, size:0x%x\n", + musb_read_txfifoadd(mbase), musb_read_txfifosz(mbase)); + } + musb_writeb(mbase, MUSB_INDEX, index); + + DBG(1, "maxp:%d, req_len:%d, dynamic_fifo_usage_msk:0x%x\n", + maxpacket, request_fifo_sz, musb_host_dynamic_fifo_usage_msk); + DBG(1, "ep%d-%s, qh->type:%d\n", + epnum, is_in ? "in":"out", qh->type); + return 0; +} + +void musb_host_free_ep_fifo(struct musb *musb, struct musb_qh *qh, u8 is_in) +{ + void __iomem *mbase = musb->mregs; + int epnum = qh->hw_ep->epnum; + u16 maxpacket = qh->maxpacket; + u16 request_fifo_sz, fifo_unit_nr; + u16 idx_start = 0; + u8 index, i; + u16 c_off = 0; + + if (qh->hb_mult) + maxpacket = qh->maxpacket * qh->hb_mult; + else + maxpacket = qh->maxpacket; + + if (maxpacket <= 512) { + request_fifo_sz = 512; + fifo_unit_nr = 1; + } else if (maxpacket <= 1024) { + request_fifo_sz = 1024; + fifo_unit_nr = 2; + } else if (maxpacket <= 2048) { + request_fifo_sz = 2048; + fifo_unit_nr = 4; + } else if (maxpacket <= 4096) { + request_fifo_sz = 4096; + fifo_unit_nr = 8; + } else { + DBG(0, "should not be here qh maxp:%d maxp:%d\n", + qh->maxpacket, maxpacket); + request_fifo_sz = 0; + fifo_unit_nr = 0; + musb_bug(); + } + + index = musb_readb(mbase, MUSB_INDEX); + musb_writeb(mbase, MUSB_INDEX, epnum); + + if (is_in) + c_off = musb_read_rxfifoadd(mbase); + else + c_off = musb_read_txfifoadd(mbase); + + idx_start = (c_off - (64 >> 3)) / (512 >> 3); + + for (i = 0; i < fifo_unit_nr; i++) + musb_host_dynamic_fifo_usage_msk &= ~(1 << (idx_start + i)); + + if (is_in) { + musb_write_rxfifosz(mbase, 0); + musb_write_rxfifoadd(mbase, 0); + } else { + musb_write_txfifosz(mbase, 0); + musb_write_txfifoadd(mbase, 0); + } + musb_writeb(mbase, MUSB_INDEX, index); + + DBG(1, "maxp:%d, req_len:%d, dynamic_fifo_usage_msk:0x%x\n", + maxpacket, request_fifo_sz, musb_host_dynamic_fifo_usage_msk); + DBG(1, "ep%d-%s, qh->type:%d\n", epnum, is_in ? "in":"out", qh->type); +} static void musb_ep_program(struct musb *musb, u8 epnum, struct urb *urb, int is_out, @@ -167,7 +321,7 @@ static inline void musb_h_tx_start(struct musb_hw_ep *ep) txcsr |= MUSB_TXCSR_TXPKTRDY | MUSB_TXCSR_H_WZC_BITS; musb_writew(ep->regs, MUSB_TXCSR, txcsr); } else { - txcsr = MUSB_CSR0_H_SETUPPKT | MUSB_CSR0_TXPKTRDY; + txcsr = MUSB_CSR0_H_DIS_PING | MUSB_CSR0_H_SETUPPKT | MUSB_CSR0_TXPKTRDY; musb_writew(ep->regs, MUSB_CSR0, txcsr); } @@ -449,6 +603,10 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb, musb_ep_set_qh(ep, is_in, NULL); qh->hep->hcpriv = NULL; + if (musb_host_dynamic_fifo && + qh->type != USB_ENDPOINT_XFER_CONTROL) + musb_host_free_ep_fifo(musb, qh, is_in); + switch (qh->type) { case USB_ENDPOINT_XFER_CONTROL: @@ -669,13 +827,10 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) /* Set RXMAXP with the FIFO size of the endpoint * to disable double buffer mode. */ - //ALPS00798316, Enable DMA RxMode1 - if (musb->double_buffer_not_ok) - musb_writew(ep->regs, MUSB_RXMAXP, ep->max_packet_sz_rx); - else - musb_writew(ep->regs, MUSB_RXMAXP, - qh->maxpacket); //qh->maxpacket | ((qh->hb_mult - 1) << 11)); - //ALPS00798316, Enable DMA RxMode1 + /* ALPS00798316, Enable DMA RxMode1*/ + /*not request now, for enable dynamic EP FIFO*/ + /* qh->maxpacket | ((qh->hb_mult - 1) << 11)); */ + musb_writew(ep->regs, MUSB_RXMAXP, qh->maxpacket); ep->rx_reinit = 0; } @@ -2154,7 +2309,7 @@ static int musb_schedule( #endif } - if(!hw_ep){ + if(!hw_ep || epnum >= musb->nr_endpoints){ DBG(0,"musb::error!not find a ep for the urb\r\n"); return -1; } @@ -2196,6 +2351,19 @@ success: } qh->hw_ep = hw_ep; qh->hep->hcpriv = qh; + + if (musb_host_dynamic_fifo && qh->type != USB_ENDPOINT_XFER_CONTROL) { + int ret; + + /* take this after qh->hw_ep is set */ + ret = musb_host_alloc_ep_fifo(musb, qh, is_in); + if (ret) { + qh->hw_ep = NULL; + qh->hep->hcpriv = NULL; + DBG(0, "NOT ENOUGH FIFO\n"); + return -ENOSPC; + } + } if (idle) musb_start_urb(musb, is_in, qh); return 0; @@ -2521,6 +2689,10 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) if (ready && list_empty(&qh->hep->urb_list)) { qh->hep->hcpriv = NULL; list_del(&qh->ring); + + if (musb_host_dynamic_fifo && + qh->type != USB_ENDPOINT_XFER_CONTROL) + musb_host_free_ep_fifo(musb, qh, is_in); kfree(qh); } } else @@ -2578,6 +2750,10 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) hep->hcpriv = NULL; list_del(&qh->ring); + if (musb_host_dynamic_fifo && + qh->type != USB_ENDPOINT_XFER_CONTROL) + musb_host_free_ep_fifo(musb, qh, is_in); + kfree(qh); } exit: diff --git a/drivers/misc/mediatek/video/mt8127/Makefile b/drivers/misc/mediatek/video/mt8127/Makefile index f4a5339d90b..06df942fa74 100755 --- a/drivers/misc/mediatek/video/mt8127/Makefile +++ b/drivers/misc/mediatek/video/mt8127/Makefile @@ -10,8 +10,8 @@ obj-$(CONFIG_MTK_FB) += disp_drv.o \ mtkfb.o \ mtkfb_vsync.o \ mtkfb_pattern.o \ - debug.o \ - mtkfb_proc.o + debug.o + obj-$(CONFIG_MTK_FB) += $(subst ",,$(CONFIG_MTK_PLATFORM))/ ccflags-y += -I$(srctree)/drivers/misc/mediatek/video \ diff --git a/drivers/misc/mediatek/video/mt8127/debug.c b/drivers/misc/mediatek/video/mt8127/debug.c index 0efa990c638..7def09bde3b 100644 --- a/drivers/misc/mediatek/video/mt8127/debug.c +++ b/drivers/misc/mediatek/video/mt8127/debug.c @@ -42,6 +42,8 @@ extern void mtkfb_switch_normal_to_factory(void); extern void mtkfb_switch_factory_to_normal(void); extern void set_ovlengine_debug_level(int level); extern int fb_pattern_en(int enable); +extern void mtkfb_early_suspend_test(); +extern void mtkfb_late_resume_test(); extern unsigned int gCaptureLayerEnable; extern unsigned int gCaptureLayerDownX; @@ -500,6 +502,17 @@ void DBG_OnHDMIDone(void) extern void mtkfb_clear_lcm(void); extern void hdmi_force_init(void); +extern unsigned char dump_init; +extern unsigned int va[4]; +extern unsigned int src_va; +extern unsigned int buf_size[4]; +extern unsigned int gdump_layer_en; +extern unsigned int layer_pitch[4]; +extern unsigned int layer_height[4]; +extern unsigned int layer_enable[4]; +extern unsigned char layer_fmt[4][100]; +unsigned char file_name[100]; + static void process_dbg_opt(const char *opt) { @@ -509,6 +522,40 @@ static void process_dbg_opt(const char *opt) { // hdmi_force_init(); } + else if (0 == strncmp(opt, "dump:", 5)) + { + DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR","[debug] Dumping\n"); + if (0 == strncmp(opt + 5, "on", 2)) + { + DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR","Dump layer on.\n"); + gdump_layer_en = 1; + } + else if (0 == strncmp(opt + 5, "pull", 4)) + { + unsigned char i; + struct file *filp; + mm_segment_t fs; + DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR","Pulling dump layer data.\n"); + fs =get_fs(); + set_fs(KERNEL_DS); + for(i = 0; i < 4; i++) + { + if(layer_enable[i] == 1){ + sprintf(file_name, "/sdcard/Music/layer%d_%dx%d%s", i, layer_pitch[i], layer_height[i], layer_fmt[i]); + DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR","Pulling : VA[%d]=0x%x buf_size[i] file name =%s\n",i,buf_size[i],va[i],file_name); + filp=filp_open(file_name,O_RDWR|O_CREAT,0x644); + filp->f_op->write(filp,va[i],buf_size[i],&filp->f_pos); + filp_close(filp,NULL); + vfree((void*)va[i]); + } + } + set_fs(fs); + } + else { + DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR","[debug] wrong dump option\n"); + goto Error; + } + } else if (0 == strncmp(opt, "fps:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { @@ -534,15 +581,19 @@ static void process_dbg_opt(const char *opt) { mtkfb_clear_lcm(); } - else if (0 == strncmp(opt, "suspend", 4)) + else if (0 == strncmp(opt, "suspend", 7)) { - DISP_PanelEnable(FALSE); - DISP_PowerEnable(FALSE); + //DISP_PanelEnable(FALSE); + //DISP_PowerEnable(FALSE); + DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "[mtkfb_dbg] opt=suspend\n"); + mtkfb_early_suspend_test(); } - else if (0 == strncmp(opt, "resume", 4)) + else if (0 == strncmp(opt, "resume", 6)) { - DISP_PowerEnable(TRUE); - DISP_PanelEnable(TRUE); + //DISP_PowerEnable(TRUE); + //DISP_PanelEnable(TRUE); + DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "[mtkfb_dbg] opt=resume\n"); + mtkfb_late_resume_test(); } else if (0 == strncmp(opt, "lcm:", 4)) { diff --git a/drivers/misc/mediatek/video/mt8127/disp_drv.c b/drivers/misc/mediatek/video/mt8127/disp_drv.c index 833dc9f822d..cc178d47492 100644 --- a/drivers/misc/mediatek/video/mt8127/disp_drv.c +++ b/drivers/misc/mediatek/video/mt8127/disp_drv.c @@ -931,6 +931,16 @@ static int _DISP_CaptureOvlKThread(void *data) return 0; } +unsigned char dump_init = 0; +unsigned int va[4] = {0}; +unsigned int src_va = 0; +unsigned int buf_size[4]={0}; +unsigned int gdump_layer_en = 0; +unsigned int layer_pitch[4] = {0}; +unsigned int layer_height[4] = {0}; +unsigned int layer_enable[4] = {0}; +unsigned char layer_fmt[4][100]; + void _DISP_DumpLayer(OVL_CONFIG_STRUCT* pLayer) { if (gCaptureLayerEnable && pLayer->layer_en) @@ -971,6 +981,78 @@ void _DISP_DumpLayer(OVL_CONFIG_STRUCT* pLayer) disphal_dma_unmap_kernel(pLayer->addr, Bitmap.data_size, (unsigned int)Bitmap.pData); } } + if(gdump_layer_en == 1) + { + printk("_DISP_DumpLayer pLayer->layer_en = %d,pLayer->layer= %d\n",pLayer->layer_en,pLayer->layer); + printk("pLayer->dst_h= %d ### pLayer->pitch= %d ### pLayer->dst_w= %d\n", + pLayer->dst_h,pLayer->src_pitch,pLayer->dst_w); + + dump_init++; + if(pLayer->layer_en) + { + + switch (pLayer->fmt) + { + case eRGB565: + sprintf(layer_fmt[pLayer->layer], "_RGB565"); + buf_size[pLayer->layer]=((pLayer->src_pitch/2) *pLayer->dst_h*4); + layer_pitch[pLayer->layer] = pLayer->src_pitch/2; + break; + case eRGB888: + buf_size[pLayer->layer]=((pLayer->src_pitch/3) *pLayer->dst_h*4); + layer_pitch[pLayer->layer] = pLayer->src_pitch/3; + sprintf(layer_fmt[pLayer->layer], "_RGB888"); + break; + case eARGB8888: + buf_size[pLayer->layer]=((pLayer->src_pitch/4) *pLayer->dst_h*4); + layer_pitch[pLayer->layer] = pLayer->src_pitch/4; + sprintf(layer_fmt[pLayer->layer], "_ARGB8888"); + break; + case ePARGB8888: + buf_size[pLayer->layer]=((pLayer->src_pitch/4) *pLayer->dst_h*4); + layer_pitch[pLayer->layer] = pLayer->src_pitch/4; + sprintf(layer_fmt[pLayer->layer], "_PARGB8888"); + break; + case eBGR888: + buf_size[pLayer->layer]=((pLayer->src_pitch/3) *pLayer->dst_h*4); + layer_pitch[pLayer->layer] = pLayer->src_pitch/3; + sprintf(layer_fmt[pLayer->layer], "_BGR888"); + break; + case eABGR8888: + buf_size[pLayer->layer]=((pLayer->src_pitch/4) *pLayer->dst_h*4); + layer_pitch[pLayer->layer] = pLayer->src_pitch/4; + sprintf(layer_fmt[pLayer->layer], "_ABGR8888"); + break; + case ePABGR8888: + buf_size[pLayer->layer]=((pLayer->src_pitch/4) *pLayer->dst_h*4); + layer_pitch[pLayer->layer] = pLayer->src_pitch/4; + sprintf(layer_fmt[pLayer->layer], "_PABGR8888"); + break; + default: pr_info("error: _DISP_DumpLayer(), unknow format=%d \n", pLayer->fmt); return; + } + + va[pLayer->layer] = vmalloc(buf_size[pLayer->layer]); + layer_height[pLayer->layer] = pLayer->dst_h; + layer_enable[pLayer->layer] = 1; + //copy layer buffer to dst + disphal_dma_map_kernel(pLayer->addr, buf_size[pLayer->layer], (unsigned int*)&src_va, &buf_size[pLayer->layer]); + memset(va[pLayer->layer],0,buf_size[pLayer->layer]); + memcpy(va[pLayer->layer],src_va,buf_size[pLayer->layer]); + printk("[DEBUG]save layer_id= %d,va[pLayer->layer]=0x%x, dump_init = %d, 0x%x 0x%x buffer_size[i]=%d, pixel_pitch=%d\n", + pLayer->layer,va[pLayer->layer],dump_init,pLayer->addr,src_va, buf_size[pLayer->layer],layer_pitch[pLayer->layer]); + disphal_dma_unmap_kernel(pLayer->addr, buf_size[pLayer->layer], src_va); + } + else + { + layer_enable[pLayer->layer] = 0; + } + //save 4 layers + if(dump_init == 3) + { + dump_init=0; + gdump_layer_en = 0; + } + } } static void _DISP_VSyncCallback(void* pParam); @@ -1003,10 +1085,7 @@ static int _DISP_ESD_Check(int* dirty) { break; } -/* [PLATFORM]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/05/04, modify for ESD fast shoot*/ - //esd_check_count++; - esd_check_count=1; -/* [PLATFORM]-Mod-END by TCTSZ.yaohui.zeng, 2015/05/04*/ + esd_check_count++; } if (esd_check_count >= LCM_ESD_CHECK_MAX_COUNT) { diff --git a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_api.c b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_api.c index 4a3530a42f7..d67346e2cc6 100644 --- a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_api.c +++ b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_api.c @@ -399,6 +399,7 @@ int Disp_Ovl_Engine_Set_layer_info(DISP_OVL_ENGINE_INSTANCE_HANDLE handle, struc atomic_set(&disp_ovl_engine.Instance[handle].OverlaySettingDirtyFlag, 1); atomic_set(&disp_ovl_engine.Instance[handle].OverlaySettingApplied, 0); disp_ovl_engine.Instance[handle].fgCompleted = 0; + disp_ovl_engine.Instance[handle].status = OVERLAY_STATUS_IDLE; up(&disp_ovl_engine_semaphore); DISP_OVL_ENGINE_INFO("Instance%d, layer%d en%d, next_idx=0x%x, vaddr=0x%x, paddr=0x%x, fmt=%u," @@ -554,7 +555,10 @@ int Disp_Ovl_Engine_Trigger_Overlay(DISP_OVL_ENGINE_INSTANCE_HANDLE handle) if(disp_ovl_engine.Instance[handle].status == OVERLAY_STATUS_IDLE) { - disp_ovl_engine.Instance[handle].status = OVERLAY_STATUS_TRIGGER; +#if 1 //def monica_porting + disp_ovl_engine.Instance[handle].fgCompleted = 0; +#endif + disp_ovl_engine.Instance[handle].status = OVERLAY_STATUS_TRIGGER; disp_ovl_engine.Instance[handle].fgCompleted = false; disp_ovl_engine_wake_up_ovl_engine_thread(); @@ -754,6 +758,10 @@ static void Disp_Ovl_Engine_Trigger_Overlay_Handler(struct work_struct *work_) if (sync_fence_wait(work->fences[layer], 1000) < 0) DISP_OVL_ENGINE_ERR("Disp_Ovl_Engine_Trigger_Overlay_Handler %d layer %d fence wait fail\n", instance->index,layer); +#if 1 //def monica_porting + /* Unref the fence */ + sync_fence_put(work->fences[layer]); +#endif } } diff --git a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.c b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.c index e075347428e..e4cbb14820d 100644 --- a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.c +++ b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.c @@ -505,7 +505,25 @@ int Disp_Ovl_Engine_Ack_Request(struct disp_ovl_engine_request_struct *overlayRe } #endif +#if 1 //def monica_porting +void Disp_Ovl_Engine_clock_on(void) +{ + /* porting from abc123 */ + /*if (!disp_ovl_engine.bCouple) { + //disp_module_clock_on(DISP_MODULE_GAMMA, "DDP"); + disp_module_clock_on(DISP_MODULE_WDMA, "DDP"); + }*/ +} +void Disp_Ovl_Engine_clock_off(void) +{ + /* porting from abc123 */ + /*if (!disp_ovl_engine.bCouple) { + //disp_module_clock_off(DISP_MODULE_GAMMA, "DDP"); + disp_module_clock_off(DISP_MODULE_WDMA, "DDP"); + }*/ +} +#endif unsigned long disp_ovl_engine_get_current_time_us(void) { struct timeval t; @@ -514,41 +532,44 @@ unsigned long disp_ovl_engine_get_current_time_us(void) } void disp_ovl_engine_wake_up_rdma0_update_thread(void) -{ +{ gWakeupRdma0UpdateThread = 1; wake_up(&disp_rdma0_update_wq); } - +extern struct semaphore sem_early_suspend; ///JIRA-1372 static int disp_ovl_engine_rdma0_update_kthread(void *data) { int wait_ret = 0; struct sched_param param = { .sched_priority = RTPM_PRIO_SCRN_UPDATE }; - + sched_setscheduler(current, SCHED_RR, ¶m); - + while(1) { - //DISP_OVL_ENGINE_DBG("wait_event_interruptible\n"); + //DISP_OVL_ENGINE_DBG("wait_event_interruptible\n"); wait_ret = wait_event_interruptible(disp_rdma0_update_wq, gWakeupRdma0UpdateThread); gWakeupRdma0UpdateThread = 0; - //DISP_OVL_ENGINE_DBG("disp_ovl_engine_rdma0_update_kthread wake_up\n"); + //DISP_OVL_ENGINE_DBG("disp_ovl_engine_rdma0_update_kthread wake_up\n"); + if (is_early_suspended) + continue; - if(down_interruptible(&disp_rdma0_update_semaphore)) + if(down_interruptible(&sem_early_suspend)) + //if(down_interruptible(&disp_rdma0_update_semaphore)) { - DISP_OVL_ENGINE_ERR("disp_ovl_engine_rdma0_update_kthread down_interruptible(disp_rdma0_update_semaphore) fail\n"); - continue; - } + DISP_OVL_ENGINE_ERR("disp_ovl_engine_rdma0_update_kthread down_interruptible(disp_rdma0_update_semaphore) fail\n"); + continue; + } disp_ovl_engine_update_rdma0(); - up(&disp_rdma0_update_semaphore); - + up(&sem_early_suspend); + //up(&disp_rdma0_update_semaphore); + if (kthread_should_stop()) break; } - return OVL_OK; } diff --git a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.h b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.h index 4f90e9eed7d..966df204773 100644 --- a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.h +++ b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_core.h @@ -75,6 +75,7 @@ typedef struct bool bCouple; // overlay mode bool bModeSwitch; // switch between couple mode & de-couple mode unsigned int Ovlmva; + unsigned int PreservedSecOvlBuf[OVL_ENGINE_OVL_BUFFER_NUMBER]; unsigned int OvlWrIdx; unsigned int RdmaRdIdx; bool OvlBufSecurity[OVL_ENGINE_OVL_BUFFER_NUMBER]; @@ -100,4 +101,9 @@ int Disp_Ovl_Engine_Get_Request(struct disp_ovl_engine_request_struct *overlayRe int Disp_Ovl_Engine_Ack_Request(struct disp_ovl_engine_request_struct *overlayRequest); #endif +#if 1 //def monica_porting +void Disp_Ovl_Engine_clock_on(void); +void Disp_Ovl_Engine_clock_off(void); +#endif + #endif diff --git a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.c b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.c index 2e449231a57..9e043fe52e0 100644 --- a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.c +++ b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.c @@ -98,7 +98,8 @@ static int disp_ovl_engine_release(struct inode *inode, struct file *file) static long disp_ovl_engine_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int i; - DISP_OVL_ENGINE_INSTANCE_HANDLE handle = 0; + + DISP_OVL_ENGINE_INSTANCE_HANDLE handle = 1; // Find match mapping for(i=0; i= DISP_OVL_ENGINE_INODE_NUM) { + DISP_OVL_ENGINE_ERR("[disp_ovl_engine_unlocked_ioctl] invalid file handle 0x%x\n", (unsigned int)file); + } + MMProfileLogEx(MTKFB_MMP_Events.OVLEngine_IOCTL, MMProfileFlagPulse, cmd, 0); switch(cmd) { diff --git a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.h b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.h index e3bf707e209..f998481225c 100644 --- a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.h +++ b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_dev.h @@ -24,7 +24,6 @@ struct disp_ovl_engine_config_mem_out_struct unsigned int dirty; unsigned int outFormat; unsigned int dstAddr; - unsigned int dstPitch; struct DISP_OVL_ENGINE_REGION srcROI; // ROI unsigned int security; int ion_fd; diff --git a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_hw.c b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_hw.c index f7dbf780f08..bd953991197 100644 --- a/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_hw.c +++ b/drivers/misc/mediatek/video/mt8127/disp_ovl_engine_hw.c @@ -66,6 +66,10 @@ void disp_ovl_engine_hw_ovl_wdma_irq_handler(unsigned int param) { DISP_OVL_ENGINE_DBG("disp_ovl_engine_hw_ovl_wdma_irq_handler\n"); MMProfileLogEx(MTKFB_MMP_Events.hw_ovl_wdma_irq_handler, MMProfileFlagPulse, param, 0); + /* porting from abc123 */ + disp_module_clock_off(DISP_MODULE_WDMA, "DDP"); + disp_module_clock_off(DISP_MODULE_OVL, "DDP"); + disp_module_clock_off(DISP_MODULE_SMI, "DDP"); if(g_ovl_wdma_irq_ignore) { @@ -73,8 +77,9 @@ void disp_ovl_engine_hw_ovl_wdma_irq_handler(unsigned int param) return; } - if(disp_ovl_engine_hw_irq_callback != NULL) - disp_ovl_engine_hw_irq_callback(param); + //only check wdma frame done irq bit + if(disp_ovl_engine_hw_irq_callback != NULL) + disp_ovl_engine_hw_irq_callback(param&0x01); } void disp_ovl_engine_hw_ovl_rdma_irq_handler(unsigned int param) @@ -128,6 +133,11 @@ void disp_ovl_engine_trigger_hw_overlay_decouple(void) DISP_OVL_ENGINE_DBG("disp_ovl_engine_trigger_hw_overlay_decouple\n"); MMProfileLogEx(MTKFB_MMP_Events.trigger_hw_overlay_decouple, MMProfileFlagStart, 0, 0); + /* porting from abc123*/ + disp_module_clock_on(DISP_MODULE_SMI, "DDP"); + disp_module_clock_on(DISP_MODULE_OVL, "DDP"); + disp_module_clock_on(DISP_MODULE_WDMA, "DDP"); + //OVLReset(); //WDMAReset(1); @@ -303,7 +313,11 @@ void disp_ovl_engine_direct_link_overlay(void) { //disp_path_release_mutex(); } - + /*porting from abc123*/ + /*if (disp_ovl_engine.OvlBufAddr[disp_ovl_engine.RdmaRdIdx] != 0) { + disp_module_clock_off(DISP_MODULE_GAMMA, "OVL"); + disp_module_clock_off(DISP_MODULE_WDMA, "OVL"); + }*/ /*************************************************/ // Ultra config @@ -346,8 +360,9 @@ static void disp_ovl_engine_565_to_888(void *src_va, void *dst_va) *d++ = ((src_rgb565 & 0x7E0) >> 3); *d++ = ((src_rgb565 & 0xF800) >> 8); } - //s += (ALIGN_TO(xres, disphal_get_fb_alignment()) - xres); + s += (ALIGN_TO(xres, disphal_get_fb_alignment()) - xres); } + __cpuc_flush_dcache_area(dst_va, ((xres * yres * 3) + 63) & ~63); /* porting from abc123 */ } int disp_ovl_engine_indirect_link_overlay(void *fb_va, void *fb_pa) @@ -360,6 +375,7 @@ int disp_ovl_engine_indirect_link_overlay(void *fb_va, void *fb_pa) */ int lcm_width, lcm_height; int buffer_bpp; + unsigned int width, height, bpp; int layer_id; int tmpBufferSize; int i, temp_va = 0; @@ -446,8 +462,20 @@ int disp_ovl_engine_indirect_link_overlay(void *fb_va, void *fb_pa) disp_ovl_engine.OvlBufSecurity[i] = FALSE; } - } - + //allocate secured + width = DISP_GetScreenWidth(); + height = DISP_GetScreenHeight(); + bpp = 3;//(DISP_GetScreenBpp() + 7) >> 3; + disp_ovl_engine.PreservedSecOvlBuf[0] = + (unsigned int)disp_ovl_engine_hw_allocate_secure_memory(width * height * bpp); + disp_ovl_engine.PreservedSecOvlBuf[1] = + (unsigned int)disp_ovl_engine_hw_allocate_secure_memory(width * height * bpp); + disp_ovl_engine.PreservedSecOvlBuf[2] = + (unsigned int)disp_ovl_engine_hw_allocate_secure_memory(width * height * bpp); + disp_ovl_engine.PreservedSecOvlBuf[3] = + (unsigned int)disp_ovl_engine_hw_allocate_secure_memory(width * height * bpp); + } + // config m4u port DISP_OVL_ENGINE_DBG("config m4u start\n\n"); portStruct.ePortID = DISP_OVL_0; @@ -503,15 +531,23 @@ int disp_ovl_engine_indirect_link_overlay(void *fb_va, void *fb_pa) config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; disp_register_irq(DISP_MODULE_RDMA0, _rdma0_irq_handler); DISP_WaitVSYNC(); + //disp_update_mutex(); /* porting from abc123 */ disp_path_get_mutex(); RDMASetTargetLine(0, lcm_height*4/5); - disp_path_config(&config); + disp_path_config_internal_mutex(&config); + disp_path_config_internal_setting(&config); /* porting from abc123 */ disp_path_release_mutex(); disp_path_wait_reg_update(0); //disp_dump_reg(DISP_MODULE_MUTEX); MMProfileLogEx(MTKFB_MMP_Events.indirect_link_overlay, MMProfileFlagEnd, 0, 0); + /* porting from abc123; wait RDMA0 & WDMA1 ready */ + DISP_WaitVSYNC(); + /* prevent OVL stay in error state & unceasingly throw error IRQ */ + //OVLStop(); + /*disp_module_clock_off(DISP_MODULE_OVL, "DDP");*/ + printk("indirect link overlay leave\n"); return 0; @@ -544,6 +580,10 @@ int disp_ovl_engine_trigger_hw_overlay_couple(void) // overlay output to internal buffer if (atomic_read(&disp_ovl_engine_params.OverlaySettingDirtyFlag)) { + disp_module_clock_on(DISP_MODULE_SMI, "DDP"); + disp_module_clock_on(DISP_MODULE_OVL, "DDP"); + disp_module_clock_on(DISP_MODULE_WDMA, "DDP"); + // update OvlWrIdx except screen capture case if (disp_ovl_engine_params.MemOutConfig.dirty == 0) { @@ -600,14 +640,15 @@ int disp_ovl_engine_trigger_hw_overlay_couple(void) if(OvlSecureNew) { // Allocate secure buffer - disp_ovl_engine.OvlBufAddr[disp_ovl_engine.OvlWrIdx] = - (unsigned int)disp_ovl_engine_hw_allocate_secure_memory(width * height * bpp); + disp_ovl_engine.OvlBufAddr[disp_ovl_engine.OvlWrIdx] = + disp_ovl_engine.PreservedSecOvlBuf[disp_ovl_engine.OvlWrIdx]; + // (unsigned int)disp_ovl_engine_hw_allocate_secure_memory(width * height * bpp); disp_ovl_engine.OvlBufSecurity[disp_ovl_engine.OvlWrIdx] = TRUE; - } + } else { // Free secure buffer - disp_ovl_engine_hw_free_secure_memory((void *)(disp_ovl_engine.OvlBufAddr[disp_ovl_engine.OvlWrIdx])); + //disp_ovl_engine_hw_free_secure_memory((void *)(disp_ovl_engine.OvlBufAddr[disp_ovl_engine.OvlWrIdx])); disp_ovl_engine.OvlBufAddr[disp_ovl_engine.OvlWrIdx] = disp_ovl_engine.Ovlmva + (width * height * bpp) * disp_ovl_engine.OvlWrIdx; disp_ovl_engine.OvlBufSecurity[disp_ovl_engine.OvlWrIdx] = FALSE; diff --git a/drivers/misc/mediatek/video/mt8127/mt8127/disp_hal.c b/drivers/misc/mediatek/video/mt8127/mt8127/disp_hal.c index 9a76dc04407..126d54ae168 100644 --- a/drivers/misc/mediatek/video/mt8127/mt8127/disp_hal.c +++ b/drivers/misc/mediatek/video/mt8127/mt8127/disp_hal.c @@ -657,12 +657,12 @@ const LCM_DRIVER *disphal_get_lcm_driver(const char *lcm_name, unsigned int *lcm lcm = lcm_driver_list[i]; printk("[LCM Auto Detect] [%d] - [%s]\t", i, (lcm->name==NULL)?"unknown":lcm->name); lcm->set_util_funcs(&lcm_utils); - memset((void*)&s_lcm_params, 0, sizeof(LCM_PARAMS)); - lcm->get_params(&s_lcm_params); + /*memset((void*)&s_lcm_params, 0, sizeof(LCM_PARAMS)); + // lcm->get_params(&s_lcm_params); - disphal_init_ctrl_if(); - LCD_Set_DrivingCurrent(&s_lcm_params); - LCD_Init_IO_pad(&s_lcm_params); + // disphal_init_ctrl_if(); + // LCD_Set_DrivingCurrent(&s_lcm_params); + // LCD_Init_IO_pad(&s_lcm_params);*/ if(lcm_name != NULL) { diff --git a/drivers/misc/mediatek/video/mt8127/mt8127/dpi_drv.c b/drivers/misc/mediatek/video/mt8127/mt8127/dpi_drv.c index dbd22d320dc..2a663ddf6ab 100644 --- a/drivers/misc/mediatek/video/mt8127/mt8127/dpi_drv.c +++ b/drivers/misc/mediatek/video/mt8127/mt8127/dpi_drv.c @@ -302,9 +302,6 @@ if((lcm_params->dpi.lvds_tx_en == 0) && (lcm_params->type == LCM_TYPE_DPI)) { data_Rate = lcm_params->dpi.PLL_CLOCK*2*8; // for DPI TTL OUTREGBIT(MIPITX_DSI0_CON_REG,DSI_PHY_REG_DPI->MIPITX_DSI0_CON,RG_DSI0_CKG_LDOOUT_EN,1); - OUTREGBIT(MIPITX_DSI0_CON_REG,DSI_PHY_REG_DPI->MIPITX_DSI0_CON,RG_DSI0_LDOCORE_EN,1); - OUTREGBIT(MIPITX_DSI_BG_CON_REG,DSI_PHY_REG_DPI->MIPITX_DSI_BG_CON,RG_DSI_BG_CKEN,1); - OUTREGBIT(MIPITX_DSI_BG_CON_REG,DSI_PHY_REG_DPI->MIPITX_DSI_BG_CON,RG_DSI_BG_CORE_EN,1); } //OUTREGBIT(MIPITX_DSI_TOP_CON_REG,DSI_PHY_REG_DPI->MIPITX_DSI_TOP_CON,RG_DSI_LNT_IMP_CAL_CODE,8); diff --git a/drivers/misc/mediatek/video/mt8127/mt8127/dsi_drv.c b/drivers/misc/mediatek/video/mt8127/mt8127/dsi_drv.c index 26fe53195f9..b32003c8d4c 100644 --- a/drivers/misc/mediatek/video/mt8127/mt8127/dsi_drv.c +++ b/drivers/misc/mediatek/video/mt8127/mt8127/dsi_drv.c @@ -34,10 +34,7 @@ static wait_queue_head_t _dsi_wait_queue; static wait_queue_head_t _dsi_dcs_read_wait_queue; static wait_queue_head_t _dsi_wait_bta_te; static wait_queue_head_t _dsi_wait_ext_te; -/* [PLATFORM]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/04/15,MTK patch,fix FB suspend/resume DSI issue*/ -wait_queue_head_t _dsi_wait_vm_done_queue; -/* [PLATFORM]-Mod-END by TCTSZ.yaohui.zeng, 2015/04/15*/ - +static wait_queue_head_t _dsi_wait_vm_done_queue; #endif //static unsigned int _dsi_reg_update_wq_flag = 0; static DECLARE_WAIT_QUEUE_HEAD(_dsi_reg_update_wq); @@ -209,6 +206,10 @@ unsigned int custom_pll_clock_remap(int input_mipi_clock) return ret; } #endif +static void lcm_mdelay(UINT32 ms) +{ + udelay(1000 * ms); +} void DSI_Enable_Log(bool enable) { dsi_log_on = enable; @@ -448,8 +449,7 @@ void DSI_InitVSYNC(unsigned int vsync_interval) #endif } -/* [PLATFORM]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/04/15,MTK patch,fix FB suspend/resume DSI issue*/ -BOOL _IsEngineBusy(void) +static BOOL _IsEngineBusy(void) { DSI_INT_STATUS_REG status; @@ -459,15 +459,13 @@ BOOL _IsEngineBusy(void) return TRUE; return FALSE; } -/* [PLATFORM]-Mod-END by TCTSZ.yaohui.zeng, 2015/04/15*/ static void _WaitForEngineNotBusy(void) { int timeOut; #if ENABLE_DSI_INTERRUPT - - long int time; + long int time; static const long WAIT_TIMEOUT = 2 * HZ; // 2 sec #endif @@ -531,7 +529,11 @@ void hdmi_dsi_waitnotbusy(void) _WaitForEngineNotBusy(); } - +void wait_dsi_engine_notbusy(void) +{ + if (wait_event_timeout(_dsi_wait_vm_done_queue, !_IsEngineBusy(), HZ / 10) == 0) + pr_err("Wait dsi engine not busy timeout\n"); +} DSI_STATUS DSI_BackupRegisters(void) { @@ -1566,7 +1568,7 @@ DSI_STATUS DSI_Reset(void) { //DSI_REG->DSI_COM_CTRL.DSI_RESET = 1; OUTREGBIT(DSI_COM_CTRL_REG,DSI_REG->DSI_COM_CTRL,DSI_RESET,1); -// mdelay(5); +// lcm_mdelay(5); //DSI_REG->DSI_COM_CTRL.DSI_RESET = 0; OUTREGBIT(DSI_COM_CTRL_REG,DSI_REG->DSI_COM_CTRL,DSI_RESET,0); @@ -1711,7 +1713,7 @@ DSI_STATUS DSI_handle_TE(void) //data_array=0x00351504; //DSI_set_cmdq(&data_array, 1, 1); - //mdelay(10); + //lcm_mdelay(10); // RACT //data_array=1; @@ -2264,22 +2266,22 @@ void DSI_lane0_ULP_mode(bool enter) // suspend tmp_reg1.L0_HS_TX_EN=0; OUTREG32(&DSI_REG->DSI_PHY_LD0CON, AS_UINT32(&tmp_reg1)); - mdelay(1); + lcm_mdelay(1); tmp_reg1.L0_ULPM_EN=1; OUTREG32(&DSI_REG->DSI_PHY_LD0CON, AS_UINT32(&tmp_reg1)); - mdelay(1); + lcm_mdelay(1); } else { // resume tmp_reg1.L0_ULPM_EN=0; OUTREG32(&DSI_REG->DSI_PHY_LD0CON, AS_UINT32(&tmp_reg1)); - mdelay(1); + lcm_mdelay(1); tmp_reg1.L0_WAKEUP_EN=1; OUTREG32(&DSI_REG->DSI_PHY_LD0CON, AS_UINT32(&tmp_reg1)); - mdelay(1); + lcm_mdelay(1); tmp_reg1.L0_WAKEUP_EN=0; OUTREG32(&DSI_REG->DSI_PHY_LD0CON, AS_UINT32(&tmp_reg1)); - mdelay(1); + lcm_mdelay(1); } } @@ -3745,7 +3747,7 @@ DSI_STATUS Wait_ULPS_Mode(void) while(((INREG32(DSI_BASE + 0x14C)>> 24) & 0xFF) != 0x04) { - mdelay(5); + lcm_mdelay(5); #ifdef DDI_DRV_DEBUG_LOG_ENABLE DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "DSI+%04x : 0x%08x \n", DSI_BASE, INREG32(DSI_BASE + 0x14C)); #endif @@ -3775,7 +3777,7 @@ DSI_STATUS Wait_WakeUp(void) OUTREG32(&DSI_REG->DSI_PHY_LCCON, AS_UINT32(&lccon_reg)); OUTREG32(&DSI_REG->DSI_PHY_LD0CON, AS_UINT32(&ld0con)); - mdelay(1);//Wait 1ms for LCM Spec + lcm_mdelay(1);//Wait 1ms for LCM Spec lccon_reg.LC_WAKEUP_EN =1; ld0con.L0_WAKEUP_EN=1; @@ -3784,7 +3786,7 @@ DSI_STATUS Wait_WakeUp(void) while(((INREG32(DSI_BASE + 0x148)>> 8) & 0xFF) != 0x01) { - mdelay(5); + lcm_mdelay(5); #ifdef DDI_DRV_DEBUG_LOG_ENABLE DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "[soso]DSI+%04x : 0x%08x \n", DSI_BASE, INREG32(DSI_BASE + 0x148)); #endif diff --git a/drivers/misc/mediatek/video/mt8127/mtkfb.c b/drivers/misc/mediatek/video/mt8127/mtkfb.c index f8f4c8f6d74..50bfbcd017e 100644 --- a/drivers/misc/mediatek/video/mt8127/mtkfb.c +++ b/drivers/misc/mediatek/video/mt8127/mtkfb.c @@ -73,6 +73,11 @@ static u32 MTK_FB_PAGES = 0; static u32 fb_xres_update = 0; static u32 fb_yres_update = 0; +#define SHOW_LCM_NAME +#ifdef SHOW_LCM_NAME +static char lcm_name[256] = {0}; +#endif + #define MTK_FB_XRESV (ALIGN_TO(MTK_FB_XRES, disphal_get_fb_alignment())) #define MTK_FB_YRESV (ALIGN_TO(MTK_FB_YRES, disphal_get_fb_alignment()) * MTK_FB_PAGES) /* For page flipping */ #define MTK_FB_BYPP ((MTK_FB_BPP + 7) >> 3) @@ -105,10 +110,6 @@ static size_t mtkfb_log_on = false; pr_err("[MTKFB] mt8127 "fmt, ##arg); \ }while (0) #define PRNERR(fmt, args...) DISP_LOG_PRINT(ANDROID_LOG_INFO, "MTKFB", fmt, ## args); -/* [PLATFORM]-Add-BEGIN by TCTSZ.yaohui.zeng, 2015/04/15,MTK patch,fix FB suspend/resume DSI issue*/ -extern BOOL _IsEngineBusy(void); -extern wait_queue_head_t _dsi_wait_vm_done_queue; -/* [PLATFORM]-Add-END by TCTSZ.yaohui.zeng, 2015/04/15*/ void mtkfb_log_enable(int enable) { @@ -147,8 +148,7 @@ unsigned int decouple_size = 0; extern unsigned int g_fb_pattern_en; extern int fb_pattern(struct mtkfb_device *fbdev, struct fb_overlay_config *fb_config); -extern wait_queue_head_t _dsi_wait_vm_done_queue; -extern BOOL _IsEngineBusy(void); + /* This mutex is used to prevent tearing due to page flipping when adbd is reading the front buffer */ @@ -167,7 +167,7 @@ unsigned int PanDispSettingDirty = 0; unsigned int PanDispSettingApplied = 0; DECLARE_WAIT_QUEUE_HEAD(reg_update_wq); - +DECLARE_WAIT_QUEUE_HEAD(suspend_done_wq); unsigned int need_esd_check = 0; DECLARE_WAIT_QUEUE_HEAD(esd_check_wq); @@ -177,6 +177,8 @@ extern wait_queue_head_t disp_done_wq; DEFINE_MUTEX(ScreenCaptureMutex); BOOL is_early_suspended = FALSE; +BOOL is_early_suspended_done = FALSE; + static int sem_flipping_cnt = 1; static int sem_early_suspend_cnt = 1; static int sem_overlay_buffer_cnt = 1; @@ -209,6 +211,7 @@ extern void MTK_HDMI_Set_Security_Output(int enable); /* temporary solution for hdmi svp p1, always mute hdmi for svp */ void MTK_HDMI_Set_Security_Output_SVP_P1(int enable); #endif +extern void wait_dsi_engine_notbusy(void); // --------------------------------------------------------------------------- // Timer Routines @@ -566,14 +569,14 @@ static BOOL BL_set_level_resume = FALSE; int mtkfb_set_backlight_level(unsigned int level) { MTKFB_FUNC(); - pr_info("mtkfb_set_backlight_level:%d\n", level); + printk("mtkfb_set_backlight_level:%d\n", level); if (down_interruptible(&sem_flipping)) { - pr_info("[FB Driver] can't get semaphore:%d\n", __LINE__); + printk("[FB Driver] can't get semaphore:%d\n", __LINE__); return -ERESTARTSYS; } sem_flipping_cnt--; if (down_interruptible(&sem_early_suspend)) { - pr_info("[FB Driver] can't get semaphore:%d\n", __LINE__); + printk("[FB Driver] can't get semaphore:%d\n", __LINE__); sem_flipping_cnt++; up(&sem_flipping); return -ERESTARTSYS; @@ -583,7 +586,7 @@ int mtkfb_set_backlight_level(unsigned int level) if (is_early_suspended){ BL_level = level; BL_set_level_resume = TRUE; - pr_info("[FB driver] set backlight level but FB has been suspended\n"); + printk("[FB driver] set backlight level but FB has been suspended\n"); goto End; } DISP_SetBacklight(level); @@ -851,18 +854,15 @@ static int mtkfb_pan_display_impl(struct fb_var_screeninfo *var, struct fb_info pr_info("[mtkfb] pan display set va=0x%x, pa=0x%x \n",(unsigned int)vaStart,paStart); Disp_Ovl_Engine_Set_layer_info(mtkfb_instance, &layerInfo); - if(get_boot_mode() != FACTORY_BOOT) - { - layerInfo.layer_id = 1; - layerInfo.layer_enable = FALSE; - Disp_Ovl_Engine_Set_layer_info(mtkfb_instance, &layerInfo); - layerInfo.layer_id = 2; - layerInfo.layer_enable = FALSE; - Disp_Ovl_Engine_Set_layer_info(mtkfb_instance, &layerInfo); - layerInfo.layer_id = 3; - layerInfo.layer_enable = FALSE; - Disp_Ovl_Engine_Set_layer_info(mtkfb_instance, &layerInfo); - } + layerInfo.layer_id = 1; + layerInfo.layer_enable = FALSE; + Disp_Ovl_Engine_Set_layer_info(mtkfb_instance, &layerInfo); + layerInfo.layer_id = 2; + layerInfo.layer_enable = FALSE; + Disp_Ovl_Engine_Set_layer_info(mtkfb_instance, &layerInfo); + layerInfo.layer_id = 3; + layerInfo.layer_enable = FALSE; + Disp_Ovl_Engine_Set_layer_info(mtkfb_instance, &layerInfo); } #else mutex_lock(&OverlaySettingMutex); @@ -1443,6 +1443,7 @@ out: /* ion handles */ if (ion_handles[i]) { ion_free(fbdev->ion_client, ion_handles[i]); + //printk("free ion_handles[%d] = %p\n",i,ion_handles[i]); ion_handles[i] = NULL; } /* fences */ @@ -1452,8 +1453,8 @@ out: fences[i] = NULL; } } - - kfree(work); + if(work != NULL) + kfree(work); mutex_lock(&fbdev->timeline_lock); sw_sync_timeline_inc(fbdev->timeline, 1); @@ -1605,7 +1606,8 @@ err: config->fence = -1; if (fd >=0) put_unused_fd(fd); - kfree(work); + if(work != NULL) + kfree(work); out: up(&sem_early_suspend); @@ -1620,7 +1622,7 @@ static int mtkfb_set_overlay_layer(struct mtkfb_device *fbdev, struct fb_overlay unsigned int layerpitch; unsigned int layerbpp; #endif - unsigned int id = layerInfo->layer_id; + unsigned int id = (layerInfo->layer_id >= OVL_LAYER_NUM ? 0 : layerInfo->layer_id); int enable = layerInfo->layer_enable ? 1 : 0; int ret = 0; @@ -1628,14 +1630,6 @@ static int mtkfb_set_overlay_layer(struct mtkfb_device *fbdev, struct fb_overlay MSG_FUNC_ENTER(); MMProfileLogEx(MTKFB_MMP_Events.SetOverlayLayer, MMProfileFlagStart, (id<<16)|enable, (unsigned int)layerInfo->src_phy_addr); - // Check id is valid - if ((id < 0) || (id >= DDP_OVL_LAYER_MUN)) - { - MTKFB_LOG("Invalid layer id:%d\n", id); - ret = -EFAULT; - goto LeaveOverlayMode; - } - //BUG: check layer 3 format if((layerInfo->layer_id == 3) && (layerInfo->src_fmt != MTK_FB_FORMAT_ARGB8888)) { @@ -1993,7 +1987,7 @@ LeaveOverlayMode: static int mtkfb_get_overlay_layer_info(struct fb_overlay_layer_info* layerInfo) { DISP_LAYER_INFO layer; - if ((layerInfo->layer_id < 0) || (layerInfo->layer_id >= DDP_OVL_LAYER_MUN)) + if (layerInfo->layer_id >= DDP_OVL_LAYER_MUN) { return 0; } @@ -2034,78 +2028,6 @@ void mtkfb_capture_fb_only(bool enable) atomic_set(&capture_ui_layer_only, enable); } -static int mtkfb_capture_framebuffer(struct fb_info *info, unsigned int pvbuf) -{ - int ret = 0; - MMProfileLogEx(MTKFB_MMP_Events.CaptureFramebuffer, MMProfileFlagStart, pvbuf, 0); - MTKFB_FUNC(); - if (down_interruptible(&sem_flipping)) { - pr_info("[FB Driver] can't get semaphore:%d\n", __LINE__); - MMProfileLogEx(MTKFB_MMP_Events.CaptureFramebuffer, MMProfileFlagEnd, 0, 1); - return -ERESTARTSYS; - } - sem_flipping_cnt--; - mutex_lock(&ScreenCaptureMutex); - - /** LCD registers can't be R/W when its clock is gated in early suspend - mode; power on/off LCD to modify register values before/after func. - */ - if (is_early_suspended) - { - // Turn on engine clock. - disp_path_clock_on("mtkfb"); - } - - if (atomic_read(&capture_ui_layer_only)) - { - unsigned int w_xres = (unsigned short)fb_layer_context.src_width; - unsigned int h_yres = (unsigned short)fb_layer_context.src_height; - unsigned int pixel_bpp = info->var.bits_per_pixel / 8; // bpp is either 32 or 16, can not be other value - unsigned int w_fb = (unsigned int)fb_layer_context.src_pitch; - unsigned int fbsize = w_fb * h_yres * pixel_bpp; // frame buffer size - unsigned int fbaddress = info->fix.smem_start + info->var.yoffset * info->fix.line_length; //physical address - unsigned int mem_off_x = (unsigned short)fb_layer_context.src_offset_x; - unsigned int mem_off_y = (unsigned short)fb_layer_context.src_offset_y; - unsigned int fbv = 0; - fbaddress += (mem_off_y * w_fb + mem_off_x) * pixel_bpp; - fbv = (unsigned int)ioremap_nocache(fbaddress, fbsize); - MTKFB_LOG("[FB Driver], w_xres = %d, h_yres = %d, w_fb = %d, pixel_bpp = %d, fbsize = %d, fbaddress = 0x%08x\n", w_xres, h_yres, w_fb, pixel_bpp, fbsize, fbaddress); - if (!fbv) - { - MTKFB_LOG("[FB Driver], Unable to allocate memory for frame buffer: address=0x%08x, size=0x%08x\n", \ - fbaddress, fbsize); - goto EXIT; - } - { - unsigned int i; - for(i = 0;i < h_yres; i++) - { - memcpy((void *)(pvbuf + i * w_xres * pixel_bpp), (void *)(fbv + i * w_fb * pixel_bpp), w_xres * pixel_bpp); - } - } - iounmap((void *)fbv); - } - else - DISP_Capture_Framebuffer(pvbuf, info->var.bits_per_pixel, is_early_suspended); - - -EXIT: - if (is_early_suspended) - { - // Turn off engine clock. - //DISP_CHECK_RET(DISP_PowerEnable(FALSE)); - disp_path_clock_off("mtkfb"); - } - - mutex_unlock(&ScreenCaptureMutex); - sem_flipping_cnt++; - up(&sem_flipping); - MSG_FUNC_LEAVE(); - MMProfileLogEx(MTKFB_MMP_Events.CaptureFramebuffer, MMProfileFlagEnd, 0, 0); - - return ret; -} - #include extern OVL_CONFIG_STRUCT* captured_layer_config; @@ -2221,8 +2143,6 @@ static char *_mtkfb_ioctl_spy(unsigned int cmd) return "MTKFB_TRIG_OVERLAY_OUT"; case MTKFB_SET_VIDEO_LAYERS: return "MTKFB_SET_VIDEO_LAYERS"; - case MTKFB_CAPTURE_FRAMEBUFFER: - return "MTKFB_CAPTURE_FRAMEBUFFER"; case MTKFB_CONFIG_IMMEDIATE_UPDATE: return "MTKFB_CONFIG_IMMEDIATE_UPDATE"; case MTKFB_SET_MULTIPLE_LAYERS: @@ -2305,8 +2225,6 @@ static char *_mtkfb_ioctl_spy(unsigned int cmd) return "MTKFB_GET_MAX_DISPLAY_COUNT"; case MTKFB_SET_FB_LAYER_SECURE: return "MTKFB_SET_FB_LAYER_SECURE"; - case MTKFB_META_RESTORE_SCREEN: - return "MTKFB_META_RESTORE_SCREEN"; case MTKFB_ERROR_INDEX_UPDATE_TIMEOUT: return "MTKFB_ERROR_INDEX_UPDATE_TIMEOUT"; case MTKFB_ERROR_INDEX_UPDATE_TIMEOUT_AEE: @@ -2331,12 +2249,12 @@ static int mtkfb_ioctl(struct file *file, struct fb_info *info, unsigned int cmd void __user *argp = (void __user *)arg; DISP_STATUS ret = 0; int r = 0, i; - + int wait_cnt = 0; MTKFB_FUNC(); /// M: dump debug mmprofile log info MMProfileLogEx(MTKFB_MMP_Events.IOCtrl, MMProfileFlagPulse, _IOC_NR(cmd), arg); - pr_info("mtkfb_ioctl, info=0x%08x, cmd=0x%08x(%s), arg=0x%08x\n", (unsigned int)info, - (unsigned int)cmd, _mtkfb_ioctl_spy(cmd), (unsigned int)arg); + //pr_info("mtkfb_ioctl, info=0x%08x, cmd=0x%08x(%s), arg=0x%08x\n", (unsigned int)info, + //(unsigned int)cmd, _mtkfb_ioctl_spy(cmd), (unsigned int)arg); switch (cmd) { @@ -2387,6 +2305,7 @@ static int mtkfb_ioctl(struct file *file, struct fb_info *info, unsigned int cmd case MTKFB_SET_OVERLAY_LAYER: { struct fb_overlay_layer layerInfo; + memset((void *)&layerInfo, 0, sizeof(layerInfo)); MTKFB_LOG(" mtkfb_ioctl():MTKFB_SET_OVERLAY_LAYER\n"); if (copy_from_user(&layerInfo, (void __user *)arg, sizeof(layerInfo))) { @@ -2448,30 +2367,38 @@ static int mtkfb_ioctl(struct file *file, struct fb_info *info, unsigned int cmd case MTKFB_POWEROFF: { MTKFB_FUNC(); - mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF); - + printk("[IOCTL] FB_POWEROFF\n"); + if (!lcd_fps) msleep(30); else msleep(2*100000/lcd_fps); // Delay 2 frames. - - if(is_early_suspended) - { - MTKFB_LOG("[FB driver] MTKFB_POWEROFF ioctl,device had been suspended\n"); - return r; - } + if (down_interruptible(&sem_early_suspend)) { pr_info("[FB Driver] can't get semaphore in mtkfb_early_suspend()\n"); return -ERESTARTSYS; } - + if(is_early_suspended){ + up(&sem_early_suspend); + ret = wait_event_interruptible_timeout(suspend_done_wq, is_early_suspended_done, HZ/10); + is_early_suspended_done = FALSE; + printk("[MTKFB_POWEROFF] ret, already early_suspended\n"); + return r; + } + is_early_suspended_done = FALSE; is_early_suspended = TRUE; - up(&sem_early_suspend); #ifndef NONFLUSH + up(&sem_early_suspend); /* Wait until queued compositions are applied */ flush_workqueue(((struct mtkfb_device *)info->par)->update_ovls_wq); + if (down_interruptible(&sem_early_suspend)) + { + is_early_suspended = FALSE; + pr_info("[FB Driver] can't get semaphore in mtkfb_early_suspend()\n"); + return -ERESTARTSYS; + } #else /* Do not flush work queue, becuase this will cause fence disorder */ /* disable all layer */ @@ -2490,43 +2417,46 @@ static int mtkfb_ioctl(struct file *file, struct fb_info *info, unsigned int cmd config.layers[2].layer_id = 2; config.layers[2].layer_enable = 0; config.layers[2].fence_fd = -1; - config.layers[2].ion_fd = -1; + config.layers[2].ion_fd = -1; config.layers[3].layer_id = 3; config.layers[3].layer_enable = 0; config.layers[3].fence_fd = -1; config.layers[3].ion_fd = -1; + up(&sem_early_suspend); mtkfb_queue_overlay_config((struct mtkfb_device *)info->par, &config); - if (config.fence != -1) { fence = sync_fence_fdget(config.fence); if (sync_fence_wait(fence, 1000) < 0) pr_err("MTKFB_POWEROFF error waiting for fence to signal\n"); sync_fence_put(fence); put_unused_fd(config.fence); - } + } + } + printk("[IOCTL] FB_POWEROFF started\n"); + if (down_interruptible(&sem_early_suspend)) + { + pr_info("[FB Driver] can't get semaphore in mtkfb_early_suspend()\n"); + is_early_suspended = FALSE; + return -ERESTARTSYS; } #endif - if (down_interruptible(&sem_early_suspend)) - { - pr_info("[FB Driver] can't get semaphore in mtkfb_early_suspend()\n"); - return -ERESTARTSYS; - } + DISP_PrepareSuspend(); + wait_dsi_engine_notbusy(); - DISP_PrepareSuspend(); - // Wait for disp finished. - /* [PLATFORM]-Mod-BEGIN by TCTSZ.yaohui.zeng, 2015/04/15,MTK patch,fix FB suspend/resume DSI issue*/ - if(wait_event_interruptible_timeout(_dsi_wait_vm_done_queue, !_IsEngineBusy(), HZ/10)==0 ) - { - pr_info("[FB Driver] Wait disp finished timeout in early_suspend\n"); - } - /* [PLATFORM]-Mod-END by TCTSZ.yaohui.zeng, 2015/04/15*/ + disp_path_clock_off("mtkfb"); /* porting from abc123 */ DISP_CHECK_RET(DISP_PauseVsync(TRUE)); DISP_CHECK_RET(DISP_PanelEnable(FALSE)); DISP_CHECK_RET(DISP_PowerEnable(FALSE)); - disp_path_clock_off("mtkfb"); + /*disp_path_clock_off("mtkfb");*/ /* porting from abc123 */ + +#if defined(MTK_OVERLAY_ENGINE_SUPPORT) + Disp_Ovl_Engine_clock_off(); +#endif MMProfileLog(MTKFB_MMP_Events.EarlySuspend, MMProfileFlagStart); + is_early_suspended_done = TRUE; + wake_up_interruptible(&suspend_done_wq); up(&sem_early_suspend); @@ -2536,19 +2466,30 @@ static int mtkfb_ioctl(struct file *file, struct fb_info *info, unsigned int cmd case MTKFB_POWERON: { MTKFB_FUNC(); - if(!is_early_suspended) return r; + printk("[IOCTL] FB_POWERON\n"); if (down_interruptible(&sem_early_suspend)) { pr_info("[FB Driver] can't get semaphore in mtkfb_late_resume()\n"); return -ERESTARTSYS; } + if(!is_early_suspended) + { + up(&sem_early_suspend); + printk("[FB driver] MTKFB_POWERON ioctl,device had been resumed\n"); + return r; + } disp_path_clock_on("mtkfb"); +#if 1 //def monica_porting +#if defined(MTK_OVERLAY_ENGINE_SUPPORT) + Disp_Ovl_Engine_clock_on(); +#endif +#endif DISP_CHECK_RET(DISP_PauseVsync(FALSE)); DISP_CHECK_RET(DISP_PowerEnable(TRUE)); DISP_CHECK_RET(DISP_PanelEnable(TRUE)); is_early_suspended = FALSE; - + if (is_ipoh_bootup) { //ALPS01279263 CL2317283 DISP_StartConfigUpdate(); } else { @@ -2588,22 +2529,6 @@ static int mtkfb_ioctl(struct file *file, struct fb_info *info, unsigned int cmd return (r); } - case MTKFB_CAPTURE_FRAMEBUFFER: - { - unsigned int pbuf = 0; - if (copy_from_user(&pbuf, (void __user *)arg, sizeof(pbuf))) - { - MTKFB_LOG("[FB]: copy_from_user failed! line:%d \n", __LINE__); - r = -EFAULT; - } - else - { - mtkfb_capture_framebuffer(info, pbuf); - } - - return (r); - } - case MTKFB_GET_OVERLAY_LAYER_INFO: { struct fb_overlay_layer_info layerInfo; @@ -2698,18 +2623,6 @@ static int mtkfb_ioctl(struct file *file, struct fb_info *info, unsigned int cmd #endif return 0; } - case MTKFB_META_RESTORE_SCREEN: - { - struct fb_var_screeninfo var; - - if (copy_from_user(&var, argp, sizeof(var))) - return -EFAULT; - - info->var.yoffset = var.yoffset; - init_framebuffer(info); - - return mtkfb_pan_display_impl(&var, info); - } case MTKFB_GET_INTERFACE_TYPE: { @@ -3061,6 +2974,17 @@ static void mtkfb_free_resources(struct mtkfb_device *fbdev, int state) extern char* saved_command_line; char mtkfb_lcm_name[256] = {0}; + +#ifdef SHOW_LCM_NAME +static ssize_t show_lcm_name(struct device *dev, struct device_attribute *attr, + char *buf) +{ + MTKFB_MSG("[mtk-tpd]vendor name: %s\n", lcm_name); + return sprintf(buf, "%s\n", lcm_name); +} +static DEVICE_ATTR(Lcm_Name, 0444, show_lcm_name, NULL); +#endif + BOOL mtkfb_find_lcm_driver(void) { BOOL ret = FALSE; @@ -3169,6 +3093,8 @@ static void mtkfb_fb_565_to_8888(struct fb_info *fb_info) } //printf("[boot_logo_updater] loop copy color over\n"); + __cpuc_flush_kern_all(); + mtkfb_fbinfo_modify(fb_info); wait_ret = wait_event_interruptible_timeout(reg_update_wq, atomic_read(&OverlaySettingApplied), HZ/10); MTKFB_LOG("[WaitQ] wait_event_interruptible() ret = %d, %d\n", wait_ret, __LINE__); @@ -3199,6 +3125,7 @@ static int mtkfb_probe(struct device *dev) int init_state; int r = 0; char *p = NULL; + char *q = NULL; MSG_FUNC_ENTER(); @@ -3380,6 +3307,25 @@ static int mtkfb_probe(struct device *dev) MSG(INFO, "MTK framebuffer initialized vram=%lu\n", fbdev->fb_size_in_byte); MSG_FUNC_LEAVE(); + +#ifdef SHOW_LCM_NAME + p = strstr(saved_command_line, "lcm="); + + if(p != NULL) { + // we can't find lcm string in the command line + p += 4; + if((p - saved_command_line) < strlen(saved_command_line+1)) { + q = p; + while(*q != ' ' && *q != '\0') + q++; + + device_create_file(&pdev->dev, &dev_attr_Lcm_Name); + memset((void*)lcm_name, 0, sizeof(lcm_name)); + strncpy((char*)lcm_name, (char*)p, (int)(q-p)); + } + } +#endif + return 0; cleanup: @@ -3424,7 +3370,9 @@ EXPORT_SYMBOL(mtkfb_is_suspend); static void mtkfb_shutdown(struct device *pdev) { MTKFB_LOG("[FB Driver] mtkfb_shutdown()\n"); + disp_bls_shutdown(1); mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF); + /*disp_bls_contrl_directly(0);*/ if (!lcd_fps) msleep(30); else @@ -3442,13 +3390,9 @@ static void mtkfb_shutdown(struct device *pdev) sem_early_suspend_cnt--; is_early_suspended = TRUE; - - /* [FIXBUG]-Mod-BEGIN by TCTSZ.leo.guo, PR#1000254 2015/05/18, Fix FB suspend/resume DSI cause recovery reboot failed issue*/ DISP_PrepareSuspend(); - if(wait_event_interruptible_timeout(_dsi_wait_vm_done_queue, !_IsEngineBusy(), HZ/10) == 0) - pr_err("[FB Driver] Wait disp finished timeout in early_suspend\n"); - /* [FIXBUG]-Mod-END by TCTSZ.leo.guo, 2015/05/18*/ + wait_dsi_engine_notbusy(); DISP_CHECK_RET(DISP_PanelEnable(FALSE)); DISP_CHECK_RET(DISP_PowerEnable(FALSE)); @@ -3502,6 +3446,7 @@ void mtkfb_clear_lcm(void) msleep(400000/lcd_fps); DISP_WaitForLCDNotBusy(); +#if 0 mutex_lock(&OverlaySettingMutex); for(i=0;ipar, &config); + + if (config.fence != -1) { + fence = sync_fence_fdget(config.fence); + if (fence!=0 && sync_fence_wait(fence, 1000) < 0) + pr_err("mtkfb_early_suspend error waiting for fence to signal\n"); + sync_fence_put(fence); + put_unused_fd(config.fence); } + if (down_interruptible(&sem_early_suspend)) { + pr_info("[FB Driver] can't get semaphore in mtkfb_early_suspend()\n"); + is_early_suspended = FALSE; + mutex_unlock(&ScreenCaptureMutex); + return; + } + sem_early_suspend_cnt--; +#endif + DISP_PrepareSuspend(); + wait_dsi_engine_notbusy(); DISP_CHECK_RET(DISP_PanelEnable(FALSE)); DISP_CHECK_RET(DISP_PowerEnable(FALSE)); DISP_CHECK_RET(DISP_PauseVsync(TRUE)); disp_path_clock_off("mtkfb"); +#if 1 //def monica_porting +#if defined(MTK_OVERLAY_ENGINE_SUPPORT) + Disp_Ovl_Engine_clock_off(); +#endif +#endif sem_early_suspend_cnt++; + is_early_suspended_done = TRUE; + wake_up_interruptible(&suspend_done_wq); + up(&sem_early_suspend); + mutex_unlock(&ScreenCaptureMutex); + + /* Here we should flush composition workqueue but there's no + * clean and easy way to get the device handle. Because early suspend + * struct is not a member of fbdev, and global variables are used instead, + * we can't just use container_of ... + * As we flush in blank/POWEROFF IOCTL from HWC, this is not a practical issue. + * + * flush_workqueue(((struct mtkfb_device *)dev)->update_ovls_wq); + */ + + pr_info("[FB Driver] leave early_suspend\n"); + + MSG_FUNC_LEAVE(); +} + +static void mtkfb_early_suspend(struct early_suspend *h) +{ + struct fb_overlay_config config; + struct sync_fence *fence; + int wait_cnt = 0; + int ret; + + MSG_FUNC_ENTER(); + + printk("[FB Driver] enter early_suspend\n"); + + + mutex_lock(&ScreenCaptureMutex); + + + mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF); + if (down_interruptible(&sem_early_suspend)) { + printk("[FB Driver] can't get semaphore in mtkfb_early_suspend()\n"); + mutex_unlock(&ScreenCaptureMutex); + return; + } + + sem_early_suspend_cnt--; + + if(is_early_suspended){ + sem_early_suspend_cnt++; + up(&sem_early_suspend); + printk("[mtkfb_early_suspend] waiting for the IOCTL power off done\n"); + ret = wait_event_interruptible_timeout(suspend_done_wq, is_early_suspended_done, HZ/10); + is_early_suspended_done = FALSE; + printk("[FB driver] ret, suspended by IOCTL\n"); + mutex_unlock(&ScreenCaptureMutex); + return; + } + + MMProfileLog(MTKFB_MMP_Events.EarlySuspend, MMProfileFlagStart); + is_early_suspended_done = FALSE; + is_early_suspended = TRUE; + + if (!lcd_fps) + msleep(30); + else + msleep(2*100000/lcd_fps); // Delay 2 frames. +#if 1 + //mutex_unlock(&ScreenCaptureMutex); + /* Do not flush work queue, becuase this will cause fence disorder */ + /* disable all layer */ + printk("mtkfb_early_suspend wait all frame done\n"); + + config.layers[0].layer_id = 0; + config.layers[0].layer_enable = 0; + config.layers[0].fence_fd = -1; + config.layers[0].ion_fd = -1; + config.layers[1].layer_id = 1; + config.layers[1].layer_enable = 0; + config.layers[1].fence_fd = -1; + config.layers[1].ion_fd = -1; + config.layers[2].layer_id = 2; + config.layers[2].layer_enable = 0; + config.layers[2].fence_fd = -1; + config.layers[2].ion_fd = -1; + config.layers[3].layer_id = 3; + config.layers[3].layer_enable = 0; + config.layers[3].fence_fd = -1; + config.layers[3].ion_fd = -1; + + sem_early_suspend_cnt++; + up(&sem_early_suspend); + + mtkfb_queue_overlay_config((struct mtkfb_device *)mtkfb_fbi->par, &config); + + if (config.fence != -1) { + fence = sync_fence_fdget(config.fence); + if (sync_fence_wait(fence, 1000) < 0) + pr_err("mtkfb_early_suspend error waiting for fence to signal\n"); + sync_fence_put(fence); + put_unused_fd(config.fence); + } + if (down_interruptible(&sem_early_suspend)) { + pr_info("[FB Driver] can't get semaphore in mtkfb_early_suspend()\n"); + is_early_suspended = FALSE; + mutex_unlock(&ScreenCaptureMutex); + return; + } + sem_early_suspend_cnt--; +#endif + DISP_PrepareSuspend(); + wait_dsi_engine_notbusy(); + DISP_CHECK_RET(DISP_PanelEnable(FALSE)); + DISP_CHECK_RET(DISP_PowerEnable(FALSE)); + DISP_CHECK_RET(DISP_PauseVsync(TRUE)); + + disp_path_clock_off("mtkfb"); +#if 1 //def monica_porting +#if defined(MTK_OVERLAY_ENGINE_SUPPORT) + Disp_Ovl_Engine_clock_off(); +#endif +#endif + + sem_early_suspend_cnt++; + is_early_suspended_done = TRUE; + wake_up_interruptible(&suspend_done_wq); up(&sem_early_suspend); mutex_unlock(&ScreenCaptureMutex); @@ -3606,12 +3791,11 @@ static int mtkfb_resume(struct device *pdev) } #ifdef CONFIG_HAS_EARLYSUSPEND -static void mtkfb_late_resume(struct early_suspend *h) +void mtkfb_late_resume_test() { MSG_FUNC_ENTER(); - pr_info("[FB Driver] enter late_resume\n"); - + printk("[FB Driver] enter late_resume_test\n"); mutex_lock(&ScreenCaptureMutex); if (down_interruptible(&sem_early_suspend)) { pr_info("[FB Driver] can't get semaphore in mtkfb_late_resume()\n"); @@ -3623,7 +3807,7 @@ static void mtkfb_late_resume(struct early_suspend *h) is_early_suspended = false; sem_early_suspend_cnt++; up(&sem_early_suspend); - MTKFB_LOG("[FB driver] has been resumed\n"); + printk("[FB driver] has been resumed\n"); mutex_unlock(&ScreenCaptureMutex); return; } @@ -3636,6 +3820,85 @@ static void mtkfb_late_resume(struct early_suspend *h) } else disp_path_clock_on("mtkfb"); +#if 1 //def monica_porting +#if defined(MTK_OVERLAY_ENGINE_SUPPORT) + Disp_Ovl_Engine_clock_on(); +#endif +#endif + pr_info("[FB LR] 1\n"); + DISP_CHECK_RET(DISP_PauseVsync(FALSE)); + pr_info("[FB LR] 2\n"); + DISP_CHECK_RET(DISP_PowerEnable(TRUE)); + pr_info("[FB LR] 3\n"); + DISP_CHECK_RET(DISP_PanelEnable(TRUE)); + pr_info("[FB LR] 4\n"); + + is_early_suspended = FALSE; + + if (is_ipoh_bootup) + { + DISP_StartConfigUpdate(); + is_ipoh_bootup =false; + } + else + { + mtkfb_clear_lcm_test(); + } + + sem_early_suspend_cnt++; + up(&sem_early_suspend); + mutex_unlock(&ScreenCaptureMutex); + if(BL_set_level_resume){ + mtkfb_set_backlight_level(BL_level); + BL_set_level_resume = FALSE; + } +//#if defined(MTK_OVERLAY_ENGINE_SUPPORT) +//#ifdef CONFIG_MTK_LEDS + //if (!disp_ovl_engine.bCouple) + mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_HALF); +//#endif +//#endif + pr_info("[FB Driver] leave late_resume\n"); + + MSG_FUNC_LEAVE(); +} + + +static void mtkfb_late_resume(struct early_suspend *h) +{ + MSG_FUNC_ENTER(); + + printk("[FB Driver] enter late_resume\n"); + + mutex_lock(&ScreenCaptureMutex); + if (down_interruptible(&sem_early_suspend)) { + pr_info("[FB Driver] can't get semaphore in mtkfb_late_resume()\n"); + mutex_unlock(&ScreenCaptureMutex); + return; + } + sem_early_suspend_cnt--; + if(!is_early_suspended){ + is_early_suspended = false; + sem_early_suspend_cnt++; + up(&sem_early_suspend); + printk("[FB driver] has been resumed\n"); + mutex_unlock(&ScreenCaptureMutex); + return; + } + + MMProfileLog(MTKFB_MMP_Events.EarlySuspend, MMProfileFlagEnd); + if (is_ipoh_bootup) + { + atomic_set(&OverlaySettingDirtyFlag, 0); + disp_path_clock_on("ipoh_mtkfb"); + } + else + disp_path_clock_on("mtkfb"); +#if 1 //def monica_porting +#if defined(MTK_OVERLAY_ENGINE_SUPPORT) + Disp_Ovl_Engine_clock_on(); +#endif +#endif pr_info("[FB LR] 1\n"); DISP_CHECK_RET(DISP_PauseVsync(FALSE)); pr_info("[FB LR] 2\n"); diff --git a/drivers/misc/mediatek/video/mt8127/mtkfb.h b/drivers/misc/mediatek/video/mt8127/mtkfb.h index 028fdf67d84..a98ebaf1379 100644 --- a/drivers/misc/mediatek/video/mt8127/mtkfb.h +++ b/drivers/misc/mediatek/video/mt8127/mtkfb.h @@ -27,7 +27,6 @@ #define MTKFB_SET_OVERLAY_LAYER MTK_IOW(0, struct fb_overlay_layer) #define MTKFB_TRIG_OVERLAY_OUT MTK_IO(1) #define MTKFB_SET_VIDEO_LAYERS MTK_IOW(2, struct fb_overlay_layer) -#define MTKFB_CAPTURE_FRAMEBUFFER MTK_IOW(3, unsigned long) #define MTKFB_CONFIG_IMMEDIATE_UPDATE MTK_IOW(4, unsigned long) #define MTKFB_SET_MULTIPLE_LAYERS MTK_IOW(5, struct fb_overlay_layer) #define MTKFB_REGISTER_OVERLAYBUFFER MTK_IOW(6, struct fb_overlay_buffer_info) @@ -60,7 +59,6 @@ #define MTKFB_SLT_AUTO_CAPTURE MTK_IOWR(27, struct fb_slt_catpure) //error handling -#define MTKFB_META_RESTORE_SCREEN MTK_IOW(101, unsigned long) #define MTKFB_ERROR_INDEX_UPDATE_TIMEOUT MTK_IO(103) #define MTKFB_ERROR_INDEX_UPDATE_TIMEOUT_AEE MTK_IO(104) diff --git a/drivers/misc/mediatek/video/mt8127/mtkfb_proc.c b/drivers/misc/mediatek/video/mt8127/mtkfb_proc.c deleted file mode 100644 index 54c2040cf23..00000000000 --- a/drivers/misc/mediatek/video/mt8127/mtkfb_proc.c +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "disp_drv.h" - - -#define MTKFB_PROC_INTERFACE_NAME "mtkfb_size" - -/* -static struct proc_dir_entry *mtkfb_kop_entry; - -static int mtkfb_size_read(char *page, char **start, off_t off, int count, int *eof, void *data) -{ - char *p = page; - int len = 0, fb_size; - - fb_size = DISP_GetVRamSize(); //unit: Byte - pr_info("%s fb_size:%d\n", __func__, fb_size); - p += sprintf(p, "%d\n", fb_size); - *start = page + off; - - len = p - page; - if (len > off) - len -= off; - else - len = 0; - - return (len < count) ? len : count; -} - -int mtkfb_proc_intf_register(void) -{ - pr_info("%s: register mtk fb proc interface\n", __func__); - - mtkfb_kop_entry = create_proc_entry(MTKFB_PROC_INTERFACE_NAME, 0, NULL); - if (mtkfb_kop_entry) { - mtkfb_kop_entry->read_proc = mtkfb_size_read; - mtkfb_kop_entry->write_proc = NULL; - } - - return 0; -} - -void mtkfb_proc_intf_unregister(void) -{ - pr_info("%s: unregister mtk fb proc interface\n", __func__); - - if (mtkfb_kop_entry != NULL) { - remove_proc_entry(MTKFB_PROC_INTERFACE_NAME, mtkfb_kop_entry); - mtkfb_kop_entry = NULL; - } -} -*/ -static int __init mtkfb_proc_intf_init(void) -{ - return 0; -/* - pr_info("%s\n", __func__); - return mtkfb_proc_intf_register(); - */ -} - -static void __exit mtkfb_proc_intf_exit(void) -{ - /* - pr_info("%s\n", __func__); - mtkfb_proc_intf_unregister(); - */ -} - -module_init(mtkfb_proc_intf_init); -module_exit(mtkfb_proc_intf_exit); - -MODULE_DESCRIPTION("MediaTek framebuffer proc interface"); -MODULE_AUTHOR("MediaTek Inc."); -MODULE_LICENSE("GPL"); - diff --git a/drivers/misc/mediatek/video/mtkfb.h b/drivers/misc/mediatek/video/mtkfb.h index c68894e0e6b..a796339e5fb 100644 --- a/drivers/misc/mediatek/video/mtkfb.h +++ b/drivers/misc/mediatek/video/mtkfb.h @@ -206,7 +206,7 @@ struct fb_overlay_decouple { }; struct fb_overlay_buffer { /* Input */ - unsigned int layer_id; + int layer_id; unsigned int layer_en; int ion_fd; unsigned int cache_sync; diff --git a/drivers/misc/mediatek/videocodec/mt8127/Makefile b/drivers/misc/mediatek/videocodec/mt8127/Makefile index d79240db5d9..a4d8743a26d 100755 --- a/drivers/misc/mediatek/videocodec/mt8127/Makefile +++ b/drivers/misc/mediatek/videocodec/mt8127/Makefile @@ -5,9 +5,6 @@ vcodec_kernel_driver-objs := \ common/val/src/val.o \ common/drv/src/drv_base.o -ifeq ($(CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT),y) - ccflags-y += -DMTK_SEC_VIDEO_PATH_SUPPORT -endif obj-$(CONFIG_MTK_VIDEOCODEC_DRIVER) += vcodec_kernel_driver.o diff --git a/drivers/misc/mediatek/videocodec/mt8127/videocodec_kernel_driver.c b/drivers/misc/mediatek/videocodec/mt8127/videocodec_kernel_driver.c index 1faedf8e670..9b82203286a 100644 --- a/drivers/misc/mediatek/videocodec/mt8127/videocodec_kernel_driver.c +++ b/drivers/misc/mediatek/videocodec/mt8127/videocodec_kernel_driver.c @@ -93,7 +93,7 @@ static VAL_UINT32_T gu4VencPWRCounter = 0; //mutex : VencPWRLock static VAL_UINT32_T gu4VdecLockThreadId = 0; -//#define MT8127_VCODEC_DEBUG +// #define MT8127_VCODEC_DEBUG #ifdef MT8127_VCODEC_DEBUG #undef VCODEC_DEBUG #define VCODEC_DEBUG MFV_LOGE @@ -102,7 +102,6 @@ static VAL_UINT32_T gu4VdecLockThreadId = 0; #else #define VCODEC_DEBUG(...) #undef MFV_LOGD -//#define MFV_LOGD MFV_LOGE #define MFV_LOGD(...) #endif @@ -627,7 +626,25 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned disable_irq(MT_VDEC_IRQ_ID); } vdec_power_on(); +#ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT /* Morris Yang moved to TEE */ + if (rHWLock.bSecureInst == VAL_FALSE) { + if (request_irq + (MT_VDEC_IRQ_ID, (irq_handler_t) video_intr_dlr, + //IRQF_TRIGGER_RISING, VCODEC_DEVNAME, //35 + IRQF_TRIGGER_LOW, VCODEC_DEVNAME, //73 + NULL) < 0) { + MFV_LOGE + ("[MFV_DEBUG][ERROR] error to request dec irq\n"); + } else { + MFV_LOGD + ("[MFV_DEBUG] success to request dec irq\n"); + } + + /* enable_irq(MT_VDEC_IRQ_ID); */ + } +#else enable_irq(MT_VDEC_IRQ_ID); +#endif } else // Another one holding dec hw now { @@ -688,18 +705,12 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned else { FirstUseEncHW = 0; } - MFV_LOGD("[VCODEC_LOCKHW] ENC Use Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); mutex_unlock(&EncHWLockEventTimeoutLock); if (FirstUseEncHW == 1) { - eValRet = eVideoWaitEvent(&EncHWLockEvent, sizeof(VAL_EVENT_T)); - MFV_LOGD("[VCODEC_LOCKHW] [%d] Use Enc HW, wait event 1, ret[%d]!!\n", rHWLock.eDriverType,eValRet); + eValRet = eVideoWaitEvent(&EncHWLockEvent, sizeof(VAL_EVENT_T)); } - //MFV_LOGD("[VCODEC_LOCKHW] ENC Use Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - mutex_lock(&EncHWLockEventTimeoutLock); - //MFV_LOGD("[VCODEC_LOCKHW] ENC Use Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - if (EncHWLockEvent.u4TimeoutMs == 1) { EncHWLockEvent.u4TimeoutMs = 1000; @@ -717,37 +728,29 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned EncHWLockEvent.u4TimeoutMs = 1000; // Wait indefinitely } } - //MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - mutex_unlock(&EncHWLockEventTimeoutLock); - //MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); mutex_lock(&VencHWLock); // one process try to lock twice if (grVcodecEncHWLock.pvHandle == (VAL_VOID_T*)pmem_user_v2p_video((unsigned int)rHWLock.pvHandle)) { - MFV_LOGE("[WARNING] [VCODEC_LOCKHW] one encoder instance try to lock twice, may cause lock HW timeout!! instance = 0x%x, CurrentTID = %d, type:%d\n", + MFV_LOGE("[WARNING] one encoder instance try to lock twice, may cause lock HW timeout!! instance = 0x%x, CurrentTID = %d, type:%d\n", grVcodecEncHWLock.pvHandle, current->pid, rHWLock.eDriverType); } - //MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - mutex_unlock(&VencHWLock); - //MFV_LOGD("[VCODEC_LOCKHW] First[%d] Use Enc HW %d,line %d!!\n", FirstUseEncHW,rHWLock.eDriverType,__LINE__); if (FirstUseEncHW == 0) { eValRet = eVideoWaitEvent(&EncHWLockEvent, sizeof(VAL_EVENT_T)); - MFV_LOGD("[VCODEC_LOCKHW] [%d] Use Enc HW, wait[%d] event 2, ret[%d]!!\n", rHWLock.eDriverType, EncHWLockEvent.u4TimeoutMs, eValRet); } - MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); if (VAL_RESULT_INVALID_ISR == eValRet) { - MFV_LOGE("[ERROR][VCODEC_LOCKHW] First[%d] TimeOut, CurrentTID = %d,line %d\n", FirstUseEncHW, current->pid, __LINE__); + MFV_LOGE("[ERROR][VCODEC_LOCKHW] EncHWLockEvent TimeOut, CurrentTID = %d\n", current->pid); if (FirstUseEncHW != 1) { mutex_lock(&VencHWLock); if (grVcodecEncHWLock.pvHandle == 0) { - MFV_LOGE("[WARNING] VCODEC_LOCKHW maybe mediaserver restart before, please check!!\n"); + MFV_LOGE("[WARNING] maybe mediaserver restart before, please check!!\n"); } else { - MFV_LOGE("[WARNING] VCODEC_LOCKHW someone use HW, and check timeout value!! %d\n", u4VencLockTimeOutCount); + MFV_LOGE("[WARNING] someone use HW, and check timeout value!! %d\n", u4VencLockTimeOutCount); ++u4VencLockTimeOutCount; if (u4VencLockTimeOutCount > 30) { @@ -768,65 +771,34 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned } else if (VAL_RESULT_RESTARTSYS == eValRet) { - MFV_LOGD("[ERROR][VCODEC_LOCKHW] VAL_RESULT_RESTARTSYS Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); return -ERESTARTSYS; } - //MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Use Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); mutex_lock(&VencHWLock); - MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Use Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - if (grVcodecEncHWLock.pvHandle == 0) //No process use HW, so current process can use HW { - //MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Use Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - if (rHWLock.eDriverType == VAL_DRIVER_TYPE_H264_ENC || rHWLock.eDriverType == VAL_DRIVER_TYPE_JPEG_ENC) { grVcodecEncHWLock.pvHandle = (VAL_VOID_T*)pmem_user_v2p_video((unsigned int)rHWLock.pvHandle); - MFV_LOGD("[VCODEC_LOCKHW] No process use HW, so current process can use HW, handle = 0x%x\n", grVcodecEncHWLock.pvHandle); + MFV_LOGD("[LOG][VCODEC_LOCKHW] No process use HW, so current process can use HW, handle = 0x%x\n", grVcodecEncHWLock.pvHandle); grVcodecEncHWLock.eDriverType = rHWLock.eDriverType; eVideoGetTimeOfDay(&grVcodecEncHWLock.rLockedTime, sizeof(VAL_TIME_T)); - MFV_LOGD("VCODEC_LOCKHW No process use HW, so current process can use HW\n"); - MFV_LOGD("VCODEC_LOCKHW LockInstance = 0x%x CurrentTID = %d, rLockedTime(s, us) = %d, %d\n", + MFV_LOGD("No process use HW, so current process can use HW\n"); + MFV_LOGD("LockInstance = 0x%x CurrentTID = %d, rLockedTime(s, us) = %d, %d\n", grVcodecEncHWLock.pvHandle, current->pid, grVcodecEncHWLock.rLockedTime.u4Sec, grVcodecEncHWLock.rLockedTime.u4uSec); bLockedHW = VAL_TRUE; - if (rHWLock.eDriverType == VAL_DRIVER_TYPE_H264_ENC) - { - venc_power_on(); - } - #ifdef MTK_SEC_VIDEO_PATH_SUPPORT - MFV_LOGD("[VCODEC_LOCKHW] rHWLock.bSecureInst 0x%x\n", rHWLock.bSecureInst); - if (rHWLock.bSecureInst == VAL_FALSE) - { - MFV_LOGE("[VCODEC_LOCKHW] Request IR by type 0x%x\n", rHWLock.eDriverType); - if (request_irq(MT_VENC_IRQ_ID , (irq_handler_t)video_intr_dlr2, IRQF_TRIGGER_LOW, VCODEC_DEVNAME, NULL) < 0) - { - MFV_LOGE("[VCODEC_LOCKHW] ENC [MFV_DEBUG][ERROR] error to request enc irq\n"); - } - else - { - MFV_LOGD("[VCODEC_LOCKHW] ENC [MFV_DEBUG] success to request enc irq\n"); - } - //enable_irq(MT_VDEC_IRQ_ID); - } - #else if (rHWLock.eDriverType == VAL_DRIVER_TYPE_H264_ENC) { venc_power_on(); enable_irq(MT_VENC_IRQ_ID); } - #endif } - MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - } else //someone use HW, and check timeout value { - MFV_LOGD("[VCODEC_LOCKHW] LOCK hW Enc HW %d,line %d!!\n", rHWLock.eDriverType,__LINE__); - if (rHWLock.u4TimeoutMs == 0) { bLockedHW = VAL_FALSE; @@ -838,11 +810,11 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned u4TimeInterval = (((((rCurTime.u4Sec - grVcodecEncHWLock.rLockedTime.u4Sec) * 1000000) + rCurTime.u4uSec) - grVcodecEncHWLock.rLockedTime.u4uSec) / 1000); - MFV_LOGD("VCODEC_LOCKHW someone use enc HW, and check timeout value\n"); - MFV_LOGD("VCODEC_LOCKHW LockInstance = 0x%x, CurrentInstance = 0x%x, CurrentTID = %d, TimeInterval(ms) = %d, TimeOutValue(ms)) = %d\n", + MFV_LOGD("someone use enc HW, and check timeout value\n"); + MFV_LOGD("LockInstance = 0x%x, CurrentInstance = 0x%x, CurrentTID = %d, TimeInterval(ms) = %d, TimeOutValue(ms)) = %d\n", grVcodecEncHWLock.pvHandle, pmem_user_v2p_video((unsigned int)rHWLock.pvHandle), current->pid, u4TimeInterval, rHWLock.u4TimeoutMs); - MFV_LOGD("VCODEC_LOCKHW LockInstance = 0x%x, CurrentInstance = 0x%x, CurrentTID = %d, rLockedTime(s, us) = %d, %d, rCurTime(s, us) = %d, %d\n", + MFV_LOGD("LockInstance = 0x%x, CurrentInstance = 0x%x, CurrentTID = %d, rLockedTime(s, us) = %d, %d, rCurTime(s, us) = %d, %d\n", grVcodecEncHWLock.pvHandle, pmem_user_v2p_video((unsigned int)rHWLock.pvHandle), current->pid, grVcodecEncHWLock.rLockedTime.u4Sec, grVcodecEncHWLock.rLockedTime.u4uSec, rCurTime.u4Sec, rCurTime.u4uSec @@ -859,7 +831,7 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned grVcodecEncHWLock.eDriverType = rHWLock.eDriverType; eVideoGetTimeOfDay(&grVcodecEncHWLock.rLockedTime, sizeof(VAL_TIME_T)); - MFV_LOGD(" VCODEC_LOCKHW LockInstance = 0x%x, CurrentTID = %d, rLockedTime(s, us) = %d, %d\n", + MFV_LOGD("LockInstance = 0x%x, CurrentTID = %d, rLockedTime(s, us) = %d, %d\n", grVcodecEncHWLock.pvHandle, current->pid, grVcodecEncHWLock.rLockedTime.u4Sec, grVcodecEncHWLock.rLockedTime.u4uSec); bLockedHW = VAL_TRUE; @@ -873,7 +845,7 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned if (VAL_TRUE == bLockedHW) { - MFV_LOGE(" VCODEC_LOCKHW Lock ok grVcodecEncHWLock.pvHandle = 0x%x, va:%x, type:%d", grVcodecEncHWLock.pvHandle, (unsigned int)rHWLock.pvHandle, rHWLock.eDriverType); + MFV_LOGE("Lock ok grVcodecEncHWLock.pvHandle = 0x%x, va:%x, type:%d", grVcodecEncHWLock.pvHandle, (unsigned int)rHWLock.pvHandle, rHWLock.eDriverType); } mutex_unlock(&VencHWLock); } @@ -888,20 +860,20 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned gu4LockEncHWCount++; spin_unlock_irqrestore(&LockEncHWCountLock, ulFlagsLockHW); - MFV_LOGD("VCODEC_LOCKHW get locked - ObjId =%d\n", current->pid); + MFV_LOGD("get locked - ObjId =%d\n", current->pid); - MFV_LOGD("VCODEC_LOCKHW - tid = %d\n", current->pid); + MFV_LOGD("VCODEC_LOCKHWed - tid = %d\n", current->pid); } else { MFV_LOGE("[WARNING] VCODEC_LOCKHW Unknown instance\n"); return -EFAULT; } - MFV_LOGD("VCODEC_LOCKHW - tid = %d\n", current->pid); + MFV_LOGD("[MT8127] VCODEC_LOCKHW - tid = %d\n", current->pid); break; case VCODEC_UNLOCKHW: - MFV_LOGD("VCODEC_UNLOCKHW + tid = %d\n", current->pid); + MFV_LOGD("[MT8127] VCODEC_UNLOCKHW + tid = %d\n", current->pid); user_data_addr = (VAL_UINT8_T *)arg; ret = copy_from_user(&rHWLock, user_data_addr, sizeof(VAL_HW_LOCK_T)); if (ret) { @@ -909,7 +881,7 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned return -EFAULT; } - MFV_LOGD("VCODEC_UNLOCKHW eDriverType = %d\n", rHWLock.eDriverType); + MFV_LOGD("UNLOCKHW eDriverType = %d\n", rHWLock.eDriverType); eValRet = VAL_RESULT_INVALID_ISR; if (rHWLock.eDriverType == VAL_DRIVER_TYPE_MP4_DEC || rHWLock.eDriverType == VAL_DRIVER_TYPE_HEVC_DEC || @@ -920,13 +892,21 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned { grVcodecDecHWLock.pvHandle = 0; grVcodecDecHWLock.eDriverType = VAL_DRIVER_TYPE_NONE; +#ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT /* Morris Yang moved to TEE */ + if (rHWLock.bSecureInst == VAL_FALSE) { + /* disable_irq(MT_VDEC_IRQ_ID); */ + + free_irq(MT_VDEC_IRQ_ID, NULL); + } +#else disable_irq(MT_VDEC_IRQ_ID); +#endif // TODO: check if turning power off is ok vdec_power_off(); } else // Not current owner { - MFV_LOGD(" [ERROR] VCODEC_UNLOCKHW Not owner trying to unlock dec hardware 0x%x\n", pmem_user_v2p_video((unsigned int)rHWLock.pvHandle)); + MFV_LOGD("[ERROR] Not owner trying to unlock dec hardware 0x%x\n", pmem_user_v2p_video((unsigned int)rHWLock.pvHandle)); mutex_unlock(&VdecHWLock); return -EFAULT; } @@ -939,45 +919,31 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned mutex_lock(&VencHWLock); if (grVcodecEncHWLock.pvHandle == (VAL_VOID_T*)pmem_user_v2p_video((unsigned int)rHWLock.pvHandle)) // Current owner give up hw lock { - MFV_LOGD("VCODEC_UNLOCKHW match handle\n"); grVcodecEncHWLock.pvHandle = 0; grVcodecEncHWLock.eDriverType = VAL_DRIVER_TYPE_NONE; - #ifdef MTK_SEC_VIDEO_PATH_SUPPORT - if (rHWLock.eDriverType == VAL_DRIVER_TYPE_H264_ENC) - { - if (rHWLock.bSecureInst == VAL_FALSE) - { - free_irq(MT_VENC_IRQ_ID , NULL); - } - venc_power_off(); - } - #else if (rHWLock.eDriverType == VAL_DRIVER_TYPE_H264_ENC) { disable_irq(MT_VENC_IRQ_ID); // turn venc power off venc_power_off(); } - #endif } else // Not current owner { // [TODO] error handling - MFV_LOGE("[ERROR] VCODEC_UNLOCKHW Not owner trying to unlock enc hardware 0x%x, pa:%x, va:%x type:%d\n", grVcodecEncHWLock.pvHandle, pmem_user_v2p_video((unsigned int)rHWLock.pvHandle), (unsigned int)rHWLock.pvHandle, rHWLock.eDriverType); + MFV_LOGE("[ERROR] Not owner trying to unlock enc hardware 0x%x, pa:%x, va:%x type:%d\n", grVcodecEncHWLock.pvHandle, pmem_user_v2p_video((unsigned int)rHWLock.pvHandle), (unsigned int)rHWLock.pvHandle, rHWLock.eDriverType); mutex_unlock(&VencHWLock); return -EFAULT; } mutex_unlock(&VencHWLock); - eValRet = eVideoSetEvent(&EncHWLockEvent, sizeof(VAL_EVENT_T)); - MFV_LOGE("VCODEC_UNLOCKHW ENC Set event ret %d\n", eValRet); } else { MFV_LOGE("[WARNING] VCODEC_UNLOCKHW Unknown instance\n"); return -EFAULT; } - MFV_LOGD("VCODEC_UNLOCKHW - tid = %d\n", current->pid); + MFV_LOGD("[MT8127] VCODEC_UNLOCKHW - tid = %d\n", current->pid); break; case VCODEC_INC_PWR_USER: @@ -1169,8 +1135,9 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned case VCODEC_GET_CPU_LOADING_INFO: { VAL_UINT8_T *user_data_addr, cpu_id; - VAL_VCODEC_CPU_LOADING_INFO_T _temp = {0}; + VAL_VCODEC_CPU_LOADING_INFO_T _temp; + memset(&_temp, 0x0, sizeof(VAL_VCODEC_CPU_LOADING_INFO_T)); MFV_LOGD("[MT8127] VCODEC_GET_CPU_LOADING_INFO +\n"); user_data_addr = (VAL_UINT8_T *)arg; // TODO: @@ -1206,7 +1173,7 @@ static long vcodec_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned MFV_LOGE("[ERROR] VCODEC_GET_CORE_LOADING, copy_from_user failed: %d\n", ret); return -EFAULT; } - rTempCoreLoading.Loading = get_cpu_load(rTempCoreLoading.CPUid); + rTempCoreLoading.Loading = 0; // Never used on this platform, always return 0 ret = copy_to_user(user_data_addr, &rTempCoreLoading, sizeof(VAL_VCODEC_CORE_LOADING_T)); if (ret) { MFV_LOGE("[ERROR] VCODEC_GET_CORE_LOADING, copy_to_user failed: %d\n", ret); @@ -1630,6 +1597,8 @@ static int vcodec_probe(struct platform_device *dev) vcodec_device = device_create(vcodec_class, NULL, vcodec_devno, NULL, VCODEC_DEVNAME); + #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT + #else if (request_irq(MT_VDEC_IRQ_ID , (irq_handler_t)video_intr_dlr, IRQF_TRIGGER_LOW, VCODEC_DEVNAME, NULL) < 0) { MFV_LOGD("[VCODEC_DEBUG][ERROR] error to request dec irq\n"); @@ -1638,24 +1607,22 @@ static int vcodec_probe(struct platform_device *dev) { MFV_LOGD("[VCODEC_DEBUG] success to request dec irq\n"); } -#ifdef MTK_SEC_VIDEO_PATH_SUPPORT - MFV_LOGD("[VCODEC_DEBUG] CONFIG_SEC_VIDEO_PATH_SUPPORT not request enc irq\n"); -#else + #endif + if (request_irq(MT_VENC_IRQ_ID , (irq_handler_t)video_intr_dlr2, IRQF_TRIGGER_LOW, VCODEC_DEVNAME, NULL) < 0) { - MFV_LOGE("[VCODEC_DEBUG][ERROR] error to request enc irq\n"); + MFV_LOGD("[VCODEC_DEBUG][ERROR] error to request enc irq\n"); } else { MFV_LOGD("[VCODEC_DEBUG] success to request enc irq\n"); } -#endif + #ifdef CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT + #else disable_irq(MT_VDEC_IRQ_ID); -#ifdef MTK_SEC_VIDEO_PATH_SUPPORT -#else + #endif disable_irq(MT_VENC_IRQ_ID); -#endif MFV_LOGD("[VCODEC_DEBUG] vcodec_probe Done\n"); diff --git a/drivers/misc/mediatek/wdk/wd_common_drv.c b/drivers/misc/mediatek/wdk/wd_common_drv.c index 51c1bf48f30..aecc3081e90 100644 --- a/drivers/misc/mediatek/wdk/wd_common_drv.c +++ b/drivers/misc/mediatek/wdk/wd_common_drv.c @@ -331,18 +331,18 @@ static int kwdt_thread(void *arg) /* only process WDT info if thread-x is on cpu-x */ spin_lock(&lock); local_bit = kick_bit; - printk_deferred("[WDK], local_bit:0x%x, cpu:%d,RT[%lld]\n", local_bit, - cpu, sched_clock()); + /*printk_deferred("[WDK], local_bit:0x%x, cpu:%d,RT[%lld]\n", local_bit, + cpu, sched_clock());*/ if ((local_bit & (1 << cpu)) == 0) { /* printk("[WDK]: set WDT kick_bit\n"); */ local_bit |= (1 << cpu); /* aee_rr_rec_wdk_kick_jiffies(jiffies); */ } - printk_deferred("[WDK], local_bit:0x%x, cpu:%d, check bit0x:%x,RT[%lld]\n", - local_bit, cpu, wk_check_kick_bit(), sched_clock()); + /*printk_deferred("[WDK], local_bit:0x%x, cpu:%d, check bit0x:%x,RT[%lld]\n", + local_bit, cpu, wk_check_kick_bit(), sched_clock());*/ if (local_bit == wk_check_kick_bit()) { - printk_deferred("[WDK]: kick Ex WDT,RT[%lld]\n", - sched_clock()); + /*printk_deferred("[WDK]: kick Ex WDT,RT[%lld]\n", + sched_clock());*/ mtk_wdt_restart(WD_TYPE_NORMAL); /* for KICK external wdt */ local_bit = 0; } @@ -350,8 +350,8 @@ static int kwdt_thread(void *arg) spin_unlock(&lock); #ifdef CONFIG_LOCAL_WDT - printk_deferred("[WDK]: cpu:%d, kick local wdt,RT[%lld]\n", cpu, - sched_clock()); + /*printk_deferred("[WDK]: cpu:%d, kick local wdt,RT[%lld]\n", cpu, + sched_clock());*/ /* kick local wdt */ mpcore_wdt_restart(WD_TYPE_NORMAL); #endif @@ -373,12 +373,12 @@ static int kwdt_thread(void *arg) rtc_time_to_tm(tv.tv_sec, &tm); tv_android.tv_sec -= sys_tz.tz_minuteswest * 60; rtc_time_to_tm(tv_android.tv_sec, &tm_android); - printk_deferred("[thread:%d][RT:%lld] %d-%02d-%02d %02d:%02d:%02d.%u UTC; android time %d-%02d-%02d %02d:%02d:%02d.%03d\n", + /*printk_deferred("[thread:%d][RT:%lld] %d-%02d-%02d %02d:%02d:%02d.%u UTC; android time %d-%02d-%02d %02d:%02d:%02d.%03d\n", current->pid, sched_clock(), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (unsigned int)tv.tv_usec, tm_android.tm_year + 1900, tm_android.tm_mon + 1, tm_android.tm_mday, tm_android.tm_hour, tm_android.tm_min, tm_android.tm_sec, - (unsigned int)tv_android.tv_usec); + (unsigned int)tv_android.tv_usec);*/ } msleep((g_kinterval) * 1000); @@ -626,6 +626,7 @@ static int __init init_wk(void) wk_proc_init(); register_cpu_notifier(&cpu_nfb); + mtk_wdt_restart(WD_TYPE_NORMAL); printk("[WDK] init_wk done\n"); return 0; } diff --git a/drivers/misc/mediatek/wdt/mt8127/mtk_wdt.c b/drivers/misc/mediatek/wdt/mt8127/mtk_wdt.c index 39b82509c5f..7dc3e82e3c1 100644 --- a/drivers/misc/mediatek/wdt/mt8127/mtk_wdt.c +++ b/drivers/misc/mediatek/wdt/mt8127/mtk_wdt.c @@ -46,7 +46,7 @@ extern void aee_wdt_printf(const char *fmt, ...); * IRQ ID *--------------------------------------------------------------------*/ #define AP_RGU_WDT_IRQ_ID MT_WDT_IRQ_ID -#define CONFIG_KICK_SPM_WDT +/* #define CONFIG_KICK_SPM_WDT */ /* * internal variables diff --git a/drivers/misc/mediatek/xlog/xlog_filter.c b/drivers/misc/mediatek/xlog/xlog_filter.c index 93bd6f99a1c..2778fda180c 100644 --- a/drivers/misc/mediatek/xlog/xlog_filter.c +++ b/drivers/misc/mediatek/xlog/xlog_filter.c @@ -175,7 +175,7 @@ static int xLog_fault(struct vm_area_struct *vma, struct vm_fault *vmf) unsigned long offset; offset = (((unsigned long)vmf->virtual_address - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT)); - if (offset > PAGE_SIZE << 4) + if (offset > PAGE_SIZE << 1) goto nopage_out; page = virt_to_page(xLogMem + offset); vmf->page = page; @@ -205,6 +205,8 @@ static int xlog_release(struct inode *ignored, struct file *file) static int xlog_mmap(struct file *file, struct vm_area_struct *vma) { + if ((vma->vm_end - vma->vm_start) != PAGE_SIZE) + return -1; vma->vm_ops = &xLog_vmops; vma->vm_flags |= VM_IO; vma->vm_private_data = file->private_data; @@ -363,7 +365,7 @@ static void __exit xlog_exit(void) { int err; - free_pages((long unsigned)xLogMem, 4); + free_pages((long unsigned)xLogMem, 1); err = misc_deregister(&xlog_dev); if (unlikely(err)) diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 0513ea0906d..99cc0b07a71 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c @@ -71,7 +71,7 @@ static int mei_cl_device_probe(struct device *dev) dev_dbg(dev, "Device probe\n"); - strlcpy(id.name, dev_name(dev), sizeof(id.name)); + strncpy(id.name, dev_name(dev), MEI_CL_NAME_SIZE); return driver->probe(device, &id); } diff --git a/drivers/misc/mei/nfc.c b/drivers/misc/mei/nfc.c index 1f8f856946c..4b7ea3fb143 100644 --- a/drivers/misc/mei/nfc.c +++ b/drivers/misc/mei/nfc.c @@ -292,7 +292,7 @@ static int mei_nfc_if_version(struct mei_nfc_dev *ndev) return -ENOMEM; bytes_recv = __mei_cl_recv(cl, (u8 *)reply, if_version_length); - if (bytes_recv < if_version_length) { + if (bytes_recv < 0 || bytes_recv < sizeof(struct mei_nfc_reply)) { dev_err(&dev->pdev->dev, "Could not read IF version\n"); ret = -EIO; goto err; diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index f2eeb38efa6..a4432c8a512 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -27,4 +27,8 @@ source "drivers/mmc/card/Kconfig" source "drivers/mmc/host/Kconfig" +config MTK_STORAGE_PERF_LOGGING + bool "MTK storage perf log" + default n + endif # MMC diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index f348786c978..4c66b2553ab 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -63,14 +63,6 @@ #define MET_USER_EVENT_SUPPORT #include -#define FEATURE_STORAGE_PERF_INDEX -//enable storage log in user load -#if 0 -#ifdef USER_BUILD_KERNEL -#undef FEATURE_STORAGE_PERF_INDEX -#endif -#endif - MODULE_ALIAS("mmc:block"); #ifdef MODULE_PARAM_PREFIX #undef MODULE_PARAM_PREFIX @@ -85,7 +77,8 @@ MODULE_ALIAS("mmc:block"); #define INAND_CMD38_ARG_SECTRIM2 0x88 #define MMC_BLK_TIMEOUT_MS (10 * 60 * 1000) /* 10 minute timeout */ -#define mmc_req_rel_wr(req) ((req->cmd_flags & REQ_FUA) && \ +#define mmc_req_rel_wr(req) (((req->cmd_flags & REQ_FUA) || \ + (req->cmd_flags & REQ_META)) && \ (rq_data_dir(req) == WRITE)) #define PACKED_CMD_VER 0x01 #define PACKED_CMD_WR 0x02 @@ -555,8 +548,6 @@ static ssize_t power_ro_lock_show(struct device *dev, ret = snprintf(buf, PAGE_SIZE, "%d\n", locked); - mmc_blk_put(md); - return ret; } @@ -612,7 +603,7 @@ static ssize_t force_ro_show(struct device *dev, struct device_attribute *attr, int ret; struct mmc_blk_data *md = mmc_blk_get(dev_to_disk(dev)); - ret = snprintf(buf, PAGE_SIZE, "%d\n", + ret = snprintf(buf, PAGE_SIZE, "%d", get_disk_ro(dev_to_disk(dev)) ^ md->read_only); mmc_blk_put(md); @@ -808,6 +799,15 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, cmd.arg = idata->ic.arg; cmd.flags = idata->ic.flags; + if (is_rpmb) { + switch (cmd.opcode) { + case MMC_READ_MULTIPLE_BLOCK: + case MMC_WRITE_MULTIPLE_BLOCK: + cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; + break; + } + } + if (idata->buf_bytes) { data.sg = &sg; data.sg_len = 1; @@ -1256,8 +1256,28 @@ static int mmc_blk_reset(struct mmc_blk_data *md, struct mmc_host *host, { int err; - if (md->reset_done & type) + if (md->reset_done & type) { +#ifdef CONFIG_MMC_ERR_REMOVE + /* + * some SD cards may keep reporting data read timeout error, + * even after power cycle card, still get data read timeout, + * in this case, make the card removed. + * go here means that has alreay done one time reset but still + * got the same error. + */ + if (!(host->caps & MMC_CAP_NONREMOVABLE)) { + if (host->rest_remove_flags) { + pr_err("%s: card reset failed again, remove card." + "CMD type is %d\n", __func__, type); + mmc_detect_change(host, 0); + return -EEXIST; + } + + host->rest_remove_flags = true; + } else +#endif return -EEXIST; + } md->reset_done |= type; err = mmc_hw_reset(host); @@ -1284,18 +1304,6 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type) md->reset_done &= ~type; } -int mmc_access_rpmb(struct mmc_queue *mq) -{ - struct mmc_blk_data *md = mq->data; - /* - * If this is a RPMB partition access, return ture - */ - if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB) - return true; - - return false; -} - static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) { struct mmc_blk_data *md = mq->data; @@ -1344,10 +1352,10 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq, { struct mmc_blk_data *md = mq->data; struct mmc_card *card = md->queue.card; - unsigned int from, nr, arg, trim_arg, erase_arg; + unsigned int from, nr, arg; int err = 0, type = MMC_BLK_SECDISCARD; - if (!(mmc_can_secure_erase_trim(card) || mmc_can_sanitize(card))) { + if (!(mmc_can_secure_erase_trim(card))) { err = -EOPNOTSUPP; goto out; } @@ -1355,23 +1363,11 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq, from = blk_rq_pos(req); nr = blk_rq_sectors(req); - /* The sanitize operation is supported at v4.5 only */ - if (mmc_can_sanitize(card)) { - erase_arg = MMC_ERASE_ARG; - trim_arg = MMC_TRIM_ARG; - } else { - erase_arg = MMC_SECURE_ERASE_ARG; - trim_arg = MMC_SECURE_TRIM1_ARG; - } + if (mmc_can_trim(card) && !mmc_erase_group_aligned(card, from, nr)) + arg = MMC_SECURE_TRIM1_ARG; + else + arg = MMC_SECURE_ERASE_ARG; - if (mmc_erase_group_aligned(card, from, nr)) - arg = erase_arg; - else if (mmc_can_trim(card)) - arg = trim_arg; - else { - err = -EINVAL; - goto out; - } retry: if (card->quirks & MMC_QUIRK_INAND_CMD38) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, @@ -1407,12 +1403,6 @@ retry: goto out; } - if (mmc_can_sanitize(card)) { - trace_mmc_blk_erase_start(EXT_CSD_SANITIZE_START, 0, 0); - err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_SANITIZE_START, 1, 0); - trace_mmc_blk_erase_end(EXT_CSD_SANITIZE_START, 0, 0); - } out_retry: if (err && !mmc_blk_reset(md, card->host, type)) goto retry; @@ -1677,9 +1667,13 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, /* * Reliable writes are used to implement Forced Unit Access and - * are supported only on MMCs. + * REQ_META accesses, and are supported only on MMCs. + * + * XXX: this really needs a good explanation of why REQ_META + * is treated special. */ - bool do_rel_wr = (req->cmd_flags & REQ_FUA) && + bool do_rel_wr = ((req->cmd_flags & REQ_FUA) || + (req->cmd_flags & REQ_META)) && (rq_data_dir(req) == WRITE) && (md->flags & MMC_BLK_REL_WR); @@ -1973,8 +1967,8 @@ static void mmc_blk_packed_hdr_wrq_prep(struct mmc_queue_req *mqrq, packed_cmd_hdr = packed->cmd_hdr; memset(packed_cmd_hdr, 0, sizeof(packed->cmd_hdr)); - packed_cmd_hdr[0] = cpu_to_le32((packed->nr_entries << 16) | - (PACKED_CMD_WR << 8) | PACKED_CMD_VER); + packed_cmd_hdr[0] = (packed->nr_entries << 16) | + (PACKED_CMD_WR << 8) | PACKED_CMD_VER; hdr_blocks = mmc_large_sector(card) ? 8 : 1; /* @@ -1988,14 +1982,14 @@ static void mmc_blk_packed_hdr_wrq_prep(struct mmc_queue_req *mqrq, ((brq->data.blocks * brq->data.blksz) >= card->ext_csd.data_tag_unit_size); /* Argument of CMD23 */ - packed_cmd_hdr[(i * 2)] = cpu_to_le32( + packed_cmd_hdr[(i * 2)] = (do_rel_wr ? MMC_CMD23_ARG_REL_WR : 0) | (do_data_tag ? MMC_CMD23_ARG_TAG_REQ : 0) | - blk_rq_sectors(prq)); + blk_rq_sectors(prq); /* Argument of CMD18 or CMD25 */ - packed_cmd_hdr[((i * 2)) + 1] = cpu_to_le32( + packed_cmd_hdr[((i * 2)) + 1] = mmc_card_blockaddr(card) ? - blk_rq_pos(prq) : blk_rq_pos(prq) << 9); + blk_rq_pos(prq) : blk_rq_pos(prq) << 9; packed->blocks += blk_rq_sectors(prq); i++; } @@ -2485,11 +2479,9 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) break; case MMC_BLK_CMD_ERR: ret = mmc_blk_cmd_err(md, card, brq, req, ret); - if (mmc_blk_reset(md, card->host, type)) - goto cmd_abort; - if (!ret) - goto start_new_req; - break; + if (!mmc_blk_reset(md, card->host, type)) + break; + goto cmd_abort; case MMC_BLK_RETRY: if (retry++ < 5) break; @@ -2782,8 +2774,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, set_capacity(md->disk, size); if (mmc_host_cmd23(card->host)) { - if ((mmc_card_mmc(card) && - card->csd.mmca_vsn >= CSD_SPEC_VER_3) || + if (mmc_card_mmc(card) || (mmc_card_sd(card) && card->scr.cmds & SD_SCR_CMD23_SUPPORT)) md->flags |= MMC_BLK_CMD23; @@ -3028,12 +3019,11 @@ static const struct mmc_fixup blk_fixups[] = MMC_QUIRK_BLK_NO_CMD23), /* - * Some MMC cards need longer data read timeout than indicated in CSD. + * Some Micron MMC cards needs longer data read timeout than + * indicated in CSD. */ MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc, MMC_QUIRK_LONG_READ_TIME), - MMC_FIXUP("008GE0", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc, - MMC_QUIRK_LONG_READ_TIME), /* * On these Samsung MoviNAND parts, performing secure erase or @@ -3077,12 +3067,13 @@ static const struct mmc_fixup blk_fixups[] = MMC_FIXUP(CID_NAME_ANY, CID_MANFID_KSI, CID_OEMID_ANY, add_quirk_mmc_ksi_v03_skip_trim, MMC_QUIRK_KSI_V03_SKIP_TRIM), +#ifdef CONFIG_MMC_SAMSUNG_SMART + MMC_FIXUP(CID_NAME_ANY, CID_MANFID_SAMSUNG, CID_OEMID_ANY, + add_quirk_mmc, MMC_QUIRK_SAMSUNG_SMART), +#endif /* CONFIG_MMC_SAMSUNG_SMART */ END_FIXUP }; -#if defined(CONFIG_MTK_EMMC_SUPPORT) && !defined(CONFIG_MTK_GPT_SCHEME_SUPPORT) - extern void emmc_create_sys_symlink (struct mmc_card *card); -#endif static int mmc_blk_probe(struct mmc_card *card) { struct mmc_blk_data *md, *part_md; @@ -3122,9 +3113,6 @@ static int mmc_blk_probe(struct mmc_card *card) if (mmc_add_disk(part_md)) goto out; } -#if defined(CONFIG_MTK_EMMC_SUPPORT) && !defined(CONFIG_MTK_GPT_SCHEME_SUPPORT) - emmc_create_sys_symlink(card); -#endif return 0; out: diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c index abad0b49bd7..759714ed6be 100644 --- a/drivers/mmc/card/mmc_test.c +++ b/drivers/mmc/card/mmc_test.c @@ -795,7 +795,7 @@ static int mmc_test_nonblock_transfer(struct mmc_test_card *test, struct mmc_async_req *cur_areq = &test_areq[0].areq; struct mmc_async_req *other_areq = &test_areq[1].areq; int i; - int ret = RESULT_OK; + int ret; test_areq[0].test = test; test_areq[1].test = test; diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 67526843ef4..cac447f08fc 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -37,7 +37,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req) return BLKPREP_KILL; } - if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq))) + if (mq && mmc_card_removed(mq->card)) return BLKPREP_KILL; req->cmd_flags |= REQ_DONTPREP; diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index 99e6521e616..5752d50049a 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -73,6 +73,4 @@ extern void mmc_queue_bounce_post(struct mmc_queue_req *); extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *); extern void mmc_packed_clean(struct mmc_queue *); -extern int mmc_access_rpmb(struct mmc_queue *); - #endif diff --git a/drivers/mmc/core/Kconfig b/drivers/mmc/core/Kconfig index ae10a372af0..810aac1755e 100644 --- a/drivers/mmc/core/Kconfig +++ b/drivers/mmc/core/Kconfig @@ -41,3 +41,16 @@ config MMC_PARANOID_SD_INIT about re-trying SD init requests. This can be a useful work-around for buggy controllers and hardware. Enable if you are experiencing issues with SD detection. + +config MMC_SAMSUNG_SMART + bool "Make Samsung Smart Report available in sysfs" + help + If you say Y here, code will be added to retrieve the Smart + Report from Samsung e-MMC cards and make it available via sysfs. + +config MMC_ERR_REMOVE + bool "SD Card will be removed if SD card keeps reporting error" + default n + help + If you say Y here, when SD card still keep reporting error after being + reseted twice, SD card will be removed. diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 8c2d2590e46..8069c389a20 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -36,12 +36,6 @@ #include #include -#define FEATURE_STORAGE_PERF_INDEX - -#ifdef USER_BUILD_KERNEL -#undef FEATURE_STORAGE_PERF_INDEX -#endif - #include "core.h" #include "bus.h" #include "host.h" @@ -352,10 +346,8 @@ EXPORT_SYMBOL(mmc_start_bkops); */ static void mmc_wait_data_done(struct mmc_request *mrq) { - struct mmc_context_info *context_info = &mrq->host->context_info; - - context_info->is_done_rcv = true; - wake_up_interruptible(&context_info->wait); + mrq->host->context_info.is_done_rcv = true; + wake_up_interruptible(&mrq->host->context_info.wait); } static void mmc_wait_done(struct mmc_request *mrq) @@ -1154,11 +1146,11 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card) /* * Some cards require longer data read timeout than indicated in CSD. * Address this by setting the read timeout to a "reasonably high" - * value. For the cards tested, 600ms has proven enough. If necessary, + * value. For the cards tested, 300ms has proven enough. If necessary, * this value can be increased if other problematic cards require this. */ if (mmc_card_long_read_time(card) && data->flags & MMC_DATA_READ) { - data->timeout_ns = 600000000; + data->timeout_ns = 300000000; data->timeout_clks = 0; } @@ -2800,6 +2792,13 @@ void mmc_rescan(struct work_struct *work) goto out; } +#ifdef CONFIG_MMC_ERR_REMOVE + if (host->rest_remove_flags) { + mmc_bus_put(host); + goto out; + } +#endif + /* * Only we can add a new handler, so it's safe to * release the lock here. diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index e3122e157b9..8cb652f9ac3 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -482,6 +482,10 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) mutex_init(&host->slot.lock); host->slot.cd_irq = -EINVAL; +#ifdef CONFIG_MMC_ERR_REMOVE + host->rest_remove_flags = false; +#endif + spin_lock_init(&host->lock); init_waitqueue_head(&host->wq); wake_lock_init(&host->detect_wake_lock, WAKE_LOCK_SUSPEND, diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index f03d8fa776f..4804ea3112f 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -272,9 +272,6 @@ static void mmc_select_card_type(struct mmc_card *card) card->ext_csd.card_type = card_type; } -/* Minimum partition switch timeout in milliseconds */ -#define MMC_MIN_PART_SWITCH_TIME 300 - /* * Decode extended CSD. */ @@ -303,7 +300,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) } card->ext_csd.rev = ext_csd[EXT_CSD_REV]; - if (card->ext_csd.rev > 7) { + if (card->ext_csd.rev > 8) { pr_err("%s: unrecognised EXT_CSD revision %d\n", mmc_hostname(card->host), card->ext_csd.rev); err = -EINVAL; @@ -340,10 +337,6 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) /* EXT_CSD value is in units of 10ms, but we store in ms */ card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; - /* Some eMMC set the value too low so set a minimum */ - if (card->ext_csd.part_time && - card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) - card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; /* Sleep / awake timeout in 100ns units */ if (sa_shift > 0 && sa_shift <= 0x17) @@ -638,6 +631,21 @@ out: return err; } +#ifdef CONFIG_MMC_SAMSUNG_SMART +static ssize_t mmc_samsung_smart(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mmc_card *card = mmc_dev_to_card(dev); + + if (card->quirks & MMC_QUIRK_SAMSUNG_SMART) + return mmc_samsung_smart_handle(card, buf); + + /* There is no information available for this card. */ + return 0; +} +static DEVICE_ATTR(samsung_smart, S_IRUGO, mmc_samsung_smart, NULL); +#endif /* CONFIG_MMC_SAMSUNG_SMART */ + MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1], card->raw_cid[2], card->raw_cid[3]); MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1], @@ -675,6 +683,9 @@ static struct attribute *mmc_std_attrs[] = { &dev_attr_enhanced_area_size.attr, &dev_attr_raw_rpmb_size_mult.attr, &dev_attr_rel_sectors.attr, +#ifdef CONFIG_MMC_SAMSUNG_SMART + &dev_attr_samsung_smart.attr, +#endif /* CONFIG_MMC_SAMSUNG_SMART */ NULL, }; diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index 498cc56ffe5..39ba6e27d25 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -640,3 +640,222 @@ int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status) return 0; } + +#ifdef CONFIG_MMC_SAMSUNG_SMART +/* + * Vendor-specific Samsung BACK-DOOR command + */ +static int mmc_movi_vendor_cmd(struct mmc_card *card, unsigned int arg) +{ + struct mmc_command cmd; + int err; + u32 status; + + /* CMD62 is vendor CMD, it's not defined in eMMC spec. */ + cmd.opcode = 62; + cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; + cmd.arg = arg; + cmd.error = 0; + + err = mmc_wait_for_cmd(card->host, &cmd, 0); + if (err) + return err; + + do { + err = mmc_send_status(card, &status); + if (err) + return err; + if (card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) + break; + if (mmc_host_is_spi(card->host)) + break; + } while (R1_CURRENT_STATE(status) == R1_STATE_PRG); + + return err; +} + +static int mmc_movi_read_cmd(struct mmc_card *card, u8 *buffer) +{ + struct mmc_command wcmd; + struct mmc_data wdata; + struct mmc_request brq; + struct scatterlist sg; + + brq.cmd = &wcmd; + brq.data = &wdata; + brq.stop = NULL; + brq.sbc = NULL; + + wcmd.opcode = MMC_READ_SINGLE_BLOCK; + wcmd.arg = 0; + wcmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; + wcmd.error = 0; + wcmd.retries = 0; + wdata.blksz = 512; + wdata.error = 0; + wdata.stop = NULL; + wdata.blocks = 1; + wdata.flags = MMC_DATA_READ; + + wdata.sg = &sg; + wdata.sg_len = 1; + + sg_init_one(&sg, buffer, 512); + + mmc_set_data_timeout(&wdata, card); + + mmc_wait_for_req(card->host, &brq); + if (wcmd.error) + return wcmd.error; + if (wdata.error) + return wdata.error; + return 0; +} + +static int mmc_samsung_smart_read(struct mmc_card *card, u8 *rdblock) +{ + int err, errx; + + /* enter vendor Smart Report mode */ + err = mmc_movi_vendor_cmd(card, 0xEFAC62EC); + if (err) { + pr_err("Failed entering Smart Report mode(1, %d)\n", err); + return err; + } + err = mmc_movi_vendor_cmd(card, 0x0000CCEE); + if (err) { + pr_err("Failed entering Smart Report mode(2, %d)\n", err); + return err; + } + + /* read Smart Report */ + err = mmc_movi_read_cmd(card, rdblock); + if (err) + pr_err("Failed reading Smart Report(%d)\n", err); + /* Do NOT return yet; we must leave Smart Report mode.*/ + + /* exit vendor Smart Report mode */ + errx = mmc_movi_vendor_cmd(card, 0xEFAC62EC); + if (errx) + pr_err("Failed exiting Smart Report mode(1, %d)\n", errx); + else { + errx = mmc_movi_vendor_cmd(card, 0x00DECCEE); + if (errx) + pr_err("Failed exiting Smart Report mode(2, %d)\n", + errx); + } + if (err) + return err; + return errx; +} + +ssize_t mmc_samsung_smart_parse(u32 *report, char *for_sysfs) +{ + unsigned size = PAGE_SIZE; + unsigned wrote; + unsigned i; + u32 val; + char *str; + static const struct { + char *fmt; + unsigned val_index; + } to_output[] = { + { "super block size : %u\n", 1 }, + { "super page size : %u\n", 2 }, + { "optimal write size : %u\n", 3 }, + { "read reclaim count : %u\n", 20 }, + { "optimal trim size : %u\n", 21 }, + { "number of banks : %u\n", 4 }, + { "initial bad blocks per bank : %u", 5 }, + { ",%u", 8 }, + { ",%u", 11 }, + { ",%u\n", 14 }, + { "runtime bad blocks per bank : %u", 6 }, + { ",%u", 9 }, + { ",%u", 12 }, + { ",%u\n", 15 }, + { "reserved blocks left per bank : %u", 7 }, + { ",%u", 10 }, + { ",%u", 13 }, + { ",%u\n", 16 }, + { "all erase counts (min,avg,max): %u", 18 }, + { ",%u", 19 }, + { ",%u\n", 17 }, + { "SLC erase counts (min,avg,max): %u", 31 }, + { ",%u", 32 }, + { ",%u\n", 30 }, + { "MLC erase counts (min,avg,max): %u", 34 }, + { ",%u", 35 }, + { ",%u\n", 33 }, + }; + + /* A version field just in case things change. */ + wrote = scnprintf(for_sysfs, size, + "version : %u\n", 0); + size -= wrote; + for_sysfs += wrote; + + /* The error mode. */ + val = le32_to_cpu(report[0]); + switch (val) { + case 0xD2D2D2D2: + str = "Normal"; + break; + case 0x5C5C5C5C: + str = "RuntimeFatalError"; + break; + case 0xE1E1E1E1: + str = "MetaBrokenError"; + break; + case 0x37373737: + str = "OpenFatalError"; + val = 0; /* Remaining data is unreliable. */ + break; + default: + str = "Invalid"; + val = 0; /* Remaining data is unreliable. */ + break; + } + wrote = scnprintf(for_sysfs, size, + "error mode : %s\n", str); + size -= wrote; + for_sysfs += wrote; + /* Exit if we can't rely on the remaining data. */ + if (!val) + return PAGE_SIZE - size; + + for (i = 0; i < ARRAY_SIZE(to_output); i++) { + wrote = scnprintf(for_sysfs, size, to_output[i].fmt, + le32_to_cpu(report[to_output[i].val_index])); + size -= wrote; + for_sysfs += wrote; + } + + return PAGE_SIZE - size; +} + +ssize_t mmc_samsung_smart_handle(struct mmc_card *card, char *buf) +{ + int err; + u32 *buffer; + ssize_t len; + + buffer = kmalloc(512, GFP_KERNEL); + if (!buffer) { + pr_err("Failed to alloc memory for Smart Report\n"); + return 0; + } + + mmc_claim_host(card->host); + err = mmc_samsung_smart_read(card, (u8 *)buffer); + mmc_release_host(card->host); + + if (err) + len = 0; + else + len = mmc_samsung_smart_parse(buffer, buf); + + kfree(buffer); + return len; +} +#endif /* CONFIG_MMC_SAMSUNG_SMART */ diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index b73849148d7..c9f93ecd28e 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -45,6 +45,13 @@ static const unsigned int tacc_mant[] = { 35, 40, 45, 50, 55, 60, 70, 80, }; +static const unsigned int sd_au_size[] = { + 0, SZ_16K / 512, SZ_32K / 512, SZ_64K / 512, + SZ_128K / 512, SZ_256K / 512, SZ_512K / 512, SZ_1M / 512, + SZ_2M / 512, SZ_4M / 512, SZ_8M / 512, (SZ_8M + SZ_4M) / 512, + SZ_16M / 512, (SZ_16M + SZ_8M) / 512, SZ_32M / 512, SZ_64M / 512, +}; + #define UNSTUFF_BITS(resp,start,size) \ ({ \ const int __size = size; \ @@ -239,25 +246,29 @@ static int mmc_read_ssr(struct mmc_card *card) for (i = 0; i < 16; i++) ssr[i] = be32_to_cpu(ssr[i]); - + card->sd_speed_class = ssr[2]>>24; /* * UNSTUFF_BITS only works with four u32s so we have to offset the * bitfield positions accordingly. */ au = UNSTUFF_BITS(ssr, 428 - 384, 4); - if (au > 0 && au <= 9) { - card->ssr.au = 1 << (au + 4); - es = UNSTUFF_BITS(ssr, 408 - 384, 16); - et = UNSTUFF_BITS(ssr, 402 - 384, 6); - eo = UNSTUFF_BITS(ssr, 400 - 384, 2); - if (es && et) { - card->ssr.erase_timeout = (et * 1000) / es; - card->ssr.erase_offset = eo * 1000; + if (au) { + /* SD3.0 increases max AU size to 64MB (0xF) from 4MB (0x9) */ + if (au <= 9 || card->scr.sda_spec3) { + card->ssr.au = sd_au_size[au]; + es = UNSTUFF_BITS(ssr, 408 - 384, 16); + et = UNSTUFF_BITS(ssr, 402 - 384, 6); + if (es && et) { + eo = UNSTUFF_BITS(ssr, 400 - 384, 2); + card->ssr.erase_timeout = (et * 1000) / es; + card->ssr.erase_offset = eo * 1000; + } + } else { + pr_warn("%s: SD Status: Invalid Allocation Unit size\n", + mmc_hostname(card->host)); } - } else { - pr_warning("%s: SD Status: Invalid Allocation Unit " - "size.\n", mmc_hostname(card->host)); } + out: kfree(ssr); return err; @@ -680,7 +691,8 @@ MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid); MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name); MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid); MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); - +MMC_DEV_ATTR(sclass, "0x%0x\n", card->sd_speed_class); +MMC_DEV_ATTR(timing, "%u\n", (&card->host->ios)->timing); static struct attribute *sd_std_attrs[] = { &dev_attr_cid.attr, @@ -695,6 +707,8 @@ static struct attribute *sd_std_attrs[] = { &dev_attr_name.attr, &dev_attr_oemid.attr, &dev_attr_serial.attr, + &dev_attr_sclass.attr, + &dev_attr_timing.attr, NULL, }; @@ -1072,6 +1086,13 @@ static void mmc_sd_detect(struct mmc_host *host) mmc_claim_host(host); +#ifdef CONFIG_MMC_ERR_REMOVE + if (host->rest_remove_flags) { + err = 1; + goto remove_card; + } +#endif + /* * Just check if our card has been removed. */ @@ -1093,6 +1114,7 @@ static void mmc_sd_detect(struct mmc_host *host) err = _mmc_detect_card_removed(host); #endif +remove_card: mmc_release_host(host); if (err) { diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index e742761679f..84b054b0846 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c @@ -1295,7 +1295,7 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) if (ios->clock) { unsigned int clock_min = ~0U; - int clkdiv; + u32 clkdiv; spin_lock_bh(&host->lock); if (!host->mode_reg) { @@ -1320,12 +1320,7 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) /* Calculate clock divider */ if (host->caps.has_odd_clk_div) { clkdiv = DIV_ROUND_UP(host->bus_hz, clock_min) - 2; - if (clkdiv < 0) { - dev_warn(&mmc->class_dev, - "clock %u too fast; using %lu\n", - clock_min, host->bus_hz / 2); - clkdiv = 0; - } else if (clkdiv > 511) { + if (clkdiv > 511) { dev_warn(&mmc->class_dev, "clock %u too slow; using %lu\n", clock_min, host->bus_hz / (511 + 2)); diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index faeda85e78f..f4f3038c1df 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -1740,7 +1740,7 @@ static struct amba_id mmci_ids[] = { { .id = 0x00280180, .mask = 0x00ffffff, - .data = &variant_nomadik, + .data = &variant_u300, }, { .id = 0x00480180, diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c index 01951cd6599..4278a1787d0 100644 --- a/drivers/mmc/host/mxs-mmc.c +++ b/drivers/mmc/host/mxs-mmc.c @@ -312,9 +312,6 @@ static void mxs_mmc_ac(struct mxs_mmc_host *host) cmd0 = BF_SSP(cmd->opcode, CMD0_CMD); cmd1 = cmd->arg; - if (cmd->opcode == MMC_STOP_TRANSMISSION) - cmd0 |= BM_SSP_CMD0_APPEND_8CYC; - if (host->sdio_irq_en) { ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK; cmd0 |= BM_SSP_CMD0_CONT_CLKING_EN | BM_SSP_CMD0_SLOW_CLKING_EN; @@ -423,7 +420,8 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host) ssp->base + HW_SSP_BLOCK_SIZE); } - if (cmd->opcode == SD_IO_RW_EXTENDED) + if ((cmd->opcode == MMC_STOP_TRANSMISSION) || + (cmd->opcode == SD_IO_RW_EXTENDED)) cmd0 |= BM_SSP_CMD0_APPEND_8CYC; cmd1 = cmd->arg; @@ -676,13 +674,13 @@ static int mxs_mmc_probe(struct platform_device *pdev) platform_set_drvdata(pdev, mmc); - spin_lock_init(&host->lock); - ret = devm_request_irq(&pdev->dev, irq_err, mxs_mmc_irq_handler, 0, DRIVER_NAME, host); if (ret) goto out_free_dma; + spin_lock_init(&host->lock); + ret = mmc_add_host(mmc); if (ret) goto out_free_dma; diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c index 4c65a5a4d8f..7ffb5cba30a 100644 --- a/drivers/mmc/host/rtsx_pci_sdmmc.c +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c @@ -341,13 +341,6 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host, } if (rsp_type == SD_RSP_TYPE_R2) { - /* - * The controller offloads the last byte {CRC-7, end bit 1'b1} - * of response type R2. Assign dummy CRC, 0, and end bit to the - * byte(ptr[16], goes into the LSB of resp[3] later). - */ - ptr[16] = 1; - for (i = 0; i < 4; i++) { cmd->resp[i] = get_unaligned_be32(ptr + 1 + i * 4); dev_dbg(sdmmc_dev(host), "cmd->resp[%d] = 0x%08x\n", diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h index d33bb952241..d25f9ab9a54 100644 --- a/drivers/mmc/host/sdhci-esdhc.h +++ b/drivers/mmc/host/sdhci-esdhc.h @@ -40,7 +40,7 @@ #define ESDHC_DMA_SYSCTL 0x40c #define ESDHC_DMA_SNOOP 0x00000040 -#define ESDHC_HOST_CONTROL_RES 0x01 +#define ESDHC_HOST_CONTROL_RES 0x05 static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock) { diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c index c24fbc574cf..1ae358e0662 100644 --- a/drivers/mmc/host/sdhci-pxav3.c +++ b/drivers/mmc/host/sdhci-pxav3.c @@ -201,8 +201,8 @@ static struct sdhci_pxa_platdata *pxav3_get_mmc_pdata(struct device *dev) if (!pdata) return NULL; - if (!of_property_read_u32(np, "mrvl,clk-delay-cycles", - &clk_delay_cycles)) + of_property_read_u32(np, "mrvl,clk-delay-cycles", &clk_delay_cycles); + if (clk_delay_cycles > 0) pdata->clk_delay_cycles = clk_delay_cycles; return pdata; @@ -255,7 +255,6 @@ static int sdhci_pxav3_probe(struct platform_device *pdev) mmc_of_parse(host->mmc); sdhci_get_of_property(pdev); pdata = pxav3_get_mmc_pdata(dev); - pdev->dev.platform_data = pdata; } else if (pdata) { /* on-chip device */ if (pdata->flags & PXA_FLAG_CARD_PERMANENT) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 16d7f939a74..2ea429c2771 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1220,9 +1220,7 @@ clock_set: return; } timeout--; - spin_unlock_irq(&host->lock); - usleep_range(900, 1100); - spin_lock_irq(&host->lock); + mdelay(1); } clk |= SDHCI_CLOCK_CARD_EN; @@ -1318,8 +1316,6 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) sdhci_runtime_pm_get(host); - present = mmc_gpio_get_cd(host->mmc); - spin_lock_irqsave(&host->lock, flags); WARN_ON(host->mrq != NULL); @@ -1348,6 +1344,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) * zero: cd-gpio is used, and card is removed * one: cd-gpio is used, and card is present */ + present = mmc_gpio_get_cd(host->mmc); if (present < 0) { /* If polling, assume that the card is always present. */ if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) diff --git a/drivers/mmc/host/ushc.c b/drivers/mmc/host/ushc.c index d5493a5a7e7..c0105a2e269 100644 --- a/drivers/mmc/host/ushc.c +++ b/drivers/mmc/host/ushc.c @@ -426,9 +426,6 @@ static int ushc_probe(struct usb_interface *intf, const struct usb_device_id *id struct ushc_data *ushc; int ret; - if (intf->cur_altsetting->desc.bNumEndpoints < 1) - return -ENODEV; - mmc = mmc_alloc_host(sizeof(struct ushc_data), &intf->dev); if (mmc == NULL) return -ENOMEM; diff --git a/drivers/power/mediatek/battery_common.c b/drivers/power/mediatek/battery_common.c index 192fd6b634b..7f1ccc3d292 100644 --- a/drivers/power/mediatek/battery_common.c +++ b/drivers/power/mediatek/battery_common.c @@ -69,7 +69,6 @@ #include #include #include -#include #include #include #include @@ -112,17 +111,16 @@ static char *DISO_state_s[8] = { /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // Thermal related flags */ /* ///////////////////////////////////////////////////////////////////////////////////////// */ +#ifdef CONFIG_AUSTIN_PROJECT +int g_battery_thermal_throttling_flag = 1; /* 0:nothing, 1:enable batTT&chrTimer, 2:disable batTT&chrTimer, 3:enable batTT, disable chrTimer */ +#else int g_battery_thermal_throttling_flag = 3; /* 0:nothing, 1:enable batTT&chrTimer, 2:disable batTT&chrTimer, 3:enable batTT, disable chrTimer */ +#endif + int battery_cmd_thermal_test_mode = 0; int battery_cmd_thermal_test_mode_value = 0; int g_battery_tt_check_flag = 0; /* 0:default enable check batteryTT, 1:default disable check batteryTT */ -/*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ -static kal_int32 cur_timer_counter = 0; -static kal_int32 pre_timer_counter = 0; -static kal_int32 sleep_timer = 0; -static kal_int32 soc_reduce_step = 0; -/*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // Global Variable */ @@ -137,6 +135,7 @@ kal_bool g_charging_full_reset_bat_meter = KAL_FALSE; int g_platform_boot_mode = 0; struct timespec g_bat_time_before_sleep; int g_smartbook_update = 0; +signed int g_custom_charging_current = -1; #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) kal_bool g_vcdt_irq_delay_flag = 0; @@ -147,6 +146,7 @@ kal_uint32 g_batt_temp_status = TEMP_POS_NORMAL; #endif kal_bool battery_suspended = KAL_FALSE; +kal_bool g_refresh_ui_soc = KAL_FALSE; #ifdef MTK_ENABLE_AGING_ALGORITHM extern U32 suspend_time; #endif @@ -155,6 +155,20 @@ extern U32 suspend_time; #define SYSTEM_OFF_VOLTAGE CUST_SYSTEM_OFF_VOLTAGE #endif +#if defined(CONFIG_AUSTIN_PROJECT) +int battery_idV = 0; +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); + +unsigned int g_custom_charging_mode = 0; /* 0=ratail unit, 1=demo unit */ +#endif + +#define PLUGIN_THRESHOLD (14*86400) +signed int g_custom_charging_cv = -1; +struct timespec chr_plug_in_time; +static unsigned long g_custom_plugin_time; + +extern int orderly_poweroff(bool force); + /* ////////////////////////////////////////////////////////////////////////////// */ /* Integrate with NVRAM */ /* ////////////////////////////////////////////////////////////////////////////// */ @@ -248,8 +262,11 @@ struct battery_data { int BAT_TECHNOLOGY; int BAT_CAPACITY; /* Add for Battery Service */ + int BAT_VOLTAGE_NOW; + int BAT_VOLTAGE_AVG; + int CONSTANT_CHARGE_CURRENT; int BAT_batt_vol; - int BAT_batt_temp; + int BAT_TEMP; /* Add for EM */ int BAT_TemperatureR; int BAT_TempBattVoltage; @@ -263,8 +280,14 @@ struct battery_data { int capacity_smb; int present_smb; int adjust_power; + /* ACOS_MOD_BEGIN {metrics_log} */ + int BAT_SuspendDrain; + int BAT_SuspendRealtime; + /* ACOS_MOD_END {metrics_log} */ }; +static struct battery_data battery_main; + static enum power_supply_property wireless_props[] = { POWER_SUPPLY_PROP_ONLINE, }; @@ -284,8 +307,11 @@ static enum power_supply_property battery_props[] = { POWER_SUPPLY_PROP_TECHNOLOGY, POWER_SUPPLY_PROP_CAPACITY, /* Add for Battery Service */ + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_VOLTAGE_AVG, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, POWER_SUPPLY_PROP_batt_vol, - POWER_SUPPLY_PROP_batt_temp, + POWER_SUPPLY_PROP_TEMP, /* Add for EM */ POWER_SUPPLY_PROP_TemperatureR, POWER_SUPPLY_PROP_TempBattVoltage, @@ -300,14 +326,18 @@ static enum power_supply_property battery_props[] = { POWER_SUPPLY_PROP_present_smb, /* ADB CMD Discharging */ POWER_SUPPLY_PROP_adjust_power, + /* ACOS_MOD_BEGIN {metrics_log} */ + POWER_SUPPLY_PROP_SUSPEND_DRAIN, + POWER_SUPPLY_PROP_SUSPEND_REALTIME, + /* ACOS_MOD_END {metrics_log} */ }; -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, add ntc simulation function */ -//#define MTK_NTC_DEBUG_SIMULATE -#if (defined MTK_NTC_DEBUG_SIMULATE) -static kal_int32 battery_temp = 25; +#ifdef CONFIG_AUSTIN_PROJECT +#define SHOW_CHARGE_IC_VENDOR +static char *charge_ic_vendor_name = NULL; +static char *battery_vendor_name = NULL; +extern kal_uint32 g_fg_battery_id; #endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // extern function */ @@ -323,11 +353,6 @@ extern void mt_usb_disconnect(void); #endif /* extern int set_rtc_spare_fg_value(int val); */ -#if defined(CUST_CAPACITY_OCV2CV_TRANSFORM) -extern void battery_meter_set_reset_soc(kal_bool bUSE_UI_SOC); -extern kal_int32 battery_meter_get_battery_soc(void); -#endif - void check_battery_exist(void); void charging_suspend_enable(void) { @@ -375,11 +400,20 @@ kal_bool upmu_is_chr_det(void) { #if !defined(CONFIG_POWER_EXT) kal_uint32 tmp32; -#endif +#endif if(battery_charging_control == NULL) { - battery_charging_control = chr_control_interface; +#if defined(CONFIG_MTK_BQ24296_SUPPORT) && defined(CONFIG_MTK_SN2871_SUPPORT) + if (bq24296_is_found == KAL_TRUE) + battery_charging_control = chr_control_interface_bq24296; + else if (sn2871_is_found == KAL_TRUE) + battery_charging_control = chr_control_interface_sn2871; + else + battery_charging_control = chr_control_interface_bq24296; +#elif defined(CONFIG_MTK_BQ24296_SUPPORT) + battery_charging_control = chr_control_interface_bq24296; +#endif } #if defined(CONFIG_POWER_EXT) /* return KAL_TRUE; */ @@ -421,7 +455,7 @@ EXPORT_SYMBOL(upmu_is_chr_det); void wake_up_bat(void) { - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] wake_up_bat. \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] wake_up_bat. \n"); chr_wake_up_bat = KAL_TRUE; bat_thread_timeout = KAL_TRUE; @@ -437,7 +471,6 @@ EXPORT_SYMBOL(wake_up_bat); static ssize_t bat_log_write(struct file *filp, const char __user *buff, size_t len, loff_t *data) { char proc_bat_data; - if ((len <= 0) || copy_from_user(&proc_bat_data, buff, 1)) { battery_xlog_printk(BAT_LOG_FULL, "bat_log_write error.\n"); return -EFAULT; @@ -567,12 +600,21 @@ static int battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_CAPACITY: val->intval = data->BAT_CAPACITY; break; + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = data->BAT_VOLTAGE_NOW; + break; + case POWER_SUPPLY_PROP_TEMP: + val->intval = data->BAT_TEMP; + break; + case POWER_SUPPLY_PROP_VOLTAGE_AVG: + val->intval = data->BAT_VOLTAGE_AVG; + break; + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: + val->intval = data->CONSTANT_CHARGE_CURRENT; + break; case POWER_SUPPLY_PROP_batt_vol: val->intval = data->BAT_batt_vol; break; - case POWER_SUPPLY_PROP_batt_temp: - val->intval = data->BAT_batt_temp; - break; case POWER_SUPPLY_PROP_TemperatureR: val->intval = data->BAT_TemperatureR; break; @@ -607,6 +649,14 @@ static int battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_adjust_power : val->intval = data->adjust_power; break; + /* ACOS_MOD_BEGIN {metrics_log} */ + case POWER_SUPPLY_PROP_SUSPEND_DRAIN: + val->intval = data->BAT_SuspendDrain; + break; + case POWER_SUPPLY_PROP_SUSPEND_REALTIME: + val->intval = data->BAT_SuspendRealtime; + break; + /* ACOS_MOD_END {metrics_log} */ default: ret = -EINVAL; @@ -668,8 +718,11 @@ static struct battery_data battery_main = { .BAT_PRESENT = 1, .BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION, .BAT_CAPACITY = 100, + .BAT_VOLTAGE_NOW = 4200000, + .BAT_VOLTAGE_AVG = 4200000, + .CONSTANT_CHARGE_CURRENT = 0, .BAT_batt_vol = 4200, - .BAT_batt_temp = 22, + .BAT_TEMP = 22, /* Dual battery */ .status_smb = POWER_SUPPLY_STATUS_NOT_CHARGING, .capacity_smb = 50, @@ -686,8 +739,11 @@ static struct battery_data battery_main = { #else .BAT_CAPACITY = 50, #endif + .BAT_VOLTAGE_NOW = 0, + .BAT_VOLTAGE_AVG = 0, + .CONSTANT_CHARGE_CURRENT = 0, .BAT_batt_vol = 0, - .BAT_batt_temp = 0, + .BAT_TEMP = 0, /* Dual battery */ .status_smb = POWER_SUPPLY_STATUS_NOT_CHARGING, .capacity_smb = 50, @@ -699,6 +755,43 @@ static struct battery_data battery_main = { #if !defined(CONFIG_POWER_EXT) +/* ///////////////////////////////////////////////////////////////////////////////////////// */ +/* // Create File For EM : Charging_Enable */ +/* ///////////////////////////////////////////////////////////////////////////////////////// */ + +static ssize_t show_Charging_Enable(struct device *dev, struct device_attribute *attr, + char *buf) +{ + pr_info("[Battery] show_Charging_Enable : %d\n", + BMT_status.bat_in_charging_enable); + return sprintf(buf, "%d\n", BMT_status.bat_in_charging_enable); +} + +static ssize_t store_Charging_Enable(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + U32 enable = 0; + pr_info("[Battery] store_Charging_Enable\n"); + if (buf != NULL && size != 0) { + enable = simple_strtoul(buf, NULL, 32); + if ((0 == enable) || (1 == enable)) { + BMT_status.bat_in_charging_enable = enable; + if (battery_charging_control) { + if (0 == enable) + enable = TESTMODE_DISABLE_CHARGING << 16; + else + enable = TESTMODE_ENABLE_CHARGING << 16; + + battery_charging_control(CHARGING_CMD_ENABLE, &enable); + } + } else + pr_warn("[Battery] store_Charging_Enable: invalid input\n"); + } + return size; +} + +static DEVICE_ATTR(Charging_Enable, 0664, show_Charging_Enable, store_Charging_Enable); + /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // Create File For EM : ADC_Charger_Voltage */ /* ///////////////////////////////////////////////////////////////////////////////////////// */ @@ -1489,6 +1582,108 @@ static ssize_t store_Charger_Type(struct device *dev,struct device_attribute *at } static DEVICE_ATTR(Charger_Type, 0664, show_Charger_Type, store_Charger_Type); +static ssize_t show_Custom_PlugIn_Time(struct device *dev, + struct device_attribute *attr, char *buf) +{ + battery_xlog_printk(BAT_LOG_CRTI, "custom plugin_time = %lu\n", g_custom_plugin_time); + return sprintf(buf, "0"); +} + +static ssize_t store_Custom_PlugIn_Time(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret; + + ret = kstrtoul(buf, 0, &g_custom_plugin_time); + battery_xlog_printk(BAT_LOG_CRTI, "custom plugin_time = %lu\n", g_custom_plugin_time); + if (g_custom_plugin_time > PLUGIN_THRESHOLD) + g_custom_plugin_time = PLUGIN_THRESHOLD; + + wake_up_bat(); + return size; +} + +static DEVICE_ATTR(Custom_PlugIn_Time, 0664, show_Custom_PlugIn_Time, + store_Custom_PlugIn_Time); + +static ssize_t show_Custom_Charging_Current(struct device *dev, struct device_attribute *attr, + char *buf) +{ + battery_xlog_printk(BAT_LOG_CRTI, "custom charging current = %d\n", + g_custom_charging_current); + return sprintf(buf, "%d\n", g_custom_charging_current); +} + +static ssize_t store_Custom_Charging_Current(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret, cur; + + ret = kstrtouint(buf, 0, &cur); + g_custom_charging_current = cur; + battery_xlog_printk(BAT_LOG_CRTI, "custom charging current = %d\n", + g_custom_charging_current); + wake_up_bat(); + return size; +} + +static DEVICE_ATTR(Custom_Charging_Current, 0664, show_Custom_Charging_Current, + store_Custom_Charging_Current); + +#ifdef CONFIG_AUSTIN_PROJECT +#if defined(CONFIG_AUSTIN_PROJECT) +static ssize_t show_Custom_Charging_Mode(struct device *dev, + struct device_attribute *attr, char *buf) +{ + pr_notice("Charging mode = %u\n", g_custom_charging_mode); + return sprintf(buf, "%u", g_custom_charging_mode); +} + +static ssize_t store_Custom_Charging_Mode(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret; + + ret = kstrtouint(buf, 0, &g_custom_charging_mode); + pr_notice("Charging mode= %u\n", g_custom_charging_mode); + + return size; +} + +static DEVICE_ATTR(Custom_Charging_Mode, 0660, show_Custom_Charging_Mode, + store_Custom_Charging_Mode); +#endif +static ssize_t show_charge_ic_vendor_name(struct device *dev, struct device_attribute *attr, + char *buf) +{ + if (sn2871_is_found == KAL_TRUE) + charge_ic_vendor_name = "sn2871"; + else if (bq24296_is_found == KAL_TRUE) + charge_ic_vendor_name = "bq24296m"; + else + charge_ic_vendor_name = "charge ic is not found"; + battery_xlog_printk(BAT_LOG_CRTI, "Charge IC: %s\n", charge_ic_vendor_name); + return sprintf(buf, "%s\n", charge_ic_vendor_name); +} +static DEVICE_ATTR(ChargeIC_Vendor_Name, 0444, show_charge_ic_vendor_name, NULL); + +static ssize_t show_battery_vendor_name(struct device *dev, struct device_attribute *attr, + char *buf) +{ + if (g_fg_battery_id == 0) + battery_vendor_name = "ATL_NVT"; + else if (g_fg_battery_id == 1) + battery_vendor_name = "Coslight_Sunwoda"; + else + battery_vendor_name = "battery is not found"; + battery_xlog_printk(BAT_LOG_CRTI, "Battery Vendor: %s\n", battery_vendor_name); + return sprintf(buf, "%s\n", battery_vendor_name); +} +static DEVICE_ATTR(Battery_Vendor_Name, 0444, show_battery_vendor_name, NULL); +#endif + + + #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT) static ssize_t show_Pump_Express(struct device *dev,struct device_attribute *attr, char *buf) @@ -1558,7 +1753,7 @@ static void mt_battery_update_EM(struct battery_data *bat_data) bat_data->BAT_CAPACITY = 1; battery_xlog_printk(BAT_LOG_CRTI, - "BAT_CAPACITY=1, due to define CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION\r\n"); + "BAT_CAPACITY=1, due to define CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION\n"); #endif } @@ -1575,9 +1770,14 @@ static kal_bool mt_battery_100Percent_tracking_check(void) static kal_uint32 timer_counter = (ONEHUNDRED_PERCENT_TRACKING_TIME / BAT_TASK_PERIOD); #endif - if (BMT_status.bat_full == KAL_TRUE) /* charging full first, UI tracking to 100% */ - { - if (BMT_status.UI_SOC >= 100) { + if (BMT_status.bat_full == KAL_TRUE) { /* charging full first, UI tracking to 100% */ + + if (BMT_status.bat_in_recharging_state == KAL_TRUE) { + if (BMT_status.UI_SOC >= 100) + BMT_status.UI_SOC = 100; + + resetBatteryMeter = KAL_FALSE; + } else if (BMT_status.UI_SOC >= 100) { BMT_status.UI_SOC = 100; if ((g_charging_full_reset_bat_meter == KAL_TRUE) @@ -1601,7 +1801,7 @@ static kal_bool mt_battery_100Percent_tracking_check(void) resetBatteryMeter = KAL_TRUE; } - battery_xlog_printk(BAT_LOG_CRTI, "[100percent], UI_SOC(%d), reset(%d)\n", + battery_xlog_printk(BAT_LOG_FULL, "[100percent], UI_SOC(%d), reset(%d)\n", BMT_status.UI_SOC, resetBatteryMeter); } else { /* charging is not full, UI keep 99% if reaching 100%, */ @@ -1610,7 +1810,7 @@ static kal_bool mt_battery_100Percent_tracking_check(void) BMT_status.UI_SOC = 99; resetBatteryMeter = KAL_FALSE; - battery_xlog_printk(BAT_LOG_CRTI, "[100percent],UI_SOC = %d\n", + battery_xlog_printk(BAT_LOG_FULL, "[100percent],UI_SOC = %d\n", BMT_status.UI_SOC); } @@ -1681,7 +1881,7 @@ static kal_bool mt_battery_0Percent_tracking_check(void) } } - battery_xlog_printk(BAT_LOG_CRTI, "0Percent, VBAT < %d UI_SOC=%d\r\n", SYSTEM_OFF_VOLTAGE, + battery_xlog_printk(BAT_LOG_CRTI, "0Percent, VBAT < %d UI_SOC=%d\n", SYSTEM_OFF_VOLTAGE, BMT_status.UI_SOC); return resetBatteryMeter; @@ -1694,34 +1894,14 @@ static void mt_battery_Sync_UI_Percentage_to_Real(void) if ((BMT_status.UI_SOC > BMT_status.SOC) && ((BMT_status.UI_SOC != 1))) { #if !defined (SYNC_UI_SOC_IMM) - /*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ - sleep_timer = cur_timer_counter - pre_timer_counter; - - if (sleep_timer > 80) //80 s - { - soc_reduce_step = (sleep_timer/60)/10 + 1; //10min UI reduce 1 - battery_xlog_printk(BAT_LOG_CRTI, "soc_reduce_step = %d, sleeptime=(%d)s\n", soc_reduce_step, sleep_timer); - - if (soc_reduce_step > (BMT_status.UI_SOC - BMT_status.SOC)) - { - BMT_status.UI_SOC = BMT_status.SOC; - } - else - { - BMT_status.UI_SOC = BMT_status.UI_SOC - soc_reduce_step; - } + /* reduce after xxs */ + if (g_refresh_ui_soc || timer_counter == (SYNC_TO_REAL_TRACKING_TIME / BAT_TASK_PERIOD)) { + BMT_status.UI_SOC--; + timer_counter = 0; + g_refresh_ui_soc = KAL_FALSE; + } else { + timer_counter++; } - else - { - /* reduce after xxs */ - if (timer_counter == (SYNC_TO_REAL_TRACKING_TIME / BAT_TASK_PERIOD)) { - BMT_status.UI_SOC--; - timer_counter = 0; - } else { - timer_counter++; - } - } - /*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ #else BMT_status.UI_SOC--; #endif @@ -1730,66 +1910,49 @@ static void mt_battery_Sync_UI_Percentage_to_Real(void) } else { timer_counter = 0; -#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM - if (BMT_status.UI_SOC != -1 && BMT_status.UI_SOC < BMT_status.SOC && (BMT_status.SOC - BMT_status.UI_SOC > 1)) - { - if( upmu_is_chr_det() == KAL_TRUE ) - BMT_status.UI_SOC++; - } - else - { + if (BMT_status.UI_SOC == -1) BMT_status.UI_SOC = BMT_status.SOC; + else if (BMT_status.charger_exist && BMT_status.bat_charging_state != CHR_ERROR) { + if (BMT_status.UI_SOC < BMT_status.SOC && (BMT_status.SOC - BMT_status.UI_SOC > 1)) + BMT_status.UI_SOC++; + else + BMT_status.UI_SOC = BMT_status.SOC; } -#else - BMT_status.UI_SOC = BMT_status.SOC; -#endif } -/* [PLATFORM]-Add-BEGIN by TCTSZ.pingao.yang, 2015.03.30, refer pr 951694 */ -#if 0 if (BMT_status.UI_SOC <= 0) { BMT_status.UI_SOC = 1; - battery_xlog_printk(BAT_LOG_CRTI, "[Battery]UI_SOC get 0 first (%d)\r\n", + battery_xlog_printk(BAT_LOG_CRTI, "[Battery]UI_SOC get 0 first (%d)\n", BMT_status.UI_SOC); } -#endif -/* [PLATFORM]-Add-END by TCTSZ.pingao.yang, 2015.03.30 */ - } static void battery_update(struct battery_data *bat_data) { struct power_supply *bat_psy = &bat_data->psy; kal_bool resetBatteryMeter = KAL_FALSE; + int cc_value; bat_data->BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION; -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */ -#ifdef MTK_BATTERY_PROTECT_FEATURE - switch( g_batt_temp_status ){ - case TEMP_POS_LOW: - bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_COLD; - break; - case TEMP_POS_NORMAL: - bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD; - break; - case TEMP_POS_HIGH: - bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_OVERHEAT; - break; - default: - bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_UNKNOWN; - break; + if (BMT_status.temperature >= MAX_CHARGE_TEMPERATURE) { + bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_OVERHEAT; + } else if (BMT_status.temperature < MIN_CHARGE_TEMPERATURE) { + bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_COLD; + } else if (BMT_status.charger_vol >= V_CHARGER_MAX) { + bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + } else { /*other battery_health status can be adder here in future*/ + bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD; } -#else - bat_data->BAT_HEALTH = POWER_SUPPLY_HEALTH_GOOD; -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ + bat_data->BAT_VOLTAGE_AVG = BMT_status.bat_vol * 1000; + bat_data->BAT_VOLTAGE_NOW = BMT_status.bat_vol * 1000; /* voltage_now unit is microvolt */ bat_data->BAT_batt_vol = BMT_status.bat_vol; - bat_data->BAT_batt_temp = BMT_status.temperature * 10; + bat_data->BAT_TEMP = BMT_status.temperature * 10; bat_data->BAT_PRESENT = BMT_status.bat_exist; -/*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ - cur_timer_counter = rtc_read_hw_time(); -/*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ + if (battery_charging_control) { + battery_charging_control(CHARGING_CMD_GET_CURRENT, &cc_value); + bat_data->CONSTANT_CHARGE_CURRENT = cc_value * 1000; /* in uA */ + } if ((BMT_status.charger_exist == KAL_TRUE) && (BMT_status.bat_charging_state != CHR_ERROR)) { if (BMT_status.bat_exist) { /* charging */ @@ -1815,41 +1978,29 @@ static void battery_update(struct battery_data *bat_data) resetBatteryMeter = mt_battery_nPercent_tracking_check(); } - if (resetBatteryMeter == KAL_TRUE) { - battery_meter_reset(); - } else { - if (bat_is_recharging_phase() == KAL_TRUE) { - BMT_status.UI_SOC = 100; - battery_xlog_printk(BAT_LOG_CRTI, "[recharging] UI_SOC=%d, SOC=%d\n", - BMT_status.UI_SOC, BMT_status.SOC); - } else { - mt_battery_Sync_UI_Percentage_to_Real(); - } - } + if (resetBatteryMeter == KAL_TRUE) + battery_meter_reset(KAL_TRUE); + else + mt_battery_Sync_UI_Percentage_to_Real(); battery_xlog_printk(BAT_LOG_CRTI, "UI_SOC=(%d), resetBatteryMeter=(%d)\n", BMT_status.UI_SOC, resetBatteryMeter); -/*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ - pre_timer_counter = cur_timer_counter; -/*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ #ifdef CUST_CAPACITY_OCV2CV_TRANSFORM - //restore battery UI capacity to rtc - if (battery_meter_get_battery_soc() <= 1) { - set_rtc_spare_fg_value(1); - } - else { - set_rtc_spare_fg_value(battery_meter_get_battery_soc()); /*use battery_soc*/ - } + /* We store capacity before loading compenstation in RTC */ + if (battery_meter_get_battery_soc() <= 1) + set_rtc_spare_fg_value(1); + else + set_rtc_spare_fg_value(battery_meter_get_battery_soc()); /*use battery_soc*/ #else /* set RTC SOC to 1 to avoid SOC jump in charger boot. */ - if (BMT_status.UI_SOC <= 1) { + if (BMT_status.UI_SOC <= 1) set_rtc_spare_fg_value(1); - } else { + else set_rtc_spare_fg_value(BMT_status.UI_SOC); - } #endif + battery_xlog_printk(BAT_LOG_FULL, "RTC_SOC=(%d)\n", get_rtc_spare_fg_value()); mt_battery_update_EM(bat_data); @@ -1879,6 +2030,7 @@ void update_charger_info(int wireless_state) static void wireless_update(struct wireless_data *wireless_data) { + static int wireless_status = -1; struct power_supply *wireless_psy = &wireless_data->psy; if (BMT_status.charger_exist == KAL_TRUE || g_wireless_state) { @@ -1892,26 +2044,24 @@ static void wireless_update(struct wireless_data *wireless_data) wireless_data->WIRELESS_ONLINE = 0; } - power_supply_changed(wireless_psy); + if (wireless_status != wireless_data->WIRELESS_ONLINE) { + wireless_status = wireless_data->WIRELESS_ONLINE; + power_supply_changed(wireless_psy); + } } static void ac_update(struct ac_data *ac_data) { + static int ac_status = -1; struct power_supply *ac_psy = &ac_data->psy; if (BMT_status.charger_exist == KAL_TRUE) { #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) if ((BMT_status.charger_type == NONSTANDARD_CHARGER) || - (BMT_status.charger_type == STANDARD_CHARGER) || - (BMT_status.charger_type == APPLE_2_1A_CHARGER) || - (BMT_status.charger_type == APPLE_1_0A_CHARGER) || - (BMT_status.charger_type == APPLE_0_5A_CHARGER)) { + (BMT_status.charger_type == STANDARD_CHARGER)) { #else if ((BMT_status.charger_type == NONSTANDARD_CHARGER) || (BMT_status.charger_type == STANDARD_CHARGER) || - (BMT_status.charger_type == APPLE_2_1A_CHARGER) || - (BMT_status.charger_type == APPLE_1_0A_CHARGER) || - (BMT_status.charger_type == APPLE_0_5A_CHARGER) || (DISO_data.diso_state.cur_vdc_state == DISO_ONLINE)) { #endif ac_data->AC_ONLINE = 1; @@ -1923,11 +2073,15 @@ static void ac_update(struct ac_data *ac_data) ac_data->AC_ONLINE = 0; } - power_supply_changed(ac_psy); + if (ac_status != ac_data->AC_ONLINE) { + ac_status = ac_data->AC_ONLINE; + power_supply_changed(ac_psy); + } } static void usb_update(struct usb_data *usb_data) { + static int usb_status = -1; struct power_supply *usb_psy = &usb_data->psy; if (BMT_status.charger_exist == KAL_TRUE) { @@ -1942,35 +2096,14 @@ static void usb_update(struct usb_data *usb_data) usb_data->USB_ONLINE = 0; } - power_supply_changed(usb_psy); + if (usb_status != usb_data->USB_ONLINE) { + usb_status = usb_data->USB_ONLINE; + power_supply_changed(usb_psy); + } } #endif -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, add ntc simulation function */ -#if (defined MTK_NTC_DEBUG_SIMULATE) -static ssize_t chg_ntc_debugfs_store(struct device *dev, - struct device_attribute *attr, - const char *buf, ssize_t count) -{ - battery_temp = simple_strtol(buf, NULL, 10); - battery_xlog_printk(BAT_LOG_CRTI, - "Usage: echo [temp] > sys/devices/platform/battery/ntc_debug: battery_temp = %d\n", - battery_temp); - - return count; -} - -static ssize_t chg_ntc_debugfs_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - return sprintf(buf, "battery_temp = %d\n", battery_temp); -} - -static DEVICE_ATTR(ntc_debug, 0644, chg_ntc_debugfs_show, chg_ntc_debugfs_store); -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ - /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // Battery Temprature Parameters and functions */ /* ///////////////////////////////////////////////////////////////////////////////////////// */ @@ -1979,7 +2112,7 @@ kal_bool pmic_chrdet_status(void) if (upmu_is_chr_det() == KAL_TRUE) { return KAL_TRUE; } else { - battery_xlog_printk(BAT_LOG_CRTI, "[pmic_chrdet_status] No charger\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "[pmic_chrdet_status] No charger\n"); return KAL_FALSE; } } @@ -2027,12 +2160,6 @@ int get_bat_charging_current_level(void) return charging_current; } -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */ -#ifdef MTK_BATTERY_PROTECT_FEATURE -extern kal_bool high_temp_stop_charge; -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ - #if defined(MTK_TEMPERATURE_RECHARGE_SUPPORT) PMU_STATUS do_batt_temp_state_machine(void) { @@ -2040,19 +2167,12 @@ PMU_STATUS do_batt_temp_state_machine(void) return PMU_STATUS_FAIL; } #ifdef BAT_LOW_TEMP_PROTECT_ENABLE -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */ -#ifdef MTK_BATTERY_PROTECT_FEATURE - /* Battery temperature less than 2 degree, stop charging */ - if (BMT_status.temperature <= MIN_CHARGE_TEMPERATURE) { -#else if (BMT_status.temperature < MIN_CHARGE_TEMPERATURE) { -#endif battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Battery Under Temperature or NTC fail !!\n\r"); g_batt_temp_status = TEMP_POS_LOW; return PMU_STATUS_FAIL; } else if (g_batt_temp_status == TEMP_POS_LOW) { - /*Battery temperature more than 4 degree, recharging again*/ if (BMT_status.temperature >= MIN_CHARGE_TEMPERATURE_PLUS_X_DEGREE) { battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Battery Temperature raise from %d to %d(%d), allow charging!!\n\r", @@ -2066,30 +2186,12 @@ PMU_STATUS do_batt_temp_state_machine(void) } } else #endif - -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */ -#ifdef MTK_BATTERY_PROTECT_FEATURE - /* Battery temperature more than 55 degree, stop charging */ - if ((BMT_status.temperature >= MAX_CHARGE_TEMPERATURE) - || ((BMT_status.temperature >= MAX_LIMIT_CHARGE_TEMPERATURE) && (high_temp_stop_charge == KAL_TRUE))){ -#else if (BMT_status.temperature >= MAX_CHARGE_TEMPERATURE) { -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Battery Over Temperature !!\n\r"); g_batt_temp_status = TEMP_POS_HIGH; return PMU_STATUS_FAIL; } else if (g_batt_temp_status == TEMP_POS_HIGH) { - /* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */ - #ifdef MTK_BATTERY_PROTECT_FEATURE - /* Battery temperature less than 50 degree. recharging again */ - if ((BMT_status.temperature <= MAX_CHARGE_TEMPERATURE_MINUS_X_DEGREE) - || ((BMT_status.temperature >= MAX_LIMIT_CHARGE_TEMPERATURE) && (high_temp_stop_charge == KAL_TRUE))){ - high_temp_stop_charge = KAL_FALSE; - #else if (BMT_status.temperature < MAX_CHARGE_TEMPERATURE_MINUS_X_DEGREE) { - #endif - /* [PLATFORM]-Add-END by TCTSZ.leo.guo */ battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Battery Temperature down from %d to %d(%d), allow charging!!\n\r", MAX_CHARGE_TEMPERATURE, BMT_status.temperature, @@ -2278,15 +2380,12 @@ void mt_battery_GetBatteryData(void) BMT_status.SOC = SOC; BMT_status.ZCV = ZCV; -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, add ntc simulation function */ -#if (defined MTK_NTC_DEBUG_SIMULATE) - BMT_status.temperature = battery_temp; -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ +#if !defined(CUST_CAPACITY_OCV2CV_TRANSFORM) if (BMT_status.charger_exist == KAL_FALSE) { if (BMT_status.SOC > previous_SOC && previous_SOC >= 0) BMT_status.SOC = previous_SOC; } +#endif previous_SOC = BMT_status.SOC; @@ -2298,15 +2397,38 @@ void mt_battery_GetBatteryData(void) if (g_battery_soc_ready == KAL_FALSE) g_battery_soc_ready = KAL_TRUE; - battery_xlog_printk(BAT_LOG_CRTI, - "AvgVbat=(%d),bat_vol=(%d),AvgI=(%d),I=(%d),VChr=(%d),AvgT=(%d),T=(%d),pre_SOC=(%d),SOC=(%d),ZCV=(%d)\n", - BMT_status.bat_vol, bat_vol, BMT_status.ICharging, ICharging, - BMT_status.charger_vol, BMT_status.temperature, temperature, - previous_SOC, BMT_status.SOC, BMT_status.ZCV); + pr_notice("AvgVbat=(%d),bat_vol=(%d),AvgI=(%d),I=(%d),VChr=(%d),AvgT=(%d),T=(%d),pre_SOC=(%d),SOC=(%d),ZCV=(%d)\n", + BMT_status.bat_vol, bat_vol, BMT_status.ICharging, ICharging, + BMT_status.charger_vol, BMT_status.temperature, temperature, + previous_SOC, BMT_status.SOC, BMT_status.ZCV); } +#if defined(CONFIG_AUSTIN_PROJECT) +static PMU_STATUS mt_battery_CheckBatteryConnect(void) +{ + PMU_STATUS status = PMU_STATUS_OK; + int ret = 0; + int data[4]; + int voltage = 0; + + ret = IMM_GetOneChannelValue(13, data, &voltage); + if (ret != 0){ + printk("[mt_battery_CheckBatteryConnect]Id voltage read fail\n"); + } else { + battery_idV = (voltage*1500)/4096; + printk("[mt_battery_CheckBatteryConnect]Id voltage = %d\n", battery_idV); + } + + if (battery_idV > 500) { + battery_xlog_printk(BAT_LOG_CRTI, "[mt_battery_CheckBatteryConnect] battery ID disconnect\n"); + status = PMU_STATUS_FAIL; + } + + return status; +} +#endif static PMU_STATUS mt_battery_CheckBatteryTemp(void) { @@ -2314,7 +2436,7 @@ static PMU_STATUS mt_battery_CheckBatteryTemp(void) #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] support JEITA, temperature=%d\n", + battery_xlog_printk(BAT_LOG_FULL, "[BATTERY] support JEITA, temperature=%d\n", BMT_status.temperature); if (do_jeita_state_machine() == PMU_STATUS_FAIL) { @@ -2359,7 +2481,7 @@ static PMU_STATUS mt_battery_CheckChargerVoltage(void) if (BMT_status.charger_exist == KAL_TRUE) { #if (V_CHARGER_ENABLE == 1) if (BMT_status.charger_vol <= V_CHARGER_MIN) { - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY]Charger under voltage!!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY]Charger under voltage!!\n"); BMT_status.bat_charging_state = CHR_ERROR; status = PMU_STATUS_FAIL; } @@ -2369,7 +2491,7 @@ static PMU_STATUS mt_battery_CheckChargerVoltage(void) #else if (BMT_status.charger_vol >= v_charger_max) { #endif - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY]Charger over voltage !!\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY]Charger over voltage !!\n"); BMT_status.charger_protect_status = charger_OVER_VOL; BMT_status.bat_charging_state = CHR_ERROR; status = PMU_STATUS_FAIL; @@ -2437,6 +2559,13 @@ static void mt_battery_CheckBatteryStatus(void) return; } +#if defined(CONFIG_AUSTIN_PROJECT) + if (mt_battery_CheckBatteryConnect() != PMU_STATUS_OK) { + BMT_status.bat_charging_state = CHR_ERROR; + return; + } +#endif + if (mt_battery_CheckChargerVoltage() != PMU_STATUS_OK) { BMT_status.bat_charging_state = CHR_ERROR; return; @@ -2522,35 +2651,20 @@ static void mt_battery_notify_VBatTemp_check(void) #if defined(BATTERY_NOTIFY_CASE_0002_VBATTEMP) if (BMT_status.temperature >= MAX_CHARGE_TEMPERATURE) { - /* [PLATFORM]-ADD-BEGIN by TCTSZ leo.guo, 06/09/2015, BATTERY Notify PR-1018754*/ - if(BMT_status.temperature >= MAX_RAISING_CHARGE_TEMPERATURE) - g_BatteryNotifyCode |= (0x0040 | (!!BMT_status.charger_exist) << 8); - else - g_BatteryNotifyCode |= (0x0002 | (!!BMT_status.charger_exist) << 8); - /* [PLATFORM]-ADD-END by TCTSZ leo.guo*/ + g_BatteryNotifyCode |= 0x0002; battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too high)\n", BMT_status.temperature); } #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) else if (BMT_status.temperature < TEMP_NEG_10_THRESHOLD) { - /* [PLATFORM]-ADD-BEGIN by TCTSZ leo.guo, 06/09/2015, BATTERY Notify PR-1018754*/ - if(BMT_status.temperature <= MIN_DROPPING_CHARGE_TEMPERATURE) - g_BatteryNotifyCode |= (0x0080 | (!!BMT_status.charger_exist) << 8); - else - g_BatteryNotifyCode |= (0x0020 | (!!BMT_status.charger_exist) << 8); - /* [PLATFORM]-ADD-END by TCTSZ leo.guo*/ + g_BatteryNotifyCode |= 0x0020; battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too low)\n", BMT_status.temperature); } #else #ifdef BAT_LOW_TEMP_PROTECT_ENABLE else if (BMT_status.temperature < MIN_CHARGE_TEMPERATURE) { - /* [PLATFORM]-ADD-BEGIN by TCTSZ leo.guo, 06/09/2015, BATTERY Notify PR-1018754*/ - if(BMT_status.temperature <= MIN_DROPPING_CHARGE_TEMPERATURE) - g_BatteryNotifyCode |= (0x0080 | (!!BMT_status.charger_exist) << 8); - else - g_BatteryNotifyCode |= (0x0020 | (!!BMT_status.charger_exist) << 8); - /* [PLATFORM]-ADD-END by TCTSZ leo.guo*/ + g_BatteryNotifyCode |= 0x0020; battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too low)\n", BMT_status.temperature); } @@ -2652,8 +2766,12 @@ static void mt_battery_thermal_check(void) } #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) /* ignore default rule */ + if (BMT_status.temperature <= -10) { + pr_notice("[Battery] Tbat(%d)<= -10, system need power down.\n", BMT_status.temperature); + orderly_poweroff(true); + } #else - if (BMT_status.temperature >= 60 || BMT_status.temperature <=-20) { + if (BMT_status.temperature >= 60) { #if defined(CONFIG_POWER_EXT) battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] CONFIG_POWER_EXT, no update battery update power down.\n"); @@ -2670,7 +2788,7 @@ static void mt_battery_thermal_check(void) struct power_supply *bat_psy = &bat_data->psy; battery_xlog_printk(BAT_LOG_CRTI, - "[Battery] Tbat(%d)>=60 or <=-20 , system need power down.\n", + "[Battery] Tbat(%d)>=60, system need power down.\n", BMT_status.temperature); bat_data->BAT_CAPACITY = 0; @@ -2731,26 +2849,28 @@ CHARGER_TYPE mt_charger_type_detection(void) battery_charging_control(CHARGING_CMD_GET_CHARGER_TYPE, &CHR_Type_num); BMT_status.charger_type = CHR_Type_num; + getrawmonotonic(&chr_plug_in_time); + g_custom_plugin_time = 0; + g_custom_charging_cv = -1; + battery_xlog_printk(BAT_LOG_FULL, "[%s]init charger plug-in timer\n", __func__); + #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING)&&(defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)) if (BMT_status.UI_SOC == 100) { BMT_status.bat_charging_state = CHR_BATFULL; BMT_status.bat_full = KAL_TRUE; g_charging_full_reset_bat_meter = KAL_TRUE; - } + } if(g_battery_soc_ready == KAL_FALSE) { if(BMT_status.nPercent_ZCV == 0) battery_meter_initial(); - + BMT_status.SOC = battery_meter_get_battery_percentage(); } if (BMT_status.bat_vol > 0) - { - mt_battery_update_status(); - } - + mt_battery_update_status(); #endif } #endif @@ -2791,6 +2911,7 @@ static void mt_battery_charger_detect_check(void) if ((BMT_status.charger_type == CHARGER_UNKNOWN) && (DISO_data.diso_state.cur_vusb_state == DISO_ONLINE)) { #endif + mt_charger_type_detection(); if ((BMT_status.charger_type == STANDARD_HOST) @@ -2800,7 +2921,7 @@ static void mt_battery_charger_detect_check(void) } #endif - battery_xlog_printk(BAT_LOG_CRTI, "[BAT_thread]Cable in, CHR_Type_num=%d\r\n", + battery_xlog_printk(BAT_LOG_CRTI, "[BAT_thread]Cable in, CHR_Type_num=%d\n", BMT_status.charger_type); } else { @@ -2817,7 +2938,7 @@ static void mt_battery_charger_detect_check(void) BMT_status.TOPOFF_charging_time = 0; BMT_status.POSTFULL_charging_time = 0; - battery_xlog_printk(BAT_LOG_CRTI, "[BAT_thread]Cable out \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "[BAT_thread]Cable out \n"); mt_usb_disconnect(); } @@ -2827,14 +2948,14 @@ static void mt_kpoc_power_off_check(void) { #ifdef CONFIG_MTK_KERNEL_POWER_OFF_CHARGING battery_xlog_printk(BAT_LOG_CRTI, - "[mt_kpoc_power_off_check] , chr_vol=%d, boot_mode=%d\r\n", BMT_status.charger_vol, + "chr_vol=%d, boot_mode=%d\n", BMT_status.charger_vol, g_platform_boot_mode); if (g_platform_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT || g_platform_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) { if ((upmu_is_chr_det() == KAL_FALSE) && (BMT_status.charger_vol < 2500)) /* vbus < 2.5V */ { battery_xlog_printk(BAT_LOG_CRTI, - "[bat_thread_kthread] Unplug Charger/USB In Kernel Power Off Charging Mode! Shutdown OS!\r\n"); + "[bat_thread_kthread] Unplug Charger/USB In Kernel Power Off Charging Mode! Shutdown OS!\n"); battery_charging_control(CHARGING_CMD_SET_POWER_OFF, NULL); } } @@ -2891,16 +3012,16 @@ void do_chrdet_int_task(void) BMT_status.charger_exist = KAL_FALSE; #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) - battery_xlog_printk(BAT_LOG_CRTI, + battery_xlog_printk(BAT_LOG_CRTI, "turn off charging for no avaliable charging source\n"); - battery_charging_control(CHARGING_CMD_ENABLE,&BMT_status.charger_exist); + battery_charging_control(CHARGING_CMD_ENABLE,&BMT_status.charger_exist); #endif #ifdef CONFIG_MTK_KERNEL_POWER_OFF_CHARGING if (g_platform_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT || g_platform_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) { battery_xlog_printk(BAT_LOG_CRTI, - "[pmic_thread_kthread] Unplug Charger/USB In Kernel Power Off Charging Mode! Shutdown OS!\r\n"); + "[pmic_thread_kthread] Unplug Charger/USB In Kernel Power Off Charging Mode! Shutdown OS!\n"); battery_charging_control(CHARGING_CMD_SET_POWER_OFF, NULL); /* mt_power_off(); */ } @@ -2921,7 +3042,7 @@ void do_chrdet_int_task(void) } #endif #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT) - is_ta_connect = KAL_FALSE; + is_ta_connect = KAL_FALSE; ta_check_chr_type = KAL_TRUE; ta_cable_out_occur = KAL_TRUE; #endif @@ -2967,15 +3088,14 @@ void do_chrdet_int_task(void) void BAT_thread(void) { static kal_bool battery_meter_initilized = KAL_FALSE; + struct timespec now_time; + unsigned long total_time_plug_in; + if (battery_meter_initilized == KAL_FALSE) { battery_meter_initial(); /* move from battery_probe() to decrease booting time */ BMT_status.nPercent_ZCV = battery_meter_get_battery_nPercent_zcv(); battery_meter_initilized = KAL_TRUE; - /*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ - pre_timer_counter = rtc_read_hw_time(); - /*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ - } mt_battery_charger_detect_check(); @@ -2986,7 +3106,22 @@ void BAT_thread(void) mt_battery_thermal_check(); mt_battery_notify_check(); - if (BMT_status.charger_exist == KAL_TRUE) { + if (BMT_status.charger_exist == KAL_TRUE) { + getrawmonotonic(&now_time); + + total_time_plug_in = g_custom_plugin_time; + if ((now_time.tv_sec - chr_plug_in_time.tv_sec) > 0) + total_time_plug_in += now_time.tv_sec - chr_plug_in_time.tv_sec; + + if (total_time_plug_in > PLUGIN_THRESHOLD) { + g_custom_charging_cv = BATTERY_VOLT_04_100000_V; + } + else + g_custom_charging_cv = -1; + + battery_xlog_printk(BAT_LOG_FULL, "total plug-in time(%lu), cv(%d)\r\n", + total_time_plug_in, g_custom_charging_cv); + mt_battery_CheckBatteryStatus(); mt_battery_charging_algorithm(); } @@ -2998,31 +3133,14 @@ void BAT_thread(void) /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // Internal API */ /* ///////////////////////////////////////////////////////////////////////////////////////// */ - -#ifdef BATTERY_CDP_WORKAROUND -extern kal_bool is_charger_detection_rdy(void); -#endif - int bat_thread_kthread(void *x) { ktime_t ktime = ktime_set(3, 0); /* 10s, 10* 1000 ms */ - -#ifdef BATTERY_CDP_WORKAROUND - if(is_charger_detection_rdy()==KAL_FALSE){ - printk("xiaohu_cdp:CDP, block\n"); - wait_event(bat_thread_wq, (is_charger_detection_rdy()==KAL_TRUE)); - printk("xiaohu_cdp:CDP, free\n"); - }else{ - printk("xiaohu_cdp:CDP, PASS\n"); - } -#endif - - /* Run on a process content */ while (1) { mutex_lock(&bat_mutex); - + if ((chargin_hw_init_done == KAL_TRUE) && (battery_suspended == KAL_FALSE)) BAT_thread(); @@ -3045,10 +3163,7 @@ int bat_thread_kthread(void *x) #endif g_smartbook_update = 0; - #if defined(CUST_CAPACITY_OCV2CV_TRANSFORM) - battery_meter_set_reset_soc(KAL_FALSE); - #endif - battery_meter_reset(); + battery_meter_reset(KAL_FALSE); chr_wake_up_bat = KAL_FALSE; battery_xlog_printk(BAT_LOG_CRTI, @@ -3425,7 +3540,16 @@ void battery_kthread_hrtimer_init(void) static void get_charging_control(void) { - battery_charging_control = chr_control_interface; +#if defined(CONFIG_MTK_BQ24296_SUPPORT) && defined(CONFIG_MTK_SN2871_SUPPORT) + if (bq24296_is_found == KAL_TRUE) + battery_charging_control = chr_control_interface_bq24296; + else if (sn2871_is_found == KAL_TRUE) + battery_charging_control = chr_control_interface_sn2871; + else + battery_charging_control = chr_control_interface_bq24296; +#elif defined(CONFIG_MTK_BQ24296_SUPPORT) + battery_charging_control = chr_control_interface_bq24296; +#endif } #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) @@ -3460,8 +3584,7 @@ static irqreturn_t diso_auxadc_irq_thread(int irq, void *dev_id) /*usb delayed work will reflact BMT_staus , so need update state ASAP*/ if((BMT_status.charger_type==STANDARD_HOST) || (BMT_status.charger_type==CHARGING_HOST)) mt_usb_disconnect(); /* disconnect if connected */ - BMT_status.charger_type = CHARGER_UNKNOWN;// reset chr_type - wake_up_bat(); + BMT_status.charger_type = CHARGER_UNKNOWN;// reset chr_type break; case DC_ONLY: BMT_status.charger_type = CHARGER_UNKNOWN; @@ -3559,7 +3682,7 @@ static int battery_probe(struct platform_device *dev) battery_main.BAT_TECHNOLOGY = POWER_SUPPLY_TECHNOLOGY_LION; battery_main.BAT_CAPACITY = 100; battery_main.BAT_batt_vol = 4200; - battery_main.BAT_batt_temp = 220; + battery_main.BAT_TEMP = 220; g_bat_init_flag = KAL_TRUE; return 0; @@ -3568,14 +3691,9 @@ static int battery_probe(struct platform_device *dev) /* For EM */ { int ret_device_file = 0; + ret_device_file = device_create_file(&(dev->dev), &dev_attr_Charging_Enable); -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, add ntc simulation function */ -#if (defined MTK_NTC_DEBUG_SIMULATE) - ret_device_file = device_create_file(&(dev->dev), &dev_attr_ntc_debug); -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Charger_Voltage); - ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_0_Slope); ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_1_Slope); ret_device_file = device_create_file(&(dev->dev), &dev_attr_ADC_Channel_2_Slope); @@ -3618,6 +3736,13 @@ static int battery_probe(struct platform_device *dev) ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_SW_CoulombCounter); ret_device_file = device_create_file(&(dev->dev), &dev_attr_Charging_CallState); ret_device_file = device_create_file(&(dev->dev), &dev_attr_Charger_Type); + ret_device_file = device_create_file(&(dev->dev), &dev_attr_Custom_PlugIn_Time); + ret_device_file = device_create_file(&(dev->dev), &dev_attr_Custom_Charging_Current); + #ifdef CONFIG_AUSTIN_PROJECT + ret_device_file = device_create_file(&(dev->dev), &dev_attr_Custom_Charging_Mode); + ret_device_file = device_create_file(&(dev->dev), &dev_attr_ChargeIC_Vendor_Name); + ret_device_file = device_create_file(&(dev->dev), &dev_attr_Battery_Vendor_Name); + #endif #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT) ret_device_file = device_create_file(&(dev->dev), &dev_attr_Pump_Express); #endif @@ -3638,22 +3763,23 @@ static int battery_probe(struct platform_device *dev) BMT_status.TOPOFF_charging_time = 0; BMT_status.POSTFULL_charging_time = 0; BMT_status.SOC = 0; -#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM BMT_status.UI_SOC = -1; -#else - BMT_status.UI_SOC = 0; -#endif BMT_status.bat_charging_state = CHR_PRE; BMT_status.bat_in_recharging_state = KAL_FALSE; BMT_status.bat_full = KAL_FALSE; BMT_status.nPercent_ZCV = 0; BMT_status.nPrecent_UI_SOC_check_point = battery_meter_get_battery_nPercent_UI_SOC(); + BMT_status.bat_in_charging_enable = KAL_TRUE; #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) dual_input_init(); #endif + getrawmonotonic(&chr_plug_in_time); + g_custom_plugin_time = 0; + g_custom_charging_cv = -1; + /* battery kernel thread for 10s check and charger in/out event */ /* Replace GPT timer by hrtime */ battery_kthread_hrtimer_init(); @@ -3750,6 +3876,7 @@ static void battery_timer_resume(void) hrtimer_start(&charger_hv_detect_timer, hvtime, HRTIMER_MODE_REL); battery_suspended = KAL_FALSE; + g_refresh_ui_soc = KAL_TRUE; battery_xlog_printk(BAT_LOG_CRTI, "@bs=0@\n"); mutex_unlock(&bat_mutex); diff --git a/drivers/power/mediatek/battery_meter.c b/drivers/power/mediatek/battery_meter.c index 73e16b32316..fc4e23b3e6b 100644 --- a/drivers/power/mediatek/battery_meter.c +++ b/drivers/power/mediatek/battery_meter.c @@ -33,7 +33,11 @@ #include #include #include "cust_battery_meter.h" +#ifdef CONFIG_AUSTIN_PROJECT +#include "cust_battery_meter_table_austin.h" +#else #include "cust_battery_meter_table.h" +#endif #include "cust_pmic.h" #include "mach/mtk_rtc.h" @@ -43,12 +47,35 @@ #define PROFILE_SIZE 4 static DEFINE_MUTEX(FGADC_mutex); +static DEFINE_MUTEX(qmax_mutex); + +/* This option enables loading compenstation algorithm of fuel gauge. + It could be turned on to improve gas guage performance under low temperature. + #define CUST_CAPACITY_OCV2CV_TRANSFORM + STEP_OF_QMAX: one step discharged mAh in ZCV table + CV_CURRENT: discharging current in ZCV table +*/ #ifdef CUST_CAPACITY_OCV2CV_TRANSFORM -#define TEMP_AVERAGE_SIZE 30 /* Temperature window size */ -#define step_of_Qmax 54 //54 mah +static kal_int32 cv_current = 4000; /* 400mA */ + +#ifndef STEP_OF_QMAX +#define STEP_OF_QMAX 30 #endif -int Enable_FGADC_LOG = 1; +static kal_int32 g_currentfactor = 100; +#endif + +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) +#define MAX_BATTERY_CYCLE 500 +#define MAX_AGING_COLUMB_THRES 3300 /*3300mah*/ +enum aging_state { + AGING_RESET = 0, + AGING_STATE_1 +}; +#endif + +int Enable_FGADC_LOG = BM_LOG_ERROR; /* ============================================================ // */ /* global variable */ @@ -64,13 +91,6 @@ U32 _g_bat_sleep_total_time = NORMAL_WAKEUP_PERIOD; U32 suspend_time = 0; #endif kal_int32 g_booting_vbat = 0; -static U32 temperature_change = 1; - -#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM -static kal_int32 g_currentfactor = 100; //100% -static kal_bool g_USE_UI_SOC = KAL_TRUE; -#endif - /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // PMIC AUXADC Related Variable */ @@ -117,6 +137,9 @@ kal_int32 g_fg_dbg_bat_current = 0; kal_int32 g_fg_dbg_bat_zcv = 0; kal_int32 g_fg_dbg_bat_temp = 0; kal_int32 g_fg_dbg_bat_r = 0; +#ifdef CONFIG_AUSTIN_PROJECT +kal_int32 g_fg_dbg_bat_offset_r = 0; +#endif kal_int32 g_fg_dbg_bat_car = 0; kal_int32 g_fg_dbg_bat_qmax = 0; kal_int32 g_fg_dbg_d0 = 0; @@ -130,12 +153,6 @@ kal_int32 FGbatteryIndex = 0; kal_int32 FGbatteryVoltageSum = 0; kal_int32 gFG_voltage_AVG = 0; kal_int32 gFG_vbat_offset = 0; -#ifdef Q_MAX_BY_CURRENT -kal_int32 FGCurrentBuffer[FG_CURRENT_AVERAGE_SIZE]; -kal_int32 FGCurrentIndex = 0; -kal_int32 FGCurrentSum = 0; -kal_int32 gFG_current_AVG = 0; -#endif kal_int32 g_tracking_point = CUST_TRACKING_POINT; kal_int32 g_rtc_fg_soc = 0; kal_int32 g_I_SENSE_offset = 0; @@ -171,15 +188,6 @@ struct timespec g_rtc_time_before_sleep, xts_before_sleep; kal_int32 g_sw_vbat_temp = 0; struct timespec last_oam_run_time; -/*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ -static kal_int32 suspend_current = DEFAUL_SUSPEND_CURRENT; -static kal_int32 g_sleep_fg_soc = 0; -static kal_int32 g_sleep_fg_ui_soc = 0; -static kal_int32 resume_count = 0; -static kal_int32 after_sleep_time = 0; -static kal_int32 before_sleep_time = 0; -/*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ - /* aging mechanism */ #ifdef MTK_ENABLE_AGING_ALGORITHM @@ -222,7 +230,8 @@ static kal_int32 columb_before_sleep = 0x123456; #endif /* aging mechanism */ /* battery info */ -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) kal_int32 gFG_battery_cycle = 0; kal_int32 gFG_aging_factor = 100; @@ -242,27 +251,84 @@ extern char* saved_command_line; /* Temperature window size */ #define TEMP_AVERAGE_SIZE 30 -kal_bool gFG_Is_offset_init = KAL_FALSE; +#define MTK_MULTI_BAT_PROFILE_SUPPORT +#define MTK_GET_BATTERY_ID_BY_AUXADC +#ifdef CONFIG_AUSTIN_PROJECT +#define ADC_BOARD_ID (13) +#define TOTAL_BATTERY_NUMBER 2 +kal_int32 g_battery_id_voltage[] = {200, 500};/*0~0.2V ATL; 0.2v~5V XWD*/ +#else +#define ADC_BOARD_ID (15) +#define TOTAL_BATTERY_NUMBER 2 +kal_int32 g_battery_id_voltage[] = {570, 2000};/*0~0.57v HVT EVT1.1 ; 0.57v~2v EVT1.2 DVT PVT*/ +#endif + #ifdef MTK_MULTI_BAT_PROFILE_SUPPORT -extern int IMM_GetOneChannelValue_Cali(int Channel, int *voltage); +extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata); + kal_uint32 g_fg_battery_id = 0; +#ifdef CONFIG_AUSTIN_PROJECT +kal_int32 g_Q_MAX_POS_50[] = {2963, 2929}; +kal_int32 g_Q_MAX_POS_25[] = {3000, 2918}; +kal_int32 g_Q_MAX_POS_0[] = {3047, 3032}; +kal_int32 g_Q_MAX_NEG_10[] = {3061, 3042}; +kal_int32 g_Q_MAX_POS_50_H_CURRENT[] = {2937, 2883}; +kal_int32 g_Q_MAX_POS_25_H_CURRENT[] = {2965, 2858}; +kal_int32 g_Q_MAX_POS_0_H_CURRENT[] = {2977, 2917}; +kal_int32 g_Q_MAX_NEG_10_H_CURRENT[] = {2648, 2506}; +#else +kal_int32 g_Q_MAX_POS_50[] = {2983, 2894}; +kal_int32 g_Q_MAX_POS_25[] = {3024, 2961}; +kal_int32 g_Q_MAX_POS_0[] = {2969, 2620}; +kal_int32 g_Q_MAX_NEG_10[] = {2725, 2480}; +kal_int32 g_Q_MAX_POS_50_H_CURRENT[] = {2908, 3035}; +kal_int32 g_Q_MAX_POS_25_H_CURRENT[] = {2851, 3030}; +kal_int32 g_Q_MAX_POS_0_H_CURRENT[] = {2372, 2746}; +kal_int32 g_Q_MAX_NEG_10_H_CURRENT[] = {1946, 1614}; +#endif + +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) +kal_int32 g_Q_MAX_POS_50_0cycle[] = {2963, 2980}; +kal_int32 g_Q_MAX_POS_25_0cycle[] = {3000, 3022}; +kal_int32 g_Q_MAX_POS_0_0cycle[] = {3047, 3032}; +kal_int32 g_Q_MAX_NEG_10_0cycle[] = {3061, 3042}; +kal_int32 g_Q_MAX_POS_50_H_CURRENT_0cycle[] = {2937, 2951}; +kal_int32 g_Q_MAX_POS_25_H_CURRENT_0cycle[] = {2965, 2984}; +kal_int32 g_Q_MAX_POS_0_H_CURRENT_0cycle[] = {2977, 2917}; +kal_int32 g_Q_MAX_NEG_10_H_CURRENT_0cycle[] = {2648, 2506}; + +kal_int32 g_Q_MAX_POS_50_500cycle[] = {2887, 2871}; +kal_int32 g_Q_MAX_POS_25_500cycle[] = {2910, 2911}; +kal_int32 g_Q_MAX_POS_0_500cycle[] = {2954, 2903}; +kal_int32 g_Q_MAX_NEG_10_500cycle[] = {3061, 3042}; +kal_int32 g_Q_MAX_POS_50_H_CURRENT_500cycle[] = {2870, 2835}; +kal_int32 g_Q_MAX_POS_25_H_CURRENT_500cycle[] = {2868, 2848}; +kal_int32 g_Q_MAX_POS_0_H_CURRENT_500cycle[] = {2463, 2279}; +kal_int32 g_Q_MAX_NEG_10_H_CURRENT_500cycle[] = {2648, 2506}; +#endif + #ifdef MTK_GET_BATTERY_ID_BY_AUXADC void fgauge_get_profile_id(void) { int id_volt = 0; int id = 0; int ret = 0; + int data[4]; + int voltage = 0; - ret = IMM_GetOneChannelValue_Cali(BATTERY_ID_CHANNEL_NUM, &id_volt); - if (ret != 0) - bm_print(BM_LOG_CRTI, "[fgauge_get_profile_id]id_volt read fail\n"); - else - bm_print(BM_LOG_CRTI, "[fgauge_get_profile_id]id_volt = %d\n", id_volt); + ret = IMM_GetOneChannelValue(ADC_BOARD_ID, data, &voltage); + if (ret != 0){ + printk("[fgauge_get_profile_id]id_volt read fail\n"); + } else { + id_volt=(voltage*1500)/4096; + printk("[fgauge_get_profile_id]id_volt = %d\n", id_volt); + } if ((sizeof(g_battery_id_voltage) / sizeof(kal_int32)) != TOTAL_BATTERY_NUMBER) { - bm_print(BM_LOG_CRTI, "[fgauge_get_profile_id]error! voltage range incorrect!\n"); + printk("[fgauge_get_profile_id]error! voltage range incorrect!\n"); return; } @@ -275,7 +341,7 @@ void fgauge_get_profile_id(void) } } - bm_print(BM_LOG_CRTI, "[fgauge_get_profile_id]Battery id (%d)\n", g_fg_battery_id); + printk("[fgauge_get_profile_id]Battery id (%d)\n", g_fg_battery_id); } #elif defined(MTK_GET_BATTERY_ID_BY_GPIO) void fgauge_get_profile_id(void) @@ -441,16 +507,17 @@ int BattThermistorConverTemp(int Res) int i = 0; int RES1 = 0, RES2 = 0; int TBatt_Value = -200, TMP1 = 0, TMP2 = 0; + int saddles = sizeof(Batt_Temperature_Table)/sizeof(BATT_TEMPERATURE); if (Res >= Batt_Temperature_Table[0].TemperatureR) { - TBatt_Value = -20; - } else if (Res <= Batt_Temperature_Table[16].TemperatureR) { - TBatt_Value = 60; + TBatt_Value = Batt_Temperature_Table[0].BatteryTemp; + } else if (Res <= Batt_Temperature_Table[saddles-1].TemperatureR) { + TBatt_Value = Batt_Temperature_Table[saddles-1].BatteryTemp; } else { RES1 = Batt_Temperature_Table[0].TemperatureR; TMP1 = Batt_Temperature_Table[0].BatteryTemp; - for (i = 0; i <= 16; i++) { + for (i = 0; i <= saddles-1; i++) { if (Res >= Batt_Temperature_Table[i].TemperatureR) { RES2 = Batt_Temperature_Table[i].TemperatureR; TMP2 = Batt_Temperature_Table[i].BatteryTemp; @@ -1181,6 +1248,463 @@ void fgauge_construct_r_table_profile(kal_int32 temperature, R_PROFILE_STRUC_P t } +#ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA + +kal_int32 get_battery_aging_factor(kal_int32 cycle) +{ + kal_int32 i, f1, f2, c1, c2; + kal_int32 saddles; + + saddles = sizeof(battery_aging_table) / sizeof(BATTERY_CYCLE_STRUC); + + for (i = 0; i < saddles; i++) { + if (battery_aging_table[i].cycle == cycle) + return battery_aging_table[i].aging_factor; + + if (battery_aging_table[i].cycle > cycle) { + if (i == 0) + return 100; + + if (battery_aging_table[i].aging_factor > + battery_aging_table[i - 1].aging_factor) { + f1 = battery_aging_table[i].aging_factor; + f2 = battery_aging_table[i - 1].aging_factor; + c1 = battery_aging_table[i].cycle; + c2 = battery_aging_table[i - 1].cycle; + return f2 + ((cycle - c2) * (f1 - f2)) / (c1 - c2); + } else { + f1 = battery_aging_table[i - 1].aging_factor; + f2 = battery_aging_table[i].aging_factor; + c1 = battery_aging_table[i].cycle; + c2 = battery_aging_table[i - 1].cycle; + return f2 + ((cycle - c2) * (f1 - f2)) / (c1 - c2); + } + } + } + + return battery_aging_table[saddles - 1].aging_factor; +} + +#endif + +void update_qmax_by_cycle(void) +{ +#ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA + kal_int32 factor = 0; + kal_int32 aging_capacity; + + factor = get_battery_aging_factor(gFG_battery_cycle); + + mutex_lock(&qmax_mutex); + if (factor > 0 && factor < 100) { + bm_print(BM_LOG_CRTI, "[FG] cycle count to aging factor %d\n", factor); + aging_capacity = gFG_BATT_CAPACITY * factor / 100; + if (aging_capacity < gFG_BATT_CAPACITY_aging) { + bm_print(BM_LOG_CRTI, "[FG] update gFG_BATT_CAPACITY_aging to %d\n", + aging_capacity); + gFG_BATT_CAPACITY_aging = aging_capacity; + } + } + mutex_unlock(&qmax_mutex); +#endif +} + +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) +#if defined(BATTERY_AGING_DEBUG) +static void dump_battery_cycle_table(void) +{ + int i, saddles; + + saddles = fgauge_get_saddles(); + bm_print(BM_LOG_CRTI,"battery_profile_t0_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t0_500cycle[g_fg_battery_id][i].percentage, + battery_profile_t0_500cycle[i].voltage); + bm_print(BM_LOG_CRTI,"battery_profile_t1_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t1_500cycle[g_fg_battery_id][i].percentage, + battery_profile_t1_500cycle[i].voltage); + bm_print(BM_LOG_CRTI,"battery_profile_t2_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t2_500cycle[g_fg_battery_id][i].percentage, + battery_profile_t2_500cycle[i].voltage); + bm_print(BM_LOG_CRTI,"battery_profile_t3_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t3_500cycle[g_fg_battery_id][i].percentage, + battery_profile_t3_500cycle[i].voltage); + + bm_print(BM_LOG_CRTI,"r_profile_t0_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", r_profile_t0_500cycle[g_fg_battery_id][i].resistance, + r_profile_t0_500cycle[i].voltage); + bm_print(BM_LOG_CRTI,"r_profile_t1_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", r_profile_t1_500cycle[g_fg_battery_id][i].resistance, + r_profile_t1_500cycle[i].voltage); + bm_print(BM_LOG_CRTI,"r_profile_t2_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", r_profile_t2_500cycle[g_fg_battery_id][i].resistance, + r_profile_t2_500cycle[i].voltage); + bm_print(BM_LOG_CRTI,"r_profile_t3_500cycle\n"); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", r_profile_t3_500cycle[g_fg_battery_id][i].resistance, + r_profile_t3_500cycle[i].voltage); + + bm_print(BM_LOG_CRTI,"q_max_t0_aging(%d,%d)\n", + g_Q_MAX_NEG_10_500cycle[g_fg_battery_id], + g_Q_MAX_NEG_10_0cycle[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_t1_aging(%d,%d)\n", + g_Q_MAX_POS_0_500cycle[g_fg_battery_id], + g_Q_MAX_POS_0_0cycle[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_t2_aging(%d,%d)\n", + g_Q_MAX_POS_25_500cycle[g_fg_battery_id], + g_Q_MAX_POS_25_0cycle[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_t3_aging(%d,%d)\n", + g_Q_MAX_POS_50_500cycle[g_fg_battery_id], + g_Q_MAX_POS_50_0cycle[g_fg_battery_id]); + + bm_print(BM_LOG_CRTI,"q_max_t0_h_current_aging(%d,%d)\n", + g_Q_MAX_NEG_10_H_CURRENT_500cycle[g_fg_battery_id], + g_Q_MAX_NEG_10_H_CURRENT_500cycle[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_t1_h_current_aging(%d,%d)\n", + g_Q_MAX_POS_0_H_CURRENT_500cycle[g_fg_battery_id], + g_Q_MAX_POS_0_H_CURRENT_0cycle[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_t2_h_current_aging(%d,%d)\n", + g_Q_MAX_POS_25_H_CURRENT_500cycle[g_fg_battery_id], + g_Q_MAX_POS_25_H_CURRENT_0cycle[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_t3_h_current_aging(%d,%d)\n", + g_Q_MAX_POS_50_H_CURRENT_500cycle[g_fg_battery_id], + g_Q_MAX_POS_50_H_CURRENT_0cycle[g_fg_battery_id]); +} +#endif + +static void dump_current_battery_profile(void) +{ + int i, saddles; + + saddles = fgauge_get_saddles(); + bm_print(BM_LOG_CRTI,"battery_profile_t0, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t0[g_fg_battery_id][i].percentage, + battery_profile_t0[g_fg_battery_id][i].voltage); + bm_print(BM_LOG_CRTI,"battery_profile_t1, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t1[g_fg_battery_id][i].percentage, + battery_profile_t1[g_fg_battery_id][i].voltage); + bm_print(BM_LOG_CRTI,"battery_profile_t2, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t2[g_fg_battery_id][i].percentage, + battery_profile_t2[g_fg_battery_id][i].voltage); + bm_print(BM_LOG_CRTI,"battery_profile_t3, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", battery_profile_t3[g_fg_battery_id][i].percentage, + battery_profile_t3[g_fg_battery_id][i].voltage); + + bm_print(BM_LOG_CRTI,"r_profile_t0, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", + r_profile_t0[g_fg_battery_id][i].resistance, r_profile_t0[g_fg_battery_id][i].voltage); + bm_print(BM_LOG_CRTI,"r_profile_t1, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", + r_profile_t1[g_fg_battery_id][i].resistance, r_profile_t1[g_fg_battery_id][i].voltage); + bm_print(BM_LOG_CRTI,"r_profile_t2, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", + r_profile_t2[g_fg_battery_id][i].resistance, r_profile_t2[g_fg_battery_id][i].voltage); + bm_print(BM_LOG_CRTI,"r_profile_t3, cycle(%d)\n", gFG_battery_cycle); + for (i = 0; i < saddles; i++) + bm_print(BM_LOG_CRTI,"(%d,%d)\n", + r_profile_t3[g_fg_battery_id][i].resistance, r_profile_t3[g_fg_battery_id][i].voltage); + + bm_print(BM_LOG_CRTI,"q_max_neg_10(%d,%d)\n", g_Q_MAX_NEG_10[g_fg_battery_id], + g_Q_MAX_NEG_10_H_CURRENT[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_pos_0(%d,%d)\n", g_Q_MAX_POS_0[g_fg_battery_id], + g_Q_MAX_POS_0_H_CURRENT[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_pos_25(%d,%d)\n", g_Q_MAX_POS_25[g_fg_battery_id], + g_Q_MAX_POS_25_H_CURRENT[g_fg_battery_id]); + bm_print(BM_LOG_CRTI,"q_max_pos_50(%d,%d)\n", g_Q_MAX_POS_50[g_fg_battery_id], + g_Q_MAX_POS_50_H_CURRENT[g_fg_battery_id]); +} + +static int fgauge_aging_value_interpolation(int high_p, int low_p) +{ + int temp_val; + + temp_val = high_p - + ((gFG_battery_cycle * (high_p - low_p)) / MAX_BATTERY_CYCLE); + + return temp_val; +} + +static void fgauge_aging_table_interpolation(void *high_p, + void *temp_p, void *low_p) +{ + R_PROFILE_STRUC_P high_profile_p, temp_profile_p, low_profile_p; + int i, saddles; + kal_int32 temp_v_1 = 0, temp_v_2 = 0; + kal_int32 temp_r_1 = 0, temp_r_2 = 0; + + high_profile_p = (R_PROFILE_STRUC_P) high_p; + temp_profile_p = (R_PROFILE_STRUC_P) temp_p; + low_profile_p = (R_PROFILE_STRUC_P) low_p; + + saddles = fgauge_get_saddles_r_table(); + + /* Interpolation for V_BAT */ + for (i = 0; i < saddles; i++) { + if (((high_profile_p + i)->voltage) > + ((low_profile_p + i)->voltage)) { + temp_v_1 = (high_profile_p + i)->voltage; + temp_v_2 = (low_profile_p + i)->voltage; + + (temp_profile_p + i)->voltage = temp_v_2 + + (((gFG_battery_cycle) * (temp_v_1 - temp_v_2) + ) / MAX_BATTERY_CYCLE); + } else { + temp_v_1 = (low_profile_p + i)->voltage; + temp_v_2 = (high_profile_p + i)->voltage; + + (temp_profile_p + i)->voltage = temp_v_2 + + (((MAX_BATTERY_CYCLE - gFG_battery_cycle) * + (temp_v_1 - temp_v_2)) / MAX_BATTERY_CYCLE); + } + } + + /* Interpolation for R_BAT */ + for (i = 0; i < saddles; i++) { + if (((high_profile_p + i)->resistance) > + ((low_profile_p + i)->resistance)) { + temp_r_1 = (high_profile_p + i)->resistance; + temp_r_2 = (low_profile_p + i)->resistance; + + (temp_profile_p + i)->resistance = temp_r_2 + + (((gFG_battery_cycle) * (temp_r_1 - temp_r_2) + ) / (MAX_BATTERY_CYCLE) + ); + } else { + temp_r_1 = (low_profile_p + i)->resistance; + temp_r_2 = (high_profile_p + i)->resistance; + + (temp_profile_p + i)->resistance = temp_r_2 + + (((MAX_BATTERY_CYCLE - gFG_battery_cycle) + * (temp_r_1 - temp_r_2)) / (MAX_BATTERY_CYCLE) + ); + } + } +} + +static void fgauge_construct_aging_para(void) +{ + fgauge_aging_table_interpolation(&battery_profile_t0_500cycle[g_fg_battery_id][0], + &battery_profile_t0[g_fg_battery_id][0], &battery_profile_t0_0cycle[g_fg_battery_id][0]); + + fgauge_aging_table_interpolation(&battery_profile_t1_500cycle[g_fg_battery_id][0], + &battery_profile_t1[g_fg_battery_id][0], &battery_profile_t1_0cycle[g_fg_battery_id][0]); + + fgauge_aging_table_interpolation(&battery_profile_t2_500cycle[g_fg_battery_id][0], + &battery_profile_t2[g_fg_battery_id][0], &battery_profile_t2_0cycle[g_fg_battery_id][0]); + + fgauge_aging_table_interpolation(&battery_profile_t3_500cycle[g_fg_battery_id][0], + &battery_profile_t3[g_fg_battery_id][0], &battery_profile_t3_0cycle[g_fg_battery_id][0]); + + fgauge_aging_table_interpolation(&r_profile_t0_500cycle[g_fg_battery_id][0], + &r_profile_t0[g_fg_battery_id][0], &r_profile_t0_0cycle[g_fg_battery_id][0]); + + fgauge_aging_table_interpolation(&r_profile_t1_500cycle[g_fg_battery_id][0], + &r_profile_t1[g_fg_battery_id][0], &r_profile_t1_0cycle[g_fg_battery_id][0]); + + fgauge_aging_table_interpolation(&r_profile_t2_500cycle[g_fg_battery_id][0], + &r_profile_t2[g_fg_battery_id][0], &r_profile_t2_0cycle[g_fg_battery_id][0]); + + fgauge_aging_table_interpolation(&r_profile_t3_500cycle[g_fg_battery_id][0], + &r_profile_t3[g_fg_battery_id][0], &r_profile_t3_0cycle[g_fg_battery_id][0]); + + g_Q_MAX_NEG_10[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_NEG_10_0cycle[g_fg_battery_id], + g_Q_MAX_NEG_10_500cycle[g_fg_battery_id]); + g_Q_MAX_POS_0[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_POS_0_0cycle[g_fg_battery_id], + g_Q_MAX_POS_0_500cycle[g_fg_battery_id]); + g_Q_MAX_POS_25[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_POS_25_0cycle[g_fg_battery_id], + g_Q_MAX_POS_25_500cycle[g_fg_battery_id]); + g_Q_MAX_POS_50[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_POS_50_0cycle[g_fg_battery_id], + g_Q_MAX_POS_50_500cycle[g_fg_battery_id]); + + g_Q_MAX_NEG_10_H_CURRENT[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_NEG_10_H_CURRENT_0cycle[g_fg_battery_id], + g_Q_MAX_NEG_10_H_CURRENT_500cycle[g_fg_battery_id]); + g_Q_MAX_POS_0_H_CURRENT[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_POS_0_H_CURRENT_0cycle[g_fg_battery_id], + g_Q_MAX_POS_0_H_CURRENT_500cycle[g_fg_battery_id]); + g_Q_MAX_POS_25_H_CURRENT[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_POS_25_H_CURRENT_0cycle[g_fg_battery_id], + g_Q_MAX_POS_25_H_CURRENT_500cycle[g_fg_battery_id]); + g_Q_MAX_POS_50_H_CURRENT[g_fg_battery_id] = + fgauge_aging_value_interpolation( + g_Q_MAX_POS_50_H_CURRENT_0cycle[g_fg_battery_id], + g_Q_MAX_POS_50_H_CURRENT_500cycle[g_fg_battery_id]); +} + +static void update_aging_profile(void) +{ + mutex_lock(&qmax_mutex); + fgauge_construct_aging_para(); + mutex_unlock(&qmax_mutex); + + if (Enable_FGADC_LOG >= BM_LOG_CRTI) + dump_current_battery_profile(); +} + +static signed int update_battery_cycle(signed int aging_factor) +{ + int old_battery_cycle; + + if (gFG_aging_factor == aging_factor) { + bm_print(BM_LOG_CRTI,"[%s]the same aging factor(%d)\n", + __func__, aging_factor); + } else if (aging_factor <= 100 && aging_factor > 0) { + gFG_aging_factor = aging_factor; + old_battery_cycle = gFG_battery_cycle; + gFG_battery_cycle = aging_factor * MAX_BATTERY_CYCLE / 100; + update_aging_profile(); + bm_print(BM_LOG_CRTI,"[%s](%d), new(%d), old(%d)\n", __func__, + gFG_aging_factor, gFG_battery_cycle, old_battery_cycle); + } + + return gFG_battery_cycle; +} + +static signed int update_battery_aging_factor(signed int cycle) +{ + int old_aging_factor; + + if (gFG_battery_cycle == cycle) { + bm_print(BM_LOG_CRTI,"[%s]the same battery cycle(%d)\n", + __func__, gFG_battery_cycle); + } else if (cycle <= MAX_BATTERY_CYCLE && cycle > 0) { + gFG_battery_cycle = cycle; + old_aging_factor = gFG_aging_factor; + gFG_aging_factor = 100 * cycle / MAX_BATTERY_CYCLE; + update_aging_profile(); + bm_print(BM_LOG_CRTI,"[%s](%d), new(%d), old(%d)\n", __func__, + gFG_battery_cycle, gFG_aging_factor, old_aging_factor); + } + + return gFG_aging_factor; +} +static int check_cond_1(bool breset) +{ + static int cond_1 = AGING_RESET; + int ret = 0, current_soc; + bool hw_charging_done; + + /*reset condition*/ + if (breset) { + cond_1 = AGING_RESET; + return ret; + } + +#if (OAM_D5 == 1) + current_soc = 100 - oam_d_5; +#else + current_soc = 100 - oam_d_2; +#endif + + hw_charging_done = bat_is_charging_full(); + + if ((AGING_RESET == cond_1) && + (current_soc <= 30)) + cond_1 = AGING_STATE_1; + else if (hw_charging_done && + (AGING_STATE_1 == cond_1)) { + cond_1 = AGING_RESET; + ret = 1; + } + + bm_print(BM_LOG_FULL, "[%s]: (%d, %d, %d, %d)\n", __func__, ret, + current_soc, hw_charging_done, cond_1); + + return ret; +} + +static int check_cond_2(bool breset) +{ + int ret = 0; + + /*reset condition*/ + if (breset) { + gFG_pre_columb_count = -1; + gFG_columb_sum = 0; + return ret; + } + + if (-1 == gFG_pre_columb_count) + gFG_pre_columb_count = gFG_columb; + + if (gFG_columb > gFG_pre_columb_count) + gFG_columb_sum += gFG_columb - gFG_pre_columb_count; + + if (gFG_columb_sum >= MAX_AGING_COLUMB_THRES) + ret = 1; + + /* check info */ + bm_print(BM_LOG_FULL, "[%s]: (%d, %d, %d, %d, %d)\n", __func__, ret, + gFG_pre_columb_count, gFG_columb, gFG_columb_sum, MAX_AGING_COLUMB_THRES); + + gFG_pre_columb_count = gFG_columb; + + return ret; +} +static void fgauge_aging_algorithm(void) +{ + bool aging_result = false; + + if(check_cond_1(false)) + aging_result = true; + else if(check_cond_2(false)) + aging_result = true; + + if (aging_result) { + check_cond_1(true); + check_cond_2(true); + + if (gFG_battery_cycle < MAX_BATTERY_CYCLE) { + gFG_battery_cycle += 1; + gFG_aging_factor = (100 * gFG_battery_cycle) + / MAX_BATTERY_CYCLE; + update_aging_profile(); + } + } + + bm_print(BM_LOG_FULL, "[%s]: (%d, %d)\n", __func__, aging_result, gFG_battery_cycle); +} +#endif + +void update_qmax_by_temp(void) +{ + mutex_lock(&qmax_mutex); + gFG_BATT_CAPACITY = fgauge_get_Q_max(gFG_temp); + gFG_BATT_CAPACITY_init_high_current = fgauge_get_Q_max_high_current(gFG_temp); + gFG_BATT_CAPACITY_aging = gFG_BATT_CAPACITY; + mutex_unlock(&qmax_mutex); + + bm_print(BM_LOG_CRTI, + "[fgauge_update_dod] gFG_BATT_CAPACITY=%d, gFG_BATT_CAPACITY_aging=%d, gFG_BATT_CAPACITY_init_high_current=%d\r\n", + gFG_BATT_CAPACITY, gFG_BATT_CAPACITY_aging, + gFG_BATT_CAPACITY_init_high_current); +} + void fgauge_construct_table_by_temp(void) { #if defined(CONFIG_POWER_EXT) @@ -1194,6 +1718,8 @@ void fgauge_construct_table_by_temp(void) curr_temp = battery_meter_get_battery_temperature(); + gFG_temp = curr_temp; + /* Temperature window init */ if (init_temp == KAL_TRUE) { for (i = 0; i < TEMP_AVERAGE_SIZE; i++) { @@ -1217,7 +1743,7 @@ void fgauge_construct_table_by_temp(void) fgauge_get_profile_r_table(TEMPERATURE_T)); fgauge_construct_battery_profile(curr_temp, fgauge_get_profile(TEMPERATURE_T)); last_temp = avg_temp; - temperature_change = 1; + update_qmax_by_temp(); } tempIndex = (tempIndex + 1) % TEMP_AVERAGE_SIZE; @@ -1226,107 +1752,114 @@ void fgauge_construct_table_by_temp(void) } #ifdef CUST_CAPACITY_OCV2CV_TRANSFORM +/* + ZCV table is created by 600mA loading. + Here we calculate average current and get a factor based on 600mA. +*/ void fgauge_get_current_factor(void) { #if defined(CONFIG_POWER_EXT) #else - kal_uint32 i; - static kal_int32 init_current = KAL_TRUE; + kal_uint32 i; + static kal_int32 init_current = KAL_TRUE; + static kal_int32 inst_current, avg_current; + static kal_int32 battCurrentBuffer[TEMP_AVERAGE_SIZE]; + static kal_int32 current_sum; + static kal_uint8 tempcurrentIndex; - static kal_int32 inst_current, avg_current; - static kal_int32 battCurrentBuffer[TEMP_AVERAGE_SIZE]; - static kal_int32 current_sum; + if (g_fg_battery_id == 1) /* SWD battery */ + cv_current = 6000; - static kal_uint8 tempcurrentIndex = 0; + if (KAL_TRUE == gFG_Is_Charging) { + init_current = KAL_TRUE; + g_currentfactor = 100; + bm_print(BM_LOG_CRTI, "[fgauge_get_current_factor] Charging!!\r\n"); + return; + } - if(KAL_TRUE == gFG_Is_Charging) - { - init_current = KAL_TRUE; - g_currentfactor = 100; + inst_current = gFG_current; - bm_print(BM_LOG_CRTI, "[fgauge_get_current_factor] Charging!!\r\n"); - return; - } + if (init_current == KAL_TRUE) { + for (i = 0; i < TEMP_AVERAGE_SIZE; i++) + battCurrentBuffer[i] = cv_current; - inst_current = oam_i_2; + current_sum = cv_current * TEMP_AVERAGE_SIZE; + init_current = KAL_FALSE; + } - // Current window init - if (init_current == KAL_TRUE) - { - for (i=0; iresistance || 0 == p_profile_battery->voltage) - { - bm_print(BM_LOG_CRTI, "[fgauge_get_Q_max_by_current] R-Table profile/OCV table profile : not ready !\r\n"); - return ret_Q_max; - } + if (0 == p_profile_r->resistance || 0 == p_profile_battery->voltage) { + bm_print(BM_LOG_ERROR, "get R-Table profile/OCV table profile : not ready !\r\n"); + return ret_Q_max; + } - saddles = fgauge_get_saddles(); + saddles = fgauge_get_saddles(); - //get Qmax in current temperature(>3.4) - for (iIndex = 0; iIndex < saddles - 1; iIndex++) - { - OCV_temp = (p_profile_battery+iIndex)->voltage; - Rbat_temp = (p_profile_r+iIndex)->resistance; - V_drop = (i_current * Rbat_temp)/10000; + /* get Qmax in current temperature (>3.4) */ + for (iIndex = 0; iIndex < saddles - 1; iIndex++) { + OCV_temp = (p_profile_battery+iIndex)->voltage; + Rbat_temp = (p_profile_r+iIndex)->resistance; + V_drop = (i_current * Rbat_temp)/10000; - if( V_drop > (OCV_temp - 3400)) - { + if (OCV_temp - V_drop < threshold) { if (iIndex <= 1) - ret_Q_max = step_of_Qmax; + ret_Q_max = STEP_OF_QMAX; else - ret_Q_max = (iIndex-1) * step_of_Qmax; - break; - } - } + ret_Q_max = (iIndex-1) * STEP_OF_QMAX; + break; + } + } - bm_print(BM_LOG_CRTI, "[fgauge_get_Q_max_by_current] %d,%d,%d,%d,%d\r\n", \ - i_current, iIndex, OCV_temp, Rbat_temp, ret_Q_max ); + bm_print(BM_LOG_CRTI, "[fgauge_get_Q_max_by_current] %d,%d,%d,%d,%d\r\n", + i_current, iIndex, OCV_temp, Rbat_temp, ret_Q_max); - return ret_Q_max; + return ret_Q_max; } + #endif + void fg_qmax_update_for_aging(void) { #if defined(CONFIG_POWER_EXT) @@ -1427,7 +1960,7 @@ void dod_init(void) #elif defined(SOC_BY_SW_FG) if (((g_rtc_fg_soc != 0) && (((abs(g_rtc_fg_soc - gFG_capacity_by_v)) < CUST_POWERON_DELTA_CAPACITY_TOLRANCE) - || (abs(g_rtc_fg_soc - fgauge_read_capacity_by_v(g_booting_vbat)) < CUST_POWERON_DELTA_CAPACITY_TOLRANCE)) + || (abs(g_rtc_fg_soc - gFG_capacity_by_v_init) < CUST_POWERON_DELTA_CAPACITY_TOLRANCE)) && ((gFG_capacity_by_v > CUST_POWERON_LOW_CAPACITY_TOLRANCE || bat_is_charger_exist() == KAL_TRUE))) @@ -1438,19 +1971,8 @@ void dod_init(void) { gFG_capacity_by_v = g_rtc_fg_soc; } -/*************add by zero***********/ - else if(((g_rtc_fg_soc != 0) && ((((abs(g_rtc_fg_soc-gFG_capacity_by_v)) < 55) && ((abs(g_rtc_fg_soc-gFG_capacity_by_v)) >= CUST_POWERON_DELTA_CAPACITY_TOLRANCE))||(((abs(g_rtc_fg_soc-g_booting_vbat)) < 55) && ((abs(g_rtc_fg_soc-g_booting_vbat))) >= CUST_POWERON_DELTA_CAPACITY_TOLRANCE)) - &&(( gFG_capacity_by_v > CUST_POWERON_LOW_CAPACITY_TOLRANCE || bat_is_charger_exist() == KAL_TRUE))) - || ((g_rtc_fg_soc != 0) &&(g_boot_reason == BR_WDT_BY_PASS_PWK || g_boot_reason == BR_WDT || g_boot_reason == BR_TOOL_BY_PASS_PWK || g_boot_reason == BR_2SEC_REBOOT || g_boot_mode == RECOVERY_BOOT))) - - { - gFG_capacity_by_v = (g_rtc_fg_soc + gFG_capacity_by_v) / 2; - printk("gandy-----set gFG_capacity_by_v = (g_rtc_fg_soc + gFG_capacity_by_v) / 2 = g_rtc_fg_soc; "); - } - /**********end********************/ #endif - bm_print(BM_LOG_CRTI, "[FGADC] g_rtc_fg_soc=%d, gFG_capacity_by_v=%d\n", - g_rtc_fg_soc, gFG_capacity_by_v); + pr_notice("[FGADC] g_rtc_fg_soc=%d, gFG_capacity_by_v=%d\n", g_rtc_fg_soc, gFG_capacity_by_v); if (gFG_capacity_by_v == 0 && bat_is_charger_exist() == KAL_TRUE) { gFG_capacity_by_v = 1; @@ -1529,65 +2051,21 @@ void oam_init(void) ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &gFG_voltage); ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_SENSE, &g_booting_vbat); -/********add by zero ********************/ - printk("zero----in function ====%s\n",__func__); - printk("zero---gFG_voltage=%d,g_booting_vbat = %d\n",gFG_voltage,g_booting_vbat); - - if(bat_is_charger_exist() == KAL_TRUE) - { - #ifdef CONFIG_USB_PLUS_DC - printk("zero---BMT_status.charger_type = %d\n",dc_in_state()); - if (dc_in_state() == 0) - { - if(gFG_voltage > 3600 && gFG_voltage < 3700) - gFG_voltage = gFG_voltage - 30; - else if(gFG_voltage >= 3700 && gFG_voltage < 4100) - gFG_voltage = gFG_voltage - 90; - else if(gFG_voltage >= 4100 && gFG_voltage < 4190) - gFG_voltage = gFG_voltage - 30; - } - else - { - if(gFG_voltage > 3600 && gFG_voltage < 3700) - gFG_voltage = gFG_voltage - 15; - else if(gFG_voltage >= 3700 && gFG_voltage < 4100) - gFG_voltage = gFG_voltage - 60; - else if(gFG_voltage >= 4100 && gFG_voltage < 4190) - gFG_voltage = gFG_voltage - 15; - } - #else - if(gFG_voltage > 3650 && gFG_voltage < 3715) - gFG_voltage = gFG_voltage - 30; - else if(gFG_voltage >= 3715&& gFG_voltage < 4100) - gFG_voltage = gFG_voltage - 20; - else if(gFG_voltage >= 4100 && gFG_voltage < 4190) - gFG_voltage = gFG_voltage - 10; - #endif - } - else - { -/* [BUGFIX]-Add-BEGIN by TCTSZ.leo.guo, 05/26/2015, Fixed voltage calculate to report soc.*/ - printk("Fixed voltage calculate to report soc."); - if(gFG_voltage <= 3500) - gFG_voltage = gFG_voltage - 50; -/* [BUGFIX]-Add-END by TCTSZ.leo.guo, 05/26/2015*/ - } - printk("zero---gFG_voltage=%d\n",gFG_voltage); - /************add by zero ************************/ + gFG_capacity_by_v = fgauge_read_capacity_by_v(gFG_voltage); vbat_capacity = fgauge_read_capacity_by_v(g_booting_vbat); + pr_notice("[oam_init_inf] gFG_capacity_by_v=%d, vbat_capacity=%d,\n", + gFG_capacity_by_v, vbat_capacity); + if (bat_is_charger_exist() == KAL_TRUE) { - bm_print(BM_LOG_CRTI, "[oam_init_inf] gFG_capacity_by_v=%d, vbat_capacity=%d,\n", - gFG_capacity_by_v, vbat_capacity); /* to avoid plug in cable without battery, then plug in battery to make hw soc = 100% */ /* if the difference bwtween ZCV and vbat is too large, using vbat instead ZCV */ if (((gFG_capacity_by_v == 100) && (vbat_capacity < CUST_POWERON_MAX_VBAT_TOLRANCE)) || (abs(gFG_capacity_by_v - vbat_capacity) > CUST_POWERON_DELTA_VBAT_TOLRANCE)) { - bm_print(BM_LOG_CRTI, - "[oam_init] fg_vbat=(%d), vbat=(%d), set fg_vat as vat\n", + pr_notice("[oam_init] fg_vbat=(%d), vbat=(%d), set fg_vat as vat\n", gFG_voltage, g_booting_vbat); gFG_voltage = g_booting_vbat; @@ -1641,7 +2119,6 @@ void oam_init(void) } - void oam_run(void) { int vol_bat = 0; @@ -1649,15 +2126,6 @@ void oam_run(void) /* int d_hw_ocv=0; */ int charging_current = 0; int ret = 0; - -#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM - // Reconstruct table if temp changed; - fgauge_construct_table_by_temp(); - - // Get current factor - fgauge_get_current_factor(); -#endif - /* kal_uint32 now_time; */ struct timespec now_time; kal_int32 delta_time = 0; @@ -1684,6 +2152,17 @@ void oam_run(void) oam_i_1 = (((oam_v_ocv_1 - vol_bat) * 1000) * 10) / oam_r_1; /* 0.1mA */ oam_i_2 = (((oam_v_ocv_2 - vol_bat) * 1000) * 10) / oam_r_2; /* 0.1mA */ +#ifdef CONFIG_AUSTIN_PROJECT + if(oam_i_2 < 0) { + charging_current = get_charging_setting_current()/10; + if (abs(oam_i_2) > charging_current) { + charging_current = oam_i_2; + oam_i_2 = 0 - get_charging_setting_current()/10; + pr_notice("[%s] use max charging current: (%d, %d)\n", __func__, oam_i_2, charging_current); + } + } +#endif + oam_car_1 = (oam_i_1 * delta_time / 3600) + oam_car_1; /* 0.1mAh */ oam_car_2 = (oam_i_2 * delta_time / 3600) + oam_car_2; /* 0.1mAh */ @@ -1711,7 +2190,9 @@ void oam_run(void) oam_v_ocv_2 = fgauge_read_v_by_d(oam_d_2); oam_r_2 = fgauge_read_r_bat_by_v(oam_v_ocv_2); - +#ifdef CONFIG_AUSTIN_PROJECT + oam_r_2 = oam_r_2 + g_fg_dbg_bat_offset_r; +#endif #if 0 oam_d_4 = (oam_d_2 + oam_d_3) / 2; #else @@ -1816,6 +2297,38 @@ void oam_run(void) bm_print(BM_LOG_CRTI, "[oam_result_inf] %d, %d, %d, %d, %d, %d\n", oam_d_1, oam_d_2, oam_d_3, oam_d_4, oam_d_5, BMT_status.UI_SOC); + + /* update debug tool for sw fg */ + g_fg_dbg_bat_volt = vol_bat; + + /* debug sysfs show negative for discharging, positive for charging */ + g_fg_dbg_bat_current = -oam_i_2; + + g_fg_dbg_bat_zcv = oam_v_ocv_2; + g_fg_dbg_bat_temp = gFG_temp; + g_fg_dbg_bat_r = oam_r_2; + g_fg_dbg_bat_car = gFG_columb; + g_fg_dbg_bat_qmax = gFG_BATT_CAPACITY_aging; + g_fg_dbg_d0 = oam_d0; + g_fg_dbg_d1 = oam_d_2; + g_fg_dbg_percentage = bat_get_ui_percentage(); + g_fg_dbg_percentage_fg = 100 - oam_d_2; + g_fg_dbg_percentage_voltmode = 100 - oam_d_5; + + /* set gFG_current always positive */ + if (oam_i_2 > 0) + gFG_current = oam_i_2; + else + gFG_current = -oam_i_2; + +#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM + fgauge_get_current_factor(); +#endif + +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) + fgauge_aging_algorithm(); +#endif } /* ============================================================ // */ @@ -2026,11 +2539,6 @@ kal_int32 fgauge_update_dod(void) { kal_int32 FG_dod_1 = 0; int adjust_coulomb_counter = CAR_TUNE_VALUE; -#ifdef Q_MAX_BY_CURRENT - kal_int32 C_0mA=0; - kal_int32 C_400mA=0; - kal_int32 C_FGCurrent=0; -#endif if (gFG_DOD0 > 100) { gFG_DOD0 = 100; @@ -2043,33 +2551,13 @@ kal_int32 fgauge_update_dod(void) } else { } - gFG_temp = force_get_tbat(KAL_FALSE); - - if (temperature_change == 1) { - gFG_BATT_CAPACITY = fgauge_get_Q_max(gFG_temp); - bm_print(BM_LOG_CRTI, - "[fgauge_update_dod] gFG_BATT_CAPACITY=%d, gFG_BATT_CAPACITY_aging=%d, gFG_BATT_CAPACITY_init_high_current=%d\r\n", - gFG_BATT_CAPACITY, gFG_BATT_CAPACITY_aging, - gFG_BATT_CAPACITY_init_high_current); - temperature_change = 0; - } -#if 0 - C_0mA = fgauge_get_Q_max(gFG_temp); - C_400mA = fgauge_get_Q_max_high_current(gFG_temp); - C_FGCurrent = C_0mA - (C_0mA-C_400mA) * gFG_current_AVG / 4000; - if (C_FGCurrent!=0) - FG_dod_1 = gFG_DOD0 - ((gFG_columb*100)/gFG_BATT_CAPACITY_aging)*C_0mA/C_FGCurrent; - - bm_print(BM_LOG_CRTI, "[fgauge_update_dod] FG_dod_1=%d, adjust_coulomb_counter=%d, gFG_columb=%d, gFG_DOD0=%d, gFG_temp=%d, gFG_BATT_CAPACITY=%d, C_0mA=%d, C_400mA=%d, C_FGCurrent=%d, gFG_current_AVG=%d\n", - FG_dod_1, adjust_coulomb_counter, gFG_columb, gFG_DOD0, gFG_temp, gFG_BATT_CAPACITY, C_0mA, C_400mA, C_FGCurrent, gFG_current_AVG); -#else FG_dod_1 = gFG_DOD0 - ((gFG_columb * 100) / gFG_BATT_CAPACITY_aging); bm_print(BM_LOG_FULL, "[fgauge_update_dod] FG_dod_1=%d, adjust_coulomb_counter=%d, gFG_columb=%d, gFG_DOD0=%d, gFG_temp=%d, gFG_BATT_CAPACITY=%d\r\n", FG_dod_1, adjust_coulomb_counter, gFG_columb, gFG_DOD0, gFG_temp, gFG_BATT_CAPACITY); -#endif + if (FG_dod_1 > 100) { FG_dod_1 = 100; bm_print(BM_LOG_FULL, "[fgauge_update_dod] FG_dod_1 set to 100, gFG_columb=%d\r\n", @@ -2091,12 +2579,6 @@ kal_int32 fgauge_read_capacity(kal_int32 type) kal_int32 temperature; kal_int32 dvalue = 0; -#ifndef CUST_DISABLE_CAPACITY_OCV2CV_TRANSFORM - kal_int32 C_0mA = 0; - kal_int32 C_400mA = 0; - kal_int32 dvalue_new = 0; -#endif - kal_int32 temp_val = 0; if (type == 0) /* for initialization */ @@ -2112,19 +2594,18 @@ kal_int32 fgauge_read_capacity(kal_int32 type) gFG_DOD1 = dvalue; -#ifndef CUST_DISABLE_CAPACITY_OCV2CV_TRANSFORM - /* User View on HT~LT---------------------------------------------------------- */ - gFG_temp = force_get_tbat(KAL_FALSE); - C_0mA = fgauge_get_Q_max(gFG_temp); - C_400mA = fgauge_get_Q_max_high_current(gFG_temp); - if (C_0mA > C_400mA) { - dvalue_new = (100 - dvalue) - (((C_0mA - C_400mA) * (dvalue)) / C_400mA); - dvalue = 100 - dvalue_new; - } - bm_print(BM_LOG_FULL, "[fgauge_read_capacity] %d,%d,%d,%d,%d,D1=%d,D0=%d\r\n", - gFG_temp, C_0mA, C_400mA, dvalue, dvalue_new, gFG_DOD1, gFG_DOD0); +#if 0 + /* Battery Aging update ---------------------------------------------------------- */ + dvalue_new = dvalue; + dvalue = + ((dvalue_new * gFG_BATT_CAPACITY_init_high_current * 100) / gFG_BATT_CAPACITY_aging) / + 100; + bm_print(BM_LOG_FULL, + "[fgauge_read_capacity] dvalue=%d, dvalue_new=%d, gFG_BATT_CAPACITY_init_high_current=%d, gFG_BATT_CAPACITY_aging=%d\r\n", + dvalue, dvalue_new, gFG_BATT_CAPACITY_init_high_current, gFG_BATT_CAPACITY_aging); /* ---------------------------------------------------------------------------- */ -#endif /* CUST_DISABLE_CAPACITY_OCV2CV_TRANSFORM */ +#endif + temp_val = dvalue; dvalue = 100 - temp_val; @@ -2164,7 +2645,7 @@ void fgauge_algo_run(void) { int i = 0; int ret = 0; -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT +#if defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) int columb_delta = 0; int charge_current = 0; #endif @@ -2181,9 +2662,13 @@ void fgauge_algo_run(void) gFG_voltage = gFG_voltage + fgauge_compensate_battery_voltage_recursion(gFG_voltage, 5); /* mV */ gFG_voltage = gFG_voltage + OCV_BOARD_COMPESATE; +#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM + fgauge_get_current_factor(); +#endif + ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR, &gFG_columb); -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT +#if defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) if (gFG_Is_Charging) { charge_current -= gFG_current; if (charge_current < gFG_min_current) @@ -2211,17 +2696,6 @@ void fgauge_algo_run(void) gFG_columb_sum); #endif - // add by willcai 2014-12-18 begin - if(BMT_status.charger_exist == KAL_FALSE) { - if(gFG_Is_offset_init == KAL_FALSE) { - for (i=0; i= gFG_voltage_AVG) { @@ -2256,37 +2730,7 @@ void fgauge_algo_run(void) bm_print(BM_LOG_FULL, "Avg_V need write back to V : V=%d,Avg_V=%d.\r\n", gFG_voltage, gFG_voltage_AVG); } - } else { - gFG_Is_offset_init = KAL_FALSE; - } -#ifdef Q_MAX_BY_CURRENT -/* 1.2 Average FG_current */ - /**************** Averaging : START ****************/ - if (gFG_current_AVG == 0) { - for (i=0; i= FG_CURRENT_AVERAGE_SIZE) - FGCurrentIndex = 0; - bm_print(BM_LOG_FULL, "[FG_BUFFER] "); - for (i=0; i gFG_max_voltage) { gFG_max_voltage = g_sw_vbat_temp; } @@ -2655,17 +3092,16 @@ kal_int32 battery_meter_get_charging_current(void) { #ifdef DISABLE_CHARGING_CURRENT_MEASURE return 0; -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 2015.06.10, Added measure current feature */ -#else - kal_int32 ADC_BAT_SENSE_tmp[10] = - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +#elif !defined (EXTERNAL_SWCHR_SUPPORT) + kal_int32 ADC_BAT_SENSE_tmp[20] = + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; kal_int32 ADC_BAT_SENSE_sum = 0; kal_int32 ADC_BAT_SENSE = 0; - kal_int32 ADC_I_SENSE_tmp[10] = - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + kal_int32 ADC_I_SENSE_tmp[20] = + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; kal_int32 ADC_I_SENSE_sum = 0; kal_int32 ADC_I_SENSE = 0; - int repeat = 10; + int repeat = 20; int i = 0; int j = 0; kal_int32 temp = 0; @@ -2721,14 +3157,18 @@ kal_int32 battery_meter_get_charging_current(void) bm_print(BM_LOG_FULL, "\r\n"); ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[0]; - ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[9]; - ADC_BAT_SENSE = ADC_BAT_SENSE_sum / (repeat - 2); + ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[1]; + ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[18]; + ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[19]; + ADC_BAT_SENSE = ADC_BAT_SENSE_sum / (repeat - 4); bm_print(BM_LOG_FULL, "[g_Get_I_Charging] ADC_BAT_SENSE=%d\r\n", ADC_BAT_SENSE); ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[0]; - ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[9]; - ADC_I_SENSE = ADC_I_SENSE_sum / (repeat - 2); + ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[1]; + ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[18]; + ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[19]; + ADC_I_SENSE = ADC_I_SENSE_sum / (repeat - 4); bm_print(BM_LOG_FULL, "[g_Get_I_Charging] ADC_I_SENSE(Before)=%d\r\n", ADC_I_SENSE); @@ -2742,8 +3182,9 @@ kal_int32 battery_meter_get_charging_current(void) } return ICharging; +#else + return 0; #endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo, 2015.06.10 */ } kal_int32 battery_meter_get_battery_current(void) @@ -2787,7 +3228,8 @@ kal_int32 battery_meter_get_car(void) kal_int32 battery_meter_get_battery_temperature(void) { -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) kal_int32 batt_temp = force_get_tbat(KAL_TRUE); if (batt_temp > gFG_max_temperature) @@ -2796,15 +3238,8 @@ kal_int32 battery_meter_get_battery_temperature(void) gFG_min_temperature = batt_temp; return batt_temp; -#else -//[FEATURE]-Add-BEGIN by huichen@tcl.com,04/03/2015,mini sw pr964182 -#ifdef TARGET_BUILD_MMITEST -return 25; #else return force_get_tbat(KAL_TRUE); -#endif -//[FEATURE]-Add-END by huichen@tcl.com,04/03/2015,mini sw pr964182 - #endif } @@ -2822,57 +3257,62 @@ kal_int32 battery_meter_get_charger_voltage(void) kal_int32 battery_meter_get_battery_soc(void) { -#if (OAM_D5 == 1) - return (100-oam_d_5); -#else - return (100-oam_d_2); +#if defined(SOC_BY_HW_FG) + return gFG_capacity_by_c; +#endif + +#if defined(SOC_BY_SW_FG) + return 100 - oam_d_2; #endif } #ifdef CUST_CAPACITY_OCV2CV_TRANSFORM -void battery_meter_set_reset_soc(kal_bool bUSE_UI_SOC) -{ - g_USE_UI_SOC = bUSE_UI_SOC; -} - +/* Here we compensate D1 by a factor from Qmax with loading. */ kal_int32 battery_meter_trans_battery_percentage(kal_int32 d_val) { - kal_int32 d_val_temp = 0; - kal_int32 d_val_new = 0; - kal_int32 temp_val = 0; - kal_int32 C_0mA=0; - kal_int32 C_400mA=0; - kal_int32 i_avg_current = 0; + kal_int32 d_val_before = 0; + kal_int32 temp_val = 0; + kal_int32 C_0mA = 0; + kal_int32 C_600mA = 0; + kal_int32 C_current = 0; + kal_int32 i_avg_current = 0; - //User View on HT~LT---------------------------------------------------------- - d_val_temp = d_val; - temp_val = battery_meter_get_battery_temperature(); - C_0mA = fgauge_get_Q_max(temp_val); -/* [BUGFIX]-Add-BEGIN by TCTSZ.leo.guo, 06/25/2015, Fixed voltage calculate to report error soc. */ - if(gFG_Is_Charging == KAL_TRUE) - return d_val; -/* [BUGFIX]-Add-BEGIN by TCTSZ.leo.guo, 06/25/2015 */ - // discharging and current > 600ma - i_avg_current = g_currentfactor * 6000/100; - if(KAL_FALSE == gFG_Is_Charging && g_currentfactor > 100) - C_400mA = fgauge_get_Q_max_high_current_by_current(i_avg_current, temp_val); - else - C_400mA = fgauge_get_Q_max_high_current(temp_val); + d_val_before = d_val; + temp_val = battery_meter_get_battery_temperature(); + C_0mA = fgauge_get_Q_max(temp_val); - if(C_0mA > C_400mA) - { - d_val_new = (100 - d_val) - (((C_0mA-C_400mA) * (d_val)) / C_400mA); -/* [BUGFIX]-Add-BEGIN by TCTSZ.leo.guo, 06/25/2015, Fixed voltage calculate to report error soc. */ - if(d_val_new > 0) d_val = 100 - d_val_new; -/* [BUGFIX]-Add-BEGIN by TCTSZ.leo.guo, 06/25/2015 */ - } - bm_print(BM_LOG_FULL, "[battery_meter_trans_battery_percentage] %d,%d,%d,%d,%d,%d,%d\r\n", - temp_val, C_0mA, C_400mA, d_val_temp, d_val_new, d_val, g_currentfactor); - //---------------------------------------------------------------------------- + /* discharging and current > 600ma */ + i_avg_current = g_currentfactor * cv_current/100; + if (KAL_FALSE == gFG_Is_Charging && g_currentfactor > 100) { + C_600mA = fgauge_get_Q_max_high_current(temp_val); + C_current = fgauge_get_Q_max_high_current_by_current(i_avg_current, temp_val); - return d_val; + if (C_current < C_600mA) + C_600mA = C_current; + } else + C_600mA = fgauge_get_Q_max_high_current(temp_val); + + if (C_0mA > C_600mA) { + if (KAL_TRUE == gFG_Is_Charging) + d_val = d_val - + (((C_0mA - C_600mA) * (100 - d_val)) / C_600mA); + else + d_val = d_val + + (((C_0mA - C_600mA) * (d_val)) / C_600mA); + } + + if (d_val > 100) + d_val = 100; + else if (d_val < 0) + d_val = 0; + + bm_print(BM_LOG_CRTI, "[battery_meter_trans_battery_percentage] %d,%d,%d,%d,%d,%d\r\n", + temp_val, C_0mA, C_600mA, d_val_before, d_val, g_currentfactor); + + return d_val; } #endif + kal_int32 battery_meter_get_battery_percentage(void) { #if defined(CONFIG_POWER_EXT) @@ -2891,27 +3331,28 @@ kal_int32 battery_meter_get_battery_percentage(void) return auxadc_algo_run(); } else { fgauge_algo_run(); - return gFG_capacity_by_c; /* hw fg, //return gfg_percent_check_point; // voltage mode */ + +#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM + /* We keep gFG_capacity_by_c as capacity before compensation */ + /* Compensated capacity is returned for UI SOC tracking */ + return 100 - battery_meter_trans_battery_percentage(100-gFG_capacity_by_c); +#else + return gFG_capacity_by_c; +#endif } #endif #if defined(SOC_BY_SW_FG) oam_run(); - - #ifdef CUST_CAPACITY_OCV2CV_TRANSFORM - #if (OAM_D5 == 1) - return (100-battery_meter_trans_battery_percentage(oam_d_5)); - #else - return (100-battery_meter_trans_battery_percentage(oam_d_2)); - #endif - #else - #if (OAM_D5 == 1) - return (100-oam_d_5); - #else - return (100-oam_d_2); - #endif - #endif - +#if (OAM_D5 == 1) + return 100 - oam_d_5; +#else +#ifdef CUST_CAPACITY_OCV2CV_TRANSFORM + return 100 - battery_meter_trans_battery_percentage(oam_d_2); +#else + return 100 - oam_d_2; +#endif +#endif #endif #endif @@ -2964,7 +3405,7 @@ void reset_parameter_car(void) ret = battery_meter_ctrl(BATTERY_METER_CMD_HW_RESET, NULL); gFG_columb = 0; -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT +#if defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) gFG_pre_columb_count = 0; #endif @@ -2982,6 +3423,12 @@ void reset_parameter_car(void) oam_car_1 = 0; oam_car_2 = 0; gFG_columb = 0; + +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) + gFG_pre_columb_count = -1; +#endif + #endif } @@ -3030,21 +3477,19 @@ void reset_parameter_dod_full(kal_uint32 ui_percentage) #endif } -kal_int32 battery_meter_reset(void) +kal_int32 battery_meter_reset(kal_bool bUI_SOC) { #if defined(CONFIG_POWER_EXT) return 0; #else kal_uint32 ui_percentage = bat_get_ui_percentage(); - #ifdef CUST_CAPACITY_OCV2CV_TRANSFORM - if (KAL_FALSE == g_USE_UI_SOC) { - /*use battery_soc*/ - ui_percentage = battery_meter_get_battery_soc(); - g_USE_UI_SOC = KAL_TRUE; - bm_print(BM_LOG_FULL, "[CUST_CAPACITY_OCV2CV_TRANSFORM]Use Battery SOC: %d\n", ui_percentage); - } + if (KAL_FALSE == bUI_SOC) { + ui_percentage = battery_meter_get_battery_soc(); + bm_print(BM_LOG_FULL, "[CUST_CAPACITY_OCV2CV_TRANSFORM]Use Battery SOC: %d\n", ui_percentage); + } #endif +#if defined(SOC_BY_HW_FG) if (bat_is_charging_full() == KAL_TRUE) /* charge full */ { if (fg_qmax_update_for_aging_flag == 1) { @@ -3052,6 +3497,7 @@ kal_int32 battery_meter_reset(void) fg_qmax_update_for_aging_flag = 0; } } +#endif reset_parameter_car(); reset_parameter_dod_full(ui_percentage); @@ -3190,87 +3636,44 @@ int init_proc_log_fg(void) return ret; } -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) /* ============================================================ // */ - -#ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA - -kal_int32 get_battery_aging_factor(kal_int32 cycle) +static bool custom_battery_cycle; +static ssize_t show_FG_Battery_Cycle(struct device *dev, + struct device_attribute *attr, char *buf) { - kal_int32 i, f1, f2, c1, c2; - kal_int32 saddles; + signed int val; - saddles = sizeof(battery_aging_table) / sizeof(BATTERY_CYCLE_STRUC); + if (custom_battery_cycle) + val = 0 - gFG_battery_cycle; + else + val = gFG_battery_cycle; - for (i = 0; i < saddles; i++) { - if (battery_aging_table[i].cycle == cycle) { - return battery_aging_table[i].aging_factor; - } - - if (battery_aging_table[i].cycle > cycle) { - if (i == 0) { - return 100; - } - - if (battery_aging_table[i].aging_factor > - battery_aging_table[i - 1].aging_factor) { - f1 = battery_aging_table[i].aging_factor; - f2 = battery_aging_table[i - 1].aging_factor; - c1 = battery_aging_table[i].cycle; - c2 = battery_aging_table[i - 1].cycle; - return (f2 + ((cycle - c2) * (f1 - f2)) / (c1 - c2)); - } else { - f1 = battery_aging_table[i - 1].aging_factor; - f2 = battery_aging_table[i].aging_factor; - c1 = battery_aging_table[i].cycle; - c2 = battery_aging_table[i - 1].cycle; - return (f2 + ((cycle - c2) * (f1 - f2)) / (c1 - c2)); - } - } - } - - return battery_aging_table[saddles - 1].aging_factor; -} - -#endif - -static ssize_t show_FG_Battery_Cycle(struct device *dev, struct device_attribute *attr, char *buf) -{ - bm_print(BM_LOG_CRTI, "[FG] gFG_battery_cycle : %d\n", gFG_battery_cycle); - return sprintf(buf, "%d\n", gFG_battery_cycle); + pr_debug("[FG] gFG_battery_cycle : (%d, %d)\n", + gFG_battery_cycle, val); + return sprintf(buf, "%d\n", val); } static ssize_t store_FG_Battery_Cycle(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - kal_int32 cycle; + signed int cycle; -#ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA - kal_int32 aging_capacity; - kal_int32 factor; -#endif + if (0 == kstrtoint(buf, 0, &cycle)) { + pr_debug("[FG] input cycle:%d\n", cycle); + if (abs(cycle) <= MAX_BATTERY_CYCLE) { + if (cycle < 0) { + custom_battery_cycle = true; + cycle = 0 - cycle; + } else + custom_battery_cycle = false; - if (1 == sscanf(buf, "%d", &cycle)) { - bm_print(BM_LOG_CRTI, "[FG] update battery cycle count: %d\n", cycle); - gFG_battery_cycle = cycle; - -#ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA - /* perform cycle aging calculation */ - - factor = get_battery_aging_factor(gFG_battery_cycle); - if (factor > 0 && factor < 100) { - bm_print(BM_LOG_CRTI, "[FG] cycle count to aging factor %d\n", factor); - aging_capacity = gFG_BATT_CAPACITY * factor / 100; - if (aging_capacity < gFG_BATT_CAPACITY_aging) { - bm_print(BM_LOG_CRTI, "[FG] update gFG_BATT_CAPACITY_aging to %d\n", - aging_capacity); - gFG_BATT_CAPACITY_aging = aging_capacity; - } + update_battery_aging_factor(cycle); } -#endif } else { - bm_print(BM_LOG_CRTI, "[FG] format error!\n"); + pr_notice("[FG] format error!\n"); } return size; } @@ -3450,29 +3853,15 @@ static ssize_t show_FG_Aging_Factor(struct device *dev, struct device_attribute static ssize_t store_FG_Aging_Factor(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { - kal_int32 factor; - kal_int32 aging_capacity; + signed int factor; - if (1 == sscanf(buf, "%d", &factor)) { + if (0 == kstrtoint(buf, 0, &factor)) { + pr_debug("[FG] input factor:%d\n", factor); if (factor <= 100 && factor >= 0) { - bm_print(BM_LOG_CRTI, - "[FG] update battery aging factor: old(%d), new(%d)\n", - gFG_aging_factor, factor); - - gFG_aging_factor = factor; - - if (gFG_aging_factor != 100) { - aging_capacity = gFG_BATT_CAPACITY * gFG_aging_factor / 100; - if (aging_capacity < gFG_BATT_CAPACITY_aging) { - bm_print(BM_LOG_CRTI, - "[FG] update gFG_BATT_CAPACITY_aging to %d\n", - aging_capacity); - gFG_BATT_CAPACITY_aging = aging_capacity; - } - } + update_battery_cycle(factor); } } else { - bm_print(BM_LOG_CRTI, "[FG] format error!\n"); + pr_notice("[FG] format error!\n"); } return size; @@ -3487,8 +3876,9 @@ static DEVICE_ATTR(FG_Aging_Factor, 0664, show_FG_Aging_Factor, store_FG_Aging_F /* ============================================================ // */ static ssize_t show_FG_Current(struct device *dev, struct device_attribute *attr, char *buf) { - kal_int32 ret = 0; kal_int32 fg_current_inout_battery = 0; +#if defined(SOC_BY_HW_FG) + kal_int32 ret = 0; kal_int32 val = 0; kal_bool is_charging = 0; @@ -3500,7 +3890,9 @@ static ssize_t show_FG_Current(struct device *dev, struct device_attribute *attr } else { fg_current_inout_battery = val; } - +#else + fg_current_inout_battery = g_fg_dbg_bat_current; +#endif bm_print(BM_LOG_CRTI, "[FG] gFG_current_inout_battery : %d\n", fg_current_inout_battery); return sprintf(buf, "%d\n", fg_current_inout_battery); } @@ -3590,6 +3982,32 @@ static ssize_t store_FG_g_fg_dbg_bat_r(struct device *dev, struct device_attribu } static DEVICE_ATTR(FG_g_fg_dbg_bat_r, 0664, show_FG_g_fg_dbg_bat_r, store_FG_g_fg_dbg_bat_r); +#ifdef CONFIG_AUSTIN_PROJECT +/* ------------------------------------------------------------------------------------------- */ +static ssize_t show_FG_g_fg_dbg_bat_offset_r(struct device *dev, struct device_attribute *attr, char *buf) +{ + bm_print(BM_LOG_CRTI, "[FG] g_fg_dbg_bat_offset_r : %d\n", g_fg_dbg_bat_offset_r); + return sprintf(buf, "%d\n", g_fg_dbg_bat_offset_r); +} + +static ssize_t store_FG_g_fg_dbg_bat_offset_r(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int offset_r = 0; + if (1 == sscanf(buf, "%d", &offset_r)) { + if((offset_r > -40) && (offset_r < 150)) + g_fg_dbg_bat_offset_r = offset_r; + else + bm_print(BM_LOG_CRTI, "[FG] format error!\n"); + } + else { + bm_print(BM_LOG_CRTI, "[FG] format error!\n"); + } + + return size; +} +static DEVICE_ATTR(FG_g_fg_dbg_bat_offset_r, 0664, show_FG_g_fg_dbg_bat_offset_r, store_FG_g_fg_dbg_bat_offset_r); +#endif /* ------------------------------------------------------------------------------------------- */ static ssize_t show_FG_g_fg_dbg_bat_car(struct device *dev, struct device_attribute *attr, char *buf) @@ -3730,6 +4148,9 @@ static int battery_meter_probe(struct platform_device *dev) ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_zcv); ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_temp); ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_r); +#ifdef CONFIG_AUSTIN_PROJECT + ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_offset_r); +#endif ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_car); ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_qmax); ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_d0); @@ -3739,7 +4160,8 @@ static int battery_meter_probe(struct platform_device *dev) ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_percentage_voltmode); -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT +#if defined(CONFIG_AUSTIN_PROJECT) \ + && defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Battery_Cycle); ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Aging_Factor); ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Max_Battery_Voltage); @@ -3769,7 +4191,7 @@ static int battery_meter_suspend(struct platform_device *dev, pm_message_t state #if defined(CONFIG_POWER_EXT) #elif defined(SOC_BY_SW_FG) || defined(SOC_BY_HW_FG) - struct timespec xts, tom; + struct timespec tom; #endif /* -- hibernation path */ if (state.event == PM_EVENT_FREEZE) { @@ -3785,20 +4207,10 @@ static int battery_meter_suspend(struct platform_device *dev, pm_message_t state if (KAL_TRUE == bat_is_ext_power()) return 0; #endif - - /*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ - #if 0 get_xtime_and_monotonic_and_sleep_offset(&xts_before_sleep, &tom, &g_rtc_time_before_sleep); - if (_g_bat_sleep_total_time < g_spm_timer) { - return 0; - } - _g_bat_sleep_total_time = 0; - #else - get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &g_rtc_time_before_sleep); - before_sleep_time = rtc_read_hw_time(); - #endif - /*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ + if (_g_bat_sleep_total_time >= g_spm_timer) + _g_bat_sleep_total_time = 0; battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &g_hw_ocv_before_sleep); } #endif @@ -3915,10 +4327,9 @@ static void battery_aging_check(void) aging_dod_1, aging_car_1, aging_ocv_2, aging_dod_2, aging_car_2); -#ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT - gFG_aging_factor = - ((gFG_BATT_CAPACITY - - qmax_aging) * 100) / gFG_BATT_CAPACITY; +#if defined(CONFIG_MTK_BATTERY_LIFETIME_DATA_SUPPORT) + gFG_aging_factor = 100 - + ((gFG_BATT_CAPACITY - qmax_aging) * 100) / gFG_BATT_CAPACITY; #endif if (gFG_BATT_CAPACITY_aging > qmax_aging) { @@ -3934,6 +4345,8 @@ static void battery_aging_check(void) "[aging check] current qmax_aging %d is smaller than calculated qmax_aging %d\n", gFG_BATT_CAPACITY_aging, qmax_aging); } + aging_ocv_1 = 0; + aging_ocv_2 = 0; } else { aging_ocv_2 = 0; bm_print(BM_LOG_CRTI, @@ -3970,7 +4383,7 @@ static void battery_aging_check(void) gFG_DOD0 = DOD_hwocv; gFG_DOD1 = gFG_DOD0; reset_parameter_car(); - bm_print(BM_LOG_CRTI, + pr_notice( "[self-discharge check] reset to HWOCV. dod_ocv(%d) dod_now(%d)\n", DOD_hwocv, DOD_now); } @@ -3987,13 +4400,13 @@ static void battery_aging_check(void) static int battery_meter_resume(struct platform_device *dev) { -/*[BUGFIX]-Add-BEGIN by TCTSZ.pingao.yang, 4/15/2015, pr-975290, add standby current */ -#if 0 #if defined(CONFIG_POWER_EXT) #elif defined(SOC_BY_SW_FG) || defined(SOC_BY_HW_FG) #if defined(SOC_BY_SW_FG) kal_int32 hw_ocv_after_sleep; + kal_int32 DOD_hwocv; + struct timespec now_time; #endif struct timespec xts, tom, rtc_time_after_sleep; #ifdef MTK_POWER_EXT_DETECT @@ -4002,8 +4415,9 @@ static int battery_meter_resume(struct platform_device *dev) #endif get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &rtc_time_after_sleep); + _g_bat_sleep_total_time += rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec; - battery_xlog_printk(BAT_LOG_CRTI, + bm_print(BM_LOG_CRTI, "[battery_meter_resume] sleep time = %d, g_spm_timer = %d\n", _g_bat_sleep_total_time, g_spm_timer); @@ -4016,127 +4430,55 @@ static int battery_meter_resume(struct platform_device *dev) #endif #endif - if (_g_bat_sleep_total_time < g_spm_timer) { - return 0; + /* trigger gauge update if accumulated sleep time more than give period */ + if (_g_bat_sleep_total_time >= g_spm_timer) + bat_spm_timeout = true; + +#if defined(SOC_BY_SW_FG) + + /* trigger gauge update if oam_run() not run in the last 30s kernel active time */ + getrawmonotonic(&now_time); + if (now_time.tv_sec - last_oam_run_time.tv_sec > 30) { + bat_spm_timeout = true; + pr_warn("[battery_meter] trigger oam_run() for 30s threshold.\n"); } - bat_spm_timeout = true; -#if defined(SOC_BY_SW_FG) - battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &hw_ocv_after_sleep); - if (_g_bat_sleep_total_time > 3600) { /* 1hr */ - if (hw_ocv_after_sleep < g_hw_ocv_before_sleep) { - oam_d0 = fgauge_read_d_by_v(hw_ocv_after_sleep); - oam_v_ocv_2 = oam_v_ocv_1 = hw_ocv_after_sleep; - oam_car_1 = 0; - oam_car_2 = 0; + + /* try to calibrate D0 by HWOCV if battery has no loading for more than 30mins */ + if (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec > 1800 && + bat_is_charger_exist() == KAL_FALSE) { + + battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &hw_ocv_after_sleep); + + DOD_hwocv = fgauge_read_d_by_v(hw_ocv_after_sleep); + + if ((DOD_hwocv < 30 || DOD_hwocv > 70) && + (DOD_hwocv > oam_d_2 && DOD_hwocv - oam_d_2 > 3)) { + oam_d0 = DOD_hwocv; + oam_v_ocv_2 = oam_v_ocv_1 = hw_ocv_after_sleep; + oam_car_1 = 0; + oam_car_2 = 0; + + pr_notice( + "[self-discharge check] reset to HWOCV. dod_ocv(%d) dod_now(%d)\n", + DOD_hwocv, oam_d_2); } else { oam_car_1 = oam_car_1 + (40* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh - oam_car_2 = oam_car_2 + (40* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh + oam_car_2 = oam_car_2 + (40* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh } + + pr_notice("[self-discharge check] dod_ocv(%d) dod_now(%d)\n", DOD_hwocv, oam_d_2); + }else { + oam_car_1 = oam_car_1 + (40* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh + oam_car_2 = oam_car_2 + (40* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh } - //FIXME - + bm_print(BM_LOG_CRTI, "sleeptime=(%d)s, be_ocv=(%d), af_ocv=(%d), D0=(%d), car1=(%d), car2=(%d)\n", _g_bat_sleep_total_time, g_hw_ocv_before_sleep, hw_ocv_after_sleep, oam_d0, oam_car_1, oam_car_2); #endif #endif - -#else - kal_int32 hw_ocv_after_sleep; - kal_int32 sw_vbat; - kal_int32 vbat_diff = 200; - - static kal_int32 suspend_oam_time = 0; - kal_int32 oam_car_delta = 0; - - after_sleep_time = rtc_read_hw_time(); - _g_bat_sleep_total_time += after_sleep_time - before_sleep_time; - - battery_xlog_printk(BAT_LOG_CRTI, "g_spm_timer = %d, sleep_total_time = %d, after_sleep_time = %d, before_sleep_time = %d\n", - g_spm_timer, _g_bat_sleep_total_time, after_sleep_time, before_sleep_time); - - if (_g_bat_sleep_total_time >= g_spm_timer) { - bat_spm_timeout = true; - } - - battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &hw_ocv_after_sleep); - g_sleep_fg_soc = fgauge_read_capacity_by_v(hw_ocv_after_sleep); - g_sleep_fg_ui_soc = BMT_status.SOC; - resume_count++; - - sw_vbat = battery_meter_get_battery_voltage(KAL_TRUE); - battery_xlog_printk(BAT_LOG_CRTI, "HW_OCV = %d, SW_VBAT = %d\n", hw_ocv_after_sleep, sw_vbat); - - if(hw_ocv_after_sleep < sw_vbat) - { - bm_print(BM_LOG_CRTI, "Ignore HW_OCV : small than SW_VBAT\n"); - } - else if( (hw_ocv_after_sleep - sw_vbat) > vbat_diff ) - { - bm_print(BM_LOG_CRTI, "Ignore HW_OCV : diff > %d\n", vbat_diff); - } - else - { - if (g_sleep_fg_ui_soc >= g_sleep_fg_soc){ - if ((g_sleep_fg_ui_soc - g_sleep_fg_soc) > SLEEP_AFTER_FG_DIFF){ - if (( MIN_SUSPEND_CURRENT <= suspend_current) - && (suspend_current < MAX_SUSPEND_CURRENT)) - suspend_current = suspend_current + SUSPEND_CURRENT_SETP; - } - else { - suspend_current = UI_REDUCE_CURRENT; - } - } - else { - if ((g_sleep_fg_soc - g_sleep_fg_ui_soc) > SLEEP_AFTER_FG_DIFF){ - if (( MIN_SUSPEND_CURRENT < suspend_current) - && (suspend_current <= MAX_SUSPEND_CURRENT)) - suspend_current = suspend_current - SUSPEND_CURRENT_SETP; - } - else { - suspend_current = SLEEP_REDUCE_CURRENT; - } - } - - printk("<2>""%s g_sleep_fg_ui_soc = %d, g_sleep_fg_soc = %d, hw_ocv_after_sleep = %d, suspend_current = %d, resure_count = %d\n", - __func__, g_sleep_fg_ui_soc, g_sleep_fg_soc, hw_ocv_after_sleep, suspend_current, resume_count); - - if((after_sleep_time - before_sleep_time) > 3600) - { - if(hw_ocv_after_sleep != g_hw_ocv_before_sleep) - { - gFG_DOD0 = fgauge_read_d_by_v(hw_ocv_after_sleep); - oam_v_ocv_2 = oam_v_ocv_1 = hw_ocv_after_sleep; - oam_car_1 = 0; - oam_car_2 = 0; - } - else - { - oam_car_delta = suspend_current * (after_sleep_time - before_sleep_time + suspend_oam_time) / 3600; - suspend_oam_time = suspend_current * (after_sleep_time - before_sleep_time + suspend_oam_time) % 3600; - suspend_oam_time = suspend_oam_time / suspend_current; - oam_car_1 += oam_car_delta; - oam_car_2 += oam_car_delta; - } - } - else - { - oam_car_delta = suspend_current * (after_sleep_time - before_sleep_time + suspend_oam_time) / 3600; - suspend_oam_time = suspend_current * (after_sleep_time - before_sleep_time + suspend_oam_time) % 3600; - suspend_oam_time = suspend_oam_time / suspend_current; - oam_car_1 += oam_car_delta; - oam_car_2 += oam_car_delta; - } - - bm_print(BM_LOG_CRTI, "sleeptime=(%d)s, be_ocv=(%d), af_ocv=(%d), D0=(%d), car1=(%d), car2=(%d) \n", - (after_sleep_time - before_sleep_time), - g_hw_ocv_before_sleep, hw_ocv_after_sleep, gFG_DOD0, oam_car_1, oam_car_2); - } -#endif -/*[BUGFIX]-Add-END by TCTSZ.pingao.yang */ - - //bm_print(BM_LOG_CRTI, "[battery_meter_resume]\n"); + bm_print(BM_LOG_CRTI, "[battery_meter_resume]\n"); return 0; } @@ -4150,11 +4492,13 @@ static const struct of_device_id mt_bat_meter_of_match[] = { MODULE_DEVICE_TABLE(of, mt_bat_meter_of_match); #endif + +#if defined(BATTERY_MODULE_INIT) || defined(CONFIG_OF) struct platform_device battery_meter_device = { .name = "battery_meter", .id = -1, }; - +#endif static struct platform_driver battery_meter_driver = { .probe = battery_meter_probe, @@ -4167,11 +4511,10 @@ static struct platform_driver battery_meter_driver = { }, }; +#ifdef CONFIG_OF static int battery_meter_dts_probe(struct platform_device *dev) { int ret = 0; - /* struct proc_dir_entry *entry = NULL; */ - struct proc_dir_entry *battery_dir = NULL; battery_xlog_printk(BAT_LOG_CRTI, "******** battery_meter_dts_probe!! ********\n"); @@ -4199,7 +4542,7 @@ static struct platform_driver battery_meter_dts_driver = { #endif }, }; - +#endif static int __init battery_meter_init(void) { int ret; @@ -4207,12 +4550,15 @@ static int __init battery_meter_init(void) #ifdef CONFIG_OF // #else + +#ifdef BATTERY_MODULE_INIT ret = platform_device_register(&battery_meter_device); if (ret) { bm_print(BM_LOG_CRTI, "[battery_meter_driver] Unable to device register(%d)\n", ret); return ret; } +#endif #endif ret = platform_driver_register(&battery_meter_driver); diff --git a/drivers/power/mediatek/switch_charging.c b/drivers/power/mediatek/switch_charging.c index 6084a16f1e8..d3e773e6d73 100644 --- a/drivers/power/mediatek/switch_charging.c +++ b/drivers/power/mediatek/switch_charging.c @@ -76,11 +76,6 @@ kal_bool is_ta_connect = KAL_FALSE; kal_bool ta_vchr_tuning = KAL_TRUE; int ta_v_chr_org = 0; #endif -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */ -#ifdef MTK_BATTERY_PROTECT_FEATURE -kal_bool high_temp_stop_charge = KAL_FALSE; -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ /* ///////////////////////////////////////////////////////////////////////////////////////// */ /* // JEITA */ @@ -101,6 +96,9 @@ kal_bool temp_error_recovery_chr_flag = KAL_TRUE; /* extern variable */ /* ============================================================ // */ extern int g_platform_boot_mode; +#ifdef CONFIG_AUSTIN_PROJECT +extern int battery_idV; +#endif /* ============================================================ // */ /* extern function */ @@ -111,14 +109,14 @@ extern int g_platform_boot_mode; void BATTERY_SetUSBState(int usb_state_value) { #if defined(CONFIG_POWER_EXT) - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY_SetUSBState] in FPGA/EVB, no service\r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY_SetUSBState] in FPGA/EVB, no service\n"); #else if ((usb_state_value < USB_SUSPEND) || ((usb_state_value > USB_CONFIGURED))) { battery_xlog_printk(BAT_LOG_CRTI, - "[BATTERY] BAT_SetUSBState Fail! Restore to default value\r\n"); + "[BATTERY] BAT_SetUSBState Fail! Restore to default value\n"); usb_state_value = USB_UNCONFIGURED; } else { - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] BAT_SetUSBState Success! Set %d\r\n", + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] BAT_SetUSBState Success! Set %d\n", usb_state_value); g_usb_state = usb_state_value; } @@ -319,7 +317,7 @@ static BATTERY_VOLTAGE_ENUM select_jeita_cv(void) cv_voltage = JEITA_TEMP_POS_45_TO_POS_60_CV_VOLTAGE; } else if (g_temp_status == TEMP_POS_10_TO_POS_45) { #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT - cv_voltage = BATTERY_VOLT_04_360000_V; + cv_voltage = BATTERY_VOLT_04_340000_V; #else cv_voltage = JEITA_TEMP_POS_10_TO_POS_45_CV_VOLTAGE; #endif @@ -333,6 +331,17 @@ static BATTERY_VOLTAGE_ENUM select_jeita_cv(void) cv_voltage = BATTERY_VOLT_04_200000_V; } + if (g_custom_charging_cv != -1) + cv_voltage = g_custom_charging_cv; + +#if defined(CONFIG_AUSTIN_PROJECT) + if (g_custom_charging_mode) /* For demo unit */ + cv_voltage = BATTERY_VOLT_04_100000_V; +#endif + + battery_xlog_printk(BAT_LOG_FULL, "[%s] CV(%d) custom CV(%d)\r\n", + __func__, cv_voltage, g_custom_charging_cv); + return cv_voltage; } @@ -375,7 +384,7 @@ PMU_STATUS do_jeita_state_machine(void) battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Battery Temperature not recovery to normal temperature charging mode yet!!\n\r"); } else { - battery_xlog_printk(BAT_LOG_CRTI, + battery_xlog_printk(BAT_LOG_FULL, "[BATTERY] Battery Normal Temperature between %d and %d !!\n\r", TEMP_POS_10_THRESHOLD, TEMP_POS_45_THRESHOLD); g_temp_status = TEMP_POS_10_TO_POS_45; @@ -388,6 +397,7 @@ PMU_STATUS do_jeita_state_machine(void) "[BATTERY] Battery Temperature between %d and %d !!\n\r", TEMP_POS_0_THRES_PLUS_X_DEGREE, TEMP_POS_10_THRESHOLD); + return PMU_STATUS_FAIL; } if (g_temp_status == TEMP_BELOW_NEG_10) { battery_xlog_printk(BAT_LOG_CRTI, @@ -417,6 +427,7 @@ PMU_STATUS do_jeita_state_machine(void) TEMP_NEG_10_THRESHOLD, TEMP_POS_0_THRESHOLD); g_temp_status = TEMP_NEG_10_TO_POS_0; + return PMU_STATUS_FAIL; } } else { battery_xlog_printk(BAT_LOG_CRTI, @@ -443,10 +454,10 @@ static void set_jeita_charging_current(void) return; #endif - if (g_temp_status == TEMP_NEG_10_TO_POS_0) { - g_temp_CC_value = CHARGE_CURRENT_350_00_MA; - g_temp_input_CC_value = CHARGE_CURRENT_500_00_MA; - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] JEITA set charging current : %d\r\n", + if (g_temp_status == TEMP_POS_0_TO_POS_10) { + g_temp_CC_value = CHARGE_CURRENT_300_00_MA; + //g_temp_input_CC_value = CHARGE_CURRENT_1000_00_MA; + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] JEITA set charging current : %d\n", g_temp_CC_value); } } @@ -468,60 +479,48 @@ void set_usb_current_unlimited(bool enable) void select_charging_curret_bcct(void) { - if ((BMT_status.charger_type == STANDARD_HOST) || - (BMT_status.charger_type == NONSTANDARD_CHARGER)) { - if (g_bcct_value < 100) - g_temp_input_CC_value = CHARGE_CURRENT_0_00_MA; - else if (g_bcct_value < 500) - g_temp_input_CC_value = CHARGE_CURRENT_100_00_MA; - else if (g_bcct_value < 800) - g_temp_input_CC_value = CHARGE_CURRENT_500_00_MA; - else if (g_bcct_value == 800) - g_temp_input_CC_value = CHARGE_CURRENT_800_00_MA; - else - g_temp_input_CC_value = CHARGE_CURRENT_500_00_MA; - } else if ((BMT_status.charger_type == STANDARD_CHARGER) || - (BMT_status.charger_type == CHARGING_HOST)) { - g_temp_input_CC_value = CHARGE_CURRENT_MAX; + switch (BMT_status.charger_type) { + case STANDARD_HOST: + g_temp_input_CC_value = USB_CHARGER_CURRENT; + break; - /* --------------------------------------------------- */ - /* set IOCHARGE */ - if (g_bcct_value < 550) - g_temp_CC_value = CHARGE_CURRENT_0_00_MA; - else if (g_bcct_value < 650) - g_temp_CC_value = CHARGE_CURRENT_550_00_MA; - else if (g_bcct_value < 750) - g_temp_CC_value = CHARGE_CURRENT_650_00_MA; - else if (g_bcct_value < 850) - g_temp_CC_value = CHARGE_CURRENT_750_00_MA; - else if (g_bcct_value < 950) - g_temp_CC_value = CHARGE_CURRENT_850_00_MA; - else if (g_bcct_value < 1050) - g_temp_CC_value = CHARGE_CURRENT_950_00_MA; - else if (g_bcct_value < 1150) - g_temp_CC_value = CHARGE_CURRENT_1050_00_MA; - else if (g_bcct_value < 1250) - g_temp_CC_value = CHARGE_CURRENT_1150_00_MA; - else if (g_bcct_value == 1250) - g_temp_CC_value = CHARGE_CURRENT_1250_00_MA; - else - g_temp_CC_value = CHARGE_CURRENT_650_00_MA; - /* --------------------------------------------------- */ + case CHARGING_HOST: + g_temp_input_CC_value = CHARGING_HOST_CHARGER_CURRENT; + break; - } else { + case NONSTANDARD_CHARGER: + g_temp_input_CC_value = NON_STD_AC_CHARGER_CURRENT; + break; + + case STANDARD_CHARGER: + g_temp_input_CC_value = AC_CHARGER_CURRENT; + break; + + default: + battery_xlog_printk(BAT_LOG_CRTI, "[%s]Unknown charger type(%d)\n", + __func__, BMT_status.charger_type); g_temp_input_CC_value = CHARGE_CURRENT_500_00_MA; + break; } + + g_temp_CC_value = g_bcct_value*100; +#if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) && defined(CONFIG_AUSTIN_PROJECT) + if(g_temp_CC_value > CHARGE_CURRENT_300_00_MA) + set_jeita_charging_current(); +#endif + battery_xlog_printk(BAT_LOG_CRTI, "[%s] I(%d), C(%d), B(%d)\r\n", + __func__, g_temp_input_CC_value, g_temp_CC_value, g_bcct_value); } static void pchr_turn_on_charging(void); kal_uint32 set_bat_charging_current_limit(int current_limit) { - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] set_bat_charging_current_limit (%d)\r\n", + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] set_bat_charging_current_limit (%d)\n", current_limit); if (current_limit != -1) { g_bcct_flag = 1; - g_bcct_value = current_limit; + g_bcct_value = current_limit/100; if (current_limit < 70) g_temp_CC_value = CHARGE_CURRENT_0_00_MA; @@ -576,7 +575,7 @@ kal_uint32 set_bat_charging_current_limit(int current_limit) void select_charging_curret(void) { if (g_ftm_battery_flag) { - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] FTM charging : %d\r\n", + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] FTM charging : %d\n", charging_level_data[0]); g_temp_CC_value = charging_level_data[0]; @@ -586,8 +585,17 @@ void select_charging_curret(void) g_temp_input_CC_value = CHARGE_CURRENT_MAX; g_temp_CC_value = AC_CHARGER_CURRENT; - battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] set_ac_current \r\n"); + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] set_ac_current \n"); } + } else if (g_custom_charging_current != -1) { + battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] custom charging : %d\r\n", + g_custom_charging_current); + g_temp_CC_value = g_custom_charging_current; + + if (g_temp_CC_value <= CHARGE_CURRENT_500_00_MA) + g_temp_input_CC_value = CHARGE_CURRENT_500_00_MA; + else + g_temp_input_CC_value = CHARGE_CURRENT_2000_00_MA; } else { if (BMT_status.charger_type == STANDARD_HOST) { #ifdef CONFIG_USB_IF @@ -604,7 +612,7 @@ void select_charging_curret(void) } battery_xlog_printk(BAT_LOG_CRTI, - "[BATTERY] STANDARD_HOST CC mode charging : %d on %d state\r\n", + "[BATTERY] STANDARD_HOST CC mode charging : %d on %d state\n", g_temp_CC_value, g_usb_state); } #else @@ -627,15 +635,6 @@ void select_charging_curret(void) } else if (BMT_status.charger_type == CHARGING_HOST) { g_temp_input_CC_value = CHARGING_HOST_CHARGER_CURRENT; g_temp_CC_value = CHARGING_HOST_CHARGER_CURRENT; - } else if (BMT_status.charger_type == APPLE_2_1A_CHARGER) { - g_temp_input_CC_value = APPLE_2_1A_CHARGER_CURRENT; - g_temp_CC_value = APPLE_2_1A_CHARGER_CURRENT; - } else if (BMT_status.charger_type == APPLE_1_0A_CHARGER) { - g_temp_input_CC_value = APPLE_1_0A_CHARGER_CURRENT; - g_temp_CC_value = APPLE_1_0A_CHARGER_CURRENT; - } else if (BMT_status.charger_type == APPLE_0_5A_CHARGER) { - g_temp_input_CC_value = APPLE_0_5A_CHARGER_CURRENT; - g_temp_CC_value = APPLE_0_5A_CHARGER_CURRENT; } else { g_temp_input_CC_value = CHARGE_CURRENT_500_00_MA; g_temp_CC_value = CHARGE_CURRENT_500_00_MA; @@ -660,30 +659,15 @@ void select_charging_curret(void) static kal_uint32 charging_full_check(void) { - kal_uint32 status = KAL_FALSE; + kal_uint32 status; battery_charging_control(CHARGING_CMD_GET_CHARGING_STATUS, &status); if (status == KAL_TRUE) { g_full_check_count++; - if (g_full_check_count >= FULL_CHECK_TIMES){ -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 04/15/2015, modify ntc temperature function */ -#ifdef MTK_BATTERY_PROTECT_FEATURE - if (BMT_status.temperature < MAX_LIMIT_CHARGE_TEMPERATURE) { - return KAL_TRUE; - } - else { - high_temp_stop_charge = KAL_TRUE; - return KAL_FALSE; - } -#else + if (g_full_check_count >= FULL_CHECK_TIMES) { return KAL_TRUE; - -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ - } - else{ + } else return KAL_FALSE; - } } else { g_full_check_count = 0; return status; @@ -741,7 +725,7 @@ static void pchr_turn_on_charging(void) battery_xlog_printk(BAT_LOG_FULL, "[BATTERY] select_charging_curret !\n"); } battery_xlog_printk(BAT_LOG_CRTI, - "[BATTERY] Default CC mode charging : %d, input current = %d\r\n", + "[BATTERY] Default CC mode charging : %d, input current = %d\n", g_temp_CC_value, g_temp_input_CC_value); if (g_temp_CC_value == CHARGE_CURRENT_0_00_MA || g_temp_input_CC_value == CHARGE_CURRENT_0_00_MA) { @@ -749,7 +733,7 @@ static void pchr_turn_on_charging(void) charging_enable = KAL_FALSE; battery_xlog_printk(BAT_LOG_CRTI, - "[BATTERY] charging current is set 0mA, turn off charging !\r\n"); + "[BATTERY] charging current is set 0mA, turn off charging !\n"); } else { battery_charging_control(CHARGING_CMD_SET_INPUT_CURRENT, &g_temp_input_CC_value); @@ -758,21 +742,10 @@ static void pchr_turn_on_charging(void) /*Set CV Voltage */ #if !defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT - cv_voltage = BATTERY_VOLT_04_360000_V; + cv_voltage = BATTERY_VOLT_04_340000_V; #else cv_voltage = BATTERY_VOLT_04_200000_V; #endif -/* [PLATFORM]-Add-BEGIN by TCTSZ.leo.guo, 05/28/2015, modify ntc temperature function */ -#ifdef MTK_BATTERY_PROTECT_FEATURE -/*Battery temperature more than 45 degree or less than 55 degree, try to limit max voltage*/ - if((BMT_status.temperature >= MAX_LIMIT_CHARGE_TEMPERATURE) && (BMT_status.temperature <= MAX_CHARGE_TEMPERATURE) ) - { - cv_voltage = BATTERY_VOLT_04_100000_V; - battery_xlog_printk(BAT_LOG_CRTI, - "[BATTERY] temperature more than 45 degree or less than 55 degree, try to limit max voltage !\r\n"); - } -#endif -/* [PLATFORM]-Add-END by TCTSZ.leo.guo */ battery_charging_control(CHARGING_CMD_SET_CV_VOLTAGE, &cv_voltage); #endif } @@ -781,7 +754,7 @@ static void pchr_turn_on_charging(void) /* enable/disable charging */ battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable); - battery_xlog_printk(BAT_LOG_FULL, "[BATTERY] pchr_turn_on_charging(), enable =%d !\r\n", + battery_xlog_printk(BAT_LOG_FULL, "[BATTERY] pchr_turn_on_charging(), enable =%d !\n", charging_enable); } @@ -851,11 +824,21 @@ PMU_STATUS BAT_BatteryFullAction(void) if (charging_full_check() == KAL_FALSE) { battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Battery Re-charging !!\n\r"); + pchr_turn_on_charging(); + + if (BMT_status.bat_in_recharging_state == KAL_TRUE) { + if (BMT_status.UI_SOC < 100) { + BMT_status.bat_in_recharging_state = KAL_FALSE; + BMT_status.bat_charging_state = CHR_CC; + BMT_status.bat_full = KAL_FALSE; + return PMU_STATUS_OK; + } + } + BMT_status.bat_in_recharging_state = KAL_TRUE; BMT_status.bat_charging_state = CHR_CC; - battery_meter_reset(); - } - + } else + battery_meter_reset(KAL_TRUE); return PMU_STATUS_OK; } @@ -887,12 +870,22 @@ PMU_STATUS BAT_BatteryStatusFailAction(void) battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] BAD Battery status... Charging Stop !!\n\r"); -#if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) +#if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) && defined(CONFIG_AUSTIN_PROJECT) + if ((g_temp_status == TEMP_ABOVE_POS_60) || (g_temp_status == TEMP_BELOW_NEG_10) + || (battery_idV > 500)) { + temp_error_recovery_chr_flag = KAL_FALSE; + } + if ((temp_error_recovery_chr_flag == KAL_FALSE) && (g_temp_status != TEMP_ABOVE_POS_60) + && (g_temp_status != TEMP_BELOW_NEG_10) && (battery_idV <= 500)) { + temp_error_recovery_chr_flag = KAL_TRUE; + BMT_status.bat_charging_state = CHR_PRE; + } +#elif defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT) if ((g_temp_status == TEMP_ABOVE_POS_60) || (g_temp_status == TEMP_BELOW_NEG_10)) { temp_error_recovery_chr_flag = KAL_FALSE; } if ((temp_error_recovery_chr_flag == KAL_FALSE) && (g_temp_status != TEMP_ABOVE_POS_60) - && (g_temp_status != TEMP_BELOW_NEG_10)) { + && (g_temp_status != TEMP_BELOW_NEG_10)) { temp_error_recovery_chr_flag = KAL_TRUE; BMT_status.bat_charging_state = CHR_PRE; } diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index 8b0ae47d764..15a0def0e44 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig @@ -56,6 +56,14 @@ config THERMAL_DEFAULT_GOV_USER_SPACE Select this if you want to let the user space manage the lpatform thermals. +config THERMAL_DEFAULT_GOV_TRIP_STEP_WISE + bool "step_wise" + select THERMAL_GOV_TRIP_STEP_WISE + help + Use the trip_step_wise governor as default. This throttles the + devices one step at a time based on the trip points that have + been reached by the themral zone. + endchoice config BACKWARD_COMPATIBLE @@ -78,6 +86,14 @@ config THERMAL_GOV_USER_SPACE help Enable this to let the user space manage the platform thermals. +config THERMAL_GOV_TRIP_STEP_WISE + bool "Trip_step_wise thermal governor" + help + Enable this to manage platform thermals using a simple + linear governor. + This governor is triggered based on the trip points. + This will be useful for platforms using the generic thermal interface + config CPU_THERMAL bool "generic cpu cooling support" depends on CPU_FREQ @@ -181,4 +197,14 @@ config INTEL_POWERCLAMP enforce idle time which results in more package C-state residency. The user interface is exposed via generic thermal framework. +config VS_THERMAL + bool "Virtual sensor thermal management" + depends on ARCH_MT8127 + default y + help + Adds virtual sensor thermal management implementation according to the thermal + management framework. A thermal zone with several trip points will be + created. Cooling devices can be bound to the trip points to cool this + thermal zone if trip points reached. + endif diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile index 082e607fbef..ba1c628a681 100644 --- a/drivers/thermal/Makefile +++ b/drivers/thermal/Makefile @@ -10,18 +10,20 @@ thermal_sys-$(CONFIG_BACKWARD_COMPATIBLE) += backward_compatible.o thermal_sys-$(CONFIG_THERMAL_GOV_FAIR_SHARE) += fair_share.o thermal_sys-$(CONFIG_THERMAL_GOV_STEP_WISE) += step_wise.o thermal_sys-$(CONFIG_THERMAL_GOV_USER_SPACE) += user_space.o +thermal_sys-$(CONFIG_THERMAL_GOV_TRIP_STEP_WISE) += trip_step_wise.o # cpufreq cooling thermal_sys-$(CONFIG_CPU_THERMAL) += cpu_cooling.o +thermal_sys-$(CONFIG_CPU_THERMAL) += virtual_sensor_cpufreq_cooling.o # platform thermal drivers obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o obj-$(CONFIG_RCAR_THERMAL) += rcar_thermal.o obj-$(CONFIG_KIRKWOOD_THERMAL) += kirkwood_thermal.o obj-$(CONFIG_EXYNOS_THERMAL) += exynos_thermal.o -obj-$(CONFIG_DOVE_THERMAL) += dove_thermal.o +obj-$(CONFIG_DOVE_THERMAL) += dove_thermal.o obj-$(CONFIG_DB8500_THERMAL) += db8500_thermal.o obj-$(CONFIG_ARMADA_THERMAL) += armada_thermal.o obj-$(CONFIG_DB8500_CPUFREQ_COOLING) += db8500_cpufreq_cooling.o obj-$(CONFIG_INTEL_POWERCLAMP) += intel_powerclamp.o - +obj-$(CONFIG_VS_THERMAL) += virtual_sensor_thermal.o diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c index c94bf2e5de6..0cc48dcdb81 100644 --- a/drivers/thermal/cpu_cooling.c +++ b/drivers/thermal/cpu_cooling.c @@ -20,6 +20,7 @@ * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + #include #include #include @@ -28,37 +29,15 @@ #include #include -/** - * struct cpufreq_cooling_device - data for cooling device with cpufreq - * @id: unique integer value corresponding to each cpufreq_cooling_device - * registered. - * @cool_dev: thermal_cooling_device pointer to keep track of the - * registered cooling device. - * @cpufreq_state: integer value representing the current state of cpufreq - * cooling devices. - * @cpufreq_val: integer value representing the absolute value of the clipped - * frequency. - * @allowed_cpus: all the cpus involved for this cpufreq_cooling_device. - * - * This structure is required for keeping information of each - * cpufreq_cooling_device registered. In order to prevent corruption of this a - * mutex lock cooling_cpufreq_lock is used. - */ -struct cpufreq_cooling_device { - int id; - struct thermal_cooling_device *cool_dev; - unsigned int cpufreq_state; - unsigned int cpufreq_val; - struct cpumask allowed_cpus; -}; +#define MAX_STATE 4 /* 0-4 total 5 */ + static DEFINE_IDR(cpufreq_idr); static DEFINE_MUTEX(cooling_cpufreq_lock); +static LIST_HEAD(cpufreq_device_list); static unsigned int cpufreq_dev_count; - /* notify_table passes value to the CPUFREQ_ADJUST callback function. */ #define NOTIFY_INVALID NULL -static struct cpufreq_cooling_device *notify_device; /** * get_idr - function to get a unique id. @@ -257,6 +236,25 @@ static unsigned int get_cpu_frequency(unsigned int cpu, unsigned long level) return freq; } +/** + * cpufreq_cooling_get_frequency - for a give cpu cooling state + * return the cpu freq. + * @cpu: cpu for which frequency is fetched. + * @level: cooling level + * + * This function matches cooling level with frequency. Based on a cooling level + * of frequency, equals cooling state of cpu cooling device, it will return + * the corresponding frequency. + *e.g level=0 --> 1st MAX FREQ, level=1 ---> 2nd MAX FREQ, .... etc + * + * Return: 0 on error, the corresponding frequency otherwise. + */ +unsigned int cpufreq_cooling_get_frequency(unsigned int cpu, unsigned long level) +{ + return get_cpu_frequency(cpu, level); +} +EXPORT_SYMBOL_GPL(cpufreq_cooling_get_frequency); + /** * cpufreq_apply_cooling - function to apply frequency clipping. * @cpufreq_device: cpufreq_cooling_device pointer containing frequency @@ -275,27 +273,39 @@ static int cpufreq_apply_cooling(struct cpufreq_cooling_device *cpufreq_device, unsigned int cpuid, clip_freq; struct cpumask *mask = &cpufreq_device->allowed_cpus; unsigned int cpu = cpumask_any(mask); + struct cpufreq_cooling_device *pos = NULL; + unsigned long target_cpufreq_state; + /* levels are populated by platform driver, such as "mtk-cpufreq-cooling" + * and "virtual_sensor-cpufreq-cooling" */ + target_cpufreq_state = cpufreq_device->levels[cooling_state]; /* Check if the old cooling action is same as new cooling action */ - if (cpufreq_device->cpufreq_state == cooling_state) + if (cpufreq_device->cpufreq_state == target_cpufreq_state) return 0; - clip_freq = get_cpu_frequency(cpu, cooling_state); + clip_freq = get_cpu_frequency(cpu, target_cpufreq_state); if (!clip_freq) return -EINVAL; - cpufreq_device->cpufreq_state = cooling_state; + pr_debug("\n%s cdev->id=%d, %s state=%lu, freq=%d", __func__, cpufreq_device->cool_dev->id, cpufreq_device->cool_dev->type, target_cpufreq_state, clip_freq); + cpufreq_device->cooling_state = cooling_state; + cpufreq_device->cpufreq_state = target_cpufreq_state; cpufreq_device->cpufreq_val = clip_freq; - notify_device = cpufreq_device; + cpufreq_device->notify_device = cpufreq_device; + + list_for_each_entry(pos, &cpufreq_device_list, node) { + if ((pos->cpufreq_val != 0) && + (pos->cpufreq_val < cpufreq_device->cpufreq_val)) + return 0; + } for_each_cpu(cpuid, mask) { if (is_cpufreq_valid(cpuid)) cpufreq_update_policy(cpuid); } - notify_device = NOTIFY_INVALID; - + cpufreq_device->notify_device = NOTIFY_INVALID; return 0; } @@ -316,12 +326,15 @@ static int cpufreq_thermal_notifier(struct notifier_block *nb, { struct cpufreq_policy *policy = data; unsigned long max_freq = 0; + struct cpufreq_cooling_device *cpufreq_device, *notify_device; + cpufreq_device = container_of(nb, struct cpufreq_cooling_device, nb); + notify_device = cpufreq_device->notify_device; if (event != CPUFREQ_ADJUST || notify_device == NOTIFY_INVALID) return 0; - if (cpumask_test_cpu(policy->cpu, ¬ify_device->allowed_cpus)) - max_freq = notify_device->cpufreq_val; + if (cpumask_test_cpu(policy->cpu, &cpufreq_device->allowed_cpus)) + max_freq = cpufreq_device->cpufreq_val; /* Never exceed user_policy.max */ if (max_freq > policy->user_policy.max) @@ -359,7 +372,14 @@ static int cpufreq_get_max_state(struct thermal_cooling_device *cdev, ret = get_property(cpu, 0, &count, GET_MAXL); if (count > 0) - *state = count; + /** + * Hard-coded to for TANKPLAT-1082: Add support for additional thermal trip point. + * Number of states now means the number of thermal states, not the numer of cpu + * frequency states. The MAX_STATE is the state count - 1, since we count states + * from 0. The preceding logic was kept becasue the get_property() call for the + * GET_MAXL parameter is still a good check to ensure the cpufreq's are configured. + */ + *state = MAX_STATE; return ret; } @@ -379,7 +399,7 @@ static int cpufreq_get_cur_state(struct thermal_cooling_device *cdev, { struct cpufreq_cooling_device *cpufreq_device = cdev->devdata; - *state = cpufreq_device->cpufreq_state; + *state = cpufreq_device->cooling_state; return 0; } @@ -409,11 +429,6 @@ static struct thermal_cooling_device_ops const cpufreq_cooling_ops = { .set_cur_state = cpufreq_set_cur_state, }; -/* Notifier for cpufreq policy change */ -static struct notifier_block thermal_cpufreq_notifier_block = { - .notifier_call = cpufreq_thermal_notifier, -}; - /** * cpufreq_cooling_register - function to create cpufreq cooling device. * @clip_cpus: cpumask of cpus where the frequency constraints will happen. @@ -476,11 +491,37 @@ cpufreq_cooling_register(const struct cpumask *clip_cpus) cpufreq_dev->cpufreq_state = 0; mutex_lock(&cooling_cpufreq_lock); - /* Register the notifier for first cpufreq cooling device */ - if (cpufreq_dev_count == 0) - cpufreq_register_notifier(&thermal_cpufreq_notifier_block, - CPUFREQ_POLICY_NOTIFIER); + cpufreq_dev->nb.notifier_call = cpufreq_thermal_notifier; + cpufreq_register_notifier(&(cpufreq_dev->nb), + CPUFREQ_POLICY_NOTIFIER); cpufreq_dev_count++; + list_add(&cpufreq_dev->node, &cpufreq_device_list); + + unsigned int cpu; + unsigned int freq; + struct cpumask *mask; + mask = &cpufreq_dev->allowed_cpus; + cpu = cpumask_any(mask); + + unsigned long max_state; + + cool_dev->ops->get_max_state(cool_dev, &max_state); + /* Set the default values for cpufreq levels. Just use the default mapping of + * cpufreq level to cpufreq. */ + for (i=0; ilevels[i] = max_state-1; + } else { + /* cpufreq is defined for this level, set it. It's expected that the + * corresponding platform driver for the cpufreq cooling device, eg + * "mtk-cpufreq-cooling", will be able to update the cpufreq levels, + * typically in conjunction with a thermal.policy.conf file */ + cpufreq_dev->levels[i] = i; + } + pr_debug("\n%s i=%d, freq=%d, levels[%d]=%lu\n", __func__, i, freq, i, cpufreq_dev->levels[i]); + } mutex_unlock(&cooling_cpufreq_lock); @@ -503,7 +544,7 @@ void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) /* Unregister the notifier for the last cpufreq cooling device */ if (cpufreq_dev_count == 0) - cpufreq_unregister_notifier(&thermal_cpufreq_notifier_block, + cpufreq_unregister_notifier(&(cpufreq_dev->nb), CPUFREQ_POLICY_NOTIFIER); mutex_unlock(&cooling_cpufreq_lock); diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index cdc50a31183..1a7aa240c82 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -346,8 +346,8 @@ static void handle_critical_trips(struct thermal_zone_device *tz, if (trip_type == THERMAL_TRIP_CRITICAL) { dev_emerg(&tz->device, - "critical temperature reached(%d C),shutting down\n", - tz->temperature / 1000); + "%s: critical temperature reached(%d C),shutting down\n", + tz->type, tz->temperature / 1000); orderly_poweroff(true); } } @@ -924,7 +924,7 @@ temp_crit_show(struct device *dev, struct device_attribute *attr, long temperature; int ret; - ret = tz->ops->get_crit_temp(tz, &temperature); + ret = tz->ops->get_trip_temp(tz, 0, &temperature); if (ret) return ret; diff --git a/drivers/thermal/trip_step_wise.c b/drivers/thermal/trip_step_wise.c new file mode 100644 index 00000000000..bb353148450 --- /dev/null +++ b/drivers/thermal/trip_step_wise.c @@ -0,0 +1,120 @@ +/* + * trip_step_wise.c - A simple thermal throttling governor + * + * Copyright (C) 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved + * Author: Akwasi Boateng + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * + */ + +#include +#include +#include "thermal_core.h" + +/** + * trip_step_wise_throttle + * @tz - thermal_zone_device + * @trip - the trip point + * + */ +static int trip_step_wise_throttle(struct thermal_zone_device *tz, int trip) +{ + long trip_temp; + struct thermal_instance *tz_instance, *cd_instance; + struct thermal_cooling_device *cdev; + unsigned long target = 0; + char data[32]; + char *envp[] = { data, NULL }; + unsigned long cur_state, max_state; + + mutex_lock(&tz->lock); + list_for_each_entry(tz_instance, &tz->thermal_instances, tz_node) { + if (tz_instance->trip != trip) + continue; + + cdev = tz_instance->cdev; + mutex_lock(&cdev->lock); + + list_for_each_entry(cd_instance, &cdev->thermal_instances, cdev_node) { + cd_instance->target = THERMAL_NO_TARGET; + } + + if (trip == THERMAL_TRIPS_NONE) + trip_temp = tz->forced_passive; + else + tz->ops->get_trip_temp(tz, trip, &trip_temp); + + cdev->ops->get_cur_state(cdev, &cur_state); + + if (tz->temperature >= trip_temp) { + if (tz_instance->upper > cur_state) + target = tz_instance->upper; + else + target = cur_state; + } else { + if (cur_state > tz_instance->lower) + target = tz_instance->lower; + else + target = cur_state; + } + + cdev->ops->get_max_state(cdev, &max_state); + target = (target > max_state) ? max_state : target; + + if (cur_state != target) { + tz_instance->target = target; + cdev->updated = false; + } + mutex_unlock(&cdev->lock); + + if (cur_state != target) { + pr_info("before updating cdev: thermal device %s state change, cur %ld target %ld\n", + tz->type, cur_state, target); + thermal_cdev_update(cdev); + cdev->ops->get_cur_state(cdev, &target); + pr_info("after updating cdev: thermal device %s state change, cur %ld target %ld\n", + tz->type, cur_state, target); + + snprintf(data, sizeof(data), "THERMAL_STATE=%ld", target); + kobject_uevent_env(&tz->device.kobj, KOBJ_CHANGE, envp); + } + } + mutex_unlock(&tz->lock); + return 0; +} + +static struct thermal_governor thermal_gov_trip_step_wise = { + .name = "trip_step_wise", + .throttle = trip_step_wise_throttle, +}; + +static int __init thermal_gov_trip_step_wise_init(void) +{ + return thermal_register_governor(&thermal_gov_trip_step_wise); +} + +static void __exit thermal_gov_trip_step_wise_exit(void) +{ + thermal_unregister_governor(&thermal_gov_trip_step_wise); +} + +fs_initcall(thermal_gov_trip_step_wise_init); +module_exit(thermal_gov_trip_step_wise_exit); + +MODULE_AUTHOR("Akwasi Boateng"); +MODULE_DESCRIPTION("A simple trip level throttling thermal governor"); +MODULE_LICENSE("GPL"); diff --git a/drivers/thermal/virtual_sensor_cpufreq_cooling.c b/drivers/thermal/virtual_sensor_cpufreq_cooling.c new file mode 100644 index 00000000000..99c4cae1375 --- /dev/null +++ b/drivers/thermal/virtual_sensor_cpufreq_cooling.c @@ -0,0 +1,159 @@ +/* + * virtual_sensor_cpufreq_cooling.c - virtual sensor cpu + * cooler + * + * Copyright (C) 2015 Amazon, Inc. All rights reserved. + * + * Author: Akwasi Boateng + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_STATE 4 /* 0-4 total 5 */ + +static ssize_t levels_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct cpufreq_cooling_device *cpufreq_device; + struct cpumask *mask; + int offset = 0; + unsigned int freq; + unsigned int cpu; + int i; + unsigned long cpu_freq_level; + if (!cdev) + return -EINVAL; + cpufreq_device = (struct cpufreq_cooling_device *)cdev->devdata; + if (!cpufreq_device) + return -EINVAL; + mask = &cpufreq_device->allowed_cpus; + cpu = cpumask_any(mask); + mutex_lock(&cdev->lock); + for (i=0; i<=MAX_STATE; i++) { + cpu_freq_level = cpufreq_device->levels[i]; + freq = cpufreq_cooling_get_frequency(cpu, cpu_freq_level); + offset += sprintf(buf + offset, "%u %u\n", i, freq); + } + mutex_unlock(&cdev->lock); + return offset; +} + +static ssize_t levels_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct thermal_cooling_device *cdev = container_of(dev, struct thermal_cooling_device, device); + struct cpufreq_cooling_device *cpufreq_device; + struct cpumask *mask; + unsigned int freq, cpufreq_state; + unsigned long level; + unsigned int cpu; + if (!cdev) + return -EINVAL; + cpufreq_device = (struct cpufreq_cooling_device *)cdev->devdata; + if (!cpufreq_device) + return -EINVAL; + mask = &cpufreq_device->allowed_cpus; + cpu = cpumask_any(mask); + + if (sscanf(buf, "%u %u\n", &cpufreq_state, &freq) != 2) + return -EINVAL; + + if (cpufreq_state > MAX_STATE) + return -EINVAL; + + mutex_lock(&cdev->lock); + level = cpufreq_cooling_get_level(cpu, freq); + pr_debug("\n%s virtual_sensor_cpufreq_cooling cpufreq_state=%u freq=%u level=%lu", __func__, cpufreq_state, freq, level); + + /* Verify a cpufreq level exists for the desired frequency */ + if (level == THERMAL_CSTATE_INVALID) + return -EINVAL; + + /* cpufreq level exits for this cpufreq, set it for this state */ + cpufreq_device->levels[cpufreq_state] = level; + mutex_unlock(&cdev->lock); + + return count; +} + +static DEVICE_ATTR(levels, S_IRUGO | S_IWUSR, levels_show, levels_store); + +static int virtual_sensor_cpufreq_cooling_probe(struct platform_device *pdev) +{ + struct thermal_cooling_device *cdev; + struct cpumask mask_val; + + if (!cpufreq_frequency_get_table(0)) + return -EPROBE_DEFER; + + cpumask_set_cpu(0, &mask_val); + cdev = cpufreq_cooling_register(&mask_val); + + if (IS_ERR(cdev)) { + dev_err(&pdev->dev, "Failed to register cooling device\n"); + return PTR_ERR(cdev); + } + + device_create_file(&cdev->device, &dev_attr_levels); + platform_set_drvdata(pdev, cdev); + + dev_info(&pdev->dev, "Cooling device registered: %s\n", cdev->type); + + return 0; +} + +static int virtual_sensor_cpufreq_cooling_remove(struct platform_device *pdev) +{ + struct thermal_cooling_device *cdev = platform_get_drvdata(pdev); + + cpufreq_cooling_unregister(cdev); + + return 0; +} + +static struct platform_driver virtual_sensor_cpufreq_cooling_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "virtual_sensor-cpufreq-cooling", + }, + .probe = virtual_sensor_cpufreq_cooling_probe, + .remove = virtual_sensor_cpufreq_cooling_remove, +}; + +static int __init virtual_sensor_cpufreq_cooling_init(void) +{ + return platform_driver_register(&virtual_sensor_cpufreq_cooling_driver); +} + +static void __exit virtual_sensor_cpufreq_cooling_exit(void) +{ + platform_driver_unregister(&virtual_sensor_cpufreq_cooling_driver); +} + +late_initcall(virtual_sensor_cpufreq_cooling_init); +module_exit(virtual_sensor_cpufreq_cooling_exit); + +MODULE_AUTHOR("Akwasi Boateng "); +MODULE_DESCRIPTION("VIRTUAL_SENSOR cpufreq cooling driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/thermal/virtual_sensor_thermal.c b/drivers/thermal/virtual_sensor_thermal.c new file mode 100644 index 00000000000..c41b562dc7d --- /dev/null +++ b/drivers/thermal/virtual_sensor_thermal.c @@ -0,0 +1,541 @@ +/* + * Copyright (C) 2013 Lab126, Inc. All rights reserved. + * Author: Akwasi Boateng + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "thermal_core.h" + +#define DRIVER_NAME "virtual_sensor-thermal" +#define THERMAL_NAME "virtual_sensor" +#define BUF_SIZE 128 +#define DMF 1000 +#define MASK (0x001F) +#define TEMPERATURE_PRINT_INTERVAL_SECONDS 10 + +static LIST_HEAD(thermal_sensor_list); +static DEFINE_MUTEX(therm_lock); + +struct virtual_sensor_thermal_zone { + struct thermal_zone_device *tz; + struct work_struct therm_work; + struct mtk_thermal_platform_data *pdata; +}; + +static int virtual_sensor_match_cdev(struct thermal_cooling_device *cdev, + struct trip_t *trip, + int *index) +{ + int i; + if (!strlen(cdev->type)) + return -EINVAL; + + for (i = 0; i < THERMAL_MAX_TRIPS; i++) + if (!strcmp(cdev->type, trip->cdev[i].type)) { + *index = i; + return 0; + } + return -ENODEV; +} + +static int virtual_sensor_cdev_bind(struct thermal_zone_device *thermal, + struct thermal_cooling_device *cdev) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + struct trip_t *trip = NULL; + struct cdev_t *cool_dev = NULL; + int index = -1; + + unsigned long max_state, upper, lower; + int i, ret = -EINVAL; + + cdev->ops->get_max_state(cdev, &max_state); + + for (i = 0; i < pdata->num_trips; i++) { + trip = &pdata->trips[i]; + + if (virtual_sensor_match_cdev(cdev, trip, &index)) + continue; + + if (index == -1) + return -EINVAL; + + cool_dev = &(trip->cdev[index]); + lower = cool_dev->lower; + upper = cool_dev->upper > max_state ? max_state : cool_dev->upper; + ret = thermal_zone_bind_cooling_device(thermal, + i, + cdev, + upper, + lower); + dev_info(&cdev->device, "%s bind to %d: %d-%s\n", cdev->type, + i, ret, ret ? "fail" : "succeed"); + } + return ret; +} + +static int virtual_sensor_cdev_unbind(struct thermal_zone_device *thermal, + struct thermal_cooling_device *cdev) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + struct trip_t *trip; + int i, ret = -EINVAL; + int index = -1; + + for (i = 0; i < pdata->num_trips; i++) { + trip = &pdata->trips[i]; + if (virtual_sensor_match_cdev(cdev, trip, &index)) + continue; + ret = thermal_zone_unbind_cooling_device(thermal, i, cdev); + dev_info(&cdev->device, "%s unbind from %d: %s\n", cdev->type, + i, ret ? "fail" : "succeed"); + } + return ret; +} + + +static int virtual_sensor_thermal_get_temp(struct thermal_zone_device *thermal, + unsigned long *t) +{ + struct thermal_dev *tdev; + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + long temp = 0; + long tempv = 0; + int alpha, offset, weight; + static unsigned sec_counter = 0; /* Timer counter: 1sec */ + + if (!tzone || !pdata) + return -EINVAL; + + list_for_each_entry(tdev, &thermal_sensor_list, node) { + temp = tdev->dev_ops->get_temp(tdev); + alpha = tdev->tdp->alpha; + offset = tdev->tdp->offset; + weight = tdev->tdp->weight; + + if (0 == sec_counter) + pr_warning("%s %s t=%ld a=%d o=%d w=%d\n", + __func__, + tdev->name, + temp, + alpha, + offset, + weight); + + if (!tdev->off_temp) + tdev->off_temp = temp - offset; + else { + tdev->off_temp = alpha * (temp - offset) + + (DMF - alpha) * tdev->off_temp; + tdev->off_temp /= DMF; + } + tempv += (weight * tdev->off_temp)/DMF; + + pr_debug("%s tempv=%ld\n", __func__, tempv); + } + + sec_counter++; + if (TEMPERATURE_PRINT_INTERVAL_SECONDS == sec_counter) + sec_counter = 0; + + *t = tempv; /* back to unsigned expected by linux framework */ + return 0; +} +static int virtual_sensor_thermal_get_mode(struct thermal_zone_device *thermal, + enum thermal_device_mode *mode) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + if (!pdata) + return -EINVAL; + + mutex_lock(&therm_lock); + *mode = pdata->mode; + mutex_unlock(&therm_lock); + return 0; +} +static int virtual_sensor_thermal_set_mode(struct thermal_zone_device *thermal, + enum thermal_device_mode mode) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + mutex_lock(&therm_lock); + pdata->mode = mode; + if (mode == THERMAL_DEVICE_DISABLED) { + tzone->tz->polling_delay = 0; + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); + return 0; + } + schedule_work(&tzone->therm_work); + mutex_unlock(&therm_lock); + return 0; +} +static int virtual_sensor_thermal_get_trip_type(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type *type) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + *type = pdata->trips[trip].type; + return 0; +} +static int virtual_sensor_thermal_get_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long *temp) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + *temp = pdata->trips[trip].temp; + return 0; +} +static int virtual_sensor_thermal_set_trip_temp(struct thermal_zone_device *thermal, + int trip, + unsigned long temp) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + pdata->trips[trip].temp = temp; + return 0; +} +static int virtual_sensor_thermal_get_crit_temp(struct thermal_zone_device *thermal, + unsigned long *temp) +{ + int i; + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + for (i = 0; i < THERMAL_MAX_TRIPS; i++) { + if (pdata->trips[i].type == THERMAL_TRIP_CRITICAL) { + *temp = pdata->trips[i].temp; + return 0; + } + } + return -EINVAL; +} +static int virtual_sensor_thermal_get_trip_hyst(struct thermal_zone_device *thermal, + int trip, + unsigned long *hyst) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + *hyst = pdata->trips[trip].hyst; + return 0; +} +static int virtual_sensor_thermal_set_trip_hyst(struct thermal_zone_device *thermal, + int trip, + unsigned long hyst) +{ + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + pdata->trips[trip].hyst = hyst; + return 0; +} + +#ifdef CONFIG_AUSTIN_PROJECT +void last_kmsg_thermal_shutdown(void) +{ + int rc; + char *argv[] = { + "/sbin/crashreport", + "thermal_shutdown", + NULL + }; + + pr_err("%s: start to save last kmsg\n", __func__); + //UMH_WAIT_PROC UMH_WAIT_EXEC + rc = call_usermodehelper(argv[0], argv, NULL, UMH_WAIT_EXEC); + pr_err("%s: save last kmsg finish\n", __func__); + + if (rc < 0) + pr_err("call /sbin/crashreport failed, rc = %d\n", rc); + + msleep(6000); /* 6000ms */ +} +EXPORT_SYMBOL_GPL(last_kmsg_thermal_shutdown); +#endif + +static int virtual_sensor_thermal_notify(struct thermal_zone_device *thermal, + int trip, + enum thermal_trip_type type) +{ + char data[20]; + char *envp[] = { data, NULL}; + snprintf(data, sizeof(data), "%s", "SHUTDOWN_WARNING"); + kobject_uevent_env(&thermal->device.kobj, KOBJ_CHANGE, envp); + +#ifdef CONFIG_AUSTIN_PROJECT + pr_err("%s: thermal_shutdown notify\n", __func__); + last_kmsg_thermal_shutdown(); + pr_err("%s: thermal_shutdown notify end\n", __func__); +#endif + return 0; +} +static struct thermal_zone_device_ops virtual_sensor_tz_dev_ops = { + .bind = virtual_sensor_cdev_bind, + .unbind = virtual_sensor_cdev_unbind, + .get_temp = virtual_sensor_thermal_get_temp, + .get_mode = virtual_sensor_thermal_get_mode, + .set_mode = virtual_sensor_thermal_set_mode, + .get_trip_type = virtual_sensor_thermal_get_trip_type, + .get_trip_temp = virtual_sensor_thermal_get_trip_temp, + .set_trip_temp = virtual_sensor_thermal_set_trip_temp, + .get_crit_temp = virtual_sensor_thermal_get_crit_temp, + .get_trip_hyst = virtual_sensor_thermal_get_trip_hyst, + .set_trip_hyst = virtual_sensor_thermal_set_trip_hyst, + .notify = virtual_sensor_thermal_notify, +}; +static int params_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int o = 0; + int a = 0; + int w = 0; + char pbufo[BUF_SIZE]; + char pbufa[BUF_SIZE]; + char pbufw[BUF_SIZE]; + int alpha, offset, weight; + struct thermal_dev *tdev; + + o += sprintf(pbufo + o, "offsets "); + a += sprintf(pbufa + a, "alphas "); + w += sprintf(pbufw + w, "weights "); + + list_for_each_entry(tdev, &thermal_sensor_list, node) { + alpha = tdev->tdp->alpha; + offset = tdev->tdp->offset; + weight = tdev->tdp->weight; + + o += sprintf(pbufo + o, "%d ", offset); + a += sprintf(pbufa + a, "%d ", alpha); + w += sprintf(pbufw + w, "%d ", weight); + } + return sprintf(buf, "%s\n%s\n%s\n", pbufo, pbufa, pbufw); +} +static ssize_t trips_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + return sprintf(buf, "%d\n", thermal->trips); +} +static ssize_t trips_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int trips = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + if (sscanf(buf, "%d\n", &trips) != 1) + return -EINVAL; + if (trips < 0) + return -EINVAL; + + pdata->num_trips = trips; + thermal->trips = pdata->num_trips; + return count; +} +static ssize_t polling_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + return sprintf(buf, "%d\n", thermal->polling_delay); +} +static ssize_t polling_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int polling_delay = 0; + struct thermal_zone_device *thermal = container_of(dev, struct thermal_zone_device, device); + struct virtual_sensor_thermal_zone *tzone = thermal->devdata; + struct mtk_thermal_platform_data *pdata = tzone->pdata; + + if (!tzone || !pdata) + return -EINVAL; + + if (sscanf(buf, "%d\n", &polling_delay) != 1) + return -EINVAL; + if (polling_delay < 0) + return -EINVAL; + + pdata->polling_delay = polling_delay; + thermal->polling_delay = pdata->polling_delay; + thermal_zone_device_update(thermal); + return count; +} + +static DEVICE_ATTR(trips, S_IRUGO | S_IWUSR, trips_show, trips_store); +static DEVICE_ATTR(polling, S_IRUGO | S_IWUSR, polling_show, polling_store); +static DEVICE_ATTR(params, S_IRUGO, params_show, NULL); + +static int virtual_sensor_create_sysfs(struct virtual_sensor_thermal_zone *tzone) +{ + int ret = 0; + ret = device_create_file(&tzone->tz->device, &dev_attr_params); + if (ret) + pr_err("%s Failed to create polling attr\n", __func__); + ret = device_create_file(&tzone->tz->device, &dev_attr_polling); + if (ret) + pr_err("%s Failed to create polling attr\n", __func__); + ret = device_create_file(&tzone->tz->device, &dev_attr_trips); + if (ret) + pr_err("%s Failed to create trips attr\n", __func__); + return ret; +} +static void virtual_sensor_thermal_work(struct work_struct *work) +{ + struct virtual_sensor_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata; + + mutex_lock(&therm_lock); + tzone = container_of(work, struct virtual_sensor_thermal_zone, therm_work); + if (!tzone) + return; + pdata = tzone->pdata; + if (!pdata) + return; + if (pdata->mode == THERMAL_DEVICE_ENABLED) + thermal_zone_device_update(tzone->tz); + mutex_unlock(&therm_lock); +} +static int virtual_sensor_thermal_probe(struct platform_device *pdev) +{ + int ret; + struct virtual_sensor_thermal_zone *tzone; + struct mtk_thermal_platform_data *pdata = NULL; + + pdata = dev_get_platdata(&pdev->dev); + if (!pdata) + return -EINVAL; + + tzone = devm_kzalloc(&pdev->dev, sizeof(*tzone), GFP_KERNEL); + if (!tzone) + return -ENOMEM; + memset(tzone, 0, sizeof(*tzone)); + + tzone->pdata = pdata; + tzone->tz = thermal_zone_device_register(THERMAL_NAME, + pdata->num_trips, + MASK, + tzone, + &virtual_sensor_tz_dev_ops, + NULL, + 0, + pdata->polling_delay); + if (IS_ERR(tzone->tz)) { + pr_err("%s Failed to register thermal zone device\n", __func__); + kfree(tzone); + return -EINVAL; + } + + tzone->tz->trips = pdata->num_trips; + ret = virtual_sensor_create_sysfs(tzone); + INIT_WORK(&tzone->therm_work, virtual_sensor_thermal_work); + platform_set_drvdata(pdev, tzone); + pdata->mode = THERMAL_DEVICE_ENABLED; + return ret; +} +static int virtual_sensor_thermal_remove(struct platform_device *pdev) +{ + struct virtual_sensor_thermal_zone *tzone = platform_get_drvdata(pdev); + if (tzone) { + cancel_work_sync(&tzone->therm_work); + if (tzone->tz) + thermal_zone_device_unregister(tzone->tz); + kfree(tzone); + } + return 0; +} +int thermal_dev_register(struct thermal_dev *tdev) +{ + if (unlikely(IS_ERR_OR_NULL(tdev))) { + pr_err("%s: NULL sensor thermal device\n", __func__); + return -ENODEV; + } + if (!tdev->dev_ops->get_temp) { + pr_err("%s: Error getting get_temp()\n", __func__); + return -EINVAL; + } + mutex_lock(&therm_lock); + list_add_tail(&tdev->node, &thermal_sensor_list); + mutex_unlock(&therm_lock); + return 0; +} +EXPORT_SYMBOL(thermal_dev_register); + +static struct platform_driver virtual_sensor_thermal_zone_driver = { + .probe = virtual_sensor_thermal_probe, + .remove = virtual_sensor_thermal_remove, + .suspend = NULL, + .resume = NULL, + .shutdown = NULL, + .driver = { + .name = DRIVER_NAME, + .owner = THIS_MODULE, + }, +}; + +static int __init virtual_sensor_thermal_init(void) +{ + return platform_driver_register(&virtual_sensor_thermal_zone_driver); +} +static void __exit virtual_sensor_thermal_exit(void) +{ + platform_driver_unregister(&virtual_sensor_thermal_zone_driver); +} + +late_initcall(virtual_sensor_thermal_init); +module_exit(virtual_sensor_thermal_exit); + +MODULE_DESCRIPTION("VIRTUAL_SENSOR pcb virtual sensor thermal zone driver"); +MODULE_AUTHOR("Akwasi Boateng "); +MODULE_LICENSE("GPL"); diff --git a/include/linux/cpu_cooling.h b/include/linux/cpu_cooling.h index a5d52eea823..fd14d97d329 100644 --- a/include/linux/cpu_cooling.h +++ b/include/linux/cpu_cooling.h @@ -27,7 +27,39 @@ #include #include +#include + #ifdef CONFIG_CPU_THERMAL + +/** + * struct cpufreq_cooling_device - data for cooling device with cpufreq + * @id: unique integer value corresponding to each cpufreq_cooling_device + * registered. + * @cool_dev: thermal_cooling_device pointer to keep track of the + * registered cooling device. + * @cpufreq_state: integer value representing the current state of cpufreq + * cooling devices. + * @cpufreq_val: integer value representing the absolute value of the clipped + * frequency. + * @allowed_cpus: all the cpus involved for this cpufreq_cooling_device. + * + * This structure is required for keeping information of each + * cpufreq_cooling_device registered. In order to prevent corruption of this a + * mutex lock cooling_cpufreq_lock is used. + */ +struct cpufreq_cooling_device { + int id; + struct thermal_cooling_device *cool_dev; + unsigned long levels[THERMAL_MAX_TRIPS]; + unsigned long cooling_state; + unsigned int cpufreq_state; + unsigned int cpufreq_val; + struct cpumask allowed_cpus; + struct cpufreq_cooling_device *notify_device; + struct notifier_block nb; + struct list_head node; +}; + /** * cpufreq_cooling_register - function to create cpufreq cooling device. * @clip_cpus: cpumask of cpus where the frequency constraints will happen @@ -42,6 +74,7 @@ cpufreq_cooling_register(const struct cpumask *clip_cpus); void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev); unsigned long cpufreq_cooling_get_level(unsigned int cpu, unsigned int freq); +unsigned int cpufreq_cooling_get_frequency(unsigned int cpu, unsigned long level); #else /* !CONFIG_CPU_THERMAL */ static inline struct thermal_cooling_device * cpufreq_cooling_register(const struct cpumask *clip_cpus) @@ -58,6 +91,10 @@ unsigned long cpufreq_cooling_get_level(unsigned int cpu, unsigned int freq) { return THERMAL_CSTATE_INVALID; } +unsigned int cpufreq_cooling_get_frequency(unsigned int cpu, unsigned long level) +{ + return 0; +} #endif /* CONFIG_CPU_THERMAL */ #endif /* __CPU_COOLING_H__ */ diff --git a/include/linux/input/tmp103_temp_sensor.h b/include/linux/input/tmp103_temp_sensor.h new file mode 100644 index 00000000000..bf710124c3c --- /dev/null +++ b/include/linux/input/tmp103_temp_sensor.h @@ -0,0 +1,29 @@ +/* +* TMP103 Temperature sensor driver file +* +* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ +* Author: Mandrenko, Ievgen" +* +* 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. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +* 02110-1301 USA +* +*/ + + +#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_TMP103_TEMPERATURE_SENSOR_H +#define __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_TMP103_TEMPERATURE_SENSOR_H + +#define TMP103_SENSOR_NAME "tmp103_sensor" + +#endif diff --git a/include/linux/kpd.h b/include/linux/kpd.h index 947fb65d33f..0be308a3e3b 100644 --- a/include/linux/kpd.h +++ b/include/linux/kpd.h @@ -82,6 +82,8 @@ #define RELEASE_POWER_KEY _IO('k', 31) #endif #define SET_KPD_KCOL _IO('k', 29) +#define SET_KPD_KSWT_DEF _IO('k', 32) +#define SET_KPD_KSWT_REV _IO('k', 33) #define KPD_SAY "kpd: " diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 99e22515abc..75b26f80b2b 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -279,6 +279,9 @@ struct mmc_card { #define MMC_QUIRK_KSI_V03_SKIP_TRIM (1<<13) /* Skip Kingston FRV=0x3 trim */ #define MMC_QUIRK_TRIM_UNSTABLE (1<<28) /* Skip trim */ /* byte mode */ +#ifdef CONFIG_MMC_SAMSUNG_SMART +#define MMC_QUIRK_SAMSUNG_SMART (1<<11) /* Samrung smart read */ +#endif /* CONFIG_MMC_SAMSUNG_SMART */ unsigned int erase_size; /* erase size in sectors */ unsigned int erase_shift; /* if erase unit is power 2 */ @@ -305,7 +308,7 @@ struct mmc_card { struct sdio_func_tuple *tuples; /* unknown common tuples */ unsigned int sd_bus_speed; /* Bus Speed Mode set for the card */ - + unsigned int sd_speed_class; /* Bus Speed Mode set for the card */ struct dentry *debugfs_root; struct mmc_part part[MMC_NUM_PHY_PARTITION]; /* physical partitions */ unsigned int nr_parts; @@ -559,4 +562,9 @@ extern void mmc_unregister_driver(struct mmc_driver *); extern void mmc_fixup_device(struct mmc_card *card, const struct mmc_fixup *table); +#ifdef CONFIG_MMC_SAMSUNG_SMART +extern ssize_t mmc_samsung_smart_handle(struct mmc_card *card, char *buf); +extern int mmc_samsung_report(struct mmc_card *card, u8 *buf); +#endif /* CONFIG_MMC_SAMSUNG_SMART */ + #endif /* LINUX_MMC_CARD_H */ diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 9be4a03c5b9..4d3b324801f 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -338,6 +338,9 @@ struct mmc_host { unsigned long clkgate_delay; #endif +#ifdef CONFIG_MMC_ERR_REMOVE + bool rest_remove_flags; +#endif /* host specific block data */ unsigned int max_seg_size; /* see blk_queue_max_segment_size */ unsigned short max_segs; /* see blk_queue_max_segments */ diff --git a/include/linux/mmc/sd_misc.h b/include/linux/mmc/sd_misc.h index 06682737fe0..6cccd1a3325 100644 --- a/include/linux/mmc/sd_misc.h +++ b/include/linux/mmc/sd_misc.h @@ -165,7 +165,6 @@ typedef enum { EMMC_BOOT_END } BOOT_PARTITION_EN; -#ifdef CONFIG_MTK_GPT_SCHEME_SUPPORT typedef enum { EMMC_PART_UNKNOWN=0 ,EMMC_PART_BOOT1 @@ -178,7 +177,6 @@ typedef enum { ,EMMC_PART_USER ,EMMC_PART_END } Region; -#endif typedef enum { CARD_INFO = 0, diff --git a/include/linux/musb/musb_core.h b/include/linux/musb/musb_core.h index ba9570fc097..56c408eeb9b 100644 --- a/include/linux/musb/musb_core.h +++ b/include/linux/musb/musb_core.h @@ -57,6 +57,9 @@ struct musb; struct musb_hw_ep; struct musb_ep; extern volatile bool usb_is_host; +extern int musb_host_dynamic_fifo; +extern int musb_host_dynamic_fifo_usage_msk; +extern void musb_bug(void); /* Helper defines for struct musb->hwvers */ #define MUSB_HWVERS_MAJOR(x) ((x >> 10) & 0x1f) diff --git a/include/linux/platform_data/mtk_thermal.h b/include/linux/platform_data/mtk_thermal.h new file mode 100644 index 00000000000..14a3c54521c --- /dev/null +++ b/include/linux/platform_data/mtk_thermal.h @@ -0,0 +1,44 @@ +#ifndef _MTK_THERMAL_H_ +#define _MTK_THERMAL_H_ + +#include +#include +#include +#include +#include +#include + +struct mtk_cooler_platform_data { + char type[THERMAL_NAME_LENGTH]; + unsigned long state; + unsigned long max_state; + struct thermal_cooling_device *cdev; + int level; + int levels[THERMAL_MAX_TRIPS]; +}; + +struct cdev_t { + char type[THERMAL_NAME_LENGTH]; + unsigned long upper; + unsigned long lower; +}; + +struct trip_t { + unsigned long temp; + enum thermal_trip_type type; + unsigned long hyst; + struct cdev_t cdev[THERMAL_MAX_TRIPS]; +}; + +struct mtk_thermal_platform_data { + int num_trips; + enum thermal_device_mode mode; + int polling_delay; + struct thermal_zone_params tzp; + struct trip_t trips[THERMAL_MAX_TRIPS]; +}; + +#ifdef CONFIG_AUSTIN_PROJECT +void last_kmsg_thermal_shutdown(void); +#endif +#endif /* _MTK_THERMAL_H_ */ diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h index 569781faa50..52829f04efb 100644 --- a/include/linux/pm_wakeup.h +++ b/include/linux/pm_wakeup.h @@ -63,6 +63,41 @@ struct wakeup_source { bool autosleep_enabled:1; }; +/* Ordered from most occurences to least */ +typedef enum { + WEV_NONE = -1, + WEV_RTC, + WEV_WIFI, + WEV_WAN, + WEV_USB, + WEV_PWR, + WEV_HALL, + WEV_BT, + WEV_CHARGER, + WEV_MAX, + WEV_TOTAL = 20 +} wakeup_event_t; + +/** + * struct wakeup_event - Representation of a resume event + * + * @ev: Event responsible for pm_resume + * @irq: Irq responsible for pm_resume. + * @ev_count: Total number of times the event cause pm_resume. + * @last_time: Last time the event was reported + * @total_time: Total time between pm_resume triggered by this event to + * the following successful pm_suspend + */ + +struct wakeup_event { + const char *name; + wakeup_event_t event; + int irq; + unsigned long count; + ktime_t last_time; + ktime_t total_time; +}; + #ifdef CONFIG_PM_SLEEP /* @@ -100,6 +135,10 @@ extern void pm_relax(struct device *dev); extern void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec); extern void pm_wakeup_event(struct device *dev, unsigned int msec); +extern void pm_report_resume_irq(int irq); +extern void pm_report_resume_ev(wakeup_event_t ev, int irq); +extern wakeup_event_t pm_get_resume_ev(ktime_t *ts); + #else /* !CONFIG_PM_SLEEP */ static inline void device_set_wakeup_capable(struct device *dev, bool capable) @@ -177,6 +216,10 @@ static inline void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec static inline void pm_wakeup_event(struct device *dev, unsigned int msec) {} +static inline void pm_report_resume_irq(int irq) {} +static inline void pm_report_resume_ev(wakeup_event_t ev, int irq) {} +static inline wakeup_event_t pm_get_resume_ev(void) { return WEV_NONE; } + #endif /* !CONFIG_PM_SLEEP */ static inline void wakeup_source_init(struct wakeup_source *ws, diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index ac7a87006db..01cede77397 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -165,6 +165,10 @@ enum power_supply_property { POWER_SUPPLY_PROP_present_smb, /* ADB CMD Discharging */ POWER_SUPPLY_PROP_adjust_power, + /* ACOS_MOD_BEGIN {metrics_log} */ + POWER_SUPPLY_PROP_SUSPEND_DRAIN, + POWER_SUPPLY_PROP_SUSPEND_REALTIME, + /* ACOS_MOD_END {metrics_log} */ /* Properties of type `const char *' */ POWER_SUPPLY_PROP_MODEL_NAME, POWER_SUPPLY_PROP_MANUFACTURER, diff --git a/include/linux/reboot.h b/include/linux/reboot.h index a883888bec9..abe0bc9644b 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -48,8 +48,10 @@ void ctrl_alt_del(void); #define POWEROFF_CMD_PATH_LEN 256 extern char poweroff_cmd[POWEROFF_CMD_PATH_LEN]; +extern char reboot_cmd[POWEROFF_CMD_PATH_LEN]; extern int orderly_poweroff(bool force); +extern int orderly_reboot(bool force); /* * Emergency restart, callable from an interrupt handler. diff --git a/include/linux/thermal.h b/include/linux/thermal.h index f3e071a055b..faea6c7fdfd 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -58,6 +58,8 @@ #define DEFAULT_THERMAL_GOVERNOR "user_space" #elif defined(CONFIG_THERMAL_DEFAULT_GOV_BACKWARD_COMPATIBLE) #define DEFAULT_THERMAL_GOVERNOR "backward_compatible" +#elif defined(CONFIG_THERMAL_DEFAULT_GOV_TRIP_STEP_WISE) +#define DEFAULT_THERMAL_GOVERNOR "trip_step_wise" #endif struct thermal_zone_device; diff --git a/include/linux/thermal_framework.h b/include/linux/thermal_framework.h new file mode 100644 index 00000000000..026ab22f370 --- /dev/null +++ b/include/linux/thermal_framework.h @@ -0,0 +1,72 @@ +/* + * Thermal Framework Driver + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Dan Murphy + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * +*/ + +#ifndef __LINUX_THERMAL_FRAMEWORK_H__ +#define __LINUX_THERMAL_FRAMEWORK_H__ + +#define NUM_COOLERS 10 +#include + +struct thermal_dev; +struct cooling_device; + +/** + * struct virtual_sensor_params - Structure for each virtual sensor params. + * @alpha: Moving average coefficient + * @offset: Temperature offset + * @weight: Weight + */ +struct thermal_dev_params { + int offset; + int alpha; + int weight; +}; + +/** + * struct thermal_dev_ops - Structure for device operation call backs + * @get_temp: A temp sensor call back to get the current temperature. + * temp is reported in milli degrees. + */ +struct thermal_dev_ops { + int (*get_temp) (struct thermal_dev *); +}; + +/** + * struct thermal_dev - Structure for each thermal device. + * @name: The name of the device that is registering to the framework + * @dev: Device node + * @dev_ops: The device specific operations for the sensor, governor and cooling + * agents. + * @node: The list node of the + * @current_temp: The current temperature reported for the specific domain + * + */ +struct thermal_dev { + const char *name; + struct device *dev; + struct thermal_dev_ops *dev_ops; + struct list_head node; + struct thermal_dev_params *tdp; + int current_temp; + long off_temp; +}; +/** + * API to register a temperature sensor with a thermal zone + */ +int thermal_dev_register(struct thermal_dev *tdev); + +#endif /* __LINUX_THERMAL_FRAMEWORK_H__ */ diff --git a/include/mach/battery_common.h b/include/mach/battery_common.h index 67ffe7a5254..f71d466cd41 100644 --- a/include/mach/battery_common.h +++ b/include/mach/battery_common.h @@ -22,8 +22,12 @@ ****************************************************************************/ /* #define MAX_CHARGING_TIME 1*60*60 // 1hr */ /* #define MAX_CHARGING_TIME 8*60*60 // 8hr */ -/* #define MAX_CHARGING_TIME 12*60*60 // 12hr */ +#ifdef CONFIG_AUSTIN_PROJECT +#define MAX_CHARGING_TIME 12*60*60 /* 12hr */ +#else #define MAX_CHARGING_TIME 24*60*60 /* 24hr */ +#endif + #define MAX_POSTFULL_SAFETY_TIME 1*30*60 /* 30mins */ #define MAX_PreCC_CHARGING_TIME 1*30*60 /* 0.5hr */ @@ -102,18 +106,22 @@ typedef enum { TEMP_ABOVE_POS_60 } temp_state_enum; - -#define TEMP_POS_60_THRESHOLD 50 -#define TEMP_POS_60_THRES_MINUS_X_DEGREE 47 +#define TEMP_POS_60_THRESHOLD 60 +#define TEMP_POS_60_THRES_MINUS_X_DEGREE 60 #define TEMP_POS_45_THRESHOLD 45 -#define TEMP_POS_45_THRES_MINUS_X_DEGREE 39 +#define TEMP_POS_45_THRES_MINUS_X_DEGREE 45 +#ifdef CONFIG_AUSTIN_PROJECT +#define TEMP_POS_10_THRESHOLD 15 +#define TEMP_POS_10_THRES_PLUS_X_DEGREE 15 +#else #define TEMP_POS_10_THRESHOLD 10 -#define TEMP_POS_10_THRES_PLUS_X_DEGREE 16 +#define TEMP_POS_10_THRES_PLUS_X_DEGREE 10 +#endif #define TEMP_POS_0_THRESHOLD 0 -#define TEMP_POS_0_THRES_PLUS_X_DEGREE 6 +#define TEMP_POS_0_THRES_PLUS_X_DEGREE 0 #ifdef CONFIG_MTK_FAN5405_SUPPORT #define TEMP_NEG_10_THRESHOLD 0 @@ -135,13 +143,22 @@ typedef enum { TEMP_POS_HIGH } batt_temp_state_enum; +/***************************************************************************** + * Test Mode + ****************************************************************************/ +typedef enum { + TESTMODE_NONE = 0, + TESTMODE_DISABLE_CHARGING, + TESTMODE_ENABLE_CHARGING, +} batt_test_mode_enum; + /***************************************************************************** * structure ****************************************************************************/ typedef struct { kal_bool bat_exist; kal_bool bat_full; - INT32 bat_charging_state; + INT32 bat_charging_state; /* use leading 16bit for test mode use */ UINT32 bat_vol; kal_bool bat_in_recharging_state; kal_uint32 Vsense; @@ -164,6 +181,7 @@ typedef struct { UINT32 nPercent_ZCV; UINT32 nPrecent_UI_SOC_check_point; UINT32 ZCV; + kal_bool bat_in_charging_enable; } PMU_ChargerStruct; /***************************************************************************** @@ -175,6 +193,12 @@ extern kal_bool g_ftm_battery_flag; extern int charging_level_data[1]; extern kal_bool g_call_state; extern kal_bool g_charging_full_reset_bat_meter; +extern signed int g_custom_charging_current; +extern signed int g_custom_charging_cv; +#ifdef CONFIG_AUSTIN_PROJECT +extern unsigned int g_custom_charging_mode; +#endif + #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) || defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT) extern kal_bool ta_check_chr_type; extern kal_bool ta_cable_out_occur; diff --git a/include/mach/battery_meter.h b/include/mach/battery_meter.h index 12d84e97e80..fbe426ce387 100644 --- a/include/mach/battery_meter.h +++ b/include/mach/battery_meter.h @@ -41,7 +41,7 @@ extern kal_int32 battery_meter_get_battery_temperature(void); extern kal_int32 battery_meter_get_charger_voltage(void); extern kal_int32 battery_meter_get_battery_percentage(void); extern kal_int32 battery_meter_initial(void); -extern kal_int32 battery_meter_reset(void); +extern kal_int32 battery_meter_reset(kal_bool bUI_SOC); extern kal_int32 battery_meter_sync(kal_int32 bat_i_sense_offset); extern kal_int32 battery_meter_get_battery_zcv(void); @@ -51,6 +51,7 @@ extern kal_int32 battery_meter_get_battery_nPercent_UI_SOC(void); /* tracking po extern kal_int32 battery_meter_get_tempR(kal_int32 dwVolt); extern kal_int32 battery_meter_get_tempV(void); extern kal_int32 battery_meter_get_VSense(void); /* isense voltage */ +extern kal_int32 battery_meter_get_battery_soc(void); #endif /* #ifndef _BATTERY_METER_H */ diff --git a/include/mach/battery_meter_hal.h b/include/mach/battery_meter_hal.h index 0cfc6649939..f3b2870e9f9 100644 --- a/include/mach/battery_meter_hal.h +++ b/include/mach/battery_meter_hal.h @@ -6,6 +6,7 @@ /* ============================================================ */ /* define */ /* ============================================================ */ +#define BM_LOG_ERROR 0 #define BM_LOG_CRTI 1 #define BM_LOG_FULL 2 diff --git a/include/mach/charging.h b/include/mach/charging.h index d3b98bddba6..a6c2a4cb801 100644 --- a/include/mach/charging.h +++ b/include/mach/charging.h @@ -39,6 +39,7 @@ /***************************************************************************** * Log ****************************************************************************/ +#define BAT_LOG_ERROR 0 #define BAT_LOG_CRTI 1 #define BAT_LOG_FULL 2 @@ -90,9 +91,6 @@ typedef enum { CHARGING_HOST, NONSTANDARD_CHARGER, /* AC : 450mA~1A */ STANDARD_CHARGER, /* AC : ~1A */ - APPLE_2_1A_CHARGER, /* 2.1A apple charger */ - APPLE_1_0A_CHARGER, /* 1A apple charger */ - APPLE_0_5A_CHARGER, /* 0.5A apple charger */ WIRELESS_CHARGER, } CHARGER_TYPE; @@ -412,6 +410,7 @@ typedef enum { CHARGE_CURRENT_1450_00_MA = 145000, CHARGE_CURRENT_1500_00_MA = 150000, CHARGE_CURRENT_1525_00_MA = 152500, + CHARGE_CURRENT_1550_00_MA = 155000, CHARGE_CURRENT_1575_00_MA = 157500, CHARGE_CURRENT_1600_00_MA = 160000, CHARGE_CURRENT_1650_00_MA = 165000, @@ -421,6 +420,7 @@ typedef enum { CHARGE_CURRENT_1750_00_MA = 175000, CHARGE_CURRENT_1800_00_MA = 180000, CHARGE_CURRENT_1825_00_MA = 182500, + CHARGE_CURRENT_1850_00_MA = 185000, CHARGE_CURRENT_1875_00_MA = 187500, CHARGE_CURRENT_1900_00_MA = 190000, CHARGE_CURRENT_1950_00_MA = 195000, @@ -430,6 +430,7 @@ typedef enum { CHARGE_CURRENT_2050_00_MA = 205000, CHARGE_CURRENT_2100_00_MA = 210000, CHARGE_CURRENT_2125_00_MA = 212500, + CHARGE_CURRENT_2150_00_MA = 215000, CHARGE_CURRENT_2175_00_MA = 217500, CHARGE_CURRENT_2200_00_MA = 220000, CHARGE_CURRENT_2300_00_MA = 230000, @@ -450,7 +451,7 @@ typedef enum { CHARGE_CURRENT_2900_00_MA = 290000, CHARGE_CURRENT_3000_00_MA = 300000, CHARGE_CURRENT_3100_00_MA = 310000, - CHARGE_CURRENT_MAX + CHARGE_CURRENT_MAX = 200000 } CHR_CURRENT_ENUM; /* ============================================================ */ @@ -469,10 +470,21 @@ typedef kal_int32(*CHARGING_CONTROL) (CHARGING_CTRL_CMD cmd, void *data); /* ============================================================ */ extern int Enable_BATDRV_LOG; extern kal_bool chargin_hw_init_done; +#ifdef CONFIG_MTK_SN2871_SUPPORT +extern kal_bool sn2871_is_found; +#endif +#ifdef CONFIG_MTK_BQ24296_SUPPORT +extern kal_bool bq24296_is_found; +#endif /* ============================================================ */ /* External function */ /* ============================================================ */ -extern kal_int32 chr_control_interface(CHARGING_CTRL_CMD cmd, void *data); +#ifdef CONFIG_MTK_BQ24296_SUPPORT +extern kal_int32 chr_control_interface_bq24296(CHARGING_CTRL_CMD cmd, void *data); +#endif +#ifdef CONFIG_MTK_SN2871_SUPPORT +extern kal_int32 chr_control_interface_sn2871(CHARGING_CTRL_CMD cmd, void *data); +#endif #endif /* #ifndef _CHARGING_H */ diff --git a/include/mach/dynamic_boost.h b/include/mach/dynamic_boost.h new file mode 100644 index 00000000000..3bedbc98519 --- /dev/null +++ b/include/mach/dynamic_boost.h @@ -0,0 +1,24 @@ +#ifndef __DYNAMIC_BOOST_H__ +#define __DYNAMIC_BOOST_H__ + +enum mode{ + /* Actually there is no little core in MT8127. + * We can treat little core as A7 core. + */ + PRIO_TWO_LITTLES, + PRIO_TWO_LITTLES_MAX_FREQ, + PRIO_MAX_CORES, + PRIO_MAX_CORES_MAX_FREQ, + PRIO_RESET, + /* Define the max priority for priority limit */ + PRIO_DEFAULT +}; + +enum control{ + OFF = -2, + ON = -1 +}; + +int set_dynamic_boost(int duration, int prio_mode); + +#endif /* __DYNAMIC_BOOST_H__ */ diff --git a/include/mach/mtk_rtc.h b/include/mach/mtk_rtc.h index 555b472657c..66c71fc379b 100644 --- a/include/mach/mtk_rtc.h +++ b/include/mach/mtk_rtc.h @@ -13,6 +13,13 @@ typedef enum { RTC_GPIO_USER_PMIC = 12, } rtc_gpio_user_t; +enum rtc_reboot_reason { + RTC_REBOOT_REASON_WARM, + RTC_REBOOT_REASON_PANIC, + RTC_REBOOT_REASON_SW_WDT, + RTC_REBOOT_REASON_FROM_POC +}; + #ifdef CONFIG_MTK_RTC /* @@ -33,11 +40,22 @@ extern void rtc_disable_abb_32k(void); extern void rtc_enable_writeif(void); extern void rtc_disable_writeif(void); +extern bool rtc_lprst_detected(void); +extern bool rtc_enter_kpoc_detected(void); + +extern int rtc_get_reboot_reason(void); +extern void rtc_mark_reboot_reason(int); + extern void rtc_mark_recovery(void); #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING) extern void rtc_mark_kpoc(void); +extern void rtc_mark_enter_kpoc(void); #endif extern void rtc_mark_fast(void); +extern void rtc_mark_rpmbp(void); +extern void rtc_mark_clear_lprst(void); +extern void rtc_mark_enter_lprst(void); +extern void rtc_mark_enter_sw_lprst(void); extern u16 rtc_rdwr_uart_bits(u16 *val); extern void rtc_bbpu_power_down(void); @@ -52,6 +70,9 @@ extern void rtc_irq_handler(void); extern bool crystal_exist_status(void); +extern void rtc_acquire_lock(void); +extern void rtc_release_lock(void); + #else #define rtc_read_hw_time() ({ 0; }) #define rtc_gpio_enable_32k(user) do {} while (0) @@ -61,11 +82,19 @@ extern bool crystal_exist_status(void); #define rtc_disable_abb_32k() do {} while (0) #define rtc_enable_writeif() do {} while (0) #define rtc_disable_writeif() do {} while (0) + +#define rtc_lprst_detected() ({ 0; }) +#define rtc_enter_kpoc_detected() ({ 0; }) #define rtc_mark_recovery() do {} while (0) #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING) #define rtc_mark_kpoc() do {} while (0) +#define rtc_mark_enter_kpoc() do {} while (0) #endif #define rtc_mark_fast() do {} while (0) +#define rtc_mark_rpmbp() do {} while (0) +#define rtc_mark_clear_lprst() do {} while (0) +#define rtc_mark_enter_lprst() do {} while (0) +#define rtc_mark_enter_sw_lprst() do {} while (0) #define rtc_rdwr_uart_bits(val) ({ 0; }) #define rtc_bbpu_power_down() do {} while (0) #define rtc_read_pwron_alarm(alm) do {} while (0) @@ -73,6 +102,9 @@ extern bool crystal_exist_status(void); #define get_rtc_spare_fg_value() ({ 0; }) #define set_rtc_spare_fg_value(val) ({ 0; }) +#define rtc_get_reboot_reason() (0) +#define rtc_mark_reboot_reason(arg) do {} while (0) + #define rtc_irq_handler() do {} while (0) #define crystal_exist_status() do {} while (0) diff --git a/include/mach/tmp103_cooler.h b/include/mach/tmp103_cooler.h new file mode 100644 index 00000000000..4de774edfe6 --- /dev/null +++ b/include/mach/tmp103_cooler.h @@ -0,0 +1,29 @@ +#ifndef _CUST_TMP103_COOLER_ +#define _CUST_TMP103_COOLER_ + +#define MIN_CPU_POWER (594) +#define MAX_CPU_POWER (4600) +#define MAX_BRIGHTNESS (255) +#define MIN_BRIGHTNESS (10) +#define MAX_CHARGING_LIMIT (CHARGE_CURRENT_MAX) +#define MIN_CHARGING_LIMIT (0) + +enum tmp103_cooler_type { + TMP103_COOLER_CPU = 0, + TMP103_COOLER_BL, + TMP103_COOLER_BC, +}; + +struct tmp103_cooler_pdev { + enum tmp103_cooler_type ctype; + int action; + int clear; + char *name; +}; + +struct tmp103_cooler_pdata { + int count; + struct tmp103_cooler_pdev *list; +}; + +#endif /* _CUST_TMP103_COOLER_ */ diff --git a/include/trustzone/kree/mem.h b/include/trustzone/kree/mem.h index 4a4f371163f..c24d6498994 100644 --- a/include/trustzone/kree/mem.h +++ b/include/trustzone/kree/mem.h @@ -55,7 +55,7 @@ typedef struct { // map_p: 0 = no remap, 1 = remap TZ_RESULT kree_register_sharedmem (KREE_SESSION_HANDLE session, KREE_SHAREDMEM_HANDLE *mem_handle, - uint32_t start, uint32_t size, uint32_t map_p); + uint32_t start, uint32_t size, void *map_p); TZ_RESULT kree_unregister_sharedmem (KREE_SESSION_HANDLE session, KREE_SHAREDMEM_HANDLE mem_handle); diff --git a/include/trustzone/kree/tz_irq.h b/include/trustzone/kree/tz_irq.h index 7382f3ce40f..e2109ac660c 100644 --- a/include/trustzone/kree/tz_irq.h +++ b/include/trustzone/kree/tz_irq.h @@ -17,6 +17,7 @@ void kree_fiq_eoi(unsigned int iar); int kree_raise_softfiq(unsigned int mask, unsigned int irq); void kree_irq_mask_all(unsigned int *pmask, unsigned int size); void kree_irq_mask_restore(unsigned int *pmask, unsigned int size); +int kree_set_fiq_affinity(int irq, int cpuid); #else diff --git a/include/trustzone/tz_cross/ree_service.h b/include/trustzone/tz_cross/ree_service.h index 3cafa8788c1..c9d60ce57ce 100644 --- a/include/trustzone/tz_cross/ree_service.h +++ b/include/trustzone/tz_cross/ree_service.h @@ -35,6 +35,8 @@ enum ReeServiceCommand { REE_SERV_ENABLE_CLOCK, REE_SERV_DISABLE_CLOCK, REE_SERV_THREAD_CREATE, + + REE_SERV_SEMAPHORE_DOWNINT, /* interruptible down */ }; ////////// Param structure for commands @@ -65,10 +67,10 @@ struct REE_THREAD_INFO { struct ree_service_irq { + void *token; unsigned int irq; int enable; unsigned int flags; - unsigned int token; }; struct ree_service_clock diff --git a/include/trustzone/tz_cross/ta_irq.h b/include/trustzone/tz_cross/ta_irq.h index f40cb592e73..b651d2eea7a 100644 --- a/include/trustzone/tz_cross/ta_irq.h +++ b/include/trustzone/tz_cross/ta_irq.h @@ -15,6 +15,8 @@ #define TZCMD_IRQ_MASK_ALL 5 #define TZCMD_IRQ_MASK_RESTORE 6 #define TZCMD_IRQ_QUERY_FIQ 7 +#define TZCMD_IRQ_SET_FIQ_AFFINITY 8 + /* TZ Flags for TZCMD_IRQ_SET_FIQ */ diff --git a/include/trustzone/tz_cross/ta_mem.h b/include/trustzone/tz_cross/ta_mem.h index c90f66f17d0..17b7688fbb0 100644 --- a/include/trustzone/tz_cross/ta_mem.h +++ b/include/trustzone/tz_cross/ta_mem.h @@ -19,6 +19,9 @@ #define TZCMD_MEM_SECURECM_READ 10 #define TZCMD_MEM_SECURECM_WRITE 11 #define TZCMD_MEM_SECURECM_RSIZE 12 -#define TZCMD_MEM_TOTAL_SIZE 13 +#define TZCMD_MEM_SECURECM_START 13 +#define TZCMD_MEM_SECURECM_STOP 14 +#define TZCMD_MEM_SECURECM_QUERY 15 +#define TZCMD_MEM_TOTAL_SIZE 16 #endif /* __TRUSTZONE_TA_MEM__ */ diff --git a/include/trustzone/tz_cross/ta_modular_drm.h b/include/trustzone/tz_cross/ta_modular_drm.h index ae5bbaaf7a6..de80ab2300c 100644 --- a/include/trustzone/tz_cross/ta_modular_drm.h +++ b/include/trustzone/tz_cross/ta_modular_drm.h @@ -1,39 +1,4 @@ -/* Copyright Statement: - * - * This software/firmware and related documentation ("MediaTek Software") are - * protected under relevant copyright laws. The information contained herein is - * confidential and proprietary to MediaTek Inc. and/or its licensors. Without - * the prior written permission of MediaTek inc. and/or its licensors, any - * reproduction, modification, use or disclosure of MediaTek Software, and - * information contained herein, in whole or in part, shall be strictly - * prohibited. - * - * MediaTek Inc. (C) 2013. All rights reserved. - * - * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES - * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") - * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER - * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL - * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED - * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR - * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH - * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, - * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES - * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. - * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO - * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK - * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE - * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR - * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S - * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE - * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE - * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE - * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. - * - * The following software/firmware and/or related documentation ("MediaTek - * Software") have been modified by MediaTek Inc. All revisions are subject to - * any receiver's applicable license agreements with MediaTek Inc. - */ + /* MediaTek Inc. (C) 2010. All rights reserved. */ #ifndef __TRUSTZONE_TA_MODULAR_DRM__ #define __TRUSTZONE_TA_MODULAR_DRM__ diff --git a/include/trustzone/tz_cross/ta_vdec.h b/include/trustzone/tz_cross/ta_vdec.h index 57af415728e..05205059958 100644 --- a/include/trustzone/tz_cross/ta_vdec.h +++ b/include/trustzone/tz_cross/ta_vdec.h @@ -7,12 +7,16 @@ #define DONT_USE_BS_VA 1 // for VP path integration set to 1, for mfv_ut set to 0 #define USE_MTEE_M4U #define USE_MTEE_DAPC - +#define HEVC_SVP_UT_ENABLE 0 /* Command for VDEC TA */ #define TZCMD_VDEC_AVC_INIT 0 #define TZCMD_VDEC_AVC_DECODE 1 #define TZCMD_VDEC_AVC_DEINIT 2 +#define TZCMD_VDEC_HEVC_INIT 3 +#define TZCMD_VDEC_HEVC_DECODE 4 +#define TZCMD_VDEC_HEVC_DEINIT 5 +#define TZCMD_VDEC_FILL_SECMEM 6 #define TZCMD_VDEC_TEST 100 #endif /* __TRUSTZONE_TA_VDEC__ */ diff --git a/kernel/sys.c b/kernel/sys.c index 42feab795b9..5500c0e22f8 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2530,6 +2530,63 @@ int orderly_poweroff(bool force) } EXPORT_SYMBOL_GPL(orderly_poweroff); +char reboot_cmd[POWEROFF_CMD_PATH_LEN] = "/system/bin/reboot"; + +static int __orderly_reboot(bool force) +{ + char **argv; + static char *envp[] = { + "HOME=/", + "PATH=/sbin:/bin:/usr/sbin:/usr/bin", + NULL + }; + int ret; + + argv = argv_split(GFP_KERNEL, reboot_cmd, NULL); + if (argv) { + ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); + argv_free(argv); + } else { + printk(KERN_WARNING "%s failed to allocate memory for \"%s\"\n", + __func__, reboot_cmd); + ret = -ENOMEM; + } + + if (ret && force) { + printk(KERN_WARNING "Failed to start orderly reboot: " + "forcing the issue\n"); + emergency_sync(); + kernel_restart(NULL); + } + + return ret; +} + +static bool reboot_force; + +static void reboot_work_func(struct work_struct *work) +{ + __orderly_reboot(reboot_force); +} + +static DECLARE_WORK(reboot_work, reboot_work_func); + +/** + * orderly_reboot - Trigger an orderly system reboot + * @force: force reboot if command execution fails + * + * This may be called from any context to trigger a system reboot. + * If the orderly reboot fails, it will force an immediate reboot. + */ +int orderly_reboot(bool force) +{ + if (force) /* do not override the pending "true" */ + reboot_force = true; + schedule_work(&reboot_work); + return 0; +} +EXPORT_SYMBOL_GPL(orderly_reboot); + /** * do_sysinfo - fill in sysinfo struct * @info: pointer to buffer to fill